def normalized_msgpack(value):
    """Recursively convert int to str if the int "overflows".

    Args:
        value (list, dict, int, float, str, bool or None): value to be normalized

    If `value` is a list, then all elements in the list are (recursively)
    normalized.

    If `value` is a dictionary, then all the dictionary keys and values are
    (recursively) normalized.
    
    If `value` is an integer, and outside the range ``-(1 << 63)`` to
    ``(1 << 64)``, then it is converted to a string.

    Otherwise, `value` is returned unchanged.

    Returns:
        Normalized value
    """
    if isinstance(value, (list, tuple)):
        return [normalized_msgpack(v) for v in value]
    elif isinstance(value, dict):
        return dict(
            [(normalized_msgpack(k), normalized_msgpack(v)) for (k, v) in value.items()]
        )

    if isinstance(value, int):
        if -(1 << 63) < value < (1 << 64):
            return value
        else:
            return str(value)
    else:
        return value