///|
/// Fixed length extra bits (32 entries)
let fleb : FixedArray[Byte] = [
  b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x01',
  b'\x01', b'\x01', b'\x01', b'\x02', b'\x02', b'\x02', b'\x02', b'\x03', b'\x03',
  b'\x03', b'\x03', b'\x04', b'\x04', b'\x04', b'\x04', b'\x05', b'\x05', b'\x05',
  b'\x05', b'\x00', b'\x00', b'\x00', b'\x00',
]

///|
/// Fixed distance extra bits (32 entries)
let fdeb : FixedArray[Byte] = [
  b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x01', b'\x02', b'\x02', b'\x03',
  b'\x03', b'\x04', b'\x04', b'\x05', b'\x05', b'\x06', b'\x06', b'\x07', b'\x07',
  b'\x08', b'\x08', b'\x09', b'\x09', b'\x0A', b'\x0A', b'\x0B', b'\x0B', b'\x0C',
  b'\x0C', b'\x0D', b'\x0D', b'\x00', b'\x00',
]

///|
/// Code length index map (19 entries)
let clim : FixedArray[Byte] = [
  b'\x10', b'\x11', b'\x12', b'\x00', b'\x08', b'\x07', b'\x09', b'\x06', b'\x0A',
  b'\x05', b'\x0B', b'\x04', b'\x0C', b'\x03', b'\x0D', b'\x02', b'\x0E', b'\x01',
  b'\x0F',
]

///|
/// 15-bit reversal table (32768 entries)
let rev : FixedArray[Int] = {
  let t : FixedArray[Int] = FixedArray::make(32768, 0)
  for i in 0..<32768 {
    let mut x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1)
    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2)
    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4)
    t[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1
  }
  t
}

///|
/// Fixed length tree (288 entries)
let flt : FixedArray[Byte] = {
  let t : FixedArray[Byte] = FixedArray::make(288, b'\x00')
  for i in 0..<144 {
    t[i] = b'\x08'
  }
  for i in 144..<256 {
    t[i] = b'\x09'
  }
  for i in 256..<280 {
    t[i] = b'\x07'
  }
  for i in 280..<288 {
    t[i] = b'\x08'
  }
  t
}

///|
/// Fixed distance tree (32 entries, all 5)
let fdt : FixedArray[Byte] = FixedArray::make(32, b'\x05')

///|
/// Deflate options table: (nice << 13) | chain
/// 9 entries for levels 1-9
let deo : FixedArray[Int] = [
  65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632,
]