// Path: src/main/java/org/fest/util/Arrays.java
// public static boolean isArray(@Nullable Object o) {
//   return o != null && o.getClass().isArray();
// }
// 
// Path: src/main/java/org/fest/util/Sets.java
// public static @NotNull <T> HashSet<T> newHashSet() {
//   return new HashSet<T>();
// }
// 
// Path: src/main/java/org/fest/util/ToString.java
// public static @Nullable String toStringOf(@Nullable Object o) {
//   if (isArray(o)) {
//     return Arrays.format(o);
//   }
//   if (o instanceof Calendar) {
//     return toStringOf(o);
//   }
//   if (o instanceof Class<?>) {
//     return toStringOf((Class<?>) o);
//   }
//   if (o instanceof Collection<?>) {
//     return toStringOf((Collection<?>) o);
//   }
//   if (o instanceof Date) {
//     return toStringOf(o);
//   }
//   if (o instanceof Float) {
//     return toStringOf((Float) o);
//   }
//   if (o instanceof Long) {
//     return toStringOf((Long) o);
//   }
//   if (o instanceof File) {
//     return toStringOf((File) o);
//   }
//   if (o instanceof Map<?, ?>) {
//     return toStringOf((Map<?, ?>) o);
//   }
//   if (o instanceof String) {
//     return quote((String) o);
//   }
//   if (o instanceof Comparator) {
//     return toStringOf((Comparator<?>) o);
//   }
//   return o == null ? null : o.toString();
// }


import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Array;
import java.util.HashSet;
import java.util.Set;
import static java.lang.reflect.Array.getLength;
import static org.fest.util.Arrays.isArray;
import static org.fest.util.Sets.newHashSet;
import static org.fest.util.ToString.toStringOf;
    return isObjectArray(o) ? formatObjectArray(o) : formatPrimitiveArray(o);
  }

  private @NotNull String formatObjectArray(@NotNull Object o) {
    Object[] array = (Object[]) o;
    int size = array.length;
    if (size == 0) {
      return "[]";
    }
    StringBuilder buffer = new StringBuilder((20 * (size - 1)));
    HashSet<Object[]> alreadyFormatted = newHashSet();
    deepToString(array, buffer, alreadyFormatted);
    return buffer.toString();
  }

  private void deepToString(@Nullable Object[] array, @NotNull StringBuilder buffer,
                            @NotNull Set<Object[]> alreadyFormatted) {
    if (array == null) {
      buffer.append(NULL);
      return;
    }
    alreadyFormatted.add(array);
    buffer.append('[');
    int size = array.length;
    for (int i = 0; i < size; i++) {
      if (i != 0) {
        buffer.append(", ");
      }
      Object element = array[i];
      if (!isArray(element)) {
// Path: src/main/java/org/fest/util/Arrays.java
// public static boolean isArray(@Nullable Object o) {
//   return o != null && o.getClass().isArray();
// }
// 
// Path: src/main/java/org/fest/util/Sets.java
// public static @NotNull <T> HashSet<T> newHashSet() {
//   return new HashSet<T>();
// }
// 
// Path: src/main/java/org/fest/util/ToString.java
// public static @Nullable String toStringOf(@Nullable Object o) {
//   if (isArray(o)) {
//     return Arrays.format(o);
//   }
//   if (o instanceof Calendar) {
//     return toStringOf(o);
//   }
//   if (o instanceof Class<?>) {
//     return toStringOf((Class<?>) o);
//   }
//   if (o instanceof Collection<?>) {
//     return toStringOf((Collection<?>) o);
//   }
//   if (o instanceof Date) {
//     return toStringOf(o);
//   }
//   if (o instanceof Float) {
//     return toStringOf((Float) o);
//   }
//   if (o instanceof Long) {
//     return toStringOf((Long) o);
//   }
//   if (o instanceof File) {
//     return toStringOf((File) o);
//   }
//   if (o instanceof Map<?, ?>) {
//     return toStringOf((Map<?, ?>) o);
//   }
//   if (o instanceof String) {
//     return quote((String) o);
//   }
//   if (o instanceof Comparator) {
//     return toStringOf((Comparator<?>) o);
//   }
//   return o == null ? null : o.toString();
// }


// Path: src/main/java/org/fest/util/ArrayFormatter.java
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Array;
import java.util.HashSet;
import java.util.Set;
import static java.lang.reflect.Array.getLength;
import static org.fest.util.Arrays.isArray;
import static org.fest.util.Sets.newHashSet;
import static org.fest.util.ToString.toStringOf;

    return isObjectArray(o) ? formatObjectArray(o) : formatPrimitiveArray(o);
  }

  private @NotNull String formatObjectArray(@NotNull Object o) {
    Object[] array = (Object[]) o;
    int size = array.length;
    if (size == 0) {
      return "[]";
    }
    StringBuilder buffer = new StringBuilder((20 * (size - 1)));
    HashSet<Object[]> alreadyFormatted = newHashSet();
    deepToString(array, buffer, alreadyFormatted);
    return buffer.toString();
  }

  private void deepToString(@Nullable Object[] array, @NotNull StringBuilder buffer,
                            @NotNull Set<Object[]> alreadyFormatted) {
    if (array == null) {
      buffer.append(NULL);
      return;
    }
    alreadyFormatted.add(array);
    buffer.append('[');
    int size = array.length;
    for (int i = 0; i < size; i++) {
      if (i != 0) {
        buffer.append(", ");
      }
      Object element = array[i];
      if (!isArray(element)) {
        buffer.append(element == null ? NULL : toStringOf(element));