private int NextInteger()
            {
                if (selectorIndex == 4)
                {
                    if (!EnsureBuffer(1))
                    {
                        throw new Exception("Wrong data");
                    }

                    int selector = (int)buffer[indxInBuffer++];
                    selectors[3]  = (selector & 0b11) + 1;
                    selectors[2]  = ((selector >> 2) & 0b11) + 1;
                    selectors[1]  = ((selector >> 4) & 0b11) + 1;
                    selectors[0]  = ((selector >> 6) & 0b11) + 1;
                    selectorIndex = 0;
                }

                if (!EnsureBuffer(selectors[selectorIndex]))
                {
                    throw new Exception("Wrong data");
                }

                var result = GroupVarint.ReadInt(buffer, indxInBuffer, selectors[selectorIndex]);

                indxInBuffer += selectors[selectorIndex];
                selectorIndex++;
                return(result);
            }
            public bool MoveNext()
            {
                while (true)
                {
                    if (state == 0)
                    {
                        if (continuationOffset > 0)
                        {
                            readOffset   = continuationOffset;
                            isEof        = false;
                            dataInBuffer = 0;
                            indxInBuffer = 0;
                        }

                        if (isEof)
                        {
                            return(false);
                        }

                        var buffer = new byte[HeaderLength];
                        persistentStorage.ReadAll(readOffset, buffer, 0, buffer.Length);

                        continuationOffset = BitConverter.ToInt64(buffer, 0);
                        listEndOffset      = readOffset + HeaderLength + BitConverter.ToInt32(buffer, sizeof(long));

                        readOffset += buffer.Length;
                        state       = 1;
                    }

                    if (state == 1)
                    {
                        if (!ReadSelectors())
                        {
                            throw new Exception("Wrong data");
                        }

                        EnsureBuffer(selector1 + selector2 + selector3);

                        var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1);
                        indxInBuffer += selector1;

                        var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2);
                        indxInBuffer += selector2;

                        var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3);
                        indxInBuffer += selector3;

                        state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 4;

                        current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId);
                        return(true);
                    }

                    if (state == 4)
                    {
                        EnsureBuffer(selector4);

                        var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4);
                        indxInBuffer += selector4;

                        if (!ReadSelectors())
                        {
                            throw new Exception("Wrong data");
                        }

                        EnsureBuffer(selector1 + selector2);

                        var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1);
                        indxInBuffer += selector1;

                        var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2);
                        indxInBuffer += selector2;

                        state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 3;

                        current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId);
                        return(true);
                    }

                    if (state == 3)
                    {
                        EnsureBuffer(selector3 + selector4);

                        var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3);
                        indxInBuffer += selector3;

                        var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4);
                        indxInBuffer += selector4;

                        if (!ReadSelectors())
                        {
                            throw new Exception("Wrong data");
                        }

                        EnsureBuffer(selector1);

                        var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1);
                        indxInBuffer += selector1;

                        state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 2;

                        current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId);
                        return(true);
                    }

                    if (state == 2)
                    {
                        EnsureBuffer(selector2 + selector3 + selector4);

                        var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2);
                        indxInBuffer += selector2;

                        var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3);
                        indxInBuffer += selector3;

                        var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4);
                        indxInBuffer += selector4;

                        state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 1;

                        current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId);
                        return(true);
                    }

                    throw new Exception("What?");
                }
            }