def create_bom(merged_manifest, approved_list, denied_list):
    """Creates a BOM

    If a BOM package is approved or denied, the 'copyright_notice',
    'interaction_types', and 'resolution' will be copied over. Otherwise, these
    attributes will be added to the BOM with empty values.

    Args:
        merged_manifest: dictionary representing all the packages used by a
            project
        denied_list: dictionary representing the denied packages
        approved_list: dictionary representing the approved packages

    Returns:
        Dictionary representing the BOM.
    """
    resolved_packages = dict(list(approved_list.items()) + list(denied_list.items()))

    bom = merged_manifest.copy()
    for key in bom.keys():
        package_info = {
            "copyright_notices": "",
            "interaction_types": [],
            "resolution": "",
        }
        resolved_package = resolved_packages.get(key)
        # standardize all version numbers to be strings
        bom[key]["version"] = str(bom[key]["version"])
        if resolved_package is not None:
            for k in package_info.keys():
                package_info[k] = resolved_package[k]

        bom[key].update(package_info)

    return bom