From eaeeaec5be5a5eb054dfd4fa6b894e56a506e59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abigail=20Magalh=C3=A3es?= Date: Sat, 31 Jul 2021 20:03:21 -0300 Subject: [PATCH] Initial commit w/ initial fragments of parser and lexer --- .gitignore | 14 ++ LICENSE | 30 +++ README.md | 1 + Setup.hs | 2 + ahc.cabal | 35 ++++ hie.yaml | 10 + src/Frontend/Autogen/Lexer.x | 373 ++++++++++++++++++++++++++++++++++ src/Frontend/Autogen/Parser.y | 237 +++++++++++++++++++++ src/Frontend/Lexer/Tokens.hi | Bin 0 -> 5295 bytes src/Frontend/Lexer/Tokens.hs | 90 ++++++++ src/Frontend/Lexer/Tokens.o | Bin 0 -> 75000 bytes src/Frontend/Parser/Posn.hi | Bin 0 -> 3151 bytes src/Frontend/Parser/Posn.hs | 33 +++ src/Frontend/Parser/Posn.o | Bin 0 -> 30944 bytes src/Frontend/Syntax.hi | Bin 0 -> 12002 bytes src/Frontend/Syntax.hs | 112 ++++++++++ src/Frontend/Syntax.o | Bin 0 -> 283440 bytes src/Main.hi | Bin 0 -> 2944 bytes src/Main.hs | 51 +++++ src/Main.o | Bin 0 -> 20696 bytes stack.yaml | 67 ++++++ stack.yaml.lock | 13 ++ 22 files changed, 1068 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Setup.hs create mode 100644 ahc.cabal create mode 100644 hie.yaml create mode 100644 src/Frontend/Autogen/Lexer.x create mode 100644 src/Frontend/Autogen/Parser.y create mode 100644 src/Frontend/Lexer/Tokens.hi create mode 100644 src/Frontend/Lexer/Tokens.hs create mode 100644 src/Frontend/Lexer/Tokens.o create mode 100644 src/Frontend/Parser/Posn.hi create mode 100644 src/Frontend/Parser/Posn.hs create mode 100644 src/Frontend/Parser/Posn.o create mode 100644 src/Frontend/Syntax.hi create mode 100644 src/Frontend/Syntax.hs create mode 100644 src/Frontend/Syntax.o create mode 100644 src/Main.hi create mode 100644 src/Main.hs create mode 100644 src/Main.o create mode 100644 stack.yaml create mode 100644 stack.yaml.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ba0c46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +.stack-work + +# tools +/repl.sh +/.ghci + +# grammar reference +/Haskell Grammar.txt + +# test files +/*.hs + +# except for this one +!/Setup.hs \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ca46626 --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright Abigail Magalhães (c) 2021 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Abigail Magalhães nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..755c852 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# ahc diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/ahc.cabal b/ahc.cabal new file mode 100644 index 0000000..67f901b --- /dev/null +++ b/ahc.cabal @@ -0,0 +1,35 @@ +name: ahc +version: 0.1.0.0 +homepage: https://github.com/plt-hokusai/ahc#readme +license: BSD3 +license-file: LICENSE +author: Abigail Magalhães +maintainer: me@abby.how +copyright: 2021 Abigail Magalhães +category: Web +build-type: Simple +cabal-version: >=2.0 +extra-source-files: README.md + +executable ahc + hs-source-dirs: src + main-is: Main.hs + default-language: Haskell2010 + build-depends: base ^>= 4.14 + , mtl ^>= 2.2 + , syb ^>= 0.7 + , text ^>= 1.2 + , array ^>= 0.5 + , containers ^>= 0.6 + , bytestring ^>= 0.10 + , pretty-show ^>= 1.10 + + other-modules: + Frontend.Autogen.Lexer, + Frontend.Autogen.Parser, + Frontend.Lexer.Tokens, + Frontend.Parser.Posn, + Frontend.Syntax + + build-tool-depends: alex:alex >= 3.2.4 && < 4.0 + , happy:happy >= 1.19.12 && < 2.0 diff --git a/hie.yaml b/hie.yaml new file mode 100644 index 0000000..1961153 --- /dev/null +++ b/hie.yaml @@ -0,0 +1,10 @@ +cradle: + multi: + - path: "./src/Frontend/Autogen" + config: + cradle: + none: + - path: "./" + config: + cradle: + stack: \ No newline at end of file diff --git a/src/Frontend/Autogen/Lexer.x b/src/Frontend/Autogen/Lexer.x new file mode 100644 index 0000000..2f47527 --- /dev/null +++ b/src/Frontend/Autogen/Lexer.x @@ -0,0 +1,373 @@ +{ +module Frontend.Autogen.Lexer where + +import qualified Data.ByteString.Lazy as Lbs +import qualified Data.Text.Encoding as T +import qualified Data.Text as T + +import Frontend.Lexer.Tokens + +import Control.Monad + +import Debug.Trace +} + +%wrapper "monadUserState-bytestring" + +$alpha = [a-zA-Z] +$digit = [0-9] +$white_nol = $white # \n + +tokens :- + $white_nol+ ; + +<0,module_header> "--" .* \n + { just $ pushStartCode newline } + +<0,module_header,import_> + $alpha [$alpha $digit \_ \']* { variableOrKeyword } + +<0> \= { always TokEqual } +<0> \: \: { always TokDoubleColon } + +<0> \\ { \i l -> setPendingLC *> yield' (const TokLambda) i l } +<0> "->" { always TokArrow } +<0> "_" { always TokUnder } + +<0> \{ { always TokOBrace } +<0> \[ { always TokOSquare } + +<0,module_header,import_> { + \, { always TokComma } + \( { always TokOParen } + \) { always TokCParen } +} + +<0> \} { closeBrace } +<0> \] { always TokCSquare } + +<0> \;+ { always TokSemi } + +<0> \n { just $ pushStartCode newline } + +<0> \" { just startString } + + { + \\ \" { stringSeg (T.singleton '"') } + \\ \\ { stringSeg (T.singleton '\\') } + + \\ a { stringSeg (T.singleton '\a') } + \\ b { stringSeg (T.singleton '\b') } + \\ f { stringSeg (T.singleton '\f') } + \\ n { stringSeg (T.singleton '\n') } + \\ \n { stringSeg (T.singleton '\n') } + \\ r { stringSeg (T.singleton '\r') } + \\ v { stringSeg (T.singleton '\v') } + \\ t { stringSeg (T.singleton '\t') } + + \" { endString } + + [^\\\"]+ { stringChar } +} + +<0,newline,comment,import_,module_header> + "{-" { just $ pushStartCode comment } + + { + "-}" { \i l -> popStartCode *> skip i l } + . ; +} + +-- newline: emit a semicolon when de-denting + { + \n ; + "--" .* \n ; + + () { offsideRule } +} + +-- layout: indentation of the next token is context for offside rule + { + \n ; + "--" .* \n ; + + \{ { openBrace } + () { startLayout } +} + + { + \n { just $ pushStartCode newline } + "--" .* \n { just $ pushStartCode newline } +} + + () { emptyLayout } + + () { emitPendingToken } + + { + \n ; +} + +{ +alexEOF :: Alex Token +alexEOF = do + (AlexPn _ l c, _, _, _) <- alexGetInput + + maybePopImportSC + + state <- getUserState + + unless (T.null (stringBuffer state)) $ do + alexError $ "Unterminated string literal at line " ++ show l ++ ", column " ++ show c + + case layoutColumns state of + -- EOF is allowed to close as many layout contexts as there are + -- pending (number of pending layout contexts is the length of the + -- list minus one, since there's the one initial layout context.) + _:tail -> do + mapUserState $ \s -> + s { pendingTokens = (Token TokLEnd l c <$ tail) ++ [Token TokEof l c] + , layoutColumns = [] + } + pushStartCode pending + pure (Token TokLEnd l c) + _ -> pure $ Token TokEof l c + +yield k inp i = clearPendingLC *> yield' k inp i + +yield' k (AlexPn _ l c, _, s, _) i = do + pure (Token (k $! (T.decodeUtf8 (Lbs.toStrict (Lbs.take i s)))) l c) + +setPendingLC = mapUserState $ \s -> s { pendingLambdaCase = True } +clearPendingLC = mapUserState $ \s -> s { pendingLambdaCase = False } + +always :: TokenClass -> AlexInput -> Int64 -> Alex Token +always k x i = yield (const k) x i + +startString = do + mapUserState $ \s -> s { stringBuffer = T.empty } + pushStartCode string + +endString (AlexPn _ l c, _, _, _) _i = do + text <- stringBuffer <$> getUserState + mapUserState $ \s -> s { stringBuffer = T.empty } + popStartCode + pure (Token (TokString text) l c) + +stringChar input@(AlexPn _ _ _, _, buf, _) i = do + mapUserState $ \s -> s { stringBuffer = stringBuffer s <> T.decodeUtf8 (Lbs.toStrict (Lbs.take i buf)) } + alexMonadScan + +stringSeg text _ _ = do + mapUserState $ \s -> s { stringBuffer = stringBuffer s <> text } + alexMonadScan + +data LayoutState + = LetLayout { layoutCol :: Int } + | Layout { layoutCol :: Int } + | ModLayout { layoutCol :: Int } + deriving (Show) + +data AlexUserState = + AlexUserState { layoutColumns :: [LayoutState] + , startCodes :: [Int] + , leastColumn :: Int + + , pendingLayoutKw :: Maybe (Int -> LayoutState) + , pendingTokens :: [Token] + , pendingLambdaCase :: Bool + , haveModuleHeader :: Bool + + , stringBuffer :: T.Text + } + +alexInitUserState = AlexUserState [] [] 0 Nothing [] False False T.empty + +emitPendingToken :: AlexAction Token +emitPendingToken _ _ = do + t <- getUserState + case pendingTokens t of + [] -> do + popStartCode + alexMonadScan + (x:xs) -> do + mapUserState $ \s -> s { pendingTokens = xs } + pure x + +delayToken :: Token -> Alex () +delayToken t = do + mapUserState $ \s -> s { pendingTokens = t:pendingTokens s } + pushStartCode pending + +just :: Alex a -> AlexAction Token +just k _ _ = k *> alexMonadScan + +getUserState :: Alex AlexUserState +getUserState = Alex $ \s -> Right (s, alex_ust s) + +mapUserState :: (AlexUserState -> AlexUserState) -> Alex () +mapUserState k = Alex $ \s -> Right (s { alex_ust = k $! alex_ust s }, ()) + +pushStartCode :: Int -> Alex () +pushStartCode c = do + sc <- alexGetStartCode + mapUserState $ \s -> s { startCodes = sc:startCodes s } + alexSetStartCode c + +popStartCode :: Alex () +popStartCode = do + sc <- startCodes <$> getUserState + case sc of + [] -> alexSetStartCode 0 + (x:xs) -> do + mapUserState $ \s -> s { startCodes = xs } + alexSetStartCode x + +offsideRule :: AlexInput -> Int64 -> Alex Token +offsideRule (AlexPn _ line col, _, s, _) _ = do + ~(col':ctx) <- layoutColumns <$> getUserState + case col `compare` layoutCol col' of + EQ -> do + popStartCode + maybePopImportSC + pure (Token TokSemi line col) + GT -> do + popStartCode + alexMonadScan + LT -> do + mapUserState $ \s -> s { layoutColumns = ctx } + pure (Token TokLEnd line col) + +maybePopImportSC :: Alex () +maybePopImportSC = do + startcode <- alexGetStartCode + when (startcode == import_) popStartCode + +emptyLayout :: AlexInput -> Int64 -> Alex Token +emptyLayout (AlexPn _ line col, _, _, _) _ = do + popStartCode + pushStartCode newline + pure (Token TokLEnd line col) + +startLayout :: AlexInput -> Int64 -> Alex Token +startLayout (AlexPn _ line col, _, _, _) _ = do + state <- getUserState + popStartCode + let + col' = + case layoutColumns state of + [] -> 0 + (x:_) -> layoutCol x + + layoutKind = case pendingLayoutKw state of + Just s -> s + Nothing -> Layout + + if col < col' + then pushStartCode empty_layout + else mapUserState $ \s -> s { layoutColumns = layoutKind col:layoutColumns s } + pure (Token TokLStart line col) + +getLayout :: Alex LayoutState +getLayout = do + t <- getUserState + case layoutColumns t of + (x:_) -> pure x + _ -> error "No layout?" + +openBrace :: AlexInput -> Int64 -> Alex Token +openBrace (AlexPn _ line col, _, _, _) _ = do + popStartCode + mapUserState $ \s -> s { layoutColumns = Layout minBound:layoutColumns s } + pure (Token TokOBrace line col) + +popLayoutContext :: Alex () +popLayoutContext = mapUserState $ \s -> s { layoutColumns = tail (layoutColumns s) } + +closeBrace :: AlexInput -> Int64 -> Alex Token +closeBrace (AlexPn _ line col, _, _, _) _ = do + ~(col':_) <- layoutColumns <$> getUserState + if layoutCol col' < 0 + then popLayoutContext + else pure () + pure (Token TokCBrace line col) + +variableOrKeyword :: AlexAction Token +variableOrKeyword (AlexPn _ l c, _, s, _) size = do + sc <- alexGetStartCode + state <- getUserState + + clearPendingLC + + let + text = T.decodeUtf8 (Lbs.toStrict (Lbs.take size s)) + col = layoutCol (head (layoutColumns state)) + + case T.unpack text of + "as" + | sc == import_, c > col -> pure (Token TokAs l c) + | sc == import_ -> offsideKeyword (TokVar text) l c + | otherwise -> pure (Token (TokVar text) l c) + + "qualified" + | sc == import_, c > col -> pure (Token TokQualified l c) + | sc == import_ -> offsideKeyword (TokVar text) l c + | otherwise -> pure (Token (TokVar text) l c) + + "let" -> laidOut' (Just LetLayout) TokLet l c + "in" -> do + laidout <- getLayout + case laidout of + -- let .. in critical pair: + -- 'in' is allowed to close a layout context before the offside rule would apply. + LetLayout _ -> earlyEnd TokIn l c + _ -> pure (Token TokIn l c) + + "data" -> pure (Token TokData l c) + + "where" -> do + -- if this is the where in the module_header, then + -- pop the start code so that the offside rule applies again + when (sc == module_header) popStartCode + laidOut' (if sc == module_header then Just ModLayout else Nothing) TokWhere l c + + "case" + -- "case" is a layout token if it's immediately following a \\ + | pendingLambdaCase state -> laidOut TokCase l c + | otherwise -> pure (Token TokCase l c) + + "import" -> do + pushStartCode import_ + pure (Token TokImport l c) + + "of" -> laidOut TokOf l c + + "module" -> do + unless (haveModuleHeader state) $ do + mapUserState $ \s -> s { haveModuleHeader = True } + pushStartCode module_header + pure (Token TokModule l c) + + (x:_) + | Data.Char.isUpper x -> pure (Token (TokCon text) l c) + | otherwise -> pure (Token (TokVar text) l c) + + [] -> error "empty keyword/identifier" + +earlyEnd tok l c = do + popLayoutContext + delayToken (Token tok l c) + pure (Token TokLEnd l c) + +offsideKeyword tok l c = do + popLayoutContext + delayToken (Token tok l c) + pure (Token TokSemi l c) + +laidOut' n x l c = do + pushStartCode layout + mapUserState $ \s -> s { leastColumn = c, pendingLayoutKw = n } + pure (Token x l c) + +laidOut = laidOut' Nothing +} diff --git a/src/Frontend/Autogen/Parser.y b/src/Frontend/Autogen/Parser.y new file mode 100644 index 0000000..cc44323 --- /dev/null +++ b/src/Frontend/Autogen/Parser.y @@ -0,0 +1,237 @@ +{ +{-# LANGUAGE FlexibleContexts, FlexibleInstances, ViewPatterns #-} +module Frontend.Autogen.Parser where + +import qualified Data.Text as T +import Data.Text (Text) + +import Frontend.Lexer.Tokens +import Frontend.Parser.Posn +import Frontend.Syntax +import Frontend.Autogen.Lexer + +import Prelude hiding (span) + +import Debug.Trace + +} + +%name parseExp Exp +%name parseMod Module +%name parseType Type + +%tokentype { Token } + +%monad { Alex } +%lexer { lexer } { Token TokEof _ _ } + +%errorhandlertype explist +%error { parseError } + +%token + VAR { Token (TokVar _) _ _ } + CON { Token (TokCon _) _ _ } + STRING { Token (TokString _) _ _ } + 'eof' { Token TokEof _ _ } + + '(' { Token TokOParen _ _ } + ')' { Token TokCParen _ _ } + + '{' { Token TokOBrace _ _ } + '}' { Token TokCBrace _ _ } + + START { Token TokLStart _ _ } + END { Token TokLEnd _ _ } + + '[' { Token TokOSquare _ _ } + ']' { Token TokCSquare _ _ } + + '{-#' { Token TokOPragma _ _ } + '#-}' { Token TokCPragma _ _ } + + '\\' { Token TokLambda _ _ } + + '->' { Token TokArrow _ _ } + '_' { Token TokUnder _ _ } + '::' { Token TokDoubleColon _ _ } + ';' { Token TokSemi _ _ } + '=' { Token TokEqual _ _ } + ',' { Token TokComma _ _ } + + 'let' { Token TokLet _ _ } + 'in' { Token TokIn _ _ } + 'data' { Token TokData _ _ } + 'case' { Token TokCase _ _ } + 'module' { Token TokModule _ _ } + 'where' { Token TokWhere _ _ } + + 'import' { Token TokImport _ _ } + 'as' { Token TokAs _ _ } + 'qualified' { Token TokQualified _ _ } + +%% + +Exp :: { Exp } + : InfixExp '::' Type { span $1 $3 $ Annot $1 $3 } + | InfixExp { $1 } + +InfixExp :: { Exp } + : LeftExp {- ... -} { $1 } +-- | LeftExp qop InfixExp { Infix $1 (getVar $2) $3 } + +LeftExp :: { Exp } + : '\\' Apat List(Apat) '->' Exp { span $1 $5 (makeLams ($2:$3) $5) } + | 'let' LaidOutList(Decl) 'in' Exp { span $1 $4 $ Let (thd $2) $4 } + | FuncExp { $1 } + +FuncExp :: { Exp } + : FuncExp Aexp { span $1 $2 $ App $1 $2 } + | Aexp { $1 } + +Aexp :: { Exp } + : qvar { span $1 $1 $ Ref (getVar $1) } + | qcon { span $1 $1 $ Con (getVar $1) } + | '(' CommaList(Exp) ')' { span $1 $3 $ makeTuple $2 } + | STRING { span $1 $1 $ Literal (LitString (getString $1)) } + +Type :: { Type } + : Btype '->' Type { span $1 $3 $ Tyarr $1 $3 } + | Btype { $1 } + +Btype :: { Type } + : Btype Atype { span $1 $2 $ Tyapp $1 $2 } + | Atype { $1 } + +Atype :: { Type } + : qvar { span $1 $1 $ Tyvar (getVar $1) } + | qcon { span $1 $1 $ Tycon (getVar $1) } + | '(' CommaList(Type) ')' { span $1 $3 $ makeTupleType $2 } + + +Pat :: { Pat } + : Lpat { $1 } + +Lpat :: { Pat } + : Apat { $1 } + +Apat :: { Pat } + : VAR { span $1 $1 $ Var (getVar $1) } + | '_' { span $1 $1 $ Wildcard } + | '(' CommaList(Pat) ')' { span $1 $3 $ makeTuplePattern $2 } + +Decl :: { Decl } + : VAR '::' Type { TySig (getVar $1) $3 } + | VAR Apat List(Apat) Rhs { FunDecl (getVar $1) ($2:$3) $4 } + | Pat Rhs { PatDecl $1 $2 } + +Rhs :: { Rhs } + : '=' Exp { BareRhs $2 [] } + | '=' Exp 'where' LaidOutList(Decl) { BareRhs $2 (thd $4) } + +LaidOutList(p) + : START Opt(Semis) LOLContents(p, END) { (startPosn $1, lolEnd $3, lolList $3) } + | '{' Opt(Semis) LOLContents(p, '}') { (startPosn $1, lolEnd $3, lolList $3) } + +LOLContents(p, End) + : p Semis LOLContents(p,End) { lolCons $1 $3 } + | p Opt(Semis) End { lolCons $1 (emptyLol $3) } + | Opt(Semis) End { emptyLol $2 } + +Module :: { Module } + : 'module' CON ImportExportList 'where' LaidOutList(ModItem) + { Module { moduleName = getVar $2 + , moduleExports = $3 + , moduleItems = thd $5 } + } + +ImportExportList :: { Maybe [NamespacedItem Text] } + : {-empty-} { Nothing } + | '(' CommaList(NSItem) ')' { Just $2 } + +NSItem :: { NamespacedItem Text } + : VAR { IEVar (getVar $1) } + | CON { IECon (getVar $1) } + | 'module' CON { IEModule (getVar $2) } + +ModItem :: { Item } + : Decl { ModDecl $1 } + | Import { ModImport $1 } + +Import + : 'import' qcon ImportExportList + { Import (getVar $2) $3 False Nothing } + + | 'import' qcon ImportExportList 'as' CON + { Import (getVar $2) $3 False (Just (getVar $5)) } + + | 'import' 'qualified' qcon ImportExportList + { Import (getVar $3) $4 True Nothing } + + | 'import' 'qualified' qcon ImportExportList 'as' CON + { Import (getVar $3) $4 True (Just (getVar $6)) } + +Opt(p) + : { () } + | p { () } + +Semis + : ';' Semis { () } + | ';' { () } + +-- TODO: qualified names +qvar : VAR { $1 } +qcon : CON { $1 } + +List(p) + : {-empty-} { [] } + | p List(p) { $1:$2 } + +CommaList(p) + : {-empty-} { [] } + | p { [$1] } + | p ',' CommaList(p) { $1:$3 } + +Block(p) + : START p END { (startPosn $1, endPosn $3, $2) } + | '{' p '}' { (startPosn $1, endPosn $3, $2) } + +{ + +type Exp = FeExpr Text +type Pat = FePat Text +type Decl = FeDecl Text +type Type = FeType Text +type Rhs = FeRhs Text +type Module = FeModule Text +type Item = ModuleItem Text + +lexer cont = alexMonadScan >>= cont + +parseError x = alexError (show x) + +makeLams xs b = foldr Lam b xs + +getVar (Token (TokVar s) _ _) = s +getVar (Token (TokCon s) _ _) = s +getVar _ = error "getVar non-var" + +getString (Token (TokString s) _ _) = s +getString _ = error "getString non-string" + +data LOL a = LOL { lolEnd :: Posn, lolList :: [a] } + +emptyLol :: HasPosn x => x -> LOL a +emptyLol t = LOL (endPosn t) [] + +lolCons :: a -> LOL a -> LOL a +lolCons x (LOL p xs) = LOL p (x:xs) + +makeTupleType [x] = ParenType x +makeTupleType xs = Tytup xs + +makeTuplePattern [x] = ParenPat x +makeTuplePattern xs = TupPat xs + +makeTuple [x] = ParenExp x +makeTuple xs = Tuple xs +} diff --git a/src/Frontend/Lexer/Tokens.hi b/src/Frontend/Lexer/Tokens.hi new file mode 100644 index 0000000000000000000000000000000000000000..2db5bba5bb37e8e1381d74d2e84bd46b6cf94ae2 GIT binary patch literal 5295 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 tQP6FancTaDz64VopBT{{lrs%3uHh literal 0 HcmV?d00001 diff --git a/src/Frontend/Lexer/Tokens.hs b/src/Frontend/Lexer/Tokens.hs new file mode 100644 index 0000000..97e8844 --- /dev/null +++ b/src/Frontend/Lexer/Tokens.hs @@ -0,0 +1,90 @@ +module Frontend.Lexer.Tokens where + +import qualified Data.Text as T +import Data.Text (Text) + +data TokenClass + = TokVar Text + | TokCon Text + | TokString Text + | TokEof + + | TokLambda + | TokArrow + | TokUnder + + | TokOParen + | TokOBrace + | TokOSquare + | TokOPragma + + | TokCParen + | TokCBrace + | TokCSquare + | TokCPragma + + | TokDoubleColon + | TokEqual + | TokComma + | TokPipe + + | TokLet + | TokIn + | TokLStart + | TokLEnd + + | TokModule + | TokImport + | TokQualified + | TokAs + | TokWhere + | TokLambdaCase + | TokCase + | TokOf + + | TokData + + | TokSemi + deriving (Eq, Show, Ord) + +tokSize :: TokenClass -> Int +tokSize (TokVar x) = T.length x +tokSize (TokCon x) = T.length x +tokSize TokEof = 0 +tokSize TokLambda = 1 +tokSize TokOParen = 1 +tokSize TokOBrace = 1 +tokSize TokOSquare = 1 +tokSize TokOPragma = 3 +tokSize TokCBrace = 1 +tokSize TokCParen = 1 +tokSize TokCSquare = 1 +tokSize TokCPragma = 3 +tokSize TokDoubleColon = 2 +tokSize TokEqual = 1 +tokSize TokComma = 1 +tokSize TokSemi = 1 +tokSize TokUnder = 1 +tokSize TokArrow = 2 +tokSize TokIn = 2 +tokSize TokLStart = 0 +tokSize TokLEnd = 0 +tokSize TokPipe = 1 +tokSize (TokString t) = 2 + T.length t +tokSize TokLambdaCase = length "\\case" +tokSize TokWhere = length "where" +tokSize TokData = length "data" +tokSize TokOf = length "of" +tokSize TokCase = length "case" +tokSize TokModule = length "module" +tokSize TokQualified = length "qualified" +tokSize TokImport = length "import" +tokSize TokLet = 3 +tokSize TokAs = 2 + +data Token + = Token { tokenClass :: TokenClass + , tokStartLine :: !Int + , tokStartCol :: !Int + } + deriving (Eq, Show, Ord) diff --git a/src/Frontend/Lexer/Tokens.o b/src/Frontend/Lexer/Tokens.o new file mode 100644 index 0000000000000000000000000000000000000000..b738599132bbbb827f2b475ccd7c4c998194e03f GIT binary patch literal 75000 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 JL;2O^{~yJGwJZPt literal 0 HcmV?d00001 diff --git a/src/Frontend/Parser/Posn.hi b/src/Frontend/Parser/Posn.hi new file mode 100644 index 0000000000000000000000000000000000000000..9ed0dc8cb6adc6cb0f1dd0bd88d604440886bf9b GIT binary patch literal 3151 zcmcgtdr(x@8UN1i-Cdr7fYByRYFnCUBR61(A@R`&!AFbA4A!(WopCO^2iS4BcfEV5 zkeSRZiUQ@~12ke{lw?q=f)7w2baY)%69Pt>48$PdC~+cSK*VC?(SGMHu1eQG@=q?D z@1FBJ-}9W`x3~Ml-T>gDBEloJrVJ6la2>~c00dy~Xy#x~&2ZB@S1#`_Iljl?93Y?e zUn{)SaLVy=W5s_)Z@1T7o7H!&@j`R|C;4BK?fKm&ZZsS_=G%08S8ws&V>@3dDQj*z zeIdVNW$wAt16`*|uNILzXIjUzb`*>>lh2(OPnB=nmRC-)9ZflTM-J|Z27Jg2q5)qm za6|`sFn||$gAe$EANb?ie+uXVKpzPHQ-KQtF8F!iLV%kF+%v#U2W|#%zX0x8;GP5S zm%!of3&8yfxS7EH8o1v8_gm11g8p})e-R8XfngRHW`p7PV0ak}bHF7<>J`@7tv<_@zdLNSMCIS{!PQ#dj}6?RjGJz z^PyY2+kQAdc$?Hb*jM^(tK+*abz|<>Q1Omqhn-`?@%;sq@(M@@xJWuNN%yCv?8aa{wwC)=k>CJtm+#*^>yWB?D`hxk=mZCRv?;| z%5Qrg>^xITkKcW;<49rgc?;QluDk43&EAc}WMljIKX1NYFz|+!L>P&lWm3dBaW}mjt~e$)j#X*+wnSBY&chR`0A$K%zbOWDg3yi`hL@)-2|qh zPR3(8ox^80cC?K()RGgU&fV{io&VlJAPAK{dQ9oFGuKDkFV?=ezxrtBq0y0j^B@>C z9J+CLC{L%WLqg!=kts+L&~oe=U8kyfG{xCZW{yg_h2ZAjBAh-!74mcNk!Z*t;4K`B zJzS(l2cCG(x`pV~z5|W!BfHvD#68hqmtwDK2>QmyGvf^a`oC&j{B&CqK)QO?M|S9Q zpQ2wrR(j>X{YOXV-E;Ql-OYC%A5e3{5S}mcr=Kf+OPDhp3vu90;Q&{^68ze*{>2}X zXsmXN-Tpl)W0N8fg8;S^HW*u|t)r@ADx#C}U zIyXBuox~3jI~IeDiF793gAlZUw^3+g*laNqu}r+hF!V$S6YwSz^O;z}#8M`fF|izf zFSSu@_D3fE#6%nuE0|cx#H!1{r3z*-WQi<^3KdO!ydc}C%*RVMahe;9qv?pPmex_x z<}b*ykP#Nnzs5)M;as9%qf-*iq98LY3je}G5;GKPQ)IK4j8Fvr&*j5|j2HkTQQ3yz zJbo@85n!U!YNPAJBG4213QA5fh9ydp5~ietMKQxjF9umTyz!T{kEV8{Axsk)mgNfAitDie6w-73&SiE)GYbv zG_%D--6!YJyzZ;WfX@j5Y zBSymHXnKgcSdu0h6-nk9DA{PxBv7;|)1H8qo2aOmm5e8?<7LT|W>f;7P)$fn^;Llt zk|>!?t^yKhsySJf(yXpJ-AjHso}nxX7FUjI@G8ub=sK!3XsuQmo37aWSh*8tWea4B z<*WGEbR)GYXfQ(!82#w<9=d&g@stq`pL4<^t@np0f` zKc@DKiX_nWX;d^)x3x?0anlJ}$dpc3?^cqjIay4Qjd6mQ%&*R{(&re?R%t>q#j`-d zW63sk@7aeqzsyBBe)TdwAp>ch?yqLR90-XP>dNQg%AJpa`Hq!k^}RAJRXuM;G()^h zEomm|%M@ZPg3U&4D*2cTn@;UJgCeaW literal 0 HcmV?d00001 diff --git a/src/Frontend/Parser/Posn.hs b/src/Frontend/Parser/Posn.hs new file mode 100644 index 0000000..19bcedc --- /dev/null +++ b/src/Frontend/Parser/Posn.hs @@ -0,0 +1,33 @@ +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE DefaultSignatures #-} +module Frontend.Parser.Posn where + +import Frontend.Lexer.Tokens +import Data.Typeable +data Posn + = Posn { posnLine :: {-# UNPACK #-} !Int + , posnColm :: {-# UNPACK #-} !Int + } + deriving (Eq, Show, Ord) + +class HasPosn a where + startPosn :: a -> Posn + endPosn :: a -> Posn + + span :: (HasPosn b, HasPosn c) => b -> c -> a -> a + + default span :: Typeable a => b -> c -> a -> a + span _ _ x = error $ "Can't span " ++ show (typeOf x) + +instance HasPosn Token where + startPosn (Token _ l c) = Posn l c + endPosn (Token t l c) = Posn l (c + tokSize t) + +instance HasPosn (Posn, Posn, a) where + startPosn (s, _, _) = s + endPosn (_, e, _) = e + + span start end (_, _, x) = (startPosn start, endPosn end, x) + +thd :: (a, b, c) -> c +thd (_, _, z) = z \ No newline at end of file diff --git a/src/Frontend/Parser/Posn.o b/src/Frontend/Parser/Posn.o new file mode 100644 index 0000000000000000000000000000000000000000..51c50f77742010a0006bf662a408fc5a7a1fdf63 GIT binary patch literal 30944 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 literal 0 HcmV?d00001 diff --git a/src/Frontend/Syntax.hs b/src/Frontend/Syntax.hs new file mode 100644 index 0000000..969038a --- /dev/null +++ b/src/Frontend/Syntax.hs @@ -0,0 +1,112 @@ +module Frontend.Syntax where + +import Frontend.Parser.Posn +import qualified Data.Text as T + +data FeExpr var + = Ref var + | Con var + | App (FeExpr var) (FeExpr var) + | Lam (FePat var) (FeExpr var) + | Let [FeDecl var] (FeExpr var) + | Tuple [FeExpr var] + | Annot (FeExpr var) (FeType var) + + | Literal Literal + + | ParenExp (FeExpr var) + | SPExpr (FeExpr var) Posn Posn + deriving (Eq, Show, Ord) + +instance HasPosn (FeExpr var) where + startPosn (SPExpr _ s _) = s + startPosn _ = error "no start posn in parsed expression?" + + endPosn (SPExpr _ _ e) = e + endPosn _ = error "no end posn in parsed expression?" + + span sp ep (SPExpr x _ _) = SPExpr x (startPosn sp) (endPosn ep) + span sp ep x = SPExpr x (startPosn sp) (endPosn ep) + +data FePat var + = Var var + | Wildcard + + | TupPat [FePat var] + | LitPat Literal + + | ParenPat (FePat var) -- parsed parentheses + | SPPat (FePat var) Posn Posn + deriving (Eq, Show, Ord) + +instance HasPosn (FePat var) where + startPosn (SPPat _ s _) = s + startPosn _ = error "no start posn in parsed expression?" + + endPosn (SPPat _ _ e) = e + endPosn _ = error "no end posn in parsed pattern?" + + span sp ep (SPPat x _ _) = SPPat x (startPosn sp) (endPosn ep) + span sp ep x = SPPat x (startPosn sp) (endPosn ep) + +data FeType var + = Tyvar var + | Tycon var + | Tyapp (FeType var) (FeType var) + | Tyarr (FeType var) (FeType var) + | Tytup [FeType var] + + | ParenType (FeType var) -- parsed parentheses + | SPType (FeType var) Posn Posn + deriving (Eq, Show, Ord) + +instance HasPosn (FeType var) where + startPosn (SPType _ s _) = s + startPosn _ = error "no start posn in parsed type?" + + endPosn (SPType _ _ e) = e + endPosn _ = error "no end posn in parsed type?" + + span sp ep (SPType x _ _) = SPType x (startPosn sp) (endPosn ep) + span sp ep x = SPType x (startPosn sp) (endPosn ep) + +data FeDecl var + = PatDecl (FePat var) (FeRhs var) + | FunDecl var [FePat var] (FeRhs var) + | TySig var (FeType var) + deriving (Eq, Show, Ord) + +data FeRhs var + = BareRhs (FeExpr var) [FeDecl var] + deriving (Eq, Show, Ord) + +data Literal + = LitString T.Text + | LitNumber Integer + deriving (Eq, Show, Ord) + +data FeModule var + = Module { moduleName :: var + , moduleExports :: Maybe [NamespacedItem var] + , moduleItems :: [ModuleItem var] + } + deriving (Eq, Show, Ord) + +data ModuleImport var + = Import { importMod :: var + , importList :: Maybe [NamespacedItem var] + , importQualified :: Bool + , importAlias :: Maybe var + } + deriving (Eq, Show, Ord) + +data NamespacedItem var + = IEVar var + | IECon var + | IEModule var + deriving (Eq, Show, Ord) + +data ModuleItem var + = ModDecl (FeDecl var) + | ModImport (ModuleImport var) + deriving (Eq, Show, Ord) \ No newline at end of file diff --git a/src/Frontend/Syntax.o b/src/Frontend/Syntax.o new file mode 100644 index 0000000000000000000000000000000000000000..9c53603f720a92667b219313686bae3cb2749d66 GIT binary patch literal 283440 zcmeEv34B!5_5Xx5D41wLV+D;GC0eSWplL-7lHf!V1p!5YLWHnb)+8vPRxlu>A#H4J zf3~In#-%N^w#8qy;!kT+p^8f_F12X2#-$2sE4Ef+UHE^`z303+@8-RkNhV>@d7sZD zGv9mOx#ym{oqO(fZE@+SE*TjSc`_nrMPk1MjYJk+(9Qc%XucIjvLXjXx-fbO|Bu!e zHWdB8=$L-K#)^(>NH=_03hXRK#x0lvFT3Wjpid(!RT6@i|(%Rw{C~*6G zn|m(qyZhLg4U$Vo3ZJ^-%xGO1bUz^{TDLeiTKi(n>pi12yL(nIEUDQtt?Y~+PwX0r zWUYRVBB(!e_$Rw}m(*UJx4xvdG;dQ$ZFOE#NquSF`e^;IMJA{^Z)-_yQQr2F+VOeK zCG|ylTch>;C^7m+OpOP$U15{0=>s13BQmJyQn;miq^c9Sy~IF|1Dbk(2%Ab zL>aBwk{MmqR6Q_SXJSHeMqw{*DXkx7f*Gy(!!8@??qjKlXB|~Uq4r6~13h$r-pb4(VQU6+^wGXxuF4LArG|C5? z>iG&aBAL67ZCzus5wRuq>myxmO-AiE^*vobOh4D=`q8V6_2aWx^#v;q~dGcx=-_3_q09q>9X%Wv+aG4)a;={+SuNs0+}am4?ztbV8`#NaaOv1 zw9g(oppEsTqwRyw8oz}0&{-YsABxtz4tL$zb=Q6bH&L%(vuIej+vf6A-8MmPqKfeN zzMpD*Z8D3vxsRmV`*eG+{dk@3A6i5DZj*l~TGNbr9H}crJ#OjM+AJE|DQ=>)9~Jqu z|N4dZd%I}w)|2GjMO;tBCro};dc?ncl;dBf`7@e3!(777d>BFES8mVyQM{DW`$xpy zCnvbbK=O-U8=d%U@k!63c8eRE#xhJPZ6wEZBl_L*4LUh*6QNs6>hUdF-)D(IOY^o7 zia92Hi`JPAm*<#DX^v?!%`tT|b4)v7l+yf?o#dHq)aXt9SiiN%*cLq(Kn~GUoOI?$ zI*&s-Z{u|CDyto8WP_xb@ifx-W}b5VQnp9Fn_&64^7W)lz@zeEugTZ)aZJ9j^ttmW zQqJ9}Gf8KF{ZI3xl|=#drPX}%b|LD12jq#?7B^$WN)yoAZPwUGmKz1~pH%yG;pOrv z)sr?uMJ|~vukXH=%aNVKiIpL00DR?$3bc|tKtE>wvJ&wPmV$bz8y`>3qwd{qtm#sk z-z}2qTvXQWsH`K5NL1}mPib1I1aqNoK5-o!%u+Q38(2ZD7^< z&ra!Y_Sg12ter{QT^(b0rOUn|8prab@gNU3S8TQe_$e5`7dr#O`2LtDj6-b7|NxpT;7+*9cbYgZN_ecm|#lA!cq5kAKGZ^g#> zlVKjh5X2C_kM+kH_nMdTcow$|^Jg}M$&>8(XZU_L{*iU|&iEqhx*8M&JqG$}U>?vI zXk0GFLHSr%zs=-DY+-$=x3Ip?nK8ADCx0gm3z1*(oiBx47PF3`Z}xHItlZbfL81Cx ziS%gw&P}Y}X#x6;ZC1db2wNBie4!14qC&`E2Z)~UTltkk?Vo`5j9idO`L`(lsE&!f znThZ8U|dV_WnK4qgur>)BU(55Ae5^^F}|j;TeNlpylBrwv7Eeif^98p%dl-^vA1oc z-|l0xj*5uBz4hgR`$kIZ&7${`>BCz}GFnFLZbnYXs5EQ!4nmsynkbYlH)C2imcV$4eycNA$uRF zt#%jjH*N{`gJKNL380da@s1rnqkBl0fLJ7^!>SwE4UzOlBv1c4ek7&uCLc*G2d1F= zK_Tc0DZl+6%K$k*8+DA8z~leS_u9kz5X&2jR0mw}zQ>!|D$RQf2PLDNDEl+ARzE}~ zwQghv8pU2v(7{*;d*DYD$JN+=1o@E&bWl{FVzD(rkZ%~GB=Q@zRrUZ;t?+r!TLFbG zMJu4yE3JU2$HUqqapsT4h+AhY%^$r+$u9C{#PAL2eB7Xur8=R~z>m`>Vp7jOLns_x zd6{*3!#5)~2Eu>~{!+8mLj6L3onrizapxWJl5O_d_kQ$%*!ywxA;sd#Qs~3_MT_#9 zXfALY%^RA0=f-+Fp=`a>^`Z1p8L_Gm%CkuNNt-Tpt(yqokp%8oGo+!@k+$<&pZO0q6q2dui!TOz)JT_Su@3U|pG|5Yg$qABko>vioHid}6tri~R4t{m(|&Z6~kNyXPKYvrY3@hO{Nm`&eeq!F8Nk-o)9sZFDoJ}H+fec1a9CD{GX zctQ3*XRWj*vrZ%JQf3SGR+GLm#PzI+t1K6BWUX2Y82cpaCXprjVld5Cp@ALN=W~>> zT5Q1f_&}H0hF1$3XTu9NRiBZT4gyMioNrmHXuXfwI@~g|VI?={Dt)xSI~Q4A^D^@8 zzZunsNRw>yP159RjUi4M3da;G9NE?yviX&ef0q#cJreQ9P{Ffwz7nmg;zE1o|9)T% zy-j5HU~jo+?ZL`{?bGiK6V5g)y7p2U2ivtZ&F*|)uFtR|v&S1s_~Pb5eCBHj;y&`f zBwK26TfHI+&Ew=7@`3ZMyQ|k6TNb|VjA7AjK zB04393Z193iDH>zBKN9{(z=nxI4`a5a}e}WhMd?)%7JNSGLGysW2PhHHX`G02vXi~ zGq2q$<7CKZS8z>4qO1@NR6E6np`fR{A5-5j~d|?K1c5?~wTNDZW;=P76|iR7}Z4X>G9uMbuwEv5RTaDk8StB}k9cR%Y8e z*CUx2E&sIMb^l5FYpdS7a(+>tn!Mg6UtPajN6#amz?z5hnV$V+9Z7(G%(!+A8k&4* z*2hY%(Sx`80UM3Kl&o+x?7L{p-HevzJkug2xBM?3nxY18rdPk+dE*uhRG@xu zM?G&A8RM`23rMdSpQg)$J=Z2cKcDLI5T{+X#YLPD6 zde){G4Efpa!Z-7nu_nGrySJzI=XP{FamvGI%s!&Ae0%z7d9Q8#G#8^z-!CcSE9E~k z?c4FvedsQZroin=QkdsEpM_Cvt#kM*q?`ypv7=ETy=A;7!j4|Y_BmEoR>$1#_!YR> zBiGa*<$w=5H!oRvPY9A%^qf#$@|b%A=;Y-Uy}0p2YcZ5~56Ry7EzD@mY>@CzOS=)) zZ^oS`LE%Z{e~RWo9d3v3>%mb!k=gN8p$IflnI-B%5bF4<8 z20^utq5543Iyik~0q>RRb>`HsW?i=eJuW7r??!_T_udrqGHpGFivaF2aS_0GDoYjg>hy2XTXk4LUO%9Y7j9!MguCuK z!b`H@a!9yvJT|FtuI1egyiewZ+n7|K!#N-tHth_!xn0Y->CO*`OiRUg#8ye@1=h4x zd`b)HH#sHBy4|eRzd_vr?=D!*eE=H2L$I9tHZ${)U^(|d92k>SY^cDY%ekq7`(`y- zt<4^skRrBvJC6U%xBg`9KS^|V{mE|(>aN?~$g@E3z8e42zP@gI8V(h*O=kE#2B<`m z|LJwxD4nQX=27;i8HdO7`*y~;AZ|_`9~<4(We8c3rV*z=zrOzF})` zz4c>aPpS1>!Rv2(WUaj1^yAj!>tCyi+3wA#K3J59kF19^Yi4f;Y*vtUB|XprR&%|O zU7Y*24Xm4lj=0Y;h9Gd^ZBGQ5rE2I@`&?-0Fe4}tp_9)sktkkRvTIMgXHeIkXomD;1b3u8ksIJQr4rDw>scQp z%QJ92tCXj<^q*_+lGrKjd4ETW?=LTk#UICR{8Y}n%6yhuf8ecW-WSfr}l zs^67J(PwZzJfME1`(57Oo=UqFTF%G;tjk&3&QDC&V_qL0s^4@yHcfMSybU#^$5rWZ zRVVqKLffBo`%d%LeE50$?;Qx$?`O1q5AzGRVgJYPte4lGUt&55{Bgz^`~11dVR}gK z{}_pNDCzx%;)nSR?gumDw)FlFbFNO(_b3F6e~mvleb0dHAv$~hF0`Ld&5pv#aau8i zBk^!_9~QTz?-}3@pWDZ*>pr7)6xlme=X0)1(18BT4-YDyfbRJIi>1-C_Oui0K|u3N=zEwvNm{(&YsdeGiKfF_PG%_?6lOLXnw);zE729JT+qXE798RzB|t| zvubj>LfV>^o>?__BUNgVde-XGZ9;Iq?4({et@2*8Zv&@U(xLO%yy4Xl?0zs?Et;?$ z;w;(0QC3Sg5@KJ3dv`%0Z#~evLuQc>_E@N4FWIGfCIXzVrtU@fnF#{RHu3IndDHn& z@4Ot!d*&+?lpJr_@szdt38)NN-5s*yUW7hhGKbKY(iyE+Q}bc&7F72l+`)&`CzAl# zE0DGN8XF0p$l7P^PMZj1gE>#sWW&{T6rIY3tT&QRPAsN88&g*#=RhRqjkmm*%#pK! zG0l?;CEAoJkHQK!`(Nq@+$lRi=#W&Tg7@vv-kKBMPCgZ}?LaqJ-Wgz!%Ug~7+kw8t zXu@njz35dn8Fiw-+x=7=WByd^{s^OfC3sXe93`QYnEL;V`VFO^zK!NP9{PQgPl!ck zn=M@Cjt3nZ)wx5=>eeL6F1%Txn}S;H0V;$vzFk7GEkC>j-M*4y)$nN9Ya-be?wO@P4K!rx}kuA%}rMI_BV?B zY7@LRZy~*f3bnihVe|uGzcyi|d28r^sGI20^)+Y}UohzSJh`?V-*913&%e_9)p?s} z3&qxwdVIqcuV?u%WwdR^4R6XjUC%%b59P3TJH?Z}D;X%AkR5-?A=%V>G`Ad{1NszY`0y5njaCn zSnAnda#Xf}57T>z|IJn0}br$gzdx$%VTV0?q!OQ&v|Be$Dlb}!5~^90$w%3Qs2 z3Qo-L3Ckr54XwT3+3ck?-Db6GjZwGxZ$8WgEpOjoQ#IF1q;#9H4lUlf>(jVX!oj4t zpXa~S6%^&Ir*2~t4JX$l@^2V)G8xlFv0HnZ7}dA-)c5(n*a4<=xG*1#`Y&G>F%3FW zT?FB3*w}@64yJ~t>?1N!MhaDyYsleaY3-<3KxO7wb8rc7{0i~S8kKH z#ddQ=f%}CzWu2z@#aoR#>BbxAz&jM?nz%Zs!o@aM4Te2mfGc(B+z)aO!kuC+QZh!p z8HrZg85($3`q=x4%_i@w$xKe_Cg?G&qS(3Ij@* z1~bt7fWz5ahO?kBKye-Zyg!khhNAF2cJE2LJ^pOB$EXG7+287QNI&wKpLaF=CUP{B z^A-N3t;WCfI7V{TzeM-D+j&>?AIGErCHS?|HeFCcePFrJsCuvuM z{7%t2y64T#w_+Z51TGydsrjI5<>lz#V)HrEjX>jgc5v7k#*I@gE+0DuV2+bh6Ls{HXifmA{P>;&smWv01GDZbc5p*fsI#rIxpE-X=eTPBKI z>uStUVS2j?YMyi`rnGA@ufdlc8lM|qREud2Ghbzkm)HqKN4r&r~&VK^G5ZgwfgR>%v|HjJa`t6mg>AUG-*UXAn*pBhissL zM#_~2*c(q7wA6F#;Tz_IJ~pVCB_}JT9^Wt@bTJ$blnvYY%tPb=@q+8o9G*y1Tnh~y?+fR#q?%8=keE+v zJ|T4=|k0|@bjO&8WFWme0&Xb&ElZ#!h=7~t|tm{5OVDLPV zIlIr!6Y+iE@#l$fXZL9C4f}nOxYka<=!BYCe51)Hy3DtQy8J_SA1n5j>hI}XKDzfC zef{E0J#@u|b5|M0ur1a)W2M+7zjko6g?n@?ZHW!x=}yJ=1pRZm-Q&ByVN5(2wab=$hEWcc z{MhP|cC|NG#q`{s_m`kVNj|mb{iY<&S!(Ni%l_7G?r-wS_(}CkWUppjmx3QK(-`N* z4`{|1W*sVxG0>R85jBh!eUX`sw$_{*jTKdPavwtwK1q|;^?Ro@I&P_%4f~s(J4;^a zr$five@0DCJl?kF?Y0_kbN?NGyge8v&SGdCrJ?m8^yNH~?so#kYV00eRm%_vmv1W&qV)E>#M2%&xzK)So1n$ z*`1NK@^8eBJ^1=uUK$mTGoxY@##ZM6BX+Q|lE&_nmwKY?4vLrT4!FP59O%GWQAw# zJcF^j_Qbo^&Oy8uwGGyes)6F#*y645SX2sELn$j2>)C$;{$+40G}1tNBdxREREBR& zWL#|}!M0ha0~&-zjM2|FC(`nn{pcXgO{8|T-Ks$l$BI2|bv88YiQ~;#kSa_mgyDAv zc(W?ZlJA%*Ok>oi%8A>|-GrQm>yJBT^kE%OsNJ_>OOPMqi!Iay2KzC_nlN}Te143p z4C?wZer!jyNy+*aO z_==s;$}X;fRB$qQ>t&Ky$B@nTE+#h2Y&cvBWC~-yV!tvIl*0L3omFndt`xgR&Ewep zbGIXA*RBlSKL^_~Z2uhFm+|+{6|j9--_MkY>AfF`W<0X{Wo2oy-3Y6VElrrDWd*Ps zb3MCJ^yJuEWWT}S`&-Rxuo*vrt@T}#ENyGqbNNT}#;$(WUYr0!(}|0&T8P<;QhuEH zTHC4JvR3}TR&nN=YY#^A7O#G->|#k@%r0InRyXy70(#sezF`G(gb1Q}kWnc<{7 z3|f42cCd9cf_5KE!v)x>tGPjQ@&$G5Ic!CZ*8Dfaz2l7U)9 zc0Mm5|5jIgF#jHj_-oHD4E!n{W}f*kvx^TS3|@6KUJWkbZRmHRxfRU0?t<b8UqY2jtB2}gNv`2xMKsGc!LYMkIfEjVuK4O-B+1L0dZfNAntFqA@0FG zS7a>inGMpvI^`wXD=$6V^1}D5bn)dUl}*&4DcQk;HPfyjO{c}uWLA*H25Z(!Ki{N@ z`p?8(`mn*8e_x(2T}}(w(@h#*_mZKmds(@Ru6rqrci&62=4G^Vhtyq&cJ9BKE>FJp zCBvsKsERK9nL;xknV!nLnf+N9-)5k*HO(Am_NN-PmC{HXLqRH#Fg0Sjn@sch{a!Y@ zbLv6JK-XUuW0UwZ!}rq!@ALcvhIDcEdA??XL-%?1G`AuK@AEvBZ%p*>^PFN(cc15K zgSz`XhZuzz=cF;qI%S_HIuL72s3oM7)t+b54iv-v2Wo%G04#vG%@~Yuo0h5hgq=s? z(jjiNlAK4_Gjg3oX92Y7UYtE6*EjwiCf8x;e9>QekIZMoZ?MDo#eaby?ItR;=O@jBK|_~&nT_iDb}+K&vR0iG^N&Iy#-JEyB2)&2 zvHc1?W1=oFd32RbZxUovW|dDt9BlVbP(xPHOXdiH~ua|NIt=N_3bKAp9XC_q1EecPw~ z9JYXTcgntuu>4Gy3rrHjY1ZN{#_{i47!3W9MHRFTGc>_C()a4zh zeA}%pZf&;Zlvn9;AuSTyc{I@yUq7FT_9CGjF@<^vZAX4+?MQR5LR>r2Z?AQ&^dEh6 z3h_0@WxocqLd^I>%-Dt(l+&3_-OVtKL+iaSm7dC34srrTsoJN96>@ zP$kR9OTvyA;~3!Ikb|49#K3kEJY)UtHxrnFd`~s=waG{xvwOK{7C>+wOxrO@8~|E0 z4;5#6q<@Y#Z@2_6*`gmle;M!n?dpB93#e@oIeL*0c#O-v_Wjb@_h5PK{3TWfCRj&b zv&CC?I1A-%D32fg=UjY+ivxTIb%iP6> zJAF&zr;)g^Oz`_%+M?G2$RT=_d3H0XMg%fGLn-=9oWqc?UFq2I=@(J{;ETeC-OqM> zdMIFwENT7DULBu$;|PqAeU^CJ$BV7}(mY<=OXEsIe1CxNpkJSgUPfX-c)BP z+K*~(Kd_32)|bGEj%myRKjHSHnNaK?nw*E}IWu$Hx{-Lt*GLrl8;KyhE#dx|i2?0{ z*kyaFeLywX1Ae~w)T6h_pBAsbA*Z91m-dvmTugwa@_uuQ@$W(=rxO1*Om55j$<>$l z-jx0}Ir;~2>}LD>y&b5XA|Dkl$s>G?^?NI}wBV<=PmbCERMU^mmVuRdwDf=uP|T$Y zimh_=8};=_V;Qc?%jaO~Vd)G-`i+kNY!kfJIi1n|hIKa01mEbK&S-yQMdb<;e5W~( zk=g^C&S-z&$gf|Ru&eFqj149ASLb~l(>@OYrCE!ch`g~3jmq~itMRNsWyM<=%#Zb@ z*8DJQ327^%tR*z(xS9pUfp*F7eN7JOt3&LPA9a#SW z*YOnNI`)Q^n5K<;u2#Nm@En4S9#1(3)tQ!emz~tCA8@@v)wYoT`ZSR5*Fe1WcJbPe z<;j%Ky=a#;W2hkcBlSn@=sndh#M57)l27Iws2tIQ@kWR24+|@ou$R4ZbgCIt)DKw0 zr3SOBW`YUJa7%cW2~gm!6)H(kaZC8Tpo)je>#L>#aLeobJyKq`VMr?FVc*j?FMH;d z3Hyt_UB4uXQg%%C*8Xbg!`fum!pk7}7WRHe$89vcY(iuzxb(e0uQ1V!66;;8_KpR~eq@l}o@A2QQ!vK-H)A z6EV;dOxoHxfx0bOTi-_Ov+{-4nXz{~UiAZTfbnh;)RzR-G&Y$+E#l=uw4-AzXnvBS zo!PL4mXP`5#r_Pl?;}&<9ua#{#r-75-O9U+`03iLGByisZEjao+^MuH5`XgTiY*2^ih ze6=2cw2BG(oojaNyX}hPry6G%|C(#}><8-(Lg#Z~6NRnI$RPJfymcAkH&p9CjDC{6 zC+uA_zQLRcO_ywku{X{PZDKn-=)6PRK@zQf+*CqmSqD4!1|yrOXWD%*UJ3#08rs<&75>B|VviE~3yd zx#npH&xH7L4dy1w`h94|#w*|`Ux^AhyMT7tau-nVJEfgAW&#r$cX{H+fbWg8Bi$d-|yP3PmBJ; z?8Tt<=mGX34Rw-Q$4d2!+9t6llpmY=@2u;#BQV^LZO`kq)+qegrOEiQ?K(!j7Zp`v znwa6}vajli_9hFb%CIxK-*8jr$LFo5=4KO(2e4L68XhX{=&p@Xbv3O&v9~vE!#j55 zU}mubj8xv|hSo+-u$_ivTA#4BXQ=<9JV?U7`aN@|tm|KWluxDg`&a+Nr_!2~c>dLa zyGUTZLelfEE;Y$8olnR4SL69b_xAl#jYzQV0OHPrd#4Z4y2d=yz7=^FJmMQ#z4N)% z!|6kG5*fR(mvFDNjZml=3Xis7UE^#N2k^#U>ZVe-=aKAvH=SZ{d4Bx8IDdXqa{17y z>n`1KVW-S5J{!x2fc7@fKh|D3+L|6|kCpvn##6!PrX+uEY?vJy%s2V-SfuI%dmDlqdcL7DZ>TqhwLo;M@@3fg_ zTew{`Zs{yNk$yt#4tvhbSk%aHyJKIOKgR(j=3EmDk*>knMa7x8-#r`Iyo7C%t(*P}EHEGHy>9BRwQt$VaJ(3&H6!N^9S9H-JrFdRK$F8H!N2L)vF3f(2 zXKzO_xJc#wOtp@=J@MxtlT(SmCB^v1ypY)bil@KXIAtOg`L`ysj&;SBOz75Y&dr&u z_1#}EE%(YiI^vwxSsRxj)>+eURL4(D@VdMl4yN_hw9cA-qoq5_v~+9p$N^7p7n)%E z8}l!PCiup@C z`j&RFE$giF$Hd+b^A801ooR`LZ$%l5R^tbV%Gn7Rhqwo~rq4k!u3qD|hVvrT^(_JU z9Xjux$~-~3T%^yt@GUpudMy2(ln?3mVUIN%|6dkLsP*GaItZrkP#Uk|W=FHJ9Ctn1 z{SQ2E6#u@c*u0UP+ncf2e+I@+i8)=dSU+HfS+Wkt0=ZT&hfnjOaE!svFyL7Z+GQ^v z378(rwL?zy-32l?H4Tj&o!y#etZOq>W2T+d*&5$7K~$mH3xl;)elHC3Mc*jXP6eJ9 zhTSqTz&{Tq{iw31e13(e&50bYU%{T!;rA=l_nF3NfS}&&d{N%Nd~5bQ!mqHm=aXn1 zo7f>@mqOp>QF=_zCsEBnVF=vmmjiXFL0mw8W9CWX*(dwLd{R95CZ=dV6~cWdRV963wJ-Wv6*3My{|l zpc5JjpKp(fmUdk2-}0Y3l!3Ff6P&ssR-nDJhR)NN*-(Q>>2dfX4RZeUVzm#7_ABrK zxjlRqW+oDs4WrT|%eK<~c2eY5_1o7@zGXZ!ZaaA>H{II*THlB6S*Px!v)jp3{m|r9 zlJXa)o%87-?T5DI(H$qDaN8kF>-`=3tRK2y5AKtV*N(2aD^?D}`iZvAgLf1ko7?-} zI$UYb)c%Fg@m-wpczXW}7XUfWZC^bn_0zilWlxo3S+A%3yLKH486X(Y70Q4viTiu( zIzn@mrCDc414&rQIQXj1nKb7D(*Pcv@kuXmE`$iuPjhkH@7C9b>UX81-?;%Dsoi5l zYg;DeVvH4|c#??vJj4_avYR3M%?=e*0-$l|;=DcfUz81I4(Y~asaL~l00?gLZ_#<53 zxLh+$*Q7=fl_6 zb;P=U+3Ip7x>~!gALaTmtTz~A%C)(+#w=f?lSa^vV2N9+<@~gTh0cTHC2n*`Qh>j< z^>Y4+NSz(8v7cJT#iqSSpywZ0vE?TG^wxKLkJM7%eU-U6W~DyM&i;Tr8%)^byfxGe z-b5Awou~3wM*ZvGy8qkS3I6r|r!$J?Q>}lq>pGHH|3(5MM*O8l6UW9Cg`cMqcf5we zDE3G|xlHKS+mYh?%aO4XzvK@kiXJb2YGStyr`P-2ZQwjR(P8I-?(6>9LY$^4E%dDC< z$5;(B%j}G;iiR6bU9%#-Z}5$P{uS|JF3oJ{EPcf3ueX|c)Duwh!~1J*Jv<%KR*Z?q zww)(8=`ak(hCuW71UbGm6K8BppxFdEM{XC*5#Ss-$v5T4&*AgkV7e}b>3U5zt%FAv zdh=?Fv3~*U-|65w>i-91oBluPTjK4!YV0yav(7#KE%DSX@`UPaq)IFS^pn!hBxwgs zF&7d9+W{*~m}>|8no++U@Pa|zb?{kcCfeQi*UQ*D#ttx($(W-JK3A=y?0{6~ADWWu z$J6r<%4iGg$M*L8gVYby8uN%9hH*m++M&uq7{~btK`YZjjZV!UTBv2n*?p{?hvV1O zJm1Kp=w!;8SLoQoOy^p<@O_>s#CO;pjxTEu$Jf)uC-;M@G8OOq=(IjV%V%7DhSk$} zcH(+;l8Nlqc<)DHWTf)``V`;Kgp)Uw_-Cj1{?-)VpV&J!`6Jj=F6j?z4@=VfLd-b~ zWN*WbakY4Xt^eM=Ajp3Ze+x|hkJ3~ zOACzpeObPV0rF+DfhKkx#%X)4er!_vM8f*nw)#QhjHB(o@(Zc)>ELtO?fuU6=8ClF z^xls|GalKEi;&EUybq1BtZvfEg}t1$>Q%tT7(RpKshyH*jXE1R5SUr6M^{Bx8iF#c ze3PrV$dEQnE*83OpgRRqix{laszBmphwV9r?l1%yeqBL#A*=(0#`w|j-ts#gK}0vY z3yy_900}q*Zh`L``o(yM-2!-X0%9q%vR-B0K{c>`=#>zO9_1gP^@B*Btn+j48P2EU z-`y33SmQ@2fm&+*kZp(W!S z^5zrwLPL=^AGw#Ne&5`DFDdBF`-c4W%}wTfh1UAQQJj=Jtgo(GUz9Xn7wNyx81(MC zNb#H5RhaY^#mCXb@~3utO*4+=Z|PpO2!FfjTe&H=Y*J)>cbaU#kS{_hGxwag;sc+L zw;r{dmYLRa8ZLE{x}gl&P2Jf$fAG#HyAffJs!PG1v@Y!J{Rb)YKZE$!ckiz_e{T1& z-u`%%&ux?Ym0h3gMtP|LUwV9e=zajnx9(<5Zr4PsS8>l~53Q|O4jT_uG?sg|{8N#l zN5xC!CD)6$NAdX5sHqqW`oHS(?K@2#{pl0_8?GnM9 zB^_|F#Gpw`@R7UOXCTMwt@Pg*&nKLpOOHcS8waL34lP8X5&KZuvo_`58=oY$FVo}D z^f(lL+4MNn^h;(@M2F9hr^lh*Vw3i?W9e~d>|QMN+jbmU3r!|54sFwXZoF~msT7~S z(b*2)`U5sYL)zTBAed$%(~Rzpaatc7Q1d%OM{~o^nW5$cn9yZ*sCk>vb^~p1(0*u! zrGd1~dRTe}EL3nIW84m3vtf?eVJY1=Yh>&K8N0$R_R*2aY3X(_-RKOMuDuZd!5F@d zHuRyx*FgxjJKwB*-Pz;U#Qfc%EZNK$CA1pK8XTLFefBtP+2C<=fc>8vG`^+zeP?`o z80B{Tfb%FMHoiRz<6G#C#<#>9<6AS#-E4=s_t|0YT^Q!xVeNey{o--PEwS-Z*N|}w zA`f`ayMwJHaNNQLb=c!(%(6Iq%;Jt$oIQx7;{g47K8aZ5GP-D^p1UeP!k*D{w~o{^ zSMt4}XC6N4@)YQ=;qu%qYn|t>`2osP%H_FhNV)XJ;obG9o=OM%Z4!F~Jol9N0?2QZ z(BII*_#3+TN-H(XXc6>oS+pcQwPX^9za*2aN%|XlhLk5;ZGHJeehL}i2m2e)a944| zo%S~v4eF(ElN z#rHGOAEpxj>=fT0jN4#SiGR&klbFv+`y2L2f5UOy-YP%kUYplT&wIxfH?WxyX^Y=4 zJ@1{G{(}4sTs^cOf3MY#!I+dvrJdfG;`*{}xFjc)_#3d9ES2}0aA<2P?`NmDzH8gz zsm0$=k?tq=hjW9s9*|l-=i@NDRLW^I#d4a7wFjxhUy$PbQvtlbsl>nJbE&=GP@b-5 z`$Ij;4p?WlFZH(z)jBir8+G(PIazlm_MV(ej`4fG95->Q@%PscSi>9j&9RibXyHIh ziMgrFoG2N13LkB`KvisMAeXDeK{{6Uz8B9B_z7M$n~1=W*qbYqo8j}C&oLvuZf4)x zf8lEXs(P7OEkN*uzxdPeuDRJ zj$Yi~b&{rj4CWBQhMPTEVcdp^zm`x+eIBK39OD{r5^{ypa} zF?~xpYfJmOQ1#30c|Ut=;`rNYUr4>7_MRTN)Xal=v(cRQ@G*YI)(4F{6lW+MiBA4_ zoC{Wnpwil69GbM$10F6>~FC*v_;f+noQfm6q$<_4G6kPLJxJ2Yc)FyH*au zrVm-&vlBLpJ^6uchPH6z}7k(mtv`9SO5kr%SxqtY>z3XmRJ|5G(OmQI?r zCp?fJ&f&m*0NhI%GS_Yx){R4kRB?u!`JhR2oVER#(8yp!y2GxmG^U%9ht@Z+JUk#( zdMEo5c{ah*|Cy~50wc=meM*?#{c#8A$d_MKm{16DHzzH;IF3q!UC+>i8*C+?qkmnV zVtQW14TpYD^y`$T!IWWj<75pIm#0jhe7hhY_Ds;SxG5wfA2;Kg#H3eZ=X;mT`5aDD zxIMgLO9K+^ooiN)A25sS&CQ!D_2qE(2QuIe6E>MIhoemk4OnmYSA*haQZ}UV4daaN z<~)<}WJuHTCH44*dVRJ*&0(2zt{LqGw(bX5+i*G9Gh3)pp(I(C0|}`tXm5W`TiW-Q zH#@$4Zcjha+#Hib+V}MM51Y$A?5Z0zs#Iq2qBH)JC3L>Rj-J7cUwIQ?czLhcvfqyX zw*5U;ZuZIX-ydW0wWnU}dNsB88}3j1e%k)p7wj)_;UsN;Nu5W3*%9`a#P2jA?Y6&& zUy%K!>>c!9^eDR^p8X{+BE21He~Fy12is& zMQKahUo=k>&wsh(p~UTTy!Q)UPW*mb+xPbLQ~8?`%MmXf&DfqSexb1V+nNrsBW2v! z%1NtS~v1|47E?fS<7(E!&guSJN;Ss3h-?!461G9FMzM089sv@7=>Uo zV*CY7F@FJ;2$@H8GhMk(1TB3Em>PkL>YalbLWxBCjqds($hc$l z7OCZielZfp?ijp@k#lVsy=S*|O)>A;*`DQ8FjiB+#G}dwjiXUU!p`|9G{fRaJt-Bu z#i6zsV|4O;Ore-KDR!Kmn7_ME%J2`^C&lsl_eq7ui!3ycN*DY+zVklb1_6ew$I!pn zeyBrtA4~Jo-FU#K-Y0(*bSwUyko^)Uu=F_Zc|H@z$6&@!F(1R8-{&NLOC>J~?uU9m zQ(QfDXGN>`{eHbx`;@33h8@sazvN#E(-YeQN$*pl%BOu?j-M&O7T|Msq~S7p;Zr+^ zIz&(1)V{B_>WS(ZYABbd?rwRqdP+1O8(f~aC6oPJ;XW(UQyiaFqG?=d0PN`|B(cn+ zsPX_m*N5G`eOrqcpw3aKs&kmnPPh-tce)ChhqSi|4Q1k;Qi1!ht~a&RS5MIlf7rv5 zGi%lRBxG3oa6Nb6DxJB=PqatRMQdJ0FM3Gbh3G|bC`{C^BpQa`+?ngy5K!+^c`$q5 z$j{>BEBku6|CM}=_}XAt0G@A~x|BHOpV;}{MLC4*s>71AbuKsqd=EI(zz804U z=IeE>^_)rlnYJ{18`&spb8OaTc*hLo>>RoQ#{l_ql8EBoN9oIlOtY;n!+$9Sk9BzyIe4}Sw!dMpooj;En%hI@ijUGqI*KQ!q0JUKNS-{4Pw$e`7Eo5+=p&3^b6tv@pZ)9-ZRCXU@SmoJ%B zgVk~w5S?l-$Av%XbG1`CAv;wpGUTkC#b!sF_NVMvl6agGZ=4i;I`%%9k<>;=JE7J| z+55xO_vKQCp~u4cYTAx$b>toQYkoU7psBL?PVF@1z35%7BlVrrzAxUFJNt@Q`Dsu2 z-TFlA{dD=GvL(GX`MVPKk2No2O6R}6@~7;oHkLms+w|;D+y0^RPUZbf z*np|Lp95n%mG@gxjUOv3Q;A>i?`u!}pNM7P62G*AwiK#znBM2SPwjJ-c3SfLv#`!^ z$v%EQ_x6Bu(ZqgJ?fG6?w_Kp)6aNC0BYLpTu0!s}3M-eN#eF|p_vw9BpT2dm6ZesQ zFAL9%^{3K4yX&{wI`7p{e58I#{ckmY_8c_^-uxLYPwiJgQ0;{6@X6Wrwarogy4vlr zd9naM4E%YtGS*&qhEaSf_o@xH3nQw`)oB>}7aP&yEY!qAgI=f!Gsm9G&Td2Phs(!! z5$n8z7LOPfoyw>#?_)9_5Ebx^aA8-2~4Uxi{B&id`r9rzH{&}O7v6y!N> z-takYI_#b|wNIv_>Q@+_c;lbKFQwZHf4$l7+Y4zI-1b5i2eq}m@c8YibxG1**jCLq z4y5Ym`G@&_=+8!b0j0<|xjpqf)$`c)cRxoH8u(Q7Hzo=DE?zskt3DQgobpZAae3wY zX#BuFffr2Qv@$Qk6CBw*|3SYohwzCBUYD1{!TBcG{zfl&l-WAFHg7No(=19!z5NaQ zs?Y@Am>1<>nnfw8x4&U8*?Z9M%$vr+3r(>74HM`(^Y(pu3xoZEol!qQ7~M$LK$9zt zW!Uw*Kb)VT?=cg5Rq9*X&tY3+jHmaSA0h4MsMr-&F4KMvTRurY^z41V(!TBII1DmPy%Hz-hQ5cPjWCNKwBWJidvu3AnaFh!|HLD%k&(&B`-vs?{2h^9i{SBIH^T=34{4LSl z)Vt1XkZ{4JZI2gDw9%T)U1)wx-WS_m_{4jk-ia3;#9#Q5eDp#5U3L6AygmFS-IR_X z{yLm=iTJze_;on(KzMf@uH~b$gzz3ZT)$6qmDxb^epD%?;P_ zBe+%m==Vt$yzk3@{XTt1xG#Tnco2V`zMyczh=$|{ieJAU6u%A+%0C?*lz%$?LHVcO zCs|V|-|cx{>o+Le8 zJHK(2j_+~9eSzs8ou+{jhck`e^dsw?1ard$PybJAAgzJ42GSZxYap$GvAgzJ42GSZxYap$Gv4F(3XmS=l>Fo<#8<*i`W1wrf6o=g)WlzXSg9twBp=eO99P!opvy zsQ&qJU;X~7VP_S8@W85}eNyEY7LVW;e!K7S4fp=}yrVz<@jI_9zu<+=j_>Wi4}GJo z=UvZjdVXoa4}P1qBGvf%-ZZ@Dw{KjxcIH3s`TB*;^X1wWN!~v9|D_cdFMV|Ekoxog z)Bor%4=9%7#P>NlMWFAO{(0m_Z*KX@qnFnm-TU}g=%$U7p6`9*e~-VV?w1Qbcs*}M z?+s%vPKj9uynIcc{~f*gj!n1K-v3IkcTOGnLI<#n%OZc#<~MH``qBl*9RKDy|G2cM zJT7q(fft@M|P>8$qhFW>FbedL?P{a=0IZ~3bVHhw47 z@{%Y$b+_(leCnH1|F~mFuS;&Z@$Y$^9p8rS&;Q~5FW>OeYg@kZ-YGYCO}V{Kl)ihu zclUWqFVD~a=ZY>Fw`SFS+}Y_%Bu}F7UmbPm(q}3*_WJYhj(_{EvofyR*X14ggCG5V zP4N{s9CSqC!e2Lh_2g9L{obN4yztQDJCFI=^C$GHJ?_Et6X{FBJF7l!9{ARu9;&-! z%#D`~f9X#R*G-l968-Nic@o8&D7<>fFWy=a-TvX(V|JZ*$ZwCDk!pS=iZ4<47iP_F zo;>TP*H8P#{~NvZn3}KcZF&0d825+JY0J?+LHA9uh%7vFu)`D15{ID2(x$9MAYkNLv2S04NF<;`y%ec`PCyS209o0ngB zS4H;en=3Ed6&?TNA0O)M_!5<;X%|dC?t>fN8}{~>fBej<=Ar#NTb>!$^_sA9#WMx# zi*mm5iFoFtr9V;lJ3qMm=il%3c*gsuzVpH_j*FhQugg1XTEm~mKQV08?Ad=j zAiD6LyHl0-i7qc5|M^h^Hy`u;QAgZ#?koS7NM91Zx7zoO&sY8ZkMAGZbxF$$Pi;M5 zbeB}qfAN*?|8dwSeKv1D?$H%FmtT|e`1!E=UmKBq+pOm3BYiXShZS9rs(hmFz4ia4 zE9Rg7hpT_^_6Pr3{evz4_~9YR%CWb~N3!y@m#+5u(?37?;=JXD3>=t$_|yM)MXLGx z!{?WE-SO;)$8S68FL_U8mi#AKx%QTRzukB4&P$i?{^{bkcV`V7`#9aJ+NsY$e>#24 z;6I-An=8xmzp(Y@i&AdyQWf^(39o*2#7U$7a_A*DZ2kGibHAA^zrB@T$;uZ-_oI&o zEWhcQGv9c<`lYWtTs8JDot@uda_q18NheoTPCt26<%0Ru74v7DJZ|ay>hdKg&8~_F zbdrT4^UCMUk5p7vE~t#mUyuvh+=UCO=I73tpS!TUvZ`W6ZuQcI6=z4<$*-!qyt2AO zIR;3$u)MmuqH=!63R$saVP!>C)tm+G=Nlku2XGBkspdO==@sRbxsmZpr!SaK|H>CG zH2*3MSiKm(#*|l9%pZ@8&5ev3WB-@VsUBBdIcNT?+z7s&zj)qd6`;R}I9)tv?u_Z> zl`|sa7cU%BUTp}>f5XOn8#l)MyRc$rZe%1yJAxuDEuV)!6?g-0&P8M+=FeYX->;}F zpUZL-F9GSeG5CkL&VghX&aR@M>Y|G2pc%DzzWp+O>9{$NuB6xqRZ?u?DJd>nFk>sGnapkU0gnQ&dfO|$R1QWr>Z*k3-8m967zEIRT2EQ@!<=D z;62a8Qc_(p&+xWCAu=LV!1?9#Du@|gC7G_Wwacw?qbf+{k%1Bm=dKqTE+6;?~s({`i1HBv@2wgF26M&b@f0JKeX)+XVLFM>M z=_YEU`N%-lJjD#nBb>4*G7y;@83^S^26AR`1PF}`M7~3w@_G1E0YOZL8v(7*Hk(bv zb1NdGuBwIQ(<^3>Vj}}h*3v)2U9y(7Y4ZZ1CZhy2??K&GbbR69Q57~1A_Mt9wR2x~ za^j=}VTNhgiyTp4aNIB|zouZc62~Sym?M|-;1?-N0$(FV1_n?*1qM*w1qUEM0|QLm z4i2)}ANZD(M~YEA%?H)H?1 z`cB-|IGsr4e{4LhaeJ>{kI3PE@<>1PyGP^%2S1AOlN{XA^@!Ni#{y4f`Y|!cd^?lz zISzg<<4YZUEaP8u@JWoXbnptsZ*lMijNj|vHohK_M;*L|>9;v}J>$1!CD=-@wMe4~Tk&v<5&pU-y2r#bk)7~jPBNS3F! zF-9^XIls4j1V5hfB@SN5_;$u6y^|Rq{D7a&62==C7y9oqzQe)qV!Y5cES~h@~~h2TN$6| z;F}rW$hf4d+2B1Q2b*+oVZ*;S82_S!zsvY}4*m(_a~wR=bfrBas~r3g#v2{HKjStZ zV)7i%__GfEV8;LD;9q9^KqFU-PZ8sJ4t_r4XFB*q#xHX4%NSqe;By&Y>)=-~zQMtl zGyaf+f1UAH9Q;PcT@&U1F+RZjkEM4#;{^`>zl=|C@cS5_@8AzIzShCFF>d3D#rquN zTO9gV8GqTq|H=5r4&K6e|I8R~`qst#?h!e|!Fw})k%J$~_#y|-WqhrJpUC)69egO` z4>B?Kq=g6OXe!EX)09|nFf+SP@R+x9`!`bG%-2O;X)n+IS*f3(37FW%G7Xy8HRr#b|$3Bi9Hf^Q4K-w44E#QoGk z@_ar7KO+SH3h+aqhn)U4wO{8%Ul&4u3vkMpX2_+VhePOhhT!jq;79ZcPS=Sc_*o(N zVIJZv9LPp*ZvA{ag#Pgm{3GVm2zm8$ z%)!BO7Kh+-fs;Jbz)wHl4x#_Q5d07Y|7FI< z-0a7vFy4Hp#U)+W0w+BT?(2{DHpVwO_`{6vaPWUH|24cbK=@~Yj^td<4pYG?J|q9j zemN%tCwUsJ1KAU*j_Gq=_sf45(?<^VNX?g*nSRq77C*wwBo(uU%KN}CUf=m9M2i%lfy39;HR{{@`zcB>g%>1YIwfrSt-emsy zjzj-Y9L!Ae-UUA&IV5MEOh9<%Jh-r{qldC>Bl$+a^KJNJ5Kb=^D5JCb?Eyb z{UlH08Gin!0ypv;p_GHKlbL?@NI(DOOdsKXT;BRA)8`jk`tcm_Fw;jJ`hPP0O%8ou z=*8rhLw_c4l0S2lpZ`~wexgHv9n&vy=x+fYl(*P+^_J1zq4wCaM;KXOJod}3Xddq@>yNoy42?a0S!yq@wlk*cl{aL_Gx{mh8JDcevcl+tKmG0y`aI|*h|h%~_}UQsmm&DyL-0PB$P9}2)DV1f2!2fn{v+U| z=QVkLJ!}r4e?0_0BsW;jGk_ESg5&)Br!l_9!B;Wf;^4nzeD?8vK2I^e$-!HMexRTJ zNR+1_eHH;HIdk&;^m7=W?cm=C;d3X`w>b1K2%i)D{Cl9hnsV;oComp8(N8~C=pDS8 z@%%6N>DMuSlY>7X{0I5zUuV3Qm{IVL%mIQS68cR2V&#wVWQ=d+ygtqy)G;{~Vs=^tc#y@T%* z`k{XMgHXOn&h-vHjPZ%X{PdF;&pgeKFBf_Tzg_50_tQTi^bY6;w--!T0crtiu8pJV#14*kbWztG`-B-#a%f15*pmccP^;?RGE>9;%d z*D(D?N1h)teX~P|9S(g4+9UG6?Q-Nf%HUliyBzxAOrQOz)xYTHQl@Wl z=&xk@!4Ca*m_Bl*KY#z1>Bl(q+n7Gnq5lWdFLdY+M7v4)&vxkZ4G#S~^wjGrkNv1pFBUR= zp+kQI(~oiduD@pbs6+oW(=T-B-(~tS4*loQuTZ&aaO4?gaEzB7`iq!;qeEZK^wS*r z8yKJM;J;=*+Z;KcVSJZ^zt4OYI(!a8KWF^Xjvu?g;OKW8`iV?G*rC6Q>6bh7KV*E3 zgWtz|7BU~n$7ZH)aOk_D-!*!6;vH!4u92G@`tz86qr?Alrf+oUYngtV!+!(QuXpIT zGW{-xeh1TUbm)7+4lsIl=5YoZ9OE5_eiYLWcIam^eUn4Kis{EV^c$Fdt3&@72(z)_&*%0sB9PisQ@7sm)ZNw7!Hqzraa)Mw* z9_ONJ!HU1+eH$a+MxEw;o9}%aCEw2Vq$;TrtmHiTcHUs`nVjauo3g*+c}b#^G2R7SdmCSuXwg##gg86=X!6PTOy%RPrj0If|V|m zZx?)3zKyv+zKtEv-xhr7Qu$Ucd9>g%$)g3;BEf>{(L%Raw6@?1$*l!fNO@Usg~zXS zn7mP1D&NL?-zG@DEtnwXZ^1>2h3=xU=9_G!SvJRRBb;h?(oCH*f93*ji=hsrtu*1G zcE3zWc>F-xO%wJa?IQ{eiz_iU)P%ek&JtT{Lf*liny`?H>W~n#t0pAOY^woxM8Jlwqd1jwqd1jwppWZwkf7>mBQ~F+mR45EZxVTnfCR zNfFPQK6UZ@h1F9lheT%0p1y3}!pb@Grea6QvN^P~wQ6d~ve{F8FO0iz{L~>wXDMi~uUHakQK^QX=%ud0q*R$f(Mr5INYULwr6 z%IT#GrpM%Q1h5V5rKgOKQBV>|;!~}}A$%+5Ev#NTvV87b6PqV+2=&6nRkK?YOD-;S zQ&5Z=ZFc2*d|P$7%Vx}smRC{E*$u@3l)j7}dFe=|kEOH~Q``1=dDkjjM~V(1AWpB? z&~D*4F=_ef%bvv!$? zGu~8hhYfPu$QL&&iNYy74x42&X3VRibc$l6#JUC6L?+aRlJm!xmW(d; zNSsJ1!m2Tq71M)T3@H$^mT_AcQ;(ak#fyBo8dkK*mz8_6gwf2HS-dD=rW7yISrWnu zSyQ|ye$DXsh}uI~k;0c%K@W-ODnwTfBimk&DxZr&o`}bcg+ovSZJx}*xgxXB&&<1W zPG!Z6W%K6Dw=FN~r@>7}5UaCq0c#$iPlTXsD<3JEkJs~7i$fxRY$1NmMR8lJJNi?6-4LSyvKV!_H9A11u(o=Ph%SH%91yUqVOB8dQ zaktlp7#iUmBp#Jad-_M*R9G?`C6WY{>G2b2jW~spkVfJ&@hIXYjffJapNJAA%VQK* z;lLS1BU@I! z^fFjwhQxkPikq+hj&UPpO3ND(p&_XP-N*&==9Q208GONv{9=VwE9-@d>*C^i>Z44Y z+TukaDe+WSyeP4Vps@!ZnL~HNi=#s);svD|nVK9=moOev${yy56M@3zbm-!-^pX^p zp^qvaJBnEjC5kVfM-`79H8(cF;mj0GD62WKGqXY%X^I4FytB6AvWih9U}r`V!3~NP z$~VktRn{yGlw_shfy-b!aEU`5D%HH$8DJp^)D#KWpzory!{Ra$ngpz<369Ih5VU6E z4wg{ie50jSI2SQ32hw1E0K}o5e3&uNqKyu6HIK& zMTfq{)uAFwm_SP#mz~#Q3bVl6A74q;Wn5g#zq*p6i_1x9#Hk+`-RL>B|<`nIb7*p+uym1VqRzd)j9rLUZn95=8J#Cx}ue4dQuEs6hBi zWoR0499;Ye6Ab;W?j@Vzvsy-ui%`F@H?XH10wK@!#npztHw;On92S^JI8!lLt0AmR zcE|P2lje>1Nl@{GK>R3qDmH-{67()qAro~|BsYXkhD;`;;|fL93}>6h*Lq^t2Z=>X z1`@=DCO#2~Ook`mWbzn2eC|3oS>QGb~p6(1nshCIE6CsD8lkN))j^Fh>?UbNz~+feSVxc5?BSEJrK&m zqX?6dZG}(<32X_kZx3bQQG`k08yB@I-f@k?#1>|ZB2+*z^b!(;B>=_A7@eUEgdmJT z%(@L_5hDp>lEA2i3^D=;jYQFe#R3u;AH-uLG+}IbAQ;Lb!9dYmFA%3C=kV~@%e7ac zRhdgLW<)TJ7UKwS!oy>)rm!u`FKU^paMH9xx8O_p;r2f1u3EOibH{tWq zZu`jgJHo%G@F>31gY8I>@8cu%a|y)b^10r^2G@KjE_#U15AYE__YsK4<@1b%Tk+Y! zxGPU@yKSo#pW_v-zfZ z2*ICcoc__L2p@VrV7wc?-;9s&>D84&t=?|If5CGYr`PBm!H-h(jS4@3agy^^g%>G4 zTAp&oU3nHUPWhjGm7aAKfk;NQDLu#hZzb z=;si|N&ZHK_h;PI&v3zm?#lC+;-lr+$+#=e2a3Oz$DVI$%hiD@-YnkuOZwFE9L~5a&rrrm z7A?J6@M+yLdB=IlIKcAujN_6xGT>(#fRj1i~iubhjCY)hZTP<&vu3X6z@yD zdy#QsOP@b7|JM|~ZU=TTPI7KgeC&CjmItvY!iOF?FO>AJ+kr1o<;O#`eee-^PGQ{5 zui=cl`kAcw5U-)!zTX&vZ*}m#O#dgwDc+wcd7fq5P47DnpUKRpM=!jLhv;=XFoC4L z8F%HmPw~<6Jj=K%51rphkE@>+#fQ$j5xwnJ^o-PCi4*wrB|7R5a zdc~)iaguX`!as8O6d{bB-c(rekbZPKa0KI&CLG1+$$5;TZ&dgo#$ElCDn7)kH`_xi zLvT5VlW6H9_T}$XygyU%KCI%^>3zxJKa}HrPtoi4p*K|$JQACTDXh=_|QQ@VGyZWJXZRwGC?_~LJ3&FQL_>D~eBI6|I z&+w6S?PT0dZw579cqHEEna`n&6TNN+hBNN!;Ua}=duF!cqwS)#ie9&?KT){mBj@6h zJlZaLUeRkl?T+J`)umEzcLJ5y3C5AXzcTLX|E&=GBZrTa+rz05!QC3A7Wid|rY*hH+jJxs-ReZEOV;OhlDOdcpJPQ?{BUHR}?k_#AJS!M?^& zH{A~OWSn@@hwek6=O9I|+kqU$NzM)UNckM<@F^lDc#0ICoA6uc$0_=w6@ICrZ&dgU z#wlLiudP&kNdBP*;18brLh$z;yf4##!Z_*YXZVPmnbe5manqa2xae&%^BJb-bvsb% z(0{~!oXLz+yjnkNL+ICq&_5PJ|9l92U!I5+`9+?~87Fz}#Ygn;eMNtt!tYc#@e)2; z6d#?gk3#74sZqm2@%|PciT5PNN&ojNypVB`U;JX@9bDv@!MLmEtqT90;{Q0~ZoJJQ z{ND}1yHVqa$BlO=<08NK0gFQDFID(G;3xW-!MH0You5sQ8}CmP-h^=BbBDrzukeQz z{|6NQD&r!*)c1E4AD!=AsZqv5^vB>M@gBf9$=RszzKm14bbTMB_zrEpzN z<}18O@xMmlzgPGTjFUXNoZP4Ab-d3gT=RcP;hO&kivI&D-oBLCc)IYXl>%sZ&&m>T@Na}N%4O|;W}MA6@Q(sZh3eakDIQe8F$llrNXuR zD;Rg>zs=!aWTT7Rsrcx0ZC3R3RrL0VqHk3A(~MKRw<`QC#fQ=+^{dx$_<_ew*C2)K z`gI!P#9!C1$&8EM=5l#hs`%)1J*sf6w?8ZX8xV)2_g#m-)UR&Glk~0SKTP4ee$n~v zLf?ch!vBj3*X3jc?l5tDQ+Q}m4rU&%PdtLxV~#fRdS`gM=uqvL&E z;ktgkruggn)te&3Bk7X*bpqpV{k=-zT5qcur+*vpk@ViixbT(}E7 zZ&LhUP`EB9?=VjPbp7g25#n* z#7^`7mcn&8S;si>-++&#_ddpjzm${56d%q1MTP5f@|wb%6#xGyT<2r2K_J3I^5}9h zlyNs*=PSGk?}+@DC|vVjr1(Fe=+`nX>6LP_PVv#{{kfv2CQah~Uq#=j@cS62bm?;P zwBkc?OF4N*@zL@2{UV6)kREh7Ig)YWuggghvD3Z;;+le(++*X86Bg*PD$qR&1j;RhZ{ug=G#8F$OcaKal5Zz%p7z(Ug7`&7$M_)ELj zpK(|IlNEl4;&Yn9n-pHGa9vI=VVu&d`^T#p7kSoldY=x#-%&X6l5~{~#Sc6r|0a9{ zznF2N)q2xecl&B|D?hnRB}GgxGQJ3FM|k=tLI}B-h^;T zZvo@P=TU`ER`go_WeV4P8bbKospvJICl#*w>v*42xQ=%h<8Hj&hC^sP z67O6tZ^tq2>hoHK{{iobK5H2#{u>m2pQ6|DKd0~}MKAa6xpMYC6GV7K&f8ed86o&$ zg%dB1E^?p3iPu`@^CIJv-pBBfbPYNSKk!JrLVp3{F8w-(Ui7&+g#Lfdw)|Z_8x`IJ z5|QUY#$ElqujsY>*@ZFwn$Pi!yL?tFdY!*FDEbYNm^`;A{D%tfIs!lNP`WgqK8#bm zn$M96*L*Hed~~{IE4&H3L_fKjRedtqLEi_z*7{|Bh9BbiCCH|Fz=tHO2pah2Q4zm;E`vS9~=8j3{2lL-OB+ zkEH8B#!3DS3LnI{=uO7I!xbOR{{n^U@$W?nZ&Lg#6t44eDdQy1W<`G^<08+UT&`|Y ze6&1wEBw!j&;1H-QuxCP*Ydo~ILY&XqW_3-kw?l^?-CH=JDhRhFXgIK@zMOJDqNSVnF?=G{1+=+=VLA7B#$mvw=*vC3_S=0c-{)Z zOGex96Y*~oK9a6+jJxSw7efD&5c*#*F7nJ^c^**o+TM671b@}xQ_XxbO0E3e@b6|N z|G|t?x^7W;F5@K6c6>hOb7KZ7`rj$~A&iqAbh#>3e2CYLEYBRqU3r!&{#u?jijS7( zn~MIoN}lgA?#gqY;zRP3X5kN>k3#T^%WOE&(q}Hy&vo#jjIU;#^!Xef#wFgXIo=Y+ z-F&=6@xMj!pRM@(6}XhE1&aO=MZc7BHy>|Qd`Kp-S8r2%bbHe80ubS$^gfS|r1uEM zUH)HWT+%E18;cxV;vKK}>v(T;=!MT86up+`QN~?)UU2w)ltrmQIviZ&=|9GXi~Rkw z?e8x!?&ensE`qR5DajG&EH5qM@OY zp^=eNqRln5xrT;`g@#6oipnGv8Y$XjRFk5ioe~XfDpd5MqMjK^aUvrn!@@!@SFuY* zUP|;*{q{QVTEoMd*?;}^=W~Glob`V9cdfnN_q^wTVVFS=~$mHAf7rqo)JXDkagb^9#*$q zm2cAz%D3qU=&a}m=y2U8@D=?4{T2P-^yhNLb@=zVphNvPz}XKwo|zoy`=Lm=)!+J| zOu5v7`X_?3A5H;JhhwasXMuCSE>`aQp$G9?_kM8dZvvw@^LWlZ$)&&z` z`0GZ2a^EKv%B^nJCu^WX{jkn`&|w{Z1kO7A6g&+-4}h}{Pb>Fzm{V?ktPZ<;I*5kh>u@SK^Zk@^pKqITuYWUi znC~yaS?39GuKNe&e%-vYx9|T5@N@{VeLM!7bvsqLuUnIHpVv2_!@OPwr~kh~zaM_` z>cb=q)3@thQGEt)voG&eF7Zc(hvjvwa@ofec$IR=i}!(b%57b{?yXbq`=JM%*S$NH zi~b|wVSdJxn|{u2;mI)mT%Y;2OseL3;7$wFTLROMd(wn%(mB>v4v{OX2eU9aD$-21sC5`QiDt*B3Tg!f1IgAx9V z2%n1Z1?8)P7kSv{9u4Ov`5GV8erR)iLHT;+{=6HG#E(VdSD&|XUDK~pF8ZV4VSRNG z;%C4+z$FLM*#I4$UyI;dpz}}VvhVD}+|LCNhSkUPiz2*Cxvx)yi?_eKYl*~P5B_*q z-|DbIx%auz>D%9x4MT@@cm{j~`o9BDgU>6Mb@_XN)r|p!VfC?f^OXBKyc?YB9tEBb zdX{gsa=&h!a$DE_4(dzLVZOfw|2gzufPO!C-uYn?hWCFIcse}4)u-}917m#}l$*~H zJ&%SX{FmUOCHGh|3NA>#n~vpsf^zZ6-^;xJ^GUqtHQ?zGV*bxlE^E^Ndc;%zHt=6V z=eOXDp9klzsAz%6fKao%0;GekfAz>s%L!??gQN@CN1HPs-_R*emfj2tJIujVSki77)*R zu5L;6e0-Vmt$npy5?2+8KNI``_-Rn?^J;_si-=zjofZ3wc={iU#4q`H^`CRu_VYam zoc>Fcd;e<@PoEcpr;*n>aK2yr7W6kGexq`$e^p{TYZy9Q_ZNsi3OY|CJ_SCdT=Kdd zd;vPLw!QD(GW1Bt!zc)N@=kIaKecc+ATVD2g<5kdMUR%KLgZ>2c`@t8SzP;~W zeMJZg!~5R{{O<6)`9Apmuk#vk_Q~nWeV?>Bee08(q0=4KxBYq% zoP9Ei2_F ze-rfCCsWET-!*zYd;>aM_wX+UgJDP=?hg;ks|=iVK2Eu>a|`0Be*<_L`Zt3!ue+ho zyvCIKyk3D0*Zt6yVX-hIFZw@8x%c0s-1P1IYJ(2-zmE8_u!hy`+lWtr_b8Wjc^w{v zj;w9x*RP?&br-;Se*F{ryuU5d5A-arChdn0EBF2X9dOp|R^`5K!%pAMuQBM*{~y75 ze!T>qM&14f&OX`YOCcx>@x$}0Ou5hN6!3I7#`fzBaOz(S{mqD9uiWZs=T|>;nD6u8 zJilhZS?5=k`#KkWIhY8;=XD%-Iy`TAodnLj&QUJ<%&Seg&+As`Ft69a>3@f>1mQ5Y z@vq$U?ffcJ?(;eU@$U+t;rR?HRmHKl})s=hsic)8SC7=fmLalV2;B zdh+~QLOk=@`>GHahUAqF57R#oochNo_kFllx%G*iUl&7%>)rv*^J^nG>wLd*-=A}c zr~Xb?hh)O=dF=tdDLila9;)2uRi%7Yh?R%sb*^&J=em!A)BlsoxACuhmFnC1wFDjN z@AlOYsIfDs=UZ7moy&b#^I$ZUN{Q9zT(dYTq>-6pX`Z;u{ zU)T`@!Vv$g+hNLm-PS0#y4mYj9dxLF5jfAU%fZuOZL8`a66rh=w8ho5REW6ezcRt0X9l66L-RKY;l6hd9$Y9`PygHOgh(+rb;4!#=qR zI?T5hoPF|B=(A5IoPLSk=lm5q)Iau`U@i>bCsoRQpEM}9x>=vJK!^I*g0oL<08fYY zt)91nb06hM+KfUPa1%ULR5J`~Umk^xqHt{;-bu8FTt}eoaA# zdHoOK%c1ic;#1&D$|WzJUwPLB5QgPt*Wn|T`@GhI^Zfd>@VF)Z=hx}rY3QE|&OTYET>S7lyg|A7+4^^< z(4n6P!KpvvbgUm15Ko;QzaET)A?qF!9#)@Sl^+&Z3OrA__-8+qKu5H!A5MY}*KGo4 zKU@xd_Ct@;-}-l_(4qbt;5?6ZTp!GZ;rpRTxz*qLp-j2df%+$cvmZ_YPlscyo@aq` zzb;np`=JN%T=#x(>Td$4{&UdZ3_lCXEnn-C)!zs~VfcLaQZDhwhKJ>~AL3KsMaq4j zR6s|xtWVB>4)bjTXP;aHefG&lr*E&zPeO#wt8L$&V9U2x$l!+<>qH>*B}imIM@Aya=&igx3=&9 z2=H_WvAP`t&bpnd+}Ev1xzFnx&|zLLgVXzZr>NeN(co z*FRmkuTOm>{wI<6|BS@HO`0YQufMNy@8?UA_-iBaJ>a*7b!>ls65)?T_^%>-I>P@N z;j3=Wq?@__q@TSayePuo7vXD_TmReNlbn1@vaa#oy^?u@;}+kdT=qp$vAXs8c)iXH zM&h@CKLDKx<+8uLj?H;}J+GIbLq8SY3j$$ypQnST!}I3<9B^J|)+rZ1n-RZ3xz)`+ zm$(}`^z+}~_d{n6{66r%EBAd~(i4Kh@Oga{JRP35yiNsYUgsr?6ovl#r^ZFR#D}tWobsFMR;C0GnUB1q?Ku6ZL*V%7Dhj|Tx-wXXm zpwIrCar*YT#9M9)2Z!PFst0G?E>Q04wqCi_&0c4FphN#Z1Ly1P{ov`~%j)@aaQ4Y_ z%Eb>~XP1C@UV3sQSS4723$&O@pDe!u1jA?g`hBO-9f#M zb)+(QE4TO!%Kg5KMB*nR@vDEZef>P;UVlv_{)dQvC`ekqPb2;n@HueF+45R~4*Q|( zhuimAuUvdS3jOnx%f37U-s*HFw9e}tH$Oelr=N*PeCDJL>xrL-vF=WCGKb;)*}^)8To`>kM$_b+K~MXI|@-`@DVv9p<(3ok1WB@k9T6DBs4va?`KM93B3D zwa}sdClLR^5NmmziTD(FgK}9{TFK(upd)MB>)p-J;kv`%e7$=d`n(RzIemM*d+U$F zVqy6GY6NH9E>Z65wn4eo&0g<%p+o=w3C`EMN5Ip;m(}N&;OvtZl#8Fo5TDZ*CSmxz z4gpVx=S}}eaO$6=T=X|1zCpR=Yv$`e+5qe&nZ7N=*y4hXGyu&-}kN%6o%igv%y)n^T4@o zvvR*~FXHL{5%6?a-+Vp^&bqw-eb#MBxzB6=A4^u-=5-x7{eMTf_dlrI^zFJd0v+b{ z4C0Rq>swyGLwpK+M!BrZ>(UZ*WNo`H?Yl8d!Z<8ExNZeFuS*|QF8aJKH7U2e?7H*~ z=urPnaMo@0PsGi(?_Y|Po4#F_%9MNmCxY|3bP9MntYh^&3!Hs&v2w|m*QFlBGq3x> zslN%F`p-dsGyE(lw|woow8u|FP#8YnkAU<1S_95HpRU~Z=X%65uRFohVSTIH-QdjY zN$4}L8Rb5&xBN`9+BUDV!Rh~e<=gmIZu)k9^+1Pt{TT5d3hP^5_aHt6KCE2U<@q%M z9a-DXufIZv>*fuFpfF?~d43(BT=aQQ^~$Xd_WtNY@=LNXj4$k!%-1?zk(clW z<>H_FxFHhX8;PHa#1}}Dg(3Q*;bHYZQMvg1Gk6`iJZCcta7P8&zISV z{!)bJ$VD>@U!Mx)R%i3MCKBHfi622c>+=`HzZ%xJx~=}tjGe9fYwPAI_deG|;#(2V zx_w!>uUnVX8Ock0^g3>S2BFXWnsM>=?;$Ki;&+vkHVnz@@$j%Z=d^h-O;A!w|`4AxtuT!Ml{IAbR;#wknFv8#UU~-()?dRcP zb$gF;S+^g&3Y^!aI_2ia_V;`+%B9Y{{&YH>1+7~T_><7t2z~a|6yoWB zE)riLAKrx_u`}UeK1-DQeCrS|$Jlw=6p6nYoagC!<-QJsh-Y3;gQwwh7CJoda-_In zc>jlir^EA>Z>4haL!Ac1)6do5)aj1s3?rU8zXPYvd_-rpeE1uN^_yJ>-lg2<`z>&u z@844{`Syp0)nN?r^!X?7G~zQKI)u5eTag5X;r$$+&fpA}A8p-QM|6aNH84C|vw`8-ZY^zhJ+{d>?;%|?{?(y70a?B!%Eb@+whr;sZ;HhCxOlt1ZH&Zk2Iuu{Ou5uSPG$2s1N|BB1?bR!k%)$2 zb+G!BDfjs{xOns55{bVaTz)j48hwi) z#t=`PKY>#x^FMD3{=A=}Cj$(_=XE@IIy`TA)hhQoP0FpG?cWD$gARRu2V5={rhf}K z*BwxPXozK>j41c(PC$q2{tr0UeGQ!JW^V}#hH+?kaNPpswyymvUQ)66PH^hn7SZ_^;@LmDj0e#$WZnMoF#Y|&`MP|ia>! z>k*wDejS9v@P76Lr_P6z`#RTxr-Pp5bpdpwC5`_A@yzQth-Y3efz!{Da_d|B|1RzK zbXY75@AJY4zZN_ljx(RPDwq1u|IW_@5Qg8EJ(T-;9t2MR70S)O-B%nnk?0%G)BCPE z<+3iXGnXlsb>);Y{~Msg&+*2=WsM@$Ux?_x^*13X46k3JTr~JOSR=SRSEl;wm3#kp zDEIm!(D_TyvAnXL4U;geK2@s!yyI(?zwNh4ysRrNV>-p)Y4Br}iyt|4EdFzdr_NWv zdEMv+r~X|L{of*semK;A!weiuZ;@IH%_`+hqPJROcRpC^IKTTJ8UKz}oM zn{umjRd`Oudg$;x{T|{gL!9aV5b-JSjmjmj+rdYmBWv65tzLi**IoVl5EO>g;ok7D zb$3@T`h0&>rrh!>*)0TwaVm7Ee+&41A$KZL+4fSH26Qj zxsQ8Hg`hAbUwKPyJ}Z>_J~0tuP;PlypIikU=CuW!eKG-k_Q`_N zw?0`tow2`-|9!yOCkKG1!=ctEhl6t;KdjvMNrQ6Bw?SWjdn0_;7qT)#>O2%4wr-ws z(PzF*k@(9a@gtG=ry}vcQEvX%tN%YC{#N+>zX;EHF$9Gn{uy7O-1Il9eu;A5Z*`IQ zrbv9Ri#Puhj@!D2{a40jrcWLUKU)3IRK6;({{?RWm*-5U13K*IS@1`p^Qv;G&m-WO zUjl`>Xj4CLCIDsRMas9STO_^{@ec<*%l8K5-cQQu%;Ay2}w)$L9{xjv`hxf6g z;AyP;JLR(OiuYMB1rUbUDFjc4=gt37%Dv9nh^L=caOzwi(dkic`;xPFSUil4(BZ!4 zy_`Jn2qdmHT|xM0g$axo%H{KM05BaDmNXgTd(6&sz22H~7x=HiH%4?u5Ko;M@HBMZRPKH5ybyxIki58VB{=oZ z0$&WrSRER`)8JoJ?$^B*@m#kDoI3YFXB_&Umz#z#tj<;1pB;`{Uu{tC`|2)m_SK+r z-&bSM=Xo>*9iB%ye_!d-&Z7e5-p^6sJdY}rdp~QPzUA8h9s2nqIP>j@==VB(JCBwk ze2o+(4BHorU#HxkN8eNK`(!YpGY*}Ju#WZNEci3vtEE}P@O}!Eiy!J#fTzQArhl4p z@AGWLbKP!m>fZ-0Kbrn9IM;nzxnK8>i08Ts;MCbwHaiTjQ>5JLW9QLhj<@WS96#mw z>imSyDfj)nN}4zf;r|E^%Qr{4_~Gkjk#g}PmoAGhgHAVi1LEbF5&itRB@%x<_yf?{ zpxpb}==3e$Vd&7$)8Nc^Dx$yO^s9m=8LR&<`R?nvmvYJVgz&KX?1%Uic#(3+>vr%8 z=!lkmj&}xhm{%M4z0kP^`rOB1#8c;4@HBK@0N(`u2J|&7ns%-G+?{|CV(b*ozyIM+Qzx#Y!lTa;T~ z9lCA@bePvo;L>8Y?rq>{@P2Ui=Vs;NXEWlbl$)Pn_45XF=;!2rg@eP8{bjyum2Z=; za?`i|?0^pSzk~RXgf%SRTM(ZD?^Q1A^13k$9a-D18_z+9>n?$_KX=O7Asn5&9z7Di zo1YTpmY3D-B;~&UzX#5`-2r{}$w);11?bTK0Xrl(+}G`S=y2W2Rm*wN|H;a||0d<8Z~fK=9qNA_@gIfHZzDbh-lN?2 z+aPpgZR@vRLx<}wfV1EJ34Qik(T+(SEHCS~k0|&3)(_6Q-K*T!Z6c!oSLo1xQQXTQ}cx4f+1u7VEpdL5i~ z+hOO#kFQ&ia?`iEl_~fAd;;RDQJ<3$p8{X2+}EuMI;`7u&|zL1!CANaq0hQaIen|! z4%yq^mn*2;l-*vfvZbkerl-s%m`QgbhW*o0mzM$OqRncxM{abvQav$H| z;%(iQNc=_@Z~Cipl66J@q42Q#ildZEUUExfd=0ofXF7Gz;l8KAABE22%B9Zi+sTOj zT!b${pX-*rb^G=>H8q zXP`sE0p_wI}@Bfo1w#cu2=4T z&O~_Go{1kHKdoH+(Ep#5d;k9e=XL&}y;kZk=>ASPUbb&oD2y59z7BbL+t(>l?&IrR zyy^EKel)CS{rLpq<(Ap_6u8vLbmpMLeXn_Y;#2%=f&S^rrEa`#H!8RKoBn#}Q2!3- z{1W;j(4qgVy;s()PV1cKc#rZT<-VS4Bk>K9_zjWx-bnmJBz`6mpSRD-ytevRzKwqu zZ=XLmMB+ENc>7$sHxfVL;;qgzk@$lA?fc(v-{t<9#{Pa*x%7#=b+GqVmHYE3`yDHNu2(+= zj+>tn<=#&h`14rzM&*9pzKH&CgpWa=`;t?zyzk_Pfv4f8Qn}x+I^}jf+4^?{(3yfx z4|I548gV*Sx4ivV)_L`QK`e|C$1T1>xvz6ugx><54!YLo1Im5AW6FKLI~}lGPv)DW z-0x$Va?>&Y9ggQ|zCGZ)&)=xr=R1XX`4c(IYc3LB^3G-d?1ztnvp%PSZ-V~$$|c{; z;2p{>Uwi+)0XkgwcEq0qox2d90v}W^>+*BmG3dzJ_PNI^(BZl{h0Ar|`}e(-`+clX zZh6`7YtDcU^?wM?_wO5_-;cb;oW8w(pMnnc{{qhU?|%nRL;o!YF6YaA+*i5e%lGe9 zi08VW2B-e{;MBhg`s|Y)*gv`dwye+3 zi}qG7`^DGyV&zs()31o|HPGj}9g+9}#Pjo_`;~h?qfTdo?&B2rj;PNZ^y#OdIH`l= zC4W+C^(;~D`{B4lm+O{Be2sGP$@kZvL_Gg)?VAza2TuJ*BKjvDw(MVW=+!#ZIX0uJ zkLc%>Ec>MX;mSpa@0Zso_x?M<<+&xTa}W5=$akZ1U;in@i;n%h&|D;b)#1zjA3z;) zl>0gqDHrYkMSK}_SceA0(@#qz{(5lw*`VC}+357Q{{0ek=;vwhf587#M1R5Q+kMFD zBbMt%{k@b+t{;Q`euz(j7b%y#c)wZ!9nrG;)ia>Ob=$ysA94-!c^w``JawK0Ps8U6 z;G4kTfc|Fiy!Rya5%2P_`{7b@ekcLwz8tMw^tmr}%6;9|L5F#524~&IpwGI^IsG2{`=ukd@Bf3~ z{C#~DIM+Qzx#Y!lI}lI*w}Gco|9)`x+a~C5M*Ng=tDEKZ59n~+Pad_LFa4jRd>jAD zP2c)$19Yf=JL3NxKJP+&3Vcwxtjp`b7<6Q9yAHep9j=@6-sQa5Z+j~jefC?0a?8u= zb{2G~KLpOYZH7MgeI}y6L)o%V>YoVCeme!6>((mw`?VhN)V~uv9cp2(`*(x0-=2j2 zX2j1Z_jP;A`?jCg#o+XRrE>4TN4e=+ziosL^LhyJr@-fC#HYZ=l*_v8w;AZj+SYG7 z9KHR#ion@#M<^G4_S;(JmY4P0Wzb<>FM_jfbI|WcUODeie44)1tw6bd-FY|SKMtLv z5T63CQ10ut7CNlk#n5418^Bq&+n~?7jW~U)+kZoc`lppI?-%PUJOaCh#YfiywZzG^gDB=u5s`c!~Rtxac*a_@5hobUJVS1xsC-;PG~ry_g~`s}x&4=($s&l=_8lkfLWSML2Z zI-Nn?$2M@juUrp(`WZ&N__4p=7>mTe2+qIXm{ab3u0C!#-@gTY+pj$3eqX8(Pd{rT z@fU#8Pm6NzXT8(6zbEN|4(oFd_zvi|;fVeW;;FOhLrEPZ-!$rwuUvfcbCL?gQ|C-@ z>NH1mI+RN-*+P#P1DWcH**5K6o#<{A%6m z_SWho-s|Tnm%0@oz64yJ%iBME38O-}?~|rTd|M=bV!{tP;9enz0r`V@aW$xD1bkMrdS z<$m2t<$izHMtB4Cx$XuRZ~y&%ZzTRf@HgReM7j4l7W z9>jCq2f+6a)~s%6aQb;xx%cy5h^L>wfm448ocep7p47+dmngTq?7G+Ec&}Y29nU); zG({LA%KdeFArim(lgssy)ft$tL$DiYrkiSLNS4@TlgBJm56_|>%$|H`-VABk^q z@nw2_=!nD*yLhYrgJ&%JnGXA5{kG$o2^T-|Cn3fQz~wp9DN*kCu^|%Qg?Qe--Kbpp zjqj)WoX&{$)v)8{XAJu6lhvPE&Wrv_m5YDgza6dI`>A$16Y8hVar4szefsH*#E&DM z_ixWC_kL!b&W!q5a@_pn)GhBj{ZuLUeb|h6-oIV0-23TtIt%Kj$8qzs5&HBq6N%3~ zYuP{V-}YAS{S+&=yjJV=p~7+Vvj+O~GXVa4=oLFJ?pN;D9gXNuMfe=_xo*LySN5&l zzm+KW=iTw(ynkDx-1}^D`u2J{65+oA7pI%m0_vUY(qMi}2zF7@QPBN09ao({)YKkW3GMBnGNmvYgk|6*|J z92?R3Fyg6mfpSSl)~?gMUPnChD*5d4evz*Qr=JUz`@F71JpFWmQ|E^foqohq=V|4Z zSC8g(cEhrN#+mc%b><>EZy=sJyPdmzpC!sA9eLP!cOv4c(-4Vo zi^TVV)BoejeI1@bJnOlj-22QqZ#ggeJQRHY5Mt*=DLDOnRJr%_3B=RSx!}}q0;m4f z5&a(JmX}@sb3T{kWxQ8kFNz$WQ(mUrUxyna@hy?~-bnmlBz`6mzYvKpYFwGuR{zSk z@gIqAiNyCt;s+z~GcLa9?cpQ{V<8e>a{l)HA9g{)#s748SifDWT=wzM5Mq2ixIAZd z=z$Jjf3rTntk2i|os>)8@_sd6x%H3fmqd64^towd!Z1<5r(x=(9cxk@&(3lf1tTU%?|-d}xB8!U@$&vohds9I-uINtKE50KJ_s()na&7wxQ`2w z_|=yzugmx{<<>u@UloaOiNtqA;s+z~Ba!%pNc`$cBmR|d<3AGL;^OW92iFmaA9nFp zp9fo({cs<5ye#43=dkdj?Qa1%_pwB|@1KT9d>7*R`f{Uke|_k4IvWauu`q@mx4g!n z&pyeyd^un8!@$!)*Yd4YE`IpmmDee^{o4B9DMM!pIz7-dP%G5>j2EZ1Mw=q(Ii z!YFav;wzN<`riPa4#!(wy~=%FBN6?))|Gw+3xik~C5~_Pqul#xi||{((?QpK4k-6N z$CUf}@3d}te_8(=<-V`Vl$(zE?{IviFqjIX$8n3_sNCl}<>KvgmAOd#sxL14=jSRp z%Dw+0<=%f8blB$yUb(EF4*6J}KcHOn`8i1w;`!f;b%6gGIyZw;|Hshhc{HNj`~OJW z%6^+D42y(O=eX6sNx83oZzO&k@x0%DR=Kb9tkan(%-G3Va@_pnd}+DPtbdhqpKmkb zc|E*bx%boQbQaW4kK^WNBlPKKF2Z;H^0NPQNY(nJP`UWwK2|8VyzF{-IdphFwn2y2 z!(OLj{udlyePA#UM$T7O_KC$8DEIwvA$U3*Z+Uen_j&b3^cNh@Ge7MSKgzwIx(NRw zIDK|0_dYi&_w|1XI;{U3bXfnqtG4gI!SN!^w+;M|aH!RDy>g%LFyh6l?blc&ehKmK zgnrJ|iBGRzq1@_V*V{Fb_|JgzdfTMjpLb7ub$MNWUbG0#MKmgBjP$0`?nUT;rC zJoW3qsdGU@=O)Bc=V##bIUC`5U)#R_qm+C9A3{9WZ3XAL-QdjYrxE>!5KsMaaO%7i z(b?yk<-F*pI>MX5seiq4Ux%9zPoEpXsqz4IdpARVab#6jD_pt+<^}iXM z`ah27k0|&4KXU!b`d4ZF>m0Xyo0R+d_eSE!5x?U8M7gi?tkYSmewM%w36|~pob&a> zzxPw2+~>O{65ob+UZ2-T;)fA0YgoUHMdDusXTQxU_jNe&8_Rj|zO)sb_pvE(_QQk9 zeZM_{c1bKQHCd;gCjp8glXxo-Y9mwi(I2<2Y? z1Bj=74LEhqgAVI+6XNM-G{Wb>slRJi;@|t+N4fMreU^Yz=UC{_=UV0deA)S1$-2fH z4h##0Q2@^Ku|&B)AL|e=T3fFtk@y}LZ|B#>Nc?7So?m0irEa`GoPj>i_XX(idS3MH zm31)xWy*cN4KCjNw?yKv2dDoH%Dw+Vr$2ar>`GQv(RWt*H2ywt(VCJ?2;(ct#s9yB zL+!fyE#-dQHzM)7ZAjMj@$Xjd^*hE;pa-FGvg>vyp{f!Ym0Z#o_Bl`b`c>2t} zX}LbsIY_y$!=Z?$&iBFTerQ|(ehHj;?ft#T z{wm*Qf5EA9azy7;#M4ica(f-LzccTR@XgR+zAuAQ|L~se*ZBnHzRop>r_N`VAtU;aPIq^%Dta^ z5l=rq2j3t1W8l<(QMuP&Qf_(K{ljawC3Q32a$r_wZzdjP*6Nw*-#7{-ybMA=vSH6vZ7vHP-)X@QP5QMVH1-cKFk>8B|Ye>FJ$tXJ;q z+3WP}|2I7d9rphg@HgOpBBKBBPnXY^G~$1+T>S8TZtl;P<9WYP49@$LdT_?KgLB;* zmHTyXM?Ce1z^U_8MCZo?iGSHEc{CjqzJxIX{+Ua4b!n5W#w9|q2S zFH`RKeGT;4hjq~5zOP3-`>-bxe-AkQ3@i73CY-+Y;S6->=S^_-;p%&mx_SLSE0?;Z z!^7&o+r7*2?88ds62Ibp51jXhUEqu#0Oz`oEBAf)4C1Lj3r?MXLWlRU1%oU5$NKR1 zj`wJPE;v4=eD!^aj_-27V|sv_|% zF5c?d5s4pk@nr>}NMVdb;+I^!)$`5&T=qX5j<>!&VQ6`Oj|@K=uLI}4G%5G{_y~9! z`V-2fKiO9c5&fzMmi@@O!v}>gVbnQpc{M5betIMEd=CjKE`9AA(#?;S}vSxy1;?un4yMA$8D7~B7GI#;?|WT@e-S(#bS>X5zY6}p;2q$_o5Do>d=2~);PNLhrr!yEE%?3Qo#3%l9*zYhL+ z@b%y+@Na-W4lci1H~)*^-vmG4u`p3T@+)PFuL1vAc;0wB__q*004~4kwD{kHe+N8w zBusSO4d9jF-vw_5zY+X<;PNXbTX!718~p#kZw4>@d6=l5Tfk2T{~mZJ_-)`n1^+(y zG4HNYvZ_SO@fXiD|<5z;qTTNfW z*Ml#De;qvkm&^XwgO`JU1H2ae2Jlw!Z-RG&cYzOqe+zsP{M+D*;NJnye`?wP2Jmw5 z?}FEY-v}Ol%nVVJM{OdTm7U-WyG?(VZ}|~k9O2~=UJd?z{aL=%fT#3l`Btw#o6l)E z@xy4(d`-N|bJaU0Am#Xg@-%p_{w&`{!9_Zyb9v7wL$rmrhlh;Gd`W?ezUlTkZhbZcEeCMPN1#0$5+tp}H5>a)X_Fq*+PCMff@6j zgcmxVR$d9t^Q9VG>SM>(IBx6JI&S{z9sjlZZghN;@@B{HR^ICP50rO;OTNYW?*aCK z^L!Zqm%QxwA;&+g^HFg2?Kn8kmq~D*FVo<%uKAk>7yn)AKUW(}7}w1Q=lN0yF8Zch z?6{pT<>0bL&FS~^L#0d@X83UiST-G zSvTwL$-3>1H!4p#KCV0s&hupyTIF6-9o{||8#oP9eP;j{)8+Up%DWwZPI=1lCzTI?XX>wS zT*txLx0B$KmmNRt`1v}Y2WS5*g0pY4^!`-5^o56wY;alE{N;noF{A3g9GvS`g5PE0 z;d?c>=$mehB`6j?UX1e?a%8)A9ZFI?xTy&s$R9cdJMF zHUNGP_z?KL;AwF2Y59(WbKObsLFmkav;Ono_aS}}{C@B(ecvE8&g{F!<$^P>d~k`k z{0kj7f2H8mDF>&|N^t7efK#UyoI3U3%(oewI<4Sbx7~5`(FOjWsAo6$5O@k)^sUeO z9M9GHfa9e)A9B1|=cC~4pK4~iU^+|odC`=wH<=Nm5Yp8t71%DJg zAAA_R5M1hGK8hW$)_JMpUFy5sajT0RXZ|bSpDb?gkA<^t_0SoC&t~uy{R94U#J7V> zUbbErIM?k4r%oR@*Bt;Cee*ZuxUDw|&UMGZABX>G@F&3M!KHTj$0ScKf^R{5mcFl* z*eAiW!NtG5f6sN?^3QkN^0DJ=e_M}F7AZ%(JXd`}!mGhqhZ^vwlF-c8dT_=!g8vHf zt>E0Rc5unpd~`Z)>ve;R|CIXgb3Fee$>Kxc^qB_#4SbG+^L1nroY&Q9aPe=~|5?Y) z$09iWWa;M(lGC&BlM7Bi`QY?Z2u?r6j+>8i@ZVzHN^oActHDLzuG{u`iTD?8b*y#q zmQN$N95Zlo_!34d_=-LOe>4freC-6E1n&l?P70jY=RR=i41vr4U)4q$T=Km@=cA5i z>E|=!j!)~{zDo_{G5axHL60+DvnJt%;Ow7b@aI%QzLkSBz7qU*h_3->-D<%lU-MD# zxUJU=E;*#te>*t!JHdIK>;nHie5Sxh!TZ3)=OsEHa6GMZ`)+kEJtYyFMto*pl+S|8 z-_hBa2bXob^*qng&w)(8`{T(GxsKZ}Fblz1pJMRmZPD<(6#Nh1mEhE|&(*}w9}!=J zcZI=l`qg7Z3@rJuuzj?}@fciE2H>qR~|@1G07c^xhW&-9zVPbqag z*X{!yFI8UYxaC;`{z6ik%-4Ew$t`tS@}zz4XmzXnM8aDU&+BbF_=@W}_=|}|=4%(Y zw z(#z6;~^FdKYEL*-j8xcDj6dA{Rze^}_b`mp1y4%J^s7O6zMJePlA!fU{JUetoK zZ|lLur`v*Tm^BwQj zd7%ev)1OrD%|d{X(M<6ZYA@!5IF zchTT^oeM7gVAs8T&-J=j=(xS_E(M=Umdbps1edk@^hLEAoY%t|@K>Qz3;t*DdT?Gp z8^QmA_-1gvPj3a6I*jVP-SJ7CcRIeP^Df7;-<~Yq?RdWOl;d_i?{hp`=R@H0$jkgn zjpb3JHy!5Jc)flYHVd7fFBDzSQeUvxxYNPdl0RP8Jikko=hW znhP$^P3wzTJ~+?oLh!#qrxaXt+Vw@R5?n8lnWL(~`F^by{O{0j1Q-22y*RZxUaJ?C zPRAFOcY*&A`rY7sA7{V+lr>*Rd>`UvUo8It$IbVU*AZU} zF7?mSx&7W)G=!V)Mi+1XTEXR*VojnGoc_DO|1ZSbNP*vDFnsR=UjiQh&-9PpSEs?L zGYT&8=5O3_^Dzz1>*p*uub=baqHovFMaRuwc7BqK@1I=oe<0sNa5<)QSNXd9`*xY} zdRU5h@niRg<&ImPm5!Ug8t{M0f;#HKW$o^q#7`qQujkF+kD5sM-U|LN@OE(VZ~1pR z-mP={E-vIz{?^1#AL7}E1K^nhbnP_wiv9uT?`y`v#iy+|4bF9E!FNb3W>#J#52SD} zeRAK#n9TTkkqw^NU%fBQb=>mFcij9HlfzFrxZvWqCr?&_^L4End`IZifQwJdvmRW+ zM^(QWd^L31!3F2dPZlLnW(s`We{b=YKOo`7s%LztDB-2x zeE(h!&hxqwTcIui9+EuS2)^Pv1O8}6A^Fk@zBBaO!Nrf|+39$< z&h5KM$fNV$60ttS3z9>ufoAX2oNZbt}QSU)A7z zy{iG2b?x=8*70n;&el6_c{YRVOKc{wc5rdnS&{hc1ZN+1fwK?0!FNj}GWscS@o#nM zb9_kW_FW|8QT)L~Y!vZAvX4*rI5_)Z5}dCu)8OLAKHr#i+}@|pJ8rKpSq0(XFvNx4 zB4p;d;PPB)RpK)roc&w~t}pEwonr9JzN?RNa8Vvt{c7;tlO;1cHQ>46wcvY#*MsMQ zH-hg2-VDAkcq_QRL}mQ6gMU9mk}sX$`$MN2ocAp$aH)^|Jwc!2w%!o9Uivc&kAlmx z(;rI~pLD!^O~Pj#FZ}m}FFKx9p1psPpG3){{*)v>-|?)EC%h2+-~?p^iop*8F9kmk zyd1m`yb}D6iM7nvYVha5Yrx+Lomz0If90OZLG_MXeH$IO`Zham^=)f7$P)wk2} zKAm?tUaI#q-Hvzb{@HPosys?hPm&%&{JT(xQEbfL8 z`+%gbGLy%w@_ffT&r0G8!B_MT_=^4kU(r9{EBXg~MgM?5pIFX(tpV3toD8o8m;Nb# zYjRM%<5u5B$F082j$3_O9k=?nJ8t#ubi7aJU5;<UTdCKu2<$aEiDj#rsQu&bMv&z$sFDf5( zJo~_`%ouk(U-_it#mc80FIPV6c(w9*$7_`@I^L)}Oa1N;+(|#QD$jP@-f!kQZr6u= z$L;(t2A4HjKQCXy^{+7VEpv?*lHZi@YR89^*E(MNg(SYw@kQmW;3Y|DmW)pD!@;}3 z1vg%nJlW^?sQe>dVGMaL|AJwVr+Qk8*`!eIzq^HD2r$2(Ow-|;@>g^rIZ zFLvDWEOop_=jD#q>%7u&yAIfKl9D{qcgfdqzmIq!r5h98?D)L=qfKG7g0nvD;IC&Q zlP{g%s{*p$Yjino*QFG=tXL@jXj2#i;H3%5@HDvKMg0dh#vSi_AUSB-@#+T?J`2u1 znFnW|EP@{iKUoK7Y-MV^D*RZk_wCt^H|z1aj$8iuj$59Ej$59^j#ulv)bU!Kmpg8K zV#i5J^5}agNzRTlp8s&d8=-Slf-(hY2H!D|YvoHAt>BDr2ba+G8s7E<24lY*ivV8}qpDu9v=>``+>vW!S-29A!v(Dq-qGR=(jPO}-<~0v4Dc!AkErK(z ztV2Rj7_#NeD;qrHM~}~Sd`x*cIPh-!Nt!R zI&XKpLg#(p^fLf1RvuG7L*Vq22B)7VGtJ8O zT+h>daOxC-Q>WPRCG}AbPMu2djE=5b?RbICYr$FPdT=T67Oit5IP2UD&N{b(i=Q)e z-tKsX&ilZ5eI5X3UPIu#K97R)`aBL^jqB|sxai-d^I34#c^+KipVaxH<90pCE)GFq z$dascF1VEVX{~cUIO|*p&N>%^i=SO|Uh4Rq`l|(}pL%ey@|^8EIQ=w((@!h7_&G!8 z?cn;Wk??G|Zw2Rm4S=5jFKB%h z!C9ZILz8vHH|vuPE`DCo<8vJ!Q(g|vyeh#(r(g4`_FQ#p!I@V*xTG|vc{PGFuV!%O z)e4^3cb&I8UZL|oaQYbl7b~x;pCNGiNrThRD0rqmIv)qGw5AH{EQ0g;lXX~lG7Je7 z9lL+d24^4UgR`Ft!R1$XwsbML=)b8x%E4KmN^mL7KeRs8;H*y#IO|gjF6$nn^Loek z)p;j4`>+d~_33upbo#)V*8sSrwDaolC5$0(=9LC#UZddRr(fsej<47GA~^HPdUs~| zt^02Nvm-nooOu<3OI|seS1~yADg|d=<=~RnzB;dTd`a_Z1ZQ5&;FXd`C&XwR&=L59P)!?ji4LIvu3od?+(Rsb&1v>8p z=k>4)oOyMF^Lp3^&g>sY$8Fzd!CB{daH;dVw9bp* ztaH}kAt(V^E!T>QME$LBgero0@Sek#Gm&*8T3;Pg`iPCvEa;^!Eh*MnEui&1#K z6MV(KgNu&64t9gD*mv+1`wspeVO?8#2we29*ZC+o>oX26^?9$>XA+$CnFeQlX2E6M zCv`p#&idpZ5rV=H->gp|IO|gk&ia&tvp$vJ@+Tu!pK5T?-%sbY;5;wt!6m+5^J#Sa z7@fC*Q>PtVbnHCpbi7XI-Qe7>6u9iyvASP<;M}hPaPHR-xcIqQ=V`~=bUq8tyyn3( z_0jWj(Q(Tw`#oW?Fl0ZdlM607c3$K=KBv0H;H*z6xYXwatxq{P>r)BN`c#99pF?$C z<9LqFTfv!EJGkiB``J#%t$(_~sgnX{efk`4)AyrkT`mE9VjDoX12jTF19u z2f$h9W^k$VC$!G3;H+~yIP2UAE`H9}c^7!4UEIR+L*TrwrolzW&aY8$)_D?~b)E*7 zKdrN+XTe4PL7gvxv(8yZhM+Lyc>2k9{5d^7ADneA1eZFWsdX*}XPryIS?6+a@w2ba zD;-}_KaJq@(+n{N^s^?4K98T)p?EMIXZ6zXI|~# z867>3IvuyXy1|)O3S9EKO7rRiXI=x~%xef-{M@YbwBv0$p9N=L^WdUm_brQ#+w~;7 zEChwI&Ax++j>YFYKBv0H;H*z6xYXww+jnr*rxKj?sRqyNm(FV(&(V1+IP236E;{zP zcc`iLXI=x~%xef-{M@YbwBv0$p9N=L^WdUmpW7@tZh2+DF9e0L z&Ax+EC*Sco)h!06pHgtqv31KG&(V1`IO|*kE_J?9>s$-YI@g1<&W+&W=OmpsJ6@vm zZgAd@rNEh2A2{#FhQN70mImj2?*W&e`Csb1pdRoDVL3-q7_59iLKO4NgBb;Ns^F+jnsKsRyT@MsV?SlFpmKD?EA}0ner6qiKUsJ4NgBP zaPhNQ{q%v;&j2|641tTEn{}Rc-2BXfvk&LNMQ7{&g0l~^%R^8YvcK%ZTyS20^1(&_ zPpVrCPCupK62FVi%facV8k~M=!1?!ewcw(En9du)xnIrTvR`AmU#;NWuXb?mS0}iv zd%n)QzaMouMob{OozW~>bS#Z&RQ0I%_yl!M2lUY8~4-$Wd z`pI_uIX&L~J#XnB>J+;8T~w#o@g>zM2d7RYxcE6q``+>vW!SyiVt%;Pf*NE`DB6Ka=3}GYw8Zv*6euWSw}`SxajYv^IGr~`wlMg_Bmvu=Q?i% zXPw)@rOtD<@8GO+7dY$O4K9Ax={)6loz6$Wnb$bD=-Bx<>G&}^p9N=L^Wc)#-!!j9 zaORcufe;ji><9D81{XiC=<&IZk0~z)Xa7`!XZB0utHIenwczZZdT_peHG+%&u{v)B zXMNhir9N42kuTx*fZ(i87dY$F4KC}h(|HP<=hrAW>oX26I(DBq3C{Y=g0nvJ;1}Wi zS_BvUEjrJx2$L{m-`R(`;1Yj^#^*c!it=J`>Xd?uj$P-=9naBuH8^!@z*(PK$4hkH z2+n57m+37@Q(eZlaSs%>U%Jh#!4k^!eJbzQ7lk0e^@_ff9 zl@~f*x;fD)cDze@spGTC%N?(LEYYcSJf*za@vM;~zQ*x-<+YBdmDf97`13@k5&YH! zWeV90F1S_WTOA))-tKtu-guD=R5u@<%Nz{=;sys=VDv+`<3g* z$6NVZ^?k11&Ti!w+xuUq|GVQ7P~-ScA4)*2Nb^J5B zV7uctDDQOqUgcem|CjP^$M-rl0V&5%P(I*z`)LUna{MagX~(ZtKI-^am5)2#p?uQu zvz5;}{-;kTVBYb)&rZOitywUMreJ1hQ?D)9yR>yy>yxsAqm3KP+ zjPfqWCzN+P{xju$j=#Sl@j2jlx$+^$k5Qg>{8;6qj(&u^+2=nWA0Z~r~mTLY6@ t8#~_e-z6|t;y}VUK2e?1zh6w?wzb+LJh8pw=TAxMf2AF$-z{&${|^ZM7?J=0 literal 0 HcmV?d00001 diff --git a/src/Main.hi b/src/Main.hi new file mode 100644 index 0000000000000000000000000000000000000000..51f1c3247302219f5e5ef9c715e77d3ae23f3a94 GIT binary patch literal 2944 zcmZ`(XlkOgc zd;%mu0)iYKpnwq2hyp6N3JCrL1Y|=zPzK~i0g+QgF86g0;+6Ewyy^F^<5m6ZRdpWk zTLiK#_I4XhRQ?Qrd%_r)b*bYsnL!7`Gl|eEwPE3BP9-=2eh5lF4@^J?a+nX63xEVuFavW~ z2o_)oi@*vNgEcGx8!Wb23Z~1zY&qDh0P-CmSNpriNdrA%VFJ*50h zQE!tDh(Q_kWghs6iuX$W)7eIpXc+&s}~=h zjV!%E5b#-Z>#?T?BiaVFy(vdWe~gQ3Eyw1v`kcnTi9;nt=-kLe%$dlzYg!_)tTVl* zFfr&U5oDM--F@W1;8qjDz2SQQ#82^YmHy39=cgy)yYH0{CLS}xhsp=zJL{Fv_k%;C z>H<1Hgk8Ua0a))2Zw)(|U6>I&Nz7y=2j6*6To)~t#b#+%Psn&@?2)OJBL>6m;f(6Y zMhW+f&Pypszj-+*k+>U}kP!a7WM&O+K5+&}jd<^L-D5*qo?)73>H99KYxGiayJ!cp zPsGI;=2z`6Yxp7M$UXDIA1_betFM1FNr?6`ANfo`z#~!`CUFhh4CuycAip1o^)XpM5GHsAV9{`ZQ6zc6pnN{oBR?jl|Yu)f9>TKsNc7X7prF+f34QcolK`T*lSVq6Y~sIAM@)!>)5@ zkChwGl}>#V6y1&_#9!zN8ykD?X2+?-n3MHg3=SLQEOue~YtdB&G{!tUp4GjrE^+d? z;b7@SPdw;Ap8Q+-I9ZUNgvw`6dxBd|CTp@T58eOn%Ki(hMFAF-iA#mJ)ZihBBl<#I z@I!z?T)f2POL5r)FwevVH>b&0m<syRmcIpi(j1StrE|EXMtQMcBZjw`LycOLC(AR7=0Jr%BhY>pG{@2YwszDeY9nPQ z^QL)Z>8)XCPQ!b$766a8<9Gla&V3pvEfuG#padY8Xo$hXlc2G@&+7o7c^5c^`J4h}qe?_^1>PUaX@7 z@8asO*~|Ov+GMZ$ua$s&by`|LwzDTM6p){QEgW#D_NLoufu_7LvP61wk_e!7Ae^5@ zx!j0h78DW-l#^bgRUyuD&Wcjt<4t$CIa97$mKI3y%?UHP#2K^1v0BPer_*Ybw4m9G zEaotdWA`nTd^oc>IOJy|ZCv$?QeZhs1X&(gzX3A5u=F)(rwTEGM(}^#+LL2ddZl3X znyNzYYc2sEEW>J4#sn0|SEJ@wz0R2D+?LvjsplA4Ym9LZF13bbj8yHx)>4)(egeNx zOm~(m-b&o;+)cUoDUnXV1}mfkonEr{!tJ|n3f$>${pSu{{iYOC%n5U1W3t$l2d#S> zRG^odi;W4tqP9#z6zCg0Vw7mk+Nk)d>Fl-O5LzzPmgSH}%_umfJI$ymFMl0cCF0^v zPpc8;0(TuwnU`d1#QQ{fO4rpBcaK0hG7Kx=JE)@E^lBf(dw%-PTRJZ!D_?k}+>EV4 zdAU)uE&JjI;VRN9V?kXsf)C;>q|97dt%~;6B4gclYgO(VUNGN|y!AL}j#eV6av~_b zhK7xq7LX_A=< z;yiQK(mZb^5hjK_%dD|IB-DjbvMM~K2-*aDmGStz1>)p#M}DT_zcd9+-xoOSU#~@G LFEg2MZ0!F7Bub0d literal 0 HcmV?d00001 diff --git a/src/Main.hs b/src/Main.hs new file mode 100644 index 0000000..31348eb --- /dev/null +++ b/src/Main.hs @@ -0,0 +1,51 @@ +-- {-# LANGUAGE BlockArguments #-} +module Main where + +import qualified Data.ByteString.Lazy as Lbs +import Data.Foldable + +import Frontend.Lexer.Tokens +import Frontend.Autogen.Lexer +import Frontend.Autogen.Parser + +import qualified Data.Text.Encoding as T +import qualified Data.Text as T +import Control.Monad ( unless ) +import System.Environment (getArgs) +import Text.Show.Pretty (pPrint) + +import Debug.Trace + +main :: IO () +main = do + args <- getArgs + for_ args $ \str -> do + Main.lex pPrint parseMod =<< Lbs.readFile str + +testParse :: String -> IO () +testParse s = Main.lex print parseMod (Lbs.fromStrict (T.encodeUtf8 (T.pack s))) + +testLex :: String -> IO () +testLex s = Main.lex (const (pure ())) (scan []) (Lbs.fromStrict (T.encodeUtf8 (T.pack s))) + +lex :: (a -> IO ()) -> Alex a -> Lbs.ByteString -> IO () +lex show cont arg = do + let x = runAlex arg cont + case x of + Left e -> print e + Right x -> show x + +scan :: [Token] -> Alex [Token] +scan acc = do + tok <- alexMonadScan + sc <- alexGetStartCode + state <- getUserState + traceM . unlines $ + [ "----------------" + , "just lexed: " ++ show tok + , "sc: " ++ show sc + , "sc stack: " ++ show (startCodes state) + ] + case tokenClass tok of + TokEof -> pure (reverse acc) + _ -> scan (tok:acc) diff --git a/src/Main.o b/src/Main.o new file mode 100644 index 0000000000000000000000000000000000000000..c5cf2090538cc9b5b2d26b964da8ab9461609879 GIT binary patch literal 20696 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 U(?jn!NtLc&t%FV4GKO6LKgjds8~^|S literal 0 HcmV?d00001 diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..697c908 --- /dev/null +++ b/stack.yaml @@ -0,0 +1,67 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/3.yaml + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver. +# These entries can reference officially published versions as well as +# forks / in-progress versions pinned to a git hash. For example: +# +# extra-deps: +# - acme-missiles-0.3 +# - git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=2.7" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/stack.yaml.lock b/stack.yaml.lock new file mode 100644 index 0000000..6ee0750 --- /dev/null +++ b/stack.yaml.lock @@ -0,0 +1,13 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: [] +snapshots: +- completed: + size: 585603 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/3.yaml + sha256: 694573e96dca34db5636edb1fe6c96bb233ca0f9fb96c1ead1671cdfa9bd73e9 + original: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/3.yaml