@Override
 public BlockTermState newTermState() throws IOException {
   final SepTermState state = new SepTermState();
   state.docIndex = docIn.index();
   if (freqIn != null) {
     state.freqIndex = freqIn.index();
   }
   if (posIn != null) {
     state.posIndex = posIn.index();
   }
   return state;
 }
 @Override
 public void readTermsBlock(IndexInput termsIn, FieldInfo fieldInfo, BlockTermState _termState)
     throws IOException {
   final SepTermState termState = (SepTermState) _termState;
   // System.out.println("SEPR: readTermsBlock termsIn.fp=" + termsIn.getFilePointer());
   final int len = termsIn.readVInt();
   // System.out.println("  numBytes=" + len);
   if (termState.bytes == null) {
     termState.bytes = new byte[ArrayUtil.oversize(len, 1)];
     termState.bytesReader = new ByteArrayDataInput(termState.bytes);
   } else if (termState.bytes.length < len) {
     termState.bytes = new byte[ArrayUtil.oversize(len, 1)];
   }
   termState.bytesReader.reset(termState.bytes, 0, len);
   termsIn.readBytes(termState.bytes, 0, len);
 }
  @Override
  public void nextTerm(FieldInfo fieldInfo, BlockTermState _termState) throws IOException {
    final SepTermState termState = (SepTermState) _termState;
    final boolean isFirstTerm = termState.termBlockOrd == 0;
    // System.out.println("SEPR.nextTerm termCount=" + termState.termBlockOrd + " isFirstTerm=" +
    // isFirstTerm + " bytesReader.pos=" + termState.bytesReader.getPosition());
    // System.out.println("  docFreq=" + termState.docFreq);
    termState.docIndex.read(termState.bytesReader, isFirstTerm);
    // System.out.println("  docIndex=" + termState.docIndex);
    if (fieldInfo.getIndexOptions() != IndexOptions.DOCS_ONLY) {
      termState.freqIndex.read(termState.bytesReader, isFirstTerm);
      if (fieldInfo.getIndexOptions() == IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) {
        // System.out.println("  freqIndex=" + termState.freqIndex);
        termState.posIndex.read(termState.bytesReader, isFirstTerm);
        // System.out.println("  posIndex=" + termState.posIndex);
        if (fieldInfo.hasPayloads()) {
          if (isFirstTerm) {
            termState.payloadFP = termState.bytesReader.readVLong();
          } else {
            termState.payloadFP += termState.bytesReader.readVLong();
          }
          // System.out.println("  payloadFP=" + termState.payloadFP);
        }
      }
    }

    if (termState.docFreq >= skipMinimum) {
      // System.out.println("   readSkip @ " + termState.bytesReader.getPosition());
      if (isFirstTerm) {
        termState.skipFP = termState.bytesReader.readVLong();
      } else {
        termState.skipFP += termState.bytesReader.readVLong();
      }
      // System.out.println("  skipFP=" + termState.skipFP);
    } else if (isFirstTerm) {
      termState.skipFP = 0;
    }
  }
 @Override
 public SepTermState clone() {
   SepTermState other = new SepTermState();
   other.copyFrom(this);
   return other;
 }