public static @Nullable <T> Change buildChanges(T @NotNull [] objects1,
                                                  T @NotNull [] objects2,
                                                  @NotNull HashingStrategy<? super T> strategy) throws FilesTooBigForDiffException {
    int startShift = getStartShift(objects1, objects2, strategy);
    int endCut = getEndCut(objects1, objects2, startShift, strategy);

    Ref<Change> changeRef = doBuildChangesFast(objects1.length, objects2.length, startShift, endCut);
    if (changeRef != null) return changeRef.get();

    int trimmedLength = objects1.length + objects2.length - 2 * startShift - 2 * endCut;
    Enumerator<T> enumerator = new Enumerator<>(trimmedLength, strategy);
    int[] ints1 = enumerator.enumerate(objects1, startShift, endCut);
    int[] ints2 = enumerator.enumerate(objects2, startShift, endCut);
    return doBuildChanges(ints1, ints2, new ChangeBuilder(startShift));
  }
public static @Nullable <T> Change buildChanges(T @NotNull [] objects1,
                                                  T @NotNull [] objects2,
                                                  @NotNull HashingStrategy<? super T> strategy)