public static UInt64 ReadVarInt(this BinaryReader reader, ref byte[] bytes, ref int offset)
        {
            DataDecoder.SizeAtLeast(ref bytes, offset + 1);
            reader.ReadExactly(bytes, offset, 1);
            UInt64 value = bytes[offset];

            offset += 1;

            if (value < 0xFD)
            {
                return(value);
            }
            else if (value == 0xFD)
            {
                DataDecoder.SizeAtLeast(ref bytes, offset + 2);
                reader.ReadExactly(bytes, offset, 2);
                value   = Bits.ToUInt16(bytes, offset);
                offset += 2;
                return(value);
            }
            else if (value == 0xFE)
            {
                DataDecoder.SizeAtLeast(ref bytes, offset + 4);
                reader.ReadExactly(bytes, offset, 4);
                value   = Bits.ToUInt32(bytes, offset);
                offset += 4;
                return(value);
            }
            else if (value == 0xFF)
            {
                DataDecoder.SizeAtLeast(ref bytes, offset + 8);
                reader.ReadExactly(bytes, offset, 8);
                value   = Bits.ToUInt64(bytes, offset);
                offset += 8;
                return(value);
            }
            else
            {
                throw new Exception();
            }
        }