docs: public static ArrayList<MtasTreeHit<?>> searchMtasTree(int startPosition,
        int endPosition, IndexInput in, long ref, long objectRefApproxOffset)
        throws IOException {
      int boundary = 1000 + 10 * (endPosition - startPosition);
      ArrayList<MtasTreeHit<?>> list = new ArrayList<MtasTreeHit<?>>();
      ArrayList<MtasTreeItem> checkList = new ArrayList<MtasTreeItem>();
      AtomicBoolean isSinglePoint = new AtomicBoolean(false);
      AtomicBoolean isStoreAdditionalId = new AtomicBoolean(false);
      AtomicLong nodeRefApproxOffset = new AtomicLong(-1);
      checkList.add(getMtasTreeItem(ref, isSinglePoint, isStoreAdditionalId,
          nodeRefApproxOffset, in, objectRefApproxOffset));
      ArrayList<Long> history = new ArrayList<Long>();
      do {
        MtasTreeItem checkItem = checkList.remove(checkList.size() - 1);
        searchMtasTree(checkItem, startPosition, endPosition, in, isSinglePoint,
            isStoreAdditionalId, objectRefApproxOffset, list, nodeRefApproxOffset,
            checkList);
        history.add(checkItem.ref);
        if (history.size() > boundary) {
          throw new IOException("Too many items collected from tree");
        }
      } while (checkList.size() > 0);
      return list;
    }