// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static BigDecimal convert2BigDecimal(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return BIG_DECIMAL_ZERO;
//     }
//     return convertToBigDecimal(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static boolean convert2boolean(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return false;
//     }
//     return convertToBoolean(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/ReflectionUtils.java
// protected static String getClassLoaderName(Class<?> c)
// {
//     ClassLoader loader = c.getClassLoader();
//     return loader == null ? "bootstrap" : loader.toString();
// }


import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import static com.cedarsoftware.util.Converter.convert2BigDecimal;
import static com.cedarsoftware.util.Converter.convert2boolean;
import static com.cedarsoftware.util.ReflectionUtils.getClassLoaderName;
        final double absA = Math.abs(a);
        final double absB = Math.abs(b);
        final double diff = Math.abs(a - b);

        if (a == b)
        { // shortcut, handles infinities
            return true;
        }
        else if (a == 0 || b == 0 || diff < Double.MIN_NORMAL)
        {
            // a or b is zero or both are extremely close to it
            // relative error is less meaningful here
            return diff < (epsilon * Double.MIN_NORMAL);
        }
        else
        { // use relative error
            return diff / (absA + absB) < epsilon;
        }
    }

    /**
     * Determine if the passed in class has a non-Object.equals() method.  This
     * method caches its results in static ConcurrentHashMap to benefit
     * execution performance.
     * @param c Class to check.
     * @return true, if the passed in Class has a .equals() method somewhere between
     * itself and just below Object in it's inheritance.
     */
    public static boolean hasCustomEquals(Class<?> c)
    {
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static BigDecimal convert2BigDecimal(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return BIG_DECIMAL_ZERO;
//     }
//     return convertToBigDecimal(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static boolean convert2boolean(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return false;
//     }
//     return convertToBoolean(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/ReflectionUtils.java
// protected static String getClassLoaderName(Class<?> c)
// {
//     ClassLoader loader = c.getClassLoader();
//     return loader == null ? "bootstrap" : loader.toString();
// }


// Path: src/main/java/com/cedarsoftware/util/DeepEquals.java
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import static com.cedarsoftware.util.Converter.convert2BigDecimal;
import static com.cedarsoftware.util.Converter.convert2boolean;
import static com.cedarsoftware.util.ReflectionUtils.getClassLoaderName;

        final double absA = Math.abs(a);
        final double absB = Math.abs(b);
        final double diff = Math.abs(a - b);

        if (a == b)
        { // shortcut, handles infinities
            return true;
        }
        else if (a == 0 || b == 0 || diff < Double.MIN_NORMAL)
        {
            // a or b is zero or both are extremely close to it
            // relative error is less meaningful here
            return diff < (epsilon * Double.MIN_NORMAL);
        }
        else
        { // use relative error
            return diff / (absA + absB) < epsilon;
        }
    }

    /**
     * Determine if the passed in class has a non-Object.equals() method.  This
     * method caches its results in static ConcurrentHashMap to benefit
     * execution performance.
     * @param c Class to check.
     * @return true, if the passed in Class has a .equals() method somewhere between
     * itself and just below Object in it's inheritance.
     */
    public static boolean hasCustomEquals(Class<?> c)
    {
        StringBuilder sb = new StringBuilder(getClassLoaderName(c));