cryptol 2.5.0 → 2.6.0
raw patch · 110 files changed
+14203/−12113 lines, 110 filesdep +blaze-htmldep +panicdep +strictdep −QuickCheckdep −asyncdep −old-timedep ~basedep ~deepseqdep ~monadLibsetup-changednew-component:exe:cryptol-htmlPVP ok
version bump matches the API change (PVP)
Dependencies added: blaze-html, panic, strict
Dependencies removed: QuickCheck, async, old-time, presburger, smtLib, syb, template-haskell, utf8-string
Dependency ranges changed: base, deepseq, monadLib, process, random, sbv, simple-smt, text, tf-random, transformers
API changes (from Hackage documentation)
- Cryptol.Eval: instance GHC.Base.Monoid (Cryptol.Eval.ListEnv 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.Value: PPOpts :: Bool -> Int -> Int -> PPOpts
- Cryptol.Eval.Value: [useAscii] :: PPOpts -> Bool
- Cryptol.Eval.Value: [useBase] :: PPOpts -> Int
- Cryptol.Eval.Value: [useInfLength] :: PPOpts -> Int
- Cryptol.Eval.Value: asBitsVal :: BitWord b w => WordValue b w -> Seq (Eval b)
- Cryptol.Eval.Value: bitsSeq :: BitWord b w => WordValue b w -> Integer -> Eval b
- Cryptol.Eval.Value: data PPOpts
- 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 Cryptol.Eval.Value.BitWord GHC.Types.Bool Cryptol.Eval.Value.BV
- Cryptol.Eval.Value: instance GHC.Generics.Generic (Cryptol.Eval.Value.GenValue b w)
- Cryptol.Eval.Value: instance GHC.Generics.Generic (Cryptol.Eval.Value.WordValue b w)
- Cryptol.ModuleSystem: loadModule :: FilePath -> Module PName -> ModuleCmd Module
- Cryptol.ModuleSystem.Base: loadImport :: Located Import -> ModuleM ()
- Cryptol.ModuleSystem.Base: loadModule :: FilePath -> Module PName -> ModuleM Module
- Cryptol.ModuleSystem.Env: [getLoadedModules] :: LoadedModules -> [LoadedModule]
- Cryptol.ModuleSystem.Env: newtype LoadedModules
- Cryptol.ModuleSystem.Env: qualifiedEnv :: ModuleEnv -> IfaceDecls
- Cryptol.ModuleSystem.Monad: getQualifiedEnv :: ModuleM IfaceDecls
- Cryptol.ModuleSystem.Renamer: instance GHC.Base.Monoid a => GHC.Base.Monoid (Cryptol.ModuleSystem.Renamer.RenameM a)
- Cryptol.Parser.AST: ExportSpec :: Set name -> Set name -> ExportSpec name
- Cryptol.Parser.AST: TInf :: Type n
- Cryptol.Parser.AST: [eBinds] :: ExportSpec name -> Set name
- Cryptol.Parser.AST: [eTypes] :: ExportSpec name -> Set name
- Cryptol.Parser.AST: data ExportSpec name
- Cryptol.Parser.AST: exportBind :: Ord name => TopLevel name -> ExportSpec name
- Cryptol.Parser.AST: exportType :: Ord name => TopLevel name -> ExportSpec name
- Cryptol.Parser.AST: instance Control.DeepSeq.NFData Cryptol.Parser.AST.Fixity
- Cryptol.Parser.AST: instance Control.DeepSeq.NFData Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance Control.DeepSeq.NFData name => Control.DeepSeq.NFData (Cryptol.Parser.AST.ExportSpec name)
- Cryptol.Parser.AST: instance Cryptol.Utils.PP.PP Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance GHC.Classes.Eq Cryptol.Parser.AST.Fixity
- Cryptol.Parser.AST: instance GHC.Classes.Eq Cryptol.Parser.AST.FixityCmp
- Cryptol.Parser.AST: instance GHC.Classes.Eq Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance GHC.Classes.Ord Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance GHC.Classes.Ord name => GHC.Base.Monoid (Cryptol.Parser.AST.ExportSpec name)
- Cryptol.Parser.AST: instance GHC.Generics.Generic (Cryptol.Parser.AST.ExportSpec name)
- Cryptol.Parser.AST: instance GHC.Generics.Generic Cryptol.Parser.AST.Fixity
- Cryptol.Parser.AST: instance GHC.Generics.Generic Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance GHC.Show.Show Cryptol.Parser.AST.Fixity
- Cryptol.Parser.AST: instance GHC.Show.Show Cryptol.Parser.AST.FixityCmp
- Cryptol.Parser.AST: instance GHC.Show.Show Cryptol.Parser.AST.Selector
- Cryptol.Parser.AST: instance GHC.Show.Show name => GHC.Show.Show (Cryptol.Parser.AST.ExportSpec name)
- Cryptol.Parser.AST: isExportedBind :: Ord name => name -> ExportSpec name -> Bool
- Cryptol.Parser.AST: isExportedType :: Ord name => name -> ExportSpec name -> Bool
- Cryptol.Parser.AST: tconNames :: Map PName (Type PName)
- Cryptol.Parser.AST: type ModName = Text
- Cryptol.Parser.Lexer: KW_Arith :: TokenKW
- Cryptol.Parser.Lexer: KW_Bit :: TokenKW
- Cryptol.Parser.Lexer: KW_Cmp :: TokenKW
- Cryptol.Parser.Lexer: KW_Eq :: TokenKW
- Cryptol.Parser.Names: modExports :: Ord name => Module name -> ExportSpec name
- Cryptol.Prims.Eval: divModPoly :: Integer -> Int -> Integer -> Int -> (Integer, Integer)
- Cryptol.Prims.Eval: ecDemoteV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: funCmp :: (Ordering -> Bool) -> 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 :: 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: instance Cryptol.Eval.Value.EvalPrims GHC.Types.Bool Cryptol.Eval.Value.BV
- Cryptol.Prims.Eval: maxV :: Ordering -> TValue -> Value -> Value -> Value
- Cryptol.Prims.Eval: minV :: Ordering -> TValue -> Value -> Value -> Value
- 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_bits :: Nat' -> TValue -> Seq (Eval Bool) -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (Seq (Eval Bool))
- Cryptol.Prims.Eval: withOrder :: String -> (Ordering -> TValue -> Value -> Value -> Value) -> Binary Bool BV
- Cryptol.Prims.Eval: zipLexCompare :: String -> [TValue] -> [Eval Value] -> [Eval Value] -> Eval Ordering
- Cryptol.Prims.Syntax: tBinOpPrec :: Map TFun (Assoc, Int)
- Cryptol.Prims.Syntax: tfunNames :: Map PName (Int, TFun)
- Cryptol.Symbolic.Prims: addPoly :: [SBool] -> [SBool] -> [SBool]
- 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: degree :: [SBool] -> Int
- Cryptol.Symbolic.Prims: divx :: Int -> Int -> [SBool] -> [SBool] -> ([SBool], [SBool])
- 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: ites :: SBool -> [SBool] -> [SBool] -> [SBool]
- Cryptol.Symbolic.Prims: mdp :: [SBool] -> [SBool] -> ([SBool], [SBool])
- Cryptol.Symbolic.Prims: nth :: [SBool] -> Int -> SBool
- 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_bits :: Nat' -> TValue -> Seq (Eval SBool) -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (Seq (Eval SBool))
- Cryptol.Symbolic.Value: instance Cryptol.Eval.Value.BitWord Cryptol.Symbolic.Value.SBool Cryptol.Symbolic.Value.SWord
- Cryptol.TypeCheck: MultipleTypeParamDefs :: Ident -> [Range] -> Error
- Cryptol.TypeCheck: RepeatedDefinitions :: Name -> [Range] -> Error
- Cryptol.TypeCheck: RepeatedTyParams :: [TParam Name] -> Error
- Cryptol.TypeCheck: UndefinedTypeParam :: (Located Ident) -> Error
- Cryptol.TypeCheck: UndefinedTypeSynonym :: Name -> Error
- Cryptol.TypeCheck: UndefinedVariable :: Name -> Error
- Cryptol.TypeCheck.Infer: appTys :: Expr Name -> [Located (Maybe Ident, Type)] -> Type -> InferM Expr
- Cryptol.TypeCheck.Infer: checkE :: Expr Name -> Type -> InferM Expr
- Cryptol.TypeCheck.Infer: checkFun :: Doc -> [Pattern Name] -> Expr Name -> Type -> InferM Expr
- Cryptol.TypeCheck.Infer: checkHasType :: Type -> Type -> InferM ()
- Cryptol.TypeCheck.Infer: checkMonoB :: Bind Name -> Type -> InferM Decl
- Cryptol.TypeCheck.Infer: checkP :: Doc -> Pattern Name -> Type -> InferM (Located Name)
- Cryptol.TypeCheck.Infer: checkTypeOfKind :: Type Name -> Kind -> InferM Type
- Cryptol.TypeCheck.Infer: desugarLiteral :: Bool -> Literal -> InferM (Expr Name)
- Cryptol.TypeCheck.Infer: expectFin :: Int -> Type -> InferM ()
- Cryptol.TypeCheck.Infer: expectFun :: Int -> Type -> InferM ([Type], Type)
- Cryptol.TypeCheck.Infer: expectRec :: [Named a] -> Type -> InferM [(Ident, a, Type)]
- Cryptol.TypeCheck.Infer: expectSeq :: Type -> InferM (Type, Type)
- Cryptol.TypeCheck.Infer: expectTuple :: Int -> Type -> InferM [Type]
- Cryptol.TypeCheck.Infer: generalize :: [Decl] -> [Goal] -> InferM [Decl]
- Cryptol.TypeCheck.Infer: guessType :: Map Name Expr -> Bind Name -> InferM ((Name, VarType), Either (InferM Decl) (InferM Decl))
- Cryptol.TypeCheck.Infer: inferCArm :: Int -> [Match Name] -> InferM ([Match], Map Name (Located Type), Type)
- Cryptol.TypeCheck.Infer: inferE :: Doc -> Expr Name -> InferM (Expr, Type)
- Cryptol.TypeCheck.Infer: inferMatch :: Match Name -> InferM (Match, Name, Located Type, Type)
- Cryptol.TypeCheck.Infer: inferP :: Doc -> Pattern Name -> InferM (Name, Located Type)
- Cryptol.TypeCheck.Infer: inferTyParam :: TypeInst Name -> InferM (Located (Maybe Ident, Type))
- Cryptol.TypeCheck.Infer: mkPrim :: String -> InferM (Expr Name)
- Cryptol.TypeCheck.Infer: smallest :: [Type] -> InferM Type
- Cryptol.TypeCheck.Infer: tcPanic :: String -> [String] -> a
- Cryptol.TypeCheck.InferTypes: AmbiguousType :: [Name] -> Error
- Cryptol.TypeCheck.InferTypes: CannotMixPositionalAndNamedTypeParams :: Error
- Cryptol.TypeCheck.InferTypes: DefaultingKind :: (TParam Name) -> Kind -> Warning
- Cryptol.TypeCheck.InferTypes: DefaultingTo :: Doc -> Type -> Warning
- Cryptol.TypeCheck.InferTypes: DefaultingWildType :: Kind -> Warning
- Cryptol.TypeCheck.InferTypes: ErrorMsg :: Doc -> Error
- Cryptol.TypeCheck.InferTypes: KindMismatch :: Kind -> Kind -> Error
- Cryptol.TypeCheck.InferTypes: MultipleTypeParamDefs :: Ident -> [Range] -> Error
- Cryptol.TypeCheck.InferTypes: NotForAll :: TVar -> Type -> Error
- Cryptol.TypeCheck.InferTypes: RecursiveType :: Type -> Type -> Error
- Cryptol.TypeCheck.InferTypes: RecursiveTypeDecls :: [Name] -> Error
- Cryptol.TypeCheck.InferTypes: RepeatedDefinitions :: Name -> [Range] -> Error
- Cryptol.TypeCheck.InferTypes: RepeatedTyParams :: [TParam Name] -> Error
- Cryptol.TypeCheck.InferTypes: TooFewTySynParams :: Name -> Int -> Error
- Cryptol.TypeCheck.InferTypes: TooManyPositionalTypeParams :: Error
- Cryptol.TypeCheck.InferTypes: TooManyTySynParams :: Name -> Int -> Error
- Cryptol.TypeCheck.InferTypes: TooManyTypeParams :: Int -> Kind -> Error
- Cryptol.TypeCheck.InferTypes: TypeMismatch :: Type -> Type -> Error
- Cryptol.TypeCheck.InferTypes: TypeVariableEscaped :: Type -> [TVar] -> Error
- Cryptol.TypeCheck.InferTypes: UndefinedTypeParam :: (Located Ident) -> Error
- Cryptol.TypeCheck.InferTypes: UndefinedTypeSynonym :: Name -> Error
- Cryptol.TypeCheck.InferTypes: UndefinedVariable :: Name -> Error
- Cryptol.TypeCheck.InferTypes: UnexpectedTypeWildCard :: Error
- Cryptol.TypeCheck.InferTypes: UnsolvedDelayedCt :: DelayedCt -> Error
- Cryptol.TypeCheck.InferTypes: UnsolvedGoals :: Bool -> [Goal] -> Error
- Cryptol.TypeCheck.InferTypes: UnusableFunction :: Name -> [Prop] -> Error
- Cryptol.TypeCheck.InferTypes: data Error
- Cryptol.TypeCheck.InferTypes: data Warning
- Cryptol.TypeCheck.InferTypes: instance Control.DeepSeq.NFData Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance Control.DeepSeq.NFData Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.InferTypes.Error)
- Cryptol.TypeCheck.InferTypes: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.InferTypes.Warning)
- Cryptol.TypeCheck.InferTypes: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance GHC.Generics.Generic Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance GHC.Generics.Generic Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance GHC.Show.Show Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance GHC.Show.Show Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: newtype Goals
- Cryptol.TypeCheck.Monad: [lazyTVars] :: KRO -> Map Name Type
- Cryptol.TypeCheck.Monad: lookupTVar :: Name -> InferM (Maybe Type)
- Cryptol.TypeCheck.PP: intToName :: Int -> String
- Cryptol.TypeCheck.Solve: improveByDefaultingWith :: Solver -> [TVar] -> [Goal] -> IO ([TVar], [Goal], Maybe Subst, [Warning])
- Cryptol.TypeCheck.Solver.CrySAT: DefinedProp :: a -> SimpProp -> Prop -> DefinedProp a
- Cryptol.TypeCheck.Solver.CrySAT: [dpData] :: DefinedProp a -> a
- Cryptol.TypeCheck.Solver.CrySAT: [dpSimpExprProp] :: DefinedProp a -> Prop
- Cryptol.TypeCheck.Solver.CrySAT: [dpSimpProp] :: DefinedProp a -> SimpProp
- Cryptol.TypeCheck.Solver.CrySAT: assumeProps :: Solver -> [Prop] -> IO [SimpProp]
- Cryptol.TypeCheck.Solver.CrySAT: check :: Solver -> IO (Maybe (Subst, [Prop]))
- Cryptol.TypeCheck.Solver.CrySAT: class DebugLog t where debugLogList s ts = case ts of { [] -> debugLog s "(none)" _ -> mapM_ (debugLog s) ts }
- Cryptol.TypeCheck.Solver.CrySAT: data DefinedProp a
- Cryptol.TypeCheck.Solver.CrySAT: data Solver
- Cryptol.TypeCheck.Solver.CrySAT: debugBlock :: Solver -> String -> IO a -> IO a
- Cryptol.TypeCheck.Solver.CrySAT: debugLog :: DebugLog t => Solver -> t -> IO ()
- Cryptol.TypeCheck.Solver.CrySAT: debugLogList :: DebugLog t => Solver -> [t] -> IO ()
- Cryptol.TypeCheck.Solver.CrySAT: getIntervals :: Solver -> IO (Either TVar (Map TVar Interval))
- Cryptol.TypeCheck.Solver.CrySAT: getModel :: Solver -> [Prop] -> IO (Maybe Subst)
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.InferTypes.Goal
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.Solver.Numeric.AST.Prop
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.Subst.Subst
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.Type.Type
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.Utils.PP.Doc
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog GHC.Types.Char
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog a => Cryptol.TypeCheck.Solver.CrySAT.DebugLog (GHC.Base.Maybe a)
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog a => Cryptol.TypeCheck.Solver.CrySAT.DebugLog [a]
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.HasProp Cryptol.TypeCheck.InferTypes.Goal
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.HasProp Cryptol.TypeCheck.Type.Prop
- Cryptol.TypeCheck.Solver.CrySAT: instance GHC.Show.Show Cryptol.TypeCheck.Solver.CrySAT.Scope
- Cryptol.TypeCheck.Solver.CrySAT: instance GHC.Show.Show Cryptol.TypeCheck.Solver.CrySAT.VarInfo
- Cryptol.TypeCheck.Solver.CrySAT: knownDefined :: (a, Prop) -> DefinedProp a
- Cryptol.TypeCheck.Solver.CrySAT: loadFile :: Solver -> FilePath -> IO ()
- Cryptol.TypeCheck.Solver.CrySAT: logger :: Solver -> Logger
- Cryptol.TypeCheck.Solver.CrySAT: minimizeContradictionSimpDef :: HasProp a => Solver -> [DefinedProp a] -> IO [a]
- Cryptol.TypeCheck.Solver.CrySAT: numericRight :: Goal -> Either Goal (Goal, Prop)
- Cryptol.TypeCheck.Solver.CrySAT: rawSolver :: Solver -> Solver
- Cryptol.TypeCheck.Solver.CrySAT: simplifyProps :: Solver -> [DefinedProp Goal] -> IO [Goal]
- Cryptol.TypeCheck.Solver.CrySAT: withScope :: Solver -> IO a -> IO a
- Cryptol.TypeCheck.Solver.CrySAT: withSolver :: SolverConfig -> (Solver -> IO a) -> IO a
- Cryptol.TypeCheck.Solver.Numeric.AST: (:&&) :: Prop -> Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:*) :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: (:+) :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: (:-) :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: (:==) :: Expr -> Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:==:) :: Expr -> Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:>) :: Expr -> Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:>:) :: Expr -> Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:>=) :: Expr -> Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: (:^^) :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: (:||) :: Prop -> Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: Div :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Fin :: Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: If :: p -> (IfExpr' p a) -> (IfExpr' p a) -> IfExpr' p a
- Cryptol.TypeCheck.Solver.Numeric.AST: Impossible :: IfExpr' p a
- Cryptol.TypeCheck.Solver.Numeric.AST: Inf :: Nat'
- Cryptol.TypeCheck.Solver.Numeric.AST: K :: Nat' -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: LenFromThen :: Expr -> Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: LenFromThenTo :: Expr -> Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Max :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Min :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Mod :: Expr -> Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Nat :: Integer -> Nat'
- Cryptol.TypeCheck.Solver.Numeric.AST: Not :: Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: PFalse :: Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: PTrue :: Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: Return :: a -> IfExpr' p a
- Cryptol.TypeCheck.Solver.Numeric.AST: SysName :: Int -> Name
- Cryptol.TypeCheck.Solver.Numeric.AST: UserName :: TVar -> Name
- Cryptol.TypeCheck.Solver.Numeric.AST: Var :: Name -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: Width :: Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: apSubst :: HasVars ast => Subst -> ast -> Maybe ast
- Cryptol.TypeCheck.Solver.Numeric.AST: class HasVars ast
- Cryptol.TypeCheck.Solver.Numeric.AST: composeSubst :: Subst -> Subst -> Subst
- Cryptol.TypeCheck.Solver.Numeric.AST: cryAnds :: [Prop] -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: cryExprExprs :: Expr -> [Expr]
- Cryptol.TypeCheck.Solver.Numeric.AST: cryExprFVS :: Expr -> Set Name
- Cryptol.TypeCheck.Solver.Numeric.AST: cryLet :: HasVars e => Name -> Expr -> e -> Maybe e
- Cryptol.TypeCheck.Solver.Numeric.AST: cryOrs :: [Prop] -> Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: cryPropExprs :: Prop -> [Expr]
- Cryptol.TypeCheck.Solver.Numeric.AST: cryPropFVS :: Prop -> Set Name
- Cryptol.TypeCheck.Solver.Numeric.AST: cryRebuildExpr :: Expr -> [Expr] -> Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: data Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: data IfExpr' p a
- Cryptol.TypeCheck.Solver.Numeric.AST: data Name
- Cryptol.TypeCheck.Solver.Numeric.AST: data Nat'
- Cryptol.TypeCheck.Solver.Numeric.AST: data Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: doAppSubst :: HasVars a => Subst -> a -> a
- Cryptol.TypeCheck.Solver.Numeric.AST: inf :: Expr
- 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.Numeric.AST: instance Cryptol.TypeCheck.Solver.Numeric.AST.HasVars Cryptol.TypeCheck.Solver.Numeric.AST.Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: instance Cryptol.TypeCheck.Solver.Numeric.AST.HasVars Cryptol.TypeCheck.Solver.Numeric.AST.Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: instance Cryptol.TypeCheck.Solver.Numeric.AST.HasVars GHC.Types.Bool
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Base.Applicative (Cryptol.TypeCheck.Solver.Numeric.AST.IfExpr' p)
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Base.Functor (Cryptol.TypeCheck.Solver.Numeric.AST.IfExpr' p)
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Base.Monad (Cryptol.TypeCheck.Solver.Numeric.AST.IfExpr' p)
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.Solver.Numeric.AST.Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.Solver.Numeric.AST.Name
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.Solver.Numeric.AST.Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.Solver.Numeric.AST.Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.Solver.Numeric.AST.Name
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.Solver.Numeric.AST.Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.Solver.Numeric.AST.Name
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.Solver.Numeric.AST.Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Numeric.AST.Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Numeric.AST.Name
- Cryptol.TypeCheck.Solver.Numeric.AST: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Numeric.AST.Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: one :: Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: ppExpr :: Expr -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppExprPrec :: Int -> Expr -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppIf :: (p -> Doc) -> (a -> Doc) -> IfExpr' p a -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppIfExpr :: IfExpr Expr -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppName :: Name -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppProp :: Prop -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: ppPropPrec :: Int -> Prop -> Doc
- Cryptol.TypeCheck.Solver.Numeric.AST: two :: Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: type IfExpr = IfExpr' Prop
- Cryptol.TypeCheck.Solver.Numeric.AST: type Subst = Map Name Expr
- Cryptol.TypeCheck.Solver.Numeric.AST: zero :: Expr
- Cryptol.TypeCheck.Solver.Numeric.Defined: cryDefined :: Expr -> Prop
- Cryptol.TypeCheck.Solver.Numeric.Defined: cryDefinedProp :: Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: exportProp :: Prop -> Maybe Prop
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: exportPropM :: Prop -> ExportM Prop
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: exportType :: Prop -> Maybe Expr
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: exportTypeM :: Type -> ExportM Expr
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: importProp :: Prop -> Maybe [Prop]
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: importType :: Expr -> Maybe Type
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: runExportM :: ExportM a -> Maybe a
- Cryptol.TypeCheck.Solver.Numeric.ImportExport: type ExportM = ExceptionT () Id
- Cryptol.TypeCheck.Solver.Numeric.Interval: iDisjoint :: Interval -> Interval -> Bool
- Cryptol.TypeCheck.Solver.Numeric.NonLin: apSubstNL :: Subst -> NonLinS -> Maybe (Subst, [Prop], NonLinS)
- Cryptol.TypeCheck.Solver.Numeric.NonLin: data NonLinS
- Cryptol.TypeCheck.Solver.Numeric.NonLin: initialNonLinS :: NonLinS
- Cryptol.TypeCheck.Solver.Numeric.NonLin: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Numeric.NonLin.NonLinS
- Cryptol.TypeCheck.Solver.Numeric.NonLin: lookupNL :: Name -> NonLinS -> Maybe Expr
- Cryptol.TypeCheck.Solver.Numeric.NonLin: nonLinProp :: NonLinS -> Prop -> ([Prop], NonLinS)
- Cryptol.TypeCheck.Solver.Numeric.NonLin: nonLinSubst :: NonLinS -> Subst
- Cryptol.TypeCheck.Solver.Numeric.SMT: cryImproveModel :: Solver -> Logger -> Map Name Nat' -> IO (Map Name Expr, [Prop])
- Cryptol.TypeCheck.Solver.Numeric.SMT: desugarProp :: Prop -> IfExpr Prop
- Cryptol.TypeCheck.Solver.Numeric.SMT: getVal :: Solver -> Name -> IO Nat'
- Cryptol.TypeCheck.Solver.Numeric.SMT: getVals :: Solver -> [Name] -> IO (Map Name Nat')
- Cryptol.TypeCheck.Solver.Numeric.SMT: ifPropToSmtLib :: IfExpr Prop -> SExpr
- Cryptol.TypeCheck.Solver.Numeric.SMT: smtFinName :: Name -> String
- Cryptol.TypeCheck.Solver.Numeric.SMT: smtName :: Name -> String
- Cryptol.TypeCheck.Solver.Numeric.Simplify: crySimpPropExpr :: Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.Simplify: crySimpPropExprMaybe :: Prop -> Maybe Prop
- Cryptol.TypeCheck.Solver.Numeric.Simplify: crySimplify :: Prop -> Prop
- Cryptol.TypeCheck.Solver.Numeric.Simplify: crySimplifyMaybe :: Prop -> Maybe Prop
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: Neg :: Sign
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: Pos :: Sign
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: crySimpExpr :: Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: crySimpExprMaybe :: Expr -> Maybe Expr
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: crySimpExprStep :: Expr -> Maybe Expr
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: crySimpExprStep1 :: Expr -> Maybe Expr
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: data Sign
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr.Sign
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: normSum :: Expr -> Expr
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: otherSign :: Sign -> Sign
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: signed :: Sign -> Integer -> Integer
- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr: splitSum :: Expr -> [(Sign, Expr)]
- Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk Cryptol.TypeCheck.Type.TCErrorMessage
- Cryptol.TypeCheck.Type: (:->) :: Kind -> Kind -> Kind
- Cryptol.TypeCheck.Type: KNum :: Kind
- Cryptol.TypeCheck.Type: KProp :: Kind
- Cryptol.TypeCheck.Type: KType :: Kind
- 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: TError :: Kind -> TCErrorMessage -> TCon
- Cryptol.TypeCheck.Type: TF :: TFun -> TCon
- Cryptol.TypeCheck.Type: UserTC :: Name -> Kind -> UserTC
- Cryptol.TypeCheck.Type: [tcErrorMessage] :: TCErrorMessage -> !String
- Cryptol.TypeCheck.Type: [tpName] :: TParam -> Maybe Name
- Cryptol.TypeCheck.Type: class HasKind t
- Cryptol.TypeCheck.Type: data Kind
- Cryptol.TypeCheck.Type: data PC
- Cryptol.TypeCheck.Type: data TC
- Cryptol.TypeCheck.Type: data TCErrorMessage
- Cryptol.TypeCheck.Type: data TCon
- Cryptol.TypeCheck.Type: data TFun
- Cryptol.TypeCheck.Type: data UserTC
- Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.Kind
- Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.PC
- 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.UserTC
- 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.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.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.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.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.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.UserTC
- Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.Kind
- Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.PC
- 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.UserTC
- Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.Kind
- Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.PC
- 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.UserTC
- Cryptol.TypeCheck.Type: kindOf :: HasKind t => t -> Kind
- Cryptol.TypeCheck.Type: tWidth :: Type -> Type
- Cryptol.TypeCheck.TypeMap: instance GHC.Classes.Ord a => Cryptol.TypeCheck.TypeMap.TrieMap (Data.Map.Base.Map a) a
- Cryptol.TypeCheck.Unify: Error :: UnificationError -> Result a
- Cryptol.TypeCheck.Unify: OK :: a -> Result a
- Cryptol.TypeCheck.Unify: data Result a
- Cryptol.TypeCheck.Unify: instance GHC.Base.Applicative Cryptol.TypeCheck.Unify.Result
- Cryptol.TypeCheck.Unify: instance GHC.Base.Functor Cryptol.TypeCheck.Unify.Result
- Cryptol.TypeCheck.Unify: instance GHC.Base.Monad Cryptol.TypeCheck.Unify.Result
- Cryptol.Utils.Ident: Ident :: Bool -> Text -> Ident
- Cryptol.Utils.Ident: modSep :: Text
- Cryptol.Utils.Ident: preludeExtrasName :: ModName
- Cryptol.Utils.Ident: type ModName = Text
- Cryptol.Utils.Ident: unpackModName :: ModName -> [String]
- Cryptol.Utils.PP: (<>) :: Doc -> Doc -> Doc
- Cryptol.Utils.Panic: instance GHC.Exception.Exception Cryptol.Utils.Panic.CryptolPanic
- Cryptol.Utils.Panic: instance GHC.Show.Show Cryptol.Utils.Panic.CryptolPanic
+ Cryptol.Eval: EvalOpts :: Logger -> PPOpts -> EvalOpts
+ Cryptol.Eval: LogNegative :: EvalError
+ Cryptol.Eval: NegativeExponent :: EvalError
+ Cryptol.Eval: PPOpts :: Bool -> Int -> Int -> PPOpts
+ Cryptol.Eval: [evalLogger] :: EvalOpts -> Logger
+ Cryptol.Eval: [evalPPOpts] :: EvalOpts -> PPOpts
+ Cryptol.Eval: [useAscii] :: PPOpts -> Bool
+ Cryptol.Eval: [useBase] :: PPOpts -> Int
+ Cryptol.Eval: [useInfLength] :: PPOpts -> Int
+ Cryptol.Eval: data EvalOpts
+ Cryptol.Eval: data PPOpts
+ Cryptol.Eval: defaultPPOpts :: PPOpts
+ Cryptol.Eval: instance GHC.Base.Monoid (Cryptol.Eval.ListEnv b w i)
+ Cryptol.Eval: instance GHC.Base.Semigroup (Cryptol.Eval.ListEnv b w i)
+ Cryptol.Eval.Env: instance (Control.DeepSeq.NFData b, Control.DeepSeq.NFData i, Control.DeepSeq.NFData w) => Control.DeepSeq.NFData (Cryptol.Eval.Env.GenEvalEnv b w i)
+ Cryptol.Eval.Env: instance GHC.Base.Monoid (Cryptol.Eval.Env.GenEvalEnv b w i)
+ Cryptol.Eval.Env: instance GHC.Base.Semigroup (Cryptol.Eval.Env.GenEvalEnv b w i)
+ Cryptol.Eval.Env: instance GHC.Generics.Generic (Cryptol.Eval.Env.GenEvalEnv b w i)
+ Cryptol.Eval.Monad: EvalOpts :: Logger -> PPOpts -> EvalOpts
+ Cryptol.Eval.Monad: LogNegative :: EvalError
+ Cryptol.Eval.Monad: NegativeExponent :: EvalError
+ Cryptol.Eval.Monad: PPOpts :: Bool -> Int -> Int -> PPOpts
+ Cryptol.Eval.Monad: [evalLogger] :: EvalOpts -> Logger
+ Cryptol.Eval.Monad: [evalPPOpts] :: EvalOpts -> PPOpts
+ Cryptol.Eval.Monad: [useAscii] :: PPOpts -> Bool
+ Cryptol.Eval.Monad: [useBase] :: PPOpts -> Int
+ Cryptol.Eval.Monad: [useInfLength] :: PPOpts -> Int
+ Cryptol.Eval.Monad: data EvalOpts
+ Cryptol.Eval.Monad: data PPOpts
+ Cryptol.Eval.Monad: getEvalOpts :: Eval EvalOpts
+ Cryptol.Eval.Monad: logNegative :: Eval a
+ Cryptol.Eval.Monad: negativeExponent :: Eval a
+ Cryptol.Eval.Reference: VInteger :: (Either EvalError Integer) -> Value
+ Cryptol.Eval.Reference: instance GHC.Base.Semigroup Cryptol.Eval.Reference.Env
+ Cryptol.Eval.Type: TVIntMod :: Integer -> TValue
+ Cryptol.Eval.Type: TVInteger :: TValue
+ Cryptol.Eval.Value: LargeBitsVal :: !Integer -> !(SeqMap b w i) -> WordValue b w i
+ Cryptol.Eval.Value: VInteger :: !i -> GenValue b w i
+ Cryptol.Eval.Value: asBitsMap :: BitWord b w i => WordValue b w i -> SeqMap b w i
+ Cryptol.Eval.Value: checkedIndex :: [a] -> Integer -> Eval a
+ Cryptol.Eval.Value: checkedSeqIndex :: Seq a -> Integer -> Eval a
+ Cryptol.Eval.Value: concatSeqMap :: Integer -> SeqMap b w i -> SeqMap b w i -> SeqMap b w i
+ Cryptol.Eval.Value: dropSeqMap :: Integer -> SeqMap b w i -> SeqMap b w i
+ Cryptol.Eval.Value: enumerateWordValue :: BitWord b w i => WordValue b w i -> Eval [b]
+ Cryptol.Eval.Value: enumerateWordValueRev :: BitWord b w i => WordValue b w i -> Eval [b]
+ Cryptol.Eval.Value: fromBit :: GenValue b w i -> Eval b
+ Cryptol.Eval.Value: fromVInteger :: GenValue b w i -> i
+ Cryptol.Eval.Value: fromVSeq :: GenValue b w i -> SeqMap b w i
+ Cryptol.Eval.Value: instance (Control.DeepSeq.NFData b, Control.DeepSeq.NFData i, Control.DeepSeq.NFData w) => Control.DeepSeq.NFData (Cryptol.Eval.Value.GenValue b w i)
+ Cryptol.Eval.Value: instance (Control.DeepSeq.NFData w, Control.DeepSeq.NFData b) => Control.DeepSeq.NFData (Cryptol.Eval.Value.WordValue b w i)
+ Cryptol.Eval.Value: instance (GHC.Show.Show b, GHC.Show.Show w, GHC.Show.Show i) => GHC.Show.Show (Cryptol.Eval.Value.GenValue b w i)
+ Cryptol.Eval.Value: instance Control.DeepSeq.NFData (Cryptol.Eval.Value.SeqMap b w i)
+ Cryptol.Eval.Value: instance Cryptol.Eval.Value.BitWord GHC.Types.Bool Cryptol.Eval.Value.BV GHC.Integer.Type.Integer
+ Cryptol.Eval.Value: instance GHC.Generics.Generic (Cryptol.Eval.Value.GenValue b w i)
+ Cryptol.Eval.Value: instance GHC.Generics.Generic (Cryptol.Eval.Value.WordValue b w i)
+ Cryptol.Eval.Value: intMinus :: BitWord b w i => i -> i -> i
+ Cryptol.Eval.Value: intModMinus :: BitWord b w i => Integer -> i -> i -> i
+ Cryptol.Eval.Value: intModMult :: BitWord b w i => Integer -> i -> i -> i
+ Cryptol.Eval.Value: intModPlus :: BitWord b w i => Integer -> i -> i -> i
+ Cryptol.Eval.Value: intMult :: BitWord b w i => i -> i -> i
+ Cryptol.Eval.Value: intPlus :: BitWord b w i => i -> i -> i
+ Cryptol.Eval.Value: integerLit :: BitWord b w i => Integer -> i
+ Cryptol.Eval.Value: largeBitSize :: Integer
+ Cryptol.Eval.Value: ppInteger :: BitWord b w i => PPOpts -> i -> Doc
+ Cryptol.Eval.Value: updateWordValue :: BitWord b w i => WordValue b w i -> Integer -> Eval b -> Eval (WordValue b w i)
+ Cryptol.Eval.Value: wordBit :: BitWord b w i => w -> Integer -> b
+ Cryptol.Eval.Value: wordFromInt :: BitWord b w i => Integer -> i -> w
+ Cryptol.Eval.Value: wordToInt :: BitWord b w i => w -> i
+ Cryptol.Eval.Value: wordUpdate :: BitWord b w i => w -> Integer -> b -> w
+ Cryptol.Eval.Value: wordValueSize :: BitWord b w i => WordValue b w i -> Integer
+ Cryptol.IR.FreeVars: Deps :: Set Name -> Set Name -> Set TParam -> Deps
+ Cryptol.IR.FreeVars: [tyDeps] :: Deps -> Set Name
+ Cryptol.IR.FreeVars: [tyParams] :: Deps -> Set TParam
+ Cryptol.IR.FreeVars: [valDeps] :: Deps -> Set Name
+ Cryptol.IR.FreeVars: class Defs d
+ Cryptol.IR.FreeVars: class FreeVars e
+ Cryptol.IR.FreeVars: data Deps
+ Cryptol.IR.FreeVars: defs :: Defs d => d -> Set Name
+ Cryptol.IR.FreeVars: freeVars :: FreeVars e => e -> Deps
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.Defs Cryptol.TypeCheck.AST.Decl
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.Defs Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.Defs Cryptol.TypeCheck.AST.Match
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.Defs a => Cryptol.IR.FreeVars.Defs [a]
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.Prims.Syntax.TCon
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.AST.Decl
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.AST.DeclDef
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.AST.Expr
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.AST.Match
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.Type.Newtype
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.Type.Schema
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.Type.TVar
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars Cryptol.TypeCheck.Type.Type
+ Cryptol.IR.FreeVars: instance Cryptol.IR.FreeVars.FreeVars e => Cryptol.IR.FreeVars.FreeVars [e]
+ Cryptol.IR.FreeVars: instance GHC.Base.Monoid Cryptol.IR.FreeVars.Deps
+ Cryptol.IR.FreeVars: instance GHC.Base.Semigroup Cryptol.IR.FreeVars.Deps
+ Cryptol.IR.FreeVars: instance GHC.Classes.Eq Cryptol.IR.FreeVars.Deps
+ Cryptol.IR.FreeVars: moduleDeps :: Module -> Map Name Deps
+ Cryptol.IR.FreeVars: transDeps :: Map Name Deps -> Map Name Deps
+ Cryptol.ModuleSystem: ErrorInFile :: FilePath -> ModuleError -> ModuleError
+ Cryptol.ModuleSystem: FailedToParameterizeModDefs :: ModName -> [Name] -> ModuleError
+ Cryptol.ModuleSystem: IfaceParams :: Map Name ModTParam -> [Located Prop] -> Map Name ModVParam -> IfaceParams
+ Cryptol.ModuleSystem: ImportedParamModule :: ModName -> ModuleError
+ Cryptol.ModuleSystem: NotAParameterizedModule :: ModName -> ModuleError
+ Cryptol.ModuleSystem: [ifParamConstraints] :: IfaceParams -> [Located Prop]
+ Cryptol.ModuleSystem: [ifParamFuns] :: IfaceParams -> Map Name ModVParam
+ Cryptol.ModuleSystem: [ifParamTypes] :: IfaceParams -> Map Name ModTParam
+ Cryptol.ModuleSystem: [ifParams] :: Iface -> IfaceParams
+ Cryptol.ModuleSystem: data IfaceParams
+ Cryptol.ModuleSystem: loadModuleByName :: ModName -> ModuleCmd (FilePath, Module)
+ Cryptol.ModuleSystem.Base: checkSingleModule :: Act (Module Name) Module -> ImportSource -> FilePath -> Module PName -> ModuleM Module
+ Cryptol.ModuleSystem.Base: doLoadModule :: ImportSource -> FilePath -> Module PName -> ModuleM Module
+ Cryptol.ModuleSystem.Base: loadModuleFrom :: ImportSource -> ModuleM (FilePath, Module)
+ Cryptol.ModuleSystem.Base: type Act i o = i -> InferInput -> IO (InferOutput o)
+ Cryptol.ModuleSystem.Env: [lmLoadedModules] :: LoadedModules -> [LoadedModule]
+ Cryptol.ModuleSystem.Env: [lmLoadedParamModules] :: LoadedModules -> [LoadedModule]
+ Cryptol.ModuleSystem.Env: data LoadedModules
+ Cryptol.ModuleSystem.Env: getLoadedModules :: LoadedModules -> [LoadedModule]
+ Cryptol.ModuleSystem.Env: instance GHC.Base.Semigroup Cryptol.ModuleSystem.Env.DynamicEnv
+ Cryptol.ModuleSystem.Env: instance GHC.Base.Semigroup Cryptol.ModuleSystem.Env.LoadedModules
+ Cryptol.ModuleSystem.Exports: ExportSpec :: Set name -> Set name -> ExportSpec name
+ Cryptol.ModuleSystem.Exports: [eBinds] :: ExportSpec name -> Set name
+ Cryptol.ModuleSystem.Exports: [eTypes] :: ExportSpec name -> Set name
+ Cryptol.ModuleSystem.Exports: data ExportSpec name
+ Cryptol.ModuleSystem.Exports: exportBind :: Ord name => TopLevel name -> ExportSpec name
+ Cryptol.ModuleSystem.Exports: exportType :: Ord name => TopLevel name -> ExportSpec name
+ Cryptol.ModuleSystem.Exports: instance Control.DeepSeq.NFData name => Control.DeepSeq.NFData (Cryptol.ModuleSystem.Exports.ExportSpec name)
+ Cryptol.ModuleSystem.Exports: instance GHC.Classes.Ord name => GHC.Base.Monoid (Cryptol.ModuleSystem.Exports.ExportSpec name)
+ Cryptol.ModuleSystem.Exports: instance GHC.Classes.Ord name => GHC.Base.Semigroup (Cryptol.ModuleSystem.Exports.ExportSpec name)
+ Cryptol.ModuleSystem.Exports: instance GHC.Generics.Generic (Cryptol.ModuleSystem.Exports.ExportSpec name)
+ Cryptol.ModuleSystem.Exports: instance GHC.Show.Show name => GHC.Show.Show (Cryptol.ModuleSystem.Exports.ExportSpec name)
+ Cryptol.ModuleSystem.Exports: isExportedBind :: Ord name => name -> ExportSpec name -> Bool
+ Cryptol.ModuleSystem.Exports: isExportedType :: Ord name => name -> ExportSpec name -> Bool
+ Cryptol.ModuleSystem.Exports: modExports :: Ord name => Module name -> ExportSpec name
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Defines Cryptol.TypeCheck.AST.Decl
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Defines Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Defines t => Cryptol.ModuleSystem.InstantiateModule.Defines [t]
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst (Cryptol.ModuleSystem.Exports.ExportSpec Cryptol.ModuleSystem.Name.Name)
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.Prims.Syntax.TC
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.Prims.Syntax.TCon
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.Prims.Syntax.UserTC
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.AST.Decl
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.AST.DeclDef
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.AST.Expr
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.AST.Match
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.Type.Newtype
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.Type.Schema
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.Type.TySyn
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst Cryptol.TypeCheck.Type.Type
+ Cryptol.ModuleSystem.InstantiateModule: instance Cryptol.ModuleSystem.InstantiateModule.Inst a => Cryptol.ModuleSystem.InstantiateModule.Inst [a]
+ Cryptol.ModuleSystem.InstantiateModule: instance GHC.Show.Show Cryptol.ModuleSystem.InstantiateModule.Env
+ Cryptol.ModuleSystem.InstantiateModule: instantiateModule :: FreshM m => Module -> ModName -> Map TParam Type -> Map Name Expr -> m ([Located Prop], Module)
+ Cryptol.ModuleSystem.Interface: IfaceParams :: Map Name ModTParam -> [Located Prop] -> Map Name ModVParam -> IfaceParams
+ Cryptol.ModuleSystem.Interface: [ifParamConstraints] :: IfaceParams -> [Located Prop]
+ Cryptol.ModuleSystem.Interface: [ifParamFuns] :: IfaceParams -> Map Name ModVParam
+ Cryptol.ModuleSystem.Interface: [ifParamTypes] :: IfaceParams -> Map Name ModTParam
+ Cryptol.ModuleSystem.Interface: [ifParams] :: Iface -> IfaceParams
+ Cryptol.ModuleSystem.Interface: data IfaceParams
+ Cryptol.ModuleSystem.Interface: instance Control.DeepSeq.NFData Cryptol.ModuleSystem.Interface.IfaceParams
+ Cryptol.ModuleSystem.Interface: instance GHC.Base.Semigroup Cryptol.ModuleSystem.Interface.IfaceDecls
+ Cryptol.ModuleSystem.Interface: instance GHC.Generics.Generic Cryptol.ModuleSystem.Interface.IfaceParams
+ Cryptol.ModuleSystem.Interface: instance GHC.Show.Show Cryptol.ModuleSystem.Interface.IfaceParams
+ Cryptol.ModuleSystem.Interface: noIfaceParams :: IfaceParams
+ Cryptol.ModuleSystem.Monad: ErrorInFile :: FilePath -> ModuleError -> ModuleError
+ Cryptol.ModuleSystem.Monad: FailedToParameterizeModDefs :: ModName -> [Name] -> ModuleError
+ Cryptol.ModuleSystem.Monad: FromModuleInstance :: (Located ModName) -> ImportSource
+ Cryptol.ModuleSystem.Monad: ImportedParamModule :: ModName -> ModuleError
+ Cryptol.ModuleSystem.Monad: NotAParameterizedModule :: ModName -> ModuleError
+ Cryptol.ModuleSystem.Monad: [roEvalOpts] :: RO -> EvalOpts
+ Cryptol.ModuleSystem.Monad: errorInFile :: FilePath -> ModuleM a -> ModuleM a
+ Cryptol.ModuleSystem.Monad: failedToParameterizeModDefs :: ModName -> [Name] -> ModuleM a
+ Cryptol.ModuleSystem.Monad: getEvalOpts :: ModuleM EvalOpts
+ Cryptol.ModuleSystem.Monad: getLoaded :: ModName -> ModuleM Module
+ Cryptol.ModuleSystem.Monad: getLoadedMaybe :: ModName -> ModuleM (Maybe LoadedModule)
+ Cryptol.ModuleSystem.Monad: importParamModule :: ModName -> ModuleM a
+ Cryptol.ModuleSystem.Monad: loadingModInstance :: Located ModName -> ModuleM a -> ModuleM a
+ Cryptol.ModuleSystem.Monad: notAParameterizedModule :: ModName -> ModuleM a
+ Cryptol.ModuleSystem.Monad: withLogger :: (Logger -> a -> IO b) -> a -> ModuleM b
+ Cryptol.ModuleSystem.Name: SystemName :: NameSource
+ Cryptol.ModuleSystem.Name: UserName :: NameSource
+ Cryptol.ModuleSystem.Name: asParamName :: Name -> Name
+ Cryptol.ModuleSystem.Name: data NameSource
+ Cryptol.ModuleSystem.Name: instance Control.DeepSeq.NFData Cryptol.ModuleSystem.Name.NameSource
+ Cryptol.ModuleSystem.Name: instance GHC.Classes.Eq Cryptol.ModuleSystem.Name.NameSource
+ Cryptol.ModuleSystem.Name: instance GHC.Generics.Generic Cryptol.ModuleSystem.Name.NameSource
+ Cryptol.ModuleSystem.Name: instance GHC.Show.Show Cryptol.ModuleSystem.Name.NameSource
+ Cryptol.ModuleSystem.Name: paramModRecParam :: Name
+ Cryptol.ModuleSystem.Name: toParamInstName :: Name -> Name
+ Cryptol.ModuleSystem.NamingEnv: instance Cryptol.ModuleSystem.NamingEnv.BindsNames (Cryptol.ModuleSystem.NamingEnv.InModule (Cryptol.Parser.AST.ParameterFun Cryptol.Parser.Name.PName))
+ Cryptol.ModuleSystem.NamingEnv: instance Cryptol.ModuleSystem.NamingEnv.BindsNames (Cryptol.ModuleSystem.NamingEnv.InModule (Cryptol.Parser.AST.ParameterType Cryptol.Parser.Name.PName))
+ Cryptol.ModuleSystem.NamingEnv: instance GHC.Base.Semigroup Cryptol.ModuleSystem.NamingEnv.BuildNamingEnv
+ Cryptol.ModuleSystem.NamingEnv: instance GHC.Base.Semigroup Cryptol.ModuleSystem.NamingEnv.NamingEnv
+ Cryptol.ModuleSystem.NamingEnv: lookupTypeNames :: PName -> NamingEnv -> [Name]
+ Cryptol.ModuleSystem.NamingEnv: lookupValNames :: PName -> NamingEnv -> [Name]
+ Cryptol.ModuleSystem.NamingEnv: modParamsNamingEnv :: IfaceParams -> NamingEnv
+ Cryptol.ModuleSystem.NamingEnv: newLocal :: FreshM m => PName -> Range -> m Name
+ Cryptol.ModuleSystem.NamingEnv: newTop :: FreshM m => ModName -> PName -> Maybe Fixity -> Range -> m Name
+ Cryptol.ModuleSystem.Renamer: UnusedName :: Name -> NameDisp -> RenamerWarning
+ Cryptol.ModuleSystem.Renamer: instance (GHC.Base.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Cryptol.ModuleSystem.Renamer.RenameM a)
+ Cryptol.ModuleSystem.Renamer: instance Cryptol.ModuleSystem.Renamer.Rename Cryptol.Parser.AST.ParameterFun
+ Cryptol.ModuleSystem.Renamer: instance Cryptol.ModuleSystem.Renamer.Rename Cryptol.Parser.AST.ParameterType
+ Cryptol.ModuleSystem.Renamer: instance Cryptol.ModuleSystem.Renamer.Rename Cryptol.Parser.AST.PropSyn
+ Cryptol.ModuleSystem.Renamer: instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Cryptol.ModuleSystem.Renamer.RenameM a)
+ Cryptol.Parser: HappyOutOfTokens :: FilePath -> Position -> ParseError
+ Cryptol.Parser: HappyUnexpected :: FilePath -> (Maybe (Located Token)) -> String -> ParseError
+ Cryptol.Parser.AST: CLiteral :: (Type n) -> (Type n) -> Prop n
+ Cryptol.Parser.AST: CLogic :: (Type n) -> Prop n
+ Cryptol.Parser.AST: CNeq :: (Type n) -> (Type n) -> Prop n
+ Cryptol.Parser.AST: CSignedCmp :: (Type n) -> Prop n
+ Cryptol.Parser.AST: CUser :: n -> [Type n] -> Prop n
+ Cryptol.Parser.AST: CZero :: (Type n) -> Prop n
+ Cryptol.Parser.AST: DParameterConstraint :: [Located (Prop name)] -> TopDecl name
+ Cryptol.Parser.AST: DParameterFun :: (ParameterFun name) -> TopDecl name
+ Cryptol.Parser.AST: DParameterType :: (ParameterType name) -> TopDecl name
+ Cryptol.Parser.AST: DProp :: (PropSyn name) -> Decl name
+ Cryptol.Parser.AST: EComplement :: (Expr n) -> Expr n
+ Cryptol.Parser.AST: ENeg :: (Expr n) -> Expr n
+ Cryptol.Parser.AST: KFun :: Kind -> Kind -> Kind
+ Cryptol.Parser.AST: ParameterFun :: Located name -> Schema name -> Maybe String -> Maybe Fixity -> ParameterFun name
+ Cryptol.Parser.AST: ParameterType :: Located name -> Kind -> Maybe String -> Maybe Fixity -> !Int -> ParameterType name
+ Cryptol.Parser.AST: PropSyn :: (Located n) -> [TParam n] -> [Prop n] -> PropSyn n
+ Cryptol.Parser.AST: [mInstance] :: Module name -> !(Maybe (Located ModName))
+ Cryptol.Parser.AST: [pfDoc] :: ParameterFun name -> Maybe String
+ Cryptol.Parser.AST: [pfFixity] :: ParameterFun name -> Maybe Fixity
+ Cryptol.Parser.AST: [pfName] :: ParameterFun name -> Located name
+ Cryptol.Parser.AST: [pfSchema] :: ParameterFun name -> Schema name
+ Cryptol.Parser.AST: [ptDoc] :: ParameterType name -> Maybe String
+ Cryptol.Parser.AST: [ptFixity] :: ParameterType name -> Maybe Fixity
+ Cryptol.Parser.AST: [ptKind] :: ParameterType name -> Kind
+ Cryptol.Parser.AST: [ptName] :: ParameterType name -> Located name
+ Cryptol.Parser.AST: [ptNumber] :: ParameterType name -> !Int
+ Cryptol.Parser.AST: data ModName
+ Cryptol.Parser.AST: data ParameterFun name
+ Cryptol.Parser.AST: data ParameterType name
+ Cryptol.Parser.AST: data PropSyn n
+ Cryptol.Parser.AST: instance (GHC.Show.Show name, Cryptol.Utils.PP.PPName name) => Cryptol.Utils.PP.PP (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance (GHC.Show.Show name, Cryptol.Utils.PP.PPName name) => Cryptol.Utils.PP.PP (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Cryptol.Parser.AST.PropSyn n)
+ Cryptol.Parser.AST: instance Control.DeepSeq.NFData name => Control.DeepSeq.NFData (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance Control.DeepSeq.NFData name => Control.DeepSeq.NFData (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance Cryptol.Parser.AST.NoPos (Cryptol.Parser.AST.ParameterFun x)
+ Cryptol.Parser.AST: instance Cryptol.Parser.AST.NoPos (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance Cryptol.Parser.AST.NoPos (Cryptol.Parser.AST.PropSyn name)
+ Cryptol.Parser.AST: instance Cryptol.Parser.Position.HasLoc (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance Cryptol.Parser.Position.HasLoc (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance Cryptol.Utils.PP.PPName name => Cryptol.Utils.PP.PP (Cryptol.Parser.AST.PropSyn name)
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Bind
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.BindDef
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Decl
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Expr
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Match
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Pattern
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Prop
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.PropSyn
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Schema
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.TParam
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.TySyn
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.Type
+ Cryptol.Parser.AST: instance GHC.Base.Functor Cryptol.Parser.AST.TypeInst
+ Cryptol.Parser.AST: instance GHC.Classes.Eq n => GHC.Classes.Eq (Cryptol.Parser.AST.PropSyn n)
+ Cryptol.Parser.AST: instance GHC.Classes.Eq name => GHC.Classes.Eq (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance GHC.Classes.Eq name => GHC.Classes.Eq (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance GHC.Generics.Generic (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance GHC.Generics.Generic (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.AST: instance GHC.Generics.Generic (Cryptol.Parser.AST.PropSyn n)
+ Cryptol.Parser.AST: instance GHC.Show.Show n => GHC.Show.Show (Cryptol.Parser.AST.PropSyn n)
+ Cryptol.Parser.AST: instance GHC.Show.Show name => GHC.Show.Show (Cryptol.Parser.AST.ParameterFun name)
+ Cryptol.Parser.AST: instance GHC.Show.Show name => GHC.Show.Show (Cryptol.Parser.AST.ParameterType name)
+ Cryptol.Parser.Fixity: FCError :: FixityCmp
+ Cryptol.Parser.Fixity: FCLeft :: FixityCmp
+ Cryptol.Parser.Fixity: FCRight :: FixityCmp
+ Cryptol.Parser.Fixity: Fixity :: !Assoc -> !Int -> Fixity
+ Cryptol.Parser.Fixity: [fAssoc] :: Fixity -> !Assoc
+ Cryptol.Parser.Fixity: [fLevel] :: Fixity -> !Int
+ Cryptol.Parser.Fixity: compareFixity :: Fixity -> Fixity -> FixityCmp
+ Cryptol.Parser.Fixity: data Fixity
+ Cryptol.Parser.Fixity: data FixityCmp
+ Cryptol.Parser.Fixity: defaultFixity :: Fixity
+ Cryptol.Parser.Fixity: instance Control.DeepSeq.NFData Cryptol.Parser.Fixity.Fixity
+ Cryptol.Parser.Fixity: instance GHC.Classes.Eq Cryptol.Parser.Fixity.Fixity
+ Cryptol.Parser.Fixity: instance GHC.Classes.Eq Cryptol.Parser.Fixity.FixityCmp
+ Cryptol.Parser.Fixity: instance GHC.Generics.Generic Cryptol.Parser.Fixity.Fixity
+ Cryptol.Parser.Fixity: instance GHC.Show.Show Cryptol.Parser.Fixity.Fixity
+ Cryptol.Parser.Fixity: instance GHC.Show.Show Cryptol.Parser.Fixity.FixityCmp
+ Cryptol.Parser.Lexer: KW_constraint :: TokenKW
+ Cryptol.Parser.Lexer: KW_parameter :: TokenKW
+ Cryptol.Parser.Name: isGeneratedName :: PName -> Bool
+ Cryptol.Parser.Names: namesC :: Ord name => Set name -> Prop name -> Set name
+ Cryptol.Parser.Names: psName :: PropSyn name -> Located name
+ Cryptol.Parser.Position: combLoc :: (a -> b -> c) -> Located a -> Located b -> Located c
+ Cryptol.Parser.Selector: ListSel :: Int -> (Maybe Int) -> Selector
+ Cryptol.Parser.Selector: RecordSel :: Ident -> (Maybe [Ident]) -> Selector
+ Cryptol.Parser.Selector: TupleSel :: Int -> (Maybe Int) -> Selector
+ Cryptol.Parser.Selector: data Selector
+ Cryptol.Parser.Selector: instance Control.DeepSeq.NFData Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: instance Cryptol.Utils.PP.PP Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: instance GHC.Classes.Eq Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: instance GHC.Classes.Ord Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: instance GHC.Generics.Generic Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: instance GHC.Show.Show Cryptol.Parser.Selector.Selector
+ Cryptol.Parser.Selector: ppSelector :: Selector -> Doc
+ Cryptol.Prims.Eval: addV :: BitWord b w i => Binary b w i
+ Cryptol.Prims.Eval: arithNullary :: forall b w i. BitWord b w i => (Integer -> w) -> i -> (Integer -> i) -> TValue -> GenValue b w i
+ Cryptol.Prims.Eval: bvSdiv :: Integer -> Integer -> Integer -> Eval BV
+ Cryptol.Prims.Eval: bvSlt :: Integer -> Integer -> Integer -> Eval Value
+ Cryptol.Prims.Eval: bvSrem :: Integer -> Integer -> Integer -> Eval BV
+ Cryptol.Prims.Eval: carryV :: Value
+ Cryptol.Prims.Eval: cmpValue :: BitWord b w i => (b -> b -> Eval a -> Eval a) -> (w -> w -> Eval a -> Eval a) -> (i -> i -> Eval a -> Eval a) -> (Integer -> i -> i -> Eval a -> Eval a) -> (TValue -> GenValue b w i -> GenValue b w i -> Eval a -> Eval a)
+ Cryptol.Prims.Eval: ecFromIntegerV :: BitWord b w i => (Integer -> i -> i) -> GenValue b w i
+ Cryptol.Prims.Eval: ecNumberV :: BitWord b w i => GenValue b w i
+ Cryptol.Prims.Eval: ecToIntegerV :: BitWord b w i => GenValue b w i
+ Cryptol.Prims.Eval: indexPrim :: BitWord b w i => (Maybe Integer -> TValue -> SeqMap b w i -> Seq b -> Eval (GenValue b w i)) -> (Maybe Integer -> TValue -> SeqMap b w i -> w -> Eval (GenValue b w i)) -> GenValue b w i
+ Cryptol.Prims.Eval: instance Cryptol.Eval.Value.EvalPrims GHC.Types.Bool Cryptol.Eval.Value.BV GHC.Integer.Type.Integer
+ Cryptol.Prims.Eval: intModExp :: Integer -> Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: intModNeg :: Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: intV :: BitWord b w i => i -> TValue -> GenValue b w i
+ Cryptol.Prims.Eval: integerExp :: Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: integerLg2 :: Integer -> Eval Integer
+ Cryptol.Prims.Eval: integerNeg :: Integer -> Eval Integer
+ Cryptol.Prims.Eval: liftBinIntMod :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: liftBinInteger :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: liftDivInteger :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Eval Integer
+ Cryptol.Prims.Eval: liftSigned :: (Integer -> Integer -> Integer -> Eval BV) -> BinArith BV
+ Cryptol.Prims.Eval: liftWord :: BitWord b w i => (w -> w -> Eval (GenValue b w i)) -> GenValue b w i
+ Cryptol.Prims.Eval: mkLit :: BitWord b w i => TValue -> Integer -> GenValue b w i
+ Cryptol.Prims.Eval: modWrap :: Integral a => a -> a -> Eval a
+ Cryptol.Prims.Eval: mulV :: BitWord b w i => Binary b w i
+ Cryptol.Prims.Eval: scarryV :: Value
+ Cryptol.Prims.Eval: signedBV :: BV -> Integer
+ Cryptol.Prims.Eval: signedCmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV Integer
+ Cryptol.Prims.Eval: signedLexCompare :: TValue -> Value -> Value -> Eval Ordering
+ Cryptol.Prims.Eval: signedValue :: Integer -> Integer -> Integer
+ Cryptol.Prims.Eval: sshrV :: Value
+ Cryptol.Prims.Eval: subV :: BitWord b w i => Binary b w i
+ Cryptol.Prims.Eval: updateBack_word :: Nat' -> TValue -> WordValue Bool BV Integer -> WordValue Bool BV Integer -> Eval (GenValue Bool BV Integer) -> Eval (WordValue Bool BV Integer)
+ Cryptol.Prims.Eval: updateFront_word :: Nat' -> TValue -> WordValue Bool BV Integer -> WordValue Bool BV Integer -> Eval (GenValue Bool BV Integer) -> Eval (WordValue Bool BV Integer)
+ Cryptol.Prims.Syntax: (:->) :: Kind -> Kind -> Kind
+ Cryptol.Prims.Syntax: KNum :: Kind
+ Cryptol.Prims.Syntax: KProp :: Kind
+ Cryptol.Prims.Syntax: KType :: Kind
+ Cryptol.Prims.Syntax: PAnd :: PC
+ Cryptol.Prims.Syntax: PArith :: PC
+ Cryptol.Prims.Syntax: PC :: PC -> TCon
+ Cryptol.Prims.Syntax: PCmp :: PC
+ Cryptol.Prims.Syntax: PEqual :: PC
+ Cryptol.Prims.Syntax: PFin :: PC
+ Cryptol.Prims.Syntax: PGeq :: PC
+ Cryptol.Prims.Syntax: PHas :: Selector -> PC
+ Cryptol.Prims.Syntax: PLiteral :: PC
+ Cryptol.Prims.Syntax: PLogic :: PC
+ Cryptol.Prims.Syntax: PNeq :: PC
+ Cryptol.Prims.Syntax: PSignedCmp :: PC
+ Cryptol.Prims.Syntax: PTrue :: PC
+ Cryptol.Prims.Syntax: PZero :: PC
+ Cryptol.Prims.Syntax: PrimTy :: !TCon -> !Ident -> !String -> !(Maybe Fixity) -> PrimTy
+ Cryptol.Prims.Syntax: TC :: TC -> TCon
+ Cryptol.Prims.Syntax: TCBit :: TC
+ Cryptol.Prims.Syntax: TCCeilDiv :: TFun
+ Cryptol.Prims.Syntax: TCCeilMod :: TFun
+ Cryptol.Prims.Syntax: TCErrorMessage :: !String -> TCErrorMessage
+ Cryptol.Prims.Syntax: TCFun :: TC
+ Cryptol.Prims.Syntax: TCInf :: TC
+ Cryptol.Prims.Syntax: TCIntMod :: TC
+ Cryptol.Prims.Syntax: TCInteger :: TC
+ Cryptol.Prims.Syntax: TCNewtype :: UserTC -> TC
+ Cryptol.Prims.Syntax: TCNum :: Integer -> TC
+ Cryptol.Prims.Syntax: TCSeq :: TC
+ Cryptol.Prims.Syntax: TCTuple :: Int -> TC
+ Cryptol.Prims.Syntax: TError :: Kind -> TCErrorMessage -> TCon
+ Cryptol.Prims.Syntax: TF :: TFun -> TCon
+ Cryptol.Prims.Syntax: UserTC :: Name -> Kind -> UserTC
+ Cryptol.Prims.Syntax: [primTyCon] :: PrimTy -> !TCon
+ Cryptol.Prims.Syntax: [primTyDoc] :: PrimTy -> !String
+ Cryptol.Prims.Syntax: [primTyFixity] :: PrimTy -> !(Maybe Fixity)
+ Cryptol.Prims.Syntax: [primTyIdent] :: PrimTy -> !Ident
+ Cryptol.Prims.Syntax: [tcErrorMessage] :: TCErrorMessage -> !String
+ Cryptol.Prims.Syntax: class HasKind t
+ Cryptol.Prims.Syntax: data Kind
+ Cryptol.Prims.Syntax: data PC
+ Cryptol.Prims.Syntax: data PrimTy
+ Cryptol.Prims.Syntax: data TC
+ Cryptol.Prims.Syntax: data TCErrorMessage
+ Cryptol.Prims.Syntax: data TCon
+ Cryptol.Prims.Syntax: data UserTC
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance Control.DeepSeq.NFData Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance Cryptol.Prims.Syntax.HasKind Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance Cryptol.Prims.Syntax.HasKind Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance Cryptol.Prims.Syntax.HasKind Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance Cryptol.Prims.Syntax.HasKind Cryptol.Prims.Syntax.TFun
+ Cryptol.Prims.Syntax: instance Cryptol.Prims.Syntax.HasKind Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PP Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance Cryptol.Utils.PP.PPName Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.PrimTy
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance GHC.Classes.Eq Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.PrimTy
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance GHC.Classes.Ord Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance GHC.Generics.Generic Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.Kind
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.PC
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.TC
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.TCon
+ Cryptol.Prims.Syntax: instance GHC.Show.Show Cryptol.Prims.Syntax.UserTC
+ Cryptol.Prims.Syntax: kindOf :: HasKind t => t -> Kind
+ Cryptol.Prims.Syntax: primTyFromPC :: PC -> Maybe PrimTy
+ Cryptol.Prims.Syntax: primTyFromPName :: PName -> Maybe PrimTy
+ Cryptol.Prims.Syntax: primTyFromTC :: TCon -> Maybe PrimTy
+ Cryptol.Prims.Syntax: primTyFromTF :: TFun -> Maybe PrimTy
+ Cryptol.Prims.Syntax: primTyIx :: Ord a => (PrimTy -> Maybe a) -> a -> Maybe PrimTy
+ Cryptol.Prims.Syntax: primTyList :: [PrimTy]
+ Cryptol.REPL.Command: HelpArg :: (String -> REPL ()) -> CommandBody
+ Cryptol.REPL.Command: ModNameArg :: (String -> REPL ()) -> CommandBody
+ Cryptol.REPL.Monad: EvalInParamModule :: ModName -> [Name] -> REPLException
+ Cryptol.REPL.Monad: SBVError :: String -> REPLException
+ Cryptol.REPL.Monad: clearLoadedMod :: REPL ()
+ Cryptol.REPL.Monad: getLogger :: REPL Logger
+ Cryptol.REPL.Monad: getModNames :: REPL [ModName]
+ Cryptol.REPL.Monad: setEditPath :: FilePath -> REPL ()
+ Cryptol.REPL.Monad: validEvalContext :: FreeVars a => a -> REPL ()
+ Cryptol.Symbolic: FTIntMod :: Integer -> FinType
+ Cryptol.Symbolic: FTInteger :: FinType
+ Cryptol.Symbolic: inBoundsIntMod :: Integer -> SInteger -> SBool
+ Cryptol.Symbolic.Prims: carry :: SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: cmpMod :: (SInteger -> SInteger -> Eval SBool -> Eval SBool) -> (Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool)
+ Cryptol.Symbolic.Prims: cmpModEq :: Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool
+ Cryptol.Symbolic.Prims: cmpModNotEq :: Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool
+ Cryptol.Symbolic.Prims: cmpSignedLt :: SWord -> SWord -> Eval SBool -> Eval SBool
+ Cryptol.Symbolic.Prims: instance Cryptol.Eval.Value.EvalPrims Cryptol.Symbolic.Value.SBool Cryptol.Symbolic.Value.SWord Cryptol.Symbolic.Value.SInteger
+ Cryptol.Symbolic.Prims: liftBin :: (a -> b -> c) -> a -> b -> Eval c
+ Cryptol.Symbolic.Prims: liftModBin :: (SInteger -> SInteger -> a) -> Integer -> SInteger -> SInteger -> Eval a
+ Cryptol.Symbolic.Prims: sModExp :: Integer -> SInteger -> SInteger -> Eval SInteger
+ Cryptol.Symbolic.Prims: scarry :: SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: signedQuot :: SWord -> SWord -> SWord
+ Cryptol.Symbolic.Prims: signedRem :: SWord -> SWord -> SWord
+ Cryptol.Symbolic.Prims: sshrV :: Value
+ Cryptol.Symbolic.Prims: svDivisible :: Integer -> SInteger -> SBool
+ Cryptol.Symbolic.Prims: svLg2 :: SInteger -> Eval SInteger
+ Cryptol.Symbolic.Prims: svModLg2 :: Integer -> SInteger -> Eval SInteger
+ Cryptol.Symbolic.Prims: updateBackSym_word :: Nat' -> TValue -> WordValue SBool SWord SInteger -> WordValue SBool SWord SInteger -> Eval (GenValue SBool SWord SInteger) -> Eval (WordValue SBool SWord SInteger)
+ Cryptol.Symbolic.Prims: updateFrontSym_word :: Nat' -> TValue -> WordValue SBool SWord SInteger -> WordValue SBool SWord SInteger -> Eval (GenValue SBool SWord SInteger) -> Eval (WordValue SBool SWord SInteger)
+ Cryptol.Symbolic.Value: VInteger :: !i -> GenValue b w i
+ Cryptol.Symbolic.Value: existsSInteger_ :: Symbolic SBool
+ Cryptol.Symbolic.Value: forallSInteger_ :: Symbolic SBool
+ Cryptol.Symbolic.Value: instance Cryptol.Eval.Value.BitWord Cryptol.Symbolic.Value.SBool Cryptol.Symbolic.Value.SWord Cryptol.Symbolic.Value.SInteger
+ Cryptol.Symbolic.Value: mergeWord' :: Bool -> SBool -> Eval (WordValue SBool SWord SInteger) -> Eval (WordValue SBool SWord SInteger) -> Eval (WordValue SBool SWord SInteger)
+ Cryptol.Symbolic.Value: type SInteger = SVal
+ Cryptol.Testing.Random: randomIntMod :: (BitWord b w i, RandomGen g) => Integer -> Gen g b w i
+ Cryptol.Testing.Random: randomInteger :: (BitWord b w i, RandomGen g) => Gen g b w i
+ Cryptol.Testing.Random: randomSize :: RandomGen g => Int -> Int -> g -> (Int, g)
+ Cryptol.Transform.AddModParams: addModParams :: Module -> Either [Name] Module
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.AST.Decl
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.AST.Expr
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.Type.Newtype
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.Type.Schema
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.Type.TySyn
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams Cryptol.TypeCheck.Type.Type
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.AddParams a => Cryptol.Transform.AddModParams.AddParams [a]
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.AST.Decl
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.AST.DeclDef
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.AST.Expr
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.AST.Match
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.Type.Newtype
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.Type.TySyn
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst Cryptol.TypeCheck.Type.Type
+ Cryptol.Transform.AddModParams: instance Cryptol.Transform.AddModParams.Inst a => Cryptol.Transform.AddModParams.Inst [a]
+ Cryptol.TypeCheck: RepeatedTypeParameter :: Ident -> [Range] -> Error
+ Cryptol.TypeCheck: TyVarWithParams :: Error
+ Cryptol.TypeCheck: UndefinedTypeParameter :: (Located Ident) -> Error
+ Cryptol.TypeCheck: [inpParamConstraints] :: InferInput -> !([Located Prop])
+ Cryptol.TypeCheck: [inpParamFuns] :: InferInput -> !(Map Name ModVParam)
+ Cryptol.TypeCheck: [inpParamTypes] :: InferInput -> !(Map Name ModTParam)
+ Cryptol.TypeCheck: [solverPreludePath] :: SolverConfig -> [FilePath]
+ Cryptol.TypeCheck: tcModuleInst :: Module -> Module Name -> InferInput -> IO (InferOutput Module)
+ Cryptol.TypeCheck.AST: ModTParam :: Name -> Kind -> !Int -> Maybe String -> ModTParam
+ Cryptol.TypeCheck.AST: ModVParam :: Name -> Schema -> Maybe String -> Maybe Fixity -> ModVParam
+ Cryptol.TypeCheck.AST: TCCeilDiv :: TFun
+ Cryptol.TypeCheck.AST: TCCeilMod :: TFun
+ Cryptol.TypeCheck.AST: [mParamConstraints] :: Module -> [Located Prop]
+ Cryptol.TypeCheck.AST: [mParamFuns] :: Module -> Map Name ModVParam
+ Cryptol.TypeCheck.AST: [mParamTypes] :: Module -> Map Name ModTParam
+ Cryptol.TypeCheck.AST: [mtpDoc] :: ModTParam -> Maybe String
+ Cryptol.TypeCheck.AST: [mtpKind] :: ModTParam -> Kind
+ Cryptol.TypeCheck.AST: [mtpName] :: ModTParam -> Name
+ Cryptol.TypeCheck.AST: [mtpNumber] :: ModTParam -> !Int
+ Cryptol.TypeCheck.AST: [mvpDoc] :: ModVParam -> Maybe String
+ Cryptol.TypeCheck.AST: [mvpFixity] :: ModVParam -> Maybe Fixity
+ Cryptol.TypeCheck.AST: [mvpName] :: ModVParam -> Name
+ Cryptol.TypeCheck.AST: [mvpType] :: ModVParam -> Schema
+ Cryptol.TypeCheck.AST: data ModTParam
+ Cryptol.TypeCheck.AST: data ModVParam
+ Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.ModTParam
+ Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.ModVParam
+ Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.ModTParam
+ Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.ModVParam
+ Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.ModTParam
+ Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.ModVParam
+ Cryptol.TypeCheck.AST: isParametrizedModule :: Module -> Bool
+ Cryptol.TypeCheck.AST: mtpParam :: ModTParam -> TParam
+ Cryptol.TypeCheck.AST: splitExprInst :: Expr -> (Expr, [Type], Int)
+ Cryptol.TypeCheck.AST: splitProofApp :: Expr -> Maybe ((), Expr)
+ Cryptol.TypeCheck.AST: splitTApp :: Expr -> Maybe (Type, Expr)
+ Cryptol.TypeCheck.CheckModuleInstance: checkModuleInstance :: Module -> Module -> InferM Module
+ Cryptol.TypeCheck.Default: defaultLiterals :: [TVar] -> [Goal] -> ([TVar], Subst, [Warning])
+ Cryptol.TypeCheck.Default: defaultReplExpr' :: Solver -> [TParam] -> [Prop] -> IO (Maybe [(TParam, Type)])
+ Cryptol.TypeCheck.Default: improveByDefaultingWithPure :: [TVar] -> [Goal] -> ([TVar], [Goal], Subst, [Warning])
+ Cryptol.TypeCheck.Depends: AT :: (ParameterType Name) -> (Maybe String) -> TyDecl
+ Cryptol.TypeCheck.Depends: PS :: (PropSyn Name) -> (Maybe String) -> TyDecl
+ Cryptol.TypeCheck.Depends: setDocString :: Maybe String -> TyDecl -> TyDecl
+ Cryptol.TypeCheck.Depends: toParamConstraints :: FromDecl d => d -> [Located (Prop Name)]
+ Cryptol.TypeCheck.Depends: toParamFun :: FromDecl d => d -> Maybe (ParameterFun Name)
+ Cryptol.TypeCheck.Error: AmbiguousType :: [Name] -> [TVar] -> Error
+ Cryptol.TypeCheck.Error: CannotMixPositionalAndNamedTypeParams :: Error
+ Cryptol.TypeCheck.Error: DefaultingKind :: (TParam Name) -> Kind -> Warning
+ Cryptol.TypeCheck.Error: DefaultingTo :: TVarInfo -> Type -> Warning
+ Cryptol.TypeCheck.Error: DefaultingWildType :: Kind -> Warning
+ Cryptol.TypeCheck.Error: ErrorMsg :: Doc -> Error
+ Cryptol.TypeCheck.Error: KindMismatch :: Kind -> Kind -> Error
+ Cryptol.TypeCheck.Error: NotForAll :: TVar -> Type -> Error
+ Cryptol.TypeCheck.Error: RecursiveType :: Type -> Type -> Error
+ Cryptol.TypeCheck.Error: RecursiveTypeDecls :: [Name] -> Error
+ Cryptol.TypeCheck.Error: RepeatedTypeParameter :: Ident -> [Range] -> Error
+ Cryptol.TypeCheck.Error: TooFewTySynParams :: Name -> Int -> Error
+ Cryptol.TypeCheck.Error: TooManyPositionalTypeParams :: Error
+ Cryptol.TypeCheck.Error: TooManyTySynParams :: Name -> Int -> Error
+ Cryptol.TypeCheck.Error: TooManyTypeParams :: Int -> Kind -> Error
+ Cryptol.TypeCheck.Error: TyVarWithParams :: Error
+ Cryptol.TypeCheck.Error: TypeMismatch :: Type -> Type -> Error
+ Cryptol.TypeCheck.Error: TypeVariableEscaped :: Type -> [TParam] -> Error
+ Cryptol.TypeCheck.Error: UndefinedTypeParameter :: (Located Ident) -> Error
+ Cryptol.TypeCheck.Error: UnexpectedTypeWildCard :: Error
+ Cryptol.TypeCheck.Error: UnsolvedDelayedCt :: DelayedCt -> Error
+ Cryptol.TypeCheck.Error: UnsolvedGoals :: Bool -> [Goal] -> Error
+ Cryptol.TypeCheck.Error: UnusableFunction :: Name -> [Prop] -> Error
+ Cryptol.TypeCheck.Error: cleanupErrors :: [(Range, Error)] -> [(Range, Error)]
+ Cryptol.TypeCheck.Error: data Error
+ Cryptol.TypeCheck.Error: data Warning
+ Cryptol.TypeCheck.Error: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Error.Error)
+ Cryptol.TypeCheck.Error: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Error.Warning)
+ Cryptol.TypeCheck.Error: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: instance GHC.Generics.Generic Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance GHC.Generics.Generic Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: instance GHC.Show.Show Cryptol.TypeCheck.Error.Error
+ Cryptol.TypeCheck.Error: instance GHC.Show.Show Cryptol.TypeCheck.Error.Warning
+ Cryptol.TypeCheck.Error: subsumes :: Error -> Error -> Bool
+ Cryptol.TypeCheck.InferTypes: BuiltInTC :: TC -> TyFunName
+ Cryptol.TypeCheck.InferTypes: CtModuleInstance :: ModName -> ConstraintSource
+ Cryptol.TypeCheck.InferTypes: [goalSet] :: Goals -> Set Goal
+ Cryptol.TypeCheck.InferTypes: [literalGoals] :: Goals -> Map TVar LitGoal
+ Cryptol.TypeCheck.InferTypes: [solverPreludePath] :: SolverConfig -> [FilePath]
+ Cryptol.TypeCheck.InferTypes: data Goals
+ Cryptol.TypeCheck.InferTypes: goalToLitGoal :: Goal -> Maybe (TVar, LitGoal)
+ Cryptol.TypeCheck.InferTypes: goalsFromList :: [Goal] -> Goals
+ Cryptol.TypeCheck.InferTypes: litGoalToGoal :: (TVar, LitGoal) -> Goal
+ Cryptol.TypeCheck.InferTypes: type LitGoal = Goal
+ Cryptol.TypeCheck.Kind: checkParameterConstraints :: [Located (Prop Name)] -> InferM [Located Prop]
+ Cryptol.TypeCheck.Kind: checkParameterType :: ParameterType Name -> Maybe String -> InferM ModTParam
+ Cryptol.TypeCheck.Kind: checkPropSyn :: PropSyn Name -> Maybe String -> InferM TySyn
+ Cryptol.TypeCheck.Monad: AllowWildCards :: AllowWildCards
+ Cryptol.TypeCheck.Monad: NoWildCards :: AllowWildCards
+ Cryptol.TypeCheck.Monad: [iParamConstraints] :: RO -> [Located Prop]
+ Cryptol.TypeCheck.Monad: [iParamFuns] :: RO -> Map Name ModVParam
+ Cryptol.TypeCheck.Monad: [iParamTypes] :: RO -> Map Name ModTParam
+ Cryptol.TypeCheck.Monad: [inpParamConstraints] :: InferInput -> !([Located Prop])
+ Cryptol.TypeCheck.Monad: [inpParamFuns] :: InferInput -> !(Map Name ModVParam)
+ Cryptol.TypeCheck.Monad: [inpParamTypes] :: InferInput -> !(Map Name ModTParam)
+ Cryptol.TypeCheck.Monad: [lazyTParams] :: KRO -> Map Name TParam
+ Cryptol.TypeCheck.Monad: applySubstGoals :: [Goal] -> InferM [Goal]
+ Cryptol.TypeCheck.Monad: applySubstPreds :: [Prop] -> InferM [Prop]
+ Cryptol.TypeCheck.Monad: data AllowWildCards
+ Cryptol.TypeCheck.Monad: getParamConstraints :: InferM [Located Prop]
+ Cryptol.TypeCheck.Monad: getParamFuns :: InferM (Map Name ModVParam)
+ Cryptol.TypeCheck.Monad: getParamTypes :: InferM (Map Name ModTParam)
+ Cryptol.TypeCheck.Monad: kLookupParamType :: Name -> KindM (Maybe ModTParam)
+ Cryptol.TypeCheck.Monad: lookupParamFun :: Name -> InferM (Maybe ModVParam)
+ Cryptol.TypeCheck.Monad: lookupParamType :: Name -> InferM (Maybe ModTParam)
+ Cryptol.TypeCheck.Monad: lookupTParam :: Name -> InferM (Maybe TParam)
+ Cryptol.TypeCheck.Monad: newParamName :: Ident -> InferM Name
+ Cryptol.TypeCheck.Monad: withParamFuns :: [ModVParam] -> InferM a -> InferM a
+ Cryptol.TypeCheck.Monad: withParamType :: ModTParam -> InferM a -> InferM a
+ Cryptol.TypeCheck.Monad: withParameterConstraints :: [Located Prop] -> InferM a -> InferM a
+ Cryptol.TypeCheck.Parseable: class ShowParseable t
+ Cryptol.TypeCheck.Parseable: instance (Cryptol.TypeCheck.Parseable.ShowParseable a, Cryptol.TypeCheck.Parseable.ShowParseable b) => Cryptol.TypeCheck.Parseable.ShowParseable (a, b)
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.ModuleSystem.Name.Name
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.Parser.Selector.Selector
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.AST.Decl
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.AST.DeclDef
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.AST.DeclGroup
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.AST.Expr
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.AST.Match
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable Cryptol.Utils.Ident.Ident
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable GHC.Types.Int
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable a => Cryptol.TypeCheck.Parseable.ShowParseable (Cryptol.Parser.Position.Located a)
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable a => Cryptol.TypeCheck.Parseable.ShowParseable (GHC.Base.Maybe a)
+ Cryptol.TypeCheck.Parseable: instance Cryptol.TypeCheck.Parseable.ShowParseable a => Cryptol.TypeCheck.Parseable.ShowParseable [a]
+ Cryptol.TypeCheck.Parseable: maybeNameDoc :: Maybe Name -> Doc
+ Cryptol.TypeCheck.Parseable: showParseable :: ShowParseable t => t -> Doc
+ Cryptol.TypeCheck.SimpType: tCeilDiv :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tCeilMod :: Type -> Type -> Type
+ Cryptol.TypeCheck.Solve: defaultAndSimplify :: [TVar] -> [Goal] -> ([TVar], [Goal], Subst, [Warning])
+ Cryptol.TypeCheck.Solve: proveModuleTopLevel :: InferM ()
+ Cryptol.TypeCheck.Solve: wfTC :: TC -> [Type] -> [Prop]
+ Cryptol.TypeCheck.Solver.Class: solveLiteralInst :: Type -> Type -> Solved
+ Cryptol.TypeCheck.Solver.Class: solveLogicInst :: Type -> Solved
+ Cryptol.TypeCheck.Solver.Class: solveSignedCmpInst :: Type -> Solved
+ Cryptol.TypeCheck.Solver.Class: solveZeroInst :: Type -> Solved
+ Cryptol.TypeCheck.Solver.Improve: improveLit :: Bool -> Prop -> Match (Subst, [Prop])
+ Cryptol.TypeCheck.Solver.InfNat: nCeilDiv :: Nat' -> Nat' -> Maybe Nat'
+ Cryptol.TypeCheck.Solver.InfNat: nCeilMod :: Nat' -> Nat' -> Maybe Nat'
+ Cryptol.TypeCheck.Solver.Numeric.Interval: iIsPosFin :: Interval -> Bool
+ Cryptol.TypeCheck.Solver.Numeric.Interval: iOverlap :: Interval -> Interval -> Bool
+ Cryptol.TypeCheck.Solver.Numeric.Interval: tvarInterval :: Map TVar Interval -> TVar -> Interval
+ Cryptol.TypeCheck.Solver.SMT: data Solver
+ Cryptol.TypeCheck.Solver.SMT: debugBlock :: Solver -> String -> IO a -> IO a
+ Cryptol.TypeCheck.Solver.SMT: debugLog :: DebugLog t => Solver -> t -> IO ()
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog Cryptol.TypeCheck.InferTypes.Goal
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog Cryptol.TypeCheck.Subst.Subst
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog Cryptol.Utils.PP.Doc
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog GHC.Types.Char
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog a => Cryptol.TypeCheck.Solver.SMT.DebugLog (GHC.Base.Maybe a)
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.DebugLog a => Cryptol.TypeCheck.Solver.SMT.DebugLog [a]
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk Cryptol.Prims.Syntax.TCErrorMessage
+ Cryptol.TypeCheck.Solver.SMT: isNumeric :: Prop -> Bool
+ Cryptol.TypeCheck.Solver.SMT: shrinkModel :: Solver -> [TVar] -> [Prop] -> [(TVar, Nat')] -> IO [(TVar, Nat')]
+ Cryptol.TypeCheck.Solver.SMT: tryGetModel :: Solver -> [TVar] -> [Prop] -> IO (Maybe [(TVar, Nat')])
+ Cryptol.TypeCheck.Solver.SMT: withSolver :: SolverConfig -> (Solver -> IO a) -> IO a
+ Cryptol.TypeCheck.Type: DefinitionOf :: Name -> TVarSource
+ Cryptol.TypeCheck.Type: LenOfCompGen :: TVarSource
+ Cryptol.TypeCheck.Type: LenOfSeq :: TVarSource
+ Cryptol.TypeCheck.Type: TPModParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.Type: TPOther :: (Maybe Name) -> TPFlavor
+ Cryptol.TypeCheck.Type: TVFromModParam :: Name -> TVarSource
+ Cryptol.TypeCheck.Type: TVFromSignature :: Name -> TVarSource
+ Cryptol.TypeCheck.Type: TVarInfo :: Range -> TVarSource -> TVarInfo
+ Cryptol.TypeCheck.Type: TypeErrorPlaceHolder :: TVarSource
+ Cryptol.TypeCheck.Type: TypeOfArg :: (Maybe Int) -> TVarSource
+ Cryptol.TypeCheck.Type: TypeOfRecordField :: Ident -> TVarSource
+ Cryptol.TypeCheck.Type: TypeOfRes :: TVarSource
+ Cryptol.TypeCheck.Type: TypeOfSeqElement :: TVarSource
+ Cryptol.TypeCheck.Type: TypeOfTupleField :: Int -> TVarSource
+ Cryptol.TypeCheck.Type: TypeParamInstNamed :: Name -> Ident -> TVarSource
+ Cryptol.TypeCheck.Type: TypeParamInstPos :: Name -> Int -> TVarSource
+ Cryptol.TypeCheck.Type: TypeWildCard :: TVarSource
+ Cryptol.TypeCheck.Type: [ntDoc] :: Newtype -> Maybe String
+ Cryptol.TypeCheck.Type: [tpFlav] :: TParam -> TPFlavor
+ Cryptol.TypeCheck.Type: [tpInfo] :: TParam -> !TVarInfo
+ Cryptol.TypeCheck.Type: [tsDoc] :: TySyn -> !(Maybe String)
+ Cryptol.TypeCheck.Type: [tvarDesc] :: TVarInfo -> TVarSource
+ Cryptol.TypeCheck.Type: [tvarSource] :: TVarInfo -> Range
+ Cryptol.TypeCheck.Type: data TPFlavor
+ Cryptol.TypeCheck.Type: data TVarInfo
+ Cryptol.TypeCheck.Type: data TVarSource
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TPFlavor
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TVarInfo
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TVarSource
+ Cryptol.TypeCheck.Type: instance Cryptol.Prims.Syntax.HasKind Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance Cryptol.Prims.Syntax.HasKind Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance Cryptol.Prims.Syntax.HasKind Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance Cryptol.Prims.Syntax.HasKind Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance Cryptol.Prims.Syntax.HasKind Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.Newtype)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TVarInfo
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TVarSource
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TPFlavor
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TVarInfo
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TVarSource
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TPFlavor
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TVarInfo
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TVarSource
+ Cryptol.TypeCheck.Type: isMono :: Schema -> Maybe Type
+ Cryptol.TypeCheck.Type: modTyParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.Type: newtypeParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.Type: noFreeVariables :: FVS t => t -> Bool
+ Cryptol.TypeCheck.Type: pIsLiteral :: Prop -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: pIsLogic :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pIsSignedCmp :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pIsZero :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pLiteral :: Type -> Type -> Prop
+ Cryptol.TypeCheck.Type: pLogic :: Type -> Prop
+ Cryptol.TypeCheck.Type: pSignedCmp :: Type -> Prop
+ Cryptol.TypeCheck.Type: pZero :: Type -> Prop
+ Cryptol.TypeCheck.Type: pickTVarName :: Kind -> TVarSource -> Int -> Doc
+ Cryptol.TypeCheck.Type: propSynParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.Type: schemaParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.Type: tCeilDiv :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tCeilMod :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tIntMod :: Type -> Type
+ Cryptol.TypeCheck.Type: tInteger :: Type
+ Cryptol.TypeCheck.Type: tIsIntMod :: Type -> Maybe Type
+ Cryptol.TypeCheck.Type: tIsInteger :: Type -> Bool
+ Cryptol.TypeCheck.Type: tIsRec :: Type -> Maybe [(Ident, Type)]
+ Cryptol.TypeCheck.Type: tMono :: Type -> Schema
+ Cryptol.TypeCheck.Type: tpName :: TParam -> Maybe Name
+ Cryptol.TypeCheck.Type: tpfName :: TPFlavor -> Maybe Name
+ Cryptol.TypeCheck.Type: tvInfo :: TVar -> TVarInfo
+ Cryptol.TypeCheck.Type: tvSourceName :: TVarSource -> Maybe Name
+ Cryptol.TypeCheck.Type: tySynParam :: Name -> TPFlavor
+ Cryptol.TypeCheck.TypeMap: instance GHC.Classes.Ord a => Cryptol.TypeCheck.TypeMap.TrieMap (Data.Map.Internal.Map a) a
+ Cryptol.TypeCheck.TypePat: aCeilDiv :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aCeilMod :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aFreeTVar :: Pat Type TVar
+ Cryptol.TypeCheck.TypePat: aLiteral :: Pat Prop (Type, Type)
+ Cryptol.TypeCheck.TypePat: aLogic :: Pat Prop Type
+ Cryptol.TypeCheck.TypePat: aRec :: Pat Type [(Ident, Type)]
+ Cryptol.TypeCheck.Unify: freeParams :: FVS t => t -> Set TParam
+ Cryptol.TypeCheck.Unify: runResult :: Result a -> (a, [UnificationError])
+ Cryptol.TypeCheck.Unify: type Result a = Writer [UnificationError] a
+ Cryptol.Utils.Ident: data ModName
+ Cryptol.Utils.Ident: exprModName :: ModName
+ Cryptol.Utils.Ident: instance Control.DeepSeq.NFData Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.Ident: instance GHC.Classes.Eq Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.Ident: instance GHC.Classes.Ord Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.Ident: instance GHC.Generics.Generic Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.Ident: instance GHC.Show.Show Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.Ident: isParamInstModName :: ModName -> Bool
+ Cryptol.Utils.Ident: modNameChunks :: ModName -> [String]
+ Cryptol.Utils.Ident: modNameToText :: ModName -> Text
+ Cryptol.Utils.Ident: modParamIdent :: Ident -> Ident
+ Cryptol.Utils.Ident: noModuleName :: ModName
+ Cryptol.Utils.Ident: notParamInstModName :: ModName -> ModName
+ Cryptol.Utils.Ident: paramInstModName :: ModName -> ModName
+ Cryptol.Utils.Ident: textToModName :: Text -> ModName
+ Cryptol.Utils.Logger: data Logger
+ Cryptol.Utils.Logger: funLogger :: (String -> IO ()) -> Logger
+ Cryptol.Utils.Logger: handleLogger :: Handle -> Logger
+ Cryptol.Utils.Logger: instance Control.DeepSeq.NFData Cryptol.Utils.Logger.Logger
+ Cryptol.Utils.Logger: logPrint :: Show a => Logger -> a -> IO ()
+ Cryptol.Utils.Logger: logPutStr :: Logger -> String -> IO ()
+ Cryptol.Utils.Logger: logPutStrLn :: Logger -> String -> IO ()
+ Cryptol.Utils.Logger: quietLogger :: Logger
+ Cryptol.Utils.Logger: stderrLogger :: Logger
+ Cryptol.Utils.Logger: stdoutLogger :: Logger
+ Cryptol.Utils.PP: (<.>) :: Doc -> Doc -> Doc
+ Cryptol.Utils.PP: instance Cryptol.Utils.PP.PP Cryptol.Utils.Ident.ModName
+ Cryptol.Utils.PP: instance GHC.Base.Semigroup Cryptol.Utils.PP.Doc
+ Cryptol.Utils.PP: instance GHC.Base.Semigroup Cryptol.Utils.PP.NameDisp
+ Cryptol.Utils.Panic: data Cryptol
+ Cryptol.Utils.Panic: data Panic a
+ Cryptol.Utils.Panic: instance Panic.PanicComponent Cryptol.Utils.Panic.Cryptol
+ Cryptol.Utils.Panic: type CryptolPanic = Panic Cryptol
+ Cryptol.Utils.Panic: type HasCallStack = ?callStack :: CallStack
- Cryptol.Eval: emptyEnv :: GenEvalEnv b w
+ Cryptol.Eval: emptyEnv :: GenEvalEnv b w i
- Cryptol.Eval: evalDecls :: EvalPrims b w => [DeclGroup] -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
+ Cryptol.Eval: evalDecls :: EvalPrims b w i => [DeclGroup] -> GenEvalEnv b w i -> Eval (GenEvalEnv b w i)
- Cryptol.Eval: evalExpr :: EvalPrims b w => GenEvalEnv b w -> Expr -> Eval (GenValue b w)
+ Cryptol.Eval: evalExpr :: EvalPrims b w i => GenEvalEnv b w i -> Expr -> Eval (GenValue b w i)
- Cryptol.Eval: forceValue :: GenValue b w -> Eval ()
+ Cryptol.Eval: forceValue :: GenValue b w i -> Eval ()
- Cryptol.Eval: moduleEnv :: EvalPrims b w => Module -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
+ Cryptol.Eval: moduleEnv :: EvalPrims b w i => Module -> GenEvalEnv b w i -> Eval (GenEvalEnv b w i)
- Cryptol.Eval: runEval :: Eval a -> IO a
+ Cryptol.Eval: runEval :: EvalOpts -> Eval a -> IO a
- Cryptol.Eval: type EvalEnv = GenEvalEnv Bool BV
+ Cryptol.Eval: type EvalEnv = GenEvalEnv Bool BV Integer
- Cryptol.Eval.Env: EvalEnv :: !(Map Name (Eval (GenValue b w))) -> !TypeEnv -> GenEvalEnv b w
+ Cryptol.Eval.Env: EvalEnv :: !(Map Name (Eval (GenValue b w i))) -> !TypeEnv -> GenEvalEnv b w i
- Cryptol.Eval.Env: [envTypes] :: GenEvalEnv b w -> !TypeEnv
+ Cryptol.Eval.Env: [envTypes] :: GenEvalEnv b w i -> !TypeEnv
- Cryptol.Eval.Env: [envVars] :: GenEvalEnv b w -> !(Map Name (Eval (GenValue b w)))
+ Cryptol.Eval.Env: [envVars] :: GenEvalEnv b w i -> !(Map Name (Eval (GenValue b w i)))
- Cryptol.Eval.Env: bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w -> GenEvalEnv b w
+ Cryptol.Eval.Env: bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w i -> GenEvalEnv b w i
- Cryptol.Eval.Env: bindVar :: Name -> Eval (GenValue b w) -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
+ Cryptol.Eval.Env: bindVar :: Name -> Eval (GenValue b w i) -> GenEvalEnv b w i -> Eval (GenEvalEnv b w i)
- Cryptol.Eval.Env: bindVarDirect :: Name -> GenValue b w -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
+ Cryptol.Eval.Env: bindVarDirect :: Name -> GenValue b w i -> GenEvalEnv b w i -> GenEvalEnv b w i
- Cryptol.Eval.Env: data GenEvalEnv b w
+ Cryptol.Eval.Env: data GenEvalEnv b w i
- Cryptol.Eval.Env: emptyEnv :: GenEvalEnv b w
+ Cryptol.Eval.Env: emptyEnv :: GenEvalEnv b w i
- Cryptol.Eval.Env: lookupType :: TVar -> GenEvalEnv b w -> Maybe (Either Nat' TValue)
+ Cryptol.Eval.Env: lookupType :: TVar -> GenEvalEnv b w i -> Maybe (Either Nat' TValue)
- Cryptol.Eval.Env: lookupVar :: Name -> GenEvalEnv b w -> Maybe (Eval (GenValue b w))
+ Cryptol.Eval.Env: lookupVar :: Name -> GenEvalEnv b w i -> Maybe (Eval (GenValue b w i))
- Cryptol.Eval.Env: ppEnv :: BitWord b w => PPOpts -> GenEvalEnv b w -> Eval Doc
+ Cryptol.Eval.Env: ppEnv :: BitWord b w i => PPOpts -> GenEvalEnv b w i -> Eval Doc
- Cryptol.Eval.Monad: Thunk :: !(IO a) -> Eval a
+ Cryptol.Eval.Monad: Thunk :: !(EvalOpts -> IO a) -> Eval a
- Cryptol.Eval.Monad: evalPanic :: String -> [String] -> a
+ Cryptol.Eval.Monad: evalPanic :: HasCallStack => String -> [String] -> a
- Cryptol.Eval.Monad: runEval :: Eval a -> IO a
+ Cryptol.Eval.Monad: runEval :: EvalOpts -> Eval a -> IO a
- Cryptol.Eval.Reference: VList :: [Value] -> Value
+ Cryptol.Eval.Reference: VList :: Nat' -> [Value] -> Value
- Cryptol.Eval.Reference: ppValue :: Value -> Doc
+ Cryptol.Eval.Reference: ppValue :: PPOpts -> Value -> Doc
- Cryptol.Eval.Type: evalNumType :: TypeEnv -> Type -> Nat'
+ Cryptol.Eval.Type: evalNumType :: HasCallStack => TypeEnv -> Type -> Nat'
- Cryptol.Eval.Type: evalTF :: TFun -> [Nat'] -> Nat'
+ Cryptol.Eval.Type: evalTF :: HasCallStack => TFun -> [Nat'] -> Nat'
- Cryptol.Eval.Type: evalType :: TypeEnv -> Type -> Either Nat' TValue
+ Cryptol.Eval.Type: evalType :: HasCallStack => TypeEnv -> Type -> Either Nat' TValue
- Cryptol.Eval.Type: evalValType :: TypeEnv -> Type -> TValue
+ Cryptol.Eval.Type: evalValType :: HasCallStack => TypeEnv -> Type -> TValue
- Cryptol.Eval.Value: BitsVal :: !(Seq (Eval b)) -> WordValue b w
+ Cryptol.Eval.Value: BitsVal :: !(Seq (Eval b)) -> WordValue b w i
- Cryptol.Eval.Value: IndexSeqMap :: !(Integer -> Eval (GenValue b w)) -> SeqMap b w
+ Cryptol.Eval.Value: IndexSeqMap :: !(Integer -> Eval (GenValue b w i)) -> SeqMap b w i
- Cryptol.Eval.Value: UpdateSeqMap :: !(Map Integer (Eval (GenValue b w))) -> !(Integer -> Eval (GenValue b w)) -> SeqMap b w
+ Cryptol.Eval.Value: UpdateSeqMap :: !(Map Integer (Eval (GenValue b w i))) -> !(Integer -> Eval (GenValue b w i)) -> SeqMap b w i
- Cryptol.Eval.Value: VBit :: !b -> GenValue b w
+ Cryptol.Eval.Value: VBit :: !b -> GenValue b w i
- Cryptol.Eval.Value: VFun :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: VFun :: (Eval (GenValue b w i) -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: VNumPoly :: (Nat' -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: VNumPoly :: (Nat' -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: VPoly :: (TValue -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: VPoly :: (TValue -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: VRecord :: ![(Ident, Eval (GenValue b w))] -> GenValue b w
+ Cryptol.Eval.Value: VRecord :: ![(Ident, Eval (GenValue b w i))] -> GenValue b w i
- Cryptol.Eval.Value: VSeq :: !Integer -> !(SeqMap b w) -> GenValue b w
+ Cryptol.Eval.Value: VSeq :: !Integer -> !(SeqMap b w i) -> GenValue b w i
- Cryptol.Eval.Value: VStream :: !(SeqMap b w) -> GenValue b w
+ Cryptol.Eval.Value: VStream :: !(SeqMap b w i) -> GenValue b w i
- Cryptol.Eval.Value: VTuple :: ![Eval (GenValue b w)] -> GenValue b w
+ Cryptol.Eval.Value: VTuple :: ![Eval (GenValue b w i)] -> GenValue b w i
- Cryptol.Eval.Value: VWord :: !Integer -> !(Eval (WordValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: VWord :: !Integer -> !(Eval (WordValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: WordVal :: !w -> WordValue b w
+ Cryptol.Eval.Value: WordVal :: !w -> WordValue b w i
- Cryptol.Eval.Value: asWordVal :: BitWord b w => WordValue b w -> Eval w
+ Cryptol.Eval.Value: asWordVal :: BitWord b w i => WordValue b w i -> Eval w
- Cryptol.Eval.Value: bitLit :: BitWord b w => Bool -> b
+ Cryptol.Eval.Value: bitLit :: BitWord b w i => Bool -> b
- Cryptol.Eval.Value: class BitWord b w | b -> w, w -> b
+ Cryptol.Eval.Value: class BitWord b w i | b -> w, w -> i, i -> b
- Cryptol.Eval.Value: class BitWord b w => EvalPrims b w
+ Cryptol.Eval.Value: class BitWord b w i => EvalPrims b w i
- Cryptol.Eval.Value: data GenValue b w
+ Cryptol.Eval.Value: data GenValue b w i
- Cryptol.Eval.Value: data SeqMap b w
+ Cryptol.Eval.Value: data SeqMap b w i
- Cryptol.Eval.Value: data WordValue b w
+ Cryptol.Eval.Value: data WordValue b w i
- Cryptol.Eval.Value: enumerateSeqMap :: (Integral n) => n -> SeqMap b w -> [Eval (GenValue b w)]
+ Cryptol.Eval.Value: enumerateSeqMap :: (Integral n) => n -> SeqMap b w i -> [Eval (GenValue b w i)]
- Cryptol.Eval.Value: evalPrim :: EvalPrims b w => Decl -> GenValue b w
+ Cryptol.Eval.Value: evalPrim :: EvalPrims b w i => Decl -> GenValue b w i
- Cryptol.Eval.Value: extractWord :: BitWord b w => Integer -> Integer -> w -> w
+ Cryptol.Eval.Value: extractWord :: BitWord b w i => Integer -> Integer -> w -> w
- Cryptol.Eval.Value: finiteSeqMap :: [Eval (GenValue b w)] -> SeqMap b w
+ Cryptol.Eval.Value: finiteSeqMap :: [Eval (GenValue b w i)] -> SeqMap b w i
- Cryptol.Eval.Value: forceValue :: GenValue b w -> Eval ()
+ Cryptol.Eval.Value: forceValue :: GenValue b w i -> Eval ()
- Cryptol.Eval.Value: forceWordValue :: WordValue b w -> Eval ()
+ Cryptol.Eval.Value: forceWordValue :: WordValue b w i -> Eval ()
- Cryptol.Eval.Value: fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: fromSeq :: forall b w i. BitWord b w i => String -> GenValue b w i -> Eval (SeqMap b w i)
- Cryptol.Eval.Value: fromVBit :: GenValue b w -> b
+ Cryptol.Eval.Value: fromVBit :: GenValue b w i -> b
- Cryptol.Eval.Value: fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w))
+ Cryptol.Eval.Value: fromVFun :: GenValue b w i -> (Eval (GenValue b w i) -> Eval (GenValue b w i))
- Cryptol.Eval.Value: fromVNumPoly :: GenValue b w -> (Nat' -> Eval (GenValue b w))
+ Cryptol.Eval.Value: fromVNumPoly :: GenValue b w i -> (Nat' -> Eval (GenValue b w i))
- Cryptol.Eval.Value: fromVPoly :: GenValue b w -> (TValue -> Eval (GenValue b w))
+ Cryptol.Eval.Value: fromVPoly :: GenValue b w i -> (TValue -> Eval (GenValue b w i))
- Cryptol.Eval.Value: fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))]
+ Cryptol.Eval.Value: fromVRecord :: GenValue b w i -> [(Ident, Eval (GenValue b w i))]
- Cryptol.Eval.Value: fromVTuple :: GenValue b w -> [Eval (GenValue b w)]
+ Cryptol.Eval.Value: fromVTuple :: GenValue b w i -> [Eval (GenValue b w i)]
- Cryptol.Eval.Value: fromVWord :: BitWord b w => String -> GenValue b w -> Eval w
+ Cryptol.Eval.Value: fromVWord :: BitWord b w i => String -> GenValue b w i -> Eval w
- Cryptol.Eval.Value: fromWordVal :: String -> GenValue b w -> Eval (WordValue b w)
+ Cryptol.Eval.Value: fromWordVal :: String -> GenValue b w i -> Eval (WordValue b w i)
- Cryptol.Eval.Value: indexWordValue :: BitWord b w => WordValue b w -> Integer -> Eval b
+ Cryptol.Eval.Value: indexWordValue :: BitWord b w i => WordValue b w i -> Integer -> Eval b
- Cryptol.Eval.Value: infiniteSeqMap :: [Eval (GenValue b w)] -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: infiniteSeqMap :: [Eval (GenValue b w i)] -> Eval (SeqMap b w i)
- Cryptol.Eval.Value: iteValue :: EvalPrims b w => b -> Eval (GenValue b w) -> Eval (GenValue b w) -> Eval (GenValue b w)
+ Cryptol.Eval.Value: iteValue :: EvalPrims b w i => b -> Eval (GenValue b w i) -> Eval (GenValue b w i) -> Eval (GenValue b w i)
- Cryptol.Eval.Value: joinWord :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: joinWord :: BitWord b w i => w -> w -> w
- Cryptol.Eval.Value: lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: lam :: (Eval (GenValue b w i) -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Eval.Value: lookupRecord :: Ident -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Eval.Value: lookupSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w)
+ Cryptol.Eval.Value: lookupSeqMap :: SeqMap b w i -> Integer -> Eval (GenValue b w i)
- Cryptol.Eval.Value: mapSeqMap :: (GenValue b w -> Eval (GenValue b w)) -> SeqMap b w -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: mapSeqMap :: (GenValue b w i -> Eval (GenValue b w i)) -> SeqMap b w i -> Eval (SeqMap b w i)
- Cryptol.Eval.Value: memoMap :: SeqMap b w -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: memoMap :: SeqMap b w i -> Eval (SeqMap b w i)
- Cryptol.Eval.Value: mkSeq :: Nat' -> TValue -> SeqMap b w -> GenValue b w
+ Cryptol.Eval.Value: mkSeq :: Nat' -> TValue -> SeqMap b w i -> GenValue b w i
- Cryptol.Eval.Value: nlam :: (Nat' -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: nlam :: (Nat' -> GenValue b w i) -> GenValue b w i
- Cryptol.Eval.Value: packWord :: BitWord b w => [b] -> w
+ Cryptol.Eval.Value: packWord :: BitWord b w i => [b] -> w
- Cryptol.Eval.Value: ppBit :: BitWord b w => b -> Doc
+ Cryptol.Eval.Value: ppBit :: BitWord b w i => b -> Doc
- Cryptol.Eval.Value: ppValue :: forall b w. BitWord b w => PPOpts -> GenValue b w -> Eval Doc
+ Cryptol.Eval.Value: ppValue :: forall b w i. BitWord b w i => PPOpts -> GenValue b w i -> Eval Doc
- Cryptol.Eval.Value: ppWord :: BitWord b w => PPOpts -> w -> Doc
+ Cryptol.Eval.Value: ppWord :: BitWord b w i => PPOpts -> w -> Doc
- Cryptol.Eval.Value: reverseSeqMap :: Integer -> SeqMap b w -> SeqMap b w
+ Cryptol.Eval.Value: reverseSeqMap :: Integer -> SeqMap b w i -> SeqMap b w i
- Cryptol.Eval.Value: splitSeqMap :: Integer -> SeqMap b w -> (SeqMap b w, SeqMap b w)
+ Cryptol.Eval.Value: splitSeqMap :: Integer -> SeqMap b w i -> (SeqMap b w i, SeqMap b w i)
- Cryptol.Eval.Value: splitWord :: BitWord b w => Integer -> Integer -> w -> (w, w)
+ Cryptol.Eval.Value: splitWord :: BitWord b w i => Integer -> Integer -> w -> (w, w)
- Cryptol.Eval.Value: streamSeqMap :: SeqMap b w -> [Eval (GenValue b w)]
+ Cryptol.Eval.Value: streamSeqMap :: SeqMap b w i -> [Eval (GenValue b w i)]
- Cryptol.Eval.Value: tlam :: (TValue -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: tlam :: (TValue -> GenValue b w i) -> GenValue b w i
- Cryptol.Eval.Value: toFinSeq :: BitWord b w => Integer -> TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: toFinSeq :: BitWord b w i => Integer -> TValue -> [GenValue b w i] -> GenValue b w i
- Cryptol.Eval.Value: toSeq :: BitWord b w => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w)
+ Cryptol.Eval.Value: toSeq :: BitWord b w i => Nat' -> TValue -> [GenValue b w i] -> Eval (GenValue b w i)
- Cryptol.Eval.Value: toStream :: [GenValue b w] -> Eval (GenValue b w)
+ Cryptol.Eval.Value: toStream :: [GenValue b w i] -> Eval (GenValue b w i)
- Cryptol.Eval.Value: tryFromBits :: BitWord b w => [Eval (GenValue b w)] -> Maybe w
+ Cryptol.Eval.Value: tryFromBits :: BitWord b w i => [Eval (GenValue b w i)] -> Maybe w
- Cryptol.Eval.Value: type SeqValMap = SeqMap Bool BV
+ Cryptol.Eval.Value: type SeqValMap = SeqMap Bool BV Integer
- Cryptol.Eval.Value: type Value = GenValue Bool BV
+ Cryptol.Eval.Value: type Value = GenValue Bool BV Integer
- Cryptol.Eval.Value: unpackWord :: BitWord b w => w -> [b]
+ Cryptol.Eval.Value: unpackWord :: BitWord b w i => w -> [b]
- Cryptol.Eval.Value: updateSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w) -> SeqMap b w
+ Cryptol.Eval.Value: updateSeqMap :: SeqMap b w i -> Integer -> Eval (GenValue b w i) -> SeqMap b w i
- Cryptol.Eval.Value: vWordLen :: BitWord b w => GenValue b w -> Maybe Integer
+ Cryptol.Eval.Value: vWordLen :: BitWord b w i => GenValue b w i -> Maybe Integer
- Cryptol.Eval.Value: wlam :: BitWord b w => (w -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: wlam :: BitWord b w i => (w -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Eval.Value: word :: BitWord b w => Integer -> Integer -> GenValue b w
+ Cryptol.Eval.Value: word :: BitWord b w i => Integer -> Integer -> GenValue b w i
- Cryptol.Eval.Value: wordAsChar :: BitWord b w => w -> Maybe Char
+ Cryptol.Eval.Value: wordAsChar :: BitWord b w i => w -> Maybe Char
- Cryptol.Eval.Value: wordLen :: BitWord b w => w -> Integer
+ Cryptol.Eval.Value: wordLen :: BitWord b w i => w -> Integer
- Cryptol.Eval.Value: wordLit :: BitWord b w => Integer -> Integer -> w
+ Cryptol.Eval.Value: wordLit :: BitWord b w i => Integer -> Integer -> w
- Cryptol.Eval.Value: wordMinus :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: wordMinus :: BitWord b w i => w -> w -> w
- Cryptol.Eval.Value: wordMult :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: wordMult :: BitWord b w i => w -> w -> w
- Cryptol.Eval.Value: wordPlus :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: wordPlus :: BitWord b w i => 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.Eval.Value: zipSeqMap :: (GenValue b w i -> GenValue b w i -> Eval (GenValue b w i)) -> SeqMap b w i -> SeqMap b w i -> Eval (SeqMap b w i)
- Cryptol.ModuleSystem: Iface :: !ModName -> IfaceDecls -> IfaceDecls -> Iface
+ Cryptol.ModuleSystem: Iface :: !ModName -> IfaceDecls -> IfaceDecls -> IfaceParams -> Iface
- Cryptol.ModuleSystem: ModuleEnv :: LoadedModules -> NameSeeds -> EvalEnv -> Maybe ModName -> [FilePath] -> DynamicEnv -> !Bool -> SolverConfig -> CoreLint -> !Supply -> ModuleEnv
+ Cryptol.ModuleSystem: ModuleEnv :: LoadedModules -> NameSeeds -> SolverConfig -> EvalEnv -> CoreLint -> !Bool -> Maybe ModName -> [FilePath] -> DynamicEnv -> !Supply -> ModuleEnv
- Cryptol.ModuleSystem: focusedEnv :: ModuleEnv -> (IfaceDecls, NamingEnv, NameDisp)
+ Cryptol.ModuleSystem: focusedEnv :: ModuleEnv -> (IfaceParams, IfaceDecls, NamingEnv, NameDisp)
- Cryptol.ModuleSystem: loadModuleByPath :: FilePath -> ModuleCmd Module
+ Cryptol.ModuleSystem: loadModuleByPath :: FilePath -> ModuleCmd (FilePath, Module)
- Cryptol.ModuleSystem: type ModuleCmd a = ModuleEnv -> IO (ModuleRes a)
+ Cryptol.ModuleSystem: type ModuleCmd a = (EvalOpts, ModuleEnv) -> IO (ModuleRes a)
- Cryptol.ModuleSystem.Base: TCAction :: (i -> InferInput -> IO (InferOutput o)) -> TCLinter o -> PrimMap -> TCAction i o
+ Cryptol.ModuleSystem.Base: TCAction :: Act i o -> TCLinter o -> PrimMap -> TCAction i o
- Cryptol.ModuleSystem.Base: TCLinter :: (o -> InferInput -> Either Error [ProofObligation]) -> Maybe ModName -> TCLinter o
+ Cryptol.ModuleSystem.Base: TCLinter :: o -> InferInput -> Either Error [ProofObligation] -> Maybe ModName -> TCLinter o
- Cryptol.ModuleSystem.Base: [tcAction] :: TCAction i o -> i -> InferInput -> IO (InferOutput o)
+ Cryptol.ModuleSystem.Base: [tcAction] :: TCAction i o -> Act i o
- Cryptol.ModuleSystem.Base: checkModule :: FilePath -> Module PName -> ModuleM Module
+ Cryptol.ModuleSystem.Base: checkModule :: ImportSource -> FilePath -> Module PName -> ModuleM Module
- Cryptol.ModuleSystem.Base: genInferInput :: Range -> PrimMap -> IfaceDecls -> ModuleM InferInput
+ Cryptol.ModuleSystem.Base: genInferInput :: Range -> PrimMap -> IfaceParams -> IfaceDecls -> ModuleM InferInput
- Cryptol.ModuleSystem.Base: getLocalEnv :: ModuleM (IfaceDecls, NamingEnv)
+ Cryptol.ModuleSystem.Base: getLocalEnv :: ModuleM (IfaceParams, IfaceDecls, NamingEnv)
- Cryptol.ModuleSystem.Base: typecheck :: (Show i, Show o, HasLoc i) => TCAction i o -> i -> IfaceDecls -> ModuleM o
+ Cryptol.ModuleSystem.Base: typecheck :: (Show i, Show o, HasLoc i) => TCAction i o -> i -> IfaceParams -> IfaceDecls -> ModuleM o
- Cryptol.ModuleSystem.Env: LoadedModules :: [LoadedModule] -> LoadedModules
+ Cryptol.ModuleSystem.Env: LoadedModules :: [LoadedModule] -> [LoadedModule] -> LoadedModules
- Cryptol.ModuleSystem.Env: ModuleEnv :: LoadedModules -> NameSeeds -> EvalEnv -> Maybe ModName -> [FilePath] -> DynamicEnv -> !Bool -> SolverConfig -> CoreLint -> !Supply -> ModuleEnv
+ Cryptol.ModuleSystem.Env: ModuleEnv :: LoadedModules -> NameSeeds -> SolverConfig -> EvalEnv -> CoreLint -> !Bool -> Maybe ModName -> [FilePath] -> DynamicEnv -> !Supply -> ModuleEnv
- Cryptol.ModuleSystem.Env: focusedEnv :: ModuleEnv -> (IfaceDecls, NamingEnv, NameDisp)
+ Cryptol.ModuleSystem.Env: focusedEnv :: ModuleEnv -> (IfaceParams, IfaceDecls, NamingEnv, NameDisp)
- Cryptol.ModuleSystem.Env: removeLoadedModule :: FilePath -> LoadedModules -> LoadedModules
+ Cryptol.ModuleSystem.Env: removeLoadedModule :: (LoadedModule -> Bool) -> LoadedModules -> LoadedModules
- Cryptol.ModuleSystem.Interface: Iface :: !ModName -> IfaceDecls -> IfaceDecls -> Iface
+ Cryptol.ModuleSystem.Interface: Iface :: !ModName -> IfaceDecls -> IfaceDecls -> IfaceParams -> Iface
- Cryptol.ModuleSystem.Monad: RO :: [ImportSource] -> RO
+ Cryptol.ModuleSystem.Monad: RO :: [ImportSource] -> EvalOpts -> RO
- Cryptol.ModuleSystem.Monad: emptyRO :: RO
+ Cryptol.ModuleSystem.Monad: emptyRO :: EvalOpts -> RO
- Cryptol.ModuleSystem.Monad: getFocusedEnv :: ModuleM (IfaceDecls, NamingEnv, NameDisp)
+ Cryptol.ModuleSystem.Monad: getFocusedEnv :: ModuleM (IfaceParams, IfaceDecls, NamingEnv, NameDisp)
- Cryptol.ModuleSystem.Monad: runModuleM :: ModuleEnv -> ModuleM a -> IO (Either ModuleError (a, ModuleEnv), [ModuleWarning])
+ Cryptol.ModuleSystem.Monad: runModuleM :: (EvalOpts, ModuleEnv) -> ModuleM a -> IO (Either ModuleError (a, ModuleEnv), [ModuleWarning])
- Cryptol.ModuleSystem.Monad: runModuleT :: Monad m => ModuleEnv -> ModuleT m a -> m (Either ModuleError (a, ModuleEnv), [ModuleWarning])
+ Cryptol.ModuleSystem.Monad: runModuleT :: Monad m => (EvalOpts, ModuleEnv) -> ModuleT m a -> m (Either ModuleError (a, ModuleEnv), [ModuleWarning])
- Cryptol.ModuleSystem.Monad: unloadModule :: FilePath -> ModuleM ()
+ Cryptol.ModuleSystem.Monad: unloadModule :: (LoadedModule -> Bool) -> ModuleM ()
- Cryptol.ModuleSystem.Name: Declared :: !ModName -> NameInfo
+ Cryptol.ModuleSystem.Name: Declared :: !ModName -> !NameSource -> NameInfo
- Cryptol.ModuleSystem.Name: mkDeclared :: ModName -> Ident -> Maybe Fixity -> Range -> Supply -> (Name, Supply)
+ Cryptol.ModuleSystem.Name: mkDeclared :: ModName -> NameSource -> Ident -> Maybe Fixity -> Range -> Supply -> (Name, Supply)
- Cryptol.Parser: HappyError :: FilePath -> Position -> (Maybe Token) -> ParseError
+ Cryptol.Parser: HappyError :: FilePath -> (Located Token) -> ParseError
- Cryptol.Parser.AST: Module :: Located ModName -> [Located Import] -> [TopDecl name] -> Module name
+ Cryptol.Parser.AST: Module :: Located ModName -> !(Maybe (Located ModName)) -> [Located Import] -> [TopDecl name] -> Module name
- Cryptol.Parser.AST: TApp :: TFun -> [Type n] -> Type n
+ Cryptol.Parser.AST: TApp :: TCon -> [Type n] -> Type n
- Cryptol.Prims.Eval: arithBinary :: forall b w. BitWord b w => BinArith w -> Binary b w
+ Cryptol.Prims.Eval: arithBinary :: forall b w i. BitWord b w i => BinArith w -> (i -> i -> Eval i) -> (Integer -> i -> i -> Eval i) -> Binary b w i
- Cryptol.Prims.Eval: arithUnary :: forall b w. BitWord b w => UnaryArith w -> Unary b w
+ Cryptol.Prims.Eval: arithUnary :: forall b w i. BitWord b w i => UnaryArith w -> (i -> Eval i) -> (Integer -> i -> Eval i) -> Unary b w i
- Cryptol.Prims.Eval: binary :: Binary b w -> GenValue b w
+ Cryptol.Prims.Eval: binary :: Binary b w i -> GenValue b w i
- 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: ccatV :: (Show b, Show w, BitWord b w i) => Nat' -> Nat' -> TValue -> (GenValue b w i) -> (GenValue b w i) -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: cmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV
+ Cryptol.Prims.Eval: cmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV Integer
- Cryptol.Prims.Eval: ecSplitV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: ecSplitV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: errorV :: forall b w. BitWord b w => TValue -> String -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: errorV :: forall b w i. BitWord b w i => TValue -> String -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: extractWordVal :: BitWord b w => Integer -> Integer -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: extractWordVal :: BitWord b w i => Integer -> Integer -> WordValue b w i -> WordValue b w i
- Cryptol.Prims.Eval: fromThenToV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: fromThenToV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: fromThenV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: fromThenV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: fromToV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: fromToV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: infFromThenV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: infFromThenV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: infFromV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: infFromV :: BitWord b w i => GenValue b w i
- Cryptol.Prims.Eval: joinSeq :: BitWord b w => Nat' -> Integer -> TValue -> SeqMap b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: joinSeq :: BitWord b w i => Nat' -> Integer -> TValue -> SeqMap b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: joinV :: BitWord b w => Nat' -> Integer -> TValue -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: joinV :: BitWord b w i => Nat' -> Integer -> TValue -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: joinWordVal :: BitWord b w => WordValue b w -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: joinWordVal :: BitWord b w i => WordValue b w i -> WordValue b w i -> WordValue b w i
- Cryptol.Prims.Eval: joinWords :: forall b w. BitWord b w => Integer -> Integer -> SeqMap b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: joinWords :: forall b w i. BitWord b w i => Integer -> Integer -> SeqMap b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: lexCompare :: String -> TValue -> Value -> Value -> Eval Ordering
+ Cryptol.Prims.Eval: lexCompare :: TValue -> Value -> Value -> Eval Ordering
- Cryptol.Prims.Eval: logicBinary :: forall b w. BitWord b w => (b -> b -> b) -> (w -> w -> w) -> Binary b w
+ Cryptol.Prims.Eval: logicBinary :: forall b w i. BitWord b w i => (b -> b -> b) -> (w -> w -> w) -> Binary b w i
- Cryptol.Prims.Eval: logicUnary :: forall b w. BitWord b w => (b -> b) -> (w -> w) -> Unary b w
+ Cryptol.Prims.Eval: logicUnary :: forall b w i. BitWord b w i => (b -> b) -> (w -> w) -> Unary b w i
- Cryptol.Prims.Eval: randomV :: TValue -> Integer -> Value
+ Cryptol.Prims.Eval: randomV :: BitWord b w i => TValue -> Integer -> GenValue b w i
- Cryptol.Prims.Eval: reverseV :: forall b w. BitWord b w => GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: reverseV :: forall b w i. BitWord b w i => GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: splitAtV :: BitWord b w => Nat' -> Nat' -> TValue -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: splitAtV :: BitWord b w i => Nat' -> Nat' -> TValue -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: splitWordVal :: BitWord b w => Integer -> Integer -> WordValue b w -> (WordValue b w, WordValue b w)
+ Cryptol.Prims.Eval: splitWordVal :: BitWord b w i => Integer -> Integer -> WordValue b w i -> (WordValue b w i, WordValue b w i)
- Cryptol.Prims.Eval: transposeV :: BitWord b w => Nat' -> Nat' -> TValue -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: transposeV :: BitWord b w i => Nat' -> Nat' -> TValue -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: type Binary b w = TValue -> GenValue b w -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: type Binary b w i = TValue -> GenValue b w i -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: type Unary b w = TValue -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: type Unary b w i = TValue -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Prims.Eval: unary :: Unary b w -> GenValue b w
+ Cryptol.Prims.Eval: unary :: Unary b w i -> GenValue b w i
- Cryptol.Prims.Eval: updateBack :: Nat' -> TValue -> SeqMap Bool BV -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (SeqMap Bool BV)
+ Cryptol.Prims.Eval: updateBack :: Nat' -> TValue -> SeqMap Bool BV Integer -> WordValue Bool BV Integer -> Eval (GenValue Bool BV Integer) -> Eval (SeqMap Bool BV Integer)
- Cryptol.Prims.Eval: updateFront :: Nat' -> TValue -> SeqMap Bool BV -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (SeqMap Bool BV)
+ Cryptol.Prims.Eval: updateFront :: Nat' -> TValue -> SeqMap Bool BV Integer -> WordValue Bool BV Integer -> Eval (GenValue Bool BV Integer) -> Eval (SeqMap Bool BV Integer)
- 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: updatePrim :: BitWord b w i => (Nat' -> TValue -> WordValue b w i -> WordValue b w i -> Eval (GenValue b w i) -> Eval (WordValue b w i)) -> (Nat' -> TValue -> SeqMap b w i -> WordValue b w i -> Eval (GenValue b w i) -> Eval (SeqMap b w i)) -> GenValue b w i
- 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: wordValLogicOp :: BitWord b w i => (b -> b -> b) -> (w -> w -> w) -> WordValue b w i -> WordValue b w i -> Eval (WordValue b w i)
- Cryptol.Prims.Eval: wordValUnaryOp :: BitWord b w => (b -> b) -> (w -> w) -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: wordValUnaryOp :: BitWord b w i => (b -> b) -> (w -> w) -> WordValue b w i -> Eval (WordValue b w i)
- Cryptol.Prims.Eval: zeroV :: forall b w. BitWord b w => TValue -> GenValue b w
+ Cryptol.Prims.Eval: zeroV :: forall b w i. BitWord b w i => TValue -> GenValue b w i
- Cryptol.REPL.Monad: OptionDescr :: String -> EnvVal -> (EnvVal -> IO (Maybe String)) -> String -> (EnvVal -> REPL ()) -> OptionDescr
+ Cryptol.REPL.Monad: OptionDescr :: String -> EnvVal -> Checker -> String -> EnvVal -> REPL () -> OptionDescr
- Cryptol.REPL.Monad: REPL :: (IORef RW -> IO a) -> REPL a
+ Cryptol.REPL.Monad: REPL :: IORef RW -> IO a -> REPL a
- Cryptol.REPL.Monad: [optCheck] :: OptionDescr -> EnvVal -> IO (Maybe String)
+ Cryptol.REPL.Monad: [optCheck] :: OptionDescr -> Checker
- Cryptol.REPL.Monad: freshName :: Ident -> REPL Name
+ Cryptol.REPL.Monad: freshName :: Ident -> NameSource -> REPL Name
- Cryptol.REPL.Monad: getFocusedEnv :: REPL (IfaceDecls, NamingEnv, NameDisp)
+ Cryptol.REPL.Monad: getFocusedEnv :: REPL (IfaceParams, IfaceDecls, NamingEnv, NameDisp)
- Cryptol.REPL.Monad: runREPL :: Bool -> REPL a -> IO a
+ Cryptol.REPL.Monad: runREPL :: Bool -> Logger -> REPL a -> IO a
- Cryptol.Symbolic: existsFinType :: FinType -> Symbolic Value
+ Cryptol.Symbolic: existsFinType :: FinType -> WriterT [SBool] Symbolic Value
- Cryptol.Symbolic: forallFinType :: FinType -> Symbolic Value
+ Cryptol.Symbolic: forallFinType :: FinType -> WriterT [SBool] Symbolic Value
- Cryptol.Symbolic.Prims: asWordList :: [WordValue SBool SWord] -> Maybe [SWord]
+ Cryptol.Symbolic.Prims: asWordList :: [WordValue SBool SWord SInteger] -> Maybe [SWord]
- Cryptol.Symbolic.Prims: cmpBinary :: (SBool -> SBool -> Eval SBool -> Eval SBool) -> (SWord -> SWord -> Eval SBool -> Eval SBool) -> SBool -> Binary SBool SWord
+ Cryptol.Symbolic.Prims: cmpBinary :: (SBool -> SBool -> Eval SBool -> Eval SBool) -> (SWord -> SWord -> Eval SBool -> Eval SBool) -> (SInteger -> SInteger -> Eval SBool -> Eval SBool) -> (Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool) -> SBool -> Binary SBool SWord SInteger
- Cryptol.Symbolic.Prims: indexBack :: Maybe Integer -> TValue -> SeqMap SBool SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: indexBack :: Maybe Integer -> TValue -> SeqMap SBool SWord SInteger -> SWord -> Eval Value
- Cryptol.Symbolic.Prims: indexBack_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord -> Seq SBool -> Eval Value
+ Cryptol.Symbolic.Prims: indexBack_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord SInteger -> Seq SBool -> Eval Value
- Cryptol.Symbolic.Prims: indexFront :: Maybe Integer -> TValue -> SeqMap SBool SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: indexFront :: Maybe Integer -> TValue -> SeqMap SBool SWord SInteger -> SWord -> Eval Value
- Cryptol.Symbolic.Prims: indexFront_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord -> Seq SBool -> Eval Value
+ Cryptol.Symbolic.Prims: indexFront_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord SInteger -> Seq SBool -> Eval Value
- Cryptol.Symbolic.Prims: selectV :: forall a. (SBool -> Eval a -> Eval a -> Eval a) -> WordValue SBool SWord -> (Integer -> Eval a) -> Eval a
+ Cryptol.Symbolic.Prims: selectV :: forall a. (SBool -> Eval a -> Eval a -> Eval a) -> WordValue SBool SWord SInteger -> (Integer -> Eval a) -> Eval 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 :: Nat' -> TValue -> SeqMap SBool SWord SInteger -> WordValue SBool SWord SInteger -> Eval (GenValue SBool SWord SInteger) -> Eval (SeqMap SBool SWord SInteger)
- Cryptol.Symbolic.Prims: updateFrontSym :: Nat' -> TValue -> SeqMap SBool SWord -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (SeqMap SBool SWord)
+ Cryptol.Symbolic.Prims: updateFrontSym :: Nat' -> TValue -> SeqMap SBool SWord SInteger -> WordValue SBool SWord SInteger -> Eval (GenValue SBool SWord SInteger) -> Eval (SeqMap SBool SWord SInteger)
- Cryptol.Symbolic.Value: VBit :: !b -> GenValue b w
+ Cryptol.Symbolic.Value: VBit :: !b -> GenValue b w i
- Cryptol.Symbolic.Value: VFun :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Symbolic.Value: VFun :: (Eval (GenValue b w i) -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Symbolic.Value: VNumPoly :: (Nat' -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Symbolic.Value: VNumPoly :: (Nat' -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Symbolic.Value: VPoly :: (TValue -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Symbolic.Value: VPoly :: (TValue -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Symbolic.Value: VRecord :: ![(Ident, Eval (GenValue b w))] -> GenValue b w
+ Cryptol.Symbolic.Value: VRecord :: ![(Ident, Eval (GenValue b w i))] -> GenValue b w i
- Cryptol.Symbolic.Value: VSeq :: !Integer -> !(SeqMap b w) -> GenValue b w
+ Cryptol.Symbolic.Value: VSeq :: !Integer -> !(SeqMap b w i) -> GenValue b w i
- Cryptol.Symbolic.Value: VStream :: !(SeqMap b w) -> GenValue b w
+ Cryptol.Symbolic.Value: VStream :: !(SeqMap b w i) -> GenValue b w i
- Cryptol.Symbolic.Value: VTuple :: ![Eval (GenValue b w)] -> GenValue b w
+ Cryptol.Symbolic.Value: VTuple :: ![Eval (GenValue b w i)] -> GenValue b w i
- Cryptol.Symbolic.Value: VWord :: !Integer -> !(Eval (WordValue b w)) -> GenValue b w
+ Cryptol.Symbolic.Value: VWord :: !Integer -> !(Eval (WordValue b w i)) -> GenValue b w i
- Cryptol.Symbolic.Value: data GenValue b w
+ Cryptol.Symbolic.Value: data GenValue b w i
- Cryptol.Symbolic.Value: fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)
+ Cryptol.Symbolic.Value: fromSeq :: forall b w i. BitWord b w i => String -> GenValue b w i -> Eval (SeqMap b w i)
- Cryptol.Symbolic.Value: fromVBit :: GenValue b w -> b
+ Cryptol.Symbolic.Value: fromVBit :: GenValue b w i -> b
- Cryptol.Symbolic.Value: fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w))
+ Cryptol.Symbolic.Value: fromVFun :: GenValue b w i -> (Eval (GenValue b w i) -> Eval (GenValue b w i))
- Cryptol.Symbolic.Value: fromVPoly :: GenValue b w -> (TValue -> Eval (GenValue b w))
+ Cryptol.Symbolic.Value: fromVPoly :: GenValue b w i -> (TValue -> Eval (GenValue b w i))
- Cryptol.Symbolic.Value: fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))]
+ Cryptol.Symbolic.Value: fromVRecord :: GenValue b w i -> [(Ident, Eval (GenValue b w i))]
- Cryptol.Symbolic.Value: fromVTuple :: GenValue b w -> [Eval (GenValue b w)]
+ Cryptol.Symbolic.Value: fromVTuple :: GenValue b w i -> [Eval (GenValue b w i)]
- Cryptol.Symbolic.Value: fromVWord :: BitWord b w => String -> GenValue b w -> Eval w
+ Cryptol.Symbolic.Value: fromVWord :: BitWord b w i => String -> GenValue b w i -> Eval w
- Cryptol.Symbolic.Value: iteSValue :: SBool -> Value -> Value -> Value
+ Cryptol.Symbolic.Value: iteSValue :: SBool -> Value -> Value -> Eval Value
- Cryptol.Symbolic.Value: lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Symbolic.Value: lam :: (Eval (GenValue b w i) -> Eval (GenValue b w i)) -> GenValue b w i
- Cryptol.Symbolic.Value: lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Symbolic.Value: lookupRecord :: Ident -> GenValue b w i -> Eval (GenValue b w i)
- Cryptol.Symbolic.Value: mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord -> SeqMap SBool SWord -> SeqMap SBool SWord
+ Cryptol.Symbolic.Value: mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord SInteger -> SeqMap SBool SWord SInteger -> SeqMap SBool SWord SInteger
- Cryptol.Symbolic.Value: mergeValue :: Bool -> SBool -> Value -> Value -> Value
+ Cryptol.Symbolic.Value: mergeValue :: Bool -> SBool -> Value -> Value -> Eval Value
- Cryptol.Symbolic.Value: mergeWord :: Bool -> SBool -> WordValue SBool SWord -> WordValue SBool SWord -> WordValue SBool SWord
+ Cryptol.Symbolic.Value: mergeWord :: Bool -> SBool -> WordValue SBool SWord SInteger -> WordValue SBool SWord SInteger -> WordValue SBool SWord SInteger
- Cryptol.Symbolic.Value: tlam :: (TValue -> GenValue b w) -> GenValue b w
+ Cryptol.Symbolic.Value: tlam :: (TValue -> GenValue b w i) -> GenValue b w i
- Cryptol.Symbolic.Value: toFinSeq :: BitWord b w => Integer -> TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: toFinSeq :: BitWord b w i => Integer -> TValue -> [GenValue b w i] -> GenValue b w i
- Cryptol.Symbolic.Value: toSeq :: BitWord b w => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w)
+ Cryptol.Symbolic.Value: toSeq :: BitWord b w i => Nat' -> TValue -> [GenValue b w i] -> Eval (GenValue b w i)
- Cryptol.Symbolic.Value: toStream :: [GenValue b w] -> Eval (GenValue b w)
+ Cryptol.Symbolic.Value: toStream :: [GenValue b w i] -> Eval (GenValue b w i)
- Cryptol.Symbolic.Value: type Value = GenValue SBool SWord
+ Cryptol.Symbolic.Value: type Value = GenValue SBool SWord SInteger
- Cryptol.Testing.Concrete: TestReport :: TestResult -> String -> Integer -> Integer -> TestReport
+ Cryptol.Testing.Concrete: TestReport :: TestResult -> String -> Integer -> Maybe Integer -> TestReport
- Cryptol.Testing.Concrete: TestSpec :: (Integer -> s -> m (TestResult, s)) -> String -> Integer -> Integer -> (Integer -> Integer -> m ()) -> m () -> (TestResult -> m ()) -> m () -> TestSpec m s
+ Cryptol.Testing.Concrete: TestSpec :: Integer -> s -> m (TestResult, s) -> String -> Integer -> Maybe Integer -> Integer -> Integer -> m () -> m () -> TestResult -> m () -> m () -> TestSpec m s
- Cryptol.Testing.Concrete: [reportTestsPossible] :: TestReport -> Integer
+ Cryptol.Testing.Concrete: [reportTestsPossible] :: TestReport -> Maybe Integer
- Cryptol.Testing.Concrete: [testPossible] :: TestSpec m s -> Integer
+ Cryptol.Testing.Concrete: [testPossible] :: TestSpec m s -> Maybe Integer
- Cryptol.Testing.Concrete: runOneTest :: Value -> [Value] -> IO TestResult
+ Cryptol.Testing.Concrete: runOneTest :: EvalOpts -> Value -> [Value] -> IO TestResult
- Cryptol.Testing.Concrete: testableType :: Type -> Maybe (Integer, [[Value]])
+ Cryptol.Testing.Concrete: testableType :: Type -> Maybe (Maybe Integer, [Type], [[Value]])
- Cryptol.Testing.Random: randomBit :: RandomGen g => Gen g
+ Cryptol.Testing.Random: randomBit :: (BitWord b w i, RandomGen g) => Gen g b w i
- Cryptol.Testing.Random: randomRecord :: RandomGen g => [(Ident, Gen g)] -> Gen g
+ Cryptol.Testing.Random: randomRecord :: RandomGen g => [(Ident, Gen g b w i)] -> Gen g b w i
- Cryptol.Testing.Random: randomSequence :: RandomGen g => Integer -> Gen g -> Gen g
+ Cryptol.Testing.Random: randomSequence :: RandomGen g => Integer -> Gen g b w i -> Gen g b w i
- Cryptol.Testing.Random: randomStream :: RandomGen g => Gen g -> Gen g
+ Cryptol.Testing.Random: randomStream :: RandomGen g => Gen g b w i -> Gen g b w i
- Cryptol.Testing.Random: randomTuple :: RandomGen g => [Gen g] -> Gen g
+ Cryptol.Testing.Random: randomTuple :: RandomGen g => [Gen g b w i] -> Gen g b w i
- Cryptol.Testing.Random: randomValue :: RandomGen g => Type -> Maybe (Gen g)
+ Cryptol.Testing.Random: randomValue :: (BitWord b w i, RandomGen g) => Type -> Maybe (Gen g b w i)
- Cryptol.Testing.Random: randomWord :: RandomGen g => Integer -> Gen g
+ Cryptol.Testing.Random: randomWord :: (BitWord b w i, RandomGen g) => Integer -> Gen g b w i
- Cryptol.Testing.Random: runOneTest :: RandomGen g => Value -> [Gen g] -> Integer -> g -> IO (TestResult, g)
+ Cryptol.Testing.Random: runOneTest :: RandomGen g => EvalOpts -> Value -> [Gen g Bool BV Integer] -> Integer -> g -> IO (TestResult, g)
- Cryptol.Testing.Random: testableType :: RandomGen g => Type -> Maybe [Gen g]
+ Cryptol.Testing.Random: testableType :: RandomGen g => Type -> Maybe [Gen g Bool BV Integer]
- Cryptol.Testing.Random: type Gen g = Integer -> g -> (Value, g)
+ Cryptol.Testing.Random: type Gen g b w i = Integer -> g -> (GenValue b w i, g)
- Cryptol.TypeCheck: AmbiguousType :: [Name] -> Error
+ Cryptol.TypeCheck: AmbiguousType :: [Name] -> [TVar] -> Error
- Cryptol.TypeCheck: DefaultingTo :: Doc -> Type -> Warning
+ Cryptol.TypeCheck: DefaultingTo :: TVarInfo -> Type -> Warning
- Cryptol.TypeCheck: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
+ Cryptol.TypeCheck: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> !(Map Name ModTParam) -> !([Located Prop]) -> !(Map Name ModVParam) -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
- Cryptol.TypeCheck: SolverConfig :: FilePath -> [String] -> Int -> SolverConfig
+ Cryptol.TypeCheck: SolverConfig :: FilePath -> [String] -> Int -> [FilePath] -> SolverConfig
- Cryptol.TypeCheck: TypeVariableEscaped :: Type -> [TVar] -> Error
+ Cryptol.TypeCheck: TypeVariableEscaped :: Type -> [TParam] -> Error
- Cryptol.TypeCheck.AST: Module :: !ModName -> ExportSpec Name -> [Import] -> Map Name TySyn -> Map Name Newtype -> [DeclGroup] -> Module
+ Cryptol.TypeCheck.AST: Module :: !ModName -> ExportSpec Name -> [Import] -> Map Name TySyn -> Map Name Newtype -> Map Name ModTParam -> [Located Prop] -> Map Name ModVParam -> [DeclGroup] -> Module
- Cryptol.TypeCheck.Depends: NT :: (Newtype Name) -> TyDecl
+ Cryptol.TypeCheck.Depends: NT :: (Newtype Name) -> (Maybe String) -> TyDecl
- Cryptol.TypeCheck.Depends: TS :: (TySyn Name) -> TyDecl
+ Cryptol.TypeCheck.Depends: TS :: (TySyn Name) -> (Maybe String) -> TyDecl
- Cryptol.TypeCheck.InferTypes: DelayedCt :: Name -> [TParam] -> [Prop] -> [Goal] -> DelayedCt
+ Cryptol.TypeCheck.InferTypes: DelayedCt :: Maybe Name -> [TParam] -> [Prop] -> [Goal] -> DelayedCt
- Cryptol.TypeCheck.InferTypes: Goals :: (Set Goal) -> Goals
+ Cryptol.TypeCheck.InferTypes: Goals :: Set Goal -> Map TVar LitGoal -> Goals
- Cryptol.TypeCheck.InferTypes: SolverConfig :: FilePath -> [String] -> Int -> SolverConfig
+ Cryptol.TypeCheck.InferTypes: SolverConfig :: FilePath -> [String] -> Int -> [FilePath] -> SolverConfig
- Cryptol.TypeCheck.InferTypes: [dctSource] :: DelayedCt -> Name
+ Cryptol.TypeCheck.InferTypes: [dctSource] :: DelayedCt -> Maybe Name
- Cryptol.TypeCheck.Instantiate: instantiateWith :: Expr -> Schema -> [Located (Maybe Ident, Type)] -> InferM (Expr, Type)
+ Cryptol.TypeCheck.Instantiate: instantiateWith :: Name -> Expr -> Schema -> [Located (Maybe Ident, Type)] -> InferM (Expr, Type)
- Cryptol.TypeCheck.Kind: checkNewtype :: Newtype Name -> InferM Newtype
+ Cryptol.TypeCheck.Kind: checkNewtype :: Newtype Name -> Maybe String -> InferM Newtype
- Cryptol.TypeCheck.Kind: checkSchema :: Schema Name -> InferM (Schema, [Goal])
+ Cryptol.TypeCheck.Kind: checkSchema :: AllowWildCards -> Schema Name -> InferM (Schema, [Goal])
- Cryptol.TypeCheck.Kind: checkTySyn :: TySyn Name -> InferM TySyn
+ Cryptol.TypeCheck.Kind: checkTySyn :: TySyn Name -> Maybe String -> InferM TySyn
- Cryptol.TypeCheck.Monad: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
+ Cryptol.TypeCheck.Monad: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> !(Map Name ModTParam) -> !([Located Prop]) -> !(Map Name ModVParam) -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
- Cryptol.TypeCheck.Monad: KRO :: Map Name Type -> Bool -> KRO
+ Cryptol.TypeCheck.Monad: KRO :: Map Name TParam -> AllowWildCards -> KRO
- 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: RO :: Range -> Map Name VarType -> [TParam] -> Map Name (DefLoc, TySyn) -> Map Name (DefLoc, Newtype) -> Map Name ModTParam -> [Located Prop] -> Map Name ModVParam -> Map Int (Expr -> Expr) -> Bool -> Solver -> !PrimMap -> !(IORef Int) -> RO
- Cryptol.TypeCheck.Monad: TLocalVar :: Type -> (Maybe Kind) -> LkpTyVar
+ Cryptol.TypeCheck.Monad: TLocalVar :: TParam -> (Maybe Kind) -> LkpTyVar
- Cryptol.TypeCheck.Monad: TOuterVar :: Type -> LkpTyVar
+ Cryptol.TypeCheck.Monad: TOuterVar :: TParam -> LkpTyVar
- Cryptol.TypeCheck.Monad: [allowWild] :: KRO -> Bool
+ Cryptol.TypeCheck.Monad: [allowWild] :: KRO -> AllowWildCards
- Cryptol.TypeCheck.Monad: getBoundInScope :: InferM (Set TVar)
+ Cryptol.TypeCheck.Monad: getBoundInScope :: InferM (Set TParam)
- Cryptol.TypeCheck.Monad: kNewType :: Doc -> Kind -> KindM Type
+ Cryptol.TypeCheck.Monad: kNewType :: TVarSource -> Kind -> KindM Type
- Cryptol.TypeCheck.Monad: kWildOK :: KindM Bool
+ Cryptol.TypeCheck.Monad: kWildOK :: KindM AllowWildCards
- Cryptol.TypeCheck.Monad: newTParam :: Maybe Name -> Kind -> InferM TParam
+ Cryptol.TypeCheck.Monad: newTParam :: TParam Name -> TPFlavor -> Kind -> InferM TParam
- Cryptol.TypeCheck.Monad: newTVar :: Doc -> Kind -> InferM TVar
+ Cryptol.TypeCheck.Monad: newTVar :: TVarSource -> Kind -> InferM TVar
- Cryptol.TypeCheck.Monad: newTVar' :: Doc -> Set TVar -> Kind -> InferM TVar
+ Cryptol.TypeCheck.Monad: newTVar' :: TVarSource -> Set TParam -> Kind -> InferM TVar
- Cryptol.TypeCheck.Monad: newType :: Doc -> Kind -> InferM Type
+ Cryptol.TypeCheck.Monad: newType :: TVarSource -> Kind -> InferM Type
- Cryptol.TypeCheck.Monad: runKindM :: Bool -> [(Name, Maybe Kind, Type)] -> KindM a -> InferM (a, Map Name Kind, [(ConstraintSource, [Prop])])
+ Cryptol.TypeCheck.Monad: runKindM :: AllowWildCards -> [(Name, Maybe Kind, TParam)] -> KindM a -> InferM (a, Map Name Kind, [(ConstraintSource, [Prop])])
- Cryptol.TypeCheck.Sanity: TypeMismatch :: Schema -> Schema -> Error
+ Cryptol.TypeCheck.Sanity: TypeMismatch :: String -> Schema -> Schema -> Error
- Cryptol.TypeCheck.Sanity: tcDecls :: Map Name Schema -> [DeclGroup] -> Either Error [ProofObligation]
+ Cryptol.TypeCheck.Sanity: tcDecls :: InferInput -> [DeclGroup] -> Either Error [ProofObligation]
- Cryptol.TypeCheck.Sanity: tcExpr :: Map Name Schema -> Expr -> Either Error (Schema, [ProofObligation])
+ Cryptol.TypeCheck.Sanity: tcExpr :: InferInput -> Expr -> Either Error (Schema, [ProofObligation])
- Cryptol.TypeCheck.Sanity: tcModule :: Map Name Schema -> Module -> Either Error [ProofObligation]
+ Cryptol.TypeCheck.Sanity: tcModule :: InferInput -> Module -> Either Error [ProofObligation]
- Cryptol.TypeCheck.Solve: proveImplication :: Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst
+ Cryptol.TypeCheck.Solve: proveImplication :: Maybe Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst
- Cryptol.TypeCheck.Type: Newtype :: Name -> [TParam] -> [Prop] -> [(Ident, Type)] -> Newtype
+ Cryptol.TypeCheck.Type: Newtype :: Name -> [TParam] -> [Prop] -> [(Ident, Type)] -> Maybe String -> Newtype
- Cryptol.TypeCheck.Type: TParam :: !Int -> Kind -> Maybe Name -> TParam
+ Cryptol.TypeCheck.Type: TParam :: !Int -> Kind -> TPFlavor -> !TVarInfo -> TParam
- Cryptol.TypeCheck.Type: TVBound :: !Int -> Kind -> TVar
+ Cryptol.TypeCheck.Type: TVBound :: {-# UNPACK #-} !TParam -> TVar
- Cryptol.TypeCheck.Type: TVFree :: !Int -> Kind -> (Set TVar) -> Doc -> TVar
+ Cryptol.TypeCheck.Type: TVFree :: !Int -> Kind -> (Set TParam) -> TVarInfo -> TVar
- Cryptol.TypeCheck.Type: TySyn :: Name -> [TParam] -> [Prop] -> Type -> TySyn
+ Cryptol.TypeCheck.Type: TySyn :: Name -> [TParam] -> [Prop] -> Type -> !(Maybe String) -> TySyn
- Cryptol.TypeCheck.Unify: UniNonPolyDepends :: TVar -> [TVar] -> UnificationError
+ Cryptol.TypeCheck.Unify: UniNonPolyDepends :: TVar -> [TParam] -> UnificationError
- Cryptol.TypeCheck.Unify: uniError :: UnificationError -> Result a
+ Cryptol.TypeCheck.Unify: uniError :: UnificationError -> Result MGU
- Cryptol.Utils.Ident: packModName :: [String] -> ModName
+ Cryptol.Utils.Ident: packModName :: [Text] -> ModName
- Cryptol.Utils.PP: fmtModName :: ModName -> NameFormat -> ModName
+ Cryptol.Utils.PP: fmtModName :: ModName -> NameFormat -> Text
- Cryptol.Utils.Panic: panic :: String -> [String] -> a
+ Cryptol.Utils.Panic: panic :: HasCallStack => String -> [String] -> a
Files
- LICENSE +1/−1
- Setup.hs +1/−1
- bench/Main.hs +19/−12
- bench/data/PreludeWithExtras.cry +1/−1
- cryptol.cabal +39/−42
- cryptol/Main.hs +1/−1
- cryptol/OptParser.hs +8/−4
- cryptol/REPL/Haskeline.hs +42/−8
- cryptol/REPL/Logo.hs +23/−10
- dist/build/Cryptol/Parser.hs +4203/−3851
- dist/build/Cryptol/Parser/Lexer.hs +873/−770
- lib/Cryptol.cry +329/−58
- lib/Cryptol/Extras.cry +0/−142
- lib/CryptolTC.z3 +20/−0
- src/Cryptol/Eval.hs +98/−91
- src/Cryptol/Eval/Arch.hs +1/−1
- src/Cryptol/Eval/Env.hs +25/−21
- src/Cryptol/Eval/Monad.hs +57/−20
- src/Cryptol/Eval/Reference.lhs +324/−197
- src/Cryptol/Eval/Type.hs +16/−5
- src/Cryptol/Eval/Value.hs +256/−108
- src/Cryptol/IR/FreeVars.hs +182/−0
- src/Cryptol/ModuleSystem.hs +14/−18
- src/Cryptol/ModuleSystem/Base.hs +124/−72
- src/Cryptol/ModuleSystem/Env.hs +132/−71
- src/Cryptol/ModuleSystem/Exports.hs +65/−0
- src/Cryptol/ModuleSystem/InstantiateModule.hs +292/−0
- src/Cryptol/ModuleSystem/Interface.hs +53/−22
- src/Cryptol/ModuleSystem/Monad.hs +100/−34
- src/Cryptol/ModuleSystem/Name.hs +78/−28
- src/Cryptol/ModuleSystem/NamingEnv.hs +88/−25
- src/Cryptol/ModuleSystem/Renamer.hs +165/−84
- src/Cryptol/Parser.y +54/−25
- src/Cryptol/Parser/AST.hs +183/−168
- src/Cryptol/Parser/Fixity.hs +46/−0
- src/Cryptol/Parser/Lexer.x +12/−9
- src/Cryptol/Parser/LexerUtils.hs +12/−12
- src/Cryptol/Parser/Name.hs +12/−7
- src/Cryptol/Parser/Names.hs +44/−21
- src/Cryptol/Parser/NoInclude.hs +7/−4
- src/Cryptol/Parser/NoPat.hs +56/−36
- src/Cryptol/Parser/ParserUtils.hs +201/−64
- src/Cryptol/Parser/Position.hs +14/−8
- src/Cryptol/Parser/Selector.hs +64/−0
- src/Cryptol/Parser/Unlit.hs +3/−3
- src/Cryptol/Parser/Utils.hs +3/−2
- src/Cryptol/Prelude.hs +4/−24
- src/Cryptol/Prims/Eval.hs +602/−376
- src/Cryptol/Prims/Syntax.hs +406/−62
- src/Cryptol/REPL/Command.hs +439/−174
- src/Cryptol/REPL/Monad.hs +195/−101
- src/Cryptol/REPL/Trie.hs +1/−1
- src/Cryptol/Symbolic.hs +73/−36
- src/Cryptol/Symbolic/Prims.hs +196/−224
- src/Cryptol/Symbolic/Value.hs +104/−26
- src/Cryptol/Testing/Concrete.hs +44/−32
- src/Cryptol/Testing/Random.hs +44/−25
- src/Cryptol/Transform/AddModParams.hs +315/−0
- src/Cryptol/Transform/MonoValues.hs +5/−4
- src/Cryptol/Transform/Specialize.hs +7/−7
- src/Cryptol/TypeCheck.hs +34/−16
- src/Cryptol/TypeCheck/AST.hs +86/−16
- src/Cryptol/TypeCheck/CheckModuleInstance.hs +183/−0
- src/Cryptol/TypeCheck/Default.hs +195/−0
- src/Cryptol/TypeCheck/Depends.hs +66/−27
- src/Cryptol/TypeCheck/Error.hs +331/−0
- src/Cryptol/TypeCheck/Infer.hs +272/−200
- src/Cryptol/TypeCheck/InferTypes.hs +79/−355
- src/Cryptol/TypeCheck/Instantiate.hs +73/−54
- src/Cryptol/TypeCheck/Kind.hs +178/−96
- src/Cryptol/TypeCheck/Monad.hs +230/−110
- src/Cryptol/TypeCheck/PP.hs +2/−4
- src/Cryptol/TypeCheck/Parseable.hs +110/−0
- src/Cryptol/TypeCheck/Sanity.hs +39/−33
- src/Cryptol/TypeCheck/SimpType.hs +20/−3
- src/Cryptol/TypeCheck/SimpleSolver.hs +17/−12
- src/Cryptol/TypeCheck/Solve.hs +128/−406
- src/Cryptol/TypeCheck/Solver/Class.hs +147/−3
- src/Cryptol/TypeCheck/Solver/CrySAT.hs +0/−697
- src/Cryptol/TypeCheck/Solver/Improve.hs +12/−2
- src/Cryptol/TypeCheck/Solver/InfNat.hs +21/−1
- src/Cryptol/TypeCheck/Solver/Numeric.hs +228/−48
- src/Cryptol/TypeCheck/Solver/Numeric/AST.hs +0/−425
- src/Cryptol/TypeCheck/Solver/Numeric/Defined.hs +0/−55
- src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs +3/−1
- src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs +0/−171
- src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs +13/−6
- src/Cryptol/TypeCheck/Solver/Numeric/NonLin.hs +0/−281
- src/Cryptol/TypeCheck/Solver/Numeric/SMT.hs +0/−517
- src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs +0/−843
- src/Cryptol/TypeCheck/Solver/Numeric/SimplifyExpr.hs +0/−213
- src/Cryptol/TypeCheck/Solver/SMT.hs +261/−33
- src/Cryptol/TypeCheck/Solver/Selector.hs +48/−8
- src/Cryptol/TypeCheck/Solver/Types.hs +1/−1
- src/Cryptol/TypeCheck/Solver/Utils.hs +1/−1
- src/Cryptol/TypeCheck/Subst.hs +32/−28
- src/Cryptol/TypeCheck/Type.hs +268/−188
- src/Cryptol/TypeCheck/TypeMap.hs +1/−1
- src/Cryptol/TypeCheck/TypeOf.hs +23/−3
- src/Cryptol/TypeCheck/TypePat.hs +29/−0
- src/Cryptol/TypeCheck/Unify.hs +23/−27
- src/Cryptol/Utils/Debug.hs +1/−1
- src/Cryptol/Utils/Ident.hs +85/−17
- src/Cryptol/Utils/Logger.hs +57/−0
- src/Cryptol/Utils/Misc.hs +1/−1
- src/Cryptol/Utils/PP.hs +29/−19
- src/Cryptol/Utils/Panic.hs +15/−39
- src/Cryptol/Version.hs +1/−1
- src/GitRev.hs +1/−1
- utils/CryHtml.hs +83/−0
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2013-2016 Galois Inc.+Copyright (c) 2013-2018 Galois Inc. All rights reserved. Redistribution and use in source and binary forms, with or without
Setup.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Main -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
bench/Main.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Main -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -10,8 +10,8 @@ {-# LANGUAGE ScopedTypeVariables #-} module Main where -import qualified Data.Text.Lazy as T-import qualified Data.Text.Lazy.IO as T+import qualified Data.Text as T+import qualified Data.Text.IO as T import System.FilePath ((</>)) import qualified System.Directory as Dir @@ -23,6 +23,7 @@ import qualified Cryptol.ModuleSystem.Env as M import qualified Cryptol.ModuleSystem.Monad as M import qualified Cryptol.ModuleSystem.NamingEnv as M+import Cryptol.ModuleSystem.Interface (noIfaceParams) import qualified Cryptol.Parser as P import qualified Cryptol.Parser.AST as P@@ -35,6 +36,7 @@ import qualified Cryptol.TypeCheck.AST as T import qualified Cryptol.Utils.Ident as I+import Cryptol.Utils.Logger(quietLogger) import qualified Data.SBV.Dynamic as SBV @@ -46,7 +48,6 @@ 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"@@ -55,7 +56,6 @@ ] , 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"@@ -74,6 +74,13 @@ ] ] +-- | Evaluation options, mostly used by `trace`.+-- Since the benchmarks likely do not use base, these don't matter very much+evOpts :: E.EvalOpts+evOpts = E.EvalOpts { E.evalLogger = quietLogger+ , E.evalPPOpts = E.defaultPPOpts+ }+ -- | Make a benchmark for parsing a Cryptol module parser :: String -> FilePath -> Benchmark parser name path =@@ -100,7 +107,7 @@ } Right pm = P.parseModule cfg bytes menv <- M.initialModuleEnv- (Right ((prims, scm, tcEnv), menv'), _) <- M.runModuleM menv $ withLib $ do+ (Right ((prims, scm, tcEnv), menv'), _) <- M.runModuleM (evOpts,menv) $ withLib $ do -- code from `loadModule` and `checkModule` in -- `Cryptol.ModuleSystem.Base` let pm' = M.addPrelude pm@@ -114,19 +121,19 @@ return (prims, scm, tcEnv) return (prims, scm, tcEnv, menv') in env setup $ \ ~(prims, scm, tcEnv, menv) ->- bench name $ nfIO $ M.runModuleM menv $ withLib $ do+ bench name $ nfIO $ M.runModuleM (evOpts,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+ M.typecheck act scm noIfaceParams tcEnv 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 $ withLib $ do+ (Right (texpr, menv'), _) <- M.runModuleM (evOpts,menv) $ withLib $ do m <- M.loadModuleByPath path M.setFocusedModule (T.mName m) let Right pexpr = P.parseExpr expr@@ -134,7 +141,7 @@ return texpr return (texpr, menv') in env setup $ \ ~(texpr, menv) ->- bench name $ nfIO $ E.runEval $ do+ bench name $ nfIO $ E.runEval evOpts $ do env' <- E.evalDecls (S.allDeclGroups menv) mempty (e :: E.Value) <- E.evalExpr env' texpr E.forceValue e@@ -145,7 +152,7 @@ let withLib = M.withPrependedSearchPath [cd </> "lib"] in let setup = do menv <- M.initialModuleEnv- (Right (texpr, menv'), _) <- M.runModuleM menv $ withLib $ do+ (Right (texpr, menv'), _) <- M.runModuleM (evOpts,menv) $ withLib $ do m <- M.loadModuleByPath path M.setFocusedModule (T.mName m) let Right pexpr = P.parseExpr expr@@ -153,7 +160,7 @@ return texpr return (texpr, menv') in env setup $ \ ~(texpr, menv) ->- bench name $ nfIO $ E.runEval $ do+ bench name $ nfIO $ E.runEval evOpts $ do env' <- E.evalDecls (S.allDeclGroups menv) mempty (e :: S.Value) <- E.evalExpr env' texpr E.io $ SBV.generateSMTBenchmark False $
bench/data/PreludeWithExtras.cry view
@@ -8,7 +8,7 @@ /** * The value corresponding to a numeric type. */-primitive demote : {val, bits} (fin val, fin bits, bits >= width val) => [bits]+primitive number : {val, bits} (fin val, fin bits, bits >= width val) => [bits] infixr 10 || infixr 20 &&
cryptol.cabal view
@@ -1,5 +1,5 @@ Name: cryptol-Version: 2.5.0+Version: 2.6.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-2017 Galois Inc.+Copyright: 2013-2018 Galois Inc. Category: Language Build-type: Simple Cabal-version: >= 1.18 extra-source-files: bench/data/*.cry -data-files: *.cry Cryptol/*.cry *.z3+data-files: *.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.5.0+ tag: 2.6.0 flag static default: False@@ -41,12 +41,11 @@ library Default-language:- Haskell98+ Haskell2010 Build-depends: base >= 4.8 && < 5,- base-compat >= 0.6,+ base-compat >= 0.6 && < 0.10, bytestring >= 0.10, array >= 0.4,- async >= 2.0, containers >= 0.5, deepseq >= 1.3, directory >= 1.2.2.0,@@ -56,25 +55,20 @@ heredoc >= 0.2, monad-control >= 1.0, monadLib >= 3.7.2,- old-time >= 1.1,- presburger >= 1.3, pretty >= 1.1, process >= 1.2,- QuickCheck >= 2.7, random >= 1.0.1,- sbv >= 7.0,- smtLib >= 1.0.7,- simple-smt >= 0.7.0,- syb >= 0.4,+ sbv >= 7.7,+ simple-smt >= 0.7.1,+ strict, text >= 1.1,- template-haskell, tf-random >= 0.5,- transformers >= 0.3, transformers-base >= 0.4,- utf8-string >= 0.3, mtl >= 2.2.1,- time >= 1.6.0.1+ time >= 1.6.0.1,+ panic >= 0.3 + Build-tools: alex, happy hs-source-dirs: src @@ -84,11 +78,13 @@ Cryptol.Parser, Cryptol.Parser.Lexer, Cryptol.Parser.AST,+ Cryptol.Parser.Fixity, Cryptol.Parser.Position, Cryptol.Parser.Names, Cryptol.Parser.Name, Cryptol.Parser.NoPat, Cryptol.Parser.NoInclude,+ Cryptol.Parser.Selector, Cryptol.Parser.Utils, Cryptol.Parser.Unlit, @@ -98,6 +94,7 @@ Cryptol.Utils.Debug, Cryptol.Utils.Misc, Cryptol.Utils.Patterns,+ Cryptol.Utils.Logger, Cryptol.Version, Cryptol.ModuleSystem,@@ -108,15 +105,20 @@ Cryptol.ModuleSystem.Name, Cryptol.ModuleSystem.NamingEnv, Cryptol.ModuleSystem.Renamer,+ Cryptol.ModuleSystem.Exports,+ Cryptol.ModuleSystem.InstantiateModule, Cryptol.TypeCheck, Cryptol.TypeCheck.Type, Cryptol.TypeCheck.TypePat, Cryptol.TypeCheck.SimpType, Cryptol.TypeCheck.AST,+ Cryptol.TypeCheck.Parseable, Cryptol.TypeCheck.Monad, Cryptol.TypeCheck.Infer,+ Cryptol.TypeCheck.CheckModuleInstance, Cryptol.TypeCheck.InferTypes,+ Cryptol.TypeCheck.Error, Cryptol.TypeCheck.Kind, Cryptol.TypeCheck.Subst, Cryptol.TypeCheck.Instantiate,@@ -124,6 +126,7 @@ Cryptol.TypeCheck.Depends, Cryptol.TypeCheck.PP, Cryptol.TypeCheck.Solve,+ Cryptol.TypeCheck.Default, Cryptol.TypeCheck.SimpleSolver, Cryptol.TypeCheck.TypeMap, Cryptol.TypeCheck.TypeOf,@@ -138,20 +141,15 @@ Cryptol.TypeCheck.Solver.Numeric, Cryptol.TypeCheck.Solver.Improve,- Cryptol.TypeCheck.Solver.CrySAT,- Cryptol.TypeCheck.Solver.Numeric.AST,- Cryptol.TypeCheck.Solver.Numeric.ImportExport,- Cryptol.TypeCheck.Solver.Numeric.Defined, Cryptol.TypeCheck.Solver.Numeric.Fin, Cryptol.TypeCheck.Solver.Numeric.Interval,- Cryptol.TypeCheck.Solver.Numeric.Simplify,- Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr,- Cryptol.TypeCheck.Solver.Numeric.NonLin,- Cryptol.TypeCheck.Solver.Numeric.SMT, Cryptol.Transform.MonoValues, Cryptol.Transform.Specialize,+ Cryptol.Transform.AddModParams, + Cryptol.IR.FreeVars,+ Cryptol.Eval, Cryptol.Eval.Arch, Cryptol.Eval.Env,@@ -177,17 +175,16 @@ Paths_cryptol, GitRev - GHC-options: -Wall -O2 -fsimpl-tick-factor=140+ GHC-options: -Wall -fsimpl-tick-factor=140 if impl(ghc >= 8.0.1) ghc-options: -Wno-redundant-constraints- ghc-prof-options: -fprof-auto if flag(relocatable) cpp-options: -DRELOCATABLE executable cryptol Default-language:- Haskell98+ Haskell2010 Main-is: Main.hs hs-source-dirs: cryptol Other-modules: OptParser,@@ -199,25 +196,27 @@ , base-compat , containers , cryptol- , deepseq , directory , filepath , haskeline- , monadLib , monad-control- , process- , random- , sbv >= 7.0- , tf-random+ , text , transformers- GHC-options: -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"+ GHC-options: -Wall -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 +executable cryptol-html+ Default-language:+ Haskell2010+ main-is: CryHtml.hs+ hs-source-dirs: utils+ build-depends: base, text, cryptol, blaze-html+ GHC-options: -Wall+ -- Note: the Cryptol server needs to be updated to some new APIs. --executable cryptol-server -- main-is: Main.hs@@ -225,10 +224,9 @@ -- other-modules: Cryptol.Aeson -- default-language: Haskell2010 -- default-extensions: OverloadedStrings--- GHC-options: -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"+-- GHC-options: -Wall -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)@@ -255,10 +253,9 @@ main-is: Main.hs hs-source-dirs: bench default-language: Haskell2010- GHC-options: -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"+ GHC-options: -Wall -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 build-depends: base@@ -267,5 +264,5 @@ , deepseq , directory , filepath- , sbv >= 7.0+ , sbv >= 7.7 , text
cryptol/Main.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Main -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
cryptol/OptParser.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : OptParser -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -10,6 +10,7 @@ module OptParser where import Data.Monoid (Endo(..))+import Data.Semigroup import Prelude () import Prelude.Compat@@ -18,13 +19,16 @@ = OptSuccess (Endo opt) | OptFailure [String] -instance Monoid (OptParser opt) where- mempty = OptSuccess mempty- l `mappend` r = case (l,r) of+instance Semigroup (OptParser opt) where+ l <> r = case (l,r) of (OptSuccess f,OptSuccess g) -> OptSuccess (f `mappend` g) (OptFailure a,OptFailure b) -> OptFailure (a `mappend` b) (OptFailure _,_) -> l (_,OptFailure _) -> r++instance Monoid (OptParser opt) where+ mempty = OptSuccess mempty+ mappend = (<>) runOptParser :: opt -> OptParser opt -> Either [String] opt runOptParser def parse = case parse of
cryptol/REPL/Haskeline.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : REPL.Haskeline -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -12,10 +12,13 @@ module REPL.Haskeline where +import Cryptol.Prims.Syntax (primTyList, primTyIdent) import Cryptol.REPL.Command import Cryptol.REPL.Monad import Cryptol.REPL.Trie import Cryptol.Utils.PP+import Cryptol.Utils.Logger(stdoutLogger)+import Cryptol.Utils.Ident(modNameToText, interactiveName, isInfixIdent) import qualified Control.Exception as X import Control.Monad (guard, join)@@ -25,6 +28,8 @@ import Data.Maybe(isJust) import Data.Function (on) import Data.List (isPrefixOf,nub,sortBy,sort)+import qualified Data.Set as Set+import qualified Data.Text as T (unpack) import System.IO (stdout) import System.Console.ANSI (setTitle, hSupportsANSI) import System.Console.Haskeline@@ -37,7 +42,7 @@ import Prelude.Compat --- | One REPL invocation, either form a file or from the terminal.+-- | One REPL invocation, either from a file or from the terminal. crySession :: Maybe FilePath -> Bool -> REPL CommandExitCode crySession mbBatch stopOnError = do settings <- io (setHistoryFile (replSettings isBatch))@@ -111,7 +116,7 @@ -- | Haskeline-specific repl implementation. repl :: Cryptolrc -> Maybe FilePath -> Bool -> REPL () -> IO CommandExitCode repl cryrc mbBatch stopOnError begin =- runREPL (isJust mbBatch) $+ runREPL (isJust mbBatch) stdoutLogger $ do status <- loadCryRC cryrc case status of CommandOk -> begin >> crySession mbBatch stopOnError@@ -213,11 +218,7 @@ cmdComp prefix c = do cName <- cNames c guard (prefix `isPrefixOf` cName)- return $ Completion- { replacement = drop (length prefix) cName- , display = cName- , isFinished = True- }+ return $ nameComp prefix cName -- | Dispatch to a completion function based on the kind of completion the -- command is expecting.@@ -226,9 +227,11 @@ ExprArg _ -> completeExpr cursor DeclsArg _ -> (completeExpr +++ completeType) cursor ExprTypeArg _ -> (completeExpr +++ completeType) cursor+ ModNameArg _ -> completeModName cursor FilenameArg _ -> completeFilename cursor ShellArg _ -> completeFilename cursor OptionArg _ -> completeOption cursor+ HelpArg _ -> completeHelp cursor NoArg _ -> return (l,[]) FileExprArg _ -> completeExpr cursor @@ -258,6 +261,37 @@ let n = reverse (takeIdent l) vars = filter (n `isPrefixOf`) ns return (l,map (nameComp n) vars)++-- | Complete a name for which we can show REPL help documentation.+completeHelp :: CompletionFunc REPL+completeHelp (l, _) = do+ ns1 <- getExprNames+ ns2 <- getTypeNames+ let ns3 = primTyNames+ let ns4 = concatMap cNames (nub (findCommand ":"))+ let ns = Set.toAscList (Set.fromList (ns1 ++ ns2 ++ ns3)) ++ ns4+ let n = reverse l+ case break isSpace n of+ (":set", _ : n') ->+ do let n'' = dropWhile isSpace n'+ let vars = map optName (lookupTrie (dropWhile isSpace n') userOptions)+ return (l, map (nameComp n'') vars)+ _ ->+ do let vars = filter (n `isPrefixOf`) ns+ return (l, map (nameComp n) vars)++primTyNames :: [String]+primTyNames = map (showIdent . primTyIdent) primTyList+ where showIdent i = show (optParens (isInfixIdent i) (pp i))++-- | Complete a name from the list of loaded modules.+completeModName :: CompletionFunc REPL+completeModName (l, _) = do+ ms <- getModNames+ let ns = map (T.unpack . modNameToText) (interactiveName : ms)+ n = reverse (takeWhile (not . isSpace) l)+ vars = filter (n `isPrefixOf`) ns+ return (l, map (nameComp n) vars) -- | Generate a completion from a prefix and a name. nameComp :: String -> String -> Completion
cryptol/REPL/Logo.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : REPL.Logo -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -20,8 +20,8 @@ type Logo = [String] -logo :: Bool -> Logo-logo useColor =+logo :: Bool -> (String -> [String]) -> Logo+logo useColor mk = [ sgr [SetColor Foreground Dull White] ++ l | l <- ws ] ++ [ sgr [SetColor Foreground Vivid Blue ] ++ l | l <- vs ] ++ [ sgr [SetColor Foreground Dull Blue ] ++ l | l <- ds ]@@ -35,7 +35,17 @@ ver = sgr [SetColor Foreground Dull White] ++ replicate (lineLen - 20 - length versionText) ' ' ++ versionText- ls =+ ls = mk ver+ slen = length ls `div` 3+ (ws,rest) = splitAt slen ls+ (vs,ds) = splitAt slen rest+ lineLen = length (head ls)++displayLogo :: Bool -> REPL ()+displayLogo useColor = unlessBatch (io (mapM_ putStrLn (logo useColor logo2)))++logo1 :: String -> [String]+logo1 ver = [ " _ _" , " ___ _ __ _ _ _ __ | |_ ___ | |" , " / __| \'__| | | | \'_ \\| __/ _ \\| |"@@ -43,10 +53,13 @@ , " \\___|_| \\__, | .__/ \\__\\___/|_|" , " |___/|_| " ++ ver ]- slen = length ls `div` 3- (ws,rest) = splitAt slen ls- (vs,ds) = splitAt slen rest- lineLen = length (head ls) -displayLogo :: Bool -> REPL ()-displayLogo useColor = unlessBatch (io (mapM_ putStrLn (logo useColor)))+logo2 :: String -> [String]+logo2 ver =+ [ "┏━╸┏━┓╻ ╻┏━┓╺┳╸┏━┓╻ "+ , "┃ ┣┳┛┗┳┛┣━┛ ┃ ┃ ┃┃ "+ , "┗━╸╹┗╸ ╹ ╹ ╹ ┗━┛┗━╸"+ , ver+ ]++
dist/build/Cryptol/Parser.hs view
@@ -1,3855 +1,4207 @@ {-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}--- |--- Module : $Header$--- Copyright : (c) 2013-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable--{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE Trustworthy #-}-module Cryptol.Parser- ( parseModule- , parseProgram, parseProgramWith- , parseExpr, parseExprWith- , parseDecl, parseDeclWith- , parseDecls, parseDeclsWith- , parseLetDecl, parseLetDeclWith- , parseRepl, parseReplWith- , parseSchema, parseSchemaWith- , parseModName, parseHelpName- , ParseError(..), ppError- , Layout(..)- , Config(..), defaultConfig- , guessPreProc, PreProc(..)- ) where--import Control.Applicative as A-import Data.Maybe(fromMaybe)-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as T-import qualified Data.Text as ST-import Control.Monad(liftM2,msum)--import Cryptol.Prims.Syntax-import Cryptol.Parser.AST-import Cryptol.Parser.Position-import Cryptol.Parser.LexerUtils hiding (mkIdent)-import Cryptol.Parser.ParserUtils-import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)--import Paths_cryptol-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))-import Control.Monad (ap)---- parser produced by Happy Version 1.19.5--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 ---{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)-#else-#define LT(n,m) (n Happy_GHC_Exts.<# m)-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)-#define EQ(n,m) (n Happy_GHC_Exts.==# m)-#endif--{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList-------{-# LINE 67 "templates/GenericTemplate.hs" #-}---{-# LINE 77 "templates/GenericTemplate.hs" #-}-----------infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser). We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =- happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = - (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st- = {- nothing -}- -- case action of- 0# -> {- nothing -}- happyFail i tk st- -1# -> {- nothing -}- happyAccept i tk st- n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}- - (happyReduceArr Happy_Data_Array.! rule) i tk st- where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))- n -> {- nothing -}- -- happyShift new_state i tk st- where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))- where off = indexShortOffAddr happyActOffsets st- off_i = (off Happy_GHC_Exts.+# i)- check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))- then EQ(indexShortOffAddr happyCheck off_i, i)- else False- action- | check = indexShortOffAddr happyTable off_i- | otherwise = indexShortOffAddr happyDefActions st---indexShortOffAddr (HappyA# arr) off =- Happy_GHC_Exts.narrow16Int# i- where- i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)- high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))- low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))- off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)---{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "shifting the error token" $- happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =- happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk- = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')- = let r = fn v1 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')- = let r = fn v1 v2 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')- = let r = fn v1 v2 v3 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk- = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of- sts1@((HappyCons (st1@(action)) (_))) ->- let r = fn stk in -- it doesn't hurt to always seq here...- happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk in- happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))--happyMonad2Reduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk-- off = indexShortOffAddr happyGotoOffsets st1- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i---- in- happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))--happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = - {- nothing -}- happyDoAction j tk new_state- where off = indexShortOffAddr happyGotoOffsets st- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "failing" $ - happyError_ i tk--{- We don't need state discarding for our restricted implementation of- "error". In fact, it can cause some bogus parses, so I've disabled it- for now --SDM---- discard a state-happyFail 0# tk old_st (HappyCons ((action)) (sts)) - (saved_tok `HappyStk` _ `HappyStk` stk) =--- trace ("discarding state, depth " ++ show (length stk)) $- happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,--- save the old token and carry on.-happyFail i tk (action) sts stk =+{-# OPTIONS -XMagicHash -XBangPatterns -XTypeSynonymInstances -XFlexibleInstances -cpp #-}+#if __GLASGOW_HASKELL__ >= 710+{-# OPTIONS_GHC -XPartialTypeSignatures #-}+#endif+-- |+-- Module : Cryptol.Parser+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable++{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE Trustworthy #-}+module Cryptol.Parser+ ( parseModule+ , parseProgram, parseProgramWith+ , parseExpr, parseExprWith+ , parseDecl, parseDeclWith+ , parseDecls, parseDeclsWith+ , parseLetDecl, parseLetDeclWith+ , parseRepl, parseReplWith+ , parseSchema, parseSchemaWith+ , parseModName, parseHelpName+ , ParseError(..), ppError+ , Layout(..)+ , Config(..), defaultConfig+ , guessPreProc, PreProc(..)+ ) where++import Control.Applicative as A+import Data.Maybe(fromMaybe)+import Data.Text(Text)+import qualified Data.Text as T+import Control.Monad(liftM2,msum)++import Cryptol.Prims.Syntax(TFun(..))+import Cryptol.Parser.AST+import Cryptol.Parser.Position+import Cryptol.Parser.LexerUtils hiding (mkIdent)+import Cryptol.Parser.ParserUtils+import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)+import Cryptol.Utils.Ident(paramInstModName)++import Paths_cryptol+import qualified Data.Array as Happy_Data_Array+import qualified Data.Bits as Bits+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.9++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn15 :: (Module PName) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> (Module PName)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (([Located Import], [TopDecl PName])) -> (HappyAbsSyn )+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (([Located Import], [TopDecl PName]))+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: ([Located Import]) -> (HappyAbsSyn )+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> ([Located Import])+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (Located Import) -> (HappyAbsSyn )+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn ) -> (Located Import)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: (Maybe (Located ModName)) -> (HappyAbsSyn )+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn ) -> (Maybe (Located ModName))+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: (Maybe (Located ImportSpec)) -> (HappyAbsSyn )+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn ) -> (Maybe (Located ImportSpec))+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: ([LIdent]) -> (HappyAbsSyn )+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn ) -> ([LIdent])+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: ([Ident] -> ImportSpec) -> (HappyAbsSyn )+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn ) -> ([Ident] -> ImportSpec)+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: (Program PName) -> (HappyAbsSyn )+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn ) -> (Program PName)+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: (Program PName) -> (HappyAbsSyn )+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn ) -> (Program PName)+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: ([TopDecl PName]) -> (HappyAbsSyn )+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn ) -> ([TopDecl PName])+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: (TopDecl PName) -> (HappyAbsSyn )+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn ) -> (TopDecl PName)+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: (Located String) -> (HappyAbsSyn )+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn ) -> (Located String)+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: (Maybe (Located String)) -> (HappyAbsSyn )+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn ) -> (Maybe (Located String))+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: (Decl PName) -> (HappyAbsSyn )+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn ) -> (Decl PName)+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: (Decl PName) -> (HappyAbsSyn )+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn ) -> (Decl PName)+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: (Newtype PName) -> (HappyAbsSyn )+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn ) -> (Newtype PName)+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: ([Named (Type PName)]) -> (HappyAbsSyn )+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn ) -> ([Named (Type PName)])+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: ([ LPName ]) -> (HappyAbsSyn )+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn ) -> ([ LPName ])+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: (LPName) -> (HappyAbsSyn )+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn ) -> (LPName)+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: ([Pattern PName]) -> (HappyAbsSyn )+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn ) -> ([Pattern PName])+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: ([Pattern PName]) -> (HappyAbsSyn )+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn ) -> ([Pattern PName])+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: ([Decl PName]) -> (HappyAbsSyn )+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn ) -> ([Decl PName])+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: ([Decl PName]) -> (HappyAbsSyn )+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn ) -> ([Decl PName])+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: ([Decl PName]) -> (HappyAbsSyn )+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn ) -> ([Decl PName])+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: (ReplInput PName) -> (HappyAbsSyn )+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn ) -> (ReplInput PName)+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (Expr PName) -> (HappyAbsSyn )+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn ) -> (Expr PName)+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: ([(Expr PName, Expr PName)]) -> (HappyAbsSyn )+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn ) -> ([(Expr PName, Expr PName)])+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: ((Expr PName, Expr PName)) -> (HappyAbsSyn )+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn ) -> ((Expr PName, Expr PName))+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: (Expr PName) -> (HappyAbsSyn )+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn ) -> (Expr PName)+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: (Expr PName) -> (HappyAbsSyn )+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn ) -> (Expr PName)+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: (Expr PName) -> (HappyAbsSyn )+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn ) -> (Expr PName)+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: (Expr PName) -> (HappyAbsSyn )+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn ) -> (Expr PName)+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: (LPName) -> (HappyAbsSyn )+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn ) -> (LPName)+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: (LPName) -> (HappyAbsSyn )+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn ) -> (LPName)+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: (LPName) -> (HappyAbsSyn )+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn ) -> (LPName)+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: (LPName) -> (HappyAbsSyn )+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn ) -> (LPName)+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: ([LPName]) -> (HappyAbsSyn )+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn ) -> ([LPName])+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: ([Expr PName]) -> (HappyAbsSyn )+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn ) -> ([Expr PName])+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: (Expr PName) -> (HappyAbsSyn )+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn ) -> (Expr PName)+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: ([(Bool, Integer)]) -> (HappyAbsSyn )+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn ) -> ([(Bool, Integer)])+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: ((Bool, Integer)) -> (HappyAbsSyn )+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn ) -> ((Bool, Integer))+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: (Located Selector) -> (HappyAbsSyn )+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn ) -> (Located Selector)+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: ([Expr PName]) -> (HappyAbsSyn )+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn ) -> ([Expr PName])+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: (Named (Expr PName)) -> (HappyAbsSyn )+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn ) -> (Named (Expr PName))+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyIn67 :: ([Named (Expr PName)]) -> (HappyAbsSyn )+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn67 #-}+happyOut67 :: (HappyAbsSyn ) -> ([Named (Expr PName)])+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut67 #-}+happyIn68 :: (Expr PName) -> (HappyAbsSyn )+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn68 #-}+happyOut68 :: (HappyAbsSyn ) -> (Expr PName)+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut68 #-}+happyIn69 :: ([[Match PName]]) -> (HappyAbsSyn )+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn69 #-}+happyOut69 :: (HappyAbsSyn ) -> ([[Match PName]])+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut69 #-}+happyIn70 :: ([Match PName]) -> (HappyAbsSyn )+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn70 #-}+happyOut70 :: (HappyAbsSyn ) -> ([Match PName])+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut70 #-}+happyIn71 :: (Match PName) -> (HappyAbsSyn )+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn71 #-}+happyOut71 :: (HappyAbsSyn ) -> (Match PName)+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut71 #-}+happyIn72 :: (Pattern PName) -> (HappyAbsSyn )+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn72 #-}+happyOut72 :: (HappyAbsSyn ) -> (Pattern PName)+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut72 #-}+happyIn73 :: (Pattern PName) -> (HappyAbsSyn )+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn73 #-}+happyOut73 :: (HappyAbsSyn ) -> (Pattern PName)+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut73 #-}+happyIn74 :: (Pattern PName) -> (HappyAbsSyn )+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn74 #-}+happyOut74 :: (HappyAbsSyn ) -> (Pattern PName)+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut74 #-}+happyIn75 :: ([Pattern PName]) -> (HappyAbsSyn )+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn75 #-}+happyOut75 :: (HappyAbsSyn ) -> ([Pattern PName])+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut75 #-}+happyIn76 :: (Named (Pattern PName)) -> (HappyAbsSyn )+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn76 #-}+happyOut76 :: (HappyAbsSyn ) -> (Named (Pattern PName))+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut76 #-}+happyIn77 :: ([Named (Pattern PName)]) -> (HappyAbsSyn )+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn77 #-}+happyOut77 :: (HappyAbsSyn ) -> ([Named (Pattern PName)])+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut77 #-}+happyIn78 :: (Schema PName) -> (HappyAbsSyn )+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn78 #-}+happyOut78 :: (HappyAbsSyn ) -> (Schema PName)+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut78 #-}+happyIn79 :: (Located [TParam PName]) -> (HappyAbsSyn )+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn79 #-}+happyOut79 :: (HappyAbsSyn ) -> (Located [TParam PName])+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut79 #-}+happyIn80 :: (Located [Prop PName]) -> (HappyAbsSyn )+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn80 #-}+happyOut80 :: (HappyAbsSyn ) -> (Located [Prop PName])+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut80 #-}+happyIn81 :: (Located Kind) -> (HappyAbsSyn )+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn81 #-}+happyOut81 :: (HappyAbsSyn ) -> (Located Kind)+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut81 #-}+happyIn82 :: (TParam PName) -> (HappyAbsSyn )+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn82 #-}+happyOut82 :: (HappyAbsSyn ) -> (TParam PName)+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut82 #-}+happyIn83 :: ([TParam PName]) -> (HappyAbsSyn )+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn83 #-}+happyOut83 :: (HappyAbsSyn ) -> ([TParam PName])+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut83 #-}+happyIn84 :: (TParam PName) -> (HappyAbsSyn )+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn84 #-}+happyOut84 :: (HappyAbsSyn ) -> (TParam PName)+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut84 #-}+happyIn85 :: ([TParam PName]) -> (HappyAbsSyn )+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn85 #-}+happyOut85 :: (HappyAbsSyn ) -> ([TParam PName])+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut85 #-}+happyIn86 :: (Type PName) -> (HappyAbsSyn )+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn86 #-}+happyOut86 :: (HappyAbsSyn ) -> (Type PName)+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut86 #-}+happyIn87 :: (Type PName) -> (HappyAbsSyn )+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn87 #-}+happyOut87 :: (HappyAbsSyn ) -> (Type PName)+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut87 #-}+happyIn88 :: (Type PName) -> (HappyAbsSyn )+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn88 #-}+happyOut88 :: (HappyAbsSyn ) -> (Type PName)+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut88 #-}+happyIn89 :: ([ Type PName ]) -> (HappyAbsSyn )+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn89 #-}+happyOut89 :: (HappyAbsSyn ) -> ([ Type PName ])+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut89 #-}+happyIn90 :: (Located [Type PName]) -> (HappyAbsSyn )+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn90 #-}+happyOut90 :: (HappyAbsSyn ) -> (Located [Type PName])+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut90 #-}+happyIn91 :: ([Type PName]) -> (HappyAbsSyn )+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn91 #-}+happyOut91 :: (HappyAbsSyn ) -> ([Type PName])+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut91 #-}+happyIn92 :: (Named (Type PName)) -> (HappyAbsSyn )+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn92 #-}+happyOut92 :: (HappyAbsSyn ) -> (Named (Type PName))+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut92 #-}+happyIn93 :: ([Named (Type PName)]) -> (HappyAbsSyn )+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn93 #-}+happyOut93 :: (HappyAbsSyn ) -> ([Named (Type PName)])+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut93 #-}+happyIn94 :: (Located Ident) -> (HappyAbsSyn )+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn94 #-}+happyOut94 :: (HappyAbsSyn ) -> (Located Ident)+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut94 #-}+happyIn95 :: (LPName) -> (HappyAbsSyn )+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn95 #-}+happyOut95 :: (HappyAbsSyn ) -> (LPName)+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut95 #-}+happyIn96 :: (Located ModName) -> (HappyAbsSyn )+happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn96 #-}+happyOut96 :: (HappyAbsSyn ) -> (Located ModName)+happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut96 #-}+happyIn97 :: (Located ModName) -> (HappyAbsSyn )+happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn97 #-}+happyOut97 :: (HappyAbsSyn ) -> (Located ModName)+happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut97 #-}+happyIn98 :: (Located PName) -> (HappyAbsSyn )+happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn98 #-}+happyOut98 :: (HappyAbsSyn ) -> (Located PName)+happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut98 #-}+happyIn99 :: (Located PName) -> (HappyAbsSyn )+happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn99 #-}+happyOut99 :: (HappyAbsSyn ) -> (Located PName)+happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut99 #-}+happyIn100 :: (Type PName) -> (HappyAbsSyn )+happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn100 #-}+happyOut100 :: (HappyAbsSyn ) -> (Type PName)+happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut100 #-}+happyIn101 :: (Named (Type PName)) -> (HappyAbsSyn )+happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn101 #-}+happyOut101 :: (HappyAbsSyn ) -> (Named (Type PName))+happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut101 #-}+happyIn102 :: ([Named (Type PName)]) -> (HappyAbsSyn )+happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn102 #-}+happyOut102 :: (HappyAbsSyn ) -> ([Named (Type PName)])+happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut102 #-}+happyInTok :: (Located Token) -> (HappyAbsSyn )+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> (Located Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyExpList :: HappyAddr+happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x40\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xe7\x01\x09\x42\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xcf\x01\x48\x82\x50\x22\x60\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xce\x03\x12\x84\x00\x02\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x1e\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xe7\x00\x26\x41\x28\x11\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x07\x00\x09\x42\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x39\x00\x08\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x01\x40\x80\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x10\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xce\x01\x40\x82\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x07\x00\x09\x42\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x60\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\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\xf8\x1c\x00\x24\x08\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x04\x21\x80\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x80\x24\x08\x25\x02\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xe7\x00\x24\x43\x28\x11\x30\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x07\x20\x09\x46\x89\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x08\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x40\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x0e\x00\x02\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x03\x80\x04\xa1\x04\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x00\x24\x08\x25\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x0f\x48\x10\x02\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x90\x20\x04\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf3\x80\x04\x21\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x64\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x20\xc1\x08\x20\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x07\x00\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf7\x80\x04\x21\x80\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x3c\x20\x41\x08\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x00\x01\x00\x08\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x7c\x0f\x48\x10\x02\x08\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x7b\x40\x82\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x20\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x03\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x40\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x40\x82\x11\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x20\x40\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x07\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x90\x20\x04\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x03\x90\x04\xa1\x44\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x24\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x48\x10\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0e\x00\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x07\x00\x09\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x07\x00\x09\x42\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x00\x24\x08\x25\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xe7\x00\x20\x41\x28\x01\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xc0\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x07\x00\x09\x42\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x38\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0e\x00\x12\x84\x12\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\xe0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x04\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x39\x00\x48\x10\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x03\x80\x04\x21\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x1c\x00\x24\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xce\x01\x40\x82\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\xf8\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x03\x80\x04\x21\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x1c\x00\x24\x08\x01\x84\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x39\x00\x49\x10\x4a\x04\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xcf\x01\x48\x82\x50\x22\x60\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0e\x40\x12\x84\x12\x01\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x73\x00\x92\x20\x94\x08\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x80\x24\x08\x25\x02\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xe7\x00\x24\x41\x28\x11\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x48\x10\x02\x08\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xcf\x01\x48\x82\x50\x22\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x80\x24\x08\x25\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x07\x20\x09\x42\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\xc0\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x03\x90\x04\xa1\x44\xc0\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x9c\x07\x24\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xe7\x01\x09\x42\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x80\x24\x08\x25\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x20\x40\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x08\x10\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0e\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x24\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x07\x00\x09\x42\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xce\x01\x40\x82\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x04\x21\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xe7\x01\x09\xc2\x00\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x0f\x48\x10\x02\x28\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x7b\x40\x82\x10\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x1e\x90\x20\x04\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x7b\x40\x82\x10\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xdf\x03\x12\x84\x00\x02\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x1e\x90\x20\x04\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xde\x03\x12\x84\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x10\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x04\x21\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x1e\x90\x20\x0c\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x07\x20\x09\x42\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x07\x00\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x39\x00\x48\x10\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0e\x40\x12\x84\x12\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x20\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0e\x40\x12\x84\x12\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x07\x20\x09\x42\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xce\x01\x40\x82\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\xf7\x80\x04\x21\x80\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xcf\x01\x48\x82\x50\x22\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x90\x20\x04\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x03\x90\x04\xa1\x44\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe7\x00\x20\x41\x08\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x38\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0e\x40\x12\x84\x12\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x10\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0e\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1c\x80\x24\x08\x25\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0e\x00\x12\x84\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x73\x00\x90\x20\x04\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\xf7\x80\x04\x21\x80\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x1c\x00\x24\x08\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++{-# NOINLINE happyExpListPerState #-}+happyExpListPerState st =+ token_strs_expected+ where token_strs = ["error","%dummy","%start_vmodule","%start_program","%start_programLayout","%start_expr","%start_decl","%start_decls","%start_declsLayout","%start_letDecl","%start_repl","%start_schema","%start_modName","%start_helpName","vmodule","vmod_body","vimports","import","mbAs","mbImportSpec","name_list","mbHiding","program","program_layout","top_decls","vtop_decls","vtop_decl","top_decl","private_decls","prim_bind","parameter_decls","par_decls","par_decl","doc","mbDoc","decl","let_decl","newtype","newtype_body","vars_comma","var","apats","apats1","decls","vdecls","decls_layout","repl","expr","ifBranches","ifBranch","cexpr","sig_expr","iexpr","expr10","qop","op","pat_op","other_op","ops","aexprs","aexpr","poly_terms","poly_term","selector","tuple_exprs","field_expr","field_exprs","list_expr","list_alts","matches","match","pat","ipat","apat","tuple_pats","field_pat","field_pats","schema","schema_vars","schema_quals","kind","schema_param","schema_params","tysyn_param","tysyn_params","type","app_type","atype","atypes","dimensions","tuple_types","field_type","field_types","ident","name","smodName","modName","qname","help_name","tick_ty","field_ty_val","field_ty_vals","NUM","STRLIT","CHARLIT","IDENT","QIDENT","'include'","'import'","'as'","'hiding'","'private'","'parameter'","'property'","'infix'","'infixl'","'infixr'","'type'","'newtype'","'module'","'where'","'let'","'if'","'then'","'else'","'x'","'primitive'","'constraint'","'['","']'","'<-'","'..'","'...'","'|'","'('","')'","','","';'","'.'","'{'","'}'","'<|'","'|>'","'='","'`'","':'","'->'","'=>'","'\\\\'","'_'","'v{'","'v}'","'v;'","'+'","'*'","'^^'","'-'","'~'","'#'","OP","QOP","DOC","%eof"]+ bit_start = st * 163+ bit_end = (st + 1) * 163+ read_bit = readArrayBit happyExpList+ bits = map read_bit [bit_start..bit_end - 1]+ bits_indexed = zip bits [0..162]+ token_strs_expected = concatMap f bits_indexed+ f (False, _) = []+ f (True, nr) = [token_strs !! nr]++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\xef\xff\x37\x01\xdd\xff\x7d\x03\x7e\x06\x7e\x06\xf2\xff\x51\x00\xb9\x02\xcf\x06\xce\x02\xf2\x02\x5c\x00\xce\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x60\x07\x7a\x00\xea\x06\xea\x06\x10\x09\x8f\x00\x00\x00\x05\x07\x20\x07\x00\x00\x00\x00\x3b\x07\x99\x06\x3c\x02\x00\x00\x00\x00\xdc\x00\xde\x00\x00\x00\x00\x00\x02\x09\x00\x00\x7a\x08\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x08\x7d\x03\xea\x02\x78\x02\x30\x03\x0a\x00\xe9\x03\x3e\x08\xdc\x03\xdc\x03\x17\x01\x17\x01\x31\x04\x1a\x01\xfc\xff\x3e\x08\x7a\x01\x23\x00\x13\x06\xf3\x08\x00\x00\x65\x01\x85\x01\x92\x01\x65\x04\x09\x01\xf6\x03\x61\x03\x00\x00\x75\x01\xf4\xff\x75\x01\xef\x01\x75\x01\x51\x01\x97\x01\x00\x00\x00\x00\xd2\x01\x00\x00\xe4\x01\x00\x00\xc4\x01\xce\x02\xba\x01\x9a\x01\x4e\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x06\x86\x02\x00\x00\xce\x02\xea\x01\xf1\x01\x2f\x00\x00\x00\xd0\x01\x00\x00\xe7\x01\x16\x01\x00\x00\x60\x00\x00\x00\xd3\x00\xfb\x01\x00\x00\x29\x02\x71\x00\xeb\xff\x00\x00\x89\x00\x00\x00\x00\x08\x00\x00\xc5\x00\xb3\x01\x00\x00\xbe\x06\x95\x08\xfb\x08\xfb\x08\xfb\x08\x3e\x08\x7d\x03\x3e\x08\x24\x02\x28\x02\x3e\x08\x01\x01\xb7\x03\x56\x07\x00\x00\x00\x00\x74\x01\x00\x00\x00\x00\x00\x00\x37\x02\x00\x00\x00\x00\x00\x00\x71\x07\xb4\x06\xef\x00\x00\x00\x00\x00\x3b\x02\x00\x00\x00\x00\xe5\x00\x1b\x08\x00\x00\xf6\xff\x55\x02\x18\x02\x00\x00\xdc\x03\xdc\x03\x1f\x03\x51\x02\x62\x02\x00\x00\x40\x01\x56\x00\x00\x00\xff\x00\x3e\x08\xff\x02\x63\x02\xdc\x03\x71\x07\x00\x00\x55\x01\x00\x00\xcd\x01\x71\x02\x7d\x08\x71\x06\x20\x02\x00\x00\x87\x03\x24\x03\x00\x00\x8c\x07\x00\x00\xa7\x07\x00\x00\xa7\x07\xa7\x07\xa7\x07\x00\x00\xfb\x08\xa7\x07\x10\x09\x00\x00\x87\x02\xa5\x02\x99\x02\x00\x00\xfb\x08\x00\x00\xfb\x08\xe1\x05\x37\x06\x00\x00\x53\x08\xad\x02\x00\x00\x00\x00\xa7\x07\x00\x00\xa7\x07\x98\x03\x95\x08\x00\x00\x95\x08\x00\x00\xfb\x08\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x02\x7d\x03\xc1\x03\x7d\x03\x7d\x03\x00\x00\x7d\x03\x1b\x03\x00\x00\x3e\x08\x7d\x03\x00\x00\x00\x00\x00\x00\x7d\x03\xcb\x02\x7d\x03\x95\x08\x00\x00\xf7\x02\x00\x00\x70\x00\x64\x07\xf9\x01\xda\x02\x00\x00\x46\x02\x00\x00\x4a\x07\xc1\x03\x7e\x06\x00\x00\x7e\x06\x00\x00\x00\x00\x00\x00\xfb\x08\xdc\x01\x7d\x03\x00\x00\xd8\x02\x01\x03\xec\x02\x00\x00\x0e\x03\x0e\x03\x0e\x03\xd9\x06\x00\x00\xf4\x06\x00\x00\x95\x08\xa7\x07\x00\x00\x3e\x08\x00\x00\x3e\x08\x00\x00\xa7\x07\x00\x00\xee\x02\x3e\x08\x95\x08\x00\x00\x36\x06\x50\x04\x4f\x02\x00\x00\x4f\x02\x00\x00\x09\x03\xfb\x08\xce\x02\xde\x02\x4f\x02\x33\x03\x00\x00\x45\x03\x95\x08\xcc\x07\x00\x00\x18\x03\x1a\x03\x26\x02\x26\x02\x00\x00\x00\x00\x38\x01\x00\x00\x38\x01\x23\x03\x4f\x02\x0f\x07\x23\x08\x00\x00\x7e\x00\xce\x02\x76\x01\x7d\x01\x00\x00\xe7\x07\x50\x03\x4a\x03\xc2\x07\x00\x00\x00\x00\x82\x02\x00\x00\x5a\x06\x00\x00\x00\x00\x00\x00\x7d\x03\xfb\x08\x00\x00\x00\x00\xfb\x08\x47\x03\x00\x00\xdd\x07\x2a\x07\xdd\x07\xfb\x08\x7d\x03\x53\x03\x56\x03\x00\x00\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\xdd\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x03\x7d\x03\x67\x03\xbe\x00\x5c\x03\x69\x03\x00\x00\x71\x03\x83\x03\x83\x03\x83\x03\x00\x00\x00\x00\x83\x03\x7d\x03\x00\x00\x6e\x03\x00\x00\x7e\x03\xfb\x08\x00\x00\x00\x00\xfb\x08\xfb\x08\xdd\x07\x00\x00\x53\x08\xba\x01\x95\x03\x5f\x02\x5f\x02\xb9\x03\x7d\x03\x3e\x08\x3e\x08\x4c\x03\x00\x00\xb9\x03\xfb\x08\xa4\x03\x00\x00\x00\x00\xbd\x03\x00\x00\xfb\x08\xdd\x07\xfb\x08\x5f\x02\xbd\x03\x00\x00\x00\x00\x00\x00\xab\x03\xa9\x03\xaf\x03\x46\x08\xa7\x03\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\xc5\x03\x7d\x03\x45\x07\xcf\x03\x3c\x03\x3e\x03\x00\x00\x00\x00\x00\x00\x2e\x04\xcf\x03\xd8\x03\x7d\x03\x95\x08\x00\x00\x00\x00\xca\x03\xdd\x07\xf8\x07\xba\x01\xf8\x07\x85\x00\xfb\x08\xe8\x03\xd9\x03\x00\x00\xf0\x03\xdb\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\xfb\x08\x5f\x02\x49\x02\x00\x00\xfa\x03\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00\x95\x08\xe5\x03\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x15\x04\x83\x00\x0d\x04\xa7\x04\x66\x00\xc8\x01\xff\x03\x03\x04\x7e\x01\x7f\x08\x91\x02\xe9\x01\x00\x00\x55\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\x00\x00\x00\xe4\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\x2c\x01\x00\x00\x88\x05\x11\x09\x8d\x03\x00\x00\x00\x00\x44\x03\x26\x01\x00\x00\x00\x00\x1e\x09\x04\x09\xda\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x72\x04\x80\x04\x60\x04\x24\x00\x6d\x01\x5a\x03\xea\xff\x15\x01\x5e\x01\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\xf7\xff\x80\x00\x00\x00\x64\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x1d\x05\x6d\x08\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x02\x0e\x04\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\x00\x00\xdf\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\x7f\x07\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x01\xf5\x02\x19\x04\x3b\x04\x49\x04\x3f\x00\xb5\x04\xcb\x03\x00\x00\x00\x00\x9d\x00\x00\x00\xee\xff\x8c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x09\xcf\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x01\x23\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xf0\xff\x00\x00\xae\x02\x38\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\xd4\x04\x34\x05\x00\x00\xd4\x03\x00\x00\x45\x09\x00\x00\x52\x09\x5f\x09\x12\x08\x00\x00\x34\x05\x6c\x09\x34\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x05\x00\x00\x34\x05\x34\x05\x34\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x09\x00\x00\x86\x09\xc2\x08\x8f\x01\x00\x00\xb2\x00\x00\x00\x34\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x04\xfb\x03\x96\x04\xdc\x04\x00\x00\xea\x04\xf9\x04\x00\x00\x8e\x02\x11\x05\x00\x00\x00\x00\x00\x00\x20\x05\x00\x00\x2e\x05\x18\x00\x00\x00\x00\x00\x00\x00\x04\x04\x34\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x05\xdf\x05\x4c\x02\x00\x00\x70\x02\x00\x00\x00\x00\x00\x00\x62\x05\x00\x00\x44\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x00\x00\x4a\x01\x00\x00\xe4\x03\x93\x09\x00\x00\xb7\x04\x00\x00\xd9\x04\x00\x00\xa0\x09\x00\x00\x00\x00\x65\x05\x17\x00\x00\x00\xca\x01\xd4\x01\xe4\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x97\x05\x78\x04\x89\x04\xb4\x00\x38\x04\x00\x00\x00\x00\x26\x03\x52\x02\x00\x00\x00\x00\x00\x00\x4f\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x04\xcb\x00\xc7\x01\xc7\x00\x00\x00\xe0\x02\xaa\x04\x00\x00\x00\x00\x00\x00\x3a\x03\x00\x00\x00\x00\x99\x08\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x02\x00\x00\x00\x00\x00\x00\x55\x05\xd5\x05\x00\x00\x00\x00\xd5\x05\x00\x00\x00\x00\xad\x09\x4a\x01\xba\x09\xde\x05\x63\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\xc7\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\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\x8a\x05\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x06\x00\x00\x00\x00\x2b\x06\x2b\x06\xd4\x09\x00\x00\x00\x00\x1b\x00\x00\x00\x05\x04\x06\x04\x00\x00\x98\x05\x70\x04\x40\x04\xa7\x05\x00\x00\x00\x00\x2b\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x06\xe1\x09\x2b\x06\x0b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x03\x4d\x06\x00\x00\x64\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x05\x4a\x01\x25\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x06\x37\x04\x00\x00\xce\x05\x04\x00\x00\x00\x00\x00\x00\x00\xee\x09\xa6\x08\x35\x00\xb3\x08\x00\x00\x9a\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x06\x0f\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\x00\x00"#++happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int#+happyAdjustOffset off = off++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\x83\xff\x81\xff\x7f\xff\x06\xff\x01\xff\xff\xfe\x00\x00\x0b\xff\x00\xff\x08\xff\x07\xff\x09\xff\x0a\xff\x00\x00\x7d\xff\x7e\xff\x7a\xff\x7c\xff\x7b\xff\x80\xff\x79\xff\x82\xff\x05\xff\x03\xff\x00\x00\x04\xff\x00\x00\x00\x00\x00\x00\x00\x00\x36\xff\x22\xff\x1f\xff\x00\x00\x1e\xff\x1d\xff\x1c\xff\x00\x00\x00\x00\x00\x00\x15\xff\x97\xff\x00\x00\x98\xff\x96\xff\x8d\xff\x8a\xff\x88\xff\x86\xff\x76\xff\x74\xff\x91\xff\x73\xff\x72\xff\x71\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\xa7\xff\x00\x00\x00\x00\x46\xff\xa5\xff\xae\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xff\xbc\xff\x00\x00\xcc\xff\x00\x00\xbd\xff\x00\x00\x00\x00\x00\x00\x00\x00\xee\xff\xe9\xff\xed\xff\xd8\xff\xce\xff\xcf\xff\xcd\xff\x00\x00\x00\x00\xd5\xff\x00\x00\x09\xff\x00\x00\x00\x00\xcb\xff\x00\x00\xda\xff\x00\x00\x00\x00\xdb\xff\x00\x00\x38\xff\x00\x00\x00\x00\x3d\xff\x00\x00\x00\x00\x48\xff\x46\xff\x00\x00\x45\xff\x00\x00\x43\xff\x00\x00\x00\x00\x40\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xff\x00\x00\x00\x00\x9f\xff\x9d\xff\x00\x00\x99\xff\x84\xff\x85\xff\x00\x00\xfc\xfe\x69\xff\xfb\xfe\x00\x00\x00\x00\x00\x00\x64\xff\x62\xff\x61\xff\x66\xff\x59\xff\x00\x00\x00\x00\x6d\xff\x00\x00\x00\x00\x00\x00\x6e\xff\x7c\xff\x7b\xff\x56\xff\x55\xff\x00\x00\x6b\xff\x00\x00\x00\x00\x90\xff\x00\x00\x45\xff\x00\x00\x75\xff\x00\x00\x00\x00\x2a\xff\x00\x00\x0d\xff\x00\x00\x2c\xff\x32\xff\x00\x00\x00\x00\x19\xff\x00\x00\x00\x00\x14\xff\x20\xff\x1e\xff\x00\x00\x21\xff\x00\x00\x00\x00\x00\x00\x30\xff\x34\xff\x00\x00\x35\xff\x02\xff\x00\x00\x00\x00\x00\x00\xfd\xfe\x33\xff\x23\xff\x24\xff\x00\x00\x00\x00\x13\xff\x12\xff\x00\x00\x17\xff\x18\xff\x00\x00\x1a\xff\x00\x00\x00\x00\x00\x00\x16\xff\x00\x00\x31\xff\x89\xff\x87\xff\x68\xff\x5f\xff\x5e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xff\x00\x00\x00\x00\x50\xff\x00\x00\x00\x00\x6f\xff\x67\xff\x70\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6c\xff\x00\x00\x65\xff\x00\x00\x00\x00\x00\x00\x06\xff\xf4\xfe\x00\x00\xf9\xfe\x00\x00\x00\x00\x00\x00\x9a\xff\x00\x00\xba\xff\xa6\xff\xa5\xff\x00\x00\xa0\xff\x00\x00\x9e\xff\x47\xff\xb9\xff\x00\x00\x78\xff\xaf\xff\xb1\xff\xb0\xff\x00\x00\x26\xff\x00\x00\x28\xff\x00\x00\x00\x00\x3e\xff\x00\x00\x3f\xff\x00\x00\x41\xff\x00\x00\x42\xff\xa4\xff\x00\x00\x00\x00\x3c\xff\x00\x00\x00\x00\x00\x00\xdc\xff\x00\x00\xd9\xff\x00\x00\x00\x00\x00\x00\xbb\xff\x00\x00\xe6\xff\xd0\xff\x00\x00\x00\x00\x00\x00\xd4\xff\x09\xff\x00\x00\x00\x00\x00\x00\xf1\xff\xeb\xff\xf0\xff\xea\xff\xef\xff\xbb\xff\x00\x00\x00\x00\x00\x00\xd3\xff\xdf\xff\x00\x00\x00\x00\x00\x00\xc3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xff\xd6\xff\x00\x00\x93\xff\x00\x00\x95\xff\x37\xff\x39\xff\x00\x00\x49\xff\x3b\xff\x3a\xff\xb5\xff\x00\x00\x25\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xff\x00\x00\x9c\xff\x9b\xff\x8b\xff\xfa\xfe\x00\x00\xf8\xfe\x00\x00\xf6\xfe\xf7\xfe\x63\xff\x60\xff\x58\xff\x5b\xff\x00\x00\x5d\xff\x5d\xff\x57\xff\x4e\xff\x4c\xff\x00\x00\x53\xff\x5c\xff\x8e\xff\x8f\xff\x8c\xff\xad\xff\x00\x00\x29\xff\x2c\xff\x0c\xff\x2b\xff\x0e\xff\x2e\xff\x2f\xff\x10\xff\x0f\xff\x00\x00\x1b\xff\x11\xff\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xff\x5a\xff\xf5\xfe\x00\x00\xf3\xfe\xa4\xff\xb6\xff\x77\xff\xb3\xff\x00\x00\xb4\xff\x00\x00\xb8\xff\x94\xff\x92\xff\xc7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xbb\xff\xc5\xff\xbb\xff\xc9\xff\xe7\xff\xe8\xff\x00\x00\xe0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xff\xc8\xff\xab\xff\x00\x00\x00\x00\xd1\xff\x00\x00\xe1\xff\xc1\xff\xc2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xff\x51\xff\x4d\xff\x4b\xff\x4a\xff\x2d\xff\xf3\xff\x27\xff\xc6\xff\x00\x00\xc0\xff\xbe\xff\x00\x00\x00\x00\xe2\xff\xd2\xff\xaa\xff\x00\x00\xa9\xff\xa8\xff\xe5\xff\x00\x00\xbf\xff\xf2\xff\xe3\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x12\x00\x01\x00\x02\x00\x03\x00\x1b\x00\x1c\x00\x13\x00\x1a\x00\x13\x00\x06\x00\x01\x00\x0b\x00\x0c\x00\x31\x00\x0e\x00\x0f\x00\x10\x00\x1b\x00\x1c\x00\x13\x00\x14\x00\x15\x00\x2c\x00\x22\x00\x23\x00\x19\x00\x1a\x00\x01\x00\x02\x00\x03\x00\x23\x00\x31\x00\x31\x00\x18\x00\x31\x00\x39\x00\x3b\x00\x0b\x00\x0c\x00\x2c\x00\x0e\x00\x0f\x00\x10\x00\x1b\x00\x1c\x00\x13\x00\x14\x00\x15\x00\x3d\x00\x3b\x00\x29\x00\x19\x00\x1a\x00\x01\x00\x02\x00\x03\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x4f\x00\x50\x00\x4f\x00\x0b\x00\x0c\x00\x13\x00\x0e\x00\x0f\x00\x10\x00\x4f\x00\x50\x00\x13\x00\x14\x00\x15\x00\x33\x00\x3b\x00\x2a\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x03\x00\x4f\x00\x3d\x00\x3a\x00\x3b\x00\x33\x00\x34\x00\x2a\x00\x0b\x00\x0c\x00\x39\x00\x0e\x00\x0f\x00\x10\x00\x4f\x00\x50\x00\x13\x00\x14\x00\x15\x00\x14\x00\x4f\x00\x4f\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x03\x00\x17\x00\x12\x00\x3a\x00\x3b\x00\x01\x00\x24\x00\x4f\x00\x0b\x00\x0c\x00\x20\x00\x0e\x00\x0f\x00\x10\x00\x3b\x00\x15\x00\x13\x00\x14\x00\x15\x00\x19\x00\x1a\x00\x33\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x26\x00\x09\x00\x18\x00\x3a\x00\x3b\x00\x08\x00\x24\x00\x0a\x00\x4f\x00\x50\x00\x0d\x00\x31\x00\x0f\x00\x22\x00\x23\x00\x15\x00\x13\x00\x14\x00\x15\x00\x19\x00\x1a\x00\x33\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x24\x00\x3a\x00\x3b\x00\x0b\x00\x0c\x00\x22\x00\x0e\x00\x0f\x00\x10\x00\x22\x00\x23\x00\x13\x00\x14\x00\x15\x00\x32\x00\x33\x00\x2d\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x3d\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x2d\x00\x3a\x00\x3b\x00\x0b\x00\x0c\x00\x15\x00\x0e\x00\x0f\x00\x10\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x1e\x00\x1b\x00\x1c\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x13\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x0b\x00\x0c\x00\x3b\x00\x0e\x00\x0f\x00\x10\x00\x1e\x00\x1f\x00\x13\x00\x14\x00\x15\x00\x1c\x00\x1b\x00\x1c\x00\x19\x00\x1a\x00\x3a\x00\x3b\x00\x23\x00\x4f\x00\x50\x00\x3b\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x0c\x00\x13\x00\x0e\x00\x0f\x00\x10\x00\x43\x00\x23\x00\x13\x00\x14\x00\x15\x00\x27\x00\x4f\x00\x50\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x4f\x00\x3b\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x0c\x00\x23\x00\x0e\x00\x0f\x00\x10\x00\x27\x00\x04\x00\x13\x00\x14\x00\x15\x00\x08\x00\x09\x00\x0a\x00\x19\x00\x1a\x00\x4f\x00\x50\x00\x29\x00\x3d\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x3a\x00\x3b\x00\x0d\x00\x18\x00\x0f\x00\x34\x00\x1b\x00\x1c\x00\x13\x00\x14\x00\x15\x00\x2a\x00\x21\x00\x2a\x00\x19\x00\x1a\x00\x2d\x00\x26\x00\x25\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x3a\x00\x3b\x00\x00\x00\x39\x00\x30\x00\x24\x00\x04\x00\x27\x00\x06\x00\x24\x00\x08\x00\x09\x00\x0a\x00\x2d\x00\x2e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x32\x00\x33\x00\x4f\x00\x50\x00\x2e\x00\x3a\x00\x3b\x00\x18\x00\x19\x00\x00\x00\x1b\x00\x13\x00\x3d\x00\x04\x00\x16\x00\x06\x00\x21\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x26\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x01\x00\x30\x00\x53\x00\x18\x00\x19\x00\x33\x00\x1b\x00\x4f\x00\x50\x00\x49\x00\x4a\x00\x53\x00\x21\x00\x3c\x00\x3d\x00\x4f\x00\x50\x00\x26\x00\x23\x00\x53\x00\x00\x00\x4f\x00\x27\x00\x51\x00\x04\x00\x3d\x00\x3e\x00\x30\x00\x08\x00\x09\x00\x0a\x00\x27\x00\x01\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x2d\x00\x2e\x00\x3c\x00\x3d\x00\x45\x00\x27\x00\x4f\x00\x18\x00\x01\x00\x16\x00\x1b\x00\x2d\x00\x2e\x00\x24\x00\x4f\x00\x24\x00\x21\x00\x2f\x00\x30\x00\x20\x00\x21\x00\x26\x00\x24\x00\x24\x00\x25\x00\x26\x00\x27\x00\x32\x00\x33\x00\x32\x00\x33\x00\x30\x00\x2d\x00\x2e\x00\x4f\x00\x50\x00\x32\x00\x33\x00\x53\x00\x3d\x00\x45\x00\x46\x00\x45\x00\x46\x00\x3d\x00\x4f\x00\x50\x00\x00\x00\x24\x00\x53\x00\x4f\x00\x04\x00\x4f\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\x32\x00\x4f\x00\x50\x00\x1c\x00\x4f\x00\x53\x00\x18\x00\x19\x00\x04\x00\x1b\x00\x23\x00\x56\x00\x08\x00\x09\x00\x0a\x00\x21\x00\x4d\x00\x15\x00\x4f\x00\x15\x00\x26\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x1d\x00\x02\x00\x1d\x00\x18\x00\x15\x00\x30\x00\x19\x00\x32\x00\x19\x00\x1a\x00\x00\x00\x23\x00\x21\x00\x1e\x00\x04\x00\x27\x00\x06\x00\x3c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x3d\x00\x3a\x00\x3b\x00\x3a\x00\x3b\x00\x2a\x00\x18\x00\x19\x00\x2d\x00\x1b\x00\x24\x00\x45\x00\x46\x00\x3a\x00\x3b\x00\x21\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x26\x00\x4f\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x31\x00\x23\x00\x43\x00\x44\x00\x30\x00\x27\x00\x32\x00\x31\x00\x4f\x00\x50\x00\x2a\x00\x00\x00\x4d\x00\x4e\x00\x4f\x00\x04\x00\x3c\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\x4f\x00\x50\x00\x22\x00\x23\x00\x53\x00\x54\x00\x18\x00\x19\x00\x04\x00\x1b\x00\x22\x00\x23\x00\x08\x00\x09\x00\x0a\x00\x21\x00\x24\x00\x15\x00\x27\x00\x22\x00\x26\x00\x19\x00\x1a\x00\x00\x00\x2d\x00\x2e\x00\x2a\x00\x04\x00\x18\x00\x06\x00\x30\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x15\x00\x3c\x00\x27\x00\x2d\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x23\x00\x1b\x00\x22\x00\x23\x00\x27\x00\x3a\x00\x3b\x00\x21\x00\x36\x00\x4f\x00\x50\x00\x23\x00\x26\x00\x53\x00\x22\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x30\x00\x08\x00\x09\x00\x0a\x00\x4f\x00\x50\x00\x15\x00\x3a\x00\x3b\x00\x25\x00\x19\x00\x1a\x00\x3c\x00\x06\x00\x15\x00\x2a\x00\x2b\x00\x18\x00\x15\x00\x0c\x00\x1b\x00\x35\x00\x19\x00\x1a\x00\x11\x00\x39\x00\x21\x00\x22\x00\x4f\x00\x50\x00\x2c\x00\x26\x00\x19\x00\x28\x00\x4f\x00\x50\x00\x2b\x00\x23\x00\x53\x00\x24\x00\x2f\x00\x27\x00\x22\x00\x3a\x00\x3b\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x32\x00\x33\x00\x3a\x00\x3b\x00\x13\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x4f\x00\x50\x00\x08\x00\x09\x00\x0a\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x31\x00\x4f\x00\x50\x00\x14\x00\x15\x00\x4f\x00\x50\x00\x18\x00\x04\x00\x05\x00\x1b\x00\x27\x00\x08\x00\x09\x00\x0a\x00\x2c\x00\x21\x00\x2d\x00\x2e\x00\x4f\x00\x50\x00\x26\x00\x4f\x00\x28\x00\x51\x00\x52\x00\x2b\x00\x05\x00\x18\x00\x07\x00\x2f\x00\x2a\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x37\x00\x38\x00\x08\x00\x09\x00\x0a\x00\x2a\x00\x04\x00\x05\x00\x01\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x4f\x00\x50\x00\x15\x00\x01\x00\x53\x00\x18\x00\x04\x00\x2a\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x18\x00\x21\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x26\x00\x39\x00\x28\x00\x21\x00\x13\x00\x2b\x00\x2a\x00\x18\x00\x2a\x00\x2f\x00\x3c\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x37\x00\x38\x00\x08\x00\x09\x00\x0a\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x4f\x00\x50\x00\x15\x00\x23\x00\x13\x00\x18\x00\x04\x00\x2c\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x21\x00\x1e\x00\x1f\x00\x20\x00\x1c\x00\x26\x00\x23\x00\x28\x00\x4f\x00\x50\x00\x2b\x00\x02\x00\x18\x00\x31\x00\x2f\x00\x31\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x37\x00\x38\x00\x08\x00\x09\x00\x0a\x00\x27\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3c\x00\x24\x00\x15\x00\x24\x00\x13\x00\x18\x00\x04\x00\x13\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x22\x00\x21\x00\x32\x00\x33\x00\x32\x00\x33\x00\x26\x00\x2c\x00\x28\x00\x4f\x00\x50\x00\x2b\x00\x22\x00\x18\x00\x13\x00\x2f\x00\x20\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x37\x00\x38\x00\x08\x00\x09\x00\x0a\x00\x27\x00\x4f\x00\x50\x00\x04\x00\x23\x00\x49\x00\x1d\x00\x08\x00\x09\x00\x0a\x00\x15\x00\x4f\x00\x50\x00\x18\x00\x13\x00\x53\x00\x1b\x00\x01\x00\x2c\x00\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x4f\x00\x28\x00\x51\x00\x52\x00\x2b\x00\x4f\x00\x50\x00\x2d\x00\x2f\x00\x53\x00\x27\x00\x55\x00\x18\x00\x4f\x00\x50\x00\x1b\x00\x37\x00\x38\x00\x29\x00\x2a\x00\x2b\x00\x21\x00\x4f\x00\x04\x00\x51\x00\x52\x00\x26\x00\x08\x00\x09\x00\x0a\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x32\x00\x30\x00\x08\x00\x09\x00\x0a\x00\x13\x00\x35\x00\x2a\x00\x18\x00\x13\x00\x39\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x15\x00\x2c\x00\x21\x00\x18\x00\x31\x00\x2c\x00\x1b\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x21\x00\x3c\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x21\x00\x28\x00\x01\x00\x13\x00\x2b\x00\x04\x00\x05\x00\x2a\x00\x2f\x00\x08\x00\x09\x00\x0a\x00\x18\x00\x26\x00\x2c\x00\x1b\x00\x37\x00\x38\x00\x04\x00\x13\x00\x23\x00\x21\x00\x08\x00\x09\x00\x0a\x00\x18\x00\x26\x00\x13\x00\x28\x00\x3a\x00\x3b\x00\x2b\x00\x2d\x00\x4f\x00\x21\x00\x51\x00\x52\x00\x13\x00\x18\x00\x26\x00\x32\x00\x1b\x00\x2d\x00\x37\x00\x38\x00\x00\x00\x09\x00\x21\x00\x22\x00\x16\x00\x4f\x00\x50\x00\x26\x00\x49\x00\x1f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\x17\x00\x30\x00\x53\x00\x2d\x00\x2e\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x04\x00\x4f\x00\x30\x00\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x18\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x18\x00\x42\x00\x42\x00\x18\x00\x4f\x00\x50\x00\x1b\x00\x42\x00\x53\x00\x18\x00\x00\x00\x42\x00\x21\x00\xff\xff\x04\x00\x27\x00\x4f\x00\x26\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x0e\x00\x0f\x00\x10\x00\x30\x00\xff\xff\x32\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x18\x00\x04\x00\xff\xff\x1b\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x21\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x26\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\x18\x00\xff\xff\x1a\x00\x30\x00\x21\x00\x32\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x4f\x00\x50\x00\xff\xff\x32\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x11\x00\x12\x00\x13\x00\x14\x00\xff\xff\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\x2d\x00\x2e\x00\x4f\x00\x50\x00\xff\xff\x32\x00\x53\x00\xff\xff\x35\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x4f\x00\x50\x00\x4f\x00\x50\x00\x2d\x00\x2e\x00\x53\x00\xff\xff\x4f\x00\x21\x00\x51\x00\x52\x00\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x11\x00\x12\x00\x13\x00\x14\x00\xff\xff\x2d\x00\x2e\x00\xff\xff\x4f\x00\x50\x00\x21\x00\xff\xff\x53\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x39\x00\x3a\x00\x3b\x00\x2d\x00\x2e\x00\xff\xff\x4f\x00\x50\x00\xff\xff\x4f\x00\x53\x00\x51\x00\x52\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x53\x00\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x39\x00\x3a\x00\x3b\x00\x4f\x00\x50\x00\x2d\x00\x2e\x00\x53\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4d\x00\x4e\x00\x4f\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x4f\x00\x50\x00\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\xff\xff\x2d\x00\x2e\x00\x29\x00\x2a\x00\x2b\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\x4f\x00\x50\x00\x2d\x00\x2e\x00\x53\x00\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\xff\xff\x4f\x00\x50\x00\x21\x00\xff\xff\x53\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x39\x00\x3a\x00\x3b\x00\x2d\x00\x2e\x00\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x53\x00\x2d\x00\x2e\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x29\x00\x2a\x00\x2b\x00\x4f\x00\x50\x00\x2d\x00\x2e\x00\x53\x00\x21\x00\x41\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x2d\x00\x2e\x00\xff\xff\x4f\x00\x50\x00\x4f\x00\x50\x00\x53\x00\xff\xff\x53\x00\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x2d\x00\x2e\x00\x1c\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\xff\xff\xff\xff\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4f\x00\x50\x00\xff\xff\x04\x00\x53\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\xff\xff\x18\x00\x19\x00\x00\x00\x1b\x00\xff\xff\xff\xff\x04\x00\xff\xff\xff\xff\x21\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x26\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x30\x00\x3a\x00\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x1c\x00\x29\x00\x2a\x00\x2b\x00\x21\x00\xff\xff\xff\xff\x00\x00\xff\xff\x26\x00\x27\x00\x04\x00\x12\x00\x13\x00\x14\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x30\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x18\x00\xff\xff\xff\xff\x1b\x00\x12\x00\x13\x00\x14\x00\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x00\x00\xff\xff\x26\x00\x27\x00\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x30\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4d\x00\x4e\x00\x4f\x00\xff\xff\x22\x00\x23\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x26\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x22\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\x29\x00\x2a\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x27\x00\xff\xff\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\x05\x00\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\x22\x00\xff\xff\x18\x00\x2a\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x30\x00\x23\x00\xff\xff\x18\x00\xff\xff\x27\x00\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x26\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3a\x00\x3b\x00\x3c\x00\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x26\x00\x4f\x00\x50\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\xff\xff\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\x10\x00\x1b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x21\x00\x18\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x21\x00\xff\xff\x1b\x00\xff\xff\xff\xff\x26\x00\x04\x00\xff\xff\x21\x00\x22\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x04\x00\x30\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x21\x00\xff\xff\x1b\x00\xff\xff\xff\xff\x26\x00\x04\x00\xff\xff\x21\x00\x2a\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x04\x00\x30\x00\xff\xff\x2a\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x18\x00\x21\x00\x1a\x00\x4f\x00\x50\x00\xff\xff\x26\x00\x53\x00\x13\x00\xff\xff\xff\xff\x16\x00\x17\x00\xff\xff\xff\xff\xff\xff\x30\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x22\x00\x23\x00\x24\x00\xff\xff\xff\xff\x27\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x2d\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x29\x00\x2a\x00\x2b\x00\x04\x00\xff\xff\x21\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x26\x00\x24\x00\x28\x00\xff\xff\xff\xff\x2b\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x2d\x00\x2e\x00\xff\xff\x18\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x4f\x00\x50\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x3f\x00\x40\x00\x41\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x3f\x00\x40\x00\x41\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x3f\x00\x40\x00\x41\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x3f\x00\x40\x00\x41\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\x42\x00\xff\xff\x53\x00\xff\xff\xff\xff\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x4c\x00\xff\xff\x2a\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\xff\xff\xff\xff\x56\x00\x57\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2c\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x4c\x00\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x47\x00\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\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"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x72\x00\x73\x00\x74\x00\x75\x00\xac\x00\xa2\x00\x89\x00\x23\x01\x89\x00\xee\x01\xb5\x00\x76\x00\x77\x00\x67\x00\x78\x00\x79\x00\x7a\x00\xa1\x00\xa2\x00\x7b\x00\x7c\x00\x7d\x00\x3c\x01\x0f\x01\x10\x01\x54\x00\x55\x00\xa7\x01\x74\x00\x75\x00\xa5\x00\x73\x00\xfe\x00\xb6\x00\x53\x00\xa0\x00\xa3\x00\x76\x00\x77\x00\xa6\x00\x78\x00\x79\x00\x7a\x00\x10\x01\xa2\x00\x7b\x00\x7c\x00\x7d\x00\xff\xff\xa3\x00\xb7\x00\x54\x00\x55\x00\xea\x01\x74\x00\x75\x00\x12\x00\x92\x00\x57\x00\x58\x00\x12\x00\x24\x01\xff\x00\x76\x00\x77\x00\xe9\x00\x78\x00\x79\x00\x7a\x00\x12\x00\x92\x00\x7b\x00\x7c\x00\x7d\x00\x8a\x01\xa3\x00\x9f\x00\x54\x00\x55\x00\x12\x00\x59\x00\x59\x01\xef\x01\x6f\x01\x57\x00\x58\x00\xb7\x00\xb8\x00\x4a\x01\x5a\x01\x77\x00\xa0\x00\x78\x00\x79\x00\x7a\x00\x12\x00\x92\x00\x7b\x00\x7c\x00\x7d\x00\x47\x00\x8b\x00\xb9\x00\x54\x00\x55\x00\x12\x00\x59\x00\x57\x01\x04\x01\x0e\x00\x57\x00\x58\x00\xb5\x00\x55\x01\xb9\x00\x58\x01\x77\x00\x05\x01\x78\x00\x79\x00\x7a\x00\x2b\x01\x63\x00\x7b\x00\x7c\x00\x7d\x00\x54\x00\x55\x00\x56\x01\x54\x00\x55\x00\x12\x00\x59\x00\x42\x01\xcb\x01\xb6\x00\x57\x00\x58\x00\x67\x00\x44\x01\x68\x00\x12\x00\x92\x00\x69\x00\x43\x01\x6a\x00\x3d\x01\x3a\x01\xa0\x00\x6b\x00\x6c\x00\x6d\x00\x54\x00\x55\x00\x46\x01\x54\x00\x55\x00\x12\x00\x59\x00\x57\x00\x58\x00\xe4\xff\x57\x00\x58\x00\x86\x00\x77\x00\xe9\x01\x78\x00\x79\x00\x7a\x00\x3b\x01\x38\x01\x7b\x00\x7c\x00\x7d\x00\xe4\xff\xe4\xff\xa9\x01\x54\x00\x55\x00\x12\x00\x59\x00\xff\xff\x12\x00\x59\x00\x57\x00\x58\x00\xe0\x00\x57\x00\x58\x00\x62\x01\x77\x00\xa7\x00\x78\x00\x79\x00\x7a\x00\x54\x00\x55\x00\x7b\x00\x7c\x00\x7d\x00\xa8\x00\x01\x01\xa2\x00\x54\x00\x55\x00\x12\x00\x59\x00\x89\x00\x12\x00\x59\x00\x57\x00\x58\x00\xcf\x01\x77\x00\x26\x01\x78\x00\x79\x00\x7a\x00\xaf\x01\xb0\x01\x7b\x00\x7c\x00\x7d\x00\x39\x01\xcb\x01\xa2\x00\x54\x00\x55\x00\x57\x00\x58\x00\x3a\x01\x12\x00\x59\x00\xa3\x00\x12\x00\x92\x00\x57\x00\x58\x00\x6a\x01\x89\x00\x78\x00\x79\x00\x7a\x00\x9a\x01\x40\x01\x7b\x00\x7c\x00\x7d\x00\x41\x01\x12\x00\x59\x00\x54\x00\x55\x00\x12\x00\x92\x00\x9b\x01\xa3\x00\x12\x00\x59\x00\x57\x00\x58\x00\x69\x01\x13\x01\x78\x00\x79\x00\x7a\x00\x14\x01\x17\x00\x7b\x00\x7c\x00\x7d\x00\x19\x00\x1a\x00\x1b\x00\x54\x00\x55\x00\x12\x00\x92\x00\x16\x01\xff\xff\x12\x00\x59\x00\xc8\x00\x90\x00\x57\x00\x58\x00\x85\x00\x1c\x00\x6a\x00\x17\x01\x60\x00\x98\x00\x6b\x00\x6c\x00\x6d\x00\x03\x01\x94\x00\xa3\xff\x54\x00\x55\x00\xa3\xff\x62\x00\xcb\x00\x12\x00\xc9\x00\x12\x00\x59\x00\x57\x00\x58\x00\x5b\x00\xa0\x00\x63\x00\x44\x01\x17\x00\xab\x00\x6f\x00\xa7\x00\x19\x00\x1a\x00\x1b\x00\x3f\x00\x40\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x45\x01\x46\x01\x12\x00\x59\x00\xcb\x00\x57\x00\x58\x00\x1c\x00\xbb\xff\x5b\x00\x60\x00\x89\x00\xff\xff\x17\x00\x06\x01\x6f\x00\x61\x00\x19\x00\x1a\x00\x1b\x00\x44\x01\x62\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x12\x00\x59\x00\x12\x00\x13\x00\x9d\x00\x63\x00\x41\x00\x1c\x00\xbb\xff\x46\x01\x60\x00\x12\x00\x13\x00\xd9\x00\xda\x00\x41\x00\x61\x00\x70\x00\xdd\xff\x12\x00\x13\x00\x62\x00\xfb\x00\xdb\x00\x5b\x00\x25\x00\xfc\x00\xe5\x00\x17\x00\x89\x00\x8a\x00\x63\x00\x19\x00\x1a\x00\x1b\x00\xaa\x00\x9c\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x3f\x00\x40\x00\x70\x00\xde\xff\x77\x01\xab\x00\x8b\x00\x1c\x00\x9b\x00\x38\x00\x60\x00\x3f\x00\x40\x00\x20\x01\x33\x01\x44\x01\x61\x00\xb2\x00\xb3\x00\x39\x00\x3a\x00\x62\x00\xc4\x01\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x21\x01\x22\x01\xc7\x01\x46\x01\x63\x00\x3f\x00\x40\x00\x12\x00\x13\x00\xc5\x01\xc6\x01\x41\x00\xff\xff\x31\x01\x32\x01\x31\x01\x79\x01\xff\xff\x12\x00\x13\x00\x5b\x00\x85\x00\x41\x00\x33\x01\x17\x00\x33\x01\xbb\xff\x7f\x00\x19\x00\x1a\x00\x80\x00\x81\x00\xbb\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xbb\xff\x57\x01\x12\x00\x13\x00\x37\x01\xb2\x01\x41\x00\x1c\x00\xbb\xff\x17\x00\x60\x00\x38\x01\xb3\x01\x19\x00\x1a\x00\x1b\x00\x61\x00\x9c\x01\x53\x00\xf1\x00\x53\x00\x62\x00\x54\x00\x55\x00\x54\x00\x55\x00\x56\x00\x83\x00\x6d\x01\x1c\x00\xa7\x00\x63\x00\x84\x00\xec\xff\x54\x00\x55\x00\x5b\x00\xf9\x00\x49\x01\x6b\x01\x17\x00\xfa\x00\xbb\xff\x70\x00\x19\x00\x1a\x00\x80\x00\x81\x00\xbb\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xbb\xff\xff\xff\x57\x00\x58\x00\x57\x00\x58\x00\xa2\xff\x1c\x00\xbb\xff\xa2\xff\x60\x00\x47\x01\x31\x01\xcd\x01\x57\x00\x58\x00\x61\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x62\x00\x33\x01\x12\x00\x59\x00\x12\x00\x59\x00\x4c\x01\xf5\x00\xce\x00\xcf\x00\x63\x00\x87\x01\x88\x00\x4b\x01\x12\x00\x59\x00\x3f\x01\x5b\x00\xd0\x00\xd1\x00\xd2\x00\x17\x00\x70\x00\xbb\xff\x7f\x00\x19\x00\x1a\x00\x80\x00\x81\x00\xbb\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xbb\xff\x12\x00\x13\x00\x0d\x01\x08\x01\x14\x00\x15\x00\x1c\x00\xbb\xff\x17\x00\x60\x00\xf4\x00\xf5\x00\x19\x00\x1a\x00\x1b\x00\x61\x00\x29\x01\x51\x01\xaa\x00\x3e\x01\x62\x00\x54\x00\x55\x00\x5b\x00\x3f\x00\x40\x00\x28\x01\x17\x00\x1c\x00\xbb\xff\x63\x00\x19\x00\x1a\x00\x80\x00\x81\x00\xbb\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xbb\xff\x80\x01\x70\x00\xd4\x00\x1f\x01\x54\x00\x55\x00\x1c\x00\xbb\xff\x84\x01\x60\x00\xf6\x01\xf7\x01\x85\x01\x57\x00\x58\x00\x61\x00\x15\x01\x12\x00\x13\x00\x08\x01\x62\x00\x41\x00\x0e\x01\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x07\x01\x63\x00\x19\x00\x1a\x00\x1b\x00\x12\x00\x59\x00\x7f\x01\x57\x00\x58\x00\xcb\x00\x54\x00\x55\x00\x70\x00\x4f\x01\x48\x00\x9d\x00\x11\x00\x1c\x00\xa0\x00\x50\x01\x49\x00\xa0\x01\x54\x00\x55\x00\x51\x01\xa1\x01\x4a\x00\xbf\x00\x12\x00\x59\x00\xf8\x00\x4b\x00\x84\x00\x4c\x00\x12\x00\x13\x00\x4d\x00\xf9\x00\x5d\x01\x20\x01\x4e\x00\xf5\x01\xea\x00\x57\x00\x58\x00\x1e\x00\x1f\x00\x20\x00\xc0\x00\xc1\x00\x23\x00\x24\x00\x25\x00\xbe\x01\x22\x01\x57\x00\x58\x00\xe9\x00\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x12\x00\x59\x00\x19\x00\x1a\x00\x1b\x00\x8f\x01\x90\x01\x91\x01\x92\x01\x8f\x00\x90\x00\xa7\x01\x12\x00\x59\x00\x47\x00\x48\x00\x12\x00\x98\x00\x1c\x00\x17\x00\x29\x00\x49\x00\xfd\x00\x19\x00\x1a\x00\x1b\x00\xa4\x01\x4a\x00\x3f\x00\x40\x00\x12\x00\x92\x00\x4b\x00\x25\x00\x4c\x00\x26\x00\x27\x00\x4d\x00\xc8\x01\x1c\x00\xc9\x01\x4e\x00\x9a\x01\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x4f\x00\x50\x00\x19\x00\x1a\x00\x1b\x00\x8d\x01\x17\x00\x18\x00\x8a\x01\x2a\x00\x19\x00\x1a\x00\x1b\x00\x12\x00\x13\x00\x48\x00\x01\x01\x41\x00\x1c\x00\x17\x00\x86\x01\x49\x00\xc5\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x4a\x00\xe6\x00\x0f\x00\x10\x00\x11\x00\x4b\x00\xa0\x00\x4c\x00\x1d\x00\x89\x00\x4d\x00\x7d\x01\x1c\x00\x72\x01\x4e\x00\x70\x00\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x4f\x00\x50\x00\x19\x00\x1a\x00\x1b\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x12\x00\x47\x01\x48\x00\x7c\x01\x89\x00\x1c\x00\x17\x00\x69\x01\x49\x00\x54\xff\x19\x00\x1a\x00\x1b\x00\x62\x01\x4a\x00\x09\x01\x0a\x01\x0b\x01\xf1\x00\x4b\x00\x0c\x01\x4c\x00\x12\x00\x30\x01\x4d\x00\x60\x01\x1c\x00\x5d\x01\x4e\x00\x5c\x01\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x4f\x00\x50\x00\x19\x00\x1a\x00\x1b\x00\xbb\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x70\x00\x44\x01\x48\x00\xc4\x01\xc1\x01\x1c\x00\x17\x00\x89\x00\x49\x00\x52\xff\x19\x00\x1a\x00\x1b\x00\xc0\x01\x4a\x00\xd3\x01\x46\x01\xd2\x01\xc6\x01\x4b\x00\xbb\x01\x4c\x00\x12\x00\x5e\x01\x4d\x00\xb5\x01\x1c\x00\x89\x00\x4e\x00\xae\x01\x43\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x4f\x00\x50\x00\x19\x00\x1a\x00\x1b\x00\x8d\x00\x12\x00\xc1\x01\x17\x00\xad\x01\xdd\x00\xac\x01\x19\x00\x1a\x00\x1b\x00\x48\x00\x12\x00\x13\x00\x1c\x00\x89\x00\xdb\x00\x49\x00\x33\x00\xaa\x01\x34\x00\x17\x00\x18\x00\x4a\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x4b\x00\x25\x00\x4c\x00\x26\x00\xe7\x00\x4d\x00\x12\x00\x13\x00\xa9\x01\x4e\x00\xad\x00\xf3\x00\xae\x00\x1c\x00\x12\x00\xdb\x01\x35\x00\x4f\x00\x50\x00\xe0\x00\x10\x00\x11\x00\x36\x00\x25\x00\x17\x00\x26\x00\x81\x00\xd8\x00\x19\x00\x1a\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\xe8\x01\x38\x00\x19\x00\x1a\x00\x1b\x00\x89\x00\xa0\x01\x86\x01\x1c\x00\x89\x00\xa1\x01\xcc\x00\x0f\x00\x10\x00\x11\x00\x48\x00\xe0\x01\x26\x01\x1c\x00\xdf\x01\xde\x01\x49\x00\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x4a\x00\x70\x00\x19\x00\x1a\x00\x1b\x00\x4b\x00\xd9\x01\x4c\x00\xb0\x00\x89\x00\x4d\x00\x17\x00\x18\x00\xd8\x01\x4e\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xd5\x01\xee\x01\x49\x00\x4f\x00\x50\x00\x17\x00\x89\x00\xad\x01\x4a\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x4b\x00\x89\x00\x4c\x00\x29\x01\x90\x00\x4d\x00\xa9\x01\x25\x00\xb1\x00\x26\x00\x4c\x01\x89\x00\x1c\x00\xb2\x00\xf9\x01\x60\x00\xa9\x01\x4f\x00\x50\x00\x70\x00\x65\x00\x94\x00\x95\x00\x50\x00\x12\x00\x92\x00\x62\x00\xef\x00\x51\x00\x97\x01\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x4d\x01\x63\x00\xdb\x00\x3f\x00\x40\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x5b\x00\x17\x00\x76\x01\x88\x01\x17\x00\x19\x00\x1a\x00\x1b\x00\x19\x00\x1a\x00\x1b\x00\x60\x01\xd3\x01\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x2c\x01\x10\x00\x11\x00\x2f\x01\x1c\x00\xe6\x01\x9d\x01\x1c\x00\x12\x00\x13\x00\x60\x00\xe0\x01\x41\x00\xf1\x01\x5b\x00\xf7\x01\x61\x00\x00\x00\x17\x00\xf4\x01\xf9\x01\x62\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x63\x00\x00\x00\xaa\x00\x2c\x01\x10\x00\x11\x00\x2e\x01\x1c\x00\x17\x00\x00\x00\x60\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x61\x00\x2c\x01\x10\x00\x11\x00\x2d\x01\x62\x00\xe3\x01\x91\x01\x92\x01\x8f\x00\x90\x00\x00\x00\x1c\x00\x00\x00\x9a\x00\x63\x00\xbb\x00\x6d\x01\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbc\x00\x0f\x00\x10\x00\x11\x00\x00\x00\x3f\x00\x40\x00\x12\x00\x92\x00\x00\x00\xbd\x00\xc5\x00\xc6\x00\xc7\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x63\x01\x64\x01\x6b\x00\x65\x01\x00\x00\x3f\x00\x40\x00\xc1\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xe4\x01\x92\x01\x8f\x00\x90\x00\x00\x00\x3f\x00\x40\x00\x12\x00\x13\x00\x00\x00\xc2\x00\x41\x00\x00\x00\xc3\x00\x00\x00\xc5\x00\x00\x00\x96\x01\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x12\x00\x92\x00\x12\x00\x13\x00\x3f\x00\x40\x00\x41\x00\x00\x00\x25\x00\x64\x00\x26\x00\x66\x01\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\x2a\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xd0\x01\x64\x01\x6b\x00\x65\x01\x00\x00\x3f\x00\x40\x00\x00\x00\x12\x00\x13\x00\x98\x01\x00\x00\x41\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x74\x01\x8f\x00\x90\x00\x3f\x00\x40\x00\x00\x00\x12\x00\x13\x00\x00\x00\x25\x00\x41\x00\x26\x00\xc7\x01\x95\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x12\x00\x92\x00\x41\x00\x3f\x00\x40\x00\x94\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x73\x01\x8f\x00\x90\x00\x12\x00\x13\x00\x3f\x00\x40\x00\x41\x00\x93\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xd0\x00\xd1\x00\xf1\x00\x00\x00\x00\x00\x3f\x00\x40\x00\x12\x00\x92\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\x8b\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x95\x00\x8f\x00\x90\x00\x96\x00\x00\x00\x3f\x00\x40\x00\xe0\x00\x10\x00\x11\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x7d\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x92\x00\x00\x00\x12\x00\x13\x00\x3f\x00\x40\x00\x41\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\xb5\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x7e\x01\x10\x00\x11\x00\x00\x00\x00\x00\x3f\x00\x40\x00\x00\x00\x12\x00\x13\x00\xb0\x01\x00\x00\x41\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x70\x01\x8f\x00\x90\x00\x3f\x00\x40\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x12\x00\x92\x00\x41\x00\x3f\x00\x40\x00\xe5\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x67\x01\x10\x00\x11\x00\x12\x00\x13\x00\x3f\x00\x40\x00\x41\x00\xe2\x01\xe3\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xe4\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x3f\x00\x40\x00\x00\x00\x12\x00\x13\x00\x12\x00\x13\x00\x31\x00\x00\x00\x41\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x3f\x00\x40\x00\xa6\x01\xe0\x00\x10\x00\x11\x00\x00\x00\x00\x00\x81\x01\x3c\x00\x3d\x00\x3e\x00\xb6\x01\x10\x00\x11\x00\x00\x00\x00\x00\x3f\x00\x40\x00\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x5b\x00\x12\x00\x13\x00\x00\x00\x17\x00\x41\x00\xbc\xff\x00\x00\x19\x00\x1a\x00\x53\x01\x54\x01\xbc\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xbc\xff\x12\x00\x13\x00\x00\x00\x00\x00\x41\x00\x00\x00\x1c\x00\xbc\xff\x5b\x00\x60\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x61\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x62\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x63\x00\x24\x00\x1c\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa5\x01\xe0\x00\x10\x00\x11\x00\x61\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x62\x00\x6f\x01\x17\x00\xda\x01\x6b\x00\x65\x01\x19\x00\x1a\x00\x1b\x00\x00\x00\x63\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1c\x00\x00\x00\x00\x00\x60\x00\xd9\x01\x6b\x00\x65\x01\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x62\x00\xbd\x01\x17\x00\x00\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x63\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xd0\x00\xf2\x01\xf1\x00\x00\x00\xf6\x00\xf7\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x60\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x61\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x62\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\xd7\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x17\x00\xe0\x00\x10\x00\x11\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x1d\x01\x00\x00\x17\x00\x00\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x36\x01\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x37\x00\x00\x00\x00\x00\x17\x00\x00\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x7b\x01\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x17\x00\x00\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x79\x01\x00\x00\xdf\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x17\x00\x00\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\xcf\x01\x00\x00\xdd\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x17\x00\x00\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\xb9\x01\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x17\x00\x29\x00\x35\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x83\x01\x00\x00\x1c\x00\xd6\x01\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x37\x00\x00\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x38\x00\xf7\x00\x00\x00\x1c\x00\x00\x00\x88\x01\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\xdd\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x12\x00\x92\x00\x17\x00\x18\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x37\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\xc3\x01\x35\x00\x33\x00\x00\x00\x34\x00\x17\x00\x18\x00\x36\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xd8\x00\x17\x00\x00\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x36\x00\x00\x00\x60\x00\x00\x00\x00\x00\x37\x00\x17\x00\x00\x00\x94\x00\x95\x00\x19\x00\x1a\x00\x1b\x00\x62\x00\x17\x00\x38\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x94\x00\x00\x00\x60\x00\x00\x00\x00\x00\x62\x00\x17\x00\x00\x00\x94\x00\x12\x01\x19\x00\x1a\x00\x1b\x00\x62\x00\x17\x00\x63\x00\x00\x00\xcd\x01\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x60\x00\xeb\x00\x2f\x00\x00\x00\x30\x00\x1c\x00\x94\x00\xdd\x01\x12\x00\x13\x00\x00\x00\x62\x00\x31\x00\x1b\xff\x00\x00\x00\x00\x1b\xff\x1b\xff\x00\x00\x00\x00\x00\x00\x63\x00\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x00\x00\x1b\xff\x1b\xff\x1b\xff\x00\x00\x00\x00\x1b\xff\x44\x00\x45\x00\x46\x00\x17\x00\x18\x00\x1b\xff\x1b\xff\x19\x00\x1a\x00\x1b\x00\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x1b\xff\x00\x00\x00\x00\x1b\xff\x00\x00\x1c\x00\x00\x00\x00\x00\x49\x00\x8d\x00\x10\x00\x11\x00\x17\x00\x00\x00\x4a\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x4b\x00\x17\xff\x4c\x00\x00\x00\x00\x00\x4d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x17\xff\x17\xff\x00\x00\x1c\x00\x00\x00\x17\xff\x17\xff\x17\xff\x17\xff\x17\xff\x17\xff\x17\xff\x17\xff\x17\xff\x00\x00\x00\x00\x17\xff\x00\x00\x12\x00\x92\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x22\x01\x2b\x00\x2c\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\xbe\x01\x2b\x00\x2c\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\xeb\x01\x2b\x00\x2c\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\xe9\x01\x2b\x00\x2c\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x9d\x01\x00\x00\x31\x00\x00\x00\x00\x00\x9e\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x17\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x18\x01\x00\x00\x45\xff\x19\x01\x13\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x1a\x01\x1b\x01\x45\xff\x45\xff\x45\xff\x45\xff\x45\xff\x45\xff\x45\xff\xce\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xe2\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\xd4\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\xd5\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xe2\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xd8\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x1d\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xfc\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xee\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xed\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xec\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xea\x00\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xa2\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xa1\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x75\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x72\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xb9\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xb7\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xb1\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x9e\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xe1\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\xec\x01\x2e\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x00\x00\x31\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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, 268) [+ (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),+ (252 , happyReduce_252),+ (253 , happyReduce_253),+ (254 , happyReduce_254),+ (255 , happyReduce_255),+ (256 , happyReduce_256),+ (257 , happyReduce_257),+ (258 , happyReduce_258),+ (259 , happyReduce_259),+ (260 , happyReduce_260),+ (261 , happyReduce_261),+ (262 , happyReduce_262),+ (263 , happyReduce_263),+ (264 , happyReduce_264),+ (265 , happyReduce_265),+ (266 , happyReduce_266),+ (267 , happyReduce_267),+ (268 , happyReduce_268)+ ]++happy_n_terms = 62 :: Int+happy_n_nonterms = 88 :: Int++happyReduce_12 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+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 happyOut97 happy_x_2 of { happy_var_2 -> + case happyOut16 happy_x_5 of { happy_var_5 -> + happyIn15+ (mkModule happy_var_2 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_13 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_13 = happyReduce 8# 0# happyReduction_13+happyReduction_13 (happy_x_8 `HappyStk`+ 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 happyOut97 happy_x_2 of { happy_var_2 -> + case happyOut97 happy_x_4 of { happy_var_4 -> + case happyOut16 happy_x_7 of { happy_var_7 -> + happyIn15+ (mkModuleInstance happy_var_2 happy_var_4 happy_var_7+ ) `HappyStk` happyRest}}}++happyReduce_14 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_14 = happySpecReduce_3 0# happyReduction_14+happyReduction_14 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut16 happy_x_2 of { happy_var_2 -> + happyIn15+ (mkAnonymousModule happy_var_2+ )}++happyReduce_15 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+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 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_16 = happySpecReduce_3 1# happyReduction_16+happyReduction_16 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_17 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_17 = happySpecReduce_1 1# happyReduction_17+happyReduction_17 happy_x_1+ = case happyOut17 happy_x_1 of { happy_var_1 -> + happyIn16+ ((reverse happy_var_1, [])+ )}++happyReduce_18 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_18 = happySpecReduce_1 1# happyReduction_18+happyReduction_18 happy_x_1+ = case happyOut26 happy_x_1 of { happy_var_1 -> + happyIn16+ (([], reverse happy_var_1)+ )}++happyReduce_19 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_19 = happySpecReduce_0 1# happyReduction_19+happyReduction_19 = happyIn16+ (([], [])+ )++happyReduce_20 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+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 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_21 = happySpecReduce_3 2# happyReduction_21+happyReduction_21 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_22 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_22 = happySpecReduce_1 2# happyReduction_22+happyReduction_22 happy_x_1+ = case happyOut18 happy_x_1 of { happy_var_1 -> + happyIn17+ ([happy_var_1]+ )}++happyReduce_23 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_23 = happyReduce 4# 3# happyReduction_23+happyReduction_23 (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 happyOut97 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_24 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_24 = happySpecReduce_2 4# happyReduction_24+happyReduction_24 happy_x_2+ happy_x_1+ = case happyOut97 happy_x_2 of { happy_var_2 -> + happyIn19+ (Just happy_var_2+ )}++happyReduce_25 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_25 = happySpecReduce_0 4# happyReduction_25+happyReduction_25 = happyIn19+ (Nothing+ )++happyReduce_26 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_26 = happyReduce 4# 5# happyReduction_26+happyReduction_26 (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_27 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_27 = happySpecReduce_0 5# happyReduction_27+happyReduction_27 = happyIn20+ (Nothing+ )++happyReduce_28 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_28 = happySpecReduce_3 6# happyReduction_28+happyReduction_28 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut21 happy_x_1 of { happy_var_1 -> + case happyOut94 happy_x_3 of { happy_var_3 -> + happyIn21+ (happy_var_3 : happy_var_1+ )}}++happyReduce_29 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_29 = happySpecReduce_1 6# happyReduction_29+happyReduction_29 happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + happyIn21+ ([happy_var_1]+ )}++happyReduce_30 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_30 = happySpecReduce_0 6# happyReduction_30+happyReduction_30 = happyIn21+ ([]+ )++happyReduce_31 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_31 = happySpecReduce_1 7# happyReduction_31+happyReduction_31 happy_x_1+ = happyIn22+ (Hiding+ )++happyReduce_32 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_32 = happySpecReduce_0 7# happyReduction_32+happyReduction_32 = happyIn22+ (Only+ )++happyReduce_33 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_33 = happySpecReduce_1 8# happyReduction_33+happyReduction_33 happy_x_1+ = case happyOut25 happy_x_1 of { happy_var_1 -> + happyIn23+ (Program (reverse happy_var_1)+ )}++happyReduce_34 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_34 = happySpecReduce_0 8# happyReduction_34+happyReduction_34 = happyIn23+ (Program []+ )++happyReduce_35 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_35 = happySpecReduce_3 9# happyReduction_35+happyReduction_35 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_36 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_36 = happySpecReduce_2 9# happyReduction_36+happyReduction_36 happy_x_2+ happy_x_1+ = happyIn24+ (Program []+ )++happyReduce_37 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_37 = happySpecReduce_2 10# happyReduction_37+happyReduction_37 happy_x_2+ happy_x_1+ = case happyOut28 happy_x_1 of { happy_var_1 -> + happyIn25+ (happy_var_1+ )}++happyReduce_38 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_38 = happySpecReduce_3 10# happyReduction_38+happyReduction_38 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_39 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_39 = happySpecReduce_1 11# happyReduction_39+happyReduction_39 happy_x_1+ = case happyOut27 happy_x_1 of { happy_var_1 -> + happyIn26+ (happy_var_1+ )}++happyReduce_40 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+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 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_41 = happySpecReduce_3 11# happyReduction_41+happyReduction_41 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_42 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_42 = happySpecReduce_1 12# happyReduction_42+happyReduction_42 happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn27+ ([exportDecl Nothing Public happy_var_1]+ )}++happyReduce_43 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_43 = happySpecReduce_2 12# happyReduction_43+happyReduction_43 happy_x_2+ happy_x_1+ = case happyOut34 happy_x_1 of { happy_var_1 -> + case happyOut36 happy_x_2 of { happy_var_2 -> + happyIn27+ ([exportDecl (Just happy_var_1) Public happy_var_2]+ )}}++happyReduce_44 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_44 = happyMonadReduce 3# 12# happyReduction_44+happyReduction_44 (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_45 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_45 = happyReduce 6# 12# happyReduction_45+happyReduction_45 (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 happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut42 happy_x_4 of { happy_var_4 -> + case happyOut48 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_46 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_46 = happyReduce 5# 12# happyReduction_46+happyReduction_46 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut48 happy_x_5 of { happy_var_5 -> + happyIn27+ ([exportDecl happy_var_1 Public (mkProperty happy_var_3 [] happy_var_5)]+ ) `HappyStk` happyRest}}}++happyReduce_47 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_47 = happySpecReduce_2 12# happyReduction_47+happyReduction_47 happy_x_2+ happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut38 happy_x_2 of { happy_var_2 -> + happyIn27+ ([exportNewtype Public happy_var_1 happy_var_2]+ )}}++happyReduce_48 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_48 = happySpecReduce_1 12# happyReduction_48+happyReduction_48 happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + happyIn27+ (happy_var_1+ )}++happyReduce_49 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_49 = happySpecReduce_1 12# happyReduction_49+happyReduction_49 happy_x_1+ = case happyOut29 happy_x_1 of { happy_var_1 -> + happyIn27+ (happy_var_1+ )}++happyReduce_50 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_50 = happySpecReduce_1 12# happyReduction_50+happyReduction_50 happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn27+ (happy_var_1+ )}++happyReduce_51 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_51 = happySpecReduce_1 13# happyReduction_51+happyReduction_51 happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn28+ ([Decl (TopLevel {tlExport = Public, tlValue = happy_var_1 })]+ )}++happyReduce_52 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_52 = happyMonadReduce 2# 13# happyReduction_52+happyReduction_52 (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_53 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_53 = happySpecReduce_1 13# happyReduction_53+happyReduction_53 happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + happyIn28+ (happy_var_1+ )}++happyReduce_54 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_54 = happyReduce 4# 14# happyReduction_54+happyReduction_54 (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_55 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_55 = happyReduce 5# 14# happyReduction_55+happyReduction_55 (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_56 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_56 = happyReduce 5# 15# happyReduction_56+happyReduction_56 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut78 happy_x_5 of { happy_var_5 -> + happyIn30+ (mkPrimDecl happy_var_1 happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}}++happyReduce_57 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_57 = happyReduce 7# 15# happyReduction_57+happyReduction_57 (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 happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_4 of { happy_var_4 -> + case happyOut78 happy_x_7 of { happy_var_7 -> + happyIn30+ (mkPrimDecl happy_var_1 happy_var_4 happy_var_7+ ) `HappyStk` happyRest}}}++happyReduce_58 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_58 = happyReduce 4# 16# happyReduction_58+happyReduction_58 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut32 happy_x_3 of { happy_var_3 -> + happyIn31+ (reverse happy_var_3+ ) `HappyStk` happyRest}++happyReduce_59 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_59 = happyReduce 5# 16# happyReduction_59+happyReduction_59 (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_4 of { happy_var_4 -> + happyIn31+ (reverse happy_var_4+ ) `HappyStk` happyRest}++happyReduce_60 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_60 = happySpecReduce_1 17# happyReduction_60+happyReduction_60 happy_x_1+ = case happyOut33 happy_x_1 of { happy_var_1 -> + happyIn32+ ([happy_var_1]+ )}++happyReduce_61 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_61 = happySpecReduce_3 17# happyReduction_61+happyReduction_61 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut32 happy_x_1 of { happy_var_1 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + happyIn32+ (happy_var_3 : happy_var_1+ )}}++happyReduce_62 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_62 = happySpecReduce_3 17# happyReduction_62+happyReduction_62 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut32 happy_x_1 of { happy_var_1 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + happyIn32+ (happy_var_3 : happy_var_1+ )}}++happyReduce_63 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_63 = happyReduce 4# 18# happyReduction_63+happyReduction_63 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_2 of { happy_var_2 -> + case happyOut78 happy_x_4 of { happy_var_4 -> + happyIn33+ (mkParFun happy_var_1 happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}}++happyReduce_64 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_64 = happyMonadReduce 5# 18# happyReduction_64+happyReduction_64 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut81 happy_x_5 of { happy_var_5 -> + ( mkParType happy_var_1 happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn33 r))++happyReduce_65 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_65 = happyMonadReduce 4# 18# happyReduction_65+happyReduction_65 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut86 happy_x_4 of { happy_var_4 -> + ( fmap (DParameterConstraint . distrLoc)+ (mkProp happy_var_4))})+ ) (\r -> happyReturn (happyIn33 r))++happyReduce_66 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_66 = happySpecReduce_1 19# happyReduction_66+happyReduction_66 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (White DocStr) _))) -> + happyIn34+ (mkDoc (fmap tokenText happy_var_1)+ )}++happyReduce_67 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_67 = happySpecReduce_1 20# happyReduction_67+happyReduction_67 happy_x_1+ = case happyOut34 happy_x_1 of { happy_var_1 -> + happyIn35+ (Just happy_var_1+ )}++happyReduce_68 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_68 = happySpecReduce_0 20# happyReduction_68+happyReduction_68 = happyIn35+ (Nothing+ )++happyReduce_69 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_69 = happySpecReduce_3 21# happyReduction_69+happyReduction_69 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut40 happy_x_1 of { happy_var_1 -> + case happyOut78 happy_x_3 of { happy_var_3 -> + happyIn36+ (at (head happy_var_1,happy_var_3) $ DSignature (reverse happy_var_1) happy_var_3+ )}}++happyReduce_70 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_70 = happySpecReduce_3 21# happyReduction_70+happyReduction_70 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut73 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn36+ (at (happy_var_1,happy_var_3) $ DPatBind happy_var_1 happy_var_3+ )}}++happyReduce_71 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_71 = happyReduce 5# 21# happyReduction_71+happyReduction_71 (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 happyOut56 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_5 of { happy_var_5 -> + happyIn36+ (at (happy_var_1,happy_var_5) $ DPatBind (PVar happy_var_2) happy_var_5+ ) `HappyStk` happyRest}}}++happyReduce_72 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_72 = happyReduce 4# 21# happyReduction_72+happyReduction_72 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut41 happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + happyIn36+ (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_73 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_73 = happyReduce 5# 21# happyReduction_73+happyReduction_73 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut74 happy_x_1 of { happy_var_1 -> + case happyOut57 happy_x_2 of { happy_var_2 -> + case happyOut74 happy_x_3 of { happy_var_3 -> + case happyOut48 happy_x_5 of { happy_var_5 -> + happyIn36+ (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_74 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_74 = happyMonadReduce 4# 21# happyReduction_74+happyReduction_74 (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 happyOut95 happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_4 of { happy_var_4 -> + ( at (happy_var_1,happy_var_4) `fmap` mkTySyn happy_var_2 [] happy_var_4)}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_75 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_75 = happyMonadReduce 5# 21# happyReduction_75+happyReduction_75 (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 happyOut95 happy_x_2 of { happy_var_2 -> + case happyOut85 happy_x_3 of { happy_var_3 -> + case happyOut86 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 (happyIn36 r))++happyReduce_76 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_76 = happyMonadReduce 5# 21# happyReduction_76+happyReduction_76 (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_2 of { (Located happy_var_2 (Token (KW KW_constraint) _)) -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut86 happy_x_5 of { happy_var_5 -> + ( at (happy_var_2,happy_var_5) `fmap` mkPropSyn happy_var_3 [] happy_var_5)}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_77 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_77 = happyMonadReduce 6# 21# happyReduction_77+happyReduction_77 (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) tk+ = happyThen ((case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_constraint) _)) -> + case happyOut95 happy_x_3 of { happy_var_3 -> + case happyOut85 happy_x_4 of { happy_var_4 -> + case happyOut86 happy_x_6 of { happy_var_6 -> + ( at (happy_var_2,happy_var_6) `fmap` mkPropSyn happy_var_3 (reverse happy_var_4) happy_var_6)}}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_78 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_78 = happyMonadReduce 3# 21# happyReduction_78+happyReduction_78 (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 happyOut59 happy_x_3 of { happy_var_3 -> + ( mkFixity LeftAssoc happy_var_2 (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_79 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_79 = happyMonadReduce 3# 21# happyReduction_79+happyReduction_79 (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 happyOut59 happy_x_3 of { happy_var_3 -> + ( mkFixity RightAssoc happy_var_2 (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_80 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_80 = happyMonadReduce 3# 21# happyReduction_80+happyReduction_80 (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 happyOut59 happy_x_3 of { happy_var_3 -> + ( mkFixity NonAssoc happy_var_2 (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_81 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_81 = happyMonadReduce 1# 21# happyReduction_81+happyReduction_81 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((( expected "a declaration"))+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_82 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_82 = happyReduce 4# 22# happyReduction_82+happyReduction_82 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut73 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + happyIn37+ (at (happy_var_2,happy_var_4) $ DPatBind happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_83 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_83 = happyReduce 5# 22# happyReduction_83+happyReduction_83 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut95 happy_x_2 of { happy_var_2 -> + case happyOut42 happy_x_3 of { happy_var_3 -> + case happyOut48 happy_x_5 of { happy_var_5 -> + happyIn37+ (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_84 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_84 = happyReduce 4# 23# happyReduction_84+happyReduction_84 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut98 happy_x_2 of { happy_var_2 -> + case happyOut39 happy_x_4 of { happy_var_4 -> + happyIn38+ (Newtype { nName = happy_var_2, nParams = [], nBody = happy_var_4 }+ ) `HappyStk` happyRest}}++happyReduce_85 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_85 = happyReduce 5# 23# happyReduction_85+happyReduction_85 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut98 happy_x_2 of { happy_var_2 -> + case happyOut85 happy_x_3 of { happy_var_3 -> + case happyOut39 happy_x_5 of { happy_var_5 -> + happyIn38+ (Newtype { nName = happy_var_2, nParams = happy_var_3, nBody = happy_var_5 }+ ) `HappyStk` happyRest}}}++happyReduce_86 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_86 = happySpecReduce_2 24# happyReduction_86+happyReduction_86 happy_x_2+ happy_x_1+ = happyIn39+ ([]+ )++happyReduce_87 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_87 = happySpecReduce_3 24# happyReduction_87+happyReduction_87 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut93 happy_x_2 of { happy_var_2 -> + happyIn39+ (happy_var_2+ )}++happyReduce_88 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_88 = happySpecReduce_1 25# happyReduction_88+happyReduction_88 happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn40+ ([ happy_var_1]+ )}++happyReduce_89 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_89 = happySpecReduce_3 25# happyReduction_89+happyReduction_89 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut40 happy_x_1 of { happy_var_1 -> + case happyOut41 happy_x_3 of { happy_var_3 -> + happyIn40+ (happy_var_3 : happy_var_1+ )}}++happyReduce_90 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_90 = happySpecReduce_1 26# happyReduction_90+happyReduction_90 happy_x_1+ = case happyOut95 happy_x_1 of { happy_var_1 -> + happyIn41+ (happy_var_1+ )}++happyReduce_91 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_91 = happySpecReduce_3 26# happyReduction_91+happyReduction_91 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut56 happy_x_2 of { happy_var_2 -> + happyIn41+ (happy_var_2+ )}++happyReduce_92 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_92 = happySpecReduce_1 27# happyReduction_92+happyReduction_92 happy_x_1+ = case happyOut74 happy_x_1 of { happy_var_1 -> + happyIn42+ ([happy_var_1]+ )}++happyReduce_93 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_93 = happySpecReduce_2 27# happyReduction_93+happyReduction_93 happy_x_2+ happy_x_1+ = case happyOut43 happy_x_1 of { happy_var_1 -> + case happyOut74 happy_x_2 of { happy_var_2 -> + happyIn42+ (happy_var_2 : happy_var_1+ )}}++happyReduce_94 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_94 = happySpecReduce_1 28# happyReduction_94+happyReduction_94 happy_x_1+ = case happyOut74 happy_x_1 of { happy_var_1 -> + happyIn43+ ([happy_var_1]+ )}++happyReduce_95 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_95 = happySpecReduce_2 28# happyReduction_95+happyReduction_95 happy_x_2+ happy_x_1+ = case happyOut43 happy_x_1 of { happy_var_1 -> + case happyOut74 happy_x_2 of { happy_var_2 -> + happyIn43+ (happy_var_2 : happy_var_1+ )}}++happyReduce_96 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_96 = happySpecReduce_2 29# happyReduction_96+happyReduction_96 happy_x_2+ happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn44+ ([happy_var_1]+ )}++happyReduce_97 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_97 = happySpecReduce_3 29# happyReduction_97+happyReduction_97 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut36 happy_x_2 of { happy_var_2 -> + happyIn44+ (happy_var_2 : happy_var_1+ )}}++happyReduce_98 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_98 = happySpecReduce_1 30# happyReduction_98+happyReduction_98 happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn45+ ([happy_var_1]+ )}++happyReduce_99 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_99 = happySpecReduce_3 30# happyReduction_99+happyReduction_99 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut36 happy_x_3 of { happy_var_3 -> + happyIn45+ (happy_var_3 : happy_var_1+ )}}++happyReduce_100 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_100 = happySpecReduce_3 30# happyReduction_100+happyReduction_100 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut36 happy_x_3 of { happy_var_3 -> + happyIn45+ (happy_var_3 : happy_var_1+ )}}++happyReduce_101 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_101 = happySpecReduce_3 31# happyReduction_101+happyReduction_101 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_2+ )}++happyReduce_102 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_102 = happySpecReduce_2 31# happyReduction_102+happyReduction_102 happy_x_2+ happy_x_1+ = happyIn46+ ([]+ )++happyReduce_103 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_103 = happySpecReduce_1 32# happyReduction_103+happyReduction_103 happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + happyIn47+ (ExprInput happy_var_1+ )}++happyReduce_104 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_104 = happySpecReduce_1 32# happyReduction_104+happyReduction_104 happy_x_1+ = case happyOut37 happy_x_1 of { happy_var_1 -> + happyIn47+ (LetInput happy_var_1+ )}++happyReduce_105 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_105 = happySpecReduce_1 33# happyReduction_105+happyReduction_105 happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + happyIn48+ (happy_var_1+ )}++happyReduce_106 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_106 = happyReduce 4# 33# happyReduction_106+happyReduction_106 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym CurlyR ) _)) -> + happyIn48+ (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 []+ ) `HappyStk` happyRest}}++happyReduce_107 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_107 = happyReduce 5# 33# happyReduction_107+happyReduction_107 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym CurlyR ) _)) -> + happyIn48+ (at (happy_var_1,happy_var_5) $ EWhere happy_var_1 (reverse happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_108 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_108 = happyReduce 4# 33# happyReduction_108+happyReduction_108 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_where ) _)) -> + happyIn48+ (at (happy_var_1,happy_var_2) $ EWhere happy_var_1 []+ ) `HappyStk` happyRest}}++happyReduce_109 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_109 = happyReduce 5# 33# happyReduction_109+happyReduction_109 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_4 of { happy_var_4 -> + happyIn48+ (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 (reverse happy_var_4)+ ) `HappyStk` happyRest}}++happyReduce_110 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_110 = happyMonadReduce 1# 33# happyReduction_110+happyReduction_110 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((( expected "an expression"))+ ) (\r -> happyReturn (happyIn48 r))++happyReduce_111 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_111 = happySpecReduce_1 34# happyReduction_111+happyReduction_111 happy_x_1+ = case happyOut50 happy_x_1 of { happy_var_1 -> + happyIn49+ ([happy_var_1]+ )}++happyReduce_112 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_112 = happySpecReduce_3 34# happyReduction_112+happyReduction_112 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOut50 happy_x_3 of { happy_var_3 -> + happyIn49+ (happy_var_3 : happy_var_1+ )}}++happyReduce_113 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_113 = happySpecReduce_3 35# happyReduction_113+happyReduction_113 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn50+ ((happy_var_1, happy_var_3)+ )}}++happyReduce_114 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_114 = happySpecReduce_1 36# happyReduction_114+happyReduction_114 happy_x_1+ = case happyOut52 happy_x_1 of { happy_var_1 -> + happyIn51+ (happy_var_1+ )}++happyReduce_115 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_115 = happyReduce 4# 36# happyReduction_115+happyReduction_115 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_if ) _)) -> + case happyOut49 happy_x_2 of { happy_var_2 -> + case happyOut51 happy_x_4 of { happy_var_4 -> + happyIn51+ (at (happy_var_1,happy_var_4) $ mkIf (reverse happy_var_2) happy_var_4+ ) `HappyStk` happyRest}}}++happyReduce_116 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_116 = happyReduce 4# 36# happyReduction_116+happyReduction_116 (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 happyOut42 happy_x_2 of { happy_var_2 -> + case happyOut51 happy_x_4 of { happy_var_4 -> + happyIn51+ (at (happy_var_1,happy_var_4) $ EFun (reverse happy_var_2) happy_var_4+ ) `HappyStk` happyRest}}}++happyReduce_117 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_117 = happySpecReduce_1 37# happyReduction_117+happyReduction_117 happy_x_1+ = case happyOut53 happy_x_1 of { happy_var_1 -> + happyIn52+ (happy_var_1+ )}++happyReduce_118 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_118 = happySpecReduce_3 37# happyReduction_118+happyReduction_118 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut53 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn52+ (at (happy_var_1,happy_var_3) $ ETyped happy_var_1 happy_var_3+ )}}++happyReduce_119 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_119 = happySpecReduce_1 38# happyReduction_119+happyReduction_119 happy_x_1+ = case happyOut54 happy_x_1 of { happy_var_1 -> + happyIn53+ (happy_var_1+ )}++happyReduce_120 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_120 = happySpecReduce_3 38# happyReduction_120+happyReduction_120 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut53 happy_x_1 of { happy_var_1 -> + case happyOut55 happy_x_2 of { happy_var_2 -> + case happyOut54 happy_x_3 of { happy_var_3 -> + happyIn53+ (binOp happy_var_1 happy_var_2 happy_var_3+ )}}}++happyReduce_121 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_121 = happySpecReduce_1 39# happyReduction_121+happyReduction_121 happy_x_1+ = case happyOut60 happy_x_1 of { happy_var_1 -> + happyIn54+ (mkEApp happy_var_1+ )}++happyReduce_122 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_122 = happySpecReduce_2 39# happyReduction_122+happyReduction_122 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> + case happyOut54 happy_x_2 of { happy_var_2 -> + happyIn54+ (at (happy_var_1,happy_var_2) $ ENeg happy_var_2+ )}}++happyReduce_123 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_123 = happySpecReduce_2 39# happyReduction_123+happyReduction_123 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> + case happyOut54 happy_x_2 of { happy_var_2 -> + happyIn54+ (at (happy_var_1,happy_var_2) $ EComplement happy_var_2+ )}}++happyReduce_124 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_124 = happySpecReduce_1 40# happyReduction_124+happyReduction_124 happy_x_1+ = case happyOut56 happy_x_1 of { happy_var_1 -> + happyIn55+ (happy_var_1+ )}++happyReduce_125 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_125 = happySpecReduce_1 40# happyReduction_125+happyReduction_125 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op Other{} ) _))) -> + happyIn55+ (let Token (Op (Other ns i)) _ = thing happy_var_1+ in mkQual (mkModName ns) (mkInfix i) A.<$ happy_var_1+ )}++happyReduce_126 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_126 = happySpecReduce_1 41# happyReduction_126+happyReduction_126 happy_x_1+ = case happyOut57 happy_x_1 of { happy_var_1 -> + happyIn56+ (happy_var_1+ )}++happyReduce_127 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_127 = happySpecReduce_1 41# happyReduction_127+happyReduction_127 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> + happyIn56+ (Located happy_var_1 $ mkUnqual $ mkInfix "#"+ )}++happyReduce_128 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_128 = happySpecReduce_1 42# happyReduction_128+happyReduction_128 happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + happyIn57+ (happy_var_1+ )}++happyReduce_129 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_129 = happySpecReduce_1 42# happyReduction_129+happyReduction_129 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul) _)) -> + happyIn57+ (Located happy_var_1 $ mkUnqual $ mkInfix "*"+ )}++happyReduce_130 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_130 = happySpecReduce_1 42# happyReduction_130+happyReduction_130 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Plus) _)) -> + happyIn57+ (Located happy_var_1 $ mkUnqual $ mkInfix "+"+ )}++happyReduce_131 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_131 = happySpecReduce_1 42# happyReduction_131+happyReduction_131 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> + happyIn57+ (Located happy_var_1 $ mkUnqual $ mkInfix "-"+ )}++happyReduce_132 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_132 = happySpecReduce_1 42# happyReduction_132+happyReduction_132 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> + happyIn57+ (Located happy_var_1 $ mkUnqual $ mkInfix "~"+ )}++happyReduce_133 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_133 = happySpecReduce_1 42# happyReduction_133+happyReduction_133 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Exp) _)) -> + happyIn57+ (Located happy_var_1 $ mkUnqual $ mkInfix "^^"+ )}++happyReduce_134 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_134 = happySpecReduce_1 43# happyReduction_134+happyReduction_134 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op (Other [] _)) _))) -> + happyIn58+ (let Token (Op (Other [] str)) _ = thing happy_var_1+ in mkUnqual (mkInfix str) A.<$ happy_var_1+ )}++happyReduce_135 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_135 = happySpecReduce_1 44# happyReduction_135+happyReduction_135 happy_x_1+ = case happyOut56 happy_x_1 of { happy_var_1 -> + happyIn59+ ([happy_var_1]+ )}++happyReduce_136 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_136 = happySpecReduce_3 44# happyReduction_136+happyReduction_136 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut59 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_3 of { happy_var_3 -> + happyIn59+ (happy_var_3 : happy_var_1+ )}}++happyReduce_137 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_137 = happySpecReduce_1 45# happyReduction_137+happyReduction_137 happy_x_1+ = case happyOut61 happy_x_1 of { happy_var_1 -> + happyIn60+ ([happy_var_1]+ )}++happyReduce_138 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_138 = happySpecReduce_2 45# happyReduction_138+happyReduction_138 happy_x_2+ happy_x_1+ = case happyOut60 happy_x_1 of { happy_var_1 -> + case happyOut61 happy_x_2 of { happy_var_2 -> + happyIn60+ (happy_var_2 : happy_var_1+ )}}++happyReduce_139 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_139 = happySpecReduce_1 46# happyReduction_139+happyReduction_139 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn61+ (at happy_var_1 $ EVar (thing happy_var_1)+ )}++happyReduce_140 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_140 = happySpecReduce_1 46# happyReduction_140+happyReduction_140 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num {}) _))) -> + happyIn61+ (at happy_var_1 $ numLit (tokenType (thing happy_var_1))+ )}++happyReduce_141 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_141 = happySpecReduce_1 46# happyReduction_141+happyReduction_141 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (StrLit {}) _))) -> + happyIn61+ (at happy_var_1 $ ELit $ ECString $ getStr happy_var_1+ )}++happyReduce_142 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_142 = happySpecReduce_1 46# happyReduction_142+happyReduction_142 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> + happyIn61+ (at happy_var_1 $ ELit $ ECNum (getNum happy_var_1) CharLit+ )}++happyReduce_143 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_143 = happySpecReduce_3 46# happyReduction_143+happyReduction_143 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut48 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_3) $ EParens happy_var_2+ )}}}++happyReduce_144 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_144 = happySpecReduce_3 46# happyReduction_144+happyReduction_144 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_3) $ ETuple (reverse happy_var_2)+ )}}}++happyReduce_145 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_145 = happySpecReduce_2 46# happyReduction_145+happyReduction_145 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 ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_2) $ ETuple []+ )}}++happyReduce_146 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_146 = happySpecReduce_2 46# happyReduction_146+happyReduction_146 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 ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_2) $ ERecord []+ )}}++happyReduce_147 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_147 = happySpecReduce_3 46# happyReduction_147+happyReduction_147 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut67 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_3) $ ERecord (reverse happy_var_2)+ )}}}++happyReduce_148 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_148 = happySpecReduce_2 46# happyReduction_148+happyReduction_148 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) _)) -> + happyIn61+ (at (happy_var_1,happy_var_2) $ EList []+ )}}++happyReduce_149 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_149 = happySpecReduce_3 46# happyReduction_149+happyReduction_149 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) _)) -> + happyIn61+ (at (happy_var_1,happy_var_3) happy_var_2+ )}}}++happyReduce_150 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_150 = happySpecReduce_2 46# happyReduction_150+happyReduction_150 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BackTick) _)) -> + case happyOut100 happy_x_2 of { happy_var_2 -> + happyIn61+ (at (happy_var_1,happy_var_2) $ ETypeVal happy_var_2+ )}}++happyReduce_151 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_151 = happySpecReduce_3 46# happyReduction_151+happyReduction_151 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut61 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_3 of { happy_var_3 -> + happyIn61+ (at (happy_var_1,happy_var_3) $ ESel happy_var_1 (thing happy_var_3)+ )}}++happyReduce_152 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_152 = happySpecReduce_3 46# happyReduction_152+happyReduction_152 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut55 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn61+ (at (happy_var_1,happy_var_3) $ EVar $ thing happy_var_2+ )}}}++happyReduce_153 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_153 = happyMonadReduce 2# 46# happyReduction_153+happyReduction_153 (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 (happyIn61 r))++happyReduce_154 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_154 = happyMonadReduce 3# 46# happyReduction_154+happyReduction_154 (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 happyOut62 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 (happyIn61 r))++happyReduce_155 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_155 = happySpecReduce_1 47# happyReduction_155+happyReduction_155 happy_x_1+ = case happyOut63 happy_x_1 of { happy_var_1 -> + happyIn62+ ([happy_var_1]+ )}++happyReduce_156 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_156 = happySpecReduce_3 47# happyReduction_156+happyReduction_156 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut62 happy_x_1 of { happy_var_1 -> + case happyOut63 happy_x_3 of { happy_var_3 -> + happyIn62+ (happy_var_3 : happy_var_1+ )}}++happyReduce_157 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_157 = happyMonadReduce 1# 48# happyReduction_157+happyReduction_157 (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 (happyIn63 r))++happyReduce_158 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_158 = happyMonadReduce 1# 48# happyReduction_158+happyReduction_158 (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 (happyIn63 r))++happyReduce_159 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_159 = happyMonadReduce 3# 48# happyReduction_159+happyReduction_159 (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 (happyIn63 r))++happyReduce_160 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_160 = happySpecReduce_1 49# happyReduction_160+happyReduction_160 happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + happyIn64+ (fmap (`RecordSel` Nothing) happy_var_1+ )}++happyReduce_161 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_161 = happyMonadReduce 1# 49# happyReduction_161+happyReduction_161 (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 (happyIn64 r))++happyReduce_162 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_162 = happySpecReduce_3 50# happyReduction_162+happyReduction_162 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn65+ ([ happy_var_3, happy_var_1]+ )}}++happyReduce_163 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+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 happyOut48 happy_x_3 of { happy_var_3 -> + happyIn65+ (happy_var_3 : happy_var_1+ )}}++happyReduce_164 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_164 = happySpecReduce_3 51# happyReduction_164+happyReduction_164 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn66+ (Named { name = happy_var_1, value = happy_var_3 }+ )}}++happyReduce_165 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_165 = happyReduce 4# 51# happyReduction_165+happyReduction_165 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + happyIn66+ (Named { name = happy_var_1, value = EFun (reverse happy_var_2) happy_var_4 }+ ) `HappyStk` happyRest}}}++happyReduce_166 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_166 = happySpecReduce_1 52# happyReduction_166+happyReduction_166 happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + happyIn67+ ([happy_var_1]+ )}++happyReduce_167 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_167 = happySpecReduce_3 52# happyReduction_167+happyReduction_167 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut67 happy_x_1 of { happy_var_1 -> + case happyOut66 happy_x_3 of { happy_var_3 -> + happyIn67+ (happy_var_3 : happy_var_1+ )}}++happyReduce_168 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_168 = happySpecReduce_3 53# happyReduction_168+happyReduction_168 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut69 happy_x_3 of { happy_var_3 -> + happyIn68+ (EComp happy_var_1 (reverse happy_var_3)+ )}}++happyReduce_169 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_169 = happySpecReduce_1 53# happyReduction_169+happyReduction_169 happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + happyIn68+ (EList [happy_var_1]+ )}++happyReduce_170 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_170 = happySpecReduce_1 53# happyReduction_170+happyReduction_170 happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + happyIn68+ (EList (reverse happy_var_1)+ )}++happyReduce_171 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_171 = happyMonadReduce 2# 53# happyReduction_171+happyReduction_171 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut48 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 (happyIn68 r))++happyReduce_172 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_172 = happyMonadReduce 3# 53# happyReduction_172+happyReduction_172 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot ) _)) -> + case happyOut48 happy_x_3 of { happy_var_3 -> + ( eFromTo happy_var_2 happy_var_1 Nothing (Just happy_var_3))}}})+ ) (\r -> happyReturn (happyIn68 r))++happyReduce_173 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_173 = happyMonadReduce 4# 53# happyReduction_173+happyReduction_173 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut48 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 (happyIn68 r))++happyReduce_174 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_174 = happyMonadReduce 5# 53# happyReduction_174+happyReduction_174 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot ) _)) -> + case happyOut48 happy_x_5 of { happy_var_5 -> + ( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) (Just happy_var_5))}}}})+ ) (\r -> happyReturn (happyIn68 r))++happyReduce_175 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_175 = happySpecReduce_2 53# happyReduction_175+happyReduction_175 happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + happyIn68+ (EInfFrom happy_var_1 Nothing+ )}++happyReduce_176 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_176 = happyReduce 4# 53# happyReduction_176+happyReduction_176 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn68+ (EInfFrom happy_var_1 (Just happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_177 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_177 = happySpecReduce_1 54# happyReduction_177+happyReduction_177 happy_x_1+ = case happyOut70 happy_x_1 of { happy_var_1 -> + happyIn69+ ([ reverse happy_var_1 ]+ )}++happyReduce_178 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_178 = happySpecReduce_3 54# happyReduction_178+happyReduction_178 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut69 happy_x_1 of { happy_var_1 -> + case happyOut70 happy_x_3 of { happy_var_3 -> + happyIn69+ (reverse happy_var_3 : happy_var_1+ )}}++happyReduce_179 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_179 = happySpecReduce_1 55# happyReduction_179+happyReduction_179 happy_x_1+ = case happyOut71 happy_x_1 of { happy_var_1 -> + happyIn70+ ([happy_var_1]+ )}++happyReduce_180 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_180 = happySpecReduce_3 55# happyReduction_180+happyReduction_180 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut70 happy_x_1 of { happy_var_1 -> + case happyOut71 happy_x_3 of { happy_var_3 -> + happyIn70+ (happy_var_3 : happy_var_1+ )}}++happyReduce_181 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_181 = happySpecReduce_3 56# happyReduction_181+happyReduction_181 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut72 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn71+ (Match happy_var_1 happy_var_3+ )}}++happyReduce_182 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_182 = happySpecReduce_3 57# happyReduction_182+happyReduction_182 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut73 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn72+ (at (happy_var_1,happy_var_3) $ PTyped happy_var_1 happy_var_3+ )}}++happyReduce_183 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_183 = happySpecReduce_1 57# happyReduction_183+happyReduction_183 happy_x_1+ = case happyOut73 happy_x_1 of { happy_var_1 -> + happyIn72+ (happy_var_1+ )}++happyReduce_184 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_184 = happySpecReduce_3 58# happyReduction_184+happyReduction_184 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut73 happy_x_1 of { happy_var_1 -> + case happyOut73 happy_x_3 of { happy_var_3 -> + happyIn73+ (at (happy_var_1,happy_var_3) $ PSplit happy_var_1 happy_var_3+ )}}++happyReduce_185 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_185 = happySpecReduce_1 58# happyReduction_185+happyReduction_185 happy_x_1+ = case happyOut74 happy_x_1 of { happy_var_1 -> + happyIn73+ (happy_var_1+ )}++happyReduce_186 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_186 = happySpecReduce_1 59# happyReduction_186+happyReduction_186 happy_x_1+ = case happyOut95 happy_x_1 of { happy_var_1 -> + happyIn74+ (PVar happy_var_1+ )}++happyReduce_187 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_187 = happySpecReduce_1 59# happyReduction_187+happyReduction_187 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> + happyIn74+ (at happy_var_1 $ PWild+ )}++happyReduce_188 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_188 = happySpecReduce_2 59# happyReduction_188+happyReduction_188 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 ) _)) -> + happyIn74+ (at (happy_var_1,happy_var_2) $ PTuple []+ )}}++happyReduce_189 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_189 = happySpecReduce_3 59# happyReduction_189+happyReduction_189 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 ) _)) -> + happyIn74+ (at (happy_var_1,happy_var_3) happy_var_2+ )}}}++happyReduce_190 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_190 = happySpecReduce_3 59# happyReduction_190+happyReduction_190 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn74+ (at (happy_var_1,happy_var_3) $ PTuple (reverse happy_var_2)+ )}}}++happyReduce_191 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_191 = happySpecReduce_2 59# happyReduction_191+happyReduction_191 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) _)) -> + happyIn74+ (at (happy_var_1,happy_var_2) $ PList []+ )}}++happyReduce_192 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_192 = happySpecReduce_3 59# 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 BracketL) _)) -> + case happyOut72 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> + happyIn74+ (at (happy_var_1,happy_var_3) $ PList [happy_var_2]+ )}}}++happyReduce_193 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_193 = happySpecReduce_3 59# happyReduction_193+happyReduction_193 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> + happyIn74+ (at (happy_var_1,happy_var_3) $ PList (reverse happy_var_2)+ )}}}++happyReduce_194 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_194 = happySpecReduce_2 59# happyReduction_194+happyReduction_194 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 ) _)) -> + happyIn74+ (at (happy_var_1,happy_var_2) $ PRecord []+ )}}++happyReduce_195 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_195 = happySpecReduce_3 59# happyReduction_195+happyReduction_195 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut77 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn74+ (at (happy_var_1,happy_var_3) $ PRecord (reverse happy_var_2)+ )}}}++happyReduce_196 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_196 = happySpecReduce_3 60# happyReduction_196+happyReduction_196 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut72 happy_x_1 of { happy_var_1 -> + case happyOut72 happy_x_3 of { happy_var_3 -> + happyIn75+ ([happy_var_3, happy_var_1]+ )}}++happyReduce_197 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_197 = happySpecReduce_3 60# happyReduction_197+happyReduction_197 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut75 happy_x_1 of { happy_var_1 -> + case happyOut72 happy_x_3 of { happy_var_3 -> + happyIn75+ (happy_var_3 : happy_var_1+ )}}++happyReduce_198 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_198 = happySpecReduce_3 61# happyReduction_198+happyReduction_198 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut72 happy_x_3 of { happy_var_3 -> + happyIn76+ (Named { name = happy_var_1, value = happy_var_3 }+ )}}++happyReduce_199 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_199 = happySpecReduce_1 62# happyReduction_199+happyReduction_199 happy_x_1+ = case happyOut76 happy_x_1 of { happy_var_1 -> + happyIn77+ ([happy_var_1]+ )}++happyReduce_200 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_200 = happySpecReduce_3 62# happyReduction_200+happyReduction_200 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut77 happy_x_1 of { happy_var_1 -> + case happyOut76 happy_x_3 of { happy_var_3 -> + happyIn77+ (happy_var_3 : happy_var_1+ )}}++happyReduce_201 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_201 = happySpecReduce_1 63# happyReduction_201+happyReduction_201 happy_x_1+ = case happyOut86 happy_x_1 of { happy_var_1 -> + happyIn78+ (at happy_var_1 $ mkSchema [] [] happy_var_1+ )}++happyReduce_202 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_202 = happySpecReduce_2 63# happyReduction_202+happyReduction_202 happy_x_2+ happy_x_1+ = case happyOut79 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_2 of { happy_var_2 -> + happyIn78+ (at (happy_var_1,happy_var_2) $ mkSchema (thing happy_var_1) [] happy_var_2+ )}}++happyReduce_203 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_203 = happySpecReduce_2 63# happyReduction_203+happyReduction_203 happy_x_2+ happy_x_1+ = case happyOut80 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_2 of { happy_var_2 -> + happyIn78+ (at (happy_var_1,happy_var_2) $ mkSchema [] (thing happy_var_1) happy_var_2+ )}}++happyReduce_204 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_204 = happySpecReduce_3 63# happyReduction_204+happyReduction_204 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut79 happy_x_1 of { happy_var_1 -> + case happyOut80 happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn78+ (at (happy_var_1,happy_var_3) $ mkSchema (thing happy_var_1)+ (thing happy_var_2) happy_var_3+ )}}}++happyReduce_205 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_205 = happySpecReduce_2 64# happyReduction_205+happyReduction_205 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 ) _)) -> + happyIn79+ (Located (rComb happy_var_1 happy_var_2) []+ )}}++happyReduce_206 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_206 = happySpecReduce_3 64# happyReduction_206+happyReduction_206 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 ) _)) -> + happyIn79+ (Located (rComb happy_var_1 happy_var_3) (reverse happy_var_2)+ )}}}++happyReduce_207 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_207 = happyMonadReduce 2# 65# happyReduction_207+happyReduction_207 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut86 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 (happyIn80 r))++happyReduce_208 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_208 = happySpecReduce_1 66# happyReduction_208+happyReduction_208 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> + happyIn81+ (Located happy_var_1 KNum+ )}++happyReduce_209 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_209 = happySpecReduce_1 66# happyReduction_209+happyReduction_209 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul) _)) -> + happyIn81+ (Located happy_var_1 KType+ )}++happyReduce_210 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_210 = happySpecReduce_3 66# happyReduction_210+happyReduction_210 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut81 happy_x_1 of { happy_var_1 -> + case happyOut81 happy_x_3 of { happy_var_3 -> + happyIn81+ (combLoc KFun happy_var_1 happy_var_3+ )}}++happyReduce_211 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_211 = happyMonadReduce 1# 67# happyReduction_211+happyReduction_211 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut94 happy_x_1 of { happy_var_1 -> + ( mkTParam happy_var_1 Nothing)})+ ) (\r -> happyReturn (happyIn82 r))++happyReduce_212 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_212 = happyMonadReduce 3# 67# happyReduction_212+happyReduction_212 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut81 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 (happyIn82 r))++happyReduce_213 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_213 = happySpecReduce_1 68# happyReduction_213+happyReduction_213 happy_x_1+ = case happyOut82 happy_x_1 of { happy_var_1 -> + happyIn83+ ([happy_var_1]+ )}++happyReduce_214 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_214 = happySpecReduce_3 68# happyReduction_214+happyReduction_214 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 -> + happyIn83+ (happy_var_3 : happy_var_1+ )}}++happyReduce_215 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_215 = happyMonadReduce 1# 69# happyReduction_215+happyReduction_215 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut94 happy_x_1 of { happy_var_1 -> + ( mkTParam happy_var_1 Nothing)})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_216 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_216 = happyMonadReduce 5# 69# happyReduction_216+happyReduction_216 (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 happyOut94 happy_x_2 of { happy_var_2 -> + case happyOut81 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 (happyIn84 r))++happyReduce_217 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_217 = happySpecReduce_1 70# happyReduction_217+happyReduction_217 happy_x_1+ = case happyOut84 happy_x_1 of { happy_var_1 -> + happyIn85+ ([happy_var_1]+ )}++happyReduce_218 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_218 = happySpecReduce_2 70# happyReduction_218+happyReduction_218 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_219 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_219 = happySpecReduce_3 71# happyReduction_219+happyReduction_219 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut87 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn86+ (at (happy_var_1,happy_var_3) $ TFun happy_var_1 happy_var_3+ )}}++happyReduce_220 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_220 = happySpecReduce_3 71# happyReduction_220+happyReduction_220 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut86 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_2 of { happy_var_2 -> + case happyOut87 happy_x_3 of { happy_var_3 -> + happyIn86+ (at (happy_var_1,happy_var_3) $ TInfix happy_var_1 happy_var_2 defaultFixity happy_var_3+ )}}}++happyReduce_221 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_221 = happySpecReduce_1 71# happyReduction_221+happyReduction_221 happy_x_1+ = case happyOut87 happy_x_1 of { happy_var_1 -> + happyIn86+ (happy_var_1+ )}++happyReduce_222 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_222 = happySpecReduce_2 72# happyReduction_222+happyReduction_222 happy_x_2+ happy_x_1+ = case happyOut90 happy_x_1 of { happy_var_1 -> + case happyOut88 happy_x_2 of { happy_var_2 -> + happyIn87+ (at (happy_var_1,happy_var_2) $ foldr TSeq happy_var_2 (reverse (thing happy_var_1))+ )}}++happyReduce_223 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_223 = happySpecReduce_2 72# happyReduction_223+happyReduction_223 happy_x_2+ happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + case happyOut89 happy_x_2 of { happy_var_2 -> + happyIn87+ (at (happy_var_1,head happy_var_2)+ $ TUser (thing happy_var_1) (reverse happy_var_2)+ )}}++happyReduce_224 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_224 = happySpecReduce_1 72# happyReduction_224+happyReduction_224 happy_x_1+ = case happyOut88 happy_x_1 of { happy_var_1 -> + happyIn87+ (happy_var_1+ )}++happyReduce_225 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_225 = happySpecReduce_1 73# happyReduction_225+happyReduction_225 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn88+ (at happy_var_1 $ TUser (thing happy_var_1) []+ )}++happyReduce_226 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_226 = happySpecReduce_1 73# happyReduction_226+happyReduction_226 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num {}) _))) -> + happyIn88+ (at happy_var_1 $ TNum (getNum happy_var_1)+ )}++happyReduce_227 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_227 = happySpecReduce_1 73# happyReduction_227+happyReduction_227 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> + happyIn88+ (at happy_var_1 $ TChar (toEnum $ fromInteger+ $ getNum happy_var_1)+ )}++happyReduce_228 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_228 = happySpecReduce_3 73# happyReduction_228+happyReduction_228 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> + happyIn88+ (at (happy_var_1,happy_var_3) $ TSeq happy_var_2 TBit+ )}}}++happyReduce_229 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_229 = happySpecReduce_3 73# happyReduction_229+happyReduction_229 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn88+ (at (happy_var_1,happy_var_3) $ TParens happy_var_2+ )}}}++happyReduce_230 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_230 = happySpecReduce_2 73# happyReduction_230+happyReduction_230 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 ) _)) -> + happyIn88+ (at (happy_var_1,happy_var_2) $ TTuple []+ )}}++happyReduce_231 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_231 = happySpecReduce_3 73# happyReduction_231+happyReduction_231 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL ) _)) -> + case happyOut91 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR ) _)) -> + happyIn88+ (at (happy_var_1,happy_var_3) $ TTuple (reverse happy_var_2)+ )}}}++happyReduce_232 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_232 = happySpecReduce_2 73# happyReduction_232+happyReduction_232 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 ) _)) -> + happyIn88+ (at (happy_var_1,happy_var_2) $ TRecord []+ )}}++happyReduce_233 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_233 = happySpecReduce_3 73# happyReduction_233+happyReduction_233 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut93 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn88+ (at (happy_var_1,happy_var_3) $ TRecord (reverse happy_var_2)+ )}}}++happyReduce_234 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_234 = happySpecReduce_1 73# happyReduction_234+happyReduction_234 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> + happyIn88+ (at happy_var_1 TWild+ )}++happyReduce_235 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_235 = happySpecReduce_1 74# happyReduction_235+happyReduction_235 happy_x_1+ = case happyOut88 happy_x_1 of { happy_var_1 -> + happyIn89+ ([ happy_var_1 ]+ )}++happyReduce_236 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_236 = happySpecReduce_2 74# happyReduction_236+happyReduction_236 happy_x_2+ happy_x_1+ = case happyOut89 happy_x_1 of { happy_var_1 -> + case happyOut88 happy_x_2 of { happy_var_2 -> + happyIn89+ (happy_var_2 : happy_var_1+ )}}++happyReduce_237 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_237 = happySpecReduce_3 75# happyReduction_237+happyReduction_237 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> + happyIn90+ (Located (rComb happy_var_1 happy_var_3) [ happy_var_2 ]+ )}}}++happyReduce_238 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_238 = happyReduce 4# 75# happyReduction_238+happyReduction_238 (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 happyOut86 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym BracketR) _)) -> + happyIn90+ (at (happy_var_1,happy_var_4) (fmap (happy_var_3 :) happy_var_1)+ ) `HappyStk` happyRest}}}++happyReduce_239 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_239 = happySpecReduce_3 76# happyReduction_239+happyReduction_239 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut86 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn91+ ([ happy_var_3, happy_var_1]+ )}}++happyReduce_240 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_240 = happySpecReduce_3 76# happyReduction_240+happyReduction_240 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut91 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn91+ (happy_var_3 : happy_var_1+ )}}++happyReduce_241 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_241 = happySpecReduce_3 77# happyReduction_241+happyReduction_241 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn92+ (Named { name = happy_var_1, value = happy_var_3 }+ )}}++happyReduce_242 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_242 = happySpecReduce_1 78# happyReduction_242+happyReduction_242 happy_x_1+ = case happyOut92 happy_x_1 of { happy_var_1 -> + happyIn93+ ([happy_var_1]+ )}++happyReduce_243 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_243 = happySpecReduce_3 78# happyReduction_243+happyReduction_243 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut93 happy_x_1 of { happy_var_1 -> + case happyOut92 happy_x_3 of { happy_var_3 -> + happyIn93+ (happy_var_3 : happy_var_1+ )}}++happyReduce_244 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_244 = happySpecReduce_1 79# happyReduction_244+happyReduction_244 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Ident [] _) _))) -> + happyIn94+ (let Token (Ident _ str) _ = thing happy_var_1+ in happy_var_1 { thing = mkIdent str }+ )}++happyReduce_245 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_245 = happySpecReduce_1 79# happyReduction_245+happyReduction_245 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x) _)) -> + happyIn94+ (Located { srcRange = happy_var_1, thing = mkIdent "x" }+ )}++happyReduce_246 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_246 = happySpecReduce_1 79# happyReduction_246+happyReduction_246 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_private) _)) -> + happyIn94+ (Located { srcRange = happy_var_1, thing = mkIdent "private" }+ )}++happyReduce_247 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_247 = happySpecReduce_1 79# happyReduction_247+happyReduction_247 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_as) _)) -> + happyIn94+ (Located { srcRange = happy_var_1, thing = mkIdent "as" }+ )}++happyReduce_248 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_248 = happySpecReduce_1 79# happyReduction_248+happyReduction_248 happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_hiding) _)) -> + happyIn94+ (Located { srcRange = happy_var_1, thing = mkIdent "hiding" }+ )}++happyReduce_249 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_249 = happySpecReduce_1 80# happyReduction_249+happyReduction_249 happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + happyIn95+ (fmap mkUnqual happy_var_1+ )}++happyReduce_250 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_250 = happySpecReduce_1 81# happyReduction_250+happyReduction_250 happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + happyIn96+ (fmap (mkModName . (:[]) . identText) happy_var_1+ )}++happyReduce_251 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_251 = happySpecReduce_1 81# happyReduction_251+happyReduction_251 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token Ident{} _))) -> + happyIn96+ (let Token (Ident ns i) _ = thing happy_var_1+ in mkModName (ns ++ [i]) A.<$ happy_var_1+ )}++happyReduce_252 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_252 = happySpecReduce_1 82# happyReduction_252+happyReduction_252 happy_x_1+ = case happyOut96 happy_x_1 of { happy_var_1 -> + happyIn97+ (happy_var_1+ )}++happyReduce_253 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_253 = happySpecReduce_2 82# happyReduction_253+happyReduction_253 happy_x_2+ happy_x_1+ = case happyOut96 happy_x_2 of { happy_var_2 -> + happyIn97+ (fmap paramInstModName happy_var_2+ )}++happyReduce_254 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_254 = happySpecReduce_1 83# happyReduction_254+happyReduction_254 happy_x_1+ = case happyOut95 happy_x_1 of { happy_var_1 -> + happyIn98+ (happy_var_1+ )}++happyReduce_255 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_255 = happySpecReduce_1 83# happyReduction_255+happyReduction_255 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token Ident{} _))) -> + happyIn98+ (let Token (Ident ns i) _ = thing happy_var_1+ in mkQual (mkModName ns) (mkIdent i) A.<$ happy_var_1+ )}++happyReduce_256 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_256 = happySpecReduce_1 84# happyReduction_256+happyReduction_256 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn99+ (happy_var_1+ )}++happyReduce_257 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_257 = happySpecReduce_1 84# happyReduction_257+happyReduction_257 happy_x_1+ = case happyOut55 happy_x_1 of { happy_var_1 -> + happyIn99+ (happy_var_1+ )}++happyReduce_258 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_258 = happySpecReduce_3 84# happyReduction_258+happyReduction_258 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut55 happy_x_2 of { happy_var_2 -> + happyIn99+ (happy_var_2+ )}++happyReduce_259 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_259 = happySpecReduce_1 85# happyReduction_259+happyReduction_259 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn100+ (at happy_var_1 $ TUser (thing happy_var_1) []+ )}++happyReduce_260 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_260 = happySpecReduce_1 85# happyReduction_260+happyReduction_260 happy_x_1+ = case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num {}) _))) -> + happyIn100+ (at happy_var_1 $ TNum (getNum happy_var_1)+ )}++happyReduce_261 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_261 = happyMonadReduce 3# 85# happyReduction_261+happyReduction_261 (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 happyOut86 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 (happyIn100 r))++happyReduce_262 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_262 = happySpecReduce_2 85# happyReduction_262+happyReduction_262 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 ) _)) -> + happyIn100+ (at (happy_var_1,happy_var_2) (TRecord [])+ )}}++happyReduce_263 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_263 = happySpecReduce_3 85# happyReduction_263+happyReduction_263 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut102 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn100+ (at (happy_var_1,happy_var_3) (TRecord (reverse happy_var_2))+ )}}}++happyReduce_264 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_264 = happySpecReduce_3 85# happyReduction_264+happyReduction_264 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn100+ (anonRecord (getLoc (happy_var_1,happy_var_3)) [happy_var_2]+ )}}}++happyReduce_265 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_265 = happySpecReduce_3 85# happyReduction_265+happyReduction_265 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL ) _)) -> + case happyOut91 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR ) _)) -> + happyIn100+ (anonRecord (getLoc (happy_var_1,happy_var_3)) (reverse happy_var_2)+ )}}}++happyReduce_266 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_266 = happySpecReduce_3 86# happyReduction_266+happyReduction_266 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + happyIn101+ (Named { name = happy_var_1, value = happy_var_3 }+ )}}++happyReduce_267 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_267 = happySpecReduce_1 87# happyReduction_267+happyReduction_267 happy_x_1+ = case happyOut101 happy_x_1 of { happy_var_1 -> + happyIn102+ ([happy_var_1]+ )}++happyReduce_268 :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )+happyReduce_268 = happySpecReduce_3 87# happyReduction_268+happyReduction_268 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut102 happy_x_1 of { happy_var_1 -> + case happyOut101 happy_x_3 of { happy_var_3 -> + happyIn102+ (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 61# 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_parameter) _) -> cont 11#;+ Located happy_dollar_dollar (Token (KW KW_property) _) -> cont 12#;+ Located happy_dollar_dollar (Token (KW KW_infix) _) -> cont 13#;+ Located happy_dollar_dollar (Token (KW KW_infixl) _) -> cont 14#;+ Located happy_dollar_dollar (Token (KW KW_infixr) _) -> cont 15#;+ Located happy_dollar_dollar (Token (KW KW_type ) _) -> cont 16#;+ Located happy_dollar_dollar (Token (KW KW_newtype) _) -> cont 17#;+ Located happy_dollar_dollar (Token (KW KW_module ) _) -> cont 18#;+ Located happy_dollar_dollar (Token (KW KW_where ) _) -> cont 19#;+ Located happy_dollar_dollar (Token (KW KW_let ) _) -> cont 20#;+ Located happy_dollar_dollar (Token (KW KW_if ) _) -> cont 21#;+ Located happy_dollar_dollar (Token (KW KW_then ) _) -> cont 22#;+ Located happy_dollar_dollar (Token (KW KW_else ) _) -> cont 23#;+ Located happy_dollar_dollar (Token (KW KW_x) _) -> cont 24#;+ Located happy_dollar_dollar (Token (KW KW_primitive) _) -> cont 25#;+ Located happy_dollar_dollar (Token (KW KW_constraint) _) -> cont 26#;+ Located happy_dollar_dollar (Token (Sym BracketL) _) -> cont 27#;+ Located happy_dollar_dollar (Token (Sym BracketR) _) -> cont 28#;+ Located happy_dollar_dollar (Token (Sym ArrL ) _) -> cont 29#;+ Located happy_dollar_dollar (Token (Sym DotDot ) _) -> cont 30#;+ Located happy_dollar_dollar (Token (Sym DotDotDot) _) -> cont 31#;+ Located happy_dollar_dollar (Token (Sym Bar ) _) -> cont 32#;+ Located happy_dollar_dollar (Token (Sym ParenL ) _) -> cont 33#;+ Located happy_dollar_dollar (Token (Sym ParenR ) _) -> cont 34#;+ Located happy_dollar_dollar (Token (Sym Comma ) _) -> cont 35#;+ Located happy_dollar_dollar (Token (Sym Semi ) _) -> cont 36#;+ Located happy_dollar_dollar (Token (Sym Dot ) _) -> cont 37#;+ Located happy_dollar_dollar (Token (Sym CurlyL ) _) -> cont 38#;+ Located happy_dollar_dollar (Token (Sym CurlyR ) _) -> cont 39#;+ Located happy_dollar_dollar (Token (Sym TriL ) _) -> cont 40#;+ Located happy_dollar_dollar (Token (Sym TriR ) _) -> cont 41#;+ Located happy_dollar_dollar (Token (Sym EqDef ) _) -> cont 42#;+ Located happy_dollar_dollar (Token (Sym BackTick) _) -> cont 43#;+ Located happy_dollar_dollar (Token (Sym Colon ) _) -> cont 44#;+ Located happy_dollar_dollar (Token (Sym ArrR ) _) -> cont 45#;+ Located happy_dollar_dollar (Token (Sym FatArrR ) _) -> cont 46#;+ Located happy_dollar_dollar (Token (Sym Lambda ) _) -> cont 47#;+ Located happy_dollar_dollar (Token (Sym Underscore ) _) -> cont 48#;+ Located happy_dollar_dollar (Token (Virt VCurlyL) _) -> cont 49#;+ Located happy_dollar_dollar (Token (Virt VCurlyR) _) -> cont 50#;+ Located happy_dollar_dollar (Token (Virt VSemi) _) -> cont 51#;+ Located happy_dollar_dollar (Token (Op Plus) _) -> cont 52#;+ Located happy_dollar_dollar (Token (Op Mul) _) -> cont 53#;+ Located happy_dollar_dollar (Token (Op Exp) _) -> cont 54#;+ Located happy_dollar_dollar (Token (Op Minus) _) -> cont 55#;+ Located happy_dollar_dollar (Token (Op Complement) _) -> cont 56#;+ Located happy_dollar_dollar (Token (Op Hash) _) -> cont 57#;+ happy_dollar_dollar@(Located _ (Token (Op (Other [] _)) _)) -> cont 58#;+ happy_dollar_dollar@(Located _ (Token (Op Other{} ) _)) -> cont 59#;+ happy_dollar_dollar@(Located _ (Token (White DocStr) _)) -> cont 60#;+ _ -> happyError' (tk, [])+ })++happyError_ explist 61# tk = happyError' (tk, explist)+happyError_ explist _ tk = happyError' (tk, explist)++happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b+happyThen = (>>=)+happyReturn :: () => a -> ParseM a+happyReturn = (return)+happyParse :: () => Happy_GHC_Exts.Int# -> ParseM (HappyAbsSyn )++happyNewToken :: () => Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )++happyDoAction :: () => Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn )++happyReduceArr :: () => Happy_Data_Array.Array Int (Happy_GHC_Exts.Int# -> Located Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> ParseM (HappyAbsSyn ))++happyThen1 :: () => ParseM a -> (a -> ParseM b) -> ParseM b+happyThen1 = happyThen+happyReturn1 :: () => a -> ParseM a+happyReturn1 = happyReturn+happyError' :: () => ((Located Token), [String]) -> ParseM a+happyError' tk = (\(tokens, explist) -> 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 (happyOut48 x))++decl = happySomeParser where+ happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut36 x))++decls = happySomeParser where+ happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut44 x))++declsLayout = happySomeParser where+ happySomeParser = happyThen (happyParse 6#) (\x -> happyReturn (happyOut46 x))++letDecl = happySomeParser where+ happySomeParser = happyThen (happyParse 7#) (\x -> happyReturn (happyOut37 x))++repl = happySomeParser where+ happySomeParser = happyThen (happyParse 8#) (\x -> happyReturn (happyOut47 x))++schema = happySomeParser where+ happySomeParser = happyThen (happyParse 9#) (\x -> happyReturn (happyOut78 x))++modName = happySomeParser where+ happySomeParser = happyThen (happyParse 10#) (\x -> happyReturn (happyOut97 x))++helpName = happySomeParser where+ happySomeParser = happyThen (happyParse 11#) (\x -> happyReturn (happyOut99 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 18 "<built-in>" #-}+{-# LINE 1 "/usr/local/Cellar/ghc/8.4.3/lib/ghc-8.4.3/include/ghcversion.h" #-}+++++++++++++++++{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/var/folders/n8/s7z9ns8d4k39v2y_2sn__12m0000gp/T/ghc93615_0/ghc_2.h" #-}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++{-# LINE 43 "templates/GenericTemplate.hs" #-}++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++++{-# LINE 65 "templates/GenericTemplate.hs" #-}+++{-# LINE 75 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+ ++ case action of+ 0# -> {- nothing -}+ happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Int)) i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+ + (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+ ++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = happyAdjustOffset (indexShortOffAddr happyActOffsets st)+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#+++++{-# INLINE happyLt #-}+happyLt x y = LT(x,y)+++readArrayBit arr bit =+ Bits.testBit (Happy_GHC_Exts.I# (indexShortOffAddr arr ((unbox_int bit) `Happy_GHC_Exts.iShiftRA#` 4#))) (bit `mod` 16)+ where unbox_int (Happy_GHC_Exts.I# x) = x+++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)+++{-# LINE 180 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1)+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st)+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ explist i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail explist i tk (action) sts stk = -- trace "entering error recovery" $ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
dist/build/Cryptol/Parser/Lexer.hs view
@@ -3,774 +3,877 @@ {-# LINE 1 "src/Cryptol/Parser/Lexer.x" #-} -- |--- Module : $Header$--- Copyright : (c) 2013-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ At present Alex generates code with too many warnings.-{-# LANGUAGE Trustworthy #-}-{-# LANGUAGE OverloadedStrings #-}-{-# OPTIONS_GHC -w #-}-module Cryptol.Parser.Lexer- ( primLexer, lexer, Layout(..)- , Token(..), TokenT(..)- , TokenV(..), TokenKW(..), TokenErr(..), TokenSym(..), TokenW(..)- , Located(..)- , Config(..)- , defaultConfig- ) where--import Cryptol.Parser.Position-import Cryptol.Parser.LexerUtils-import Cryptol.Parser.Unlit(unLit)-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as Text--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Array.Base (unsafeAt)-#else-import Array-#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\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\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\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 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--- in this file.--stateToInt :: LexS -> Int-stateToInt Normal = 0-stateToInt (InComment {}) = comment-stateToInt (InString {}) = string-stateToInt (InChar {}) = char---- | Returns the tokens in the last position of the input that we processed.--- White space is removed, and layout processing is done as requested.--- This stream is fed to the parser.-lexer :: Config -> Text -> ([Located Token], Position)-lexer cfg cs = ( case cfgLayout cfg of- Layout -> layout cfg lexemes- NoLayout -> lexemes- , finalPos- )- where (lex0, finalPos) = primLexer cfg cs- lexemes = dropWhite lex0---- | Returns the tokens and the last position of the input that we processed.--- The tokens include whte space tokens.-primLexer :: Config -> Text -> ([Located Token], Position)-primLexer cfg cs = run inp Normal- where- inp = Inp { alexPos = start- , alexInputPrevChar = '\n'- , input = unLit (cfgPreProc cfg) cs }-- singleR p = Range p p (cfgSource cfg)-- eofR p = Range p' p' (cfgSource cfg)- where- p' = Position { line = line p + 1, col = 0 }-- run i s =- case alexScan i (stateToInt s) of- AlexEOF ->- case s of- Normal -> ([ Located (eofR $ alexPos i) (Token EOF "end of file") ]- , alexPos i- )- InComment _ p _ _ ->- ( [ Located (singleR p)- $ Token (Err UnterminatedComment) "unterminated comment"- ]- , alexPos i)- InString p _ ->- ( [ Located (singleR p)- $ Token (Err UnterminatedString) "unterminated string"- ]- , alexPos i)- InChar p _ ->- ( [ Located (singleR p)- $ Token (Err UnterminatedChar) "unterminated character"- ]- , alexPos i)-- AlexError i' ->- let bad = Text.take 1 (input i)- in- ( [ Located (Range (alexPos i) (alexPos i') (cfgSource cfg))- $ Token (Err LexicalError) bad ]- , alexPos i')- AlexSkip i' _ -> run i' s- AlexToken i' l act ->- let txt = Text.take (fromIntegral l) (input i)- (mtok,s') = act cfg (alexPos i) txt s- (rest,pos) = run i' $! s'- in case mtok of- Nothing -> (rest, pos)- Just t -> (t : rest, pos)---- vim: ft=haskell---char,comment,string :: Int-char = 1-comment = 2-string = 3-alex_action_0 = startComment False -alex_action_1 = startComment True -alex_action_2 = startEndComment -alex_action_3 = endComment -alex_action_4 = addToComment -alex_action_5 = addToComment -alex_action_6 = addToComment -alex_action_7 = addToComment -alex_action_8 = addToString -alex_action_9 = endString -alex_action_10 = addToString -alex_action_11 = endString -alex_action_12 = addToChar -alex_action_13 = endChar -alex_action_14 = addToChar -alex_action_15 = endChar -alex_action_16 = emit $ White Space -alex_action_17 = emit $ White LineComment -alex_action_18 = mkQualIdent -alex_action_19 = mkQualOp -alex_action_20 = emit $ KW KW_else -alex_action_21 = emit $ KW KW_extern -alex_action_22 = emit $ KW KW_if -alex_action_23 = emit $ KW KW_private -alex_action_24 = emit $ KW KW_include -alex_action_25 = emit $ KW KW_module -alex_action_26 = emit $ KW KW_newtype -alex_action_27 = emit $ KW KW_pragma -alex_action_28 = emit $ KW KW_property -alex_action_29 = emit $ KW KW_then -alex_action_30 = emit $ KW KW_type -alex_action_31 = emit $ KW KW_where -alex_action_32 = emit $ KW KW_let -alex_action_33 = emit $ KW KW_x -alex_action_34 = emit $ KW KW_import -alex_action_35 = emit $ KW KW_as -alex_action_36 = emit $ KW KW_hiding -alex_action_37 = emit $ KW KW_newtype -alex_action_38 = emit $ KW KW_infixl -alex_action_39 = emit $ KW KW_infixr -alex_action_40 = emit $ KW KW_infix -alex_action_41 = emit $ KW KW_primitive -alex_action_42 = emitS (numToken 2 . Text.drop 2) -alex_action_43 = emitS (numToken 8 . Text.drop 2) -alex_action_44 = emitS (numToken 10 . Text.drop 0) -alex_action_45 = emitS (numToken 16 . Text.drop 2) -alex_action_46 = emit $ Sym Underscore -alex_action_47 = mkIdent -alex_action_48 = emit $ Sym Lambda -alex_action_49 = emit $ Sym ArrR -alex_action_50 = emit $ Sym ArrL -alex_action_51 = emit $ Sym FatArrR -alex_action_52 = emit $ Sym EqDef -alex_action_53 = emit $ Sym Comma -alex_action_54 = emit $ Sym Semi -alex_action_55 = emit $ Sym Dot -alex_action_56 = emit $ Sym Colon -alex_action_57 = emit $ Sym BackTick -alex_action_58 = emit $ Sym DotDot -alex_action_59 = emit $ Sym DotDotDot -alex_action_60 = emit $ Sym Bar -alex_action_61 = emit $ Sym ParenL -alex_action_62 = emit $ Sym ParenR -alex_action_63 = emit $ Sym BracketL -alex_action_64 = emit $ Sym BracketR -alex_action_65 = emit $ Sym CurlyL -alex_action_66 = emit $ Sym CurlyR -alex_action_67 = emit $ Sym TriL -alex_action_68 = emit $ Sym TriR -alex_action_69 = startString -alex_action_70 = startChar -alex_action_71 = emit (Op Plus ) -alex_action_72 = emit (Op Minus) -alex_action_73 = emit (Op Mul ) -alex_action_74 = emit (Op Exp ) -alex_action_75 = emit (Op Hash ) -alex_action_76 = emit (Op Complement) -alex_action_77 = emitS (Op . Other []) -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 18 "<built-in>" #-}-{-# LINE 1 "/usr/local/Cellar/ghc/8.0.2/lib/ghc-8.0.2/include/ghcversion.h" #-}-------------------{-# 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------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine---{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define GTE(n,m) (tagToEnum# (n >=# m))-#define EQ(n,m) (tagToEnum# (n ==# m))-#else-#define GTE(n,m) (n >=# m)-#define EQ(n,m) (n ==# m)-#endif--{-# LINE 51 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN- narrow16Int# i- where- i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)- high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- low = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 2#-#else- indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN- narrow32Int# i- where- i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`- (b2 `uncheckedShiftL#` 16#) `or#`- (b1 `uncheckedShiftL#` 8#) `or#` b0)- b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))- b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))- b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- b0 = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 4#-#else- indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a- = AlexEOF- | AlexError !AlexInput- | AlexSkip !AlexInput !Int- | AlexToken !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))- = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))- = case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, input') ->- case alexGetByte input of- Nothing ->---- AlexEOF- Just _ ->---- AlexError input'-- (AlexLastSkip input'' len, _) ->---- AlexSkip input'' len-- (AlexLastAcc k input''' len, _) ->---- AlexToken input''' len (alex_actions ! k)----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =- input `seq` -- strict in the input- let- new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))- in- new_acc `seq`- case alexGetByte input of- Nothing -> (new_acc, input)- Just (c, new_input) ->---- case fromIntegral c of { (I# (ord_c)) ->- let- 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- 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)- -- note that the length is increased ONLY if this is the 1st byte in a char encoding)- 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))--{-# LINE 198 "templates/GenericTemplate.hs" #-}--data AlexLastAcc- = AlexNone- | AlexLastAcc !Int !AlexInput !Int- | AlexLastSkip !AlexInput !Int--data AlexAcc user- = AlexAccNone- | AlexAcc Int- | AlexAccSkip+-- Module : Cryptol.Parser.Lexer+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable+--+-- At present Alex generates code with too many warnings.+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -w #-}+module Cryptol.Parser.Lexer+ ( primLexer, lexer, Layout(..)+ , Token(..), TokenT(..)+ , TokenV(..), TokenKW(..), TokenErr(..), TokenSym(..), TokenW(..)+ , Located(..)+ , Config(..)+ , defaultConfig+ ) where++import Cryptol.Parser.Position+import Cryptol.Parser.LexerUtils+import Cryptol.Parser.Unlit(unLit)+import Data.Text (Text)+import qualified Data.Text as Text++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Array.Base (unsafeAt)+#else+import Array+#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\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\x51\x00\x00\x00\x6e\x00\x00\x00\x78\x00\x00\x00\x5b\x00\x00\x00\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\xe5\xff\xff\xff\xb3\x13\x00\x00\xe6\xff\xff\xff\xd6\x13\x00\x00\xe7\xff\xff\xff\xf9\x13\x00\x00\x00\x00\x00\x00\x1c\x14\x00\x00\x00\x00\x00\x00\x22\x14\x00\x00\xe8\xff\xff\xff\xdd\xff\xff\xff\x00\x00\x00\x00\x18\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x04\x17\x00\x00\x03\x18\x00\x00\x5d\x18\x00\x00\x9d\x18\x00\x00\x17\x19\x00\x00\x91\x19\x00\x00\x0b\x1a\x00\x00\x85\x1a\x00\x00\xff\x1a\x00\x00\x79\x1b\x00\x00\xf3\x1b\x00\x00\x6d\x1c\x00\x00\xe7\x1c\x00\x00\x61\x1d\x00\x00\xdb\x1d\x00\x00\x55\x1e\x00\x00\xcf\x1e\x00\x00\x49\x1f\x00\x00\xc3\x1f\x00\x00\x3d\x20\x00\x00\xb7\x20\x00\x00\x31\x21\x00\x00\xab\x21\x00\x00\x25\x22\x00\x00\x9f\x22\x00\x00\x19\x23\x00\x00\x68\x00\x00\x00\x3d\x02\x00\x00\x45\x02\x00\x00\x55\x02\x00\x00\x77\x02\x00\x00\x93\x23\x00\x00\x0d\x24\x00\x00\x87\x24\x00\x00\x01\x25\x00\x00\x7b\x25\x00\x00\xf5\x25\x00\x00\x6f\x26\x00\x00\xe9\x26\x00\x00\x63\x27\x00\x00\xdd\x27\x00\x00\x57\x28\x00\x00\xd1\x28\x00\x00\x4b\x29\x00\x00\xc5\x29\x00\x00\x3f\x2a\x00\x00\xb9\x2a\x00\x00\x33\x2b\x00\x00\xad\x2b\x00\x00\x27\x2c\x00\x00\xa1\x2c\x00\x00\x1b\x2d\x00\x00\x95\x2d\x00\x00\x0f\x2e\x00\x00\x89\x2e\x00\x00\x03\x2f\x00\x00\x7d\x2f\x00\x00\xf7\x2f\x00\x00\x71\x30\x00\x00\xeb\x30\x00\x00\x65\x31\x00\x00\xdf\x31\x00\x00\x59\x32\x00\x00\xd3\x32\x00\x00\x4d\x33\x00\x00\xc7\x33\x00\x00\x41\x34\x00\x00\xbb\x34\x00\x00\x35\x35\x00\x00\xaf\x35\x00\x00\x29\x36\x00\x00\xa3\x36\x00\x00\x1d\x37\x00\x00\x97\x37\x00\x00\x11\x38\x00\x00\x8b\x38\x00\x00\x05\x39\x00\x00\x7f\x39\x00\x00\xf9\x39\x00\x00\x73\x3a\x00\x00\xed\x3a\x00\x00\x67\x3b\x00\x00\xe1\x3b\x00\x00\x5b\x3c\x00\x00\xd5\x3c\x00\x00\x4f\x3d\x00\x00\xc9\x3d\x00\x00\x43\x3e\x00\x00\xbd\x3e\x00\x00\x37\x3f\x00\x00\xb1\x3f\x00\x00\x2b\x40\x00\x00\xa5\x40\x00\x00\x1f\x41\x00\x00\x99\x41\x00\x00\x13\x42\x00\x00\x8d\x42\x00\x00\x07\x43\x00\x00\x81\x43\x00\x00\xfb\x43\x00\x00\x75\x44\x00\x00\xef\x44\x00\x00\x69\x45\x00\x00\xe3\x45\x00\x00\x5d\x46\x00\x00\xd7\x46\x00\x00\x51\x47\x00\x00\xcb\x47\x00\x00\x45\x48\x00\x00\xbf\x48\x00\x00\x39\x49\x00\x00\xb3\x49\x00\x00\x2d\x4a\x00\x00\xa7\x4a\x00\x00\x21\x4b\x00\x00\x7b\x4b\x00\x00\x9e\x4b\x00\x00\xc1\x4b\x00\x00\xe4\x4b\x00\x00\x07\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x4c\x00\x00\x4d\x4c\x00\x00\x00\x00\x00\x00\x70\x4c\x00\x00\x93\x4c\x00\x00\xb6\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x4c\x00\x00\xfc\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x4d\x00\x00\x42\x4d\x00\x00\x65\x4d\x00\x00\x88\x4d\x00\x00\xab\x4d\x00\x00\xce\x4d\x00\x00\xf1\x4d\x00\x00\x14\x4e\x00\x00\x37\x4e\x00\x00\x5a\x4e\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA#+ "\x00\x00\x04\x00\xa3\x00\xa3\x00\x05\x00\xea\x00\x4b\x00\x43\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x45\x00\x47\x00\x47\x00\x04\x00\x00\x00\x49\x00\x49\x00\x49\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\xea\x00\xe1\x00\xe7\x00\xea\x00\xea\x00\xea\x00\xe2\x00\xd9\x00\xda\x00\xe5\x00\xe3\x00\xd1\x00\xe4\x00\xd3\x00\xec\x00\x76\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\xd4\x00\xd2\x00\xe9\x00\xd0\x00\xea\x00\xea\x00\xea\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xdb\x00\xcc\x00\xdc\x00\xeb\x00\x78\x00\xd5\x00\x82\x00\xa3\x00\xa2\x00\xa3\x00\xb7\x00\xa3\x00\xa3\x00\x9c\x00\xca\x00\xa3\x00\xa3\x00\x88\x00\x9a\x00\x9f\x00\xa3\x00\xa9\x00\xa3\x00\xa3\x00\xa3\x00\xb5\x00\xa3\x00\xa3\x00\xad\x00\x69\x00\xa3\x00\xa3\x00\xdd\x00\xd8\x00\xde\x00\xe8\x00\x57\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x55\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x2b\x00\x00\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x58\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x24\x00\x0f\x00\x16\x00\x16\x00\x16\x00\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\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\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x0c\x00\x1c\x00\x1c\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\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\x2c\x00\x00\x00\x00\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x2e\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x3a\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\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\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\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x0d\x00\x1a\x00\x1a\x00\x1a\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\x5a\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x5a\x00\x00\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x00\x00\x5b\x00\x00\x00\x5b\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\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x07\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x08\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x09\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x0a\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x0b\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x10\x00\x14\x00\x14\x00\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x26\x00\x0e\x00\x18\x00\x18\x00\x18\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x46\x00\xea\x00\x00\x00\xea\x00\xea\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x48\x00\xea\x00\x00\x00\xea\x00\xea\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x48\x00\xea\x00\x00\x00\xea\x00\xea\x00\x4a\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\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\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x0c\x00\x1c\x00\x1c\x00\x1c\x00\x1d\x00\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\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x0d\x00\x1a\x00\x1a\x00\x1a\x00\x1b\x00\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\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x24\x00\x0f\x00\x16\x00\x16\x00\x16\x00\x17\x00\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\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x11\x00\x12\x00\x12\x00\x12\x00\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\x5a\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x5a\x00\x00\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5a\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\x5b\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x5b\x00\x00\x00\x5b\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6d\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6e\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x5c\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x5f\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x60\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x61\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x62\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x63\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x64\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x66\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x67\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6b\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6c\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x70\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x79\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc9\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc8\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc6\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc5\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xc2\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc1\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc0\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xbf\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x86\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xbc\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xbb\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xba\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb9\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb8\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x90\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb1\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa8\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb6\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x95\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xaf\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xae\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xab\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xaa\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x98\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x9b\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x9e\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa6\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa4\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa1\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa0\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa7\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x99\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x97\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa5\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x96\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x94\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\x93\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x92\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x91\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x8f\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\x8e\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x8d\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x9d\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x8c\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x8b\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x8a\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xb0\x00\xa3\x00\xa3\x00\x89\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x87\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xbd\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xbe\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x85\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xb2\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc4\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x84\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x83\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xc7\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x81\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x80\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7f\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7d\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7c\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\x7b\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7a\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xcb\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x72\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x71\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6f\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x6a\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x68\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x65\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x5e\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xac\x00\xb4\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xea\x00\xa3\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x5d\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xcf\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xd6\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xd7\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xe0\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xcd\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xce\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x44\x00\xea\x00\x00\x00\xea\x00\xea\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\xea\x00\xe6\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\xea\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xff\xff\x2f\x00\x2f\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x5f\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\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x20\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\x62\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\x0a\x00\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x54\x00\x4c\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x1f\x00\x21\x00\x21\x00\x23\x00\x23\x00\x25\x00\x25\x00\x27\x00\x27\x00\x29\x00\x29\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\xff\xff\x59\x00\x59\x00\x59\x00\x56\x00\x56\x00\x56\x00\x56\x00\x54\x00\x54\x00\x54\x00\x52\x00\x52\x00\x52\x00\x52\x00\x50\x00\x50\x00\x50\x00\x4c\x00\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\x54\x00\xff\xff\xff\xff\xff\xff\xff\xff\x59\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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, 236)+ [ 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 169+ , AlexAcc 168+ , AlexAcc 167+ , AlexAcc 166+ , AlexAcc 165+ , AlexAcc 164+ , AlexAcc 163+ , AlexAcc 162+ , AlexAcc 161+ , AlexAcc 160+ , AlexAcc 159+ , AlexAcc 158+ , AlexAcc 157+ , AlexAcc 156+ , AlexAcc 155+ , AlexAcc 154+ , AlexAcc 153+ , AlexAcc 152+ , AlexAcc 151+ , AlexAcc 150+ , 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, 170)+ [ (169,alex_action_0)+ , (168,alex_action_0)+ , (167,alex_action_1)+ , (166,alex_action_1)+ , (165,alex_action_2)+ , (164,alex_action_2)+ , (163,alex_action_3)+ , (162,alex_action_3)+ , (161,alex_action_4)+ , (160,alex_action_5)+ , (159,alex_action_6)+ , (158,alex_action_7)+ , (157,alex_action_8)+ , (156,alex_action_9)+ , (155,alex_action_10)+ , (154,alex_action_11)+ , (153,alex_action_12)+ , (152,alex_action_13)+ , (151,alex_action_14)+ , (150,alex_action_15)+ , (149,alex_action_16)+ , (148,alex_action_17)+ , (147,alex_action_18)+ , (146,alex_action_19)+ , (145,alex_action_20)+ , (144,alex_action_21)+ , (143,alex_action_22)+ , (142,alex_action_23)+ , (141,alex_action_24)+ , (140,alex_action_25)+ , (139,alex_action_26)+ , (138,alex_action_27)+ , (137,alex_action_28)+ , (136,alex_action_29)+ , (135,alex_action_30)+ , (134,alex_action_31)+ , (133,alex_action_32)+ , (132,alex_action_33)+ , (131,alex_action_34)+ , (130,alex_action_35)+ , (129,alex_action_36)+ , (128,alex_action_37)+ , (127,alex_action_39)+ , (126,alex_action_40)+ , (125,alex_action_41)+ , (124,alex_action_42)+ , (123,alex_action_43)+ , (122,alex_action_44)+ , (121,alex_action_45)+ , (120,alex_action_46)+ , (119,alex_action_47)+ , (118,alex_action_47)+ , (117,alex_action_48)+ , (116,alex_action_49)+ , (115,alex_action_50)+ , (114,alex_action_50)+ , (113,alex_action_50)+ , (112,alex_action_50)+ , (111,alex_action_50)+ , (110,alex_action_50)+ , (109,alex_action_50)+ , (108,alex_action_50)+ , (107,alex_action_50)+ , (106,alex_action_50)+ , (105,alex_action_50)+ , (104,alex_action_50)+ , (103,alex_action_50)+ , (102,alex_action_50)+ , (101,alex_action_50)+ , (100,alex_action_50)+ , (99,alex_action_50)+ , (98,alex_action_50)+ , (97,alex_action_50)+ , (96,alex_action_50)+ , (95,alex_action_50)+ , (94,alex_action_50)+ , (93,alex_action_50)+ , (92,alex_action_50)+ , (91,alex_action_50)+ , (90,alex_action_50)+ , (89,alex_action_50)+ , (88,alex_action_50)+ , (87,alex_action_50)+ , (86,alex_action_50)+ , (85,alex_action_50)+ , (84,alex_action_50)+ , (83,alex_action_50)+ , (82,alex_action_50)+ , (81,alex_action_50)+ , (80,alex_action_50)+ , (79,alex_action_50)+ , (78,alex_action_50)+ , (77,alex_action_50)+ , (76,alex_action_50)+ , (75,alex_action_50)+ , (74,alex_action_50)+ , (73,alex_action_50)+ , (72,alex_action_50)+ , (71,alex_action_50)+ , (70,alex_action_50)+ , (69,alex_action_50)+ , (68,alex_action_50)+ , (67,alex_action_50)+ , (66,alex_action_50)+ , (65,alex_action_50)+ , (64,alex_action_50)+ , (63,alex_action_50)+ , (62,alex_action_50)+ , (61,alex_action_50)+ , (60,alex_action_50)+ , (59,alex_action_50)+ , (58,alex_action_50)+ , (57,alex_action_50)+ , (56,alex_action_50)+ , (55,alex_action_50)+ , (54,alex_action_50)+ , (53,alex_action_50)+ , (52,alex_action_50)+ , (51,alex_action_50)+ , (50,alex_action_50)+ , (49,alex_action_50)+ , (48,alex_action_50)+ , (47,alex_action_50)+ , (46,alex_action_50)+ , (45,alex_action_50)+ , (44,alex_action_50)+ , (43,alex_action_50)+ , (42,alex_action_50)+ , (41,alex_action_50)+ , (40,alex_action_50)+ , (39,alex_action_50)+ , (38,alex_action_50)+ , (37,alex_action_50)+ , (36,alex_action_50)+ , (35,alex_action_50)+ , (34,alex_action_50)+ , (33,alex_action_50)+ , (32,alex_action_51)+ , (31,alex_action_52)+ , (30,alex_action_53)+ , (29,alex_action_54)+ , (28,alex_action_55)+ , (27,alex_action_56)+ , (26,alex_action_57)+ , (25,alex_action_58)+ , (24,alex_action_59)+ , (23,alex_action_60)+ , (22,alex_action_61)+ , (21,alex_action_62)+ , (20,alex_action_63)+ , (19,alex_action_64)+ , (18,alex_action_65)+ , (17,alex_action_66)+ , (16,alex_action_67)+ , (15,alex_action_68)+ , (14,alex_action_69)+ , (13,alex_action_70)+ , (12,alex_action_71)+ , (11,alex_action_72)+ , (10,alex_action_73)+ , (9,alex_action_74)+ , (8,alex_action_75)+ , (7,alex_action_76)+ , (6,alex_action_77)+ , (5,alex_action_78)+ , (4,alex_action_79)+ , (3,alex_action_80)+ , (2,alex_action_80)+ , (1,alex_action_80)+ , (0,alex_action_80)+ ]++{-# LINE 175 "src/Cryptol/Parser/Lexer.x" #-}++-- This code is here because it depends on `comment`, which is defined+-- in this file.++stateToInt :: LexS -> Int+stateToInt Normal = 0+stateToInt (InComment {}) = comment+stateToInt (InString {}) = string+stateToInt (InChar {}) = char++-- | Returns the tokens in the last position of the input that we processed.+-- White space is removed, and layout processing is done as requested.+-- This stream is fed to the parser.+lexer :: Config -> Text -> ([Located Token], Position)+lexer cfg cs = ( case cfgLayout cfg of+ Layout -> layout cfg lexemes+ NoLayout -> lexemes+ , finalPos+ )+ where (lex0, finalPos) = primLexer cfg cs+ lexemes = dropWhite lex0++-- | Returns the tokens and the last position of the input that we processed.+-- The tokens include whte space tokens.+primLexer :: Config -> Text -> ([Located Token], Position)+primLexer cfg cs = run inp Normal+ where+ inp = Inp { alexPos = start+ , alexInputPrevChar = '\n'+ , input = unLit (cfgPreProc cfg) cs }++ singleR p = Range p p (cfgSource cfg)++ eofR p = Range p' p' (cfgSource cfg)+ where+ p' = Position { line = line p + 1, col = 0 }++ run i s =+ case alexScan i (stateToInt s) of+ AlexEOF ->+ case s of+ Normal -> ([ Located (eofR $ alexPos i) (Token EOF "end of file") ]+ , alexPos i+ )+ InComment _ p _ _ ->+ ( [ Located (singleR p)+ $ Token (Err UnterminatedComment) "unterminated comment"+ ]+ , alexPos i)+ InString p _ ->+ ( [ Located (singleR p)+ $ Token (Err UnterminatedString) "unterminated string"+ ]+ , alexPos i)+ InChar p _ ->+ ( [ Located (singleR p)+ $ Token (Err UnterminatedChar) "unterminated character"+ ]+ , alexPos i)++ AlexError i' ->+ let bad = Text.take 1 (input i)+ in+ ( [ Located (Range (alexPos i) (alexPos i') (cfgSource cfg))+ $ Token (Err LexicalError) bad ]+ , alexPos i')+ AlexSkip i' _ -> run i' s+ AlexToken i' l act ->+ let txt = Text.take (fromIntegral l) (input i)+ (mtok,s') = act cfg (alexPos i) txt s+ (rest,pos) = run i' $! s'+ in case mtok of+ Nothing -> (rest, pos)+ Just t -> (t : rest, pos)++-- vim: ft=haskell+++char,comment,string :: Int+char = 1+comment = 2+string = 3+alex_action_0 = startComment False +alex_action_1 = startComment True +alex_action_2 = startComment False +alex_action_3 = startEndComment +alex_action_4 = endComment +alex_action_5 = addToComment +alex_action_6 = addToComment +alex_action_7 = addToComment +alex_action_8 = addToComment +alex_action_9 = addToString +alex_action_10 = endString +alex_action_11 = addToString +alex_action_12 = endString +alex_action_13 = addToChar +alex_action_14 = endChar +alex_action_15 = addToChar +alex_action_16 = endChar +alex_action_17 = emit $ White Space +alex_action_18 = emit $ White LineComment +alex_action_19 = mkQualIdent +alex_action_20 = mkQualOp +alex_action_21 = emit $ KW KW_else +alex_action_22 = emit $ KW KW_extern +alex_action_23 = emit $ KW KW_if +alex_action_24 = emit $ KW KW_private +alex_action_25 = emit $ KW KW_include +alex_action_26 = emit $ KW KW_module +alex_action_27 = emit $ KW KW_newtype +alex_action_28 = emit $ KW KW_pragma +alex_action_29 = emit $ KW KW_property +alex_action_30 = emit $ KW KW_then +alex_action_31 = emit $ KW KW_type +alex_action_32 = emit $ KW KW_where +alex_action_33 = emit $ KW KW_let +alex_action_34 = emit $ KW KW_x +alex_action_35 = emit $ KW KW_import +alex_action_36 = emit $ KW KW_as +alex_action_37 = emit $ KW KW_hiding +alex_action_38 = emit $ KW KW_newtype +alex_action_39 = emit $ KW KW_infixl +alex_action_40 = emit $ KW KW_infixr +alex_action_41 = emit $ KW KW_infix +alex_action_42 = emit $ KW KW_primitive +alex_action_43 = emit $ KW KW_parameter +alex_action_44 = emit $ KW KW_constraint +alex_action_45 = emitS (numToken 2 . Text.drop 2) +alex_action_46 = emitS (numToken 8 . Text.drop 2) +alex_action_47 = emitS (numToken 10 . Text.drop 0) +alex_action_48 = emitS (numToken 16 . Text.drop 2) +alex_action_49 = emit $ Sym Underscore +alex_action_50 = mkIdent +alex_action_51 = emit $ Sym Lambda +alex_action_52 = emit $ Sym ArrR +alex_action_53 = emit $ Sym ArrL +alex_action_54 = emit $ Sym FatArrR +alex_action_55 = emit $ Sym EqDef +alex_action_56 = emit $ Sym Comma +alex_action_57 = emit $ Sym Semi +alex_action_58 = emit $ Sym Dot +alex_action_59 = emit $ Sym Colon +alex_action_60 = emit $ Sym BackTick +alex_action_61 = emit $ Sym DotDot +alex_action_62 = emit $ Sym DotDotDot +alex_action_63 = emit $ Sym Bar +alex_action_64 = emit $ Sym ParenL +alex_action_65 = emit $ Sym ParenR +alex_action_66 = emit $ Sym BracketL +alex_action_67 = emit $ Sym BracketR +alex_action_68 = emit $ Sym CurlyL +alex_action_69 = emit $ Sym CurlyR +alex_action_70 = emit $ Sym TriL +alex_action_71 = emit $ Sym TriR +alex_action_72 = startString +alex_action_73 = startChar +alex_action_74 = emit (Op Plus ) +alex_action_75 = emit (Op Minus) +alex_action_76 = emit (Op Mul ) +alex_action_77 = emit (Op Exp ) +alex_action_78 = emit (Op Hash ) +alex_action_79 = emit (Op Complement) +alex_action_80 = emitS (Op . Other []) +{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++++++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define GTE(n,m) (tagToEnum# (n >=# m))+#define EQ(n,m) (tagToEnum# (n ==# m))+#else+#define GTE(n,m) (n >=# m)+#define EQ(n,m) (n ==# m)+#endif++++++++++++++++++++data AlexAddr = AlexA# Addr#+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow16Int# i+ where+ i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+ high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ low = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 2#+#else+ indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow32Int# i+ where+ i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+ (b2 `uncheckedShiftL#` 16#) `or#`+ (b1 `uncheckedShiftL#` 8#) `or#` b0)+ b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+ b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+ b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ b0 = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 4#+#else+ indexInt32OffAddr# arr off+#endif+++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+ = AlexEOF+ | AlexError !AlexInput+ | AlexSkip !AlexInput !Int+ | AlexToken !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input__ (I# (sc))+ = alexScanUser undefined input__ (I# (sc))++alexScanUser user__ input__ (I# (sc))+ = case alex_scan_tkn user__ input__ 0# input__ sc AlexNone of+ (AlexNone, input__') ->+ case alexGetByte input__ of+ Nothing ->++++ AlexEOF+ Just _ ->++++ AlexError input__'++ (AlexLastSkip input__'' len, _) ->++++ AlexSkip input__'' len++ (AlexLastAcc k input__''' len, _) ->++++ AlexToken input__''' len (alex_actions ! k)+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user__ orig_input len input__ s last_acc =+ input__ `seq` -- strict in the input+ let+ new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))+ in+ new_acc `seq`+ case alexGetByte input__ of+ Nothing -> (new_acc, input__)+ Just (c, new_input) ->++++ case fromIntegral c of { (I# (ord_c)) ->+ let+ 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+ 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)+ -- note that the length is increased ONLY if this is the 1st byte in a char encoding)+ 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))++++++++++++++data AlexLastAcc+ = AlexNone+ | AlexLastAcc !Int !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc user+ = AlexAccNone+ | AlexAcc Int+ | AlexAccSkip++++++++++++++++++++++++++++
lib/Cryptol.cry view
@@ -8,20 +8,26 @@ /** * The value corresponding to a numeric type. */-primitive demote : {val, bits} (fin val, fin bits, bits >= width val) => [bits]+primitive number : {val, rep} Literal val rep => rep +/**+ * An alternative name for 'number', present for backward compatibility.+ */+demote : {val, rep} Literal val rep => rep+demote = number`{val}+ infixr 5 ==> infixr 10 \/ infixr 15 /\-infixr 20 ||-infixr 25 &&-infix 30 ==, ===, !=, !==-infix 40 >, >=, <, <=-infixl 50 ^+infix 20 ==, ===, !=, !==+infix 30 >, >=, <, <=, <$, >$, <=$, >=$+infixr 40 ||+infixl 45 ^+infixr 50 && infixr 60 #-infixl 70 <<, <<<, >>, >>>+infixl 70 <<, <<<, >>, >>>, >>$ infixl 80 +, --infixl 90 *, /, %+infixl 90 *, /, %, /$, %$ infixr 95 ^^ infixl 100 @, @@, !, !! @@ -100,25 +106,33 @@ * Bitwise complement. The prefix notation '~ x' * is syntactic sugar for 'complement x'. */-primitive complement : {a} a -> a+primitive complement : {a} (Logic a) => a -> a /** * Less-than. Only works on comparable arguments.+ *+ * Bitvectors are compared using unsigned arithmetic. */ primitive (<) : {a} (Cmp a) => a -> a -> Bit /** * Greater-than of two comparable arguments.+ *+ * Bitvectors are compared using unsigned arithmetic. */ primitive (>) : {a} (Cmp a) => a -> a -> Bit /** * Less-than or equal of two comparable arguments.+ *+ * Bitvectors are compared using unsigned arithmetic. */ primitive (<=) : {a} (Cmp a) => a -> a -> Bit /** * Greater-than or equal of two comparable arguments.+ *+ * Bitvectors are compared using unsigned arithmetic. */ primitive (>=) : {a} (Cmp a) => a -> a -> Bit @@ -135,29 +149,97 @@ /** * Compare the outputs of two functions for equality. */-(===) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit)+(===) : {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)+(!==) : {a, b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit) f !== g = \x -> f x != g x /** * Returns the smaller of two comparable arguments.+ * Bitvectors are compared using unsigned arithmetic. */ min : {a} (Cmp a) => a -> a -> a min x y = if x < y then x else y /** * Returns the greater of two comparable arguments.+ * Bitvectors are compared using unsigned arithmetic. */ max : {a} (Cmp a) => a -> a -> a max x y = if x > y then x else y + /**- * Short-cutting boolean conjuction function.+ * 2's complement signed less-than.+ */+primitive (<$) : {a} (SignedCmp a) => a -> a -> Bit++/**+ * 2's complement signed greater-than.+ */+(>$) : {a} (SignedCmp a) => a -> a -> Bit+x >$ y = y <$ x++/**+ * 2's complement signed less-than-or-equal.+ */+(<=$) : {a} (SignedCmp a) => a -> a -> Bit+x <=$ y = ~(y <$ x)++/**+ * 2's complement signed greater-than-or-equal.+ */+(>=$) : {a} (SignedCmp a) => a -> a -> Bit+x >=$ y = ~(x <$ y)++/**+ * 2's complement signed division. Division rounds toward 0.+ */+primitive (/$) : {a} (Arith a) => a -> a -> a++/**+ * 2's complement signed remainder. Division rounds toward 0.+ */+primitive (%$) : {a} (Arith a) => a -> a -> a++/**+ * Unsigned carry. Returns true if the unsigned addition of the given+ * bitvector arguments would result in an unsigned overflow.+ */+primitive carry : {n} (fin n) => [n] -> [n] -> Bit++/**+ * Signed carry. Returns true if the 2's complement signed addition of the+ * given bitvector arguments would result in a signed overflow.+ */+primitive scarry : {n} (fin n, n >= 1) => [n] -> [n] -> Bit++/**+ * Signed borrow. Returns true if the 2's complement signed subtraction of the+ * given bitvector arguments would result in a signed overflow.+ */+sborrow : {n} (fin n, n >= 1) => [n] -> [n] -> Bit+sborrow x y = ( x <$ (x-y) ) ^ y@0++/**+ * Zero extension of a bitvector.+ */+zext : {m, n} (fin m, m >= n) => [n] -> [m]+zext x = zero # x++/**+ * Sign extension of a bitvector.+ */+sext : {m, n} (fin m, m >= n, n >= 1) => [n] -> [m]+sext x = newbits # x+ where newbits = if x@0 then ~zero else zero++/**+ * Short-cutting boolean conjunction function. * If the first argument is False, the second argument * is not evaluated. */@@ -165,7 +247,7 @@ x /\ y = if x then y else False /**- * Short-cutting boolean disjuction function.+ * Short-cutting boolean disjunction function. * If the first argument is True, the second argument * is not evaluated. */@@ -181,67 +263,100 @@ a ==> b = if a then b else True /**- * Logical `and' over bits. Extends element-wise over sequences, tuples.+ * Logical 'and' over bits. Extends element-wise over sequences, tuples. */-primitive (&&) : {a} a -> a -> a+primitive (&&) : {a} (Logic a) => a -> a -> a /**- * Logical `or' over bits. Extends element-wise over sequences, tuples.+ * Logical 'or' over bits. Extends element-wise over sequences, tuples. */-primitive (||) : {a} a -> a -> a+primitive (||) : {a} (Logic a) => a -> a -> a /**- * Logical `exclusive or' over bits. Extends element-wise over sequences, tuples.+ * Logical 'exclusive or' over bits. Extends element-wise over sequences, tuples. */-primitive (^) : {a} a -> a -> a+primitive (^) : {a} (Logic 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+primitive zero : {a} (Zero a) => a /**+ * Converts a bitvector to a non-negative integer in the range 0 to 2^^n-1.+ */+primitive toInteger : {bits} (fin bits) => [bits] -> Integer++/**+ * Converts an unbounded integer to another arithmetic type. When converting+ * to the bitvector type [n], the value is reduced modulo 2^^n.+ */+primitive fromInteger : {a} (Arith a) => Integer -> a++/**+ * Converts an integer modulo n to an unbounded integer in the range 0 to n-1.+ */+primitive fromZ : {n} (fin n, n >= 1) => Z n -> Integer++/** * 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+primitive (<<) : {n, ix, a} (fin ix, Zero a) => [n]a -> [ix] -> [n]a /** * 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+primitive (>>) : {n, ix, a} (fin ix, Zero a) => [n]a -> [ix] -> [n]a /** * 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+primitive (<<<) : {n, ix, a} (fin n, fin ix) => [n]a -> [ix] -> [n]a /** * 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 (>>>) : {n, ix, a} (fin n, fin ix) => [n]a -> [ix] -> [n]a +/**+ * 2's complement signed (arithmetic) right shift. The first argument+ * is the sequence to shift (considered as a signed value),+ * the second argument is the number of positions to shift+ * by (considered as an unsigned value).+ */+primitive (>>$) : {n, ix} (fin n, n >= 1, fin ix) => [n] -> [ix] -> [n]++++/**+ * Concatenates two sequences. On bitvectors, the most-significant bits+ * are in the left argument, and the least-significant bits are in the right.+ */ primitive (#) : {front, back, a} (fin front) => [front]a -> [back]a -> [front + back] a - /**- * Split a sequence into a tuple of sequences.+ * Splits a sequence into a pair of sequences.+ * 'splitAt z = (x, y)' iff 'x # y = z'. */ primitive splitAt : {front, back, a} (fin front) => [front + back]a -> ([front]a, [back]a)+ /**- * Joins sequences.+ * Concatenates a list of sequences.+ * 'join' is the inverse function to 'split'. */ primitive join : {parts, each, a} (fin each) => [parts][each]a -> [parts * each]a /** * Splits a sequence into 'parts' groups with 'each' elements.+ * 'split' is the inverse function to 'join'. */ primitive split : {parts, each, a} (fin each) => [parts * each]a -> [parts][each]a@@ -249,38 +364,41 @@ /** * Reverses the elements in a sequence. */-primitive reverse : {a, b} (fin a) => [a]b -> [a]b+primitive reverse : {n, a} (fin n) => [n]a -> [n]a /**- * Transposes an [a][b] matrix into a [b][a] matrix.+ * Transposes a matrix.+ * Satisfies the property 'transpose m @ i @ j == m @ j @ i'. */-primitive transpose : {a, b, c} [a][b]c -> [b][a]c+primitive transpose : {rows, cols, a} [rows][cols]a -> [cols][rows]a /** * 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+primitive (@) : {n, a, ix} (fin ix) => [n]a -> [ix] -> a /** * 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+(@@) : {n, k, ix, a} (fin ix) => [n]a -> [k][ix] -> [k]a+xs @@ is = [ xs @ i | i <- is ] /** * 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+primitive (!) : {n, a, ix} (fin n, fin ix) => [n]a -> [ix] -> a /** * 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 * select, starting from the end of the sequence. */-primitive (!!) : {a, b, c, d} (fin a, fin d) => [a]b -> [c][d] -> [c]b+(!!) : {n, k, ix, a} (fin n, fin ix) => [n]a -> [k][ix] -> [k]a+xs !! is = [ xs ! i | i <- is ] /** * Update the given sequence with new value at the given index position.@@ -289,7 +407,7 @@ * 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+primitive update : {n, a, ix} (fin ix) => [n]a -> [ix] -> a -> [n]a /** * Update the given sequence with new value at the given index position.@@ -298,7 +416,7 @@ * 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+primitive updateEnd : {n, a, ix} (fin n, fin ix) => [n]a -> [ix] -> a -> [n]a /** * Perform a series of updates to a sequence. The first argument is@@ -307,7 +425,7 @@ * 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 : {n, k, ix, a} (fin ix, fin k) => [n]a -> [k][ix] -> [k]a -> [n]a updates xs0 idxs vals = xss!0 where xss = [ xs0 ] #@@ -324,7 +442,7 @@ * 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 : {n, k, ix, a} (fin n, fin ix, fin k) => [n]a -> [k][ix] -> [k]a -> [n]a updatesEnd xs0 idxs vals = xss!0 where xss = [ xs0 ] #@@ -339,20 +457,21 @@ * stopping when the values would wrap around modulo '2^^bits'. * * '[a,b..]' is syntactic sugar for 'fromThen`{first=a,next=b}'.+ * '[a..]' is syntactic sugar for 'fromThen`{first=a,next=a+1}'. */ primitive fromThen : {first, next, bits, len} ( fin first, fin next, fin bits , bits >= width first, bits >= width next+ , first != 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]+primitive fromTo : {first, last, a} (fin last, last >= first, Literal last a) =>+ [1 + (last - first)]a /** * A finite arithmetic sequence starting with 'first' and 'next',@@ -360,41 +479,69 @@ * * '[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]+primitive fromThenTo : {first, next, last, a, len}+ ( fin first, fin next, fin last+ , Literal first a, Literal next a, Literal last a+ , first != next+ , lengthFromThenTo first next last == len) => [len]a /** * 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]+primitive infFrom : {a} (Arith a) => a -> [inf]a /** * 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 infFromThen : {a} (Arith a) => a -> a -> [inf]a -primitive error : {at, len} (fin len) => [len][8] -> at+primitive error : {a, len} (fin len) => [len][8] -> a /** * Performs multiplication of polynomials over GF(2). */-primitive pmult : {a, b} (fin a, fin b) => [1 + a] -> [1 + b] -> [1 + a + b]+pmult : {u, v} (fin u, fin v) => [1 + u] -> [1 + v] -> [1 + u + v]+pmult x y = last zs+ where+ zs = [0] # [ (z << 1) ^ (if yi then 0 # x else 0) | yi <- y | z <- zs ] /** * Performs division of polynomials over GF(2). */-primitive pdiv : {a, b} (fin a, fin b) => [a] -> [b] -> [a]+pdiv : {u, v} (fin u, fin v) => [u] -> [v] -> [u]+pdiv x y = [ z ! degree | z <- zs ]+ where+ degree : [width v]+ degree = last (ds : [1 + v]_)+ where ds = [0/0] # [if yi then i else d | yi <- reverse y | i <- [0..v] | d <- ds ] + reduce : [v] -> [v]+ reduce u = if u ! degree then u ^ y else u++ zs : [u][v]+ zs = [ tail (reduce z # [xi]) | z <- [0] # zs | xi <- x ]+ /** * Performs modulus of polynomials over GF(2). */-primitive pmod : {a, b} (fin a, fin b) => [a] -> [1 + b] -> [b]+pmod : {u, v} (fin u, fin v) => [u] -> [1 + v] -> [v]+pmod x y = if y == 0 then 0/0 else last zs+ where+ degree : [width v]+ degree = last (ds : [2 + v]_)+ where ds = [0/0] # [if yi then i else d | yi <- reverse y | i <- [0..v] | d <- ds ] + reduce : [1 + v] -> [1 + v]+ reduce u = if u ! degree then u ^ y else u++ powers : [inf][1 + v]+ powers = [reduce 1] # [ reduce (p << 1) | p <- powers ]++ zs = [0] # [ z ^ (if xi then tail p else 0) | xi <- reverse x | p <- powers | z <- zs ]+ /** * Generates random values from a seed. When called with a function, currently * generates a function that always returns zero.@@ -405,23 +552,34 @@ type Word n = [n] type Char = [8] -take : {front,back,elem} (fin front) => [front + back] elem -> [front] elem+take : {front, back, a} (fin front) => [front + back]a -> [front]a take (x # _) = x -drop : {front,back,elem} (fin front) => [front + back] elem -> [back] elem+drop : {front, back, a} (fin front) => [front + back]a -> [back]a drop ((_ : [front] _) # y) = y -tail : {a, b} [1 + a]b -> [a]b+tail : {n, a} [1 + n]a -> [n]a tail xs = drop`{1} xs -width : {bits,len,elem} (fin len, fin bits, bits >= width len) => [len] elem -> [bits]-width _ = `len+/**+ * Return the left-most element of a sequence.+ */+head : {n, a} [1 + n]a -> a+head xs = xs @ 0 +/**+ * Return the right-most element of a sequence.+ */+last : {n, a} (fin n) => [1 + n]a -> a+last xs = xs ! 0++width : {bits, n, a} (fin n, fin bits, bits >= width n) => [n]a -> [bits]+width _ = `n+ undefined : {a} a undefined = error "undefined" -groupBy : {each,parts,elem} (fin each) =>- [parts * each] elem -> [parts][each]elem+groupBy : {each, parts, a} (fin each) => [parts * each]a -> [parts][each]a groupBy = split`{parts=parts} /**@@ -455,3 +613,116 @@ */ traceVal : {n, a} (fin n) => [n][8] -> a -> a traceVal msg x = trace msg x x++/* Functions previously in Cryptol::Extras */++/**+ * Conjunction of all bits in a sequence.+ */+and : {n} (fin n) => [n]Bit -> Bit+and xs = ~zero == xs++/**+ * Disjunction of all bits in a sequence.+ */+or : {n} (fin n) => [n]Bit -> Bit+or xs = zero != xs++/**+ * Conjunction after applying a predicate to all elements.+ */+all : {n, a} (fin n) => (a -> Bit) -> [n]a -> Bit+all f xs = and (map f xs)++/**+ * Disjunction after applying a predicate to all elements.+ */+any : {n, a} (fin n) => (a -> Bit) -> [n]a -> Bit+any f xs = or (map f xs)++/**+ * Map a function over a sequence.+ */+map : {n, a, b} (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 : {n, a, b} (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 : {n, a, b} (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 values in the sequence.+ */+sum : {n, a} (fin n, Arith a) => [n]a -> a+sum xs = foldl (+) (fromInteger 0) xs++/**+ * Scan left is like a foldl that also emits the intermediate values.+ */+scanl : {n, b, a} (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 is like a foldr that also emits the intermediate values.+ */+scanr : {n, a, b} (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]++/**+ * Repeat a value.+ */+repeat : {n, a} a -> [n]a+repeat x = [ x | _ <- zero : [n] ]++/**+ * '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 : {n, a, b} [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.+ */+zipWith : {n, a, b, c} (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 ]
− lib/Cryptol/Extras.cry
@@ -1,142 +0,0 @@-/*- * 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)- */--module Cryptol::Extras where--/**- * 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 ]
lib/CryptolTC.z3 view
@@ -43,6 +43,14 @@ ))) ) +(define-fun cryNeq ((x InfNat) (y InfNat)) MaybeBool+ (ite (or (isErr x) (isErr y)) cryErrProp (cryBool+ (ite (isFin x)+ (ite (isFin y) (not (= (value x) (value y))) true)+ (isFin y)+ )))+)+ (define-fun cryFin ((x InfNat)) MaybeBool (ite (isErr x) cryErrProp (cryBool (isFin x)))@@ -264,6 +272,18 @@ (ite (= (value y) 0) (cryNat 1) cryInf) cryInf) ))+)++(define-fun cryCeilDiv ((x InfNat) (y InfNat)) InfNat+ (ite (or (isErr x) (isErr y) (not (isFin x)) (not (isFin y))) cryErr+ (ite (= (value y) 0) cryErr (cryNat (- (div (- (value x)) (value y)))))+ )+)++(define-fun cryCeilMod ((x InfNat) (y InfNat)) InfNat+ (ite (or (isErr x) (isErr y) (not (isFin x)) (not (isFin y))) cryErr+ (ite (= (value y) 0) cryErr (cryNat (mod (- (value x)) (value y))))+ ) ) (define-fun cryLenFromThenTo ((x InfNat) (y InfNat) (z InfNat)) InfNat
src/Cryptol/Eval.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -17,6 +17,9 @@ module Cryptol.Eval ( moduleEnv , runEval+ , EvalOpts(..)+ , PPOpts(..)+ , defaultPPOpts , Eval , EvalEnv , emptyEnv@@ -41,29 +44,30 @@ import Data.List import Data.Maybe import qualified Data.Map.Strict as Map+import Data.Semigroup import Prelude () import Prelude.Compat -type EvalEnv = GenEvalEnv Bool BV+type EvalEnv = GenEvalEnv Bool BV Integer -- Expression Evaluation ------------------------------------------------------- -- | 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 :: EvalPrims b w i+ => Module -- ^ Module containing declarations to evaluate+ -> GenEvalEnv b w i -- ^ Environment to extend+ -> Eval (GenEvalEnv b w i) moduleEnv m env = evalDecls (mDecls m) =<< evalNewtypes (mNewtypes m) env -- | 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+evalExpr :: EvalPrims b w i+ => GenEvalEnv b w i -- ^ Evaluation environment -> Expr -- ^ Expression to evaluate- -> Eval (GenValue b w)+ -> Eval (GenValue b w i) evalExpr env expr = case expr of -- Try to detect when the user has directly written a finite sequence of@@ -72,25 +76,28 @@ -- 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 $+ return $ VWord len $ case tryFromBits vs of- Just w -> WordVal w- Nothing -> BitsVal $ Seq.fromList $ map (fromVBit <$>) vs- | otherwise -> {-# SCC "evalExpr->EList" #-}- return $ VSeq len $ finiteSeqMap vs+ Just w -> return $ WordVal w+ Nothing -> do xs <- mapM (delay Nothing) vs+ return $ BitsVal $ Seq.fromList $ map (fromVBit <$>) xs+ | otherwise -> {-# SCC "evalExpr->EList" #-} do+ xs <- mapM (delay Nothing) vs+ return $ VSeq len $ finiteSeqMap xs where tyv = evalValType (envTypes env) ty vs = map (evalExpr env) es len = genericLength es ETuple es -> {-# SCC "evalExpr->ETuple" #-} do- let xs = map eval es+ xs <- mapM (delay Nothing . eval) es return $ VTuple xs ERec fields -> {-# SCC "evalExpr->ERec" #-} do- let xs = [ (f, eval e)- | (f,e) <- fields- ]+ xs <- sequence [ do thk <- delay Nothing (eval e)+ return (f, thk)+ | (f, e) <- fields+ ] return $ VRecord xs ESel e sel -> {-# SCC "evalExpr->ESel" #-} do@@ -129,7 +136,7 @@ val -> do vdoc <- ppV val panic "[Eval] evalExpr" ["expected a polymorphic value"- , show vdoc, show e, show ty+ , show vdoc, show (pp e), show (pp ty) ] EApp f x -> {-# SCC "evalExpr->EApp" #-} do@@ -159,17 +166,17 @@ -- Newtypes -------------------------------------------------------------------- -evalNewtypes :: EvalPrims b w+evalNewtypes :: EvalPrims b w i => Map.Map Name Newtype- -> GenEvalEnv b w- -> Eval (GenEvalEnv b w)+ -> GenEvalEnv b w i+ -> Eval (GenEvalEnv b w i) evalNewtypes nts env = foldM (flip evalNewtype) env $ Map.elems nts -- | Introduce the constructor function for a newtype.-evalNewtype :: EvalPrims b w+evalNewtype :: EvalPrims b w i => Newtype- -> GenEvalEnv b w- -> Eval (GenEvalEnv b w)+ -> GenEvalEnv b w i+ -> Eval (GenEvalEnv b w i) evalNewtype nt = bindVar (ntName nt) (return (foldr tabs con (ntParams nt))) where tabs _tp body = tlam (\ _ -> body)@@ -180,16 +187,16 @@ -- | Extend the given evaluation environment with the result of evaluating the -- given collection of declaration groups.-evalDecls :: EvalPrims b w+evalDecls :: EvalPrims b w i => [DeclGroup] -- ^ Declaration groups to evaluate- -> GenEvalEnv b w -- ^ Environment to extend- -> Eval (GenEvalEnv b w)+ -> GenEvalEnv b w i -- ^ Environment to extend+ -> Eval (GenEvalEnv b w i) evalDecls dgs env = foldM evalDeclGroup env dgs -evalDeclGroup :: EvalPrims b w- => GenEvalEnv b w+evalDeclGroup :: EvalPrims b w i+ => GenEvalEnv b w i -> DeclGroup- -> Eval (GenEvalEnv b w)+ -> Eval (GenEvalEnv b w i) evalDeclGroup env dg = do case dg of Recursive ds -> do@@ -219,13 +226,13 @@ -- -- 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+-- binding is indistinguishable from its 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'+-- However, for the so-called 'Value' types we can instead optimistically 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 ())+fillHole :: BitWord b w i+ => GenEvalEnv b w i+ -> (Name, Schema, Eval (GenValue b w i), Eval (GenValue b w i) -> Eval ()) -> Eval () fillHole env (nm, sch, _, fill) = do case lookupVar nm env of@@ -240,7 +247,7 @@ -- 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 :: GenEvalEnv b w i -> Schema -> Bool isValueType env Forall{ sVars = [], sProps = [], sType = t0 } = go (evalValType (envTypes env) t0) where@@ -254,28 +261,28 @@ -- | Eta-expand a word value. This forces an unpacked word representation.-etaWord :: BitWord b w+etaWord :: BitWord b w i => Integer- -> Eval (GenValue b w)- -> Eval (WordValue b w)+ -> Eval (GenValue b w i)+ -> Eval (WordValue b w i) 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+-- | Given a simulator value and its 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+etaDelay :: BitWord b w i => String- -> GenEvalEnv b w+ -> GenEvalEnv b w i -> Schema- -> Eval (GenValue b w)- -> Eval (GenValue b w)+ -> Eval (GenValue b w i)+ -> Eval (GenValue b w i) etaDelay msg env0 Forall{ sVars = vs0, sType = tp0 } = goTpVars env0 vs0 where goTpVars env [] x = go (evalValType (envTypes env) tp0) x@@ -289,8 +296,9 @@ go tp (Ready x) = case x of- VBit _ -> return x- VWord _ _ -> return x+ VBit _ -> return x+ VInteger _ -> return x+ VWord _ _ -> return x VSeq n xs | TVSeq _nt el <- tp -> return $ VSeq n $ IndexSeqMap $ \i -> go el (lookupSeqMap xs i)@@ -320,6 +328,8 @@ go tp x = case tp of TVBit -> x+ TVInteger -> x+ TVIntMod _ -> x TVSeq n TVBit -> do w <- delayFill (fromWordVal "during eta-expansion" =<< x) (etaWord n x)@@ -358,7 +368,7 @@ declHole :: Decl- -> Eval (Name, Schema, Eval (GenValue b w), Eval (GenValue b w) -> Eval ())+ -> Eval (Name, Schema, Eval (GenValue b w i), Eval (GenValue b w i) -> Eval ()) declHole d = case dDefinition d of DPrim -> evalPanic "Unexpected primitive declaration in recursive group"@@ -379,14 +389,14 @@ -- 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 :: EvalPrims b w i+ => GenEvalEnv b w i -- ^ A 'read only' environment for use in declaration bodies+ -> GenEvalEnv b w i -- ^ An evaluation environment to extend with the given declaration+ -> Decl -- ^ The declaration to evaluate+ -> Eval (GenEvalEnv b w i) evalDecl renv env d = case dDefinition d of- DPrim -> bindVarDirect (dName d) (evalPrim d) env+ DPrim -> return $ bindVarDirect (dName d) (evalPrim d) env DExpr e -> bindVar (dName d) (evalExpr renv e) env @@ -395,11 +405,11 @@ -- | 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+evalSel :: forall b w i+ . EvalPrims b w i+ => GenValue b w i -> Selector- -> Eval (GenValue b w)+ -> Eval (GenValue b w i) evalSel val sel = case sel of TupleSel n _ -> tupleSel n val@@ -410,9 +420,6 @@ tupleSel n v = case v of 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"@@ -421,9 +428,6 @@ recordSel n v = case v of 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"@@ -447,28 +451,31 @@ -- | 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 b w = ListEnv- { leVars :: !(Map.Map Name (Integer -> Eval (GenValue b w)))+data ListEnv b w i = ListEnv+ { leVars :: !(Map.Map Name (Integer -> Eval (GenValue b w i))) -- ^ Bindings whose values vary by position- , leStatic :: !(Map.Map Name (Eval (GenValue b w)))+ , leStatic :: !(Map.Map Name (Eval (GenValue b w i))) -- ^ Bindings whose values are constant , leTypes :: !TypeEnv } -instance Monoid (ListEnv b w) where+instance Semigroup (ListEnv b w i) where+ l <> r = ListEnv+ { leVars = Map.union (leVars l) (leVars r)+ , leStatic = Map.union (leStatic l) (leStatic r)+ , leTypes = Map.union (leTypes l) (leTypes r)+ }++instance Monoid (ListEnv b w i) where mempty = ListEnv { leVars = Map.empty , leStatic = Map.empty , leTypes = Map.empty } - mappend l r = ListEnv- { leVars = Map.union (leVars l) (leVars r)- , leStatic = Map.union (leStatic l) (leStatic r)- , leTypes = Map.union (leTypes l) (leTypes r)- }+ mappend l r = l <> r -toListEnv :: GenEvalEnv b w -> ListEnv b w+toListEnv :: GenEvalEnv b w i -> ListEnv b w i toListEnv e = ListEnv { leVars = mempty@@ -479,7 +486,7 @@ -- | 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 b w i -> Integer -> GenEvalEnv b w i evalListEnv (ListEnv vm st tm) i = let v = fmap ($i) vm in EvalEnv{ envVars = Map.union v st@@ -487,21 +494,21 @@ } bindVarList :: Name- -> (Integer -> Eval (GenValue b w))- -> ListEnv b w- -> ListEnv b w+ -> (Integer -> Eval (GenValue b w i))+ -> ListEnv b w i+ -> ListEnv b w i bindVarList n vs lenv = lenv { leVars = Map.insert n vs (leVars lenv) } -- List Comprehensions --------------------------------------------------------- -- | Evaluate a comprehension.-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 :: EvalPrims b w i+ => GenEvalEnv b w i -- ^ 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 i) evalComp env len elty body ms = do lenv <- mconcat <$> mapM (branchEnvs (toListEnv env)) ms mkSeq len elty <$> memoMap (IndexSeqMap $ \i -> do@@ -509,17 +516,17 @@ -- | Turn a list of matches into the final environments for each iteration of -- the branch.-branchEnvs :: EvalPrims b w- => ListEnv b w+branchEnvs :: EvalPrims b w i+ => ListEnv b w i -> [Match]- -> Eval (ListEnv b w)+ -> Eval (ListEnv b w i) branchEnvs env matches = foldM evalMatch env matches -- | Turn a match into the list of environments it represents.-evalMatch :: EvalPrims b w- => ListEnv b w+evalMatch :: EvalPrims b w i+ => ListEnv b w i -> Match- -> Eval (ListEnv b w)+ -> Eval (ListEnv b w i) evalMatch lenv m = case m of -- many envs
src/Cryptol/Eval/Arch.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval.Arch -- Copyright : (c) 2014-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/Eval/Env.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval.Env -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -14,7 +14,7 @@ {-# LANGUAGE DeriveGeneric #-} module Cryptol.Eval.Env where -import Cryptol.Eval.Monad( Eval, delay, ready )+import Cryptol.Eval.Monad( Eval, delay, ready, PPOpts ) import Cryptol.Eval.Type import Cryptol.Eval.Value import Cryptol.ModuleSystem.Name@@ -24,6 +24,7 @@ import qualified Data.Map.Strict as Map+import Data.Semigroup import GHC.Generics (Generic) import Control.DeepSeq@@ -33,37 +34,40 @@ -- Evaluation Environment ------------------------------------------------------ -data GenEvalEnv b w = EvalEnv- { envVars :: !(Map.Map Name (Eval (GenValue b w)))+data GenEvalEnv b w i = EvalEnv+ { envVars :: !(Map.Map Name (Eval (GenValue b w i))) , envTypes :: !TypeEnv } deriving (Generic, NFData) -instance Monoid (GenEvalEnv b w) where+instance Semigroup (GenEvalEnv b w i) where+ l <> r = EvalEnv+ { envVars = Map.union (envVars l) (envVars r)+ , envTypes = Map.union (envTypes l) (envTypes r)+ }++instance Monoid (GenEvalEnv b w i) where mempty = EvalEnv { envVars = Map.empty , envTypes = Map.empty } - mappend l r = EvalEnv- { envVars = Map.union (envVars l) (envVars r)- , envTypes = Map.union (envTypes l) (envTypes r)- }+ mappend l r = l <> r -ppEnv :: BitWord b w => PPOpts -> GenEvalEnv b w -> Eval Doc+ppEnv :: BitWord b w i => PPOpts -> GenEvalEnv b w i -> 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) -- | Evaluation environment with no bindings-emptyEnv :: GenEvalEnv b w+emptyEnv :: GenEvalEnv b w i emptyEnv = mempty -- | Bind a variable in the evaluation environment. bindVar :: Name- -> Eval (GenValue b w)- -> GenEvalEnv b w- -> Eval (GenEvalEnv b w)+ -> Eval (GenValue b w i)+ -> GenEvalEnv b w i+ -> Eval (GenEvalEnv b w i) bindVar n val env = do let nm = show $ ppLocName n val' <- delay (Just nm) val@@ -72,24 +76,24 @@ -- | 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)+ -> GenValue b w i+ -> GenEvalEnv b w i+ -> GenEvalEnv b w i bindVarDirect n val env = do- return $ env{ envVars = Map.insert n (ready val) (envVars env) }+ env{ envVars = Map.insert n (ready val) (envVars env) } -- | Lookup a variable in the environment. {-# INLINE lookupVar #-}-lookupVar :: Name -> GenEvalEnv b w -> Maybe (Eval (GenValue b w))+lookupVar :: Name -> GenEvalEnv b w i -> Maybe (Eval (GenValue b w i)) lookupVar n env = Map.lookup n (envVars env) -- | Bind a type variable of kind *. {-# INLINE bindType #-}-bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w -> GenEvalEnv b w+bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w i -> GenEvalEnv b w i bindType p ty env = env { envTypes = Map.insert p ty (envTypes env) } -- | Lookup a type variable. {-# INLINE lookupType #-}-lookupType :: TVar -> GenEvalEnv b w -> Maybe (Either Nat' TValue)+lookupType :: TVar -> GenEvalEnv b w i -> Maybe (Either Nat' TValue) lookupType p env = Map.lookup p (envTypes env)
src/Cryptol/Eval/Monad.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval.Monad -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -14,6 +14,9 @@ ( -- * Evaluation monad Eval(..) , runEval+, EvalOpts(..)+, getEvalOpts+, PPOpts(..) , io , delay , delayFill@@ -24,6 +27,8 @@ , evalPanic , typeCannotBeDemoted , divideByZero+, negativeExponent+, logNegative , wordTooWide , cryUserError , cryLoopError@@ -41,22 +46,42 @@ import Cryptol.Utils.Panic import Cryptol.Utils.PP+import Cryptol.Utils.Logger(Logger) import Cryptol.TypeCheck.AST(Type) -- | A computation that returns an already-evaluated value. ready :: a -> Eval a ready a = Ready a +-- | How to pretty print things when evaluating+data PPOpts = PPOpts+ { useAscii :: Bool+ , useBase :: Int+ , useInfLength :: Int+ }++-- | Some options for evalutaion+data EvalOpts = EvalOpts+ { evalLogger :: Logger -- ^ Where to print stuff (e.g., for @trace@)+ , evalPPOpts :: PPOpts -- ^ How to pretty print things.+ }++ -- | The monad for Cryptol evaluation. data Eval a = Ready !a- | Thunk !(IO a)+ | Thunk !(EvalOpts -> 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 ++-- | Access the evaluation options.+getEvalOpts :: Eval EvalOpts+getEvalOpts = Thunk return+ {-# INLINE delay #-} -- | Delay the given evaluation computation, returning a thunk -- which will run the computation when forced. Raise a loop@@ -65,11 +90,11 @@ -> Eval a -- ^ Computation to delay -> Eval (Eval a) delay _ (Ready a) = Ready (Ready a)-delay msg (Thunk x) = Thunk $ do+delay msg (Thunk x) = Thunk $ \opts -> do let msg' = maybe "" ("while evaluating "++) msg let retry = cryLoopError msg' r <- newIORef Unforced- return $ unDelay retry r x+ return $ unDelay retry r (x opts) {-# INLINE delayFill #-} @@ -81,9 +106,9 @@ -> 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+delayFill (Thunk x) retry = Thunk $ \opts -> do r <- newIORef Unforced- return $ unDelay retry r x+ return $ unDelay retry r (x opts) -- | 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@@ -111,18 +136,18 @@ return val -- | Execute the given evaluation action.-runEval :: Eval a -> IO a-runEval (Ready a) = return a-runEval (Thunk x) = x+runEval :: EvalOpts -> Eval a -> IO a+runEval _ (Ready a) = return a+runEval opts (Thunk x) = x opts {-# INLINE evalBind #-} evalBind :: Eval a -> (a -> Eval b) -> Eval b evalBind (Ready a) f = f a-evalBind (Thunk x) f = Thunk (x >>= runEval . f)+evalBind (Thunk x) f = Thunk $ \opts -> x opts >>= runEval opts . f instance Functor Eval where fmap f (Ready x) = Ready (f x)- fmap f (Thunk m) = Thunk (f <$> m)+ fmap f (Thunk m) = Thunk $ \opts -> f <$> m opts {-# INLINE fmap #-} instance Applicative Eval where@@ -133,7 +158,7 @@ instance Monad Eval where return = Ready- fail = Thunk . fail+ fail x = Thunk (\_ -> fail x) (>>=) = evalBind {-# INLINE return #-} {-# INLINE (>>=) #-}@@ -146,26 +171,28 @@ rnf (Thunk _) = () instance MonadFix Eval where- mfix f = Thunk $ mfix (\x -> runEval (f x))+ mfix f = Thunk $ \opts -> mfix (\x -> runEval opts (f x)) -- | Lift an 'IO' computation into the 'Eval' monad. io :: IO a -> Eval a-io = Thunk+io m = Thunk (\_ -> m) {-# INLINE io #-} -- Errors ---------------------------------------------------------------------- -- | Panic from an @Eval@ context.-evalPanic :: String -> [String] -> a+evalPanic :: HasCallStack => 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+ | TypeCannotBeDemoted Type -- ^ Non-numeric type passed to @number@ function | DivideByZero -- ^ Division or modulus by 0+ | NegativeExponent -- ^ Exponentiation by negative integer+ | LogNegative -- ^ Logarithm of a negative integer | WordTooWide Integer -- ^ Bitvector too large | UserError String -- ^ Call to the Cryptol @error@ primitive | LoopError String -- ^ Detectable nontermination@@ -176,6 +203,8 @@ InvalidIndex i -> text "invalid sequence index:" <+> integer i TypeCannotBeDemoted t -> text "type cannot be demoted:" <+> pp t DivideByZero -> text "division by 0"+ NegativeExponent -> text "negative exponent"+ LogNegative -> text "logarithm of negative" WordTooWide w -> text "word too wide for memory:" <+> integer w <+> text "bits" UserError x -> text "Run-time error:" <+> text x@@ -189,8 +218,16 @@ -- | For division by 0. divideByZero :: Eval a-divideByZero = Thunk (X.throwIO DivideByZero)+divideByZero = io (X.throwIO DivideByZero) +-- | For exponentiation by a negative integer.+negativeExponent :: Eval a+negativeExponent = io (X.throwIO NegativeExponent)++-- | For logarithm of a negative integer.+logNegative :: Eval a+logNegative = io (X.throwIO LogNegative)+ -- | 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).@@ -199,12 +236,12 @@ -- | For the Cryptol @error@ function. cryUserError :: String -> Eval a-cryUserError msg = Thunk (X.throwIO (UserError msg))+cryUserError msg = io (X.throwIO (UserError msg)) -- | For cases where we can detect tight loops. cryLoopError :: String -> Eval a-cryLoopError msg = Thunk (X.throwIO (LoopError msg))+cryLoopError msg = io (X.throwIO (LoopError msg)) -- | A sequencing operation has gotten an invalid index. invalidIndex :: Integer -> Eval a-invalidIndex i = Thunk (X.throwIO (InvalidIndex i))+invalidIndex i = io (X.throwIO (InvalidIndex i))
src/Cryptol/Eval/Reference.lhs view
@@ -1,5 +1,5 @@ > -- |-> -- Module : $Header$+> -- Module : Cryptol.Eval.Reference > -- Description : The reference implementation of the Cryptol evaluation semantics. > -- Copyright : (c) 2013-2016 Galois, Inc. > -- License : BSD3@@ -23,14 +23,16 @@ > import Data.Ord (comparing) > import Data.Map (Map) > import qualified Data.Map as Map+> import Data.Semigroup (Semigroup(..)) > import qualified Data.Text as T (pack) > > import Cryptol.ModuleSystem.Name (asPrim)-> import Cryptol.TypeCheck.Solver.InfNat (Nat'(..))+> import Cryptol.TypeCheck.Solver.InfNat (Nat'(..), nAdd, nMin, nMul) > import Cryptol.TypeCheck.AST-> import Cryptol.Eval.Monad (EvalError(..))+> import Cryptol.Eval.Monad (EvalError(..), PPOpts(..)) > import Cryptol.Eval.Type (TValue(..), isTBit, evalValType, evalNumType, tvSeq)-> import Cryptol.Prims.Eval (lg2, divModPoly)+> import Cryptol.Eval.Value (mkBv, ppBV)+> import Cryptol.Prims.Eval (lg2) > import Cryptol.Utils.Ident (Ident, mkIdent) > import Cryptol.Utils.Panic (panic) > import Cryptol.Utils.PP@@ -63,6 +65,7 @@ | Cryptol type | Description | `TValue` representation | |:----------------- |:-------------- |:--------------------------- | | `Bit` | booleans | `TVBit` |+| `Integer` | integers | `TVInteger` | | `[n]a` | finite lists | `TVSeq n a` | | `[inf]a` | infinite lists | `TVStream a` | | `(a, b, c)` | tuples | `TVTuple [a,b,c]` |@@ -87,6 +90,10 @@ `False`, run-time errors of type `EvalError`, and $\bot$; we represent it with the Haskell type `Either EvalError Bool`. +Similarly, *M*(`Integer`) is a flat cpo with values for integers,+run-time errors, and $\bot$; we represent it with the Haskell type+`Either EvalError Integer`.+ 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`,@@ -110,7 +117,8 @@ > -- | Value type for the reference evaluator. > data Value > = VBit (Either EvalError Bool) -- ^ @ Bit @ booleans-> | VList [Value] -- ^ @ [n]a @ finite or infinite lists+> | VInteger (Either EvalError Integer) -- ^ @ Integer @ integers+> | VList Nat' [Value] -- ^ @ [n]a @ finite or infinite lists > | VTuple [Value] -- ^ @ ( .. ) @ tuples > | VRecord [(Ident, Value)] -- ^ @ { .. } @ records > | VFun (Value -> Value) -- ^ functions@@ -118,13 +126,13 @@ > | 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`.+inside the argument of a `VBit` or `VInteger` 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 (Nat 2) [VBit (Left+e), VBit (Left e)]` where `e = DivideByZero`. Copy Functions --------------@@ -132,10 +140,10 @@ 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.+and `VInteger` 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.@@ -161,8 +169,10 @@ > 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)))+> TVInteger -> VInteger (fromVInteger val)+> TVIntMod _ -> VInteger (fromVInteger val)+> TVSeq w ety -> VList (Nat w) (map (go ety) (copyList w (fromVList val)))+> TVStream ety -> VList Inf (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))@@ -182,10 +192,15 @@ > fromVBit (VBit b) = b > fromVBit _ = evalPanic "fromVBit" ["Expected a bit"] >+> -- | Destructor for @VInteger@.+> fromVInteger :: Value -> Either EvalError Integer+> fromVInteger (VInteger i) = i+> fromVInteger _ = evalPanic "fromVInteger" ["Expected an integer"]+> > -- | Destructor for @VList@. > fromVList :: Value -> [Value]-> fromVList (VList vs) = vs-> fromVList _ = evalPanic "fromVList" ["Expected a list"]+> fromVList (VList _ vs) = vs+> fromVList _ = evalPanic "fromVList" ["Expected a list"] > > -- | Destructor for @VTuple@. > fromVTuple :: Value -> [Value]@@ -238,15 +253,18 @@ > , envTypes :: !(Map TVar (Either Nat' TValue)) > } >+> instance Semigroup Env where+> l <> r = Env+> { envVars = Map.union (envVars l) (envVars r)+> , envTypes = Map.union (envTypes l) (envTypes r)+> }+> > 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)-> }+> mappend l r = l <> r > > -- | Bind a variable in the evaluation environment. > bindVar :: (Name, Value) -> Env -> Env@@ -271,7 +289,7 @@ > evalExpr env expr = > case expr of >-> EList es _ty -> VList [ evalExpr env e | e <- es ]+> EList es _ty -> VList (Nat (genericLength es)) [ 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@@ -309,9 +327,7 @@ Selectors --------- -Apply the the given selector form to the given value. This function-pushes tuple and record selections pointwise down into sequences and-functions.+Apply the the given selector form to the given value. > evalSel :: Value -> Selector -> Value > evalSel val sel =@@ -323,20 +339,16 @@ > 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+> VList _ vs -> vs !! n > _ -> evalPanic "evalSel" > ["Unexpected value in list selection."] @@ -351,7 +363,8 @@ > condValue c l r = > case l of > VBit b -> VBit (condBit c b (fromVBit r))-> VList vs -> VList (zipWith (condValue c) vs (fromVList r))+> VInteger i -> VInteger (condBit c i (fromVInteger r))+> VList n vs -> VList n (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))@@ -361,7 +374,7 @@ 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 :: Either e Bool -> Either e a -> Either e a -> Either e a > condBit (Left e) _ _ = Left e > condBit (Right b) x y = if b then x else y @@ -384,6 +397,12 @@ > From n _l _ty expr -> > [ bindVar (n, v) env | v <- fromVList (evalExpr env expr) ] +> lenMatch :: Env -> Match -> Nat'+> lenMatch env m =+> case m of+> Let _ -> Nat 1+> From _ len _ _ -> evalNumType (envTypes env) len+ 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@@ -395,18 +414,23 @@ > [ env'' | env' <- evalMatch env match > , env'' <- evalBranch env' matches ] +> lenBranch :: Env -> [Match] -> Nat'+> lenBranch _env [] = Nat 1+> lenBranch env (match : matches) =+> nMul (lenMatch env match) (lenBranch 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.+list is equal to the minimum 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 ]+> evalComp env expr branches = VList len [ evalExpr e expr | e <- envs ] > where > -- Generate a new environment for each iteration of each > -- parallel branch.@@ -418,6 +442,9 @@ > -- truncated to the length of the shortest branch. > envs :: [Env] > envs = foldr1 (zipWith mappend) benvs+>+> len :: Nat'+> len = foldr1 nMin (map (lenBranch env) branches) Declarations@@ -474,7 +501,7 @@ * Logic: `&&`, `||`, `^`, `complement`, `zero`, `True`, `False` -* Arithmetic: `+`, `-`, `*`, `/`, `%`, `^^`, `lg2`, `negate`, `demote`+* Arithmetic: `+`, `-`, `*`, `/`, `%`, `^^`, `lg2`, `negate`, `number` * Comparison: `<`, `>`, `<=`, `>=`, `==`, `!=` @@ -503,17 +530,25 @@ > , ("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)+> , ("+" , binary (arithBinary (\x y -> Right (x + y))))+> , ("-" , binary (arithBinary (\x y -> Right (x - y))))+> , ("*" , binary (arithBinary (\x y -> Right (x * y))))+> , ("/" , binary (arithBinary divWrap))+> , ("%" , binary (arithBinary modWrap))+> , ("/$" , binary (signedArithBinary divWrap))+> , ("%$" , binary (signedArithBinary modWrap))+> , ("^^" , binary (arithBinary expWrap))+> , ("lg2" , unary (arithUnary lg2Wrap))+> , ("negate" , unary (arithUnary (\x -> Right (- x))))+> , ("number" , vFinPoly $ \val ->+> VPoly $ \a ->+> arithNullary (Right val) a)+> , ("toInteger" , vFinPoly $ \_bits ->+> VFun $ \x ->+> VInteger (fromVWord x))+> , ("fromInteger", VPoly $ \a ->+> VFun $ \x ->+> arithNullary (fromVInteger x) a) > > -- Comparison: > , ("<" , binary (cmpOrder (\o -> o == LT)))@@ -522,59 +557,61 @@ > , (">=" , binary (cmpOrder (\o -> o /= LT))) > , ("==" , binary (cmpOrder (\o -> o == EQ))) > , ("!=" , binary (cmpOrder (\o -> o /= EQ)))+> , ("<$" , binary signedLessThan) > > -- Sequences:-> , ("#" , VNumPoly $ \_front ->-> VNumPoly $ \_back ->+> , ("#" , VNumPoly $ \front ->+> VNumPoly $ \back -> > VPoly $ \_elty -> > VFun $ \l -> > VFun $ \r ->-> VList (fromVList l ++ fromVList r))+> VList (nAdd front back) (fromVList l ++ fromVList r)) >-> , ("join" , VNumPoly $ \_parts ->+> , ("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))))+> Nat 0 -> VList (Nat 0) []+> _ -> VList (nMul parts each)+> (concat (map fromVList (fromVList xss)))) > > , ("split" , VNumPoly $ \parts -> > vFinPoly $ \each -> > VPoly $ \_a -> > VFun $ \val ->-> VList (splitV parts each (fromVList val)))+> VList parts (splitV parts each (fromVList val))) > > , ("splitAt" , vFinPoly $ \front ->-> VNumPoly $ \_back ->+> VNumPoly $ \back -> > VPoly $ \_a -> > VFun $ \v -> > let (xs, ys) = genericSplitAt front (fromVList v)-> in VTuple [VList xs, VList ys])+> in VTuple [VList (Nat front) xs, VList back ys]) >-> , ("reverse" , VNumPoly $ \_a ->-> VPoly $ \_b ->+> , ("reverse" , VNumPoly $ \n ->+> VPoly $ \_a -> > VFun $ \v ->-> VList (reverse (fromVList v)))+> VList n (reverse (fromVList v))) >-> , ("transpose" , VNumPoly $ \_a ->-> VNumPoly $ \b ->-> VPoly $ \_c ->+> , ("transpose" , VNumPoly $ \rows ->+> VNumPoly $ \cols ->+> VPoly $ \_a -> > VFun $ \v ->-> VList (map VList (transposeV b (map fromVList (fromVList v)))))+> VList cols+> (map (VList rows) (transposeV cols (map fromVList (fromVList v))))) > > -- Shifting: > , ("<<" , shiftV shiftLV) > , (">>" , shiftV shiftRV) > , ("<<<" , rotateV rotateLV) > , (">>>" , rotateV rotateRV)+> , (">>$" , signedShiftRV) > > -- Indexing: > , ("@" , indexPrimOne indexFront)-> , ("@@" , indexPrimMany indexFront) > , ("!" , indexPrimOne indexBack)-> , ("!!" , indexPrimMany indexBack) > , ("update" , updatePrim updateFront) > , ("updateEnd" , updatePrim updateBack) >@@ -583,82 +620,33 @@ > vFinPoly $ \next -> > vFinPoly $ \bits -> > vFinPoly $ \len ->-> VList (map (vWordValue bits) (genericTake len [first, next ..])))+> VList (Nat len)+> (map (vWordValue bits) (genericTake len [first, next ..]))) > > , ("fromTo" , vFinPoly $ \first -> > vFinPoly $ \lst ->-> vFinPoly $ \bits ->-> VList (map (vWordValue bits) [first .. lst]))+> VPoly $ \ty ->+> let f i = arithNullary (Right i) ty+> in VList (Nat (1 + lst - first)) (map f [first .. lst])) > > , ("fromThenTo" , vFinPoly $ \first -> > vFinPoly $ \next -> > vFinPoly $ \_lst ->-> vFinPoly $ \bits ->+> VPoly $ \ty -> > vFinPoly $ \len ->-> VList (map (vWordValue bits) (genericTake len [first, next ..])))+> let f i = arithNullary (Right i) ty+> in VList (Nat len) (map f (genericTake len [first, next ..]))) >-> , ("infFrom" , vFinPoly $ \bits ->+> , ("infFrom" , VPoly $ \ty -> > 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 ..]))+> let f i = arithUnary (\x -> Right (x + i)) ty first+> in VList Inf (map f [0 ..])) >-> , ("infFromThen", vFinPoly $ \bits ->+> , ("infFromThen", VPoly $ \ty -> > 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))))+> let f i = arithBinary (\x y -> Right (x + (y - x) * i)) ty first next+> in VList Inf (map f [0 ..])) > > -- Miscellaneous: > , ("error" , VPoly $ \a ->@@ -703,14 +691,23 @@ > 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.+> fromSignedVWord :: Value -> Either EvalError Integer+> fromSignedVWord v = fmap signedBitsToInteger (mapM fromVBit (fromVList v))+>+> -- | Convert a list of booleans in signed big-endian format to an integer.+> signedBitsToInteger :: [Bool] -> Integer+> signedBitsToInteger [] = evalPanic "signedBitsToInteger" ["Bitvector has zero length"]+> signedBitsToInteger (b0 : bs) = foldl f (if b0 then -1 else 0) bs+> where f x b = if b then 2 * x + 1 else 2 * x +Functions `vWord` and `vWordValue` 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))+> vWordValue w x = VList (Nat w) (map (VBit . Right) (integerToBits w x)) > > -- | Convert an integer to a big-endian format of the specified width. > integerToBits :: Integer -> Integer -> [Bool]@@ -718,15 +715,10 @@ > 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] ]+> vWord w e = VList (Nat w) [ VBit (fmap (test i) e) | i <- [w-1, w-2 .. 0] ] > where test i x = testBit x (fromInteger i) - Logic ----- @@ -741,8 +733,10 @@ > 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 TVInteger = VInteger (fmap (\c -> if c then -1 else 0) b)+> go (TVIntMod _) = VInteger (fmap (const 0) b)+> go (TVSeq n ety) = VList (Nat n) (genericReplicate n (go ety))+> go (TVStream ety) = VList Inf (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)@@ -754,8 +748,10 @@ > 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))+> TVInteger -> evalPanic "logicUnary" ["Integer not in class Logic"]+> TVIntMod _ -> evalPanic "logicUnary" ["Z not in class Logic"]+> TVSeq w ety -> VList (Nat w) (map (go ety) (fromVList val))+> TVStream ety -> VList Inf (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))@@ -767,8 +763,10 @@ > 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))+> TVInteger -> evalPanic "logicBinary" ["Integer not in class Logic"]+> TVIntMod _ -> evalPanic "logicBinary" ["Z not in class Logic"]+> TVSeq w ety -> VList (Nat w) (zipWith (go ety) (fromVList l) (fromVList r))+> TVStream ety -> VList Inf (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 ]@@ -784,7 +782,34 @@ example, `[error "foo", True] * 2` does not evaluate to `[True, False]`, but to `[error "foo", error "foo"]`. -> arithUnary :: (Integer -> Integer -> Integer)+Signed arithmetic primitives may be applied to any type that is made+up of non-empty finite bitvectors.++> arithNullary :: Either EvalError Integer -> TValue -> Value+> arithNullary i = go+> where+> go :: TValue -> Value+> go ty =+> case ty of+> TVBit ->+> evalPanic "arithNullary" ["Bit not in class Arith"]+> TVInteger ->+> VInteger i+> TVIntMod n ->+> VInteger (flip mod n <$> i)+> TVSeq w a+> | isTBit a -> vWord w i+> | otherwise -> VList (Nat w) (genericReplicate w (go a))+> TVStream a ->+> VList Inf (repeat (go a))+> TVFun _ ety ->+> VFun (const (go ety))+> TVTuple tys ->+> VTuple (map go tys)+> TVRec fs ->+> VRecord [ (f, go fty) | (f, fty) <- fs ]+>+> arithUnary :: (Integer -> Either EvalError Integer) > -> TValue -> Value -> Value > arithUnary op = go > where@@ -793,11 +818,21 @@ > case ty of > TVBit -> > evalPanic "arithUnary" ["Bit not in class Arith"]+> TVInteger ->+> VInteger $+> case fromVInteger val of+> Left e -> Left e+> Right i -> op i+> TVIntMod n ->+> VInteger $+> case fromVInteger val of+> Left e -> Left e+> Right i -> flip mod n <$> op i > TVSeq w a-> | isTBit a -> vWord w (op w <$> fromVWord val)-> | otherwise -> VList (map (go a) (fromVList val))+> | isTBit a -> vWord w (op =<< fromVWord val)+> | otherwise -> VList (Nat w) (map (go a) (fromVList val)) > TVStream a ->-> VList (map (go a) (fromVList val))+> VList Inf (map (go a) (fromVList val)) > TVFun _ ety -> > VFun (\x -> go ety (fromVFun val x)) > TVTuple tys ->@@ -805,40 +840,76 @@ > TVRec fs -> > VRecord [ (f, go fty (lookupRecord f val)) | (f, fty) <- fs ] >-> arithBinary :: (Integer -> Integer -> Integer -> Either EvalError Integer)+> arithBinary :: (Integer -> Integer -> Either EvalError Integer) > -> TValue -> Value -> Value -> Value-> arithBinary op = go+> arithBinary = arithBinaryGeneric fromVWord+>+> signedArithBinary :: (Integer -> Integer -> Either EvalError Integer)+> -> TValue -> Value -> Value -> Value+> signedArithBinary = arithBinaryGeneric fromSignedVWord+>+> arithBinaryGeneric :: (Value -> Either EvalError Integer)+> -> (Integer -> Integer -> Either EvalError Integer)+> -> TValue -> Value -> Value -> Value+> arithBinaryGeneric fromWord op = go > where > go :: TValue -> Value -> Value -> Value > go ty l r = > case ty of > TVBit -> > evalPanic "arithBinary" ["Bit not in class Arith"]+> TVInteger ->+> VInteger $+> case fromVInteger l of+> Left e -> Left e+> Right i ->+> case fromVInteger r of+> Left e -> Left e+> Right j -> op i j+> TVIntMod n ->+> VInteger $+> case fromVInteger l of+> Left e -> Left e+> Right i ->+> case fromVInteger r of+> Left e -> Left e+> Right j -> flip mod n <$> op i j > TVSeq w a > | isTBit a -> vWord w $-> case fromVWord l of+> case fromWord l of > Left e -> Left e > Right i ->-> case fromVWord r of+> case fromWord r of > Left e -> Left e-> Right j -> op w i j-> | otherwise -> VList (zipWith (go a) (fromVList l) (fromVList r))+> Right j -> op i j+> | otherwise -> VList (Nat w) (zipWith (go a) (fromVList l) (fromVList r)) > TVStream a ->-> VList (zipWith (go a) (fromVList l) (fromVList r))+> VList Inf (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 ]->++Signed bitvector division (`/$`) and remainder (`%$`) are defined so+that division rounds toward zero, and the remainder `x %$ y` has the+same sign as `x`. Accordingly, they are implemented with Haskell's+`quot` and `rem` operations.+ > divWrap :: Integer -> Integer -> Either EvalError Integer > divWrap _ 0 = Left DivideByZero-> divWrap x y = Right (x `div` y)+> divWrap x y = Right (x `quot` y) > > modWrap :: Integer -> Integer -> Either EvalError Integer > modWrap _ 0 = Left DivideByZero-> modWrap x y = Right (x `mod` y)+> modWrap x y = Right (x `rem` y)+>+> expWrap :: Integer -> Integer -> Either EvalError Integer+> expWrap x y = if y < 0 then Left NegativeExponent else Right (x ^ y)+>+> lg2Wrap :: Integer -> Either EvalError Integer+> lg2Wrap x = if x < 0 then Left LogNegative else Right (lg2 x) Comparison@@ -865,6 +936,10 @@ > case ty of > TVBit -> > compare <$> fromVBit l <*> fromVBit r+> TVInteger ->+> compare <$> fromVInteger l <*> fromVInteger r+> TVIntMod _ ->+> compare <$> fromVInteger l <*> fromVInteger r > TVSeq _w ety -> > lexList (zipWith (lexCompare ety) (fromVList l) (fromVList r)) > TVStream _ ->@@ -888,7 +963,47 @@ > Right EQ -> lexList es > Right GT -> Right GT +Signed comparisons may be applied to any type made up of non-empty+bitvectors. All such types are compared using a lexicographic+ordering: Lists and tuples are compared left-to-right, and record+fields are compared in alphabetical order. +> signedLessThan :: TValue -> Value -> Value -> Value+> signedLessThan ty l r = VBit (fmap (== LT) (lexSignedCompare ty l r))+>+> -- | Lexicographic ordering on two signed values.+> lexSignedCompare :: TValue -> Value -> Value -> Either EvalError Ordering+> lexSignedCompare ty l r =+> case ty of+> TVBit ->+> evalPanic "lexSignedCompare" ["invalid type"]+> TVInteger ->+> evalPanic "lexSignedCompare" ["invalid type"]+> TVIntMod _ ->+> evalPanic "lexSignedCompare" ["invalid type"]+> TVSeq _w ety+> | isTBit ety ->+> case fromSignedVWord l of+> Left e -> Left e+> Right i ->+> case fromSignedVWord r of+> Left e -> Left e+> Right j -> Right (compare i j)+> | otherwise ->+> lexList (zipWith (lexSignedCompare ety) (fromVList l) (fromVList r))+> TVStream _ ->+> evalPanic "lexSignedCompare" ["invalid type"]+> TVFun _ _ ->+> evalPanic "lexSignedCompare" ["invalid type"]+> TVTuple etys ->+> lexList (zipWith3 lexSignedCompare 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 lexSignedCompare tys ls rs)++ Sequences --------- @@ -897,8 +1012,8 @@ > 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+> Nat n -> VList (Nat k) ys : splitV (Nat (n - 1)) k zs+> Inf -> VList (Nat k) ys : splitV Inf k zs > where > (ys, zs) = genericSplitAt k xs >@@ -929,15 +1044,15 @@ > shiftV :: (Nat' -> Value -> [Value] -> Integer -> [Value]) -> Value > shiftV op =-> VNumPoly $ \a ->-> VNumPoly $ \_b ->-> VPoly $ \c ->+> VNumPoly $ \n ->+> VNumPoly $ \_ix ->+> VPoly $ \a -> > VFun $ \v -> > VFun $ \x ->-> copyByTValue (tvSeq a c) $+> copyByTValue (tvSeq n a) $ > case fromVWord x of-> Left e -> logicNullary (Left e) (tvSeq a c)-> Right i -> VList (op a (logicNullary (Right False) c) (fromVList v) i)+> Left e -> logicNullary (Left e) (tvSeq n a)+> Right i -> VList n (op n (logicNullary (Right False) a) (fromVList v) i) > > shiftLV :: Nat' -> Value -> [Value] -> Integer -> [Value] > shiftLV w z vs i =@@ -953,15 +1068,15 @@ > > rotateV :: (Integer -> [Value] -> Integer -> [Value]) -> Value > rotateV op =-> vFinPoly $ \a ->-> VNumPoly $ \_b ->-> VPoly $ \c ->+> vFinPoly $ \n ->+> VNumPoly $ \_ix ->+> VPoly $ \a -> > VFun $ \v -> > VFun $ \x ->-> copyByTValue (TVSeq a c) $+> copyByTValue (TVSeq n a) $ > case fromVWord x of-> Left e -> VList (genericReplicate a (logicNullary (Left e) c))-> Right i -> VList (op a (fromVList v) i)+> Left e -> VList (Nat n) (genericReplicate n (logicNullary (Left e) a))+> Right i -> VList (Nat n) (op n (fromVList v) i) > > rotateLV :: Integer -> [Value] -> Integer -> [Value] > rotateLV 0 vs _ = vs@@ -972,6 +1087,22 @@ > rotateRV 0 vs _ = vs > rotateRV w vs i = ys ++ xs > where (xs, ys) = genericSplitAt ((w - i) `mod` w) vs+>+> signedShiftRV :: Value+> signedShiftRV =+> VNumPoly $ \n ->+> VNumPoly $ \_ix ->+> VFun $ \v ->+> VFun $ \x ->+> copyByTValue (tvSeq n TVBit) $+> case fromVWord x of+> Left e -> logicNullary (Left e) (tvSeq n TVBit)+> Right i -> VList n $+> let vs = fromVList v+> z = head vs in+> case n of+> Nat m -> genericReplicate (min m i) z ++ genericTake (m - min m i) vs+> Inf -> genericReplicate i z ++ vs Indexing@@ -994,21 +1125,6 @@ > 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@@ -1034,7 +1150,7 @@ > case fromVWord idx of > Left e -> logicNullary (Left e) (tvSeq len eltTy) > Right i-> | Nat i < len -> VList (op len (fromVList xs) i val)+> | Nat i < len -> VList len (op len (fromVList xs) i val) > | otherwise -> logicNullary (Left (InvalidIndex i)) (tvSeq len eltTy) > > updateFront :: Nat' -> [Value] -> Integer -> Value -> [Value]@@ -1064,14 +1180,25 @@ Pretty Printing --------------- -> ppValue :: Value -> Doc-> ppValue val =+> ppValue :: PPOpts -> Value -> Doc+> ppValue opts 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)))+> VInteger i -> text (either show show i)+> VList l vs ->+> case l of+> Inf -> ppList (map (ppValue opts) (take (useInfLength opts) vs) ++ [text "..."])+> Nat n ->+> -- For lists of defined bits, print the value as a numeral.+> case traverse isBit vs of+> Just bs -> ppBV opts (mkBv n (bitsToInteger bs))+> Nothing -> ppList (map (ppValue opts) vs)+> where ppList docs = brackets (fsep (punctuate comma docs))+> isBit v = case v of VBit (Right b) -> Just b+> _ -> Nothing+> VTuple vs -> parens (sep (punctuate comma (map (ppValue opts) vs))) > VRecord fs -> braces (sep (punctuate comma (map ppField fs)))-> where ppField (f,r) = pp f <+> char '=' <+> ppValue r+> where ppField (f,r) = pp f <+> char '=' <+> ppValue opts r > VFun _ -> text "<function>" > VPoly _ -> text "<polymorphic value>" > VNumPoly _ -> text "<polymorphic value>"@@ -1084,7 +1211,7 @@ running the reference evaluator on an expression. > evaluate :: Expr -> M.ModuleCmd Value-> evaluate expr modEnv = return (Right (evalExpr env expr, modEnv), [])+> 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
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval.Type -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -21,12 +21,15 @@ import Data.Maybe(fromMaybe) import qualified Data.Map.Strict as Map import GHC.Generics (Generic)+import GHC.Stack(HasCallStack) import Control.DeepSeq -- | An evaluated type of kind *. -- These types do not contain type variables, type synonyms, or type functions. data TValue = TVBit -- ^ @ Bit @+ | TVInteger -- ^ @ Integer @+ | TVIntMod Integer -- ^ @ Z n @ | TVSeq Integer TValue -- ^ @ [n]a @ | TVStream TValue -- ^ @ [inf]t @ | TVTuple [TValue] -- ^ @ (a, b, c )@@@ -39,6 +42,8 @@ tValTy tv = case tv of TVBit -> tBit+ TVInteger -> tInteger+ TVIntMod n -> tIntMod (tNum n) TVSeq n t -> tSeq (tNum n) (tValTy t) TVStream t -> tSeq tInf (tValTy t) TVTuple ts -> tTuple (map tValTy ts)@@ -76,7 +81,7 @@ -- | Evaluation for types (kind * or #).-evalType :: TypeEnv -> Type -> Either Nat' TValue+evalType :: HasCallStack => TypeEnv -> Type -> Either Nat' TValue evalType env ty = case ty of TVar tv ->@@ -89,6 +94,10 @@ TCon (TC c) ts -> case (c, ts) of (TCBit, []) -> Right $ TVBit+ (TCInteger, []) -> Right $ TVInteger+ (TCIntMod, [n]) -> case num n of+ Inf -> evalPanic "evalType" ["invalid type Z inf"]+ Nat m -> Right $ TVIntMod m (TCSeq, [n, t]) -> Right $ tvSeq (num n) (val t) (TCFun, [a, b]) -> Right $ TVFun (val a) (val b) (TCTuple _, _) -> Right $ TVTuple (map val ts)@@ -105,14 +114,14 @@ num = evalNumType env -- | Evaluation for value types (kind *).-evalValType :: TypeEnv -> Type -> TValue+evalValType :: HasCallStack => TypeEnv -> Type -> TValue evalValType env ty = case evalType env ty of Left _ -> evalPanic "evalValType" ["expected value type, found numeric type"] Right t -> t -- | Evaluation for number types (kind #).-evalNumType :: TypeEnv -> Type -> Nat'+evalNumType :: HasCallStack => TypeEnv -> Type -> Nat' evalNumType env ty = case evalType env ty of Left n -> n@@ -120,7 +129,7 @@ -- | Reduce type functions, raising an exception for undefined values.-evalTF :: TFun -> [Nat'] -> Nat'+evalTF :: HasCallStack => TFun -> [Nat'] -> Nat' evalTF f vs | TCAdd <- f, [x,y] <- vs = nAdd x y | TCSub <- f, [x,y] <- vs = mb $ nSub x y@@ -131,6 +140,8 @@ | TCExp <- f, [x,y] <- vs = nExp x y | TCMin <- f, [x,y] <- vs = nMin x y | TCMax <- f, [x,y] <- vs = nMax x y+ | TCCeilDiv <- f, [x,y] <- vs = mb $ nCeilDiv x y+ | TCCeilMod <- f, [x,y] <- vs = mb $ nCeilMod x y | TCLenFromThen <- f, [x,y,z] <- vs = mb $ nLenFromThen x y z | TCLenFromThenTo <- f, [x,y,z] <- vs = mb $ nLenFromThenTo x y z | otherwise = evalPanic "evalTF"
src/Cryptol/Eval/Value.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Eval.Value -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -40,7 +40,7 @@ import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic) -import Data.List(genericLength, genericIndex)+import Data.List(genericLength, genericIndex, genericDrop) import qualified Data.Text as T import Numeric (showIntAtBase) @@ -75,67 +75,81 @@ -- | 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))+data SeqMap b w i+ = IndexSeqMap !(Integer -> Eval (GenValue b w i))+ | UpdateSeqMap !(Map Integer (Eval (GenValue b w i)))+ !(Integer -> Eval (GenValue b w i)) -lookupSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w)+lookupSeqMap :: SeqMap b w i -> Integer -> Eval (GenValue b w i) lookupSeqMap (IndexSeqMap f) i = f i lookupSeqMap (UpdateSeqMap m f) i = case Map.lookup i m of Just x -> x Nothing -> f i -type SeqValMap = SeqMap Bool BV+type SeqValMap = SeqMap Bool BV Integer -instance NFData (SeqMap b w) where+instance NFData (SeqMap b w i) where rnf x = seq x () -- | Generate a finite sequence map from a list of values-finiteSeqMap :: [Eval (GenValue b w)] -> SeqMap b w+finiteSeqMap :: [Eval (GenValue b w i)] -> SeqMap b w i 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 :: [Eval (GenValue b w i)] -> Eval (SeqMap b w i) 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 :: (Integral n) => n -> SeqMap b w i -> [Eval (GenValue b w i)] 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 :: SeqMap b w i -> [Eval (GenValue b w i)] 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+ -> SeqMap b w i+ -> SeqMap b w i reverseSeqMap n vals = IndexSeqMap $ \i -> lookupSeqMap vals (n - 1 - i) -updateSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w) -> SeqMap b w+updateSeqMap :: SeqMap b w i -> Integer -> Eval (GenValue b w i) -> SeqMap b w i updateSeqMap (UpdateSeqMap m sm) i x = UpdateSeqMap (Map.insert i x m) sm updateSeqMap (IndexSeqMap f) i x = UpdateSeqMap (Map.singleton i x) f +-- | Concatenate the first `n` values of the first sequence map onto the+-- beginning of the second sequence map.+concatSeqMap :: Integer -> SeqMap b w i -> SeqMap b w i -> SeqMap b w i+concatSeqMap n x y =+ IndexSeqMap $ \i ->+ if i < n+ then lookupSeqMap x i+ else lookupSeqMap y (i-n)+ -- | 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 :: Integer -> SeqMap b w i -> (SeqMap b w i, SeqMap b w i) splitSeqMap n xs = (hd,tl) where hd = xs tl = IndexSeqMap $ \i -> lookupSeqMap xs (i+n) +-- | Drop the first @n@ elements of the given @SeqMap@.+dropSeqMap :: Integer -> SeqMap b w i -> SeqMap b w i+dropSeqMap 0 xs = xs+dropSeqMap n xs = 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 :: SeqMap b w i -> Eval (SeqMap b w i) memoMap x = do cache <- io $ newIORef $ Map.empty return $ IndexSeqMap (memo cache)@@ -154,16 +168,16 @@ -- | 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 :: (GenValue b w i -> GenValue b w i -> Eval (GenValue b w i))+ -> SeqMap b w i+ -> SeqMap b w i+ -> Eval (SeqMap b w i) 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 :: (GenValue b w i -> Eval (GenValue b w i))+ -> SeqMap b w i -> Eval (SeqMap b w i) mapSeqMap f x = memoMap (IndexSeqMap $ \i -> f =<< lookupSeqMap x i) @@ -176,26 +190,87 @@ -- 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.+data WordValue b w i+ = WordVal !w -- ^ Packed word representation for bit sequences.+ | BitsVal !(Seq.Seq (Eval b)) -- ^ Sequence of thunks representing bits.+ | LargeBitsVal !Integer !(SeqMap b w i ) -- ^ A large bitvector sequence, represented as a+ -- @SeqMap@ of bits. deriving (Generic, NFData) +-- | An arbitrarily-chosen number of elements where we switch from a dense+-- sequence representation of bit-level words to @SeqMap@ representation.+largeBitSize :: Integer+largeBitSize = 1 `shiftL` 16+ -- | 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)+asWordVal :: BitWord b w i => WordValue b w i -> Eval w+asWordVal (WordVal w) = return w+asWordVal (BitsVal bs) = packWord <$> sequence (Fold.toList bs)+asWordVal (LargeBitsVal n xs) = packWord <$> traverse (fromBit =<<) (enumerateSeqMap n xs) -- | 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+asBitsMap :: BitWord b w i => WordValue b w i -> SeqMap b w i+asBitsMap (WordVal w) = IndexSeqMap $ \i -> ready $ VBit $ wordBit w i+asBitsMap (BitsVal bs) = IndexSeqMap $ \i -> VBit <$> join (checkedSeqIndex bs i)+asBitsMap (LargeBitsVal _ xs) = xs +-- | Turn a word value into a sequence of bits, forcing each bit.+-- The sequence is returned in big-endian order.+enumerateWordValue :: BitWord b w i => WordValue b w i -> Eval [b]+enumerateWordValue (WordVal w) = return $ unpackWord w+enumerateWordValue (BitsVal bs) = sequence (Fold.toList bs)+enumerateWordValue (LargeBitsVal n xs) = traverse (fromBit =<<) (enumerateSeqMap n xs)++-- | Turn a word value into a sequence of bits, forcing each bit.+-- The sequence is returned in reverse of the usual order, which is little-endian order.+enumerateWordValueRev :: BitWord b w i => WordValue b w i -> Eval [b]+enumerateWordValueRev (WordVal w) = return $ reverse $ unpackWord w+enumerateWordValueRev (BitsVal bs) = sequence (Fold.toList $ Seq.reverse bs)+enumerateWordValueRev (LargeBitsVal n xs) = traverse (fromBit =<<) (enumerateSeqMap n (reverseSeqMap n xs))++-- | Compute the size of a word value+wordValueSize :: BitWord b w i => WordValue b w i -> Integer+wordValueSize (WordVal w) = wordLen w+wordValueSize (BitsVal bs) = toInteger $ Seq.length bs+wordValueSize (LargeBitsVal n _) = n++checkedSeqIndex :: Seq.Seq a -> Integer -> Eval a+checkedSeqIndex xs i =+ case Seq.viewl (Seq.drop (fromInteger i) xs) of+ x Seq.:< _ -> return x+ Seq.EmptyL -> invalidIndex i++checkedIndex :: [a] -> Integer -> Eval a+checkedIndex xs i =+ case genericDrop i xs of+ (x:_) -> return x+ _ -> invalidIndex i+ -- | 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)+indexWordValue :: BitWord b w i => WordValue b w i -> Integer -> Eval b+indexWordValue (WordVal w) idx+ | idx < wordLen w = return $ wordBit w idx+ | otherwise = invalidIndex idx+indexWordValue (BitsVal bs) idx = join (checkedSeqIndex bs idx)+indexWordValue (LargeBitsVal n xs) idx+ | idx < n = fromBit =<< lookupSeqMap xs idx+ | otherwise = invalidIndex idx +-- | Produce a new @WordValue@ from the one given by updating the @i@th bit with the+-- given bit value.+updateWordValue :: BitWord b w i => WordValue b w i -> Integer -> Eval b -> Eval (WordValue b w i)+updateWordValue (WordVal w) idx (Ready b)+ | idx < wordLen w = return $ WordVal $ wordUpdate w idx b+ | otherwise = invalidIndex idx+updateWordValue (WordVal w) idx b+ | idx < wordLen w = return $ BitsVal $ Seq.update (fromInteger idx) b $ Seq.fromList $ map ready $ unpackWord w+ | otherwise = invalidIndex idx+updateWordValue (BitsVal bs) idx b+ | idx < toInteger (Seq.length bs) = return $ BitsVal $ Seq.update (fromInteger idx) b bs+ | otherwise = invalidIndex idx+updateWordValue (LargeBitsVal n xs) idx b+ | idx < n = return $ LargeBitsVal n $ updateSeqMap xs idx (VBit <$> b)+ | otherwise = invalidIndex idx -- | Generic value type, parameterized by bit and word types. --@@ -203,32 +278,35 @@ -- `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, 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 #)+data GenValue b w i+ = VRecord ![(Ident, Eval (GenValue b w i))] -- ^ @ { .. } @+ | VTuple ![Eval (GenValue b w i)] -- ^ @ ( .. ) @+ | VBit !b -- ^ @ Bit @+ | VInteger !i -- ^ @ Integer @ or @ Z n @+ | VSeq !Integer !(SeqMap b w i) -- ^ @ [n]a @+ -- Invariant: VSeq is never a sequence of bits+ | VWord !Integer !(Eval (WordValue b w i)) -- ^ @ [n]Bit @+ | VStream !(SeqMap b w i) -- ^ @ [inf]a @+ | VFun (Eval (GenValue b w i) -> Eval (GenValue b w i)) -- ^ functions+ | VPoly (TValue -> Eval (GenValue b w i)) -- ^ polymorphic values (kind *)+ | VNumPoly (Nat' -> Eval (GenValue b w i)) -- ^ polymorphic values (kind #) deriving (Generic, NFData) -- | Force the evaluation of a word value-forceWordValue :: WordValue b w -> Eval ()+forceWordValue :: WordValue b w i -> Eval () forceWordValue (WordVal _w) = return () forceWordValue (BitsVal bs) = mapM_ (\b -> const () <$> b) bs+forceWordValue (LargeBitsVal n xs) = mapM_ (\x -> const () <$> x) (enumerateSeqMap n xs) -- | Force the evaluation of a value-forceValue :: GenValue b w -> Eval ()+forceValue :: GenValue b w i -> 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 ()+ VInteger _i -> return () VWord _ wv -> forceWordValue =<< wv VStream _ -> return () VFun _ -> return ()@@ -236,11 +314,12 @@ VNumPoly _ -> return () -instance (Show b, Show w) => Show (GenValue b w) where+instance (Show b, Show w, Show i) => Show (GenValue b w i) where show v = case v of VRecord fs -> "record:" ++ show (map fst fs) VTuple xs -> "tuple:" ++ show (length xs) VBit b -> show b+ VInteger i -> show i VSeq n _ -> "seq:" ++ show n VWord n _ -> "word:" ++ show n VStream _ -> "stream"@@ -248,17 +327,11 @@ VPoly _ -> "poly" VNumPoly _ -> "numpoly" -type Value = GenValue Bool BV+type Value = GenValue Bool BV Integer -- Pretty Printing ------------------------------------------------------------- -data PPOpts = PPOpts- { useAscii :: Bool- , useBase :: Int- , useInfLength :: Int- }- defaultPPOpts :: PPOpts defaultPPOpts = PPOpts { useAscii = False, useBase = 10, useInfLength = 5 } @@ -268,14 +341,14 @@ 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+ppValue :: forall b w i+ . BitWord b w i => PPOpts- -> GenValue b w+ -> GenValue b w i -> Eval Doc ppValue opts = loop where- loop :: GenValue b w -> Eval Doc+ loop :: GenValue b w i -> Eval Doc loop val = case val of VRecord fs -> do fs' <- traverse (atSnd (>>=loop)) $ fs return $ braces (sep (punctuate comma (map ppField fs')))@@ -284,6 +357,7 @@ VTuple vals -> do vals' <- traverse (>>=loop) vals return $ parens (sep (punctuate comma vals')) VBit b -> return $ ppBit b+ VInteger i -> return $ ppInteger opts i VSeq sz vals -> ppWordSeq sz vals VWord _ wv -> ppWordVal =<< wv VStream vals -> do vals' <- traverse (>>=loop) $ enumerateSeqMap (useInfLength opts) vals@@ -295,10 +369,10 @@ VPoly _ -> return $ text "<polymorphic value>" VNumPoly _ -> return $ text "<polymorphic value>" - ppWordVal :: WordValue b w -> Eval Doc+ ppWordVal :: WordValue b w i -> Eval Doc ppWordVal w = ppWord opts <$> asWordVal w - ppWordSeq :: Integer -> SeqMap b w -> Eval Doc+ ppWordSeq :: Integer -> SeqMap b w i -> Eval Doc ppWordSeq sz vals = do ws <- sequence (enumerateSeqMap sz vals) case ws of@@ -323,7 +397,7 @@ 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+ | otherwise = prefix <.> text value where base = useBase opts @@ -336,11 +410,11 @@ `divMod` bitsPerDigit prefix = case base of- 2 -> text "0b" <> padding 1- 8 -> text "0o" <> padding 3+ 2 -> text "0b" <.> padding 1+ 8 -> text "0o" <.> padding 3 10 -> empty- 16 -> text "0x" <> padding 4- _ -> text "0" <> char '<' <> int base <> char '>'+ 16 -> text "0x" <.> padding 4+ _ -> text "0" <.> char '<' <.> int base <.> char '>' value = showIntAtBase (toInteger base) (digits !!) i "" digits = "0123456789abcdefghijklmnopqrstuvwxyz"@@ -349,13 +423,16 @@ -- | 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+class BitWord b w i | b -> w, w -> i, i -> b where -- | Pretty-print an individual bit ppBit :: b -> Doc -- | Pretty-print a word value ppWord :: PPOpts -> w -> Doc + -- | Pretty-print an integer value+ ppInteger :: PPOpts -> i -> Doc+ -- | 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@@ -371,6 +448,22 @@ -> Integer -- ^ Value -> w + -- | Construct a literal integer value from the given integer.+ integerLit :: Integer -- ^ Value+ -> i++ -- | Extract the numbered bit from the word.+ --+ -- NOTE: this assumes that the sequence of bits is big-endian and finite, so the+ -- bit numbered 0 is the most significant bit.+ wordBit :: w -> Integer -> b++ -- | Update the numbered bit in the word.+ --+ -- NOTE: this assumes that the sequence of bits is big-endian and finite, so the+ -- bit numbered 0 is the most significant bit.+ wordUpdate :: w -> Integer -> b -> 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.@@ -398,7 +491,7 @@ -- 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+ -- way, the operation `extractWord n i w` is equivalent to -- first shifting `w` right by `i` bits, and then truncating to -- `n` bits. extractWord :: Integer -- ^ Number of bits to take@@ -421,19 +514,42 @@ -- multiplication are silently discarded. wordMult :: w -> w -> w + -- | Construct an integer value from the given packed word.+ wordToInt :: w -> i + -- | Addition of unbounded integers.+ intPlus :: i -> i -> i++ -- | Subtraction of unbounded integers.+ intMinus :: i -> i -> i++ -- | Multiplication of unbounded integers.+ intMult :: i -> i -> i++ -- | Addition of integers modulo n, for a concrete positive integer n.+ intModPlus :: Integer -> i -> i -> i++ -- | Subtraction of integers modulo n, for a concrete positive integer n.+ intModMinus :: Integer -> i -> i -> i++ -- | Multiplication of integers modulo n, for a concrete positive integer n.+ intModMult :: Integer -> i -> i -> i++ -- | Construct a packed word of the specified width from an integer value.+ wordFromInt :: Integer -> i -> w+ -- | This class defines additional operations necessary to define generic evaluation -- functions.-class BitWord b w => EvalPrims b w where+class BitWord b w i => EvalPrims b w i where -- | Eval prim binds primitive declarations to the primitive values that implement them.- evalPrim :: Decl -> GenValue b w+ evalPrim :: Decl -> GenValue b w i -- | 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)+ iteValue :: b -- ^ Test bit+ -> Eval (GenValue b w i) -- ^ 'then' value+ -> Eval (GenValue b w i) -- ^ 'else' value+ -> Eval (GenValue b w i) -- Concrete Big-endian Words ------------------------------------------------------------@@ -444,17 +560,25 @@ mask w i | w >= Arch.maxBigIntWidth = wordTooWide w | otherwise = i .&. ((1 `shiftL` fromInteger w) - 1) -instance BitWord Bool BV where+instance BitWord Bool BV Integer where wordLen (BV w _) = w wordAsChar (BV _ x) = Just $ integerToChar x + wordBit (BV w x) idx = testBit x (fromInteger (w - 1 - idx))++ wordUpdate (BV w x) idx True = BV w (setBit x (fromInteger (w - 1 - idx)))+ wordUpdate (BV w x) idx False = BV w (clearBit x (fromInteger (w - 1 - idx)))+ ppBit b | b = text "True" | otherwise = text "False" ppWord = ppBV + ppInteger _opts i = integer i+ bitLit b = b wordLit = mkBv+ integerLit i = i packWord bits = BV (toInteger w) a where@@ -489,35 +613,45 @@ | i == j = mkBv i (x*y) | otherwise = panic "Attempt to multiply words of different sizes: wordMult" [] + intPlus x y = x + y+ intMinus x y = x - y+ intMult x y = x * y + intModPlus m x y = (x + y) `mod` m+ intModMinus m x y = (x - y) `mod` m+ intModMult m x y = (x * y) `mod` m++ wordToInt (BV _ x) = x+ wordFromInt w x = mkBv w x+ -- Value Constructors ---------------------------------------------------------- -- | Create a packed word of n bits.-word :: BitWord b w => Integer -> Integer -> GenValue b w+word :: BitWord b w i => Integer -> Integer -> GenValue b w i word n i = VWord n $ ready $ WordVal $ wordLit n i -lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w+lam :: (Eval (GenValue b w i) -> Eval (GenValue b w i)) -> GenValue b w i lam = VFun -- | Functions that assume word inputs-wlam :: BitWord b w => (w -> Eval (GenValue b w)) -> GenValue b w+wlam :: BitWord b w i => (w -> Eval (GenValue b w i)) -> GenValue b w i wlam f = VFun (\x -> x >>= fromVWord "wlam" >>= f) -- | A type lambda that expects a @Type@.-tlam :: (TValue -> GenValue b w) -> GenValue b w+tlam :: (TValue -> GenValue b w i) -> GenValue b w i tlam f = VPoly (return . f) -- | A type lambda that expects a @Type@ of kind #.-nlam :: (Nat' -> GenValue b w) -> GenValue b w+nlam :: (Nat' -> GenValue b w i) -> GenValue b w i nlam f = VNumPoly (return . f) -- | Generate a stream.-toStream :: [GenValue b w] -> Eval (GenValue b w)+toStream :: [GenValue b w i] -> Eval (GenValue b w i) toStream vs = VStream <$> infiniteSeqMap (map ready vs) -toFinSeq :: BitWord b w- => Integer -> TValue -> [GenValue b w] -> GenValue b w+toFinSeq :: BitWord b w i+ => Integer -> TValue -> [GenValue b w i] -> GenValue b w i toFinSeq len elty vs | isTBit elty = VWord len $ ready $ WordVal $ packWord $ map fromVBit vs | otherwise = VSeq len $ finiteSeqMap (map ready vs)@@ -528,8 +662,8 @@ -- | 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 :: BitWord b w- => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w)+toSeq :: BitWord b w i+ => Nat' -> TValue -> [GenValue b w i] -> Eval (GenValue b w i) toSeq len elty vals = case len of Nat n -> return $ toFinSeq n elty vals Inf -> toStream vals@@ -537,7 +671,7 @@ -- | 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 :: Nat' -> TValue -> SeqMap b w i -> GenValue b w i mkSeq len elty vals = case len of Nat n | isTBit elty -> VWord n $ return $ BitsVal $ Seq.fromFunction (fromInteger n) $ \i ->@@ -549,19 +683,25 @@ -- Value Destructors ----------------------------------------------------------- -- | Extract a bit value.-fromVBit :: GenValue b w -> b+fromVBit :: GenValue b w i -> b fromVBit val = case val of 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 an integer value.+fromVInteger :: GenValue b w i -> i+fromVInteger val = case val of+ VInteger i -> i+ _ -> evalPanic "fromVInteger" ["not an Integer"] +-- | Extract a finite sequence value.+fromVSeq :: GenValue b w i -> SeqMap b w i+fromVSeq val = case val of+ VSeq _ vs -> vs+ _ -> evalPanic "fromVSeq" ["not a sequence"]+ -- | Extract a sequence.-fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)+fromSeq :: forall b w i. BitWord b w i => String -> GenValue b w i -> Eval (SeqMap b w i) fromSeq msg val = case val of VSeq _ vs -> return vs VStream vs -> return vs@@ -572,16 +712,20 @@ 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)+fromBit :: GenValue b w i -> Eval b+fromBit (VBit b) = return b+fromBit _ = evalPanic "fromBit" ["Not a bit value"]++fromWordVal :: String -> GenValue b w i -> Eval (WordValue b w i) fromWordVal _msg (VWord _ wval) = wval fromWordVal msg _ = evalPanic "fromWordVal" ["not a word value", msg] -- | Extract a packed word.-fromVWord :: BitWord b w => String -> GenValue b w -> Eval w-fromVWord _msg (VWord _ wval) = wval >>= asWordVal +fromVWord :: BitWord b w i => String -> GenValue b w i -> Eval w+fromVWord _msg (VWord _ wval) = wval >>= asWordVal fromVWord msg _ = evalPanic "fromVWord" ["not a word", msg] -vWordLen :: BitWord b w => GenValue b w -> Maybe Integer+vWordLen :: BitWord b w i => GenValue b w i -> Maybe Integer vWordLen val = case val of VWord n _wv -> Just n _ -> Nothing@@ -589,7 +733,7 @@ -- | 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 :: BitWord b w i => [Eval (GenValue b w i)] -> Maybe w tryFromBits = go id where go f [] = Just (packWord (f []))@@ -601,37 +745,37 @@ fromWord msg val = bvVal <$> fromVWord msg val -- | Extract a function from a value.-fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w))+fromVFun :: GenValue b w i -> (Eval (GenValue b w i) -> Eval (GenValue b w i)) 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 -> Eval (GenValue b w))+fromVPoly :: GenValue b w i -> (TValue -> Eval (GenValue b w i)) 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' -> Eval (GenValue b w))+fromVNumPoly :: GenValue b w i -> (Nat' -> Eval (GenValue b w i)) fromVNumPoly val = case val of VNumPoly f -> f _ -> evalPanic "fromVNumPoly" ["not a polymorphic value"] -- | Extract a tuple from a value.-fromVTuple :: GenValue b w -> [Eval (GenValue b w)]+fromVTuple :: GenValue b w i -> [Eval (GenValue b w i)] fromVTuple val = case val of VTuple vs -> vs _ -> evalPanic "fromVTuple" ["not a tuple"] -- | Extract a record from a value.-fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))]+fromVRecord :: GenValue b w i -> [(Ident, Eval (GenValue b w i))] fromVRecord val = case val of VRecord fs -> fs _ -> evalPanic "fromVRecord" ["not a record"] -- | Lookup a field in a record.-lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w)+lookupRecord :: Ident -> GenValue b w i -> Eval (GenValue b w i) lookupRecord f rec = case lookup f (fromVRecord rec) of Just val -> val Nothing -> evalPanic "lookupRecord" ["malformed record"]@@ -649,7 +793,7 @@ prim n = ePrim prims (mkIdent (T.pack n)) go :: Type -> Value -> ChoiceT Eval Expr- go ty val = case (ty, val) of+ go ty val = case (tNoUser ty, val) of (TRec tfs, VRecord vfs) -> do let fns = map fst vfs guard (map fst tfs == fns)@@ -660,6 +804,10 @@ 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 TCInteger) [], VInteger i) ->+ return $ ETApp (ETApp (prim "number") (tNum i)) ty+ (TCon (TC TCIntMod) [_n], VInteger i) ->+ return $ ETApp (ETApp (prim "number") (tNum i)) ty (TCon (TC TCSeq) [a,b], VSeq 0 _) -> do guard (a == tZero) return $ EList [] b@@ -670,7 +818,7 @@ (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)+ return $ ETApp (ETApp (prim "number") (tNum v)) ty (_, VStream _) -> fail "cannot construct infinite expressions" (_, VFun _) -> fail "cannot convert function values to expressions" (_, VPoly _) -> fail "cannot convert polymorphic values to expressions"
+ src/Cryptol/IR/FreeVars.hs view
@@ -0,0 +1,182 @@+module Cryptol.IR.FreeVars+ ( FreeVars(..)+ , Deps(..)+ , Defs(..)+ , moduleDeps, transDeps+ ) where++import Data.Set ( Set )+import qualified Data.Set as Set+import Data.Map ( Map )+import qualified Data.Map as Map+import Data.Semigroup (Semigroup(..))++import Cryptol.TypeCheck.AST++data Deps = Deps { valDeps :: Set Name+ -- ^ Undefined value names++ , tyDeps :: Set Name+ -- ^ Undefined type names (from newtype)++ , tyParams :: Set TParam+ -- ^ Undefined type params (e.d. mod params)+ } deriving Eq++instance Semigroup Deps where+ d1 <> d2 = mconcat [d1,d2]++instance Monoid Deps where+ mempty = Deps { valDeps = Set.empty+ , tyDeps = Set.empty+ , tyParams = Set.empty+ }++ mappend d1 d2 = d1 <> d2++ mconcat ds = Deps { valDeps = Set.unions (map valDeps ds)+ , tyDeps = Set.unions (map tyDeps ds)+ , tyParams = Set.unions (map tyParams ds)+ }++rmTParam :: TParam -> Deps -> Deps+rmTParam p x = x { tyParams = Set.delete p (tyParams x) }++rmVal :: Name -> Deps -> Deps+rmVal p x = x { valDeps = Set.delete p (valDeps x) }++rmVals :: Set Name -> Deps -> Deps+rmVals p x = x { valDeps = Set.difference (valDeps x) p }+++-- | Compute the transitive closure of the given dependencies.+transDeps :: Map Name Deps -> Map Name Deps+transDeps mp0 = fst+ $ head+ $ dropWhile (uncurry (/=))+ $ zip steps (tail steps)+ where+ step1 mp d = mconcat [ Map.findWithDefault+ mempty { valDeps = Set.singleton x }+ x mp | x <- Set.toList (valDeps d) ]+ step mp = fmap (step1 mp) mp++ steps = iterate step mp0++-- | Dependencies of top-level declarations in a module.+-- These are dependencies on module parameters or things+-- defined outside the module.+moduleDeps :: Module -> Map Name Deps+moduleDeps = transDeps . Map.unions . map fromDG . mDecls+ where+ fromDG dg = let vs = freeVars dg+ in Map.fromList [ (x,vs) | x <- Set.toList (defs dg) ]++class FreeVars e where+ freeVars :: e -> Deps+++instance FreeVars e => FreeVars [e] where+ freeVars = mconcat . map freeVars+++instance FreeVars DeclGroup where+ freeVars dg = case dg of+ NonRecursive d -> freeVars d+ Recursive ds -> rmVals (defs ds) (freeVars ds)+++instance FreeVars Decl where+ freeVars d = freeVars (dDefinition d) <> freeVars (dSignature d)+++instance FreeVars DeclDef where+ freeVars d = case d of+ DPrim -> mempty+ DExpr e -> freeVars e+++instance FreeVars Expr where+ freeVars expr =+ case expr of+ EList es t -> freeVars es <> freeVars t+ ETuple es -> freeVars es+ ERec fs -> freeVars (map snd fs)+ ESel e _ -> freeVars e+ EIf e1 e2 e3 -> freeVars [e1,e2,e3]+ EComp t1 t2 e mss -> freeVars [t1,t2] <> rmVals (defs mss) (freeVars e)+ <> mconcat (map fvsArm mss)+ where+ fvsArm = foldr mat mempty+ mat x rest = freeVars x <> rmVals (defs x) rest++ EVar x -> mempty { valDeps = Set.singleton x }+ ETAbs a e -> rmTParam a (freeVars e)+ ETApp e t -> freeVars e <> freeVars t+ EApp e1 e2 -> freeVars [e1,e2]+ EAbs x t e -> freeVars t <> rmVal x (freeVars e)+ EProofAbs p e -> freeVars p <> freeVars e+ EProofApp e -> freeVars e+ EWhere e ds -> freeVars ds <> rmVals (defs ds) (freeVars e)+++instance FreeVars Match where+ freeVars m = case m of+ From _ t1 t2 e -> freeVars t1 <> freeVars t2 <> freeVars e+ Let d -> freeVars d++++instance FreeVars Schema where+ freeVars s = foldr rmTParam (freeVars (sProps s) <> freeVars (sType s))+ (sVars s)++instance FreeVars Type where+ freeVars ty =+ case ty of+ TCon tc ts -> freeVars tc <> freeVars ts+ TVar tv -> freeVars tv++ TUser _ _ t -> freeVars t+ TRec fs -> freeVars (map snd fs)+++instance FreeVars TVar where+ freeVars tv = case tv of+ TVBound p -> mempty { tyParams = Set.singleton p }+ _ -> mempty++instance FreeVars TCon where+ freeVars tc =+ case tc of+ TC (TCNewtype (UserTC n _)) -> mempty { tyDeps = Set.singleton n }+ _ -> mempty++instance FreeVars Newtype where+ freeVars nt = foldr rmTParam base (ntParams nt)+ where base = freeVars (ntConstraints nt) <> freeVars (map snd (ntFields nt))+++--------------------------------------------------------------------------------++class Defs d where+ defs :: d -> Set Name++instance Defs a => Defs [a] where+ defs = Set.unions . map defs++instance Defs DeclGroup where+ defs dg = case dg of+ Recursive ds -> defs ds+ NonRecursive d -> defs d++instance Defs Decl where+ defs d = Set.singleton (dName d)++instance Defs Match where+ defs m = case m of+ From x _ _ _ -> Set.singleton x+ Let d -> defs d+++
src/Cryptol/ModuleSystem.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -16,7 +16,7 @@ , ModuleCmd, ModuleRes , findModule , loadModuleByPath- , loadModule+ , loadModuleByName , checkExpr , evalExpr , checkDecls@@ -28,10 +28,11 @@ , renameType -- * Interfaces- , Iface(..), IfaceDecls(..), genIface+ , Iface(..), IfaceParams(..), IfaceDecls(..), genIface , IfaceTySyn, IfaceDecl(..) ) where +import qualified Cryptol.Eval as E import qualified Cryptol.Eval.Value as E import Cryptol.ModuleSystem.Env import Cryptol.ModuleSystem.Interface@@ -48,7 +49,7 @@ -- Public Interface ------------------------------------------------------------ -type ModuleCmd a = ModuleEnv -> IO (ModuleRes a)+type ModuleCmd a = (E.EvalOpts,ModuleEnv) -> IO (ModuleRes a) type ModuleRes a = (Either ModuleError (a,ModuleEnv), [ModuleWarning]) @@ -60,25 +61,20 @@ findModule n env = runModuleM env (Base.findModule n) -- | Load the module contained in the given file.-loadModuleByPath :: FilePath -> ModuleCmd T.Module-loadModuleByPath path env = runModuleM (resetModuleEnv env) $ do- -- unload the module if it already exists- unloadModule path-+loadModuleByPath :: FilePath -> ModuleCmd (FilePath,T.Module)+loadModuleByPath path (evo,env) = runModuleM (evo,resetModuleEnv env) $ do+ unloadModule ((path ==) . lmFilePath) m <- Base.loadModuleByPath path setFocusedModule (T.mName m)- return m+ return (path,m) -- | Load the given parsed module.-loadModule :: FilePath -> P.Module PName -> ModuleCmd T.Module-loadModule path m env = runModuleM env $ do- -- unload the module if it already exists- unloadModule path-- let n = P.thing (P.mName m)- m' <- loadingModule n (Base.loadModule path m)+loadModuleByName :: P.ModName -> ModuleCmd (FilePath,T.Module)+loadModuleByName n env = runModuleM env $ do+ unloadModule ((n ==) . lmName)+ (path,m') <- Base.loadModuleFrom (FromModule n) setFocusedModule (T.mName m')- return m'+ return (path,m') -- Extended Environments -------------------------------------------------------
src/Cryptol/ModuleSystem/Base.hs view
@@ -1,10 +1,13 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Base -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable+--+-- This is the main driver---it provides entry points for the+-- various passes. {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE FlexibleContexts #-}@@ -15,7 +18,8 @@ import Cryptol.ModuleSystem.Interface import Cryptol.ModuleSystem.Monad import Cryptol.ModuleSystem.Name (Name,liftSupply,PrimMap)-import Cryptol.ModuleSystem.Env (lookupModule, LoadedModule(..)+import Cryptol.ModuleSystem.Env (lookupModule+ , LoadedModule(..) , meCoreLint, CoreLint(..)) import qualified Cryptol.Eval as E import qualified Cryptol.Eval.Value as E@@ -32,23 +36,25 @@ 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, preludeExtrasName, interactiveName,unpackModName)+import Cryptol.Transform.AddModParams (addModParams)+import Cryptol.Utils.Ident (preludeName, interactiveName+ , modNameChunks, notParamInstModName+ , isParamInstModName ) import Cryptol.Utils.PP (pretty) import Cryptol.Utils.Panic (panic)+import Cryptol.Utils.Logger(logPutStrLn, logPrint) -import Cryptol.Prelude (writePreludeContents, writePreludeExtrasContents)+import Cryptol.Prelude (writePreludeContents) import Cryptol.Transform.MonoValues (rewModule) import Control.DeepSeq import qualified Control.Exception as X-import Control.Monad (unless)-import Data.Function (on)-import Data.List (nubBy)+import Control.Monad (unless,when) import Data.Maybe (fromMaybe) import Data.Monoid ((<>))-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy.IO as T+import Data.Text(Text)+import qualified Data.Text.IO as T import System.Directory (doesFileExist, canonicalizePath) import System.FilePath ( addExtension , isAbsolute@@ -136,53 +142,59 @@ path' <- io $ canonicalizePath foundPath case lookupModule n env of -- loadModule will calculate the canonical path again- Nothing -> loadingModule n (loadModule foundPath pm)+ Nothing -> doLoadModule (FromModule n) foundPath pm Just 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 ()-loadImport li = do - let i = thing li- n = P.iModule i-- alreadyLoaded <- isLoaded n- unless alreadyLoaded $- do path <- findModule n- pm <- parseModule path- loadingImport li $ do-- -- make sure that this module is the one we expect- unless (n == thing (P.mName pm)) (moduleNameMismatch n (mName pm))-- _ <- loadModule path pm- return ()+-- | Load a module, unless it was previously loaded.+loadModuleFrom :: ImportSource -> ModuleM (FilePath,T.Module)+loadModuleFrom isrc =+ do let n = importedModule isrc+ mb <- getLoadedMaybe n+ case mb of+ Just m -> return (lmFilePath m, lmModule m)+ Nothing ->+ do path <- findModule n+ errorInFile path $+ do pm <- parseModule path+ m <- doLoadModule isrc path pm+ return (path,m) -- | Load dependencies, typecheck, and add to the eval environment.-loadModule :: FilePath -> P.Module PName -> ModuleM T.Module-loadModule path pm = do+doLoadModule :: ImportSource ->+ FilePath ->+ P.Module PName ->+ ModuleM T.Module+doLoadModule isrc path pm0 =+ loading isrc $+ do let pm = addPrelude pm0+ loadDeps pm - let pm' = addPrelude pm- loadDeps pm'+ withLogger logPutStrLn+ ("Loading module " ++ pretty (P.thing (P.mName pm)))+ tcm <- optionalInstantiate =<< checkModule isrc path pm - -- XXX make it possible to configure output- io (putStrLn ("Loading module " ++ pretty (P.thing (P.mName pm'))))+ -- extend the eval env, unless a functor.+ unless (T.isParametrizedModule tcm) $ modifyEvalEnv (E.moduleEnv tcm)+ canonicalPath <- io (canonicalizePath path)+ loadedModule path canonicalPath tcm - tcm <- checkModule path pm'+ return tcm+ where+ optionalInstantiate tcm+ | isParamInstModName (importedModule isrc) && T.isParametrizedModule tcm =+ case addModParams tcm of+ Right tcm1 -> return tcm1+ Left xs -> failedToParameterizeModDefs (T.mName tcm) xs+ | otherwise = return tcm - -- extend the eval env- modifyEvalEnv (E.moduleEnv tcm) - canonicalPath <- io (canonicalizePath path) - loadedModule path canonicalPath tcm - return tcm - -- | Rewrite an import declaration to be of the form: -- -- > import foo as foo [ [hiding] (a,b,c) ]@@ -201,7 +213,7 @@ importIfaces is = mconcat `fmap` mapM importIface is moduleFile :: ModName -> String -> FilePath-moduleFile n = addExtension (joinPath (unpackModName n))+moduleFile n = addExtension (joinPath (modNameChunks n)) -- | Discover a module. findModule :: ModName -> ModuleM FilePath@@ -220,7 +232,6 @@ handleNotFound = case n of m | m == preludeName -> io writePreludeContents- m | m == preludeExtrasName -> io writePreludeExtrasContents _ -> moduleNotFound n =<< getSearchPath -- generate all possible search paths@@ -266,31 +277,34 @@ -- | Load the dependencies of a module into the environment. loadDeps :: P.Module name -> ModuleM ()-loadDeps m- | null needed = return ()- | otherwise = mapM_ load needed+loadDeps m =+ do mapM_ loadI (P.mImports m)+ mapM_ loadF (P.mInstance m) where- needed = nubBy ((==) `on` P.iModule . thing) (P.mImports m)- load mn = loadImport mn+ loadI i = do (_,m1) <- loadModuleFrom (FromImport i)+ when (T.isParametrizedModule m1) $ importParamModule $ T.mName m1+ loadF f = do _ <- loadModuleFrom (FromModuleInstance f)+ return () + -- Type Checking --------------------------------------------------------------- -- | Load the local environment, which consists of the environment for the -- currently opened module, shadowed by the dynamic environment.-getLocalEnv :: ModuleM (IfaceDecls,R.NamingEnv)+getLocalEnv :: ModuleM (IfaceParams,IfaceDecls,R.NamingEnv) getLocalEnv =- do (decls,fNames,_) <- getFocusedEnv+ do (params,decls,fNames,_) <- getFocusedEnv denv <- getDynEnv let dynDecls = deIfaceDecls denv- return (dynDecls `mappend` decls, deNames denv `R.shadowing` fNames)+ return (params,dynDecls `mappend` decls, deNames denv `R.shadowing` fNames) -- | Typecheck a single expression, yielding a renamed parsed expression, -- typechecked core expression, and a type schema. checkExpr :: P.Expr PName -> ModuleM (P.Expr Name,T.Expr,T.Schema) checkExpr e = do - (decls,names) <- getLocalEnv+ (params,decls,names) <- getLocalEnv -- run NoPat npe <- noPat e@@ -302,7 +316,7 @@ prims <- getPrimMap let act = TCAction { tcAction = T.tcExpr, tcLinter = exprLinter , tcPrims = prims }- (te,s) <- typecheck act re decls+ (te,s) <- typecheck act re params decls return (re,te,s) @@ -311,7 +325,7 @@ -- INVARIANT: This assumes that NoPat has already been run on the declarations. checkDecls :: [P.TopDecl PName] -> ModuleM (R.NamingEnv,[T.DeclGroup]) checkDecls ds = do- (decls,names) <- getLocalEnv+ (params,decls,names) <- getLocalEnv -- introduce names for the declarations before renaming them declsEnv <- liftSupply (R.namingEnv' (map (R.InModule interactiveName) ds))@@ -321,7 +335,7 @@ prims <- getPrimMap let act = TCAction { tcAction = T.tcDecls, tcLinter = declsLinter , tcPrims = prims }- ds' <- typecheck act rds decls+ ds' <- typecheck act rds params decls return (declsEnv,ds') -- | Generate the primitive map. If the prelude is currently being loaded, this@@ -335,9 +349,31 @@ Nothing -> panic "Cryptol.ModuleSystem.Base.getPrimMap" [ "Unable to find the prelude" ] --- | Typecheck a module.-checkModule :: FilePath -> P.Module PName -> ModuleM T.Module-checkModule path m = do+-- | Load a module, be it a normal module or a functor instantiation.+checkModule :: ImportSource -> FilePath -> P.Module PName -> ModuleM T.Module+checkModule isrc path m =+ case P.mInstance m of+ Nothing -> checkSingleModule T.tcModule isrc path m+ Just fmName -> do tf <- getLoaded (thing fmName)+ checkSingleModule (T.tcModuleInst tf) isrc path m+++-- | Typecheck a single module. If the module is an instantiation+-- of a functor, then this just type-checks the instantiating parameters.+-- See 'checkModule'+checkSingleModule ::+ Act (P.Module Name) T.Module {- ^ how to check -} ->+ ImportSource {- ^ why are we loading this -} ->+ FilePath {- path -} ->+ P.Module PName {- ^ module to check -} ->+ ModuleM T.Module+checkSingleModule how isrc path m = do++ -- check that the name of the module matches expectations+ let nm = importedModule isrc+ unless (notParamInstModName nm == thing (P.mName m))+ (moduleNameMismatch nm (mName m))+ -- remove includes first e <- io (removeIncludesModule path m) nim <- case e of@@ -358,11 +394,15 @@ else getPrimMap -- typecheck- let act = TCAction { tcAction = T.tcModule+ let act = TCAction { tcAction = how , tcLinter = moduleLinter (P.thing (P.mName m)) , tcPrims = prims }- tcm <- typecheck act scm tcEnv ++ tcm0 <- typecheck act scm noIfaceParams tcEnv++ let tcm = tcm0 -- fromMaybe tcm0 (addModParams tcm0)+ liftSupply (`rewModule` tcm) data TCLinter o = TCLinter@@ -375,17 +415,17 @@ exprLinter :: TCLinter (T.Expr, T.Schema) exprLinter = TCLinter { lintCheck = \(e',s) i ->- case TcSanity.tcExpr (T.inpVars i) e' of+ case TcSanity.tcExpr i e' of Left err -> Left err Right (s1,os) | TcSanity.same s s1 -> Right os- | otherwise -> Left (TcSanity.TypeMismatch s s1)+ | otherwise -> Left (TcSanity.TypeMismatch "exprLinter" s s1) , lintModule = Nothing } declsLinter :: TCLinter [ T.DeclGroup ] declsLinter = TCLinter- { lintCheck = \ds' i -> case TcSanity.tcDecls (T.inpVars i) ds' of+ { lintCheck = \ds' i -> case TcSanity.tcDecls i ds' of Left err -> Left err Right os -> Right os @@ -394,24 +434,27 @@ moduleLinter :: P.ModName -> TCLinter T.Module moduleLinter m = TCLinter- { lintCheck = \m' i -> case TcSanity.tcModule (T.inpVars i) m' of+ { lintCheck = \m' i -> case TcSanity.tcModule i m' of Left err -> Left err Right os -> Right os , lintModule = Just m } +type Act i o = i -> T.InferInput -> IO (T.InferOutput o) data TCAction i o = TCAction- { tcAction :: i -> T.InferInput -> IO (T.InferOutput o)+ { tcAction :: Act i o , tcLinter :: TCLinter o , tcPrims :: PrimMap } -typecheck :: (Show i, Show o, HasLoc i) => TCAction i o -> i -> IfaceDecls -> ModuleM o-typecheck act i env = do+typecheck ::+ (Show i, Show o, HasLoc i) => TCAction i o -> i ->+ IfaceParams -> IfaceDecls -> ModuleM o+typecheck act i params env = do let range = fromMaybe emptyRange (getLoc i)- input <- genInferInput range (tcPrims act) env+ input <- genInferInput range (tcPrims act) params env out <- io (tcAction act i input) case out of@@ -424,7 +467,9 @@ case meCoreLint menv of NoCoreLint -> return () CoreLint -> case lintCheck (tcLinter act) o input of- Right as -> io $ mapM_ (print . T.pp) as+ Right as ->+ let ppIt l = mapM_ (logPrint l . T.pp)+ in withLogger ppIt as Left err -> panic "Core lint failed:" [show err] return o @@ -433,8 +478,9 @@ typeCheckingFailed errs -- | Generate input for the typechecker.-genInferInput :: Range -> PrimMap -> IfaceDecls -> ModuleM T.InferInput-genInferInput r prims env = do+genInferInput :: Range -> PrimMap ->+ IfaceParams -> IfaceDecls -> ModuleM T.InferInput+genInferInput r prims params env = do seeds <- getNameSeeds monoBinds <- getMonoBinds cfg <- getSolverConfig@@ -453,23 +499,29 @@ , T.inpSearchPath = searchPath , T.inpSupply = supply , T.inpPrimNames = prims+ , T.inpParamTypes = ifParamTypes params+ , T.inpParamConstraints = ifParamConstraints params+ , T.inpParamFuns = ifParamFuns params } + -- Evaluation ------------------------------------------------------------------ evalExpr :: T.Expr -> ModuleM E.Value evalExpr e = do env <- getEvalEnv denv <- getDynEnv- io $ E.runEval $ (E.evalExpr (env <> deEnv denv) e)+ evopts <- getEvalOpts+ io $ E.runEval evopts $ (E.evalExpr (env <> deEnv denv) e) evalDecls :: [T.DeclGroup] -> ModuleM () evalDecls dgs = do env <- getEvalEnv denv <- getDynEnv+ evOpts <- getEvalOpts let env' = env <> deEnv denv- deEnv' <- io $ E.runEval $ E.evalDecls dgs env'+ deEnv' <- io $ E.runEval evOpts $ E.evalDecls dgs env' let denv' = denv { deDecls = deDecls denv ++ dgs , deEnv = deEnv' }
src/Cryptol/ModuleSystem/Env.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Env -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -26,12 +26,12 @@ import qualified Cryptol.TypeCheck.AST as T import Cryptol.Utils.PP (NameDisp) -import Control.Monad (guard)+import Control.Monad (guard,mplus) import qualified Control.Exception as X-import Data.Foldable (fold) import Data.Function (on) import qualified Data.Map as Map-import Data.Monoid ((<>))+import Data.Maybe(fromMaybe)+import Data.Semigroup import System.Directory (getAppUserDataDirectory, getCurrentDirectory) import System.Environment(getExecutablePath) import System.FilePath ((</>), normalise, joinPath, splitPath, takeDirectory)@@ -45,19 +45,50 @@ -- Module Environment ---------------------------------------------------------- +-- | This is the current state of the interpreter. data ModuleEnv = ModuleEnv { meLoadedModules :: LoadedModules+ -- ^ Information about all loaded modules. See 'LoadedModule'.+ -- Contains information such as the file where the module was loaded+ -- from, as well as the module's interface, used for type checking.+ , meNameSeeds :: T.NameSeeds+ -- ^ A source of new names for the type checker.++ , meSolverConfig :: T.SolverConfig+ -- ^ Configuration settings for the SMT solver used for type-checking.+ , meEvalEnv :: EvalEnv+ -- ^ The evaluation environment. Contains the values for all loaded+ -- modules, both public and private.++ , meCoreLint :: CoreLint+ -- ^ Should we run the linter to ensure sanity.++ , meMonoBinds :: !Bool+ -- ^ Are we assuming that local bindings are monomorphic.+ -- XXX: We should probably remove this flag, and set it to 'True'.+++ , meFocusedModule :: Maybe ModName+ -- ^ The "current" module. Used to decide how to print names, for example.+ , meSearchPath :: [FilePath]+ -- ^ Where we look for things.+ , meDynEnv :: DynamicEnv- , meMonoBinds :: !Bool- , meSolverConfig :: T.SolverConfig- , meCoreLint :: CoreLint+ -- ^ This contains additional definitions that were made at the command+ -- line, and so they don't reside in any module.+ , meSupply :: !Supply- } deriving (Generic, NFData)+ -- ^ Name source for the renamer + } deriving Generic++instance NFData ModuleEnv++-- | Should we run the linter? data CoreLint = NoCoreLint -- ^ Don't run core lint | CoreLint -- ^ Run core lint deriving (Generic, NFData)@@ -72,7 +103,7 @@ } initialModuleEnv :: IO ModuleEnv-initialModuleEnv = do+initialModuleEnv = do curDir <- getCurrentDirectory #ifndef RELOCATABLE dataDir <- getDataDir@@ -84,37 +115,40 @@ let handle :: X.IOException -> IO String handle _e = return "" userDir <- X.catch (getAppUserDataDirectory "cryptol") handle- return ModuleEnv- { meLoadedModules = mempty- , meNameSeeds = T.nameSeeds- , meEvalEnv = mempty- , meFocusedModule = Nothing- -- we search these in order, taking the first match- , meSearchPath = [ curDir- -- something like $HOME/.cryptol- , userDir+ let searchPath = [ curDir+ -- something like $HOME/.cryptol+ , userDir #if defined(mingw32_HOST_OS) || defined(__MINGW32__)- -- ../cryptol on win32- , instDir </> "cryptol"+ -- ../cryptol on win32+ , instDir </> "cryptol" #else- -- ../share/cryptol on others- , instDir </> "share" </> "cryptol"+ -- ../share/cryptol on others+ , instDir </> "share" </> "cryptol" #endif #ifndef RELOCATABLE- -- Cabal-defined data directory. Since this- -- is usually a global location like- -- /usr/local, search this one last in case- -- someone has multiple Cryptols- , dataDir+ -- Cabal-defined data directory. Since this+ -- is usually a global location like+ -- /usr/local, search this one last in case+ -- someone has multiple Cryptols+ , dataDir #endif- ]+ ]++ return ModuleEnv+ { meLoadedModules = mempty+ , meNameSeeds = T.nameSeeds+ , meEvalEnv = mempty+ , meFocusedModule = Nothing+ -- we search these in order, taking the first match+ , meSearchPath = searchPath , meDynEnv = mempty , meMonoBinds = True , meSolverConfig = T.SolverConfig { T.solverPath = "z3" , T.solverArgs = [ "-smt2", "-in" ] , T.solverVerbose = 0+ , T.solverPreludePath = searchPath } , meCoreLint = NoCoreLint , meSupply = emptySupply@@ -137,18 +171,28 @@ -- -- XXX This could really do with some better error handling, just returning -- mempty when one of the imports fails isn't really desirable.-focusedEnv :: ModuleEnv -> (IfaceDecls,R.NamingEnv,NameDisp)-focusedEnv me = fold $+--+-- XXX: This is not quite right. For example, it does not take into+-- account *how* things were imported in a module (e.g., qualified).+-- It would be simpler to simply store the naming environment that was+-- actually used when we renamed the module.+focusedEnv :: ModuleEnv -> (IfaceParams,IfaceDecls,R.NamingEnv,NameDisp)+focusedEnv me =+ fromMaybe (noIfaceParams, mempty, mempty, mempty) $ do fm <- meFocusedModule me lm <- lookupModule fm me deps <- mapM loadImport (T.mImports (lmModule lm)) let (ifaces,names) = unzip deps Iface { .. } = lmInterface lm localDecls = ifPublic `mappend` ifPrivate- localNames = R.unqualifiedEnv localDecls+ localNames = R.unqualifiedEnv localDecls `mappend`+ R.modParamsNamingEnv ifParams namingEnv = localNames `R.shadowing` mconcat names - return (mconcat (localDecls:ifaces), namingEnv, R.toNameDisp namingEnv)+ return ( ifParams+ , mconcat (localDecls:ifaces)+ , namingEnv+ , R.toNameDisp namingEnv) where loadImport imp = do lm <- lookupModule (iModule imp) me@@ -163,51 +207,66 @@ decls = deIfaceDecls (meDynEnv me) names = R.unqualifiedEnv decls --- | Retrieve all 'IfaceDecls' referenced by a module, as well as all of its--- public and private declarations, checking expressions-qualifiedEnv :: ModuleEnv -> IfaceDecls-qualifiedEnv me = fold $- do fm <- meFocusedModule me- lm <- lookupModule fm me- deps <- mapM loadImport (T.mImports (lmModule lm))- let Iface { .. } = lmInterface lm- return (mconcat (ifPublic : ifPrivate : deps))- where- loadImport imp =- do lm <- lookupModule (iModule imp) me- return (ifPublic (lmInterface lm)) - -- Loaded Modules -------------------------------------------------------------- -newtype LoadedModules = LoadedModules- { getLoadedModules :: [LoadedModule]+data LoadedModules = LoadedModules+ { lmLoadedModules :: [LoadedModule]+ -- ^ Invariants:+ -- 1) All the dependencies of any module `m` must precede `m` in the list.+ -- 2) Does not contain any parameterized modules.++ , lmLoadedParamModules :: [LoadedModule]+ -- ^ Loaded parameterized modules.+ } deriving (Show, Generic, NFData)--- ^ Invariant: All the dependencies of any module `m` must precede `m` in the list. +getLoadedModules :: LoadedModules -> [LoadedModule]+getLoadedModules x = lmLoadedParamModules x ++ lmLoadedModules x++instance Semigroup LoadedModules where+ l <> r = LoadedModules+ { lmLoadedModules = List.unionBy ((==) `on` lmName)+ (lmLoadedModules l) (lmLoadedModules r)+ , lmLoadedParamModules = lmLoadedParamModules l ++ lmLoadedParamModules r }+ instance Monoid LoadedModules where- mempty = LoadedModules []- mappend l r = LoadedModules- $ List.unionBy ((==) `on` lmName) (getLoadedModules l) (getLoadedModules r)+ mempty = LoadedModules { lmLoadedModules = []+ , lmLoadedParamModules = []+ }+ mappend l r = l <> r data LoadedModule = LoadedModule { lmName :: ModName- , 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+ , 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) +-- | Has this module been loaded already. isLoaded :: ModName -> LoadedModules -> Bool isLoaded mn lm = any ((mn ==) . lmName) (getLoadedModules lm) +-- | Try to find a previously loaded module lookupModule :: ModName -> ModuleEnv -> Maybe LoadedModule-lookupModule mn env = List.find ((mn ==) . lmName) (getLoadedModules (meLoadedModules env))+lookupModule mn me = search lmLoadedModules `mplus` search lmLoadedParamModules+ where+ search how = List.find ((mn ==) . lmName) (how (meLoadedModules me)) -addLoadedModule :: FilePath -> FilePath -> T.Module -> LoadedModules -> LoadedModules++-- | Add a freshly loaded module. If it was previously loaded, then+-- the new version is ignored.+addLoadedModule ::+ FilePath -> FilePath -> T.Module -> LoadedModules -> LoadedModules addLoadedModule path canonicalPath tm lm- | isLoaded (T.mName tm) lm = lm- | otherwise = LoadedModules (getLoadedModules lm ++ [loaded])+ | isLoaded (T.mName tm) lm = lm+ | T.isParametrizedModule tm = lm { lmLoadedParamModules = loaded :+ lmLoadedParamModules lm }+ | otherwise = lm { lmLoadedModules =+ lmLoadedModules lm ++ [loaded] } where loaded = LoadedModule { lmName = T.mName tm@@ -217,16 +276,15 @@ , lmModule = tm } -removeLoadedModule :: FilePath -> LoadedModules -> LoadedModules-removeLoadedModule path (LoadedModules ms) = LoadedModules (remove ms)- where+-- | Remove a previously loaded module.+removeLoadedModule :: (LoadedModule -> Bool) -> LoadedModules -> LoadedModules+removeLoadedModule rm lm =+ LoadedModules+ { lmLoadedModules = filter (not . rm) (lmLoadedModules lm)+ , lmLoadedParamModules = filter (not . rm) (lmLoadedParamModules lm)+ } - remove (lm:rest)- | lmFilePath lm == path = rest- | otherwise = lm : remove rest - remove [] = []- -- Dynamic Environments -------------------------------------------------------- -- | Extra information we need to carry around to dynamically extend@@ -240,17 +298,20 @@ , deEnv :: EvalEnv } deriving (Generic, NFData) +instance Semigroup DynamicEnv where+ de1 <> de2 = DEnv+ { deNames = deNames de1 <> deNames de2+ , deDecls = deDecls de1 <> deDecls de2+ , deEnv = deEnv de1 <> deEnv de2+ }+ instance Monoid DynamicEnv where mempty = DEnv { deNames = mempty , deDecls = mempty , deEnv = mempty }- mappend de1 de2 = DEnv- { deNames = deNames de1 <> deNames de2- , deDecls = deDecls de1 <> deDecls de2- , deEnv = deEnv de1 <> deEnv de2- }+ mappend de1 de2 = de1 <> de2 -- | Build 'IfaceDecls' that correspond to all of the bindings in the -- dynamic environment.
+ src/Cryptol/ModuleSystem/Exports.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE DeriveGeneric #-}+module Cryptol.ModuleSystem.Exports where++import Data.Set(Set)+import qualified Data.Set as Set+import Data.Foldable(fold)+import Data.Semigroup (Semigroup(..))+import Control.DeepSeq(NFData)+import GHC.Generics (Generic)++import Cryptol.Parser.AST+import Cryptol.Parser.Names++modExports :: Ord name => Module name -> ExportSpec name+modExports m = fold (concat [ exportedNames d | d <- mDecls m ])+ where+ names by td = [ td { tlValue = thing n } | n <- fst (by (tlValue td)) ]++ exportedNames (Decl td) = map exportBind (names namesD td)+ ++ map exportType (names tnamesD td)+ exportedNames (TDNewtype nt) = map exportType (names tnamesNT nt)+ exportedNames (Include {}) = []+ exportedNames (DParameterFun {}) = []+ exportedNames (DParameterType {}) = []+ exportedNames (DParameterConstraint {}) = []++++data ExportSpec name = ExportSpec { eTypes :: Set name+ , eBinds :: Set name+ } deriving (Show, Generic)++instance NFData name => NFData (ExportSpec name)++instance Ord name => Semigroup (ExportSpec name) where+ l <> r = ExportSpec { eTypes = eTypes l <> eTypes r+ , eBinds = eBinds l <> eBinds r+ }++instance Ord name => Monoid (ExportSpec name) where+ mempty = ExportSpec { eTypes = mempty, eBinds = mempty }+ mappend = (<>)++-- | Add a binding name to the export list, if it should be exported.+exportBind :: Ord name => TopLevel name -> ExportSpec name+exportBind n+ | tlExport n == Public = mempty { eBinds = Set.singleton (tlValue n) }+ | otherwise = mempty++-- | Add a type synonym name to the export list, if it should be exported.+exportType :: Ord name => TopLevel name -> ExportSpec name+exportType n+ | tlExport n == Public = mempty { eTypes = Set.singleton (tlValue n) }+ | otherwise = mempty++-- | Check to see if a binding is exported.+isExportedBind :: Ord name => name -> ExportSpec name -> Bool+isExportedBind n = Set.member n . eBinds++-- | Check to see if a type synonym is exported.+isExportedType :: Ord name => name -> ExportSpec name -> Bool+isExportedType n = Set.member n . eTypes+++
+ src/Cryptol/ModuleSystem/InstantiateModule.hs view
@@ -0,0 +1,292 @@+{-# Language FlexibleInstances, PatternGuards #-}+-- | Assumes that local names do not shadow top level names.+module Cryptol.ModuleSystem.InstantiateModule+ ( instantiateModule+ ) where++import Data.Set (Set)+import qualified Data.Set as Set+import Data.Map (Map)+import qualified Data.Map as Map+import MonadLib(ReaderT,runReaderT,ask)++import Cryptol.Parser.Position(Located(..))+import Cryptol.ModuleSystem.Name+import Cryptol.ModuleSystem.Exports(ExportSpec(..))+import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.Subst(listSubst, apSubst)+import Cryptol.Utils.Ident(ModName,modParamIdent)++{-+XXX: Should we simplify constraints in the instantiated modules?++If so, we also need to adjust the constraint parameters on terms appropriately,+especially when working with dictionaries.+-}+++-- | Convert a module instantiation into a partial module.+-- The resulting module is incomplete because it is missing the definitions+-- from the instantiation.+instantiateModule :: FreshM m =>+ Module {- ^ Parametrized module -} ->+ ModName {- ^ Name of the new module -} ->+ Map TParam Type {- ^ Type params -} ->+ Map Name Expr {- ^ Value parameters -} ->+ m ([Located Prop], Module)+ -- ^ Instantiated constraints, fresh module, new supply+instantiateModule func newName tpMap vpMap =+ runReaderT newName $+ do let oldVpNames = Map.keys vpMap+ newVpNames <- mapM freshParamName (Map.keys vpMap)+ let vpNames = Map.fromList (zip oldVpNames newVpNames)++ env <- computeEnv func tpMap vpNames++ let rnMp :: Inst a => (a -> Name) -> Map Name a -> Map Name a+ rnMp f m = Map.fromList [ (f x, x) | a <- Map.elems m+ , let x = inst env a ]++ renamedExports = inst env (mExports func)+ renamedTySyns = rnMp tsName (mTySyns func)+ renamedNewtypes = rnMp ntName (mNewtypes func)++ su = listSubst+ [ (TVBound tp, t) | (tp,t) <- Map.toList (tyParamMap env) ]++ goals = map (fmap (apSubst su)) (mParamConstraints func)+ -- Constraints to discharge about the type instances++ let renamedDecls = inst env (mDecls func)+ paramDecls = map (mkParamDecl su vpNames) (Map.toList vpMap)++ return ( goals+ , Module+ { mName = newName+ , mExports = renamedExports+ , mImports = mImports func+ , mTySyns = renamedTySyns+ , mNewtypes = renamedNewtypes+ , mParamTypes = Map.empty+ , mParamConstraints = []+ , mParamFuns = Map.empty+ , mDecls = paramDecls ++ renamedDecls+ } )++ where+ mkParamDecl su vpNames (x,e) =+ NonRecursive Decl+ { dName = Map.findWithDefault (error "OOPS") x vpNames+ , dSignature = apSubst su+ $ mvpType+ $ Map.findWithDefault (error "UUPS") x (mParamFuns func)+ , dDefinition = DExpr e+ , dPragmas = [] -- XXX: which if any pragmas?+ , dInfix = False -- XXX: get from parameter?+ , dFixity = Nothing -- XXX: get from parameter+ , dDoc = Nothing -- XXX: get from parametr(or instance?)+ }+++--------------------------------------------------------------------------------+-- Things that need to be renamed++class Defines t where+ defines :: t -> Set Name++instance Defines t => Defines [t] where+ defines = Set.unions . map defines++instance Defines Decl where+ defines = Set.singleton . dName++instance Defines DeclGroup where+ defines d =+ case d of+ NonRecursive x -> defines x+ Recursive x -> defines x+++--------------------------------------------------------------------------------++type InstM = ReaderT ModName++-- | Generate a new instance of a declared name.+freshenName :: FreshM m => Name -> InstM m Name+freshenName x =+ do m <- ask+ let sys = case nameInfo x of+ Declared _ s -> s+ _ -> UserName+ liftSupply (mkDeclared m sys (nameIdent x) (nameFixity x) (nameLoc x))++freshParamName :: FreshM m => Name -> InstM m Name+freshParamName x =+ do m <- ask+ let newName = modParamIdent (nameIdent x)+ liftSupply (mkDeclared m UserName newName (nameFixity x) (nameLoc x))+++++-- | Compute renaming environment from a module instantiation.+-- computeEnv :: ModInst -> InstM Env+computeEnv :: FreshM m =>+ Module {- ^ Functor being instantiated -} ->+ Map TParam Type {- replace type params by type -} ->+ Map Name Name {- replace value parameters by other names -} ->+ InstM m Env+computeEnv m tpMap vpMap =+ do tss <- mapM freshTy (Map.toList (mTySyns m))+ nts <- mapM freshTy (Map.toList (mNewtypes m))+ let tnMap = Map.fromList (tss ++ nts)++ defHere <- mapM mkVParam (Set.toList (defines (mDecls m)))+ let fnMap = Map.union vpMap (Map.fromList defHere)++ return Env { funNameMap = fnMap+ , tyNameMap = tnMap+ , tyParamMap = tpMap+ }+ where+ freshTy (x,_) = do y <- freshenName x+ return (x,y)++ mkVParam x = do y <- freshenName x+ return (x,y)++++--------------------------------------------------------------------------------+-- Do the renaming++data Env = Env+ { funNameMap :: Map Name Name+ , tyNameMap :: Map Name Name+ , tyParamMap :: Map TParam Type+ } deriving Show+++class Inst t where+ inst :: Env -> t -> t++instance Inst a => Inst [a] where+ inst env = map (inst env)++instance Inst Expr where+ inst env = go+ where+ go expr =+ case expr of+ EVar x -> case Map.lookup x (funNameMap env) of+ Just y -> EVar y+ _ -> expr++ EList xs t -> EList (inst env xs) (inst env t)+ ETuple es -> ETuple (inst env es)+ ERec xs -> ERec [ (f,go e) | (f,e) <- xs ]+ ESel e s -> ESel (go e) s+ EIf e1 e2 e3 -> EIf (go e1) (go e2) (go e3)+ EComp t1 t2 e mss -> EComp (inst env t1) (inst env t2)+ (go e)+ (inst env mss)+ ETAbs t e -> ETAbs t (go e)+ ETApp e t -> ETApp (go e) (inst env t)+ EApp e1 e2 -> EApp (go e1) (go e2)+ EAbs x t e -> EAbs x (inst env t) (go e)+ EProofAbs p e -> EProofAbs (inst env p) (go e)+ EProofApp e -> EProofApp (go e)+ EWhere e ds -> EWhere (go e) (inst env ds)+++instance Inst DeclGroup where+ inst env dg =+ case dg of+ NonRecursive d -> NonRecursive (inst env d)+ Recursive ds -> Recursive (inst env ds)++instance Inst DeclDef where+ inst env d =+ case d of+ DPrim -> DPrim+ DExpr e -> DExpr (inst env e)++instance Inst Decl where+ inst env d = d { dSignature = inst env (dSignature d)+ , dDefinition = inst env (dDefinition d)+ , dName = Map.findWithDefault (dName d) (dName d)+ (funNameMap env)+ }++instance Inst Match where+ inst env m =+ case m of+ From x t1 t2 e -> From x (inst env t1) (inst env t2) (inst env e)+ Let d -> Let (inst env d)++instance Inst Schema where+ inst env s = s { sProps = inst env (sProps s)+ , sType = inst env (sType s)+ }++instance Inst Type where+ inst env ty =+ case ty of+ TCon tc ts -> TCon (inst env tc) (inst env ts)+ TVar tv ->+ case tv of+ TVBound tp | Just t <- Map.lookup tp (tyParamMap env) -> t+ _ -> ty+ TUser x ts t -> TUser y (inst env ts) (inst env t)+ where y = Map.findWithDefault x x (tyNameMap env)+ TRec fs -> TRec [ (f, inst env t) | (f,t) <- fs ]++instance Inst TCon where+ inst env tc =+ case tc of+ TC x -> TC (inst env x)+ _ -> tc++instance Inst TC where+ inst env tc =+ case tc of+ TCNewtype x -> TCNewtype (inst env x)+ _ -> tc++instance Inst UserTC where+ inst env (UserTC x t) = UserTC y t+ where y = Map.findWithDefault x x (tyNameMap env)++instance Inst (ExportSpec Name) where+ inst env es = ExportSpec { eTypes = Set.map instT (eTypes es)+ , eBinds = Set.map instV (eBinds es)+ }+ where instT x = Map.findWithDefault x x (tyNameMap env)+ instV x = Map.findWithDefault x x (funNameMap env)++instance Inst TySyn where+ inst env ts = TySyn { tsName = instTyName env x+ , tsParams = tsParams ts+ , tsConstraints = inst env (tsConstraints ts)+ , tsDef = inst env (tsDef ts)+ , tsDoc = tsDoc ts+ }+ where x = tsName ts++instance Inst Newtype where+ inst env nt = Newtype { ntName = instTyName env x+ , ntParams = ntParams nt+ , ntConstraints = inst env (ntConstraints nt)+ , ntFields = [ (f,inst env t) | (f,t) <- ntFields nt ]+ , ntDoc = ntDoc nt+ }+ where x = ntName nt++instTyName :: Env -> Name -> Name+instTyName env x = Map.findWithDefault x x (tyNameMap env)++++++
src/Cryptol/ModuleSystem/Interface.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Interface -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -17,16 +17,20 @@ , IfaceTySyn, ifTySynName , IfaceNewtype , IfaceDecl(..), mkIfaceDecl+ , IfaceParams(..) , genIface , ifacePrimMap+ , noIfaceParams ) where import Cryptol.ModuleSystem.Name import Cryptol.TypeCheck.AST import Cryptol.Utils.Ident (ModName)+import Cryptol.Parser.Position(Located) import qualified Data.Map as Map+import Data.Semigroup import GHC.Generics (Generic) import Control.DeepSeq@@ -37,24 +41,41 @@ -- | The resulting interface generated by a module that has been typechecked. data Iface = Iface- { ifModName :: !ModName- , ifPublic :: IfaceDecls- , ifPrivate :: IfaceDecls+ { ifModName :: !ModName -- ^ Module name+ , ifPublic :: IfaceDecls -- ^ Exported definitions+ , ifPrivate :: IfaceDecls -- ^ Private defintiions+ , ifParams :: IfaceParams -- ^ Uninterpreted constants (aka module params) } deriving (Show, Generic, NFData) +data IfaceParams = IfaceParams+ { ifParamTypes :: Map.Map Name ModTParam+ , ifParamConstraints :: [Located Prop] -- ^ Constraints on param. types+ , ifParamFuns :: Map.Map Name ModVParam+ } deriving (Show, Generic, NFData)++noIfaceParams :: IfaceParams+noIfaceParams = IfaceParams+ { ifParamTypes = Map.empty+ , ifParamConstraints = []+ , ifParamFuns = Map.empty+ }+ data IfaceDecls = IfaceDecls { ifTySyns :: Map.Map Name IfaceTySyn , ifNewtypes :: Map.Map Name IfaceNewtype , ifDecls :: Map.Map Name IfaceDecl } deriving (Show, Generic, NFData) -instance Monoid IfaceDecls where- mempty = IfaceDecls Map.empty Map.empty Map.empty- mappend l r = IfaceDecls+instance Semigroup IfaceDecls where+ l <> r = IfaceDecls { ifTySyns = Map.union (ifTySyns l) (ifTySyns r) , ifNewtypes = Map.union (ifNewtypes l) (ifNewtypes r) , ifDecls = Map.union (ifDecls l) (ifDecls r) }++instance Monoid IfaceDecls where+ mempty = IfaceDecls Map.empty Map.empty Map.empty+ mappend l r = l <> r mconcat ds = IfaceDecls { ifTySyns = Map.unions (map ifTySyns ds) , ifNewtypes = Map.unions (map ifNewtypes ds)@@ -69,12 +90,12 @@ type IfaceNewtype = Newtype data IfaceDecl = IfaceDecl- { ifDeclName :: !Name- , ifDeclSig :: Schema- , ifDeclPragmas :: [Pragma]- , ifDeclInfix :: Bool- , ifDeclFixity :: Maybe Fixity- , ifDeclDoc :: Maybe String+ { ifDeclName :: !Name -- ^ Name of thing+ , ifDeclSig :: Schema -- ^ Type+ , ifDeclPragmas :: [Pragma] -- ^ Pragmas+ , ifDeclInfix :: Bool -- ^ Is this an infix thing+ , ifDeclFixity :: Maybe Fixity -- ^ Fixity information+ , ifDeclDoc :: Maybe String -- ^ Documentation } deriving (Show, Generic, NFData) mkIfaceDecl :: Decl -> IfaceDecl@@ -91,23 +112,33 @@ genIface :: Module -> Iface genIface m = Iface { ifModName = mName m- , ifPublic = IfaceDecls- { ifTySyns = tsPub- , ifNewtypes = ntPub- , ifDecls = dPub++ , ifPublic = IfaceDecls+ { ifTySyns = tsPub+ , ifNewtypes = ntPub+ , ifDecls = dPub }+ , ifPrivate = IfaceDecls- { ifTySyns = tsPriv- , ifNewtypes = ntPriv- , ifDecls = dPriv+ { ifTySyns = tsPriv+ , ifNewtypes = ntPriv+ , ifDecls = dPriv }++ , ifParams = IfaceParams+ { ifParamTypes = mParamTypes m+ , ifParamConstraints = mParamConstraints m+ , ifParamFuns = mParamFuns m+ } } where (tsPub,tsPriv) =- Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m ) (mTySyns m)+ Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m )+ (mTySyns m) (ntPub,ntPriv) =- Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m ) (mNewtypes m)+ Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m )+ (mNewtypes m) (dPub,dPriv) = Map.partitionWithKey (\ qn _ -> qn `isExportedBind` mExports m)
src/Cryptol/ModuleSystem/Monad.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Monad -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -9,9 +9,10 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE OverloadedStrings #-} module Cryptol.ModuleSystem.Monad where -import Cryptol.Eval (EvalEnv)+import Cryptol.Eval (EvalEnv,EvalOpts(..)) import qualified Cryptol.Eval.Monad as E import Cryptol.ModuleSystem.Env@@ -28,8 +29,9 @@ import qualified Cryptol.TypeCheck as T import qualified Cryptol.TypeCheck.AST as T import Cryptol.Parser.Position (Range)-import Cryptol.Utils.Ident (interactiveName, packModName)+import Cryptol.Utils.Ident (interactiveName, noModuleName) import Cryptol.Utils.PP+import Cryptol.Utils.Logger(Logger) import Control.Monad.IO.Class import Control.Exception (IOException)@@ -48,6 +50,7 @@ data ImportSource = FromModule P.ModName | FromImport (Located P.Import)+ | FromModuleInstance (Located P.ModName) deriving (Show, Generic, NFData) instance Eq ImportSource where@@ -57,11 +60,15 @@ ppPrec _ is = case is of FromModule n -> text "module name" <+> pp n FromImport li -> text "import of module" <+> pp (P.iModule (P.thing li))+ FromModuleInstance l ->+ text "instantiation of module" <+> pp (P.thing l) importedModule :: ImportSource -> P.ModName-importedModule is = case is of- FromModule n -> n- FromImport li -> P.iModule (P.thing li)+importedModule is =+ case is of+ FromModule n -> n+ FromImport li -> P.iModule (P.thing li)+ FromModuleInstance l -> P.thing l data ModuleError@@ -89,6 +96,17 @@ -- ^ Module loaded by 'import' statement has the wrong module name | DuplicateModuleName P.ModName FilePath FilePath -- ^ Two modules loaded from different files have the same module name+ | ImportedParamModule P.ModName+ -- ^ Attempt to import a parametrized module that was not instantiated.+ | FailedToParameterizeModDefs P.ModName [T.Name]+ -- ^ Failed to add the module parameters to all definitions in a module.+ | NotAParameterizedModule P.ModName++ | ErrorInFile FilePath ModuleError+ -- ^ This is just a tag on the error, indicating the file containing it.+ -- It is convenient when we had to look for the module, and we'd like+ -- to communicate the location of pthe problematic module to the handler.+ deriving (Show) instance NFData ModuleError where@@ -107,9 +125,13 @@ DuplicateModuleName name path1 path2 -> name `deepseq` path1 `deepseq` path2 `deepseq` () OtherFailure x -> x `deepseq` ()+ ImportedParamModule x -> x `deepseq` ()+ FailedToParameterizeModDefs x xs -> x `deepseq` xs `deepseq` ()+ NotAParameterizedModule x -> x `deepseq` ()+ ErrorInFile x y -> x `deepseq` y `deepseq` () instance PP ModuleError where- ppPrec _ e = case e of+ ppPrec prec e = case e of ModuleNotFound src path -> text "[error]" <+>@@ -126,7 +148,7 @@ OtherIOError path exn -> hang (text "[error]" <+>- text "IO error while loading file:" <+> text path <> colon)+ text "IO error while loading file:" <+> text path <.> colon) 4 (text (show exn)) ModuleParseError _source err -> Parser.ppError err@@ -144,7 +166,7 @@ TypeCheckingFailed _src errs -> vcat (map T.ppError errs) ModuleNameMismatch expected found ->- hang (text "[error]" <+> pp (P.srcRange found) <> char ':')+ hang (text "[error]" <+> pp (P.srcRange found) <.> char ':') 4 (vcat [ text "File name does not match module name:" , text "Saw:" <+> pp (P.thing found) , text "Expected:" <+> pp expected@@ -157,9 +179,19 @@ OtherFailure x -> text x + ImportedParamModule p ->+ text "[error] Import of a non-instantiated parameterized module:" <+> pp p + FailedToParameterizeModDefs x xs ->+ hang (text "[error] Parameterized module" <+> pp x <+>+ text "has polymorphic parameters:")+ 4 (hsep $ punctuate comma $ map pp xs) + NotAParameterizedModule x ->+ text "[error] Module" <+> pp x <+> text "does not have parameters." + ErrorInFile _ x -> ppPrec prec x+ moduleNotFound :: P.ModName -> [FilePath] -> ModuleM a moduleNotFound name paths = ModuleT (raise (ModuleNotFound name paths)) @@ -204,7 +236,24 @@ duplicateModuleName name path1 path2 = ModuleT (raise (DuplicateModuleName name path1 path2)) +importParamModule :: P.ModName -> ModuleM a+importParamModule x = ModuleT (raise (ImportedParamModule x)) +failedToParameterizeModDefs :: P.ModName -> [T.Name] -> ModuleM a+failedToParameterizeModDefs x xs =+ ModuleT (raise (FailedToParameterizeModDefs x xs))++notAParameterizedModule :: P.ModName -> ModuleM a+notAParameterizedModule x = ModuleT (raise (NotAParameterizedModule x))++-- | Run the computation, and if it caused and error, tag the error+-- with the given file.+errorInFile :: FilePath -> ModuleM a -> ModuleM a+errorInFile file (ModuleT m) = ModuleT (m `handle` h)+ where h e = raise $ case e of+ ErrorInFile {} -> e+ _ -> ErrorInFile file e+ -- Warnings -------------------------------------------------------------------- data ModuleWarning@@ -233,12 +282,12 @@ -- Module System Monad --------------------------------------------------------- -data RO = RO- { roLoading :: [ImportSource]- }+data RO = RO { roLoading :: [ImportSource]+ , roEvalOpts :: EvalOpts+ } -emptyRO :: RO-emptyRO = RO { roLoading = [] }+emptyRO :: EvalOpts -> RO+emptyRO ev = RO { roLoading = [], roEvalOpts = ev } newtype ModuleT m a = ModuleT { unModuleT :: ReaderT RO (StateT ModuleEnv@@ -280,21 +329,19 @@ liftIO m = lift $ liftIO m runModuleT :: Monad m- => ModuleEnv+ => (EvalOpts,ModuleEnv) -> ModuleT m a -> m (Either ModuleError (a, ModuleEnv), [ModuleWarning])-runModuleT env m =+runModuleT (ev,env) m = runWriterT $ runExceptionT $ runStateT env- $ runReaderT emptyRO+ $ runReaderT (emptyRO ev) $ unModuleT m --- runM (unModuleT m) emptyRO env- type ModuleM = ModuleT IO -runModuleM :: ModuleEnv -> ModuleM a+runModuleM :: (EvalOpts, ModuleEnv) -> ModuleM a -> IO (Either ModuleError (a,ModuleEnv),[ModuleWarning]) runModuleM = runModuleT @@ -314,10 +361,13 @@ env <- get set $! f env +getLoadedMaybe :: P.ModName -> ModuleM (Maybe LoadedModule)+getLoadedMaybe mn = ModuleT $+ do env <- get+ return (lookupModule mn env)+ isLoaded :: P.ModName -> ModuleM Bool-isLoaded mn = ModuleT $ do- env <- get- return (isJust (lookupModule mn env))+isLoaded mn = isJust <$> getLoadedMaybe mn loadingImport :: Located P.Import -> ModuleM a -> ModuleM a loadingImport = loading . FromImport@@ -325,6 +375,9 @@ loadingModule :: P.ModName -> ModuleM a -> ModuleM a loadingModule = loading . FromModule +loadingModInstance :: Located P.ModName -> ModuleM a -> ModuleM a+loadingModInstance = loading . FromModuleInstance+ -- | Push an "interactive" context onto the loading stack. A bit of a hack, as -- it uses a faked module name interactive :: ModuleM a -> ModuleM a@@ -346,15 +399,22 @@ ro <- ask case roLoading ro of is : _ -> return is- _ -> return (FromModule (packModName ["<none>"])) -- panic "ModuleSystem: getImportSource" ["Import stack is empty"]+ _ -> return (FromModule noModuleName) getIface :: P.ModName -> ModuleM Iface getIface mn = ModuleT $ do env <- get case lookupModule mn env of Just lm -> return (lmInterface lm)- Nothing -> panic "ModuleSystem" ["Interface not available "]+ Nothing -> panic "ModuleSystem" ["Interface not available", show (pp mn)] +getLoaded :: P.ModName -> ModuleM T.Module+getLoaded mn = ModuleT $+ do env <- get+ case lookupModule mn env of+ Just lm -> return (lmModule lm)+ Nothing -> panic "ModuleSystem" ["Module not available", show (pp mn) ]+ getNameSeeds :: ModuleM T.NameSeeds getNameSeeds = ModuleT (meNameSeeds `fmap` get) @@ -379,11 +439,10 @@ do env <- get set $! env { meSupply = supply } --- | Remove a module from the set of loaded module, by its path.-unloadModule :: FilePath -> ModuleM ()-unloadModule path = ModuleT $ do+unloadModule :: (LoadedModule -> Bool) -> ModuleM ()+unloadModule rm = ModuleT $ do env <- get- set $! env { meLoadedModules = removeLoadedModule path (meLoadedModules env) }+ set $! env { meLoadedModules = removeLoadedModule rm (meLoadedModules env) } loadedModule :: FilePath -> FilePath -> T.Module -> ModuleM () loadedModule path canonicalPath m = ModuleT $ do@@ -394,12 +453,16 @@ modifyEvalEnv f = ModuleT $ do env <- get let evalEnv = meEvalEnv env- evalEnv' <- inBase $ E.runEval (f evalEnv)+ evOpts <- unModuleT getEvalOpts+ evalEnv' <- inBase $ E.runEval evOpts (f evalEnv) set $! env { meEvalEnv = evalEnv' } getEvalEnv :: ModuleM EvalEnv getEvalEnv = ModuleT (meEvalEnv `fmap` get) +getEvalOpts :: ModuleM EvalOpts+getEvalOpts = ModuleT (roEvalOpts `fmap` ask)+ getFocusedModule :: ModuleM (Maybe P.ModName) getFocusedModule = ModuleT (meFocusedModule `fmap` get) @@ -425,12 +488,9 @@ return x -- XXX improve error handling here-getFocusedEnv :: ModuleM (IfaceDecls,NamingEnv,NameDisp)+getFocusedEnv :: ModuleM (IfaceParams,IfaceDecls,NamingEnv,NameDisp) getFocusedEnv = ModuleT (focusedEnv `fmap` get) -getQualifiedEnv :: ModuleM IfaceDecls-getQualifiedEnv = ModuleT (qualifiedEnv `fmap` get)- getDynEnv :: ModuleM DynamicEnv getDynEnv = ModuleT (meDynEnv `fmap` get) @@ -448,3 +508,9 @@ getSolverConfig = ModuleT $ do me <- get return (meSolverConfig me)++-- | Usefule for logging. For example: @withLogger logPutStrLn "Hello"@+withLogger :: (Logger -> a -> IO b) -> a -> ModuleM b+withLogger f a = do l <- getEvalOpts+ io (f (evalLogger l) a)+
src/Cryptol/ModuleSystem/Name.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Name -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -20,6 +20,7 @@ module Cryptol.ModuleSystem.Name ( -- * Names Name(), NameInfo(..)+ , NameSource(..) , nameUnique , nameIdent , nameInfo@@ -33,6 +34,9 @@ -- ** Creation , mkDeclared , mkParameter+ , toParamInstName+ , asParamName+ , paramModRecParam -- ** Unique Supply , FreshM(..), nextUniqueM@@ -45,17 +49,20 @@ , lookupPrimType ) where -import Cryptol.Parser.AST( Fixity(..) )-import Cryptol.Parser.Position (Range,Located(..))+import Cryptol.Parser.Fixity+import Cryptol.Parser.Position (Range,Located(..),emptyRange) import Cryptol.Utils.Ident import Cryptol.Utils.Panic import Cryptol.Utils.PP + import Control.DeepSeq import Control.Monad.Fix (MonadFix(mfix)) import qualified Data.Map as Map import qualified Data.Monoid as M import Data.Ord (comparing)+import qualified Data.Text as Text+import Data.Char(isAlpha,toUpper) import GHC.Generics (Generic) import MonadLib import Prelude ()@@ -64,7 +71,7 @@ -- Names ----------------------------------------------------------------------- -- | Information about the binding site of the name.-data NameInfo = Declared !ModName+data NameInfo = Declared !ModName !NameSource -- ^ This name refers to a declaration from this module | Parameter -- ^ This name is a parameter (function or type)@@ -88,8 +95,12 @@ , nLoc :: !Range -- ^ Where this name was defined- } deriving (Show, Generic, NFData)+ } deriving (Generic, NFData, Show) ++data NameSource = SystemName | UserName+ deriving (Generic, NFData, Show, Eq)+ instance Eq Name where a == b = compare a b == EQ a /= b = compare a b /= EQ@@ -102,15 +113,17 @@ cmpNameLexical l r = case (nameInfo l, nameInfo r) of - (Declared nsl,Declared nsr) ->+ (Declared nsl _,Declared nsr _) -> case compare nsl nsr of EQ -> comparing nameIdent l r cmp -> cmp (Parameter,Parameter) -> comparing nameIdent l r - (Declared nsl,Parameter) -> compare nsl (identText (nameIdent r))- (Parameter,Declared nsr) -> compare (identText (nameIdent l)) nsr+ (Declared nsl _,Parameter) -> compare (modNameToText nsl)+ (identText (nameIdent r))+ (Parameter,Declared nsr _) -> compare (identText (nameIdent l))+ (modNameToText nsr) -- | Compare two names by the way they would be displayed.@@ -118,29 +131,45 @@ cmpNameDisplay disp l r = case (nameInfo l, nameInfo r) of - (Declared nsl, Declared nsr) ->+ (Declared nsl _, Declared nsr _) -> -- XXX: uses system name info? let pfxl = fmtModName nsl (getNameFormat nsl (nameIdent l) disp) pfxr = fmtModName nsr (getNameFormat nsr (nameIdent r) disp)- in case compare pfxl pfxr of- EQ -> compare (nameIdent l) (nameIdent r)+ in case cmpText pfxl pfxr of+ EQ -> cmpName l r cmp -> cmp - (Parameter,Parameter) ->- compare (nameIdent l) (nameIdent r)+ (Parameter,Parameter) -> cmpName l r - (Declared nsl,Parameter) ->+ (Declared nsl _,Parameter) -> let pfxl = fmtModName nsl (getNameFormat nsl (nameIdent l) disp)- in case compare pfxl (identText (nameIdent r)) of+ in case cmpText pfxl (identText (nameIdent r)) of EQ -> GT cmp -> cmp - (Parameter,Declared nsr) ->+ (Parameter,Declared nsr _) -> let pfxr = fmtModName nsr (getNameFormat nsr (nameIdent r) disp)- in case compare (identText (nameIdent l)) pfxr of+ in case cmpText (identText (nameIdent l)) pfxr of EQ -> LT cmp -> cmp + where+ cmpName xs ys = cmpIdent (nameIdent xs) (nameIdent ys)+ cmpIdent xs ys = cmpText (identText xs) (identText ys) + -- Note that this assumes that `xs` is `l` and `ys` is `r`+ cmpText xs ys =+ case (Text.null xs, Text.null ys) of+ (True,True) -> EQ+ (True,False) -> LT+ (False,True) -> GT+ (False,False) -> compare (cmp (fx l) xs) (cmp (fx r) ys)+ where+ fx a = fLevel <$> nameFixity a+ cmp a cs = (ordC (Text.index cs 0), a, cs)+ ordC a | isAlpha a = fromEnum (toUpper a)+ | a == '_' = 1+ | otherwise = 0+ -- | Figure out how the name should be displayed, by referencing the display -- function in the environment. NOTE: this function doesn't take into account -- the need for parenthesis.@@ -148,11 +177,11 @@ ppName Name { .. } = case nInfo of - Declared m -> withNameDisp $ \disp ->+ Declared m _ -> withNameDisp $ \disp -> case getNameFormat m nIdent disp of- Qualified m' -> pp m' <> text "::" <> pp nIdent- UnQualified -> pp nIdent- NotInScope -> pp m <> text "::" <> pp nIdent+ Qualified m' -> pp m' <.> text "::" <.> pp nIdent+ UnQualified -> pp nIdent+ NotInScope -> pp m <.> text "::" <.> pp nIdent Parameter -> pp nIdent @@ -188,12 +217,23 @@ nameFixity :: Name -> Maybe Fixity nameFixity = nFixity + asPrim :: Name -> Maybe Ident-asPrim Name { .. }- | nInfo == Declared preludeName = Just nIdent- | otherwise = Nothing+asPrim Name { .. } =+ case nInfo of+ Declared p _ | p == preludeName -> Just nIdent+ _ -> Nothing +toParamInstName :: Name -> Name+toParamInstName n =+ case nInfo n of+ Declared m s -> n { nInfo = Declared (paramInstModName m) s }+ Parameter -> n +asParamName :: Name -> Name+asParamName n = n { nInfo = Parameter }++ -- Name Supply ----------------------------------------------------------------- class Monad m => FreshM m where@@ -269,7 +309,10 @@ -- plenty of room for names that the compiler needs to know about (wired-in -- constants). emptySupply :: Supply-emptySupply = Supply 0+emptySupply = Supply 0x1000+-- For one such name, see paramModRecParam+-- XXX: perhaps we should simply not have such things, but that's the way+-- for now. nextUnique :: Supply -> (Int,Supply) nextUnique (Supply n) = s' `seq` (n,s')@@ -280,10 +323,10 @@ -- Name Construction ----------------------------------------------------------- -- | Make a new name for a declaration.-mkDeclared :: ModName -> Ident -> Maybe Fixity -> Range -> Supply -> (Name,Supply)-mkDeclared m nIdent nFixity nLoc s =+mkDeclared :: ModName -> NameSource -> Ident -> Maybe Fixity -> Range -> Supply -> (Name,Supply)+mkDeclared m sys nIdent nFixity nLoc s = let (nUnique,s') = nextUnique s- nInfo = Declared m+ nInfo = Declared m sys in (Name { .. }, s') -- | Make a new parameter name.@@ -293,6 +336,13 @@ nFixity = Nothing in (Name { nInfo = Parameter, .. }, s') +paramModRecParam :: Name+paramModRecParam = Name { nInfo = Parameter+ , nFixity = Nothing+ , nIdent = packIdent "$modParams"+ , nLoc = emptyRange+ , nUnique = 0x01+ } -- Prim Maps -------------------------------------------------------------------
src/Cryptol/ModuleSystem/NamingEnv.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.NamingEnv -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -20,14 +20,17 @@ import Cryptol.ModuleSystem.Interface import Cryptol.ModuleSystem.Name import Cryptol.Parser.AST+import Cryptol.Parser.Name(isGeneratedName) import Cryptol.Parser.Position+import qualified Cryptol.TypeCheck.AST as T import Cryptol.Utils.PP import Cryptol.Utils.Panic (panic) import Data.List (nub)-import Data.Maybe (catMaybes,fromMaybe)+import Data.Maybe (catMaybes,fromMaybe,mapMaybe) import qualified Data.Map.Strict as Map import qualified Data.Set as Set+import Data.Semigroup import MonadLib (runId,Id) import GHC.Generics (Generic)@@ -49,6 +52,22 @@ -- ^ Expression-level fixity environment } deriving (Show, Generic, NFData) +-- | Return a list of value-level names to which this parsed name may refer.+lookupValNames :: PName -> NamingEnv -> [Name]+lookupValNames qn ro = Map.findWithDefault [] qn (neExprs ro)++-- | Return a list of type-level names to which this parsed name may refer.+lookupTypeNames :: PName -> NamingEnv -> [Name]+lookupTypeNames qn ro = Map.findWithDefault [] qn (neTypes ro)++++instance Semigroup NamingEnv where+ l <> r =+ NamingEnv { neExprs = Map.unionWith merge (neExprs l) (neExprs r)+ , neTypes = Map.unionWith merge (neTypes l) (neTypes r)+ , neFixity = Map.union (neFixity l) (neFixity r) }+ instance Monoid NamingEnv where mempty = NamingEnv { neExprs = Map.empty@@ -57,10 +76,7 @@ -- NOTE: merging the fixity maps is a special case that just prefers the left -- entry, as they're already keyed by a name with a unique- mappend l r =- NamingEnv { neExprs = Map.unionWith merge (neExprs l) (neExprs r)- , neTypes = Map.unionWith merge (neTypes l) (neTypes r)- , neFixity = Map.union (neFixity l) (neFixity r) }+ mappend l r = l <> r mconcat envs = NamingEnv { neExprs = Map.unionsWith merge (map neExprs envs)@@ -98,11 +114,11 @@ names = Map.fromList $ [ mkEntry pn mn (nameIdent n) | (pn,ns) <- Map.toList neExprs , n <- ns- , Declared mn <- [nameInfo n] ]+ , Declared mn _ <- [nameInfo n] ] ++ [ mkEntry pn mn (nameIdent n) | (pn,ns) <- Map.toList neTypes , n <- ns- , Declared mn <- [nameInfo n] ]+ , Declared mn _ <- [nameInfo n] ] mkEntry pn mn i = ((mn,i),fmt) where@@ -176,17 +192,26 @@ namingEnv' :: BindsNames a => a -> Supply -> (NamingEnv,Supply) namingEnv' a supply = runId (runSupplyT supply (runBuild (namingEnv a))) +newTop :: FreshM m => ModName -> PName -> Maybe Fixity -> Range -> m Name+newTop ns thing fx rng = liftSupply (mkDeclared ns src (getIdent thing) fx rng)+ where src = if isGeneratedName thing then SystemName else UserName -newtype BuildNamingEnv = BuildNamingEnv { runBuild :: SupplyT Id NamingEnv }+newLocal :: FreshM m => PName -> Range -> m Name+newLocal thing rng = liftSupply (mkParameter (getIdent thing) rng) -instance Monoid BuildNamingEnv where- mempty = BuildNamingEnv (pure mempty)+newtype BuildNamingEnv = BuildNamingEnv { runBuild :: SupplyT Id NamingEnv } - mappend (BuildNamingEnv a) (BuildNamingEnv b) = BuildNamingEnv $+instance Semigroup BuildNamingEnv where+ BuildNamingEnv a <> BuildNamingEnv b = BuildNamingEnv $ do x <- a y <- b return (mappend x y) +instance Monoid BuildNamingEnv where+ mempty = BuildNamingEnv (pure mempty)++ mappend = (<>)+ mconcat bs = BuildNamingEnv $ do ns <- sequence (map runBuild bs) return (mconcat ns)@@ -258,6 +283,28 @@ | d <- Map.elems ifDecls ] +-- | Compute an unqualified naming environment, containing the various module+-- parameters.+modParamsNamingEnv :: IfaceParams -> NamingEnv+modParamsNamingEnv IfaceParams { .. } =+ NamingEnv { neExprs = Map.fromList $ map fromFu $ Map.keys ifParamFuns+ , neTypes = Map.fromList $ map fromTy $ Map.elems ifParamTypes+ , neFixity = Map.fromList $ mapMaybe toFix $ Map.elems ifParamFuns+ }++ where+ toPName n = mkUnqual (nameIdent n)++ fromTy tp = let nm = T.mtpName tp+ in (toPName nm, [nm])++ fromFu f = (toPName f, [f])++ toFix x = do d <- T.mvpFixity x+ return (T.mvpName x, d)+++ data ImportIface = ImportIface Import Iface -- | Produce a naming environment from an interface file, that contains a@@ -271,7 +318,7 @@ instance BindsNames (InModule (Bind PName)) where namingEnv (InModule ns b) = BuildNamingEnv $ do let Located { .. } = bName b- n <- liftSupply (mkDeclared ns (getIdent thing) (bFixity b) srcRange)+ n <- newTop ns thing (bFixity b) srcRange let fixity = case bFixity b of Just f -> mempty { neFixity = Map.singleton n f }@@ -283,7 +330,7 @@ instance BindsNames (TParam PName) where namingEnv TParam { .. } = BuildNamingEnv $ do let range = fromMaybe emptyRange tpRange- n <- liftSupply (mkParameter (getIdent tpName) range)+ n <- newLocal tpName range return (singletonT tpName n) -- | The naming environment for a single module. This is the mapping from@@ -296,17 +343,33 @@ instance BindsNames (InModule (TopDecl PName)) where namingEnv (InModule ns td) = case td of- Decl d -> namingEnv (InModule ns (tlValue d))- TDNewtype d -> namingEnv (InModule ns (tlValue d))+ Decl d -> namingEnv (InModule ns (tlValue d))+ TDNewtype d -> namingEnv (InModule ns (tlValue d))+ DParameterType d -> namingEnv (InModule ns d)+ DParameterConstraint {} -> mempty+ DParameterFun d -> namingEnv (InModule ns d) Include _ -> mempty +instance BindsNames (InModule (ParameterFun PName)) where+ namingEnv (InModule ns ParameterFun { .. }) = BuildNamingEnv $+ do let Located { .. } = pfName+ ntName <- newTop ns thing pfFixity srcRange+ return (singletonE thing ntName)++instance BindsNames (InModule (ParameterType PName)) where+ namingEnv (InModule ns ParameterType { .. }) = BuildNamingEnv $+ -- XXX: we don't seem to have a fixity environment at the type level+ do let Located { .. } = ptName+ ntName <- newTop ns thing Nothing srcRange+ return (singletonT thing ntName)+ -- 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- ntName <- liftSupply (mkDeclared ns (getIdent thing) Nothing srcRange)+ ntName <- newTop ns thing Nothing srcRange return (singletonT thing ntName `mappend` singletonE thing ntName) -- | The naming environment for a single declaration.@@ -316,17 +379,17 @@ do n <- mkName (bName b) (bFixity b) return (singletonE (thing (bName b)) n `mappend` fixity n b) - DSignature ns _sig -> foldMap qualBind ns- DPragma ns _p -> foldMap qualBind ns- DType (TySyn lqn _ _) -> qualType lqn- DLocated d' _ -> namingEnv (InModule pfx d')- DPatBind _pat _e -> panic "ModuleSystem" ["Unexpected pattern binding"]- DFixity{} -> panic "ModuleSystem" ["Unexpected fixity declaration"]+ DSignature ns _sig -> foldMap qualBind ns+ DPragma ns _p -> foldMap qualBind ns+ DType (TySyn lqn _ _) -> qualType lqn+ DProp (PropSyn lqn _ _) -> qualType lqn+ DLocated d' _ -> namingEnv (InModule pfx d')+ DPatBind _pat _e -> panic "ModuleSystem" ["Unexpected pattern binding"]+ DFixity{} -> panic "ModuleSystem" ["Unexpected fixity declaration"] where - mkName ln fx =- liftSupply (mkDeclared pfx (getIdent (thing ln)) fx (srcRange ln))+ mkName ln fx = newTop pfx (thing ln) fx (srcRange ln) qualBind ln = BuildNamingEnv $ do n <- mkName ln Nothing
src/Cryptol/ModuleSystem/Renamer.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.ModuleSystem.Renamer -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -29,16 +29,21 @@ import Cryptol.ModuleSystem.Name import Cryptol.ModuleSystem.NamingEnv+import Cryptol.ModuleSystem.Exports import Cryptol.Prims.Syntax import Cryptol.Parser.AST import Cryptol.Parser.Position-import Cryptol.Utils.Ident (packIdent,packInfix)+import Cryptol.TypeCheck.Type (TCon(..))+import Cryptol.Utils.Ident (packInfix,packIdent) import Cryptol.Utils.Panic (panic) import Cryptol.Utils.PP import qualified Data.Foldable as F+import Data.Map.Strict ( Map ) import qualified Data.Map.Strict as Map import qualified Data.Sequence as Seq+import qualified Data.Semigroup as S+import qualified Data.Set as Set import Data.String (IsString(..)) import MonadLib hiding (mapM, mapM_) @@ -109,7 +114,7 @@ hang (text "[error] at" <+> pp (srcRange lqn)) 4 (fsep [ text "Expected a value named", quotes (pp (thing lqn)) , text "but found a type instead"- , text "Did you mean `(" <> pp (thing lqn) <> text")?" ])+ , text "Did you mean `(" <.> pp (thing lqn) <.> text")?" ]) ExpectedType lqn disp -> fixNameDisp disp $ hang (text "[error] at" <+> pp (srcRange lqn))@@ -144,13 +149,15 @@ -- 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++ | UnusedName Name NameDisp deriving (Show, Generic, NFData) instance PP RenamerWarning where ppPrec _ (SymbolShadowed new originals disp) = fixNameDisp disp $ hang (text "[warning] at" <+> loc) 4 $ fsep [ text "This binding for" <+> sym- , (text "shadows the existing binding" <> plural) <+> text "from" ]+ , (text "shadows the existing binding" <.> plural) <+> text "from" ] $$ vcat (map ppLocName originals) where@@ -162,10 +169,15 @@ 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."+ 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 has recently changed!" , text "Use parentheses to disambiguate this parse, or consider replacing (&&) with (/\\), or (||) with (\\/)."+ , text "Ignore this message if you are confident this expression is parsing correctly; it will be removed"+ , text "in a future release." ]+ ppPrec _ (UnusedName x disp) = fixNameDisp disp $+ hang (text "[warning] at" <+> pp (nameLoc x))+ 4 (text "Unused name:" <+> pp x) -- Renaming Monad -------------------------------------------------------------- @@ -177,23 +189,30 @@ } data RW = RW- { rwWarnings :: !(Seq.Seq RenamerWarning)- , rwErrors :: !(Seq.Seq RenamerError)- , rwSupply :: !Supply+ { rwWarnings :: !(Seq.Seq RenamerWarning)+ , rwErrors :: !(Seq.Seq RenamerError)+ , rwSupply :: !Supply+ , rwNameUseCount :: !(Map Name Int)+ -- ^ How many times did we refer to each name.+ -- Used to generate warnings for unused definitions. } newtype RenameM a = RenameM { unRenameM :: ReaderT RO (StateT RW Lift) a } -instance Monoid a => Monoid (RenameM a) where+instance S.Semigroup a => S.Semigroup (RenameM a) where+ {-# INLINE (<>) #-}+ a <> b =+ do x <- a+ y <- b+ return (x S.<> y)++instance (S.Semigroup a, Monoid a) => Monoid (RenameM a) where {-# INLINE mempty #-} mempty = return mempty {-# INLINE mappend #-}- mappend a b =- do x <- a- y <- b- return (mappend x y)+ mappend = (S.<>) instance Functor RenameM where {-# INLINE fmap #-}@@ -221,43 +240,49 @@ runRenamer :: Supply -> ModName -> NamingEnv -> RenameM a -> (Either [RenamerError] (a,Supply),[RenamerWarning])-runRenamer s ns env m = (res,F.toList (rwWarnings rw))+runRenamer s ns env m = (res, warnUnused ns env ro rw ++ F.toList (rwWarnings rw)) where-- (a,rw) = runM (unRenameM m) RO { roLoc = emptyRange- , roNames = env- , roMod = ns- , roDisp = neverQualifyMod ns- `mappend` toNameDisp env- }+ (a,rw) = runM (unRenameM m) ro RW { rwErrors = Seq.empty , rwWarnings = Seq.empty , rwSupply = s+ , rwNameUseCount = Map.empty } + ro = RO { roLoc = emptyRange+ , roNames = env+ , roMod = ns+ , roDisp = neverQualifyMod ns `mappend` toNameDisp env+ }+ res | Seq.null (rwErrors rw) = Right (a,rwSupply rw) | otherwise = Left (F.toList (rwErrors rw)) +-- | Record an error. XXX: use a better name record :: (NameDisp -> RenamerError) -> RenameM () record f = RenameM $ do RO { .. } <- ask RW { .. } <- get set RW { rwErrors = rwErrors Seq.|> f roDisp, .. } +-- | Report a warning. recordW :: (NameDisp -> RenamerWarning) -> RenameM () recordW f = RenameM $ do RO { .. } <- ask RW { .. } <- get set RW { rwWarnings = rwWarnings Seq.|> f roDisp, .. } +-- | Get the source range for wahtever we are currently renaming. curLoc :: RenameM Range curLoc = RenameM (roLoc `fmap` ask) +-- | Annotate something with the current range. located :: a -> RenameM (Located a) located thing = do srcRange <- curLoc return Located { .. } +-- | Do the given computation using the source code range from `loc` if any. withLoc :: HasLoc loc => loc -> RenameM a -> RenameM a withLoc loc m = RenameM $ case getLoc loc of @@ -342,7 +367,26 @@ check ns acc = containsOverlap disp ns Seq.>< acc +recordUse :: Name -> RenameM ()+recordUse x = RenameM $ sets_ $ \rw ->+ rw { rwNameUseCount = Map.insertWith (+) x 1 (rwNameUseCount rw) } ++warnUnused :: ModName -> NamingEnv -> RO -> RW -> [RenamerWarning]+warnUnused m0 env ro rw =+ map warn+ $ Map.keys+ $ Map.filterWithKey keep+ $ rwNameUseCount rw+ where+ warn x = UnusedName x (roDisp ro)+ keep k n = n == 1 && isLocal k+ oldNames = fst (visibleNames env)+ isLocal nm = case nameInfo nm of+ Declared m sys -> sys == UserName &&+ m == m0 && nm `Set.notMember` oldNames+ Parameter -> True+ -- Renaming -------------------------------------------------------------------- class Rename f where@@ -353,14 +397,37 @@ do env <- liftSupply (namingEnv' m) -- NOTE: we explicitly hide shadowing errors here, by using shadowNames' decls' <- shadowNames' CheckOverlap env (traverse rename (mDecls m))- return (env,m { mDecls = decls' })+ let m1 = m { mDecls = decls' }+ exports = modExports m1+ mapM_ recordUse (eTypes exports)+ return (env,m1) instance Rename TopDecl where rename td = case td of Decl d -> Decl <$> traverse rename d TDNewtype n -> TDNewtype <$> traverse rename n Include n -> return (Include n)+ DParameterFun f -> DParameterFun <$> rename f+ DParameterType f -> DParameterType <$> rename f + DParameterConstraint d -> DParameterConstraint <$> mapM renameLocated d++renameLocated :: Rename f => Located (f PName) -> RenameM (Located (f Name))+renameLocated x =+ do y <- rename (thing x)+ return x { thing = y }++instance Rename ParameterType where+ rename a =+ do n' <- rnLocated renameType (ptName a)+ return a { ptName = n' }++instance Rename ParameterFun where+ rename a =+ do n' <- rnLocated renameVar (pfName a)+ sig' <- renameSchema (pfSchema a)+ return a { pfName = n', pfSchema = snd sig' }+ rnLocated :: (a -> RenameM b) -> Located a -> RenameM (Located b) rnLocated f loc = withLoc loc $ do a' <- f (thing loc)@@ -379,6 +446,7 @@ shadowNames pe (DPatBind pat' <$> rename e) DType syn -> DType <$> rename syn+ DProp syn -> DProp <$> rename syn DLocated d' r -> withLoc r $ DLocated <$> rename d' <*> pure r DFixity{} -> panic "Renamer" ["Unexpected fixity declaration"@@ -426,9 +494,10 @@ typeExists pn = do ro <- RenameM ask case Map.lookup pn (neTypes (roNames ro)) of- Just [n] -> return (Just n)+ Just [n] -> recordUse n >> return (Just n) Just [] -> panic "Renamer" ["Invalid type renaming environment"] Just syms -> do n <- located pn+ mapM_ recordUse syms record (MultipleSyms n syms) return (Just (head syms)) Nothing -> return Nothing@@ -491,11 +560,17 @@ instance Rename Prop where rename p = case p of- CFin t -> CFin <$> rename t- CEqual l r -> CEqual <$> rename l <*> rename r- CGeq l r -> CGeq <$> rename l <*> rename r- CArith t -> CArith <$> rename t- CCmp t -> CCmp <$> rename t+ CFin t -> CFin <$> rename t+ CEqual l r -> CEqual <$> rename l <*> rename r+ CNeq l r -> CNeq <$> rename l <*> rename r+ CGeq l r -> CGeq <$> rename l <*> rename r+ CZero t -> CZero <$> rename t+ CLogic t -> CLogic <$> rename t+ CArith t -> CArith <$> rename t+ CCmp t -> CCmp <$> rename t+ CSignedCmp t -> CSignedCmp <$> rename t+ CLiteral l r -> CLiteral <$> rename l <*> rename r+ CUser qn ps -> CUser <$> renameType qn <*> traverse rename ps CLocated p' r -> withLoc r $ CLocated <$> rename p' <*> pure r @@ -510,14 +585,16 @@ TLocated t' r -> (`CLocated` r) <$> go t' - -- these are the only cases that will produce valid props.+ TApp (PC x) [l,r]+ | PEqual <- x -> CEqual <$> rename l <*> rename r+ | PNeq <- x -> CNeq <$> rename l <*> rename r+ | PGeq <- x -> CGeq <$> rename l <*> rename r+ TUser n [l,r]- | i == packIdent "==" -> CEqual <$> rename l <*> rename r- | i == packIdent ">=" -> CGeq <$> rename l <*> rename r- | i == packIdent "<=" -> CGeq <$> rename r <*> rename l- where- i = getIdent n+ | isLeq n -> CGeq <$> rename r <*> rename l + TUser n ts -> CUser <$> renameType n <*> traverse rename ts+ -- record an error, but continue renaming to gather any other errors _ -> do record (InvalidConstraint ty)@@ -526,10 +603,10 @@ -- | Check to see if this identifier is a reserved type/type-function. isReserved :: PName -> Bool-isReserved pn = Map.member pn tfunNames || isReservedTyCon pn+isReserved pn = case primTyFromPName pn of+ Just _ -> True+ _ -> False -isReservedTyCon :: PName -> Bool-isReservedTyCon pn = Map.member pn tconNames -- | Resolve fixity, then rename the resulting type. instance Rename Type where@@ -541,19 +618,12 @@ go TBit = return TBit go (TNum c) = return (TNum c) go (TChar c) = return (TChar c)- go TInf = return TInf go (TUser pn ps) - -- all type functions- | Just (arity,fun) <- Map.lookup pn tfunNames =- do when (arity /= length ps) (record (MalformedBuiltin ty0 pn))- ps' <- traverse go ps- return (TApp fun ps')-- -- built-in types like Bit and inf- | Just ty <- Map.lookup pn tconNames =- rename ty+ | Just pt <- primTyFromPName pn =+ do ps' <- traverse go ps+ return (TApp (primTyCon pt) ps') go (TUser qn ps) = TUser <$> renameType qn <*> traverse go ps go (TApp f xs) = TApp f <$> traverse go xs@@ -596,48 +666,36 @@ TBit -> return t TNum _ -> return t TChar _ -> return t- TInf -> return t TWild -> return t type TOp = Type PName -> Type PName -> Type PName -infixProps :: [PName]-infixProps = map (mkUnqual . packInfix) [ "==", ">=", "<=" ]- mkTInfix :: Type PName -> (TOp,Fixity) -> Type PName -> RenameM (Type PName) --- only if the function is one of props-mkTInfix t@(TUser o1 [x,y]) op@(o2,f2) z- | o1 `elem` infixProps =- do let f1 = Fixity NonAssoc 0- case compareFixity f1 f2 of- FCLeft -> return (o2 t z)- FCRight -> do r <- mkTInfix y op z- return (TUser o1 [x,r])+mkTInfix t op@(o2,f2) z =+ case t of+ TLocated t1 _ -> mkTInfix t1 op z - -- Just reconstruct with the TUser part being an application. If this was- -- a real error, it will be caught during renaming.- FCError -> return (o2 t z)+ TUser op1 [x,y] | isLeq op1 -> doFixity (TUser op1) leqFixity x y+ TApp tc [x,y]+ | Just pt <- primTyFromTC tc+ , Just f1 <- primTyFixity pt -> doFixity (TApp tc) f1 x y --- In this case, we know the fixities of both sides.-mkTInfix t@(TApp o1 [x,y]) op@(o2,f2) z- | Just (a1,p1) <- Map.lookup o1 tBinOpPrec =- case compareFixity (Fixity a1 p1) f2 of- FCLeft -> return (o2 t z)- FCRight -> do r <- mkTInfix y op z- return (TApp o1 [x,r])+ _ -> return (o2 t z) - -- As the fixity table is known, and this is a case where the fixity came- -- from that table, it's a real error if the fixities didn't work out.- FCError -> panic "Renamer" [ "fixity problem for type operators"- , show (o2 t z) ]+ where+ doFixity mk f1 x y =+ case compareFixity f1 f2 of+ FCLeft -> return (o2 t z)+ FCRight -> do r <- mkTInfix y op z+ return (mk [x,r]) -mkTInfix (TLocated t _) op z =- mkTInfix t op z+ -- As the fixity table is known, and this is a case where the fixity came+ -- from that table, it's a real error if the fixities didn't work out.+ FCError -> panic "Renamer" [ "fixity problem for type operators"+ , show (o2 t z) ] -mkTInfix t (op,_) z =- return (op t z) -- | When possible, rewrite the type operator to a known constructor, otherwise@@ -645,7 +703,7 @@ lookupFixity :: Located PName -> (TOp,Fixity) lookupFixity op = case lkp of- Just (p,f) -> (\x y -> TApp p [x,y], f)+ Just res -> res -- unknown type operator, just use default fixity -- NOTE: this works for the props defined above, as all other operators@@ -654,10 +712,23 @@ where sym = thing op- lkp = do (_,n) <- Map.lookup (thing op) tfunNames- (fAssoc,fLevel) <- Map.lookup n tBinOpPrec- return (n,Fixity { .. })+ lkp = do pt <- primTyFromPName (thing op)+ fi <- primTyFixity pt+ return (\x y -> TApp (primTyCon pt) [x,y], fi)+ `mplus`+ do guard (isLeq sym)+ return (\x y -> TUser sym [x,y], leqFixity) +leqFixity :: Fixity+leqFixity = Fixity NonAssoc 30++leqIdent :: Ident+leqIdent = packInfix "<="++isLeq :: PName -> Bool+isLeq x = getIdent x == leqIdent++ -- | Rename a binding. instance Rename Bind where rename b = do@@ -693,9 +764,11 @@ $ PLocated <$> rename p' <*> pure loc instance Rename Expr where- rename e = case e of+ rename expr = case expr of EVar n -> EVar <$> renameVar n ELit l -> return (ELit l)+ ENeg e -> rename (EApp (EVar (mkUnqual (packIdent "negate"))) e)+ EComplement e -> rename (EApp (EVar (mkUnqual (packIdent "complement"))) e) ETuple es -> ETuple <$> traverse rename es ERecord fs -> ERecord <$> traverse (rnNamed rename) fs ESel e' s -> ESel <$> rename e' <*> pure s@@ -883,7 +956,6 @@ typeEnv TBit = return mempty typeEnv TNum{} = return mempty typeEnv TChar{} = return mempty- typeEnv TInf = return mempty typeEnv (TUser pn ps) = do mb <- typeExists pn@@ -941,6 +1013,15 @@ shadowNames ps $ TySyn <$> rnLocated renameType n <*> traverse rename ps <*> rename ty++instance Rename PropSyn where+ rename (PropSyn n ps cs) =+ do when (isReserved (thing n))+ (record (BoundReservedType (thing n) (getLoc n) (text "constraint synonym")))++ shadowNames ps $ PropSyn <$> rnLocated renameType n+ <*> traverse rename ps+ <*> traverse rename cs -- Utilities -------------------------------------------------------------------
src/Cryptol/Parser.y view
@@ -1,6 +1,6 @@ { -- |--- Module : $Header$+-- Module : Cryptol.Parser -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -27,17 +27,17 @@ import Control.Applicative as A import Data.Maybe(fromMaybe)-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as T-import qualified Data.Text as ST+import Data.Text(Text)+import qualified Data.Text as T import Control.Monad(liftM2,msum) -import Cryptol.Prims.Syntax+import Cryptol.Prims.Syntax(TFun(..)) import Cryptol.Parser.AST import Cryptol.Parser.Position import Cryptol.Parser.LexerUtils hiding (mkIdent) import Cryptol.Parser.ParserUtils import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)+import Cryptol.Utils.Ident(paramInstModName) import Paths_cryptol }@@ -56,6 +56,7 @@ 'as' { Located $$ (Token (KW KW_as) _)} 'hiding' { Located $$ (Token (KW KW_hiding) _)} 'private' { Located $$ (Token (KW KW_private) _)}+ 'parameter' { Located $$ (Token (KW KW_parameter) _)} 'property' { Located $$ (Token (KW KW_property) _)} 'infix' { Located $$ (Token (KW KW_infix) _)} 'infixl' { Located $$ (Token (KW KW_infixl) _)}@@ -72,6 +73,7 @@ 'x' { Located $$ (Token (KW KW_x) _)} 'primitive' { Located $$ (Token (KW KW_primitive) _)}+ 'constraint'{ Located $$ (Token (KW KW_constraint) _)} '[' { Located $$ (Token (Sym BracketL) _)} ']' { Located $$ (Token (Sym BracketR) _)}@@ -152,16 +154,10 @@ vmodule :: { Module PName }- : 'module' modName 'where' 'v{' vmod_body 'v}'- { let (is,ts) = $5 in Module $2 is ts }-- | 'v{' vmod_body 'v}'- { let { (is,ts) = $2- -- XXX make a location from is and ts- ; modName = Located { srcRange = emptyRange- , thing = mkModName ["Main"]- }- } in Module modName is ts }+ : 'module' modName 'where' 'v{' vmod_body 'v}' { mkModule $2 $5 }+ | 'module' modName '=' modName 'where' 'v{' vmod_body 'v}'+ { mkModuleInstance $2 $4 $7 }+ | 'v{' vmod_body 'v}' { mkAnonymousModule $2 } vmod_body :: { ([Located Import], [TopDecl PName]) } : vimports 'v;' vtop_decls { (reverse $1, reverse $3) }@@ -237,9 +233,10 @@ { [exportDecl $1 Public (mkProperty $3 $4 $6)] } | mbDoc 'property' name '=' expr { [exportDecl $1 Public (mkProperty $3 [] $5)] }- | mbDoc newtype { [exportNewtype Public $2] }+ | mbDoc newtype { [exportNewtype Public $1 $2] } | prim_bind { $1 } | private_decls { $1 }+ | parameter_decls { $1 } top_decl :: { [TopDecl PName] } : decl { [Decl (TopLevel {tlExport = Public, tlValue = $1 })] }@@ -256,6 +253,25 @@ : mbDoc 'primitive' name ':' schema { mkPrimDecl $1 $3 $5 } | mbDoc 'primitive' '(' op ')' ':' schema { mkPrimDecl $1 $4 $7 } +++parameter_decls :: { [TopDecl PName] }+ : 'parameter' 'v{' par_decls 'v}' { reverse $3 }+ | doc 'parameter' 'v{' par_decls 'v}' { reverse $4 }++-- Reversed+par_decls :: { [TopDecl PName] }+ : par_decl { [$1] }+ | par_decls ';' par_decl { $3 : $1 }+ | par_decls 'v;' par_decl { $3 : $1 }++par_decl :: { TopDecl PName }+ : mbDoc name ':' schema { mkParFun $1 $2 $4 }+ | mbDoc 'type' name ':' kind {% mkParType $1 $3 $5 }+ | mbDoc 'type' 'constraint' type {% fmap (DParameterConstraint . distrLoc)+ (mkProp $4) }++ doc :: { Located String } : DOC { mkDoc (fmap tokenText $1) } @@ -297,9 +313,15 @@ | 'type' name tysyn_params '=' type {% at ($1,$5) `fmap` mkTySyn $2 (reverse $3) $5 } + | 'type' 'constraint' name '=' type+ {% at ($2,$5) `fmap` mkPropSyn $3 [] $5 }+ | 'type' 'constraint' name tysyn_params '=' type+ {% at ($2,$6) `fmap` mkPropSyn $3 (reverse $4) $6 }+ | 'infixl' NUM ops {% mkFixity LeftAssoc $2 (reverse $3) } | 'infixr' NUM ops {% mkFixity RightAssoc $2 (reverse $3) } | 'infix' NUM ops {% mkFixity NonAssoc $2 (reverse $3) }+ | error {% expected "a declaration" } let_decl :: { Decl PName } : 'let' ipat '=' expr { at ($2,$4) $ DPatBind $2 $4 }@@ -368,6 +390,7 @@ | expr 'where' '{' decls '}' { at ($1,$5) $ EWhere $1 (reverse $4) } | expr 'where' 'v{' 'v}' { at ($1,$2) $ EWhere $1 [] } | expr 'where' 'v{' vdecls 'v}' { at ($1,$4) $ EWhere $1 (reverse $4) }+ | error {% expected "an expression" } ifBranches :: { [(Expr PName, Expr PName)] } : ifBranch { [$1] }@@ -392,13 +415,13 @@ expr10 :: { Expr PName } : aexprs { mkEApp $1 } - | '-' expr10 %prec NEG { at ($1,$2) $ EApp (at $1 (EVar (mkUnqual "negate"))) $2 }- | '~' expr10 { at ($1,$2) $ EApp (at $1 (EVar (mkUnqual "complement"))) $2 }+ | '-' expr10 %prec NEG { at ($1,$2) $ ENeg $2 }+ | '~' expr10 { at ($1,$2) $ EComplement $2 } qop :: { LPName } : op { $1 } | QOP { let Token (Op (Other ns i)) _ = thing $1- in mkQual (mkModName ns) (mkInfix (T.toStrict i)) A.<$ $1 }+ in mkQual (mkModName ns) (mkInfix i) A.<$ $1 } op :: { LPName } : pat_op { $1 }@@ -417,7 +440,7 @@ other_op :: { LPName } : OP { let Token (Op (Other [] str)) _ = thing $1- in mkUnqual (mkInfix (T.toStrict str)) A.<$ $1 }+ in mkUnqual (mkInfix str) A.<$ $1 } ops :: { [LPName] }@@ -516,7 +539,7 @@ : ipat ':' type { at ($1,$3) $ PTyped $1 $3 } | ipat { $1 } -ipat+ipat :: { Pattern PName } : ipat '#' ipat { at ($1,$3) $ PSplit $1 $3 } | apat { $1 } @@ -562,6 +585,7 @@ kind :: { Located Kind } : '#' { Located $1 KNum } | '*' { Located $1 KType }+ | kind '->' kind { combLoc KFun $1 $3 } schema_param :: { TParam PName } : ident {% mkTParam $1 Nothing }@@ -632,7 +656,7 @@ ident :: { Located Ident } : IDENT { let Token (Ident _ str) _ = thing $1- in $1 { thing = mkIdent (T.toStrict str) } }+ in $1 { thing = mkIdent str } } | 'x' { Located { srcRange = $1, thing = mkIdent "x" }} | 'private' { Located { srcRange = $1, thing = mkIdent "private" } } | 'as' { Located { srcRange = $1, thing = mkIdent "as" } }@@ -643,16 +667,21 @@ : ident { fmap mkUnqual $1 } -modName :: { Located ModName }- : ident { fmap identText $1 }+smodName :: { Located ModName }+ : ident { fmap (mkModName . (:[]) . identText) $1 } | QIDENT { let Token (Ident ns i) _ = thing $1 in mkModName (ns ++ [i]) A.<$ $1 } +modName :: { Located ModName }+ : smodName { $1 }+ | '`' smodName { fmap paramInstModName $2 }++ qname :: { Located PName } : name { $1 } | QIDENT { let Token (Ident ns i) _ = thing $1- in mkQual (mkModName ns) (mkIdent (T.toStrict i)) A.<$ $1 }+ in mkQual (mkModName ns) (mkIdent i) A.<$ $1 } help_name :: { Located PName } : qname { $1 }
src/Cryptol/Parser/AST.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.AST -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -15,6 +15,7 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE OverloadedStrings #-} module Cryptol.Parser.AST ( -- * Names Ident, mkIdent, mkInfix, isInfixIdent, nullIdent, identText@@ -28,7 +29,7 @@ , Schema(..) , TParam(..) , Kind(..)- , Type(..), tconNames+ , Type(..) , Prop(..) -- * Declarations@@ -39,15 +40,16 @@ , Fixity(..), defaultFixity , FixityCmp(..), compareFixity , TySyn(..)+ , PropSyn(..) , Bind(..) , BindDef(..), LBindDef , Pragma(..) , ExportType(..)- , ExportSpec(..), exportBind, exportType- , isExportedBind, isExportedType , TopLevel(..) , Import(..), ImportSpec(..) , Newtype(..)+ , ParameterType(..)+ , ParameterFun(..) -- * Interactive , ReplInput(..)@@ -69,18 +71,17 @@ , cppKind, ppSelector ) where +import Cryptol.Parser.Fixity import Cryptol.Parser.Name import Cryptol.Parser.Position-import Cryptol.Prims.Syntax (TFun(..))+import Cryptol.Parser.Selector+import Cryptol.TypeCheck.Type (TCon(..)) import Cryptol.Utils.Ident import Cryptol.Utils.PP-import Cryptol.Utils.Panic (panic) -import qualified Data.Set as Set import Data.List(intersperse) import Data.Bits(shiftR) import Data.Maybe (catMaybes)-import qualified Data.Map as Map import Numeric(showIntAtBase) import GHC.Generics (Generic)@@ -104,10 +105,14 @@ newtype Program name = Program [TopDecl name] deriving (Show) -data Module name = Module { mName :: Located ModName- , mImports :: [Located Import]- , mDecls :: [TopDecl name]- } deriving (Show, Generic, NFData)+-- | A parsed module.+data Module name = Module+ { mName :: Located ModName -- ^ Name of the module+ , mInstance :: !(Maybe (Located ModName)) -- ^ Functor to instantiate+ -- (if this is a functor instnaces)+ , mImports :: [Located Import] -- ^ Imports for the module+ , mDecls :: [TopDecl name] -- ^ Declartions for the module+ } deriving (Show, Generic, NFData) modRange :: Module name -> Range@@ -119,9 +124,14 @@ ] -data TopDecl name = Decl (TopLevel (Decl name))- | TDNewtype (TopLevel (Newtype name))- | Include (Located FilePath)+data TopDecl name =+ Decl (TopLevel (Decl name))+ | TDNewtype (TopLevel (Newtype name)) -- ^ @newtype T as = t+ | Include (Located FilePath) -- ^ @include File@+ | DParameterType (ParameterType name) -- ^ @parameter type T : #@+ | DParameterConstraint [Located (Prop name)]+ -- ^ @parameter type constraint (fin T)@+ | DParameterFun (ParameterFun name) -- ^ @parameter someVal : [256]@ deriving (Show, Generic, NFData) data Decl name = DSignature [Located name] (Schema name)@@ -130,9 +140,29 @@ | DBind (Bind name) | DPatBind (Pattern name) (Expr name) | DType (TySyn name)+ | DProp (PropSyn name) | DLocated (Decl name) Range- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) ++-- | A type parameter+data ParameterType name = ParameterType+ { ptName :: Located name -- ^ name of type parameter+ , ptKind :: Kind -- ^ kind of parameter+ , ptDoc :: Maybe String -- ^ optional documentation+ , ptFixity :: Maybe Fixity -- ^ info for infix use+ , ptNumber :: !Int -- ^ number of the parameter+ } deriving (Eq,Show,Generic,NFData)++-- | A value parameter+data ParameterFun name = ParameterFun+ { pfName :: Located name -- ^ name of value parameter+ , pfSchema :: Schema name -- ^ schema for parameter+ , pfDoc :: Maybe String -- ^ optional documentation+ , pfFixity :: Maybe Fixity -- ^ info for infix use+ } deriving (Eq,Show,Generic,NFData)++ -- | An import declaration. data Import = Import { iModule :: !ModName , iAs :: Maybe ModName@@ -149,8 +179,11 @@ deriving (Eq, Show, Generic, NFData) data TySyn n = TySyn (Located n) [TParam n] (Type n)- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) +data PropSyn n = PropSyn (Located n) [TParam n] [Prop n]+ deriving (Eq, Show, Generic, NFData, Functor)+ {- | Bindings. Notes: * The parser does not associate type signatures and pragmas with@@ -163,45 +196,23 @@ by the type checker. However, they are useful when de-sugaring patterns. -}-data Bind name = Bind { bName :: Located name -- ^ Defined thing- , bParams :: [Pattern name]-- ^ Parameters- , bDef :: Located (BindDef name) -- ^ Definition- , bSignature :: Maybe (Schema name) -- ^ Optional type sig- , bInfix :: Bool -- ^ Infix operator?- , bFixity :: Maybe Fixity -- ^ Optional fixity info- , bPragmas :: [Pragma] -- ^ Optional pragmas- , bMono :: Bool -- ^ Is this a monomorphic binding- , bDoc :: Maybe String -- ^ Optional doc string- } deriving (Eq, Show, Generic, NFData)+data Bind name = Bind+ { bName :: Located name -- ^ Defined thing+ , bParams :: [Pattern name] -- ^ Parameters+ , bDef :: Located (BindDef name) -- ^ Definition+ , bSignature :: Maybe (Schema name) -- ^ Optional type sig+ , bInfix :: Bool -- ^ Infix operator?+ , bFixity :: Maybe Fixity -- ^ Optional fixity info+ , bPragmas :: [Pragma] -- ^ Optional pragmas+ , bMono :: Bool -- ^ Is this a monomorphic binding+ , bDoc :: Maybe String -- ^ Optional doc string+ } deriving (Eq, Generic, NFData, Functor, Show) type LBindDef = Located (BindDef PName) data BindDef name = DPrim | DExpr (Expr name)- deriving (Eq, Show, Generic, NFData)--data Fixity = Fixity { fAssoc :: !Assoc- , fLevel :: !Int- } deriving (Eq, Show, Generic, NFData)--data FixityCmp = FCError- | FCLeft- | FCRight- deriving (Show,Eq)--compareFixity :: Fixity -> Fixity -> FixityCmp-compareFixity (Fixity a1 p1) (Fixity a2 p2) =- case compare p1 p2 of- GT -> FCLeft- LT -> FCRight- EQ -> case (a1,a2) of- (LeftAssoc,LeftAssoc) -> FCLeft- (RightAssoc,RightAssoc) -> FCRight- _ -> FCError---- | The fixity used when none is provided.-defaultFixity :: Fixity-defaultFixity = Fixity LeftAssoc 100+ deriving (Eq, Show, Generic, NFData, Functor) data Pragma = PragmaNote String | PragmaProperty@@ -223,42 +234,14 @@ | Private deriving (Eq, Show, Ord, Generic, NFData) +-- | A top-level module declaration. data TopLevel a = TopLevel { tlExport :: ExportType , tlDoc :: Maybe (Located String) , tlValue :: a } deriving (Show, Generic, NFData, Functor, Foldable, Traversable) -data ExportSpec name = ExportSpec { eTypes :: Set.Set name- , eBinds :: Set.Set name- } deriving (Show, Generic, NFData) -instance Ord name => Monoid (ExportSpec name) where- mempty = ExportSpec { eTypes = mempty, eBinds = mempty }- mappend l r = ExportSpec { eTypes = mappend (eTypes l) (eTypes r)- , eBinds = mappend (eBinds l) (eBinds r)- }---- | Add a binding name to the export list, if it should be exported.-exportBind :: Ord name => TopLevel name -> ExportSpec name-exportBind n- | tlExport n == Public = mempty { eBinds = Set.singleton (tlValue n) }- | otherwise = mempty---- | Check to see if a binding is exported.-isExportedBind :: Ord name => name -> ExportSpec name -> Bool-isExportedBind n = Set.member n . eBinds---- | Add a type synonym name to the export list, if it should be exported.-exportType :: Ord name => TopLevel name -> ExportSpec name-exportType n- | tlExport n == Public = mempty { eTypes = Set.singleton (tlValue n) }- | otherwise = mempty---- | Check to see if a type synonym is exported.-isExportedType :: Ord name => name -> ExportSpec name -> Bool-isExportedType n = Set.member n . eTypes- -- | Infromation about the representation of a numeric constant. data NumInfo = BinLit Int -- ^ n-digit binary literal | OctLit Int -- ^ n-digit octal literal@@ -275,6 +258,8 @@ data Expr n = EVar n -- ^ @ x @ | ELit Literal -- ^ @ 0x10 @+ | ENeg (Expr n) -- ^ @ -1 @+ | EComplement (Expr n) -- ^ @ ~1 @ | ETuple [Expr n] -- ^ @ (1,2,3) @ | ERecord [Named (Expr n)] -- ^ @ { x = 1, y = 2 } @ | ESel (Expr n) Selector -- ^ @ e.l @@@ -293,34 +278,15 @@ | EParens (Expr n) -- ^ @ (e) @ (Removed by Fixity) | EInfix (Expr n) (Located n) Fixity (Expr n)-- ^ @ a + b @ (Removed by Fixity)- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) data TypeInst name = NamedInst (Named (Type name)) | PosInst (Type name)- deriving (Eq, Show, Generic, NFData)--{- | Selectors are used for projecting from various components.-Each selector has an option spec to specify the shape of the thing-that is being selected. Currently, there is no surface syntax for-list selectors, but they are used during the desugaring of patterns.--}--data Selector = TupleSel Int (Maybe Int)- -- ^ Zero-based tuple selection.- -- Optionally specifies the shape of the tuple (one-based).-- | RecordSel Ident (Maybe [Ident])- -- ^ Record selection.- -- Optionally specifies the shape of the record.-- | ListSel Int (Maybe Int)- -- ^ List selection.- -- Optionally specifies the length of the list.- deriving (Eq, Show, Ord, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) data Match name = Match (Pattern name) (Expr name) -- ^ p <- e | MatchLet (Bind name)- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) data Pattern n = PVar (Located n) -- ^ @ x @ | PWild -- ^ @ _ @@@ -330,54 +296,64 @@ | PTyped (Pattern n) (Type n) -- ^ @ x : [8] @ | PSplit (Pattern n) (Pattern n)-- ^ @ (x # y) @ | PLocated (Pattern n) Range -- ^ Location information- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) data Named a = Named { name :: Located Ident, value :: a } deriving (Eq, Show, Foldable, Traversable, Generic, NFData, Functor) data Schema n = Forall [TParam n] [Prop n] (Type n) (Maybe Range)- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) -data Kind = KNum | KType+data Kind = KNum | KType | KFun Kind Kind deriving (Eq, Show, Generic, NFData) data TParam n = TParam { tpName :: n , tpKind :: Maybe Kind , tpRange :: Maybe Range }- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) data Type n = TFun (Type n) (Type n) -- ^ @[8] -> [8]@ | TSeq (Type n) (Type n) -- ^ @[8] a@ | TBit -- ^ @Bit@ | TNum Integer -- ^ @10@ | TChar Char -- ^ @'a'@- | TInf -- ^ @inf@ | TUser n [Type n] -- ^ A type variable or synonym- | TApp TFun [Type n] -- ^ @2 + x@++ | TApp TCon [Type n]+ -- ^ @2 + x@+ -- Note that the parser never produces these; instead it+ -- produces a "TUser" value. The "TApp" is introduced by+ -- the renamer when it spots built-in functions.+ -- XXX: We should just add primitive declarations for the+ -- built-in type functions, and simplify all this.++ | TRecord [Named (Type n)]-- ^ @{ x : [8], y : [32] }@ | TTuple [Type n] -- ^ @([8], [32])@ | TWild -- ^ @_@, just some type. | TLocated (Type n) Range -- ^ Location information | TParens (Type n) -- ^ @ (ty) @ | TInfix (Type n) (Located n) Fixity (Type n) -- ^ @ ty + ty @- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) -tconNames :: Map.Map PName (Type PName)-tconNames = Map.fromList- [ (mkUnqual (packIdent "Bit"), TBit)- , (mkUnqual (packIdent "inf"), TInf)- ] data Prop n = CFin (Type n) -- ^ @ fin x @ | CEqual (Type n) (Type n) -- ^ @ x == 10 @+ | CNeq (Type n) (Type n) -- ^ @ x != 10 @ | CGeq (Type n) (Type n) -- ^ @ x >= 10 @+ | CZero (Type n) -- ^ @ Zero a @+ | CLogic (Type n) -- ^ @ Logic a @ | CArith (Type n) -- ^ @ Arith a @ | CCmp (Type n) -- ^ @ Cmp a @+ | CSignedCmp (Type n) -- ^ @ SignedCmp a @+ | CLiteral (Type n) (Type n)-- ^ @ Literal val a @+ | CUser n [Type n] -- ^ Constraint synonym | CLocated (Prop n) Range -- ^ Location information | CType (Type n) -- ^ After parsing- deriving (Eq, Show, Generic, NFData)+ deriving (Eq, Show, Generic, NFData, Functor) + -------------------------------------------------------------------------------- -- Note: When an explicit location is missing, we could use the sub-components -- to try to estimate a location...@@ -467,7 +443,16 @@ Decl tld -> getLoc tld TDNewtype n -> getLoc n Include lfp -> getLoc lfp+ DParameterType d -> getLoc d+ DParameterFun d -> getLoc d+ DParameterConstraint d -> getLoc d +instance HasLoc (ParameterType name) where+ getLoc a = getLoc (ptName a)++instance HasLoc (ParameterFun name) where+ getLoc a = getLoc (pfName a)+ instance HasLoc (Module name) where getLoc m | null locs = Nothing@@ -517,7 +502,24 @@ Decl d -> pp d TDNewtype n -> pp n Include l -> text "include" <+> text (show (thing l))+ DParameterFun d -> pp d+ DParameterType d -> pp d+ DParameterConstraint d ->+ "parameter" <+> "type" <+> "constraint" <+> prop+ where prop = case map pp d of+ [x] -> x+ [] -> "()"+ xs -> parens (hsep (punctuate comma xs)) +instance (Show name, PPName name) => PP (ParameterType name) where+ ppPrec _ a = text "parameter" <+> text "type" <+>+ ppPrefixName (ptName a) <+> text ":" <+> pp (ptKind a)++instance (Show name, PPName name) => PP (ParameterFun name) where+ ppPrec _ a = text "parameter" <+> ppPrefixName (pfName a) <+> text ":"+ <+> pp (pfSchema a)++ instance (Show name, PPName name) => PP (Decl name) where ppPrec n decl = case decl of@@ -527,6 +529,7 @@ DFixity f ns -> ppFixity f ns DPragma xs p -> ppPragma xs p DType ts -> ppPrec n ts+ DProp ps -> ppPrec n ps DLocated d _ -> ppPrec n d ppFixity :: PPName name => Fixity -> [Located name] -> Doc@@ -579,7 +582,8 @@ lhsOp = case bParams b of [x,y] -> pp x <+> ppL f <+> pp y- _ -> panic "AST" [ "Malformed infix operator", show b ]+ xs -> parens (parens (ppL f) <+> fsep (map (ppPrec 0) xs))+ -- _ -> panic "AST" [ "Malformed infix operator", show b ] instance (Show name, PPName name) => PP (BindDef name) where@@ -590,6 +594,12 @@ instance PPName name => PP (TySyn name) where ppPrec _ (TySyn x xs t) = text "type" <+> ppL x <+> fsep (map (ppPrec 1) xs) <+> text "=" <+> pp t++instance PPName name => PP (PropSyn name) where+ ppPrec _ (PropSyn x xs ps) =+ text "constraint" <+> ppL x <+> fsep (map (ppPrec 1) xs)+ <+> text "=" <+> parens (commaSep (map pp ps))+ instance PP Literal where ppPrec _ lit = case lit of@@ -609,7 +619,7 @@ where pad base pref w = let txt = showIntAtBase base ("0123456789abcdef" !!) n ""- in text pref <> text (replicate (w - length txt) '0') <> text txt+ in text pref <.> text (replicate (w - length txt) '0') <.> text txt poly w = let (res,deg) = bits Nothing [] 0 n z | w == 0 = []@@ -619,10 +629,10 @@ polyTerm 0 = text "1" polyTerm 1 = text "x"- polyTerm p = text "x" <> text "^^" <> int p+ polyTerm p = text "x" <.> text "^^" <.> int p polyTerm0 0 = text "0"- polyTerm0 p = text "0" <> text "*" <> polyTerm p+ polyTerm0 p = text "0" <.> text "*" <.> polyTerm p bits d res p num | num == 0 = (res,d)@@ -660,22 +670,26 @@ -- atoms EVar x -> ppPrefixName x ELit x -> pp x++ ENeg x -> wrap n 3 (text "-" <.> ppPrec 4 x)+ EComplement x -> wrap n 3 (text "~" <.> ppPrec 4 x)+ ETuple es -> parens (commaSep (map pp es)) ERecord fs -> braces (commaSep (map (ppNamed "=") fs)) EList es -> brackets (commaSep (map pp es))- EFromTo e1 e2 e3 -> brackets (pp e1 <> step <+> text ".." <+> end)+ EFromTo e1 e2 e3 -> brackets (pp e1 <.> step <+> text ".." <+> end) where step = maybe empty (\e -> comma <+> pp e) e2 end = maybe empty pp e3- EInfFrom e1 e2 -> brackets (pp e1 <> step <+> text "...")+ EInfFrom e1 e2 -> brackets (pp e1 <.> step <+> text "...") where step = maybe empty (\e -> comma <+> pp e) e2 EComp e mss -> brackets (pp e <+> vcat (map arm mss)) where arm ms = text "|" <+> commaSep (map pp ms)- ETypeVal t -> text "`" <> ppPrec 5 t -- XXX- EAppT e ts -> ppPrec 4 e <> text "`" <> braces (commaSep (map pp ts))- ESel e l -> ppPrec 4 e <> text "." <> pp l+ ETypeVal t -> text "`" <.> ppPrec 5 t -- XXX+ EAppT e ts -> ppPrec 4 e <.> text "`" <.> braces (commaSep (map pp ts))+ ESel e l -> ppPrec 4 e <.> text "." <.> pp l -- low prec- EFun xs e -> wrap n 0 ((text "\\" <> hsep (map (ppPrec 3) xs)) <+>+ EFun xs e -> wrap n 0 ((text "\\" <.> hsep (map (ppPrec 3) xs)) <+> text "->" <+> pp e) EIf e1 e2 e3 -> wrap n 0 $ sep [ text "if" <+> pp e1@@ -708,31 +722,7 @@ return Infix { .. } isInfix _ = Nothing -instance PP Selector where- ppPrec _ sel =- case sel of- TupleSel x sig -> int x <+> ppSig tupleSig sig- RecordSel x sig -> pp x <+> ppSig recordSig sig- ListSel x sig -> int x <+> ppSig listSig sig - where- tupleSig n = int n- recordSig xs = braces $ fsep $ punctuate comma $ map pp xs- listSig n = int n-- ppSig f = maybe empty (\x -> text "/* of" <+> f x <+> text "*/")----- | Display the thing selected by the selector, nicely.-ppSelector :: Selector -> Doc-ppSelector sel =- case sel of- TupleSel x _ -> ordinal x <+> text "field"- RecordSel x _ -> text "field" <+> pp x- ListSel x _ -> ordinal x <+> text "element"--- instance PPName name => PP (Pattern name) where ppPrec n pat = case pat of@@ -762,11 +752,13 @@ instance PP Kind where ppPrec _ KType = text "*" ppPrec _ KNum = text "#"+ ppPrec n (KFun k1 k2) = wrap n 1 (ppPrec 1 k1 <+> "->" <+> ppPrec 0 k2) -- | "Conversational" printing of kinds (e.g., to use in error messages) cppKind :: Kind -> Doc-cppKind KType = text "a value type"-cppKind KNum = text "a numeric type"+cppKind KType = text "a value type"+cppKind KNum = text "a numeric type"+cppKind (KFun {}) = text "a type-constructor type" instance PPName name => PP (TParam name) where ppPrec n (TParam p Nothing _) = ppPrec n p@@ -783,12 +775,11 @@ TTuple ts -> parens $ commaSep $ map pp ts TRecord fs -> braces $ commaSep $ map (ppNamed ":") fs TBit -> text "Bit"- TInf -> text "inf" TNum x -> integer x TChar x -> text (show x) TSeq t1 TBit -> brackets (pp t1) TSeq t1 t2 -> optParens (n > 3)- $ brackets (pp t1) <> ppPrec 3 t2+ $ brackets (pp t1) <.> ppPrec 3 t2 _ | Just tinf <- isInfix ty -> optParens (n > 2)@@ -821,14 +812,20 @@ instance PPName name => PP (Prop name) where ppPrec n prop = case prop of- CFin t -> text "fin" <+> ppPrec 4 t- CArith t -> text "Arith" <+> ppPrec 4 t- CCmp t -> text "Cmp" <+> ppPrec 4 t- CEqual t1 t2 -> ppPrec 2 t1 <+> text "==" <+> ppPrec 2 t2- CGeq t1 t2 -> ppPrec 2 t1 <+> text ">=" <+> ppPrec 2 t2- CLocated c _ -> ppPrec n c-- CType t -> ppPrec n t+ CFin t -> text "fin" <+> ppPrec 4 t+ CZero t -> text "Zero" <+> ppPrec 4 t+ CLogic t -> text "Logic" <+> ppPrec 4 t+ CArith t -> text "Arith" <+> ppPrec 4 t+ CCmp t -> text "Cmp" <+> ppPrec 4 t+ CSignedCmp t -> text "SignedCmp" <+> ppPrec 4 t+ CLiteral t1 t2 -> text "Literal" <+> ppPrec 4 t1 <+> ppPrec 4 t2+ CEqual t1 t2 -> ppPrec 2 t1 <+> text "==" <+> ppPrec 2 t2+ CNeq t1 t2 -> ppPrec 2 t1 <+> text "!=" <+> ppPrec 2 t2+ CGeq t1 t2 -> ppPrec 2 t1 <+> text ">=" <+> ppPrec 2 t2+ CUser f ts -> optParens (n > 2)+ $ ppPrefixName f <+> fsep (map (ppPrec 4) ts)+ CLocated c _ -> ppPrec n c+ CType t -> ppPrec n t --------------------------------------------------------------------------------@@ -852,9 +849,10 @@ noPos (Program x) = Program (noPos x) instance NoPos (Module name) where- noPos m = Module { mName = mName m- , mImports = noPos (mImports m)- , mDecls = noPos (mDecls m)+ noPos m = Module { mName = mName m+ , mInstance = mInstance m+ , mImports = noPos (mImports m)+ , mDecls = noPos (mDecls m) } instance NoPos (TopDecl name) where@@ -863,7 +861,16 @@ Decl x -> Decl (noPos x) TDNewtype n -> TDNewtype(noPos n) Include x -> Include (noPos x)+ DParameterFun d -> DParameterFun (noPos d)+ DParameterType d -> DParameterType (noPos d)+ DParameterConstraint d -> DParameterConstraint (noPos d) +instance NoPos (ParameterType name) where+ noPos a = a++instance NoPos (ParameterFun x) where+ noPos x = x { pfSchema = noPos (pfSchema x) }+ instance NoPos a => NoPos (TopLevel a) where noPos tl = tl { tlValue = noPos (tlValue tl) } @@ -876,6 +883,7 @@ DFixity f ns -> DFixity f (noPos ns) DBind x -> DBind (noPos x) DType x -> DType (noPos x)+ DProp x -> DProp (noPos x) DLocated x _ -> noPos x instance NoPos (Newtype name) where@@ -902,15 +910,19 @@ - instance NoPos (TySyn name) where noPos (TySyn x y z) = TySyn (noPos x) (noPos y) (noPos z) +instance NoPos (PropSyn name) where+ noPos (PropSyn x y z) = PropSyn (noPos x) (noPos y) (noPos z)+ instance NoPos (Expr name) where noPos expr = case expr of EVar x -> EVar x ELit x -> ELit x+ ENeg x -> ENeg (noPos x)+ EComplement x -> EComplement (noPos x) ETuple x -> ETuple (noPos x) ERecord x -> ERecord (noPos x) ESel x y -> ESel (noPos x) y@@ -967,7 +979,6 @@ TFun x y -> TFun (noPos x) (noPos y) TSeq x y -> TSeq (noPos x) (noPos y) TBit -> TBit- TInf -> TInf TNum n -> TNum n TChar n -> TChar n TLocated x _ -> noPos x@@ -978,11 +989,15 @@ noPos prop = case prop of CEqual x y -> CEqual (noPos x) (noPos y)+ CNeq x y -> CNeq (noPos x) (noPos y) CGeq x y -> CGeq (noPos x) (noPos y) CFin x -> CFin (noPos x)+ CZero x -> CZero (noPos x)+ CLogic x -> CLogic (noPos x) CArith x -> CArith (noPos x) CCmp x -> CCmp (noPos x)+ CSignedCmp x -> CSignedCmp (noPos x)+ CLiteral x y -> CLiteral (noPos x) (noPos y)+ CUser x y -> CUser x (noPos y) CLocated c _ -> noPos c CType t -> CType (noPos t)--
+ src/Cryptol/Parser/Fixity.hs view
@@ -0,0 +1,46 @@+-- |+-- Module : Cryptol.Parser.Fixity+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable++{-# LANGUAGE Safe #-}++{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+module Cryptol.Parser.Fixity+ ( Fixity(..)+ , defaultFixity+ , FixityCmp(..)+ , compareFixity+ ) where++import Cryptol.Utils.PP (Assoc(..))++import GHC.Generics (Generic)+import Control.DeepSeq++data Fixity = Fixity { fAssoc :: !Assoc+ , fLevel :: !Int+ } deriving (Eq, Generic, NFData, Show)++data FixityCmp = FCError+ | FCLeft+ | FCRight+ deriving (Show, Eq)++compareFixity :: Fixity -> Fixity -> FixityCmp+compareFixity (Fixity a1 p1) (Fixity a2 p2) =+ case compare p1 p2 of+ GT -> FCLeft+ LT -> FCRight+ EQ -> case (a1, a2) of+ (LeftAssoc, LeftAssoc) -> FCLeft+ (RightAssoc, RightAssoc) -> FCRight+ _ -> FCError++-- | The fixity used when none is provided.+defaultFixity :: Fixity+defaultFixity = Fixity LeftAssoc 100
src/Cryptol/Parser/Lexer.x view
@@ -1,6 +1,6 @@ { -- |--- Module : $Header$+-- Module : Cryptol.Parser.Lexer -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -23,8 +23,8 @@ import Cryptol.Parser.Position import Cryptol.Parser.LexerUtils import Cryptol.Parser.Unlit(unLit)-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as Text+import Data.Text (Text)+import qualified Data.Text as Text } $uniupper = \x1@@ -41,14 +41,14 @@ @id = @id_first @id_next* @op = ([\!\#\$\%\&\*\+\-\.\/\:\<\=\>\?\@\\\^\|\~] | $unisymbol)+ -@qual = (@id $white* :: $white*)++@qual = (@id ::)+ @qual_id = @qual @id @qual_op = @qual @op -@num2 = "0b" [0-1]+-@num8 = "0o" [0-7]+-@num10 = [0-9]+-@num16 = "0x" [0-9A-Fa-f]++@num2 = "0b" (_*[0-1])++@num8 = "0o" (_*[0-7])++@num10 = [0-9](_*[0-9])*+@num16 = "0x" (_*[0-9A-Fa-f])+ @strPart = [^\\\"]+ @chrPart = [^\\\']+@@ -57,7 +57,8 @@ <0,comment> { \/\* { startComment False }-\/\*\*+ { startComment True }+\/\*\* { startComment True }+\/\*\*\*+ { startComment False } \/\*+\/ { startEndComment } } @@ -117,6 +118,8 @@ "infix" { emit $ KW KW_infix } "primitive" { emit $ KW KW_primitive }+"parameter" { emit $ KW KW_parameter }+"constraint" { emit $ KW KW_constraint } @num2 { emitS (numToken 2 . Text.drop 2) } @num8 { emitS (numToken 8 . Text.drop 2) }
src/Cryptol/Parser/LexerUtils.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.LexerUtils -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -19,8 +19,8 @@ import Data.Char(toLower,generalCategory,isAscii,ord,isSpace) import qualified Data.Char as Char-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as T+import Data.Text(Text)+import qualified Data.Text as T import Data.Word(Word8) import GHC.Generics (Generic)@@ -214,8 +214,9 @@ -------------------------------------------------------------------------------- numToken :: Integer -> Text -> TokenT-numToken rad ds = Num (toVal ds) (fromInteger rad) (fromIntegral (T.length ds))+numToken rad ds = Num (toVal ds') (fromInteger rad) (fromIntegral (T.length ds')) where+ ds' = T.filter (/= '_') ds toVal = T.foldl' (\x c -> rad * x + fromDigit c) 0 fromDigit :: Char -> Integer@@ -260,9 +261,10 @@ isExplicit Virtual{} = False startsLayout :: TokenT -> Bool-startsLayout (KW KW_where) = True-startsLayout (KW KW_private) = True-startsLayout _ = False+startsLayout (KW KW_where) = True+startsLayout (KW KW_private) = True+startsLayout (KW KW_parameter) = True+startsLayout _ = False -- Add separators computed from layout layout :: Config -> [Located Token] -> [Located Token]@@ -358,11 +360,7 @@ data TokenW = BlockComment | LineComment | Space | DocStr deriving (Eq, Show, Generic, NFData) -data TokenKW = KW_Arith- | KW_Bit- | KW_Cmp- | KW_else- | KW_Eq+data TokenKW = KW_else | KW_extern | KW_fin | KW_if@@ -390,6 +388,8 @@ | KW_infixr | KW_infix | KW_primitive+ | KW_parameter+ | KW_constraint deriving (Eq, Show, Generic, NFData) -- | The named operators are a special case for parsing types, and 'Other' is
src/Cryptol/Parser/Name.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.Name -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -15,7 +15,6 @@ import Cryptol.Utils.Panic (panic) import Control.DeepSeq-import qualified Data.Text as T import GHC.Generics (Generic) @@ -51,12 +50,18 @@ getIdent :: PName -> Ident getIdent (UnQual n) = n getIdent (Qual _ n) = n-getIdent (NewName p i) = Ident False (T.pack ("__" ++ pass ++ show i))+getIdent (NewName p i) = packIdent ("__" ++ pass ++ show i) where pass = case p of NoPat -> "p" MonoValues -> "mv" +isGeneratedName :: PName -> Bool+isGeneratedName x =+ case x of+ NewName {} -> True+ _ -> False+ instance PP PName where ppPrec _ = ppPrefixName @@ -67,18 +72,18 @@ where i = getIdent n - ppPrefixName n = optParens (isInfixIdent i) (pfx <> pp i)+ ppPrefixName n = optParens (isInfixIdent i) (pfx <.> pp i) where i = getIdent n pfx = case getModName n of- Just ns -> pp ns <> text "::"+ Just ns -> pp ns <.> text "::" Nothing -> empty ppInfixName n- | isInfixIdent i = pfx <> pp i+ | isInfixIdent i = pfx <.> pp i | otherwise = panic "AST" [ "non-symbol infix name:" ++ show n ] where i = getIdent n pfx = case getModName n of- Just ns -> pp ns <> text "::"+ Just ns -> pp ns <.> text "::" Nothing -> empty
src/Cryptol/Parser/Names.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.Names -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -15,19 +15,8 @@ import Data.Set (Set) import qualified Data.Set as Set-import Data.Foldable (fold) -modExports :: Ord name => Module name -> ExportSpec name-modExports m = fold (concat [ exportedNames d | d <- mDecls m ])- where- names by td = [ td { tlValue = thing n } | n <- fst (by (tlValue td)) ]-- exportedNames (Decl td) = map exportBind (names namesD td)- ++ map exportType (names tnamesD td)- exportedNames (TDNewtype nt) = map exportType (names tnamesNT nt)- exportedNames (Include {}) = []- -- | The names defined by a newtype. tnamesNT :: Newtype name -> ([Located name], ()) tnamesNT x = ([ nName x ], ())@@ -49,6 +38,7 @@ DFixity{} -> ([],Set.empty) DPragma {} -> ([],Set.empty) DType {} -> ([],Set.empty)+ DProp {} -> ([],Set.empty) DLocated d _ -> namesD d -- | The names defined and used by a single declarations in such a way@@ -64,11 +54,15 @@ DFixity _ ns -> ns DPragma ns _ -> ns DType ts -> [tsName ts]+ DProp ps -> [psName ps] DLocated d _ -> allNamesD d tsName :: TySyn name -> Located name tsName (TySyn lqn _ _) = lqn +psName :: PropSyn name -> Located name+psName (PropSyn lqn _ _) = lqn+ -- | The names defined and used by a single binding. namesB :: Ord name => Bind name -> ([Located name], Set name) namesB b = ([bName b], boundNames (namesPs (bParams b)) (namesDef (thing (bDef b))))@@ -85,6 +79,8 @@ case expr of EVar x -> Set.singleton x ELit _ -> Set.empty+ ENeg e -> namesE e+ EComplement e -> namesE e ETuple es -> Set.unions (map namesE es) ERecord fs -> Set.unions (map (namesE . value) fs) ESel e _ -> namesE e@@ -155,7 +151,6 @@ TBit -> Set.empty TNum _ -> Set.empty TChar _ -> Set.empty- TInf -> Set.empty TApp _ ts -> Set.unions (map go ts) TTuple ts -> Set.unions (map go ts) TRecord fs -> Set.unions (map (go . value) fs)@@ -167,6 +162,24 @@ TParens t -> namesT vs t TInfix a _ _ b-> Set.union (namesT vs a) (namesT vs b) +-- | Given the set of type variables that are in scope,+-- compute the type/constraint synonyms used by a prop.+namesC :: Ord name => Set name -> Prop name -> Set name+namesC vs prop =+ case prop of+ CFin t -> namesT vs t+ CEqual t1 t2 -> Set.union (namesT vs t1) (namesT vs t2)+ CNeq t1 t2 -> Set.union (namesT vs t1) (namesT vs t2)+ CGeq t1 t2 -> Set.union (namesT vs t1) (namesT vs t2)+ CZero t -> namesT vs t+ CLogic t -> namesT vs t+ CArith t -> namesT vs t+ CCmp t -> namesT vs t+ CSignedCmp t -> namesT vs t+ CLiteral t1 t2-> Set.union (namesT vs t1) (namesT vs t2)+ CUser x ts -> Set.insert x (Set.unions (map (namesT vs) ts))+ CLocated p _ -> namesC vs p+ CType t -> namesT vs t -- | The type names defined and used by a group of mutually recursive declarations. tnamesDs :: Ord name => [Decl name] -> ([Located name], Set name)@@ -186,6 +199,9 @@ DPatBind _ e -> ([], tnamesE e) DLocated d _ -> tnamesD d DType (TySyn n ps t) -> ([n], Set.difference (tnamesT t) (Set.fromList (map tpName ps)))+ DProp (PropSyn n ps cs)+ -> ([n], Set.difference (Set.unions (map tnamesC cs))+ (Set.fromList (map tpName ps))) -- | The type names used by a single binding. tnamesB :: Ord name => Bind name -> Set name@@ -205,6 +221,8 @@ case expr of EVar _ -> Set.empty ELit _ -> Set.empty+ ENeg e -> tnamesE e+ EComplement e -> tnamesE e ETuple es -> Set.unions (map tnamesE es) ERecord fs -> Set.unions (map (tnamesE . value) fs) ESel e _ -> tnamesE e@@ -258,13 +276,19 @@ tnamesC :: Ord name => Prop name -> Set name tnamesC prop = case prop of- CFin t -> tnamesT t- CEqual t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)- CGeq t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)- CArith t -> tnamesT t- CCmp t -> tnamesT t- CLocated p _ -> tnamesC p- CType t -> tnamesT t+ CFin t -> tnamesT t+ CEqual t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)+ CNeq t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)+ CGeq t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)+ CZero t -> tnamesT t+ CLogic t -> tnamesT t+ CArith t -> tnamesT t+ CCmp t -> tnamesT t+ CSignedCmp t -> tnamesT t+ CLiteral t1 t2 -> Set.union (tnamesT t1) (tnamesT t2)+ CUser x ts -> Set.insert x (Set.unions (map tnamesT ts))+ CLocated p _ -> tnamesC p+ CType t -> tnamesT t -- | Compute the type synonyms/type variables used by a type. tnamesT :: Ord name => Type name -> Set name@@ -276,7 +300,6 @@ TBit -> Set.empty TNum _ -> Set.empty TChar __ -> Set.empty- TInf -> Set.empty TApp _ ts -> Set.unions (map tnamesT ts) TTuple ts -> Set.unions (map tnamesT ts) TRecord fs -> Set.unions (map (tnamesT . value) fs)
src/Cryptol/Parser/NoInclude.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.NoInclude -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -18,8 +18,8 @@ import Control.DeepSeq import qualified Control.Exception as X import Data.Either (partitionEithers)-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy.IO as T+import Data.Text(Text)+import qualified Data.Text.IO as T import GHC.Generics (Generic) import MonadLib import System.Directory (makeAbsolute)@@ -44,7 +44,7 @@ ppIncludeError :: IncludeError -> Doc ppIncludeError ie = case ie of - IncludeFailed lp -> (char '`' <> text (thing lp) <> char '`')+ IncludeFailed lp -> (char '`' <.> text (thing lp) <.> char '`') <+> text "included at" <+> pp (srcRange lp) <+> text "was not found"@@ -156,6 +156,9 @@ noIncTopDecl td = case td of Decl _ -> return [td] TDNewtype _-> return [td]+ DParameterType {} -> return [td]+ DParameterConstraint {} -> return [td]+ DParameterFun {} -> return [td] Include lf -> resolveInclude lf -- | Resolve the file referenced by a include into a list of top-level
src/Cryptol/Parser/NoPat.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.NoPat -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -27,7 +27,6 @@ import MonadLib hiding (mapM) import Data.Maybe(maybeToList)-import Data.Either(partitionEithers) import qualified Data.Map as Map import GHC.Generics (Generic)@@ -67,7 +66,7 @@ -- | Given a pattern, transform it into a simple pattern and a set of bindings. -- Simple patterns may only contain variables and type annotations. --- XXX: We can replace the types in the selcetors with annotations on the bindings.+-- XXX: We can replace the types in the selectors with annotations on the bindings. noPat :: Pattern PName -> NoPatM (Pattern PName, [Bind PName]) noPat pat = case pat of@@ -148,6 +147,8 @@ case expr of EVar {} -> return expr ELit {} -> return expr+ ENeg e -> ENeg <$> noPatE e+ EComplement e -> EComplement <$> noPatE e ETuple es -> ETuple <$> mapM noPatE es ERecord es -> ERecord <$> mapM noPatF es ESel e s -> ESel <$> noPatE e <*> return s@@ -228,6 +229,7 @@ , bDoc = Nothing } : map DBind bs DType {} -> return [decl]+ DProp {} -> return [decl] DLocated d r1 -> do bs <- inRange r1 $ noMatchD d return $ map (`DLocated` r1) bs@@ -254,19 +256,20 @@ return ds2 -noPatTopDs :: [TopLevel (Decl PName)] -> NoPatM [TopLevel (Decl PName)]+++noPatTopDs :: [TopDecl PName] -> NoPatM [TopDecl PName] noPatTopDs tds =- do noPatGroups <- mapM (noMatchD . tlValue) tds+ do desugared <- concat <$> mapM desugar tds - let allDecls = concat noPatGroups+ let allDecls = map tlValue (decls desugared) pragmaMap = Map.fromListWith (++) $ concatMap toPragma allDecls sigMap = Map.fromListWith (++) $ concatMap toSig allDecls fixMap = Map.fromListWith (++) $ concatMap toFixity allDecls- docMap = Map.fromListWith (++) $ concatMap toDocs tds+ docMap = Map.fromListWith (++) $ concatMap toDocs (decls tds) - let exportGroups = zipWith (\ td ds -> td { tlValue = ds }) tds noPatGroups (tds', (pMap,sMap,fMap,_)) <- runStateT (pragmaMap,sigMap,fixMap,docMap)- (annotTopDs exportGroups)+ (annotTopDs desugared) forM_ (Map.toList pMap) $ \(n,ps) -> forM_ ps $ \p -> recordError $ PragmaNoBind (p { thing = n }) (thing p)@@ -281,27 +284,23 @@ return tds' + where+ decls xs = [ d | Decl d <- xs ] -noPatProg :: Program PName -> NoPatM (Program PName)-noPatProg (Program topDs) =- do let (ds, others) = partitionEithers (map isDecl topDs)- ds1 <- noPatTopDs ds- return $ Program $ others ++ map Decl ds1+ desugar d =+ case d of+ Decl tl -> do ds <- noMatchD (tlValue tl)+ return [ Decl tl { tlValue = d1 } | d1 <- ds ]+ x -> return [x] - where- isDecl (Decl d) = Left d- isDecl d = Right d +noPatProg :: Program PName -> NoPatM (Program PName)+noPatProg (Program topDs) = Program <$> noPatTopDs topDs+ noPatModule :: Module PName -> NoPatM (Module PName) noPatModule m =- do let (ds, others) = partitionEithers (map isDecl (mDecls m))- ds1 <- noPatTopDs ds- return m { mDecls = others ++ map Decl ds1 }-- where- isDecl (Decl d) = Left d- isDecl d = Right d-+ do ds1 <- noPatTopDs (mDecls m)+ return m { mDecls = ds1 } -------------------------------------------------------------------------------- @@ -317,18 +316,37 @@ -- export specifications, this will favor the specification of the binding. -- This is most likely the intended behavior, so it's probably fine, but it does -- smell a bit.-annotTopDs :: [TopLevel [Decl PName]]- -> StateT AnnotMap NoPatM [TopLevel (Decl PName)]+annotTopDs :: [TopDecl PName] -> StateT AnnotMap NoPatM [TopDecl PName] annotTopDs tds = case tds of - (ds:dss) ->- do ds' <- annotDs (tlValue ds)- rest <- annotTopDs dss- if null ds'- then return rest- else return ([ ds { tlValue = d } | d <- ds' ] ++ rest)+ d : ds ->+ case d of+ Decl d1 ->+ do ignore <- runExceptionT (annotD (tlValue d1))+ case ignore of+ Left _ -> annotTopDs ds+ Right d2 -> (Decl (d1 { tlValue = d2 }) :) <$> annotTopDs ds + -- XXX: Add fixity once we support type-level fixities+ DParameterType {} -> (d :) <$> annotTopDs ds+ DParameterConstraint {} -> (d :) <$> annotTopDs ds+ DParameterFun p ->+ do (ps,ss,fs,ds') <- get+ let rm _ _ = Nothing+ name = thing (pfName p)+ case Map.updateLookupWithKey rm name fs of+ (Nothing,_) -> (d :) <$> annotTopDs ds+ (Just f,fs1) ->+ do mbF <- lift (checkFixs name f)+ set (ps,ss,fs1,ds')+ let p1 = p { pfFixity = mbF }+ (DParameterFun p1 :) <$> annotTopDs ds++ -- XXX: we may want to add pragmas to newtypes?+ TDNewtype {} -> (d :) <$> annotTopDs ds+ Include {} -> (d :) <$> annotTopDs ds+ [] -> return [] @@ -352,6 +370,7 @@ DPragma {} -> raise () DPatBind {} -> raise () DType {} -> return decl+ DProp {} -> return decl DLocated d r -> (`DLocated` r) <$> annotD d -- | Add pragma/signature annotations to a binding.@@ -433,6 +452,7 @@ -- XXX revisit these DPragma _ _ -> [] DType _ -> []+ DProp _ -> [] --------------------------------------------------------------------------------@@ -491,12 +511,12 @@ $$ nest 2 (vcat (map pp ss)) SignatureNoBind x s ->- text "At" <+> pp (srcRange x) <> colon <+>+ text "At" <+> pp (srcRange x) <.> colon <+> text "Type signature without a matching binding:" $$ nest 2 (pp s) PragmaNoBind x s ->- text "At" <+> pp (srcRange x) <> colon <+>+ text "At" <+> pp (srcRange x) <.> colon <+> text "Pragma without a matching binding:" $$ nest 2 (pp s) @@ -505,7 +525,7 @@ $$ nest 2 (vcat (map pp locs)) FixityNoBind n ->- text "At" <+> pp (srcRange n) <> colon <+>+ text "At" <+> pp (srcRange n) <.> colon <+> text "Fixity declaration without a matching binding for:" <+> pp (thing n)
src/Cryptol/Parser/ParserUtils.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.ParserUtils -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -12,21 +12,22 @@ {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE PatternGuards #-}+{-# LANGUAGE OverloadedStrings #-} module Cryptol.Parser.ParserUtils where import Cryptol.Parser.AST import Cryptol.Parser.Lexer import Cryptol.Parser.Position import Cryptol.Parser.Utils (translateExprToNumT,widthIdent)+import Cryptol.Utils.Ident(packModName) import Cryptol.Utils.PP import Cryptol.Utils.Panic -import Data.Maybe(listToMaybe,fromMaybe)+import Data.Maybe(fromMaybe) import Data.Bits(testBit,setBit) import Control.Monad(liftM,ap,unless)-import qualified Data.Text as S-import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as T+import Data.Text(Text)+import qualified Data.Text as T import GHC.Generics (Generic)@@ -39,62 +40,93 @@ parseString cfg p cs = parse cfg p (T.pack cs) parse :: Config -> ParseM a -> Text -> Either ParseError a-parse cfg p cs = case unP p cfg eofPos (S toks) of+parse cfg p cs = case unP p cfg eofPos S { sPrevTok = Nothing+ , sTokens = toks+ , sNextTyParamNum = 0+ } of Left err -> Left err Right (a,_) -> Right a where (toks,eofPos) = lexer cfg cs {- The parser is parameterized by the pozition of the final token. -}-data ParseM a = P { unP :: Config -> Position -> S -> Either ParseError (a,S) }+newtype ParseM a =+ P { unP :: Config -> Position -> S -> Either ParseError (a,S) } lexerP :: (Located Token -> ParseM a) -> ParseM a-lexerP k = P $ \cfg p (S ts) ->- case ts of+lexerP k = P $ \cfg p s ->+ case sTokens s of t : _ | Err e <- tokenType it -> Left $ HappyErrorMsg (srcRange t) $ case e of UnterminatedComment -> "unterminated comment" UnterminatedString -> "unterminated string" UnterminatedChar -> "unterminated character"- InvalidString -> "invalid string literal: " ++ T.unpack (tokenText it)- InvalidChar -> "invalid character literal: " ++ T.unpack (tokenText it)- LexicalError -> "unrecognized character: " ++ T.unpack (tokenText it)+ InvalidString -> "invalid string literal:" +++ T.unpack (tokenText it)+ InvalidChar -> "invalid character literal:" +++ T.unpack (tokenText it)+ LexicalError -> "unrecognized character:" +++ T.unpack (tokenText it) where it = thing t - t : more -> unP (k t) cfg p (S more)- [] -> Left (HappyError (cfgSource cfg) p Nothing)+ t : more -> unP (k t) cfg p s { sPrevTok = Just t, sTokens = more }+ [] -> Left (HappyOutOfTokens (cfgSource cfg) p) -data ParseError = HappyError FilePath Position (Maybe Token)+data ParseError = HappyError FilePath {- Name of source file -}+ (Located Token) {- Offending token -} | HappyErrorMsg Range String+ | HappyUnexpected FilePath (Maybe (Located Token)) String+ | HappyOutOfTokens FilePath Position deriving (Show, Generic, NFData) -newtype S = S [Located Token]--instance PP ParseError where- ppPrec _ (HappyError _ _ tok) = case tok of- Nothing -> text "end of input"- Just t -> pp t- ppPrec _ (HappyErrorMsg _ x) = text x+data S = S { sPrevTok :: Maybe (Located Token)+ , sTokens :: [Located Token]+ , sNextTyParamNum :: !Int+ -- ^ Keep track of the type parameters as they appear in the input+ } ppError :: ParseError -> Doc-ppError (HappyError path pos (Just tok))- | Err _ <- tokenType tok = text "Parse error at" <+>- text path <> char ':' <> pp pos <> comma <+>- pp tok-ppError e@(HappyError path pos _) =- text "Parse error at" <+>- text path <> char ':' <> pp pos <> comma <+>- text "unexpected" <+> pp e++ppError (HappyError path ltok)+ | Err _ <- tokenType tok =+ text "Parse error at" <+>+ text path <.> char ':' <.> pp pos <.> comma <+>+ pp tok++ | White DocStr <- tokenType tok =+ "Unexpected documentation (/**) comment at" <+>+ text path <.> char ':' <.> pp pos <.> colon $$+ nest 2+ "Documentation comments need to be followed by something to document."++ | otherwise =+ text "Parse error at" <+>+ text path <.> char ':' <.> pp pos <.> comma $$+ nest 2 (text "unexpected:" <+> pp tok)+ where+ pos = from (srcRange ltok)+ tok = thing ltok++ppError (HappyOutOfTokens path pos) =+ text "Unexpected end of file at:" <+>+ text path <.> char ':' <.> pp pos+ ppError (HappyErrorMsg p x) = text "Parse error at" <+> pp p $$ nest 2 (text x) -instance Monad ParseM where- return a = P (\_ _ s -> Right (a,s))- fail s = panic "[Parser] fail" [s]- m >>= k = P (\cfg p s1 -> case unP m cfg p s1 of- Left e -> Left e- Right (a,s2) -> unP (k a) cfg p s2)+ppError (HappyUnexpected path ltok e) =+ text "Parse error at" <+>+ text path <.> char ':' <.> pp pos <.> comma $$+ nest 2 unexp $$+ nest 2 ("expected:" <+> text e)+ where+ (unexp,pos) =+ case ltok of+ Nothing -> (empty,start)+ Just t -> ( "unexpected:" <+> text (T.unpack (tokenText (thing t)))+ , from (srcRange t)+ ) instance Functor ParseM where fmap = liftM@@ -103,11 +135,19 @@ pure = return (<*>) = ap +instance Monad ParseM where+ return a = P (\_ _ s -> Right (a,s))+ fail s = panic "[Parser] fail" [s]+ m >>= k = P (\cfg p s1 -> case unP m cfg p s1 of+ Left e -> Left e+ Right (a,s2) -> unP (k a) cfg p s2)+ happyError :: ParseM a-happyError = P $ \cfg p (S ls) ->- Left $ case listToMaybe ls of- Nothing -> HappyError (cfgSource cfg) p Nothing- Just l -> HappyError (cfgSource cfg) (from (srcRange l)) (Just (thing l))+happyError = P $ \cfg _ s ->+ case sPrevTok s of+ Just t -> Left (HappyError (cfgSource cfg) t)+ Nothing ->+ Left (HappyErrorMsg emptyRange "Parse error at the beginning of the file") errorMessage :: Range -> String -> ParseM a errorMessage r x = P $ \_ _ _ -> Left (HappyErrorMsg r x)@@ -115,16 +155,28 @@ customError :: String -> Located Token -> ParseM a customError x t = P $ \_ _ _ -> Left (HappyErrorMsg (srcRange t) x) -mkModName :: [T.Text] -> ModName-mkModName strs = T.toStrict (T.intercalate (T.pack "::") strs)+expected :: String -> ParseM a+expected x = P $ \cfg _ s ->+ Left (HappyUnexpected (cfgSource cfg) (sPrevTok s) x) +++++++++mkModName :: [Text] -> ModName+mkModName = packModName+ -- Note that type variables are not resolved at this point: they are tcons. mkSchema :: [TParam PName] -> [Prop PName] -> Type PName -> Schema PName mkSchema xs ps t = Forall xs ps t Nothing getName :: Located Token -> PName getName l = case thing l of- Token (Ident [] x) _ -> mkUnqual (mkIdent (T.toStrict x))+ Token (Ident [] x) _ -> mkUnqual (mkIdent x) _ -> panic "[Parser] getName" ["not an Ident:", show l] getNum :: Located Token -> Integer@@ -185,7 +237,6 @@ TBit -> bad "Type bit" TNum {} -> ok TChar {} -> ok- TInf -> bad "Infinity type" TWild -> bad "Wildcard types" TUser {} -> ok TApp {} -> ok@@ -257,7 +308,7 @@ -- It is used to represent anonymous type applications. anonRecord :: Maybe Range -> [Type PName] -> Type PName anonRecord ~(Just r) ts = TRecord (map toField ts)- where noName = Located { srcRange = r, thing = mkIdent (S.pack "") }+ where noName = Located { srcRange = r, thing = mkIdent (T.pack "") } toField t = Named { name = noName, value = t } exportDecl :: Maybe (Located String) -> ExportType -> Decl PName -> TopDecl PName@@ -265,17 +316,47 @@ , tlDoc = mbDoc , tlValue = d } -exportNewtype :: ExportType -> Newtype PName -> TopDecl PName-exportNewtype e n = TDNewtype TopLevel { tlExport = e- , tlDoc = Nothing- , tlValue = n }+exportNewtype :: ExportType -> Maybe (Located String) -> Newtype PName ->+ TopDecl PName+exportNewtype e d n = TDNewtype TopLevel { tlExport = e+ , tlDoc = d+ , tlValue = n } +mkParFun :: Maybe (Located String) ->+ Located PName ->+ Schema PName ->+ TopDecl PName+mkParFun mbDoc n s = DParameterFun ParameterFun { pfName = n+ , pfSchema = s+ , pfDoc = thing <$> mbDoc+ , pfFixity = Nothing+ }++mkParType :: Maybe (Located String) ->+ Located PName ->+ Located Kind ->+ ParseM (TopDecl PName)+mkParType mbDoc n k =+ do num <- P $ \_ _ s -> let nu = sNextTyParamNum s+ in Right (nu, s { sNextTyParamNum = nu + 1 })+ return (DParameterType+ ParameterType { ptName = n+ , ptKind = thing k+ , ptDoc = thing <$> mbDoc+ , ptFixity = Nothing+ , ptNumber = num+ })+ changeExport :: ExportType -> [TopDecl PName] -> [TopDecl PName] changeExport e = map change where change (Decl d) = Decl d { tlExport = e } change (TDNewtype n) = TDNewtype n { tlExport = e } change td@Include{} = td+ change (DParameterType {}) = panic "changeExport" ["private type parameter?"]+ change (DParameterFun {}) = panic "changeExport" ["private value parameter?"]+ change (DParameterConstraint {}) =+ panic "changeExport" ["private type constraint parameter?"] mkTypeInst :: Named (Type PName) -> TypeInst PName mkTypeInst x | nullIdent (thing (name x)) = PosInst (value x)@@ -295,6 +376,14 @@ | otherwise = return $ DType $ TySyn ln ps b +mkPropSyn :: Located PName -> [TParam PName] -> Type PName -> ParseM (Decl PName)+mkPropSyn ln ps b+ | getIdent (thing ln) == widthIdent =+ errorMessage (srcRange ln) "`width` is not a valid constraint synonym name."++ | otherwise =+ DProp . PropSyn ln ps . thing <$> mkProp b+ polyTerm :: Range -> Integer -> Integer -> ParseM (Bool, Integer) polyTerm rng k p | k == 0 = return (False, p)@@ -321,7 +410,7 @@ mkProperty :: LPName -> [Pattern PName] -> Expr PName -> Decl PName mkProperty f ps e = DBind Bind { bName = f , bParams = reverse ps- , bDef = at e (Located emptyRange (DExpr (ETyped e TBit)))+ , bDef = at e (Located emptyRange (DExpr e)) , bSignature = Nothing , bPragmas = [PragmaProperty] , bMono = False@@ -369,19 +458,25 @@ $ dropPrefix $ trimFront $ T.lines- $ T.dropWhileEnd (`elem` "/* \r\n\t")+ $ T.dropWhileEnd commentChar $ thing ltxt + commentChar :: Char -> Bool+ commentChar x = x `elem` ("/* \r\n\t" :: String)++ prefixDroppable x = x `elem` ("* \r\n\t" :: String)+ trimFront [] = [] trimFront (l:ls)- | T.all (`elem` "/* \r\n\t") l = ls- | otherwise = T.dropWhile (`elem` "/* ") l : ls+ | T.all commentChar l = ls+ | otherwise = T.dropWhile commentChar l : ls dropPrefix [] = []- dropPrefix [t] = [T.dropWhile (`elem` "/* ") t]+ dropPrefix [t] = [T.dropWhile commentChar t] dropPrefix ts@(l:ls) = case T.uncons l of- Just (c,_) | all (commonPrefix c) ls -> dropPrefix (map (T.drop 1) ts)+ Just (c,_) | prefixDroppable c &&+ all (commonPrefix c) ls -> dropPrefix (map (T.drop 1) ts) _ -> ts where@@ -391,6 +486,11 @@ Nothing -> False +distrLoc :: Located [a] -> [Located a]+distrLoc x = [ Located { srcRange = r, thing = a } | a <- thing x ]+ where r = srcRange x++ mkProp :: Type PName -> ParseM (Located [Prop PName]) mkProp ty = case ty of@@ -415,7 +515,6 @@ TBit{} -> err TNum{} -> err TChar{} -> err- TInf{} -> err TWild -> err TRecord{} -> err @@ -428,14 +527,52 @@ -- these can be translated right away prefixProp r f xs- | i == arithIdent, [x] <- xs = return [CLocated (CArith x) r]- | i == finIdent, [x] <- xs = return [CLocated (CFin x) r]- | i == cmpIdent, [x] <- xs = return [CLocated (CCmp x) r]- | otherwise = errorMessage r "Invalid constraint"+ | i == zeroIdent, [x] <- xs = return [CLocated (CZero x) r]+ | i == logicIdent, [x] <- xs = return [CLocated (CLogic x) r]+ | i == arithIdent, [x] <- xs = return [CLocated (CArith x) r]+ | i == finIdent, [x] <- xs = return [CLocated (CFin x) r]+ | i == cmpIdent, [x] <- xs = return [CLocated (CCmp x) r]+ | i == signedCmpIdent, [x] <- xs = return [CLocated (CSignedCmp x) r]+ | i == literalIdent, [x,y] <- xs = return [CLocated (CLiteral x y) r]+ | otherwise = return [CLocated (CType (TUser f xs)) r] where i = getIdent f -arithIdent, finIdent, cmpIdent :: Ident-arithIdent = mkIdent (S.pack "Arith")-finIdent = mkIdent (S.pack "fin")-cmpIdent = mkIdent (S.pack "Cmp")+zeroIdent, logicIdent, arithIdent, finIdent, cmpIdent, signedCmpIdent, literalIdent :: Ident+zeroIdent = mkIdent "Zero"+logicIdent = mkIdent "Logic"+arithIdent = mkIdent "Arith"+finIdent = mkIdent "fin"+cmpIdent = mkIdent "Cmp"+signedCmpIdent = mkIdent "SignedCmp"+literalIdent = mkIdent "Literal"++-- | Make an ordinary module+mkModule :: Located ModName ->+ ([Located Import], [TopDecl PName]) ->+ Module PName+mkModule nm (is,ds) = Module { mName = nm+ , mInstance = Nothing+ , mImports = is+ , mDecls = ds+ }++-- | Make an unnamed module---gets the name @Main@.+mkAnonymousModule :: ([Located Import], [TopDecl PName]) ->+ Module PName+mkAnonymousModule = mkModule Located { srcRange = emptyRange+ , thing = mkModName [T.pack "Main"]+ }++-- | Make a module which defines a functor instance.+mkModuleInstance :: Located ModName ->+ Located ModName ->+ ([Located Import], [TopDecl PName]) ->+ Module PName+mkModuleInstance nm fun (is,ds) =+ Module { mName = nm+ , mInstance = Just fun+ , mImports = is+ , mDecls = ds+ }+
src/Cryptol/Parser/Position.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.Position -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,8 +13,8 @@ {-# LANGUAGE RecordWildCards #-} module Cryptol.Parser.Position where -import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as T+import Data.Text(Text)+import qualified Data.Text as T import GHC.Generics (Generic) import Control.DeepSeq@@ -24,6 +24,7 @@ data Located a = Located { srcRange :: !Range, thing :: !a } deriving (Eq, Show, Generic, NFData) + data Position = Position { line :: !Int, col :: !Int } deriving (Eq, Ord, Show, Generic, NFData) @@ -35,7 +36,7 @@ -- | An empty range. -- -- Caution: using this on the LHS of a use of rComb will cause the empty source--- to propegate.+-- to propagate. emptyRange :: Range emptyRange = Range { from = start, to = start, source = "" } @@ -65,14 +66,14 @@ -------------------------------------------------------------------------------- instance PP Position where- ppPrec _ p = int (line p) <> colon <> int (col p)+ ppPrec _ p = int (line p) <.> colon <.> int (col p) instance PP Range where- ppPrec _ r = text (source r) <> char ':'- <> pp (from r) <> text "--" <> pp (to r)+ ppPrec _ r = text (source r) <.> char ':'+ <.> pp (from r) <.> text "--" <.> pp (to r) instance PP a => PP (Located a) where- ppPrec _ l = parens (text "at" <+> pp (srcRange l) <> comma <+> pp (thing l))+ ppPrec _ l = parens (text "at" <+> pp (srcRange l) <.> comma <+> pp (thing l)) instance PPName a => PPName (Located a) where ppNameFixity Located { .. } = ppNameFixity thing@@ -117,5 +118,10 @@ at :: (HasLoc l, AddLoc t) => l -> t -> t at l e = maybe e (addLoc e) (getLoc l)++combLoc :: (a -> b -> c) -> Located a -> Located b -> Located c+combLoc f l1 l2 = Located { srcRange = rComb (srcRange l1) (srcRange l2)+ , thing = f (thing l1) (thing l2)+ }
+ src/Cryptol/Parser/Selector.hs view
@@ -0,0 +1,64 @@+-- |+-- Module : Cryptol.Parser.Selector+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable++{-# LANGUAGE Safe #-}++{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+module Cryptol.Parser.Selector+ ( Selector(..)+ , ppSelector+ ) where++import Cryptol.Utils.Ident+import Cryptol.Utils.PP++import GHC.Generics (Generic)+import Control.DeepSeq++{- | Selectors are used for projecting from various components.+Each selector has an option spec to specify the shape of the thing+that is being selected. Currently, there is no surface syntax for+list selectors, but they are used during the desugaring of patterns.+-}++data Selector = TupleSel Int (Maybe Int)+ -- ^ Zero-based tuple selection.+ -- Optionally specifies the shape of the tuple (one-based).++ | RecordSel Ident (Maybe [Ident])+ -- ^ Record selection.+ -- Optionally specifies the shape of the record.++ | ListSel Int (Maybe Int)+ -- ^ List selection.+ -- Optionally specifies the length of the list.+ deriving (Eq, Show, Ord, Generic, NFData)++instance PP Selector where+ ppPrec _ sel =+ case sel of+ TupleSel x sig -> int x <+> ppSig tupleSig sig+ RecordSel x sig -> pp x <+> ppSig recordSig sig+ ListSel x sig -> int x <+> ppSig listSig sig++ where+ tupleSig n = int n+ recordSig xs = braces $ fsep $ punctuate comma $ map pp xs+ listSig n = int n++ ppSig f = maybe empty (\x -> text "/* of" <+> f x <+> text "*/")+++-- | Display the thing selected by the selector, nicely.+ppSelector :: Selector -> Doc+ppSelector sel =+ case sel of+ TupleSel x _ -> ordinal (x+1) <+> text "field"+ RecordSel x _ -> text "field" <+> pp x+ ListSel x _ -> ordinal x <+> text "element"
src/Cryptol/Parser/Unlit.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.Unlit -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,8 +13,8 @@ ( unLit, PreProc(..), guessPreProc, knownExts ) where -import Data.Text.Lazy (Text)-import qualified Data.Text.Lazy as Text+import Data.Text(Text)+import qualified Data.Text as Text import Data.Char(isSpace) import System.FilePath(takeExtension)
src/Cryptol/Parser/Utils.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Parser.Utils -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -18,6 +18,7 @@ import Cryptol.Parser.AST import Cryptol.Prims.Syntax+import Cryptol.TypeCheck.Type (TCon(TF)) widthIdent :: Ident@@ -51,7 +52,7 @@ TUser f ts -> return (TUser f (ts ++ [t])) _ -> Nothing - mkFun f = return (TApp f [])+ mkFun f = return (TApp (TF f) []) cvtLit (ECNum n CharLit) = return (TChar $ toEnum $ fromInteger n) cvtLit (ECNum n _) = return (TNum n)
src/Cryptol/Prelude.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Prelude -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -8,15 +8,14 @@ -- -- Compile the prelude into the executable as a last resort -{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE Safe #-} {-# LANGUAGE CPP #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE OverloadedStrings #-} module Cryptol.Prelude ( writePreludeContents,- writePreludeExtrasContents,- writeTcPreludeContents,+ cryptolTcContents ) where @@ -37,26 +36,7 @@ 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
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Prims.Eval -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -11,6 +11,7 @@ {-# LANGUAGE TupleSections #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -32,6 +33,7 @@ import Cryptol.ModuleSystem.Name (asPrim) import Cryptol.Utils.Ident (Ident,mkIdent) import Cryptol.Utils.PP+import Cryptol.Utils.Logger(logPrint) import qualified Data.Foldable as Fold import Data.List (sortBy)@@ -46,7 +48,7 @@ -- Primitives ------------------------------------------------------------------ -instance EvalPrims Bool BV where+instance EvalPrims Bool BV Integer where evalPrim Decl { dName = n, .. } | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val @@ -59,21 +61,26 @@ primTable :: Map.Map Ident Value primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v)) [ ("+" , {-# SCC "Prelude::(+)" #-}- binary (arithBinary (liftBinArith (+))))+ binary (arithBinary (liftBinArith (+)) (liftBinInteger (+))+ (liftBinIntMod (+)))) , ("-" , {-# SCC "Prelude::(-)" #-}- binary (arithBinary (liftBinArith (-))))+ binary (arithBinary (liftBinArith (-)) (liftBinInteger (-))+ (liftBinIntMod (-)))) , ("*" , {-# SCC "Prelude::(*)" #-}- binary (arithBinary (liftBinArith (*))))+ binary (arithBinary (liftBinArith (*)) (liftBinInteger (*))+ (liftBinIntMod (*)))) , ("/" , {-# SCC "Prelude::(/)" #-}- binary (arithBinary (liftDivArith div)))+ binary (arithBinary (liftDivArith div) (liftDivInteger div)+ (const (liftDivInteger div)))) , ("%" , {-# SCC "Prelude::(%)" #-}- binary (arithBinary (liftDivArith mod)))+ binary (arithBinary (liftDivArith mod) (liftDivInteger mod)+ (const (liftDivInteger mod)))) , ("^^" , {-# SCC "Prelude::(^^)" #-}- binary (arithBinary modExp))+ binary (arithBinary modExp integerExp intModExp)) , ("lg2" , {-# SCC "Prelude::lg2" #-}- unary (arithUnary (liftUnaryArith lg2)))+ unary (arithUnary (liftUnaryArith lg2) integerLg2 (const integerLg2))) , ("negate" , {-# SCC "Prelude::negate" #-}- unary (arithUnary (liftUnaryArith negate)))+ unary (arithUnary (liftUnaryArith negate) integerNeg intModNeg)) , ("<" , {-# SCC "Prelude::(<)" #-} binary (cmpOrder "<" (\o -> o == LT ))) , (">" , {-# SCC "Prelude::(>)" #-}@@ -86,6 +93,16 @@ binary (cmpOrder "==" (\o -> o == EQ))) , ("!=" , {-# SCC "Prelude::(!=)" #-} binary (cmpOrder "!=" (\o -> o /= EQ)))+ , ("<$" , {-# SCC "Prelude::(<$)" #-}+ binary (signedCmpOrder "<$" (\o -> o == LT)))+ , ("/$" , {-# SCC "Prelude::(/$)" #-}+ binary (arithBinary (liftSigned bvSdiv) (liftDivInteger div)+ (const (liftDivInteger div))))+ , ("%$" , {-# SCC "Prelude::(%$)" #-}+ binary (arithBinary (liftSigned bvSrem) (liftDivInteger mod)+ (const (liftDivInteger mod))))+ , (">>$" , {-# SCC "Prelude::(>>$)" #-}+ sshrV) , ("&&" , {-# SCC "Prelude::(&&)" #-} binary (logicBinary (.&.) (binBV (.&.)))) , ("||" , {-# SCC "Prelude::(||)" #-}@@ -94,6 +111,11 @@ binary (logicBinary xor (binBV xor))) , ("complement" , {-# SCC "Prelude::complement" #-} unary (logicUnary complement (unaryBV complement)))+ , ("toInteger" , ecToIntegerV)+ , ("fromInteger", ecFromIntegerV (flip mod))+ , ("fromZ" , {-# SCC "Prelude::fromZ" #-}+ nlam $ \ _modulus ->+ lam $ \ x -> x) , ("<<" , {-# SCC "Prelude::(<<)" #-} logicShift shiftLW shiftLB shiftLS) , (">>" , {-# SCC "Prelude::(>>)" #-}@@ -105,8 +127,12 @@ , ("True" , VBit True) , ("False" , VBit False) - , ("demote" , {-# SCC "Prelude::demote" #-}- ecDemoteV)+ , ("carry" , {-# SCC "Prelude::carry" #-}+ carryV)+ , ("scarry" , {-# SCC "Prelude::scarry" #-}+ scarryV)+ , ("number" , {-# SCC "Prelude::number" #-}+ ecNumberV) , ("#" , {-# SCC "Prelude::(#)" #-} nlam $ \ front ->@@ -116,19 +142,15 @@ lam $ \ r -> join (ccatV front back elty <$> l <*> r)) , ("@" , {-# SCC "Prelude::(@)" #-}- indexPrimOne indexFront_bits indexFront)- , ("@@" , {-# SCC "Prelude::(@@)" #-}- indexPrimMany indexFront_bits indexFront)+ indexPrim indexFront_bits indexFront) , ("!" , {-# SCC "Prelude::(!)" #-}- indexPrimOne indexBack_bits indexBack)- , ("!!" , {-# SCC "Prelude::(!!)" #-}- indexPrimMany indexBack_bits indexBack)+ indexPrim indexBack_bits indexBack) , ("update" , {-# SCC "Prelude::update" #-}- updatePrim updateFront_bits updateFront)+ updatePrim updateFront_word updateFront) , ("updateEnd" , {-# SCC "Prelude::updateEnd" #-}- updatePrim updateBack_bits updateBack)+ updatePrim updateBack_word updateBack) , ("zero" , {-# SCC "Prelude::zero" #-} tlam zeroV)@@ -177,35 +199,6 @@ 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)@@ -217,55 +210,54 @@ lam $ \x -> return $ lam $ \y -> do msg <- fromStr =<< s- -- FIXME? get PPOPts from elsewhere?- doc <- ppValue defaultPPOpts =<< x+ EvalOpts { evalPPOpts, evalLogger } <- getEvalOpts+ doc <- ppValue evalPPOpts =<< x yv <- y- io $ putStrLn $ show $ if null msg then- doc- else- text msg <+> doc+ io $ logPrint evalLogger+ $ if null msg then doc else text msg <+> doc return yv) ] +-- | Make a numeric literal value at the given type.+mkLit :: BitWord b w i => TValue -> Integer -> GenValue b w i+mkLit ty =+ case ty of+ TVInteger -> VInteger . integerLit+ TVIntMod _ -> VInteger . integerLit+ TVSeq w TVBit+ | w >= Arch.maxBigIntWidth -> wordTooWide w+ | otherwise -> word w+ _ -> evalPanic "Cryptol.Eval.Prim.evalConst"+ [ "Invalid type for number" ] -- | 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+ecNumberV :: BitWord b w i => GenValue b w i+ecNumberV = nlam $ \valT ->+ tlam $ \ty ->+ case valT of+ Nat v -> mkLit ty v _ -> evalPanic "Cryptol.Eval.Prim.evalConst" ["Unexpected Inf in constant." , show valT- , show bitT+ , show ty ] ----------------------------------------------------------------------------------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+-- | Convert a word to a non-negative integer.+ecToIntegerV :: BitWord b w i => GenValue b w i+ecToIntegerV =+ nlam $ \ _ ->+ wlam $ \ w -> return $ VInteger (wordToInt w) - where- downIxes n = [ n - 1, n - 2 .. 0 ]+-- | Convert an unbounded integer to a packed bitvector.+ecFromIntegerV :: BitWord b w i => (Integer -> i -> i) -> GenValue b w i+ecFromIntegerV opz =+ tlam $ \ a ->+ lam $ \ x ->+ do i <- fromVInteger <$> x+ return $ arithNullary (flip wordFromInt i) i (flip opz i) a - 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@@ -284,7 +276,28 @@ where modulus = 0 `setBit` fromInteger bits +intModExp :: Integer -> Integer -> Integer -> Eval Integer+intModExp modulus base e+ | modulus > 0 = ready $ doubleAndAdd base e modulus+ | modulus == 0 = integerExp base e+ | otherwise = evalPanic "intModExp" [ "negative modulus: " ++ show modulus ] +integerExp :: Integer -> Integer -> Eval Integer+integerExp x y+ | y < 0 = negativeExponent+ | otherwise = ready $ x ^ y++integerLg2 :: Integer -> Eval Integer+integerLg2 x+ | x < 0 = logNegative+ | otherwise = ready $ lg2 x++integerNeg :: Integer -> Eval Integer+integerNeg x = ready $ negate x++intModNeg :: Integer -> Integer -> Eval Integer+intModNeg modulus x = ready $ negate x `mod` modulus+ doubleAndAdd :: Integer -- ^ base -> Integer -- ^ exponent mask -> Integer -- ^ modulus@@ -306,18 +319,18 @@ -- Operation Lifting ----------------------------------------------------------- -type Binary b w = TValue -> GenValue b w -> GenValue b w -> Eval (GenValue b w)+type Binary b w i = TValue -> GenValue b w i -> GenValue b w i -> Eval (GenValue b w i) -binary :: Binary b w -> GenValue b w+binary :: Binary b w i -> GenValue b w i 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)+type Unary b w i = TValue -> GenValue b w i -> Eval (GenValue b w i) -unary :: Unary b w -> GenValue b w+unary :: Unary b w i -> GenValue b w i unary f = tlam $ \ ty -> lam $ \ a -> f ty =<< a @@ -325,44 +338,74 @@ -- Arith ----------------------------------------------------------------------- -- | Turn a normal binop on Integers into one that can also deal with a bitsize.+-- However, if the bitvector size is 0, always return the 0+-- bitvector. liftBinArith :: (Integer -> Integer -> Integer) -> BinArith BV+liftBinArith _ 0 _ _ = ready $ mkBv 0 0 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.+-- argument is 0. However, if the bitvector size is 0, always return the 0+-- bitvector. liftDivArith :: (Integer -> Integer -> Integer) -> BinArith BV+liftDivArith _ 0 _ _ = ready $ mkBv 0 0 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+liftBinInteger :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Eval Integer+liftBinInteger op x y = ready $ op x y++liftBinIntMod ::+ (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer -> Eval Integer+liftBinIntMod op m x y+ | m == 0 = ready $ op x y+ | otherwise = ready $ (op x y) `mod` m++liftDivInteger :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Eval Integer+liftDivInteger _ _ 0 = divideByZero+liftDivInteger op x y = ready $ op x y++modWrap :: Integral a => a -> a -> Eval a+modWrap _ 0 = divideByZero+modWrap x y = return (x `mod` y)++arithBinary :: forall b w i+ . BitWord b w i => BinArith w- -> Binary b w-arithBinary op = loop+ -> (i -> i -> Eval i)+ -> (Integer -> i -> i -> Eval i)+ -> Binary b w i+arithBinary opw opi opz = loop where loop' :: TValue- -> Eval (GenValue b w)- -> Eval (GenValue b w)- -> Eval (GenValue b w)+ -> Eval (GenValue b w i)+ -> Eval (GenValue b w i)+ -> Eval (GenValue b w i) loop' ty l r = join (loop ty <$> l <*> r) loop :: TValue- -> GenValue b w- -> GenValue b w- -> Eval (GenValue b w)+ -> GenValue b w i+ -> GenValue b w i+ -> Eval (GenValue b w i) loop ty l r = case ty of TVBit -> evalPanic "arithBinary" ["Bit not in class Arith"] + TVInteger ->+ VInteger <$> opi (fromVInteger l) (fromVInteger r)++ TVIntMod n ->+ VInteger <$> opz n (fromVInteger l) (fromVInteger r)+ 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)+ return $ VWord w (WordVal <$> opw w lw rw) | otherwise -> VSeq w <$> (join (zipSeqMap (loop a) <$> (fromSeq "arithBinary left" l) <*> (fromSeq "arithBinary right" r)))@@ -379,40 +422,51 @@ -- tuples TVTuple tys ->- let ls = fromVTuple l- rs = fromVTuple r- in return $ VTuple (zipWith3 loop' tys ls rs)+ do ls <- mapM (delay Nothing) (fromVTuple l)+ rs <- mapM (delay Nothing) (fromVTuple r)+ return $ VTuple (zipWith3 loop' tys ls rs) -- records TVRec fs ->- return $ VRecord [ (f, loop' fty (lookupRecord f l) (lookupRecord f r))- | (f,fty) <- fs ]+ do fs' <- sequence+ [ (f,) <$> delay Nothing (loop' fty (lookupRecord f l) (lookupRecord f r))+ | (f,fty) <- fs+ ]+ return $ VRecord 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+arithUnary :: forall b w i+ . BitWord b w i => UnaryArith w- -> Unary b w-arithUnary op = loop+ -> (i -> Eval i)+ -> (Integer -> i -> Eval i)+ -> Unary b w i+arithUnary opw opi opz = loop where- loop' :: TValue -> Eval (GenValue b w) -> Eval (GenValue b w)+ loop' :: TValue -> Eval (GenValue b w i) -> Eval (GenValue b w i) loop' ty x = loop ty =<< x - loop :: TValue -> GenValue b w -> Eval (GenValue b w)+ loop :: TValue -> GenValue b w i -> Eval (GenValue b w i) loop ty x = case ty of TVBit -> evalPanic "arithUnary" ["Bit not in class Arith"] + TVInteger ->+ VInteger <$> opi (fromVInteger x)++ TVIntMod n ->+ VInteger <$> opz n (fromVInteger x)+ TVSeq w a -- words and finite sequences | isTBit a -> do wx <- fromVWord "arithUnary" x- return $ VWord w (WordVal <$> op w wx)+ return $ VWord w (WordVal <$> opw w wx) | otherwise -> VSeq w <$> (mapSeqMap (loop a) =<< fromSeq "arithUnary" x) TVStream a ->@@ -424,111 +478,252 @@ -- tuples TVTuple tys ->- let as = fromVTuple x- in return $ VTuple (zipWith loop' tys as)+ do as <- mapM (delay Nothing) (fromVTuple x)+ return $ VTuple (zipWith loop' tys as) -- records TVRec fs ->- return $ VRecord [ (f, loop' fty (lookupRecord f x)) | (f,fty) <- fs ]+ do fs' <- sequence+ [ (f,) <$> delay Nothing (loop' fty (lookupRecord f x))+ | (f,fty) <- fs+ ]+ return $ VRecord fs' --- | otherwise = evalPanic "arithUnary" ["Invalid arguments"]+arithNullary ::+ forall b w i.+ BitWord b w i =>+ (Integer -> w) ->+ i ->+ (Integer -> i) ->+ TValue -> GenValue b w i+arithNullary opw opi opz = loop+ where+ loop :: TValue -> GenValue b w i+ loop ty =+ case ty of+ TVBit -> evalPanic "arithNullary" ["Bit not in class Arith"] + TVInteger -> VInteger opi + TVIntMod n -> VInteger (opz n)++ TVSeq w a+ -- words and finite sequences+ | isTBit a -> VWord w $ ready $ WordVal $ opw w+ | otherwise -> VSeq w $ IndexSeqMap $ const $ ready $ loop a++ TVStream a -> VStream $ IndexSeqMap $ const $ ready $ loop a++ TVFun _ b -> lam $ const $ ready $ loop b++ TVTuple tys -> VTuple $ map (ready . loop) tys++ TVRec fs -> VRecord [ (f, ready (loop a)) | (f, a) <- fs ]+ lg2 :: Integer -> Integer lg2 i = case genLog i 2 of Just (i',isExact) | isExact -> i' | otherwise -> i' + 1 Nothing -> 0 --- Cmp -------------------------------------------------------------------------+addV :: BitWord b w i => Binary b w i+addV = arithBinary opw opi opz+ where+ opw _w x y = ready $ wordPlus x y+ opi x y = ready $ intPlus x y+ opz m x y = ready $ intModPlus m x y --- | Lexicographic ordering on two values.-lexCompare :: String -> TValue -> Value -> Value -> Eval Ordering-lexCompare nm ty l r = case ty of+subV :: BitWord b w i => Binary b w i+subV = arithBinary opw opi opz+ where+ opw _w x y = ready $ wordMinus x y+ opi x y = ready $ intMinus x y+ opz m x y = ready $ intModMinus m x y - TVBit ->- return $ compare (fromVBit l) (fromVBit r)+mulV :: BitWord b w i => Binary b w i+mulV = arithBinary opw opi opz+ where+ opw _w x y = ready $ wordMult x y+ opi x y = ready $ intMult x y+ opz m x y = ready $ intModMult m x y - TVSeq _ TVBit ->- compare <$> (fromWord "compareLeft" l) <*> (fromWord "compareRight" r)+intV :: BitWord b w i => i -> TValue -> GenValue b w i+intV i = arithNullary (flip wordFromInt i) i (const i) - TVSeq w e ->- join (zipLexCompare nm (repeat e) <$>- (enumerateSeqMap w <$> fromSeq "lexCompare left" l) <*>- (enumerateSeqMap w <$> fromSeq "lexCompare right" r))+-- Cmp ------------------------------------------------------------------------- - -- tuples- TVTuple etys ->- zipLexCompare nm etys (fromVTuple l) (fromVTuple r)+cmpValue :: BitWord b w i+ => (b -> b -> Eval a -> Eval a)+ -> (w -> w -> Eval a -> Eval a)+ -> (i -> i -> Eval a -> Eval a)+ -> (Integer -> i -> i -> Eval a -> Eval a)+ -> (TValue -> GenValue b w i -> GenValue b w i -> Eval a -> Eval a)+cmpValue fb fw fi fz = cmp+ where+ cmp ty v1 v2 k =+ case ty of+ TVBit -> fb (fromVBit v1) (fromVBit v2) k+ TVInteger -> fi (fromVInteger v1) (fromVInteger v2) k+ TVIntMod n -> fz n (fromVInteger v1) (fromVInteger v2) k+ TVSeq n t+ | isTBit t -> do w1 <- fromVWord "cmpValue" v1+ w2 <- fromVWord "cmpValue" v2+ fw w1 w2 k+ | otherwise -> cmpValues (repeat t)+ (enumerateSeqMap n (fromVSeq v1))+ (enumerateSeqMap n (fromVSeq v2)) k+ TVStream _ -> panic "Cryptol.Prims.Value.cmpValue"+ [ "Infinite streams are not comparable" ]+ TVFun _ _ -> panic "Cryptol.Prims.Value.cmpValue"+ [ "Functions are not comparable" ]+ TVTuple tys -> cmpValues tys (fromVTuple v1) (fromVTuple v2) k+ TVRec fields -> do let vals = map snd . sortBy (comparing fst)+ let tys = vals fields+ cmpValues tys+ (vals (fromVRecord v1))+ (vals (fromVRecord v2)) k - -- 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+ cmpValues (t : ts) (x1 : xs1) (x2 : xs2) k =+ do x1' <- x1+ x2' <- x2+ cmp t x1' x2' (cmpValues ts xs1 xs2 k)+ cmpValues _ _ _ k = k - _ -> evalPanic "lexCompare" ["invalid type"] +lexCompare :: TValue -> Value -> Value -> Eval Ordering+lexCompare ty a b = cmpValue op opw op (const op) ty a b (return EQ)+ where+ opw :: BV -> BV -> Eval Ordering -> Eval Ordering+ opw x y k = op (bvVal x) (bvVal y) k --- 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)+ op :: Ord a => a -> a -> Eval Ordering -> Eval Ordering+ op x y k = case compare x y of+ EQ -> k+ cmp -> return cmp - choose c acc = c >>= \c' -> case c' of- EQ -> acc- _ -> return c'+signedLexCompare :: TValue -> Value -> Value -> Eval Ordering+signedLexCompare ty a b = cmpValue opb opw opi (const opi) ty a b (return EQ)+ where+ opb :: Bool -> Bool -> Eval Ordering -> Eval Ordering+ opb _x _y _k = panic "signedLexCompare"+ ["Attempted to perform signed comparisons on bare Bit type"] + opw :: BV -> BV -> Eval Ordering -> Eval Ordering+ opw x y k = case compare (signedBV x) (signedBV y) of+ EQ -> k+ cmp -> return cmp++ opi :: Integer -> Integer -> Eval Ordering -> Eval Ordering+ opi _x _y _k = panic "signedLexCompare"+ ["Attempted to perform signed comparisons on Integer type"]+ -- | 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+cmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV Integer+cmpOrder _nm op ty l r = VBit . op <$> lexCompare 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+-- | Process two elements based on their lexicographic ordering, using signed comparisons+signedCmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV Integer+signedCmpOrder _nm op ty l r = VBit . op <$> signedLexCompare 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+-- Signed arithmetic ----------------------------------------------------------- +-- | Lifted operation on finite bitsequences. Used+-- for signed comparisons and arithemtic.+liftWord :: BitWord b w i+ => (w -> w -> Eval (GenValue b w i))+ -> GenValue b w i+liftWord op =+ nlam $ \_n ->+ wlam $ \w1 -> return $+ wlam $ \w2 -> op w1 w2 -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 +liftSigned :: (Integer -> Integer -> Integer -> Eval BV)+ -> BinArith BV+liftSigned _ 0 = \_ _ -> return $ mkBv 0 0+liftSigned op size = f+ where+ f (BV i x) (BV j y)+ | i == j && size == i = op size sx sy+ | otherwise = evalPanic "liftSigned" ["Attempt to compute with words of different sizes"]+ where sx = signedValue i x+ sy = signedValue j y +signedBV :: BV -> Integer+signedBV (BV i x) = signedValue i x++signedValue :: Integer -> Integer -> Integer+signedValue i x = if testBit x (fromIntegral (i-1)) then x - (1 `shiftL` (fromIntegral i)) else x++bvSlt :: Integer -> Integer -> Integer -> Eval Value+bvSlt _sz x y = return . VBit $! (x < y)++bvSdiv :: Integer -> Integer -> Integer -> Eval BV+bvSdiv _ _ 0 = divideByZero+bvSdiv sz x y = return $! mkBv sz (x `quot` y)++bvSrem :: Integer -> Integer -> Integer -> Eval BV+bvSrem _ _ 0 = divideByZero+bvSrem sz x y = return $! mkBv sz (x `rem` y)++sshrV :: Value+sshrV =+ nlam $ \_n ->+ nlam $ \_k ->+ wlam $ \(BV i x) -> return $+ wlam $ \y ->+ let signx = testBit x (fromIntegral (i-1))+ amt = fromInteger (bvVal y)+ negv = (((-1) `shiftL` amt) .|. x) `shiftR` amt+ posv = x `shiftR` amt+ in return . VWord i . ready . WordVal . mkBv i $! if signx then negv else posv++-- | Signed carry bit.+scarryV :: Value+scarryV =+ nlam $ \_n ->+ wlam $ \(BV i x) -> return $+ wlam $ \(BV j y) ->+ if i == j+ then let z = x + y+ xsign = testBit x (fromInteger i - 1)+ ysign = testBit y (fromInteger i - 1)+ zsign = testBit z (fromInteger i - 1)+ sc = (xsign == ysign) && (xsign /= zsign)+ in return $ VBit sc+ else evalPanic "scarryV" ["Attempted to compute with words of different sizes"]++-- | Unsigned carry bit.+carryV :: Value+carryV =+ nlam $ \_n ->+ wlam $ \(BV i x) -> return $+ wlam $ \(BV j y) ->+ if i == j+ then return . VBit $! testBit (x + y) (fromInteger i)+ else evalPanic "carryV" ["Attempted to compute with words of different sizes"]+ -- Logic ----------------------------------------------------------------------- -zeroV :: forall b w- . BitWord b w+zeroV :: forall b w i+ . BitWord b w i => TValue- -> GenValue b w+ -> GenValue b w i zeroV ty = case ty of -- bits TVBit -> VBit (bitLit False) + -- integers+ TVInteger ->+ VInteger (integerLit 0)++ -- integers mod n+ TVIntMod _ ->+ VInteger (integerLit 0)+ -- sequences TVSeq w ety | isTBit ety -> word w 0@@ -552,22 +747,37 @@ -- | 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)+joinWordVal :: BitWord b w i =>+ WordValue b w i -> WordValue b w i -> WordValue b w i+joinWordVal (WordVal w1) (WordVal w2)+ | wordLen w1 + wordLen w2 < largeBitSize+ = WordVal $ joinWord w1 w2+joinWordVal (BitsVal xs) (WordVal w2)+ | toInteger (Seq.length xs) + wordLen w2 < largeBitSize+ = BitsVal (xs Seq.>< Seq.fromList (map ready $ unpackWord w2))+joinWordVal (WordVal w1) (BitsVal ys)+ | wordLen w1 + toInteger (Seq.length ys) < largeBitSize+ = BitsVal (Seq.fromList (map ready $ unpackWord w1) Seq.>< ys)+joinWordVal (BitsVal xs) (BitsVal ys)+ | toInteger (Seq.length xs) + toInteger (Seq.length ys) < largeBitSize+ = BitsVal (xs Seq.>< ys)+joinWordVal w1 w2+ = LargeBitsVal (n1+n2) (concatSeqMap n1 (asBitsMap w1) (asBitsMap w2))+ where n1 = wordValueSize w1+ n2 = wordValueSize w2 -joinWords :: forall b w- . BitWord b w++joinWords :: forall b w i+ . BitWord b w i => Integer -> Integer- -> SeqMap b w- -> Eval (GenValue b w)+ -> SeqMap b w i+ -> Eval (GenValue b w i) 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 :: Eval (WordValue b w i) -> [Eval (GenValue b w i)] -> Eval (GenValue b w i) loop !wv [] = return $ VWord (nParts * nEach) wv loop !wv (w : ws) = do w >>= \case@@ -575,12 +785,12 @@ _ -> evalPanic "joinWords: expected word value" [] -joinSeq :: BitWord b w+joinSeq :: BitWord b w i => Nat' -> Integer -> TValue- -> SeqMap b w- -> Eval (GenValue b w)+ -> SeqMap b w i+ -> Eval (GenValue b w i) -- Special case for 0 length inner sequences. joinSeq _parts 0 a _xs@@ -588,14 +798,21 @@ -- finite sequence of words joinSeq (Nat parts) each TVBit xs+ | parts * each < largeBitSize = joinWords parts each xs+ | otherwise+ = do let zs = IndexSeqMap $ \i ->+ do let (q,r) = divMod i each+ ys <- fromWordVal "join seq" =<< lookupSeqMap xs q+ VBit <$> indexWordValue ys (fromInteger r)+ return $ VWord (parts * each) $ ready $ LargeBitsVal (parts * each) zs -- 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)+ = return $ VStream $ IndexSeqMap $ \i ->+ do let (q,r) = divMod i each+ ys <- fromWordVal "join seq" =<< lookupSeqMap xs q+ VBit <$> indexWordValue ys (fromInteger r) -- finite or infinite sequence of non-words joinSeq parts each _a xs@@ -611,33 +828,36 @@ -- | Join a sequence of sequences into a single sequence.-joinV :: BitWord b w+joinV :: BitWord b w i => Nat' -> Integer -> TValue- -> GenValue b w- -> Eval (GenValue b w)+ -> GenValue b w i+ -> Eval (GenValue b w i) joinV parts each a val = joinSeq parts each a =<< fromSeq "joinV" val -splitWordVal :: BitWord b w+splitWordVal :: BitWord b w i => Integer -> Integer- -> WordValue b w- -> (WordValue b w, WordValue b w)+ -> WordValue b w i+ -> (WordValue b w i, WordValue b w i) 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)+splitWordVal leftWidth rightWidth (LargeBitsVal _n xs) =+ let (lxs, rxs) = splitSeqMap leftWidth xs+ in (LargeBitsVal leftWidth lxs, LargeBitsVal rightWidth rxs) -splitAtV :: BitWord b w+splitAtV :: BitWord b w i => Nat' -> Nat' -> TValue- -> GenValue b w- -> Eval (GenValue b w)+ -> GenValue b w i+ -> Eval (GenValue b w i) splitAtV front back a val = case back of @@ -674,21 +894,31 @@ _ -> evalPanic "splitAtV" ["invalid `front` len"] -extractWordVal :: BitWord b w+ -- | Extract a subsequence of bits from a @WordValue@.+ -- 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 `extractWordVal n i w` is equivalent to+ -- first shifting `w` right by `i` bits, and then truncating to+ -- `n` bits.+extractWordVal :: BitWord b w i => Integer -> Integer- -> WordValue b w- -> WordValue b w+ -> WordValue b w i+ -> WordValue b w i 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+extractWordVal len start (LargeBitsVal n xs) =+ let xs' = dropSeqMap (n - start - len) xs+ in LargeBitsVal len xs' -- | Split implementation.-ecSplitV :: BitWord b w- => GenValue b w+ecSplitV :: BitWord b w i+ => GenValue b w i ecSplitV = nlam $ \ parts -> nlam $ \ each ->@@ -722,26 +952,27 @@ _ -> evalPanic "splitV" ["invalid type arguments to split"] -reverseV :: forall b w- . BitWord b w- => GenValue b w- -> Eval (GenValue b w)+reverseV :: forall b w i+ . BitWord b w i+ => GenValue b w i+ -> Eval (GenValue b w i) 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+ revword (WordVal w) = BitsVal $ Seq.reverse $ Seq.fromList $ map ready $ unpackWord w+ revword (BitsVal bs) = BitsVal $ Seq.reverse bs+ revword (LargeBitsVal m xs) = LargeBitsVal m $ reverseSeqMap m xs reverseV _ = evalPanic "reverseV" ["Not a finite sequence"] -transposeV :: BitWord b w+transposeV :: BitWord b w i => Nat' -> Nat' -> TValue- -> GenValue b w- -> Eval (GenValue b w)+ -> GenValue b w i+ -> Eval (GenValue b w i) transposeV a b c xs | isTBit c, Nat na <- a = -- Fin a => [a][b]Bit -> [b][a]Bit return $ bseq $ IndexSeqMap $ \bi ->@@ -750,7 +981,7 @@ ys <- flip lookupSeqMap (toInteger ai) =<< fromSeq "transposeV" xs case ys of VStream ys' -> fromVBit <$> lookupSeqMap ys' bi- VWord _ wv -> flip bitsSeq bi =<< wv+ VWord _ wv -> flip indexWordValue bi =<< wv _ -> evalPanic "transpose" ["expected sequence of bits"] | isTBit c, Inf <- a = -- [inf][b]Bit -> [b][inf]Bit@@ -759,7 +990,7 @@ 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)+ VWord _ wv -> VBit <$> (flip indexWordValue bi =<< wv) _ -> evalPanic "transpose" ["expected sequence of bits"] | otherwise = -- [a][b]c -> [b][a]c@@ -782,13 +1013,13 @@ -ccatV :: (Show b, Show w, BitWord b w)+ccatV :: (Show b, Show w, BitWord b w i) => Nat' -> Nat' -> TValue- -> (GenValue b w)- -> (GenValue b w)- -> Eval (GenValue b w)+ -> (GenValue b w i)+ -> (GenValue b w i)+ -> Eval (GenValue b w i) ccatV _front _back _elty (VWord m l) (VWord n r) = return $ VWord (m+n) (joinWordVal <$> l <*> r)@@ -813,43 +1044,56 @@ rs <- r'' lookupSeqMap rs (i-n)) -wordValLogicOp :: BitWord b w+wordValLogicOp :: BitWord b w i => (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)+ -> WordValue b w i+ -> WordValue b w i+ -> Eval (WordValue b w i)+wordValLogicOp _ wop (WordVal w1) (WordVal w2) = return $ WordVal (wop w1 w2)+wordValLogicOp bop _ (BitsVal xs) (BitsVal ys) =+ BitsVal <$> sequence (Seq.zipWith (\x y -> delay Nothing (bop <$> x <*> y)) xs ys)+wordValLogicOp bop _ (WordVal w1) (BitsVal ys) =+ ready $ BitsVal $ Seq.zipWith (\x y -> bop <$> x <*> y) (Seq.fromList $ map ready $ unpackWord w1) ys+wordValLogicOp bop _ (BitsVal xs) (WordVal w2) =+ ready $ BitsVal $ Seq.zipWith (\x y -> bop <$> x <*> y) xs (Seq.fromList $ map ready $ unpackWord w2)+wordValLogicOp bop _ w1 w2 = LargeBitsVal (wordValueSize w1) <$> zs+ where zs = memoMap $ IndexSeqMap $ \i -> op <$> (lookupSeqMap xs i) <*> (lookupSeqMap ys i)+ xs = asBitsMap w1+ ys = asBitsMap w2+ op x y = VBit (bop (fromVBit x) (fromVBit y)) -- | Merge two values given a binop. This is used for and, or and xor.-logicBinary :: forall b w- . BitWord b w+logicBinary :: forall b w i+ . BitWord b w i => (b -> b -> b) -> (w -> w -> w)- -> Binary b w-logicBinary opb opw = loop+ -> Binary b w i+logicBinary opb opw = loop where loop' :: TValue- -> Eval (GenValue b w)- -> Eval (GenValue b w)- -> Eval (GenValue b w)+ -> Eval (GenValue b w i)+ -> Eval (GenValue b w i)+ -> Eval (GenValue b w i) loop' ty l r = join (loop ty <$> l <*> r) loop :: TValue- -> GenValue b w- -> GenValue b w- -> Eval (GenValue b w)+ -> GenValue b w i+ -> GenValue b w i+ -> Eval (GenValue b w i) loop ty l r = case ty of TVBit -> return $ VBit (opb (fromVBit l) (fromVBit r))+ TVInteger -> evalPanic "logicBinary" ["Integer not in class Logic"]+ TVIntMod _ -> evalPanic "logicBinary" ["Z not in class Logic"] TVSeq w aty -- words | isTBit aty- -> return $ VWord w (wordValLogicOp opb opw <$>+ -> do v <- delay Nothing $ join+ (wordValLogicOp opb opw <$> fromWordVal "logicBinary l" l <*> fromWordVal "logicBinary r" r)+ return $ VWord w v -- finite sequences | otherwise -> VSeq w <$>@@ -863,47 +1107,55 @@ (fromSeq "logicBinary right" r))) TVTuple etys -> do- let ls = fromVTuple l- let rs = fromVTuple r- return $ VTuple $ (zipWith3 loop' etys ls rs)+ ls <- mapM (delay Nothing) (fromVTuple l)+ rs <- mapM (delay Nothing) (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- ]+ do fs <- sequence+ [ (f,) <$> delay Nothing (loop' fty a b)+ | (f,fty) <- fields+ , let a = lookupRecord f l+ b = lookupRecord f r+ ]+ return $ VRecord fs -wordValUnaryOp :: BitWord b w+wordValUnaryOp :: BitWord b w i => (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)+ -> WordValue b w i+ -> Eval (WordValue b w i)+wordValUnaryOp _ wop (WordVal w) = return $ WordVal (wop w)+wordValUnaryOp bop _ (BitsVal bs) = return $ BitsVal (fmap (bop <$>) bs)+wordValUnaryOp bop _ (LargeBitsVal n xs) = LargeBitsVal n <$> mapSeqMap f xs+ where f x = VBit . bop <$> fromBit x -logicUnary :: forall b w- . BitWord b w+logicUnary :: forall b w i+ . BitWord b w i => (b -> b) -> (w -> w)- -> Unary b w+ -> Unary b w i logicUnary opb opw = loop where- loop' :: TValue -> Eval (GenValue b w) -> Eval (GenValue b w)+ loop' :: TValue -> Eval (GenValue b w i) -> Eval (GenValue b w i) loop' ty val = loop ty =<< val - loop :: TValue -> GenValue b w -> Eval (GenValue b w)+ loop :: TValue -> GenValue b w i -> Eval (GenValue b w i) loop ty val = case ty of TVBit -> return . VBit . opb $ fromVBit val + TVInteger -> evalPanic "logicUnary" ["Integer not in class Logic"]+ TVIntMod _ -> evalPanic "logicUnary" ["Z not in class Logic"]+ TVSeq w ety -- words | isTBit ety- -> do return $ VWord w (wordValUnaryOp opb opw <$> fromWordVal "logicUnary" val)+ -> do v <- delay Nothing (wordValUnaryOp opb opw =<< fromWordVal "logicUnary" val)+ return $ VWord w v -- finite sequences | otherwise@@ -914,14 +1166,18 @@ VStream <$> (mapSeqMap (loop ety) =<< fromSeq "logicUnary" val) TVTuple etys ->- let as = fromVTuple val- in return $ VTuple (zipWith loop' etys as)+ do as <- mapM (delay Nothing) (fromVTuple val)+ 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 ]+ do fs <- sequence+ [ (f,) <$> delay Nothing (loop' fty a)+ | (f,fty) <- fields, let a = lookupRecord f val+ ]+ return $ VRecord fs logicShift :: (Integer -> Integer -> Integer -> Integer)@@ -939,8 +1195,9 @@ 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))+ BitsVal bs -> return $ BitsVal (obB w bs i)+ LargeBitsVal n xs -> return $ LargeBitsVal n $ opS (Nat n) c xs i _ -> mkSeq a c <$> (opS a c <$> (fromSeq "logicShift" =<< l) <*> return i) @@ -1025,12 +1282,12 @@ -- 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 =+-- | Indexing operations.+indexPrim :: BitWord b w i+ => (Maybe Integer -> TValue -> SeqMap b w i -> Seq.Seq b -> Eval (GenValue b w i))+ -> (Maybe Integer -> TValue -> SeqMap b w i -> w -> Eval (GenValue b w i))+ -> GenValue b w i+indexPrim bits_op word_op = nlam $ \ n -> tlam $ \ a -> nlam $ \ _i ->@@ -1040,12 +1297,13 @@ VWord _ w -> w >>= \w' -> return $ IndexSeqMap (\i -> VBit <$> indexWordValue w' i) VSeq _ vs -> return vs VStream vs -> return vs- _ -> evalPanic "Expected sequence value" ["indexPrimOne"]+ _ -> evalPanic "Expected sequence value" ["indexPrim"] 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"]+ LargeBitsVal m xs -> bits_op (fromNat n) a vs . Seq.fromList =<< traverse (fromBit =<<) (enumerateSeqMap m xs)+ _ -> evalPanic "Expected word value" ["indexPrim"] indexFront :: Maybe Integer -> TValue -> SeqValMap -> BV -> Eval Value indexFront mblen _a vs (bvVal -> ix) =@@ -1067,39 +1325,14 @@ 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)+ -> SeqMap Bool BV Integer+ -> WordValue Bool BV Integer+ -> Eval (GenValue Bool BV Integer)+ -> Eval (SeqMap Bool BV Integer) updateFront len _eltTy vs w val = do idx <- bvVal <$> asWordVal w case len of@@ -1107,28 +1340,24 @@ Nat n -> unless (idx < n) (invalidIndex idx) return $ updateSeqMap vs idx val -updateFront_bits+updateFront_word :: 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+ -> WordValue Bool BV Integer+ -> WordValue Bool BV Integer+ -> Eval (GenValue Bool BV Integer)+ -> Eval (WordValue Bool BV Integer)+updateFront_word _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-+ updateWordValue bs idx (fromBit =<< val) updateBack :: Nat' -> TValue- -> SeqMap Bool BV- -> WordValue Bool BV- -> Eval (GenValue Bool BV)- -> Eval (SeqMap Bool BV)+ -> SeqMap Bool BV Integer+ -> WordValue Bool BV Integer+ -> Eval (GenValue Bool BV Integer)+ -> Eval (SeqMap Bool BV Integer) updateBack Inf _eltTy _vs _w _val = evalPanic "Unexpected infinite sequence in updateEnd" [] updateBack (Nat n) _eltTy vs w val = do@@ -1136,28 +1365,33 @@ unless (idx < n) (invalidIndex idx) return $ updateSeqMap vs (n - idx - 1) val -updateBack_bits+updateBack_word :: 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 =+ -> WordValue Bool BV Integer+ -> WordValue Bool BV Integer+ -> Eval (GenValue Bool BV Integer)+ -> Eval (WordValue Bool BV Integer)+updateBack_word Inf _eltTy _bs _w _val = evalPanic "Unexpected infinite sequence in updateEnd" []-updateBack_bits (Nat n) _eltTy bs w val = do+updateBack_word (Nat n) _eltTy bs w val = do idx <- bvVal <$> asWordVal w+ updateWordValue bs (n - idx - 1) (fromBit =<< val)++{-+ 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 =+ :: BitWord b w i+ => (Nat' -> TValue -> WordValue b w i -> WordValue b w i -> Eval (GenValue b w i) -> Eval (WordValue b w i))+ -> (Nat' -> TValue -> SeqMap b w i -> WordValue b w i -> Eval (GenValue b w i) -> Eval (SeqMap b w i))+ -> GenValue b w i+updatePrim updateWord updateSeq = nlam $ \len -> tlam $ \eltTy -> nlam $ \_idxLen ->@@ -1166,18 +1400,15 @@ 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+ VWord l w -> do w' <- delay Nothing w+ return $ VWord l (w' >>= \w'' -> updateWord len eltTy w'' idx' val)+ VSeq l vs -> VSeq l <$> updateSeq len eltTy vs idx' val+ VStream vs -> VStream <$> updateSeq len eltTy vs idx' val _ -> evalPanic "Expected sequence value" ["updatePrim"] -- -- @[ 0, 1 .. ]@-fromThenV :: BitWord b w- => GenValue b w+fromThenV :: BitWord b w i+ => GenValue b w i fromThenV = nlam $ \ first -> nlam $ \ next ->@@ -1194,68 +1425,61 @@ _ -> evalPanic "fromThenV" ["invalid arguments"] -- @[ 0 .. 10 ]@-fromToV :: BitWord b w- => GenValue b w+fromToV :: BitWord b w i+ => GenValue b w i 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') ->+ tlam $ \ ty ->+ let !f = mkLit ty in+ case (first, lst) of+ (Nat first', Nat lst') -> let len = 1 + (lst' - first')- in VSeq len $ IndexSeqMap $ \i ->- ready $ VWord bits' $ return $- WordVal $ wordLit bits' (first' + i)+ in VSeq len $ IndexSeqMap $ \i -> ready $ f (first' + i) _ -> evalPanic "fromToV" ["invalid arguments"] -- @[ 0, 1 .. 10 ]@-fromThenToV :: BitWord b w- => GenValue b w+fromThenToV :: BitWord b w i+ => GenValue b w i fromThenToV = nlam $ \ first -> nlam $ \ next -> nlam $ \ lst ->- nlam $ \ bits ->+ tlam $ \ ty -> 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 !f = mkLit ty in+ case (first, next, lst, len) of+ (Nat first', Nat next', Nat _lst', Nat len') -> let diff = next' - first'- in VSeq len' $ IndexSeqMap $ \i ->- ready $ VWord bits' $ return $- WordVal $ wordLit bits' (first' + i*diff)+ in VSeq len' $ IndexSeqMap $ \i -> ready $ f (first' + i*diff) _ -> evalPanic "fromThenToV" ["invalid arguments"] -infFromV :: BitWord b w- => GenValue b w+infFromV :: BitWord b w i => GenValue b w i infFromV =- nlam $ \(finNat' -> bits) ->- wlam $ \first ->- return $ VStream $ IndexSeqMap $ \i ->- ready $ VWord bits $ return $- WordVal $ wordPlus first (wordLit bits i)+ tlam $ \ ty ->+ lam $ \ x' ->+ return $ VStream $ IndexSeqMap $ \i ->+ do x <- x'+ addV ty x (intV (integerLit i) ty) -infFromThenV :: BitWord b w- => GenValue b w+infFromThenV :: BitWord b w i => GenValue b w i 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))+ tlam $ \ ty ->+ lam $ \ first -> return $+ lam $ \ next ->+ do x <- first+ y <- next+ d <- subV ty y x+ return $ VStream $ IndexSeqMap $ \i ->+ addV ty x =<< mulV ty d (intV (integerLit i) ty) -- 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 :: BitWord b w i => TValue -> Integer -> GenValue b w i randomV ty seed = case randomValue (tValTy ty) of Nothing -> zeroV ty@@ -1268,14 +1492,16 @@ -- Miscellaneous --------------------------------------------------------------- -errorV :: forall b w- . BitWord b w+errorV :: forall b w i+ . BitWord b w i => TValue -> String- -> Eval (GenValue b w)+ -> Eval (GenValue b w i) errorV ty msg = case ty of -- bits TVBit -> cryUserError msg+ TVInteger -> cryUserError msg+ TVIntMod _ -> cryUserError msg -- sequences TVSeq w ety
src/Cryptol/Prims/Syntax.hs view
@@ -1,26 +1,315 @@--- |--- Module : $Header$--- Copyright : (c) 2013-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable--{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-module Cryptol.Prims.Syntax- ( TFun(..), tBinOpPrec, tfunNames- ) where--import Cryptol.Parser.Name (PName,mkUnqual)-import Cryptol.Utils.Ident (packIdent,packInfix)-import Cryptol.Utils.PP-import qualified Data.Map as Map+{-# Language DeriveGeneric, DeriveAnyClass #-}+module Cryptol.Prims.Syntax where import GHC.Generics (Generic) import Control.DeepSeq+import qualified Data.Map as Map --- | Built-in types.+import Cryptol.Parser.Name+import Cryptol.Parser.Selector+import Cryptol.Parser.Fixity+import qualified Cryptol.ModuleSystem.Name as M+import Cryptol.Utils.Ident+import Cryptol.Utils.PP++-- | Information about a user visible built-in type.+data PrimTy = PrimTy+ { primTyCon :: !TCon -- ^ Use this ty-con (renamer)+ , primTyIdent :: !Ident -- ^ This is what it's called+ , primTyDoc :: !String -- ^ Documentation+ , primTyFixity :: !(Maybe Fixity) -- ^ Precedence, for infix ones+ }++instance Eq PrimTy where+ x == y = primTyCon x == primTyCon y++instance Ord PrimTy where+ compare x y = compare (primTyCon x) (primTyCon y)+++-- | This list should contain all user-visible built-in types.+primTyList :: [ PrimTy ]+primTyList =+ [ -- Value type constructors -------------------------------------------------++ tPrefix "inf" TC TCInf+ "A numeric type representing infinity."++ , tPrefix "Bit" TC TCBit+ "The type of boolean values."++ , tPrefix "Integer" TC TCInteger+ "The type of unbounded integers."++ , tPrefix "Z" TC TCIntMod+ "'Z n' is the type of integers, modulo 'n'."+++ -- Predicate constructors --------------------------------------------------++ , tInfix "==" PC PEqual (n 20)+ "Assert that two numeric types are equal."++ , tInfix "!=" PC PNeq (n 20)+ "Assert that two numeric types are different."++ , tInfix ">=" PC PGeq (n 30)+ "Assert that the first numeric type is larger than, or equal to the second."++ , tPrefix "fin" PC PFin+ "Assert that a numeric type is a proper natural number (not 'inf')."++ , tPrefix "Zero" PC PZero+ "Value types that have a notion of 'zero'."++ , tPrefix "Logic" PC PLogic+ "Value types that support logical operations."++ , tPrefix "Arith" PC PArith+ "Value types that support arithmetic."++ , tPrefix "Cmp" PC PCmp+ "Value types that support unsigned comparisons."++ , tPrefix "SignedCmp" PC PSignedCmp+ "Value types that support signed comparisons."++ , tPrefix "Literal" PC PLiteral+ "'Literal n a' asserts that type 'a' contains the number 'n'."++++ -- Type functions ------------------------------------------------++ , tInfix "+" TF TCAdd (l 80)+ "Add numeric types."++ , tInfix "-" TF TCSub (l 80)+ "Subtract numeric types."++ , tInfix "*" TF TCMul (l 90)+ "Multiply numeric types."++ , tInfix "/" TF TCDiv (l 90)+ "Divide numeric types, rounding down."++ , tInfix "%" TF TCMod (l 90)+ "Remainder of numeric type division."++ , tInfix "^^" TF TCExp (r 95)+ "Exponentiate numeric types."++ , tPrefix "width" TF TCWidth+ "The number of bits required to represent the value of a numeric type."++ , tPrefix "min" TF TCMin+ "The smaller of two numeric types."++ , tPrefix "max" TF TCMax+ "The larger of two numeric types."++ , tInfix "/^" TF TCCeilDiv (l 90)+ "Divide numeric types, rounding up."++ , tInfix "%^" TF TCCeilMod (l 90)+ "How much we need to add to make a proper multiple of the second argument."++ , tPrefix "lengthFromThen" TF TCLenFromThen+ "The length of an enumeration."++ , tPrefix "lengthFromThenTo" TF TCLenFromThenTo+ "The length of an enumeration."+ ]+ where+ r x = Fixity { fAssoc = RightAssoc, fLevel = x }+ l x = Fixity { fAssoc = LeftAssoc, fLevel = x }+ n x = Fixity { fAssoc = NonAssoc, fLevel = x }++ tPrefix x mk tc d =+ PrimTy { primTyCon = mk tc+ , primTyIdent = packIdent x+ , primTyDoc = d+ , primTyFixity = Nothing+ }++ tInfix x mk tc f d =+ PrimTy { primTyCon = mk tc+ , primTyIdent = packInfix x+ , primTyDoc = d+ , primTyFixity = Just f+ }++--------------------------------------------------------------------------------+-- Indexes for quick access++-- | Construct an index for quick lookup of primtys.+primTyIx :: Ord a => (PrimTy -> Maybe a) -> a -> Maybe PrimTy+primTyIx toKey = \x -> Map.lookup x mp+ where mp = Map.fromList [ (k,x) | x <- primTyList, Just k <- [ toKey x ] ]+{-# Inline primTyIx #-}+++-- | Lookup a prim type by a parser name.+primTyFromPName :: PName -> Maybe PrimTy+primTyFromPName = primTyIx $ \t -> Just (mkUnqual (primTyIdent t))+++-- | Lookup if a ty con is a primitive.+primTyFromTC :: TCon -> Maybe PrimTy+primTyFromTC = primTyIx $ \t -> Just (primTyCon t)++-- | Lookup a 'TFun' prim type.+primTyFromTF :: TFun -> Maybe PrimTy+primTyFromTF = primTyIx $ \t ->+ case primTyCon t of+ TF tf -> Just tf+ _ -> Nothing+++-- | Lookup a 'PC' prim type.+primTyFromPC :: PC -> Maybe PrimTy+primTyFromPC = primTyIx $ \t ->+ case primTyCon t of+ PC tf -> Just tf+ _ -> Nothing++++--------------------------------------------------------------------------------++infixr 5 :->++-- | Kinds, classify types.+data Kind = KType+ | KNum+ | KProp+ | Kind :-> Kind+ deriving (Eq, Ord, Show, Generic, NFData)++class HasKind t where+ kindOf :: t -> Kind++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+ TCInteger -> KType+ TCIntMod -> KNum :-> 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+ PZero -> KType :-> KProp+ PLogic -> KType :-> KProp+ PArith -> KType :-> KProp+ PCmp -> KType :-> KProp+ PSignedCmp -> KType :-> KProp+ PLiteral -> KNum :-> 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+ TCCeilDiv -> KNum :-> KNum :-> KNum+ TCCeilMod -> KNum :-> KNum :-> KNum++ TCLenFromThen -> KNum :-> KNum :-> KNum :-> KNum+ TCLenFromThenTo -> KNum :-> KNum :-> KNum :-> KNum+++++-- | Type constants.+data TCon = TC TC | PC PC | TF TFun | TError Kind TCErrorMessage+ deriving (Show, Eq, Ord, Generic, NFData)+++-- | Predicate symbols.+-- If you add additional user-visible constructors, please update 'primTys'.+data PC = PEqual -- ^ @_ == _@+ | PNeq -- ^ @_ /= _@+ | PGeq -- ^ @_ >= _@+ | PFin -- ^ @fin _@++ -- classes+ | PHas Selector -- ^ @Has sel type field@ does not appear in schemas+ | PZero -- ^ @Zero _@+ | PLogic -- ^ @Logic _@+ | PArith -- ^ @Arith _@+ | PCmp -- ^ @Cmp _@+ | PSignedCmp -- ^ @SignedCmp _@+ | PLiteral -- ^ @Literal _ _@++ | PAnd -- ^ This is useful when simplifying things in place+ | PTrue -- ^ Ditto+ deriving (Show, Eq, Ord, Generic, NFData)++-- | 1-1 constants.+-- If you add additional user-visible constructors, please update 'primTys'.+data TC = TCNum Integer -- ^ Numbers+ | TCInf -- ^ Inf+ | TCBit -- ^ Bit+ | TCInteger -- ^ Integer+ | TCIntMod -- ^ @Z _@+ | TCSeq -- ^ @[_] _@+ | TCFun -- ^ @_ -> _@+ | TCTuple Int -- ^ @(_, _, _)@+ | TCNewtype UserTC -- ^ user-defined, @T@+ deriving (Show, Eq, Ord, Generic, NFData)+++data UserTC = UserTC M.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+++++data TCErrorMessage = TCErrorMessage+ { tcErrorMessage :: !String+ -- XXX: Add location?+ } deriving (Show, Eq, Ord, Generic, NFData)+++-- | Built-in type functions.+-- If you add additional user-visible constructors,+-- please update 'primTys' in "Cryptol.Prims.Types". data TFun = TCAdd -- ^ @ : Num -> Num -> Num @@@ -32,6 +321,8 @@ | TCWidth -- ^ @ : Num -> Num @ | TCMin -- ^ @ : Num -> Num -> Num @ | TCMax -- ^ @ : Num -> Num -> Num @+ | TCCeilDiv -- ^ @ : Num -> Num -> Num @+ | TCCeilMod -- ^ @ : Num -> Num -> Num @ -- Computing the lengths of explicit enumerations | TCLenFromThen -- ^ @ : Num -> Num -> Num -> Num@@@ -42,57 +333,108 @@ deriving (Show, Eq, Ord, Bounded, Enum, Generic, NFData) -tBinOpPrec :: Map.Map TFun (Assoc,Int)-tBinOpPrec = mkMap t_table- where- mkMap t = Map.fromList [ (op,(a,n)) | ((a,ops),n) <- zip t [1..] , op <- ops ] - -- lowest to highest- t_table =- [ (LeftAssoc, [ TCAdd, TCSub ])- , (LeftAssoc, [ TCMul, TCDiv, TCMod ])- , (RightAssoc, [ TCExp ])- ] --- | Type functions, with their arity and function constructor.-tfunNames :: Map.Map PName (Int,TFun)-tfunNames = Map.fromList- [ tinfix "+" 2 TCAdd- , tinfix "-" 2 TCSub- , tinfix "*" 2 TCMul- , tinfix "/" 2 TCDiv- , tinfix "%" 2 TCMod- , tinfix "^^" 2 TCExp- , tprefix "width" 1 TCWidth- , tprefix "min" 2 TCMin- , tprefix "max" 2 TCMax- , tprefix "lengthFromThen" 3 TCLenFromThen- , tprefix "lengthFromThenTo" 3 TCLenFromThenTo- ]- where+--------------------------------------------------------------------------------+-- Pretty printing - tprefix n a p = (mkUnqual (packIdent n), (a,p))- tinfix n a p = (mkUnqual (packInfix n), (a,p))+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 TCon where+ ppPrec _ (TC tc) = pp tc+ ppPrec _ (PC tc) = pp tc+ ppPrec _ (TF tc) = pp tc+ ppPrec _ (TError _ msg) = pp msg++instance PPName TCon where+ ppNameFixity (TC _) = Nothing+ ppNameFixity (PC _) = Nothing+ ppNameFixity (TF tf) = ppNameFixity tf+ ppNameFixity (TError _ _) = Nothing++ ppPrefixName (TC tc) = pp tc+ ppPrefixName (PC pc) = pp pc+ ppPrefixName (TF tf) = ppPrefixName tf+ ppPrefixName (TError _ msg) = pp msg++ ppInfixName (TC tc) = pp tc+ ppInfixName (PC pc) = pp pc+ ppInfixName (TF tf) = ppInfixName tf+ ppInfixName (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)+ PZero -> text "Zero"+ PLogic -> text "Logic"+ PArith -> text "Arith"+ PCmp -> text "Cmp"+ PSignedCmp -> text "SignedCmp"+ PLiteral -> text "Literal"+ PTrue -> text "True"+ PAnd -> text "(&&)"++instance PP TC where+ ppPrec _ x =+ case x of+ TCNum n -> integer n+ TCInf -> text "inf"+ TCBit -> text "Bit"+ TCInteger -> text "Integer"+ TCIntMod -> text "Z"+ 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 PPName TFun where- ppNameFixity f = Map.lookup f tBinOpPrec - ppPrefixName TCAdd = text "(+)"- ppPrefixName TCSub = text "(-)"- ppPrefixName TCMul = text "(*)"- ppPrefixName TCDiv = text "(/)"- ppPrefixName TCMod = text "(%)"- ppPrefixName TCExp = text "(^^)"- ppPrefixName f = pp f+ ppNameFixity f =+ do pt <- primTyFromTF f+ fi <- primTyFixity pt+ return (fAssoc fi, fLevel fi) - ppInfixName TCAdd = text "+"- ppInfixName TCSub = text "-"- ppInfixName TCMul = text "*"- ppInfixName TCDiv = text "/"- ppInfixName TCMod = text "%"- ppInfixName TCExp = text "^^"- ppInfixName f = error $ "Not a prefix type function: " ++ show (pp f)+ ppPrefixName TCAdd = text "(+)"+ ppPrefixName TCSub = text "(-)"+ ppPrefixName TCMul = text "(*)"+ ppPrefixName TCDiv = text "(/)"+ ppPrefixName TCMod = text "(%)"+ ppPrefixName TCExp = text "(^^)"+ ppPrefixName TCCeilDiv = text "(/^)"+ ppPrefixName TCCeilMod = text "(%^)"+ ppPrefixName f = pp f + ppInfixName TCAdd = text "+"+ ppInfixName TCSub = text "-"+ ppInfixName TCMul = text "*"+ ppInfixName TCDiv = text "/"+ ppInfixName TCMod = text "%"+ ppInfixName TCExp = text "^^"+ ppInfixName TCCeilDiv = text "/^"+ ppInfixName TCCeilMod = text "%^"+ ppInfixName f = error $ "Not a prefix type function: " ++ show (pp f)+ instance PP TFun where ppPrec _ tcon = case tcon of@@ -105,6 +447,8 @@ TCWidth -> text "width" TCMin -> text "min" TCMax -> text "max"+ TCCeilDiv -> text "/^"+ TCCeilMod -> text "%^" TCLenFromThen -> text "lengthFromThen" TCLenFromThenTo -> text "lengthFromThenTo"
src/Cryptol/REPL/Command.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.REPL.Command -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -55,6 +55,7 @@ import qualified Cryptol.ModuleSystem.NamingEnv as M import qualified Cryptol.ModuleSystem.Renamer as M (RenamerWarning(SymbolShadowed)) import qualified Cryptol.Utils.Ident as M+import qualified Cryptol.ModuleSystem.Env as M import qualified Cryptol.Eval.Monad as E import qualified Cryptol.Eval.Value as E@@ -65,11 +66,12 @@ (parseExprWith,parseReplWith,ParseError(),Config(..),defaultConfig ,parseModName,parseHelpName) import qualified Cryptol.TypeCheck.AST as T+import qualified Cryptol.TypeCheck.Error as T+import qualified Cryptol.TypeCheck.Parseable as T import qualified Cryptol.TypeCheck.Subst as T-import qualified Cryptol.TypeCheck.InferTypes as T import Cryptol.TypeCheck.Solve(defaultReplExpr)-import qualified Cryptol.TypeCheck.Solver.CrySAT as CrySAT-import Cryptol.TypeCheck.PP (dump,ppWithNames)+import qualified Cryptol.TypeCheck.Solver.SMT as SMT+import Cryptol.TypeCheck.PP (dump) import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic) import qualified Cryptol.Parser.AST as P@@ -78,12 +80,12 @@ import qualified Cryptol.Symbolic as Symbolic import qualified Control.Exception as X-import Control.Monad hiding (mapM, mapM_)+import Control.Monad hiding (mapM, mapM) import qualified Data.ByteString as BS import Data.Bits ((.&.)) import Data.Char (isSpace,isPunctuation,isSymbol) import Data.Function (on)-import Data.List (intercalate,nub,sortBy,partition)+import Data.List (intercalate, nub, sortBy, partition, isPrefixOf) import Data.Maybe (fromMaybe,mapMaybe) import System.Environment (lookupEnv) import System.Exit (ExitCode(ExitSuccess))@@ -93,14 +95,14 @@ import System.Directory(getHomeDirectory,setCurrentDirectory,doesDirectoryExist) import qualified Data.Map as Map import qualified Data.Set as Set-import qualified Data.IntMap as IntMap import System.IO(hFlush,stdout) import System.Random.TF(newTFGen) import Numeric (showFFloat)-import qualified Data.Text as ST-import qualified Data.Text.Lazy as T+import qualified Data.Text as T import Data.IORef(newIORef,readIORef) +import GHC.Float (log1p, expm1)+ import Prelude () import Prelude.Compat @@ -137,9 +139,11 @@ | FileExprArg (FilePath -> String -> REPL ()) | DeclsArg (String -> REPL ()) | ExprTypeArg (String -> REPL ())+ | ModNameArg (String -> REPL ()) | FilenameArg (FilePath -> REPL ()) | OptionArg (String -> REPL ()) | ShellArg (String -> REPL ())+ | HelpArg (String -> REPL ()) | NoArg (REPL ()) @@ -165,54 +169,59 @@ nbCommandList :: [CommandDescr] nbCommandList = [ CommandDescr [ ":t", ":type" ] (ExprArg typeOfCmd)- "check the type of an expression"- , CommandDescr [ ":b", ":browse" ] (ExprTypeArg browseCmd)- "display the current environment"- , CommandDescr [ ":?", ":help" ] (ExprArg helpCmd)- "display a brief description about a function"+ "Check the type of an expression."+ , CommandDescr [ ":b", ":browse" ] (ModNameArg browseCmd)+ "Display environment for all loaded modules, or for a specific module."+ , CommandDescr [ ":?", ":help" ] (HelpArg helpCmd)+ "Display a brief description of a function, type, or command." , CommandDescr [ ":s", ":set" ] (OptionArg setOptionCmd)- "set an environmental option (:set on its own displays current values)"+ "Set an environmental option (:set on its own displays current values)." , CommandDescr [ ":check" ] (ExprArg (void . qcCmd QCRandom))- "use random testing to check that the argument always returns true (if no argument, check all properties)"+ "Use random testing to check that the argument always returns true.\n(If no argument, check all properties.)" , CommandDescr [ ":exhaust" ] (ExprArg (void . qcCmd QCExhaust))- "use exhaustive testing to prove that the argument always returns true (if no argument, check all properties)"+ "Use exhaustive testing to prove that the argument always returns\ntrue. (If no argument, check all properties.)" , CommandDescr [ ":prove" ] (ExprArg proveCmd)- "use an external solver to prove that the argument always returns true (if no argument, check all properties)"+ "Use an external solver to prove that the argument always returns\ntrue. (If no argument, check all properties.)" , CommandDescr [ ":sat" ] (ExprArg satCmd)- "use a solver to find a satisfying assignment for which the argument returns true (if no argument, find an assignment for all properties)"+ "Use a solver to find a satisfying assignment for which the argument\nreturns true. (If no argument, find an assignment for all properties.)" , CommandDescr [ ":debug_specialize" ] (ExprArg specializeCmd)- "do type specialization on a closed expression"+ "Do type specialization on a closed expression." , CommandDescr [ ":eval" ] (ExprArg refEvalCmd)- "evaluate an expression with the reference evaluator"+ "Evaluate an expression with the reference evaluator."+ , CommandDescr [ ":ast" ] (ExprArg astOfCmd)+ "Print out the pre-typechecked AST of a given term."+ , CommandDescr [ ":extract-coq" ] (NoArg allTerms)+ "Print out the post-typechecked AST of all currently defined terms,\nin a Coq-parseable format." ] commandList :: [CommandDescr] commandList = nbCommandList ++ [ CommandDescr [ ":q", ":quit" ] (NoArg quitCmd)- "exit the REPL"+ "Exit the REPL." , CommandDescr [ ":l", ":load" ] (FilenameArg loadCmd)- "load a module"+ "Load a module by filename." , CommandDescr [ ":r", ":reload" ] (NoArg reloadCmd)- "reload the currently loaded module"+ "Reload the currently loaded module." , CommandDescr [ ":e", ":edit" ] (FilenameArg editCmd)- "edit the currently loaded module"+ "Edit the currently loaded module." , CommandDescr [ ":!" ] (ShellArg runShellCmd)- "execute a command in the shell"+ "Execute a command in the shell." , CommandDescr [ ":cd" ] (FilenameArg cdCmd)- "set the current working directory"+ "Set the current working directory." , CommandDescr [ ":m", ":module" ] (FilenameArg moduleCmd)- "load a module"+ "Load a module by its name." , CommandDescr [ ":w", ":writeByteArray" ] (FileExprArg writeFileCmd)- "write data of type `fin n => [n][8]` to a file"+ "Write data of type 'fin n => [n][8]' to a file." , CommandDescr [ ":readByteArray" ] (FilenameArg readFileCmd)- "read data from a file as type `fin n => [n][8]`, binding the value to variable `it`"+ "Read data from a file as type 'fin n => [n][8]', binding\nthe value to variable 'it'." ] genHelp :: [CommandDescr] -> [String] genHelp cs = map cmdHelp cs where- cmdHelp cmd = concat [ " ", cmdNames cmd, pad (cmdNames cmd), cHelp cmd ]+ cmdHelp cmd = concat $ [ " ", cmdNames cmd, pad (cmdNames cmd),+ intercalate ("\n " ++ pad []) (lines (cHelp cmd)) ] cmdNames cmd = intercalate ", " (cNames cmd) padding = 2 + maximum (map (length . cmdNames) cs) pad n = replicate (max 0 (padding - length n)) ' '@@ -248,6 +257,12 @@ , E.useInfLength = infLength } +getEvalOpts :: REPL E.EvalOpts+getEvalOpts =+ do ppOpts <- getPPValOpts+ l <- getLogger+ return E.EvalOpts { E.evalPPOpts = ppOpts, E.evalLogger = l }+ evalCmd :: String -> REPL () evalCmd str = do letEnabled <- getLetEnabled@@ -258,7 +273,7 @@ P.ExprInput expr -> do (val,_ty) <- replEvalExpr expr ppOpts <- getPPValOpts- valDoc <- io $ rethrowEvalError $ E.runEval $ E.ppValue ppOpts val+ valDoc <- rEvalRethrow (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@@ -273,6 +288,14 @@ -- be generalized if mono-binds is enabled replEvalDecl decl +printCounterexample :: Bool -> P.Expr P.PName -> [E.Value] -> REPL ()+printCounterexample isSat pexpr vs =+ do ppOpts <- getPPValOpts+ docs <- mapM (rEval . E.ppValue ppOpts) vs+ let doc = ppPrec 3 pexpr -- function application has precedence 3+ rPrint $ hang doc 2 (sep docs) <+>+ text (if isSat then "= True" else "= False")+ data QCMode = QCRandom | QCExhaust deriving (Eq, Show) -- | Randomly test a property, or exhaustively check it if the number@@ -292,67 +315,77 @@ qcCmd qcMode str = do expr <- replParseExpr str (val,ty) <- replEvalExpr expr- EnvNum testNum <- getUser "tests"+ EnvNum testNum <- getUser "tests" case testableType ty of- Just (sz,vss) | qcMode == QCExhaust || sz <= toInteger testNum -> do+ Just (Just sz,tys,vss) | qcMode == QCExhaust || sz <= toInteger testNum -> do rPutStrLn "Using exhaustive testing." let f _ [] = panic "Cryptol.REPL.Command" ["Exhaustive testing ran out of test cases"] f _ (vs : vss1) = do- result <- io $ runOneTest val vs+ evo <- getEvalOpts+ result <- io $ runOneTest evo val vs return (result, vss1) testSpec = TestSpec { testFn = f , testProp = str , testTotal = sz- , testPossible = sz+ , testPossible = Just sz , testRptProgress = ppProgress , testClrProgress = delProgress- , testRptFailure = ppFailure+ , testRptFailure = ppFailure tys expr , testRptSuccess = do delTesting- prtLn $ "passed " ++ show sz ++ " tests."+ prtLn $ "Passed " ++ show sz ++ " tests." rPutStrLn "Q.E.D." } prt testingMsg report <- runTests testSpec vss return [report] - Just (sz,_) -> case TestR.testableType ty of+ Just (sz,tys,_) | qcMode == QCRandom ->+ case TestR.testableType ty of Nothing -> raise (TypeNotTestable ty) Just gens -> do rPutStrLn "Using random testing."+ evo <- getEvalOpts let testSpec = TestSpec {- testFn = \sz' g -> io $ TestR.runOneTest val gens sz' g+ testFn = \sz' g ->+ io $ TestR.runOneTest evo val gens sz' g , testProp = str , testTotal = toInteger testNum , testPossible = sz , testRptProgress = ppProgress , testClrProgress = delProgress- , testRptFailure = ppFailure+ , testRptFailure = ppFailure tys expr , testRptSuccess = do delTesting- prtLn $ "passed " ++ show testNum ++ " tests."+ prtLn $ "Passed " ++ show testNum ++ " tests." } prt testingMsg g <- io newTFGen report <- runTests testSpec g- when (isPass (reportResult report)) $ do- let szD = fromIntegral sz :: Double- percent = fromIntegral (testNum * 100) / szD+ when (isPass (reportResult report)) $+ case sz of+ Nothing -> return ()+ Just n -> rPutStrLn $ coverageString testNum n+ return [report]+ _ -> raise (TypeNotTestable ty)++ where+ testingMsg = "Testing... "++ coverageString testNum sz =+ let (percent, expectedUnique) = expectedCoverage testNum sz showValNum | sz > 2 ^ (20::Integer) = "2^^" ++ show (lg2 sz) | otherwise = show sz- rPutStrLn $ "Coverage: "+ in "Expected test coverage: " ++ showFFloat (Just 2) percent "% ("- ++ show testNum ++ " of "- ++ showValNum ++ " values)"- return [report]- Nothing -> return []+ ++ showFFloat (Just 0) expectedUnique " of "+ ++ showValNum+ ++ " values)" - where- testingMsg = "testing..." totProgressWidth = 4 -- 100% @@ -371,28 +404,77 @@ pad = replicate (totProgressWidth - width) ' ' in prt (pad ++ percent) - del n = unlessBatch $ prt (replicate n '\BS')+ del n = unlessBatch+ $ prt (replicate n '\BS' ++ replicate n ' ' ++ replicate n '\BS') delTesting = del (length testingMsg) delProgress = del totProgressWidth - ppFailure failure = do+ ppFailure tys pexpr failure = do delTesting opts <- getPPValOpts case failure of- FailFalse [] -> do- prtLn "FAILED" FailFalse vs -> do- prtLn "FAILED for the following inputs:"- mapM_ (\v -> rPrint =<< (io $ E.runEval $ E.ppValue opts v)) vs+ let isSat = False+ printCounterexample isSat pexpr vs+ case (tys,vs) of+ ([t],[v]) -> bindItVariableVal t v+ _ -> let fs = [ M.packIdent ("arg" ++ show (i::Int)) | i <- [ 1 .. ] ]+ t = T.TRec (zip fs tys)+ v = E.VRecord (zip fs (map return vs))+ in bindItVariableVal t v+ FailError err [] -> do prtLn "ERROR" rPrint (pp err) FailError err vs -> do prtLn "ERROR for the following inputs:"- mapM_ (\v -> rPrint =<< (io $ E.runEval $ E.ppValue opts v)) vs+ mapM_ (\v -> rPrint =<< (rEval $ E.ppValue opts v)) vs rPrint (pp err) Pass -> panic "Cryptol.REPL.Command" ["unexpected Test.Pass"] ++-- | This function computes the expected coverage percentage and+-- expected number of unique test vectors when using random testing.+--+-- The expected test coverage proportion is:+-- @1 - ((n-1)/n)^k@+--+-- This formula takes into account the fact that test vectors are chosen+-- uniformly at random _with replacement_, and thus the same vectors+-- may be generated multiple times. If the test vectors were chosen+-- randomly without replacement, the proportion would instead be @k/n@.+--+-- We compute raising to the @k@ power in the log domain to improve +-- numerical precision. The equivalant comptutation is:+-- @-expm1( k * log1p (-1/n) )@+--+-- Where @expm1(x) = exp(x) - 1@ and @log1p(x) = log(1 + x)@.+--+-- However, if @sz@ is large enough, even carefully preserving+-- precision may not be enough to get sensible results. In such+-- situations, we expect the naive approximation @k/n@ to be very+-- close to accurate and the expected number of unique values is+-- essentially equal to the number of tests.+expectedCoverage :: Int -> Integer -> (Double, Double)+expectedCoverage testNum sz =+ -- If the Double computation has enough precision, use the+ -- "with replacement" formula.+ if testNum > 0 && proportion > 0 then+ (100.0 * proportion, szD * proportion)+ else+ (100.0 * naiveProportion, numD)++ where+ szD :: Double+ szD = fromInteger sz++ numD :: Double+ numD = fromIntegral testNum++ naiveProportion = numD / szD++ proportion = negate (expm1 (numD * log1p (negate (recip szD))))+ satCmd, proveCmd :: String -> REPL () satCmd = cmdProveSat True proveCmd = cmdProveSat False@@ -404,6 +486,12 @@ msg = "(Total Elapsed Time: " ++ SBV.showTDiff stat ++ maybe "" (\p -> ", using " ++ show p) mprover ++ ")" +rethrowErrorCall :: REPL a -> REPL a+rethrowErrorCall m = REPL (\r -> unREPL m r `X.catch` handler)+ where+ handler (X.ErrorCallWithLocation s _) = X.throwIO (SBVError s)++ -- | 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@@ -444,8 +532,7 @@ Just path -> io $ writeFile path smtlib Nothing -> rPutStr smtlib _ -> do- (firstProver,result,stats) <- onlineProveSat isSat str mfile- ppOpts <- getPPValOpts+ (firstProver,result,stats) <- rethrowErrorCall (onlineProveSat isSat str mfile) case result of Symbolic.EmptyResult -> panic "REPL.Command" [ "got EmptyResult for online prover query" ]@@ -457,13 +544,6 @@ Symbolic.AllSatResult tevss -> do let tess = map (map $ \(t,e,_) -> (t,e)) tevss vss = map (map $ \(_,_,v) -> v) tevss- ppvs vs = do- parseExpr <- replParseExpr str- 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") resultRecs <- mapM (mkSolverResult cexStr isSat . Right) tess let collectTes tes = (t, es) where@@ -475,10 +555,11 @@ (ty, exprs) = case resultRecs of [] -> panic "REPL.Command.onlineProveSat"- [ "no satisfying assignments after mkSovlerResult" ]+ [ "no satisfying assignments after mkSolverResult" ] [(t, e)] -> (t, [e]) _ -> collectTes resultRecs- forM_ vss ppvs+ pexpr <- replParseExpr str+ forM_ vss (printCounterexample isSat pexpr) case (ty, exprs) of (t, [e]) -> bindItVariable t e (t, es ) -> bindItVariables t es@@ -578,9 +659,22 @@ refEvalCmd str = do parseExpr <- replParseExpr str (_, expr, _schema) <- replCheckExpr parseExpr+ validEvalContext expr val <- liftModuleCmd (rethrowEvalError . R.evaluate expr)- rPrint $ R.ppValue val+ opts <- getPPValOpts+ rPrint $ R.ppValue opts val +astOfCmd :: String -> REPL ()+astOfCmd str = do+ expr <- replParseExpr str+ (re,_,_) <- replCheckExpr (P.noPos expr)+ rPrint (fmap M.nameUnique re)++allTerms :: REPL ()+allTerms = do+ me <- getModuleEnv+ rPrint $ T.showParseable $ concatMap T.mDecls $ M.loadedModules me+ typeOfCmd :: String -> REPL () typeOfCmd str = do @@ -588,9 +682,8 @@ (_re,def,sig) <- replCheckExpr expr -- XXX need more warnings from the module system- --io (mapM_ printWarning ws) whenDebug (rPutStrLn (dump def))- (_,_,names) <- getFocusedEnv+ (_,_,_,names) <- getFocusedEnv -- type annotation ':' has precedence 2 rPrint $ runDoc names $ ppPrec 2 expr <+> text ":" <+> pp sig @@ -622,18 +715,31 @@ (\(n,b) -> T.tIsBit b && T.tIsNum n == Just 8) (T.tIsSeq x) serializeValue (E.VSeq n vs) = do- ws <- io $ E.runEval (mapM (>>=E.fromVWord "serializeValue") $ E.enumerateSeqMap n vs)+ ws <- rEval+ (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]."] serializeByte (E.BV _ v) = fromIntegral (v .&. 0xFF) ++rEval :: E.Eval a -> REPL a+rEval m = do ev <- getEvalOpts+ io (E.runEval ev m)++rEvalRethrow :: E.Eval a -> REPL a+rEvalRethrow m = do ev <- getEvalOpts+ io $ rethrowEvalError $ E.runEval ev m+ reloadCmd :: REPL () reloadCmd = do mb <- getLoadedMod case mb of- Just m -> loadCmd (lPath m)+ Just lm ->+ case lName lm of+ Just m | M.isParamInstModName m -> loadHelper (M.loadModuleByName m)+ _ -> loadCmd (lPath lm) Nothing -> return () @@ -646,7 +752,7 @@ Just m -> do success <- replEdit (lPath m) if success- then loadCmd (lPath m)+ then reloadCmd else return () Nothing -> do@@ -655,17 +761,15 @@ | otherwise = do _ <- replEdit path- mb <- getLoadedMod- case mb of- Nothing -> loadCmd path- Just _ -> return ()+ setEditPath path+ reloadCmd moduleCmd :: String -> REPL () moduleCmd modString | null modString = return () | otherwise = do case parseModName modString of- Just m -> loadCmd =<< liftModuleCmd (M.findModule m)+ Just m -> loadHelper (M.loadModuleByName m) Nothing -> rPutStrLn "Invalid module name." loadPrelude :: REPL ()@@ -674,38 +778,49 @@ loadCmd :: FilePath -> REPL () loadCmd path | null path = return ()- | otherwise = do- setLoadedMod LoadedModule- { lName = Nothing- , lPath = path- }+ | otherwise = do setEditPath path+ loadHelper (M.loadModuleByPath path) - m <- liftModuleCmd (M.loadModuleByPath path)- whenDebug (rPutStrLn (dump m))- setLoadedMod LoadedModule+loadHelper :: M.ModuleCmd (FilePath,T.Module) -> REPL ()+loadHelper how =+ do clearLoadedMod+ (path,m) <- liftModuleCmd how+ whenDebug (rPutStrLn (dump m))+ setLoadedMod LoadedModule { lName = Just (T.mName m) , lPath = path }- setDynEnv mempty+ setDynEnv mempty quitCmd :: REPL () quitCmd = stop browseCmd :: String -> REPL ()-browseCmd pfx = do- (iface,names,disp) <- getFocusedEnv+browseCmd input = do+ (_,iface,names,disp) <- getFocusedEnv++ let mnames = map (M.textToModName . T.pack) (words input)+ validModNames <- (:) M.interactiveName <$> getModNames+ let checkModName m =+ unless (m `elem` validModNames) $+ rPutStrLn ("error: " ++ show m ++ " is not a loaded module.")+ mapM_ checkModName mnames++ let f &&& g = \x -> f x && g x+ isUser x = case M.nameInfo x of+ M.Declared _ M.SystemName -> False+ _ -> True+ inSet s x = x `Set.member` s+ let (visibleTypes,visibleDecls) = M.visibleNames names - (visibleType,visibleDecl)- | null pfx =- ((`Set.member` visibleTypes)- ,(`Set.member` visibleDecls))+ restricted = if null mnames then const True else hasAnyModName mnames - | otherwise =- (\n -> n `Set.member` visibleTypes && pfx `isNamePrefix` n- ,\n -> n `Set.member` visibleDecls && pfx `isNamePrefix` n)+ visibleType = isUser &&& restricted &&& inSet visibleTypes+ visibleDecl = isUser &&& restricted &&& inSet visibleDecls + browseTSyns visibleType iface disp browseNewtypes visibleType iface disp browseVars visibleDecl iface disp@@ -714,12 +829,15 @@ browseTSyns isVisible M.IfaceDecls { .. } names = do let tsyns = sortBy (M.cmpNameDisplay names `on` T.tsName) [ ts | ts <- Map.elems ifTySyns, isVisible (T.tsName ts) ]- unless (null tsyns) $ do- rPutStrLn "Type Synonyms"- rPutStrLn "============="- rPrint (runDoc names (nest 4 (vcat (map pp tsyns))))- rPutStrLn "" + (cts,tss) = partition isCtrait tsyns++ ppBlock names pp "Type Synonyms" tss+ ppBlock names pp "Constraint Synonyms" cts++ where+ isCtrait t = T.kindResult (T.kindOf (T.tsDef t)) == T.KProp+ browseNewtypes :: (M.Name -> Bool) -> M.IfaceDecls -> NameDisp -> REPL () browseNewtypes isVisible M.IfaceDecls { .. } names = do let nts = sortBy (M.cmpNameDisplay names `on` T.ntName)@@ -739,15 +857,19 @@ let isProp p = T.PragmaProperty `elem` (M.ifDeclPragmas p) (props,syms) = partition isProp vars - ppBlock "Properties" props- ppBlock "Symbols" syms - where- ppBlock name xs = unless (null xs) $+ let ppVar M.IfaceDecl { .. } = hang (pp ifDeclName <+> char ':')+ 2 (pp ifDeclSig)++ ppBlock names ppVar "Properties" props+ ppBlock names ppVar "Symbols" syms+++ppBlock :: NameDisp -> (a -> Doc) -> String -> [a] -> REPL ()+ppBlock names ppFun name xs = unless (null xs) $ do rPutStrLn name rPutStrLn (replicate (length name) '=')- let ppVar M.IfaceDecl { .. } = pp ifDeclName <+> char ':' <+> pp ifDeclSig- rPrint (runDoc names (nest 4 (vcat (map ppVar xs))))+ rPrint (runDoc names (nest 4 (vcat (map ppFun xs)))) rPutStrLn "" @@ -767,63 +889,181 @@ describe k = do ev <- tryGetUser k case ev of- Just (EnvString s) -> rPutStrLn (k ++ " = " ++ s)- Just (EnvProg p as) -> rPutStrLn (k ++ " = " ++ intercalate " " (p:as))- Just (EnvNum n) -> rPutStrLn (k ++ " = " ++ show n)- Just (EnvBool True) -> rPutStrLn (k ++ " = on")- Just (EnvBool False) -> rPutStrLn (k ++ " = off")- Nothing -> do rPutStrLn ("Unknown user option: `" ++ k ++ "`")- when (any isSpace k) $ do- let (k1, k2) = break isSpace k- rPutStrLn ("Did you mean: `:set " ++ k1 ++ " =" ++ k2 ++ "`?")+ Just v -> rPutStrLn (k ++ " = " ++ showEnvVal v)+ Nothing -> do rPutStrLn ("Unknown user option: `" ++ k ++ "`")+ when (any isSpace k) $ do+ let (k1, k2) = break isSpace k+ rPutStrLn ("Did you mean: `:set " ++ k1 ++ " =" ++ k2 ++ "`?") +showEnvVal :: EnvVal -> String+showEnvVal ev =+ case ev of+ EnvString s -> s+ EnvProg p as -> intercalate " " (p:as)+ EnvNum n -> show n+ EnvBool True -> "on"+ EnvBool False -> "off" -- XXX at the moment, this can only look at declarations. helpCmd :: String -> REPL () helpCmd cmd | null cmd = mapM_ rPutStrLn (genHelp commandList)+ | cmd0 : args <- words cmd, ":" `isPrefixOf` cmd0 =+ case findCommandExact cmd0 of+ [] -> void $ runCommand (Unknown cmd0)+ [c] -> showCmdHelp c args+ cs -> void $ runCommand (Ambiguous cmd0 (concatMap cNames cs)) | otherwise = case parseHelpName cmd of Just qname ->- do (env,rnEnv,nameEnv) <- getFocusedEnv- name <- liftModuleCmd (M.renameVar rnEnv qname)- case Map.lookup name (M.ifDecls env) of- Just M.IfaceDecl { .. } ->- do rPutStrLn ""+ do (params,env,rnEnv,nameEnv) <- getFocusedEnv+ let vNames = M.lookupValNames qname rnEnv+ tNames = M.lookupTypeNames qname rnEnv+ pNames = T.primTyFromPName qname - let property- | P.PragmaProperty `elem` ifDeclPragmas = text "property"- | otherwise = empty- rPrint $ runDoc nameEnv- $ nest 4- $ property- <+> pp qname- <+> colon- <+> pp (ifDeclSig)+ mapM_ (showTypeHelp params env nameEnv) tNames+ mapM_ (showValHelp params env nameEnv qname) vNames+ mapM_ (showPrimTyHelp nameEnv) pNames - 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.")+ when (null (vNames ++ tNames) && pNames == Nothing) $+ rPrint $ "Undefined name:" <+> pp qname+ Nothing ->+ rPutStrLn ("Unable to parse name: " ++ cmd) - in rPutStrLn ('\n' : msg)- Nothing -> return ()+ where+ noInfo nameEnv name =+ case M.nameInfo name of+ M.Declared m _ ->+ rPrint $runDoc nameEnv ("Name defined in module" <+> pp m)+ M.Parameter -> rPutStrLn "// No documentation is available." - case ifDeclDoc of- Just str -> rPutStrLn ('\n' : str)- Nothing -> return ()+ showPrimTyHelp nameEnv pt =+ do rPutStrLn ""+ let i = T.primTyIdent pt+ nm = pp (T.primTyIdent pt)+ pnam = if P.isInfixIdent i then parens nm else nm+ sig = "primitive type" <+> pnam <+> ":" <+> pp (T.kindOf (T.primTyCon pt))+ rPrint $ runDoc nameEnv $ nest 4 sig+ doShowFix (T.primTyFixity pt)+ rPutStrLn ""+ rPutStrLn (T.primTyDoc pt)+ rPutStrLn "" - Nothing -> rPutStrLn "// No documentation is available."+ showTypeHelp params env nameEnv name =+ fromMaybe (noInfo nameEnv name) $+ msum [ fromTySyn, fromNewtype, fromTyParam ] - Nothing ->- rPutStrLn ("Unable to parse name: " ++ cmd)+ where+ fromTySyn =+ do ts <- Map.lookup name (M.ifTySyns env)+ return (doShowTyHelp nameEnv (pp ts) (T.tsDoc ts)) + fromNewtype =+ do nt <- Map.lookup name (M.ifNewtypes env)+ let decl = pp nt $$ (pp name <+> text ":" <+> pp (T.newtypeConType nt))+ return $ doShowTyHelp nameEnv decl (T.ntDoc nt) + fromTyParam =+ do p <- Map.lookup name (M.ifParamTypes params)+ let uses c = T.TVBound (T.mtpParam p) `Set.member` T.fvs c+ ctrs = filter uses (map P.thing (M.ifParamConstraints params))+ ctrDoc = case ctrs of+ [] -> empty+ [x] -> pp x+ xs -> parens $ hsep $ punctuate comma $ map pp xs+ decl = text "parameter" <+> pp name <+> text ":"+ <+> pp (T.mtpKind p)+ $$ ctrDoc+ return $ doShowTyHelp nameEnv decl (T.mtpDoc p)++ doShowTyHelp nameEnv decl doc =+ do rPutStrLn ""+ rPrint (runDoc nameEnv (nest 4 decl))+ case doc of+ Nothing -> return ()+ Just d -> rPutStrLn "" >> rPutStrLn d++ doShowFix fx =+ case fx 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 ()++ showValHelp params env nameEnv qname name =+ fromMaybe (noInfo nameEnv name)+ (msum [ fromDecl, fromNewtype, fromParameter ])+ where+ fromDecl =+ do M.IfaceDecl { .. } <- Map.lookup name (M.ifDecls env)+ return $+ do rPutStrLn ""++ let property+ | P.PragmaProperty `elem` ifDeclPragmas = text "property"+ | otherwise = empty+ rPrint $ runDoc nameEnv+ $ nest 4+ $ property+ <+> pp qname+ <+> colon+ <+> pp (ifDeclSig)++ doShowFix $ ifDeclFixity `mplus`+ (guard ifDeclInfix >> return P.defaultFixity)++ case ifDeclDoc of+ Just str -> rPutStrLn ('\n' : str)+ Nothing -> return ()++ fromNewtype =+ do _ <- Map.lookup name (M.ifNewtypes env)+ return $ return ()++ fromParameter =+ do p <- Map.lookup name (M.ifParamFuns params)+ return $+ do rPutStrLn ""+ rPrint $ runDoc nameEnv+ $ nest 4+ $ text "parameter" <+> pp qname+ <+> colon+ <+> pp (T.mvpType p)++ doShowFix (T.mvpFixity p)++ case T.mvpDoc p of+ Just str -> rPutStrLn ('\n' : str)+ Nothing -> return ()++ showCmdHelp c [arg] | ":set" `elem` cNames c = showOptionHelp arg+ showCmdHelp c _args =+ do rPutStrLn ("\n " ++ intercalate ", " (cNames c))+ rPutStrLn ""+ rPutStrLn (cHelp c)+ rPutStrLn ""++ showOptionHelp arg =+ case lookupTrieExact arg userOptions of+ [opt] ->+ do let k = optName opt+ ev <- tryGetUser k+ rPutStrLn $ "\n " ++ k ++ " = " ++ maybe "???" showEnvVal ev+ rPutStrLn ""+ rPutStrLn ("Default value: " ++ showEnvVal (optDefault opt))+ rPutStrLn ""+ rPutStrLn (optHelp opt)+ rPutStrLn ""+ [] -> rPutStrLn ("Unknown setting name `" ++ arg ++ "`")+ _ -> rPutStrLn ("Ambiguous setting name `" ++ arg ++ "`")++ runShellCmd :: String -> REPL () runShellCmd cmd = io $ do h <- Process.runCommand cmd@@ -848,22 +1088,13 @@ -- Utilities ------------------------------------------------------------------- -isNamePrefix :: String -> M.Name -> Bool-isNamePrefix pfx =- let pfx' = ST.pack pfx- in \n -> case M.nameInfo n of- M.Declared _ -> pfx' `ST.isPrefixOf` M.identText (M.nameIdent n)- M.Parameter -> False+hasAnyModName :: [M.ModName] -> M.Name -> Bool+hasAnyModName mnames n =+ case M.nameInfo n of+ M.Declared m _ -> m `elem` mnames+ M.Parameter -> False -{--printWarning :: (Range,Warning) -> IO ()-printWarning = print . ppWarning--printError :: (Range,Error) -> IO ()-printError = print . ppError--}- -- | Lift a parsing action into the REPL monad. replParse :: (String -> Either ParseError a) -> String -> REPL a replParse parse str = case parse str of@@ -883,7 +1114,10 @@ getPrimMap = liftModuleCmd M.getPrimMap liftModuleCmd :: M.ModuleCmd a -> REPL a-liftModuleCmd cmd = moduleCmdResult =<< io . cmd =<< getModuleEnv+liftModuleCmd cmd =+ do evo <- getEvalOpts+ env <- getModuleEnv+ moduleCmdResult =<< io (cmd (evo,env)) moduleCmdResult :: M.ModuleRes a -> REPL a moduleCmdResult (res,ws0) = do@@ -911,12 +1145,18 @@ filterShadowing w = Just w let ws = mapMaybe filterDefaults . mapMaybe filterShadowing $ ws0- (_,_,names) <- getFocusedEnv+ (_,_,_,names) <- getFocusedEnv mapM_ (rPrint . runDoc names . pp) ws case res of Right (a,me') -> setModuleEnv me' >> return a- Left err -> raise (ModuleSystemError names err)+ Left err ->+ do e <- case err of+ M.ErrorInFile file e -> do setEditPath file+ return e+ _ -> return err+ raise (ModuleSystemError names e) + replCheckExpr :: P.Expr P.PName -> REPL (P.Expr M.Name,T.Expr,T.Schema) replCheckExpr e = liftModuleCmd $ M.checkExpr e @@ -944,17 +1184,16 @@ replEvalExpr :: P.Expr P.PName -> REPL (E.Value, T.Type) replEvalExpr expr = do (_,def,sig) <- replCheckExpr expr-+ validEvalContext def me <- getModuleEnv let cfg = M.meSolverConfig me- mbDef <- io $ CrySAT.withSolver cfg (\s -> defaultReplExpr s def sig)+ mbDef <- io $ SMT.withSolver cfg (\s -> defaultReplExpr s def sig) (def1,ty) <- case mbDef of Nothing -> raise (EvalPolyError sig) Just (tys,def1) ->- do let nms = T.addTNames (T.sVars sig) IntMap.empty- mapM_ (warnDefault nms) tys+ do warnDefaults tys let su = T.listSubst [ (T.tpVar a, t) | (a,t) <- tys ] return (def1, T.apSubst su (T.sType sig)) @@ -964,9 +1203,17 @@ bindItVariable ty def1 return (val,ty) where- warnDefault ns (x,t) =- rPrint $ text "Assuming" <+> ppWithNames ns x <+> text "=" <+> pp t+ warnDefaults ts =+ case ts of+ [] -> return ()+ _ ->+ do rPutStrLn "Showing a specific instance of polymorphic result:"+ mapM_ warnDefault ts + warnDefault (x,t) =+ rPrint (" *" <+> nest 2 ("Using" <+> quotes (pp t) <+> "for" <+>+ pp (T.tvarDesc (T.tpInfo x))))+ itIdent :: M.Ident itIdent = M.packIdent "it" @@ -984,7 +1231,7 @@ -- it to the current dynamic environment bindItVariable :: T.Type -> T.Expr -> REPL () bindItVariable ty expr = do- freshIt <- freshName itIdent+ freshIt <- freshName itIdent M.UserName let schema = T.Forall { T.sVars = [] , T.sProps = [] , T.sType = ty@@ -1003,6 +1250,21 @@ `M.shadowing` M.deNames denv setDynEnv $ denv { M.deNames = nenv' } ++-- | Extend the dynamic environment with a fresh binding for "it",+-- as defined by the given value. If we cannot determine the definition+-- of the value, then we don't bind `it`.+bindItVariableVal :: T.Type -> E.Value -> REPL ()+bindItVariableVal ty val =+ do prims <- getPrimMap+ mb <- rEval (E.toExpr prims ty val)+ case mb of+ Nothing -> return ()+ Just expr -> bindItVariable ty expr++++ -- | Creates a fresh binding of "it" to a finite sequence of -- expressions of the same type, and adds that sequence to the current -- dynamic environment@@ -1016,6 +1278,7 @@ replEvalDecl :: P.Decl P.PName -> REPL () replEvalDecl decl = do dgs <- replCheckDecls [decl]+ validEvalContext dgs whenDebug (mapM_ (\dg -> (rPutStrLn (dump dg))) dgs) liftModuleCmd (M.evalDecls dgs) @@ -1089,9 +1352,11 @@ ExprArg body -> Just (Command (body args')) DeclsArg body -> Just (Command (body args')) ExprTypeArg body -> Just (Command (body args'))+ ModNameArg body -> Just (Command (body args')) FilenameArg body -> Just (Command (body =<< expandHome args')) OptionArg body -> Just (Command (body args')) ShellArg body -> Just (Command (body args'))+ HelpArg body -> Just (Command (body args')) NoArg body -> Just (Command body) FileExprArg body -> case extractFilePath args' of
src/Cryptol/REPL/Monad.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.REPL.Monad -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -39,7 +39,8 @@ , getExprNames , getTypeNames , getPropertyNames- , LoadedModule(..), getLoadedMod, setLoadedMod+ , getModNames+ , LoadedModule(..), getLoadedMod, setLoadedMod, clearLoadedMod, setEditPath , setSearchPath, prependSearchPath , getPrompt , shouldContinue@@ -48,6 +49,7 @@ , disableLet , enableLet , getLetEnabled+ , validEvalContext , updateREPLTitle , setUpdateREPLTitle @@ -61,6 +63,7 @@ -- ** Configurable Output , getPutStr+ , getLogger , setPutStr -- ** Smoke Test@@ -82,13 +85,15 @@ import Cryptol.Parser.Position (emptyRange, Range(from)) import qualified Cryptol.TypeCheck.AST as T import qualified Cryptol.TypeCheck as T+import qualified Cryptol.IR.FreeVars as T import qualified Cryptol.Utils.Ident as I import Cryptol.Utils.PP import Cryptol.Utils.Panic (panic)+import Cryptol.Utils.Logger(Logger, logPutStr, funLogger) import qualified Cryptol.Parser.AST as P import Cryptol.Symbolic (proverNames, lookupProver, SatNum(..)) -import Control.Monad (ap,unless,when)+import Control.Monad (ap,unless,when,msum) import Control.Monad.Base import Control.Monad.IO.Class import Control.Monad.Trans.Control@@ -96,12 +101,13 @@ import Data.IORef (IORef,newIORef,readIORef,modifyIORef,atomicModifyIORef) import Data.List (intercalate, isPrefixOf, unfoldr, sortBy)-import Data.Maybe (catMaybes)+import Data.Maybe (catMaybes,mapMaybe) import Data.Ord (comparing) import Data.Typeable (Typeable) import System.Directory (findExecutable) import qualified Control.Exception as X import qualified Data.Map as Map+import qualified Data.Set as Set import Text.Read (readMaybe) import Data.SBV.Dynamic (sbvCheckSolverInstallation)@@ -111,26 +117,44 @@ -- REPL Environment ------------------------------------------------------------ +-- | This indicates what the user would like to work on. data LoadedModule = LoadedModule- { lName :: Maybe P.ModName -- ^ Focused module- , lPath :: FilePath -- ^ Focused file+ { lName :: Maybe P.ModName -- ^ Working on this module.+ , lPath :: FilePath -- ^ Working on this file. } -- | REPL RW Environment. data RW = RW { eLoadedMod :: Maybe LoadedModule+ -- ^ This is the name of the currently "focused" module.+ -- This is what we edit (:e) or reload (:r)+ , eContinue :: Bool+ -- ^ Should we keep going when we encounter an error, or give up.+ , eIsBatch :: Bool+ -- ^ Are we in batch mode.+ , eModuleEnv :: M.ModuleEnv+ -- ^ The current environment of all things loaded.+ , eUserEnv :: UserEnv- , ePutStr :: String -> IO ()+ -- ^ User settings++ , eLogger :: Logger+ -- ^ Use this to send messages to the user+ , eLetEnabled :: Bool+ -- ^ Should we allow `let` on the command line+ , eUpdateTitle :: REPL ()+ -- ^ Execute this every time we load a module.+ -- This is used to change the title of terminal when loading a module. } -- | Initial, empty environment.-defaultRW :: Bool -> IO RW-defaultRW isBatch = do+defaultRW :: Bool -> Logger -> IO RW+defaultRW isBatch l = do env <- M.initialModuleEnv return RW { eLoadedMod = Nothing@@ -138,7 +162,7 @@ , eIsBatch = isBatch , eModuleEnv = env , eUserEnv = mkUserEnv userOptions- , ePutStr = putStr+ , eLogger = l , eLetEnabled = True , eUpdateTitle = return () }@@ -155,9 +179,9 @@ newtype REPL a = REPL { unREPL :: IORef RW -> IO a } -- | Run a REPL action with a fresh environment.-runREPL :: Bool -> REPL a -> IO a-runREPL isBatch m = do- ref <- newIORef =<< defaultRW isBatch+runREPL :: Bool -> Logger -> REPL a -> IO a+runREPL isBatch l m = do+ ref <- newIORef =<< defaultRW isBatch l unREPL m ref instance Functor REPL where@@ -209,6 +233,8 @@ | ModuleSystemError NameDisp M.ModuleError | EvalPolyError T.Schema | TypeNotTestable T.Type+ | EvalInParamModule P.ModName [M.Name]+ | SBVError String deriving (Show,Typeable) instance X.Exception REPLException@@ -232,6 +258,9 @@ $$ text "Type:" <+> pp s TypeNotTestable t -> text "The expression is not of a testable type." $$ text "Type:" <+> pp t+ EvalInParamModule _ xs ->+ text "Expression depends on a module parameter:" <+> hsep (map pp xs)+ SBVError s -> text "SBV error:" $$ text s -- | Raise an exception. raise :: REPLException -> REPL a@@ -239,8 +268,9 @@ catch :: REPL a -> (REPLException -> REPL a) -> REPL a-catch m k = REPL (\ ref -> unREPL m ref `X.catch` \ e -> unREPL (k e) ref)+catch m k = REPL (\ ref -> rethrowEvalError (unREPL m ref) `X.catch` \ e -> unREPL (k e) ref) + rethrowEvalError :: IO a -> IO a rethrowEvalError m = run `X.catch` rethrow where@@ -256,6 +286,7 @@ -- Primitives ------------------------------------------------------------------ + io :: IO a -> REPL a io m = REPL (\ _ -> m) @@ -272,6 +303,12 @@ getPrompt :: REPL String getPrompt = mkPrompt `fmap` getRW ++clearLoadedMod :: REPL ()+clearLoadedMod = do modifyRW_ (\rw -> rw { eLoadedMod = upd <$> eLoadedMod rw })+ updateREPLTitle+ where upd x = x { lName = Nothing }+ -- | Set the name of the currently focused file, edited by @:e@ and loaded via -- @:r@. setLoadedMod :: LoadedModule -> REPL ()@@ -279,6 +316,9 @@ modifyRW_ (\ rw -> rw { eLoadedMod = Just n }) updateREPLTitle +setEditPath :: FilePath -> REPL ()+setEditPath p = setLoadedMod LoadedModule { lName = Nothing, lPath = p }+ getLoadedMod :: REPL (Maybe LoadedModule) getLoadedMod = eLoadedMod `fmap` getRW @@ -323,6 +363,42 @@ getLetEnabled :: REPL Bool getLetEnabled = fmap eLetEnabled getRW +-- | Is evaluation enabled. If the currently focused module is+-- parameterized, then we cannot evalute.+validEvalContext :: T.FreeVars a => a -> REPL ()+validEvalContext a =+ do me <- eModuleEnv <$> getRW+ case M.meFocusedModule me of+ Nothing -> return ()+ Just fm ->+ case M.lookupModule fm me of+ Just lm+ | Set.null tps && Set.null vps -> return ()+ | Just xs <- check (T.freeVars a) ->+ raise $ EvalInParamModule fm xs+ | otherwise -> return ()+ where+ m = M.lmModule lm++ tps = Set.fromList $ map T.mtpParam $ Map.elems $ T.mParamTypes m+ vps = Map.keysSet (T.mParamFuns m)++ bad ds | not $ null badTP = Just $ mapMaybe T.tpName badTP+ | not $ null badVP = Just badVP+ | otherwise = Nothing+ where+ badTP = Set.toList $ Set.intersection tps (T.tyParams ds)+ badVP = Set.toList $ Set.intersection vps (T.valDeps ds)++ check ds = msum (bad ds : map badSub (Set.toList (T.valDeps ds)))+ badSub x = maybe Nothing bad (Map.lookup x deps)+ deps = T.moduleDeps m++ Nothing ->+ panic "getEvalEnabled" ["The focused module is not loaded."+ , show fm ]++ -- | Update the title updateREPLTitle :: REPL () updateREPLTitle = unlessBatch $ do@@ -335,18 +411,23 @@ -- | Set the REPL's string-printer setPutStr :: (String -> IO ()) -> REPL ()-setPutStr fn = modifyRW_ (\rw -> rw { ePutStr = fn })+setPutStr fn = modifyRW_ $ \rw -> rw { eLogger = funLogger fn } -- | Get the REPL's string-printer getPutStr :: REPL (String -> IO ())-getPutStr = fmap ePutStr getRW+getPutStr =+ do rw <- getRW+ return (logPutStr (eLogger rw)) +getLogger :: REPL Logger+getLogger = eLogger <$> getRW + -- | Use the configured output action to print a string rPutStr :: String -> REPL () rPutStr str = do- rw <- getRW- io $ ePutStr rw str+ f <- getPutStr+ io (f str) -- | Use the configured output action to print a string with a trailing newline rPutStrLn :: String -> REPL ()@@ -356,14 +437,15 @@ rPrint :: Show a => a -> REPL () rPrint x = rPutStrLn (show x) -getFocusedEnv :: REPL (M.IfaceDecls,M.NamingEnv,NameDisp)+getFocusedEnv :: REPL (M.IfaceParams,M.IfaceDecls,M.NamingEnv,NameDisp) getFocusedEnv = do me <- getModuleEnv -- dyNames is a NameEnv that removes the #Uniq prefix from interactively-bound -- variables. let (dyDecls,dyNames,dyDisp) = M.dynamicEnv me- let (fDecls,fNames,fDisp) = M.focusedEnv me- return ( dyDecls `mappend` fDecls+ let (fParams,fDecls,fNames,fDisp) = M.focusedEnv me+ return ( fParams+ , dyDecls `mappend` fDecls , dyNames `M.shadowing` fNames , dyDisp `mappend` fDisp) @@ -390,41 +472,46 @@ getVars :: REPL (Map.Map M.Name M.IfaceDecl) getVars = do- (decls,_,_) <- getFocusedEnv+ (_,decls,_,_) <- getFocusedEnv return (M.ifDecls decls) getTSyns :: REPL (Map.Map M.Name T.TySyn) getTSyns = do- (decls,_,_) <- getFocusedEnv+ (_,decls,_,_) <- getFocusedEnv return (M.ifTySyns decls) getNewtypes :: REPL (Map.Map M.Name T.Newtype) getNewtypes = do- (decls,_,_) <- getFocusedEnv+ (_,decls,_,_) <- getFocusedEnv return (M.ifNewtypes decls) -- | Get visible variable names. getExprNames :: REPL [String] getExprNames =- do (_, fNames, _) <- getFocusedEnv+ do (_,_, fNames, _) <- getFocusedEnv return (map (show . pp) (Map.keys (M.neExprs fNames))) -- | Get visible type signature names. getTypeNames :: REPL [String] getTypeNames =- do (_, fNames, _) <- getFocusedEnv+ do (_,_, fNames, _) <- getFocusedEnv return (map (show . pp) (Map.keys (M.neTypes fNames))) -- | Return a list of property names, sorted by position in the file. getPropertyNames :: REPL ([M.Name],NameDisp) getPropertyNames =- do (decls,_,names) <- getFocusedEnv+ do (_,decls,_,names) <- getFocusedEnv let xs = M.ifDecls decls ps = sortBy (comparing (from . M.nameLoc)) $ [ x | (x,d) <- Map.toList xs, T.PragmaProperty `elem` M.ifDeclPragmas d ] return (ps, names) +getModNames :: REPL [I.ModName]+getModNames =+ do me <- getModuleEnv+ return (map T.mName (M.loadedModules me))+ getModuleEnv :: REPL M.ModuleEnv getModuleEnv = eModuleEnv `fmap` getRW @@ -439,6 +526,7 @@ me <- getModuleEnv setModuleEnv (me { M.meDynEnv = denv }) + -- | Given an existing qualified name, prefix it with a -- relatively-unique string. We make it unique by prefixing with a -- character @#@ that is not lexically valid in a module name.@@ -446,8 +534,8 @@ uniqify name = case M.nameInfo name of- M.Declared ns ->- M.liftSupply (M.mkDeclared ns (M.nameIdent name) (M.nameFixity name) (M.nameLoc name))+ M.Declared ns s ->+ M.liftSupply (M.mkDeclared ns s (M.nameIdent name) (M.nameFixity name) (M.nameLoc name)) M.Parameter -> panic "[REPL] uniqify" ["tried to uniqify a parameter: " ++ pretty name]@@ -465,8 +553,9 @@ -- | Generate a fresh name using the given index. The name will reside within -- the "<interactive>" namespace.-freshName :: I.Ident -> REPL M.Name-freshName i = M.liftSupply (M.mkDeclared I.interactiveName i Nothing emptyRange)+freshName :: I.Ident -> M.NameSource -> REPL M.Name+freshName i sys =+ M.liftSupply (M.mkDeclared I.interactiveName sys i Nothing emptyRange) -- User Environment Interaction ------------------------------------------------@@ -492,44 +581,38 @@ setUser name val = case lookupTrieExact name userOptions of [opt] -> setUserOpt opt- [] -> io (putStrLn ("Unknown env value `" ++ name ++ "`"))- _ -> io (putStrLn ("Ambiguous env value `" ++ name ++ "`"))+ [] -> rPutStrLn ("Unknown env value `" ++ name ++ "`")+ _ -> rPutStrLn ("Ambiguous env value `" ++ name ++ "`") where setUserOpt opt = case optDefault opt of- EnvString _ -> do r <- io (optCheck opt (EnvString val))- case r of- Just err -> io (putStrLn err)- Nothing -> writeEnv (EnvString val)+ EnvString _ -> doCheck (EnvString val) EnvProg _ _ -> case splitOptArgs val of- prog:args -> do r <- io (optCheck opt (EnvProg prog args))- case r of- Just err -> io (putStrLn err)- Nothing -> writeEnv (EnvProg prog args)- [] -> io (putStrLn ("Failed to parse command for field, `" ++ name ++ "`"))+ prog:args -> doCheck (EnvProg prog args)+ [] -> rPutStrLn ("Failed to parse command for field, `" ++ name ++ "`") EnvNum _ -> case reads val of- [(x,_)] -> do r <- io (optCheck opt (EnvNum x))- case r of- Just err -> io (putStrLn err)- Nothing -> writeEnv (EnvNum x)-- _ -> io (putStrLn ("Failed to parse number for field, `" ++ name ++ "`"))+ [(x,_)] -> doCheck (EnvNum x)+ _ -> rPutStrLn ("Failed to parse number for field, `" ++ name ++ "`") EnvBool _- | any (`isPrefixOf` val) ["enable","on","yes"] ->+ | any (`isPrefixOf` val) ["enable", "on", "yes", "true"] -> writeEnv (EnvBool True)- | any (`isPrefixOf` val) ["disable","off","no"] ->+ | any (`isPrefixOf` val) ["disable", "off", "no", "false"] -> writeEnv (EnvBool False) | otherwise ->- io (putStrLn ("Failed to parse boolean for field, `" ++ name ++ "`"))+ rPutStrLn ("Failed to parse boolean for field, `" ++ name ++ "`") where-+ doCheck v = do (r,ws) <- io (optCheck opt v)+ case r of+ Just err -> rPutStrLn err+ Nothing -> do mapM_ rPutStrLn ws+ writeEnv v writeEnv ev = do optEff opt ev- modifyRW_ (\rw -> rw { eUserEnv = Map.insert name ev (eUserEnv rw) })+ modifyRW_ (\rw -> rw { eUserEnv = Map.insert (optName opt) ev (eUserEnv rw) }) splitOptArgs :: String -> [String] splitOptArgs = unfoldr (parse "")@@ -581,50 +664,58 @@ where insert m d = insertTrie (optName d) d m +-- | Returns maybe an error, and some warnings+type Checker = EnvVal -> IO (Maybe String, [String])++noCheck :: Checker+noCheck _ = return (Nothing, [])++noWarns :: Maybe String -> IO (Maybe String, [String])+noWarns mb = return (mb, [])+ data OptionDescr = OptionDescr { optName :: String , optDefault :: EnvVal- , optCheck :: EnvVal -> IO (Maybe String)+ , optCheck :: Checker , optHelp :: String , optEff :: EnvVal -> REPL () } -simpleOpt :: String -> EnvVal -> (EnvVal -> IO (Maybe String)) -> String- -> OptionDescr+simpleOpt :: String -> EnvVal -> Checker -> String -> OptionDescr simpleOpt optName optDefault optCheck optHelp = OptionDescr { optEff = \ _ -> return (), .. } userOptions :: OptionMap userOptions = mkOptionMap [ simpleOpt "base" (EnvNum 16) checkBase- "the base to display words at"- , simpleOpt "debug" (EnvBool False) (const $ return Nothing)- "enable debugging output"- , simpleOpt "ascii" (EnvBool False) (const $ return Nothing)- "display 7- or 8-bit words using ASCII notation."+ "The base to display words at (2, 8, 10, or 16)."+ , simpleOpt "debug" (EnvBool False) noCheck+ "Enable debugging output."+ , simpleOpt "ascii" (EnvBool False) noCheck+ "Whether to display 7- or 8-bit words using ASCII notation." , simpleOpt "infLength" (EnvNum 5) checkInfLength "The number of elements to display for infinite sequences."- , simpleOpt "tests" (EnvNum 100) (const $ return Nothing)- "The number of random tests to try."+ , simpleOpt "tests" (EnvNum 100) noCheck+ "The number of random tests to try with ':check'." , simpleOpt "satNum" (EnvString "1") checkSatNum "The maximum number of :sat solutions to display (\"all\" for no limit)." , simpleOpt "prover" (EnvString "z3") checkProver $- "The external SMT solver for :prove and :sat (" ++ proverListString ++ ")."- , simpleOpt "warnDefaulting" (EnvBool True) (const $ return Nothing)- "Choose if we should display warnings when defaulting."- , simpleOpt "warnShadowing" (EnvBool True) (const $ return Nothing)- "Choose if we should display warnings when shadowing symbols."- , simpleOpt "smtfile" (EnvString "-") (const $ return Nothing)- "The file to use for SMT-Lib scripts (for debugging or offline proving)"- , OptionDescr "mono-binds" (EnvBool True) (const $ return Nothing)- "Whether or not to generalize bindings in a where-clause" $+ "The external SMT solver for ':prove' and ':sat'\n(" ++ proverListString ++ ")."+ , simpleOpt "warnDefaulting" (EnvBool True) noCheck+ "Choose whether to display warnings when defaulting."+ , simpleOpt "warnShadowing" (EnvBool True) noCheck+ "Choose whether to display warnings when shadowing symbols."+ , simpleOpt "smtfile" (EnvString "-") noCheck+ "The file to use for SMT-Lib scripts (for debugging or offline proving).\nUse \"-\" for stdout."+ , OptionDescr "mono-binds" (EnvBool True) noCheck+ "Whether or not to generalize bindings in a 'where' clause." $ \case EnvBool b -> do me <- getModuleEnv setModuleEnv me { M.meMonoBinds = b } _ -> return () , OptionDescr "tc-solver" (EnvProg "z3" [ "-smt2", "-in" ])- (const (return Nothing)) -- TODO: check for the program in the path- "The solver that will be used by the type checker" $+ noCheck -- TODO: check for the program in the path+ "The solver that will be used by the type checker." $ \case EnvProg prog args -> do me <- getModuleEnv let cfg = M.meSolverConfig me setModuleEnv me { M.meSolverConfig =@@ -633,65 +724,68 @@ _ -> return () , OptionDescr "tc-debug" (EnvNum 0)- (const (return Nothing))- "Enable type-checker debugging output" $+ noCheck+ "Enable type-checker debugging output." $ \case EnvNum n -> do me <- getModuleEnv let cfg = M.meSolverConfig me setModuleEnv me { M.meSolverConfig = cfg{ T.solverVerbose = fromIntegral n } } _ -> return () , OptionDescr "core-lint" (EnvBool False)- (const (return Nothing))- "Enable sanity checking of type-checker" $+ noCheck+ "Enable sanity checking of type-checker." $ let setIt x = do me <- getModuleEnv setModuleEnv me { M.meCoreLint = x } in \case EnvBool True -> setIt M.CoreLint EnvBool False -> setIt M.NoCoreLint _ -> return () - , simpleOpt "prover-stats" (EnvBool True) (const (return Nothing))+ , simpleOpt "prover-stats" (EnvBool True) noCheck "Enable prover timing statistics." ] -- | Check the value to the `base` option.-checkBase :: EnvVal -> IO (Maybe String)+checkBase :: Checker checkBase val = case val of EnvNum n- | n >= 2 && n <= 36 -> return Nothing- | otherwise -> return $ Just "base must fall between 2 and 36"- _ -> return $ Just "unable to parse a value for base"+ | n `elem` [2,8,10,16] -> noWarns Nothing+ | otherwise -> noWarns $ Just "base must be 2, 8, 10, or 16"+ _ -> noWarns $ Just "unable to parse a value for base" -checkInfLength :: EnvVal -> IO (Maybe String)+checkInfLength :: Checker checkInfLength val = case val of EnvNum n- | n >= 0 -> return Nothing- | otherwise -> return $ Just "the number of elements should be positive"- _ -> return $ Just "unable to parse a value for infLength"+ | n >= 0 -> noWarns Nothing+ | otherwise -> noWarns $ Just "the number of elements should be positive"+ _ -> noWarns $ Just "unable to parse a value for infLength" -checkProver :: EnvVal -> IO (Maybe String)+checkProver :: Checker checkProver val = case val of EnvString s- | s `notElem` proverNames -> return $ Just $ "Prover must be " ++ proverListString- | s `elem` ["offline", "any"] -> return Nothing- | otherwise -> do let prover = lookupProver s- available <- sbvCheckSolverInstallation prover- unless available $- putStrLn $ "Warning: " ++ s ++ " installation not found"- return Nothing+ | s `notElem` proverNames ->+ noWarns $ Just $ "Prover must be " ++ proverListString+ | s `elem` ["offline", "any"] -> noWarns Nothing+ | otherwise ->+ do let prover = lookupProver s+ available <- sbvCheckSolverInstallation prover+ let ws = if available+ then []+ else ["Warning: " ++ s ++ " installation not found"]+ return (Nothing, ws) - _ -> return $ Just "unable to parse a value for prover"+ _ -> noWarns $ Just "unable to parse a value for prover" proverListString :: String proverListString = concatMap (++ ", ") (init proverNames) ++ "or " ++ last proverNames -checkSatNum :: EnvVal -> IO (Maybe String)+checkSatNum :: Checker checkSatNum val = case val of- EnvString "all" -> return Nothing+ EnvString "all" -> noWarns Nothing EnvString s -> case readMaybe s :: Maybe Int of- Just n | n >= 1 -> return Nothing- _ -> return $ Just "must be an integer > 0 or \"all\""- _ -> return $ Just "unable to parse a value for satNum"+ Just n | n >= 1 -> noWarns Nothing+ _ -> noWarns $ Just "must be an integer > 0 or \"all\""+ _ -> noWarns $ Just "unable to parse a value for satNum" getUserSatNum :: REPL SatNum getUserSatNum = do
src/Cryptol/REPL/Trie.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.REPL.Trie -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/Symbolic.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Symbolic -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -18,6 +18,7 @@ import Control.Monad.IO.Class import Control.Monad (replicateM, when, zipWithM, foldM)+import Control.Monad.Writer (WriterT, runWriterT, tell, lift) import Data.List (intercalate, genericLength) import Data.IORef(IORef) import qualified Control.Exception as X@@ -43,6 +44,7 @@ import Cryptol.Utils.Ident (Ident) import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic)+import Cryptol.Utils.Logger(logPutStrLn) import Prelude () import Prelude.Compat@@ -124,13 +126,14 @@ thmSMTResults (SBV.ThmResult r) = [r] proverError :: String -> M.ModuleCmd (Maybe SBV.Solver, ProverResult)-proverError msg modEnv =+proverError msg (_,modEnv) = return (Right ((Nothing, ProverError msg), modEnv), []) satProve :: ProverCommand -> M.ModuleCmd (Maybe SBV.Solver, ProverResult) satProve ProverCommand {..} =- protectStack proverError $ \modEnv ->- M.runModuleM modEnv $ do+ protectStack proverError $ \(evo,modEnv) ->++ M.runModuleM (evo,modEnv) $ do let (isSat, mSatNum) = case pcQueryType of ProveQuery -> (False, Nothing) SatQuery sn -> case sn of@@ -145,14 +148,19 @@ let provers' = [ p { SBV.timing = SaveTiming pcProverStats, SBV.verbose = pcVerbose } | p <- provers ] let tyFn = if isSat then existsFinType else forallFinType+ let lPutStrLn = M.withLogger logPutStrLn+ let doEval :: MonadIO m => Eval.Eval a -> m a+ doEval m = liftIO $ Eval.runEval evo m let runProver fn tag e = do case provers of [prover] -> do- when pcVerbose $ M.io $- putStrLn $ "Trying proof with " ++ show (SBV.name (SBV.solver prover))+ when pcVerbose $+ lPutStrLn $ "Trying proof with " +++ show (SBV.name (SBV.solver prover)) res <- M.io (fn prover e)- when pcVerbose $ M.io $- putStrLn $ "Got result from " ++ show (SBV.name (SBV.solver prover))+ when pcVerbose $+ lPutStrLn $ "Got result from " +++ show (SBV.name (SBV.solver prover)) return (Just (SBV.name (SBV.solver prover)), tag res) _ -> return ( Nothing@@ -162,30 +170,33 @@ | prover <- provers ] ) runProvers fn tag e = do- when pcVerbose $ M.io $- putStrLn $ "Trying proof with " ++- intercalate ", " (map (show . SBV.name . SBV.solver) provers)+ when pcVerbose $+ lPutStrLn $ "Trying proof with " +++ 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 ++ ", time: " ++ showTDiff timeElapsed+ when pcVerbose $+ lPutStrLn $ "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+ let addAsm = case pcQueryType of+ ProveQuery -> \x y -> SBV.svOr (SBV.svNot x) y+ SatQuery _ -> \x y -> SBV.svAnd x y case predArgTypes pcSchema of Left msg -> return (Nothing, ProverError msg)- Right ts -> do when pcVerbose $ M.io $ putStrLn "Simulating..."- v <- M.io $ Eval.runEval $ do- env <- Eval.evalDecls extDgs mempty- Eval.evalExpr env pcExpr+ Right ts -> do when pcVerbose $ lPutStrLn "Simulating..."+ v <- doEval $ do env <- Eval.evalDecls extDgs mempty+ Eval.evalExpr env pcExpr prims <- M.getPrimMap runRes <- runFn $ do- args <- mapM tyFn ts- b <- liftIO $ Eval.runEval- (fromVBit <$> foldM fromVFun v (map Eval.ready args))- return b+ (args, asms) <- runWriterT (mapM tyFn ts)+ b <- doEval (fromVBit <$>+ foldM fromVFun v (map Eval.ready args))+ return (foldr addAsm b asms) let (firstProver, results') = runRes results = maybe results' (\n -> take n results') mSatNum esatexprs <- case results of@@ -199,8 +210,8 @@ let Right (_, cws) = SBV.getModelAssignment result (vs, _) = parseValues ts cws sattys = unFinType <$> ts- satexprs <- liftIO $ Eval.runEval- (zipWithM (Eval.toExpr prims) sattys vs)+ satexprs <-+ doEval (zipWithM (Eval.toExpr prims) sattys vs) case zip3 sattys <$> (sequence satexprs) <*> pure vs of Nothing -> panic "Cryptol.Symbolic.sat"@@ -221,23 +232,26 @@ satProveOffline :: ProverCommand -> M.ModuleCmd (Either String String) satProveOffline ProverCommand {..} =- protectStack (\msg modEnv -> return (Right (Left msg, modEnv), [])) $ \modEnv -> do+ protectStack (\msg (_,modEnv) -> return (Right (Left msg, modEnv), [])) $+ \(evOpts,modEnv) -> do let isSat = case pcQueryType of ProveQuery -> False SatQuery _ -> True let extDgs = allDeclGroups modEnv ++ pcExtraDecls let tyFn = if isSat then existsFinType else forallFinType+ let addAsm = if isSat then SBV.svAnd else \x y -> SBV.svOr (SBV.svNot x) y case predArgTypes pcSchema of Left msg -> return (Right (Left msg, modEnv), []) Right ts ->- do when pcVerbose $ putStrLn "Simulating..."- v <- liftIO $ Eval.runEval $+ do when pcVerbose $ logPutStrLn (Eval.evalLogger evOpts) "Simulating..."+ v <- liftIO $ Eval.runEval evOpts $ do env <- Eval.evalDecls extDgs mempty Eval.evalExpr env pcExpr smtlib <- SBV.generateSMTBenchmark isSat $ do- args <- mapM tyFn ts- liftIO $ Eval.runEval- (fromVBit <$> foldM fromVFun v (map Eval.ready args))+ (args, asms) <- runWriterT (mapM tyFn ts)+ b <- liftIO $ Eval.runEval evOpts+ (fromVBit <$> foldM fromVFun v (map Eval.ready args))+ return (foldr addAsm b asms) return (Right (Right smtlib, modEnv), []) protectStack :: (String -> M.ModuleCmd a)@@ -259,6 +273,11 @@ 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 FTInteger cws =+ case SBV.genParse SBV.KUnbounded cws of+ Just (x, cws') -> (Eval.VInteger x, cws')+ Nothing -> panic "Cryptol.Symbolic.parseValue" [ "no integer" ]+parseValue (FTIntMod _) cws = parseValue FTInteger 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@@ -282,6 +301,8 @@ data FinType = FTBit+ | FTInteger+ | FTIntMod Integer | FTSeq Int FinType | FTTuple [FinType] | FTRecord [(Ident, FinType)]@@ -295,6 +316,8 @@ finType ty = case ty of Eval.TVBit -> Just FTBit+ Eval.TVInteger -> Just FTInteger+ Eval.TVIntMod n -> Just (FTIntMod n) Eval.TVSeq n t -> FTSeq <$> numType n <*> finType t Eval.TVTuple ts -> FTTuple <$> traverse finType ts Eval.TVRec fields -> FTRecord <$> traverse (traverseSnd finType) fields@@ -304,6 +327,8 @@ unFinType fty = case fty of FTBit -> tBit+ FTInteger -> tInteger+ FTIntMod n -> tIntMod (tNum n) FTSeq l ety -> tSeq (tNum l) (unFinType ety) FTTuple ftys -> tTuple (unFinType <$> ftys) FTRecord fs -> tRec (zip fns tys)@@ -316,7 +341,7 @@ | null ts && null ps = case go <$> (Eval.evalType mempty ty) of Right (Just fts) -> Right fts- _ -> Left $ "Not a valid predicate type:\n" ++ show (pp schema)+ _ -> 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]@@ -324,23 +349,35 @@ go (Eval.TVFun ty1 ty2) = (:) <$> finType ty1 <*> go ty2 go _ = Nothing -forallFinType :: FinType -> SBV.Symbolic Value+inBoundsIntMod :: Integer -> SInteger -> SBool+inBoundsIntMod n x =+ SBV.svAnd (SBV.svLessEq (Eval.integerLit 0) x) (SBV.svLessThan x (Eval.integerLit n))++forallFinType :: FinType -> WriterT [SBool] SBV.Symbolic Value forallFinType ty = case ty of- FTBit -> VBit <$> forallSBool_+ FTBit -> VBit <$> lift forallSBool_+ FTInteger -> VInteger <$> lift forallSInteger_+ FTIntMod n -> do x <- lift forallSInteger_+ tell [inBoundsIntMod n x]+ return (VInteger x) FTSeq 0 FTBit -> return $ Eval.word 0 0- FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> (forallBV_ n)+ FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> lift (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 :: FinType -> WriterT [SBool] SBV.Symbolic Value existsFinType ty = case ty of- FTBit -> VBit <$> existsSBool_+ FTBit -> VBit <$> lift existsSBool_+ FTInteger -> VInteger <$> lift existsSInteger_+ FTIntMod n -> do x <- lift existsSInteger_+ tell [inBoundsIntMod n x]+ return (VInteger x) FTSeq 0 FTBit -> return $ Eval.word 0 0- FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> (existsBV_ n)+ FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> lift (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
src/Cryptol/Symbolic/Prims.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Symbolic.Prims -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -20,16 +20,15 @@ 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.Monad (Eval(..), ready, invalidIndex)+import Cryptol.Eval.Monad (Eval(..), ready, invalidIndex, cryUserError) import Cryptol.Eval.Type (finNat', TValue(..)) import Cryptol.Eval.Value (BitWord(..), EvalPrims(..), enumerateSeqMap, SeqMap(..), reverseSeqMap, wlam, nlam, WordValue(..),- asWordVal, asBitsVal, fromWordVal,+ asWordVal, fromWordVal, enumerateWordValue,+ updateWordValue, updateSeqMap, lookupSeqMap, memoMap ) import Cryptol.Prims.Eval (binary, unary, arithUnary, arithBinary, Binary, BinArith,@@ -37,8 +36,10 @@ ccatV, splitAtV, joinV, ecSplitV, reverseV, infFromV, infFromThenV, fromThenV, fromToV, fromThenToV,- transposeV, indexPrimOne, indexPrimMany,- ecDemoteV, updatePrim)+ transposeV, indexPrim,+ ecToIntegerV, ecFromIntegerV,+ ecNumberV, updatePrim, randomV, liftWord,+ cmpValue, lg2) import Cryptol.Symbolic.Value import Cryptol.TypeCheck.AST (Decl(..)) import Cryptol.TypeCheck.Solver.InfNat(Nat'(..))@@ -60,43 +61,68 @@ -- Primitives ------------------------------------------------------------------ -instance EvalPrims SBool SWord where+instance EvalPrims SBool SWord SInteger 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 x y- | Just b' <- SBV.svAsBool b = if b' then x else y- | otherwise = iteSValue b <$> x <*> y+ iteValue b x1 x2+ | Just b' <- SBV.svAsBool b = if b' then x1 else x2+ | otherwise = do v1 <- x1+ v2 <- x2+ iteSValue b v1 v2 -- See also Cryptol.Prims.Eval.primTable primTable :: Map.Map Ident Value primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v)) [ ("True" , VBit SBV.svTrue) , ("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 (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 (\_ -> 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))+ , ("number" , ecNumberV) -- Converts a numeric type into its corresponding value.+ -- { val, rep } (Literal val rep) => rep+ , ("+" , binary (arithBinary (liftBinArith SBV.svPlus) (liftBin SBV.svPlus)+ (const (liftBin SBV.svPlus)))) -- {a} (Arith a) => a -> a -> a+ , ("-" , binary (arithBinary (liftBinArith SBV.svMinus) (liftBin SBV.svMinus)+ (const (liftBin SBV.svMinus)))) -- {a} (Arith a) => a -> a -> a+ , ("*" , binary (arithBinary (liftBinArith SBV.svTimes) (liftBin SBV.svTimes)+ (const (liftBin SBV.svTimes)))) -- {a} (Arith a) => a -> a -> a+ , ("/" , binary (arithBinary (liftBinArith SBV.svQuot) (liftBin SBV.svQuot)+ (liftModBin SBV.svQuot))) -- {a} (Arith a) => a -> a -> a+ , ("%" , binary (arithBinary (liftBinArith SBV.svRem) (liftBin SBV.svRem)+ (liftModBin SBV.svRem))) -- {a} (Arith a) => a -> a -> a+ , ("^^" , binary (arithBinary sExp (liftBin SBV.svExp)+ sModExp)) -- {a} (Arith a) => a -> a -> a+ , ("lg2" , unary (arithUnary sLg2 svLg2 svModLg2)) -- {a} (Arith a) => a -> a+ , ("negate" , unary (arithUnary (\_ -> ready . SBV.svUNeg) (ready . SBV.svUNeg)+ (const (ready . SBV.svUNeg))))+ , ("<" , binary (cmpBinary cmpLt cmpLt cmpLt (cmpMod cmpLt) SBV.svFalse))+ , (">" , binary (cmpBinary cmpGt cmpGt cmpGt (cmpMod cmpGt) SBV.svFalse))+ , ("<=" , binary (cmpBinary cmpLtEq cmpLtEq cmpLtEq (cmpMod cmpLtEq) SBV.svTrue))+ , (">=" , binary (cmpBinary cmpGtEq cmpGtEq cmpGtEq (cmpMod cmpGtEq) SBV.svTrue))+ , ("==" , binary (cmpBinary cmpEq cmpEq cmpEq cmpModEq SBV.svTrue))+ , ("!=" , binary (cmpBinary cmpNotEq cmpNotEq cmpNotEq cmpModNotEq SBV.svFalse))+ , ("<$" , let boolFail = evalPanic "<$" ["Attempted signed comparison on bare Bit values"]+ intFail = evalPanic "<$" ["Attempted signed comparison on Integer values"]+ in binary (cmpBinary boolFail cmpSignedLt intFail (const intFail) SBV.svFalse))+ , ("/$" , binary (arithBinary (liftBinArith signedQuot) (liftBin SBV.svQuot)+ (liftModBin SBV.svQuot))) -- {a} (Arith a) => a -> a -> a+ , ("%$" , binary (arithBinary (liftBinArith signedRem) (liftBin SBV.svRem)+ (liftModBin SBV.svRem)))+ , (">>$" , sshrV) , ("&&" , 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" , tlam zeroV)+ , ("toInteger" , ecToIntegerV)+ , ("fromInteger" , ecFromIntegerV (const id))+ , ("fromZ" , nlam $ \ modulus ->+ lam $ \ x -> do+ val <- x+ case (modulus, val) of+ (Nat n, VInteger i) -> return $ VInteger (SBV.svRem i (integerLit n))+ _ -> evalPanic "fromZ" ["Invalid arguments"]) , ("<<" , logicShift "<<" SBV.svShiftLeft (\sz i shft ->@@ -122,6 +148,9 @@ Inf -> evalPanic "cannot rotate infinite sequence" [] Nat n -> Just ((i+n-shft) `mod` n))) + , ("carry" , liftWord carry)+ , ("scarry" , liftWord scarry)+ , ("#" , -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d nlam $ \ front -> nlam $ \ back ->@@ -160,46 +189,11 @@ , ("infFrom" , infFromV) , ("infFromThen" , infFromThenV) - , ("@" , indexPrimOne indexFront_bits indexFront)- , ("@@" , indexPrimMany indexFront_bits indexFront)- , ("!" , indexPrimOne indexBack_bits indexBack)- , ("!!" , indexPrimMany indexBack_bits indexBack)-- , ("update" , updatePrim updateFrontSym_bits updateFrontSym)- , ("updateEnd" , updatePrim updateBackSym_bits updateBackSym)-- , ("pmult" , -- {a,b} (fin a, fin b) => [1 + a] -> [1 + b] -> [1 + a + b]- nlam $ \(finNat' -> i) ->- nlam $ \(finNat' -> j) ->- 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 <- 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) ->- 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)+ , ("@" , indexPrim indexFront_bits indexFront)+ , ("!" , indexPrim indexBack_bits indexBack) - , ("pmod" , -- {a,b} (fin a, fin b) => [a] -> [b+1] -> [b]- nlam $ \(finNat' -> _i) ->- nlam $ \(finNat' -> j) ->- 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)+ , ("update" , updatePrim updateFrontSym_word updateFrontSym)+ , ("updateEnd" , updatePrim updateBackSym_word updateBackSym) -- {at,len} (fin len) => [len][8] -> at , ("error" ,@@ -209,11 +203,11 @@ 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" ])+ tlam $ \a ->+ wlam $ \x ->+ case SBV.svAsInteger x of+ Just i -> return $ randomV a i+ Nothing -> cryUserError "cannot evaluate 'random' with symbolic inputs") -- The trace function simply forces its first two -- values before returing the third in the symbolic@@ -231,13 +225,6 @@ ] -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@@ -264,16 +251,23 @@ return $ VWord w $ do x >>= \case WordVal x' -> WordVal . wop x' <$> asWordVal idx- wv ->- do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+ BitsVal bs0 ->+ do idx_bits <- enumerateWordValue 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+ BitsVal <$> shifter (mergeBits True) op bs0 idx_bits+ LargeBitsVal n bs0 ->+ do idx_bits <- enumerateWordValue idx+ let op bs shft = memoMap $ IndexSeqMap $ \i ->+ case reindex (Nat w) i shft of+ Nothing -> return $ VBit $ bitLit False+ Just i' -> lookupSeqMap bs i'+ LargeBitsVal n <$> shifter (mergeSeqMap True) op bs0 idx_bits - VSeq w vs0 ->- do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+ VSeq w vs0 ->+ do idx_bits <- enumerateWordValue idx let op vs shft = memoMap $ IndexSeqMap $ \i -> case reindex (Nat w) i shft of Nothing -> return $ zeroV a@@ -281,7 +275,7 @@ VSeq w <$> shifter (mergeSeqMap True) op vs0 idx_bits VStream vs0 ->- do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+ do idx_bits <- enumerateWordValue idx let op vs shft = memoMap $ IndexSeqMap $ \i -> case reindex Inf i shft of Nothing -> return $ zeroV a@@ -292,15 +286,16 @@ selectV :: forall a- . (SBool -> Eval a -> Eval a -> Eval a)- -> WordValue SBool SWord- -> (Integer -> Eval a)- -> Eval a+ . (SBool -> Eval a -> Eval a -> Eval a) -- ^ Mux function on @a@s+ -> WordValue SBool SWord SInteger -- ^ Symbolic index value+ -> (Integer -> Eval a) -- ^ Function from concrete indices to answers+ -> Eval a -- ^ overall answer 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)+ LargeBitsVal n xs -> sel 0 . map fromVBit =<< sequence (enumerateSeqMap n xs) where sel offset [] = f offset@@ -311,7 +306,7 @@ indexFront :: Maybe Integer -> TValue- -> SeqMap SBool SWord+ -> SeqMap SBool SWord SInteger -> SWord -> Eval Value indexFront mblen a xs idx@@ -323,22 +318,25 @@ = 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]+ return $ VWord wlen $ ready $ WordVal $ SBV.svSelect ws (wordLit wlen 0) idx+ Nothing -> foldr f def idxs | otherwise- = foldr f def [0 .. 2^w - 1]+ = foldr f def idxs 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+ idxs = case mblen of+ Just n | n < 2^w -> [0 .. n-1]+ _ -> [0 .. 2^w - 1] indexBack :: Maybe Integer -> TValue- -> SeqMap SBool SWord+ -> SeqMap SBool SWord SInteger -> SWord -> Eval Value indexBack (Just n) a xs idx = indexFront (Just n) a (reverseSeqMap n xs) idx@@ -346,7 +344,7 @@ indexFront_bits :: Maybe Integer -> TValue- -> SeqMap SBool SWord+ -> SeqMap SBool SWord SInteger -> Seq.Seq SBool -> Eval Value indexFront_bits mblen a xs bits0 = go 0 (length bits0) (Fold.toList bits0)@@ -372,7 +370,7 @@ indexBack_bits :: Maybe Integer -> TValue- -> SeqMap SBool SWord+ -> SeqMap SBool SWord SInteger -> Seq.Seq SBool -> Eval Value indexBack_bits (Just n) a xs idx = indexFront_bits (Just n) a (reverseSeqMap n xs) idx@@ -382,10 +380,10 @@ updateFrontSym :: Nat' -> TValue- -> SeqMap SBool SWord- -> WordValue SBool SWord- -> Eval (GenValue SBool SWord)- -> Eval (SeqMap SBool SWord)+ -> SeqMap SBool SWord SInteger+ -> WordValue SBool SWord SInteger+ -> Eval (GenValue SBool SWord SInteger)+ -> Eval (SeqMap SBool SWord SInteger) updateFrontSym len _eltTy vs w val = do -- TODO? alternate handling if w is a list of bits... case w of@@ -399,33 +397,24 @@ selectV iteValue w $ \j -> if i == j then val else lookupSeqMap vs i -updateFrontSym_bits+updateFrontSym_word :: 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+ -> WordValue SBool SWord SInteger+ -> WordValue SBool SWord SInteger+ -> Eval (GenValue SBool SWord SInteger)+ -> Eval (WordValue SBool SWord SInteger)+updateFrontSym_word Inf _ _ _ _ = evalPanic "Expected finite sequence" ["updateFrontSym_bits"]+updateFrontSym_word (Nat _) _eltTy bs w val =+ selectV (mergeWord' True) w $ \j -> updateWordValue bs j (fromVBit <$> val) updateBackSym :: Nat' -> TValue- -> SeqMap SBool SWord- -> WordValue SBool SWord- -> Eval (GenValue SBool SWord)- -> Eval (SeqMap SBool SWord)+ -> SeqMap SBool SWord SInteger+ -> WordValue SBool SWord SInteger+ -> Eval (GenValue SBool SWord SInteger)+ -> Eval (SeqMap SBool SWord SInteger) 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...@@ -438,26 +427,16 @@ selectV iteValue w $ \j -> if i == (n - j - 1) then val else lookupSeqMap vs i -updateBackSym_bits+updateBackSym_word :: 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-+ -> WordValue SBool SWord SInteger+ -> WordValue SBool SWord SInteger+ -> Eval (GenValue SBool SWord SInteger)+ -> Eval (WordValue SBool SWord SInteger)+updateBackSym_word Inf _ _ _ _ = evalPanic "Expected finite sequence" ["updateBackSym_bits"]+updateBackSym_word (Nat n) _eltTy bs w val = do+ selectV (mergeWord' True) w $ \j -> updateWordValue bs (n - j - 1) (fromVBit <$> val) asBitList :: [Eval SBool] -> Maybe [SBool] asBitList = go id@@ -467,20 +446,27 @@ go _ _ = Nothing -asWordList :: [WordValue SBool SWord] -> Maybe [SWord]+asWordList :: [WordValue SBool SWord SInteger] -> Maybe [SWord] asWordList = go id- where go :: ([SWord] -> [SWord]) -> [WordValue SBool SWord] -> Maybe [SWord]+ where go :: ([SWord] -> [SWord]) -> [WordValue SBool SWord SInteger] -> 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-+ go _f (LargeBitsVal _ _ : _) = Nothing liftBinArith :: (SWord -> SWord -> SWord) -> BinArith SWord liftBinArith op _ x y = ready $ op x y +liftBin :: (a -> b -> c) -> a -> b -> Eval c+liftBin op x y = ready $ op x y++liftModBin :: (SInteger -> SInteger -> a) -> Integer -> SInteger -> SInteger -> Eval a+liftModBin op modulus x y = ready $ op (SBV.svRem x m) (SBV.svRem y m)+ where m = integerLit modulus+ 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@@ -488,6 +474,10 @@ where a = go bs s = SBV.svTimes a a +sModExp :: Integer -> SInteger -> SInteger -> Eval SInteger+sModExp modulus x y = ready $ SBV.svExp x (SBV.svRem y m)+ where m = integerLit modulus+ -- | Ceiling (log_2 x) sLg2 :: Integer -> SWord -> Eval SWord sLg2 _w x = ready $ go 0@@ -496,38 +486,18 @@ go i | i < SBV.intSizeOf x = SBV.svIte (SBV.svLessEq x (lit (2^i))) (lit (toInteger i)) (go (i + 1)) | otherwise = lit (toInteger i) --- Cmp -------------------------------------------------------------------------+-- | Ceiling (log_2 x)+svLg2 :: SInteger -> Eval SInteger+svLg2 x =+ case SBV.svAsInteger x of+ Just n -> ready $ SBV.svInteger SBV.KUnbounded (lg2 n)+ Nothing -> evalPanic "cannot compute lg2 of symbolic unbounded integer" [] -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 =- case (v1, v2) of- (VRecord fs1, VRecord fs2) -> let vals = map snd . sortBy (comparing fst)- 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 ) -> 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" ]- (_ , _ ) -> panic "Cryptol.Symbolic.Prims.cmpValue"- [ "type mismatch" ]+svModLg2 :: Integer -> SInteger -> Eval SInteger+svModLg2 modulus x = svLg2 (SBV.svRem x m)+ where m = integerLit modulus - cmpValues (x1 : xs1) (x2 : xs2) k = do- x1' <- x1- x2' <- x2- cmp x1' x2' (cmpValues xs1 xs2 k)- cmpValues _ _ k = k+-- Cmp ------------------------------------------------------------------------- cmpEq :: SWord -> SWord -> Eval SBool -> Eval SBool cmpEq x y k = SBV.svAnd (SBV.svEqual x y) <$> k@@ -535,6 +505,11 @@ cmpNotEq :: SWord -> SWord -> Eval SBool -> Eval SBool cmpNotEq x y k = SBV.svOr (SBV.svNotEqual x y) <$> k +cmpSignedLt :: SWord -> SWord -> Eval SBool -> Eval SBool+cmpSignedLt x y k = SBV.svOr (SBV.svLessThan sx sy) <$> (cmpEq sx sy k)+ where sx = SBV.svSign x+ sy = SBV.svSign y+ 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)@@ -543,65 +518,62 @@ 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) +cmpMod ::+ (SInteger -> SInteger -> Eval SBool -> Eval SBool) ->+ (Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool)+cmpMod cmp modulus x y k = cmp (SBV.svRem x m) (SBV.svRem y m) k+ where m = integerLit modulus++cmpModEq :: Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool+cmpModEq m x y k = SBV.svAnd (svDivisible m (SBV.svMinus x y)) <$> k++cmpModNotEq :: Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool+cmpModNotEq m x y k = SBV.svOr (SBV.svNot (svDivisible m (SBV.svMinus x y))) <$> k++svDivisible :: Integer -> SInteger -> SBool+svDivisible m x = SBV.svEqual (SBV.svRem x (integerLit m)) (integerLit 0)+ 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)+ -> (SInteger -> SInteger -> Eval SBool -> Eval SBool)+ -> (Integer -> SInteger -> SInteger -> Eval SBool -> Eval SBool)+ -> SBool -> Binary SBool SWord SInteger+cmpBinary fb fw fi fz b ty v1 v2 = VBit <$> cmpValue fb fw fi fz ty v1 v2 (return b) --- Polynomials -----------------------------------------------------------------+-- Signed arithmetic ----------------------------------------------------------- --- TODO: Data.SBV.BitVectors.Polynomials should export ites, addPoly,--- and mdp (the following definitions are copied from that module)+signedQuot :: SWord -> SWord -> SWord+signedQuot x y = SBV.svUnsign (SBV.svQuot (SBV.svSign x) (SBV.svSign y)) --- | Add two polynomials-addPoly :: [SBool] -> [SBool] -> [SBool]-addPoly xs [] = xs-addPoly [] ys = ys-addPoly (x:xs) (y:ys) = SBV.svXOr x y : addPoly xs ys+signedRem :: SWord -> SWord -> SWord+signedRem x y = SBV.svUnsign (SBV.svRem (SBV.svSign x) (SBV.svSign y)) -ites :: SBool -> [SBool] -> [SBool] -> [SBool]-ites s xs ys- | Just t <- SBV.svAsBool s- = if t then xs else ys- | True- = go xs ys- where go [] [] = []- go [] (b:bs) = SBV.svIte s SBV.svFalse b : go [] bs- go (a:as) [] = SBV.svIte s a SBV.svFalse : go as []- go (a:as) (b:bs) = SBV.svIte s a b : go as bs --- conservative over-approximation of the degree-degree :: [SBool] -> Int-degree xs = walk (length xs - 1) $ reverse xs- where walk n [] = n- walk n (b:bs)- | Just t <- SBV.svAsBool b- = if t then n else walk (n-1) bs- | True- = n -- over-estimate--mdp :: [SBool] -> [SBool] -> ([SBool], [SBool])-mdp xs ys = go (length ys - 1) (reverse ys)- where degTop = degree xs- go _ [] = error "SBV.Polynomial.mdp: Impossible happened; exhausted ys before hitting 0"- go n (b:bs)- | n == 0 = (reverse qs, rs)- | True = let (rqs, rrs) = go (n-1) bs- in (ites b (reverse qs) rqs, ites b rs rrs)- where degQuot = degTop - n- ys' = replicate degQuot SBV.svFalse ++ ys- (qs, rs) = divx (degQuot+1) degTop xs ys'+sshrV :: Value+sshrV =+ nlam $ \_n ->+ nlam $ \_k ->+ wlam $ \x -> return $+ wlam $ \y ->+ case SBV.svAsInteger y of+ Just i ->+ let z = SBV.svUnsign (SBV.svShr (SBV.svSign x) (fromInteger i))+ in return . VWord (toInteger (SBV.intSizeOf x)) . ready . WordVal $ z+ Nothing ->+ let z = SBV.svUnsign (SBV.svShiftRight (SBV.svSign x) y)+ in return . VWord (toInteger (SBV.intSizeOf x)) . ready . WordVal $ z --- return the element at index i; if not enough elements, return false--- N.B. equivalent to '(xs ++ repeat false) !! i', but more efficient-nth :: [SBool] -> Int -> SBool-nth [] _ = SBV.svFalse-nth (x:_) 0 = x-nth (_:xs) i = nth xs (i-1)+carry :: SWord -> SWord -> Eval Value+carry x y = return $ VBit c+ where+ c = SBV.svLessThan (SBV.svPlus x y) x -divx :: Int -> Int -> [SBool] -> [SBool] -> ([SBool], [SBool])-divx n _ xs _ | n <= 0 = ([], xs)-divx n i xs ys' = (q:qs, rs)- where q = xs `nth` i- xs' = ites q (xs `addPoly` ys') xs- (qs, rs) = divx (n-1) (i-1) xs' (tail ys')+scarry :: SWord -> SWord -> Eval Value+scarry x y = return $ VBit sc+ where+ n = SBV.intSizeOf x+ z = SBV.svPlus (SBV.svSign x) (SBV.svSign y)+ xsign = SBV.svTestBit x (n-1)+ ysign = SBV.svTestBit y (n-1)+ zsign = SBV.svTestBit z (n-1)+ sc = SBV.svAnd (SBV.svEqual xsign ysign) (SBV.svNotEqual xsign zsign)
src/Cryptol/Symbolic/Value.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Symbolic.Value -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,11 +13,12 @@ {-# LANGUAGE TypeSynonymInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Cryptol.Symbolic.Value- ( SBool, SWord+ ( SBool, SWord, SInteger , literalSWord , fromBitsLE , forallBV_, existsBV_ , forallSBool_, existsSBool_+ , forallSInteger_, existsSInteger_ , Value , TValue, isTBit, tvSeq , GenValue(..), lam, tlam, toStream, toFinSeq, toSeq@@ -25,9 +26,11 @@ , fromSeq, fromVWord , evalPanic , iteSValue, mergeValue, mergeWord, mergeBit, mergeBits, mergeSeqMap+ , mergeWord' ) where +import Data.Bits (bit, complement) import Data.List (foldl') import qualified Data.Sequence as Seq @@ -35,12 +38,13 @@ --import Cryptol.Eval.Monad import Cryptol.Eval.Type (TValue(..), isTBit, tvSeq)-import Cryptol.Eval.Monad (Eval)+import Cryptol.Eval.Monad (Eval, ready) import Cryptol.Eval.Value ( GenValue(..), BitWord(..), lam, tlam, toStream,- toFinSeq, toSeq, WordValue(..), asBitsVal,+ toFinSeq, toSeq, WordValue(..), fromSeq, fromVBit, fromVWord, fromVFun, fromVPoly, fromVTuple, fromVRecord, lookupRecord, SeqMap(..),- ppBV,BV(..),integerToChar, lookupSeqMap )+ ppBV, BV(..), integerToChar, lookupSeqMap, memoMap,+ wordValueSize, asBitsMap) import Cryptol.Utils.Panic (panic) import Cryptol.Utils.PP @@ -51,6 +55,7 @@ type SBool = SVal type SWord = SVal+type SInteger = SVal fromBitsLE :: [SBool] -> SWord fromBitsLE bs = foldl' f (literalSWord 0 0) bs@@ -71,17 +76,23 @@ existsSBool_ :: Symbolic SBool existsSBool_ = ask >>= liftIO . svMkSymVar (Just EX) KBool Nothing +forallSInteger_ :: Symbolic SBool+forallSInteger_ = ask >>= liftIO . svMkSymVar (Just ALL) KUnbounded Nothing++existsSInteger_ :: Symbolic SBool+existsSInteger_ = ask >>= liftIO . svMkSymVar (Just EX) KUnbounded Nothing+ -- Values ---------------------------------------------------------------------- -type Value = GenValue SBool SWord+type Value = GenValue SBool SWord SInteger -- Symbolic Conditionals ------------------------------------------------------- -iteSValue :: SBool -> Value -> Value -> Value+iteSValue :: SBool -> Value -> Value -> Eval Value iteSValue c x y = case svAsBool c of- Just True -> x- Just False -> y+ Just True -> return x+ Just False -> return y Nothing -> mergeValue True c x y mergeBit :: Bool@@ -93,13 +104,27 @@ mergeWord :: Bool -> SBool- -> WordValue SBool SWord- -> WordValue SBool SWord- -> WordValue SBool SWord+ -> WordValue SBool SWord SInteger+ -> WordValue SBool SWord SInteger+ -> WordValue SBool SWord SInteger 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)+mergeWord f c (WordVal w1) (BitsVal ys) =+ BitsVal $ mergeBits f c (Seq.fromList $ map ready $ unpackWord w1) ys+mergeWord f c (BitsVal xs) (WordVal w2) =+ BitsVal $ mergeBits f c xs (Seq.fromList $ map ready $ unpackWord w2)+mergeWord f c (BitsVal xs) (BitsVal ys) =+ BitsVal $ mergeBits f c xs ys+mergeWord f c w1 w2 =+ LargeBitsVal (wordValueSize w1) (mergeSeqMap f c (asBitsMap w1) (asBitsMap w2)) +mergeWord' :: Bool+ -> SBool+ -> Eval (WordValue SBool SWord SInteger)+ -> Eval (WordValue SBool SWord SInteger)+ -> Eval (WordValue SBool SWord SInteger)+mergeWord' f c x y = mergeWord f c <$> x <*> y+ mergeBits :: Bool -> SBool -> Seq.Seq (Eval SBool)@@ -108,33 +133,49 @@ 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+mergeInteger :: Bool+ -> SBool+ -> SInteger+ -> SInteger+ -> SInteger+mergeInteger f c x y = svSymbolicMerge KUnbounded f c x y++mergeValue :: Bool -> SBool -> Value -> Value -> Eval 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 (\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)+ (VRecord fs1, VRecord fs2) -> pure $ VRecord $ zipWith mergeField fs1 fs2+ (VTuple vs1 , VTuple vs2 ) -> pure $ VTuple $ zipWith (mergeValue' f c) vs1 vs2+ (VBit b1 , VBit b2 ) -> pure $ VBit $ mergeBit f c b1 b2+ (VInteger i1, VInteger i2) -> pure $ VInteger $ mergeInteger f c i1 i2+ (VWord n1 w1, VWord n2 w2 ) | n1 == n2 -> pure $ VWord n1 $ mergeWord' f c w1 w2+ (VSeq n1 vs1, VSeq n2 vs2 ) | n1 == n2 -> VSeq n1 <$> memoMap (mergeSeqMap f c vs1 vs2)+ (VStream vs1, VStream vs2) -> VStream <$> memoMap (mergeSeqMap f c vs1 vs2)+ (VFun f1 , VFun f2 ) -> pure $ VFun $ \x -> mergeValue' f c (f1 x) (f2 x)+ (VPoly f1 , VPoly f2 ) -> pure $ VPoly $ \x -> mergeValue' f c (f1 x) (f2 x) (_ , _ ) -> panic "Cryptol.Symbolic.Value" [ "mergeValue: incompatible values" ] where 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" ] +mergeValue' :: Bool -> SBool -> Eval Value -> Eval Value -> Eval Value+mergeValue' f c x1 x2 =+ do v1 <- x1+ v2 <- x2+ mergeValue f c v1 v2 -mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord -> SeqMap SBool SWord -> SeqMap SBool SWord+mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord SInteger -> SeqMap SBool SWord SInteger -> SeqMap SBool SWord SInteger mergeSeqMap f c x y =- IndexSeqMap $ \i -> mergeValue f c <$> lookupSeqMap x i <*> lookupSeqMap y i+ IndexSeqMap $ \i ->+ do xi <- lookupSeqMap x i+ yi <- lookupSeqMap y i+ mergeValue f c xi yi -- Symbolic Big-endian Words ------------------------------------------------------- -instance BitWord SBool SWord where+instance BitWord SBool SWord SInteger where wordLen v = toInteger (intSizeOf v) wordAsChar v = integerToChar <$> svAsInteger v @@ -144,10 +185,22 @@ ppWord opts v | Just x <- svAsInteger v = ppBV opts (BV (wordLen v) x) | otherwise = text "[?]"+ ppInteger _opts v+ | Just x <- svAsInteger v = integer x+ | otherwise = text "[?]" bitLit b = svBool b wordLit n x = svInteger (KBounded False (fromInteger n)) x+ integerLit x = svInteger KUnbounded x + wordBit x idx = svTestBit x (intSizeOf x - 1 - fromIntegral idx)++ wordUpdate x idx b = svSymbolicMerge (kindOf x) False b wtrue wfalse+ where+ i' = intSizeOf x - 1 - fromInteger idx+ wtrue = x `svOr` svInteger (kindOf x) (bit i' :: Integer)+ wfalse = x `svAnd` svInteger (kindOf x) (complement (bit i' :: Integer))+ packWord bs = fromBitsLE (reverse bs) unpackWord x = [ svTestBit x i | i <- reverse [0 .. intSizeOf x - 1] ] @@ -164,6 +217,31 @@ wordPlus = svPlus wordMinus = svMinus wordMult = svTimes++ intPlus = svPlus+ intMinus = svMinus+ intMult = svTimes++ intModPlus _m = svPlus+ intModMinus _m = svMinus+ intModMult _m = svTimes++ wordToInt = svToInteger+ wordFromInt = svFromInteger++-- TODO: implement this properly in SBV using "bv2int"+svToInteger :: SWord -> SInteger+svToInteger w =+ case svAsInteger w of+ Nothing -> svFromIntegral KUnbounded w+ Just x -> svInteger KUnbounded x++-- TODO: implement this properly in SBV using "int2bv"+svFromInteger :: Integer -> SInteger -> SWord+svFromInteger n i =+ case svAsInteger i of+ Nothing -> svFromIntegral (KBounded False (fromInteger n)) i+ Just x -> literalSWord (fromInteger n) x -- Errors ----------------------------------------------------------------------
src/Cryptol/Testing/Concrete.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Testing.Concrete -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -9,7 +9,7 @@ {-# LANGUAGE RecordWildCards #-} module Cryptol.Testing.Concrete where -import Control.Monad (join)+import Control.Monad (join, liftM2) import Cryptol.Eval.Monad import Cryptol.Eval.Value@@ -37,11 +37,11 @@ -- Note that this function assumes that the values come from a call to -- `testableType` (i.e., things are type-correct). We run in the IO -- monad in order to catch any @EvalError@s.-runOneTest :: Value -> [Value] -> IO TestResult-runOneTest v0 vs0 = run `X.catch` handle+runOneTest :: EvalOpts -> Value -> [Value] -> IO TestResult+runOneTest evOpts v0 vs0 = run `X.catch` handle where run = do- result <- runEval (go v0 vs0)+ result <- runEval evOpts (go v0 vs0) if result then return Pass else return (FailFalse vs0)@@ -61,19 +61,20 @@ ] ++ 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. -}-testableType :: Type -> Maybe (Integer, [[Value]])+We also return the types of the arguments and+the total number of test (i.e., the length of the outer list. -}+testableType :: Type -> Maybe (Maybe Integer, [Type], [[Value]]) testableType ty = case tNoUser ty of TCon (TC TCFun) [t1,t2] ->- do sz <- typeSize t1- (tot,vss) <- testableType t2- return (sz * tot, [ v : vs | v <- typeValues t1, vs <- vss ])- TCon (TC TCBit) [] -> return (1, [[]])+ do let sz = typeSize t1+ (tot,ts,vss) <- testableType t2+ return (liftM2 (*) sz tot, t1:ts, [ v : vs | v <- typeValues t1, vs <- vss ])+ TCon (TC TCBit) [] -> return (Just 1, [], [[]]) _ -> Nothing {- | Given a fully-evaluated type, try to compute the number of values in it.-Returns `Nothing` for infinite types, user-defined types, polymorhic types,+Returns `Nothing` for infinite types, user-defined types, polymorphic types, and, currently, function spaces. Of course, we can easily compute the sizes of function spaces, but we can't easily enumerate their inhabitants. -} typeSize :: Type -> Maybe Integer@@ -87,6 +88,11 @@ (TCNum _, _) -> Nothing (TCInf, _) -> Nothing (TCBit, _) -> Just 2+ (TCInteger, _) -> Nothing+ (TCIntMod, [sz]) -> case tNoUser sz of+ TCon (TC (TCNum n)) _ -> Just n+ _ -> Nothing+ (TCIntMod, _) -> Nothing (TCSeq, [sz,el]) -> case tNoUser sz of TCon (TC (TCNum n)) _ -> (^ n) <$> typeSize el _ -> Nothing@@ -110,27 +116,33 @@ | (f,t) <- fs ] ] TCon (TC tc) ts ->- case (tc, ts) of- (TCNum _, _) -> []- (TCInf, _) -> []- (TCBit, _) -> [ VBit False, VBit True ]- (TCSeq, ts1) ->- case map tNoUser ts1 of- [ TCon (TC (TCNum n)) _, TCon (TC TCBit) [] ] ->- [ VWord n (ready (WordVal (BV n x))) | x <- [ 0 .. 2^n - 1 ] ]+ case tc of+ TCNum _ -> []+ TCInf -> []+ TCBit -> [ VBit False, VBit True ]+ TCInteger -> []+ TCIntMod ->+ case map tNoUser ts of+ [ TCon (TC (TCNum n)) _ ] | 0 < n ->+ [ VInteger x | x <- [ 0 .. n - 1 ] ]+ _ -> []+ TCSeq ->+ case map tNoUser ts of+ [ TCon (TC (TCNum n)) _, TCon (TC TCBit) [] ] ->+ [ VWord n (ready (WordVal (BV n x))) | x <- [ 0 .. 2^n - 1 ] ] - [ TCon (TC (TCNum n)) _, t ] ->- [ VSeq n (finiteSeqMap (map ready xs))- | xs <- sequence $ genericReplicate n- $ typeValues t ]- _ -> []+ [ TCon (TC (TCNum n)) _, t ] ->+ [ VSeq n (finiteSeqMap (map ready xs))+ | xs <- sequence $ genericReplicate n+ $ typeValues t ]+ _ -> [] - (TCFun, _) -> [] -- We don't generate function values.- (TCTuple _, els) -> [ VTuple (map ready xs)- | xs <- sequence (map typeValues els)- ]- (TCNewtype _, _) -> []+ TCFun -> [] -- We don't generate function values.+ TCTuple _ -> [ VTuple (map ready xs)+ | xs <- sequence (map typeValues ts)+ ]+ TCNewtype _ -> [] TCon _ _ -> [] @@ -141,7 +153,7 @@ testFn :: Integer -> s -> m (TestResult, s) , testProp :: String -- ^ The property as entered by the user , testTotal :: Integer- , testPossible :: Integer+ , testPossible :: Maybe Integer -- ^ Nothing indicates infinity , testRptProgress :: Integer -> Integer -> m () , testClrProgress :: m () , testRptFailure :: TestResult -> m ()@@ -152,7 +164,7 @@ reportResult :: TestResult , reportProp :: String -- ^ The property as entered by the user , reportTestsRun :: Integer- , reportTestsPossible :: Integer+ , reportTestsPossible :: Maybe Integer } runTests :: Monad m => TestSpec m s -> s -> m TestReport
src/Cryptol/Testing/Random.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Testing.Random -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -11,8 +11,8 @@ {-# LANGUAGE BangPatterns #-} module Cryptol.Testing.Random where -import Cryptol.Eval.Monad (ready)-import Cryptol.Eval.Value (BV(..),Value,GenValue(..),SeqMap(..), WordValue(..))+import Cryptol.Eval.Monad (ready,EvalOpts)+import Cryptol.Eval.Value (BV(..),Value,GenValue(..),SeqMap(..), WordValue(..), BitWord(..)) import qualified Cryptol.Testing.Concrete as Conc import Cryptol.TypeCheck.AST (Type(..),TCon(..),TC(..),tNoUser) import Cryptol.TypeCheck.SimpType(tRebuild')@@ -24,7 +24,7 @@ import System.Random (RandomGen, split, random, randomR) import qualified Data.Sequence as Seq -type Gen g = Integer -> g -> (Value, g)+type Gen g b w i = Integer -> g -> (GenValue b w i, g) {- | Apply a testable value to some randomly-generated arguments.@@ -35,21 +35,22 @@ the supplied value, otherwise we'll panic. -} runOneTest :: RandomGen g- => Value -- ^ Function under test- -> [Gen g] -- ^ Argument generators+ => EvalOpts -- ^ how to evaluate things+ -> Value -- ^ Function under test+ -> [Gen g Bool BV Integer] -- ^ Argument generators -> Integer -- ^ Size -> g -> IO (Conc.TestResult, g)-runOneTest fun argGens sz g0 = do+runOneTest evOpts fun argGens sz g0 = do let (args, g1) = foldr mkArg ([], g0) argGens mkArg argGen (as, g) = let (a, g') = argGen sz g in (a:as, g')- result <- Conc.runOneTest fun args+ result <- Conc.runOneTest evOpts fun args return (result, g1) {- | Given a (function) type, compute generators for the function's arguments. Currently we do not support polymorphic functions. In principle, we could apply these to random types, and test the results. -}-testableType :: RandomGen g => Type -> Maybe [Gen g]+testableType :: RandomGen g => Type -> Maybe [Gen g Bool BV Integer] testableType ty = case tNoUser ty of TCon (TC TCFun) [t1,t2] ->@@ -62,13 +63,18 @@ {- | A generator for values of the given type. This fails if we are given a type that lacks a suitable random value generator. -}-randomValue :: RandomGen g => Type -> Maybe (Gen g)+randomValue :: (BitWord b w i, RandomGen g) => Type -> Maybe (Gen g b w i) randomValue ty = case ty of TCon tc ts -> case (tc, map (tRebuild' False) ts) of (TC TCBit, []) -> Just randomBit + (TC TCInteger, []) -> Just randomInteger++ (TC TCIntMod, [TCon (TC (TCNum n)) []]) ->+ do return (randomIntMod n)+ (TC TCSeq, [TCon (TC TCInf) [], el]) -> do mk <- randomValue el return (randomStream mk)@@ -93,28 +99,48 @@ return (randomRecord gs) -- | Generate a random bit value.-randomBit :: RandomGen g => Gen g+randomBit :: (BitWord b w i, RandomGen g) => Gen g b w i randomBit _ g = let (b,g1) = random g- in (VBit b, g1)+ in (VBit (bitLit b), g1) +randomSize :: RandomGen g => Int -> Int -> g -> (Int, g)+randomSize k n g+ | p == 1 = (n, g')+ | otherwise = randomSize k (n + 1) g'+ where (p, g') = randomR (1, k) g++-- | Generate a random integer value. The size parameter is assumed to+-- vary between 1 and 100, and we use it to generate smaller numbers+-- first.+randomInteger :: (BitWord b w i, RandomGen g) => Gen g b w i+randomInteger w g =+ let (n, g1) = if w < 100 then (fromInteger w, g) else randomSize 8 100 g+ (x, g2) = randomR (- 256^n, 256^n) g1+ in (VInteger (integerLit x), g2)++randomIntMod :: (BitWord b w i, RandomGen g) => Integer -> Gen g b w i+randomIntMod modulus _ g =+ let (x, g') = randomR (0, modulus-1) g+ in (VInteger (integerLit x), g')+ -- | Generate a random word of the given length (i.e., a value of type @[w]@) -- The size parameter is assumed to vary between 1 and 100, and we use -- it to generate smaller numbers first.-randomWord :: RandomGen g => Integer -> Gen g+randomWord :: (BitWord b w i, RandomGen g) => Integer -> Gen g b w i randomWord w _sz g = let (val, g1) = randomR (0,2^w-1) g- in (VWord w (ready (WordVal (BV w val))), g1)+ in (VWord w (ready (WordVal (wordLit w val))), g1) -- | Generate a random infinite stream value.-randomStream :: RandomGen g => Gen g -> Gen g+randomStream :: RandomGen g => Gen g b w i -> Gen g b w i randomStream mkElem sz g = let (g1,g2) = split g in (VStream $ IndexSeqMap $ genericIndex (map ready (unfoldr (Just . mkElem sz) g1)), g2) {- | 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 :: RandomGen g => Integer -> Gen g b w i -> Gen g b w i randomSequence w mkElem sz g0 = do let (g1,g2) = split g0 let f g = let (x,g') = mkElem sz g@@ -123,7 +149,7 @@ seq xs (VSeq w $ IndexSeqMap $ (Seq.index xs . fromInteger), g2) -- | Generate a random tuple value.-randomTuple :: RandomGen g => [Gen g] -> Gen g+randomTuple :: RandomGen g => [Gen g b w i] -> Gen g b w i randomTuple gens sz = go [] gens where go els [] g = (VTuple (reverse els), g)@@ -132,19 +158,12 @@ in seq v (go (ready v : els) more g1) -- | Generate a random record value.-randomRecord :: RandomGen g => [(Ident, Gen g)] -> Gen g+randomRecord :: RandomGen g => [(Ident, Gen g b w i)] -> Gen g b w i randomRecord gens sz = go [] gens where go els [] g = (VRecord (reverse els), g) go els ((l,mkElem) : more) g = let (v, g1) = mkElem sz g in seq v (go ((l,ready v) : els) more g1)--{--test = do- g <- newStdGen- let (s,_) = randomSequence 100 (randomWord 256) 100 g- print $ ppValue defaultPPOpts { useBase = 16 } s--}
+ src/Cryptol/Transform/AddModParams.hs view
@@ -0,0 +1,315 @@+-- | Transformed a parametrized module into an ordinary module+-- where everything is parameterized by the module's parameters.+-- Note that this reuses the names from the original parameterized module.+module Cryptol.Transform.AddModParams (addModParams) where++import Data.Map ( Map )+import qualified Data.Map as Map+import Data.Set ( Set )+import qualified Data.Set as Set+import Data.Either(partitionEithers)+import Data.List(find,sortBy)+import Data.Ord(comparing)++import Cryptol.TypeCheck.AST+import Cryptol.Parser.Position(thing)+import Cryptol.ModuleSystem.Name(toParamInstName,asParamName,nameIdent+ ,paramModRecParam)+import Cryptol.Utils.Ident(paramInstModName)++{-+Note that we have to be careful when doing this transformation on+polyomorphic values. In particular,+++Consider type parameters AS, with constraints CS, and value+parameters (xs : TS).++ f : {as} PS => t+ f = f`{as} (<> ..)++ ~~>++ f : {AS ++ as} (CS ++ PS) => { TS } -> t+ f = /\ (AS ++ as) ->+ \\ (CS ++ PS) ->+ \r -> f`{AS ++ as} (<> ...) r++The tricky bit is that we can't just replace `f` with+a new version of `f` with some arguments, instead ew have+to modify the whole instantiation of `f` : f`{as} (<>...)++-}+++addModParams :: Module -> Either [Name] Module+addModParams m =+ case getParams m of+ Left errs -> Left errs+ Right ps ->+ let toInst = Set.unions ( Map.keysSet (mTySyns m)+ : Map.keysSet (mNewtypes m)+ : map defs (mDecls m)+ )+ inp = (toInst, ps { pTypeConstraints = inst inp (pTypeConstraints ps) })++ in Right m { mName = paramInstModName (mName m)+ , mTySyns = fixMap inp (mTySyns m)+ , mNewtypes = fixMap inp (mNewtypes m)+ , mDecls = fixUp inp (mDecls m)+ , mParamTypes = Map.empty+ , mParamConstraints = []+ , mParamFuns = Map.empty+ }++defs :: DeclGroup -> Set Name+defs dg =+ case dg of+ Recursive ds -> Set.fromList (map dName ds)+ NonRecursive d -> Set.singleton (dName d)++fixUp :: (AddParams a, Inst a) => Inp -> a -> a+fixUp i = addParams (snd i) . inst i++fixMap :: (AddParams a, Inst a) => Inp -> Map Name a -> Map Name a+fixMap i m =+ Map.fromList [ (toParamInstName x, fixUp i a) | (x,a) <- Map.toList m ]++--------------------------------------------------------------------------------++data Params = Params+ { pTypes :: [TParam]+ , pTypeConstraints :: [Prop]+ , pFuns :: [(Name,Type)]+ }+++getParams :: Module -> Either [Name] Params+getParams m+ | null errs =+ let ps = Params { pTypes = map rnTP+ $ sortBy (comparing mtpNumber)+ $ Map.elems+ $ mParamTypes m+ , pTypeConstraints = map thing (mParamConstraints m)+ , pFuns = oks+ }+ in Right ps+ | otherwise = Left errs+ where+ (errs,oks) = partitionEithers (map checkFunP (Map.toList (mParamFuns m)))++ checkFunP (x,s) = case isMono (mvpType s) of+ Just t -> Right (asParamName x, t)+ Nothing -> Left x++ rnTP tp = mtpParam tp { mtpName = asParamName (mtpName tp) }++--------------------------------------------------------------------------------++class AddParams a where+ addParams :: Params -> a -> a++instance AddParams a => AddParams [a] where+ addParams ps = map (addParams ps)++instance AddParams Schema where+ addParams ps s = s { sVars = pTypes ps ++ sVars s+ , sProps = pTypeConstraints ps ++ sProps s+ , sType = addParams ps (sType s)+ }++instance AddParams Type where+ addParams ps t+ | null (pFuns ps) = t+ | otherwise = tFun (paramRecTy ps) t+++instance AddParams Expr where+ addParams ps e = foldr ETAbs withProps (pTypes ps ++ as)+ where (as,rest1) = splitWhile splitTAbs e+ (bs,rest2) = splitWhile splitProofAbs rest1+ withProps = foldr EProofAbs withArgs (pTypeConstraints ps ++ bs)+ withArgs+ | null (pFuns ps) = rest2+ | otherwise = EAbs paramModRecParam (paramRecTy ps) rest2++++instance AddParams DeclGroup where+ addParams ps dg =+ case dg of+ Recursive ds -> Recursive (addParams ps ds)+ NonRecursive d -> NonRecursive (addParams ps d)++instance AddParams Decl where+ addParams ps d =+ case dDefinition d of+ DPrim -> d+ DExpr e -> d { dSignature = addParams ps (dSignature d)+ , dDefinition = DExpr (addParams ps e)+ , dName = toParamInstName (dName d)+ }++instance AddParams TySyn where+ addParams ps ts = ts { tsParams = pTypes ps ++ tsParams ts+ , tsConstraints = pTypeConstraints ps ++ tsConstraints ts+ -- do we need these here ^ ?+ , tsName = toParamInstName (tsName ts)+ }++instance AddParams Newtype where+ addParams ps nt = nt { ntParams = pTypes ps ++ ntParams nt+ , ntConstraints = pTypeConstraints ps ++ ntConstraints nt+ , ntName = toParamInstName (ntName nt)+ }++++--------------------------------------------------------------------------------++++++-- | Adjust uses of names to account for the new parameters.+-- Assumes unique names---no capture or shadowing.+class Inst a where+ inst :: Inp -> a -> a++-- | Set of top-level names which need to be instantiate, and module parameters.+type Inp = (Set Name, Params)+++paramRecTy :: Params -> Type+paramRecTy ps = tRec [ (nameIdent x, t) | (x,t) <- pFuns ps ]+++nameInst :: Inp -> Name -> [Type] -> Int -> Expr+nameInst (_,ps) x ts prfs+ | null (pFuns ps) = withProofs+ | otherwise = EApp withProofs (EVar paramModRecParam)+ where+ withProofs = iterate EProofApp withTys !!+ (length (pTypeConstraints ps) + prfs)++ withTys = foldl ETApp (EVar (toParamInstName x))+ (map (TVar . tpVar) (pTypes ps) ++ ts)+++-- | Extra parameters to dd when instantiating a type+instTyParams :: Inp -> [Type]+instTyParams (_,ps) = map (TVar . tpVar) (pTypes ps)+++needsInst :: Inp -> Name -> Bool+needsInst (xs,_) x = Set.member x xs++isVParam :: Inp -> Name -> Bool+isVParam (_,ps) x = x `elem` map fst (pFuns ps)++isTParam :: Inp -> TVar -> Maybe TParam+isTParam (_,ps) x =+ case x of+ TVBound tp -> find thisName (pTypes ps)+ where thisName y = tpName tp == tpName y+ _ -> Nothing+++instance Inst a => Inst [a] where+ inst ps = map (inst ps)++instance Inst Expr where+ inst ps expr =+ case expr of+ EVar x+ | needsInst ps x -> nameInst ps x [] 0+ | isVParam ps x ->+ let sh = map (nameIdent . fst) (pFuns (snd ps))+ in ESel (EVar paramModRecParam) (RecordSel (nameIdent x) (Just sh))+ | otherwise -> EVar x++ EList es t -> EList (inst ps es) (inst ps t)+ ETuple es -> ETuple (inst ps es)+ ERec fs -> ERec [ (f,inst ps e) | (f,e) <- fs ]+ ESel e s -> ESel (inst ps e) s++ EIf e1 e2 e3 -> EIf (inst ps e1) (inst ps e2) (inst ps e3)+ EComp t1 t2 e ms -> EComp (inst ps t1) (inst ps t2)+ (inst ps e) (inst ps ms)++ ETAbs x e -> ETAbs x (inst ps e)+ ETApp e1 t ->+ case splitExprInst expr of+ (EVar x, ts, prfs) | needsInst ps x -> nameInst ps x ts prfs+ _ -> ETApp (inst ps e1) t++ EApp e1 e2 -> EApp (inst ps e1) (inst ps e2)+ EAbs x t e -> EAbs x (inst ps t) (inst ps e)++ EProofAbs p e -> EProofAbs (inst ps p) (inst ps e)+ EProofApp e1 ->+ case splitExprInst expr of+ (EVar x, ts, prfs) | needsInst ps x -> nameInst ps x ts prfs+ _ -> EProofApp (inst ps e1)++ EWhere e dgs -> EWhere (inst ps e) (inst ps dgs)+++instance Inst Match where+ inst ps m =+ case m of+ From x t1 t2 e -> From x (inst ps t1) (inst ps t2) (inst ps e)+ Let d -> Let (inst ps d)++instance Inst DeclGroup where+ inst ps dg =+ case dg of+ Recursive ds -> Recursive (inst ps ds)+ NonRecursive d -> NonRecursive (inst ps d)++instance Inst Decl where+ inst ps d = d { dDefinition = inst ps (dDefinition d) }++instance Inst DeclDef where+ inst ps d =+ case d of+ DPrim -> DPrim+ DExpr e -> DExpr (inst ps e)++instance Inst Type where+ inst ps ty =+ case ty of+ TUser x ts t+ | needsInst ps x -> TUser x (instTyParams ps ++ ts1) t1+ | otherwise -> TUser x ts1 t1+ where ts1 = inst ps ts+ t1 = inst ps t++ TCon tc ts ->+ case tc of+ TC (TCNewtype (UserTC x k))+ | needsInst ps x -> TCon (TC (TCNewtype (UserTC x (k1 k))))+ (newTs ++ ts1)+ _ -> TCon tc ts1+ where+ ts1 = inst ps ts+ newTs = instTyParams ps+ k1 k = foldr (:->) k (map kindOf newTs)++ TVar x | Just x' <- isTParam ps x -> TVar (TVBound x')+ | otherwise -> ty++ TRec xs -> TRec [ (f,inst ps t) | (f,t) <- xs ]++instance Inst TySyn where+ inst ps ts = ts { tsConstraints = inst ps (tsConstraints ts)+ , tsDef = inst ps (tsDef ts)+ }++instance Inst Newtype where+ inst ps nt = nt { ntConstraints = inst ps (ntConstraints nt)+ , ntFields = [ (f, inst ps t) | (f,t) <- ntFields nt ]+ }++
src/Cryptol/Transform/MonoValues.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Transform.MonoValues -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -78,9 +78,10 @@ {-# LANGUAGE OverloadedStrings #-} module Cryptol.Transform.MonoValues (rewModule) where -import Cryptol.ModuleSystem.Name (SupplyT,liftSupply,Supply,mkDeclared)+import Cryptol.ModuleSystem.Name+ (SupplyT,liftSupply,Supply,mkDeclared,NameSource(..)) import Cryptol.Parser.Position (emptyRange)-import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.AST hiding (splitTApp) -- XXX: just use this one import Cryptol.TypeCheck.TypeMap import Cryptol.Utils.Ident (ModName) import Data.List(sortBy,groupBy)@@ -145,7 +146,7 @@ newName :: M Name newName = do ns <- ask- liftSupply (mkDeclared ns "$mono" Nothing emptyRange)+ liftSupply (mkDeclared ns SystemName "$mono" Nothing emptyRange) newTopOrLocalName :: M Name newTopOrLocalName = newName
src/Cryptol/Transform/Specialize.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Transform.Specialize -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -62,13 +62,13 @@ -- type-specialized versions of all functions called (transitively) by -- the body of the expression. specialize :: Expr -> M.ModuleCmd Expr-specialize expr modEnv = run $ do+specialize expr (ev,modEnv) = run $ do let extDgs = allDeclGroups modEnv let (tparams, expr') = destETAbs expr spec' <- specializeEWhere expr' extDgs return (foldr ETAbs spec' tparams) where- run = M.runModuleT modEnv . fmap fst . runSpecT Map.empty+ run = M.runModuleT (ev,modEnv) . fmap fst . runSpecT Map.empty specializeExpr :: Expr -> SpecM Expr specializeExpr expr =@@ -163,8 +163,8 @@ specializeDeclGroups :: [DeclGroup] -> SpecM ([DeclGroup], Map Name (TypesMap Name)) specializeDeclGroups dgs = do let decls = concatMap groupDecls dgs- let isMono s = null (sVars s) && null (sProps s)- let monos = [ EVar (dName d) | d <- decls, isMono (dSignature d) ]+ let isMonoType s = null (sVars s) && null (sProps s)+ let monos = [ EVar (dName d) | d <- decls, isMonoType (dSignature d) ] (_, dgs', names) <- withDeclGroups dgs $ mapM specializeExpr monos return (dgs', names) @@ -243,8 +243,8 @@ freshName :: Name -> [Type] -> SpecM Name freshName n _ = case nameInfo n of- Declared ns -> liftSupply (mkDeclared ns ident fx loc)- Parameter -> liftSupply (mkParameter ident loc)+ Declared ns s -> liftSupply (mkDeclared ns s ident fx loc)+ Parameter -> liftSupply (mkParameter ident loc) where fx = nameFixity n ident = nameIdent n
src/Cryptol/TypeCheck.hs view
@@ -1,14 +1,15 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable-{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE PatternGuards, OverloadedStrings #-} module Cryptol.TypeCheck ( tcModule+ , tcModuleInst , tcExpr , tcDecls , InferInput(..)@@ -22,11 +23,13 @@ , ppError ) where -import Cryptol.ModuleSystem.Name (liftSupply,mkDeclared)+import Cryptol.ModuleSystem.Name+ (liftSupply,mkDeclared,NameSource(..)) import qualified Cryptol.Parser.AST as P import Cryptol.Parser.Position(Range,emptyRange) import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Depends (FromDecl)+import Cryptol.TypeCheck.Error import Cryptol.TypeCheck.Monad ( runInferM , InferInput(..)@@ -36,22 +39,36 @@ , lookupVar ) import Cryptol.TypeCheck.Infer (inferModule, inferBinds, inferDs)-import Cryptol.TypeCheck.InferTypes(Error(..),Warning(..),VarType(..), SolverConfig(..))-import Cryptol.TypeCheck.Solve(simplifyAllConstraints)-import Cryptol.Utils.Ident (packModName,packIdent)+import Cryptol.TypeCheck.InferTypes(VarType(..), SolverConfig(..))+import Cryptol.TypeCheck.Solve(proveModuleTopLevel)+import Cryptol.TypeCheck.CheckModuleInstance(checkModuleInstance)+import Cryptol.TypeCheck.Monad(withParamType,withParameterConstraints)+import Cryptol.Utils.Ident (exprModName,packIdent) import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic) tcModule :: P.Module Name -> InferInput -> IO (InferOutput Module)-tcModule m inp = runInferM inp- $ do x <- inferModule m- simplifyAllConstraints- return x+tcModule m inp = runInferM inp (inferModule m) +-- | Check a module instantiation, assuming that the functor has already+-- been checked.+tcModuleInst :: Module {- ^ functor -} ->+ P.Module Name {- params -} ->+ InferInput {- ^ TC settings -} ->+ IO (InferOutput Module) {- ^ new version of instance -}+tcModuleInst func m inp = runInferM inp+ $ do x <- inferModule m+ y <- checkModuleInstance func x+ flip (foldr withParamType) (mParamTypes x) $+ withParameterConstraints (mParamConstraints x) $+ proveModuleTopLevel++ return y+ tcExpr :: P.Expr Name -> InferInput -> IO (InferOutput (Expr,Schema)) tcExpr e0 inp = runInferM inp $ do x <- go emptyRange e0- simplifyAllConstraints+ proveModuleTopLevel return x where@@ -63,11 +80,12 @@ case res of ExtVar s -> return (EVar x, s) CurSCC e' t -> panic "Cryptol.TypeCheck.tcExpr"- [ "CurSCC outside binder checkig:"+ [ "CurSCC outside binder checking:" , show e' , show t ]- _ -> do fresh <- liftSupply (mkDeclared (packModName ["<expr>"]) (packIdent "(expression)") Nothing loc)+ _ -> do fresh <- liftSupply (mkDeclared exprModName SystemName+ (packIdent "(expression)") Nothing loc) res <- inferBinds True False [ P.Bind { P.bName = P.Located { P.srcRange = loc, P.thing = fresh }@@ -95,13 +113,13 @@ tcDecls :: FromDecl d => [d] -> InferInput -> IO (InferOutput [DeclGroup]) tcDecls ds inp = runInferM inp $ inferDs ds $ \dgs -> do- simplifyAllConstraints+ proveModuleTopLevel return dgs ppWarning :: (Range,Warning) -> Doc-ppWarning (r,w) = text "[warning] at" <+> pp r <> colon $$ nest 2 (pp w)+ppWarning (r,w) = text "[warning] at" <+> pp r <.> colon $$ nest 2 (pp w) ppError :: (Range,Error) -> Doc-ppError (r,w) = text "[error] at" <+> pp r <> colon $$ nest 2 (pp w)+ppError (r,w) = text "[error] at" <+> pp r <.> colon $$ nest 2 (pp w)
src/Cryptol/TypeCheck/AST.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.AST -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -12,6 +12,7 @@ {-# LANGUAGE PatternGuards #-} {-# LANGUAGE FlexibleInstances, FlexibleContexts #-} {-# LANGUAGE DeriveAnyClass, DeriveGeneric #-}+{-# LANGUAGE OverloadedStrings #-} module Cryptol.TypeCheck.AST ( module Cryptol.TypeCheck.AST , Name()@@ -28,12 +29,14 @@ , module Cryptol.TypeCheck.Type ) where +import Cryptol.Parser.Position(Located) import Cryptol.ModuleSystem.Name+import Cryptol.ModuleSystem.Exports(ExportSpec(..)+ , isExportedBind, isExportedType) import Cryptol.Prims.Syntax import Cryptol.Parser.AST ( Selector(..),Pragma(..) , Import(..), ImportSpec(..), ExportType(..)- , ExportSpec(..), isExportedBind- , isExportedType, Fixity(..) )+ , Fixity(..)) import Cryptol.Utils.Ident (Ident,isInfixIdent,ModName,packIdent) import Cryptol.TypeCheck.PP import Cryptol.TypeCheck.Type@@ -42,19 +45,62 @@ import Control.DeepSeq import Data.Map (Map)+import qualified Data.Map as Map import qualified Data.IntMap as IntMap + -- | A Cryptol module.-data Module = Module { mName :: !ModName- , mExports :: ExportSpec Name- , mImports :: [Import]- , mTySyns :: Map Name TySyn- , mNewtypes :: Map Name Newtype- , mDecls :: [DeclGroup]+data Module = Module { mName :: !ModName+ , mExports :: ExportSpec Name+ , mImports :: [Import]++ , mTySyns :: Map Name TySyn+ -- ^ This is just the type-level type synonyms+ -- of a module.++ , mNewtypes :: Map Name Newtype+ , mParamTypes :: Map Name ModTParam+ , mParamConstraints :: [Located Prop]+ , mParamFuns :: Map Name ModVParam+ , mDecls :: [DeclGroup] } deriving (Show, Generic, NFData) +-- | Is this a parameterized module?+isParametrizedModule :: Module -> Bool+isParametrizedModule m = not (null (mParamTypes m) &&+ null (mParamConstraints m) &&+ null (mParamFuns m)) +-- | A type parameter of a module.+data ModTParam = ModTParam+ { mtpName :: Name+ , mtpKind :: Kind+ , mtpNumber :: !Int -- ^ The number of the parameter in the module+ -- This is used when we move parameters from the module+ -- level to individual declarations+ -- (type synonyms in particular)+ , mtpDoc :: Maybe String+ } deriving (Show,Generic,NFData) +mtpParam :: ModTParam -> TParam+mtpParam mtp = TParam { tpUnique = nameUnique (mtpName mtp)+ , tpKind = mtpKind mtp+ , tpFlav = TPModParam (mtpName mtp)+ , tpInfo = desc+ }+ where desc = TVarInfo { tvarDesc = TVFromModParam (mtpName mtp)+ , tvarSource = nameLoc (mtpName mtp)+ }++-- | A value parameter of a module.+data ModVParam = ModVParam+ { mvpName :: Name+ , mvpType :: Schema+ , mvpDoc :: Maybe String+ , mvpFixity :: Maybe Fixity+ } deriving (Show,Generic,NFData)++ data Expr = EList [Expr] Type -- ^ List value (with type of elements) | ETuple [Expr] -- ^ Tuple value | ERec [(Ident,Expr)] -- ^ Record value@@ -112,6 +158,7 @@ Recursive ds -> ds NonRecursive d -> [d] + data Decl = Decl { dName :: !Name , dSignature :: Schema , dDefinition :: DeclDef@@ -119,15 +166,14 @@ , dInfix :: !Bool , dFixity :: Maybe Fixity , dDoc :: Maybe String- } deriving (Show, Generic, NFData)+ } deriving (Generic, NFData, Show) data DeclDef = DPrim | DExpr Expr deriving (Show, Generic, NFData) --------------------------------------------------------------------------------- -+-------------------------------------------------------------------------------- -- | Construct a primitive, given a map to the unique names of the Cryptol -- module.@@ -144,7 +190,7 @@ eString prims str = EList (map (eChar prims) str) tChar eChar :: PrimMap -> Char -> Expr-eChar prims c = ETApp (ETApp (ePrim prims (packIdent "demote")) (tNum v)) (tNum w)+eChar prims c = ETApp (ETApp (ePrim prims (packIdent "number")) (tNum v)) (tWord (tNum w)) where v = fromEnum c w = 8 :: Int @@ -162,7 +208,7 @@ ERec fs -> braces $ sep $ punctuate comma [ pp f <+> text "=" <+> ppW e | (f,e) <- fs ] - ESel e sel -> ppWP 4 e <+> text "." <> pp sel+ ESel e sel -> ppWP 4 e <+> text "." <.> pp sel EIf e1 e2 e3 -> optParens (prec > 0) $ sep [ text "if" <+> ppW e1@@ -216,7 +262,7 @@ ppLam nm prec [] [] [] e = ppWithNamesPrec nm prec e ppLam nm prec ts ps xs e = optParens (prec > 0) $- sep [ text "\\" <> tsD <+> psD <+> xsD <+> text "->"+ sep [ text "\\" <.> tsD <+> psD <+> xsD <+> text "->" , ppWithNames ns1 e ] where@@ -249,6 +295,28 @@ splitProofAbs (EProofAbs p e) = Just (p,e) splitProofAbs _ = Nothing +splitTApp :: Expr -> Maybe (Type,Expr)+splitTApp (ETApp e t) = Just (t, e)+splitTApp _ = Nothing++splitProofApp :: Expr -> Maybe ((), Expr)+splitProofApp (EProofApp e) = Just ((), e)+splitProofApp _ = Nothing++-- | Deconstruct an expression, typically polymorphic, into+-- the types and proofs to which it is applied.+-- Since we don't store the proofs, we just return+-- the number of proof applications.+-- The first type is the one closest to the expr.+splitExprInst :: Expr -> (Expr, [Type], Int)+splitExprInst e = (e2, reverse ts, length ps)+ where+ (ps,e1) = splitWhile splitProofApp e+ (ts,e2) = splitWhile splitTApp e1++++ instance PP Expr where ppPrec n t = ppWithNamesPrec IntMap.empty n t @@ -300,5 +368,7 @@ -- XXX: Print exports? vcat (map pp mImports) $$ -- XXX: Print tysyns- vcat (map (ppWithNames nm) mDecls)+ -- XXX: Print abstarct types/functions+ vcat (map (ppWithNames (addTNames mps nm)) mDecls)+ where mps = map mtpParam (Map.elems mParamTypes)
+ src/Cryptol/TypeCheck/CheckModuleInstance.hs view
@@ -0,0 +1,183 @@+module Cryptol.TypeCheck.CheckModuleInstance (checkModuleInstance) where++import Data.Map ( Map )+import qualified Data.Map as Map+import Control.Monad(unless)++import Cryptol.Parser.Position(Located(..))+import qualified Cryptol.Parser.AST as P+import Cryptol.ModuleSystem.Name(Name,nameIdent,nameLoc)+import Cryptol.ModuleSystem.InstantiateModule(instantiateModule)+import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.Monad+import Cryptol.TypeCheck.Infer+import Cryptol.TypeCheck.Subst+import Cryptol.TypeCheck.Error+import Cryptol.Utils.PP+import Cryptol.Utils.Panic+++-- | Check that the instance provides what the functor needs.+checkModuleInstance :: Module {- ^ type-checked functor -} ->+ Module {- ^ type-checked instance -} ->+ InferM Module -- ^ Instantiated module+checkModuleInstance func inst =+ do tMap <- checkTyParams func inst+ vMap <- checkValParams func tMap inst+ (ctrs, m) <- instantiateModule func (mName inst) tMap vMap+ let toG p = Goal { goal = thing p+ , goalRange = srcRange p+ , goalSource = CtModuleInstance (mName inst)+ }+ addGoals (map toG ctrs)+ return Module { mName = mName m+ , mExports = mExports m+ , mImports = mImports inst ++ mImports m+ -- Note that this is just here to record+ -- the full dependencies, the actual imports+ -- might be ambiguous, but that shouldn't+ -- matters as names have been already resolved+ , mTySyns = Map.union (mTySyns inst) (mTySyns m)+ , mNewtypes = Map.union (mNewtypes inst) (mNewtypes m)+ , mParamTypes = mParamTypes inst+ , mParamConstraints = mParamConstraints inst+ , mParamFuns = mParamFuns inst+ , mDecls = mDecls inst ++ mDecls m+ }++-- | Check that the type parameters of the functors all have appropriate+-- definitions.+checkTyParams :: Module -> Module -> InferM (Map TParam Type)+checkTyParams func inst =+ Map.fromList <$> mapM checkTParamDefined (Map.elems (mParamTypes func))++ where+ -- Maps to lookup things by identifier (i.e., lexical name)+ -- rather than using the name unique.+ identMap f m = Map.fromList [ (f x, ts) | (x,ts) <- Map.toList m ]+ tySyns = identMap nameIdent (mTySyns inst)+ newTys = identMap nameIdent (mNewtypes inst)+ tParams = Map.fromList [ (tpId x, x) | x0 <- Map.elems (mParamTypes inst)+ , let x = mtpParam x0 ]++ tpId x = case tpName x of+ Just n -> nameIdent n+ Nothing -> panic "inferModuleInstance.tpId" ["Missing name"]++ -- Find a definition for a given type parameter+ checkTParamDefined tp0 =+ let tp = mtpParam tp0+ x = tpId tp+ in case Map.lookup x tySyns of+ Just ts -> checkTySynDef tp ts+ Nothing ->+ case Map.lookup x newTys of+ Just nt -> checkNewTyDef tp nt+ Nothing ->+ case Map.lookup x tParams of+ Just tp1 -> checkTP tp tp1+ Nothing ->+ do recordError $ ErrorMsg $+ text "Missing definition for type parameter:" <+> pp x+ return (tp, TVar (TVBound tp)) -- hm, maybe just stop!++ -- Check that a type parameter defined as a type synonym is OK+ checkTySynDef tp ts =+ do let k1 = kindOf tp+ k2 = kindOf ts+ unless (k1 == k2) (recordError (KindMismatch k1 k2))++ let nm = tsName ts+ src = CtPartialTypeFun (UserTyFun nm)+ mapM_ (newGoal src) (tsConstraints ts)++ return (tp, TUser nm [] (tsDef ts))++ -- Check that a type parameter defined a newtype is OK+ -- This one is a bit weird: since the newtype is deinfed in the+ -- instantiation, it will not be exported, and so won't be usable+ -- in type signatures, directly. This could be worked around+ -- if the parametrized module explictly exported a parameter via+ -- a type synonym like this: `type T = p`, where `p` is one of+ -- the parametersm and the declartion for `T` is public.+ checkNewTyDef tp nt =+ do let k1 = kindOf tp+ k2 = kindOf nt+ unless (k1 == k2) (recordError (KindMismatch k1 k2))++ let nm = ntName nt+ src = CtPartialTypeFun (UserTyFun nm)+ mapM_ (newGoal src) (ntConstraints nt)++ return (tp, TCon (TC (TCNewtype (UserTC nm k2))) [])++ -- Check that a type parameter defined as another type parameter is OK+ checkTP tp tp1 =+ do let k1 = kindOf tp+ k2 = kindOf tp1+ unless (k1 == k2) (recordError (KindMismatch k1 k2))++ return (tp, TVar (TVBound tp1))+++++checkValParams :: Module {- ^ Parameterized module -} ->+ Map TParam Type {- ^ Type instantiations -} ->+ Module {- ^ Instantiation module -} ->+ InferM (Map Name Expr)+ -- ^ Definitions for the parameters+checkValParams func tMap inst =+ Map.fromList <$> mapM checkParam (Map.elems (mParamFuns func))+ where+ valMap = Map.fromList (defByParam ++ defByDef)++ defByDef = [ (nameIdent (dName d), (dName d, dSignature d))+ | dg <- mDecls inst, d <- groupDecls dg ]++ defByParam = [ (nameIdent x, (x, mvpType s)) |+ (x,s) <- Map.toList (mParamFuns inst) ]++ su = listSubst [ (TVBound x, t) | (x,t) <- Map.toList tMap ]++ checkParam pr =+ let x = mvpName pr+ sP = mvpType pr+ in+ case Map.lookup (nameIdent x) valMap of+ Just (n,sD) -> do e <- makeValParamDef n sD (apSubst su sP)+ return (x,e)+ Nothing -> do recordError $ ErrorMsg+ $ text "Mising definition for value parameter"+ <+> pp x+ return (x, panic "checkValParams" ["Should not use this"])++++-- | Given a parameter definition, compute an appropriate instantiation+-- that will match the actual schema for the parameter.+makeValParamDef :: Name {- ^ Definition of parameter -} ->+ Schema {- ^ Schema for parameter definition -} ->+ Schema {- ^ Schema for parameter -} ->+ InferM Expr {- ^ Expression to use for param definition -}++makeValParamDef x sDef pDef =+ withVar x sDef $ do DExpr e <- dDefinition <$> checkSigB bnd (pDef,[])+ return e+ where+ bnd = P.Bind { P.bName = loc x+ , P.bParams = []+ , P.bDef = loc (P.DExpr (P.EVar x))++ -- unused+ , P.bSignature = Nothing+ , P.bInfix = False+ , P.bFixity = Nothing+ , P.bPragmas = []+ , P.bMono = False+ , P.bDoc = Nothing+ }+ loc a = P.Located { P.srcRange = nameLoc x, P.thing = a }+++
+ src/Cryptol/TypeCheck/Default.hs view
@@ -0,0 +1,195 @@+module Cryptol.TypeCheck.Default where++import qualified Data.Set as Set+import qualified Data.Map as Map+import Data.Maybe(mapMaybe)+import Data.List((\\),nub)+import Control.Monad(guard)++import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.SimpType(tMax,tWidth)+import Cryptol.TypeCheck.Error(Warning(..))+import Cryptol.TypeCheck.Subst(Subst,apSubst,listSubst,substBinds,singleSubst)+import Cryptol.TypeCheck.InferTypes(Goal,goal,Goals(..),goalsFromList)+import Cryptol.TypeCheck.Solver.SMT(Solver,tryGetModel,shrinkModel)+import Cryptol.Utils.Panic(panic)+++--------------------------------------------------------------------------------++-- | We default constraints of the form @Literal t a@ to @a := [width t]@+defaultLiterals :: [TVar] -> [Goal] -> ([TVar], Subst, [Warning])+defaultLiterals as gs = let (binds,warns) = unzip (mapMaybe tryDefVar as)+ in (as \\ map fst binds, listSubst binds, warns)+ where+ gSet = goalsFromList gs+ tryDefVar a =+ do gt <- Map.lookup a (literalGoals gSet)+ let d = tvInfo a+ defT = tWord (tWidth (goal gt))+ w = DefaultingTo d defT+ guard (not (Set.member a (fvs defT))) -- Currently shouldn't happen+ -- but future proofing.+ -- XXX: Make sure that `defT` has only variables that `a` is allowed+ -- to depend on+ return ((a,defT),w)++++++--------------------------------------------------------------------------------++-- This is what we use to avoid ambiguity when generalizing.++{- If a variable, `a`, is:+ 1. Of kind KNum+ 2. Generic (i.e., does not appear in the environment)+ 3. It appears only in constraints but not in the resulting type+ (i.e., it is not on the RHS of =>)+ 4. It (say, the variable 'a') appears only in constraints like this:+ 3.1 `a >= t` with (`a` not in `fvs t`)+ 3.2 in the `s` of `fin s`++ Then we replace `a` with `max(t1 .. tn)` where the `ts`+ are from the constraints `a >= t`.++ If `t1 .. tn` is empty, then we replace `a` with 0.++ This function assumes that 1-3 have been checked, and implements the rest.+ So, given some variables and constraints that are about to be generalized,+ we return:+ 1. a new (same or smaller) set of variables to quantify,+ 2. a new set of constraints,+ 3. a substitution which indicates what got defaulted.+-}++++++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+ -- leq: candidate definitions (i.e. of the form x >= t, x `notElem` fvs t)+ -- for each of these, we keep the list of `t`, and the free vars in them.+ -- fins: all `fin` constraints+ -- others: any other constraints+ classify leqs fins others [] =+ 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++ in ( [ a | a <- as, not (a `Set.member` names) ]+ , newOthers ++ others ++ nub (apSubst su fins)+ , su+ , map warn defs+ )+++ classify leqs fins others (prop : more) =+ case tNoUser (goal prop) of++ -- We found a `fin` constraint.+ TCon (PC PFin) [ _ ] -> classify leqs (prop : fins) others more++ -- Things of the form: x >= T(x) are not defaulted.+ TCon (PC PGeq) [ TVar x, t ]+ | x `elem` as && x `Set.notMember` freeRHS ->+ classify leqs' fins others more+ where freeRHS = fvs t+ add (xs1,vs1) (xs2,vs2) = (xs1 ++ xs2, Set.union vs1 vs2)+ leqs' = Map.insertWith add x ([(t,prop)],freeRHS) leqs++ _ -> classify leqs fins (prop : others) more+++ -- Pickout which variables may be defaulted and how.+ -- XXX: simpType t+ select yes no _ [] = ([ (x, t) | (x,t) <- yes ] ,no)+ select yes no otherFree ((x,(rhsG,vs)) : more) =+ select newYes newNo newFree newMore++ where+ (ts,gs) = unzip rhsG++ -- `x` selected only if appears nowehere else.+ -- this includes other candidates for defaulting.+ (newYes,newNo,newFree,newMore)++ -- Mentioned in other constraints, definately not defaultable.+ | x `Set.member` otherFree = noDefaulting++ | otherwise =+ let deps = [ y | (y,(_,yvs)) <- more, x `Set.member` yvs ]+ recs = filter (`Set.member` vs) deps+ in if not (null recs) || isBoundTV x -- x >= S(y), y >= T(x)+ then noDefaulting++ -- x >= S, y >= T(x) or+ -- x >= S(y), y >= S+ else yesDefaulting++ where+ noDefaulting = ( yes, gs ++ no, vs `Set.union` otherFree, more )++ yesDefaulting =+ let ty = case ts of+ [] -> tNum (0::Int)+ _ -> foldr1 tMax ts+ su1 = singleSubst x ty+ in ( (x,ty) : [ (y,apSubst su1 t) | (y,t) <- yes ]+ , no -- We know that `x` does not appear here+ , otherFree -- We know that `x` did not appear here either++ -- No need to update the `vs` because we've already+ -- checked that there are no recursive dependencies.+ , [ (y, (apSubst su1 ts1, vs1)) | (y,(ts1,vs1)) <- more ]+ )+++{- | Try to pick a reasonable instantiation for an expression with+the given type. This is useful when we do evaluation at the REPL.+The resulting types should satisfy the constraints of the schema.+The parameters should be all of numeric kind, and the props should als+be numeric -}+defaultReplExpr' :: Solver -> [TParam] -> [Prop] -> IO (Maybe [ (TParam,Type) ])+defaultReplExpr' sol as props =+ do let params = map tpVar as+ mb <- tryGetModel sol params props+ case mb of+ Nothing -> return Nothing+ Just mdl0 ->+ do mdl <- shrinkModel sol params props mdl0+ let su = listSubst [ (x, tNat' n) | (x,n) <- mdl ]+ return $+ do guard (null (concatMap pSplitAnd (apSubst su props)))+ tys <- mapM (bindParam su) params+ return (zip as tys)+ where+ bindParam su tp =+ do let ty = TVar tp+ ty' = apSubst su ty+ guard (ty /= ty')+ return ty'++++++
src/Cryptol/TypeCheck/Depends.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Depends -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,9 +13,10 @@ import Cryptol.ModuleSystem.Name (Name) import qualified Cryptol.Parser.AST as P import Cryptol.Parser.Position(Range, Located(..), thing)-import Cryptol.Parser.Names (namesB, namesT)-import Cryptol.TypeCheck.Monad( InferM, recordError, getTVars- , Error(..))+import Cryptol.Parser.Names (namesB, namesT, namesC)+import Cryptol.TypeCheck.Monad( InferM, recordError, getTVars )+import Cryptol.TypeCheck.Error(Error(..))+import Cryptol.Utils.Panic(panic) import Data.List(sortBy, groupBy) import Data.Function(on)@@ -26,8 +27,19 @@ import qualified Data.Map as Map import qualified Data.Set as Set -data TyDecl = TS (P.TySyn Name) | NT (P.Newtype Name)+data TyDecl = TS (P.TySyn Name) (Maybe String) -- ^ Type synonym+ | NT (P.Newtype Name) (Maybe String) -- ^ Newtype+ | AT (P.ParameterType Name) (Maybe String) -- ^ Parameter type+ | PS (P.PropSyn Name) (Maybe String) -- ^ Property synonym +setDocString :: Maybe String -> TyDecl -> TyDecl+setDocString x d =+ case d of+ TS a _ -> TS a x+ PS a _ -> PS a x+ NT a _ -> NT a x+ AT a _ -> AT a x+ -- | Check for duplicate and recursive type synonyms. -- Returns the type-synonyms in dependency order. orderTyDecls :: [TyDecl] -> InferM [TyDecl]@@ -39,7 +51,11 @@ concat `fmap` mapM check ordered where- toMap vs ty@(NT (P.Newtype x as fs)) =+ toMap _ ty@(AT a _) =+ let x = P.ptName a+ in ( thing x, x { thing = (ty, []) } )++ toMap vs ty@(NT (P.Newtype x as fs) _) = ( thing x , x { thing = (ty, Set.toList $ Set.difference@@ -49,7 +65,7 @@ } ) - toMap vs ty@(TS (P.TySyn x as t)) =+ toMap vs ty@(TS (P.TySyn x as t) _) = (thing x , x { thing = (ty, Set.toList $ Set.difference (namesT vs t)@@ -57,8 +73,17 @@ } ) - getN (TS (P.TySyn x _ _)) = thing x- getN (NT x) = thing (P.nName x)+ toMap vs ty@(PS (P.PropSyn x as ps) _) =+ (thing x+ , x { thing = (ty, Set.toList $+ Set.difference (Set.unions (map (namesC vs) ps))+ (Set.fromList (map P.tpName as)))+ }+ )+ getN (TS (P.TySyn x _ _) _) = thing x+ getN (PS (P.PropSyn x _ _) _) = thing x+ getN (NT x _) = thing (P.nName x)+ getN (AT x _) = thing (P.ptName x) check (AcyclicSCC x) = return [x] @@ -80,18 +105,28 @@ ] class FromDecl d where- toBind :: d -> Maybe (P.Bind Name)- toTyDecl :: d -> Maybe TyDecl- isTopDecl :: d -> Bool+ toBind :: d -> Maybe (P.Bind Name)+ toParamFun :: d -> Maybe (P.ParameterFun Name)+ toParamConstraints :: d -> [P.Located (P.Prop Name)]+ toTyDecl :: d -> Maybe TyDecl+ isTopDecl :: d -> Bool instance FromDecl (P.TopDecl Name) where toBind (P.Decl x) = toBind (P.tlValue x) toBind _ = Nothing - toTyDecl (P.TDNewtype d) = Just (NT (P.tlValue d))- toTyDecl (P.Decl x) = toTyDecl (P.tlValue x)- toTyDecl _ = Nothing+ toParamFun (P.DParameterFun d) = Just d+ toParamFun _ = Nothing + toParamConstraints (P.DParameterConstraint xs) = xs+ toParamConstraints _ = []++ toTyDecl (P.DParameterType d) = Just (AT d (P.ptDoc d))+ toTyDecl (P.TDNewtype d) = Just (NT (P.tlValue d) (thing <$> P.tlDoc d))+ toTyDecl (P.Decl x) = setDocString (thing <$> P.tlDoc x)+ <$> toTyDecl (P.tlValue x)+ toTyDecl _ = Nothing+ isTopDecl _ = True instance FromDecl (P.Decl Name) where@@ -99,8 +134,12 @@ toBind (P.DBind b) = return b toBind _ = Nothing + toParamFun _ = Nothing+ toParamConstraints _ = []+ toTyDecl (P.DLocated d _) = toTyDecl d- toTyDecl (P.DType x) = Just (TS x)+ toTyDecl (P.DType x) = Just (TS x Nothing)+ toTyDecl (P.DProp x) = Just (PS x Nothing) toTyDecl _ = Nothing isTopDecl _ = False@@ -122,21 +161,21 @@ {- | Combine a bunch of definitions into a single map. Here we check that each name is defined only onces. -} combineMaps :: [Map Name (Located a)] -> InferM (Map Name (Located a))-combineMaps ms =- do mapM_ recordError $- do m <- ms- (x,rs) <- duplicates [ a { thing = x } | (x,a) <- Map.toList m ]- return (RepeatedDefinitions x rs)- return (Map.unions ms)+combineMaps ms = if null bad then return (Map.unions ms)+ else panic "combineMaps" $ "Multiple definitions"+ : map show bad+ where+ bad = do m <- ms+ duplicates [ a { thing = x } | (x,a) <- Map.toList m ] {- | Combine a bunch of definitions into a single map. Here we check that each name is defined only onces. -} combine :: [(Name, Located a)] -> InferM (Map Name (Located a))-combine m =- do mapM_ recordError $- do (x,rs) <- duplicates [ a { thing = x } | (x,a) <- m ]- return (RepeatedDefinitions x rs)- return (Map.fromList m)+combine m = if null bad then return (Map.fromList m)+ else panic "combine" $ "Multiple definitions"+ : map show bad+ where+ bad = duplicates [ a { thing = x } | (x,a) <- m ] -- | Identify multiple occurances of something. duplicates :: Ord a => [Located a] -> [(a,[Range])]
+ src/Cryptol/TypeCheck/Error.hs view
@@ -0,0 +1,331 @@+{-# Language FlexibleInstances, DeriveGeneric, DeriveAnyClass #-}+{-# Language OverloadedStrings #-}+module Cryptol.TypeCheck.Error where+++import qualified Data.IntMap as IntMap+import qualified Data.Set as Set+import Control.DeepSeq(NFData)+import GHC.Generics(Generic)+import Data.List((\\),sortBy,groupBy,minimumBy)+import Data.Function(on)++import qualified Cryptol.Parser.AST as P+import Cryptol.Parser.Position(Located(..), Range(..))+import Cryptol.TypeCheck.PP+import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.InferTypes+import Cryptol.TypeCheck.Subst+import Cryptol.ModuleSystem.Name(Name)+import Cryptol.Utils.Ident(Ident)++cleanupErrors :: [(Range,Error)] -> [(Range,Error)]+cleanupErrors = dropErrorsFromSameLoc+ . sortBy (compare `on` (cmpR . fst)) -- order errors+ . dropSumbsumed+ where++ -- pick shortest error from each location.+ dropErrorsFromSameLoc = map chooseBestError+ . groupBy ((==) `on` fst)++ addErrorSize (r,e) = (length (show (pp e)), (r,e))+ chooseBestError = snd . minimumBy (compare `on` fst) . map addErrorSize+++ cmpR r = ( source r -- Frist by file+ , from r -- Then starting position+ , to r -- Finally end position+ )++ dropSumbsumed xs =+ case xs of+ (r,e) : rest -> (r,e) :+ dropSumbsumed (filter (not .subsumes e . snd) rest)+ [] -> []++-- | Should the first error suppress the next one.+subsumes :: Error -> Error -> Bool+subsumes (NotForAll x _) (NotForAll y _) = x == y+subsumes _ _ = False++data Warning = DefaultingKind (P.TParam Name) P.Kind+ | DefaultingWildType P.Kind+ | DefaultingTo TVarInfo Type+ deriving (Show, Generic, NFData)++-- | Various errors that might happen during type checking/inference+data Error = ErrorMsg Doc+ -- ^ Just say this++ | KindMismatch Kind Kind+ -- ^ Expected kind, inferred kind++ | TooManyTypeParams Int Kind+ -- ^ Number of extra parameters, kind of result+ -- (which should not be of the form @_ -> _@)++ | TyVarWithParams+ -- ^ A type variable was applied to some arguments.++ | TooManyTySynParams Name Int+ -- ^ Type-synonym, number of extra params++ | TooFewTySynParams Name Int+ -- ^ Type-synonym, number of missing params++ | RecursiveTypeDecls [Name]+ -- ^ The type synonym declarations are recursive++ | TypeMismatch Type Type+ -- ^ Expected type, inferred type++ | RecursiveType Type Type+ -- ^ Unification results in a recursive type++ | UnsolvedGoals Bool [Goal]+ -- ^ A constraint that we could not solve+ -- The boolean indicates if we know that this constraint+ -- is impossible.++ | UnsolvedDelayedCt DelayedCt+ -- ^ A constraint (with context) that we could not solve++ | UnexpectedTypeWildCard+ -- ^ Type wild cards are not allowed in this context+ -- (e.g., definitions of type synonyms).++ | TypeVariableEscaped Type [TParam]+ -- ^ Unification variable depends on quantified variables+ -- that are not in scope.++ | NotForAll TVar Type+ -- ^ Quantified type variables (of kind *) need to+ -- match the given type, so it does not work for all types.++ | UnusableFunction Name [Prop]+ -- ^ The given constraints causes the signature of the+ -- function to be not-satisfiable.++ | TooManyPositionalTypeParams+ -- ^ Too many positional type arguments, in an explicit+ -- type instantiation++ | CannotMixPositionalAndNamedTypeParams++ | UndefinedTypeParameter (Located Ident)++ | RepeatedTypeParameter Ident [Range]++ | AmbiguousType [Name] [TVar]+++ deriving (Show, Generic, NFData)++instance TVars Warning where+ apSubst su warn =+ case warn of+ DefaultingKind {} -> warn+ DefaultingWildType {} -> warn+ DefaultingTo d ty -> DefaultingTo d (apSubst su ty)++instance FVS Warning where+ fvs warn =+ case warn of+ DefaultingKind {} -> Set.empty+ DefaultingWildType {} -> Set.empty+ DefaultingTo _ ty -> fvs ty++instance TVars Error where+ apSubst su err =+ case err of+ ErrorMsg _ -> err+ KindMismatch {} -> err+ TooManyTypeParams {} -> err+ TyVarWithParams -> err+ TooManyTySynParams {} -> err+ TooFewTySynParams {} -> err+ RecursiveTypeDecls {} -> err+ TypeMismatch t1 t2 -> TypeMismatch (apSubst su t1) (apSubst su t2)+ RecursiveType t1 t2 -> RecursiveType (apSubst su t1) (apSubst su t2)+ UnsolvedGoals x gs -> UnsolvedGoals x (apSubst su gs)+ UnsolvedDelayedCt g -> UnsolvedDelayedCt (apSubst su g)+ UnexpectedTypeWildCard -> err+ TypeVariableEscaped t xs -> TypeVariableEscaped (apSubst su t) xs+ NotForAll x t -> NotForAll x (apSubst su t)+ UnusableFunction f ps -> UnusableFunction f (apSubst su ps)+ TooManyPositionalTypeParams -> err+ CannotMixPositionalAndNamedTypeParams -> err+ AmbiguousType _ _vs -> err+ -- XXX: shoudln't be applying to these vars,+ -- they are ambiguous, after all++ UndefinedTypeParameter {} -> err+ RepeatedTypeParameter {} -> err+++instance FVS Error where+ fvs err =+ case err of+ ErrorMsg {} -> Set.empty+ KindMismatch {} -> Set.empty+ TooManyTypeParams {} -> Set.empty+ TyVarWithParams -> Set.empty+ TooManyTySynParams {} -> Set.empty+ TooFewTySynParams {} -> Set.empty+ RecursiveTypeDecls {} -> Set.empty+ TypeMismatch t1 t2 -> fvs (t1,t2)+ RecursiveType t1 t2 -> fvs (t1,t2)+ UnsolvedGoals _ gs -> fvs gs+ UnsolvedDelayedCt g -> fvs g+ UnexpectedTypeWildCard -> Set.empty+ TypeVariableEscaped t xs -> fvs t `Set.union`+ Set.fromList (map TVBound xs)+ NotForAll x t -> Set.insert x (fvs t)+ UnusableFunction _ p -> fvs p+ TooManyPositionalTypeParams -> Set.empty+ CannotMixPositionalAndNamedTypeParams -> Set.empty+ AmbiguousType _ _vs -> Set.empty+ UndefinedTypeParameter {} -> Set.empty+ RepeatedTypeParameter {} -> Set.empty++++instance PP Warning where+ ppPrec = ppWithNamesPrec IntMap.empty++instance PP Error where+ ppPrec = ppWithNamesPrec IntMap.empty+++instance PP (WithNames Warning) where+ ppPrec _ (WithNames warn names) =+ addTVarsDescs names warn $+ case warn of+ DefaultingKind x k ->+ text "Assuming " <+> pp x <+> text "to have" <+> P.cppKind k++ DefaultingWildType k ->+ text "Assuming _ to have" <+> P.cppKind k++ DefaultingTo d ty ->+ text "Defaulting" <+> pp (tvarDesc d) <+> text "to"+ <+> ppWithNames names ty++instance PP (WithNames Error) where+ ppPrec _ (WithNames err names) =+ addTVarsDescs names err $+ case err of+ ErrorMsg msg -> msg++ RecursiveType t1 t2 ->+ nested (text "Matching would result in an infinite type.")+ (text "The type: " <+> ppWithNames names t1 $$+ text "occurs in:" <+> ppWithNames names t2)++ UnexpectedTypeWildCard ->+ nested (text "Wild card types are not allowed in this context")+ (text "(e.g., they cannot be used in type synonyms).")++ KindMismatch k1 k2 ->+ nested (text "Incorrect type form.")+ (text "Expected:" <+> cppKind k1 $$+ text "Inferred:" <+> cppKind k2)++ TooManyTypeParams extra k ->+ nested (text "Malformed type.")+ (text "Kind" <+> quotes (pp k) <+> text "is not a function," $$+ text "but it was applied to" <+> pl extra "parameter" <.> text ".")++ TyVarWithParams ->+ nested (text "Malformed type.")+ (text "Type variables cannot be applied to parameters.")++ TooManyTySynParams t extra ->+ nested (text "Malformed type.")+ (text "Type synonym" <+> nm t <+> text "was applied to" <+>+ pl extra "extra parameter" <.> text ".")++ TooFewTySynParams t few ->+ nested (text "Malformed type.")+ (text "Type" <+> nm t <+> text "is missing" <+>+ int few <+> text "parameters.")++ RecursiveTypeDecls ts ->+ nested (text "Recursive type declarations:")+ (fsep $ punctuate comma $ map nm ts)+++ TypeMismatch t1 t2 ->+ nested (text "Type mismatch:")+ (text "Expected type:" <+> ppWithNames names t1 $$+ text "Inferred type:" <+> ppWithNames names t2 $$+ mismatchHint t1 t2)++ UnsolvedGoals imp gs ->+ nested (word <+> text "constraints:")+ $ vcat $ map (ppWithNames names) gs+ where word = if imp then text "Unsolvable" else text "Unsolved"++ UnsolvedDelayedCt g ->+ nested (text "Failed to validate user-specified signature.")+ (ppWithNames names g)++ TypeVariableEscaped t xs ->+ nested (text "The type" <+> ppWithNames names t <+>+ text "is not sufficiently polymorphic.")+ (text "It cannot depend on quantified variables:" <+>+ sep (punctuate comma (map (ppWithNames names) xs)))++ NotForAll x t ->+ nested (text "Inferred type is not sufficiently polymorphic.")+ (text "Quantified variable:" <+> ppWithNames names x $$+ text "cannot match type:" <+> ppWithNames names t)++ UnusableFunction f ps ->+ nested (text "The constraints in the type signature of"+ <+> quotes (pp f) <+> text "are unsolvable.")+ (text "Detected while analyzing constraints:"+ $$ vcat (map (ppWithNames names) ps))++ TooManyPositionalTypeParams ->+ text "Too many positional type-parameters in explicit type application"++ CannotMixPositionalAndNamedTypeParams ->+ text "Named and positional type applications may not be mixed."++ AmbiguousType xs vs ->+ (text "The inferred type for" <+> commaSep (map pp xs)+ <+> text "is ambiguous.")+ $$ text "Arising from:"+ $$ nest 2 (vcat [ text "*" <+> var v | v <- vs ])+ where var (TVFree _ _ _ d) = pp (tvarDesc d)+ var x = pp x++ UndefinedTypeParameter x ->+ "Undefined type parameter `" <.> pp (thing x) <.> "`."+ $$ "See" <+> pp (srcRange x)++ RepeatedTypeParameter x rs ->+ "Multiple definitions for type parameter `" <.> pp x <.> "`:"+ $$ nest 2 (vcat [ "*" <+> pp r | r <- rs ])++ where+ nested x y = x $$ nest 2 y++ pl 1 x = text "1" <+> text x+ pl n x = text (show n) <+> text x <.> text "s"++ nm x = text "`" <.> pp x <.> text "`"++ 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++
src/Cryptol/TypeCheck/Infer.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Infer -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,21 +13,24 @@ {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE RecursiveDo #-} {-# LANGUAGE Safe #-}-module Cryptol.TypeCheck.Infer where+module Cryptol.TypeCheck.Infer(checkSigB,inferModule,inferBinds,inferDs) where import Cryptol.ModuleSystem.Name (asPrim,lookupPrimDecl) import Cryptol.Parser.Position import qualified Cryptol.Parser.AST as P-import qualified Cryptol.Parser.Names as P+import qualified Cryptol.ModuleSystem.Exports as P import Cryptol.TypeCheck.AST hiding (tSub,tMul,tExp) import Cryptol.TypeCheck.Monad+import Cryptol.TypeCheck.Error import Cryptol.TypeCheck.Solve-import Cryptol.TypeCheck.SimpType(tSub,tMul,tExp)+import Cryptol.TypeCheck.SimpType(tSub,tMul,tExp,tAdd) import Cryptol.TypeCheck.Kind(checkType,checkSchema,checkTySyn,- checkNewtype)+ checkPropSyn,checkNewtype,+ checkParameterType,+ checkParameterConstraints) import Cryptol.TypeCheck.Instantiate import Cryptol.TypeCheck.Depends-import Cryptol.TypeCheck.Subst (listSubst,apSubst,(@@),emptySubst)+import Cryptol.TypeCheck.Subst (listSubst,apSubst,(@@),isEmptySubst) import Cryptol.TypeCheck.Solver.InfNat(genLog) import Cryptol.Utils.Ident import Cryptol.Utils.Panic(panic)@@ -36,61 +39,80 @@ import qualified Data.Map as Map import Data.Map (Map) import qualified Data.Set as Set+import Data.List(foldl',sortBy) import Data.Either(partitionEithers) import Data.Maybe(mapMaybe,isJust, fromMaybe) import Data.List(partition,find) import Data.Graph(SCC(..)) import Data.Traversable(forM)-import Control.Monad(when,zipWithM)+import Control.Monad(zipWithM,unless) ++ inferModule :: P.Module Name -> InferM Module inferModule m = inferDs (P.mDecls m) $ \ds1 ->- do simplifyAllConstraints+ do proveModuleTopLevel ts <- getTSyns nts <- getNewtypes- return Module { mName = thing (P.mName m)- , mExports = P.modExports m- , mImports = map thing (P.mImports m)- , mTySyns = Map.mapMaybe onlyLocal ts- , mNewtypes = Map.mapMaybe onlyLocal nts- , mDecls = ds1+ pTs <- getParamTypes+ pCs <- getParamConstraints+ pFuns <- getParamFuns+ return Module { mName = thing (P.mName m)+ , mExports = P.modExports m+ , mImports = map thing (P.mImports m)+ , mTySyns = Map.mapMaybe onlyLocal ts+ , mNewtypes = Map.mapMaybe onlyLocal nts+ , mParamTypes = pTs+ , mParamConstraints = pCs+ , mParamFuns = pFuns+ , mDecls = ds1 } where onlyLocal (IsLocal, x) = Just x onlyLocal (IsExternal, _) = Nothing + -- | Construct a primitive in the parsed AST. mkPrim :: String -> InferM (P.Expr Name) mkPrim str =+ do nm <- mkPrim' str+ return (P.EVar nm)++-- | Construct a primitive in the parsed AST.+mkPrim' :: String -> InferM Name+mkPrim' str = do prims <- getPrimMap- return (P.EVar (lookupPrimDecl (packIdent str) prims))+ return (lookupPrimDecl (packIdent str) prims) ++ desugarLiteral :: Bool -> P.Literal -> InferM (P.Expr Name) desugarLiteral fixDec lit = do l <- curRange- demotePrim <- mkPrim "demote"+ numberPrim <- mkPrim "number" let named (x,y) = P.NamedInst- P.Named { name = Located l (packIdent x), value = P.TNum y }- demote fs = P.EAppT demotePrim (map named fs)+ P.Named { name = Located l (packIdent x), value = y }+ number fs = P.EAppT numberPrim (map named fs)+ tBits n = P.TSeq (P.TNum n) P.TBit return $ case lit of P.ECNum num info ->- demote $ [ ("val", num) ] ++ case info of- P.BinLit n -> [ ("bits", 1 * toInteger n) ]- P.OctLit n -> [ ("bits", 3 * toInteger n) ]- P.HexLit n -> [ ("bits", 4 * toInteger n) ]- P.CharLit -> [ ("bits", 8 :: Integer) ]+ number $ [ ("val", P.TNum num) ] ++ case info of+ P.BinLit n -> [ ("rep", tBits (1 * toInteger n)) ]+ P.OctLit n -> [ ("rep", tBits (3 * toInteger n)) ]+ P.HexLit n -> [ ("rep", tBits (4 * toInteger n)) ]+ P.CharLit -> [ ("rep", tBits (8 :: Integer)) ] P.DecLit | fixDec -> if num == 0- then [ ("bits", 0)]+ then [ ("rep", tBits 0)] else case genLog num 2 of- Just (x,_) -> [ ("bits", x + 1) ]+ Just (x,_) -> [ ("rep", tBits (x + 1)) ] _ -> [] | otherwise -> [ ]- P.PolyLit _n -> [ ]+ P.PolyLit _n -> [ ("rep", P.TSeq P.TWild P.TBit) ] P.ECString s -> P.ETyped (P.EList [ P.ELit (P.ECNum (fromIntegral (fromEnum c))@@ -105,8 +127,9 @@ P.EVar x -> do res <- lookupVar x (e',t) <- case res of- ExtVar s -> instantiateWith (EVar x) s ts- CurSCC e t -> instantiateWith e (Forall [] [] t) ts+ ExtVar s -> instantiateWith x (EVar x) s ts+ CurSCC e t -> do checkNoParams ts+ return (e,t) checkHasType t tGoal return e'@@ -114,6 +137,11 @@ P.ELit l -> do e <- desugarLiteral False l appTys e ts tGoal ++ P.ENeg {} -> panic "appTys" ["[bug] renamer bug", "unexpected ENeg" ]+ P.EComplement {} ->+ panic "appTys" ["[bug] renamer bug", "unexpected EComplement" ]+ P.EAppT e fs -> do ps <- mapM inferTyParam fs appTys e (ps ++ ts) tGoal@@ -144,14 +172,24 @@ P.EParens e -> appTys e ts tGoal P.EInfix a op _ b -> appTys (P.EVar (thing op) `P.EApp` a `P.EApp` b) ts tGoal - where mono = do e' <- checkE expr tGoal- (ie,t) <- instantiateWith e' (Forall [] [] tGoal) ts- -- XXX seems weird to need to do this, as t should be the same- -- as tGoal- checkHasType t tGoal- return ie+ where mono = do e' <- checkE expr tGoal+ checkNoParams ts+ return e' +checkNoParams :: [Located (Maybe Ident,Type)] -> InferM ()+checkNoParams ts =+ case pos of+ p : _ -> inRange (srcRange p) (recordError TooManyPositionalTypeParams)+ [] -> mapM_ badNamed named+ where+ badNamed l =+ case fst (thing l) of+ Just i -> recordError (UndefinedTypeParameter l { thing = i })+ Nothing -> return () + (named,pos) = partition (isJust . fst . thing) ts++ inferTyParam :: P.TypeInst Name -> InferM (Located (Maybe Ident, Type)) inferTyParam (P.NamedInst param) = do let loc = srcRange (P.name param)@@ -169,14 +207,6 @@ checkTypeOfKind ty k = checkType ty (Just k) --- | We use this when we want to ensure that the expr has exactly--- (syntactically) the given type.-inferE :: Doc -> P.Expr Name -> InferM (Expr, Type)-inferE desc expr =- do t <- newType desc KType- e1 <- checkE expr t- return (e1,t)- -- | Infer the type of an expression, and translate it to a fully elaborated -- core term. checkE :: P.Expr Name -> Type -> InferM Expr@@ -185,12 +215,16 @@ P.EVar x -> do res <- lookupVar x (e',t) <- case res of- ExtVar s -> instantiateWith (EVar x) s []- CurSCC e t -> return (e, t)+ ExtVar s -> instantiateWith x (EVar x) s []+ CurSCC e t -> return (e, t) checkHasType t tGoal return e' + P.ENeg {} -> panic "checkE" ["[bug] renamer bug", "unexpected ENeg" ]+ P.EComplement {} ->+ panic "checkE" ["[bug] renamer bug", "unexpected EComplement" ]+ P.ELit l -> (`checkE` tGoal) =<< desugarLiteral False l P.ETuple es ->@@ -205,10 +239,11 @@ P.ESel e l -> do let src = case l of- RecordSel _ _ -> text "type of record"- TupleSel _ _ -> text "type of tuple"- ListSel _ _ -> text "type of sequence"- (e',t) <- inferE src e+ RecordSel la _ -> TypeOfRecordField la+ TupleSel n _ -> TypeOfTupleField n+ ListSel _ _ -> TypeOfSeqElement+ t <- newType src KType+ e' <- checkE e t f <- newHasGoal l t tGoal return (f e') @@ -225,15 +260,19 @@ P.EFromTo t1 Nothing Nothing -> do rng <- curRange- bit <- newType (text "bit-width of enumeration sequnce") KNum+ fromThenPrim <- mkPrim' "fromThen"+ let src = TypeParamInstNamed fromThenPrim (packIdent "bits")+ bit <- newType src KNum fstT <- checkTypeOfKind t1 KNum- let totLen = tExp (tNum (2::Int)) bit- lstT = tSub totLen (tNum (1::Int))+ let nextT = tAdd fstT (tNum (1::Int))+ lenT = tSub (tExp (tNum (2::Int)) bit) fstT - fromToPrim <- mkPrim "fromTo"- appTys fromToPrim+ appTys (P.EVar fromThenPrim) [ Located rng (Just (packIdent x), y)- | (x,y) <- [ ("first",fstT), ("last", lstT), ("bits", bit) ]+ | (x,y) <- [ ("first", fstT)+ , ("next", nextT)+ , ("len", lenT)+ , ("bits", bit) ] ] tGoal P.EFromTo t1 mbt2 mbt3 ->@@ -293,7 +332,7 @@ checkE (P.EApp fun newArg) tGoal P.EApp e1 e2 ->- do t1 <- newType (text "argument to function") KType+ do t1 <- newType (TypeOfArg Nothing) KType e1' <- checkE e1 (tFun t1 tGoal) e2' <- checkE e2 t1 return (EApp e1' e2')@@ -316,10 +355,11 @@ P.ETypeVal t -> do l <- curRange- prim <- mkPrim "demote"+ prim <- mkPrim "number" checkE (P.EAppT prim [P.NamedInst- P.Named { name = Located l (packIdent "val"), value = t }]) tGoal+ P.Named { name = Located l (packIdent "val")+ , value = t }]) tGoal P.EFun ps e -> checkFun (text "anonymous function") ps e tGoal @@ -351,8 +391,8 @@ return tys where genTys =- do a <- newType (text "size of the sequence") KNum- b <- newType (text "type of sequence elements") KType+ do a <- newType LenOfSeq KNum+ b <- newType TypeOfSeqElement KType return (a,b) @@ -377,11 +417,7 @@ return tys where- genTys =forM [ 0 .. n - 1 ] $ \ i ->- let desc = text "type of"- <+> ordinal i- <+> text "tuple field"- in newType desc KType+ genTys =forM [ 0 .. n - 1 ] $ \ i -> newType (TypeOfTupleField i) KType expectRec :: [P.Named a] -> Type -> InferM [(Ident,a,Type)] expectRec fs ty =@@ -409,7 +445,7 @@ genTys = do res <- forM fs $ \ f -> do let field = thing (P.name f)- t <- newType (text "type of field" <+> quotes (pp field)) KType+ t <- newType (TypeOfRecordField field) KType return (field, P.value f, t) let (ls,_,ts) = unzip3 res@@ -445,7 +481,7 @@ _ -> do args <- genArgs arity- res <- newType (text "result of function") KType+ res <- newType TypeOfRes KType case ty of TVar TVFree{} -> do ps <- unify ty (foldr tFun res args) newGoals CtExactType ps@@ -455,8 +491,8 @@ | otherwise = return (reverse tys, ty) - genArgs arity = forM [ 1 .. arity ] $ \ ix ->- newType (text "argument" <+> ordinal ix) KType+ genArgs arity = forM [ 1 .. arity ] $+ \ ix -> newType (TypeOfArg (Just ix)) KType checkHasType :: Type -> Type -> InferM ()@@ -485,9 +521,9 @@ {-| The type the is the smallest of all -} smallest :: [Type] -> InferM Type-smallest [] = newType (text "length of list comprehension") KNum+smallest [] = newType LenOfSeq KNum smallest [t] = return t-smallest ts = do a <- newType (text "length of list comprehension") KNum+smallest ts = do a <- newType LenOfSeq KNum newGoals CtComprehension [ a =#= foldr1 tMin ts ] return a @@ -508,7 +544,7 @@ case pat of P.PVar x0 ->- do a <- newType desc KType+ do a <- inRange (srcRange x0) (newType (DefinitionOf (thing x0)) KType) return (thing x0, x0 { thing = a }) P.PTyped p t ->@@ -524,13 +560,14 @@ inferMatch :: P.Match Name -> InferM (Match, Name, Located Type, Type) inferMatch (P.Match p e) = 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+ n <- newType LenOfCompGen KNum e' <- checkE e (tSeq n (thing t)) return (From x n (thing t) e', x, t, n) inferMatch (P.MatchLet b) | P.bMono b =- do a <- newType (text "`let` binding in comprehension") KType+ do let rng = srcRange (P.bName b)+ a <- inRange rng (newType (DefinitionOf (thing (P.bName b))) KType) b1 <- checkMonoB b a return (Let b1, dName b1, Located (srcRange (P.bName b)) a, tNum (1::Int)) @@ -544,22 +581,16 @@ , Type -- length of sequence ) -inferCArm _ [] = do n <- newType (text "lenght of empty comprehension") KNum- -- shouldn't really happen- return ([], Map.empty, n)+inferCArm _ [] = panic "inferCArm" [ "Empty comprahension arm" ] inferCArm _ [m] = do (m1, x, t, n) <- inferMatch m return ([m1], Map.singleton x t, n) inferCArm armNum (m : ms) = do (m1, x, t, n) <- inferMatch m- (ms', ds, n') <- withMonoType (x,t) (inferCArm armNum ms)- -- XXX: Well, this is just the lenght of this sub-sequence- let src = text "length of" <+> ordinal armNum <+>- text "arm of list comprehension"- sz <- newType src KNum- newGoals CtComprehension [ sz =#= tMul n n' ]- return (m1 : ms', Map.insertWith (\_ old -> old) x t ds, sz)+ (ms', ds, n') <- withMonoType (x,t) (inferCArm armNum ms)+ newGoals CtComprehension [ pFin n' ]+ return (m1 : ms', Map.insertWith (\_ old -> old) x t ds, tMul n n') -- | @inferBinds isTopLevel isRec binds@ performs inference for a -- strongly-connected component of 'P.Bind's. If @isTopLevel@ is true,@@ -569,45 +600,82 @@ -- be unaffected. inferBinds :: Bool -> Bool -> [P.Bind Name] -> InferM [Decl] inferBinds isTopLevel isRec binds =- mdo let dExpr (DExpr e) = e- dExpr DPrim = panic "[TypeCheck]" [ "primitive in a recursive group" ]+ do -- when mono-binds is enabled, and we're not checking top-level+ -- declarations, mark all bindings lacking signatures as monomorphic+ monoBinds <- getMonoBinds+ let (sigs,noSigs) = partition (isJust . P.bSignature) binds+ monos = [ b { P.bMono = True } | b <- noSigs ]+ binds' | monoBinds && not isTopLevel = sigs ++ monos+ | otherwise = binds - exprMap = Map.fromList [ (x,inst (EVar x) (dExpr (dDefinition b)))- | b <- genBs, let x = dName b ] -- REC. - inst e (ETAbs x e1) = inst (ETApp e (TVar (tpVar x))) e1- inst e (EProofAbs _ e1) = inst (EProofApp e) e1- inst e _ = e - -- when mono-binds is enabled, and we're not checking top-level- -- declarations, mark all bindings lacking signatures as monomorphic- monoBinds <- getMonoBinds- let binds' | monoBinds && not isTopLevel = sigs ++ monos- | otherwise = binds+ check exprMap =+ {- Guess type is here, because while we check user supplied signatures+ we may generate additional constraints. For example, `x - y` would+ generate an additional constraint `x >= y`. -}+ do (newEnv,todos) <- unzip `fmap` mapM (guessType exprMap) binds'+ let otherEnv = filter isExt newEnv - (sigs,noSigs) = partition (isJust . P.bSignature) binds- monos = [ b { P.bMono = True } | b <- noSigs ]+ let (sigsAndMonos,noSigGen) = partitionEithers todos + let prepGen = collectGoals+ $ do bs <- sequence noSigGen+ simplifyAllConstraints+ return bs - ((doneBs, genCandidates), cs) <-- collectGoals $+ if isRec+ then+ -- First we check the bindings with no signatures+ -- that need to be generalized.+ do (bs1,cs) <- withVarTypes newEnv prepGen - {- Guess type is here, because while we check user supplied signatures- we may generate additional constraints. For example, `x - y` would- generate an additional constraint `x >= y`. -}- do (newEnv,todos) <- unzip `fmap` mapM (guessType exprMap) binds'- let extEnv = if isRec then withVarTypes newEnv else id+ -- We add these to the environment, so their fvs are+ -- not generalized.+ genCs <- withVarTypes otherEnv (generalize bs1 cs) - extEnv $- do let (sigsAndMonos,noSigGen) = partitionEithers todos- genCs <- sequence noSigGen- done <- sequence sigsAndMonos- simplifyAllConstraints- return (done, genCs)- genBs <- generalize genCandidates cs -- RECURSION- return (doneBs ++ genBs)+ -- Then we do all the rest,+ -- using the newly inferred poly types.+ let newEnv' = map toExt bs1 ++ otherEnv+ done <- withVarTypes newEnv' (sequence sigsAndMonos)+ return (done,genCs) + else+ do done <- sequence sigsAndMonos+ (bs1, cs) <- prepGen+ genCs <- generalize bs1 cs+ return (done,genCs) + rec+ let exprMap = Map.fromList (map monoUse genBs)+ (doneBs, genBs) <- check exprMap++ simplifyAllConstraints++ return (doneBs ++ genBs)++ where+ toExt d = (dName d, ExtVar (dSignature d))+ isExt (_,y) = case y of+ ExtVar _ -> True+ _ -> False++ monoUse d = (x, withQs)+ where+ x = dName d+ as = sVars (dSignature d)+ qs = sProps (dSignature d)++ appT e a = ETApp e (TVar (tpVar a))+ appP e _ = EProofApp e++ withTys = foldl' appT (EVar x) as+ withQs = foldl' appP withTys qs+++++ {- | Come up with a type for recursive calls to a function, and decide how we are going to be checking the binding. Returns: (Name, type or schema, computation to check binding)@@ -624,18 +692,18 @@ case bSignature of Just s ->- do s1 <- checkSchema s+ do s1 <- checkSchema AllowWildCards s return ((name, ExtVar (fst s1)), Left (checkSigB b s1)) Nothing | bMono ->- do t <- newType (text "definition of" <+> quotes (pp name)) KType+ do t <- newType (DefinitionOf name) KType let schema = Forall [] [] t return ((name, ExtVar schema), Left (checkMonoB b t)) | otherwise -> - do t <- newType (text "definition of" <+> quotes (pp name)) KType+ do t <- newType (DefinitionOf name) KType let noWay = tcPanic "guessType" [ "Missing expression for:" , show name ] expr = Map.findWithDefault noWay name exprMap@@ -646,8 +714,8 @@ --- | The inputs should be declarations with monomorphic types--- (i.e., of the form `Forall [] [] t`).+{- | The inputs should be declarations with monomorphic types+(i.e., of the form `Forall [] [] t`). -} generalize :: [Decl] -> [Goal] -> InferM [Decl] {- This may happen because we have monomorphic bindings.@@ -659,52 +727,56 @@ generalize bs0 gs0 =- do gs <- forM gs0 $ \g -> applySubst g-- -- XXX: Why would these bindings have signatures??- bs <- forM bs0 $ \b -> do s <- applySubst (dSignature b)- return b { dSignature = s }+ do {- First, we apply the accumulating substitution to the goals+ and the inferred types, to ensure that we have the most up+ to date information. -}+ gs <- applySubstGoals gs0+ bs <- forM bs0 $ \b -> do s <- applySubst (dSignature b)+ return b { dSignature = s } + -- Next, we figure out which of the free variables need to be generalized+ -- Variables apearing in the types of monomorphic bindings should+ -- not be generalizedr. let goalFVS g = Set.filter isFreeTV $ fvs $ goal g inGoals = Set.unions $ map goalFVS gs inSigs = Set.filter isFreeTV $ fvs $ map dSignature bs- candidates = Set.union inGoals inSigs+ candidates = (Set.union inGoals inSigs) asmpVs <- varsWithAsmps -- let gen0 = Set.difference candidates asmpVs stays g = any (`Set.member` gen0) $ Set.toList $ goalFVS g (here0,later) = partition stays gs-- -- Figure out what might be ambigious- let (maybeAmbig, ambig) = partition ((KNum ==) . kindOf)- $ Set.toList- $ Set.difference gen0 inSigs-- when (not (null ambig)) $ recordError $ AmbiguousType $ map dName bs--- solver <- getSolver- (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+ addGoals later -- these ones we keep around for to solve later + let maybeAmbig = Set.toList (Set.difference gen0 inSigs) + {- See if we might be able to default some of the potentially ambiguous+ variables using the constraints that will be part of the newly+ generalized schema. -}+ let (as0,here1,defSu,ws) = defaultAndSimplify maybeAmbig here0 + extendSubst defSu mapM_ recordWarning ws let here = map goal here1 - let as = as0 ++ Set.toList (Set.difference inSigs asmpVs)- asPs = [ TParam { tpUnique = x, tpKind = k, tpName = Nothing }- | TVFree x k _ _ <- as ]++ {- This is the variables we'll be generalizing:+ * any ones that survived the defaulting+ * and vars in the inferred types that do not appear anywhere else. -}+ let as = sortBy numFst+ $ as0 ++ Set.toList (Set.difference inSigs asmpVs)+ asPs = [ TParam { tpUnique = x, tpKind = k, tpFlav = TPOther Nothing+ , tpInfo = i } | TVFree x k _ i <- as ]++ {- Finally, we replace free variables with bound ones, and fix-up+ the definitions as needed to reflect that we are now working+ with polymorphic things. For example, apply each occurrence to the+ type parameters. -} totSu <- getSubst let- su = listSubst (zip as (map (TVar . tpVar) asPs)) @@ defSu @@ totSu- qs = map (apSubst su) here+ su = listSubst (zip as (map (TVar . tpVar) asPs)) @@ totSu+ qs = concatMap (pSplitAnd . apSubst su) here genE e = foldr ETAbs (foldr EProofAbs (apSubst su e) qs) asPs genB d = d { dDefinition = case dDefinition d of@@ -714,25 +786,22 @@ $ apSubst su $ sType $ dSignature d } - addGoals later return (map genB bs) -+ where+ numFst x y = case (kindOf x, kindOf y) of+ (KNum, KNum) -> EQ+ (KNum, _) -> LT+ (_,KNum) -> GT+ _ -> EQ +-- | Check a monomorphic binding. checkMonoB :: P.Bind Name -> Type -> InferM Decl checkMonoB b t = inRangeMb (getLoc b) $ case thing (P.bDef b) of - P.DPrim ->- return Decl { dName = thing (P.bName b)- , dSignature = Forall [] [] t- , dDefinition = DPrim- , dPragmas = P.bPragmas b- , dInfix = P.bInfix b- , dFixity = P.bFixity b- , dDoc = P.bDoc b- }+ P.DPrim -> panic "checkMonoB" ["Primitive with no signature?"] P.DExpr e -> do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) e t@@ -769,51 +838,29 @@ addGoals validSchema () <- simplifyAllConstraints -- XXX: using `asmps` also? return e1- cs <- applySubst cs0-- let letGo qs c = Set.null (qs `Set.intersection` fvs (goal c))-- splitPreds qs n ps =- let (l,n1) = partition (letGo qs) ps- in if null n1- then (l,n)- else splitPreds (fvs (map goal n1) `Set.union` qs) (n1 ++ n) l-- (later0,now) = splitPreds (Set.fromList (map tpVar as)) [] cs+ cs <- applySubstGoals cs0 - asmps1 <- applySubst asmps0+ let findKeep vs keep todo =+ let stays (_,cvs) = not $ Set.null $ Set.intersection vs cvs+ (yes,perhaps) = partition stays todo+ (stayPs,newVars) = unzip yes+ in case stayPs of+ [] -> (keep,map fst todo)+ _ -> findKeep (Set.unions (vs:newVars)) (stayPs ++ keep) perhaps - defSu1 <- proveImplication (thing (P.bName b)) as asmps1 now- let later = apSubst defSu1 later0- asmps = apSubst defSu1 asmps1+ let (stay,leave) = findKeep (Set.fromList (map tpVar as)) []+ [ (c, fvs c) | c <- cs ] - -- Now we check for any remaining variables that are not mentioned- -- in the environment. The plan is to try to default these to something- -- reasonable.- do let laterVs = fvs (map goal later)- asmpVs <- varsWithAsmps- let genVs = laterVs `Set.difference` asmpVs- (maybeAmbig,ambig) = partition ((== KNum) . kindOf)- (Set.toList genVs)- when (not (null ambig)) $ recordError- $ AmbiguousType [ thing (P.bName b) ]+ addGoals leave - solver <- getSolver- (_,_,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+ asmps1 <- applySubstPreds asmps0 - addGoals later+ su <- proveImplication (Just (thing (P.bName b))) as asmps1 stay+ extendSubst su - su <- getSubst- let su' = defSu1 @@ su- t = apSubst su' t0- e2 = apSubst su' e1+ let asmps = concatMap pSplitAnd (apSubst su asmps1)+ t <- applySubst t0+ e2 <- applySubst e1 return Decl { dName = thing (P.bName b)@@ -830,17 +877,42 @@ where isTopLevel = isTopDecl (head ds) - checkTyDecls (TS t : ts) =- do t1 <- checkTySyn t+ checkTyDecls (AT t mbD : ts) =+ do t1 <- checkParameterType t mbD+ withParamType t1 (checkTyDecls ts)++ checkTyDecls (TS t mbD : ts) =+ do t1 <- checkTySyn t mbD withTySyn t1 (checkTyDecls ts) - checkTyDecls (NT t : ts) =- do t1 <- checkNewtype t+ checkTyDecls (PS t mbD : ts) =+ do t1 <- checkPropSyn t mbD+ withTySyn t1 (checkTyDecls ts)++ checkTyDecls (NT t mbD : ts) =+ do t1 <- checkNewtype t mbD withNewtype t1 (checkTyDecls ts) -- We checked all type synonyms, now continue with value-level definitions:- checkTyDecls [] = checkBinds [] $ orderBinds $ mapMaybe toBind ds+ checkTyDecls [] =+ do cs <- checkParameterConstraints (concatMap toParamConstraints ds)+ withParameterConstraints cs $+ do xs <- mapM checkParameterFun (mapMaybe toParamFun ds)+ withParamFuns xs $ checkBinds [] $ orderBinds $ mapMaybe toBind ds ++ checkParameterFun x =+ do (s,gs) <- checkSchema NoWildCards (P.pfSchema x)+ su <- proveImplication (Just (thing (P.pfName x)))+ (sVars s) (sProps s) gs+ unless (isEmptySubst su) $+ panic "checkParameterFun" ["Subst not empty??"]+ let n = thing (P.pfName x)+ return ModVParam { mvpName = n+ , mvpType = s+ , mvpDoc = P.pfDoc x+ , mvpFixity = P.pfFixity x+ } checkBinds decls (CyclicSCC bs : more) = do bs1 <- inferBinds isTopLevel True bs
src/Cryptol/TypeCheck/InferTypes.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.InferTypes -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -18,54 +18,93 @@ {-# LANGUAGE ViewPatterns #-} module Cryptol.TypeCheck.InferTypes where -import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Subst import Cryptol.Parser.Position-import qualified Cryptol.Parser.AST as P-import Cryptol.Utils.PP import Cryptol.ModuleSystem.Name (asPrim,nameLoc)+import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.PP-import Cryptol.Utils.Ident (Ident,identText)+import Cryptol.TypeCheck.Subst+import Cryptol.TypeCheck.TypePat+import Cryptol.TypeCheck.SimpType(tMax)+import Cryptol.Utils.Ident (ModName, identText) import Cryptol.Utils.Panic(panic) import Cryptol.Utils.Misc(anyJust)+import Cryptol.Utils.Patterns(matchMaybe) import Data.Set ( Set ) import qualified Data.Set as Set-import qualified Data.IntMap as IntMap+import Data.Map ( Map )+import qualified Data.Map as Map import GHC.Generics (Generic) import Control.DeepSeq-import Data.List ((\\)) data SolverConfig = SolverConfig { solverPath :: FilePath -- ^ The SMT solver to invoke , solverArgs :: [String] -- ^ Additional arguments to pass to the solver , solverVerbose :: Int -- ^ How verbose to be when type-checking+ , solverPreludePath :: [FilePath]+ -- ^ Look for the solver prelude in these locations. } deriving (Show, Generic, NFData) -- | The types of variables in the environment.-data VarType = ExtVar Schema -- ^ Known type- | CurSCC Expr Type -- ^ Part of current SCC+data VarType = ExtVar Schema+ -- ^ Known type --- 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)+ | CurSCC {- LAZY -} Expr Type+ {- ^ Part of current SCC. The expression will replace the+ variable, after we are done with the SCC. In this way a+ variable that gets generalized is replaced with an appropriate+ instantiation of itself. -} +data Goals = Goals+ { goalSet :: Set Goal+ -- ^ A bunch of goals, not including the ones in 'literalGoals'.++ , literalGoals :: Map TVar LitGoal+ -- ^ An entry @(a,t)@ corresponds to @Literal t a@.+ } deriving (Show)++-- | This abuses the type 'Goal' a bit. The 'goal' field contains+-- only the numeric part of the Literal constraint. For example,+-- @(a, Goal { goal = t })@ representats the goal for @Literal t a@+type LitGoal = Goal++litGoalToGoal :: (TVar,LitGoal) -> Goal+litGoalToGoal (a,g) = g { goal = pLiteral (goal g) (TVar a) }++goalToLitGoal :: Goal -> Maybe (TVar,LitGoal)+goalToLitGoal g =+ do (tn,a) <- matchMaybe $ do (tn,b) <- aLiteral (goal g)+ a <- aTVar b+ return (tn,a)+ return (a, g { goal = tn })+++ emptyGoals :: Goals-emptyGoals = Goals Set.empty -- emptyTM+emptyGoals = Goals { goalSet = Set.empty, literalGoals = Map.empty } nullGoals :: Goals -> Bool-nullGoals (Goals tm) = Set.null tm -- nullTM tm+nullGoals gs = Set.null (goalSet gs) && Map.null (literalGoals gs) fromGoals :: Goals -> [Goal]-fromGoals (Goals tm) = Set.toList tm -- membersTM tm+fromGoals gs = map litGoalToGoal (Map.toList (literalGoals gs)) +++ Set.toList (goalSet gs) +goalsFromList :: [Goal] -> Goals+goalsFromList = foldr insertGoal emptyGoals+ insertGoal :: Goal -> Goals -> Goals-insertGoal g (Goals tm) = Goals (Set.insert g tm) -- (insertTM (goal g) g tm)+insertGoal g gs+ | Just (a,newG) <- goalToLitGoal g =+ gs { literalGoals = Map.insertWith jn a newG (literalGoals gs) }+ | otherwise = gs { goalSet = Set.insert g (goalSet gs) } + where+ jn g1 g2 = g1 { goal = tMax (goal g1) (goal g2) }+ -- XXX: here we are arbitrarily using the info of the first goal,+ -- which could lead to a confusing location for a constraint.+ -- | Something that we need to find evidence for. data Goal = Goal { goalSource :: ConstraintSource -- ^ What it is about@@ -86,96 +125,13 @@ -- | Delayed implication constraints, arising from user-specified type sigs. data DelayedCt = DelayedCt- { dctSource :: Name -- ^ Signature that gave rise to this constraint+ { dctSource :: Maybe Name -- ^ Signature that gave rise to this constraint+ -- Nothing means module top-level , dctForall :: [TParam] , dctAsmps :: [Prop] , dctGoals :: [Goal] } deriving (Show, Generic, NFData) -data Warning = DefaultingKind (P.TParam Name) P.Kind- | DefaultingWildType P.Kind- | DefaultingTo Doc Type- deriving (Show, Generic, NFData)---- | Various errors that might happen during type checking/inference-data Error = ErrorMsg Doc- -- ^ Just say this-- | KindMismatch Kind Kind- -- ^ Expected kind, inferred kind-- | TooManyTypeParams Int Kind- -- ^ Number of extra parameters, kind of result- -- (which should not be of the form @_ -> _@)-- | TooManyTySynParams Name Int- -- ^ Type-synonym, number of extra params-- | TooFewTySynParams Name Int- -- ^ Type-synonym, number of missing params-- | RepeatedTyParams [P.TParam Name]- -- ^ Type parameters with the same name (in definition)-- | RepeatedDefinitions Name [Range]- -- ^ Multiple definitions for the same name-- | RecursiveTypeDecls [Name]- -- ^ The type synonym declarations are recursive-- | UndefinedTypeSynonym Name- -- ^ Use of a type synonym that was not defined-- | UndefinedVariable Name- -- ^ Use of a variable that was not defined-- | UndefinedTypeParam (Located Ident)- -- ^ Attempt to explicitly instantiate a non-existent param.-- | MultipleTypeParamDefs Ident [Range]- -- ^ Multiple definitions for the same type parameter-- | TypeMismatch Type Type- -- ^ Expected type, inferred type-- | RecursiveType Type Type- -- ^ Unification results in a recursive type-- | UnsolvedGoals Bool [Goal]- -- ^ A constraint that we could not solve- -- The boolean indicates if we know that this constraint- -- is impossible.-- | UnsolvedDelayedCt DelayedCt- -- ^ A constraint (with context) that we could not solve-- | UnexpectedTypeWildCard- -- ^ Type wild cards are not allowed in this context- -- (e.g., definitions of type synonyms).-- | TypeVariableEscaped Type [TVar]- -- ^ Unification variable depends on quantified variables- -- that are not in scope.-- | NotForAll TVar Type- -- ^ Quantified type variables (of kind *) need to- -- match the given type, so it does not work for all types.-- | UnusableFunction Name [Prop]- -- ^ The given constraints causes the signature of the- -- function to be not-satisfiable.-- | TooManyPositionalTypeParams- -- ^ Too many positional type arguments, in an explicit- -- type instantiation-- | CannotMixPositionalAndNamedTypeParams-- | AmbiguousType [Name]--- deriving (Show, Generic, NFData)- -- | Information about how a constraint came to be, used in error reporting. data ConstraintSource = CtComprehension -- ^ Computing shape of list comprehension@@ -189,14 +145,17 @@ | CtPartialTypeFun TyFunName -- ^ Use of a partial type function. | CtImprovement | CtPattern Doc -- ^ Constraints arising from type-checking patterns+ | CtModuleInstance ModName -- ^ Instantiating a parametrized module deriving (Show, Generic, NFData) -data TyFunName = UserTyFun Name | BuiltInTyFun TFun+data TyFunName = UserTyFun Name | BuiltInTyFun TFun | BuiltInTC TC deriving (Show, Generic, NFData) + instance PP TyFunName where ppPrec c (UserTyFun x) = ppPrec c x ppPrec c (BuiltInTyFun x) = ppPrec c x+ ppPrec c (BuiltInTC x) = ppPrec c x instance TVars ConstraintSource where apSubst su src =@@ -212,77 +171,9 @@ CtPartialTypeFun _ -> src CtImprovement -> src CtPattern _ -> src--instance TVars Warning where- apSubst su warn =- case warn of- DefaultingKind {} -> warn- DefaultingWildType {} -> warn- DefaultingTo d ty -> DefaultingTo d (apSubst su ty)--instance FVS Warning where- fvs warn =- case warn of- DefaultingKind {} -> Set.empty- DefaultingWildType {} -> Set.empty- DefaultingTo _ ty -> fvs ty-+ CtModuleInstance _ -> src -instance TVars Error where- apSubst su err =- case err of- ErrorMsg _ -> err- KindMismatch {} -> err- TooManyTypeParams {} -> err- TooManyTySynParams {} -> err- TooFewTySynParams {} -> err- RepeatedTyParams {} -> err- RepeatedDefinitions {} -> err- RecursiveTypeDecls {} -> err- UndefinedTypeSynonym {} -> err- UndefinedVariable {} -> err- UndefinedTypeParam {} -> err- MultipleTypeParamDefs {} -> err- TypeMismatch t1 t2 -> TypeMismatch (apSubst su t1) (apSubst su t2)- RecursiveType t1 t2 -> RecursiveType (apSubst su t1) (apSubst su t2)- UnsolvedGoals x gs -> UnsolvedGoals x (apSubst su gs)- UnsolvedDelayedCt g -> UnsolvedDelayedCt (apSubst su g)- UnexpectedTypeWildCard -> err- TypeVariableEscaped t xs -> TypeVariableEscaped (apSubst su t) xs- NotForAll x t -> NotForAll x (apSubst su t)- UnusableFunction f ps -> UnusableFunction f (apSubst su ps)- TooManyPositionalTypeParams -> err- CannotMixPositionalAndNamedTypeParams -> err- AmbiguousType _ -> err--instance FVS Error where- fvs err =- case err of- ErrorMsg {} -> Set.empty- KindMismatch {} -> Set.empty- TooManyTypeParams {} -> Set.empty- TooManyTySynParams {} -> Set.empty- TooFewTySynParams {} -> Set.empty- RepeatedTyParams {} -> Set.empty- RepeatedDefinitions {} -> Set.empty- RecursiveTypeDecls {} -> Set.empty- UndefinedTypeSynonym {} -> Set.empty- UndefinedVariable {} -> Set.empty- UndefinedTypeParam {} -> Set.empty- MultipleTypeParamDefs {} -> Set.empty- TypeMismatch t1 t2 -> fvs (t1,t2)- RecursiveType t1 t2 -> fvs (t1,t2)- UnsolvedGoals _ gs -> fvs gs- UnsolvedDelayedCt g -> fvs g- UnexpectedTypeWildCard -> Set.empty- TypeVariableEscaped t _ -> fvs t- NotForAll _ t -> fvs t- UnusableFunction _ p -> fvs p- TooManyPositionalTypeParams -> Set.empty- CannotMixPositionalAndNamedTypeParams -> Set.empty- AmbiguousType _ -> Set.empty- instance FVS Goal where fvs g = fvs (goal g) @@ -291,33 +182,17 @@ Set.fromList (map tpVar (dctForall d)) --- This first applies the substitution to the keys of the goal map, then to the--- 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+ -- XXX: could be more efficient+ apSubst su gs = case anyJust apG (fromGoals gs) of+ Nothing -> gs+ Just gs1 -> goalsFromList (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- -- as the key for the goal map is the same as the goal, and the substitution- -- has been applied to the key already, just replace the existing goal with- -- the key.- setGoal key g = g { goalSource = apSubst su (goalSource g)- , goal = key- }--}- instance TVars Goal where apSubst su g = Goal { goalSource = apSubst su (goalSource g) , goalRange = goalRange g@@ -367,165 +242,11 @@ | Set.null vs = d | otherwise = d $$ text "where" $$ vcat (map desc (Set.toList vs)) where- vs = Set.filter isFreeTV (fvs t)- desc v@(TVFree _ _ _ x) = ppWithNames nm v <+> text "is" <+> x- desc (TVBound {}) = empty+ vs = fvs t -- Set.filter isFreeTV (fvs t)+ desc v = ppWithNames nm v <+> text "is" <+> pp (tvInfo v) -instance PP Warning where- ppPrec = ppWithNamesPrec IntMap.empty--instance PP Error where- ppPrec = ppWithNamesPrec IntMap.empty---instance PP (WithNames Warning) where- ppPrec _ (WithNames warn names) =- addTVarsDescs names warn $- case warn of- DefaultingKind x k ->- text "Assuming " <+> pp x <+> text "to have" <+> P.cppKind k-- DefaultingWildType k ->- text "Assuming _ to have" <+> P.cppKind k-- DefaultingTo d ty ->- text "Defaulting" <+> d $$ text "to" <+> ppWithNames names ty--instance PP (WithNames Error) where- ppPrec _ (WithNames err names) =- addTVarsDescs names err $- case err of- ErrorMsg msg -> msg-- RecursiveType t1 t2 ->- nested (text "Matching would result in an infinite type.")- (text "The type: " <+> ppWithNames names t1 $$- text "occurs in:" <+> ppWithNames names t2)-- UnexpectedTypeWildCard ->- nested (text "Wild card types are not allowed in this context")- (text "(e.g., they cannot be used in type synonyms).")-- KindMismatch k1 k2 ->- nested (text "Incorrect type form.")- (text "Expected:" <+> cppKind k1 $$- text "Inferred:" <+> cppKind k2)-- TooManyTypeParams extra k ->- nested (text "Malformed type.")- (text "Kind" <+> quotes (pp k) <+> text "is not a function," $$- text "but it was applied to" <+> pl extra "parameter" <> text ".")-- TooManyTySynParams t extra ->- nested (text "Malformed type.")- (text "Type synonym" <+> nm t <+> text "was applied to" <+>- pl extra "extra parameter" <> text ".")-- TooFewTySynParams t few ->- nested (text "Malformed type.")- (text "Type" <+> nm t <+> text "is missing" <+>- int few <+> text "parameters.")-- RepeatedTyParams ps ->- nested (text "Different type parameters use the same name:")- (vmulti [ nm (P.tpName p) <+>- text "defined at" <+> mb (P.tpRange p) | p <- ps ] )- where mb Nothing = text "unknown location"- mb (Just x) = pp x-- RepeatedDefinitions x ps ->- nested (text "Multiple definitions for the same name:")- (vmulti [ nm x <+> text "defined at" <+> pp p | p <- ps ])-- RecursiveTypeDecls ts ->- nested (text "Recursive type declarations:")- (fsep $ punctuate comma $ map nm ts)-- UndefinedTypeSynonym x ->- text "Type synonym" <+> nm x <+> text "is not defined."-- UndefinedVariable x ->- text "Variable" <+> nm x <+> text "was not defined."-- UndefinedTypeParam x ->- text "Type variable" <+> nm x <+> text "was not defined."-- MultipleTypeParamDefs x ps ->- nested (text "Multiple definitions for the same type parameter"- <+> nm x <> text ":")- (vmulti [ text "defined at" <+> pp p | p <- ps ])--- TypeMismatch t1 t2 ->- nested (text "Type mismatch:")- (text "Expected type:" <+> ppWithNames names t1 $$- text "Inferred type:" <+> ppWithNames names t2 $$- mismatchHint t1 t2)-- UnsolvedGoals imp gs ->- nested (word <+> text "constraints:")- $ vcat $ map (ppWithNames names) gs- where word = if imp then text "Unsolvable" else text "Unsolved"-- UnsolvedDelayedCt g ->- nested (text "Failed to validate user-specified signature.")- (ppWithNames names g)-- TypeVariableEscaped t xs ->- nested (text "The type" <+> ppWithNames names t <+>- text "is not sufficiently polymorphic.")- (text "It cannot depend on quantified variables:" <+>- sep (punctuate comma (map (ppWithNames names) xs)))-- NotForAll x t ->- nested (text "Inferred type is not sufficiently polymorphic.")- (text "Quantified variable:" <+> ppWithNames names x $$- text "cannot match type:" <+> ppWithNames names t)-- UnusableFunction f ps ->- nested (text "The constraints in the type signature of"- <+> quotes (pp f) <+> text "are unsolvable.")- (text "Detected while analyzing constraints:"- $$ vcat (map (ppWithNames names) ps))-- TooManyPositionalTypeParams ->- text "Too many positional type-parameters in explicit type application"-- CannotMixPositionalAndNamedTypeParams ->- text "Named and positional type applications may not be mixed."-- AmbiguousType xs ->- text "The inferred type for" <+> commaSep (map pp xs)- <+> text "is ambiguous."-- where- nested x y = x $$ nest 2 y-- pl 1 x = text "1" <+> text x- pl n x = text (show n) <+> text x <> text "s"-- nm x = text "`" <> pp x <> text "`"-- vmulti = vcat . multi-- multi [] = []- multi [x] = [x <> text "."]- 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 ppPrec _ src = case src of@@ -540,18 +261,19 @@ CtPartialTypeFun f -> text "use of partial type function" <+> pp f CtImprovement -> text "examination of collected goals" CtPattern desc -> text "checking a pattern:" <+> desc+ CtModuleInstance n -> text "module instantiation" <+> pp n ppUse :: Expr -> Doc ppUse expr = case expr of EVar (asPrim -> Just prim)- | identText prim == "demote" -> text "literal or demoted expression"+ | identText prim == "number" -> text "literal or demoted expression" | identText prim == "infFrom" -> text "infinite enumeration" | identText prim == "infFromThen" -> text "infinite enumeration (with step)" | identText prim == "fromThen" -> text "finite enumeration" | identText prim == "fromTo" -> text "finite enumeration" | identText prim == "fromThenTo" -> text "finite enumeration"- _ -> text "expression" <+> pp expr+ _ -> text "expression" <+> pp expr instance PP (WithNames Goal) where ppPrec _ (WithNames g names) =@@ -564,8 +286,10 @@ ppPrec _ (WithNames d names) = sig $$ nest 2 (vars $$ asmps $$ vcat (map (ppWithNames ns1) (dctGoals d))) where- sig = text "In the definition of" <+> quotes (pp name) <>- comma <+> text "at" <+> pp (nameLoc name) <> colon+ sig = case name of+ Just n -> text "In the definition of" <+> quotes (pp n) <.>+ comma <+> text "at" <+> pp (nameLoc n) <.> colon+ Nothing -> text "When checking the module's parameters." name = dctSource d vars = case dctForall d of
src/Cryptol/TypeCheck/Instantiate.hs view
@@ -1,35 +1,38 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Instantiate -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable-+{-# Language OverloadedStrings #-} module Cryptol.TypeCheck.Instantiate (instantiateWith) where import Cryptol.ModuleSystem.Name (nameIdent) import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Monad import Cryptol.TypeCheck.Subst (listSubst,apSubst)+import Cryptol.TypeCheck.Error import Cryptol.Parser.Position (Located(..)) import Cryptol.Utils.Ident (Ident)-import Cryptol.Utils.PP+import Cryptol.Utils.Panic(panic) +import Control.Monad(zipWithM) import Data.Function (on) import Data.List(sortBy, groupBy, find) import Data.Maybe(mapMaybe,isJust) import Data.Either(partitionEithers)-import MonadLib+import qualified Data.Set as Set -instantiateWith :: Expr -> Schema -> [Located (Maybe Ident,Type)]++instantiateWith :: Name -> Expr -> Schema -> [Located (Maybe Ident,Type)] -> InferM (Expr,Type)-instantiateWith e s ts- | null named = instantiateWithPos e s positional- | null positional = instantiateWithNames e s named+instantiateWith nm e s ts+ | null named = instantiateWithPos nm e s positional+ | null positional = instantiateWithNames nm e s named | otherwise = do recordError CannotMixPositionalAndNamedTypeParams- instantiateWithNames e s named+ instantiateWithNames nm e s named where (named,positional) = partitionEithers (map classify ts)@@ -38,8 +41,8 @@ (Nothing,ty) -> Right ty -instantiateWithPos :: Expr -> Schema -> [Type] -> InferM (Expr,Type)-instantiateWithPos e (Forall as ps t) ts =+instantiateWithPos :: Name -> Expr -> Schema -> [Type] -> InferM (Expr,Type)+instantiateWithPos nm e (Forall as ps t) ts = do su <- makeSu (1::Int) [] as ts doInst su e ps t where@@ -48,8 +51,8 @@ makeSu n su (q : qs) (ty : tys) | not (isNamed q) = do r <- unnamed n q makeSu (n+1) (r : su) qs (ty : tys)- | k1 == k2 = makeSu (n+1) ((tpVar q, ty) : su) qs tys- | otherwise = do recordError $ KindMismatch k1 k2+ | k1 == k2 = makeSu (n+1) ((q, ty) : su) qs tys+ | otherwise = do recordError (KindMismatch k1 k2) r <- unnamed n q makeSu (n+1) (r : su) qs tys where k1 = kindOf q@@ -61,16 +64,22 @@ makeSu _ su [] _ = do recordError TooManyPositionalTypeParams return (reverse su) - unnamed n q = do r <- curRange- let src = ordinal n <+> text "type parameter"- $$ text "of" <+> ppUse e- $$ text "at" <+> pp r- ty <- newType src (kindOf q)- return (tpVar q, ty)+ unnamed n q = do ty <- newType src (kindOf q)+ return (q, ty)+ where+ src = case drop (n-1) {- count from 1 -} as of+ p:_ ->+ case tpFlav p of+ TPOther (Just a) -> TypeParamInstNamed nm (nameIdent a)+ _ -> TypeParamInstPos nm n+ _ -> panic "instantiateWithPos"+ [ "Invalid parameter index", show n, show as ] ++ {- | Instantiate an expression of the given polymorphic type. The arguments that are provided will be instantiated as requested, the rest will be instantiated with fresh type variables.@@ -81,81 +90,91 @@ - There will be one `ETApp t` for each insantiated type parameter; - there will be one `EProofApp` for each constraint on the schema; -}-instantiateWithNames :: Expr -> Schema -> [Located (Ident,Type)]+instantiateWithNames :: Name -> Expr -> Schema -> [Located (Ident,Type)] -> InferM (Expr,Type)-instantiateWithNames e (Forall as ps t) xs =+instantiateWithNames nm e (Forall as ps t) xs = do sequence_ repeatedParams- sequence_ undefParams- su' <- mapM paramInst as+ mapM_ (recordError . UndefinedTypeParameter . fmap fst) undefParams+ su' <- zipWithM paramInst [ 1.. ] as doInst su' e ps t where -- Choose the type for type parameter `x`- paramInst x =- do let v = tpVar x- k = kindOf v+ paramInst n x =+ do let k = tpKind x -- We just use nameIdent for comparison here, as all parameter names -- should have a NameInfo of Parameter. lkp name = find (\th -> fst (thing th) == nameIdent name) xs- src r = text "type parameter" <+> (case tpName x of- Just n -> quotes (pp n)- Nothing -> empty)- $$ text "of" <+> ppUse e- $$ text "at" <+> pp r+ src = case tpName x of+ Just na -> TypeParamInstNamed nm (nameIdent na)+ Nothing -> TypeParamInstPos nm n ty <- case lkp =<< tpName x of Just lty | k1 == k -> return ty- | otherwise -> do let r = srcRange lty- inRange r $ recordError (KindMismatch k k1)- newType (src r) k+ | otherwise -> inRange (srcRange lty) $+ do recordError (KindMismatch k k1)+ newType src k where ty = snd (thing lty) k1 = kindOf ty- Nothing -> do r <- curRange- newType (src r) k- return (v,ty)+ Nothing -> newType src k+ return (x, ty) -- Errors from multiple values for the same parameter. repeatedParams = mapMaybe isRepeated $ groupBy ((==) `on` pName) $ sortBy (compare `on` pName) xs - isRepeated ys@(a : _ : _) = Just $ recordError- $ MultipleTypeParamDefs (fst (thing a))- (map srcRange ys)- isRepeated _ = Nothing+ isRepeated ys@(a : _ : _) =+ Just $ recordError (RepeatedTypeParameter (fst (thing a)) (map srcRange ys))+ isRepeated _ = Nothing paramIdents = [ nameIdent n | Just n <- map tpName as ] -- Errors from parameters that are defined, but do not exist in the schema.- undefParams = do x <- xs- let name = pName x- guard (name `notElem` paramIdents)- return $ inRange (srcRange x)- $ recordError- $ UndefinedTypeParam x { thing = name }+ undefParams = [ x | x <- xs, pName x `notElem` paramIdents ] pName = fst . thing -+-- If the instantiation contains an assignment (v := t), and the type+-- contains a free unification variable ?x that could possibly depend+-- on v, then we must require that t = v (i.e. su must be an identity+-- substitution). Otherwise, this causes a problem: If ?x is+-- eventually instantiated to a type containing v, then the type+-- substitution will have computed the wrong result. -doInst :: [(TVar, Type)] -> Expr -> [Prop] -> Type -> InferM (Expr,Type)+doInst :: [(TParam, Type)] -> Expr -> [Prop] -> Type -> InferM (Expr,Type) doInst su' e ps t =- do let su = listSubst su'+ do let su = listSubst [ (tpVar tp, ty) | (tp, ty) <- su' ] newGoals (CtInst e) (map (apSubst su) ps) let t1 = apSubst su t- return ( addProofParams- $ addTyParams (map snd su') e- , t1)++ -- Possibly more goals due to unification+ ps' <- concat <$> mapM checkInst su'+ newGoals (CtInst e) ps'++ return ( addProofParams (addTyParams (map snd su') e), t1 ) where -- Add type parameters addTyParams ts e1 = foldl ETApp e1 ts - -- Add proof parameters (the proofs are ommited but we mark where they'd go)+ -- Add proof parameters (the proofs are omitted but we mark where they'd go) addProofParams e1 = foldl (\e2 _ -> EProofApp e2) e1 ps + -- free unification variables used in the schema+ frees = Set.unions (map fvs (t : ps)) + -- the bound variables from the scopes of any unification variables in the schema+ bounds = Set.unions (map scope (Set.toList frees))+ where+ scope (TVFree _ _ vs _) = vs+ scope (TVBound _) = Set.empty + -- if the tvar is in 'bounds', then make sure it is an identity substitution+ checkInst :: (TParam, Type) -> InferM [Prop]+ checkInst (tp, ty)+ | Set.notMember tp bounds = return []+ | otherwise = unify (TVar (tpVar tp)) ty
src/Cryptol/TypeCheck/Kind.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Kind -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,17 +13,21 @@ , checkSchema , checkNewtype , checkTySyn+ , checkPropSyn+ , checkParameterType+ , checkParameterConstraints ) where import qualified Cryptol.Parser.AST as P import Cryptol.Parser.AST (Named(..)) import Cryptol.Parser.Position import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.Error import Cryptol.TypeCheck.Monad hiding (withTParams) import Cryptol.TypeCheck.SimpType(tRebuild)+import Cryptol.TypeCheck.SimpleSolver(simplify) import Cryptol.TypeCheck.Solve (simplifyAllConstraints- ,wfTypeFunction)-import Cryptol.Utils.PP+ ,wfTypeFunction,wfTC) import Cryptol.Utils.Panic (panic) import qualified Data.Map as Map@@ -34,16 +38,22 @@ --- | Check a type signature.-checkSchema :: P.Schema Name -> InferM (Schema, [Goal])-checkSchema (P.Forall xs ps t mb) =+-- | Check a type signature. Returns validated schema, and any implicit+-- constraints that we inferred.+checkSchema :: AllowWildCards -> P.Schema Name -> InferM (Schema, [Goal])+checkSchema withWild (P.Forall xs ps t mb) = do ((xs1,(ps1,t1)), gs) <- collectGoals $- rng $ withTParams True xs $+ rng $ withTParams withWild schemaParam xs $ do ps1 <- mapM checkProp ps t1 <- doCheckType t (Just KType) return (ps1,t1)- return ( Forall xs1 (map tRebuild ps1) (tRebuild t1)+ -- XXX: We probably shouldn't do this, as we are changing what the+ -- user is doing. We do it so that things are in a propal normal form,+ -- but we should probably figure out another time to do this.+ let newPs = concatMap pSplitAnd $ map (simplify Map.empty)+ $ map tRebuild ps1+ return ( Forall xs1 newPs (tRebuild t1) , [ g { goal = tRebuild (goal g) } | g <- gs ] ) @@ -52,27 +62,55 @@ Nothing -> id Just r -> inRange r +-- | Check a module parameter declarations. Nothing much to check,+-- we just translate from one syntax to another.+checkParameterType :: P.ParameterType Name -> Maybe String -> InferM ModTParam+checkParameterType a mbDoc =+ do let k = cvtK (P.ptKind a)+ n = thing (P.ptName a)+ return ModTParam { mtpKind = k, mtpName = n, mtpDoc = mbDoc+ , mtpNumber = P.ptNumber a }++ -- | Check a type-synonym declaration.-checkTySyn :: P.TySyn Name -> InferM TySyn-checkTySyn (P.TySyn x as t) =+checkTySyn :: P.TySyn Name -> Maybe String -> InferM TySyn+checkTySyn (P.TySyn x as t) mbD = do ((as1,t1),gs) <- collectGoals $ inRange (srcRange x)- $ do r <- withTParams False as (doCheckType t Nothing)+ $ do r <- withTParams NoWildCards tySynParam as+ (doCheckType t Nothing) simplifyAllConstraints return r return TySyn { tsName = thing x , tsParams = as1 , tsConstraints = map (tRebuild . goal) gs , tsDef = tRebuild t1+ , tsDoc = mbD } +-- | Check a constraint-synonym declaration.+checkPropSyn :: P.PropSyn Name -> Maybe String -> InferM TySyn+checkPropSyn (P.PropSyn x as ps) mbD =+ do ((as1,t1),gs) <- collectGoals+ $ inRange (srcRange x)+ $ do r <- withTParams NoWildCards propSynParam as+ (traverse checkProp ps)+ simplifyAllConstraints+ return r+ return TySyn { tsName = thing x+ , tsParams = as1+ , tsConstraints = map (tRebuild . goal) gs+ , tsDef = tRebuild (pAnd t1)+ , tsDoc = mbD+ }+ -- | Check a newtype declaration. -- XXX: Do something with constraints.-checkNewtype :: P.Newtype Name -> InferM Newtype-checkNewtype (P.Newtype x as fs) =+checkNewtype :: P.Newtype Name -> Maybe String -> InferM Newtype+checkNewtype (P.Newtype x as fs) mbD = do ((as1,fs1),gs) <- collectGoals $ inRange (srcRange x) $- do r <- withTParams False as $+ do r <- withTParams NoWildCards newtypeParam as $ forM fs $ \field -> let n = name field in kInRange (srcRange n) $@@ -85,15 +123,25 @@ , ntParams = as1 , ntConstraints = map goal gs , ntFields = fs1+ , ntDoc = mbD } checkType :: P.Type Name -> Maybe Kind -> InferM Type checkType t k =- do (_, t1) <- withTParams True [] $ doCheckType t k+ do (_, t1) <- withTParams AllowWildCards schemaParam [] $ doCheckType t k return (tRebuild t1) +checkParameterConstraints :: [Located (P.Prop Name)] -> InferM [Located Prop]+checkParameterConstraints ps =+ do (_, cs) <- withTParams NoWildCards schemaParam [] (mapM checkL ps)+ return cs+ where+ checkL x = do p <- checkProp (thing x)+ return x { thing = tRebuild p }++ {- | Check something with type parameters. When we check things with type parameters (i.e., type schemas, and type@@ -123,12 +171,18 @@ annotation) in the rest. -} -withTParams :: Bool -> [P.TParam Name] -> KindM a -> InferM ([TParam], a)-withTParams allowWildCards xs m =+withTParams :: AllowWildCards {- ^ Do we allow wild cards -} ->+ (Name -> TPFlavor) {- ^ What sort of params are these? -} ->+ [P.TParam Name] {- ^ The params -} ->+ KindM a {- ^ do this using the params -} ->+ InferM ([TParam], a)+withTParams allowWildCards flav xs m+ | not (null duplicates) = panic "withTParams" $ "Repeated parameters"+ : map show duplicates+ | otherwise = 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+ mdo (a, vars,ctrs) <- runKindM allowWildCards (zip' xs as) m+ as <- mapM (newTP vars) xs return (as,a,ctrs) mapM_ (uncurry newGoals) ctrs return (as,a)@@ -141,8 +195,8 @@ return KNum newTP vs tp = do k <- getKind vs tp- n <- newTParam (Just (P.tpName tp)) k- return (n, TVar (tpVar n))+ let nm = P.tpName tp+ newTParam tp (flav nm) k {- Note that we only zip based on the first argument.@@ -151,13 +205,16 @@ zip' [] _ = [] zip' (a:as) ~(t:ts) = (P.tpName a, fmap cvtK (P.tpKind a), t) : zip' as ts - cvtK P.KNum = KNum- cvtK P.KType = KType-- duplicates = [ RepeatedTyParams ds- | ds@(_ : _ : _) <- groupBy ((==) `on` P.tpName)+ duplicates = [ ds | ds@(_ : _ : _) <- groupBy ((==) `on` P.tpName) $ sortBy (compare `on` P.tpName) xs ] +cvtK :: P.Kind -> Kind+cvtK P.KNum = KNum+cvtK P.KType = KType+cvtK (P.KFun k1 k2) = cvtK k1 :-> cvtK k2+++ -- | Check an application of a type constant. tcon :: TCon -- ^ Type constant being applied -> [P.Type Name] -- ^ Type parameters@@ -167,46 +224,41 @@ do (ts1,k1) <- appTy ts0 (kindOf tc) checkKind (TCon tc ts1) k k1 --- | Check a use of a type-synonym, newtype, or scoped-type variable.-tySyn :: Bool -- ^ Should we check for scoped type vars.- -> Name -- ^ Name of type sysnonym- -> [P.Type Name]-- ^ Type synonym parameters- -> Maybe Kind -- ^ Expected kind- -> KindM Type -- ^ Resulting type-tySyn scoped x ts k =- do mb <- kLookupTSyn x- case mb of- Just (tysyn@(TySyn f as ps def)) ->- do (ts1,k1) <- appTy ts (kindOf tysyn)- ts2 <- checkParams as ts1- let su = zip as ts2- ps1 <- mapM (`kInstantiateT` su) ps- kNewGoals (CtPartialTypeFun (UserTyFun f)) ps1- t1 <- kInstantiateT def su- checkKind (TUser x ts1 t1) k k1+-- | Check a type application of a non built-in type or type variable.+checkTUser ::+ Name {- ^ The name that is being applied to some arguments. -} ->+ [P.Type Name] {- ^ Type synonym parameters -} ->+ Maybe Kind {- ^ Expected kind -} ->+ KindM Type {- ^ Resulting type -}+checkTUser x ts k =+ mcase kLookupTyVar checkBoundVarUse $+ mcase kLookupTSyn checkTySynUse $+ mcase kLookupNewtype checkNewTypeUse $+ mcase kLookupParamType checkModuleParamUse $+ checkScopedVarUse -- none of the above, must be a scoped type variable,+ -- if the renamer did its job correctly.+ where+ checkTySynUse tysyn =+ do (ts1,k1) <- appTy ts (kindOf tysyn)+ let as = tsParams tysyn+ ts2 <- checkParams as ts1+ let su = zip as ts2+ ps1 <- mapM (`kInstantiateT` su) (tsConstraints tysyn)+ kNewGoals (CtPartialTypeFun (UserTyFun (tsName tysyn))) ps1+ t1 <- kInstantiateT (tsDef tysyn) su+ checkKind (TUser x ts1 t1) k k1 - -- Maybe it is a newtype?- Nothing ->- do mbN <- kLookupNewtype x- case mbN of- Just nt ->- do let tc = newtypeTyCon nt- (ts1,_) <- appTy ts (kindOf tc)- ts2 <- checkParams (ntParams nt) ts1- return (TCon tc ts2)+ checkNewTypeUse nt =+ do let tc = newtypeTyCon nt+ (ts1,_) <- appTy ts (kindOf tc)+ ts2 <- checkParams (ntParams nt) ts1+ return (TCon tc ts2) - -- Maybe it is a scoped type variable?- Nothing- | scoped -> kExistTVar x $ fromMaybe KNum k- | otherwise ->- do kRecordError $ UndefinedTypeSynonym x- kNewType (text "type synonym" <+> pp x) $ fromMaybe KNum k- where checkParams as ts1 | paramHave == paramNeed = return ts1 | paramHave < paramNeed = do kRecordError (TooFewTySynParams x (paramNeed-paramHave))- let src = text "missing prameter of" <+> pp x+ let src = TypeErrorPlaceHolder fake <- mapM (kNewType src . kindOf . tpVar) (drop paramHave as) return (ts1 ++ fake)@@ -216,6 +268,45 @@ paramNeed = length as ++ checkModuleParamUse a =+ do let ty = tpVar (mtpParam a)+ (ts1,k1) <- appTy ts (kindOf ty)+ case k of+ Just ks | ks /= k1 -> kRecordError $ KindMismatch ks k1+ _ -> return ()++ unless (null ts1) $+ panic "Kind.checkTUser.checkModuleParam" [ "Unexpected parameters" ]++ return (TVar ty)++ checkBoundVarUse v =+ do unless (null ts) $ kRecordError TyVarWithParams+ case v of+ TLocalVar t mbk ->+ case k of+ Nothing -> return (TVar (tpVar t))+ Just k1 ->+ case mbk of+ Nothing -> kSetKind x k1 >> return (TVar (tpVar t))+ Just k2 -> checkKind (TVar (tpVar t)) k k2+ TOuterVar t -> checkKind (TVar (tpVar t)) k (kindOf t)++ checkScopedVarUse =+ do unless (null ts) (kRecordError TyVarWithParams)+ kExistTVar x $ fromMaybe KNum k++ mcase :: (Name -> KindM (Maybe a)) ->+ (a -> KindM Type) ->+ KindM Type ->+ KindM Type+ mcase m f rest =+ do mb <- m x+ case mb of+ Nothing -> rest+ Just a -> f a+ -- | Check a type-application. appTy :: [P.Type Name] -- ^ Parameters to type function -> Kind -- ^ Kind of type function@@ -239,22 +330,23 @@ doCheckType ty k = case ty of P.TWild ->- do ok <- kWildOK- unless ok $ kRecordError UnexpectedTypeWildCard+ do wildOk <- kWildOK+ case wildOk of+ AllowWildCards -> return ()+ NoWildCards -> kRecordError UnexpectedTypeWildCard theKind <- case k of Just k1 -> return k1 Nothing -> do kRecordWarning (DefaultingWildType P.KNum) return KNum- kNewType (text "wildcard") theKind+ kNewType TypeWildCard theKind P.TFun t1 t2 -> tcon (TC TCFun) [t1,t2] k P.TSeq t1 t2 -> tcon (TC TCSeq) [t1,t2] k P.TBit -> tcon (TC TCBit) [] k P.TNum n -> tcon (TC (TCNum n)) [] k P.TChar n -> tcon (TC (TCNum $ fromIntegral $ fromEnum n)) [] k- P.TInf -> tcon (TC TCInf) [] k- P.TApp tf ts ->- do it <- tcon (TF tf) ts k+ P.TApp tc ts ->+ do it <- tcon tc ts k -- Now check for additional well-formedness -- constraints.@@ -263,6 +355,10 @@ case wfTypeFunction f ts' of [] -> return () ps -> kNewGoals (CtPartialTypeFun (BuiltInTyFun f)) ps+ TCon (TC f) ts' ->+ case wfTC f ts' of+ [] -> return ()+ ps -> kNewGoals (CtPartialTypeFun (BuiltInTC f)) ps _ -> return () return it@@ -272,8 +368,7 @@ checkKind t1 k KType P.TLocated t r1 -> kInRange r1 $ doCheckType t k - P.TUser x [] -> checkTyThing x k- P.TUser x ts -> tySyn False x ts k+ P.TUser x ts -> checkTUser x ts k P.TParens t -> doCheckType t k @@ -288,37 +383,24 @@ --- | Check a type-variable or type-synonym.-checkTyThing :: Name -- ^ Name of thing that needs checking- -> Maybe Kind -- ^ Expected kind- -> KindM Type-checkTyThing x k =- do it <- kLookupTyVar x- case it of- Just (TLocalVar t mbk) ->- case k of- Nothing -> return t- Just k1 ->- case mbk of- Nothing -> kSetKind x k1 >> return t- Just k2 -> checkKind t k k2-- Just (TOuterVar t) -> checkKind t k (kindOf t)- Nothing -> tySyn True x [] k-- -- | Validate a parsed proposition. checkProp :: P.Prop Name -- ^ Proposition that need to be checked -> KindM Type -- ^ Checked representation checkProp prop = case prop of- P.CFin t1 -> tcon (PC PFin) [t1] (Just KProp)- P.CEqual t1 t2 -> tcon (PC PEqual) [t1,t2] (Just KProp)- P.CGeq t1 t2 -> tcon (PC PGeq) [t1,t2] (Just KProp)- P.CArith t1 -> tcon (PC PArith) [t1] (Just KProp)- P.CCmp t1 -> tcon (PC PCmp) [t1] (Just KProp)- P.CLocated p r1 -> kInRange r1 (checkProp p)- P.CType _ -> panic "checkProp" [ "Unexpected CType", show prop ]+ P.CFin t1 -> tcon (PC PFin) [t1] (Just KProp)+ P.CEqual t1 t2 -> tcon (PC PEqual) [t1,t2] (Just KProp)+ P.CNeq t1 t2 -> tcon (PC PNeq) [t1,t2] (Just KProp)+ P.CGeq t1 t2 -> tcon (PC PGeq) [t1,t2] (Just KProp)+ P.CZero t1 -> tcon (PC PZero) [t1] (Just KProp)+ P.CLogic t1 -> tcon (PC PLogic) [t1] (Just KProp)+ P.CArith t1 -> tcon (PC PArith) [t1] (Just KProp)+ P.CCmp t1 -> tcon (PC PCmp) [t1] (Just KProp)+ P.CSignedCmp t1 -> tcon (PC PSignedCmp) [t1] (Just KProp)+ P.CLiteral t1 t2 -> tcon (PC PLiteral) [t1,t2] (Just KProp)+ P.CUser x ts -> checkTUser x ts (Just KProp)+ P.CLocated p r1 -> kInRange r1 (checkProp p)+ P.CType _ -> panic "checkProp" [ "Unexpected CType", show prop ] -- | Check that a type has the expected kind.@@ -328,7 +410,7 @@ -> KindM Type -- ^ A type consistent with expectations. checkKind _ (Just k1) k2 | k1 /= k2 = do kRecordError (KindMismatch k1 k2)- kNewType (text "kind error") k1+ kNewType TypeErrorPlaceHolder k1 checkKind t _ _ = return t
src/Cryptol/TypeCheck/Monad.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Monad -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -11,22 +11,27 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecursiveDo #-} {-# LANGUAGE PatternGuards #-}+{-# LANGUAGE OverloadedStrings #-} module Cryptol.TypeCheck.Monad ( module Cryptol.TypeCheck.Monad , module Cryptol.TypeCheck.InferTypes ) where -import Cryptol.ModuleSystem.Name (FreshM(..),Supply)+import Cryptol.ModuleSystem.Name+ (FreshM(..),Supply,mkParameter+ , nameInfo, NameInfo(..),NameSource(..)) 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.Unify(mgu, runResult, UnificationError(..)) import Cryptol.TypeCheck.InferTypes+import Cryptol.TypeCheck.Error(Warning(..),Error(..),cleanupErrors)+import Cryptol.TypeCheck.PP (brackets, commaSep) import qualified Cryptol.TypeCheck.SimpleSolver as Simple-import qualified Cryptol.TypeCheck.Solver.CrySAT as CrySAT-import Cryptol.Utils.PP(pp, (<+>), Doc, text, quotes)+import qualified Cryptol.TypeCheck.Solver.SMT as SMT+import Cryptol.Utils.PP(pp, (<+>), text, quotes)+import Cryptol.Utils.Ident(Ident) import Cryptol.Utils.Panic(panic) import qualified Control.Applicative as A@@ -35,15 +40,12 @@ import qualified Data.Set as Set import Data.Map (Map) import Data.Set (Set)-import Data.List(find, minimumBy, groupBy, sortBy, foldl')-import Data.Maybe(mapMaybe)-import Data.Function(on)+import Data.List(find, foldl')+import Data.Maybe(mapMaybe,fromMaybe) import MonadLib hiding (mapM) import Data.IORef -import System.FilePath((</>))-import System.Directory(doesFileExist) import GHC.Generics (Generic)@@ -59,6 +61,15 @@ , inpVars :: Map Name Schema -- ^ Variables that are in scope , inpTSyns :: Map Name TySyn -- ^ Type synonyms that are in scope , inpNewtypes :: Map Name Newtype -- ^ Newtypes in scope++ -- When typechecking a module these start off empty.+ -- We need them when type-checking an expression at the command+ -- line, for example.+ , inpParamTypes :: !(Map Name ModTParam) -- ^ Type parameters+ , inpParamConstraints :: !([Located Prop]) -- ^ Constraints on parameters+ , inpParamFuns :: !(Map Name ModVParam) -- ^ Value parameters++ , inpNameSeeds :: NameSeeds -- ^ Private state of type-checker , inpMonoBinds :: Bool -- ^ Should local bindings without -- signatures be monomorphized?@@ -67,9 +78,9 @@ , inpSearchPath :: [FilePath] -- ^ Where to look for Cryptol theory file. - , inpPrimNames :: !PrimMap -- ^ The mapping from 'Ident' to 'Name',- -- for names that the typechecker- -- needs to refer to.+ , inpPrimNames :: !PrimMap+ -- ^ This is used when the type-checker needs to refer to a predefined+ -- identifier (e.g., @number@). , inpSupply :: !Supply -- ^ The supply for fresh name generation } deriving Show@@ -82,6 +93,7 @@ } deriving (Show, Generic, NFData) -- | The initial seeds, used when checking a fresh program.+-- XXX: why does this start at 10? nameSeeds :: NameSeeds nameSeeds = NameSeeds { seedTVar = 10, seedGoal = 0 } @@ -102,21 +114,24 @@ io $ modifyIORef' iSolveCounter (+1) runInferM :: TVars a => InferInput -> InferM a -> IO (InferOutput a)-runInferM info (IM m) = CrySAT.withSolver (inpSolverConfig info) $ \solver ->- do loadCryTCPrel solver (inpSearchPath info)- coutner <- newIORef 0+runInferM info (IM m) = SMT.withSolver (inpSolverConfig info) $ \solver ->+ do coutner <- newIORef 0 rec ro <- return RO { iRange = inpRange info- , iVars = Map.map ExtVar (inpVars info)- , iTVars = []- , iTSyns = fmap mkExternal (inpTSyns info)- , iNewtypes = fmap mkExternal (inpNewtypes info)- , iSolvedHasLazy = iSolvedHas finalRW -- RECURSION- , iMonoBinds = inpMonoBinds info- , iSolver = solver- , iPrimNames = inpPrimNames info- , iSolveCounter = coutner- }+ , iVars = Map.map ExtVar (inpVars info)+ , iTVars = []+ , iTSyns = fmap mkExternal (inpTSyns info)+ , iNewtypes = fmap mkExternal (inpNewtypes info)+ , iParamTypes = inpParamTypes info+ , iParamFuns = inpParamFuns info+ , iParamConstraints = inpParamConstraints info + , iSolvedHasLazy = iSolvedHas finalRW -- RECURSION+ , iMonoBinds = inpMonoBinds info+ , iSolver = solver+ , iPrimNames = inpPrimNames info+ , iSolveCounter = coutner+ }+ (result, finalRW) <- runStateT rw $ runReaderT ro m -- RECURSION @@ -134,14 +149,13 @@ (iSupply finalRW) (apSubst defSu result) (cts,has) -> return $ InferFailed warns- $ dropErrorsFromSameLoc+ $ cleanupErrors [ ( goalRange g , UnsolvedGoals False [apSubst theSu g] ) | g <- fromGoals cts ++ map hasGoal has ] errs -> return $ InferFailed warns- $ dropErrorsFromSameLoc- [(r,apSubst theSu e) | (r,e) <- errs]+ $ cleanupErrors [(r,apSubst theSu e) | (r,e) <- errs] where mkExternal x = (IsExternal, x)@@ -159,29 +173,12 @@ , iSupply = inpSupply info } - dropErrorsFromSameLoc = map chooseBestError . groupBy ((==) `on` fst)- . sortBy (cmpRange `on` fst) - addErrorSize (r,e) = (length (show (pp e)), (r,e))- chooseBestError = snd . minimumBy (compare `on` fst) . map addErrorSize - -- 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@@ -206,6 +203,16 @@ -- at the top-level, but then there can't be a newtype with the -- same name (this should be caught by the renamer). + , iParamTypes :: Map Name ModTParam+ -- ^ Parameter types++ , iParamConstraints :: [Located Prop]+ -- ^ Constraints on the type parameters++ , iParamFuns :: Map Name ModVParam+ -- ^ Parameter functions++ , iSolvedHasLazy :: Map Int (Expr -> Expr) -- ^ NOTE: This field is lazy in an important way! It is the -- final version of `iSolvedHas` in `RW`, and the two are tied@@ -218,7 +225,7 @@ -- in where-blocks will never be generalized. Bindings with type -- signatures, and all bindings at top level are unaffected. - , iSolver :: CrySAT.Solver+ , iSolver :: SMT.Solver , iPrimNames :: !PrimMap @@ -306,10 +313,20 @@ recordWarning :: Warning -> InferM () recordWarning w =- do r <- curRange+ unless ignore $+ do r <- case w of+ DefaultingTo d _ -> return (tvarSource d)+ _ -> curRange IM $ sets_ $ \s -> s { iWarnings = (r,w) : iWarnings s }+ where+ ignore+ | DefaultingTo d _ <- w+ , Just n <- tvSourceName (tvarDesc d)+ , Declared _ SystemName <- nameInfo n+ = True+ | otherwise = False -getSolver :: InferM CrySAT.Solver+getSolver :: InferM SMT.Solver getSolver = do RO { .. } <- IM ask return iSolver@@ -336,7 +353,8 @@ The substitution IS applied to them. -} getGoals :: InferM [Goal] getGoals =- do goals <- applySubst =<< IM (sets $ \s -> (iCts s, s { iCts = emptyGoals }))+ do goals <- applySubst =<<+ IM (sets $ \s -> (iCts s, s { iCts = emptyGoals })) return (fromGoals goals) -- | Add a bunch of goals that need solving.@@ -413,6 +431,11 @@ -------------------------------------------------------------------------------- +-- | Generate a fresh variable name to be used in a local binding.+newParamName :: Ident -> InferM Name+newParamName x =+ do r <- curRange+ liftSupply (mkParameter x r) newName :: (NameSeeds -> (a , NameSeeds)) -> InferM a newName upd = IM $ sets $ \s -> let (x,seeds) = upd (iNameSeeds s)@@ -425,32 +448,39 @@ in (x, s { seedGoal = x + 1}) -- | Generate a new free type variable.-newTVar :: Doc -> Kind -> InferM TVar+newTVar :: TVarSource -> Kind -> InferM TVar newTVar src k = newTVar' src Set.empty k -- | Generate a new free type variable that depends on these additional -- type parameters.-newTVar' :: Doc -> Set TVar -> Kind -> InferM TVar+newTVar' :: TVarSource -> Set TParam -> Kind -> InferM TVar newTVar' src extraBound k =- do bound <- getBoundInScope+ do r <- curRange+ bound <- getBoundInScope let vs = Set.union extraBound bound+ msg = TVarInfo { tvarDesc = src, tvarSource = r } newName $ \s -> let x = seedTVar s- in (TVFree x k vs src, s { seedTVar = x + 1 })+ in (TVFree x k vs msg, s { seedTVar = x + 1 }) -- | Generate a new free type variable.-newTParam :: Maybe Name -> Kind -> InferM TParam-newTParam nm k = newName $ \s -> let x = seedTVar s- in (TParam { tpUnique = x- , tpKind = k- , tpName = nm- }- , s { seedTVar = x + 1 })+newTParam :: P.TParam Name -> TPFlavor -> Kind -> InferM TParam+newTParam nm flav k = newName $ \s ->+ let x = seedTVar s+ in (TParam { tpUnique = x+ , tpKind = k+ , tpFlav = flav+ , tpInfo = desc+ }+ , s { seedTVar = x + 1 })+ where desc = TVarInfo { tvarDesc = TVFromSignature (P.tpName nm)+ , tvarSource = fromMaybe emptyRange (P.tpRange nm)+ } -- | Generate an unknown type. The doc is a note about what is this type about.-newType :: Doc -> Kind -> InferM Type+newType :: TVarSource -> Kind -> InferM Type newType src k = TVar `fmap` newTVar src k @@ -463,21 +493,21 @@ unify t1 t2 = do t1' <- applySubst t1 t2' <- applySubst t2- case mgu t1' t2' of- OK (su1,ps) -> extendSubst su1 >> return ps- Error err ->- do case err of- UniTypeLenMismatch _ _ -> recordError (TypeMismatch t1' t2')- UniTypeMismatch s1 s2 -> recordError (TypeMismatch s1 s2)- UniKindMismatch k1 k2 -> recordError (KindMismatch k1 k2)- UniRecursive x t -> recordError (RecursiveType (TVar x) t)- UniNonPolyDepends x vs -> recordError- (TypeVariableEscaped (TVar x) vs)- UniNonPoly x t -> recordError (NotForAll x t)- return []---+ let ((su1, ps), errs) = runResult (mgu t1' t2')+ extendSubst su1+ let toError :: UnificationError -> Error+ toError err =+ case err of+ UniTypeLenMismatch _ _ -> TypeMismatch t1' t2'+ UniTypeMismatch s1 s2 -> TypeMismatch s1 s2+ UniKindMismatch k1 k2 -> KindMismatch k1 k2+ UniRecursive x t -> RecursiveType (TVar x) t+ UniNonPolyDepends x vs -> TypeVariableEscaped (TVar x) vs+ UniNonPoly x t -> NotForAll x t+ case errs of+ [] -> return ps+ _ -> do mapM_ (recordError . toError) errs+ return [] -- | Apply the accumulated substitution to something with free type variables. applySubst :: TVars t => t -> InferM t@@ -485,13 +515,52 @@ do su <- getSubst return (apSubst su t) +applySubstPreds :: [Prop] -> InferM [Prop]+applySubstPreds ps =+ do ps1 <- applySubst ps+ return (concatMap pSplitAnd ps1)+++applySubstGoals :: [Goal] -> InferM [Goal]+applySubstGoals gs =+ do gs1 <- applySubst gs+ return [ g { goal = p } | g <- gs1, p <- pSplitAnd (goal g) ]+ -- | Get the substitution that we have accumulated so far. getSubst :: InferM Subst getSubst = IM $ fmap iSubst get --- | Add to the accumulated substitution.+-- | Add to the accumulated substitution, checking that the datatype+-- invariant for `Subst` is maintained. extendSubst :: Subst -> InferM ()-extendSubst su = IM $ sets_ $ \s -> s { iSubst = su @@ iSubst s }+extendSubst su =+ do mapM_ check (substToList su)+ IM $ sets_ $ \s -> s { iSubst = su @@ iSubst s }+ where+ check :: (TVar, Type) -> InferM ()+ check (v, ty) =+ case v of+ TVBound _ ->+ panic "Cryptol.TypeCheck.Monad.extendSubst"+ [ "Substitution instantiates bound variable:"+ , "Variable: " ++ show (pp v)+ , "Type: " ++ show (pp ty)+ ]+ TVFree _ _ tvs _ ->+ do let bounds tv =+ case tv of+ TVBound tp -> Set.singleton tp+ TVFree _ _ tps _ -> tps+ let vars = Set.unions (map bounds (Set.elems (fvs ty)))+ -- (Set.filter isBoundTV (fvs ty))+ let escaped = Set.difference vars tvs+ if Set.null escaped then return () else+ panic "Cryptol.TypeCheck.Monad.extendSubst"+ [ "Escaped quantified variables:"+ , "Substitution: " ++ show (pp v <+> text ":=" <+> pp ty)+ , "Vars in scope: " ++ show (brackets (commaSep (map pp (Set.toList tvs))))+ , "Escaped: " ++ show (brackets (commaSep (map pp (Set.toList escaped))))+ ] -- | Variables that are either mentioned in the environment or in@@ -524,14 +593,17 @@ do mbNT <- lookupNewtype x case mbNT of Just nt -> return (ExtVar (newtypeConType nt))- Nothing -> do recordError $ UndefinedVariable x- a <- newType (text "type of" <+> pp x) KType- return $ ExtVar $ Forall [] [] a+ Nothing ->+ do mbParamFun <- lookupParamFun x+ case mbParamFun of+ Just pf -> return (ExtVar (mvpType pf))+ Nothing -> panic "lookupVar" [ "Undefined type variable"+ , show x] -- | Lookup a type variable. Return `Nothing` if there is no such variable -- in scope, in which case we must be dealing with a type constant.-lookupTVar :: Name -> InferM (Maybe Type)-lookupTVar x = IM $ asks $ fmap (TVar . tpVar) . find this . iTVars+lookupTParam :: Name -> InferM (Maybe TParam)+lookupTParam x = IM $ asks $ find this . iTVars where this tp = tpName tp == Just x -- | Lookup the definition of a type synonym.@@ -542,6 +614,14 @@ lookupNewtype :: Name -> InferM (Maybe Newtype) lookupNewtype x = fmap (fmap snd . Map.lookup x) getNewtypes +-- | Lookup the kind of a parameter type+lookupParamType :: Name -> InferM (Maybe ModTParam)+lookupParamType x = Map.lookup x <$> getParamTypes++-- | Lookup the schema for a parameter function.+lookupParamFun :: Name -> InferM (Maybe ModVParam)+lookupParamFun x = Map.lookup x <$> getParamFuns+ -- | Check if we already have a name for this existential type variable and, -- if so, return the definition. If not, try to create a new definition, -- if this is allowed. If not, returns nothing.@@ -554,14 +634,12 @@ Nothing -> case scopes of [] ->- do recordError $ ErrorMsg $- text "Undefined type" <+> quotes (pp x)- newType (text "undefined existential type varible" <+>- quotes (pp x)) k+ do recordError $ ErrorMsg+ $ text "Undefined type" <+> quotes (pp x)+ newType TypeErrorPlaceHolder k sc : more ->- do ty <- newType (text "existential type variable"- <+> quotes (pp x)) k+ do ty <- newType TypeErrorPlaceHolder k IM $ sets_ $ \s -> s{ iExistTVars = Map.insert x ty sc : more } return ty @@ -574,13 +652,29 @@ getNewtypes :: InferM (Map Name (DefLoc,Newtype)) getNewtypes = IM $ asks iNewtypes +-- | Returns the parameter functions declarations+getParamFuns :: InferM (Map Name ModVParam)+getParamFuns = IM $ asks iParamFuns++-- | Returns the abstract function declarations+getParamTypes :: InferM (Map Name ModTParam)+getParamTypes = IM $ asks iParamTypes++-- | Constraints on the module's parameters.+getParamConstraints :: InferM [Located Prop]+getParamConstraints = IM $ asks iParamConstraints+ -- | Get the set of bound type variables that are in scope. getTVars :: InferM (Set Name) getTVars = IM $ asks $ Set.fromList . mapMaybe tpName . iTVars -- | Return the keys of the bound variables that are in scope.-getBoundInScope :: InferM (Set TVar)-getBoundInScope = IM $ asks $ Set.fromList . map tpVar . iTVars+getBoundInScope :: InferM (Set TParam)+getBoundInScope =+ do ro <- IM ask+ let params = Set.fromList (map mtpParam (Map.elems (iParamTypes ro)))+ bound = Set.fromList (iTVars ro)+ return $! Set.union params bound -- | Retrieve the value of the `mono-binds` option. getMonoBinds :: InferM Bool@@ -638,6 +732,11 @@ IM $ mapReader (\r -> r { iNewtypes = Map.insert (ntName t) (IsLocal,t) (iNewtypes r) }) m+withParamType :: ModTParam -> InferM a -> InferM a+withParamType a (IM m) =+ IM $ mapReader+ (\r -> r { iParamTypes = Map.insert (mtpName a) a (iParamTypes r) })+ m -- | The sub-computation is performed with the given variable in scope. withVarType :: Name -> VarType -> InferM a -> InferM a@@ -650,7 +749,19 @@ withVar :: Name -> Schema -> InferM a -> InferM a withVar x s = withVarType x (ExtVar s) +-- | The sub-computation is performed with the given abstract function in scope.+withParamFuns :: [ModVParam] -> InferM a -> InferM a+withParamFuns xs (IM m) =+ IM $ mapReader (\r -> r { iParamFuns = foldr add (iParamFuns r) xs }) m+ where+ add x = Map.insert (mvpName x) x +-- | Add some assumptions for an entire module+withParameterConstraints :: [Located Prop] -> InferM a -> InferM a+withParameterConstraints ps (IM m) =+ IM $ mapReader (\r -> r { iParamConstraints = ps ++ iParamConstraints r }) m++ -- | The sub-computation is performed with the given variables in scope. withMonoType :: (Name,Located Type) -> InferM a -> InferM a withMonoType (x,lt) = withVar x (Forall [] [] (thing lt))@@ -684,10 +795,13 @@ newtype KindM a = KM { unKM :: ReaderT KRO (StateT KRW InferM) a } -data KRO = KRO { lazyTVars :: Map Name Type -- ^ lazy map, with tyvars.- , allowWild :: Bool -- ^ are type-wild cards allowed?+data KRO = KRO { lazyTParams :: Map Name TParam -- ^ lazy map, with tparams.+ , allowWild :: AllowWildCards -- ^ are type-wild cards allowed? } +-- | Do we allow wild cards in the given context.+data AllowWildCards = AllowWildCards | NoWildCards+ data KRW = KRW { typeParams :: Map Name Kind -- ^ kinds of (known) vars. , kCtrs :: [(ConstraintSource,[Prop])] }@@ -704,45 +818,48 @@ fail x = KM (fail x) KM m >>= k = KM (m >>= unKM . k) +++ {- | The arguments to this function are as follows: -(type param. name, kind signature (opt.), a type representing the param)+(type param. name, kind signature (opt.), type parameter) -The type representing the parameter is just a thunk that we should not force.-The reason is that the type depnds on the kind of parameter, that we are+The type parameter is just a thunk that we should not force.+The reason is that the parameter depends on the kind that we are in the process of computing. As a result we return the value of the sub-computation and the computed kinds of the type parameters. -}-runKindM :: Bool -- Are type-wild cards allowed?- -> [(Name, Maybe Kind, Type)] -- ^ See comment+runKindM :: AllowWildCards -- Are type-wild cards allowed?+ -> [(Name, Maybe Kind, TParam)] -- ^ See comment -> 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, kCtrs kw) where- tys = Map.fromList [ (x,t) | (x,_,t) <- vs ]- kro = KRO { allowWild = wildOK, lazyTVars = tys }+ tps = Map.fromList [ (x,t) | (x,_,t) <- vs ]+ kro = KRO { allowWild = wildOK, lazyTParams = tps } 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.- | TOuterVar Type -- ^ An outer binding.+data LkpTyVar = TLocalVar TParam (Maybe Kind) -- ^ Locally bound variable.+ | TOuterVar TParam -- ^ An outer binding. -- | Check if a name refers to a type variable. kLookupTyVar :: Name -> KindM (Maybe LkpTyVar) kLookupTyVar x = KM $- do vs <- lazyTVars `fmap` ask+ do vs <- lazyTParams `fmap` ask ss <- get case Map.lookup x vs of Just t -> return $ Just $ TLocalVar t $ Map.lookup x $ typeParams ss- Nothing -> lift $ lift $ do t <- lookupTVar x+ Nothing -> lift $ lift $ do t <- lookupTParam x return (fmap TOuterVar t) -- | Are type wild-cards OK in this context?-kWildOK :: KindM Bool+kWildOK :: KindM AllowWildCards kWildOK = KM $ fmap allowWild ask -- | Reports an error.@@ -756,10 +873,10 @@ -- 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 :: TVarSource -> Kind -> KindM Type kNewType src k =- do tps <- KM $ do vs <- asks lazyTVars- return $ Set.fromList [ tv | TVar tv <- Map.elems vs ]+ do tps <- KM $ do vs <- asks lazyTParams+ return $ Set.fromList (Map.elems vs) kInInferM $ TVar `fmap` newTVar' src tps k -- | Lookup the definition of a type synonym.@@ -769,6 +886,9 @@ -- | Lookup the definition of a newtype. kLookupNewtype :: Name -> KindM (Maybe Newtype) kLookupNewtype x = kInInferM $ lookupNewtype x++kLookupParamType :: Name -> KindM (Maybe ModTParam)+kLookupParamType x = kInInferM (lookupParamType x) kExistTVar :: Name -> Kind -> KindM Type kExistTVar x k = kInInferM $ existVar x k
src/Cryptol/TypeCheck/PP.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.PP -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -12,7 +12,7 @@ ( NameMap, WithNames(..) , emptyNameMap , ppWithNamesPrec, ppWithNames- , intToName, nameList+ , nameList , dump , module Cryptol.Utils.PP ) where@@ -57,6 +57,4 @@ baseNames | null names = map (:[]) [ 'a' .. 'z' ] | otherwise = names -intToName :: Int -> String-intToName x = nameList [] !! x
+ src/Cryptol/TypeCheck/Parseable.hs view
@@ -0,0 +1,110 @@+-- |+-- Module : Cryptol.TypeCheck.Parseable+-- Copyright : (c) 2013-2017 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable++{-# LANGUAGE Safe #-}++{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}+{-# LANGUAGE DeriveAnyClass, DeriveGeneric #-}+module Cryptol.TypeCheck.Parseable+ ( module Cryptol.TypeCheck.Parseable+ , ShowParseable(..)+ ) where++import Cryptol.TypeCheck.AST+import Cryptol.Utils.Ident (Ident,unpackIdent)+import Cryptol.Parser.AST ( Located(..))+import Cryptol.ModuleSystem.Name+import Text.PrettyPrint hiding ((<>))+import qualified Text.PrettyPrint as PP ((<>))++-- ShowParseable prints out a cryptol program in a way that it's parseable by Coq (and likely other things)+-- Used mainly for reasoning about the semantics of cryptol programs in Coq (https://github.com/GaloisInc/cryptol-semantics)+class ShowParseable t where+ showParseable :: t -> Doc++instance ShowParseable Expr where+ showParseable (EList es _) = parens (text "EList" <+> showParseable es)+ showParseable (ETuple es) = parens (text "ETuple" <+> showParseable es)+ showParseable (ERec ides) = parens (text "ERec" <+> showParseable ides)+ showParseable (ESel e s) = parens (text "ESel" <+> showParseable e <+> showParseable s)+ showParseable (EIf c t f) = parens (text "EIf" <+> showParseable c $$ showParseable t $$ showParseable f)+ showParseable (EComp _ _ e mss) = parens (text "EComp" $$ showParseable e $$ showParseable mss)+ showParseable (EVar n) = parens (text "EVar" <+> showParseable n)+ showParseable (EApp fe ae) = parens (text "EApp" $$ showParseable fe $$ showParseable ae)+ showParseable (EAbs n _ e) = parens (text "EAbs" <+> showParseable n $$ showParseable e)+ showParseable (EWhere e dclg) = parens (text "EWhere" $$ showParseable e $$ showParseable dclg)+ showParseable (ETAbs tp e) = parens (text "ETAbs" <+> showParseable tp+ $$ showParseable e)+ showParseable (ETApp e t) = parens (text "ETApp" $$ showParseable e $$ parens (text "ETyp" <+> showParseable t))+ --NOTE: erase all "proofs" for now (change the following two lines to change that)+ showParseable (EProofAbs {-p-}_ e) = showParseable e --"(EProofAbs " ++ show p ++ showParseable e ++ ")"+ showParseable (EProofApp e) = showParseable e --"(EProofApp " ++ showParseable e ++ ")"++instance (ShowParseable a, ShowParseable b) => ShowParseable (a,b) where+ showParseable (x,y) = parens (showParseable x PP.<> comma PP.<> showParseable y)++instance ShowParseable Int where+ showParseable i = int i++instance ShowParseable Ident where+ showParseable i = text $ show $ unpackIdent i++instance ShowParseable Type where+ showParseable (TUser n lt t) = parens (text "TUser" <+> showParseable n <+> showParseable lt <+> showParseable t)+ showParseable (TRec lidt) = parens (text "TRec" <+> showParseable lidt)+ showParseable t = parens $ text $ show t++instance ShowParseable Selector where+ showParseable (TupleSel n _) = parens (text "TupleSel" <+> showParseable n)+ showParseable (RecordSel n _) = parens (text "RecordSel" <+> showParseable n)+ showParseable (ListSel n _) = parens (text "ListSel" <+> showParseable n)++instance ShowParseable Match where+ showParseable (From n _ _ e) = parens (text "From" <+> showParseable n <+> showParseable e)+ showParseable (Let d) = parens (text "MLet" <+> showParseable d)++instance ShowParseable Decl where+ showParseable d = parens (text "Decl" <+> showParseable (dName d)+ $$ showParseable (dDefinition d))++instance ShowParseable DeclDef where+ showParseable DPrim = text (show DPrim)+ showParseable (DExpr e) = parens (text "DExpr" $$ showParseable e)++instance ShowParseable DeclGroup where+ showParseable (Recursive ds) =+ parens (text "Recursive" $$ showParseable ds)+ showParseable (NonRecursive d) =+ parens (text "NonRecursive" $$ showParseable d)++instance (ShowParseable a) => ShowParseable [a] where+ showParseable a = case a of+ [] -> text "[]"+ [x] -> brackets (showParseable x)+ x : xs -> text "[" <+> showParseable x $$+ vcat [ comma <+> showParseable y | y <- xs ] $$+ text "]"++instance (ShowParseable a) => ShowParseable (Maybe a) where+ showParseable Nothing = text "(0,\"\")" --empty ident, won't shadow number+ showParseable (Just x) = showParseable x++instance (ShowParseable a) => ShowParseable (Located a) where+ showParseable l = showParseable (thing l)++instance ShowParseable TParam where+ showParseable tp = parens (text (show (tpUnique tp)) PP.<> comma PP.<> maybeNameDoc (tpName tp))++maybeNameDoc :: Maybe Name -> Doc+maybeNameDoc Nothing = doubleQuotes empty+maybeNameDoc (Just n) = showParseable (nameIdent n)++instance ShowParseable Name where+ showParseable n = parens (text (show (nameUnique n)) PP.<> comma PP.<> showParseable (nameIdent n))
src/Cryptol/TypeCheck/Sanity.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Sanity -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -15,8 +15,10 @@ ) where +import Cryptol.Parser.Position(thing) import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Subst (apSubst, singleSubst)+import Cryptol.TypeCheck.Monad(InferInput(..)) import Cryptol.Utils.Ident import qualified Data.Set as Set@@ -29,34 +31,32 @@ import qualified Data.Map as Map -tcExpr :: Map Name Schema -> Expr -> Either Error (Schema, [ ProofObligation ])+tcExpr :: InferInput -> Expr -> Either Error (Schema, [ ProofObligation ]) tcExpr env e = runTcM env (exprSchema e) -tcDecls :: Map Name Schema -> [DeclGroup] -> Either Error [ ProofObligation ]-tcDecls env ds0 = case runTcM env (go ds0) of+tcDecls :: InferInput -> [DeclGroup] -> Either Error [ ProofObligation ]+tcDecls env ds0 = case runTcM env (checkDecls ds0) of Left err -> Left err Right (_,ps) -> Right ps- where- go [] = return ()- go (d : ds) = do xs <- checkDeclGroup d- withVars xs (go ds) -tcModule :: Map Name Schema -> Module -> Either Error [ ProofObligation ]-tcModule env m = tcDecls env (mDecls m)+tcModule :: InferInput -> Module -> Either Error [ ProofObligation ]+tcModule env m = case runTcM env check of+ Left err -> Left err+ Right (_,ps) -> Right ps+ where check = foldr withTVar k1 (map mtpParam (Map.elems (mParamTypes m)))+ k1 = foldr withAsmp k2 (map thing (mParamConstraints m))+ k2 = withVars (Map.toList (fmap mvpType (mParamFuns m)))+ $ checkDecls (mDecls m) ---------------------------------------------------------------------------------tMono :: Type -> Schema-tMono = Forall [] [] -isMono :: Schema -> Maybe Type-isMono s =- case s of- Forall [] [] t -> Just t- _ -> Nothing-----------------------------------------------------------------------------------+checkDecls :: [DeclGroup] -> TcM ()+checkDecls decls =+ case decls of+ [] -> return ()+ d : ds -> do xs <- checkDeclGroup d+ withVars xs (checkDecls ds) -- | Validate a type, returning its kind. checkType :: Type -> TcM Kind@@ -148,7 +148,7 @@ forM_ es $ \e -> do t1 <- exprType e unless (same t1 t) $- reportError $ TypeMismatch (tMono t) (tMono t1)+ reportError $ TypeMismatch "EList" (tMono t) (tMono t1) return $ tMono $ tSeq (tNum (length es)) t @@ -237,12 +237,12 @@ EIf e1 e2 e3 -> do ty <- exprType e1 unless (same tBit ty) $- reportError $ TypeMismatch (tMono tBit) (tMono ty)+ reportError $ TypeMismatch "EIf_condition" (tMono tBit) (tMono ty) t1 <- exprType e2 t2 <- exprType e3 unless (same t1 t2) $- reportError $ TypeMismatch (tMono t1) (tMono t2)+ reportError $ TypeMismatch "EIf_arms" (tMono t1) (tMono t2) return $ tMono t1 @@ -338,7 +338,7 @@ convertible t1 t2 = go t1 t2 where go ty1 ty2 =- let err = reportError $ TypeMismatch (tMono ty1) (tMono ty2)+ let err = reportError $ TypeMismatch "convertible" (tMono ty1) (tMono ty2) other = tNoUser ty2 goMany [] [] = return ()@@ -384,7 +384,7 @@ when checkSig $ checkSchema s s1 <- exprSchema e unless (same s s1) $- reportError $ TypeMismatch s s1+ reportError $ TypeMismatch "DExpr" s s1 return (dName d, s) checkDeclGroup :: DeclGroup -> TcM [(Name, Schema)]@@ -409,7 +409,7 @@ case tNoUser t1 of TCon (TC TCSeq) [ l, el ] | same elt el -> return ((x, tMono elt), l)- | otherwise -> reportError $ TypeMismatch (tMono elt) (tMono el)+ | otherwise -> reportError $ TypeMismatch "From" (tMono elt) (tMono el) _ -> reportError $ BadMatch t1@@ -462,21 +462,25 @@ let TcM m1 = f a m1) -runTcM :: Map Name Schema -> TcM a -> Either Error (a, [ProofObligation])+runTcM :: InferInput -> TcM a -> Either Error (a, [ProofObligation]) runTcM env (TcM m) = case runM m ro rw of (Left err, _) -> Left err (Right a, s) -> Right (a, woProofObligations s) where- ro = RO { roTVars = Map.empty- , roAsmps = []- , roVars = env+ ro = RO { roTVars = Map.fromList [ (tpUnique x, x)+ | tp <- Map.elems (inpParamTypes env)+ , let x = mtpParam tp ]+ , roAsmps = map thing (inpParamConstraints env)+ , roVars = Map.union+ (fmap mvpType (inpParamFuns env))+ (inpVars env) } rw = RW { woProofObligations = [] } data Error =- TypeMismatch Schema Schema -- ^ expected, actual+ TypeMismatch String Schema Schema -- ^ expected, actual | ExpectedMono Schema -- ^ expected a mono type, got this | TupleSelectorOutOfRange Int Int | MissingField Ident [Ident]@@ -532,8 +536,10 @@ lookupTVar x = case x of TVFree {} -> reportError (FreeTypeVariable x)- TVBound u k ->- do ro <- TcM ask+ TVBound tpv ->+ do let u = tpUnique tpv+ k = tpKind tpv+ ro <- TcM ask case Map.lookup u (roTVars ro) of Just tp | kindOf tp == k -> return k
src/Cryptol/TypeCheck/SimpType.hs view
@@ -3,7 +3,7 @@ import Control.Applicative((<|>)) import Cryptol.TypeCheck.Type hiding- (tSub,tMul,tDiv,tMod,tExp,tMin,tWidth,tLenFromThen,tLenFromThenTo)+ (tSub,tMul,tDiv,tMod,tExp,tMin,tCeilDiv,tCeilMod,tLenFromThen,tLenFromThenTo) import Cryptol.TypeCheck.TypePat import Cryptol.TypeCheck.Solver.InfNat import Control.Monad(msum,guard)@@ -33,6 +33,8 @@ (TCMin,[x,y]) -> tMin x y (TCMax,[x,y]) -> tMax x y (TCWidth,[x]) -> tWidth x+ (TCCeilDiv,[x,y]) -> tCeilDiv x y+ (TCCeilMod,[x,y]) -> tCeilMod x y (TCLenFromThen,[x,y,z]) -> tLenFromThen x y z (TCLenFromThenTo,[x,y,z]) -> tLenFromThenTo x y z _ -> TCon tc ts@@ -166,7 +168,6 @@ | 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@@ -174,6 +175,22 @@ | Just 0 <- tIsNum x = tBadNumber $ TCErrorMessage "Modulus by 0." | otherwise = tf2 TCMod x y +tCeilDiv :: Type -> Type -> Type+tCeilDiv x y+ | Just t <- tOp TCCeilDiv (op2 nCeilDiv) [x,y] = t+ | tIsInf x = tBadNumber $ TCErrorMessage "CeilDiv of `inf`."+ | tIsInf y = tBadNumber $ TCErrorMessage "CeilDiv by `inf`."+ | Just 0 <- tIsNum y = tBadNumber $ TCErrorMessage "CeilDiv by 0."+ | otherwise = tf2 TCCeilDiv x y++tCeilMod :: Type -> Type -> Type+tCeilMod x y+ | Just t <- tOp TCCeilMod (op2 nCeilMod) [x,y] = t+ | tIsInf x = tBadNumber $ TCErrorMessage "CeilMod of `inf`."+ | tIsInf y = tBadNumber $ TCErrorMessage "CeilMod by `inf`."+ | Just 0 <- tIsNum x = tBadNumber $ TCErrorMessage "CeilMod to size 0."+ | otherwise = tf2 TCCeilMod x y+ tExp :: Type -> Type -> Type tExp x y | Just t <- tOp TCExp (total (op2 nExp)) [x,y] = t@@ -243,7 +260,7 @@ | TCon (TF TCAdd) [a,b] <- t' , Just n <- tIsNum a = if k <= n then t- else tMax (tNum (k - n)) b+ else tAdd (tNum n) (tMax (tNum (k - n)) b) | TCon (TF TCSub) [a,b] <- t' , Just n <- tIsNat' a =
src/Cryptol/TypeCheck/SimpleSolver.hs view
@@ -2,12 +2,13 @@ module Cryptol.TypeCheck.SimpleSolver ( simplify , simplifyStep) where import Cryptol.TypeCheck.Type hiding- ( tSub, tMul, tDiv, tMod, tExp, tMin, tWidth- , tLenFromThen, tLenFromThenTo)+ ( tSub, tMul, tDiv, tMod, tExp, tMin, 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.TypeCheck.Solver.Class+ ( solveZeroInst, solveLogicInst, solveArithInst, solveCmpInst+ , solveSignedCmpInst, solveLiteralInst ) import Cryptol.Utils.Debug(ppTrace) import Cryptol.TypeCheck.PP@@ -33,18 +34,22 @@ 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 PTrue) [] -> SolvedIf []+ TCon (PC PAnd) [l,r] -> SolvedIf [l,r] - TCon (PC PArith) [ty] -> solveArithInst ty- TCon (PC PCmp) [ty] -> solveCmpInst ty+ TCon (PC PZero) [ty] -> solveZeroInst ty+ TCon (PC PLogic) [ty] -> solveLogicInst ty+ TCon (PC PArith) [ty] -> solveArithInst ty+ TCon (PC PCmp) [ty] -> solveCmpInst ty+ TCon (PC PSignedCmp) [ty] -> solveSignedCmpInst ty+ TCon (PC PLiteral) [t1,t2] -> solveLiteralInst t1 t2 - TCon (PC PFin) [ty] -> cryIsFinType ctxt 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+ 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+ _ -> Unsolved
src/Cryptol/TypeCheck/Solve.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solve -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -11,46 +11,45 @@ module Cryptol.TypeCheck.Solve ( simplifyAllConstraints , proveImplication+ , proveModuleTopLevel , wfType , wfTypeFunction- , improveByDefaultingWith+ , wfTC+ , defaultAndSimplify , defaultReplExpr ) where -import Cryptol.TypeCheck.PP(pp)+import Cryptol.Parser.Position(thing,emptyRange)+import Cryptol.TypeCheck.PP -- (pp) import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Monad+import Cryptol.TypeCheck.Default+import Cryptol.TypeCheck.SimpType(tWidth)+import Cryptol.TypeCheck.Error(Error(..),Warning(..)) import Cryptol.TypeCheck.Subst- (apSubst, singleSubst, isEmptySubst, substToList,- emptySubst,Subst,listSubst, (@@), Subst,- apSubstMaybe, substBinds)+ (apSubst, isEmptySubst, substToList,+ emptySubst,Subst,(@@), Subst, listSubst) 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.SMT(Solver,proveImp,isNumeric) 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 qualified Cryptol.TypeCheck.Solver.CrySAT as Num-import Cryptol.TypeCheck.Solver.CrySAT import Cryptol.Utils.PP (text,vcat,(<+>))-import Cryptol.Utils.Panic(panic) import Cryptol.Utils.Patterns(matchMaybe) -import Control.Monad (guard, mzero) import Control.Applicative ((<|>))-import Data.Either(partitionEithers)-import Data.Maybe(catMaybes)-import Data.Map ( Map )+import Control.Monad(mzero) import qualified Data.Map as Map import Data.Set ( Set ) import qualified Data.Set as Set+import Data.List(partition)+import Data.Maybe(listToMaybe) + {- | Add additional constraints that ensure validity of type function. Note that these constraints do not introduce additional malformed types, so the well-formedness constraints are guaranteed to be well-formed.@@ -64,6 +63,14 @@ wfTypeFunction TCLenFromThenTo [a,b,c] = [ pFin a, pFin b, pFin c, a =/= b ] wfTypeFunction _ _ = [] +-- | Add additional constraints that ensure validity of a type+-- constructor application. Note that the constraints do not use any+-- partial type functions, so the new constraints are guaranteed to be+-- well-formed. This assumes that the parameters are well-formed.+wfTC :: TC -> [Type] -> [Prop]+wfTC TCIntMod [n] = [ pFin n, n >== tOne ]+wfTC _ _ = []+ -- | Add additional constraints that ensure the validity of a type. wfType :: Type -> [Prop] wfType t =@@ -72,6 +79,7 @@ let ps = concatMap wfType ts in case c of TF f -> wfTypeFunction f ts ++ ps+ TC f -> wfTC f ts ++ ps _ -> ps TVar _ -> []@@ -144,6 +152,68 @@ -------------------------------------------------------------------------------- ++defaultReplExpr :: Solver -> Expr -> Schema ->+ IO (Maybe ([(TParam,Type)], Expr))++defaultReplExpr sol expr sch =+ do mb <- defaultReplExpr' sol numVs numPs+ case mb of+ Nothing -> return Nothing+ Just numBinds -> return $+ do optss <- mapM tryDefVar otherVs+ su <- listToMaybe+ [ binds | nonSu <- sequence optss+ , let binds = nonSu ++ numBinds+ , validate binds ]+ tys <- sequence [ lookup v su | v <- sVars sch ]+ return (su, appExpr tys)++ where+ validate binds =+ let su = listSubst [ (tpVar x, t) | (x,t) <- binds ]+ in null (concatMap pSplitAnd (apSubst su (sProps sch)))++ (numVs,otherVs) = partition (kindIs KNum) (sVars sch)+ (numPs,otherPs) = partition isNumeric (sProps sch)+++ kindIs k x = kindOf x == k++ gSet = goalsFromList+ [ Goal { goal = p+ , goalRange = emptyRange+ , goalSource = CtDefaulting } | p <- otherPs ]++ tryDefVar a =+ do let a' = TVBound a+ gt <- Map.lookup a' (literalGoals gSet)+ let ok p = not (Set.member a' (fvs p))+ return [ (a,t) | t <- [ tInteger, tBit, tWord (tWidth (goal gt)) ]+ , ok t ]+++ appExpr tys = foldl (\e1 _ -> EProofApp e1)+ (foldl ETApp expr tys)+ (sProps sch)+++defaultAndSimplify :: [TVar] -> [Goal] -> ([TVar],[Goal],Subst,[Warning])+defaultAndSimplify as gs =+ let (as1, gs1, su1, ws1) = defLit+ (as2, gs2, su2, ws2) = improveByDefaultingWithPure as1 gs1+ in (as2,gs2,su2 @@ su1, ws1 ++ ws2)+ where+ defLit+ | isEmptySubst su = nope+ | otherwise = case quickSolver Map.empty (apSubst su gs) of+ Left _ -> nope -- hm?+ Right (su1,gs1) -> (as1,gs1,su1@@su,ws)+ where (as1,su,ws) = defaultLiterals as gs+ nope = (as,gs,emptySubst,[])+++ simplifyAllConstraints :: InferM () simplifyAllConstraints = do simpHasGoals@@ -172,23 +242,46 @@ changes' `seq` unsolved `seq` go changes' unsolved' todo +-- | Try to clean-up any left-over constraints after we've checked everything+-- in a module. Typically these are either trivial things, or constraints+-- on the module's type parameters.+proveModuleTopLevel :: InferM ()+proveModuleTopLevel =+ do simplifyAllConstraints+ gs <- getGoals+ let vs = Set.toList (Set.filter isFreeTV (fvs gs))+ (_,gs1,su1,ws) = defaultAndSimplify vs gs+ extendSubst su1+ mapM_ recordWarning ws + cs <- getParamConstraints+ case cs of+ [] -> addGoals gs1+ _ -> do su2 <- proveImplication Nothing [] [] gs1+ extendSubst su2 -proveImplication :: Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst+-- | Prove an implication, and return any improvements that we computed.+-- Records errors, if any of the goals couldn't be solved.+proveImplication :: Maybe Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst proveImplication lnam as ps gs = do evars <- varsWithAsmps solver <- getSolver- (mbErr,su) <- io (proveImplicationIO solver lnam evars as ps gs)++ extraAs <- (map mtpParam . Map.elems) <$> getParamTypes+ extra <- map thing <$> getParamConstraints++ (mbErr,su) <- io (proveImplicationIO solver lnam evars+ (extraAs ++ as) (extra ++ ps) gs) case mbErr of Right ws -> mapM_ recordWarning ws Left err -> recordError err return su -proveImplicationIO :: Num.Solver- -> Name -- ^ Checking this function+proveImplicationIO :: Solver+ -> Maybe Name -- ^ Checking this function -> Set TVar -- ^ These appear in the env., and we should- -- not try to default the+ -- not try to default them -> [TParam] -- ^ Type parameters -> [Prop] -- ^ Assumed constraint -> [Goal] -- ^ Collected constraints@@ -205,11 +298,13 @@ case gs2 of [] -> return (Right [], su) gs3 ->- do let free = Set.toList+ do let free = filter isFreeTV+ $ Set.toList $ Set.difference (fvs (map goal gs3)) varsInEnv- case improveByDefaultingWithPure free gs3 of+ case defaultAndSimplify free gs3 of (_,_,newSu,_)- | isEmptySubst newSu -> return (err gs3, su) -- XXX: Old?+ | isEmptySubst newSu ->+ return (err gs3, su) -- XXX: Old? (_,newGs,newSu,ws) -> do let su1 = newSu @@ su (res1,su2) <- proveImplicationIO s f varsInEnv ps@@ -222,18 +317,18 @@ err us = Left $ cleanupError $ UnsolvedDelayedCt $ DelayedCt { dctSource = f- , dctForall = ps- , dctAsmps = asmps0- , dctGoals = us- }-+ , dctForall = ps+ , dctAsmps = asmps0+ , dctGoals = us+ } + asmps1 = concatMap pSplitAnd asmps0 (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)+ , notElem p asmps1 ]+ in case matchMaybe (improveProps True Map.empty asmps1) of+ Nothing -> (asmps1,gs1) Just (newSu,newAsmps) -> ( [ TVar x =#= t | (x,t) <- substToList newSu ] ++ newAsmps@@ -256,382 +351,9 @@ ----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 res <- solveConstraints s asmps old gs- case res of- Left err -> return (Left err, su)- Right gs2 ->- do let gs3 = gs2 ++ old- mb <- computeImprovements s gs3- case mb of- Left err -> return (Left err, su)- Right impSu ->- let (unchanged,changed) =- partitionEithers (map (applyImp impSu) gs3)- new = wellFormed changed- in go (impSu @@ su) unchanged (new ++ changed)-- applyImp su g = case apSubstMaybe su (goal g) of- Nothing -> Left g- Just p -> Right g { goal = p }---{- Note:-It is good to consider the other goals when evaluating terms.-For example, consider the constraints:-- P (x * inf), x >= 1--We cannot simplify `x * inf` on its own, because we do not know if `x`-might be 0. However, in the contxt of `x >= 1`, we know that this is-impossible, and we can simplify the constraints to:-- P inf, x >= 1--However, we should be careful to avoid circular reasoning, as we wouldn't-want to use the fact that `x >= 1` to simplify `x >= 1` to true.--}---- 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 -} ->- IO (Either [Goal] [Goal])- -- ^ Left: contradiciting goals,- -- Right: goals that were not solved, or sub-goals- -- for solved goals. Does not include "old"-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 ]-----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)- Num.simplifyProps s (map Num.knownDefined solveGs)---computeImprovements :: Num.Solver -> [Goal] -> IO (Either [Goal] Subst)-computeImprovements s gs =- debugBlock s "Computing improvements" $- do let nums = [ g | Right g <- map Num.numericRight gs ]- res <- Num.withScope s $- do _ <- Num.assumeProps s (map (goal . fst) nums)- mb <- Num.check s- case mb of- Nothing -> return Nothing- Just (suish,_ps1) ->- do let (su,_ps2) = importSplitImps suish- -- Num.check has already checked that the intervals are sane,- -- so we don't need to check for a broken interval here- Right ints <- Num.getIntervals s- return (Just (ints,su))- case res of- 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)-------- | Import an improving substitutin (i.e., a bunch of equations)--- into a Cryptol substitution (which is idempotent).--- The substitution will contain only unification variables.--- "Improvements" on skolem variables become additional constraints.-importSplitImps :: Map Num.Name Num.Expr -> (Subst, [Prop])-importSplitImps = mk . partitionEithers . map imp . Map.toList- where- mk (uni,props) = (listSubst (catMaybes uni), props)-- imp (x,e) = case (x, Num.importType e) of- (Num.UserName tv, Just ty) ->- case tv of- TVFree {} -> Left (Just (tv,ty))- TVBound {} -> Right (TVar tv =#= ty)-- {- This may happen if we are working on an implication,- and we have an improvement about a variable in the- assumptions that is not in any og the goals.- XXX: Perhaps, we should mark these variable, so we don't waste- time to "improve" them. -}-- _ -> Left Nothing------------------------------------------------------------------------------------------ This is what we use to avoid ambiguity when generalizing.--{- If a variable, `a`, is:- 1. Of kind KNum- 2. Generic (i.e., does not appear in the environment)- 3. It appears only in constraints but not in the resulting type- (i.e., it is not on the RHS of =>)- 4. It (say, the variable 'a') appears only in constraints like this:- 3.1 `a >= t` with (`a` not in `fvs t`)- 3.2 in the `s` of `fin s`-- Then we replace `a` with `max(t1 .. tn)` where the `ts`- are from the constraints `a >= t`.-- If `t1 .. tn` is empty, then we replace `a` with 0.-- This function assumes that 1-3 have been checked, and implements the rest.- So, given some variables and constraints that are about to be generalized,- we return:- 1. a new (same or smaller) set of variables to quantify,- 2. a new set of constraints,- 3. a substitution which indicates what got defaulted.--}--improveByDefaultingWith ::- Num.Solver ->- [TVar] -> -- candidates for defaulting- [Goal] -> -- constraints- IO ( [TVar] -- non-defaulted- , [Goal] -- new constraints- , Maybe Subst -- Nothing: improve to False- -- Just: improvements from defaulting- , [Warning] -- warnings about defaulting- )--- 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- -- leq: candidate definitions (i.e. of the form x >= t, x `notElem` fvs t)- -- for each of these, we keep the list of `t`, and the free vars in them.- -- fins: all `fin` constraints- -- others: any other constraints- classify leqs fins others [] =- 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-- in ( [ a | a <- as, not (a `Set.member` names) ]- , newOthers ++ others ++ apSubst su fins- , su- , map warn defs- )--- classify leqs fins others (prop : more) =- case tNoUser (goal prop) of-- -- We found a `fin` constraint.- TCon (PC PFin) [ _ ] -> classify leqs (prop : fins) others more-- -- Things of the form: x >= T(x) are not defaulted.- TCon (PC PGeq) [ TVar x, t ]- | x `elem` as && x `Set.notMember` freeRHS ->- classify leqs' fins others more- where freeRHS = fvs t- add (xs1,vs1) (xs2,vs2) = (xs1 ++ xs2, Set.union vs1 vs2)- leqs' = Map.insertWith add x ([(t,prop)],freeRHS) leqs-- _ -> classify leqs fins (prop : others) more--- -- Pickout which variables may be defaulted and how.- -- XXX: simpType t- select yes no _ [] = ([ (x, t) | (x,t) <- yes ] ,no)- select yes no otherFree ((x,(rhsG,vs)) : more) =- select newYes newNo newFree newMore-- where- (ts,gs) = unzip rhsG-- -- `x` selected only if appears nowehere else.- -- this includes other candidates for defaulting.- (newYes,newNo,newFree,newMore)-- -- Mentioned in other constraints, definately not defaultable.- | x `Set.member` otherFree = noDefaulting-- | otherwise =- let deps = [ y | (y,(_,yvs)) <- more, x `Set.member` yvs ]- recs = filter (`Set.member` vs) deps- in if not (null recs) || isBoundTV x -- x >= S(y), y >= T(x)- then noDefaulting-- -- x >= S, y >= T(x) or- -- x >= S(y), y >= S- else yesDefaulting-- where- noDefaulting = ( yes, gs ++ no, vs `Set.union` otherFree, more )-- yesDefaulting =- let ty = case ts of- [] -> tNum (0::Int)- _ -> foldr1 tMax ts- su1 = singleSubst x ty- in ( (x,ty) : [ (y,apSubst su1 t) | (y,t) <- yes ]- , no -- We know that `x` does not appear here- , otherFree -- We know that `x` did not appear here either-- -- No need to update the `vs` because we've already- -- checked that there are no recursive dependencies.- , [ (y, (apSubst su1 ts1, vs1)) | (y,(ts1,vs1)) <- more ]- )----- | Try to pick a reasonable instantiation for an expression, with--- the given type. This is useful when we do evaluation at the REPL.--- 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.empty (map (makeGoal su) (sProps s))- return $- case res of- Right [] | isEmptySubst su1 ->- do tys <- mapM (bindParam su) params- return (zip (sVars s) tys, appExpr tys)- _ -> Nothing- _ -> return Nothing-- else return Nothing- where- makeGoal su p = Goal { goalSource = error "goal source"- , goalRange = error "goal range"- , goal = apSubst su p- }-- bindParam su tp =- do let ty = TVar tp- ty' = apSubst su ty- guard (ty /= ty')- return ty'-- appExpr tys = foldl (\e1 _ -> EProofApp e1) (foldl ETApp e tys) (sProps s)------ | Attempt to default the given constraints by asserting them in the SMT--- solver, and asking it for a model.-tryGetModel ::- Num.Solver ->- [TVar] -> -- variables to try defaulting- [Prop] -> -- constraints- IO (Maybe Subst)-tryGetModel s xs ps =- -- We are only interested in finite instantiations- Num.getModel s (map (pFin . TVar) xs ++ ps)--
src/Cryptol/TypeCheck/Solver/Class.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.Class -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -8,26 +8,87 @@ -- -- Solving class constraints. -{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE PatternGuards, OverloadedStrings #-} module Cryptol.TypeCheck.Solver.Class ( classStep+ , solveZeroInst+ , solveLogicInst , solveArithInst , solveCmpInst+ , solveSignedCmpInst+ , solveLiteralInst , expandProp ) where import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.SimpType (tAdd,tWidth) import Cryptol.TypeCheck.Solver.Types+import Cryptol.TypeCheck.PP -- | Solve class constraints. -- If not, then we return 'Nothing'.--- If solved, ther we return 'Just' a list of sub-goals.+-- If solved, then we return 'Just' a list of sub-goals. classStep :: Prop -> Solved classStep p = case tNoUser p of+ TCon (PC PLogic) [ty] -> solveLogicInst (tNoUser ty) TCon (PC PArith) [ty] -> solveArithInst (tNoUser ty) TCon (PC PCmp) [ty] -> solveCmpInst (tNoUser ty) _ -> Unsolved +-- | Solve a Zero constraint by instance, if possible.+solveZeroInst :: Type -> Solved+solveZeroInst ty = case tNoUser ty of++ -- Zero Error -> fails+ TCon (TError _ e) _ -> Unsolvable e++ -- Zero Bit+ TCon (TC TCBit) [] -> SolvedIf []++ -- Zero Integer+ TCon (TC TCInteger) [] -> SolvedIf []++ -- Zero (Z n)+ TCon (TC TCIntMod) [n] -> SolvedIf [ pFin n, n >== tOne ]++ -- Zero a => Zero [n]a+ TCon (TC TCSeq) [_, a] -> SolvedIf [ pZero a ]++ -- Zero b => Zero (a -> b)+ TCon (TC TCFun) [_, b] -> SolvedIf [ pZero b ]++ -- (Zero a, Zero b) => Zero (a,b)+ TCon (TC (TCTuple _)) es -> SolvedIf [ pZero e | e <- es ]++ -- (Zero a, Zero b) => Zero { x1 : a, x2 : b }+ TRec fs -> SolvedIf [ pZero ety | (_,ety) <- fs ]++ _ -> Unsolved++-- | Solve a Logic constraint by instance, if possible.+solveLogicInst :: Type -> Solved+solveLogicInst ty = case tNoUser ty of++ -- Logic Error -> fails+ TCon (TError _ e) _ -> Unsolvable e++ -- Logic Bit+ TCon (TC TCBit) [] -> SolvedIf []++ -- Logic a => Logic [n]a+ TCon (TC TCSeq) [_, a] -> SolvedIf [ pLogic a ]++ -- Logic b => Logic (a -> b)+ TCon (TC TCFun) [_, b] -> SolvedIf [ pLogic b ]++ -- (Logic a, Logic b) => Logic (a,b)+ TCon (TC (TCTuple _)) es -> SolvedIf [ pLogic e | e <- es ]++ -- (Logic a, Logic b) => Logic { x1 : a, x2 : b }+ TRec fs -> SolvedIf [ pLogic ety | (_,ety) <- fs ]++ _ -> Unsolved+ -- | Solve an Arith constraint by instance, if possible. solveArithInst :: Type -> Solved solveArithInst ty = case tNoUser ty of@@ -48,6 +109,12 @@ TCon (TC TCBit) [] -> Unsolvable $ TCErrorMessage "Arithmetic cannot be done on individual bits." + -- Arith Integer+ TCon (TC TCInteger) [] -> SolvedIf []++ -- Arith (Z n)+ TCon (TC TCIntMod) [n] -> SolvedIf [ pFin n, n >== tOne ]+ -- (Arith a, Arith b) => Arith { x1 : a, x2 : b } TRec fs -> SolvedIf [ pArith ety | (_,ety) <- fs ] @@ -78,6 +145,12 @@ -- Cmp Bit TCon (TC TCBit) [] -> SolvedIf [] + -- Cmp Integer+ TCon (TC TCInteger) [] -> SolvedIf []++ -- Cmp (Z n)+ TCon (TC TCIntMod) [n] -> SolvedIf [ pFin n, n >== tOne ]+ -- (fin n, Cmp a) => Cmp [n]a TCon (TC TCSeq) [n,a] -> SolvedIf [ pFin n, pCmp a ] @@ -92,6 +165,77 @@ TRec fs -> SolvedIf [ pCmp e | (_,e) <- fs ] _ -> Unsolved+++-- | Solve a SignedCmp constraint for a sequence. The type passed here is the+-- element type of the sequence.+solveSignedCmpSeq :: Type -> Type -> Solved+solveSignedCmpSeq n ty = case tNoUser ty of++ -- (fin n, n >=1 ) => SignedCmp [n]Bit+ TCon (TC TCBit) [] -> SolvedIf [ pFin n, n >== tNum (1 :: Integer) ]++ -- variables are not solvable.+ TVar {} -> Unsolved++ -- (fin n, SignedCmp ty) => SignedCmp [n]ty, when ty != Bit+ _ -> SolvedIf [ pFin n, pSignedCmp ty ]+++-- | Solve SignedCmp constraints.+solveSignedCmpInst :: Type -> Solved+solveSignedCmpInst ty = case tNoUser ty of++ -- SignedCmp Error -> fails+ TCon (TError _ e) _ -> Unsolvable e++ -- SignedCmp Bit+ TCon (TC TCBit) [] -> Unsolvable $ TCErrorMessage "Signed comparisons may not be performed on bits"++ -- SignedCmp for sequences+ TCon (TC TCSeq) [n,a] -> solveSignedCmpSeq n a++ -- (SignedCmp a, SignedCmp b) => SignedCmp (a,b)+ TCon (TC (TCTuple _)) es -> SolvedIf (map pSignedCmp es)++ -- SignedCmp (a -> b) fails+ TCon (TC TCFun) [_,_] ->+ Unsolvable $ TCErrorMessage "Signed comparisons may not be performed on functions."++ -- (SignedCmp a, SignedCmp b) => SignedCmp { x:a, y:b }+ TRec fs -> SolvedIf [ pSignedCmp e | (_,e) <- fs ]++ _ -> Unsolved+++-- | Solve Literal constraints.+solveLiteralInst :: Type -> Type -> Solved+solveLiteralInst val ty+ | TCon (TError _ e) _ <- tNoUser val = Unsolvable e+ | otherwise =+ case tNoUser ty of++ -- Literal n Error -> fails+ TCon (TError _ e) _ -> Unsolvable e++ -- (fin val) => Literal val Integer+ TCon (TC TCInteger) [] -> SolvedIf [ pFin val ]++ -- (fin val, fin m, m >= val + 1) => Literal val (Z m)+ TCon (TC TCIntMod) [modulus] ->+ SolvedIf [ pFin val, pFin modulus, modulus >== tAdd val tOne ]++ -- (fin bits, bits => width n) => Literal n [bits]+ TCon (TC TCSeq) [bits, elTy]+ | TCon (TC TCBit) [] <- ety ->+ SolvedIf [ pFin val, pFin bits, bits >== tWidth val ]+ | TVar _ <- ety -> Unsolved+ where ety = tNoUser elTy++ TVar _ -> Unsolved++ _ -> Unsolvable $ TCErrorMessage $ show+ $ "Type" <+> quotes (pp ty) <+> "does not support literals." -- | Add propositions that are implied by the given one.
− src/Cryptol/TypeCheck/Solver/CrySAT.hs
@@ -1,697 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2013-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable--{-# LANGUAGE Safe #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE TypeSynonymInstances #-}-module Cryptol.TypeCheck.Solver.CrySAT- ( withScope, withSolver- , assumeProps, simplifyProps, getModel- , check- , Solver, logger, getIntervals- , DefinedProp(..)- , debugBlock- , DebugLog(..)- , knownDefined, numericRight- , minimizeContradictionSimpDef- , loadFile- , rawSolver- ) where--import qualified Cryptol.TypeCheck.AST as Cry-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-import Cryptol.TypeCheck.Solver.Numeric.Interval-import Cryptol.TypeCheck.Solver.Numeric.Defined-import Cryptol.TypeCheck.Solver.Numeric.Simplify-import Cryptol.TypeCheck.Solver.Numeric.NonLin-import Cryptol.TypeCheck.Solver.Numeric.SMT-import Cryptol.Utils.PP -- ( Doc )-import Cryptol.Utils.Panic ( panic )--import MonadLib-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',- atomicModifyIORef' )-import Prelude hiding (any,all)--import qualified SimpleSMT as SMT----- | We use this to remember what we simplified-newtype SimpProp = SimpProp { unSimpProp :: Prop }--simpProp :: Prop -> SimpProp-simpProp p = SimpProp (crySimplify p)---class HasProp a where getProp :: a -> Cry.Prop-instance HasProp Cry.Prop where getProp = id-instance HasProp Goal where getProp = goal----- | 'dpSimpProp' and 'dpSimpExprProp' should be logically equivalent,--- to each other, and to whatever 'a' represents (usually 'a' is a 'Goal').-data DefinedProp a = DefinedProp- { dpData :: a- -- ^ Optional data to associate with prop.- -- Often, the original `Goal` from which the prop was extracted.-- , dpSimpProp :: SimpProp- {- ^ Fully simplified: may mention ORs, and named non-linear terms.- These are what we send to the prover, and we don't attempt to- convert them back into Cryptol types. -}-- , dpSimpExprProp :: Prop- {- ^ A version of the proposition where just the expression terms- have been simplified. These should not contain ORs or named non-linear- terms because we want to import them back into Crytpol types. -}- }--knownDefined :: (a,Prop) -> DefinedProp a-knownDefined (a,p) = DefinedProp- { dpData = a, dpSimpProp = simpProp p, dpSimpExprProp = p }----- | Class goals go on the left, numeric goals go on the right.-numericRight :: Goal -> Either Goal (Goal, Prop)-numericRight g = case exportProp (goal g) of- Just p -> Right (g, p)- Nothing -> Left g------- | Simplify a bunch of well-defined properties.--- * Eliminates properties that are implied by the rest.--- * Does not modify the set of assumptions.-simplifyProps :: Solver -> [DefinedProp Goal] -> IO [Goal]-simplifyProps s props =- debugBlock s "Simplifying properties" $- withScope s (go [] (eliminateSimpleGEQ props))- where- go survived [] = return survived-- go survived (DefinedProp { dpSimpProp = SimpProp PTrue } : more) =- go survived more-- go survived (p : more) =- case dpSimpProp p of- SimpProp PTrue -> go survived more- SimpProp p' ->- do mbProved <- withScope s $- do mapM_ (assert s) more- e <- getIntervals s- case e of- Left _ -> return Nothing- Right ints -> do b <- prove s p'- return (Just (ints,b))- case mbProved of- Just (_,True) -> go survived more-- Just (ints,False) ->- debugLog s ("Using the fin solver:" ++ show (pp (goal (dpData p)))) >>- 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 ->- do debugLog s "unsolved"- assert s p- go (dpData p : survived) more-- x@(Unsolvable {}) ->- do debugLog s (show (pp x))- go (dpData p:survived) more-- Nothing -> go (dpData p:survived) more---{- | Simplify easy less-than-or-equal-to and equal-to goals.-Those are common with long lists of literals, so we have special handling-for them. In particular:-- * Reduce goals of the form @(a >= k1, a >= k2, a >= k3, ...)@ to- @a >= max (k1, k2, k3, ...)@, when all the k's are constant.-- * Eliminate goals of the form @ki >= k2@, when @k2@ is leq than @k1@.-- * Eliminate goals of the form @a >= 0@.--NOTE: This assumes that the goals are well-defined.--}-eliminateSimpleGEQ :: [DefinedProp a] -> [DefinedProp a]-eliminateSimpleGEQ = go Map.empty []- where-- go geqs other (g : rest) =- case dpSimpExprProp g of- K a :== K b- | a == b -> go geqs other rest-- _ :>= K (Nat 0) ->- go geqs other rest-- K (Nat k1) :>= K (Nat k2)- | k1 >= k2 -> go geqs other rest-- Var v :>= K (Nat k2) ->- go (addUpperBound v (k2,g) geqs) other rest-- _ -> go geqs (g:other) rest-- go geqs other [] = [ g | (_,g) <- Map.elems geqs ] ++ other-- -- add in a possible upper bound for var- addUpperBound var g = Map.insertWith cmp var g- where- cmp a b | fst a > fst b = a- | otherwise = b-------- | Add the given constraints as assumptions.--- * We assume that the constraints are well-defined.--- * Modifies the set of assumptions.-assumeProps :: Solver -> [Cry.Prop] -> IO [SimpProp]-assumeProps s props =- do let ps = [ (p,p') | p <- props- , Just p' <- [exportProp p] ]-- let defPs = [ (p,cryDefinedProp p') | (p,p') <- ps ]-- let simpProps = map knownDefined (defPs ++ ps)- mapM_ (assert s) simpProps- return (map dpSimpProp simpProps)- -- XXX: Instead of asserting one at a time, perhaps we should- -- assert a conjunction. That way, we could simplify the whole thing- -- in one go, and would avoid having to assert 'true' many times.------- | Given a list of propositions that together lead to a contradiction,--- find a sub-set that still leads to a contradiction (but is smaller).-minimizeContradictionSimpDef :: HasProp a => Solver -> [DefinedProp a] -> IO [a]-minimizeContradictionSimpDef s ps = start [] ps- where- start bad todo =- do res <- SMT.check (solver s)- case res of- SMT.Unsat -> return (map dpData bad)- _ -> do solPush s- go bad [] todo-- go _ _ [] = panic "minimizeContradiction"- $ ("No contradiction" : map (show . ppProp . dpSimpExprProp) ps)- go bad prev (d : more) =- do assert s d- res <- SMT.check (solver s)- case res of- SMT.Unsat -> do solPop s- assert s d- start (d : bad) prev- _ -> go bad (d : prev) more----{- | Attempt to find a substituion that, when applied, makes all of the-given properties hold. -}-getModel :: Solver -> [Cry.Prop] -> IO (Maybe Cry.Subst)-getModel s props = withScope s $- do ps <- assumeProps s props- res <- SMT.check (solver s)- let vars = Set.toList $ Set.unions $ map (cryPropFVS . unSimpProp) ps-- case res of- SMT.Sat ->- do vs <- getVals (solver s) vars- -- This is guaranteed to be a model only for the *linear*- -- properties, so now we check if it works for the rest too.-- let su1 = fmap K vs- ps1 = [ fromMaybe p (apSubst su1 p) | SimpProp p <- ps ]- ok p = case crySimplify p of- PTrue -> True- _ -> False-- su2 = Cry.listSubst- [ (x, numTy v) | (UserName x, v) <- Map.toList vs ]-- return (guard (all ok ps1) >> return su2)--- _ -> return Nothing--- where- numTy Inf = Cry.tInf- numTy (Nat k) = Cry.tNum k--------------------------------------------------------------------------------------- | An SMT solver, and some info about declared variables.-data Solver = Solver- { solver :: SMT.Solver- -- ^ The actual solver-- , declared :: IORef VarInfo- -- ^ Information about declared variables, and assumptions in scope.-- , logger :: SMT.Logger- -- ^ 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- , otherScopes :: [Scope]- } deriving Show--data Scope = Scope- { scopeNames :: [Name]- -- ^ Variables declared in this scope (not counting the ones from- -- previous scopes).-- , scopeNonLinS :: NonLinS- {- ^ These are the non-linear terms mentioned in the assertions- that are currently asserted (including ones from previous scopes). -}-- , scopeIntervals :: Either Cry.TVar (Map.Map Cry.TVar Interval)- -- ^ Either a type variable that makes the asserted properties unsatisfiable- -- (due to a broken interval), or the current set of intervals for type- -- variables. If a variable is not in the interval map, its value can be- -- anything.- --- -- This includes all intervals from previous scopes.-- , scopeAsserted :: [Cry.Prop]- -- ^ This is the set of currently-asserted cryptol properties only in this- -- scope.- --- -- This includes all asserted props from previous scopes.- } deriving Show--scopeEmpty :: Scope-scopeEmpty = Scope { scopeNames = [], scopeNonLinS = initialNonLinS- , scopeIntervals = Right Map.empty, scopeAsserted = [] }--scopeElem :: Name -> Scope -> Bool-scopeElem x Scope { .. } = x `elem` scopeNames--scopeInsert :: Name -> Scope -> Scope-scopeInsert x Scope { .. } = Scope { scopeNames = x : scopeNames, .. }--scopeAssertNew :: Cry.Prop -> Scope -> Scope-scopeAssertNew prop Scope { .. } =- Scope { scopeIntervals = ints'- , scopeAsserted = props- , .. }-- where- props = prop : scopeAsserted- ints' = case scopeIntervals of- Left tv -> Left tv- Right ints -> case computePropIntervals ints props of- NoChange -> scopeIntervals- NewIntervals is -> Right is- InvalidInterval tv -> Left tv----- | Given a *simplified* prop, separate linear and non-linear parts--- and return the linear ones.-scopeAssertSimpProp :: SimpProp -> Scope -> ([SimpProp],Scope)-scopeAssertSimpProp (SimpProp p) Scope { .. } =- let (ps1,s1) = nonLinProp scopeNonLinS p- in (map SimpProp ps1, Scope { scopeNonLinS = s1, .. })---scopeAssert :: HasProp a => DefinedProp a -> Scope -> ([SimpProp],Scope)-scopeAssert DefinedProp { .. } s =- let (ps1,s1) = scopeAssertSimpProp dpSimpProp s- in (ps1,scopeAssertNew (getProp dpData) s1)----- | No scopes.-viEmpty :: VarInfo-viEmpty = VarInfo { curScope = scopeEmpty, otherScopes = [] }---- | Check if a name is any of the scopes.-viElem :: Name -> VarInfo -> Bool-viElem x VarInfo { .. } = any (x `scopeElem`) (curScope : otherScopes)---- | Add a name to a scope.-viInsert :: Name -> VarInfo -> VarInfo-viInsert x VarInfo { .. } = VarInfo { curScope = scopeInsert x curScope, .. }---- | Add an assertion to the current scope. Returns the linear part.-viAssertSimpProp :: SimpProp -> VarInfo -> (VarInfo, [SimpProp])-viAssertSimpProp p VarInfo { .. } = ( VarInfo { curScope = s1, .. }, p1)- where (p1, s1) = scopeAssertSimpProp p curScope--viAssert :: HasProp a => DefinedProp a -> VarInfo -> (VarInfo, [SimpProp])-viAssert d VarInfo { .. } = (VarInfo { curScope = s1, .. },p1)- where (p1, s1) = scopeAssert d curScope---- | Enter a scope.-viPush :: VarInfo -> VarInfo-viPush VarInfo { .. } =- VarInfo { curScope = scopeEmpty { scopeNonLinS = scopeNonLinS curScope- , scopeAsserted = scopeAsserted curScope- , scopeIntervals = scopeIntervals curScope }- , otherScopes = curScope : otherScopes- }---- | Exit a scope.-viPop :: VarInfo -> VarInfo-viPop VarInfo { .. } = case otherScopes of- c : cs -> VarInfo { curScope = c, otherScopes = cs }- _ -> panic "viPop" ["no more scopes"]----- | All declared names, that have not been "marked".--- These are the variables whose values we are interested in.-viUnmarkedNames :: VarInfo -> [ Name ]-viUnmarkedNames VarInfo { .. } = concatMap scopeNames scopes- where scopes = curScope : otherScopes---getIntervals :: Solver -> IO (Either Cry.TVar (Map Cry.TVar Interval))-getIntervals Solver { .. } =- do vi <- readIORef declared- return (scopeIntervals (curScope vi))----- | All known non-linear terms.-getNLSubst :: Solver -> IO Subst-getNLSubst Solver { .. } =- do VarInfo { .. } <- readIORef declared- return $ nonLinSubst $ scopeNonLinS curScope---- | Execute a computation with a fresh solver instance.-withSolver :: SolverConfig -> (Solver -> IO a) -> IO a-withSolver SolverConfig { .. } k =- do logger <- if solverVerbose > 0 then SMT.newLogger 0 else return quietLogger--- 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"- declared <- newIORef viEmpty- a <- k Solver { .. }- _ <- SMT.stop solver-- return a-- where- quietLogger = SMT.Logger { SMT.logMessage = \_ -> return ()- , SMT.logLevel = return 0- , SMT.logSetLevel= \_ -> return ()- , SMT.logTab = return ()- , SMT.logUntab = return ()- }--solPush :: Solver -> IO ()-solPush Solver { .. } =- do SMT.push solver- SMT.logTab logger- modifyIORef' declared viPush--solPop :: Solver -> IO ()-solPop Solver { .. } =- do modifyIORef' declared viPop- SMT.logUntab logger- SMT.pop solver---- | Execute a computation in a new solver scope.-withScope :: Solver -> IO a -> IO a-withScope s k =- do solPush s- a <- k- solPop s- return a---- | Declare a variable.-declareVar :: Solver -> Name -> IO ()-declareVar s@Solver { .. } a =- do done <- fmap (a `viElem`) (readIORef declared)- unless done $- do e <- SMT.declare solver (smtName a) SMT.tInt- let fin_a = smtFinName a- fin <- SMT.declare solver fin_a SMT.tBool- SMT.assert solver (SMT.geq e (SMT.int 0))-- nlSu <- getNLSubst s- modifyIORef' declared (viInsert a)- case Map.lookup a nlSu of- Nothing -> return ()- Just e' ->- do let finDef = crySimplify (Fin e')- mapM_ (declareVar s) (Set.toList (cryPropFVS finDef))- SMT.assert solver $- SMT.eq fin (ifPropToSmtLib (desugarProp finDef))------ | Add an assertion to the current context.--- INVARIANT: Assertion is simplified.-assert :: HasProp a => Solver -> DefinedProp a -> IO ()-assert _ DefinedProp { dpSimpProp = SimpProp PTrue } = return ()-assert s@Solver { .. } def@DefinedProp { dpSimpProp = p } =- do debugLog s ("Assuming: " ++ show (ppProp (unSimpProp p)))- a <- getIntervals s- debugLog s ("Intervals before:" ++ show (either pp ppIntervals a))- ps1' <- atomicModifyIORef' declared (viAssert def)- b <- getIntervals s- debugLog s ("Intervals after:" ++ show (either pp ppIntervals b))- let ps1 = map unSimpProp ps1'- vs = Set.toList $ Set.unions $ map cryPropFVS ps1- mapM_ (declareVar s) vs- mapM_ (SMT.assert solver . ifPropToSmtLib . desugarProp) ps1----- | Add an assertion to the current context.--- INVARIANT: Assertion is simplified.-assertSimpProp :: Solver -> SimpProp -> IO ()-assertSimpProp _ (SimpProp PTrue) = return ()-assertSimpProp s@Solver { .. } p@(SimpProp p0) =- do debugLog s ("Assuming: " ++ show (ppProp p0))- ps1' <- atomicModifyIORef' declared (viAssertSimpProp p)- let ps1 = map unSimpProp ps1'- vs = Set.toList $ Set.unions $ map cryPropFVS ps1- mapM_ (declareVar s) vs- mapM_ (SMT.assert solver . ifPropToSmtLib . desugarProp) ps1----- | Try to prove a property. The result is 'True' when we are sure that--- the property holds, and 'False' otherwise. In other words, getting `False`--- *does not* mean that the proposition does not hold.-prove :: Solver -> Prop -> IO Bool-prove _ PTrue = return True-prove s@Solver { .. } p =- debugBlock s ("Proving: " ++ show (ppProp p)) $- withScope s $- do assertSimpProp s (simpProp (Not p))- res <- SMT.check solver- case res of- SMT.Unsat -> debugLog s "Proved" >> return True- SMT.Unknown -> debugLog s "Not proved" >> return False -- We are not sure- SMT.Sat -> debugLog s "Not proved" >> return False- -- XXX: If the answer is Sat, it is possible that this is a- -- a fake example, as we need to evaluate the nonLinear constraints.- -- If they are all satisfied, then we have a genuine counter example.- -- Otherwise, we could look for another one...---{- | Check if the current set of assumptions is satisfiable, and find-some facts that must hold in any models of the current assumptions.--Returns `Nothing` if the currently asserted constraints are known to-be unsatisfiable.--Returns `Just (su, sub-goals)` is the current set is satisfiable.- * The `su` is a substitution that may be applied to the current constraint- set without loosing generality.- * The `sub-goals` are additional constraints that must hold if the- constraint set is to be satisfiable.--}-check :: Solver -> IO (Maybe (Subst, [Prop]))-check s@Solver { .. } =- do e <- getIntervals s- case e of-- Left tv ->- do debugLog s ("Invalid interval: " ++ show (pp tv))- return Nothing-- Right ints ->- do debugLog s ("Intervals:" ++ show (ppIntervals ints))- res <- SMT.check solver- case res of-- SMT.Unsat ->- do debugLog s "Not satisfiable"- return Nothing-- SMT.Unknown ->- do debugLog s "Unknown"- return (Just (Map.empty, []))-- SMT.Sat ->- do debugLog s "Satisfiable"- (impMap,sideConds) <- debugBlock s "Computing improvements"- (getImpSubst s)- return (Just (impMap, sideConds))----{- | Assuming that we are in a satisfiable state, try to compute an-improving substitution. We also return additional constraints that must-hold for the currently asserted propositions to hold.--}-getImpSubst :: Solver -> IO (Subst,[Prop])-getImpSubst s@Solver { .. } =- do names <- viUnmarkedNames `fmap` readIORef declared- m <- getVals solver names- (impSu,sideConditions) <- cryImproveModel solver logger m-- nlSu <- getNLSubst s-- let isNonLinName (SysName {}) = True- isNonLinName (UserName {}) = False-- (nlFacts, vFacts) = Map.partitionWithKey (\k _ -> isNonLinName k) impSu-- (vV, vNL) = Map.partition noNLVars vFacts-- nlSu1 = fmap (doAppSubst vV) nlSu-- (vNL_su,vNL_eqs) = Map.partitionWithKey goodDef- $ fmap (doAppSubst nlSu1) vNL-- nlSu2 = fmap (doAppSubst vNL_su) nlSu1- nlLkp x = case Map.lookup x nlSu2 of- Just e -> e- Nothing -> panic "getImpSubst"- [ "Missing NL variable:", show x ]-- allSides =- [ Var a :== e | (a,e) <- Map.toList vNL_eqs ] ++- [ nlLkp x :== doAppSubst nlSu2 e | (x,e) <- Map.toList nlFacts ] ++- [ doAppSubst nlSu2 si | si <- sideConditions ]-- theImpSu = composeSubst vNL_su vV-- debugBlock s "Improvments" $- do debugBlock s "substitution" $- mapM_ (debugLog s . dump) (Map.toList theImpSu)- debugBlock s "side-conditions" $ debugLog s allSides--- return (theImpSu, allSides)--- where- goodDef k e = not (k `Set.member` cryExprFVS e)-- isNLVar (SysName _) = True- isNLVar _ = False-- noNLVars e = all (not . isNLVar) (cryExprFVS e)-- dump (x,e) = show (ppProp (Var x :== e))------------------------------------------------------------------------------------debugBlock :: Solver -> String -> IO a -> IO a-debugBlock s@Solver { .. } name m =- do debugLog s name- SMT.logTab logger- a <- m- SMT.logUntab logger- return a--class DebugLog t where- debugLog :: Solver -> t -> IO ()-- debugLogList :: Solver -> [t] -> IO ()- debugLogList s ts = case ts of- [] -> debugLog s "(none)"- _ -> mapM_ (debugLog s) ts--instance DebugLog Char where- debugLog s x = SMT.logMessage (logger s) (show x)- debugLogList s x = SMT.logMessage (logger s) x--instance DebugLog a => DebugLog [a] where- debugLog = debugLogList--instance DebugLog a => DebugLog (Maybe a) where- debugLog s x = case x of- Nothing -> debugLog s "(nothing)"- Just a -> debugLog s a--instance DebugLog Doc where- debugLog s x = debugLog s (show x)--instance DebugLog Cry.Type where- debugLog s x = debugLog s (pp x)--instance DebugLog Goal where- debugLog s x = debugLog s (goal x)--instance DebugLog Cry.Subst where- debugLog s x = debugLog s (pp x)--instance DebugLog Prop where- debugLog s x = debugLog s (ppProp x)---
src/Cryptol/TypeCheck/Solver/Improve.hs view
@@ -41,12 +41,22 @@ -- 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+ improveEq impSkol ctxt prop <|>+ improveLit impSkol prop -- XXX: others +improveLit :: Bool -> Prop -> Match (Subst, [Prop])+improveLit impSkol prop =+ do (_,t) <- aLiteral prop+ (_,b) <- aSeq t+ a <- aTVar b+ unless impSkol $ guard (isFreeTV a)+ let su = singleSubst a tBit+ return (su, []) --- | Improvements from euqality constraints.++-- | Improvements from equality constraints. -- Invariant: -- the substitions should be already applied to the new sub-goals, if any. improveEq :: Bool -> Ctxt -> Prop -> Match (Subst,[Prop])
src/Cryptol/TypeCheck/Solver/InfNat.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.InfNat -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -120,6 +120,26 @@ nMod Inf _ = Nothing nMod (Nat x) (Nat y) = Just (Nat (mod x y)) nMod (Nat x) Inf = Just (Nat x) -- inf * 0 + x = 0 + x++-- | @nCeilDiv msgLen blockSize@ computes the least @n@ such that+-- @msgLen <= blockSize * n@. It is undefined when @blockSize = 0@.+-- It is also undefined when either input is infinite; perhaps this+-- could be relaxed later.+nCeilDiv :: Nat' -> Nat' -> Maybe Nat'+nCeilDiv _ (Nat 0) = Nothing+nCeilDiv Inf _ = Nothing+nCeilDiv (Nat _) Inf = Nothing+nCeilDiv (Nat x) (Nat y) = Just (Nat (- div (- x) y))++-- | @nCeilMod msgLen blockSize@ computes the least @k@ such that+-- @blockSize@ divides @msgLen + k@. It is undefined when @blockSize = 0@.+-- It is also undefined when either input is infinite; perhaps this+-- could be relaxed later.+nCeilMod :: Nat' -> Nat' -> Maybe Nat'+nCeilMod _ (Nat 0) = Nothing+nCeilMod Inf _ = Nothing+nCeilMod (Nat _) Inf = Nothing+nCeilMod (Nat x) (Nat y) = Just (Nat (mod (- x) y)) -- | Rounds up. -- @lg2 x = y@, iff @y@ is the smallest number such that @x <= 2 ^ y@
src/Cryptol/TypeCheck/Solver/Numeric.hs view
@@ -5,7 +5,7 @@ import Control.Applicative(Alternative(..)) import Control.Monad (guard,mzero)-import Data.Foldable (asum)+import Data.List (sortBy) import Cryptol.Utils.Patterns import Cryptol.TypeCheck.PP@@ -14,9 +14,18 @@ import Cryptol.TypeCheck.Solver.Types import Cryptol.TypeCheck.Solver.InfNat import Cryptol.TypeCheck.Solver.Numeric.Interval-import Cryptol.TypeCheck.SimpType+import Cryptol.TypeCheck.SimpType as Simp +{- Convention for comments: + K1, K2 ... Concrete constants+ s1, s2, t1, t2 ... Arbitrary type expressions+ a, b, c ... Type variables++-}+++-- | Try to solve @t1 = t2@ cryIsEqual :: Ctxt -> Type -> Type -> Solved cryIsEqual ctxt t1 t2 = matchDefault Unsolved $@@ -28,15 +37,20 @@ <|> ( guard (t1 == t2) >> return (SolvedIf [])) <|> tryEqMin t1 t2 <|> tryEqMin t2 t1+ <|> tryEqMins t1 t2+ <|> tryEqMins t2 t1 <|> tryEqMulConst t1 t2 <|> tryEqAddInf ctxt t1 t2 <|> tryAddConst (=#=) t1 t2--+ <|> tryCancelVar ctxt (=#=) t1 t2+ <|> tryLinearSolution t1 t2+ <|> tryLinearSolution t2 t1 +-- | Try to solve @t1 /= t2@ cryIsNotEqual :: Ctxt -> Type -> Type -> Solved cryIsNotEqual _i t1 t2 = matchDefault Unsolved (pBin PNeq (/=) t1 t2) +-- | Try to solve @t1 >= t2@ cryIsGeq :: Ctxt -> Type -> Type -> Solved cryIsGeq i t1 t2 = matchDefault Unsolved $@@ -48,15 +62,16 @@ <|> (geqByInterval i t1 t2) <|> (guard (t1 == t2) >> return (SolvedIf [])) <|> tryAddConst (>==) t1 t2+ <|> tryCancelVar i (>==) 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-+ -- XXX: max t 10 >= 2 --> True+ -- XXX: max t 2 >= 10 --> a >= 10 +-- | Try to solve something by evaluation. pBin :: PC -> (Nat' -> Nat' -> Bool) -> Type -> Type -> Match Solved pBin tf p t1 t2 = Unsolvable <$> anError KNum t1@@ -73,9 +88,12 @@ -------------------------------------------------------------------------------- -- GEQ +-- | Try to solve @K >= t@ tryGeqKThan :: Ctxt -> Type -> Nat' -> Match Solved tryGeqKThan _ _ Inf = return (SolvedIf []) tryGeqKThan _ ty (Nat n) =++ -- K1 >= K2 * t do (a,b) <- aMul ty m <- aNat' a return $ SolvedIf@@ -84,31 +102,38 @@ Nat 0 -> [] Nat k -> [ tNum (div n k) >== b ] +-- | Try to solve @t >= K@ tryGeqThanK :: Ctxt -> Type -> Nat' -> Match Solved tryGeqThanK _ t Inf = return (SolvedIf [ t =#= tInf ]) tryGeqThanK _ t (Nat k) =++ -- K1 + t >= K2 do (a,b) <- anAdd t n <- aNat a return $ SolvedIf $ if n >= k then [] else [ b >== tNum (k - n) ]-+ -- XXX: K1 ^^ n >= K2 tryGeqThanSub :: Ctxt -> Type -> Type -> Match Solved tryGeqThanSub _ x y =++ -- t1 >= t1 - t2 do (a,_) <- (|-|) y guard (x == a) return (SolvedIf []) tryGeqThanVar :: Ctxt -> Type -> TVar -> Match Solved tryGeqThanVar _ctxt ty x =+ -- (t + a) >= a do (a,b) <- anAdd ty let check y = do x' <- aTVar y guard (x == x') return (SolvedIf []) check a <|> check b +-- | Try to prove GEQ by considering the known intervals for the given types. geqByInterval :: Ctxt -> Type -> Type -> Match Solved geqByInterval ctxt x y = let ix = typeInterval ctxt x@@ -117,7 +142,7 @@ (l,Just n) | l >= n -> return (SolvedIf []) _ -> mzero -+-- min K1 t >= K2 ~~> t >= K2, if K1 >= K2; Err otherwise tryMinIsGeq :: Type -> Type -> Match Solved tryMinIsGeq t1 t2 = do (a,b) <- aMin t1@@ -130,8 +155,55 @@ -------------------------------------------------------------------------------- +-- | Cancel finite positive variables from both sides.+-- @(fin a, a >= 1) => a * t1 == a * t2 ~~~> t1 == t2@+-- @(fin a, a >= 1) => a * t1 >= a * t2 ~~~> t1 >= t2@+tryCancelVar :: Ctxt -> (Type -> Type -> Prop) -> Type -> Type -> Match Solved+tryCancelVar ctxt p t1 t2 =+ let lhs = preproc t1+ rhs = preproc t2+ in case check [] [] lhs rhs of+ Nothing -> fail ""+ Just x -> return x --- min a b = a ~> a <= b++ where+ check doneLHS doneRHS lhs@((a,mbA) : moreLHS) rhs@((b, mbB) : moreRHS) =+ do x <- mbA+ y <- mbB+ case compare x y of+ LT -> check (a : doneLHS) doneRHS moreLHS rhs+ EQ -> return $ SolvedIf [ p (term (doneLHS ++ map fst moreLHS))+ (term (doneRHS ++ map fst moreRHS)) ]+ GT -> check doneLHS (b : doneRHS) lhs moreRHS+ check _ _ _ _ = Nothing++ term xs = case xs of+ [] -> tNum (1::Int)+ _ -> foldr1 tMul xs++ preproc t = let fs = splitMul t []+ in sortBy cmpFact (zip fs (map cancelVar fs))++ splitMul t rest = case matchMaybe (aMul t) of+ Just (a,b) -> splitMul a (splitMul b rest)+ Nothing -> t : rest++ cancelVar t = matchMaybe $ do x <- aTVar t+ guard (iIsPosFin (tvarInterval ctxt x))+ return x++ -- cancellable variables go first, sorted alphabetically+ cmpFact (_,mbA) (_,mbB) =+ case (mbA,mbB) of+ (Just x, Just y) -> compare x y+ (Just _, Nothing) -> LT+ (Nothing, Just _) -> GT+ _ -> EQ++++-- min t1 t2 = t1 ~> t1 <= t2 tryEqMin :: Type -> Type -> Match Solved tryEqMin x y = do (a,b) <- aMin x@@ -140,10 +212,41 @@ check a b <|> check b a +-- t1 == min (K + t1) t2 ~~> t1 == t2, if K >= 1+-- (also if (K + t1) is one term in a multi-way min)+tryEqMins :: Type -> Type -> Match Solved+tryEqMins x y =+ do (a, b) <- aMin y+ let ys = splitMin a ++ splitMin b+ let ys' = filter (not . isGt) ys+ let y' = if null ys' then tInf else foldr1 Simp.tMin ys'+ return $ if length ys' < length ys+ then SolvedIf [x =#= y']+ else Unsolved+ where+ splitMin :: Type -> [Type]+ splitMin ty =+ case matchMaybe (aMin ty) of+ Just (t1, t2) -> splitMin t1 ++ splitMin t2+ Nothing -> [ty]++ isGt :: Type -> Bool+ isGt t =+ case matchMaybe (asAddK t) of+ Just (k, t') -> k > 0 && t' == x+ Nothing -> False++ asAddK :: Type -> Match (Integer, Type)+ asAddK t =+ do (t1, t2) <- anAdd t+ k <- aNat t1+ return (k, t2)++ tryEqVar :: Type -> TVar -> Match Solved tryEqVar ty x = - -- x = K + x --> x = inf+ -- a = K + a --> x = inf (do (k,tv) <- matches ty (anAdd, aNat, aTVar) guard (tv == x && k >= 1) @@ -151,7 +254,7 @@ ) <|> - -- x = min (K + x) y --> x = y+ -- a = min (K + a) t --> a = t (do (l,r) <- aMin ty let check this other = do (k,x') <- matches this (anAdd, aNat', aTVar)@@ -160,7 +263,7 @@ check l r <|> check r l ) <|>- -- x = K + min a x+ -- a = K + min t a (do (k,(l,r)) <- matches ty (anAdd, aNat, aMin) guard (k >= 1) let check a b = do x' <- aTVar a@@ -178,82 +281,92 @@ -- e.g., 10 = t tryEqK :: Ctxt -> Type -> Nat' -> Match Solved tryEqK ctxt ty lk =++ -- (t1 + t2 = inf, fin t1) ~~~> t2 = inf 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 <|>++ -- (K1 + t = K2, K2 >= K1) ~~~> t = (K2 - K1) 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+ $ "Adding " ++ showNat' rk ++ " will always exceed "+ ++ showNat' lk Just r -> SolvedIf [ b =#= tNat' r ] <|>++ -- (lk = t - rk) ~~> t = lk + rk+ do (t,rk) <- matches ty ((|-|) , __, aNat')+ return (SolvedIf [ t =#= tNat' (nAdd lk rk) ])++ <|> do (rk, b) <- matches ty (aMul, aNat', __) return $ case (lk,rk) of+ -- Inf * t = Inf ~~~> t >= 1 (Inf,Inf) -> SolvedIf [ b >== tOne ]++ -- K * t = Inf ~~~> t = Inf (Inf,Nat _) -> SolvedIf [ b =#= tInf ]++ -- Inf * t = 0 ~~~> t = 0 (Nat 0, Inf) -> SolvedIf [ b =#= tZero ]++ -- Inf * t = K ~~~> ERR (K /= 0) (Nat k, Inf) -> Unsolvable $ TCErrorMessage- $ show k ++ " /= inf * anything"+ $ show k ++ " != inf * anything"+ (Nat lk', Nat rk')+ -- 0 * t = K2 ~~> K2 = 0 | rk' == 0 -> SolvedIf [ tNat' lk =#= tZero ]- -- shouldn't happen, as `0 * x = x`+ -- shouldn't happen, as `0 * t = t` should have been simplified++ -- K1 * t = K2 ~~> t = K2/K1 | (q,0) <- divMod lk' rk' -> SolvedIf [ b =#= tNum q ] | otherwise -> Unsolvable $ TCErrorMessage- $ show lk ++ " /= " ++ show rk ++ " * anything"+ $ showNat' lk ++ " != " ++ showNat' rk ++ " * anything" + <|>+ -- K1 == K2 ^^ t ~~> t = logBase K2 K1+ do (rk, b) <- matches ty ((|^|), aNat, __)+ return $ case lk of+ Inf | rk > 1 -> SolvedIf [ b =#= tInf ]+ Nat n | Just (a,True) <- genLog n rk -> SolvedIf [ b =#= tNum a]+ _ -> Unsolvable $ TCErrorMessage+ $ show rk ++ " ^^ anything != " ++ showNat' lk+ -- XXX: Min, Max, etx -- 2 = min (10,y) --> y = 2 -- 2 = min (2,y) --> y >= 2 -- 10 = min (2,y) --> impossible -+-- | K1 * t1 + K2 * t2 + ... = K3 * t3 + K4 * t4 + ... 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)-- ]-+ do (lc,ls) <- matchLinear l+ (rc,rs) <- matchLinear r+ let d = foldr1 gcd (lc : rc : map fst (ls ++ rs))+ guard (d > 1)+ return (SolvedIf [build d lc ls =#= build d rc rs]) 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' ])+ build d k ts = foldr tAdd (cancel d k) (map (buildS d) ts)+ buildS d (k,t) = tMul (cancel d k) t+ cancel d x = tNum (div x d) +-- | @(t1 + t2 = Inf, fin t1) ~~> t2 = Inf@ tryEqAddInf :: Ctxt -> Type -> Type -> Match Solved tryEqAddInf ctxt l r = check l r <|> check r l where@@ -279,6 +392,7 @@ -- | Check for addition of constants to both sides of a relation.+-- @((K1 + K2) + t1) `R` (K1 + t2) ~~> (K2 + t1) `R` t2@ -- -- This relies on the fact that constants are floated left during -- simplification.@@ -293,3 +407,69 @@ if k1 > k2 then return (SolvedIf [ tAdd (tNum (k1 - k2)) x2 `rel` y2 ]) else return (SolvedIf [ x2 `rel` tAdd (tNum (k2 - k1)) y2 ])+++-- | Check for situations where a unification variable is involved in+-- a sum of terms not containing additional unification variables,+-- and replace it with a solution and an inequality.+-- @s1 = ?a + s2 ~~> (?a = s1 - s2, s1 >= s2)@+tryLinearSolution :: Type -> Type -> Match Solved+tryLinearSolution s1 t =+ do (a,xs) <- matchLinearUnifier t+ guard (noFreeVariables s1)++ -- NB: matchLinearUnifier only matches if xs is nonempty+ let s2 = foldr1 Simp.tAdd xs+ return (SolvedIf [ TVar a =#= (Simp.tSub s1 s2), s1 >== s2 ])+++-- | Match a sum of the form @(s1 + ... + ?a + ... sn)@ where+-- @s1@ through @sn@ do not contain any free variables.+--+-- Note: a successful match should only occur if @s1 ... sn@ is+-- not empty.+matchLinearUnifier :: Pat Type (TVar,[Type])+matchLinearUnifier = go []+ where+ go xs t =+ -- Case where a free variable occurs at the end of a sequence of additions.+ -- NB: match fails if @xs@ is empty+ do v <- aFreeTVar t+ guard (not . null $ xs)+ return (v, xs)+ <|>+ -- Next symbol is an addition+ do (x, y) <- anAdd t++ -- Case where a free variable occurs in the middle of an expression+ (do v <- aFreeTVar x+ guard (noFreeVariables y)+ return (v, reverse (y:xs))++ <|>+ -- Non-free-variable recursive case+ do guard (noFreeVariables x)+ go (x:xs) y)+++-- | Is this a sum of products, where the products have constant coefficients?+matchLinear :: Pat Type (Integer, [(Integer,Type)])+matchLinear = go (0, [])+ where+ go (c,ts) t =+ do n <- aNat t+ return (n + c, ts)+ <|>+ do (x,y) <- aMul t+ n <- aNat x+ return (c, (n,y) : ts)+ <|>+ do (l,r) <- anAdd t+ (c',ts') <- go (c,ts) l+ go (c',ts') r++++showNat' :: Nat' -> String+showNat' Inf = "inf"+showNat' (Nat n) = show n
− src/Cryptol/TypeCheck/Solver/Numeric/AST.hs
@@ -1,425 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ The sytnax of numeric propositions.--{-# LANGUAGE Safe #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE DeriveGeneric #-}-module Cryptol.TypeCheck.Solver.Numeric.AST- ( Name(..), ppName-- , Prop(..), cryPropExprs, cryPropFVS- , ppProp, ppPropPrec-- , Expr(..), zero, one, two, inf, cryAnds, cryOrs- , cryExprExprs, cryRebuildExpr- , cryExprFVS- , ppExpr, ppExprPrec-- , Nat'(..)-- , IfExpr, IfExpr'(..), ppIf, ppIfExpr-- , Subst, HasVars(..), cryLet, composeSubst, doAppSubst- ) where--import Cryptol.TypeCheck.AST(TVar)-import Cryptol.TypeCheck.PP(pp)-import Cryptol.TypeCheck.Solver.InfNat ( Nat'(..) )-import Cryptol.Utils.PP ( Doc, text, (<+>), hang, ($$), char, (<>)- , parens, integer, sep )-import Cryptol.Utils.Panic ( panic )-import Cryptol.Utils.Misc ( anyJust )---- import Data.GenericTrie (TrieKey)-import GHC.Generics(Generic)-import Data.Maybe (fromMaybe)-import Data.Map ( Map )-import qualified Data.Map as Map-import Data.Set ( Set )-import qualified Data.Set as Set-import qualified Control.Applicative as A-import Control.Monad ( liftM, ap )---infixr 2 :||-infixr 3 :&&-infix 4 :==, :>, :>=, :==:, :>:-infixl 6 :+, :--infixl 7 :*-infixr 8 :^^----data Name = UserName TVar | SysName Int- deriving (Show,Eq,Ord,Generic)------ | Propopsitions, representing Cryptol's numeric constraints (and a bit more).-data Prop =-- -- Preidcates on natural numbers with infinity.- -- After simplification, the only one of these should be `fin x`,- -- where `x` is a variable.-- Fin Expr | Expr :== Expr | Expr :>= Expr | Expr :> Expr--- -- Predicate on strict natural numbers (i.e., no infinities)- -- Should be introduced by 'cryNatOp', to eliminte 'inf'.- | Expr :==: Expr | Expr :>: Expr-- -- Standard logical strucutre>- | Prop :&& Prop | Prop :|| Prop- | Not Prop- | PFalse | PTrue- deriving (Eq,Show,Generic)----- | Expressions, representing Cryptol's numeric types.-data Expr = K Nat'- | Var Name- | Expr :+ Expr -- total- | Expr :- Expr -- partial: x >= y, fin y- | Expr :* Expr -- total- | Div Expr Expr -- partial: fin x, y >= 1- | Mod Expr Expr -- partial: fin x, y >= 1- | Expr :^^ Expr -- total- | Min Expr Expr -- total- | Max Expr Expr -- total- | Width Expr -- total- | LenFromThen Expr Expr Expr -- partial: x /= y, w >= width x- | LenFromThenTo Expr Expr Expr -- partial: x /= y- deriving (Eq,Show,Generic,Ord)----- | The constant @0@.-zero :: Expr-zero = K (Nat 0)---- | The constant @1@.-one :: Expr-one = K (Nat 1)---- | The constant @2@.-two :: Expr-two = K (Nat 2)---- | The constant @infinity@.-inf :: Expr-inf = K Inf----- | Make a conjucntion of the given properties.-cryAnds :: [Prop] -> Prop-cryAnds [] = PTrue-cryAnds ps = foldr1 (:&&) ps---- | Make a disjunction of the given properties.-cryOrs :: [Prop] -> Prop-cryOrs [] = PFalse-cryOrs ps = foldr1 (:||) ps------- | Compute all expressions in a property.-cryPropExprs :: Prop -> [Expr]-cryPropExprs = go []- where- go es prop =- case prop of- PTrue -> es- PFalse -> es- Not p -> go es p- p :&& q -> go (go es q) p- p :|| q -> go (go es q) p-- Fin x -> x : es-- x :== y -> x : y : es- x :> y -> x : y : es- x :>= y -> x : y : es-- x :==: y -> x : y : es- x :>: y -> x : y : es----- | Compute the immediate sub-expressions of an expression.-cryExprExprs :: Expr -> [Expr]-cryExprExprs expr =- case expr of- K _ -> []- Var _ -> []- x :+ y -> [x,y]- x :- y -> [x,y]- x :* y -> [x,y]- Div x y -> [x,y]- Mod x y -> [x,y]- x :^^ y -> [x,y]- Min x y -> [x,y]- Max x y -> [x,y]- Width x -> [x]- LenFromThen x y z -> [x,y,z]- LenFromThenTo x y z -> [x,y,z]---- | Rebuild an expression, using the top-level strucutre of the first--- expression, but the second list of expressions as sub-expressions.-cryRebuildExpr :: Expr -> [Expr] -> Expr-cryRebuildExpr expr args =- case (expr,args) of- (K _, []) -> expr- (Var _, []) -> expr- (_ :+ _k, [x,y]) -> x :+ y- (_ :- _ , [x,y]) -> x :- y- (_ :* _ , [x,y]) -> x :* y- (Div _ _, [x,y]) -> Div x y- (Mod _ _, [x,y]) -> Mod x y- (_ :^^ _, [x,y]) -> x :^^ y- (Min _ _, [x,y]) -> Min x y- (Max _ _, [x,y]) -> Max x y- (Width _, [x]) -> Width x- (LenFromThen _ _ _ , [x,y,z]) -> LenFromThen x y z- (LenFromThenTo _ _ _ , [x,y,z]) -> LenFromThenTo x y z- _ -> panic "cryRebuildExpr" $ map show- $ text "expr:" <+> ppExpr expr- : [ text "arg:" <+> ppExpr a | a <- args ]----- | Compute the free variables in an expression.-cryExprFVS :: Expr -> Set Name-cryExprFVS expr =- case expr of- Var x -> Set.singleton x- _ -> Set.unions (map cryExprFVS (cryExprExprs expr))---- | Compute the free variables in a proposition.-cryPropFVS :: Prop -> Set Name-cryPropFVS = Set.unions . map cryExprFVS . cryPropExprs------data IfExpr' p a = If p (IfExpr' p a) (IfExpr' p a) | Return a | Impossible- deriving Eq--type IfExpr = IfExpr' Prop--instance Monad (IfExpr' p) where- return = Return- fail _ = Impossible- m >>= k = case m of- Impossible -> Impossible- Return a -> k a- If p t e -> If p (t >>= k) (e >>= k)--instance Functor (IfExpr' p) where- fmap = liftM--instance A.Applicative (IfExpr' p) where- pure = return- (<*>) = ap-------------------------------------------------------------------------------------- Substitution-----------------------------------------------------------------------------------type Subst = Map Name Expr--composeSubst :: Subst -> Subst -> Subst-composeSubst g f = Map.union f' g- where- f' = fmap (\e -> fromMaybe e (apSubst g e)) f--cryLet :: HasVars e => Name -> Expr -> e -> Maybe e-cryLet x e = apSubst (Map.singleton x e)--doAppSubst :: HasVars a => Subst -> a -> a-doAppSubst su a = fromMaybe a (apSubst su a)---- | Replaces occurances of the name with the expression.--- Returns 'Nothing' if there were no occurances of the name.-class HasVars ast where- apSubst :: Subst -> ast -> Maybe ast---- | This is used in the simplification to "apply" substitutions to Props.-instance HasVars Bool where- apSubst _ _ = Nothing--instance HasVars Expr where- apSubst su = go- where- go expr =- case expr of- K _ -> Nothing- Var b -> Map.lookup b su- x :+ y -> bin (:+) x y- x :- y -> bin (:-) x y- x :* y -> bin (:*) x y- x :^^ y -> bin (:^^) x y- Div x y -> bin Div x y- Mod x y -> bin Mod x y- Min x y -> bin Min x y- Max x y -> bin Max x y- Width x -> Width `fmap` go x- LenFromThen x y w -> three LenFromThen x y w- LenFromThenTo x y z -> three LenFromThen x y z-- bin f x y = do [x',y'] <- anyJust go [x,y]- return (f x' y')-- three f x y z = do [x',y',z'] <- anyJust go [x,y,z]- return (f x' y' z')--instance HasVars Prop where- apSubst su = go- where- go prop =- case prop of- PFalse -> Nothing- PTrue -> Nothing- Not p -> Not `fmap` go p- p :&& q -> bin (:&&) p q- p :|| q -> bin (:||) p q- Fin x -> Fin `fmap` apSubst su x- x :== y -> twoE (:==) x y- x :>= y -> twoE (:>=) x y- x :> y -> twoE (:>) x y- x :==: y -> twoE (:==:) x y- x :>: y -> twoE (:>) x y-- bin f x y = do [x',y'] <- anyJust go [x,y]- return (f x' y')-- twoE f x y = do [x',y'] <- anyJust (apSubst su) [x,y]- return (f x' y')-------------------------------------------------------------------------------------- Tries------------------------------------------------------------------------------------- instance TrieKey Name--- instance TrieKey Prop--- instance TrieKey Expr---------------------------------------------------------------------------------------- Pretty Printing------------------------------------------------------------------------------------- | Pretty print a name.-ppName :: Name -> Doc-ppName name =- case name of- UserName x -> pp x- SysName x -> char '_' <> text (names !! x)---- | An infinite list of names, for pretty prinitng.-names :: [String]-names = concatMap gen [ 0 :: Integer .. ]- where- gen x = [ a : suff x | a <- [ 'a' .. 'z' ] ]-- suff 0 = ""- suff x = show x------ | Pretty print a top-level property.-ppProp :: Prop -> Doc-ppProp = ppPropPrec 0---- | Pretty print a proposition, in the given precedence context.-ppPropPrec :: Int -> Prop -> Doc-ppPropPrec prec prop =- case prop of- Fin x -> fun "fin" ppExprPrec x- x :== y -> bin "==" 4 1 1 ppExprPrec x y- x :>= y -> bin ">=" 4 1 1 ppExprPrec x y- x :> y -> bin ">" 4 1 1 ppExprPrec x y-- x :==: y -> bin "==#" 4 1 1 ppExprPrec x y- x :>: y -> bin ">#" 4 1 1 ppExprPrec x y-- p :&& q -> bin "&&" 3 1 0 ppPropPrec p q- p :|| q -> bin "||" 2 1 0 ppPropPrec p q- Not p -> fun "not" ppPropPrec p- PTrue -> text "True"- PFalse -> text "False"-- where- wrap p d = if prec > p then parens d else d-- fun f how x = wrap 10 (text f <+> how 11 x)-- bin op opP lMod rMod how x y =- wrap opP (sep [ how (opP + lMod) x, text op, how (opP + rMod) y ])------ | Pretty print an expression at the top level.-ppExpr :: Expr -> Doc-ppExpr = ppExprPrec 0---- | Pretty print an expression, in the given precedence context.-ppExprPrec :: Int -> Expr -> Doc-ppExprPrec prec expr =- case expr of- K Inf -> text "inf"- K (Nat n) -> integer n- Var a -> ppName a- x :+ y -> bin "+" 6 0 1 x y- x :- y -> bin "-" 6 0 1 x y- x :* y -> bin "*" 7 0 1 x y- Div x y -> fun "div" [x,y]- Mod x y -> fun "mod" [x,y]- x :^^ y -> bin "^^" 8 1 0 x y- Min x y -> fun "min" [x,y]- Max x y -> fun "max" [x,y]- Width x -> fun "width" [x]- LenFromThen x y w -> fun "lenFromThen" [x,y,w]- LenFromThenTo x y z -> fun "lenFromThenTo" [x,y,z]-- where- wrap p d = if prec > p then parens d else d-- fun f xs = wrap 10 (text f <+> sep (map (ppExprPrec 11) xs))-- bin op opP lMod rMod x y =- wrap opP- (ppExprPrec (opP + lMod) x <+> text op <+> ppExprPrec (opP + rMod) y)------ | Pretty print an experssion with ifs.-ppIfExpr :: IfExpr Expr -> Doc-ppIfExpr = ppIf ppProp ppExpr---- | Pretty print an experssion with ifs.-ppIf :: (p -> Doc) -> (a -> Doc) -> IfExpr' p a -> Doc-ppIf ppAtom ppVal = go- where- go expr =- case expr of- If p t e -> hang (text "if" <+> ppAtom p) 2- ( (text "then" <+> go t) $$- (text "else" <+> go e)- )- Return e -> ppVal e- Impossible -> text "<impossible>"---
− src/Cryptol/TypeCheck/Solver/Numeric/Defined.hs
@@ -1,55 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable--{-# LANGUAGE Safe #-}-module Cryptol.TypeCheck.Solver.Numeric.Defined where--import Cryptol.TypeCheck.Solver.Numeric.AST-import Cryptol.Utils.Panic ( panic )---- | A condition ensure that the given *basic* proposition makes sense.-cryDefinedProp :: Prop -> Prop-cryDefinedProp prop =- case prop of- Fin x -> cryDefined x- x :== y -> cryDefined x :&& cryDefined y- x :>= y -> cryDefined x :&& cryDefined y- Not p -> cryDefinedProp p- _ -> panic "cryDefinedProp" [ "Not a simple property:"- , show (ppProp prop)- ]----- | Generate a property ensuring that the expression is well-defined.--- This might be a bit too strict. For example, we reject things like--- @max inf (0 - 1)@, which one might think would simplify to @inf@.-cryDefined :: Expr -> Prop-cryDefined expr =- case expr of- K _ -> PTrue- Var _ -> PTrue -- Variables are always assumed to be OK.- -- The idea is that we are going to check for- -- defined-ness before instantiating variables.- x :+ y -> cryDefined x :&& cryDefined y- x :- y -> cryDefined x :&& cryDefined y :&&- Fin y :&& x :>= y- x :* y -> cryDefined x :&& cryDefined y- Div x y -> cryDefined x :&& cryDefined y :&&- Fin x :&& y :>= K (Nat 1)- Mod x y -> cryDefined x :&& cryDefined y :&&- Fin x :&& y :>= K (Nat 1)- x :^^ y -> cryDefined x :&& cryDefined y- Min x y -> cryDefined x :&& cryDefined y- Max x y -> cryDefined x :&& cryDefined y- Width x -> cryDefined x- LenFromThen x y w ->- cryDefined x :&& cryDefined y :&& cryDefined w :&&- Fin x :&& Fin y :&& Fin w :&& Not (x :== y) :&& w :>= Width x- LenFromThenTo x y z ->- cryDefined x :&& cryDefined y :&& cryDefined z :&&- Fin x :&& Fin y :&& Fin z :&& Not (x :== y)
src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.Numeric.Fin -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -86,6 +86,8 @@ (TCMax, [t1,t2]) -> SolvedIf [ pFin t1, pFin t2 ] (TCWidth, [t1]) -> SolvedIf [ pFin t1 ]+ (TCCeilDiv, [_,_]) -> SolvedIf []+ (TCCeilMod, [_,_]) -> SolvedIf [] (TCLenFromThen,[_,_,_]) -> SolvedIf [] (TCLenFromThenTo,[_,_,_]) -> SolvedIf []
− src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs
@@ -1,171 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable--{-# LANGUAGE Safe #-}-module Cryptol.TypeCheck.Solver.Numeric.ImportExport- ( ExportM- , exportProp- , exportType- , runExportM- , exportPropM- , exportTypeM- , importProp- , importType- ) where--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-exportProp = runExportM . exportPropM--exportType :: Cry.Prop -> Maybe Expr-exportType = runExportM . exportTypeM--runExportM :: ExportM a -> Maybe a-runExportM = either (\_ -> Nothing) Just- . runId- . runExceptionT--type ExportM = ExceptionT () Id--exportPropM :: Cry.Prop -> ExportM Prop-exportPropM ty =- case ty of- Cry.TUser _ _ t -> exportPropM t- Cry.TRec {} -> raise ()- Cry.TVar {} -> raise ()- Cry.TCon (Cry.PC pc) ts ->- mapM exportTypeM ts >>= \ets ->- case (pc, ets) of- (Cry.PFin, [t]) -> return (Fin t)- (Cry.PEqual, [t1,t2]) -> return (t1 :== t2)- (Cry.PNeq, [t1,t2]) -> return (Not (t1 :== t2))- (Cry.PGeq, [t1,t2]) -> return (t1 :>= t2)- _ -> raise ()- Cry.TCon _ _ -> raise ()--exportTypeM :: Cry.Type -> ExportM Expr-exportTypeM ty =- case ty of- Cry.TUser _ _ t -> exportTypeM t- Cry.TRec {} -> raise ()- 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 ()-- Cry.TF f ->- mapM exportTypeM ts >>= \ets ->- case (f, ets) of- (Cry.TCAdd, [t1,t2]) -> return (t1 :+ t2)- (Cry.TCSub, [t1,t2]) -> return (t1 :- t2)- (Cry.TCMul, [t1,t2]) -> return (t1 :* t2)- (Cry.TCDiv, [t1,t2]) -> return (Div t1 t2)- (Cry.TCMod, [t1,t2]) -> return (Mod t1 t2)- (Cry.TCExp, [t1,t2]) -> return (t1 :^^ t2)- (Cry.TCMin, [t1,t2]) -> return (Min t1 t2)- (Cry.TCMax, [t1,t2]) -> return (Max t1 t2)- (Cry.TCWidth, [t1]) -> return (Width t1)- (Cry.TCLenFromThen, [t1,t2,t3]) -> return (LenFromThen t1 t2 t3)- (Cry.TCLenFromThenTo, [t1,t2,t3]) -> return (LenFromThenTo t1 t2 t3)-- _ -> raise ()-- Cry.PC _ -> raise ()--importProp :: Prop -> Maybe [Cry.Prop]-importProp prop =- case prop of- PFalse -> Nothing- PTrue -> Just []-- Not p -> importProp =<< pNot p- p1 :&& p2 -> do ps1 <- importProp p1- ps2 <- importProp p2- return (ps1 ++ ps2)- _ :|| _ -> Nothing-- Fin expr -> do t <- importType expr- return [ Cry.pFin t ]-- e1 :== e2 -> do t1 <- importType e1- t2 <- importType e2- return [t1 Cry.=#= t2]- e1 :>= e2 -> do t1 <- importType e1- t2 <- importType e2- return [t1 Cry.>== t2]- _ :> _ -> Nothing- e1 :==: e2 -> do t1 <- importType e1- t2 <- importType e2- -- XXX: Do we need to add fin?- return [t1 Cry.=#= t2]- _ :>: _ -> Nothing-- where- pNot p =- case p of- PFalse -> Just PTrue- PTrue -> Nothing-- Not a -> Just a- _ :&& _ -> Nothing- a :|| b -> Just (Not a :&& Not b)-- Fin a -> Just (a :== K Inf)- _ :== _ -> Nothing- _ :>= _ -> Nothing- a :> b -> Just (b :>= a)- _ :==: _ -> Nothing- a :>: b -> Just (b :>= a)- -- XXX: Do we need to add Fin on `a` and 'b'?---importType :: Expr -> Maybe Cry.Type-importType = go- where- go expr =- case expr of- Var x -> case x of- UserName v -> return (Cry.TVar v)- _ -> Nothing- K n -> case n of- Nat x -> Just (Cry.tNum x)- Inf -> Just (Cry.tInf)- 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 (f t)-- op2 f x y =- do t1 <- go x- t2 <- go y- return (f t1 t2)-- op3 f x y z =- do t1 <- go x- t2 <- go y- t3 <- go z- return (f t1 t2 t3)
src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.Numeric.Interval -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -49,11 +49,14 @@ iLenFromThenTo (go x) (go y) (go z) _ -> iAny - TVar x -> Map.findWithDefault iAny x varInfo+ TVar x -> tvarInterval varInfo x _ -> iAny +tvarInterval :: Map TVar Interval -> TVar -> Interval+tvarInterval varInfo x = Map.findWithDefault iAny x varInfo + data IntervalUpdate = NoChange | InvalidInterval TVar | NewIntervals (Map TVar Interval)@@ -149,7 +152,7 @@ ppIntervals :: Map TVar Interval -> Doc ppIntervals = vcat . map ppr . Map.toList where- ppr (var,i) = pp var <> char ':' <+> ppInterval i+ ppr (var,i) = pp var <.> char ':' <+> ppInterval i ppInterval :: Interval -> Doc ppInterval x = brackets (hsep [ ppr (iLower x)@@ -169,15 +172,19 @@ Just Inf -> False _ -> True +-- | Finite positive number. @[1 .. inf)@.+iIsPosFin :: Interval -> Bool+iIsPosFin i = iLower i >= Nat 1 && iIsFin i + -- | Returns 'True' when the intervals definitely overlap, and 'False' -- otherwise.-iDisjoint :: Interval -> Interval -> Bool-iDisjoint+iOverlap :: Interval -> Interval -> Bool+iOverlap (Interval (Nat l1) (Just (Nat h1))) (Interval (Nat l2) (Just (Nat h2))) = or [ h1 > l2 && h1 < h2, l1 > l2 && l1 < h2 ]-iDisjoint _ _ = False+iOverlap _ _ = False -- | Intersect two intervals, yielding a new one that describes the space where
− src/Cryptol/TypeCheck/Solver/Numeric/NonLin.hs
@@ -1,281 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ Separate Non-Linear Constraints--- When we spot a non-linear expression, we name it and add it to a map.------ If we see the same expression multiple times, then we give it the same name.------ The body of the non-linear expression is not processed further,--- so the resulting map should not contain any of the newly minted names.--{-# LANGUAGE Safe, RecordWildCards #-}--module Cryptol.TypeCheck.Solver.Numeric.NonLin- ( nonLinProp- , NonLinS, nonLinSubst- , initialNonLinS- , apSubstNL- , lookupNL- ) where--import Cryptol.TypeCheck.Solver.Numeric.AST-import Cryptol.TypeCheck.Solver.Numeric.Simplify-import Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr-import Cryptol.Utils.Panic(panic)---- import Data.GenericTrie (Trie)--- import qualified Data.GenericTrie as Trie-import Data.Maybe ( fromMaybe )-import MonadLib-import Data.Map (Map)-import qualified Data.Map as Map--type Trie = Map--trie_empty :: Map k a-trie_empty = Map.empty--trie_insert :: Expr -> a -> Map Expr a -> Map Expr a-trie_insert = Map.insert--trie_delete :: Expr -> Map Expr a -> Map Expr a-trie_delete = Map.delete--trie_lookup :: Expr -> Map Expr a -> Maybe a-trie_lookup = Map.lookup----- | Factor-out non-linear terms, by naming them.-nonLinProp :: NonLinS -> Prop -> ([Prop], NonLinS)-nonLinProp s0 prop = (p : ps, s)- where ((p,ps),s) = runNL s0 (nonLinPropM prop)--{- | Apply a substituin to the non-linear expression database.-Returns `Nothing` if nothing was affected.-Otherwise returns `Just`, and a substitution for non-linear expressions-that became linear.--The definitions of NL terms do not contain other named NL terms,-so it does not matter if the substitution contains bindings like @_a = e@.--There should be no bindings that mention NL term names in the definitions-of the substition (i.e, things like @x = _a@ are NOT ok).--}-apSubstNL :: Subst -> NonLinS -> Maybe (Subst, [Prop], NonLinS)-apSubstNL su s0 = case runNL s0 (mApSubstNL su) of- ((Nothing,_),_) -> Nothing- ((Just su1,ps),r) -> Just (su1,ps,r)--lookupNL :: Name -> NonLinS -> Maybe Expr-lookupNL x NonLinS { .. } = Map.lookup x nonLinExprs---runNL :: NonLinS -> NonLinM a -> ((a, [Prop]), NonLinS)-runNL s m = runId- $ runStateT s- $ do a <- m- ps <- finishTodos- return (a,ps)---- | Get the known non-linear terms.-nonLinSubst :: NonLinS -> Subst-nonLinSubst = nonLinExprs---- | The initial state for the linearization process.-initialNonLinS :: NonLinS-initialNonLinS = NonLinS- { nextName = 0- , nonLinExprs = Map.empty- , nlKnown = trie_empty- , nlTodo = []- }---data SubstOneRes = NoChange- -- ^ Substitution does not affect the expression.-- | Updated (Maybe (Name,Expr))- -- ^ The expression was updated and, maybe, it became linear.---{- | Apply the substituint to all non-linear bindings.-Returns `Nothing` if nothing was affected.-Otherwise returns `Just`, and a substituion mapping names that used-to be non-linear but became linear.--Note that we may return `Just empty`, indicating that some non-linear-expressions were updated, but they remained non-linear. -}-mApSubstNL :: Subst -> NonLinM (Maybe Subst)-mApSubstNL su =- do s <- get- answers <- mapM (mApSubstOneNL su) (Map.toList (nonLinExprs s))- return (foldr upd Nothing answers)- where- upd NoChange ch = ch- upd (Updated mb) ch = let lsu = fromMaybe Map.empty ch- in Just (case mb of- Nothing -> lsu- Just (x,e) -> Map.insert x e lsu)---mApSubstOneNL :: Subst -> (Name,Expr) -> NonLinM SubstOneRes-mApSubstOneNL su (x,e) =- case apSubst su e of- Nothing -> return NoChange- Just e1 ->- case crySimpExprMaybe e1 of-- Nothing ->- sets $ \NonLinS { .. } ->- ( Updated Nothing- , NonLinS { nonLinExprs = Map.insert x e1 nonLinExprs- , nlKnown = trie_insert e1 x (trie_delete e nlKnown)- , .. }- )-- Just e2- | isNonLinOp e2 ->- sets $ \NonLinS { .. } ->- (Updated Nothing- , NonLinS { nonLinExprs = Map.insert x e2 nonLinExprs- , nlKnown = trie_insert e2 x (trie_delete e nlKnown)- , .. }- )-- | otherwise ->- do sets_ $ \NonLinS { .. } ->- NonLinS { nonLinExprs = Map.delete x nonLinExprs- , nlKnown = trie_delete e nlKnown- , ..- }- es <- mapM nonLinExprM (cryExprExprs e2)- let e3 = cryRebuildExpr e2 es- return (Updated (Just (x,e3)))------ | Is the top-level operator a non-linear one.-isNonLinOp :: Expr -> Bool-isNonLinOp expr =- case expr of- K _ -> False- Var _ -> False-- _ :+ _ -> False-- _ :- _ -> False-- x :* y ->- case (x,y) of- (K _, _) -> False- (_, K _) -> False- _ -> True-- Div _ y ->- case y of- K (Nat n) -> n == 0- _ -> True-- Mod _ y ->- case y of- K (Nat n) -> n == 0- _ -> True-- _ :^^ _ -> True-- Min _ _ -> False-- Max _ _ -> False-- Width _ -> True-- LenFromThen _ _ _ -> True -- See also comment on `LenFromThenTo`-- LenFromThenTo x y _ ->- case (x,y) of- (K _, K _) -> False- _ -> True -- Actually, as long as the difference bettwen- -- `x` and `y` is constant we'd be OK, but not- -- sure how to do that...--nlImplied :: Expr -> Name -> [Prop]-nlImplied expr x =- map crySimplify $- case expr of- K (Nat n) :^^ e | n >= 2 -> [ Var x :>= one, Var x :>= e :+ one ]- Mod _ e -> [ e :>= Var x :+ one ]-- _ -> []-----nonLinPropM :: Prop -> NonLinM Prop-nonLinPropM prop =- case prop of- PFalse -> return PFalse- PTrue -> return PTrue- Not p -> Not `fmap` nonLinPropM p- p :&& q -> (:&&) `fmap` nonLinPropM p `ap` nonLinPropM q- p :|| q -> (:||) `fmap` nonLinPropM p `ap` nonLinPropM q- Fin (Var _) -> return prop- Fin _ -> unexpected- x :==: y -> (:==:) `fmap` nonLinExprM x `ap` nonLinExprM y- x :>: y -> (:>:) `fmap` nonLinExprM x `ap` nonLinExprM y-- _ :== _ -> unexpected- _ :>= _ -> unexpected- _ :> _ -> unexpected-- where- unexpected = panic "nonLinPropM" [ show (ppProp prop) ]----nonLinExprM :: Expr -> NonLinM Expr-nonLinExprM expr- | isNonLinOp expr = nameExpr expr- | otherwise = cryRebuildExpr expr `fmap` mapM nonLinExprM (cryExprExprs expr)----type NonLinM = StateT NonLinS Id--data NonLinS = NonLinS- { nextName :: !Int- , nonLinExprs :: Subst- , nlKnown :: Trie Expr Name- , nlTodo :: [Prop]- } deriving Show--nameExpr :: Expr -> NonLinM Expr-nameExpr e = sets $ \s ->- case trie_lookup e (nlKnown s) of- Just x -> (Var x, s)- Nothing ->- let x = nextName s- n = SysName x- s1 = NonLinS { nextName = 1 + x- , nonLinExprs = Map.insert n e (nonLinExprs s)- , nlKnown = trie_insert e n (nlKnown s)- , nlTodo = nlImplied e n ++ nlTodo s- }- in (Var n, s1)---finishTodos :: NonLinM [Prop]-finishTodos =- do s <- get- case nlTodo s of- [] -> return []- p : ps ->- do set s { nlTodo = ps }- p' <- nonLinPropM p- ps' <- finishTodos- return (p' : ps')
− src/Cryptol/TypeCheck/Solver/Numeric/SMT.hs
@@ -1,517 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ Desugar into SMTLIB Terminology--{-# LANGUAGE Safe #-}--module Cryptol.TypeCheck.Solver.Numeric.SMT- ( desugarProp- , smtName- , smtFinName- , ifPropToSmtLib- , cryImproveModel- , getVal- , getVals- ) where--import Cryptol.TypeCheck.AST (TVar(TVFree,TVBound))-import Cryptol.TypeCheck.Solver.InfNat-import Cryptol.TypeCheck.Solver.Numeric.AST-import Cryptol.TypeCheck.Solver.Numeric.Simplify(crySimplify)-import Cryptol.Utils.Misc ( anyJust )-import Cryptol.Utils.Panic ( panic )--import Data.List ( partition, unfoldr )-import Data.Map ( Map )-import qualified Data.Map as Map-import qualified Data.Set as Set-import SimpleSMT ( SExpr )-import qualified SimpleSMT as SMT-import MonadLib-------------------------------------------------------------------------------------- Desugar to SMT------------------------------------------------------------------------------------- XXX: Expanding the if-then-elses could make things large.--- Perhaps keep them as first class things, in hope that the solver--- can do something more clever with that?----- | Assumes simplified, linear, finite, defined expressions.-desugarExpr :: Expr -> IfExpr Expr-desugarExpr expr =- do es <- mapM desugarExpr (cryExprExprs expr)- case (expr,es) of- (Min {}, [x,y]) -> If (x :>: y) (return y) (return x)- (Max {}, [x,y]) -> If (x :>: y) (return x) (return y)- (LenFromThenTo {}, [ x@(K (Nat a)), K (Nat b), z ])-- -- going down- | a > b -> If (z :>: x) (return zero)- (return (Div (x :- z) step :+ one))-- -- goind up- | b > a -> If (x :>: z) (return zero)- (return (Div (z :- x) step :+ one))-- where step = K (Nat (abs (a - b)))-- _ -> return (cryRebuildExpr expr es)----- | Assumes simplified, linear, defined.-desugarProp :: Prop -> IfExpr Prop-desugarProp prop =- case prop of- PFalse -> return PFalse- PTrue -> return PTrue- Not p -> Not `fmap` desugarProp p- p :&& q -> (:&&) `fmap` desugarProp p `ap` desugarProp q- p :|| q -> (:||) `fmap` desugarProp p `ap` desugarProp q- Fin (Var _) -> return prop- x :==: y -> (:==:) `fmap` desugarExpr x `ap` desugarExpr y- x :>: y -> (:>:) `fmap` desugarExpr x `ap` desugarExpr y-- Fin _ -> unexpected- _ :== _ -> unexpected- _ :>= _ -> unexpected- _ :> _ -> unexpected-- where- unexpected = panic "desugarProp" [ show (ppProp prop) ]---ifPropToSmtLib :: IfExpr Prop -> SExpr-ifPropToSmtLib ifProp =- case ifProp of- Impossible -> SMT.bool False -- Sholdn't really matter- Return p -> propToSmtLib p- If p q r -> SMT.ite (propToSmtLib p) (ifPropToSmtLib q) (ifPropToSmtLib r)--propToSmtLib :: Prop -> SExpr-propToSmtLib prop =- case prop of- PFalse -> SMT.bool False- PTrue -> SMT.bool True- Not p -> case p of- Fin _ -> SMT.not (propToSmtLib p)-- -- It is IMPORTANT that the fin constraints are outside- -- the not.- x :>: y -> addFin $ SMT.geq (exprToSmtLib y)- (exprToSmtLib x)- _ -> unexpected--- p :&& q -> SMT.and (propToSmtLib p) (propToSmtLib q)- p :|| q -> SMT.or (propToSmtLib p) (propToSmtLib q)- Fin (Var x) -> fin x-- {- For the linear constraints, if the term is finite, then all of- its variables must have been finite.-- XXX: Adding the `fin` decls at the leaves leads to some duplication:- We could add them just once for each conjunctoin of simple formulas,- but I am not sure how much this matters.- -}- x :==: y -> addFin $ SMT.eq (exprToSmtLib x) (exprToSmtLib y)- x :>: y -> addFin $ SMT.gt (exprToSmtLib x) (exprToSmtLib y)-- Fin _ -> unexpected- _ :== _ -> unexpected- _ :>= _ -> unexpected- _ :> _ -> unexpected-- where- unexpected = panic "propToSmtLib" [ show (ppProp prop) ]- fin x = SMT.const (smtFinName x)-- addFin e = foldr (\x' e' -> SMT.and (fin x') e') e- (Set.toList (cryPropFVS prop))--exprToSmtLib :: Expr -> SExpr-exprToSmtLib expr =-- case expr of- K (Nat n) -> SMT.int n- Var a -> SMT.const (smtName a)- x :+ y -> SMT.add (exprToSmtLib x) (exprToSmtLib y)- x :- y -> SMT.sub (exprToSmtLib x) (exprToSmtLib y)- x :* y -> SMT.mul (exprToSmtLib x) (exprToSmtLib y)- Div x y -> SMT.div (exprToSmtLib x) (exprToSmtLib y)- Mod x y -> SMT.mod (exprToSmtLib x) (exprToSmtLib y)-- K Inf -> unexpected- _ :^^ _ -> unexpected- Min {} -> unexpected- Max {} -> unexpected- Width {} -> unexpected- LenFromThen {} -> unexpected- LenFromThenTo {} -> unexpected-- where- unexpected = panic "exprToSmtLib" [ show (ppExpr expr) ]----- | The name of a variable in the SMT translation.-smtName :: Name -> String-smtName a = case a of- SysName n -> name "s" n- UserName tv -> case tv of- TVFree n _ _ _ -> name "u" n- TVBound n _ -> name "k" n-- where- name p n = case divMod n 26 of- (q,r) -> p ++ toEnum (fromEnum 'a' + r) :- (if q == 0 then "" else show q)----- | The name of a boolean variable, representing `fin x`.-smtFinName :: Name -> String-smtFinName x = "fin_" ++ smtName x----------------------------------------------------------------------------------------- Models-----------------------------------------------------------------------------------{- | Get the value for the given name.- * Assumes that we are in a SAT state (i.e., there is a model)- * Assumes that the name is in the model -}-getVal :: SMT.Solver -> Name -> IO Nat'-getVal s a =- do yes <- isInf a- if yes- then return Inf- else do v <- SMT.getConst s (smtName a)- case v of- SMT.Int x | x >= 0 -> return (Nat x)- _ -> panic "cryCheck.getVal" [ "Not a natural number", show v ]-- where- isInf v = do yes <- SMT.getConst s (smtFinName v)- case yes of- SMT.Bool ans -> return (not ans)- _ -> panic "cryCheck.isInf"- [ "Not a boolean value", show yes ]----- | Get the values for the given names.-getVals :: SMT.Solver -> [Name] -> IO (Map Name Nat')-getVals s xs =- do es <- mapM (getVal s) xs- return (Map.fromList (zip xs es))----- | Convert a bunch of improving equations into an idempotent substitution.--- Assumes that the equations don't have loops.-toSubst :: Map Name Expr -> Subst-toSubst m0 = last (m0 : unfoldr step m0)- where step m = do m1 <- anyJust (apSubst m) m- return (m1,m1)---{- | Given a model, compute an improving substitution, implied by the model.-The entries in the substitution look like this:-- * @x = A@ variable @x@ must equal constant @A@-- * @x = y@ variable @x@ must equal variable @y@-- * @x = A * y + B@ (coming soon)- variable @x@ is a linear function of @y@,- @A@ and @B@ are natural numbers.--}----{- | We are mostly interested in improving unification variables.-However, it is also useful to improve skolem variables, as this could-turn non-linear constraints into linear ones. For example, if we-have a constraint @x * y = z@, and we can figure out that @x@ must be 5,-then we end up with a linear constraint @5 * y = z@.--}-cryImproveModel :: SMT.Solver -> SMT.Logger -> Map Name Nat'- -> IO (Map Name Expr, [Prop])-cryImproveModel solver logger model =- do (imps,subGoals) <- go Map.empty [] initialTodo- return (toSubst imps, subGoals)-- where- -- Process unification variables first. That way, if we get `x = y`, we'd- -- prefer `x` to be a unification variable.- initialTodo = uncurry (++) $ partition (isUniVar . fst) $ Map.toList model- isUniVar x = case x of- UserName (TVFree {}) -> True- _ -> False--- -- done: the set of known improvements- -- extra: the collection of inferred sub-goals- go done extra [] = return (done,extra)- go done extra ((x,e) : rest) =-- -- x = K?- do mbCounter <- cryMustEqualK solver (Map.keys model) x e- case mbCounter of- Nothing -> go (Map.insert x (K e) done) extra rest- Just ce -> goV ce done extra [] x e rest--- -- ce: a counter example to `x = e`- -- done: known improvements- -- extra: known sub-goals- -- todo: more work to process once we are done with `x`.- goV _ done extra todo _ _ [] = go done extra (reverse todo)- goV ce done extra todo x e ((y,e') : more)- -- x = y?- | e == e' = do yesK <- cryMustEqualV solver x y- if yesK then go (Map.insert x (Var y) done)- extra- (reverse todo ++ more)- else tryLR-- | otherwise = tryLR-- where- next = goV ce done extra ((y,e'):todo) x e more-- tryLR =- do mb <- tryLR_with x e y e'- case mb of- Just (r,subGoals) -> go (Map.insert x r done)- (subGoals ++ extra)- (reverse todo ++ more)- Nothing ->- do mb1 <- tryLR_with y e' x e- case mb1 of- Nothing -> next- Just (r, subGoals) -> go (Map.insert y r done)- (subGoals ++ extra)- (reverse todo ++ more)--- tryLR_with v1 v1Expr v2 v2Expr =- case ( isUniVar v1- , v1Expr- , v2Expr- , Map.lookup v1 ce- , Map.lookup v2 ce- ) of- (True, x1, y1, Just x2, Just y2) ->- cryCheckLinRel solver logger v2 v1 (y1,x1) (y2,x2)- _ -> return Nothing---------- | Try to prove the given expression.-checkUnsat :: SMT.Solver -> SExpr -> IO Bool-checkUnsat s e =- do SMT.push s- SMT.assert s e- res <- SMT.check s- SMT.pop s- return (res == SMT.Unsat)----- | Try to prove the given expression.--- If we fail, we try to give a counter example.--- If the answer is unknown, then we return an empty counter example.-getCounterExample :: SMT.Solver -> [Name] -> SExpr -> IO (Maybe (Map Name Nat'))-getCounterExample s xs e =- do SMT.push s- SMT.assert s e- res <- SMT.check s- ans <- case res of- SMT.Unsat -> return Nothing- SMT.Unknown -> return (Just Map.empty)- SMT.Sat -> Just `fmap` getVals s xs- SMT.pop s- return ans-------- | Is this the only possible value for the constant, under the current--- assumptions.--- Assumes that we are in a 'Sat' state.--- Returns 'Nothing' if the variables must always match the given value.--- Otherwise, we return a counter-example (which may be empty, if uniknown)-cryMustEqualK :: SMT.Solver -> [Name] ->- Name -> Nat' -> IO (Maybe (Map Name Nat'))-cryMustEqualK solver xs x val =- case val of- Inf -> getCounterExample solver xs (SMT.const (smtFinName x))- Nat n -> getCounterExample solver xs $- SMT.not $- SMT.and (SMT.const $ smtFinName x)- (SMT.eq (SMT.const (smtName x)) (SMT.int n))------ | Do these two variables need to always be the same, under the current--- assumptions.--- Assumes that we are in a 'Sat' state.-cryMustEqualV :: SMT.Solver -> Name -> Name -> IO Bool-cryMustEqualV solver x y =- checkUnsat solver $- SMT.not $- SMT.or (SMT.not (fin x) `SMT.and` SMT.not (fin y))- (fin x `SMT.and` fin y `SMT.and` SMT.eq (var x) (var y))-- where fin a = SMT.const (smtFinName a)- var a = SMT.const (smtName a)----- | Try to find a linear relation between the two variables, based--- on two observed data points.--- NOTE: The variable being defined is the SECOND name.-cryCheckLinRel :: SMT.Solver -> SMT.Logger ->- {- x -} Name {- ^ Definition in terms of this variable. -} ->- {- y -} Name {- ^ Define this variable. -} ->- (Nat',Nat') {- ^ Values in one model (x,y) -} ->- (Nat',Nat') {- ^ Values in another model (x,y) -} ->- IO (Maybe (Expr,[Prop]))- {- ^ Either nothing, or an improving expression, and any- additional obligations -}-cryCheckLinRel s logger x y p1 p2 =- -- First, try to find a linear relation that holds in all finite cases.- do SMT.push s- SMT.assert s (isFin x)- SMT.assert s (isFin y)- ans <- case (p1,p2) of- ((Nat x1, Nat y1), (Nat x2, Nat y2)) ->- checkLR x1 y1 x2 y2-- ((Inf, Inf), (Nat x2, Nat y2)) ->- mbGoOn (getFinPt x2) $ \(x1,y1) -> checkLR x1 y1 x2 y2-- ((Nat x1, Nat y1), (Inf, Inf)) ->- mbGoOn (getFinPt x1) $ \(x2,y2) -> checkLR x1 y1 x2 y2-- _ -> return Nothing-- SMT.pop s--- -- Next, check the infinite cases: if @y = A * x + B@, then- -- either both @x@ and @y@ must be infinite or they both must be finite.- -- Note that we don't consider relations where A = 0: because they- -- would be handled when we checked that @y@ is a constant.- case ans of- Nothing -> return Nothing- Just e ->- do SMT.push s- SMT.assert s (SMT.not (SMT.eq (isFin x) (isFin y)))- c <- SMT.check s- SMT.pop s- case c of- SMT.Unsat -> return (Just e)- _ -> return Nothing-- where- isFin a = SMT.const (smtFinName a)-- -- XXX: Duplicates `cryDefined`- -- The constraints are always of the form: x >= K, or K >= x- wellDefined e =- case e of- (K (Nat a) :* t) :- K (Nat b) ->- let c = div (b + a - 1) a- in [ t :>= K (Nat c) ]-- K (Nat b) :- (K (Nat a) :* t)- -> let c = div b a- in [ K (Nat c) :>= t ]-- a :- b -> [ a :>= b ]-- _ -> []--- checkLR x1 y1 x2 y2 =- do SMT.logMessage logger ("checkLR: " ++ show (x1,y1) ++ " "- ++ show (x2,y2))- mbGoOn (return (linRel (x1,y1) (x2,y2))) (\(a,b) ->- do let sumTerm v- | b == 0 = v- | b < 0 = v :- K (Nat (negate b))- | otherwise = v :+ K (Nat b)-- expr- | a == 1 = sumTerm (Var x)- | a < 0 = K (Nat b) :- K (Nat (negate a)) :* Var x- | otherwise = sumTerm (K (Nat a) :* Var x)-- SMT.logMessage logger ("candidate: " ++ show (ppProp (Var y :==: expr)))-- proved <- checkUnsat s- $ propToSmtLib $ crySimplify- $ Not $ Var y :==: expr-- if not proved- then SMT.logMessage logger "failed" >> return Nothing- else return (Just (expr,wellDefined expr)))-- -- Try to get an example of another point, which is finite, and at- -- different @x@ coordinate.- getFinPt otherX =- do SMT.push s- SMT.assert s (SMT.not (SMT.eq (SMT.const (smtName x)) (SMT.int otherX)))- smtAns <- SMT.check s- ans <- case smtAns of- SMT.Sat ->- do vX <- SMT.getConst s (smtName x)- vY <- SMT.getConst s (smtName y)- case (vX, vY) of- (SMT.Int vx, SMT.Int vy)- | vx >= 0 && vy >= 0 -> return (Just (vx,vy))- _ -> return Nothing- _ -> return Nothing- SMT.pop s- return ans-- mbGoOn m k = do ans <- m- case ans of- Nothing -> return Nothing- Just a -> k a--{- | Compute a linear relation through two concrete points.-Try to find a relation of the form @y = a * x + b@.-Depending on the signs of @a@ and @b@, we need additional checks,-to ensure tha @a * x + b@ is valid.--y1 = A * x1 + B-y2 = A * x2 + B-(y2 - y1) = A * (x2 - x1)--A = (y2 - y1) / (x2 - x1)-B = y1 - A * x1--}-linRel :: (Integer,Integer) {- ^ First point -} ->- (Integer,Integer) {- ^ Second point -} ->- Maybe (Integer,Integer) {- ^ (A,B) -}-linRel (x1,y1) (x2,y2) =- do guard (x1 /= x2)- let (a,r) = divMod (y2 - y1) (x2 - x1)- guard (r == 0 && a /= 0) -- Not interested in A = 0- let b = y1 - a * x1- guard $ not $ a < 0 && b < 0 -- No way this will give a natural number.- return (a,b)
− src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs
@@ -1,843 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2014-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ TODO:--- - Putting in a normal form to spot "prove by assumption"--- - Additional simplification rules, namely various cancelation.--- - Things like: lg2 e(x) = x, where we know thate is increasing.--{-# LANGUAGE Safe, PatternGuards, BangPatterns #-}-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}--module Cryptol.TypeCheck.Solver.Numeric.Simplify- (- -- * Simplify a property- crySimplify, crySimplifyMaybe-- -- * Simplify expressions in a prop- , crySimpPropExpr, crySimpPropExprMaybe- ) where--import Cryptol.TypeCheck.Solver.Numeric.AST-import Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr-import Cryptol.TypeCheck.Solver.InfNat(genLog,genRoot,rootExact)-import Cryptol.Utils.Misc ( anyJust )--import Control.Monad ( mplus )-import Data.List ( sortBy )-import Data.Maybe ( fromMaybe )-import qualified Data.Set as Set----- | Simplify a property, if possible.-crySimplify :: Prop -> Prop-crySimplify p = fromMaybe p (crySimplifyMaybe p)---- | Simplify a property, if possible.-crySimplifyMaybe :: Prop -> Maybe Prop-crySimplifyMaybe p =- let mbSimpExprs = simpSubs p- exprsSimped = fromMaybe p mbSimpExprs- mbRearrange = tryRearrange exprsSimped- rearranged = fromMaybe exprsSimped mbRearrange- in crySimplify `fmap` (crySimpStep rearranged `mplus` mbRearrange- `mplus` mbSimpExprs)-- where- tryRearrange q = case q of- _ :&& _ -> cryRearrangeAnd q- _ :|| _ -> cryRearrangeOr q- _ -> Nothing-- simpSubs q = case q of- Not a -> Not `fmap` crySimplifyMaybe a- a :&& b -> do [a',b'] <- anyJust crySimplifyMaybe [a,b]- return (a' :&& b')- a :|| b -> do [a',b'] <- anyJust crySimplifyMaybe [a,b]- return (a' :|| b')- _ -> crySimpPropExprMaybe q-------- | A single simplification step.-crySimpStep :: Prop -> Maybe Prop-crySimpStep prop =- case prop of-- Fin x -> cryIsFin x -- Fin only on variables.-- x :== y -> Just (cryIsEq x y)- x :> y -> Just (cryIsGt x y)-- x :>= y ->- case (x,y) of- -- XXX: DUPLICTION- (K (Nat 0), _) -> Just (y :== zero)- (K (Nat a), Width b) -> Just (K (Nat (2 ^ a)) :>= b)-- (_, K (Nat 0)) -> Just PTrue- (Width e, K (Nat b)) -> Just (e :>= K (Nat (2^(b-1))))--- (K Inf, _) -> Just PTrue- (_, K Inf) -> Just (x :== inf)- _ -> Just (x :== inf :|| one :+ x :> y)-- x :==: y ->- case (x,y) of- (K a, K b) -> Just (if a == b then PTrue else PFalse)- (K (Nat n), _) | Just p <- cryIsNat True n y -> Just p- (_, K (Nat n)) | Just p <- cryIsNat True n x -> Just p-- _ | x == y -> Just PTrue- | otherwise -> case (x,y) of- (Var _, _) -> Nothing- (_, Var _) -> Just (y :==: x)- _ -> Nothing-- x :>: y ->- case (x,y) of- (K (Nat n),_) | Just p <- cryNatGt True n y -> Just p- (_, K (Nat n)) | Just p <- cryGtNat True n x -> Just p-- _ | x == y -> Just PFalse- | otherwise -> Nothing--- -- For :&& and :|| we assume that the props have been rearrnaged- p :&& q -> cryAnd p q- p :|| q -> cryOr p q-- Not p -> cryNot p- PFalse -> Nothing- PTrue -> Nothing----- | Rebalance parens, and arrange conjucts so that we can transfer--- information left-to-right.-cryRearrangeAnd :: Prop -> Maybe Prop-cryRearrangeAnd prop =- case rebalance prop of- Just p -> Just p- Nothing -> cryAnds `fmap` cryRearrange cmpAnd (split prop)- where- rebalance (a :&& b) =- case a of- PFalse -> Just PFalse- PTrue -> Just b- a1 :&& a2 -> Just (a1 :&& (a2 :&& b))- _ -> fmap (a :&&) (rebalance b)- rebalance _ = Nothing-- split (a :&& b) = a : split b- split a = [a]----- | Rebalance parens, and arrange disjuncts so that we can transfer--- information left-to-right.-cryRearrangeOr :: Prop -> Maybe Prop-cryRearrangeOr prop =- case rebalance prop of- Just p -> Just p- Nothing -> cryOrs `fmap` cryRearrange cmpOr (split prop)- where- rebalance (a :|| b) =- case a of- PFalse -> Just b- PTrue -> Just PTrue- a1 :|| a2 -> Just (a1 :|| (a2 :|| b))- _ -> fmap (a :||) (rebalance b)- rebalance _ = Nothing-- split (a :|| b) = a : split b- split a = [a]------- | Identify propositions that are suiatable for inlining.-cryIsDefn :: Prop -> Maybe (Name, Expr)-cryIsDefn (Var x :==: e) = if (x `Set.member` cryExprFVS e)- then Nothing- else Just (x,e)-cryIsDefn _ = Nothing------type PropOrdering = (Int,Prop) -> (Int,Prop) -> Ordering--{- | Rearrange proposition for conjuctions and disjunctions.--information left-to-right, so we put proposition with information content-on the left.--}-cryRearrange :: PropOrdering -> [Prop] -> Maybe [Prop]-cryRearrange cmp ps = if ascending keys then Nothing else Just sortedProps- where- -- We tag each proposition with a number, so that later we can tell easily- -- if the propositions got rearranged.- (keys, sortedProps) = unzip (sortBy cmp (zip [ 0 :: Int .. ] ps))-- ascending (x : y : zs) = x < y && ascending (y : zs)- ascending _ = True---cmpAnd :: PropOrdering-cmpAnd (k1,prop1) (k2,prop2) =- case (prop1, prop2) of-- -- First comes PFalse, maybe we don't need to do anything- (PFalse, PFalse) -> compare k1 k2- (PFalse, _) -> LT- (_,PFalse) -> GT-- -- Next comes PTrue- (PTrue, PTrue) -> compare k1 k2- (PTrue, _) -> LT- (_,PTrue) -> GT-- -- Next come `not (fin a)` (i.e, a = inf)- (Not (Fin (Var x)), Not (Fin (Var y))) -> cmpVars x y- (Not (Fin (Var _)), _) -> LT- (_, Not (Fin (Var _))) -> GT-- -- 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- , Just (y,_) <- mbR -> cmpVars x y- | Just _ <- mbL -> LT- | Just _ <- mbR -> GT- where- mbL = cryIsDefn prop1- mbR = cryIsDefn prop2-- -- Next come `fin a`- (Fin (Var x), Fin (Var y)) -> cmpVars x y- (Fin (Var _), _) -> LT- (_, Fin (Var _)) -> GT-- -- Everything else stays as is- _ -> compare k1 k2-- where- cmpVars x y- | x < y = LT- | x > y = GT- | otherwise = compare k1 k2---cmpOr :: PropOrdering-cmpOr (k1,prop1) (k2,prop2) =- case (prop1, prop2) of-- -- First comes PTrue, maybe we don't need to do anything- (PTrue, PTrue) -> compare k1 k2- (PTrue, _) -> LT- (_,PTrue) -> GT-- -- Next comes PFalse- (PFalse, PFalse) -> compare k1 k2- (PFalse, _) -> LT- (_,PFalse) -> GT-- -- Next comes `fin a` (because we propagete `a = inf`)- (Fin (Var x), Fin (Var y)) -> cmpVars x y- (Fin (Var _), _) -> LT- (_, Fin (Var _)) -> GT-- -- Next come `not (fin a)` (i.e, propagete (fin a))- (Not (Fin (Var x)), Not (Fin (Var y))) -> cmpVars x y- (Not (Fin (Var _)), _) -> LT- (_, Not (Fin (Var _))) -> GT-- -- we don't propagete (x /= e) for now.-- -- Everything else stays as is- _ -> compare k1 k2-- where- cmpVars x y- | x < y = LT- | x > y = GT- | otherwise = compare k1 k2-------- | Simplification of ':&&'.--- Assumes arranged conjucntions.--- See 'cryRearrangeAnd'.-cryAnd :: Prop -> Prop -> Maybe Prop-cryAnd p q =- case p of- PTrue -> Just q-- PFalse -> Just PFalse-- Not (Fin (Var x))- | Just q' <- cryKnownFin x False q -> Just (p :&& q')-- Fin (Var x)- | Just q' <- cryKnownFin x True q -> Just (p :&& q')-- _ | Just (x,e) <- cryIsDefn p- , Just q' <- cryLet x e q- -> Just (p :&& q')-- _ -> Nothing----- | Simplification of ':||'.--- Assumes arranged disjunctions.--- See 'cryRearrangeOr'-cryOr :: Prop -> Prop -> Maybe Prop-cryOr p q =- case p of- PTrue -> Just PTrue-- PFalse -> Just q-- Fin (Var x)- | Just q' <- cryKnownFin x False q -> Just (p :|| q')-- Not (Fin (Var x))- | Just q' <- cryKnownFin x True q -> Just (p :|| q')-- _ -> Nothing------ | Propagate the fact that the variable is known to be finite ('True')--- or not-finite ('False').--- Note that this may introduce new expression redexes.-cryKnownFin :: Name -> Bool -> Prop -> Maybe Prop-cryKnownFin a isFin prop =- case prop of- Fin (Var a') | a == a' -> Just (if isFin then PTrue else PFalse)-- p :&& q -> do [p',q'] <- anyJust (cryKnownFin a isFin) [p,q]- return (p' :&& q')-- p :|| q -> do [p',q'] <- anyJust (cryKnownFin a isFin) [p,q]- return (p' :|| q')-- Not p -> Not `fmap` cryKnownFin a isFin p-- x :==: y- | not isFin, Just [x',y'] <- anyJust (cryLet a inf) [x,y]- -> Just (cryNatOp (:==:) x' y')-- x :>: y- | not isFin, Just [x',y'] <- anyJust (cryLet a inf) [x,y]- -> Just (cryNatOp (:>:) x' y')-- -- All the other cases should be simplified, eventually.- _ -> Nothing------- | Negation.-cryNot :: Prop -> Maybe Prop-cryNot prop =- case prop of- Fin _ -> Nothing-- x :== y -> Just (x :> y :|| y :> x)- x :>= y -> Just (y :> x)- x :> y -> Just (y :>= x)-- x :==: y -> Just (x :>: y :|| y :>: x)-- _ :>: _ -> Nothing-- p :&& q -> Just (Not p :|| Not q)- p :|| q -> Just (Not p :&& Not q)- Not p -> Just p- PFalse -> Just PTrue- PTrue -> Just PFalse------ | Simplificaiton for @:==@-cryIsEq :: Expr -> Expr -> Prop-cryIsEq l r =- case (l,r) of- (K m, K n) -> if m == n then PTrue else PFalse-- (K Inf, _) -> Not (Fin r)- (_, K Inf) -> Not (Fin l)-- (Div x y, z) -> x :>= z :* y :&& (one :+ z) :* y :> x-- (K (Nat n),_) | Just p <- cryIsNat False n r -> p- (_,K (Nat n)) | Just p <- cryIsNat False n l -> p-- _ -> Not (Fin l) :&& Not (Fin r)- :|| Fin l :&& Fin r :&& cryNatOp (:==:) l r------- | Simplificatoin for @:>@-cryIsGt :: Expr -> Expr -> Prop-cryIsGt (K m) (K n) = if m > n then PTrue else PFalse-cryIsGt (K (Nat n)) e | Just p <- cryNatGt False n e = p-cryIsGt e (K (Nat n)) | Just p <- cryGtNat False n e = p--cryIsGt x y = Fin y :&& (x :== inf :||- Fin x :&& cryNatOp (:>:) x y)------ | Attempt to simplify a @fin@ constraint.--- Assumes a defined input.-cryIsFin :: Expr -> Maybe Prop-cryIsFin expr =- case expr of- K Inf -> Just PFalse- K (Nat _) -> Just PTrue- Var _ -> Nothing- t1 :+ t2 -> Just (Fin t1 :&& Fin t2)- t1 :- _ -> Just (Fin t1)-- t1 :* t2 -> Just ( Fin t1 :&& Fin t2- :|| t1 :== zero :&& t2 :== inf- :|| t2 :== zero :&& t1 :== inf- )-- Div t1 _ -> Just (Fin t1)- Mod _ _ -> Just PTrue-- t1 :^^ t2 ->- Just ( Fin t1 :&& Fin t2- :|| t1 :== inf :&& t2 :== zero -- inf ^^ 0- :|| t2 :== inf :&& (t1 :== zero :|| t1 :== one)- -- 0 ^^ inf, 1 ^^ inf- )-- Min t1 t2 -> Just (Fin t1 :|| Fin t2)- Max t1 t2 -> Just (Fin t1 :&& Fin t2)- Width t1 -> Just (Fin t1)- LenFromThen _ _ _ -> Just PTrue- LenFromThenTo _ _ _ -> Just PTrue---cryIsNat :: Bool -> Integer -> Expr -> Maybe Prop-cryIsNat useFinite n expr =- case expr of- K Inf -> Just PFalse-- K (Nat m) -> Just (if m == n then PTrue else PFalse)-- Var _ | useFinite -> Nothing- | otherwise -> Just (Fin expr :&& expr :==: K (Nat n))-- K (Nat m) :+ e2 -> Just $ if m > n then PFalse- else eq e2 $ K $ Nat $ n - m-- x :+ y- | n == 0 -> Just (eq x zero :&& eq y zero)- | n == 1 -> Just (eq x zero :&& eq y one :||- eq x one :&& eq y zero)- | otherwise -> Nothing-- e1 :- e2 -> Just $ eq (K (Nat n) :+ e2) e1-- K (Nat m) :* e2 ->- Just $ if m == 0- then if n == 0 then PTrue else PFalse- else case divMod n m of- (q,r) -> if r == 0 then eq e2 (K (Nat q))- else PFalse- e1 :* e2- | n == 0 -> Just (eq e1 zero :|| eq e2 zero)- | n == 1 -> Just (eq e1 one :&& eq e2 one)- | otherwise -> Nothing-- -- (x >= n * y) /\ ((n+1) * y > x)- Div x y -> Just (gt (one :+ x) (K (Nat n) :* y) :&&- gt (K (Nat (n + 1)) :* y) x)-- Mod _ _ | useFinite -> Nothing- | otherwise -> Just (cryNatOp (:==:) expr (K (Nat n)))--- K (Nat m) :^^ y -> Just $ case genLog n m of- Just (a, exact)- | exact -> eq y (K (Nat a))- _ -> PFalse- x :^^ K (Nat m) -> Just $ case rootExact n m of- Just a -> eq x (K (Nat a))- Nothing -> PFalse- x :^^ y- | n == 0 -> Just (eq x zero :&& gt y zero)- | n == 1 -> Just (eq x one :|| eq y zero)- | otherwise -> Nothing-- Min x y- | n == 0 -> Just (eq x zero :|| eq y zero)- | otherwise -> Just ( eq x (K (Nat n)) :&& gt y (K (Nat (n - 1)))- :|| eq y (K (Nat n)) :&& gt x (K (Nat (n - 1)))- )-- Max x y -> Just ( eq x (K (Nat n)) :&& gt (K (Nat (n + 1))) y- :|| eq y (K (Nat n)) :&& gt (K (Nat (n + 1))) y- )-- Width x- | n == 0 -> Just (eq x zero)- | otherwise -> Just (gt x (K (Nat (2^(n-1) - 1))) :&&- gt (K (Nat (2 ^ n))) 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- eq x y = if useFinite then x :==: y else x :== y- gt x y = if useFinite then x :>: y else x :> y---- | Constant > expression-cryNatGt :: Bool -> Integer -> Expr -> Maybe Prop-cryNatGt useFinite n expr- | n == 0 = Just PFalse- | n == 1 = Just (eq expr zero)- | otherwise =- case expr of- K x -> Just $ if Nat n > x then PTrue else PFalse-- Var _ -> Nothing-- K (Nat m) :+ y -> Just $ if n >= m then gt (k (n - m)) y else PFalse- _ :+ _ -> Nothing-- x :- y -> Just $ gt (k n :+ y) x-- K (Nat m) :* y- | m == 0 -> Just PTrue -- because we know that n > 1- | otherwise -> Just $ case divMod n m of- (q,0) -> gt (k q) y- (0,_) -> eq y zero- (q,_) -> gt (k (q + 1)) y- _ :* _ -> Nothing-- Div x y -> Just $ gt (k n :* y) x-- Mod _ (K (Nat m))- | m <= n -> Just PTrue-- Mod (K (Nat m)) _- | m < n -> Just PTrue- Mod _ _ -> Nothing--- K (Nat m) :^^ y- | m == 0 -> Just PTrue -- because n > 1- | m == 1 -> Just PTrue -- ditto- | otherwise -> do (a,exact) <- genLog n m- return $ if exact- then gt (k a) y- else gt (k (a + 1)) y- x :^^ K (Nat m)- | m == 0 -> Just PTrue- | m == 1 -> Just (gt (k n) x)- | otherwise -> do (a,exact) <- genRoot n m- return $ if exact- then gt (k a) x- else gt (k (a + 1)) x- _ :^^ _ -> Nothing-- Min x y -> Just $ gt (k n) x :|| gt (k n) y- Max x y -> Just $ gt (k n) x :&& gt (k n) y-- Width x -> Just $ gt (k (2 ^ n)) x-- LenFromThen _ _ _ -> Nothing -- Are there some rules?-- LenFromThenTo _ _ _ -> Nothing -- Are there some rulesj-- where- k x = K (Nat x)- eq x y = if useFinite then x :==: y else x :== y- gt x y = if useFinite then x :>: y else x :> y------ | Expression > constant-cryGtNat :: Bool -> Integer -> Expr -> Maybe Prop-cryGtNat useFinite n expr =- case expr of- K x -> Just $ if x > Nat n then PTrue else PFalse- Var _ -> Nothing-- K (Nat m) :+ y- | m > n -> Just PTrue- | otherwise -> Just (gt y (K (Nat (n - m))))-- x :+ y- | n == 0 -> Just (gt x zero :|| gt y zero)- | otherwise -> Nothing-- x :- y -> Just $ gt x (K (Nat n) :+ y)--- K (Nat m) :* y- | m > 0 -> Just $ case divMod n m of- (a,_) -> gt y $ K $ Nat a-- x :* y- | n == 0 -> Just (gt x zero :&& gt y zero)- | otherwise -> Nothing-- Div x y -> Just $ gt (one :+ x) (K (Nat (n+1)) :* y)-- Mod _ (K (Nat m))- | m <= n -> Just PFalse- Mod (K (Nat m)) _- | m < n -> Just PFalse- Mod _ _ -> Nothing-- K (Nat m) :^^ y- | m == 0 -> Just $ if n == 0 then eq y zero else PFalse- | m == 1 -> Just $ if n == 0 then PTrue else PFalse- | otherwise -> do (a,_exact) <- genLog n m- Just (gt y (K (Nat a)))-- x :^^ K (Nat m)- | m == 0 -> Just $ if n == 0 then PTrue else PFalse- | m == 1 -> Just $ gt x (K (Nat n))- | otherwise -> do (a,exact) <- genRoot n m- Just $ if exact- then gt x (K (Nat a))- else gt (one :+ x) (K (Nat (a+1)))-- x :^^ y- | n == 0 -> Just (gt x zero :|| eq y zero)- | otherwise -> Nothing-- Min x y -> Just $ gt x (K (Nat n)) :&& gt y (K (Nat n))- Max x y -> Just $ gt x (K (Nat n)) :|| gt y (K (Nat n))-- Width x -> Just $ gt (one :+ x) (K (Nat (2 ^ n)))-- LenFromThen _ _ _- | n == 0 -> Just PTrue- | otherwise -> Nothing -- Are there some rules?-- LenFromThenTo x y z- | n == 0 -> Just (gt x y :&& gt z x :|| gt y x :&& gt x z)- | otherwise -> Nothing-- where- eq x y = if useFinite then x :==: y else x :== y- gt x y = if useFinite then x :>: y else x :> y------ | Simplify only the Expr parts of a Prop.-crySimpPropExpr :: Prop -> Prop-crySimpPropExpr p = fromMaybe p (crySimpPropExprMaybe p)---- | Simplify only the Expr parts of a Prop.--- Returns `Nothing` if there were no changes.-crySimpPropExprMaybe :: Prop -> Maybe Prop-crySimpPropExprMaybe prop =- case prop of-- Fin e -> Fin `fmap` crySimpExprMaybe e-- a :== b -> binop crySimpExprMaybe (:== ) a b- a :>= b -> binop crySimpExprMaybe (:>= ) a b- a :> b -> binop crySimpExprMaybe (:> ) a b- a :==: b -> binop crySimpExprMaybe (:==:) a b- a :>: b -> binop crySimpExprMaybe (:>: ) a b-- a :&& b -> binop crySimpPropExprMaybe (:&&) a b- a :|| b -> binop crySimpPropExprMaybe (:||) a b-- Not p -> Not `fmap` crySimpPropExprMaybe p-- PFalse -> Nothing- PTrue -> Nothing-- where-- binop simp f l r =- case (simp l, simp r) of- (Nothing,Nothing) -> Nothing- (l',r') -> Just (f (fromMaybe l l') (fromMaybe r r'))--------- | Our goal is to bubble @inf@ terms to the top of @Return@.-cryNoInf :: Expr -> IfExpr Expr-cryNoInf expr =- case expr of-- -- These are the interesting cases where we have to branch-- x :* y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (K Inf, K Inf) -> return inf- (K Inf, _) -> mkIf (y' :==: zero) (return zero) (return inf)- (_, K Inf) -> mkIf (x' :==: zero) (return zero) (return inf)- _ -> return (x' :* y')-- x :^^ y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (K Inf, K Inf) -> return inf- (K Inf, _) -> mkIf (y' :==: zero) (return one) (return inf)- (_, K Inf) -> mkIf (x' :==: zero) (return zero)- $ mkIf (x' :==: one) (return one)- $ return inf- _ -> return (x' :^^ y')---- -- The rest just propagates-- K _ -> return expr- Var _ -> return expr-- x :+ y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (K Inf, _) -> return inf- (_, K Inf) -> return inf- _ -> return (x' :+ y')-- x :- y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (_, K Inf) -> Impossible- (K Inf, _) -> return inf- _ -> mkIf (x' :==: y)- (return zero)- (mkIf (x' :>: y) (return (x' :- y'))- Impossible)-- Div x y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (K Inf, _) -> Impossible- (_, K Inf) -> return zero- _ -> mkIf (y' :>: zero) (return (Div x' y')) Impossible-- Mod x y ->- do x' <- cryNoInf x- -- `Mod x y` is finite, even if `y` is `inf`, so first check- -- for finiteness.- mkIf (Fin y)- (do y' <- cryNoInf y- case (x',y') of- (K Inf, _) -> Impossible- (_, K Inf) -> Impossible- _ -> mkIf (y' :>: zero) (return (Mod x' y')) Impossible- )- (return x')-- Min x y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x',y') of- (K Inf, _) -> return y'- (_, K Inf) -> return x'- _ -> return (Min x' y')-- Max x y ->- do x' <- cryNoInf x- y' <- cryNoInf y- case (x', y') of- (K Inf, _) -> return inf- (_, K Inf) -> return inf- _ -> return (Max x' y')-- Width x ->- do x' <- cryNoInf 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' <- cryNoInf x- y' <- cryNoInf y- z' <- cryNoInf z- case (x',y',z') of- (K Inf, _, _) -> Impossible- (_, K Inf, _) -> Impossible- (_, _, K Inf) -> Impossible- _ -> mkIf (x' :==: y') Impossible- (return (f x' y' z'))-- mkIf p t e = case crySimplify p of- PTrue -> t- PFalse -> e- p' -> If p' t e------- | Make an expression that should work ONLY on natural nubers.--- Eliminates occurances of @inf@.--- Assumes that the two input expressions are well-formed and finite.--- The expression is constructed by the given function.-cryNatOp :: (Expr -> Expr -> Prop) -> Expr -> Expr -> Prop-cryNatOp op x y =- toProp $- do x' <- noInf x- y' <- noInf y- return (op x' y')- where- noInf a = do a' <- cryNoInf a- case a' of- K Inf -> Impossible- _ -> return a'-- toProp ite =- case ite of- Impossible -> PFalse -- It doesn't matter, but @false@ might anihilate.- Return p -> p- If p t e -> p :&& toProp t :|| Not p :&& toProp e
− src/Cryptol/TypeCheck/Solver/Numeric/SimplifyExpr.hs
@@ -1,213 +0,0 @@--- |--- Module : $Header$--- Copyright : (c) 2015-2016 Galois, Inc.--- License : BSD3--- Maintainer : cryptol@galois.com--- Stability : provisional--- Portability : portable------ Simplification of expressions.--- The result of simplifying an expression `e`, is a new expression `e'`,--- which satisfies the property:------ if e is well-defined then e and e' will evaluate to the same type.-----{-# LANGUAGE Safe, BangPatterns #-}-module Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr where--import Cryptol.TypeCheck.Solver.Numeric.AST-import qualified Cryptol.TypeCheck.Solver.InfNat as IN-import Cryptol.Utils.Misc ( anyJust )--import Control.Monad ( guard )-import Data.Maybe ( fromMaybe, maybeToList )-import qualified Data.Map as Map----- | Simplify an expression, if possible.-crySimpExpr :: Expr -> Expr-crySimpExpr expr = fromMaybe expr (crySimpExprMaybe expr)---- | Perform simplification from the leaves up.--- Returns `Nothing` if there were no changes.-crySimpExprMaybe :: Expr -> Maybe Expr-crySimpExprMaybe expr =- case crySimpExprStep (fromMaybe expr mbE1) of- Nothing -> mbE1- Just e2 -> Just (fromMaybe e2 (crySimpExprMaybe e2))- where- mbE1 = cryRebuildExpr expr `fmap` anyJust crySimpExprMaybe (cryExprExprs expr)------ XXX: Add rules to group together occurances of variables---data Sign = Pos | Neg deriving Show--otherSign :: Sign -> Sign-otherSign s = case s of- Pos -> Neg- Neg -> Pos--signed :: Sign -> Integer -> Integer-signed s = case s of- Pos -> id- Neg -> negate---splitSum :: Expr -> [(Sign,Expr)]-splitSum e0 = go Pos e0 []- where go s (e1 :+ e2) es = go s e1 (go s e2 es)- go s (e1 :- e2) es = go s e1 (go (otherSign s) e2 es)- go s e es = (s,e) : es--normSum :: Expr -> Expr-normSum = posTerm . go 0 Map.empty Nothing . splitSum- where-- -- constants, variables, other terms- go !_ !_ !_ ((Pos,K Inf) : _) = (Pos, K Inf)-- go k xs t ((s, K (Nat n)) : es) = go (k + signed s n) xs t es-- go k xs t ((s, Var x) : es) = go k (Map.insertWith (+) x (signed s 1) xs) t es-- go k xs t ((s, K (Nat n) :* Var x) : es)- | n == 0 = go k xs t es- | otherwise = go k (Map.insertWith (+) x (signed s n) xs) t es-- go k xs Nothing (e : es) = go k xs (Just e) es-- go k xs (Just e1) (e2 : es) = go k xs (Just (add e1 e2)) es-- go k xs t [] =- let terms = constTerm k- ++ concatMap varTerm (Map.toList xs)- ++ maybeToList t-- in case terms of- [] -> (Pos, K (Nat 0))- ts -> foldr1 add ts-- constTerm k- | k == 0 = []- | k > 0 = [ (Pos, K (Nat k)) ]- | otherwise = [ (Neg, K (Nat (negate k))) ]-- varTerm (x,k)- | k == 0 = []- | k == 1 = [ (Pos, Var x) ]- | k > 0 = [ (Pos, K (Nat k) :* Var x) ]- | k == (-1) = [ (Neg, Var x) ]- | otherwise = [ (Neg, K (Nat (negate k)) :* Var x) ]-- add (s1,t1) (s2,t2) =- case (s1,s2) of- (Pos,Pos) -> (Pos, t1 :+ t2)- (Pos,Neg) -> (Pos, t1 :- t2)- (Neg,Pos) -> (Pos, t2 :- t1)- (Neg,Neg) -> (Neg, t1 :+ t2)-- posTerm (Pos,x) = x- posTerm (Neg,x) = K (Nat 0) :- x-----crySimpExprStep :: Expr -> Maybe Expr-crySimpExprStep e =- case crySimpExprStep1 e of- Just e1 -> Just e1- Nothing -> do let e1 = normSum e- guard (e /= e1)- return e1---- | Make a simplification step, assuming the expression is well-formed.-crySimpExprStep1 :: Expr -> Maybe Expr-crySimpExprStep1 expr =- case expr of- K _ -> Nothing- Var _ -> Nothing-- _ :+ _ -> Nothing- _ :- _ -> Nothing-- x :* y ->- case (x,y) of- (K (Nat 0), _) -> Just zero- (K (Nat 1), _) -> Just y- (K a, K b) -> Just (K (IN.nMul a b))- (_, K _) -> Just (y :* x)-- (K a, K b :* z) -> Just (K (IN.nMul a b) :* z)-- -- Normalize, somewhat- (a :* b, _) -> Just (a :* (b :* y))- (Var a, Var b)- | b > a -> Just (y :* x)-- _ -> Nothing-- Div x y ->- case (x,y) of- (K (Nat 0), _) -> Just zero- (_, K (Nat 1)) -> Just x- (_, K Inf) -> Just zero- (K a, K b) -> K `fmap` IN.nDiv a b- _ | x == y -> Just one- _ -> Nothing-- Mod x y ->- case (x,y) of- (K (Nat 0), _) -> Just zero- (_, K Inf) -> Just x- (_, K (Nat 1)) -> Just zero- (K a, K b) -> K `fmap` IN.nMod a b- _ -> Nothing-- x :^^ y ->- case (x,y) of- (_, K (Nat 0)) -> Just one- (_, K (Nat 1)) -> Just x- (K (Nat 1), _) -> Just one- (K a, K b) -> Just (K (IN.nExp a b))- _ -> Nothing-- Min x y ->- case (x,y) of- (K (Nat 0), _) -> Just zero- (K Inf, _) -> Just y- (_, K (Nat 0)) -> Just zero- (_, K Inf) -> Just x- (K a, K b) -> Just (K (IN.nMin a b))- _ | x == y -> Just x- _ -> Nothing-- Max x y ->- case (x,y) of- (K (Nat 0), _) -> Just y- (K Inf, _) -> Just inf- (_, K (Nat 0)) -> Just x- (_, K Inf) -> Just inf- (K a, K b) -> Just (K (IN.nMax a b))- _ | x == y -> Just x- _ -> Nothing-- Width x ->- case x of- K a -> Just (K (IN.nWidth a))- K (Nat 2) :^^ e -> Just (one :+ e)- K (Nat 2) :^^ e :- K (Nat 1) -> Just e- _ -> Nothing-- LenFromThen x y w ->- case (x,y,w) of- (K a, K b, K c) -> K `fmap` IN.nLenFromThen a b c- _ -> Nothing-- LenFromThenTo x y z ->- case (x,y,z) of- (K a, K b, K c) -> K `fmap` IN.nLenFromThenTo a b c- _ -> Nothing
src/Cryptol/TypeCheck/Solver/SMT.hs view
@@ -1,6 +1,34 @@+-- |+-- Module : Cryptol.TypeCheck.Solver.SMT+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable+{-# LANGUAGE Safe #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE FlexibleContexts #-} {-# Language FlexibleInstances #-}-module Cryptol.TypeCheck.Solver.SMT (proveImp,checkUnsolvable) where+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE TypeSynonymInstances #-} +module Cryptol.TypeCheck.Solver.SMT+ ( -- * Setup+ Solver+ , withSolver+ , isNumeric++ -- * Debugging+ , debugBlock+ , debugLog++ -- * Proving stuff+ , proveImp+ , checkUnsolvable+ , tryGetModel+ , shrinkModel+ ) where+ import SimpleSMT (SExpr) import qualified SimpleSMT as SMT import Data.Map ( Map )@@ -8,65 +36,258 @@ import qualified Data.Set as Set import Data.Maybe(catMaybes) import Data.List(partition)-import Control.Monad(msum,zipWithM)+import Control.Exception+import Control.Monad(msum,zipWithM,void)+import Data.Char(isSpace)+import Text.Read(readMaybe)+import qualified System.IO.Strict as StrictIO+import System.FilePath((</>))+import System.Directory(doesFileExist) +import Cryptol.Prelude(cryptolTcContents) import Cryptol.TypeCheck.Type-import Cryptol.TypeCheck.Solver.CrySAT import Cryptol.TypeCheck.InferTypes+import Cryptol.TypeCheck.Solver.InfNat(Nat'(..)) import Cryptol.TypeCheck.TypePat hiding ((~>),(~~>))+import Cryptol.TypeCheck.Subst(Subst) import Cryptol.Utils.Panic+import Cryptol.Utils.PP -- ( Doc ) +++-- | An SMT solver packed with a logger for debugging.+data Solver = Solver+ { solver :: SMT.Solver+ -- ^ The actual solver++ , logger :: SMT.Logger+ -- ^ For debugging+ }++-- | Execute a computation with a fresh solver instance.+withSolver :: SolverConfig -> (Solver -> IO a) -> IO a+withSolver SolverConfig{ .. } =+ bracket+ (do logger <- if solverVerbose > 0 then SMT.newLogger 0+ else return quietLogger+ 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"+ let sol = Solver { .. }+ loadTcPrelude sol solverPreludePath+ return sol)+ (\s -> void $ SMT.stop (solver s))++ where+ quietLogger = SMT.Logger { SMT.logMessage = \_ -> return ()+ , SMT.logLevel = return 0+ , SMT.logSetLevel= \_ -> return ()+ , SMT.logTab = return ()+ , SMT.logUntab = return ()+ }+++-- | Load the definitions used for type checking.+loadTcPrelude :: Solver -> [FilePath] {- ^ Search in this paths -} -> IO ()+loadTcPrelude s [] = loadString s cryptolTcContents+loadTcPrelude s (p : ps) =+ do let file = p </> "CryptolTC.z3"+ yes <- doesFileExist file+ if yes then loadFile s file+ else loadTcPrelude s ps+++loadFile :: Solver -> FilePath -> IO ()+loadFile s file = loadString s =<< StrictIO.readFile file++loadString :: Solver -> String -> IO ()+loadString s str = go (dropComments str)+ 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+++++--------------------------------------------------------------------------------+-- Debugging+++debugBlock :: Solver -> String -> IO a -> IO a+debugBlock s@Solver { .. } name m =+ do debugLog s name+ SMT.logTab logger+ a <- m+ SMT.logUntab logger+ return a++class DebugLog t where+ debugLog :: Solver -> t -> IO ()++ debugLogList :: Solver -> [t] -> IO ()+ debugLogList s ts = case ts of+ [] -> debugLog s "(none)"+ _ -> mapM_ (debugLog s) ts++instance DebugLog Char where+ debugLog s x = SMT.logMessage (logger s) (show x)+ debugLogList s x = SMT.logMessage (logger s) x++instance DebugLog a => DebugLog [a] where+ debugLog = debugLogList++instance DebugLog a => DebugLog (Maybe a) where+ debugLog s x = case x of+ Nothing -> debugLog s "(nothing)"+ Just a -> debugLog s a++instance DebugLog Doc where+ debugLog s x = debugLog s (show x)++instance DebugLog Type where+ debugLog s x = debugLog s (pp x)++instance DebugLog Goal where+ debugLog s x = debugLog s (goal x)++instance DebugLog Subst where+ debugLog s x = debugLog s (pp x)+--------------------------------------------------------------------------------+++++ -- | 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+ do let gs1 = concatMap flatGoal gs0+ (gs,rest) = partition (isNumeric . goal) gs1+ numAsmp = filter isNumeric (concatMap pSplitAnd ps) vs = Set.toList (fvs (numAsmp, map goal gs)) tvs <- debugBlock sol "VARIABLES" $- do SMT.push s- Map.fromList <$> zipWithM (declareVar s) [ 0 .. ] vs+ do SMT.push (solver sol)+ Map.fromList <$> zipWithM (declareVar sol) [ 0 .. ] vs debugBlock sol "ASSUMPTIONS" $- mapM_ (assume s tvs) numAsmp+ mapM_ (assume sol tvs) numAsmp gs' <- mapM (prove sol tvs) gs- SMT.pop s+ SMT.pop (solver sol) 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)+ do let ps = filter isNumeric+ $ map goal+ $ concatMap flatGoal gs0 vs = Set.toList (fvs ps) tvs <- debugBlock sol "VARIABLES" $- do SMT.push s- Map.fromList <$> zipWithM (declareVar s) [ 0 .. ] vs+ do push sol+ Map.fromList <$> zipWithM (declareVar sol) [ 0 .. ] vs ans <- unsolvable sol tvs ps- SMT.pop s+ pop sol return ans +tryGetModel :: Solver -> [TVar] -> [Prop] -> IO (Maybe [(TVar,Nat')])+tryGetModel sol as ps =+ debugBlock sol "TRY GET MODEL" $+ do push sol+ tvs <- Map.fromList <$> zipWithM (declareVar sol) [ 0 .. ] as+ mapM_ (assume sol tvs) ps+ sat <- SMT.check (solver sol)+ su <- case sat of+ SMT.Sat ->+ case as of+ [] -> return (Just [])+ _ -> do res <- SMT.getExprs (solver sol) (Map.elems tvs)+ let parse x = do e <- Map.lookup x tvs+ t <- parseNum =<< lookup e res+ return (x, t)+ return (mapM parse as)+ _ -> return Nothing+ pop sol+ return su++ where+ parseNum a+ | SMT.Other s <- a+ , SMT.List [con,val,isFin,isErr] <- s+ , SMT.Atom "mk-infnat" <- con+ , SMT.Atom "false" <- isErr+ , SMT.Atom fin <- isFin+ , SMT.Atom v <- val+ , Just n <- readMaybe v+ = Just (if fin == "false" then Inf else Nat n)++ parseNum _ = Nothing++shrinkModel :: Solver -> [TVar] -> [Prop] -> [(TVar,Nat')] -> IO [(TVar,Nat')]+shrinkModel sol as ps0 mdl = go [] ps0 mdl+ where+ go done ps ((x,Nat k) : more) =+ do k1 <- shrink1 ps x k+ go ((x,Nat k1) : done) ((tNum k1 >== TVar x) : ps) more++ go done ps ((x,i) : more) = go ((x,i) : done) ps more+ go done _ [] = return done++ shrink1 ps x k+ | k == 0 = return 0+ | otherwise =+ do let k1 = div k 2+ p1 = tNum k1 >== TVar x+ mb <- tryGetModel sol as (p1 : ps)+ case mb of+ Nothing -> return k+ Just newMdl ->+ case lookup x newMdl of+ Just (Nat k2) -> shrink1 ps x k2+ _ -> panic "shrink" ["model is missing variable", show x]+++ -------------------------------------------------------------------------------- -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)+push :: Solver -> IO ()+push sol = SMT.push (solver sol) -assume :: SMT.Solver -> TVars -> Prop -> IO ()-assume s tvs p = SMT.assert s (SMT.fun "cryAssume" [ toSMT tvs p ])+pop :: Solver -> IO ()+pop sol = SMT.pop (solver sol) ++declareVar :: 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 (solver s) name cryInfNat+ SMT.assert (solver s) (SMT.fun "cryVar" [ e ])+ return (v,e)++assume :: Solver -> TVars -> Prop -> IO ()+assume s tvs p = SMT.assert (solver 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+ do let s = solver sol+ push sol SMT.assert s (SMT.fun "cryProve" [ toSMT tvs (goal g) ]) res <- SMT.check s- SMT.pop s+ pop sol case res of SMT.Unsat -> return Nothing _ -> return (Just g)@@ -76,11 +297,10 @@ 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+ do SMT.push (solver sol)+ mapM_ (assume sol tvs) ps+ res <- SMT.check (solver sol)+ SMT.pop (solver sol) case res of SMT.Unsat -> return True _ -> return False@@ -89,13 +309,18 @@ -------------------------------------------------------------------------------- +-- | Split up the 'And' in a goal+flatGoal :: Goal -> [Goal]+flatGoal g = [ g { goal = p } | p <- pSplitAnd (goal g) ]+++-- | Assumes no 'And' isNumeric :: Prop -> Bool-isNumeric ty = matchDefault False- $ msum [ is (|=|), is (|>=|), is aFin, is aTrue, andNum ty ]+isNumeric ty = matchDefault False $ msum [ is (|=|), is (|/=|), is (|>=|), is aFin ] where- andNum t = anAdd t >>= \(x,y) -> return (isNumeric x && isNumeric y) is f = f ty >> return True + -------------------------------------------------------------------------------- type TVars = Map TVar SExpr@@ -112,6 +337,7 @@ , aFin ~> "cryFin" , (|=|) ~> "cryEq"+ , (|/=|) ~> "cryNeq" , (|>=|) ~> "cryGeq" , aAnd ~> "cryAnd" , aTrue ~> "cryTrue"@@ -125,6 +351,8 @@ , aMin ~> "cryMin" , aMax ~> "cryMax" , aWidth ~> "cryWidth"+ , aCeilDiv ~> "cryCeilDiv"+ , aCeilMod ~> "cryCeilMod" , aLenFromThen ~> "cryLenFromThen" , aLenFromThenTo ~> "cryLenFromThenTo"
src/Cryptol/TypeCheck/Solver/Selector.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.Selector -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -12,10 +12,10 @@ import Cryptol.TypeCheck.InferTypes import Cryptol.TypeCheck.Monad( InferM, unify, newGoals, lookupNewtype , newType, applySubst, solveHasGoal+ , newParamName ) import Cryptol.TypeCheck.Subst(listSubst,apSubst)-import Cryptol.Utils.Ident (Ident)-import Cryptol.Utils.PP(text,pp,ordinal,(<+>))+import Cryptol.Utils.Ident (Ident, packIdent) import Cryptol.Utils.Panic(panic) import Control.Monad(forM,guard)@@ -24,19 +24,19 @@ recordType :: [Ident] -> InferM Type recordType labels = do fields <- forM labels $ \l ->- do t <- newType (text "record field" <+> pp l) KType+ do t <- newType (TypeOfRecordField l) KType return (l,t) return (TRec fields) tupleType :: Int -> InferM Type tupleType n =- do fields <- mapM (\x -> newType (ordinal x <+> text "tuple field") KType)+ do fields <- mapM (\x -> newType (TypeOfTupleField x) KType) [ 0 .. (n-1) ] return (tTuple fields) listType :: Int -> InferM Type listType n =- do elems <- newType (text "sequence element type") KType+ do elems <- newType TypeOfSeqElement KType return (tSeq (tNum n) elems) @@ -50,7 +50,8 @@ cvt _ Nothing = return False cvt f (Just a) = do ty <- f a newGoals CtExactType =<< unify ty outerT- return True+ newT <- applySubst outerT+ return (newT /= outerT) {- | Compute the type of a field based on the selector.@@ -124,7 +125,10 @@ Nothing -> return (imped, False) Just innerT -> do newGoals CtExactType =<< unify innerT ft- solveHasGoal (hasName has) (`ESel` sel)+ oT <- applySubst outerT+ iT <- applySubst innerT+ selFrom <- mkSel sel oT iT+ solveHasGoal (hasName has) selFrom return (True, True) | otherwise = panic "hasGoalSolved"@@ -132,7 +136,43 @@ , show (hasGoal has) ] +{- | Generator an appropriate selector, once the "Has" constraint+has been discharged. The resulting selectors should always work+on their corresponding types (i.e., tuple selectros only select from tuples).+This function generates the code for lifting tuple/record selectors to sequences+and functions. +Assumes types are zonked. -}+mkSel :: Selector -> Type -> Type -> InferM (Expr -> Expr)+mkSel s outerT innerT =+ case tNoUser outerT of+ TCon (TC TCSeq) [len,el]+ | TupleSel {} <- s -> liftSeq len el+ | RecordSel {} <- s -> liftSeq len el++ TCon (TC TCFun) [t1,t2]+ | TupleSel {} <- s -> liftFun t1 t2+ | RecordSel {} <- s -> liftFun t1 t2++ _ -> return (\e -> ESel e s)++ where+ liftSeq len el =+ do x <- newParamName (packIdent "x")+ case tNoUser innerT of+ TCon _ [_,eli] ->+ do selFrom <- mkSel s el eli+ return $ \e -> EComp len eli (selFrom (EVar x))+ [[ From x len el e ]]+ _ -> panic "mkSel" [ "Unexpected inner seq type.", show innerT ]++ liftFun t1 t2 =+ do x <- newParamName (packIdent "x")+ case tNoUser innerT of+ TCon _ [_,inT] ->+ do selFrom <- mkSel s t2 inT+ return $ \e -> EAbs x t1 (selFrom (EApp e (EVar x)))+ _ -> panic "mkSel" [ "Unexpected inner fun type", show innerT ]
src/Cryptol/TypeCheck/Solver/Types.hs view
@@ -36,4 +36,4 @@ case res of SolvedIf ps -> text "solved" $$ nest 2 (vcat (map pp ps)) Unsolved -> text "unsolved"- Unsolvable e -> text "unsolvable" <> colon <+> text (tcErrorMessage e)+ Unsolvable e -> text "unsolvable" <.> colon <+> text (tcErrorMessage e)
src/Cryptol/TypeCheck/Solver/Utils.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Solver.Utils -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/TypeCheck/Subst.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Subst -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -43,6 +43,14 @@ import Cryptol.Utils.Panic(panic) import Cryptol.Utils.Misc(anyJust) +{- | Type 'Subst' has an invariant on its 'suMap' component: If there+is a mapping from @TVFree _ _ tps _@ to a type @t@, then @t@ must not+mention (directly or indirectly) any type parameter that is not in+@tps@. In particular, if @t@ contains a variable @TVFree _ _ tps2 _@,+then @tps2@ must be a subset of @tps@. This ensures that applying the+substitution will not permit any type parameter to escape from its+scope. -}+ data Subst = S { suMap :: !(Map.Map TVar Type) , suDefaulting :: !Bool }@@ -81,7 +89,7 @@ isEmptySubst :: Subst -> Bool isEmptySubst su = Map.null $ suMap su --- Returns the empty set if this is a deaulting substitution+-- Returns the empty set if this is a defaulting substitution substBinds :: Subst -> Set TVar substBinds su | suDefaulting su = Set.empty@@ -126,6 +134,8 @@ (TCMin,[t1,t2]) -> Simp.tMin t1 t2 (TCMax,[t1,t2]) -> Simp.tMax t1 t2 (TCWidth,[t1]) -> Simp.tWidth t1+ (TCCeilDiv,[t1,t2]) -> Simp.tCeilDiv t1 t2+ (TCCeilMod,[t1,t2]) -> Simp.tCeilMod t1 t2 (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]@@ -145,7 +155,7 @@ applySubstToVar :: Subst -> TVar -> Maybe Type applySubstToVar su x = case Map.lookup x (suMap su) of- Just t -> Just t+ Just t -> Just (if suDefaulting su then apSubst su t else t) Nothing | suDefaulting su -> Just $! defaultFreeVar x | otherwise -> Nothing@@ -217,32 +227,13 @@ } -{- | WARNING: This instance assumes that the quantified variables in the-types in the substitution will not get captured by the quantified variables.-This is reasonable because there should be no shadowing of quantified-variables but, just in case, we make a sanity check and panic if somehow-capture did occur. -}+{- | This instance does not need to worry about bound variable+capture, because we rely on the 'Subst' datatype invariant to ensure+that variable scopes will be properly preserved. -} instance TVars Schema where- apSubst su sch@(Forall xs ps 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 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- subVars = Set.unions- $ map (fvs . applySubstToVar su)- $ Set.toList used-+ apSubst su (Forall xs ps t) = Forall xs (concatMap pSplitAnd (apSubst su ps))+ (apSubst su t) instance TVars Expr where apSubst su = go@@ -253,7 +244,20 @@ EAbs x t e1 -> EAbs x (apSubst su t) (go e1) ETAbs a e -> ETAbs a (go e) ETApp e t -> ETApp (go e) (apSubst su t)- EProofAbs p e -> EProofAbs (apSubst su p) (go e)+ EProofAbs p e -> EProofAbs hmm (go e)+ where hmm = case pSplitAnd (apSubst su p) of+ [p1] -> p1+ res -> panic "apSubst@EProofAbs"+ [ "Predicate split or disappeared after"+ , "we applied a substitution."+ , "Predicate:"+ , show (pp p)+ , "Became:"+ , show (map pp res)+ , "subst:"+ , show (pp su)+ ]+ EProofApp e -> EProofApp (go e) EVar {} -> expr
src/Cryptol/TypeCheck/Type.hs view
@@ -1,41 +1,38 @@ {-# Language Safe, DeriveGeneric, DeriveAnyClass, RecordWildCards #-} {-# Language FlexibleInstances, FlexibleContexts #-} {-# Language PatternGuards #-}+{-# Language OverloadedStrings #-} module Cryptol.TypeCheck.Type- (module Cryptol.TypeCheck.Type, TFun(..)) where+ ( module Cryptol.TypeCheck.Type+ , module Cryptol.Prims.Syntax+ ) 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.Parser.Selector+import Cryptol.Parser.Fixity+import Cryptol.Parser.Position(Range,emptyRange) 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)+import Prelude 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)@@ -43,11 +40,53 @@ -- | Type parameters. data TParam = TParam { tpUnique :: !Int -- ^ Parameter identifier , tpKind :: Kind -- ^ Kind of parameter- , tpName :: Maybe Name -- ^ Name from source, if any.+ , tpFlav :: TPFlavor+ -- ^ What sort of type parameter is this+ , tpInfo :: !TVarInfo+ -- ^ A description for better messages. }- deriving (Show, Generic, NFData)+ deriving (Generic, NFData, Show) +data TPFlavor = TPModParam Name+ | TPOther (Maybe Name)+ deriving (Generic, NFData, Show) +tMono :: Type -> Schema+tMono = Forall [] []++isMono :: Schema -> Maybe Type+isMono s =+ case s of+ Forall [] [] t -> Just t+ _ -> Nothing++++schemaParam :: Name -> TPFlavor+schemaParam x = TPOther (Just x)++tySynParam :: Name -> TPFlavor+tySynParam x = TPOther (Just x)++propSynParam :: Name -> TPFlavor+propSynParam x = TPOther (Just x)++newtypeParam :: Name -> TPFlavor+newtypeParam x = TPOther (Just x)++modTyParam :: Name -> TPFlavor+modTyParam = TPModParam+++tpfName :: TPFlavor -> Maybe Name+tpfName f =+ case f of+ TPModParam x -> Just x+ TPOther x -> x++tpName :: TParam -> Maybe Name+tpName = tpfName . tpFlav+ -- | The internal representation of types. -- These are assumed to be kind correct. data Type = TCon !TCon ![Type]@@ -71,67 +110,66 @@ -- | Type variables.-data TVar = TVFree !Int Kind (Set TVar) Doc+data TVar = TVFree !Int Kind (Set TParam) TVarInfo -- ^ Unique, kind, ids of bound type variables that are in scope- -- The `Doc` is a description of how this type came to be.+ -- The last field gives us some infor for nicer warnings/errors. - | TVBound !Int Kind+ | TVBound {-# UNPACK #-} !TParam deriving (Show, Generic, NFData) +tvInfo :: TVar -> TVarInfo+tvInfo tv =+ case tv of+ TVFree _ _ _ d -> d+ TVBound tp -> tpInfo tp --- | The type is supposed to be of kind `KProp`-type Prop = Type+data TVarInfo = TVarInfo { tvarSource :: Range -- ^ Source code that gave rise+ , tvarDesc :: TVarSource -- ^ Description+ }+ deriving (Show, Generic, NFData) --- | Type constants.-data TCon = TC TC | PC PC | TF TFun | TError Kind TCErrorMessage- deriving (Show, Eq, Ord, Generic, NFData)+data TVarSource = TVFromModParam Name -- ^ Name of module parameter+ | TVFromSignature Name -- ^ A variable in a signature+ | TypeWildCard+ | TypeOfRecordField Ident+ | TypeOfTupleField Int+ | TypeOfSeqElement+ | LenOfSeq+ | TypeParamInstNamed {-Fun-}Name {-Param-}Ident+ | TypeParamInstPos {-Fun-}Name {-Pos (from 1)-}Int+ | DefinitionOf Name+ | LenOfCompGen+ | TypeOfArg (Maybe Int)+ | TypeOfRes+ | TypeErrorPlaceHolder+ deriving (Show, Generic, NFData) +-- | Get the names of something that is related to the tvar.+tvSourceName :: TVarSource -> Maybe Name+tvSourceName tvs =+ case tvs of+ TVFromModParam x -> Just x+ TVFromSignature x -> Just x+ TypeParamInstNamed x _ -> Just x+ TypeParamInstPos x _ -> Just x+ DefinitionOf x -> Just x+ _ -> Nothing --- | Predicate symbols.-data PC = PEqual -- ^ @_ == _@- | PNeq -- ^ @_ /= _@- | PGeq -- ^ @_ >= _@- | PFin -- ^ @fin _@+-- | The type is supposed to be of kind `KProp`+type Prop = Type - -- 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+ , tsDoc :: !(Maybe String) -- ^ Documentation } deriving (Show, Generic, NFData) @@ -144,6 +182,7 @@ , ntParams :: [TParam] , ntConstraints :: [Prop] , ntFields :: [(Ident,Type)]+ , ntDoc :: Maybe String } deriving (Show, Generic, NFData) @@ -152,62 +191,9 @@ -------------------------------------------------------------------------------- -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+ kindOf (TVBound tp) = kindOf tp instance HasKind Type where kindOf ty =@@ -218,7 +204,7 @@ TRec {} -> KType instance HasKind TySyn where- kindOf (TySyn _ as _ t) = foldr (:->) (kindOf t) (map kindOf as)+ kindOf ts = foldr (:->) (kindOf (tsDef ts)) (map kindOf (tsParams ts)) instance HasKind Newtype where kindOf nt = foldr (:->) KType (map kindOf (ntParams nt))@@ -277,7 +263,7 @@ compare x y = compare (tpUnique x) (tpUnique y) tpVar :: TParam -> TVar-tpVar p = TVBound (tpUnique p) (tpKind p)+tpVar p = TVBound p -- | The type is "simple" (i.e., it contains no type functions). type SType = Type@@ -292,16 +278,8 @@ 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+ TVBound x == TVBound y = x == y TVFree x _ _ _ == TVFree y _ _ _ = x == y _ == _ = False @@ -310,7 +288,7 @@ compare (TVFree _ _ _ _) _ = LT compare _ (TVFree _ _ _ _) = GT - compare (TVBound x _) (TVBound y _) = compare x y+ compare (TVBound x) (TVBound y) = compare x y -------------------------------------------------------------------------------- -- Queries@@ -363,11 +341,26 @@ TCon (TC TCBit) [] -> True _ -> False +tIsInteger :: Type -> Bool+tIsInteger ty = case tNoUser ty of+ TCon (TC TCInteger) [] -> True+ _ -> False++tIsIntMod :: Type -> Maybe Type+tIsIntMod ty = case tNoUser ty of+ TCon (TC TCIntMod) [n] -> Just n+ _ -> Nothing+ tIsTuple :: Type -> Maybe [Type] tIsTuple ty = case tNoUser ty of TCon (TC (TCTuple _)) ts -> Just ts _ -> Nothing +tIsRec :: Type -> Maybe [(Ident, Type)]+tIsRec ty = case tNoUser ty of+ TRec fs -> Just fs+ _ -> Nothing+ tIsBinFun :: TFun -> Type -> Maybe (Type,Type) tIsBinFun f ty = case tNoUser ty of TCon (TF g) [a,b] | f == g -> Just (a,b)@@ -396,6 +389,16 @@ TCon (PC PEqual) [t1,t2] -> Just (t1,t2) _ -> Nothing +pIsZero :: Prop -> Maybe Type+pIsZero ty = case tNoUser ty of+ TCon (PC PZero) [t1] -> Just t1+ _ -> Nothing++pIsLogic :: Prop -> Maybe Type+pIsLogic ty = case tNoUser ty of+ TCon (PC PLogic) [t1] -> Just t1+ _ -> Nothing+ pIsArith :: Prop -> Maybe Type pIsArith ty = case tNoUser ty of TCon (PC PArith) [t1] -> Just t1@@ -406,6 +409,16 @@ TCon (PC PCmp) [t1] -> Just t1 _ -> Nothing +pIsSignedCmp :: Prop -> Maybe Type+pIsSignedCmp ty = case tNoUser ty of+ TCon (PC PSignedCmp) [t1] -> Just t1+ _ -> Nothing++pIsLiteral :: Prop -> Maybe (Type, Type)+pIsLiteral ty = case tNoUser ty of+ TCon (PC PLiteral) [t1, t2] -> Just (t1, t2)+ _ -> Nothing+ pIsTrue :: Prop -> Bool pIsTrue ty = case tNoUser ty of TCon (PC PTrue) _ -> True@@ -442,6 +455,12 @@ tBit :: Type tBit = TCon (TC TCBit) [] +tInteger :: Type+tInteger = TCon (TC TCInteger) []++tIntMod :: Type -> Type+tIntMod n = TCon (TC TCIntMod) [n]+ tWord :: Type -> Type tWord a = tSeq a tBit @@ -517,9 +536,12 @@ tMin :: Type -> Type -> Type tMin = tf2 TCMin -tWidth :: Type -> Type-tWidth = tf1 TCWidth+tCeilDiv :: Type -> Type -> Type+tCeilDiv = tf2 TCCeilDiv +tCeilMod :: Type -> Type -> Type+tCeilMod = tf2 TCCeilMod+ tLenFromThen :: Type -> Type -> Type -> Type tLenFromThen = tf3 TCLenFromThen @@ -543,12 +565,24 @@ (=/=) :: Type -> Type -> Prop x =/= y = TCon (PC PNeq) [x,y] +pZero :: Type -> Prop+pZero t = TCon (PC PZero) [t]++pLogic :: Type -> Prop+pLogic t = TCon (PC PLogic) [t]+ pArith :: Type -> Prop pArith t = TCon (PC PArith) [t] pCmp :: Type -> Prop pCmp t = TCon (PC PCmp) [t] +pSignedCmp :: Type -> Prop+pSignedCmp t = TCon (PC PSignedCmp) [t]++pLiteral :: Type -> Type -> Prop+pLiteral x y = TCon (PC PLiteral) [x, y]+ -- | Make a greater-than-or-equal-to constraint. (>==) :: Type -> Type -> Prop x >== y = TCon (PC PGeq) [x,y]@@ -594,6 +628,8 @@ -------------------------------------------------------------------------------- +noFreeVariables :: FVS t => t -> Bool+noFreeVariables = all (not . isFreeTV) . Set.toList . fvs class FVS t where fvs :: t -> Set TVar@@ -603,17 +639,17 @@ where go ty = case ty of- TCon _ ts -> Set.unions (map go ts)+ TCon _ ts -> fvs ts TVar x -> Set.singleton x TUser _ _ t -> go t- TRec fs -> Set.unions (map (go . snd) fs)+ TRec fs -> fvs (map 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)+ 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)@@ -625,6 +661,8 @@ ++ -- Pretty Printing ------------------------------------------------------------- instance PP TParam where@@ -635,13 +673,19 @@ addTNames :: [TParam] -> NameMap -> NameMap addTNames as ns = foldr (uncurry IntMap.insert) ns- $ named ++ zip unnamed avail+ $ named ++ zip unnamed_nums numNames+ ++ zip unnamed_vals valNames - 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 ]+ where avail xs = filter (`notElem` used) (nameList xs)+ numNames = avail ["n","m","i","j","k"]+ valNames = avail ["a","b","c","d","e"] + nm x = (tpUnique x, tpName x, tpKind x)++ named = [ (u,show (pp n)) | (u,Just n,_) <- map nm as ]+ unnamed_nums = [ u | (u,Nothing,KNum) <- map nm as ]+ unnamed_vals = [ u | (u,Nothing,KType) <- map nm as ]+ used = map snd named ++ IntMap.elems ns ppNewtypeShort :: Newtype -> Doc@@ -656,8 +700,12 @@ ppPrec = ppWithNamesPrec IntMap.empty instance PP (WithNames Schema) where- ppPrec _ (WithNames s ns) = vars <+> props <+> ppWithNames ns1 (sType s)+ ppPrec _ (WithNames s ns)+ | null (sVars s) && null (sProps s) = body+ | otherwise = hang (vars <+> props) 2 body where+ body = ppWithNames ns1 (sType s)+ vars = case sVars s of [] -> empty vs -> braces $ commaSep $ map (ppWithNames ns1) vs@@ -672,12 +720,24 @@ 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+ ppPrec _ (WithNames ts ns) =+ text "type" <+> ctr <+> pp (tsName ts) <+>+ sep (map (ppWithNames ns1) (tsParams ts)) <+> char '='+ <+> ppWithNames ns1 (tsDef ts)+ where ns1 = addTNames (tsParams ts) ns+ ctr = case kindResult (kindOf ts) of+ KProp -> text "constraint"+ _ -> empty +instance PP Newtype where+ ppPrec = ppWithNamesPrec IntMap.empty +instance PP (WithNames Newtype) where+ ppPrec _ (WithNames nt _) = ppNewtypeShort nt -- XXX: do the full thing?++++ instance PP (WithNames Type) where ppPrec prec ty0@(WithNames ty nmMap) = case ty of@@ -692,10 +752,12 @@ (TCNum n, []) -> integer n (TCInf, []) -> text "inf" (TCBit, []) -> text "Bit"+ (TCInteger, []) -> text "Integer"+ (TCIntMod, [n]) -> optParens (prec > 3) $ text "Z" <+> go 4 n (TCSeq, [t1,TCon (TC TCBit) []]) -> brackets (go 0 t1) (TCSeq, [t1,t2]) -> optParens (prec > 3)- $ brackets (go 0 t1) <> go 3 t2+ $ brackets (go 0 t1) <.> go 3 t2 (TCFun, [t1,t2]) -> optParens (prec > 1) $ go 2 t1 <+> text "->" <+> go 1 t2@@ -707,7 +769,7 @@ 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+ (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"@@ -715,6 +777,8 @@ (PArith, [t1]) -> pp pc <+> go 4 t1 (PCmp, [t1]) -> pp pc <+> go 4 t1+ (PSignedCmp, [t1]) -> pp pc <+> go 4 t1+ (PLiteral, [t1,t2]) -> pp pc <+> go 4 t1 <+> go 4 t2 (_, _) -> pp pc <+> fsep (map (go 4) ts) @@ -730,73 +794,89 @@ isTInfix (WithNames (TCon (TF ieOp) [ieLeft',ieRight']) _) = do let ieLeft = WithNames ieLeft' nmMap ieRight = WithNames ieRight' nmMap- (ieAssoc,iePrec) <- Map.lookup ieOp tBinOpPrec+ pt <- primTyFromTF ieOp+ fi <- primTyFixity pt+ let ieAssoc = fAssoc fi+ iePrec = fLevel fi 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+ ppPrec _ (WithNames (TVBound x) mp) =+ case IntMap.lookup (tpUnique x) mp of Just a -> text a- Nothing -> text ("a`" ++ show x)+ Nothing ->+ case tpFlav x of+ TPModParam n -> ppPrefixName n+ TPOther (Just n) -> pp n <.> "`" <.> int (tpUnique x)+ _ -> pickTVarName (tpKind x) (tvarDesc (tpInfo x)) (tpUnique x) - ppPrec _ (WithNames (TVFree x _ _ _) _) =- char '?' <> text (intToName x)+ ppPrec _ (WithNames (TVFree x k _ d) _) =+ char '?' <.> pickTVarName k (tvarDesc d) x +pickTVarName :: Kind -> TVarSource -> Int -> Doc+pickTVarName k src uni =+ text $+ case src of+ TVFromModParam n -> using n+ TVFromSignature n -> using n+ TypeWildCard -> mk $ case k of+ KNum -> "n"+ _ -> "a"+ TypeOfRecordField i -> using i+ TypeOfTupleField n -> mk ("tup_" ++ show n)+ TypeOfSeqElement -> mk "a"+ LenOfSeq -> mk "n"+ TypeParamInstNamed _ i -> using i+ TypeParamInstPos f n -> mk (sh f ++ "_" ++ show n)+ DefinitionOf x -> using x+ LenOfCompGen -> mk "n"+ TypeOfArg mb -> mk (case mb of+ Nothing -> "arg"+ Just n -> "arg_" ++ show n)+ TypeOfRes -> "res"+ TypeErrorPlaceHolder -> "err"+ where+ sh a = show (pp a)+ using a = mk (sh a)+ mk a = a ++ "`" ++ show uni+ 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 TVarInfo where+ ppPrec _ tvinfo = pp (tvarDesc tvinfo) <+> loc+ where+ loc = if rng == emptyRange then empty else "at" <+> pp rng+ rng = tvarSource tvinfo -instance PP UserTC where- ppPrec p (UserTC x _) = ppPrec p x+instance PP TVarSource where+ ppPrec _ tvsrc =+ case tvsrc of+ TVFromModParam m -> "module parameter" <+> pp m+ TVFromSignature x -> "signature variable" <+> quotes (pp x)+ TypeWildCard -> "type wildcard (_)"+ TypeOfRecordField l -> "type of field" <+> quotes (pp l)+ TypeOfTupleField n -> "type of" <+> ordinal n <+> "tuple field"+ TypeOfSeqElement -> "type of sequence member"+ LenOfSeq -> "length of sequence"+ TypeParamInstNamed f i -> "type argument" <+> quotes (pp i) <+>+ "of" <+> quotes (pp f)+ TypeParamInstPos f i -> ordinal i <+> "type argument of" <+>+ quotes (pp f)+ DefinitionOf x -> "the type of" <+> quotes (pp x)+ LenOfCompGen -> "length of comprehension generator"+ TypeOfArg mb ->+ case mb of+ Nothing -> "type of function argument"+ Just n -> "type of" <+> ordinal n <+> "function argument"+ TypeOfRes -> "type of function result"+ TypeErrorPlaceHolder -> "type error place-holder"
src/Cryptol/TypeCheck/TypeMap.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.TypeMap -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/TypeCheck/TypeOf.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.TypeOf -- Copyright : (c) 2014-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -65,10 +65,19 @@ ETAbs tparam e -> case fastSchemaOf tyenv e of Forall tparams props ty -> Forall (tparam : tparams) props ty ETApp e t -> case fastSchemaOf tyenv e of- Forall (tparam : tparams) props ty -> Forall tparams (apSubst s props) (apSubst s ty)- where s = singleSubst (tpVar tparam) t+ Forall (tparam : tparams) props ty+ -> Forall tparams (map (plainSubst s) props) (plainSubst s ty)+ where s = singleSubst (tpVar tparam) t _ -> panic "Cryptol.TypeCheck.TypeOf.fastSchemaOf" [ "ETApp body with no type parameters" ]+ -- When calling 'fastSchemaOf' on a+ -- polymorphic function with instantiated type+ -- variables but undischarged type+ -- constraints, we would prefer to see the+ -- instantiated constraints in an+ -- un-simplified form. Thus we use+ -- 'plainSubst' instead of 'apSubst' on the+ -- type constraints. EProofAbs p e -> case fastSchemaOf tyenv e of Forall [] props ty -> Forall [] (p : props) ty _ -> panic "Cryptol.TypeCheck.TypeOf.fastSchemaOf"@@ -94,6 +103,17 @@ EAbs {} -> monomorphic where monomorphic = Forall [] [] (fastTypeOf tyenv expr)++-- | Apply a substitution to a type *without* simplifying+-- constraints like @Arith [n]a@ to @Arith a@. (This is in contrast to+-- 'apSubst', which performs simplifications wherever possible.)+plainSubst :: Subst -> Type -> Type+plainSubst s ty =+ case ty of+ TCon tc ts -> TCon tc (map (plainSubst s) ts)+ TUser f ts t -> TUser f (map (plainSubst s) ts) (plainSubst s t)+ TRec fs -> TRec [ (x, plainSubst s t) | (x, t) <- fs ]+ TVar x -> apSubst s (TVar x) -- | Yields the return type of the selector on the given argument type. typeSelect :: Type -> Selector -> Type
src/Cryptol/TypeCheck/TypePat.hs view
@@ -4,14 +4,19 @@ , anAdd, (|-|), aMul, (|^|), (|/|), (|%|) , aMin, aMax , aWidth+ , aCeilDiv, aCeilMod , aLenFromThen, aLenFromThenTo + , aLiteral, aLogic+ , aTVar+ , aFreeTVar , aBit , aSeq , aWord , aChar , aTuple+ , aRec , (|->|) , aFin, (|=|), (|/=|), (|>=|)@@ -27,6 +32,7 @@ import Control.Applicative((<|>)) import Control.Monad+import Cryptol.Utils.Ident (Ident) import Cryptol.Utils.Patterns import Cryptol.TypeCheck.Type import Cryptol.TypeCheck.Solver.InfNat@@ -100,6 +106,12 @@ aWidth :: Pat Type Type aWidth = tf TCWidth ar1 +aCeilDiv :: Pat Type (Type,Type)+aCeilDiv = tf TCCeilDiv ar2++aCeilMod :: Pat Type (Type,Type)+aCeilMod = tf TCCeilMod ar2+ aLenFromThen :: Pat Type (Type,Type,Type) aLenFromThen = tf TCLenFromThen ar3 @@ -112,6 +124,12 @@ TVar x -> return x _ -> mzero +aFreeTVar :: Pat Type TVar+aFreeTVar t =+ do v <- aTVar t+ guard (isFreeTV v)+ return v+ aBit :: Pat Type () aBit = tc TCBit ar0 @@ -134,6 +152,11 @@ TCon (TC (TCTuple _)) ts -> return ts _ -> mzero +aRec :: Pat Type [(Ident, Type)]+aRec = \a -> case tNoUser a of+ TRec fs -> return fs+ _ -> mzero+ (|->|) :: Pat Type (Type,Type) (|->|) = tc TCFun ar2 --------------------------------------------------------------------------------@@ -161,6 +184,12 @@ aTrue :: Pat Prop () aTrue = tp PTrue ar0++aLiteral :: Pat Prop (Type,Type)+aLiteral = tp PLiteral ar2++aLogic :: Pat Prop Type+aLogic = tp PLogic ar1 -------------------------------------------------------------------------------- anError :: Kind -> Pat Type TCErrorMessage
src/Cryptol/TypeCheck/Unify.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.TypeCheck.Unify -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -13,8 +13,8 @@ import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Subst-import Cryptol.Utils.Panic (panic) +import Control.Monad.Writer (Writer, writer, runWriter) import Data.Ord(comparing) import Data.List(sortBy) import qualified Data.Set as Set@@ -26,34 +26,21 @@ -- on bound variables. type MGU = (Subst,[Prop]) -data Result a = OK a | Error UnificationError- deriving (Functor)+type Result a = Writer [UnificationError] a +runResult :: Result a -> (a, [UnificationError])+runResult = runWriter+ data UnificationError = UniTypeMismatch Type Type | UniKindMismatch Kind Kind | UniTypeLenMismatch Int Int | UniRecursive TVar Type- | UniNonPolyDepends TVar [TVar]+ | UniNonPolyDepends TVar [TParam] | UniNonPoly TVar Type -instance Applicative Result where- pure = OK-- OK f <*> OK x = OK (f x)- OK _ <*> Error e = Error e- Error e <*> _ = Error e--instance Monad Result where- return a = OK a-- OK a >>= k = k a- Error x >>= _ = Error x-- fail x = panic "Cryptol.TypeCheck.Unify.fail" [x]--uniError :: UnificationError -> Result a-uniError e = Error e+uniError :: UnificationError -> Result MGU+uniError e = writer (emptyMGU, [e]) emptyMGU :: MGU@@ -116,20 +103,29 @@ bindVar v@(TVBound {}) (tNoUser -> TVar v1@(TVFree {})) = bindVar v1 (TVar v) -bindVar v@(TVBound _ k) t+bindVar v@(TVBound {}) t | k == kindOf t = if k == KNum then return (emptySubst, [TVar v =#= t]) else uniError $ UniNonPoly v t | otherwise = uniError $ UniKindMismatch k (kindOf t)+ where k = kindOf v +bindVar x@(TVFree _ _ xscope _) (TVar y@(TVFree _ _ yscope _))+ | xscope `Set.isProperSubsetOf` yscope = return (singleSubst y (TVar x), []) bindVar x@(TVFree _ k inScope _d) t | not (k == kindOf t) = uniError $ UniKindMismatch k (kindOf t) | recTy && k == KType = uniError $ UniRecursive x t- | not (Set.null escaped) = uniError $ UniNonPolyDepends x$ Set.toList escaped+ | not (Set.null escaped) = uniError $ UniNonPolyDepends x $ Set.toList escaped | recTy = return (emptySubst, [TVar x =#= t]) | otherwise = return (singleSubst x t, []) where- vs = fvs t- escaped = Set.filter isBoundTV vs `Set.difference` inScope- recTy = x `Set.member` vs+ escaped = freeParams t `Set.difference` inScope+ recTy = x `Set.member` fvs t+++freeParams :: FVS t => t -> Set.Set TParam+freeParams x = Set.unions (map params (Set.toList (fvs x)))+ where+ params (TVFree _ _ tps _) = tps+ params (TVBound tp) = Set.singleton tp
src/Cryptol/Utils/Debug.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Utils.Debug -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/Utils/Ident.hs view
@@ -1,15 +1,43 @@ -- |--- Module : $Header$+-- Module : Cryptol.Utils.Ident -- Copyright : (c) 2015-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable -{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveGeneric, OverloadedStrings #-} -module Cryptol.Utils.Ident where+module Cryptol.Utils.Ident+ ( -- * Module names+ ModName+ , modNameToText+ , textToModName+ , modNameChunks+ , packModName+ , preludeName+ , interactiveName+ , noModuleName+ , exprModName + , isParamInstModName+ , paramInstModName+ , notParamInstModName++ -- * Identifiers+ , Ident+ , packIdent+ , packInfix+ , unpackIdent+ , mkIdent+ , mkInfix+ , isInfixIdent+ , nullIdent+ , identText+ , modParamIdent++ ) where+ import Control.DeepSeq (NFData) import Data.Char (isSpace) import Data.List (unfoldr)@@ -19,25 +47,71 @@ -- | Module names are just text.-type ModName = T.Text+data ModName = ModName T.Text+ deriving (Eq,Ord,Show,Generic) -unpackModName :: ModName -> [String]-unpackModName = unfoldr step+instance NFData ModName++modNameToText :: ModName -> T.Text+modNameToText (ModName x) = x++textToModName :: T.Text -> ModName+textToModName = ModName++modNameChunks :: ModName -> [String]+modNameChunks = unfoldr step . modNameToText . notParamInstModName where step str | T.null str = Nothing | otherwise = case T.breakOn modSep str of (a,b) -> Just (T.unpack a,T.drop (T.length modSep) b) -packModName :: [String] -> ModName-packModName strs = T.intercalate modSep (map (trim . T.pack) strs)+isParamInstModName :: ModName -> Bool+isParamInstModName (ModName x) = modInstPref `T.isPrefixOf` x++-- | Convert a parameterized module's name to the name of the module+-- containing the same definitions but with explicit parameters on each+-- definition.+paramInstModName :: ModName -> ModName+paramInstModName (ModName x)+ | modInstPref `T.isPrefixOf` x = ModName x+ | otherwise = ModName (T.append modInstPref x)+++notParamInstModName :: ModName -> ModName+notParamInstModName (ModName x)+ | modInstPref `T.isPrefixOf` x = ModName (T.drop (T.length modInstPref) x)+ | otherwise = ModName x+++packModName :: [T.Text] -> ModName+packModName strs = textToModName (T.intercalate modSep (map trim strs)) where -- trim space off of the start and end of the string trim str = T.dropWhile isSpace (T.dropWhileEnd isSpace str) modSep :: T.Text-modSep = T.pack "::"+modSep = "::" +modInstPref :: T.Text+modInstPref = "`"+++preludeName :: ModName+preludeName = packModName ["Cryptol"]++interactiveName :: ModName+interactiveName = packModName ["<interactive>"]++noModuleName :: ModName+noModuleName = packModName ["<none>"]++exprModName :: ModName+exprModName = packModName ["<expr>"]+++--------------------------------------------------------------------------------+ -- | Identifiers, along with a flag that indicates whether or not they're infix -- operators. The boolean is present just as cached information from the lexer, -- and never used during comparisons.@@ -80,14 +154,8 @@ identText :: Ident -> T.Text identText (Ident _ t) = t +modParamIdent :: Ident -> Ident+modParamIdent (Ident x t) = Ident x (T.append (T.pack "module parameter ") t) --- Frequently Used Names ------------------------------------------------------- -preludeName :: ModName-preludeName = packModName ["Cryptol"] -preludeExtrasName :: ModName-preludeExtrasName = packModName ["Cryptol", "Extras"]--interactiveName :: ModName-interactiveName = packModName ["<interactive>"]
+ src/Cryptol/Utils/Logger.hs view
@@ -0,0 +1,57 @@+-- | A simple system so that the Cryptol driver can communicate+-- with users (or not).+module Cryptol.Utils.Logger+ ( Logger++ , stdoutLogger+ , stderrLogger+ , handleLogger+ , quietLogger+ , funLogger++ , logPutStr+ , logPutStrLn+ , logPrint+ ) where++import System.IO(Handle, hPutStr, stdout, stderr)+import Control.DeepSeq(NFData(..))++-- | A logger provides simple abstraction for sending messages.+newtype Logger = Logger (String -> IO ())++instance NFData Logger where+ rnf (Logger x) = rnf x++-- | Send the given string to the log.+logPutStr :: Logger -> String -> IO ()+logPutStr (Logger f) = f++-- | Send the given string with a newline at the end.+logPutStrLn :: Logger -> String -> IO ()+logPutStrLn l s = logPutStr l (s ++ "\n")++-- | Send the given value using its 'Show' instance.+-- Adds a newline at the end.+logPrint :: Show a => Logger -> a -> IO ()+logPrint l a = logPutStrLn l (show a)++-- | A logger that ignores all messages.+quietLogger :: Logger+quietLogger = Logger (const (return ()))++-- | Log to the given handle.+handleLogger :: Handle -> Logger+handleLogger h = Logger (hPutStr h)++-- | Log to stdout.+stdoutLogger :: Logger+stdoutLogger = handleLogger stdout++-- | Log to stderr.+stderrLogger :: Logger+stderrLogger = handleLogger stderr++-- | Just use this function for logging.+funLogger :: (String -> IO ()) -> Logger+funLogger = Logger
src/Cryptol/Utils/Misc.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Utils.Misc -- Copyright : (c) 2014-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/Cryptol/Utils/PP.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Utils.PP -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com@@ -17,6 +17,7 @@ import Control.DeepSeq import Control.Monad (mplus) import Data.Maybe (fromMaybe)+import qualified Data.Semigroup as S import Data.String (IsString(..)) import qualified Data.Text as T import GHC.Generics (Generic)@@ -27,9 +28,10 @@ -- Name Displaying ------------------------------------------------------------- --- | How to display names, inspired by the GHC `Outputable` module. Getting a--- value of 'Nothing' from the NameDisp function indicates that the name is not--- in scope.+{- | How to display names, inspired by the GHC `Outputable` module.+Getting a value of 'Nothing' from the NameDisp function indicates+that the display has no opinion on how this name should be displayed,+and some other display should be tried out. -} data NameDisp = EmptyNameDisp | NameDisp (ModName -> Ident -> Maybe NameFormat) deriving (Generic, NFData)@@ -37,14 +39,15 @@ instance Show NameDisp where show _ = "<NameDisp>" +instance S.Semigroup NameDisp where+ NameDisp f <> NameDisp g = NameDisp (\m n -> f m n `mplus` g m n)+ EmptyNameDisp <> EmptyNameDisp = EmptyNameDisp+ EmptyNameDisp <> x = x+ x <> _ = x+ instance Monoid NameDisp where mempty = EmptyNameDisp-- mappend (NameDisp f) (NameDisp g) = NameDisp (\m n -> f m n `mplus` g m n)- mappend EmptyNameDisp EmptyNameDisp = EmptyNameDisp- mappend EmptyNameDisp x = x- mappend x _ = x-+ mappend = (S.<>) data NameFormat = UnQualified | Qualified !ModName@@ -63,10 +66,10 @@ neverQualify :: NameDisp neverQualify = NameDisp $ \ _ _ -> Just UnQualified -fmtModName :: ModName -> NameFormat -> ModName+fmtModName :: ModName -> NameFormat -> T.Text fmtModName _ UnQualified = T.empty-fmtModName _ (Qualified mn) = mn-fmtModName mn NotInScope = mn+fmtModName _ (Qualified mn) = modNameToText mn+fmtModName mn NotInScope = modNameToText mn -- | Compose two naming environments, preferring names from the left -- environment.@@ -92,9 +95,12 @@ newtype Doc = Doc (NameDisp -> PJ.Doc) deriving (Generic, NFData) +instance S.Semigroup Doc where+ (<>) = liftPJ2 (PJ.<>)+ instance Monoid Doc where mempty = liftPJ PJ.empty- mappend = liftPJ2 (PJ.<>)+ mappend = (S.<>) runDoc :: NameDisp -> Doc -> PJ.Doc runDoc names (Doc f) = f names@@ -170,7 +176,7 @@ -- | Display a numeric values as an ordinar (e.g., 2nd) ordinal :: (Integral a, Show a, Eq a) => a -> Doc-ordinal x = text (show x) <> text (ordSuffix x)+ordinal x = text (show x) <.> text (ordSuffix x) -- | The suffix to use when displaying a number as an oridinal ordSuffix :: (Integral a, Eq a) => a -> String@@ -201,10 +207,10 @@ liftSep :: ([PJ.Doc] -> PJ.Doc) -> ([Doc] -> Doc) liftSep f ds = Doc (\e -> f [ d e | Doc d <- ds ]) -infixl 6 <>, <+>+infixl 6 <.>, <+> -(<>) :: Doc -> Doc -> Doc-(<>) = liftPJ2 (PJ.<>)+(<.>) :: Doc -> Doc -> Doc+(<.>) = liftPJ2 (PJ.<>) (<+>) :: Doc -> Doc -> Doc (<+>) = liftPJ2 (PJ.<+>)@@ -251,7 +257,7 @@ punctuate p = go where go (d:ds) | null ds = [d]- | otherwise = d <> p : go ds+ | otherwise = d <.> p : go ds go [] = [] text :: String -> Doc@@ -280,3 +286,7 @@ instance PP Ident where ppPrec _ i = text (T.unpack (identText i))++instance PP ModName where+ ppPrec _ = text . T.unpack . modNameToText+
src/Cryptol/Utils/Panic.hs view
@@ -1,54 +1,30 @@ -- |--- Module : $Header$+-- Module : Cryptol.Utils.Panic -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable -{-# LANGUAGE Safe #-}-{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}-module Cryptol.Utils.Panic (panic) where--import Cryptol.Version--import Control.Exception as X-import Data.Typeable(Typeable)-import Data.Maybe(fromMaybe,listToMaybe)+{-# LANGUAGE Trustworthy, TemplateHaskell #-}+module Cryptol.Utils.Panic+ (HasCallStack, CryptolPanic, Cryptol, Panic, panic) where -panic :: String -> [String] -> a-panic panicLoc panicMsg = throw CryptolPanic { .. }+import Panic hiding (panic)+import qualified Panic as Panic -data CryptolPanic = CryptolPanic { panicLoc :: String- , panicMsg :: [String]- } deriving Typeable+data Cryptol = Cryptol -instance Show CryptolPanic where- show p = unlines $- [ "You have encountered a bug in Cryptol's implementation."- , "*** Please create an issue at https://github.com/galoisinc/cryptol/issues"- , ""- , "%< --------------------------------------------------- "- ] ++ rev ++- [ locLab ++ panicLoc p- , msgLab ++ fromMaybe "" (listToMaybe msgLines)- ]- ++ map (tabs ++) (drop 1 msgLines) ++- [ "%< --------------------------------------------------- "- ]- where msgLab = " Message: "- revLab = " Revision: "- branchLab = " Branch: "- dirtyLab = " (non-committed files present during build)"- locLab = " Location: "- tabs = map (const ' ') msgLab+type CryptolPanic = Panic Cryptol - msgLines = panicMsg p+panic :: HasCallStack => String -> [String] -> a+panic = Panic.panic Cryptol - rev | null commitHash = []- | otherwise = [ revLab ++ commitHash- , branchLab ++ commitBranch ++ dirtyLab ]+instance PanicComponent Cryptol where+ panicComponentName _ = "Cryptol"+ panicComponentIssues _ = "https://github.com/GaloisInc/cryptol/issues" -instance Exception CryptolPanic+ {-# Noinline panicComponentRevision #-}+ panicComponentRevision = $useGitRevision
src/Cryptol/Version.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : Cryptol.Version -- Copyright : (c) 2013-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
src/GitRev.hs view
@@ -1,5 +1,5 @@ -- |--- Module : $Header$+-- Module : GitRev -- Copyright : (c) 2014-2016 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com
+ utils/CryHtml.hs view
@@ -0,0 +1,83 @@+#!/usr/bin/env runhaskell++{-# LANGUAGE OverloadedStrings #-}++-- |+-- Module : Main+-- Copyright : (c) 2013-2016 Galois, Inc.+-- License : BSD3+-- Maintainer : cryptol@galois.com+-- Stability : provisional+-- Portability : portable++import Cryptol.Parser.Lexer+import Cryptol.Utils.PP+import qualified Data.Text.IO as Text+import Text.Blaze.Html (Html, AttributeValue, toValue, toHtml, (!))+import qualified Text.Blaze.Html as H+import qualified Text.Blaze.Html5 as H+import qualified Text.Blaze.Html5.Attributes as A+import Text.Blaze.Html.Renderer.Pretty (renderHtml)+++main :: IO ()+main =+ do txt <- Text.getContents+ putStrLn $ renderHtml+ $ page+ $ toHtml+ $ map toBlaze+ $ fst+ $ primLexer defaultConfig txt++page :: Html -> Html+page inner = do+ H.docTypeHtml ! A.xmlns "http://www.w3.org/1999/xhtml" $ do+ H.head $ do+ H.meta ! A.httpEquiv "Content-Type" ! A.content "text/html; charset=UTF-8"+ H.title "Cryptol Source"+ H.style $ H.preEscapedString sty+ H.body inner+++toBlaze :: Located Token -> Html+toBlaze tok = H.span ! (A.class_ $ cl $ tokenType $ thing tok)+ ! (A.title $ toValue $ show $ pp $ srcRange tok)+ $ H.toHtml+ $ tokenText+ $ thing tok+++cl :: TokenT -> AttributeValue+cl tok =+ case tok of+ Num {} -> "number"+ Ident {} -> "identifier"+ KW {} -> "keyword"+ Op {} -> "operator"+ Sym {} -> "symbol"+ Virt {} -> "virtual"+ White Space -> "white"+ White _ -> "comment"+ Err {} -> "error"+ EOF -> "eof"+ StrLit {} -> "text"+ ChrLit {} -> "text"++++sty :: String+sty = unlines+ [ "body { font-family: monospace }"+ , ".number { color: #cc00cc }"+ , ".identifier { }"+ , ".keyword { color: blue; }"+ , ".operator { color: #cc00cc }"+ , ".symbol { color: blue }"+ , ".white { }"+ , ".virtual { background-color: red }"+ , ".comment { color: green }"+ , ".error { color: red }"+ , ".text { color: #cc00cc }"+ ]+