private void createLengthTreeTable() throws TikaException {
        //Read Pre Tree Table
        short[] prelentable = createPreLenTable();

        if (prelentable == null) {
            throw new ChmParsingException("pretreetable is null");
        }

        short[] pretreetable = createTreeTable2(prelentable,
                (1 << ChmConstants.LZX_PRETREE_TABLEBITS) +
                        (ChmConstants.LZX_PRETREE_MAXSYMBOLS << 1),
                ChmConstants.LZX_PRETREE_TABLEBITS, ChmConstants.LZX_PRETREE_MAXSYMBOLS);

        if (pretreetable == null) {
            throw new ChmParsingException("pretreetable is null");
        }

        //Build Length Tree
        createLengthTreeLenTable(0, ChmConstants.LZX_NUM_SECONDARY_LENGTHS, pretreetable,
                prelentable);

        getState().setLengthTreeTable(createTreeTable2(getState().getLengthTreeLengtsTable(),
                (1 << ChmConstants.LZX_LENGTH_TABLEBITS) +
                        (ChmConstants.LZX_LENGTH_MAXSYMBOLS << 1),
                ChmConstants.LZX_LENGTH_TABLEBITS, ChmConstants.LZX_NUM_SECONDARY_LENGTHS));
    }
Decompresses a chm block. Depending on chm block type chooses most relevant
decompressing method. A chm block type can be as follows:</br> <li>UNDEFINED
- no action taken, i.e. skipping the block <li>VERBATIM <li>ALIGNED_OFFSET
<li>UNCOMPRESSED the most simplest In addition there are unknown types (4-7).
Currently relying on previous chm block these types changing according to the
previous chm block type. We need to invent more appropriate way to handle
such types.
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmLzxBlock.java