docs: public void init(int startPosition, byte[] payload) throws IOException {
      byteStream = new MtasBitInputStream(payload);
      mtasStartPosition = startPosition;
      // analyse initial bits - position
      Boolean getOffset;
      Boolean getRealOffset;
      if (byteStream.readBit() == 1) {
        if (byteStream.readBit() == 1) {
          mtasPositionType = null;
        } else {
          mtasPositionType = MtasPosition.POSITION_RANGE;
        }
      } else {
        if (byteStream.readBit() == 1) {
          mtasPositionType = MtasPosition.POSITION_SET;
        } else {
          mtasPositionType = MtasPosition.POSITION_SINGLE;
        }
      }
      // analyze initial bits - offset
      if (byteStream.readBit() == 1) {
        getOffset = true;
      } else {
        getOffset = false;
      }
      // analyze initial bits - realOffset
      if (byteStream.readBit() == 1) {
        getRealOffset = true;
      } else {
        getRealOffset = false;
      }
      // analyze initial bits - parent
      if (byteStream.readBit() == 1) {
        mtasParent = true;
      } else {
        mtasParent = false;
      }
      // analyse initial bits - payload
      if (byteStream.readBit() == 1) {
        mtasPayload = true;
      } else {
        mtasPayload = false;
      }
      if (byteStream.readBit() == 0) {
        // string
      } else {
        // other
      }
      // get id
      mtasId = byteStream.readEliasGammaCodingNonNegativeInteger();
      // get position info
      if (mtasPositionType != null
          && mtasPositionType.equals(MtasPosition.POSITION_SINGLE)) {
        mtasPosition = new MtasPosition(mtasStartPosition);
      } else if (mtasPositionType != null
          && mtasPositionType.equals(MtasPosition.POSITION_RANGE)) {
        mtasPosition = new MtasPosition(mtasStartPosition, (mtasStartPosition
            + byteStream.readEliasGammaCodingPositiveInteger() - 1));
      } else if (mtasPositionType != null
          && mtasPositionType.equals(MtasPosition.POSITION_SET)) {
        mtasPositions = new TreeSet<>();
        mtasPositions.add(mtasStartPosition);
        int numberOfPoints = byteStream.readEliasGammaCodingPositiveInteger();
        int[] positionList = new int[numberOfPoints];
        positionList[0] = mtasStartPosition;
        int previousPosition = 0;
        int currentPosition = mtasStartPosition;
        for (int i = 1; i < numberOfPoints; i++) {
          previousPosition = currentPosition;
          currentPosition = previousPosition
              + byteStream.readEliasGammaCodingPositiveInteger();
          positionList[i] = currentPosition;
        }
        mtasPosition = new MtasPosition(positionList);
      } else {
        mtasPosition = null;
      }
      // get offset and realOffset info
      if (getOffset) {
        int offsetStart = byteStream.readEliasGammaCodingNonNegativeInteger();
        int offsetEnd = offsetStart
            + byteStream.readEliasGammaCodingPositiveInteger() - 1;
        mtasOffset = new MtasOffset(offsetStart, offsetEnd);
        if (getRealOffset) {
          int realOffsetStart = byteStream.readEliasGammaCodingInteger()
              + offsetStart;
          int realOffsetEnd = realOffsetStart
              + byteStream.readEliasGammaCodingPositiveInteger() - 1;
          mtasRealOffset = new MtasOffset(realOffsetStart, realOffsetEnd);
        }
      } else if (getRealOffset) {
        int realOffsetStart = byteStream.readEliasGammaCodingNonNegativeInteger();
        int realOffsetEnd = realOffsetStart
            + byteStream.readEliasGammaCodingPositiveInteger() - 1;
        mtasRealOffset = new MtasOffset(realOffsetStart, realOffsetEnd);
      }
      if (mtasParent) {
        mtasParentId = byteStream.readEliasGammaCodingInteger() + mtasId;
      }
      if (mtasPayload) {
        mtasPayloadValue = byteStream.readRemainingBytes();
      }
    }