packages feed

http2 0.2.0 → 0.3.0

raw patch · 18 files changed

+417/−372 lines, 18 filesdep ~bytestring

Dependency ranges changed: bytestring

Files

Network/HPACK/Context.hs view
@@ -4,6 +4,7 @@   , Context   , newContextForEncoding   , newContextForDecoding+  , changeContextForDecoding   , DecodeError(..)   , printContext   -- * Initialization and final results@@ -64,6 +65,9 @@ newContextForDecoding maxsiz = do     hdrtbl <- newHeaderTableForDecoding maxsiz     return $ Context hdrtbl emptyReferenceSet++changeContextForDecoding :: Context -> Size -> IO Context+changeContextForDecoding _ctx siz = newContextForDecoding siz -- fixme: copy table  ---------------------------------------------------------------- 
Network/HPACK/HeaderBlock/Decode.hs view
@@ -28,45 +28,61 @@               -> Either DecodeError (HeaderField, ByteString) toHeaderField bs   | BS.null bs    = Left EmptyBlock-  | w `testBit` 7 = Right $ indexed w bs'-  | w `testBit` 6 = withoutIndexing w bs'-  | otherwise     = incrementalIndexing w bs'+  | w `testBit` 7 = indexed w bs'+  | w `testBit` 6 = incrementalIndexing w bs'+  | w `testBit` 5 = if w `testBit` 4 then clear w bs' else maxSize w bs'+  | w `testBit` 4 = neverIndexing w bs'+  | otherwise     = withoutIndexing w bs'   where     w = BS.head bs     bs' = BS.tail bs  ---------------------------------------------------------------- -indexed :: Word8 -> ByteString -> (HeaderField, ByteString)-indexed w ws = (Indexed idx , ws')+indexed :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+indexed w ws = Right (Indexed idx , ws')   where     w' = clearBit w 7     (idx, ws') = I.parseInteger 7 w' ws +incrementalIndexing :: Word8 -> ByteString+                    -> Either DecodeError (HeaderField, ByteString)+incrementalIndexing w ws+  | isIndexedName1 w = indexedName Add w ws 6 mask6+  | otherwise        = newName Add ws++clear :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+clear _ ws = Right (Clear, ws)++maxSize :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+maxSize w ws = Right (ChangeTableSize siz, ws')+  where+    w' = mask4 w+    (siz, ws') = I.parseInteger 4 w' ws+ withoutIndexing :: Word8 -> ByteString                 -> Either DecodeError (HeaderField, ByteString) withoutIndexing w ws-  | isIndexedName w = indexedName NotAdd w ws-  | otherwise       = newName NotAdd ws+  | isIndexedName2 w = indexedName NotAdd w ws 4 mask4+  | otherwise        = newName NotAdd ws -incrementalIndexing :: Word8 -> ByteString-                    -> Either DecodeError (HeaderField, ByteString)-incrementalIndexing w ws-  | isIndexedName w = indexedName Add w ws-  | otherwise       = newName Add ws+neverIndexing :: Word8 -> ByteString+                -> Either DecodeError (HeaderField, ByteString)+neverIndexing w ws+  | isIndexedName2 w = indexedName Never w ws 4 mask4+  | otherwise        = newName Never ws  ---------------------------------------------------------------- -indexedName :: Indexing -> Word8 -> ByteString+indexedName :: Indexing -> Word8 -> ByteString -> Int -> (Word8 -> Word8)             -> Either DecodeError (HeaderField, ByteString)-indexedName indexing w ws = do+indexedName indexing w ws n mask = do     (val,ws'') <- headerStuff ws'     let hf = Literal indexing (Idx idx) val     return (hf, ws'')   where-    p = mask6 w-    (idx,ws') = I.parseInteger 6 p ws-+    p = mask w+    (idx,ws') = I.parseInteger n p ws  newName :: Indexing -> ByteString         -> Either DecodeError (HeaderField, ByteString)@@ -95,8 +111,14 @@ mask6 :: Word8 -> Word8 mask6 w = w .&. 63 -isIndexedName :: Word8 -> Bool-isIndexedName w = mask6 w /= 0+mask4 :: Word8 -> Word8+mask4 w = w .&. 15++isIndexedName1 :: Word8 -> Bool+isIndexedName1 w = mask6 w /= 0++isIndexedName2 :: Word8 -> Bool+isIndexedName2 w = mask4 w /= 0  ---------------------------------------------------------------- 
Network/HPACK/HeaderBlock/Encode.hs view
@@ -23,14 +23,27 @@     toBB = fromHeaderField huff  fromHeaderField :: Bool -> HeaderField -> Builder+fromHeaderField _    Clear                        = clear+fromHeaderField _    (ChangeTableSize siz)        = change siz 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+fromHeaderField huff (Literal Add    (Idx idx) v) = indexedName huff 6 set01 idx v+fromHeaderField huff (Literal Add    (Lit key) v) = newName     huff set01 key v+fromHeaderField huff (Literal NotAdd (Idx idx) v) = indexedName huff 4 set0000 idx v+fromHeaderField huff (Literal NotAdd (Lit key) v) = newName     huff set0000 key v+fromHeaderField huff (Literal Never (Idx idx) v)  = indexedName huff 4 set0001 idx v+fromHeaderField huff (Literal Never (Lit key) v)  = newName     huff set0001 key v  ---------------------------------------------------------------- +clear :: Builder+clear = BB.fromWord8s [48]++change :: Int -> Builder+change i = BB.fromWord8s (w':ws)+  where+    (w:ws) = I.encode 4 i+    w' = set001 w+ index :: Int -> Builder index i = BB.fromWord8s (w':ws)   where@@ -38,10 +51,10 @@     w' = set1 w  -- Using Huffman encoding-indexedName :: Bool -> Setter -> Int -> HeaderValue -> Builder-indexedName huff set idx v = pre <> vlen <> val+indexedName :: Bool -> Int -> Setter -> Int -> HeaderValue -> Builder+indexedName huff n set idx v = pre <> vlen <> val   where-    (p:ps) = I.encode 6 idx+    (p:ps) = I.encode n idx     pre = BB.fromWord8s $ set p : ps     value = S.encode huff v     valueLen = BS.length value@@ -73,10 +86,12 @@ type Setter = Word8 -> Word8  -- Assuming MSBs are 0.-set1, set01, set00 :: Setter-set1  x = x `setBit` 7-set01 x = x `setBit` 6-set00   = id+set1, set01, set001, set0001, set0000 :: Setter+set1    x = x `setBit` 7+set01   x = x `setBit` 6+set001  x = x `setBit` 5+set0001 x = x `setBit` 4+set0000 = id  setH :: [Word8] -> [Word8] setH []     = error "setH"
Network/HPACK/HeaderBlock/From.hs view
@@ -33,8 +33,11 @@ -- | Decoding step for one 'HeaderField'. Exporting for the --   test purpose. decodeStep :: Step+decodeStep (!ctx,!builder) Clear = return (clearRefSets ctx,builder)+decodeStep (!ctx,!builder) (ChangeTableSize siz) = do+    ctx' <- changeContextForDecoding ctx siz+    return (ctx',builder) decodeStep (!ctx,!builder) (Indexed idx)-  | idx == 0  = return (clearRefSets ctx,builder)   | isPresent = return (removeRef ctx idx, builder)   | otherwise = do       w <- whichTable idx ctx@@ -50,6 +53,11 @@   where     isPresent = idx `isPresentIn` ctx decodeStep (!ctx,!builder) (Literal NotAdd naming v) = do+    k <- fromNaming naming ctx+    let b = builder << (k,v)+    return (ctx, b)+-- fixme: how to treat Never?+decodeStep (!ctx,!builder) (Literal Never naming v) = do     k <- fromNaming naming ctx     let b = builder << (k,v)     return (ctx, b)
Network/HPACK/HeaderBlock/HeaderField.hs view
@@ -22,12 +22,14 @@ emptyHeaderBlock = []  -- | Type for representation.-data HeaderField = Indexed Index+data HeaderField = Clear+                 | ChangeTableSize Int+                 | Indexed Index                  | Literal Indexing Naming HeaderValue                  deriving (Eq,Show)  -- | Whether or not adding to a table.-data Indexing = Add | NotAdd deriving (Eq,Show)+data Indexing = Add | NotAdd | Never deriving (Eq,Show)  -- | Index or literal. data Naming = Idx Index | Lit HeaderName deriving (Eq,Show)
Network/HPACK/HeaderBlock/String.hs view
@@ -13,11 +13,6 @@ encode True h = Huffman.encode h encode _    h = h --- fixme: removing--- | Decoding 'ByteString' to 'HeaderStuff' according to 'HuffmanDecoding'.-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.@@ -26,6 +21,6 @@ parseString False len bs = Right (es, bs')   where     (es, bs') = BS.splitAt len bs-parseString True  len bs = decode es >>= \x -> return (x,bs')+parseString True  len bs = Huffman.decode es >>= \x -> return (x,bs')   where     (es, bs') = BS.splitAt len bs
Network/HPACK/HeaderBlock/To.hs view
@@ -46,7 +46,7 @@ reset :: Context -> IO Ctx reset ctx = do     let ctx' = clearRefSets ctx-        initialHeaderBlock = singleton $ Indexed 0+        initialHeaderBlock = singleton Clear     return (ctx', initialHeaderBlock)  ----------------------------------------------------------------
Network/HPACK/Huffman/Encode.hs view
@@ -38,7 +38,6 @@ aosa :: AOSA aosa = listArray (0,idxEos) $ map toShiftedArray huffmanTable --- fixme -- | -- -- >>> toShifted [T,T,T,T] 0
Network/HPACK/Huffman/Table.hs view
@@ -4,229 +4,7 @@  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,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]@@ -258,9 +36,229 @@   , [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]+  , [F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,F,F,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,F,F]+  , [F,T,T,T,T,F]+  , [T,T,F,F,T,F,F]+  , [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,F,F,F,T]+  , [T,T,T,T,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,F,F]+  , [T,T,F,F,T,F,T]+  , [T,T,F,F,T,T,F]+  , [F,T,T,T,T,T]+  , [F,F,T,T,T]+  , [F,F,F,F]+  , [F,F,F,T]+  , [F,F,T,F]+  , [F,T,F,F,F]+  , [T,F,F,F,F,F]+  , [T,F,F,F,F,T]+  , [T,F,F,F,T,F]+  , [T,F,F,F,T,T]+  , [T,F,F,T,F,F]+  , [T,F,F,T,F,T]+  , [T,F,F,T,T,F]+  , [T,T,T,F,T,T,F,F]+  , [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,F,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,F,F,T,T,T]+  , [T,T,T,F,T,T,F,T]+  , [T,T,T,F,T,T,T,F]+  , [T,T,F,T,F,F,F]+  , [T,T,T,F,T,T,T,T]+  , [T,T,F,T,F,F,T]+  , [T,T,F,T,F,T,F]+  , [T,T,T,T,T,F,F,T,F]+  , [T,T,T,T,F,F,F,F]+  , [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,F,T,F,T,T]+  , [T,T,F,T,T,F,F]+  , [T,T,T,T,F,F,F,T]+  , [T,T,T,T,F,F,T,F]+  , [T,T,T,T,T,F,T,T,F]+  , [T,T,T,T,T,F,T,T,T]+  , [T,T,F,T,T,F,T]+  , [T,F,T,F,F,F]+  , [T,T,T,T,F,F,T,T]+  , [T,T,T,T,T,T,F,F,F]+  , [T,T,T,T,T,T,F,F,T]+  , [T,T,T,T,F,T,F,F]+  , [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,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,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,F,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,F]+  , [F,T,F,F,T]+  , [T,T,F,T,T,T,T]+  , [F,T,F,T,F]+  , [T,F,T,F,F,T]+  , [F,T,F,T,T]+  , [T,T,T,F,F,F,F]+  , [T,F,T,F,T,F]+  , [T,F,T,F,T,T]+  , [F,T,T,F,F]+  , [T,T,T,T,F,T,F,T]+  , [T,T,T,T,F,T,T,F]+  , [T,F,T,T,F,F]+  , [T,F,T,T,F,T]+  , [T,F,T,T,T,F]+  , [F,T,T,F,T]+  , [T,F,T,T,T,T]+  , [T,T,T,T,T,T,T,F,F]+  , [T,T,F,F,F,F]+  , [T,T,F,F,F,T]+  , [F,T,T,T,F]+  , [T,T,T,F,F,F,T]+  , [T,T,T,F,F,T,F]+  , [T,T,T,F,F,T,T]+  , [T,T,T,F,T,F,F]+  , [T,T,T,F,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,F,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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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]+  , [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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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]+  , [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,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,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,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,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,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]+  , [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/Table/Static.hs view
@@ -36,7 +36,7 @@ -- -- >>> toStaticEntry (SIndex 8) -- (42,(":status","200"))--- >>> toStaticEntry (SIndex 49)+-- >>> toStaticEntry (SIndex 50) -- (37,("range","")) toStaticEntry :: SIndex -> Entry toStaticEntry (SIndex sidx) = staticTable ! sidx@@ -63,11 +63,12 @@   , (":scheme","http")   , (":scheme","https")   , (":status","200")-  , (":status","500")-  , (":status","404")-  , (":status","403")+  , (":status","204")+  , (":status","206")+  , (":status","304")   , (":status","400")-  , (":status","401")+  , (":status","404")+  , (":status","500")   , ("accept-charset","")   , ("accept-encoding","")   , ("accept-language","")
http2.cabal view
@@ -1,12 +1,12 @@ Name:                   http2-Version:                0.2.0+Version:                0.3.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 HPACK 06 is supported.+                        Currently only HPACK 07 is supported. Category:               Network Cabal-Version:          >= 1.10 Build-Type:             Simple
test-hpack/HPACKDecode.hs view
@@ -27,9 +27,9 @@ 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+run _ (Test _ _ [])        = return $ Pass+run d (Test _ _ ccs@(c:_)) = do+    let siz = maybe 4096 id $ size c     dctx <- newContextForDecoding siz     let conf = Conf { debug = d }     testLoop conf ccs dctx
test-hpack/HPACKEncode.hs view
@@ -21,9 +21,9 @@   }  run :: Bool -> EncodeStrategy -> Test -> IO [ByteString]-run _ _    (Test _ _        _ [])        = return []-run d stgy (Test _ _ _ ccs@(c:_)) = do-    let siz = size c+run _ _    (Test _        _ [])        = return []+run d stgy (Test _ _ ccs@(c:_)) = do+    let siz = maybe 4096 id $ size c     ectx <- newContextForEncoding siz     let conf = Conf { debug = d, enc = encodeHeader stgy }     testLoop conf ccs ectx []
test-hpack/Types.hs view
@@ -32,13 +32,12 @@  data Test = Test {     draft :: Int-  , context :: String   , description :: String   , cases :: [Case]   } deriving Show  data Case = Case {-    size :: Int+    size :: Maybe Int   , wire :: ByteString   , headers :: HeaderSet   , seqno :: Maybe Int@@ -46,31 +45,33 @@  instance FromJSON Test where     parseJSON (Object o) = Test <$> o .: "draft"-                                <*> o .: "context"                                 <*> o .: "description"                                 <*> o .: "cases"     parseJSON _          = mzero  instance ToJSON Test where-    toJSON (Test n ctx desc cs) = object ["draft" .= n-                                         ,"context" .= ctx-                                         ,"description" .= desc-                                         ,"cases" .= cs-                                         ]+    toJSON (Test n desc cs) = object ["draft" .= n+                                     ,"description" .= desc+                                     ,"cases" .= cs+                                     ]  instance FromJSON Case where-    parseJSON (Object o) = Case <$> o .: "header_table_size"+    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 no) = object ["header_table_size" .= siz-                                       ,"wire" .= byteStringToText w-                                       ,"headers" .= hs-                                       ,"seqno" .= no-                                       ]+    toJSON (Case (Just siz) w hs no) = object ["header_table_size" .= siz+                                              ,"wire" .= byteStringToText w+                                              ,"headers" .= hs+                                              ,"seqno" .= no+                                              ]+    toJSON (Case Nothing    w hs no) = object ["wire" .= byteStringToText w+                                              ,"headers" .= hs+                                              ,"seqno" .= no+                                              ]  instance FromJSON HeaderSet where     parseJSON (Array a) = mapM parseJSON $ V.toList a
test/DecodeSpec.hs view
@@ -14,16 +14,16 @@ spec = do     describe "fromHeaderBlock" $ do         it "decodes HeaderSet in request" $ do-            (c1,h1) <- newContextForDecoding 4096 >>= flip fromHeaderBlock e31-            h1 `shouldBeSameAs` e31h-            (c2,h2) <- fromHeaderBlock c1 e32-            h2 `shouldBeSameAs` e32h-            (_,h3)  <- fromHeaderBlock c2 e33-            h3 `shouldBeSameAs` e33h+            (c1,h1) <- newContextForDecoding 4096 >>= flip fromHeaderBlock d41+            h1 `shouldBeSameAs` d41h+            (c2,h2) <- fromHeaderBlock c1 d42+            h2 `shouldBeSameAs` d42h+            (_,h3)  <- fromHeaderBlock c2 d43+            h3 `shouldBeSameAs` d43h         it "decodes HeaderSet in response" $ do-            (c1,h1) <- newContextForDecoding 256 >>= flip fromHeaderBlock e51-            h1 `shouldBeSameAs` e51h-            (c2,h2) <- fromHeaderBlock c1 e52-            h2 `shouldBeSameAs` e52h-            (_,h3)  <- fromHeaderBlock c2 e53-            h3 `shouldBeSameAs` e53h+            (c1,h1) <- newContextForDecoding 256 >>= flip fromHeaderBlock d61+            h1 `shouldBeSameAs` d61h+            (c2,h2) <- fromHeaderBlock c1 d62+            h2 `shouldBeSameAs` d62h+            (_,h3)  <- fromHeaderBlock c2 d63+            h3 `shouldBeSameAs` d63h
test/HeaderBlock.hs view
@@ -10,42 +10,42 @@  ---------------------------------------------------------------- -e31 :: HeaderBlock-e31 = [+d41 :: HeaderBlock+d41 = [     Indexed 2   , Indexed 7   , Indexed 6   , Literal Add (Idx 4) "www.example.com"   ] -e31h :: HeaderSet-e31h = [(":method","GET")+d41h :: HeaderSet+d41h = [(":method","GET")         ,(":scheme","http")         ,(":path","/")         ,(":authority","www.example.com")         ] -e31b :: ByteStream-e31b = fromHexString "828786048bdb6d883e68d1cb1225ba7f"+d41b :: ByteStream+d41b = fromHexString "828786448ce7cf9bebe89b6fb16fa9b6ff" -e32 :: HeaderBlock-e32 = [-    Literal Add (Idx 27) "no-cache"+d42 :: HeaderBlock+d42 = [+    Literal Add (Idx 28) "no-cache"   ] -e32h :: HeaderSet-e32h = [("cache-control","no-cache")+d42h :: HeaderSet+d42h = [("cache-control","no-cache")         ,(":method","GET")         ,(":scheme","http")         ,(":path","/")         ,(":authority","www.example.com")] -e32b :: ByteStream-e32b = fromHexString "1b8663654a1398ff"+d42b :: ByteStream+d42b = fromHexString "5c86b9b9949556bf" -e33 :: HeaderBlock-e33 = [-    Indexed 0+d43 :: HeaderBlock+d43 = [+    Clear   , Indexed 5   , Indexed 12   , Indexed 11@@ -53,72 +53,72 @@   , Literal Add (Lit "custom-key") "custom-value"   ] -e33h :: HeaderSet-e33h = [(":method","GET")+d43h :: HeaderSet+d43h = [(":method","GET")         ,(":scheme","https")         ,(":path","/index.html")         ,(":authority","www.example.com")         ,("custom-key","custom-value")         ] -e33b :: ByteStream-e33b = fromHexString "80858c8b8400884eb08b749790fa7f894eb08b74979a17a8ff"+d43b :: ByteStream+d43b = fromHexString "30858c8b844088571c5cdb737b2faf89571c5cdb73724d9c57"  ---------------------------------------------------------------- -e51 :: HeaderBlock-e51 = [+d61 :: HeaderBlock+d61 = [     Literal Add (Idx 8) "302"-  , Literal Add (Idx 24) "private"-  , Literal Add (Idx 34) "Mon, 21 Oct 2013 20:13:21 GMT"-  , Literal Add (Idx 48) "https://www.example.com"+  , Literal Add (Idx 25) "private"+  , Literal Add (Idx 35) "Mon, 21 Oct 2013 20:13:21 GMT"+  , Literal Add (Idx 49) "https://www.example.com"   ] -e51h :: HeaderSet-e51h = [(":status","302")+d61h :: HeaderSet+d61h = [(":status","302")         ,("cache-control","private")         ,("date","Mon, 21 Oct 2013 20:13:21 GMT")         ,("location","https://www.example.com")         ] -e51b :: ByteStream-e51b = fromHexString "088298a7188573d5cd111f2298ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc73090ce31743d801b6db107cd1a396244b74f"+d61b :: ByteStream+d61b = fromHexString "488240175985bf06724b976393d6dbb29884de2a718805062098513109b56ba37191adcebf198e7e7cf9bebe89b6fb16fa9b6f" -e52 :: HeaderBlock-e52 = [+d62 :: HeaderBlock+d62 = [     Indexed 12   ] -e52h :: HeaderSet-e52h = [(":status","200")+d62h :: HeaderSet+d62h = [(":status","200")         ,("cache-control","private")         ,("date","Mon, 21 Oct 2013 20:13:21 GMT")         ,("location","https://www.example.com")         ] -e52b :: ByteStream-e52b = fromHexString "8c"+d62b :: ByteStream+d62b = fromHexString "8c" -e53 :: HeaderBlock-e53 = [+d63 :: HeaderBlock+d63 = [     Indexed 4   , Indexed 4   , Literal Add (Idx 3) "Mon, 21 Oct 2013 20:13:22 GMT"-  , Literal Add (Idx 29) "gzip"+  , Literal Add (Idx 30) "gzip"   , Indexed 4   , Indexed 4   , Indexed 3   , Indexed 3-  ,Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"+  ,Literal Add (Idx 59) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"   ] -e53h :: HeaderSet-e53h = [("cache-control","private")+d63h :: HeaderSet+d63h = [("cache-control","private")         ,("date","Mon, 21 Oct 2013 20:13:22 GMT")         ,("content-encoding","gzip")         ,("location","https://www.example.com")         ,(":status","200")         ,("set-cookie","foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")] -e53b :: ByteStream-e53b = fromHexString "84840398ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc71d83cbd54e848483833ab3c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b"+d63b :: ByteStream+d63b = fromHexString "84844393d6dbb29884de2a718805062098513111b56ba35e84abdd97ff848483837bb1e0d6cf9f6e8f9fd3e5f6fa76fefd3c7edf9eff1f2f0f3cfe9f6fcf7f8f879f61ad4f4cc9a973a2200ec3725e18b1b74e3f"
test/HeaderBlockSpec.hs view
@@ -13,21 +13,21 @@ spec = do     describe "toByteStream" $ do         it "encodes HeaderBlock" $ do-            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+            toByteStream True d41 `shouldBe` d41b+            toByteStream True d42 `shouldBe` d42b+            toByteStream True d43 `shouldBe` d43b+            toByteStream True d61 `shouldBe` d61b+            toByteStream True d62 `shouldBe` d62b+            toByteStream True d63 `shouldBe` d63b      describe "fromByteStream" $ do         it "encodes HeaderBlock" $ do-            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+            fromByteStream d41b `shouldBe` Right d41+            fromByteStream d42b `shouldBe` Right d42+            fromByteStream d43b `shouldBe` Right d43+            fromByteStream d61b `shouldBe` Right d61+            fromByteStream d62b `shouldBe` Right d62+            fromByteStream d63b `shouldBe` Right d63     describe "toByteStream & fromByteStream" $ do         prop "duality for request" $ \k v -> do             let key = BS.pack ('k':k)
test/HuffmanSpec.hs view
@@ -14,16 +14,16 @@ 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")+  , ("www.example.com", "e7cf9bebe89b6fb16fa9b6ff")+  , ("no-cache", "b9b9949556bf")+  , ("custom-key", "571c5cdb737b2faf")+  , ("custom-value", "571c5cdb73724d9c57")+  , ("private", "bf06724b97")+  , ("Mon, 21 Oct 2013 20:13:21 GMT", "d6dbb29884de2a718805062098513109b56ba3")+  , ("https://www.example.com", "adcebf198e7e7cf9bebe89b6fb16fa9b6f")+  , ("Mon, 21 Oct 2013 20:13:22 GMT", "d6dbb29884de2a718805062098513111b56ba3")+  , ("gzip", "abdd97ff")+  , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "e0d6cf9f6e8f9fd3e5f6fa76fefd3c7edf9eff1f2f0f3cfe9f6fcf7f8f879f61ad4f4cc9a973a2200ec3725e18b1b74e3f")   ]  shouldBeEncoded :: ByteString -> ByteString -> Expectation@@ -48,6 +48,6 @@     describe "decode" $ do         it "decodes" $ do             "ff" `shouldBeDecoded` Left TooLongEos-            "fffff77f" `shouldBeDecoded` Right "\1"-            "fffff77fff" `shouldBeDecoded` Left TooLongEos+            "ffffeeff" `shouldBeDecoded` Right "\1"+            "ffffeeffff" `shouldBeDecoded` Left TooLongEos             mapM_ (\(x,y) -> y `shouldBeDecoded` Right x) testData