| 
														
															@@ -25,8 +25,11 @@ import Data.Attoparsec.ByteString.Char8 (Parser) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import qualified Data.Attoparsec.ByteString.Char8 as A 
														 | 
														
														 | 
														
															 import qualified Data.Attoparsec.ByteString.Char8 as A 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import Data.Attoparsec.ByteString.Char8.Extras 
														 | 
														
														 | 
														
															 import Data.Attoparsec.ByteString.Char8.Extras 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import qualified Data.ByteString as BS 
														 | 
														
														 | 
														
															 import qualified Data.ByteString as BS 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import qualified Data.ByteString.Char8 as C8 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import qualified Data.List as List 
														 | 
														
														 | 
														
															 import qualified Data.List as List 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import Debug.Trace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 data BackendAction = DATA deriving (Show, Read, Eq, Ord, Bounded, Enum) 
														 | 
														
														 | 
														
															 data BackendAction = DATA deriving (Show, Read, Eq, Ord, Bounded, Enum) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 data ClientIdentity = ClientIdentity {_clientIp :: IP, _clientPort :: Int} deriving (Show, Read, Ord, Eq) 
														 | 
														
														 | 
														
															 data ClientIdentity = ClientIdentity {_clientIp :: IP, _clientPort :: Int} deriving (Show, Read, Ord, Eq) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -117,58 +120,70 @@ parseMetadata = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   where 
														 | 
														
														 | 
														
															   where 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parseField :: Parser ((MaybeMetadata, Maybe IP, Maybe Int) -> (MaybeMetadata, Maybe IP, Maybe Int)) 
														 | 
														
														 | 
														
															     parseField :: Parser ((MaybeMetadata, Maybe IP, Maybe Int) -> (MaybeMetadata, Maybe IP, Maybe Int)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parseField = do 
														 | 
														
														 | 
														
															     parseField = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      skipHorizontalSpace 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       A.choice [ 
														 | 
														
														 | 
														
															       A.choice [ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           act <- hdr "Action" parseEnumCI 
														 | 
														
														 | 
														
															           act <- hdr "Action" parseEnumCI 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Action" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set maction (Just act) m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set maction (Just act) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           ip <- hdr "Client-Ip" parseRead 
														 | 
														
														 | 
														
															           ip <- hdr "Client-Ip" parseRead 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          return $ \(m, _, p) -> (m, ip, p), 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Client-Ip" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          return $ \(m, _, p) -> (m, Just ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           p <- hdr "Client-Port" parseRead 
														 | 
														
														 | 
														
															           p <- hdr "Client-Port" parseRead 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          return $ \(m, ip, _) -> (m, ip, p), 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Client-Port" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          return $ \(m, ip, _) -> (m, ip, Just p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          nm <- hdr "Client-Name" bsval 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          nm <- hdr "Client-Name" (A.takeTill A.isSpace) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Client-Name" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set mclientName (Just nm) m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set mclientName (Just nm) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          frm <- hdr "Return-Path" parseAccountVal 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          frm <- hdr "Return-Path" parseAccount 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Return-Path" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set mmailFrom (Just frm) m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set mmailFrom (Just frm) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          rtp <- hdr "To" parseAddressingVal 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          rtp <- hdr "To" parseAddress 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "To" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             crtp = m^.mrcptTo 
														 | 
														
														 | 
														
															             crtp = m^.mrcptTo 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             in (set mrcptTo (rtp:crtp) m, ip, p), 
														 | 
														
														 | 
														
															             in (set mrcptTo (rtp:crtp) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          rfl <- hdr "Failed" (parseAddressingReason) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          rfl <- hdr "Failed" parseAddressingReason 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Failed" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             fld = m^.mrcptFailed 
														 | 
														
														 | 
														
															             fld = m^.mrcptFailed 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             in (set mrcptFailed (rfl:fld) m, ip, p), 
														 | 
														
														 | 
														
															             in (set mrcptFailed (rfl:fld) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           recv <- hdr "Recv-Date" parseISO8601Val 
														 | 
														
														 | 
														
															           recv <- hdr "Recv-Date" parseISO8601Val 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Recv-Date" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set mrecvDate (Just recv) m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set mrecvDate (Just recv) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          enc <- hdr "Body-Encoding" parseEncodingVal 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          enc <- hdr "Body-Encoding" Mime.parseBodyEncoding 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Body-Encoding" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set mbodyEnc enc m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set mbodyEnc enc m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-          utf <- hdr "SMTP-UTF8" parseBoolVal 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          utf <- hdr "SMTP-UTF8" parseMetadataBool 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "SMTP-UTF8" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set msmtpUtf8 utf m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set msmtpUtf8 utf m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           usr <- hdr "Auth-User" bsval 
														 | 
														
														 | 
														
															           usr <- hdr "Auth-User" bsval 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Auth-User" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> (set mauth (Just usr) m, ip, p), 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> (set mauth (Just usr) m, ip, p), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         do 
														 | 
														
														 | 
														
															         do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           u <- entireHdr 
														 | 
														
														 | 
														
															           u <- entireHdr 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace "Unknown" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+          trace (show u) $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
														
														 | 
														
															           return $ \(m, ip, p) -> let 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             uu = m^.munrecognized 
														 | 
														
														 | 
														
															             uu = m^.munrecognized 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             in (set munrecognized (u:uu) m, ip, p) 
														 | 
														
														 | 
														
															             in (set munrecognized (u:uu) m, ip, p) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         ] 
														 | 
														
														 | 
														
															         ] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     entireHdr :: Parser ByteString 
														 | 
														
														 | 
														
															     entireHdr :: Parser ByteString 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     entireHdr = do 
														 | 
														
														 | 
														
															     entireHdr = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      A.satisfy (not . A.isEndOfLine . asW8) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      a <- A.satisfy (not . A.isEndOfLine . asW8) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       t <- A.takeTill (A.isEndOfLine . asW8) 
														 | 
														
														 | 
														
															       t <- A.takeTill (A.isEndOfLine . asW8) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       A.endOfLine 
														 | 
														
														 | 
														
															       A.endOfLine 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       l <- takeLines 
														 | 
														
														 | 
														
															       l <- takeLines 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      return $ BS.concat [t, "\r\n", l] 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      return $ BS.concat [C8.cons a t, "\r\n", l] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     takeLines :: Parser ByteString 
														 | 
														
														 | 
														
															     takeLines :: Parser ByteString 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     takeLines = do 
														 | 
														
														 | 
														
															     takeLines = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       c' <- A.peekChar 
														 | 
														
														 | 
														
															       c' <- A.peekChar 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -183,45 +198,34 @@ parseMetadata = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                    else return "" 
														 | 
														
														 | 
														
															                    else return "" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     hdr :: ByteString -> Parser a -> Parser a 
														 | 
														
														 | 
														
															     hdr :: ByteString -> Parser a -> Parser a 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     hdr pt f = do 
														 | 
														
														 | 
														
															     hdr pt f = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      trace ("testing " ++ show pt) $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       A.stringCI pt 
														 | 
														
														 | 
														
															       A.stringCI pt 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      trace ("it's it") $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       A.char ':' 
														 | 
														
														 | 
														
															       A.char ':' 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      r <- f 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      t <- bsval 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      trace ("Will now parse value: " ++ show t) $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      r <- case A.parseOnly f t of 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        Left _ -> failParser 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        Right v -> return v 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      trace "Got value" $ return () 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      A.endOfLine 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       return r 
														 | 
														
														 | 
														
															       return r 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     bsval :: Parser ByteString 
														 | 
														
														 | 
														
															     bsval :: Parser ByteString 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     bsval = do 
														 | 
														
														 | 
														
															     bsval = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      v <- A.takeTill (A.isEndOfLine . asW8) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      A.endOfLine 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      c' <- A.peekChar 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      case c' of 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        Nothing -> return v 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        Just c -> if isCHorizontalSpace c 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                  then do 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    v' <- bsval 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    return $ BS.concat [v, " ", v'] 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                  else return v 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      ll <- entireHdr 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      let (b, _) = BS.spanEnd (\x -> x == asW8 '\r' || x == asW8 '\n') ll 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      return b 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parseRead :: Read a => Parser a 
														 | 
														
														 | 
														
															     parseRead :: Read a => Parser a 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parseRead = do 
														 | 
														
														 | 
														
															     parseRead = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      v <- bsval 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      v <- A.takeTill A.isSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       case readMaybe . fromTextual $ v of 
														 | 
														
														 | 
														
															       case readMaybe . fromTextual $ v of 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         Nothing -> failParser 
														 | 
														
														 | 
														
															         Nothing -> failParser 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         Just i -> return i 
														 | 
														
														 | 
														
															         Just i -> return i 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseVal :: Parser a -> Parser a 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseVal p = do 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      v <- bsval 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      case A.parseOnly p v of 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        Left _ -> failParser 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        Right v' -> return v' 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseAccountVal = parseVal parseAccount 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseAddressingVal = parseVal parseMetadataAddress 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseEncodingVal = parseVal Mime.parseBodyEncoding 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    parseBoolVal = parseVal parseMetadataBool 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parseISO8601Val = do 
														 | 
														
														 | 
														
															     parseISO8601Val = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      v <- bsval 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      v <- A.takeTill A.isSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       case parseISO8601 . fromTextual $ v of 
														 | 
														
														 | 
														
															       case parseISO8601 . fromTextual $ v of 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         Nothing -> failParser 
														 | 
														
														 | 
														
															         Nothing -> failParser 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         Just t -> return t 
														 | 
														
														 | 
														
															         Just t -> return t 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -237,5 +241,5 @@ parseMetadata = do 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       A.char ';' 
														 | 
														
														 | 
														
															       A.char ';' 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       skipHorizontalSpace 
														 | 
														
														 | 
														
															       skipHorizontalSpace 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      r <- parseResponse 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      r <- parseLineResponse 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       return (a, r) 
														 | 
														
														 | 
														
															       return (a, r) 
														 |