def METHOD_NAME(d1, d2, level='root'):
    if type(d1) is not type(d2):
        print(f"{level:<20} Type mismatch")
        print(f"{level:<20}    {type(d1)}: {repr(d1)}")
        print(f"{level:<20}    {type(d2)}: {repr(d2)}")
    if isinstance(d1, dict) and isinstance(d2, dict):
        if d1.keys() != d2.keys():
            s1 = set(d1.keys())
            s2 = set(d2.keys())
            print('{:<20} + {} - {}'.format(level, s1-s2, s2-s1))
            common_keys = s1 & s2
        else:
            common_keys = set(d1.keys())
        for k in common_keys:
            METHOD_NAME(
                d1[k], d2[k], level=f"{level}.{k}")
    elif isinstance(d1, list) and isinstance(d2, list):
        if len(d1) != len(d2):
            print(f"{level:<20} len1={len(d1)}; len2={len(d2)}")
        common_len = min(len(d1), len(d2))
        for i in range(common_len):
            METHOD_NAME(
                d1[i], d2[i], level=f"{level}.{i}")
    else:
        if d1 != d2:
            print(f"{level:<20} {repr(d1)} != {repr(d2)}")