http2 0.1.2 → 0.2.0
raw patch · 26 files changed
+715/−941 lines, 26 filesdep ~basedep ~bytestringdep ~containersnew-component:exe:hpack-stat
Dependency ranges changed: base, bytestring, containers
Files
- Network/HPACK.hs +8/−33
- Network/HPACK/HeaderBlock/Decode.hs +25/−27
- Network/HPACK/HeaderBlock/Encode.hs +16/−17
- Network/HPACK/HeaderBlock/String.hs +14/−9
- Network/HPACK/HeaderBlock/To.hs +15/−0
- Network/HPACK/Huffman.hs +2/−6
- Network/HPACK/Huffman/Decode.hs +10/−13
- Network/HPACK/Huffman/Encode.hs +10/−13
- Network/HPACK/Huffman/Request.hs +0/−289
- Network/HPACK/Huffman/Response.hs +0/−288
- Network/HPACK/Huffman/Table.hs +266/−0
- Network/HPACK/Types.hs +1/−0
- http2.cabal +26/−7
- test-hpack/HPACK.hs +0/−106
- test-hpack/HPACKDecode.hs +77/−0
- test-hpack/HPACKEncode.hs +54/−0
- test-hpack/HPACKSpec.hs +3/−3
- test-hpack/Types.hs +7/−4
- test-hpack/hpack-debug.hs +3/−3
- test-hpack/hpack-encode.hs +10/−9
- test-hpack/hpack-stat.hs +95/−0
- test/HeaderBlock.hs +6/−8
- test/HeaderBlockSpec.hs +14/−17
- test/HuffmanRequestSpec.hs +0/−45
- test/HuffmanResponseSpec.hs +0/−44
- test/HuffmanSpec.hs +53/−0
Network/HPACK.hs view
@@ -3,12 +3,8 @@ -- * Encoding and decoding HPACKEncoding , HPACKDecoding- -- * Request- , encodeRequestHeader- , decodeRequestHeader- -- * Response- , encodeResponseHeader- , decodeResponseHeader+ , encodeHeader+ , decodeHeader -- * Contenxt , Context , newContextForEncoding@@ -35,7 +31,6 @@ import Control.Exception (throwIO) import Network.HPACK.Context (Context, newContextForEncoding, newContextForDecoding, HeaderSet) import Network.HPACK.HeaderBlock (toHeaderBlock, fromHeaderBlock, toByteStream, fromByteStream)-import Network.HPACK.Huffman (huffmanEncodeInRequest, huffmanDecodeInRequest, huffmanEncodeInResponse, huffmanDecodeInResponse) import Network.HPACK.Table (Size) import Network.HPACK.Types @@ -50,35 +45,15 @@ ---------------------------------------------------------------- -- | Converting 'HeaderSet' for HTTP request to the low level format.-encodeRequestHeader :: EncodeStrategy -> HPACKEncoding-encodeRequestHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs+encodeHeader :: EncodeStrategy -> HPACKEncoding+encodeHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs where algo = compressionAlgo stgy- toBS- | useHuffman stgy = toByteStream huffmanEncodeInRequest True- | otherwise = toByteStream id False+ toBS = toByteStream (useHuffman stgy) -- | Converting the low level format for HTTP request to 'HeaderSet'. -- 'DecodeError' would be thrown.-decodeRequestHeader :: HPACKDecoding-decodeRequestHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb- where- ehb = fromByteStream huffmanDecodeInRequest bs---------------------------------------------------------------------- | Converting 'HeaderSet' for HTTP response to the low level format.-encodeResponseHeader :: EncodeStrategy -> HPACKEncoding-encodeResponseHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs- where- algo = compressionAlgo stgy- toBS- | useHuffman stgy = toByteStream huffmanEncodeInResponse True- | otherwise = toByteStream id False---- | Converting the low level format for HTTP response to 'HeaderSet'.--- 'DecodeError' would be thrown.-decodeResponseHeader :: HPACKDecoding-decodeResponseHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb+decodeHeader :: HPACKDecoding+decodeHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb where- ehb = fromByteStream huffmanDecodeInResponse bs+ ehb = fromByteStream bs
Network/HPACK/HeaderBlock/Decode.hs view
@@ -10,29 +10,27 @@ import Network.HPACK.HeaderBlock.HeaderField import qualified Network.HPACK.HeaderBlock.Integer as I import qualified Network.HPACK.HeaderBlock.String as S-import Network.HPACK.Huffman import Network.HPACK.Types ---------------------------------------------------------------- -- | Converting the low level format to 'HeaderBlock'.-fromByteStream :: HuffmanDecoding -> ByteStream- -> Either DecodeError HeaderBlock-fromByteStream hd inp = go inp empty+fromByteStream :: ByteStream -> Either DecodeError HeaderBlock+fromByteStream inp = go inp empty where go bs builder | BS.null bs = Right $ run builder | otherwise = do- (hf, bs') <- toHeaderField hd bs+ (hf, bs') <- toHeaderField bs go bs' (builder << hf) -toHeaderField :: HuffmanDecoding -> ByteString+toHeaderField :: ByteString -> Either DecodeError (HeaderField, ByteString)-toHeaderField hd bs+toHeaderField bs | BS.null bs = Left EmptyBlock | w `testBit` 7 = Right $ indexed w bs'- | w `testBit` 6 = withoutIndexing hd w bs'- | otherwise = incrementalIndexing hd w bs'+ | w `testBit` 6 = withoutIndexing w bs'+ | otherwise = incrementalIndexing w bs' where w = BS.head bs bs' = BS.tail bs@@ -45,24 +43,24 @@ w' = clearBit w 7 (idx, ws') = I.parseInteger 7 w' ws -withoutIndexing :: HuffmanDecoding -> Word8 -> ByteString+withoutIndexing :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)-withoutIndexing hd w ws- | isIndexedName w = indexedName NotAdd hd w ws- | otherwise = newName NotAdd hd ws+withoutIndexing w ws+ | isIndexedName w = indexedName NotAdd w ws+ | otherwise = newName NotAdd ws -incrementalIndexing :: HuffmanDecoding -> Word8 -> ByteString+incrementalIndexing :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)-incrementalIndexing hd w ws- | isIndexedName w = indexedName Add hd w ws- | otherwise = newName Add hd ws+incrementalIndexing w ws+ | isIndexedName w = indexedName Add w ws+ | otherwise = newName Add ws ---------------------------------------------------------------- -indexedName :: Indexing -> HuffmanDecoding -> Word8 -> ByteString+indexedName :: Indexing -> Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)-indexedName indexing hd w ws = do- (val,ws'') <- headerStuff hd ws'+indexedName indexing w ws = do+ (val,ws'') <- headerStuff ws' let hf = Literal indexing (Idx idx) val return (hf, ws'') where@@ -70,21 +68,21 @@ (idx,ws') = I.parseInteger 6 p ws -newName :: Indexing -> HuffmanDecoding -> ByteString+newName :: Indexing -> ByteString -> Either DecodeError (HeaderField, ByteString)-newName indexing hd ws = do- (key,ws') <- headerStuff hd ws- (val,ws'') <- headerStuff hd ws'+newName indexing ws = do+ (key,ws') <- headerStuff ws+ (val,ws'') <- headerStuff ws' let hf = Literal indexing (Lit key) val return (hf, ws'') ---------------------------------------------------------------- -headerStuff :: HuffmanDecoding -> ByteString+headerStuff :: ByteString -> Either DecodeError (HeaderStuff, ByteString)-headerStuff hd bs+headerStuff bs | BS.null bs = Left EmptyEncodedString- | otherwise = S.parseString hd huff len bs''+ | otherwise = S.parseString huff len bs'' where w = BS.head bs bs' = BS.tail bs
Network/HPACK/HeaderBlock/Encode.hs view
@@ -12,23 +12,22 @@ import Network.HPACK.HeaderBlock.HeaderField import qualified Network.HPACK.HeaderBlock.Integer as I import qualified Network.HPACK.HeaderBlock.String as S-import Network.HPACK.Huffman import Network.HPACK.Types ---------------------------------------------------------------- -- | Converting 'HeaderBlock' to the low level format.-toByteStream :: HuffmanEncoding -> Bool -> HeaderBlock -> ByteStream-toByteStream he huff hbs = BB.toByteString $ foldl' (<>) mempty $ map toBB hbs+toByteStream :: Bool -> HeaderBlock -> ByteStream+toByteStream huff hbs = BB.toByteString $ foldl' (<>) mempty $ map toBB hbs where- toBB = fromHeaderField he huff+ toBB = fromHeaderField huff -fromHeaderField :: HuffmanEncoding -> Bool -> HeaderField -> Builder-fromHeaderField _ _ (Indexed idx) = index idx-fromHeaderField he huff (Literal NotAdd (Idx idx) v) = indexedName he huff set01 idx v-fromHeaderField he huff (Literal NotAdd (Lit key) v) = newName he huff set01 key v-fromHeaderField he huff (Literal Add (Idx idx) v) = indexedName he huff set00 idx v-fromHeaderField he huff (Literal Add (Lit key) v) = newName he huff set00 key v+fromHeaderField :: Bool -> HeaderField -> Builder+fromHeaderField _ (Indexed idx) = index idx+fromHeaderField huff (Literal NotAdd (Idx idx) v) = indexedName huff set01 idx v+fromHeaderField huff (Literal NotAdd (Lit key) v) = newName huff set01 key v+fromHeaderField huff (Literal Add (Idx idx) v) = indexedName huff set00 idx v+fromHeaderField huff (Literal Add (Lit key) v) = newName huff set00 key v ---------------------------------------------------------------- @@ -39,12 +38,12 @@ w' = set1 w -- Using Huffman encoding-indexedName :: HuffmanEncoding -> Bool -> Setter -> Int -> HeaderValue -> Builder-indexedName he huff set idx v = pre <> vlen <> val+indexedName :: Bool -> Setter -> Int -> HeaderValue -> Builder+indexedName huff set idx v = pre <> vlen <> val where (p:ps) = I.encode 6 idx pre = BB.fromWord8s $ set p : ps- value = S.encode he v+ value = S.encode huff v valueLen = BS.length value vlen | huff = BB.fromWord8s $ setH $ I.encode 7 valueLen@@ -52,13 +51,13 @@ val = BB.fromByteString value -- Using Huffman encoding-newName :: HuffmanEncoding -> Bool -> Setter -> HeaderName -> HeaderValue -> Builder-newName he huff set k v = pre <> klen <> key <> vlen <> val+newName :: Bool -> Setter -> HeaderName -> HeaderValue -> Builder+newName huff set k v = pre <> klen <> key <> vlen <> val where pre = BB.fromWord8 $ set 0- key0 = S.encode he k+ key0 = S.encode huff k keyLen = BS.length key0- value = S.encode he v+ value = S.encode huff v valueLen = BS.length value klen | huff = BB.fromWord8s $ setH $ I.encode 7 keyLen
Network/HPACK/HeaderBlock/String.hs view
@@ -1,26 +1,31 @@-module Network.HPACK.HeaderBlock.String where+module Network.HPACK.HeaderBlock.String (+ encode+ , parseString+ ) where import Data.ByteString (ByteString) import qualified Data.ByteString as BS-import Network.HPACK.Huffman+import qualified Network.HPACK.Huffman as Huffman import Network.HPACK.Types -- | Encoding 'HeaderStuff' to 'ByteString' according to 'HuffmanEncoding'.-encode :: HuffmanEncoding -> HeaderStuff -> ByteString-encode he h = he h+encode :: Bool -> HeaderStuff -> ByteString+encode True h = Huffman.encode h+encode _ h = h +-- fixme: removing -- | Decoding 'ByteString' to 'HeaderStuff' according to 'HuffmanDecoding'.-decode :: HuffmanDecoding -> ByteString -> Either DecodeError HeaderStuff-decode hd ws = hd ws+decode :: ByteString -> Either DecodeError HeaderStuff+decode ws = Huffman.decode ws -- | Parsing 'HeaderStuff' from 'ByteString'. -- The second 'Bool' is whether or not huffman encoding is used. -- The third 'Int' is the length of the encoded string.-parseString :: HuffmanDecoding -> Bool -> Int -> ByteString+parseString :: Bool -> Int -> ByteString -> Either DecodeError (HeaderStuff, ByteString)-parseString _ False len bs = Right (es, bs')+parseString False len bs = Right (es, bs') where (es, bs') = BS.splitAt len bs-parseString hd True len bs = decode hd es >>= \x -> return (x,bs')+parseString True len bs = decode es >>= \x -> return (x,bs') where (es, bs') = BS.splitAt len bs
Network/HPACK/HeaderBlock/To.hs view
@@ -20,6 +20,7 @@ -> HeaderSet -> IO (Context, HeaderBlock) toHeaderBlock Naive !ctx hs = reset ctx >>= encodeLoop naiveStep hs+toHeaderBlock Static !ctx hs = reset ctx >>= encodeLoop staticStep hs toHeaderBlock Linear !ctx hs = reset ctx >>= encodeLoop linearStep hs toHeaderBlock Diff !ctx hs = encodeLoop diffStep hs (ctx, empty) @@ -53,6 +54,20 @@ naiveStep :: Step naiveStep (!ctx,!builder) (k,v) = do let builder' = builder << Literal NotAdd (Lit k) v+ return (ctx, builder')++----------------------------------------------------------------++staticStep :: Step+staticStep (!ctx,!builder) h@(k,v) = do+ let cache = lookupHeader h ctx+ b = case cache of+ None -> Literal NotAdd (Lit k) v+ KeyOnly InStaticTable i -> Literal NotAdd (Idx i) v+ KeyOnly InHeaderTable _ -> Literal NotAdd (Lit k) v+ KeyValue InStaticTable i -> Literal NotAdd (Idx i) v+ KeyValue InHeaderTable _ -> Literal NotAdd (Lit k) v+ let builder' = builder << b return (ctx, builder') ----------------------------------------------------------------
Network/HPACK/Huffman.hs view
@@ -3,13 +3,9 @@ HuffmanEncoding , HuffmanDecoding -- * Encoding/decoding- , huffmanEncodeInRequest- , huffmanDecodeInRequest- , huffmanEncodeInResponse- , huffmanDecodeInResponse+ , encode+ , decode ) where import Network.HPACK.Huffman.Decode import Network.HPACK.Huffman.Encode-import Network.HPACK.Huffman.Request-import Network.HPACK.Huffman.Response
Network/HPACK/Huffman/Decode.hs view
@@ -1,8 +1,6 @@ module Network.HPACK.Huffman.Decode ( -- * Huffman decoding- Decoder- , toDecoder- , HuffmanDecoding+ HuffmanDecoding , decode ) where @@ -13,6 +11,7 @@ import Network.HPACK.Huffman.Bit import Network.HPACK.Huffman.ByteString import Network.HPACK.Huffman.Params+import Network.HPACK.Huffman.Table import Network.HPACK.Huffman.Tree import Network.HPACK.Types (DecodeError(..)) @@ -35,18 +34,16 @@ next :: Way16 -> Word8 -> Pin next (Way16 _ a16) w = a16 ! w -newtype Decoder = Decoder Way256- ---------------------------------------------------------------- -- | Huffman decoding.-decode :: Decoder -> HuffmanDecoding-decode (Decoder way256) bs = dec way256 qs+decode :: HuffmanDecoding+decode bs = dec qs where qs = unpack4bits bs -dec :: Way256 -> [Word8] -> Either DecodeError ByteString-dec way256 inp = go (way256 ! 0) inp w8empty+dec :: [Word8] -> Either DecodeError ByteString+dec inp = go (way256 ! 0) inp w8empty where go :: Way16 -> [Word8] -> Word8Builder -> Either DecodeError ByteString go (Way16 Nothing _) [] _ = Left IllegalEos@@ -60,11 +57,11 @@ ---------------------------------------------------------------- -toDecoder :: [Bits] -> Decoder-toDecoder = construct . toHTree+way256 :: Way256+way256 = construct $ toHTree huffmanTable -construct :: HTree -> Decoder-construct decoder = Decoder $ listArray (0,255) $ map to16ways $ flatten decoder+construct :: HTree -> Way256+construct decoder = listArray (0,255) $ map to16ways $ flatten decoder where to16ways x = Way16 ei a16 where
Network/HPACK/Huffman/Encode.hs view
@@ -2,9 +2,7 @@ module Network.HPACK.Huffman.Encode ( -- * Huffman encoding- Encoder- , toEncoder- , HuffmanEncoding+ HuffmanEncoding , encode ) where @@ -21,12 +19,12 @@ import Network.HPACK.Huffman.Bit import Network.HPACK.Huffman.ByteString import Network.HPACK.Huffman.Params+import Network.HPACK.Huffman.Table import System.IO.Unsafe (unsafePerformIO) ---------------------------------------------------------------- --- | Type for Huffman encoding.-newtype Encoder = Encoder (Array Int ShiftedArray) deriving Show+type AOSA = Array Int ShiftedArray type ShiftedArray = Array Int Shifted @@ -37,9 +35,8 @@ ---------------------------------------------------------------- --- | Creating 'Encoder'.-toEncoder :: [Bits] -> Encoder-toEncoder bss = Encoder $ listArray (0,idxEos) $ map toShiftedArray bss+aosa :: AOSA+aosa = listArray (0,idxEos) $ map toShiftedArray huffmanTable -- fixme -- |@@ -78,8 +75,8 @@ type HuffmanEncoding = ByteString -> ByteString -- | Huffman encoding.-encode :: Encoder -> HuffmanEncoding-encode (Encoder aoa) (PS fptr off len) = unsafePerformIO $ withForeignPtr fptr $ \ptr -> do+encode :: HuffmanEncoding+encode (PS fptr off len) = unsafePerformIO $ withForeignPtr fptr $ \ptr -> do let beg = ptr `plusPtr` off end = beg `plusPtr` len size <- accumSize beg end 0 0@@ -90,7 +87,7 @@ | src == lim = return acc | otherwise = do i <- fromIntegral <$> peek src- let Shifted l n' _ = (aoa ! i) ! n+ let Shifted l n' _ = (aosa ! i) ! n let !acc' | n == 0 = acc + l | otherwise = acc + l - 1@@ -99,13 +96,13 @@ go dst n src lim | src == lim = do when (n /= 0) $ do- let Shifted _ _ bs = (aoa ! idxEos) ! n+ let Shifted _ _ bs = (aosa ! idxEos) ! n w0 <- peek dst let w1 = BS.head bs poke dst (w0 .|. w1) | otherwise = do i <- fromIntegral <$> peek src- let Shifted l n' bs = (aoa ! i) ! n+ let Shifted l n' bs = (aosa ! i) ! n if n == 0 then copy dst bs else do
− Network/HPACK/Huffman/Request.hs
@@ -1,289 +0,0 @@-module Network.HPACK.Huffman.Request (- huffmanEncodeInRequest- , huffmanDecodeInRequest- ) where--import Network.HPACK.Huffman.Bit-import Network.HPACK.Huffman.Decode-import Network.HPACK.Huffman.Encode--------------------------------------------------------------------encoderForRequest :: Encoder-encoderForRequest = toEncoder huffmanRequest---- | Hoffman encoding in HTTP/2.0 request.-huffmanEncodeInRequest :: HuffmanEncoding-huffmanEncodeInRequest = encode encoderForRequest--------------------------------------------------------------------decoderForRequest :: Decoder-decoderForRequest = toDecoder huffmanRequest---- | Hoffman decoding in HTTP/2.0 request.-huffmanDecodeInRequest :: HuffmanDecoding-huffmanDecodeInRequest = decode decoderForRequest--------------------------------------------------------------------huffmanRequest :: [Bits]-huffmanRequest = [- [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]- , [T,T,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,F,F,T,F,F]- , [T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,F,T,F,F,T]- , [T,F,F,T,F,T]- , [F,F,T,F,F]- , [F,F,F,F]- , [F,F,T,F,T]- , [F,F,T,T,F]- , [F,F,T,T,T]- , [T,F,F,T,T,F]- , [T,F,F,T,T,T]- , [T,F,T,F,F,F]- , [T,F,T,F,F,T]- , [T,F,T,F,T,F]- , [T,F,T,F,T,T]- , [T,F,T,T,F,F]- , [T,T,T,T,F,T,T,F,F]- , [T,T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,F,T,T,T,T]- , [T,T,T,F,T,F,T,T]- , [T,T,T,F,T,T,F,F]- , [T,T,T,F,T,T,F,T]- , [T,T,T,F,T,T,T,F]- , [T,T,T,F,F,F,F]- , [T,T,T,T,F,T,T,T,F]- , [T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,F,F,F,F]- , [T,T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,F,F,T,F]- , [T,T,T,F,T,T,T,T]- , [T,T,T,T,T,F,F,T,T]- , [T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,F,T,F,T]- , [T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,F,T,T,T]- , [T,T,T,T,F,F,F,F]- , [T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [F,T,F,F,F]- , [T,F,T,T,T,T]- , [F,T,F,F,T]- , [T,T,F,F,F,F]- , [F,F,F,T]- , [T,T,F,F,F,T]- , [T,T,F,F,T,F]- , [T,T,F,F,T,T]- , [F,T,F,T,F]- , [T,T,T,F,F,F,T]- , [T,T,T,F,F,T,F]- , [F,T,F,T,T]- , [T,T,F,T,F,F]- , [F,T,T,F,F]- , [F,T,T,F,T]- , [F,T,T,T,F]- , [T,T,T,T,F,F,T,F]- , [F,T,T,T,T]- , [T,F,F,F,F]- , [T,F,F,F,T]- , [T,T,F,T,F,T]- , [T,T,T,F,F,T,T]- , [T,T,F,T,T,F]- , [T,T,T,T,F,F,T,T]- , [T,T,T,T,F,T,F,F]- , [T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]- ]
− Network/HPACK/Huffman/Response.hs
@@ -1,288 +0,0 @@-module Network.HPACK.Huffman.Response (- huffmanEncodeInResponse- , huffmanDecodeInResponse- ) where--import Network.HPACK.Huffman.Bit-import Network.HPACK.Huffman.Decode-import Network.HPACK.Huffman.Encode--------------------------------------------------------------------encoderForResponse :: Encoder-encoderForResponse = toEncoder huffmanResponse---- | Hoffman encoding in HTTP/2.0 request.-huffmanEncodeInResponse :: HuffmanEncoding-huffmanEncodeInResponse = encode encoderForResponse--------------------------------------------------------------------decoderForResponse :: Decoder-decoderForResponse = toDecoder huffmanResponse---- | Hoffman decoding in HTTP/2.0 request.-huffmanDecodeInResponse :: HuffmanDecoding-huffmanDecodeInResponse = decode decoderForResponse--------------------------------------------------------------------huffmanResponse :: [Bits]-huffmanResponse = [- [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]- , [F,F,F,F]- , [T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,F,T,T,F,T]- , [T,T,T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,F,T,F]- , [T,F,F,F,T,F]- , [T,F,F,F,T,T]- , [T,F,F,T,F,F]- , [T,T,F,T,F,T,T]- , [F,F,F,T]- , [F,F,T,F]- , [F,F,T,T]- , [F,T,F,F,F]- , [F,T,F,F,T]- , [F,T,F,T,F]- , [T,F,F,T,F,T]- , [T,F,F,T,T,F]- , [F,T,F,T,T]- , [F,T,T,F,F]- , [F,T,T,F,T]- , [T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,F,T,T,F,T]- , [T,T,T,F,T,F,T,F]- , [T,T,T,F,T,F,T,T]- , [T,T,T,F,T,T,F,F]- , [T,T,T,F,T,T,F,T]- , [T,T,T,F,T,T,T,F]- , [T,F,F,T,T,T]- , [T,T,T,T,T,F,F,F,F]- , [T,T,T,F,T,T,T,T]- , [T,T,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,F,F,F,T]- , [T,F,T,F,F,F]- , [T,T,T,T,F,F,F,T]- , [T,T,T,T,F,F,T,F]- , [T,T,T,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,F,F,T,T]- , [T,F,T,F,F,T]- , [F,T,T,T,F]- , [T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,F,T,F,T]- , [T,T,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [F,T,T,T,T]- , [T,T,F,T,T,T,F]- , [T,F,T,F,T,F]- , [T,F,T,F,T,T]- , [T,F,F,F,F]- , [T,T,F,T,T,T,T]- , [T,T,T,F,F,F,F]- , [T,T,T,F,F,F,T]- , [T,F,T,T,F,F]- , [T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,F,F,T]- , [T,T,T,F,F,T,F]- , [T,F,T,T,F,T]- , [T,F,T,T,T,F]- , [T,F,T,T,T,T]- , [T,T,F,F,F,F]- , [T,T,T,T,T,T,F,T,F]- , [T,T,F,F,F,T]- , [T,T,F,F,T,F]- , [T,T,F,F,T,T]- , [T,T,F,T,F,F]- , [T,T,T,F,F,T,T]- , [T,T,T,T,F,T,F,F]- , [T,T,T,F,T,F,F]- , [T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]]
+ Network/HPACK/Huffman/Table.hs view
@@ -0,0 +1,266 @@+module Network.HPACK.Huffman.Table where++import Network.HPACK.Huffman.Bit++huffmanTable :: [Bits]+huffmanTable = [+ [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+ , [T,T,T,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,F,F,T,F,F]+ , [T,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,F,T,F,F,T]+ , [T,F,F,T,F,T]+ , [F,F,T,F,F]+ , [F,F,F,F]+ , [F,F,T,F,T]+ , [F,F,T,T,F]+ , [F,F,T,T,T]+ , [T,F,F,T,T,F]+ , [T,F,F,T,T,T]+ , [T,F,T,F,F,F]+ , [T,F,T,F,F,T]+ , [T,F,T,F,T,F]+ , [T,F,T,F,T,T]+ , [T,F,T,T,F,F]+ , [T,T,T,T,F,T,T,F,F]+ , [T,T,T,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,F,T,T]+ , [T,T,F,T,T,T,T]+ , [T,T,T,F,T,F,T,T]+ , [T,T,T,F,T,T,F,F]+ , [T,T,T,F,T,T,F,T]+ , [T,T,T,F,T,T,T,F]+ , [T,T,T,F,F,F,F]+ , [T,T,T,T,F,T,T,T,F]+ , [T,T,T,T,F,T,T,T,T]+ , [T,T,T,T,T,F,F,F,F]+ , [T,T,T,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,F,F,T,F]+ , [T,T,T,F,T,T,T,T]+ , [T,T,T,T,T,F,F,T,T]+ , [T,T,T,T,T,F,T,F,F]+ , [T,T,T,T,T,F,T,F,T]+ , [T,T,T,T,T,F,T,T,F]+ , [T,T,T,T,T,F,T,T,T]+ , [T,T,T,T,F,F,F,F]+ , [T,T,T,T,F,F,F,T]+ , [T,T,T,T,T,T,F,F,F]+ , [T,T,T,T,T,T,F,F,T]+ , [T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [F,T,F,F,F]+ , [T,F,T,T,T,T]+ , [F,T,F,F,T]+ , [T,T,F,F,F,F]+ , [F,F,F,T]+ , [T,T,F,F,F,T]+ , [T,T,F,F,T,F]+ , [T,T,F,F,T,T]+ , [F,T,F,T,F]+ , [T,T,T,F,F,F,T]+ , [T,T,T,F,F,T,F]+ , [F,T,F,T,T]+ , [T,T,F,T,F,F]+ , [F,T,T,F,F]+ , [F,T,T,F,T]+ , [F,T,T,T,F]+ , [T,T,T,T,F,F,T,F]+ , [F,T,T,T,T]+ , [T,F,F,F,F]+ , [T,F,F,F,T]+ , [T,T,F,T,F,T]+ , [T,T,T,F,F,T,T]+ , [T,T,F,T,T,F]+ , [T,T,T,T,F,F,T,T]+ , [T,T,T,T,F,T,F,F]+ , [T,T,T,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]+ ]++
Network/HPACK/Types.hs view
@@ -40,6 +40,7 @@ -- | Compression algorithms for HPACK encoding. data CompressionAlgo = Naive -- ^ No compression+ | Static -- ^ Using the static table only | Linear -- ^ Using indices only | Diff -- ^ Calculating difference
http2.cabal view
@@ -1,12 +1,12 @@ Name: http2-Version: 0.1.2+Version: 0.2.0 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3 License-File: LICENSE Synopsis: HTTP/2.0 library including HPACK Description: HTTP/2.0 library including HPACK.- Currently only (coming) HPACK 06 is supported.+ Currently only HPACK 06 is supported. Category: Network Cabal-Version: >= 1.10 Build-Type: Simple@@ -26,8 +26,7 @@ Network.HPACK.Huffman.Decode Network.HPACK.Huffman.Encode Network.HPACK.Huffman.Params- Network.HPACK.Huffman.Request- Network.HPACK.Huffman.Response+ Network.HPACK.Huffman.Table Network.HPACK.Huffman.Tree Network.HPACK.HeaderBlock Network.HPACK.HeaderBlock.Decode@@ -55,6 +54,7 @@ HS-Source-Dirs: test-hpack, . GHC-Options: -Wall Main-Is: hpack-encode.hs+ Other-Modules: HPACKEncode Build-Depends: base >= 4 && < 5 , PSQueue , aeson@@ -85,6 +85,26 @@ , vector , word8 +Executable hpack-stat+ Default-Language: Haskell2010+ HS-Source-Dirs: test-hpack, .+ GHC-Options: -Wall+ Main-Is: hpack-stat.hs+ Build-Depends: base >= 4 && < 5+ , PSQueue+ , aeson+ , aeson-pretty+ , array+ , blaze-builder+ , bytestring+ , containers+ , directory+ , filepath+ , text+ , unordered-containers+ , vector+ , word8+ Test-Suite doctest Type: exitcode-stdio-1.0 Default-Language: Haskell2010@@ -104,8 +124,7 @@ HeaderBlock HeaderBlockSpec HexString- HuffmanRequestSpec- HuffmanResponseSpec+ HuffmanSpec IntegerSpec Build-Depends: base , PSQueue@@ -123,7 +142,7 @@ HS-Source-Dirs: test-hpack, . Ghc-Options: -Wall Main-Is: Spec.hs- Other-Modules: HPACK+ Other-Modules: HPACKDecode HPACKSpec HexString Types
− test-hpack/HPACK.hs
@@ -1,106 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HPACK (run- , Result(..)- , EncodeStrategy(..)- , defaultEncodeStrategy- , CompressionAlgo(..)- ) where--import Control.Exception-import Control.Monad (when)-import Data.ByteString (ByteString)-import qualified Data.ByteString.Char8 as B8-import Data.List (sort)-import Network.HPACK-import Network.HPACK.Context-import Network.HPACK.Context.HeaderSet-import Network.HPACK.HeaderBlock-import Network.HPACK.Huffman--import HexString-import Types--data Conf = Conf {- debug :: Bool- , enc :: HPACKEncoding- , dec :: HPACKDecoding- , hbk :: ByteStream -> Either DecodeError HeaderBlock- }--data Result = Pass [ByteString] | Fail String deriving (Eq,Show)--run :: Bool -> EncodeStrategy -> Test -> IO Result-run _ _ (Test _ _ _ []) = return $ Pass []-run d stgy (Test _ reqOrRsp _ ccs@(c:_)) = do- let siz = size c- dctx <- newContextForDecoding siz- ectx <- newContextForEncoding siz- let conf- | reqOrRsp == "request" = Conf {- debug = d- , enc = encodeRequestHeader stgy- , dec = decodeRequestHeader- , hbk = fromByteStream huffmanDecodeInRequest- }- | otherwise = Conf {- debug = d- , enc = encodeResponseHeader stgy- , dec = decodeResponseHeader- , hbk = fromByteStream huffmanDecodeInResponse- }- testLoop conf ccs dctx ectx []--testLoop :: Conf- -> [Case]- -> Context- -> Context- -> [ByteString]- -> IO Result-testLoop _ [] _ _ hexs = return $ Pass $ reverse hexs-testLoop conf (c:cs) dctx ectx hexs = do- res <- test conf c dctx ectx- case res of- Right (dctx', ectx', hex) -> testLoop conf cs dctx' ectx' (hex:hexs)- Left e -> return $ Fail e--test :: Conf- -> Case- -> Context- -> Context- -> IO (Either String (Context, Context, ByteString))-test conf c dctx ectx = do- -- context is destructive!!!- when (debug conf) $ do- putStrLn "--------------------------------"- putStrLn "---- Input headerset"- printHeaderSet $ sort hs- putStrLn "---- Input context"- printContext dctx- putStrLn "---- Input Hex"- B8.putStrLn hex- putStrLn "---- Input header block"- print hd- x <- try $ dec conf dctx inp- case x of- Left e -> return $ Left $ show (e :: DecodeError)- Right (dctx',hs') -> do- -- This is for hpack-encoding only.- (ectx',out) <- enc conf ectx hs- let pass = sort hs == sort hs'- hex' = toHexString out- when (debug conf) $ do- putStrLn "---- Output headerset"- printHeaderSet $ sort hs'- putStrLn "---- Output context"- printContext dctx'- putStrLn "--------------------------------"- if pass then- return $ Right (dctx', ectx', hex')- else- return $ Left $ "Headers are different in " ++ B8.unpack hex ++ ":\n" ++ show hd ++ "\n" ++ show hs ++ "\n" ++ show hs'- where- hex = wire c- inp = fromHexString hex- hs = headers c- hd = hbk conf inp
+ test-hpack/HPACKDecode.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE OverloadedStrings #-}++module HPACKDecode (+ run+ , Result(..)+ , EncodeStrategy(..)+ , defaultEncodeStrategy+ , CompressionAlgo(..)+ ) where++import Control.Exception+import Control.Monad (when)+import qualified Data.ByteString.Char8 as B8+import Data.List (sort)+import Network.HPACK+import Network.HPACK.Context+import Network.HPACK.Context.HeaderSet+import Network.HPACK.HeaderBlock++import HexString+import Types++data Conf = Conf {+ debug :: Bool+ }++data Result = Pass | Fail String deriving (Eq,Show)++run :: Bool -> Test -> IO Result+run _ (Test _ _ _ []) = return $ Pass+run d (Test _ _ _ ccs@(c:_)) = do+ let siz = size c+ dctx <- newContextForDecoding siz+ let conf = Conf { debug = d }+ testLoop conf ccs dctx++testLoop :: Conf+ -> [Case]+ -> Context+ -> IO Result+testLoop _ [] _ = return $ Pass+testLoop conf (c:cs) dctx = do+ res <- test conf c dctx+ case res of+ Right dctx' -> testLoop conf cs dctx'+ Left e -> return $ Fail e++test :: Conf+ -> Case+ -> Context+ -> IO (Either String Context)+test conf c dctx = do+ -- context is destructive!!!+ when (debug conf) $ do+ putStrLn "--------------------------------"+ putStrLn "---- Input headerset"+ printHeaderSet $ sort hs+ putStrLn "---- Input context"+ printContext dctx+ putStrLn "---- Input Hex"+ B8.putStrLn hex+ putStrLn "---- Input header block"+ print hd+ x <- try $ decodeHeader dctx inp+ case x of+ Left e -> return $ Left $ show (e :: DecodeError)+ Right (dctx',hs') -> do+ let pass = sort hs == sort hs'+ if pass then+ return $ Right (dctx')+ else+ return $ Left $ "Headers are different in " ++ B8.unpack hex ++ ":\n" ++ show hd ++ "\n" ++ show hs ++ "\n" ++ show hs'+ where+ hex = wire c+ inp = fromHexString hex+ hs = headers c+ hd = fromByteStream inp
+ test-hpack/HPACKEncode.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE OverloadedStrings #-}++module HPACKEncode (+ run+ , EncodeStrategy(..)+ , defaultEncodeStrategy+ , CompressionAlgo(..)+ ) where++import Control.Monad (when)+import Data.ByteString (ByteString)+import Network.HPACK+import Network.HPACK.Context++import HexString+import Types++data Conf = Conf {+ debug :: Bool+ , enc :: HPACKEncoding+ }++run :: Bool -> EncodeStrategy -> Test -> IO [ByteString]+run _ _ (Test _ _ _ []) = return []+run d stgy (Test _ _ _ ccs@(c:_)) = do+ let siz = size c+ ectx <- newContextForEncoding siz+ let conf = Conf { debug = d, enc = encodeHeader stgy }+ testLoop conf ccs ectx []++testLoop :: Conf+ -> [Case]+ -> Context+ -> [ByteString]+ -> IO [ByteString]+testLoop _ [] _ hexs = return $ reverse hexs+testLoop conf (c:cs) ectx hexs = do+ (ectx',hex) <- test conf c ectx+ testLoop conf cs ectx' (hex:hexs)++test :: Conf+ -> Case+ -> Context+ -> IO (Context, ByteString)+test conf c ectx = do+ (ectx',out) <- enc conf ectx hs+ let hex' = toHexString out+ when (debug conf) $ do+ putStrLn "---- Output context"+ printContext ectx'+ putStrLn "--------------------------------"+ return (ectx', hex')+ where+ hs = headers c
test-hpack/HPACKSpec.hs view
@@ -10,7 +10,7 @@ import Test.Hspec import Types-import HPACK+import HPACKDecode testDir :: FilePath testDir = "test-hpack/hpack-test-case"@@ -37,9 +37,9 @@ case etc of Left e -> return $ Just $ file ++ ": " ++ e Right tc -> do- res <- run False defaultEncodeStrategy tc+ res <- run False tc case res of- Pass _ -> return Nothing+ Pass -> return Nothing Fail e -> return $ Just $ file ++ ": " ++ e spec :: Spec
test-hpack/Types.hs view
@@ -41,6 +41,7 @@ size :: Int , wire :: ByteString , headers :: HeaderSet+ , seqno :: Maybe Int } deriving Show instance FromJSON Test where@@ -61,13 +62,15 @@ parseJSON (Object o) = Case <$> o .: "header_table_size" <*> (textToByteString <$> (o .: "wire")) <*> o .: "headers"+ <*> o .:? "seqno" parseJSON _ = mzero instance ToJSON Case where- toJSON (Case siz w hs) = object ["header_table_size" .= siz- ,"wire" .= byteStringToText w- ,"headers" .= hs- ]+ toJSON (Case siz w hs no) = object ["header_table_size" .= siz+ ,"wire" .= byteStringToText w+ ,"headers" .= hs+ ,"seqno" .= no+ ] instance FromJSON HeaderSet where parseJSON (Array a) = mapM parseJSON $ V.toList a
test-hpack/hpack-debug.hs view
@@ -4,7 +4,7 @@ import qualified Data.ByteString.Lazy as BL import Types-import HPACK+import HPACKDecode main :: IO () main = do@@ -13,8 +13,8 @@ res <- case etc of Left e -> return $ Just e Right tc -> do- res <- run True defaultEncodeStrategy tc+ res <- run True tc case res of- Pass _ -> return Nothing+ Pass -> return Nothing Fail e -> return $ Just e print res
test-hpack/hpack-encode.hs view
@@ -8,35 +8,36 @@ import System.Exit (exitFailure) import System.IO (hPutStrLn, stderr) -import HPACK+import HPACKEncode import Types main :: IO () main = do args <- getArgs- when (length args /= 2) $ do- hPutStrLn stderr "hpack-encode on/off naive|linear|diff"+ when (length args /= 3) $ do+ hPutStrLn stderr "hpack-encode on/off naive|linear|diff <desc>" exitFailure- let [arg1,arg2] = args+ let [arg1,arg2,desc] = args huffman | arg1 == "on" = True | otherwise = False algo | arg2 == "naive" = Naive+ | arg2 == "static" = Static | arg2 == "linear" = Linear | otherwise = Diff stgy = EncodeStrategy algo huffman- hpackEncode stgy+ hpackEncode stgy desc -hpackEncode :: EncodeStrategy -> IO ()-hpackEncode stgy = do+hpackEncode :: EncodeStrategy -> String -> IO ()+hpackEncode stgy desc = do bs <- BL.getContents let Just tc = decode bs :: Maybe Test- Pass hexs <- run False stgy tc+ hexs <- run False stgy tc let cs = cases tc cs' = zipWith update cs hexs tc' = tc {- description = "Encoded by the http2 library in Haskell. First clear the reference set and encode all headers"+ description = desc , cases = cs' } BL.putStrLn $ encodePretty tc'
+ test-hpack/hpack-stat.hs view
@@ -0,0 +1,95 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Main where++import Control.Applicative+import Data.Aeson+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy.Char8 as BL+import Data.List+import System.Directory+import System.FilePath+import Control.Monad++import Types++hdir :: FilePath+hdir = "test-hpack/hpack-test-case/haskell-http2"++wdir1 :: FilePath+wdir1 = "test-hpack/hpack-test-case/haskell-http2-naive"++wdir2 :: FilePath+wdir2 = "test-hpack/hpack-test-case/haskell-http2-naive-huffman"++wdir3 :: FilePath+wdir3 = "test-hpack/hpack-test-case/haskell-http2-linear"++wdir4 :: FilePath+wdir4 = "test-hpack/hpack-test-case/haskell-http2-linear-huffman"++wdir5 :: FilePath+wdir5 = "test-hpack/hpack-test-case/haskell-http2-diff"++wdir6 :: FilePath+wdir6 = "test-hpack/hpack-test-case/haskell-http2-diff-huffman"+++main :: IO ()+main = do+ hs <- get getHeaderSize hdir+ hlen <- get getHeaderLen hdir+ ws1 <- get getWireSize wdir1+ ws2 <- get getWireSize wdir2+ ws3 <- get getWireSize wdir3+ ws4 <- get getWireSize wdir4+ ws5 <- get getWireSize wdir5+ ws6 <- get getWireSize wdir6+ let h :: Float = fromIntegral $ sum hs+ w1 :: Float = fromIntegral $ sum ws1+ w2 :: Float = fromIntegral $ sum ws2+ w3 :: Float = fromIntegral $ sum ws3+ w4 :: Float = fromIntegral $ sum ws4+ w5 :: Float = fromIntegral $ sum ws5+ w6 :: Float = fromIntegral $ sum ws6+ hl :: Float = fromIntegral $ sum hlen+ print (w1 / h+ ,w2 / h+ ,w3 / h+ ,w4 / h+ ,w5 / h+ ,w6 / h)+ print ((w4 - w6) / hl)++get :: (FilePath -> IO Int) -> String -> IO [Int]+get func dir = do+ files0 <- valid . sort <$> getDirectoryContents dir+ files1 <- filterM doesFileExist files0+ mapM func files1+ where+ valid = map (dir </>) . filter (isSuffixOf ".json")++getHeaderSize :: FilePath -> IO Int+getHeaderSize file = do+ bs <- BL.readFile file+ let Just tc = decode bs :: Maybe Test+ let len = sum $ map toT $ cases tc+ return len+ where+ toT (Case _ _ hs _) = sum $ map (\(x,y) -> BS.length x + BS.length y) hs++getHeaderLen :: FilePath -> IO Int+getHeaderLen file = do+ bs <- BL.readFile file+ let Just tc = decode bs :: Maybe Test+ let len = length $ cases tc+ return len++getWireSize :: FilePath -> IO Int+getWireSize file = do+ bs <- BL.readFile file+ let Just tc = decode bs :: Maybe Test+ let len = sum $ map toT $ cases tc+ return len+ where+ toT (Case _ w _ _) = BS.length w `div` 2
test/HeaderBlock.hs view
@@ -82,12 +82,11 @@ ] e51b :: ByteStream-e51b = fromHexString "0882409f1886c31b39bf387f2292a2fba20320f2ab303124018b490d3209e8773093e39e7864dd7afd3d3d248747db87284955f6ff"+e51b = fromHexString "088298a7188573d5cd111f2298ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc73090ce31743d801b6db107cd1a396244b74f" e52 :: HeaderBlock e52 = [- Indexed 4- , Indexed 12+ Indexed 12 ] e52h :: HeaderSet@@ -98,12 +97,11 @@ ] e52b :: ByteStream-e52b = fromHexString "848c"+e52b = fromHexString "8c" e53 :: HeaderBlock e53 = [- Indexed 3- , Indexed 4+ Indexed 4 , Indexed 4 , Literal Add (Idx 3) "Mon, 21 Oct 2013 20:13:22 GMT" , Literal Add (Idx 29) "gzip"@@ -111,7 +109,7 @@ , Indexed 4 , Indexed 3 , Indexed 3- , Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"+ ,Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ] e53h :: HeaderSet@@ -123,4 +121,4 @@ ,("set-cookie","foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")] e53b :: ByteStream-e53b = fromHexString "8384840392a2fba20320f2ab303124018b490d3309e8771d84e1fbb30f848483833ab3df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f"+e53b = fromHexString "84840398ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc71d83cbd54e848483833ab3c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b"
test/HeaderBlockSpec.hs view
@@ -4,7 +4,6 @@ import qualified Data.ByteString.Char8 as BS import Network.HPACK.HeaderBlock-import Network.HPACK.Huffman import Test.Hspec import Test.Hspec.QuickCheck @@ -14,30 +13,28 @@ spec = do describe "toByteStream" $ do it "encodes HeaderBlock" $ do- toByteStream huffmanEncodeInRequest True e31 `shouldBe` e31b- toByteStream huffmanEncodeInRequest True e32 `shouldBe` e32b- toByteStream huffmanEncodeInRequest True e33 `shouldBe` e33b- toByteStream huffmanEncodeInResponse True e51 `shouldBe` e51b- toByteStream huffmanEncodeInResponse True e52 `shouldBe` e52b- toByteStream huffmanEncodeInResponse True e53 `shouldBe` e53b+ toByteStream True e31 `shouldBe` e31b+ toByteStream True e32 `shouldBe` e32b+ toByteStream True e33 `shouldBe` e33b+ toByteStream True e51 `shouldBe` e51b+ toByteStream True e52 `shouldBe` e52b+ toByteStream True e53 `shouldBe` e53b describe "fromByteStream" $ do it "encodes HeaderBlock" $ do- fromByteStream huffmanDecodeInRequest e31b `shouldBe` Right e31- fromByteStream huffmanDecodeInRequest e32b `shouldBe` Right e32- fromByteStream huffmanDecodeInRequest e33b `shouldBe` Right e33- fromByteStream huffmanDecodeInResponse e51b `shouldBe` Right e51- fromByteStream huffmanDecodeInResponse e52b `shouldBe` Right e52- fromByteStream huffmanDecodeInResponse e53b `shouldBe` Right e53+ fromByteStream e31b `shouldBe` Right e31+ fromByteStream e32b `shouldBe` Right e32+ fromByteStream e33b `shouldBe` Right e33+ fromByteStream e51b `shouldBe` Right e51+ fromByteStream e52b `shouldBe` Right e52+ fromByteStream e53b `shouldBe` Right e53 describe "toByteStream & fromByteStream" $ do prop "duality for request" $ \k v -> do let key = BS.pack ('k':k) val = BS.pack ('v':v) hb = [Literal Add (Lit key) val]- fromByteStream huffmanDecodeInRequest- (toByteStream huffmanEncodeInRequest True hb) `shouldBe` Right hb+ fromByteStream (toByteStream True hb) `shouldBe` Right hb prop "duality for response" $ \v -> do let val = BS.pack ('v':v) hb = [Literal Add (Idx 3) val]- fromByteStream huffmanDecodeInResponse- (toByteStream huffmanEncodeInResponse True hb) `shouldBe` Right hb+ fromByteStream (toByteStream True hb) `shouldBe` Right hb
− test/HuffmanRequestSpec.hs
@@ -1,45 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HuffmanRequestSpec where--import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Network.HPACK.Huffman.Request-import Network.HPACK.Types-import Test.Hspec-import Test.Hspec.QuickCheck--import HexString--shouldBeEncoded :: ByteString -> ByteString -> Expectation-shouldBeEncoded inp out = enc inp `shouldBe` out- where- enc = toHexString . huffmanEncodeInRequest--shouldBeDecoded :: ByteString -> Either DecodeError ByteString -> Expectation-shouldBeDecoded inp out = dec inp `shouldBe` out- where- dec x = huffmanDecodeInRequest (fromHexString x)--spec :: Spec-spec = do- describe "huffmanEncodeInRequest and huffmanDecodeInRequest" $ do- prop "duality" $ \cs ->- let bs = BS.pack cs- in huffmanDecodeInRequest (huffmanEncodeInRequest bs) == Right bs- describe "huffmanEncodeInRequest" $ do- it "encodes in request" $ do- "www.example.com" `shouldBeEncoded` "db6d883e68d1cb1225ba7f"- "no-cache" `shouldBeEncoded` "63654a1398ff"- "custom-key" `shouldBeEncoded` "4eb08b749790fa7f"- "custom-value" `shouldBeEncoded` "4eb08b74979a17a8ff"- "" `shouldBeEncoded` ""- describe "huffmanDecodeInRequest" $ do- it "decodes in request" $ do- "db6d883e68d1cb1225ba7f" `shouldBeDecoded` Right "www.example.com"- "63654a1398ff" `shouldBeDecoded` Right "no-cache"- "4eb08b749790fa7f" `shouldBeDecoded` Right "custom-key"- "4eb08b74979a17a8ff" `shouldBeDecoded` Right "custom-value"- "ff" `shouldBeDecoded` Left TooLongEos- "fffff77f" `shouldBeDecoded` Right "\1"- "fffff77fff" `shouldBeDecoded` Left TooLongEos
− test/HuffmanResponseSpec.hs
@@ -1,44 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HuffmanResponseSpec where--import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Network.HPACK.Huffman.Response-import Test.Hspec-import Test.Hspec.QuickCheck--import HexString--shouldBeEncoded :: ByteString -> ByteString -> Expectation-shouldBeEncoded inp out = enc inp `shouldBe` out- where- enc = toHexString . huffmanEncodeInResponse--shouldBeDecoded :: ByteString -> ByteString -> Expectation-shouldBeDecoded inp out = dec inp `shouldBe` Right out- where- dec x = huffmanDecodeInResponse (fromHexString x)--spec :: Spec-spec = do- describe "huffmanEncodeInResponse and huffmanDecodeInResponse" $ do- prop "duality" $ \cs ->- let bs = BS.pack cs- in huffmanDecodeInResponse (huffmanEncodeInResponse bs) == Right bs- describe "huffmanEncodeInResponse" $ do- it "encodes in response" $ do- "private" `shouldBeEncoded` "c31b39bf387f"- "Mon, 21 Oct 2013 20:13:21 GMT" `shouldBeEncoded` "a2fba20320f2ab303124018b490d3209e877"- "https://www.example.com" `shouldBeEncoded` "e39e7864dd7afd3d3d248747db87284955f6ff"- "Mon, 21 Oct 2013 20:13:22 GMT" `shouldBeEncoded` "a2fba20320f2ab303124018b490d3309e877"- "gzip" `shouldBeEncoded` "e1fbb30f"- "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" `shouldBeEncoded` "df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f"- describe "huffmanDecodeInResponse" $ do- it "decodes in response" $ do- "c31b39bf387f" `shouldBeDecoded` "private"- "a2fba20320f2ab303124018b490d3209e877"`shouldBeDecoded` "Mon, 21 Oct 2013 20:13:21 GMT"- "e39e7864dd7afd3d3d248747db87284955f6ff" `shouldBeDecoded` "https://www.example.com"- "a2fba20320f2ab303124018b490d3309e877" `shouldBeDecoded` "Mon, 21 Oct 2013 20:13:22 GMT"- "e1fbb30f" `shouldBeDecoded` "gzip"- "df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f" `shouldBeDecoded` "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"
+ test/HuffmanSpec.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE OverloadedStrings #-}++module HuffmanSpec where++import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import Network.HPACK+import Network.HPACK.Huffman+import Test.Hspec+import Test.Hspec.QuickCheck++import HexString++testData :: [(ByteString, ByteString)]+testData = [+ ("", "")+ , ("www.example.com", "db6d883e68d1cb1225ba7f")+ , ("no-cache", "63654a1398ff")+ , ("custom-key", "4eb08b749790fa7f")+ , ("custom-value", "4eb08b74979a17a8ff")+ , ("private", "73d5cd111f")+ , ("Mon, 21 Oct 2013 20:13:21 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc7")+ , ("https://www.example.com", "ce31743d801b6db107cd1a396244b74f")+ , ("Mon, 21 Oct 2013 20:13:22 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc7")+ , ("gzip", "cbd54e")+ , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b")+ ]++shouldBeEncoded :: ByteString -> ByteString -> Expectation+shouldBeEncoded inp out = enc inp `shouldBe` out+ where+ enc = toHexString . encode++shouldBeDecoded :: ByteString -> Either DecodeError ByteString -> Expectation+shouldBeDecoded inp out = dec inp `shouldBe` out+ where+ dec = decode . fromHexString++spec :: Spec+spec = do+ describe "encode and decode" $ do+ prop "duality" $ \cs ->+ let bs = BS.pack cs+ in decode (encode bs) == Right bs+ describe "encode" $ do+ it "encodes" $ do+ mapM_ (\(x,y) -> x `shouldBeEncoded` y) testData+ describe "decode" $ do+ it "decodes" $ do+ "ff" `shouldBeDecoded` Left TooLongEos+ "fffff77f" `shouldBeDecoded` Right "\1"+ "fffff77fff" `shouldBeDecoded` Left TooLongEos+ mapM_ (\(x,y) -> y `shouldBeDecoded` Right x) testData