def update(dest, variation, path=None):
        """
        Deep merges dictionary object variation into dest, dest keys in variation will be assigned new values
        from variation
        :param dest:
        :param variation:
        :param path:
        :return:
        """
        if dest is None:
            return None
        if variation is None:
            return dest
        if path is None:
            path = []

        for key in variation:
            if key in dest:
                if isinstance(dest[key], dict) and isinstance(variation[key], dict):
                    EBUtils.update(dest[key], variation[key], path + [str(key)])
                elif dest[key] == variation[key]:
                    pass  # same leaf value
                else:
                    dest[key] = variation[key]
            else:
                dest[key] = variation[key]

        return dest