aboutsummaryrefslogtreecommitdiff
path: root/devel/electron28/files
diff options
context:
space:
mode:
Diffstat (limited to 'devel/electron28/files')
-rw-r--r--devel/electron28/files/apply-electron-patches.sh26
-rw-r--r--devel/electron28/files/extra-patch-electron_shell_browser_electron__browser__context.h64
-rw-r--r--devel/electron28/files/extra-patch-electron_shell_browser_ui_gtk_menu__gtk.h11
-rw-r--r--devel/electron28/files/extra-patch-electron_shell_browser_ui_status__icon__gtk.h10
-rw-r--r--devel/electron28/files/package.json156
-rw-r--r--devel/electron28/files/patch-BUILD.gn89
-rw-r--r--devel/electron28/files/patch-apps_ui_views_app__window__frame__view.cc11
-rw-r--r--devel/electron28/files/patch-ash_display_mirror__window__controller.cc14
-rw-r--r--devel/electron28/files/patch-base_BUILD.gn144
-rw-r--r--devel/electron28/files/patch-base_allocator_dispatcher_tls.h11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_partition__alloc.gni11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h20
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator.h11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h38
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__internals__posix.h16
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__address__space.cc11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_compiler__specific.h32
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_debug_stack__trace__posix.cc34
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_rand__util__posix.cc13
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__internal__posix.h11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__posix.cc11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__config.h29
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h21
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h16
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__page__constants.h11
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__root.cc38
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_spinning__mutex.cc53
-rw-r--r--devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_starscan_stack_stack.cc50
-rw-r--r--devel/electron28/files/patch-base_atomicops.h14
-rw-r--r--devel/electron28/files/patch-base_base__paths__posix.cc108
-rw-r--r--devel/electron28/files/patch-base_base__switches.cc11
-rw-r--r--devel/electron28/files/patch-base_base__switches.h11
-rw-r--r--devel/electron28/files/patch-base_compiler__specific.h35
-rw-r--r--devel/electron28/files/patch-base_debug_debugger__posix.cc68
-rw-r--r--devel/electron28/files/patch-base_debug_elf__reader.cc18
-rw-r--r--devel/electron28/files/patch-base_debug_proc__maps__linux.cc11
-rw-r--r--devel/electron28/files/patch-base_debug_stack__trace.cc21
-rw-r--r--devel/electron28/files/patch-base_debug_stack__trace__posix.cc101
-rw-r--r--devel/electron28/files/patch-base_files_dir__reader__linux.h39
-rw-r--r--devel/electron28/files/patch-base_files_dir__reader__posix.h20
-rw-r--r--devel/electron28/files/patch-base_files_file__path__watcher.h11
-rw-r--r--devel/electron28/files/patch-base_files_file__path__watcher__bsd.cc57
-rw-r--r--devel/electron28/files/patch-base_files_file__path__watcher__kqueue.h10
-rw-r--r--devel/electron28/files/patch-base_files_file__path__watcher__unittest.cc29
-rw-r--r--devel/electron28/files/patch-base_files_file__util__posix.cc53
-rw-r--r--devel/electron28/files/patch-base_files_file__util__unittest.cc20
-rw-r--r--devel/electron28/files/patch-base_files_important__file__writer__cleaner.cc12
-rw-r--r--devel/electron28/files/patch-base_files_scoped__file.cc11
-rw-r--r--devel/electron28/files/patch-base_functional_unretained__traits.h11
-rw-r--r--devel/electron28/files/patch-base_i18n_icu__util.cc20
-rw-r--r--devel/electron28/files/patch-base_linux__util.cc25
-rw-r--r--devel/electron28/files/patch-base_logging__unittest.cc31
-rw-r--r--devel/electron28/files/patch-base_memory_discardable__memory.cc38
-rw-r--r--devel/electron28/files/patch-base_memory_discardable__memory__internal.h11
-rw-r--r--devel/electron28/files/patch-base_memory_madv__free__discardable__memory__posix.cc21
-rw-r--r--devel/electron28/files/patch-base_memory_platform__shared__memory__region.h29
-rw-r--r--devel/electron28/files/patch-base_memory_platform__shared__memory__region__posix.cc29
-rw-r--r--devel/electron28/files/patch-base_message__loop_message__pump__glib.cc28
-rw-r--r--devel/electron28/files/patch-base_native__library__posix.cc11
-rw-r--r--devel/electron28/files/patch-base_native__library__unittest.cc11
-rw-r--r--devel/electron28/files/patch-base_posix_can__lower__nice__to.cc16
-rw-r--r--devel/electron28/files/patch-base_posix_sysctl.cc10
-rw-r--r--devel/electron28/files/patch-base_posix_unix__domain__socket.cc39
-rw-r--r--devel/electron28/files/patch-base_posix_unix__domain__socket__unittest.cc11
-rw-r--r--devel/electron28/files/patch-base_process_kill.h11
-rw-r--r--devel/electron28/files/patch-base_process_kill__posix.cc11
-rw-r--r--devel/electron28/files/patch-base_process_launch.h11
-rw-r--r--devel/electron28/files/patch-base_process_launch__posix.cc12
-rw-r--r--devel/electron28/files/patch-base_process_memory__linux.cc44
-rw-r--r--devel/electron28/files/patch-base_process_process__handle.cc11
-rw-r--r--devel/electron28/files/patch-base_process_process__handle.h11
-rw-r--r--devel/electron28/files/patch-base_process_process__handle__freebsd.cc25
-rw-r--r--devel/electron28/files/patch-base_process_process__handle__openbsd.cc89
-rw-r--r--devel/electron28/files/patch-base_process_process__iterator__freebsd.cc51
-rw-r--r--devel/electron28/files/patch-base_process_process__iterator__openbsd.cc45
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics.cc54
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics.h120
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics__freebsd.cc305
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics__openbsd.cc219
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics__posix.cc20
-rw-r--r--devel/electron28/files/patch-base_process_process__metrics__unittest.cc18
-rw-r--r--devel/electron28/files/patch-base_process_process__posix.cc94
-rw-r--r--devel/electron28/files/patch-base_process_process__unittest.cc11
-rw-r--r--devel/electron28/files/patch-base_profiler_module__cache.cc11
-rw-r--r--devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.cc20
-rw-r--r--devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.h20
-rw-r--r--devel/electron28/files/patch-base_profiler_stack__base__address__posix.cc50
-rw-r--r--devel/electron28/files/patch-base_profiler_stack__sampling__profiler__test__util.cc11
-rw-r--r--devel/electron28/files/patch-base_profiler_stack__sampling__profiler__unittest.cc11
-rw-r--r--devel/electron28/files/patch-base_profiler_thread__delegate__posix.cc20
-rw-r--r--devel/electron28/files/patch-base_rand__util.h11
-rw-r--r--devel/electron28/files/patch-base_rand__util__posix.cc62
-rw-r--r--devel/electron28/files/patch-base_strings_safe__sprintf__unittest.cc18
-rw-r--r--devel/electron28/files/patch-base_synchronization_lock__impl.h23
-rw-r--r--devel/electron28/files/patch-base_syslog__logging.cc20
-rw-r--r--devel/electron28/files/patch-base_system_sys__info.cc11
-rw-r--r--devel/electron28/files/patch-base_system_sys__info.h20
-rw-r--r--devel/electron28/files/patch-base_system_sys__info__freebsd.cc115
-rw-r--r--devel/electron28/files/patch-base_system_sys__info__openbsd.cc87
-rw-r--r--devel/electron28/files/patch-base_system_sys__info__posix.cc29
-rw-r--r--devel/electron28/files/patch-base_system_sys__info__unittest.cc20
-rw-r--r--devel/electron28/files/patch-base_task_thread__pool_environment__config__unittest.cc11
-rw-r--r--devel/electron28/files/patch-base_test_launcher_test__launcher.cc10
-rw-r--r--devel/electron28/files/patch-base_test_test__file__util__linux.cc13
-rw-r--r--devel/electron28/files/patch-base_test_test__file__util__posix.cc11
-rw-r--r--devel/electron28/files/patch-base_threading_hang__watcher.cc11
-rw-r--r--devel/electron28/files/patch-base_threading_platform__thread__bsd.cc34
-rw-r--r--devel/electron28/files/patch-base_threading_platform__thread__internal__posix.cc11
-rw-r--r--devel/electron28/files/patch-base_threading_platform__thread__posix.cc45
-rw-r--r--devel/electron28/files/patch-base_threading_platform__thread__unittest.cc38
-rw-r--r--devel/electron28/files/patch-base_trace__event_malloc__dump__provider.cc30
-rw-r--r--devel/electron28/files/patch-base_trace__event_memory__dump__manager.cc11
-rw-r--r--devel/electron28/files/patch-base_trace__event_process__memory__dump.cc20
-rw-r--r--devel/electron28/files/patch-base_trace__event_trace__log.cc16
-rw-r--r--devel/electron28/files/patch-base_tracing_trace__time.cc28
-rw-r--r--devel/electron28/files/patch-base_tracing_trace__time.h11
-rw-r--r--devel/electron28/files/patch-build_config_BUILD.gn13
-rw-r--r--devel/electron28/files/patch-build_config_BUILDCONFIG.gn45
-rw-r--r--devel/electron28/files/patch-build_config_compiler_BUILD.gn140
-rw-r--r--devel/electron28/files/patch-build_config_compiler_pgo_BUILD.gn19
-rw-r--r--devel/electron28/files/patch-build_config_linux_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-build_config_linux_atspi2_BUILD.gn25
-rw-r--r--devel/electron28/files/patch-build_config_linux_pkg-config.py11
-rw-r--r--devel/electron28/files/patch-build_config_ozone.gni19
-rw-r--r--devel/electron28/files/patch-build_config_v8__target__cpu.gni13
-rw-r--r--devel/electron28/files/patch-build_detect__host__arch.py11
-rw-r--r--devel/electron28/files/patch-build_gn__run__binary.py11
-rw-r--r--devel/electron28/files/patch-build_linux_chrome.map13
-rw-r--r--devel/electron28/files/patch-build_linux_strip__binary.py10
-rw-r--r--devel/electron28/files/patch-build_linux_unbundle_icu.gn18
-rw-r--r--devel/electron28/files/patch-build_linux_unbundle_libevent.gn15
-rw-r--r--devel/electron28/files/patch-build_linux_unbundle_libusb.gn30
-rw-r--r--devel/electron28/files/patch-build_toolchain_freebsd_BUILD.gn69
-rw-r--r--devel/electron28/files/patch-build_toolchain_gcc__solink__wrapper.py11
-rw-r--r--devel/electron28/files/patch-build_toolchain_gcc__toolchain.gni44
-rw-r--r--devel/electron28/files/patch-build_toolchain_openbsd_BUILD.gn69
-rw-r--r--devel/electron28/files/patch-build_toolchain_toolchain.gni11
-rw-r--r--devel/electron28/files/patch-cc_BUILD.gn19
-rw-r--r--devel/electron28/files/patch-cc_base_features.cc11
-rw-r--r--devel/electron28/files/patch-cc_paint_paint__op__writer.h41
-rw-r--r--devel/electron28/files/patch-chrome_app_app__management__strings.grdp11
-rw-r--r--devel/electron28/files/patch-chrome_app_chrome__command__ids.h17
-rw-r--r--devel/electron28/files/patch-chrome_app_chrome__main.cc34
-rw-r--r--devel/electron28/files/patch-chrome_app_chrome__main__delegate.cc112
-rw-r--r--devel/electron28/files/patch-chrome_app_chromium__strings.grd38
-rw-r--r--devel/electron28/files/patch-chrome_app_generated__resources.grd92
-rw-r--r--devel/electron28/files/patch-chrome_app_google__chrome__strings.grd38
-rw-r--r--devel/electron28/files/patch-chrome_app_profiles__strings.grdp11
-rw-r--r--devel/electron28/files/patch-chrome_app_settings__strings.grdp35
-rw-r--r--devel/electron28/files/patch-chrome_app_theme_chrome__unscaled__resources.grd29
-rw-r--r--devel/electron28/files/patch-chrome_app_theme_theme__resources.grd59
-rw-r--r--devel/electron28/files/patch-chrome_browser_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-chrome_browser_about__flags.cc180
-rw-r--r--devel/electron28/files/patch-chrome_browser_after__startup__task__utils.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_apps_app__service_publishers_extension__apps.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_background_background__mode__manager.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_background_background__mode__optimizer.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_browser__features.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_browser__features.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_browser__process__impl.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_browser__process__impl.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__browser__interface__binders.cc81
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__browser__main.cc78
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__browser__main__extra__parts__linux.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__browser__main__linux.cc21
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__browser__main__posix.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.cc160
-rw-r--r--devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_component__updater_registration.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_component__updater_widevine__cdm__component__installer.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_content__settings_one__time__permission__provider.cc30
-rw-r--r--devel/electron28/files/patch-chrome_browser_custom__handlers_chrome__protocol__handler__registry__delegate.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_defaults.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_device__identity_device__oauth2__token__service__factory.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_diagnostics_diagnostics__writer.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_bubble_download__bubble__update__service.cc32
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__commands.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__commands.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__file__picker.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__item__model.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__prefs.cc90
-rw-r--r--devel/electron28/files/patch-chrome_browser_download_download__prefs.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_analysis_analysis__service__settings.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_connectors__service.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__connector__service__factory.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__service__factory.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_browser_commands_key__rotation__command__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_core_persistence_key__persistence__delegate__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_signals_signals__service__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_browser__crash__event__router.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_crash__reporting__context.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_identifiers_profile__id__delegate__impl.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_profile__management_profile__management__navigation__throttle.cc13
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_remote__commands_cbcm__remote__commands__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher__linux.cc78
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_BUILD.gn13
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_api__browser__context__keyed__service__factories.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_chrome__desktop__report__request__helper.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.h29
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_messaging_native__process__launcher__posix.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_passwords__private_passwords__private__delegate__impl.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc13
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_tabs_tabs__api.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_api_webstore__private_webstore__private__api.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_extensions_external__provider__impl.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_first__run_first__run__dialog.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_first__run_first__run__internal.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_flag__descriptions.cc83
-rw-r--r--devel/electron28/files/patch-chrome_browser_flag__descriptions.h89
-rw-r--r--devel/electron28/files/patch-chrome_browser_gcm_gcm__profile__service__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_gcm_instance__id_instance__id__profile__service__factory.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_headless_headless__mode__util.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_intranet__redirect__detector.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc15
-rw-r--r--devel/electron28/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc16
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_audio__service__util.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_router_discovery_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc48
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc30
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_capture__policy__utils.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.cc47
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc13
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc33
-rw-r--r--devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_memory__details.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc55
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc56
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_perf_cpu__identity.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_power_process__metrics__recorder__util.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.cc174
-rw-r--r--devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.h29
-rw-r--r--devel/electron28/files/patch-chrome_browser_new__tab__page_modules_drive_drive__service.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_new__tab__page_new__tab__page__util.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_notifications_notification__display__service__impl.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_notifications_notification__platform__bridge__delegator.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_password__manager_password__reuse__manager__factory.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_performance__manager_metrics_cpu__probe_cpu__probe.cc12
-rw-r--r--devel/electron28/files/patch-chrome_browser_platform__util__linux.cc12
-rw-r--r--devel/electron28/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_policy_chrome__browser__cloud__management__controller__desktop.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc221
-rw-r--r--devel/electron28/files/patch-chrome_browser_policy_device__management__service__configuration.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_policy_policy__value__and__status__aggregator.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_prefs_browser__prefs.cc75
-rw-r--r--devel/electron28/files/patch-chrome_browser_prefs_pref__service__incognito__allowlist.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_printing_print__backend__service__manager.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_printing_printer__query.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_process__singleton__posix.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc96
-rw-r--r--devel/electron28/files/patch-chrome_browser_profiles_profile__impl.cc40
-rw-r--r--devel/electron28/files/patch-chrome_browser_profiles_profiles__state.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_renderer__preferences__util.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_sandbox__internals_sandbox__internals.ts29
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.ts20
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html29
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.ts65
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_settings_autofill__page_passwords__shared.css11
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_settings_route.ts11
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_signin_signin__shared.css11
-rw-r--r--devel/electron28/files/patch-chrome_browser_resources_signin_sync__confirmation_sync__confirmation__app.html20
-rw-r--r--devel/electron28/files/patch-chrome_browser_safe__browsing_cloud__content__scanning_binary__upload__service.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.h29
-rw-r--r--devel/electron28/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_sharing_sharing__device__registration.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_signin_signin__util.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_supervised__user_supervised__user__navigation__observer.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_sync_chrome__sync__client.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_sync_device__info__sync__client__impl.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_sync_sync__service__factory.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_sync_sync__service__util.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.h38
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc47
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h38
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_task__manager_task__manager__observer.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_themes_theme__helper.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_themes_theme__service.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_themes_theme__service__aura__linux.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_themes_theme__service__factory.cc37
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_actions_chrome__action__id.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_browser.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_browser__command__controller.cc53
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_browser__view__prefs.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_chrome__pages.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_chrome__pages.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_color_native__chrome__color__mixer.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_omnibox_chrome__omnibox__client.cc21
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_omnibox_omnibox__pedal__implementations.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_sad__tab.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_sharing__hub_sharing__hub__bubble__controller.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller__delegate.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator__impl.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_tab__helpers.cc26
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_tabs_organization_trigger__observer.h10
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_test_popup__browsertest.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_test_test__browser__ui.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_ui__features.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_ui__features.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_accelerator__table.cc43
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_apps_chrome__native__app__window__views__aura.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate.h16
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate__linux.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_dark__mode__manager__linux.h10
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.cc56
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.h29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__view.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc38
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout__delegate.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.cc92
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.h47
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_frame_tab__strip__region__view.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_hung__renderer__view.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_profiles_dice__web__signin__interception__backdrop__layer.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_profiles_profile__menu__view__base.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.cc47
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tab__search__bubble__host.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc56
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__bubble__view.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__controller.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__style__views.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_views_web__apps_web__app__integration__test__driver.cc83
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_web__applications_web__app__dialogs.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_about__ui.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_app__home_app__home__page__handler.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc92
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_connectors__internals_device__trust__utils.cc29
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.cc53
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.h37
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_ntp_app__launcher__handler.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_realbox_realbox__handler.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc65
-rw-r--r--devel/electron28/files/patch-chrome_browser_ui_window__sizer_window__sizer.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_commands_install__app__locally__command.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_extension__status__utils.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_extensions_extension__status__utils.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_os__integration__test__override.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_run__on__os__login__sub__manager.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_shortcut__sub__manager.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__file__handler__registration.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.cc20
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.h20
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut__manager.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_policy_web__app__policy__manager.cc11
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.cc119
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.h38
-rw-r--r--devel/electron28/files/patch-chrome_browser_web__applications_web__app__install__info.h11
-rw-r--r--devel/electron28/files/patch-chrome_browser_webauthn_chrome__authenticator__request__delegate.cc11
-rw-r--r--devel/electron28/files/patch-chrome_common_channel__info.h18
-rw-r--r--devel/electron28/files/patch-chrome_common_channel__info__posix.cc20
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__features.cc83
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__features.h45
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__paths.cc84
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__paths.h29
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__paths__internal.h11
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__switches.cc19
-rw-r--r--devel/electron28/files/patch-chrome_common_chrome__switches.h17
-rw-r--r--devel/electron28/files/patch-chrome_common_crash__keys.cc23
-rw-r--r--devel/electron28/files/patch-chrome_common_extensions_permissions_chrome__permission__message__rules.cc11
-rw-r--r--devel/electron28/files/patch-chrome_common_media_cdm__host__file__path.cc11
-rw-r--r--devel/electron28/files/patch-chrome_common_media_cdm__registration.cc52
-rw-r--r--devel/electron28/files/patch-chrome_common_media_component__widevine__cdm__hint__file__linux.h11
-rw-r--r--devel/electron28/files/patch-chrome_common_pref__names.h82
-rw-r--r--devel/electron28/files/patch-chrome_common_url__constants.h11
-rw-r--r--devel/electron28/files/patch-chrome_common_webui__url__constants.cc68
-rw-r--r--devel/electron28/files/patch-chrome_common_webui__url__constants.h58
-rw-r--r--devel/electron28/files/patch-chrome_renderer_chrome__render__frame__observer.cc11
-rw-r--r--devel/electron28/files/patch-chrome_services_file__util_public_mojom_safe__document__analyzer__mojom__traits.h11
-rw-r--r--devel/electron28/files/patch-chrome_services_printing_print__backend__service__impl.cc47
-rw-r--r--devel/electron28/files/patch-chrome_services_speech_audio__source__fetcher__impl.cc11
-rw-r--r--devel/electron28/files/patch-chrome_test_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-chrome_test_chromedriver_capabilities.cc26
-rw-r--r--devel/electron28/files/patch-chrome_test_chromedriver_chrome__launcher.cc10
-rw-r--r--devel/electron28/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc29
-rw-r--r--devel/electron28/files/patch-chrome_test_chromedriver_key__converter__unittest.cc20
-rw-r--r--devel/electron28/files/patch-chrome_test_chromedriver_keycode__text__conversion__unittest.cc20
-rw-r--r--devel/electron28/files/patch-chrome_updater_configurator.cc11
-rw-r--r--devel/electron28/files/patch-chrome_updater_util_posix__util.cc11
-rw-r--r--devel/electron28/files/patch-chrome_utility_services.cc56
-rw-r--r--devel/electron28/files/patch-chromecast_browser_cast__browser__main__parts.cc38
-rw-r--r--devel/electron28/files/patch-chromecast_browser_cast__content__browser__client.cc11
-rw-r--r--devel/electron28/files/patch-chromecast_media_base_default__monotonic__clock.cc20
-rw-r--r--devel/electron28/files/patch-components_autofill__payments__strings.grdp11
-rw-r--r--devel/electron28/files/patch-components_autofill_core_browser_data__model_autofill__i18n__api.h16
-rw-r--r--devel/electron28/files/patch-components_autofill_core_browser_payments_iban__save__manager.cc14
-rw-r--r--devel/electron28/files/patch-components_autofill_core_browser_personal__data__manager.cc12
-rw-r--r--devel/electron28/files/patch-components_autofill_core_common_autofill__payments__features.cc11
-rw-r--r--devel/electron28/files/patch-components_autofill_core_common_autofill__util.cc11
-rw-r--r--devel/electron28/files/patch-components_commerce__strings.grdp11
-rw-r--r--devel/electron28/files/patch-components_commerce_core_commerce__feature__list.cc11
-rw-r--r--devel/electron28/files/patch-components_components__chromium__strings.grd11
-rw-r--r--devel/electron28/files/patch-components_components__google__chrome__strings.grd11
-rw-r--r--devel/electron28/files/patch-components_content__settings_core_browser_website__settings__registry.cc11
-rw-r--r--devel/electron28/files/patch-components_cookie__config_cookie__store__util.cc11
-rw-r--r--devel/electron28/files/patch-components_crash_core_app_BUILD.gn43
-rw-r--r--devel/electron28/files/patch-components_crash_core_app_chrome__crashpad__handler.cc12
-rw-r--r--devel/electron28/files/patch-components_crash_core_browser_crash__upload__list__crashpad.cc26
-rw-r--r--devel/electron28/files/patch-components_crash_core_common_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_mock__signals__aggregator.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.cc11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.cc11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_common_signals__features.cc11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_common_signals__features.h11
-rw-r--r--devel/electron28/files/patch-components_device__signals_core_system__signals_platform__delegate.cc11
-rw-r--r--devel/electron28/files/patch-components_device__signals_test_signals__contract.cc11
-rw-r--r--devel/electron28/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc11
-rw-r--r--devel/electron28/files/patch-components_embedder__support_user__agent__utils.cc12
-rw-r--r--devel/electron28/files/patch-components_embedder__support_user__agent__utils__unittest.cc20
-rw-r--r--devel/electron28/files/patch-components_eye__dropper_eye__dropper__view.cc11
-rw-r--r--devel/electron28/files/patch-components_eye__dropper_eye__dropper__view__aura.cc11
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_event__constants.cc11
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_event__constants.h11
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_feature__configurations.cc21
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_feature__constants.cc20
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_feature__constants.h20
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_feature__list.cc20
-rw-r--r--devel/electron28/files/patch-components_feature__engagement_public_feature__list.h38
-rw-r--r--devel/electron28/files/patch-components_feed_core_proto_v2_wire_version.proto13
-rw-r--r--devel/electron28/files/patch-components_feed_core_v2_feed__network__impl__unittest.cc13
-rw-r--r--devel/electron28/files/patch-components_feed_core_v2_proto__util.cc24
-rw-r--r--devel/electron28/files/patch-components_feed_core_v2_proto__util__unittest.cc13
-rw-r--r--devel/electron28/files/patch-components_feed_core_v2_test_proto__printer.cc13
-rw-r--r--devel/electron28/files/patch-components_flags__ui_flags__state.cc11
-rw-r--r--devel/electron28/files/patch-components_gwp__asan_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-components_gwp__asan_client_guarded__page__allocator__posix.cc13
-rw-r--r--devel/electron28/files/patch-components_gwp__asan_client_gwp__asan.cc11
-rw-r--r--devel/electron28/files/patch-components_gwp__asan_client_gwp__asan__features.cc11
-rw-r--r--devel/electron28/files/patch-components_gwp__asan_crash__handler_crash__analyzer.cc20
-rw-r--r--devel/electron28/files/patch-components_live__caption_caption__util.cc20
-rw-r--r--devel/electron28/files/patch-components_live__caption_caption__util.h11
-rw-r--r--devel/electron28/files/patch-components_management__strings.grdp11
-rw-r--r--devel/electron28/files/patch-components_media__router_common_providers_cast_channel_cast__message__util.cc11
-rw-r--r--devel/electron28/files/patch-components_metrics_drive__metrics__provider__linux.cc16
-rw-r--r--devel/electron28/files/patch-components_metrics_metrics__log.cc38
-rw-r--r--devel/electron28/files/patch-components_metrics_motherboard.cc10
-rw-r--r--devel/electron28/files/patch-components_named__mojo__ipc__server_connection__info.h20
-rw-r--r--devel/electron28/files/patch-components_named__mojo__ipc__server_named__mojo__ipc__server__client__util.cc11
-rw-r--r--devel/electron28/files/patch-components_neterror_resources_neterror.js11
-rw-r--r--devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator.cc11
-rw-r--r--devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator__unittest.cc11
-rw-r--r--devel/electron28/files/patch-components_new__or__sad__tab__strings.grdp20
-rw-r--r--devel/electron28/files/patch-components_omnibox_browser_omnibox__edit__model.cc10
-rw-r--r--devel/electron28/files/patch-components_optimization__guide_core_optimization__guide__util.cc11
-rw-r--r--devel/electron28/files/patch-components_optimization__guide_core_tflite__model__executor.h62
-rw-r--r--devel/electron28/files/patch-components_os__crypt_sync_libsecret__util__linux.cc27
-rw-r--r--devel/electron28/files/patch-components_os__crypt_sync_os__crypt.h72
-rw-r--r--devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client.cc13
-rw-r--r--devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client__unittest.cc13
-rw-r--r--devel/electron28/files/patch-components_paint__preview_common_proto_paint__preview.proto13
-rw-r--r--devel/electron28/files/patch-components_paint__preview_player_player__compositor__delegate.cc13
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.cc20
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.h11
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_browser_login__database__unittest.cc11
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_browser_sync_password__sync__bridge.cc11
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.cc11
-rw-r--r--devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.h11
-rw-r--r--devel/electron28/files/patch-components_performance__manager_public_features.h11
-rw-r--r--devel/electron28/files/patch-components_permissions_prediction__service_prediction__common.cc20
-rw-r--r--devel/electron28/files/patch-components_policy_core_browser_policy__pref__mapping__test.cc11
-rw-r--r--devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__client.cc11
-rw-r--r--devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc55
-rw-r--r--devel/electron28/files/patch-components_policy_core_common_policy__loader__common.cc20
-rw-r--r--devel/electron28/files/patch-components_policy_core_common_policy__paths.cc11
-rw-r--r--devel/electron28/files/patch-components_policy_tools_generate__policy__source.py14
-rw-r--r--devel/electron28/files/patch-components_power__metrics_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-components_power__metrics_energy__metrics__provider.cc21
-rw-r--r--devel/electron28/files/patch-components_safe__browsing_content_common_file__type__policies__unittest.cc11
-rw-r--r--devel/electron28/files/patch-components_safe__browsing_content_resources_gen__file__type__proto.py20
-rw-r--r--devel/electron28/files/patch-components_safe__browsing_core_browser_db_v4__protocol__manager__util.cc11
-rw-r--r--devel/electron28/files/patch-components_safe__browsing_core_browser_realtime_url__lookup__service__base.cc11
-rw-r--r--devel/electron28/files/patch-components_security__interstitials_content_utils.cc11
-rw-r--r--devel/electron28/files/patch-components_segmentation__platform_embedder_default__model_cross__device__user__segment.cc11
-rw-r--r--devel/electron28/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc29
-rw-r--r--devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.cc18
-rw-r--r--devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.h16
-rw-r--r--devel/electron28/files/patch-components_services_screen__ai_screen__ai__library__wrapper.cc29
-rw-r--r--devel/electron28/files/patch-components_startup__metric__utils_common_startup__metric__utils.cc11
-rw-r--r--devel/electron28/files/patch-components_storage__monitor_BUILD.gn20
-rw-r--r--devel/electron28/files/patch-components_storage__monitor_removable__device__constants.cc11
-rw-r--r--devel/electron28/files/patch-components_storage__monitor_removable__device__constants.h11
-rw-r--r--devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.cc39
-rw-r--r--devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.h21
-rw-r--r--devel/electron28/files/patch-components_supervised__user_core_browser_supervised__user__service.cc11
-rw-r--r--devel/electron28/files/patch-components_supervised__user_core_common_features.cc20
-rw-r--r--devel/electron28/files/patch-components_supervised__user_core_common_features.h11
-rw-r--r--devel/electron28/files/patch-components_sync__device__info_local__device__info__util.cc29
-rw-r--r--devel/electron28/files/patch-components_sync__device__info_local__device__info__util__linux.cc14
-rw-r--r--devel/electron28/files/patch-components_sync_base_features.cc11
-rw-r--r--devel/electron28/files/patch-components_translate_core_common_translate__util.cc11
-rw-r--r--devel/electron28/files/patch-components_update__client_update__query__params.cc11
-rw-r--r--devel/electron28/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc11
-rw-r--r--devel/electron28/files/patch-components_user__education_common_product__messaging__controller.cc10
-rw-r--r--devel/electron28/files/patch-components_user__education_views_help__bubble__view.cc11
-rw-r--r--devel/electron28/files/patch-components_variations_service_variations__service.cc11
-rw-r--r--devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc11
-rw-r--r--devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl__on__gpu.cc15
-rw-r--r--devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.cc20
-rw-r--r--devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.h20
-rw-r--r--devel/electron28/files/patch-components_viz_service_display_skia__renderer.cc11
-rw-r--r--devel/electron28/files/patch-content_app_content__main.cc11
-rw-r--r--devel/electron28/files/patch-content_app_content__main__runner__impl.cc122
-rw-r--r--devel/electron28/files/patch-content_browser_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-content_browser_audio_audio__service.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_browser__child__process__host__impl.cc19
-rw-r--r--devel/electron28/files/patch-content_browser_browser__child__process__host__impl.h20
-rw-r--r--devel/electron28/files/patch-content_browser_browser__child__process__host__impl__receiver__bindings.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_browser__main__loop.cc37
-rw-r--r--devel/electron28/files/patch-content_browser_child__process__launcher__helper.h11
-rw-r--r--devel/electron28/files/patch-content_browser_child__process__launcher__helper__linux.cc139
-rw-r--r--devel/electron28/files/patch-content_browser_child__thread__type__switcher__linux.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.cc38
-rw-r--r--devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.h11
-rw-r--r--devel/electron28/files/patch-content_browser_devtools_protocol_system__info__handler.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_download_save__package.cc16
-rw-r--r--devel/electron28/files/patch-content_browser_file__system__access_file__system__access__local__path__watcher.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_font__access_font__enumeration__data__source.cc29
-rw-r--r--devel/electron28/files/patch-content_browser_generic__sensor_frame__sensor__provider__proxy.cc14
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_compositor__util.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.h11
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.h20
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__memory__buffer__manager__singleton.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_gpu_gpu__process__host.cc19
-rw-r--r--devel/electron28/files/patch-content_browser_interest__group_header__direct__from__seller__signals.cc14
-rw-r--r--devel/electron28/files/patch-content_browser_media_frameless__media__interface__proxy.h20
-rw-r--r--devel/electron28/files/patch-content_browser_media_media__keys__listener__manager__impl.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_network__service__instance__impl.cc29
-rw-r--r--devel/electron28/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_delegated__frame__host.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc29
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_media_service__video__capture__device__launcher.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.cc55
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.h11
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__view__host__impl.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc47
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.h11
-rw-r--r--devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_sandbox__host__linux.cc18
-rw-r--r--devel/electron28/files/patch-content_browser_scheduler_responsiveness_jank__monitor__impl.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc20
-rw-r--r--devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h47
-rw-r--r--devel/electron28/files/patch-content_browser_service__worker_service__worker__context__wrapper.cc15
-rw-r--r--devel/electron28/files/patch-content_browser_utility__process__host.cc56
-rw-r--r--devel/electron28/files/patch-content_browser_utility__process__host.h20
-rw-r--r--devel/electron28/files/patch-content_browser_utility__process__host__receiver__bindings.cc33
-rw-r--r--devel/electron28/files/patch-content_browser_utility__sandbox__delegate.cc32
-rw-r--r--devel/electron28/files/patch-content_browser_v8__snapshot__files.cc11
-rw-r--r--devel/electron28/files/patch-content_browser_web__contents_web__contents__view__aura.cc29
-rw-r--r--devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.cc38
-rw-r--r--devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.h20
-rw-r--r--devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.cc81
-rw-r--r--devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.h29
-rw-r--r--devel/electron28/files/patch-content_child_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-content_child_child__process.cc11
-rw-r--r--devel/electron28/files/patch-content_common_BUILD.gn12
-rw-r--r--devel/electron28/files/patch-content_common_features.cc20
-rw-r--r--devel/electron28/files/patch-content_common_features.h20
-rw-r--r--devel/electron28/files/patch-content_common_font__list__unittest.cc11
-rw-r--r--devel/electron28/files/patch-content_common_mojo__core__library__support.cc11
-rw-r--r--devel/electron28/files/patch-content_common_user__agent.cc37
-rw-r--r--devel/electron28/files/patch-content_gpu_BUILD.gn20
-rw-r--r--devel/electron28/files/patch-content_gpu_gpu__child__thread.cc21
-rw-r--r--devel/electron28/files/patch-content_gpu_gpu__main.cc66
-rw-r--r--devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.cc72
-rw-r--r--devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.h19
-rw-r--r--devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc29
-rw-r--r--devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h11
-rw-r--r--devel/electron28/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc23
-rw-r--r--devel/electron28/files/patch-content_public_browser_content__browser__client.cc11
-rw-r--r--devel/electron28/files/patch-content_public_browser_web__ui__browser__interface__broker__registry.h16
-rw-r--r--devel/electron28/files/patch-content_public_browser_zygote__host_zygote__host__linux.h16
-rw-r--r--devel/electron28/files/patch-content_public_common_content__features.cc41
-rw-r--r--devel/electron28/files/patch-content_public_common_content__switches.cc20
-rw-r--r--devel/electron28/files/patch-content_public_common_content__switches.h19
-rw-r--r--devel/electron28/files/patch-content_public_common_zygote_features.gni8
-rw-r--r--devel/electron28/files/patch-content_renderer_render__process__impl.cc20
-rw-r--r--devel/electron28/files/patch-content_renderer_render__thread__impl.cc38
-rw-r--r--devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.cc45
-rw-r--r--devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.h11
-rw-r--r--devel/electron28/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc18
-rw-r--r--devel/electron28/files/patch-content_shell_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-content_shell_app_shell__main__delegate.cc11
-rw-r--r--devel/electron28/files/patch-content_shell_browser_shell__browser__main__parts.cc47
-rw-r--r--devel/electron28/files/patch-content_shell_browser_shell__paths.cc20
-rw-r--r--devel/electron28/files/patch-content_shell_utility_shell__content__utility__client.cc20
-rw-r--r--devel/electron28/files/patch-content_test_BUILD.gn20
-rw-r--r--devel/electron28/files/patch-content_utility_services.cc92
-rw-r--r--devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.cc37
-rw-r--r--devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.h16
-rw-r--r--devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc29
-rw-r--r--devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h11
-rw-r--r--devel/electron28/files/patch-content_utility_utility__main.cc112
-rw-r--r--devel/electron28/files/patch-content_utility_utility__thread__impl.cc21
-rw-r--r--devel/electron28/files/patch-content_zygote_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-content_zygote_zygote__linux.cc15
-rw-r--r--devel/electron28/files/patch-content_zygote_zygote__main__linux.cc58
-rw-r--r--devel/electron28/files/patch-device_bluetooth_bluetooth__adapter.cc11
-rw-r--r--devel/electron28/files/patch-device_bluetooth_cast__bluetooth.gni9
-rw-r--r--devel/electron28/files/patch-device_gamepad_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-device_gamepad_gamepad__provider.cc11
-rw-r--r--devel/electron28/files/patch-device_gamepad_hid__writer__linux.cc11
-rw-r--r--devel/electron28/files/patch-electron_BUILD.gn60
-rw-r--r--devel/electron28/files/patch-electron_build_args_all.gn13
-rw-r--r--devel/electron28/files/patch-electron_build_args_release.gn11
-rw-r--r--devel/electron28/files/patch-electron_default__app_default__app.ts11
-rw-r--r--devel/electron28/files/patch-electron_filenames.gni13
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_api_app.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_api_dialog.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_api_menu-item-roles.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_api_power-monitor.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_init.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_browser_rpc-server.ts11
-rw-r--r--devel/electron28/files/patch-electron_lib_renderer_api_clipboard.ts11
-rw-r--r--devel/electron28/files/patch-electron_script_lib_config.py12
-rw-r--r--devel/electron28/files/patch-electron_script_lib_utils.js11
-rw-r--r--devel/electron28/files/patch-electron_script_spec-runner.js11
-rw-r--r--devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_app_electron__main__delegate.cc57
-rw-r--r--devel/electron28/files/patch-electron_shell_app_node__main.cc38
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__app.cc47
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__base__window.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__crash__reporter.cc72
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc29
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.cc23
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__safe__storage.cc29
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.cc61
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_api_process__metric.h20
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_browser.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_browser.h24
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_browser__linux.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_browser__process__impl.cc20
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_browser__process__impl.h29
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.cc84
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.h20
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts__posix.cc19
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_native__window.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_native__window__views.cc128
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_native__window__views.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_net_system__network__context__manager.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_relauncher__linux.cc32
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.cc38
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.cc38
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_browser_ui_views_submenu__button.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_api_electron__api__clipboard.cc20
-rw-r--r--devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_api_electron__bindings.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_electron__command__line.cc11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_electron__command__line.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_electron__paths.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_gin__converters_std__converter.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_common_node__bindings.cc29
-rw-r--r--devel/electron28/files/patch-electron_shell_common_node__bindings__linux.cc69
-rw-r--r--devel/electron28/files/patch-electron_shell_common_platform__util.h11
-rw-r--r--devel/electron28/files/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc36
-rw-r--r--devel/electron28/files/patch-electron_spec_api-app-spec.ts133
-rw-r--r--devel/electron28/files/patch-electron_spec_api-browser-window-spec.ts155
-rw-r--r--devel/electron28/files/patch-electron_spec_api-clipboard-spec.ts29
-rw-r--r--devel/electron28/files/patch-electron_spec_api-content-tracing-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-crash-reporter-spec.ts56
-rw-r--r--devel/electron28/files/patch-electron_spec_api-desktop-capturer-spec.ts47
-rw-r--r--devel/electron28/files/patch-electron_spec_api-menu-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-native-image-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-net-log-spec.ts29
-rw-r--r--devel/electron28/files/patch-electron_spec_api-notification-dbus-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-power-monitor-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-process-spec.ts20
-rw-r--r--devel/electron28/files/patch-electron_spec_api-protocol-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-safe-storage-spec.ts20
-rw-r--r--devel/electron28/files/patch-electron_spec_api-screen-spec.ts29
-rw-r--r--devel/electron28/files/patch-electron_spec_api-shell-spec.ts23
-rw-r--r--devel/electron28/files/patch-electron_spec_api-subframe-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-tray-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-utility-process-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_api-web-frame-main-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_chromium-spec.ts44
-rw-r--r--devel/electron28/files/patch-electron_spec_crash-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js11
-rw-r--r--devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js11
-rw-r--r--devel/electron28/files/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js11
-rw-r--r--devel/electron28/files/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js11
-rw-r--r--devel/electron28/files/patch-electron_spec_node-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_version-bump-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_visibility-state-spec.ts11
-rw-r--r--devel/electron28/files/patch-electron_spec_webview-spec.ts11
-rw-r--r--devel/electron28/files/patch-extensions_browser_api_api__browser__context__keyed__service__factories.cc11
-rw-r--r--devel/electron28/files/patch-extensions_browser_api_management_management__api.cc11
-rw-r--r--devel/electron28/files/patch-extensions_browser_api_messaging_message__service.cc20
-rw-r--r--devel/electron28/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc20
-rw-r--r--devel/electron28/files/patch-extensions_common_api___permission__features.json29
-rw-r--r--devel/electron28/files/patch-extensions_common_api_runtime.json10
-rw-r--r--devel/electron28/files/patch-extensions_common_command.cc11
-rw-r--r--devel/electron28/files/patch-extensions_common_features_feature.cc11
-rw-r--r--devel/electron28/files/patch-extensions_renderer_bindings_api__binding__util.cc11
-rw-r--r--devel/electron28/files/patch-extensions_renderer_bindings_argument__spec.cc11
-rw-r--r--devel/electron28/files/patch-extensions_shell_app_shell__main__delegate.cc20
-rw-r--r--devel/electron28/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc11
-rw-r--r--devel/electron28/files/patch-extensions_shell_browser_shell__browser__main__parts.cc11
-rw-r--r--devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.cc11
-rw-r--r--devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.h20
-rw-r--r--devel/electron28/files/patch-google__apis_gcm_engine_heartbeat__manager.cc29
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc20
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_dawn__context__provider.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_gles2__cmd__decoder.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_angle__vulkan__image__backing__factory.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing.cc20
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing__factory.cc20
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_ozone__image__gl__textures__holder.h10
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__factory.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__manager.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_shared__image_wrapped__sk__image__backing.cc11
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_service_webgpu__decoder__impl.cc20
-rw-r--r--devel/electron28/files/patch-gpu_command__buffer_tests_gl__gpu__memory__buffer__unittest.cc20
-rw-r--r--devel/electron28/files/patch-gpu_config_gpu__control__list.cc20
-rw-r--r--devel/electron28/files/patch-gpu_config_gpu__finch__features.cc21
-rw-r--r--devel/electron28/files/patch-gpu_config_gpu__test__config.cc11
-rw-r--r--devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc20
-rw-r--r--devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h11
-rw-r--r--devel/electron28/files/patch-gpu_ipc_service_gpu__init.cc74
-rw-r--r--devel/electron28/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc20
-rw-r--r--devel/electron28/files/patch-gpu_ipc_service_x__util.h16
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_generate__bindings.py11
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_semaphore__handle.cc20
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.cc20
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.h11
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.cc20
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.h27
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__image.h20
-rw-r--r--devel/electron28/files/patch-gpu_vulkan_vulkan__util.cc11
-rw-r--r--devel/electron28/files/patch-headless_lib_browser_headless__browser__main__parts__posix.cc39
-rw-r--r--devel/electron28/files/patch-headless_lib_browser_headless__content__browser__client.h11
-rw-r--r--devel/electron28/files/patch-headless_lib_browser_headless__request__context__manager.cc11
-rw-r--r--devel/electron28/files/patch-headless_lib_browser_headless__web__contents__impl.cc11
-rw-r--r--devel/electron28/files/patch-headless_lib_headless__content__main__delegate.cc11
-rw-r--r--devel/electron28/files/patch-ipc_ipc__channel.h11
-rw-r--r--devel/electron28/files/patch-ipc_ipc__channel__common.cc11
-rw-r--r--devel/electron28/files/patch-ipc_ipc__channel__mojo.cc11
-rw-r--r--devel/electron28/files/patch-ipc_ipc__message__utils.cc11
-rw-r--r--devel/electron28/files/patch-ipc_ipc__message__utils.h11
-rw-r--r--devel/electron28/files/patch-media_BUILD.gn12
-rw-r--r--devel/electron28/files/patch-media_audio_BUILD.gn24
-rw-r--r--devel/electron28/files/patch-media_audio_alsa_audio__manager__alsa.cc54
-rw-r--r--devel/electron28/files/patch-media_audio_audio__input__device.cc11
-rw-r--r--devel/electron28/files/patch-media_audio_audio__output__proxy__unittest.cc14
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.cc184
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.h69
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_sndio__input.cc203
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_sndio__input.h94
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_sndio__output.cc190
-rw-r--r--devel/electron28/files/patch-media_audio_sndio_sndio__output.h91
-rw-r--r--devel/electron28/files/patch-media_base_audio__latency.cc11
-rw-r--r--devel/electron28/files/patch-media_base_cdm__promise__adapter.cc16
-rw-r--r--devel/electron28/files/patch-media_base_media__switches.cc65
-rw-r--r--devel/electron28/files/patch-media_base_media__switches.h29
-rw-r--r--devel/electron28/files/patch-media_base_scopedfd__helper.h11
-rw-r--r--devel/electron28/files/patch-media_base_user__input__monitor__unittest.cc29
-rw-r--r--devel/electron28/files/patch-media_base_video__frame.cc74
-rw-r--r--devel/electron28/files/patch-media_base_video__frame.h47
-rw-r--r--devel/electron28/files/patch-media_capture_video_create__video__capture__device__factory.cc20
-rw-r--r--devel/electron28/files/patch-media_capture_video_fake__video__capture__device__factory.cc11
-rw-r--r--devel/electron28/files/patch-media_capture_video_file__video__capture__device__factory.cc11
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.cc11
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.h25
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc156
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.h51
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device.h11
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.cc11
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.h11
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.cc45
-rw-r--r--devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.h11
-rw-r--r--devel/electron28/files/patch-media_capture_video_video__capture__buffer__tracker__factory__impl.cc20
-rw-r--r--devel/electron28/files/patch-media_capture_video_video__capture__device__client.cc11
-rw-r--r--devel/electron28/files/patch-media_cdm_cdm__paths__unittest.cc11
-rw-r--r--devel/electron28/files/patch-media_cdm_library__cdm_cdm__paths.gni11
-rw-r--r--devel/electron28/files/patch-media_gpu_buffer__validation.cc29
-rw-r--r--devel/electron28/files/patch-media_gpu_chromeos_mailbox__video__frame__converter.cc11
-rw-r--r--devel/electron28/files/patch-media_gpu_chromeos_video__decoder__pipeline.cc28
-rw-r--r--devel/electron28/files/patch-media_gpu_gpu__video__encode__accelerator__factory.cc11
-rw-r--r--devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.cc44
-rw-r--r--devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.h16
-rw-r--r--devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.cc26
-rw-r--r--devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.h23
-rw-r--r--devel/electron28/files/patch-media_gpu_vaapi_vaapi__video__decoder.cc11
-rw-r--r--devel/electron28/files/patch-media_gpu_vaapi_vaapi__wrapper.cc47
-rw-r--r--devel/electron28/files/patch-media_media__options.gni30
-rw-r--r--devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.cc20
-rw-r--r--devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.h11
-rw-r--r--devel/electron28/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc11
-rw-r--r--devel/electron28/files/patch-media_video_fake__gpu__memory__buffer.cc38
-rw-r--r--devel/electron28/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc29
-rw-r--r--devel/electron28/files/patch-media_video_video__encode__accelerator__adapter.cc20
-rw-r--r--devel/electron28/files/patch-media_video_video__encode__accelerator__adapter__test.cc11
-rw-r--r--devel/electron28/files/patch-media_webrtc_audio__processor.cc11
-rw-r--r--devel/electron28/files/patch-media_webrtc_helpers.cc11
-rw-r--r--devel/electron28/files/patch-media_webrtc_helpers__unittests.cc29
-rw-r--r--devel/electron28/files/patch-mojo_core_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-mojo_core_channel.cc14
-rw-r--r--devel/electron28/files/patch-mojo_core_embedder_features.h11
-rw-r--r--devel/electron28/files/patch-mojo_public_c_system_thunks.cc38
-rw-r--r--devel/electron28/files/patch-mojo_public_tools_bindings_mojom.gni19
-rw-r--r--devel/electron28/files/patch-net_BUILD.gn78
-rw-r--r--devel/electron28/files/patch-net_base_features.cc15
-rw-r--r--devel/electron28/files/patch-net_base_mock__network__change__notifier.cc11
-rw-r--r--devel/electron28/files/patch-net_base_mock__network__change__notifier.h20
-rw-r--r--devel/electron28/files/patch-net_base_network__change__notifier.cc21
-rw-r--r--devel/electron28/files/patch-net_base_network__change__notifier__passive.cc11
-rw-r--r--devel/electron28/files/patch-net_base_network__interfaces__posix.h11
-rw-r--r--devel/electron28/files/patch-net_base_sockaddr__util__posix.cc12
-rw-r--r--devel/electron28/files/patch-net_base_sockaddr__util__posix__unittest.cc12
-rw-r--r--devel/electron28/files/patch-net_cert_cert__verify__proc.h11
-rw-r--r--devel/electron28/files/patch-net_cert_pki_general__names.h10
-rw-r--r--devel/electron28/files/patch-net_disk__cache_simple_simple__file__tracker.cc20
-rw-r--r--devel/electron28/files/patch-net_dns_BUILD.gn31
-rw-r--r--devel/electron28/files/patch-net_dns_address__info.cc16
-rw-r--r--devel/electron28/files/patch-net_dns_address__sorter__posix.cc10
-rw-r--r--devel/electron28/files/patch-net_dns_dns__config__service__posix.cc27
-rw-r--r--devel/electron28/files/patch-net_dns_dns__reloader.cc10
-rw-r--r--devel/electron28/files/patch-net_dns_dns__util.cc11
-rw-r--r--devel/electron28/files/patch-net_dns_host__resolver__proc.cc13
-rw-r--r--devel/electron28/files/patch-net_dns_public_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-net_dns_public_resolv__reader.h10
-rw-r--r--devel/electron28/files/patch-net_dns_public_scoped__res__state.h10
-rw-r--r--devel/electron28/files/patch-net_filter_zstd__source__stream.cc10
-rw-r--r--devel/electron28/files/patch-net_http_http__auth__gssapi__posix.cc14
-rw-r--r--devel/electron28/files/patch-net_http_http__auth__gssapi__posix.h12
-rw-r--r--devel/electron28/files/patch-net_http_http__auth__handler__negotiate.cc11
-rw-r--r--devel/electron28/files/patch-net_http_http__auth__preferences.cc11
-rw-r--r--devel/electron28/files/patch-net_http_http__auth__preferences.h29
-rw-r--r--devel/electron28/files/patch-net_http_http__network__session.cc12
-rw-r--r--devel/electron28/files/patch-net_proxy__resolution_proxy__config__service.cc35
-rw-r--r--devel/electron28/files/patch-net_proxy__resolution_proxy__config__service__linux.cc40
-rw-r--r--devel/electron28/files/patch-net_socket_socket__posix.cc11
-rw-r--r--devel/electron28/files/patch-net_socket_socks5__client__socket.cc12
-rw-r--r--devel/electron28/files/patch-net_socket_tcp__socket__posix.cc20
-rw-r--r--devel/electron28/files/patch-net_socket_udp__socket__posix.cc39
-rw-r--r--devel/electron28/files/patch-net_socket_udp__socket__unittest.cc47
-rw-r--r--devel/electron28/files/patch-net_third__party_quiche_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__comparision__tool.cc29
-rw-r--r--devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc29
-rw-r--r--devel/electron28/files/patch-net_tools_net__watcher_net__watcher.cc29
-rw-r--r--devel/electron28/files/patch-net_traffic__annotation_network__traffic__annotation.h20
-rw-r--r--devel/electron28/files/patch-net_url__request_url__request__context.cc11
-rw-r--r--devel/electron28/files/patch-net_url__request_url__request__context.h11
-rw-r--r--devel/electron28/files/patch-net_url__request_url__request__context__builder.cc11
-rw-r--r--devel/electron28/files/patch-pdf_pdfium_pdfium__engine.cc20
-rw-r--r--devel/electron28/files/patch-printing_backend_cups__ipp__helper.cc11
-rw-r--r--devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.cc29
-rw-r--r--devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.h11
-rw-r--r--devel/electron28/files/patch-printing_print__settings.cc38
-rw-r--r--devel/electron28/files/patch-printing_print__settings.h47
-rw-r--r--devel/electron28/files/patch-printing_print__settings__conversion.cc11
-rw-r--r--devel/electron28/files/patch-printing_printing__context__linux.cc38
-rw-r--r--devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.cc50
-rw-r--r--devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.h16
-rw-r--r--devel/electron28/files/patch-remoting_base_chromoting__event.cc11
-rw-r--r--devel/electron28/files/patch-remoting_base_host__settings.cc20
-rw-r--r--devel/electron28/files/patch-remoting_client_display_sys__opengl.h11
-rw-r--r--devel/electron28/files/patch-remoting_codec_webrtc__video__encoder__vpx.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_base_desktop__environment__options.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_base_switches.cc18
-rw-r--r--devel/electron28/files/patch-remoting_host_base_switches.h18
-rw-r--r--devel/electron28/files/patch-remoting_host_basic__desktop__environment.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_chromoting__host.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_chromoting__host.h29
-rw-r--r--devel/electron28/files/patch-remoting_host_chromoting__host__context.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_chromoting__host__services__client.cc20
-rw-r--r--devel/electron28/files/patch-remoting_host_client__session.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_desktop__and__cursor__conditional__composer.cc20
-rw-r--r--devel/electron28/files/patch-remoting_host_desktop__capturer__proxy.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_desktop__capturer__wrapper.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_evaluate__capability.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_host__attributes.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_host__details.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_host__main.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_ipc__constants.cc20
-rw-r--r--devel/electron28/files/patch-remoting_host_it2me_it2me__host.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc47
-rw-r--r--devel/electron28/files/patch-remoting_host_me2me__desktop__environment.cc38
-rw-r--r--devel/electron28/files/patch-remoting_host_mouse__cursor__monitor__proxy.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_policy__watcher.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__client.cc20
-rw-r--r--devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__util.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_remote__open__url_url__forwarder__configurator.cc11
-rw-r--r--devel/electron28/files/patch-remoting_host_remoting__me2me__host.cc169
-rw-r--r--devel/electron28/files/patch-remoting_host_setup_start__host__main.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__caller__security__utils.cc29
-rw-r--r--devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__extension__notifier.cc28
-rw-r--r--devel/electron28/files/patch-remoting_protocol_webrtc__video__stream.cc11
-rw-r--r--devel/electron28/files/patch-remoting_resources_remoting__strings.grd20
-rw-r--r--devel/electron28/files/patch-sandbox_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-sandbox_features.gni11
-rw-r--r--devel/electron28/files/patch-sandbox_linux_BUILD.gn35
-rw-r--r--devel/electron28/files/patch-sandbox_linux_services_init__process__reaper.cc15
-rw-r--r--devel/electron28/files/patch-sandbox_linux_services_libc__interceptor.cc21
-rw-r--r--devel/electron28/files/patch-sandbox_policy_BUILD.gn39
-rw-r--r--devel/electron28/files/patch-sandbox_policy_features.cc23
-rw-r--r--devel/electron28/files/patch-sandbox_policy_features.h11
-rw-r--r--devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.cc248
-rw-r--r--devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.h281
-rw-r--r--devel/electron28/files/patch-sandbox_policy_mojom_sandbox.mojom15
-rw-r--r--devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.cc423
-rw-r--r--devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.h285
-rw-r--r--devel/electron28/files/patch-sandbox_policy_sandbox.cc22
-rw-r--r--devel/electron28/files/patch-sandbox_policy_sandbox.h24
-rw-r--r--devel/electron28/files/patch-sandbox_policy_sandbox__type.cc115
-rw-r--r--devel/electron28/files/patch-sandbox_policy_switches.cc26
-rw-r--r--devel/electron28/files/patch-sandbox_policy_switches.h25
-rw-r--r--devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.cc31
-rw-r--r--devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.h16
-rw-r--r--devel/electron28/files/patch-services_device_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_device_compute__pressure_cpu__probe.cc10
-rw-r--r--devel/electron28/files/patch-services_device_geolocation_location__arbitrator.cc11
-rw-r--r--devel/electron28/files/patch-services_device_hid_BUILD.gn30
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__connection__fido.cc219
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__connection__fido.h63
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.cc243
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.h70
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__service.cc24
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__service__fido.cc399
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__service__fido.h68
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__service__freebsd.cc398
-rw-r--r--devel/electron28/files/patch-services_device_hid_hid__service__freebsd.h52
-rw-r--r--devel/electron28/files/patch-services_device_public_cpp_generic__sensor_sensor__reading.h11
-rw-r--r--devel/electron28/files/patch-services_device_public_mojom_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_device_serial_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_device_serial_serial__device__enumerator.cc20
-rw-r--r--devel/electron28/files/patch-services_device_serial_serial__io__handler__posix.cc11
-rw-r--r--devel/electron28/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc14
-rw-r--r--devel/electron28/files/patch-services_device_usb_BUILD.gn52
-rw-r--r--devel/electron28/files/patch-services_device_usb_usb__service.cc39
-rw-r--r--devel/electron28/files/patch-services_device_usb_usb__service__fake.cc52
-rw-r--r--devel/electron28/files/patch-services_device_usb_usb__service__fake.h51
-rw-r--r--devel/electron28/files/patch-services_network_BUILD.gn10
-rw-r--r--devel/electron28/files/patch-services_network_network__context.cc20
-rw-r--r--devel/electron28/files/patch-services_network_network__context.h11
-rw-r--r--devel/electron28/files/patch-services_network_network__sandbox__hook__linux.cc37
-rw-r--r--devel/electron28/files/patch-services_network_network__sandbox__hook__linux.h14
-rw-r--r--devel/electron28/files/patch-services_network_network__service.cc29
-rw-r--r--devel/electron28/files/patch-services_network_network__service.h29
-rw-r--r--devel/electron28/files/patch-services_network_public_cpp_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_network_public_cpp_features.cc11
-rw-r--r--devel/electron28/files/patch-services_network_public_mojom_BUILD.gn25
-rw-r--r--devel/electron28/files/patch-services_network_shared__dictionary_shared__dictionary__writer__in__memory.h11
-rw-r--r--devel/electron28/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc65
-rw-r--r--devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h20
-rw-r--r--devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc61
-rw-r--r--devel/electron28/files/patch-services_service__manager_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc11
-rw-r--r--devel/electron28/files/patch-services_video__capture_public_mojom_video__capture__service.mojom15
-rw-r--r--devel/electron28/files/patch-services_video__capture_video__capture__service__impl.cc38
-rw-r--r--devel/electron28/files/patch-services_video__capture_video__capture__service__impl.h29
-rw-r--r--devel/electron28/files/patch-skia_ext_SkMemory__new__handler.cpp11
-rw-r--r--devel/electron28/files/patch-skia_ext_skcolorspace__trfn.cc11
-rw-r--r--devel/electron28/files/patch-third__party_abseil-cpp_absl_base_config.h21
-rw-r--r--devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_raw__logging.cc16
-rw-r--r--devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_sysinfo.cc65
-rw-r--r--devel/electron28/files/patch-third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.h11
-rw-r--r--devel/electron28/files/patch-third__party_angle_BUILD.gn29
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_common_platform.h19
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_common_platform__helpers.h11
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h16
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp90
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp35
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp60
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_libANGLE_Display.cpp47
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_libANGLE_formatutils.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_gl_glx_FunctionsGLX.cpp15
-rw-r--r--devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h11
-rw-r--r--devel/electron28/files/patch-third__party_angle_util_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_blink_common_renderer__preferences_renderer__preferences__mojom__traits.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences.h11
-rw-r--r--devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences__mojom__traits.h11
-rw-r--r--devel/electron28/files/patch-third__party_blink_public_platform_platform.h11
-rw-r--r--devel/electron28/files/patch-third__party_blink_public_platform_web__vector.h11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_bindings_scripts_bind__gen_style__format.py11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_build_scripts_run__with__pythonpath.py10
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_controller_blink__initializer.cc35
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.cc21
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h47
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_execution__context_navigator__base.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_exported_web__view__impl.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_frame_web__frame__test.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_html_parser_html__document__parser__fastpath.cc14
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_layout_layout__view.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_layout_ng_physical__fragment__rare__data.h10
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_paint_object__paint__properties__sparse.h13
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_canvas_canvas2d_canvas__style.cc33
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__device__factory.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__renderer__mixer__manager__test.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_features.gni11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_ml__graph__xnnpack.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_peerconnection_webrtc__audio__renderer__test.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_webaudio_audio__worklet__thread__test.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_webgl_webgl__rendering__context__base.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_modules_webgpu_gpu__queue.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h47
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc29
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__palette.h26
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__platform__data.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_palette__interpolation.cc15
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc20
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_begin__frame__provider.cc15
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_video__frame__submitter.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_instrumentation_partition__alloc__memory__dump__provider.cc18
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_peerconnection_rtc__video__encoder__factory.cc17
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_runtime__enabled__features.json544
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_scheduler_common_thread.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_text_text__break__iterator.cc13
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_video__capture_video__capture__impl.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_widget_compositing_blink__categorized__worker__pool__delegate.cc11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h11
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_math__extras.h23
-rw-r--r--devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc37
-rw-r--r--devel/electron28/files/patch-third__party_boringssl_src_util_generate__build__files.py34
-rw-r--r--devel/electron28/files/patch-third__party_brotli_common_platform.h11
-rw-r--r--devel/electron28/files/patch-third__party_cpuinfo_cpuinfo.gni11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_client_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc43
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_minidump_minidump__misc__info__writer.cc13
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h20
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h22
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc11
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc33
-rw-r--r--devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc20
-rw-r--r--devel/electron28/files/patch-third__party_crc32c_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_dawn_include_dawn_native_VulkanBackend.h11
-rw-r--r--devel/electron28/files/patch-third__party_dawn_src_dawn_common_Platform.h14
-rw-r--r--devel/electron28/files/patch-third__party_dawn_src_dawn_native_vulkan_BackendVk.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_distributed__point__functions_BUILD.gn12
-rw-r--r--devel/electron28/files/patch-third__party_electron__node_deps_uv_BUILD.gn46
-rw-r--r--devel/electron28/files/patch-third__party_electron__node_deps_uv_src_unix_pipe.c18
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_BUILD.gn10
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_build__ffmpeg.py121
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_robo__lib_config.py53
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_configure10
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_libavcodec_x86_cabac.h12
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_libavutil_cpu.c14
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_libavutil_mem.c12
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_libavutil_random__seed.c14
-rw-r--r--devel/electron28/files/patch-third__party_ffmpeg_libavutil_x86_x86inc.asm23
-rw-r--r--devel/electron28/files/patch-third__party_fontconfig_include_config.h89
-rw-r--r--devel/electron28/files/patch-third__party_fontconfig_src_src_fccompat.c13
-rw-r--r--devel/electron28/files/patch-third__party_ipcz_src_reference__drivers_random.cc20
-rw-r--r--devel/electron28/files/patch-third__party_ipcz_src_standalone_base_logging.cc12
-rw-r--r--devel/electron28/files/patch-third__party_leveldatabase_env__chromium.cc12
-rw-r--r--devel/electron28/files/patch-third__party_libaom_source_libaom_aom__ports_aarch64__cpudetect.c39
-rw-r--r--devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h11
-rw-r--r--devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h11
-rw-r--r--devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h20
-rw-r--r--devel/electron28/files/patch-third__party_libsync_src_include_sync_sync.h12
-rw-r--r--devel/electron28/files/patch-third__party_libsync_src_sync.c25
-rw-r--r--devel/electron28/files/patch-third__party_libusb_BUILD.gn52
-rw-r--r--devel/electron28/files/patch-third__party_libusb_src_libusb_core.c11
-rw-r--r--devel/electron28/files/patch-third__party_libusb_src_libusb_os_threads__posix.c24
-rw-r--r--devel/electron28/files/patch-third__party_libvpx_source_libvpx_vpx__ports_aarch64__cpudetect.c27
-rw-r--r--devel/electron28/files/patch-third__party_lzma__sdk_C_CpuArch.c44
-rw-r--r--devel/electron28/files/patch-third__party_maldoca_BUILD.gn13
-rw-r--r--devel/electron28/files/patch-third__party_maldoca_src_maldoca_base_get__runfiles__dir.cc32
-rw-r--r--devel/electron28/files/patch-third__party_maldoca_src_maldoca_service_common_process__doc__wrapper.cc29
-rw-r--r--devel/electron28/files/patch-third__party_material__color__utilities_src_cpp_palettes_tones.cc11
-rw-r--r--devel/electron28/files/patch-third__party_nasm_BUILD.gn16
-rw-r--r--devel/electron28/files/patch-third__party_nasm_config_config-linux.h102
-rw-r--r--devel/electron28/files/patch-third__party_node_node.gni11
-rw-r--r--devel/electron28/files/patch-third__party_node_node.py11
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_core_fxge_cfx__fontmapper.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_core_fxge_linux_fx__linux__impl.cpp23
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp22
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_pdfium.gni11
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_third__party_base_compiler__specific.h11
-rw-r--r--devel/electron28/files/patch-third__party_pdfium_xfa_fxfa_parser_cxfa__timezoneprovider.cpp41
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_build__config.h66
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h22
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_time.h34
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h11
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_thread__utils.h15
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_include_perfetto_tracing_internal_track__event__legacy.h11
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_protos_perfetto_trace_ftrace_v4l2.proto56
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_event__fd.cc22
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_periodic__task.cc20
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_string__utils.cc15
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_subprocess__posix.cc22
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_test_vm__test__utils.cc11
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_thread__task__runner.cc14
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_base_unix__socket.cc26
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_trace__processor_db_storage_numeric__storage.cc16
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc12
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_tracing_ipc_memfd.cc12
-rw-r--r--devel/electron28/files/patch-third__party_perfetto_src_tracing_track.cc11
-rw-r--r--devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_arenastring.cc12
-rw-r--r--devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h11
-rw-r--r--devel/electron28/files/patch-third__party_skia_src_base_SkContainers.cpp20
-rw-r--r--devel/electron28/files/patch-third__party_skia_src_ports_SkOSFile__posix.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_speech-dispatcher_libspeechd__version.h32
-rw-r--r--devel/electron28/files/patch-third__party_speech-dispatcher_speechd__types.h142
-rw-r--r--devel/electron28/files/patch-third__party_sqlite_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_sqlite_src_amalgamation_sqlite3.c23
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_src_Reactor_Debug.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_src_System_Configurator.cpp12
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_src_System_Linux_MemFd.cpp37
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_src_Vulkan_VkSemaphoreExternalLinux.hpp20
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_src_WSI_libXCB.cpp20
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-10.0_configs_linux_include_llvm_Config_config.h174
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h47
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_test__fonts_fontconfig_BUILD.gn15
-rw-r--r--devel/electron28/files/patch-third__party_test__fonts_fontconfig_fontconfig__util__linux.cc27
-rw-r--r--devel/electron28/files/patch-third__party_test__fonts_fontconfig_generate__fontconfig__caches.cc11
-rw-r--r--devel/electron28/files/patch-third__party_tflite_features.gni14
-rw-r--r--devel/electron28/files/patch-third__party_unrar_src_crypt.cpp11
-rw-r--r--devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_loader_vk__loader__platform.h19
-rw-r--r--devel/electron28/files/patch-third__party_vulkan-deps_vulkan-validation-layers_src_layers_external_vma_vk__mem__alloc.h11
-rw-r--r--devel/electron28/files/patch-third__party_vulkan__memory__allocator_include_vk__mem__alloc.h11
-rw-r--r--devel/electron28/files/patch-third__party_wayland_BUILD.gn14
-rw-r--r--devel/electron28/files/patch-third__party_wayland_include_config.h18
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_BUILD.gn12
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_wayland_egl__dmabuf.cc18
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_x11_x__server__pixel__buffer.cc15
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_byte__order.h11
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_ip__address.cc12
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_net__test__helpers.cc10
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_network.cc15
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc65
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h11
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc37
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h23
-rw-r--r--devel/electron28/files/patch-third__party_webrtc_system__wrappers_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-third__party_widevine_cdm_widevine.gni11
-rw-r--r--devel/electron28/files/patch-third__party_zlib_BUILD.gn31
-rw-r--r--devel/electron28/files/patch-third__party_zlib_cpu__features.c51
-rw-r--r--devel/electron28/files/patch-tools_generate__shim__headers_generate__shim__headers.py21
-rw-r--r--devel/electron28/files/patch-tools_generate__stubs_rules.gni10
-rw-r--r--devel/electron28/files/patch-tools_gn_build_build__linux.ninja.template11
-rw-r--r--devel/electron28/files/patch-tools_gn_build_gen.py34
-rw-r--r--devel/electron28/files/patch-tools_gn_src_base_files_file__posix.cc11
-rw-r--r--devel/electron28/files/patch-tools_gn_src_gn_version.h15
-rw-r--r--devel/electron28/files/patch-tools_gn_src_util_exe__path.cc90
-rw-r--r--devel/electron28/files/patch-tools_json__schema__compiler_cpp__bundle__generator.py11
-rw-r--r--devel/electron28/files/patch-tools_json__schema__compiler_feature__compiler.py11
-rw-r--r--devel/electron28/files/patch-tools_memory_partition__allocator_inspect__utils.h11
-rw-r--r--devel/electron28/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn20
-rw-r--r--devel/electron28/files/patch-tools_protoc__wrapper_protoc__wrapper.py24
-rw-r--r--devel/electron28/files/patch-tools_variations_fieldtrial__to__struct.py11
-rw-r--r--devel/electron28/files/patch-ui_aura_client_drag__drop__client.h11
-rw-r--r--devel/electron28/files/patch-ui_aura_screen__ozone.cc11
-rw-r--r--devel/electron28/files/patch-ui_aura_screen__ozone.h20
-rw-r--r--devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.h11
-rw-r--r--devel/electron28/files/patch-ui_base_clipboard_clipboard__non__backed.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_cursor_cursor__factory.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_cursor_cursor__factory.h11
-rw-r--r--devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__non__backed.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.h11
-rw-r--r--devel/electron28/files/patch-ui_base_ime_fake__text__input__client.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_ime_fake__text__input__client.h11
-rw-r--r--devel/electron28/files/patch-ui_base_ime_linux_linux__input__method__context__factory.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_ime_text__input__client.h11
-rw-r--r--devel/electron28/files/patch-ui_base_resource_resource__bundle.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_test_skia__gold__pixel__diff.cc11
-rw-r--r--devel/electron28/files/patch-ui_base_test_ui__controls.h11
-rw-r--r--devel/electron28/files/patch-ui_base_ui__base__features.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_ui__base__switches.cc18
-rw-r--r--devel/electron28/files/patch-ui_base_ui__base__switches.h16
-rw-r--r--devel/electron28/files/patch-ui_base_ui__base__types.h11
-rw-r--r--devel/electron28/files/patch-ui_base_webui_web__ui__util.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_x_x11__cursor__factory.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_x_x11__cursor__factory.h20
-rw-r--r--devel/electron28/files/patch-ui_base_x_x11__cursor__loader.cc41
-rw-r--r--devel/electron28/files/patch-ui_base_x_x11__display__manager.cc20
-rw-r--r--devel/electron28/files/patch-ui_base_x_x11__shm__image__pool.cc53
-rw-r--r--devel/electron28/files/patch-ui_color_color__id.h11
-rw-r--r--devel/electron28/files/patch-ui_color_color__provider__utils.cc11
-rw-r--r--devel/electron28/files/patch-ui_color_system__theme.h11
-rw-r--r--devel/electron28/files/patch-ui_display_screen.cc11
-rw-r--r--devel/electron28/files/patch-ui_display_screen.h20
-rw-r--r--devel/electron28/files/patch-ui_events_devices_x11_device__data__manager__x11.cc10
-rw-r--r--devel/electron28/files/patch-ui_events_event.cc29
-rw-r--r--devel/electron28/files/patch-ui_events_event__switches.cc11
-rw-r--r--devel/electron28/files/patch-ui_events_event__switches.h11
-rw-r--r--devel/electron28/files/patch-ui_events_gesture__detection_motion__event__generic.h10
-rw-r--r--devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.cc38
-rw-r--r--devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.h11
-rw-r--r--devel/electron28/files/patch-ui_gfx_BUILD.gn11
-rw-r--r--devel/electron28/files/patch-ui_gfx_canvas__skia.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_codec_png__codec.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_font__fallback__linux.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_font__render__params.h20
-rw-r--r--devel/electron28/files/patch-ui_gfx_font__render__params__linux.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_font__util.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.h20
-rw-r--r--devel/electron28/files/patch-ui_gfx_linux_dmabuf__uapi.h36
-rw-r--r--devel/electron28/files/patch-ui_gfx_linux_gbm__wrapper.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.cc34
-rw-r--r--devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.h36
-rw-r--r--devel/electron28/files/patch-ui_gfx_native__pixmap__handle.cc62
-rw-r--r--devel/electron28/files/patch-ui_gfx_native__pixmap__handle.h38
-rw-r--r--devel/electron28/files/patch-ui_gfx_native__widget__types.h20
-rw-r--r--devel/electron28/files/patch-ui_gfx_platform__font__skia.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_render__text__api__fuzzer.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_render__text__fuzzer.cc20
-rw-r--r--devel/electron28/files/patch-ui_gfx_switches.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_switches.h11
-rw-r--r--devel/electron28/files/patch-ui_gfx_x_generated__protos_dri3.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_x_generated__protos_shm.cc11
-rw-r--r--devel/electron28/files/patch-ui_gfx_x_xlib__support.cc21
-rw-r--r--devel/electron28/files/patch-ui_gl_BUILD.gn35
-rw-r--r--devel/electron28/files/patch-ui_gl_gl__bindings.h11
-rw-r--r--devel/electron28/files/patch-ui_gl_gl__context.cc11
-rw-r--r--devel/electron28/files/patch-ui_gl_gl__fence.cc11
-rw-r--r--devel/electron28/files/patch-ui_gl_gl__implementation.cc11
-rw-r--r--devel/electron28/files/patch-ui_gl_gl__switches.cc20
-rw-r--r--devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.cc38
-rw-r--r--devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.h20
-rw-r--r--devel/electron28/files/patch-ui_gtk_gtk__compat.cc53
-rw-r--r--devel/electron28/files/patch-ui_gtk_gtk__ui.cc22
-rw-r--r--devel/electron28/files/patch-ui_gtk_printing_print__dialog__gtk.cc11
-rw-r--r--devel/electron28/files/patch-ui_message__center_views_message__popup__view.cc11
-rw-r--r--devel/electron28/files/patch-ui_native__theme_native__theme.h11
-rw-r--r--devel/electron28/files/patch-ui_native__theme_native__theme__base.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_common_egl__util.cc14
-rw-r--r--devel/electron28/files/patch-ui_ozone_common_features.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_headless_headless__surface__factory.cc20
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_headless_ozone__platform__headless.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_headless_vulkan__implementation__headless.cc29
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.h11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_gpu_vulkan__implementation__wayland.cc14
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.h11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.cc44
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.h38
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_host_xdg__toplevel__wrapper__impl.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_wayland_ozone__platform__wayland.cc45
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_x11_ozone__platform__x11.cc11
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_x11_vulkan__implementation__x11.cc14
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.cc20
-rw-r--r--devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.h11
-rw-r--r--devel/electron28/files/patch-ui_ozone_public_ozone__platform.h11
-rw-r--r--devel/electron28/files/patch-ui_ozone_public_platform__screen.h11
-rw-r--r--devel/electron28/files/patch-ui_ozone_test_mock__platform__window__delegate.h11
-rw-r--r--devel/electron28/files/patch-ui_platform__window_platform__window__delegate.cc11
-rw-r--r--devel/electron28/files/patch-ui_platform__window_platform__window__delegate.h11
-rw-r--r--devel/electron28/files/patch-ui_platform__window_platform__window__init__properties.h20
-rw-r--r--devel/electron28/files/patch-ui_strings_app__locale__settings.grd11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__bn.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ja.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ko.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ml.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__th.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-CN.xtb11
-rw-r--r--devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-TW.xtb11
-rw-r--r--devel/electron28/files/patch-ui_views_controls_prefix__selector.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_controls_prefix__selector.h11
-rw-r--r--devel/electron28/files/patch-ui_views_controls_textfield_textfield.cc64
-rw-r--r--devel/electron28/files/patch-ui_views_controls_textfield_textfield.h20
-rw-r--r--devel/electron28/files/patch-ui_views_corewm_tooltip__aura.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_examples_widget__example.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_focus_focus__manager.cc20
-rw-r--r--devel/electron28/files/patch-ui_views_style_platform__style.cc29
-rw-r--r--devel/electron28/files/patch-ui_views_test_ui__controls__factory__desktop__aura__ozone.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_views__delegate.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_views__delegate.h11
-rw-r--r--devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.h20
-rw-r--r--devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc38
-rw-r--r--devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform__impl__interactive__uitest.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_widget_widget.cc20
-rw-r--r--devel/electron28/files/patch-ui_views_widget_widget.h11
-rw-r--r--devel/electron28/files/patch-ui_views_window_custom__frame__view.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_window_dialog__delegate.cc11
-rw-r--r--devel/electron28/files/patch-ui_views_window_frame__background.cc11
-rw-r--r--devel/electron28/files/patch-v8_BUILD.gn58
-rw-r--r--devel/electron28/files/patch-v8_include_v8-internal.h11
-rw-r--r--devel/electron28/files/patch-v8_include_v8config.h37
-rw-r--r--devel/electron28/files/patch-v8_src_api_api.cc20
-rw-r--r--devel/electron28/files/patch-v8_src_base_atomicops.h24
-rw-r--r--devel/electron28/files/patch-v8_src_base_platform_memory.h16
-rw-r--r--devel/electron28/files/patch-v8_src_base_platform_platform-freebsd.cc32
-rw-r--r--devel/electron28/files/patch-v8_src_base_platform_platform-openbsd.cc28
-rw-r--r--devel/electron28/files/patch-v8_src_base_platform_platform-posix.cc62
-rw-r--r--devel/electron28/files/patch-v8_src_base_small-vector.h11
-rw-r--r--devel/electron28/files/patch-v8_src_base_sys-info.cc11
-rw-r--r--devel/electron28/files/patch-v8_src_baseline_x64_baseline-assembler-x64-inl.h13
-rw-r--r--devel/electron28/files/patch-v8_src_builtins_x64_builtins-x64.cc46
-rw-r--r--devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.cc42
-rw-r--r--devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.h21
-rw-r--r--devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.cc20
-rw-r--r--devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.h20
-rw-r--r--devel/electron28/files/patch-v8_src_compiler_backend_x64_code-generator-x64.cc16
-rw-r--r--devel/electron28/files/patch-v8_src_deoptimizer_x64_deoptimizer-x64.cc11
-rw-r--r--devel/electron28/files/patch-v8_src_diagnostics_perf-jit.cc11
-rw-r--r--devel/electron28/files/patch-v8_src_diagnostics_perf-jit.h11
-rw-r--r--devel/electron28/files/patch-v8_src_execution_isolate.cc25
-rw-r--r--devel/electron28/files/patch-v8_src_flags_flags.cc36
-rw-r--r--devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64-inl.h14
-rw-r--r--devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64.cc16
-rw-r--r--devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.cc22
-rw-r--r--devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.h12
-rw-r--r--devel/electron28/files/patch-v8_src_sandbox_sandbox.cc11
-rw-r--r--devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.cc11
-rw-r--r--devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.h10
-rw-r--r--devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-generic.cc42
-rw-r--r--devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.cc26
-rw-r--r--devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.h11
-rw-r--r--devel/electron28/files/patch-v8_src_trap-handler_trap-handler.h11
-rw-r--r--devel/electron28/files/patch-v8_src_wasm_baseline_ia32_liftoff-assembler-ia32-inl.h128
-rw-r--r--devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.cc51
-rw-r--r--devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.h16
-rw-r--r--devel/electron28/files/patch-v8_tools_run.py11
-rw-r--r--devel/electron28/files/yarn.lock7370
1386 files changed, 43608 insertions, 0 deletions
diff --git a/devel/electron28/files/apply-electron-patches.sh b/devel/electron28/files/apply-electron-patches.sh
new file mode 100644
index 000000000000..9d974b536054
--- /dev/null
+++ b/devel/electron28/files/apply-electron-patches.sh
@@ -0,0 +1,26 @@
+#! /bin/sh
+
+PATH=/bin:/usr/bin:/usr/local/bin
+
+GIT_CMD="git"
+PATCH_CMD="${GIT_CMD} apply"
+#PATCH_FLAGS="--numstat --check" # for debugging
+PATCH_FLAGS="--verbose --reject"
+
+WRKSRC=$1
+PATCH_CONF=${WRKSRC}/electron/patches/config.json
+
+${GIT_CMD} status "${WRKSRC}" > /dev/null 2>&1 && IS_GIT_REPO=1
+
+PATCHD_REPOD_PAIRS=$(sed -e '1d; $d; /^$/d; s/[",]//g; s/: */:/' "${PATCH_CONF}")
+for prp in ${PATCHD_REPOD_PAIRS}; do
+ pd=$(echo "${prp}" | awk -F: '{print $1}' | sed -e 's/src/./')
+ rd=$(echo "${prp}" | awk -F: '{print $2}' | sed -e 's/src/./')
+ (cd "${WRKSRC}/${rd}" && \
+ if [ -n "${IS_GIT_REPO}" ]; then
+ PATCH_FLAGS="${PATCH_FLAGS} --directory=$(${GIT_CMD} rev-parse --show-prefix)"
+ fi && \
+ while read -r p; do
+ ${PATCH_CMD} ${PATCH_FLAGS} "${WRKSRC}/${pd}/${p}"
+ done < "${WRKSRC}/${pd}/.patches")
+done
diff --git a/devel/electron28/files/extra-patch-electron_shell_browser_electron__browser__context.h b/devel/electron28/files/extra-patch-electron_shell_browser_electron__browser__context.h
new file mode 100644
index 000000000000..945fd33f12a9
--- /dev/null
+++ b/devel/electron28/files/extra-patch-electron_shell_browser_electron__browser__context.h
@@ -0,0 +1,64 @@
+--- electron/shell/browser/electron_browser_context.h.orig 2024-01-23 19:02:02 UTC
++++ electron/shell/browser/electron_browser_context.h
+@@ -8,7 +8,6 @@
+ #include <map>
+ #include <memory>
+ #include <string>
+-#include <string_view>
+ #include <variant>
+ #include <vector>
+ #include "base/memory/raw_ptr.h"
+@@ -79,22 +78,41 @@ class ElectronBrowserContext : public content::Browser
+
+ // partition_id => browser_context
+ struct PartitionKey {
+- PartitionKey(const std::string_view partition, bool in_memory)
+- : type_{Type::Partition}, location_{partition}, in_memory_{in_memory} {}
++ enum class KeyType { Partition, FilePath };
++ std::string location;
++ bool in_memory;
++ KeyType partition_type;
+
++ PartitionKey(const std::string& partition, bool in_memory)
++ : location(partition),
++ in_memory(in_memory),
++ partition_type(KeyType::Partition) {}
+ explicit PartitionKey(const base::FilePath& file_path)
+- : type_{Type::Path},
+- location_{file_path.AsUTF8Unsafe()},
+- in_memory_{false} {}
++ : location(file_path.AsUTF8Unsafe()),
++ in_memory(false),
++ partition_type(KeyType::FilePath) {}
+
+- friend auto operator<=>(const PartitionKey&, const PartitionKey&) = default;
++ bool operator<(const PartitionKey& other) const {
++ if (partition_type == KeyType::Partition) {
++ if (location == other.location)
++ return in_memory < other.in_memory;
++ return location < other.location;
++ } else {
++ if (location == other.location)
++ return false;
++ return location < other.location;
++ }
++ }
+
+- private:
+- enum class Type { Partition, Path };
+-
+- Type type_;
+- std::string location_;
+- bool in_memory_;
++ bool operator==(const PartitionKey& other) const {
++ if (partition_type == KeyType::Partition) {
++ return (location == other.location) && (in_memory < other.in_memory);
++ } else {
++ if (location == other.location)
++ return true;
++ return false;
++ }
++ }
+ };
+
+ using BrowserContextMap =
diff --git a/devel/electron28/files/extra-patch-electron_shell_browser_ui_gtk_menu__gtk.h b/devel/electron28/files/extra-patch-electron_shell_browser_ui_gtk_menu__gtk.h
new file mode 100644
index 000000000000..2ae6219150ae
--- /dev/null
+++ b/devel/electron28/files/extra-patch-electron_shell_browser_ui_gtk_menu__gtk.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/gtk/menu_gtk.h.orig 2023-12-20 13:32:58 UTC
++++ electron/shell/browser/ui/gtk/menu_gtk.h
+@@ -5,6 +5,8 @@
+ #ifndef ELECTRON_SHELL_BROWSER_UI_GTK_MENU_GTK_H_
+ #define ELECTRON_SHELL_BROWSER_UI_GTK_MENU_GTK_H_
+
++#include <vector>
++
+ #include "base/functional/callback.h"
+ #include "base/memory/raw_ptr.h"
+ #include "ui/base/glib/scoped_gobject.h"
diff --git a/devel/electron28/files/extra-patch-electron_shell_browser_ui_status__icon__gtk.h b/devel/electron28/files/extra-patch-electron_shell_browser_ui_status__icon__gtk.h
new file mode 100644
index 000000000000..21acde5bb351
--- /dev/null
+++ b/devel/electron28/files/extra-patch-electron_shell_browser_ui_status__icon__gtk.h
@@ -0,0 +1,10 @@
+--- electron/shell/browser/ui/status_icon_gtk.h.orig 2023-12-20 13:31:04 UTC
++++ electron/shell/browser/ui/status_icon_gtk.h
+@@ -6,6 +6,7 @@
+ #define ELECTRON_SHELL_BROWSER_UI_STATUS_ICON_GTK_H_
+
+ #include <memory>
++#include <vector>
+
+ #include "ui/base/glib/glib_integers.h"
+ #include "ui/base/glib/scoped_gobject.h"
diff --git a/devel/electron28/files/package.json b/devel/electron28/files/package.json
new file mode 100644
index 000000000000..80c43a807615
--- /dev/null
+++ b/devel/electron28/files/package.json
@@ -0,0 +1,156 @@
+{
+ "name": "electron",
+ "version": "0.0.0-development",
+ "repository": "https://github.com/electron/electron",
+ "description": "Build cross platform desktop apps with JavaScript, HTML, and CSS",
+ "devDependencies": {
+ "@azure/storage-blob": "^12.9.0",
+ "@electron/asar": "^3.2.1",
+ "@electron/docs-parser": "^1.2.0",
+ "@electron/fiddle-core": "^1.0.4",
+ "@electron/github-app-auth": "^2.0.0",
+ "@electron/lint-roller": "^1.9.0",
+ "@electron/typescript-definitions": "^8.15.2",
+ "@octokit/rest": "^19.0.7",
+ "@primer/octicons": "^10.0.0",
+ "@types/basic-auth": "^1.1.3",
+ "@types/busboy": "^1.5.0",
+ "@types/chai": "^4.2.12",
+ "@types/chai-as-promised": "^7.1.3",
+ "@types/dirty-chai": "^2.0.2",
+ "@types/express": "^4.17.13",
+ "@types/fs-extra": "^9.0.1",
+ "@types/klaw": "^3.0.1",
+ "@types/minimist": "^1.2.0",
+ "@types/mocha": "^7.0.2",
+ "@types/node": "^18.11.18",
+ "@types/semver": "^7.3.3",
+ "@types/send": "^0.14.5",
+ "@types/split": "^1.0.0",
+ "@types/stream-json": "^1.5.1",
+ "@types/temp": "^0.8.34",
+ "@types/uuid": "^3.4.6",
+ "@types/w3c-web-serial": "^1.0.3",
+ "@types/webpack": "^5.28.0",
+ "@types/webpack-env": "^1.17.0",
+ "@typescript-eslint/eslint-plugin": "^5.59.7",
+ "@typescript-eslint/parser": "^5.59.7",
+ "buffer": "^6.0.3",
+ "check-for-leaks": "^1.2.1",
+ "colors": "1.4.0",
+ "dotenv-safe": "^4.0.4",
+ "dugite": "^2.3.0",
+ "eslint": "^8.41.0",
+ "eslint-config-standard": "^14.1.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-mocha": "^7.0.1",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-promise": "^4.2.1",
+ "eslint-plugin-standard": "^4.0.1",
+ "eslint-plugin-unicorn": "^46.0.1",
+ "events": "^3.2.0",
+ "express": "^4.16.4",
+ "folder-hash": "^2.1.1",
+ "fs-extra": "^9.0.1",
+ "got": "^11.8.5",
+ "husky": "^8.0.1",
+ "klaw": "^3.0.0",
+ "lint": "^1.1.2",
+ "lint-staged": "^10.2.11",
+ "minimist": "^1.2.6",
+ "null-loader": "^4.0.0",
+ "pre-flight": "^1.1.0",
+ "process": "^0.11.10",
+ "remark-cli": "^10.0.0",
+ "remark-preset-lint-markdown-style-guide": "^4.0.0",
+ "semver": "^7.5.2",
+ "shx": "^0.3.2",
+ "stream-json": "^1.7.1",
+ "tap-xunit": "^2.4.1",
+ "temp": "^0.8.3",
+ "timers-browserify": "1.4.2",
+ "ts-loader": "^8.0.2",
+ "ts-node": "6.2.0",
+ "typescript": "^5.1.2",
+ "url": "^0.11.0",
+ "webpack": "^5.76.0",
+ "webpack-cli": "^4.10.0",
+ "wrapper-webpack-plugin": "^2.2.0"
+ },
+ "private": true,
+ "scripts": {
+ "asar": "asar",
+ "generate-version-json": "node script/generate-version-json.js",
+ "lint": "node ./script/lint.js && npm run lint:docs",
+ "lint:js": "node ./script/lint.js --js",
+ "lint:clang-format": "python3 script/run-clang-format.py -r -c shell/ || (echo \"\\nCode not formatted correctly.\" && exit 1)",
+ "lint:clang-tidy": "ts-node ./script/run-clang-tidy.ts",
+ "lint:cpp": "node ./script/lint.js --cc",
+ "lint:objc": "node ./script/lint.js --objc",
+ "lint:py": "node ./script/lint.js --py",
+ "lint:gn": "node ./script/lint.js --gn",
+ "lint:docs": "remark docs -qf && npm run lint:js-in-markdown && npm run create-typescript-definitions && npm run lint:ts-check-js-in-markdown && npm run lint:docs-fiddles && npm run lint:docs-relative-links && npm run lint:markdown",
+ "lint:docs-fiddles": "standard \"docs/fiddles/**/*.js\"",
+ "lint:docs-relative-links": "electron-lint-markdown-links --root docs \"**/*.md\"",
+ "lint:markdown": "node ./script/lint.js --md",
+ "lint:ts-check-js-in-markdown": "electron-lint-markdown-ts-check --root docs \"**/*.md\" --ignore \"breaking-changes.md\"",
+ "lint:js-in-markdown": "electron-lint-markdown-standard --root docs \"**/*.md\"",
+ "create-api-json": "node script/create-api-json.js",
+ "create-typescript-definitions": "npm run create-api-json && electron-typescript-definitions --api=electron-api.json && node spec/ts-smoke/runner.js",
+ "gn-typescript-definitions": "npm run create-typescript-definitions && shx cp electron.d.ts",
+ "pre-flight": "pre-flight",
+ "gn-check": "node ./script/gn-check.js",
+ "gn-format": "python3 script/run-gn-format.py",
+ "precommit": "lint-staged",
+ "preinstall": "node -e 'process.exit(0)'",
+ "pretest": "npm run create-typescript-definitions",
+ "prepack": "check-for-leaks",
+ "repl": "node ./script/start.js --interactive",
+ "start": "node ./script/start.js",
+ "test": "node ./script/spec-runner.js",
+ "tsc": "tsc",
+ "webpack": "webpack"
+ },
+ "license": "MIT",
+ "author": "Electron Community",
+ "keywords": [
+ "electron"
+ ],
+ "lint-staged": {
+ "*.{js,ts}": [
+ "node script/lint.js --js --fix --only --"
+ ],
+ "*.{js,ts,d.ts}": [
+ "ts-node script/gen-filenames.ts"
+ ],
+ "*.{cc,mm,c,h}": [
+ "python3 script/run-clang-format.py -r -c --fix"
+ ],
+ "*.md": [
+ "npm run lint:docs"
+ ],
+ "*.{gn,gni}": [
+ "npm run gn-check",
+ "npm run gn-format"
+ ],
+ "*.py": [
+ "node script/lint.js --py --fix --only --"
+ ],
+ "docs/api/**/*.md": [
+ "ts-node script/gen-filenames.ts",
+ "electron-markdownlint --config .markdownlint.autofix.json --fix",
+ "git add filenames.auto.gni"
+ ],
+ "{*.patch,.patches}": [
+ "node script/lint.js --patches --only --",
+ "ts-node script/check-patch-diff.ts"
+ ],
+ "DEPS": [
+ "node script/gen-hunspell-filenames.js",
+ "node script/gen-libc++-filenames.js"
+ ]
+ },
+ "resolutions": {
+ "nan": "nodejs/nan#e14bdcd1f72d62bca1d541b66da43130384ec213"
+ }
+}
diff --git a/devel/electron28/files/patch-BUILD.gn b/devel/electron28/files/patch-BUILD.gn
new file mode 100644
index 000000000000..135d887e31f7
--- /dev/null
+++ b/devel/electron28/files/patch-BUILD.gn
@@ -0,0 +1,89 @@
+--- BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ BUILD.gn
+@@ -61,7 +61,7 @@ declare_args() {
+ root_extra_deps = []
+ }
+
+-if (is_official_build) {
++if (is_official_build && !is_bsd) {
+ # An official (maximally optimized!) component (optimized for build times)
+ # build doesn't make sense and usually doesn't work.
+ assert(!is_component_build)
+@@ -95,7 +95,6 @@ group("gn_all") {
+ "//codelabs",
+ "//components:components_unittests",
+ "//components/gwp_asan:gwp_asan_unittests",
+- "//infra/orchestrator:orchestrator_all",
+ "//net:net_unittests",
+ "//sandbox:sandbox_unittests",
+ "//services:services_unittests",
+@@ -415,7 +414,7 @@ group("gn_all") {
+ }
+ }
+
+- if (is_linux || is_chromeos || is_android) {
++ if ((is_linux && !is_bsd) || is_chromeos || is_android) {
+ deps += [
+ "//third_party/breakpad:breakpad_unittests",
+ "//third_party/breakpad:core-2-minidump",
+@@ -615,6 +614,15 @@ group("gn_all") {
+ }
+ }
+
++ if (is_bsd) {
++ deps -= [
++ "//third_party/breakpad:dump_syms($host_toolchain)",
++ "//third_party/breakpad:microdump_stackwalk($host_toolchain)",
++ "//third_party/breakpad:minidump_dump($host_toolchain)",
++ "//third_party/breakpad:minidump_stackwalk($host_toolchain)",
++ ]
++ }
++
+ if (is_mac) {
+ deps += [
+ "//third_party/breakpad:dump_syms",
+@@ -664,7 +672,7 @@ group("gn_all") {
+ host_os == "win") {
+ deps += [ "//chrome/test/mini_installer:mini_installer_tests" ]
+ }
+- } else if (!is_android && !is_ios && !is_fuchsia) {
++ } else if (!is_android && !is_ios && !is_fuchsia && !is_bsd) {
+ deps += [ "//third_party/breakpad:symupload($host_toolchain)" ]
+ }
+
+@@ -1088,7 +1096,7 @@ if (use_blink && !is_cronet_build) {
+ ]
+ }
+
+- if (!is_chromeos_ash && !is_ios && !is_fuchsia && !is_android && !is_castos) {
++ if (!is_chromeos_ash && !is_ios && !is_fuchsia && !is_android && !is_castos && !is_bsd) {
+ script_test("chrome_wpt_tests") {
+ script = "//third_party/blink/tools/run_wpt_tests.py"
+ args = [
+@@ -1161,7 +1169,7 @@ if (use_blink && !is_cronet_build) {
+ data_deps += [ "//content/web_test:web_test_common_mojom_js_data_deps" ]
+ }
+
+- if (!is_win && !is_android) {
++ if (!is_win && !is_android && !is_bsd) {
+ data_deps +=
+ [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
+@@ -1170,7 +1178,7 @@ if (use_blink && !is_cronet_build) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux && !is_bsd) || is_chromeos) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+@@ -1635,7 +1643,7 @@ group("chromium_builder_perf") {
+ data_deps += [ "//chrome/test:performance_browser_tests" ]
+ }
+
+- if (!is_win) {
++ if (!is_win && !is_bsd) {
+ data_deps +=
+ [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
diff --git a/devel/electron28/files/patch-apps_ui_views_app__window__frame__view.cc b/devel/electron28/files/patch-apps_ui_views_app__window__frame__view.cc
new file mode 100644
index 000000000000..dadc31efaf31
--- /dev/null
+++ b/devel/electron28/files/patch-apps_ui_views_app__window__frame__view.cc
@@ -0,0 +1,11 @@
+--- apps/ui/views/app_window_frame_view.cc.orig 2023-11-29 21:39:38 UTC
++++ apps/ui/views/app_window_frame_view.cc
+@@ -149,7 +149,7 @@ gfx::Rect AppWindowFrameView::GetWindowBoundsForClient
+ gfx::Rect window_bounds = client_bounds;
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Get the difference between the widget's client area bounds and window
+ // bounds, and grow |window_bounds| by that amount.
+ gfx::Insets native_frame_insets =
diff --git a/devel/electron28/files/patch-ash_display_mirror__window__controller.cc b/devel/electron28/files/patch-ash_display_mirror__window__controller.cc
new file mode 100644
index 000000000000..76b5d1103bda
--- /dev/null
+++ b/devel/electron28/files/patch-ash_display_mirror__window__controller.cc
@@ -0,0 +1,14 @@
+--- ash/display/mirror_window_controller.cc.orig 2023-10-19 19:57:56 UTC
++++ ash/display/mirror_window_controller.cc
+@@ -294,7 +294,11 @@ void MirrorWindowController::UpdateWindow(
+ if (!base::Contains(display_info_list, iter->first,
+ &display::ManagedDisplayInfo::id)) {
+ CloseAndDeleteHost(iter->second, true);
++#if defined(__llvm__)
++ mirroring_host_info_map_.erase(iter++);
++#else
+ iter = mirroring_host_info_map_.erase(iter);
++#endif
+ } else {
+ ++iter;
+ }
diff --git a/devel/electron28/files/patch-base_BUILD.gn b/devel/electron28/files/patch-base_BUILD.gn
new file mode 100644
index 000000000000..ba381488471b
--- /dev/null
+++ b/devel/electron28/files/patch-base_BUILD.gn
@@ -0,0 +1,144 @@
+--- base/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ base/BUILD.gn
+@@ -186,7 +186,7 @@ buildflag_header("ios_cronet_buildflags") {
+ flags = [ "CRONET_BUILD=$is_cronet_build" ]
+ }
+
+-enable_message_pump_epoll = is_linux || is_chromeos || is_android
++enable_message_pump_epoll = (is_linux || is_chromeos || is_android) && !is_bsd
+ buildflag_header("message_pump_buildflags") {
+ header = "message_pump_buildflags.h"
+ header_dir = "base/message_loop"
+@@ -1106,11 +1106,24 @@ component("base") {
+ # Needed for <atomic> if using newer C++ library than sysroot, except if
+ # building inside the cros_sdk environment - use host_toolchain as a
+ # more robust check for this.
+- if (!use_sysroot && (is_android || is_chromeos || (is_linux && !is_castos)) &&
++ if (!use_sysroot && (is_android || is_chromeos || (is_linux && !is_castos && !is_bsd)) &&
+ host_toolchain != "//build/toolchain/cros:host") {
+ libs += [ "atomic" ]
+ }
+
++ # *BSD needs libkvm
++ if (is_bsd) {
++ libs += [ "kvm" ]
++ }
++
++ if (is_freebsd) {
++ libs += [
++ "execinfo",
++ "util",
++ "z",
++ ]
++ }
++
+ if (use_allocator_shim) {
+ if (is_apple) {
+ sources += [ "allocator/early_zone_registration_apple.h" ]
+@@ -1130,7 +1143,7 @@ component("base") {
+
+ # Allow more direct string conversions on platforms with native utf8
+ # strings
+- if (is_apple || is_chromeos || is_castos || is_cast_android || is_fuchsia) {
++ if (is_apple || is_chromeos || is_castos || is_cast_android || is_fuchsia || is_bsd) {
+ defines += [ "SYSTEM_NATIVE_UTF8" ]
+ }
+
+@@ -2089,6 +2102,22 @@ component("base") {
+ ]
+ }
+
++ if (is_openbsd) {
++ sources += [
++ "process/process_handle_openbsd.cc",
++ "process/process_iterator_openbsd.cc",
++ "process/process_metrics_openbsd.cc",
++ "system/sys_info_openbsd.cc",
++ ]
++ } else if (is_freebsd) {
++ sources += [
++ "process/process_handle_freebsd.cc",
++ "process/process_iterator_freebsd.cc",
++ "process/process_metrics_freebsd.cc",
++ "system/sys_info_freebsd.cc",
++ ]
++ }
++
+ # iOS
+ if (is_ios) {
+ sources += [
+@@ -2221,6 +2250,29 @@ component("base") {
+ }
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "files/file_path_watcher_inotify.cc",
++ "files/scoped_file_linux.cc",
++ "system/sys_info_linux.cc",
++ "process/process_iterator_linux.cc",
++ "process/process_linux.cc",
++ "process/process_metrics_linux.cc",
++ "process/process_handle_linux.cc",
++ "profiler/stack_copier_signal.cc",
++ "profiler/stack_copier_signal.h",
++ "profiler/thread_delegate_posix.cc",
++ "profiler/thread_delegate_posix.h",
++ "threading/platform_thread_linux.cc",
++ ]
++ sources += [
++ "files/file_path_watcher_kqueue.cc",
++ "files/file_path_watcher_kqueue.h",
++ "files/file_path_watcher_bsd.cc",
++ "threading/platform_thread_bsd.cc",
++ ]
++ }
++
+ if (use_blink) {
+ sources += [
+ "files/file_path_watcher.cc",
+@@ -2231,7 +2283,7 @@ component("base") {
+ }
+
+ if (dep_libevent) {
+- deps += [ "//third_party/libevent" ]
++ public_deps += [ "//third_party/libevent" ]
+ }
+
+ if (use_libevent) {
+@@ -3620,7 +3672,7 @@ test("base_unittests") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "debug/proc_maps_linux_unittest.cc",
+ "files/scoped_file_linux_unittest.cc",
+@@ -3641,7 +3693,7 @@ test("base_unittests") {
+ "posix/file_descriptor_shuffle_unittest.cc",
+ "posix/unix_domain_socket_unittest.cc",
+ ]
+- if (!is_nacl && !is_apple) {
++ if (!is_nacl && !is_apple && !is_bsd) {
+ sources += [
+ "profiler/stack_base_address_posix_unittest.cc",
+ "profiler/stack_copier_signal_unittest.cc",
+@@ -3652,7 +3704,7 @@ test("base_unittests") {
+
+ # Allow more direct string conversions on platforms with native utf8
+ # strings
+- if (is_apple || is_chromeos || is_castos || is_cast_android || is_fuchsia) {
++ if (is_apple || is_chromeos || is_castos || is_cast_android || is_fuchsia || is_bsd) {
+ defines += [ "SYSTEM_NATIVE_UTF8" ]
+ }
+
+@@ -3914,7 +3966,7 @@ test("base_unittests") {
+ }
+ }
+
+- if (is_fuchsia || is_linux || is_chromeos) {
++ if ((is_fuchsia || is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "debug/elf_reader_unittest.cc",
+ "debug/test_elf_image_builder.cc",
diff --git a/devel/electron28/files/patch-base_allocator_dispatcher_tls.h b/devel/electron28/files/patch-base_allocator_dispatcher_tls.h
new file mode 100644
index 000000000000..ab4b4baac3f5
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_dispatcher_tls.h
@@ -0,0 +1,11 @@
+--- base/allocator/dispatcher/tls.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/dispatcher/tls.h
+@@ -74,7 +74,7 @@ struct BASE_EXPORT MMapAllocator {
+ partition_alloc::PartitionPageSize();
+ #elif BUILDFLAG(IS_APPLE)
+ constexpr static size_t AllocationChunkSize = 16384;
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ constexpr static size_t AllocationChunkSize = 16384;
+ #else
+ constexpr static size_t AllocationChunkSize = 4096;
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_partition__alloc.gni b/devel/electron28/files/patch-base_allocator_partition__allocator_partition__alloc.gni
new file mode 100644
index 000000000000..f27dca7e6038
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_partition__alloc.gni
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/partition_alloc.gni.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/partition_alloc.gni
+@@ -319,7 +319,7 @@ declare_args() {
+ # pkeys support is explicitly disabled in all Cronet builds, as some test
+ # dependencies that use partition_allocator are compiled in AOSP against a
+ # version of glibc that does not include pkeys syscall numbers.
+- enable_pkeys = is_linux && target_cpu == "x64" && !is_cronet_build
++ enable_pkeys = (is_linux && !is_bsd) && target_cpu == "x64" && !is_cronet_build
+ }
+ assert(!enable_pkeys || (is_linux && target_cpu == "x64"),
+ "Pkeys are only supported on x64 linux")
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_BUILD.gn b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_BUILD.gn
new file mode 100644
index 000000000000..b1a59a97fc7d
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_BUILD.gn
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/BUILD.gn.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
+@@ -582,7 +582,7 @@ source_set("allocator_shim") {
+ ]
+ configs += [ ":mac_no_default_new_delete_symbols" ]
+ }
+- if (is_chromeos || is_linux) {
++ if ((is_chromeos || is_linux) && !is_bsd) {
+ sources += [
+ "shim/allocator_shim_override_cpp_symbols.h",
+ "shim/allocator_shim_override_glibc_weak_symbols.h",
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h
new file mode 100644
index 000000000000..44e34ed8e6ef
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h
@@ -0,0 +1,20 @@
+--- base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h
+@@ -38,7 +38,7 @@ AslrMask(uintptr_t bits) {
+
+ #if defined(ARCH_CPU_64_BITS)
+
+- #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
++ #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) && !BUILDFLAG(IS_BSD)
+
+ // We shouldn't allocate system pages at all for sanitizer builds. However,
+ // we do, and if random hint addresses interfere with address ranges
+@@ -124,7 +124,7 @@ AslrMask(uintptr_t bits) {
+ return AslrAddress(0x20000000ULL);
+ }
+
+- #elif BUILDFLAG(IS_LINUX)
++ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ // Linux on arm64 can use 39, 42, 48, or 52-bit user space, depending on
+ // page size and number of levels of translation pages used. We use
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator.h
new file mode 100644
index 000000000000..3595d7df176c
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator.h
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/page_allocator.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/page_allocator.h
+@@ -258,7 +258,7 @@ constexpr PA_COMPONENT_EXPORT(
+ // recommitted. Do not assume that this will not change over time.
+ constexpr PA_COMPONENT_EXPORT(
+ PARTITION_ALLOC) bool DecommittedMemoryIsAlwaysZeroed() {
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ return false;
+ #else
+ return true;
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h
new file mode 100644
index 000000000000..78e1e4703934
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h
@@ -0,0 +1,38 @@
+--- base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h
+@@ -25,7 +25,7 @@
+ // elimination.
+ #define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const))
+
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ // This should work for all POSIX (if needed), but currently all other
+ // supported OS/architecture combinations use either hard-coded values
+ // (such as x86) or have means to determine these values without needing
+@@ -92,7 +92,7 @@ PageAllocationGranularityShift() {
+ return 14; // 16kB
+ #elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)
+ return static_cast<size_t>(vm_page_shift);
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ // arm64 supports 4kb (shift = 12), 16kb (shift = 14), and 64kb (shift = 16)
+ // page sizes. Retrieve from or initialize cache.
+ size_t shift = page_characteristics.shift.load(std::memory_order_relaxed);
+@@ -113,7 +113,7 @@ PageAllocationGranularity() {
+ // This is literally equivalent to |1 << PageAllocationGranularityShift()|
+ // below, but was separated out for IS_APPLE to avoid << on a non-constexpr.
+ return vm_page_size;
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ // arm64 supports 4kb, 16kb, and 64kb page sizes. Retrieve from or
+ // initialize cache.
+ size_t size = page_characteristics.size.load(std::memory_order_relaxed);
+@@ -152,7 +152,7 @@ SystemPageSize() {
+ PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t
+ SystemPageSize() {
+ #if (BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)) || \
+- (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64))
++ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64))
+ // This is literally equivalent to |1 << SystemPageShift()| below, but was
+ // separated out for 64-bit IS_APPLE and arm64 on Linux to avoid << on a
+ // non-constexpr.
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__internals__posix.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__internals__posix.h
new file mode 100644
index 000000000000..6509cb7d7ca3
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_page__allocator__internals__posix.h
@@ -0,0 +1,16 @@
+--- base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h
+@@ -403,8 +403,12 @@ void DiscardSystemPagesInternal(uintptr_t address, siz
+
+ void DiscardSystemPagesInternal(uintptr_t address, size_t length) {
+ void* ptr = reinterpret_cast<void*>(address);
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
++#if BUILDFLAG(IS_BSD)
++ int ret = madvise(ptr, length, MADV_FREE);
++#else
+ int ret = madvise(ptr, length, MADV_FREE_REUSABLE);
++#endif
+ if (ret) {
+ // MADV_FREE_REUSABLE sometimes fails, so fall back to MADV_DONTNEED.
+ ret = madvise(ptr, length, MADV_DONTNEED);
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__address__space.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__address__space.cc
new file mode 100644
index 000000000000..84c137455006
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__address__space.cc
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc
+@@ -420,7 +420,7 @@ void PartitionAddressSpace::UninitThreadIsolatedPoolFo
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+
+ PageCharacteristics page_characteristics;
+
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_compiler__specific.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_compiler__specific.h
new file mode 100644
index 000000000000..f7b18efcb978
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_compiler__specific.h
@@ -0,0 +1,32 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h
+@@ -24,9 +24,9 @@
+ // Annotate a function indicating it should not be inlined.
+ // Use like:
+ // NOINLINE void DoStuff() { ... }
+-#if defined(__clang__) && PA_HAS_ATTRIBUTE(noinline)
++#if defined(__clang__) && (__clang_major__ >= 15) && PA_HAS_ATTRIBUTE(noinline)
+ #define PA_NOINLINE [[clang::noinline]]
+-#elif defined(COMPILER_GCC) && PA_HAS_ATTRIBUTE(noinline)
++#elif (defined(COMPILER_GCC) || defined(__clang__)) && PA_HAS_ATTRIBUTE(noinline)
+ #define PA_NOINLINE __attribute__((noinline))
+ #elif defined(COMPILER_MSVC)
+ #define PA_NOINLINE __declspec(noinline)
+@@ -34,7 +34,7 @@
+ #define PA_NOINLINE
+ #endif
+
+-#if defined(__clang__) && defined(NDEBUG) && PA_HAS_ATTRIBUTE(always_inline)
++#if defined(__clang__) && (__clang_major__ >= 15) && defined(NDEBUG) && PA_HAS_ATTRIBUTE(always_inline)
+ #define PA_ALWAYS_INLINE [[clang::always_inline]] inline
+ #elif defined(COMPILER_GCC) && defined(NDEBUG) && \
+ PA_HAS_ATTRIBUTE(always_inline)
+@@ -53,7 +53,7 @@
+ // prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h.
+ // Use like:
+ // void NOT_TAIL_CALLED FooBar();
+-#if defined(__clang__) && PA_HAS_ATTRIBUTE(not_tail_called)
++#if defined(__clang__) && (__clang_major__ >= 15) && PA_HAS_ATTRIBUTE(not_tail_called)
+ #define PA_NOT_TAIL_CALLED [[clang::not_tail_called]]
+ #else
+ #define PA_NOT_TAIL_CALLED
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_debug_stack__trace__posix.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_debug_stack__trace__posix.cc
new file mode 100644
index 000000000000..1bdd69c97192
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_debug_stack__trace__posix.cc
@@ -0,0 +1,34 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc
+@@ -12,11 +12,11 @@
+ #include <string.h>
+ #include <unistd.h>
+
+-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ #include <link.h> // For ElfW() macro.
+ #endif
+
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ #define HAVE_DLADDR
+ #include <dlfcn.h>
+ #endif
+@@ -25,7 +25,7 @@ namespace {
+
+ namespace {
+
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+
+ constexpr size_t kBufferSize = 4096u;
+
+@@ -359,7 +359,7 @@ void PrintStackTraceInternal(const void** trace, size_
+ }
+ #endif // !BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ // Since /proc/self/maps is not available, use dladdr() to obtain module
+ // names and offsets inside the modules from the given addresses.
+ void PrintStackTraceInternal(const void* const* trace, size_t size) {
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_rand__util__posix.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_rand__util__posix.cc
new file mode 100644
index 000000000000..afff8fbd927f
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_rand__util__posix.cc
@@ -0,0 +1,13 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc
+@@ -90,6 +90,10 @@ void RandBytes(void* output, size_t output_length) {
+ if (getentropy(output, output_length) == 0) {
+ return;
+ }
++#elif BUILDFLAG(IS_BSD)
++ if (getentropy(output, output_length) == 0) {
++ return;
++ }
+ #endif
+ // If getrandom(2) above returned with an error and the /dev/urandom fallback
+ // took place on Linux/ChromeOS bots, they would fail with a CHECK in
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__internal__posix.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__internal__posix.h
new file mode 100644
index 000000000000..35a8106e9704
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__internal__posix.h
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h
+@@ -10,7 +10,7 @@ namespace partition_alloc::internal::base::internal {
+
+ namespace partition_alloc::internal::base::internal {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Current thread id is cached in thread local storage for performance reasons.
+ // In some rare cases it's important to invalidate that cache explicitly (e.g.
+ // after going through clone() syscall which does not call pthread_atfork()
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__posix.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__posix.cc
new file mode 100644
index 000000000000..33e0b23507f8
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__base_threading_platform__thread__posix.cc
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc
+@@ -17,7 +17,7 @@
+ #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <sys/syscall.h>
+ #include <atomic>
+ #endif
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__config.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__config.h
new file mode 100644
index 000000000000..0fea68d30dde
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__config.h
@@ -0,0 +1,29 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h
+@@ -94,7 +94,7 @@ static_assert(sizeof(void*) != 8, "");
+ // POSIX is not only UNIX, e.g. macOS and other OSes. We do use Linux-specific
+ // features such as futex(2).
+ #define PA_CONFIG_HAS_LINUX_KERNEL() \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD))
+
+ // On some platforms, we implement locking by spinning in userspace, then going
+ // into the kernel only if there is contention. This requires platform support,
+@@ -241,7 +241,7 @@ constexpr bool kUseLazyCommit = false;
+ // On these platforms, lock all the partitions before fork(), and unlock after.
+ // This may be required on more platforms in the future.
+ #define PA_CONFIG_HAS_ATFORK_HANDLER() \
+- (BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+
+ // PartitionAlloc uses PartitionRootEnumerator to acquire all
+ // PartitionRoots at BeforeFork and to release at AfterFork.
+@@ -288,7 +288,7 @@ constexpr bool kUseLazyCommit = false;
+ // Also enabled on ARM64 macOS, as the 16kiB pages on this platform lead to
+ // larger slot spans.
+ #define PA_CONFIG_PREFER_SMALLER_SLOT_SPANS() \
+- (BUILDFLAG(IS_LINUX) || (BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)))
++ (BUILDFLAG(IS_LINUX) || (BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)) || BUILDFLAG(IS_BSD))
+
+ // Enable shadow metadata.
+ //
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h
new file mode 100644
index 000000000000..07154c83173c
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h
@@ -0,0 +1,21 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h
+@@ -107,7 +107,7 @@ PartitionPageShift() {
+ return 18; // 256 KiB
+ }
+ #elif (BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)) || \
+- (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64))
++ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64))
+ PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t
+ PartitionPageShift() {
+ return PageAllocationGranularityShift() + 2;
+@@ -309,7 +309,8 @@ constexpr size_t kNumPools = kMaxPoolHandle - 1;
+ // 8GB for each of the glued pools).
+ #if BUILDFLAG(HAS_64_BIT_POINTERS)
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || \
+- BUILDFLAG(ENABLE_POINTER_COMPRESSION)
++ BUILDFLAG(ENABLE_POINTER_COMPRESSION) || \
++ BUILDFLAG(IS_BSD)
+ constexpr size_t kPoolMaxSize = 8 * kGiB;
+ #else
+ constexpr size_t kPoolMaxSize = 16 * kGiB;
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h
new file mode 100644
index 000000000000..03cf424478d2
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h
@@ -0,0 +1,16 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h
+@@ -28,9 +28,13 @@ namespace internal {
+ // the second one 16. We could technically return something different for
+ // malloc() and operator new(), but this would complicate things, and most of
+ // our allocations are presumably coming from operator new() anyway.
++#if defined(__i386__) && defined(OS_FREEBSD)
++constexpr size_t kAlignment = 8;
++#else
+ constexpr size_t kAlignment =
+ std::max(alignof(max_align_t),
+ static_cast<size_t>(__STDCPP_DEFAULT_NEW_ALIGNMENT__));
++#endif
+ static_assert(kAlignment <= 16,
+ "PartitionAlloc doesn't support a fundamental alignment larger "
+ "than 16 bytes.");
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__page__constants.h b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__page__constants.h
new file mode 100644
index 000000000000..7d2fa3c37f50
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__page__constants.h
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h
+@@ -16,7 +16,7 @@ static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1
+ // (1 << 12 or 1 << 14), as checked in PartitionRoot::Init(). And
+ // PartitionPageSize() is 4 times the OS page size.
+ static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 14) / kSmallestBucket;
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ // System page size can be 4, 16, or 64 kiB on Linux on arm64. 64 kiB is
+ // currently (kMaxSlotsPerSlotSpanBits == 13) not supported by the code,
+ // so we use the 16 kiB maximum (64 kiB will crash).
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__root.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__root.cc
new file mode 100644
index 000000000000..3847ead4d34b
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_partition__root.cc
@@ -0,0 +1,38 @@
+--- base/allocator/partition_allocator/src/partition_alloc/partition_root.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+@@ -47,7 +47,7 @@
+ #include "wow64apiset.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <pthread.h>
+ #endif
+
+@@ -281,7 +281,7 @@ void PartitionAllocMallocInitOnce() {
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // When fork() is called, only the current thread continues to execute in the
+ // child process. If the lock is held, but *not* by this thread when fork() is
+ // called, we have a deadlock.
+@@ -379,7 +379,7 @@ static size_t PartitionPurgeSlotSpan(PartitionRoot* ro
+ constexpr size_t kMaxSlotCount =
+ (PartitionPageSize() * kMaxPartitionPagesPerRegularSlotSpan) /
+ MinPurgeableSlotSize();
+-#elif BUILDFLAG(IS_APPLE) || (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64))
++#elif BUILDFLAG(IS_APPLE) || ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64))
+ // It's better for slot_usage to be stack-allocated and fixed-size, which
+ // demands that its size be constexpr. On IS_APPLE and Linux on arm64,
+ // PartitionPageSize() is always SystemPageSize() << 2, so regardless of
+@@ -948,7 +948,7 @@ void PartitionRoot::Init(PartitionOptions opts) {
+ // apple OSes.
+ PA_CHECK((internal::SystemPageSize() == (size_t{1} << 12)) ||
+ (internal::SystemPageSize() == (size_t{1} << 14)));
+-#elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_ARM64)
+ // Check runtime pagesize. Though the code is currently the same, it is
+ // not merged with the IS_APPLE case above as a 1 << 16 case needs to be
+ // added here in the future, to allow 64 kiB pagesize. That is only
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_spinning__mutex.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_spinning__mutex.cc
new file mode 100644
index 000000000000..5a85fe93a652
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_spinning__mutex.cc
@@ -0,0 +1,53 @@
+--- base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc
+@@ -18,7 +18,16 @@
+
+ #if PA_CONFIG(HAS_LINUX_KERNEL)
+ #include <errno.h>
++#if defined(OS_OPENBSD)
++#include <sys/time.h>
++#include <sys/futex.h>
++#elif defined(OS_FREEBSD)
++#include <sys/types.h>
++#include <sys/thr.h>
++#include <sys/umtx.h>
++#else
+ #include <linux/futex.h>
++#endif
+ #include <sys/syscall.h>
+ #include <unistd.h>
+ #endif // PA_CONFIG(HAS_LINUX_KERNEL)
+@@ -108,8 +117,16 @@ void SpinningMutex::FutexWait() {
+ // |kLockedContended| anymore. Note that even without spurious wakeups, the
+ // value of |state_| is not guaranteed when this returns, as another thread
+ // may get the lock before we get to run.
++#if defined(OS_FREEBSD)
++ int err = _umtx_op(&state_, UMTX_OP_WAIT_UINT_PRIVATE,
++ kLockedContended, nullptr, nullptr);
++#elif defined(OS_OPENBSD)
++ int err = futex(reinterpret_cast<volatile unsigned int *>(&state_), FUTEX_WAIT | FUTEX_PRIVATE_FLAG,
++ kLockedContended, nullptr, nullptr);
++#else
+ int err = syscall(SYS_futex, &state_, FUTEX_WAIT | FUTEX_PRIVATE_FLAG,
+ kLockedContended, nullptr, nullptr, 0);
++#endif
+
+ if (err) {
+ // These are programming error, check them.
+@@ -121,8 +138,16 @@ void SpinningMutex::FutexWake() {
+
+ void SpinningMutex::FutexWake() {
+ int saved_errno = errno;
++#if defined(OS_FREEBSD)
++ long retval = _umtx_op(&state_, UMTX_OP_WAKE_PRIVATE,
++ 1 /* wake up a single waiter */, nullptr, nullptr);
++#elif defined(OS_OPENBSD)
++ long retval = futex(reinterpret_cast<volatile unsigned int *>(&state_), FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
++ 1 /* wake up a single waiter */, nullptr, nullptr);
++#else
+ long retval = syscall(SYS_futex, &state_, FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
+ 1 /* wake up a single waiter */, nullptr, nullptr, 0);
++#endif
+ PA_CHECK(retval != -1);
+ errno = saved_errno;
+ }
diff --git a/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_starscan_stack_stack.cc b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_starscan_stack_stack.cc
new file mode 100644
index 000000000000..1704067c880b
--- /dev/null
+++ b/devel/electron28/files/patch-base_allocator_partition__allocator_src_partition__alloc_starscan_stack_stack.cc
@@ -0,0 +1,50 @@
+--- base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc.orig 2023-11-29 21:39:39 UTC
++++ base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc
+@@ -18,6 +18,10 @@
+ #include <pthread.h>
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include <pthread_np.h>
++#endif
++
+ #if defined(LIBC_GLIBC)
+ extern "C" void* __libc_stack_end;
+ #endif
+@@ -48,6 +52,36 @@ void* GetStackTop() {
+
+ void* GetStackTop() {
+ return pthread_get_stackaddr_np(pthread_self());
++}
++
++#elif defined(OS_OPENBSD)
++
++void* GetStackTop() {
++ stack_t ss;
++ if (pthread_stackseg_np(pthread_self(), &ss) != 0)
++ return nullptr;
++ return reinterpret_cast<uint8_t*>(ss.ss_sp);
++}
++
++#elif defined(OS_FREEBSD)
++
++void* GetStackTop() {
++ pthread_attr_t attr;
++ int error = pthread_attr_init(&attr);
++ if (error) {
++ return nullptr;
++ }
++ error = pthread_attr_get_np(pthread_self(), &attr);
++ if (!error) {
++ void* base;
++ size_t size;
++ error = pthread_attr_getstack(&attr, &base, &size);
++ PA_CHECK(!error);
++ pthread_attr_destroy(&attr);
++ return reinterpret_cast<uint8_t*>(base) + size;
++ }
++ pthread_attr_destroy(&attr);
++ return nullptr;
+ }
+
+ #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
diff --git a/devel/electron28/files/patch-base_atomicops.h b/devel/electron28/files/patch-base_atomicops.h
new file mode 100644
index 000000000000..7c186aff0e5b
--- /dev/null
+++ b/devel/electron28/files/patch-base_atomicops.h
@@ -0,0 +1,14 @@
+--- base/atomicops.h.orig 2023-03-30 00:33:38 UTC
++++ base/atomicops.h
+@@ -71,7 +71,11 @@ typedef intptr_t Atomic64;
+
+ // Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or
+ // Atomic64 routines below, depending on your architecture.
++#if !defined(OS_OPENBSD) && defined(__i386__)
++typedef Atomic32 AtomicWord;
++#else
+ typedef intptr_t AtomicWord;
++#endif
+
+ // Atomically execute:
+ // result = *ptr;
diff --git a/devel/electron28/files/patch-base_base__paths__posix.cc b/devel/electron28/files/patch-base_base__paths__posix.cc
new file mode 100644
index 000000000000..e7273fae737c
--- /dev/null
+++ b/devel/electron28/files/patch-base_base__paths__posix.cc
@@ -0,0 +1,108 @@
+--- base/base_paths_posix.cc.orig 2023-11-29 21:39:40 UTC
++++ base/base_paths_posix.cc
+@@ -15,6 +15,7 @@
+ #include <ostream>
+ #include <string>
+
++#include "base/command_line.h"
+ #include "base/environment.h"
+ #include "base/files/file_path.h"
+ #include "base/files/file_util.h"
+@@ -26,9 +27,13 @@
+ #include "base/process/process_metrics.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_FREEBSD)
++#if BUILDFLAG(IS_BSD)
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
++#if BUILDFLAG(IS_OPENBSD)
++#include <kvm.h>
++#define MAXTOKENS 2
++#endif
+ #elif BUILDFLAG(IS_SOLARIS) || BUILDFLAG(IS_AIX)
+ #include <stdlib.h>
+ #endif
+@@ -48,8 +53,7 @@ bool PathProviderPosix(int key, FilePath* result) {
+ *result = bin_dir;
+ return true;
+ #elif BUILDFLAG(IS_FREEBSD)
+- int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
+- absl::optional<std::string> bin_dir = StringSysctl(name, std::size(name));
++ absl::optional<std::string> bin_dir = StringSysctl({ CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 });
+ if (!bin_dir.has_value() || bin_dir.value().length() <= 1) {
+ NOTREACHED() << "Unable to resolve path.";
+ return false;
+@@ -65,13 +69,65 @@ bool PathProviderPosix(int key, FilePath* result) {
+ *result = FilePath(bin_dir);
+ return true;
+ #elif BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_AIX)
+- // There is currently no way to get the executable path on OpenBSD
+- char* cpath;
+- if ((cpath = getenv("CHROME_EXE_PATH")) != NULL)
+- *result = FilePath(cpath);
+- else
+- *result = FilePath("/usr/local/chrome/chrome");
+- return true;
++ char *cpath;
++#if !BUILDFLAG(IS_AIX)
++ struct kinfo_file *files;
++ kvm_t *kd = NULL;
++ char errbuf[_POSIX2_LINE_MAX];
++ static char retval[PATH_MAX];
++ int cnt;
++ struct stat sb;
++ pid_t cpid = getpid();
++ bool ret = false;
++
++ const base::CommandLine* command_line =
++ base::CommandLine::ForCurrentProcess();
++
++ VLOG(1) << "PathProviderPosix argv: " << command_line->argv()[0];
++
++ if (realpath(command_line->argv()[0].c_str(), retval) == NULL)
++ goto out;
++
++ if (stat(command_line->argv()[0].c_str(), &sb) < 0)
++ goto out;
++
++ if (!command_line->HasSwitch("no-sandbox")) {
++ ret = true;
++ *result = FilePath(retval);
++ VLOG(1) << "PathProviderPosix (sandbox) result: " << retval;
++ goto out;
++ }
++
++ if ((kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf)) == NULL)
++ goto out;
++
++ if ((files = kvm_getfiles(kd, KERN_FILE_BYPID, cpid,
++ sizeof(struct kinfo_file), &cnt)) == NULL)
++ goto out;
++
++ for (int i = 0; i < cnt; i++) {
++ if (files[i].fd_fd == KERN_FILE_TEXT &&
++ files[i].va_fsid == static_cast<uint32_t>(sb.st_dev) &&
++ files[i].va_fileid == sb.st_ino) {
++ ret = true;
++ *result = FilePath(retval);
++ VLOG(1) << "PathProviderPosix result: " << retval;
++ }
++ }
++out:
++ if (kd)
++ kvm_close(kd);
++ if (!ret) {
++#endif
++ if ((cpath = getenv("CHROME_EXE_PATH")) != NULL)
++ *result = FilePath(cpath);
++ else
++ *result = FilePath("/usr/local/chrome/chrome");
++ return true;
++#if !BUILDFLAG(IS_AIX)
++ }
++ return ret;
++#endif
+ #endif
+ }
+ case DIR_SRC_TEST_DATA_ROOT: {
diff --git a/devel/electron28/files/patch-base_base__switches.cc b/devel/electron28/files/patch-base_base__switches.cc
new file mode 100644
index 000000000000..5d26ff50e6e1
--- /dev/null
+++ b/devel/electron28/files/patch-base_base__switches.cc
@@ -0,0 +1,11 @@
+--- base/base_switches.cc.orig 2023-10-19 19:57:58 UTC
++++ base/base_switches.cc
+@@ -180,7 +180,7 @@ const char kPackageVersionName[] = "package-version-na
+ const char kPackageVersionCode[] = "package-version-code";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1176772): Remove kEnableCrashpad and IsCrashpadEnabled() when
+ // Crashpad is fully enabled on Linux. Indicates that Crashpad should be
+ // enabled.
diff --git a/devel/electron28/files/patch-base_base__switches.h b/devel/electron28/files/patch-base_base__switches.h
new file mode 100644
index 000000000000..4f6dcb8e4895
--- /dev/null
+++ b/devel/electron28/files/patch-base_base__switches.h
@@ -0,0 +1,11 @@
+--- base/base_switches.h.orig 2023-10-19 19:57:58 UTC
++++ base/base_switches.h
+@@ -62,7 +62,7 @@ extern const char kPackageVersionName[];
+ extern const char kPackageVersionCode[];
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1176772): Remove kEnableCrashpad and IsCrashpadEnabled() when
+ // Crashpad is fully enabled on Linux.
+ extern const char kEnableCrashpad[];
diff --git a/devel/electron28/files/patch-base_compiler__specific.h b/devel/electron28/files/patch-base_compiler__specific.h
new file mode 100644
index 000000000000..e87dee7f14b7
--- /dev/null
+++ b/devel/electron28/files/patch-base_compiler__specific.h
@@ -0,0 +1,35 @@
+--- base/compiler_specific.h.orig 2023-05-25 00:41:37 UTC
++++ base/compiler_specific.h
+@@ -41,9 +41,9 @@
+ // Annotate a function indicating it should not be inlined.
+ // Use like:
+ // NOINLINE void DoStuff() { ... }
+-#if defined(__clang__) && HAS_ATTRIBUTE(noinline)
++#if defined(__clang__) && (__clang_major__ >= 15) && HAS_ATTRIBUTE(noinline)
+ #define NOINLINE [[clang::noinline]]
+-#elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(noinline)
++#elif (defined(COMPILER_GCC) || defined(__clang__)) && HAS_ATTRIBUTE(noinline)
+ #define NOINLINE __attribute__((noinline))
+ #elif defined(COMPILER_MSVC)
+ #define NOINLINE __declspec(noinline)
+@@ -51,9 +51,9 @@
+ #define NOINLINE
+ #endif
+
+-#if defined(__clang__) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline)
++#if defined(__clang__) && (__clang_major__ >= 15) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline)
+ #define ALWAYS_INLINE [[clang::always_inline]] inline
+-#elif defined(COMPILER_GCC) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline)
++#elif (defined(COMPILER_GCC) || defined(__clang__)) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline)
+ #define ALWAYS_INLINE inline __attribute__((__always_inline__))
+ #elif defined(COMPILER_MSVC) && defined(NDEBUG)
+ #define ALWAYS_INLINE __forceinline
+@@ -69,7 +69,7 @@
+ // prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h.
+ // Use like:
+ // NOT_TAIL_CALLED void FooBar();
+-#if defined(__clang__) && HAS_ATTRIBUTE(not_tail_called)
++#if defined(__clang__) && (__clang_major__ >= 15) && HAS_ATTRIBUTE(not_tail_called)
+ #define NOT_TAIL_CALLED [[clang::not_tail_called]]
+ #else
+ #define NOT_TAIL_CALLED
diff --git a/devel/electron28/files/patch-base_debug_debugger__posix.cc b/devel/electron28/files/patch-base_debug_debugger__posix.cc
new file mode 100644
index 000000000000..447811370c92
--- /dev/null
+++ b/devel/electron28/files/patch-base_debug_debugger__posix.cc
@@ -0,0 +1,68 @@
+--- base/debug/debugger_posix.cc.orig 2022-04-21 18:48:31 UTC
++++ base/debug/debugger_posix.cc
+@@ -35,6 +35,10 @@
+ #include <sys/sysctl.h>
+ #endif
+
++#if BUILDFLAG(IS_OPENBSD)
++#include <sys/proc.h>
++#endif
++
+ #if BUILDFLAG(IS_FREEBSD)
+ #include <sys/user.h>
+ #endif
+@@ -95,32 +99,51 @@ bool BeingDebugged() {
+
+ // Caution: struct kinfo_proc is marked __APPLE_API_UNSTABLE. The source and
+ // binary interfaces may change.
++#if BUILDFLAG(IS_OPENBSD)
++ struct kinfo_proc *info;
++ size_t info_size;
++#else
+ struct kinfo_proc info;
+ size_t info_size = sizeof(info);
++#endif
+
+ #if BUILDFLAG(IS_OPENBSD)
+ if (sysctl(mib, std::size(mib), NULL, &info_size, NULL, 0) < 0)
+ return -1;
+
+ mib[5] = (info_size / sizeof(struct kinfo_proc));
++ if ((info = reinterpret_cast<kinfo_proc*>(malloc(info_size))) == NULL) {
++ is_set = true;
++ being_debugged = false;
++ return being_debugged;
++ }
++
++ int sysctl_result = sysctl(mib, std::size(mib), info, &info_size, NULL, 0);
+ #endif
+
++#if !BUILDFLAG(IS_OPENBSD)
+ int sysctl_result = sysctl(mib, std::size(mib), &info, &info_size, NULL, 0);
++#endif
+ DCHECK_EQ(sysctl_result, 0);
+ if (sysctl_result != 0) {
+ is_set = true;
+ being_debugged = false;
+- return being_debugged;
++ goto out;
+ }
+
+ // This process is being debugged if the P_TRACED flag is set.
+ is_set = true;
+ #if BUILDFLAG(IS_FREEBSD)
+ being_debugged = (info.ki_flag & P_TRACED) != 0;
+-#elif BUILDFLAG(IS_BSD)
+- being_debugged = (info.p_flag & P_TRACED) != 0;
++#elif BUILDFLAG(IS_OPENBSD)
++ being_debugged = (info->p_psflags & PS_TRACED) != 0;
+ #else
+ being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
++#endif
++
++out:
++#if BUILDFLAG(IS_OPENBSD)
++ free(info);
+ #endif
+ return being_debugged;
+ }
diff --git a/devel/electron28/files/patch-base_debug_elf__reader.cc b/devel/electron28/files/patch-base_debug_elf__reader.cc
new file mode 100644
index 000000000000..7e75c80d06f3
--- /dev/null
+++ b/devel/electron28/files/patch-base_debug_elf__reader.cc
@@ -0,0 +1,18 @@
+--- base/debug/elf_reader.cc.orig 2023-10-19 19:57:58 UTC
++++ base/debug/elf_reader.cc
+@@ -78,6 +78,7 @@ size_t ReadElfBuildId(const void* elf_mapped_base,
+ bool found = false;
+ while (current_section < section_end) {
+ current_note = reinterpret_cast<const Nhdr*>(current_section);
++#if !BUILDFLAG(IS_BSD)
+ if (current_note->n_type == NT_GNU_BUILD_ID) {
+ StringPiece note_name(current_section + sizeof(Nhdr),
+ current_note->n_namesz);
+@@ -87,6 +88,7 @@ size_t ReadElfBuildId(const void* elf_mapped_base,
+ break;
+ }
+ }
++#endif
+
+ size_t section_size = bits::AlignUp(current_note->n_namesz, 4u) +
+ bits::AlignUp(current_note->n_descsz, 4u) +
diff --git a/devel/electron28/files/patch-base_debug_proc__maps__linux.cc b/devel/electron28/files/patch-base_debug_proc__maps__linux.cc
new file mode 100644
index 000000000000..4ed7cb701ed6
--- /dev/null
+++ b/devel/electron28/files/patch-base_debug_proc__maps__linux.cc
@@ -0,0 +1,11 @@
+--- base/debug/proc_maps_linux.cc.orig 2022-02-28 16:54:41 UTC
++++ base/debug/proc_maps_linux.cc
+@@ -13,7 +13,7 @@
+ #include "base/strings/string_split.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include <inttypes.h>
+ #endif
+
diff --git a/devel/electron28/files/patch-base_debug_stack__trace.cc b/devel/electron28/files/patch-base_debug_stack__trace.cc
new file mode 100644
index 000000000000..977f9c58bcc3
--- /dev/null
+++ b/devel/electron28/files/patch-base_debug_stack__trace.cc
@@ -0,0 +1,21 @@
+--- base/debug/stack_trace.cc.orig 2023-11-29 21:39:40 UTC
++++ base/debug/stack_trace.cc
+@@ -266,7 +266,9 @@ void StackTrace::OutputToStream(std::ostream* os) cons
+ }
+
+ void StackTrace::OutputToStream(std::ostream* os) const {
++#if !BUILDFLAG(IS_BSD)
+ OutputToStreamWithPrefix(os, nullptr);
++#endif
+ }
+
+ std::string StackTrace::ToString() const {
+@@ -274,7 +276,7 @@ std::string StackTrace::ToStringWithPrefix(const char*
+ }
+ std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
+ std::stringstream stream;
+-#if !defined(__UCLIBC__) && !defined(_AIX)
++#if !defined(__UCLIBC__) && !defined(_AIX) && !BUILDFLAG(IS_BSD)
+ OutputToStreamWithPrefix(&stream, prefix_string);
+ #endif
+ return stream.str();
diff --git a/devel/electron28/files/patch-base_debug_stack__trace__posix.cc b/devel/electron28/files/patch-base_debug_stack__trace__posix.cc
new file mode 100644
index 000000000000..b1659ed67d5f
--- /dev/null
+++ b/devel/electron28/files/patch-base_debug_stack__trace__posix.cc
@@ -0,0 +1,101 @@
+--- base/debug/stack_trace_posix.cc.orig 2023-11-29 21:39:40 UTC
++++ base/debug/stack_trace_posix.cc
+@@ -41,7 +41,7 @@
+ // execinfo.h and backtrace(3) are really only present in glibc and in macOS
+ // libc.
+ #if BUILDFLAG(IS_APPLE) || \
+- (defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__AIX))
++ (defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__AIX) && !BUILDFLAG(IS_BSD))
+ #define HAVE_BACKTRACE
+ #include <execinfo.h>
+ #endif
+@@ -59,8 +59,10 @@
+ #include <AvailabilityMacros.h>
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
++#if !BUILDFLAG(IS_BSD)
+ #include <sys/prctl.h>
++#endif
+
+ #include "base/debug/proc_maps_linux.h"
+ #endif
+@@ -302,7 +304,7 @@ void PrintToStderr(const char* output) {
+ std::ignore = HANDLE_EINTR(write(STDERR_FILENO, output, strlen(output)));
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void AlarmSignalHandler(int signal, siginfo_t* info, void* void_context) {
+ // We have seen rare cases on AMD linux where the default signal handler
+ // either does not run or a thread (Probably an AMD driver thread) prevents
+@@ -319,7 +321,11 @@ void AlarmSignalHandler(int signal, siginfo_t* info, v
+ "Warning: Default signal handler failed to terminate process.\n");
+ PrintToStderr("Calling exit_group() directly to prevent timeout.\n");
+ // See: https://man7.org/linux/man-pages/man2/exit_group.2.html
++#if BUILDFLAG(IS_BSD)
++ _exit(EXIT_FAILURE);
++#else
+ syscall(SYS_exit_group, EXIT_FAILURE);
++#endif
+ }
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) ||
+ // BUILDFLAG(IS_CHROMEOS)
+@@ -536,7 +542,7 @@ void StackDumpSignalHandler(int signal, siginfo_t* inf
+ _exit(EXIT_FAILURE);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Set an alarm to trigger in case the default handler does not terminate
+ // the process. See 'AlarmSignalHandler' for more details.
+ struct sigaction action;
+@@ -561,6 +567,7 @@ void StackDumpSignalHandler(int signal, siginfo_t* inf
+ // signals that do not re-raise autonomously), such as signals delivered via
+ // kill() and asynchronous hardware faults such as SEGV_MTEAERR, which would
+ // otherwise be lost when re-raising the signal via raise().
++#if !BUILDFLAG(IS_BSD)
+ long retval = syscall(SYS_rt_tgsigqueueinfo, getpid(), syscall(SYS_gettid),
+ info->si_signo, info);
+ if (retval == 0) {
+@@ -575,6 +582,7 @@ void StackDumpSignalHandler(int signal, siginfo_t* inf
+ if (errno != EPERM) {
+ _exit(EXIT_FAILURE);
+ }
++#endif
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) ||
+ // BUILDFLAG(IS_CHROMEOS)
+
+@@ -764,6 +772,7 @@ class SandboxSymbolizeHelper {
+ return -1;
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ // This class is copied from
+ // third_party/crashpad/crashpad/util/linux/scoped_pr_set_dumpable.h.
+ // It aims at ensuring the process is dumpable before opening /proc/self/mem.
+@@ -856,11 +865,15 @@ class SandboxSymbolizeHelper {
+ r.base = cur_base;
+ }
+ }
++#endif
+
+ // Parses /proc/self/maps in order to compile a list of all object file names
+ // for the modules that are loaded in the current process.
+ // Returns true on success.
+ bool CacheMemoryRegions() {
++#if BUILDFLAG(IS_BSD)
++ return false;
++#else
+ // Reads /proc/self/maps.
+ std::string contents;
+ if (!ReadProcMaps(&contents)) {
+@@ -878,6 +891,7 @@ class SandboxSymbolizeHelper {
+
+ is_initialized_ = true;
+ return true;
++#endif
+ }
+
+ // Opens all object files and caches their file descriptors.
diff --git a/devel/electron28/files/patch-base_files_dir__reader__linux.h b/devel/electron28/files/patch-base_files_dir__reader__linux.h
new file mode 100644
index 000000000000..91bc1897532e
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_dir__reader__linux.h
@@ -0,0 +1,39 @@
+--- base/files/dir_reader_linux.h.orig 2022-08-31 12:19:35 UTC
++++ base/files/dir_reader_linux.h
+@@ -16,10 +16,16 @@
+ #include "base/logging.h"
+ #include "base/posix/eintr_wrapper.h"
+
++#include "build/build_config.h"
++
+ // See the comments in dir_reader_posix.h about this.
+
+ namespace base {
+
++#if BUILDFLAG(IS_BSD)
++#include <dirent.h>
++typedef struct dirent linux_dirent;
++#else
+ struct linux_dirent {
+ uint64_t d_ino;
+ int64_t d_off;
+@@ -27,6 +33,7 @@ struct linux_dirent {
+ unsigned char d_type;
+ char d_name[0];
+ };
++#endif
+
+ class DirReaderLinux {
+ public:
+@@ -61,7 +68,11 @@ class DirReaderLinux {
+ if (offset_ != size_)
+ return true;
+
++#if BUILDFLAG(IS_BSD)
++ const int r = getdents(fd_, reinterpret_cast<char *>(buf_), sizeof(buf_));
++#else
+ const long r = syscall(__NR_getdents64, fd_, buf_, sizeof(buf_));
++#endif
+ if (r == 0)
+ return false;
+ if (r < 0) {
diff --git a/devel/electron28/files/patch-base_files_dir__reader__posix.h b/devel/electron28/files/patch-base_files_dir__reader__posix.h
new file mode 100644
index 000000000000..2285fb726f8e
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_dir__reader__posix.h
@@ -0,0 +1,20 @@
+--- base/files/dir_reader_posix.h.orig 2022-06-17 14:20:10 UTC
++++ base/files/dir_reader_posix.h
+@@ -17,7 +17,7 @@
+ // seems worse than falling back to enumerating all file descriptors so we will
+ // probably never implement this on the Mac.
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "base/files/dir_reader_linux.h"
+ #else
+ #include "base/files/dir_reader_fallback.h"
+@@ -25,7 +25,7 @@
+
+ namespace base {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ typedef DirReaderLinux DirReaderPosix;
+ #else
+ typedef DirReaderFallback DirReaderPosix;
diff --git a/devel/electron28/files/patch-base_files_file__path__watcher.h b/devel/electron28/files/patch-base_files_file__path__watcher.h
new file mode 100644
index 000000000000..51a909087f0a
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__path__watcher.h
@@ -0,0 +1,11 @@
+--- base/files/file_path_watcher.h.orig 2023-02-01 18:43:07 UTC
++++ base/files/file_path_watcher.h
+@@ -59,7 +59,7 @@ class BASE_EXPORT FilePathWatcher {
+ Type type = Type::kNonRecursive;
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // The callback will return the full path to a changed file instead of
+ // the watched path supplied as |path| when Watch is called.
+ // So the full path can be different from the watched path when a folder is
diff --git a/devel/electron28/files/patch-base_files_file__path__watcher__bsd.cc b/devel/electron28/files/patch-base_files_file__path__watcher__bsd.cc
new file mode 100644
index 000000000000..5bac3095f9f0
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__path__watcher__bsd.cc
@@ -0,0 +1,57 @@
+--- base/files/file_path_watcher_bsd.cc.orig 2022-10-24 13:33:33 UTC
++++ base/files/file_path_watcher_bsd.cc
+@@ -0,0 +1,54 @@
++// Copyright 2021 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include <memory>
++
++#include "base/files/file_path_watcher.h"
++#include "base/files/file_path_watcher_kqueue.h"
++#include "base/memory/ptr_util.h"
++#include "build/build_config.h"
++
++namespace base {
++
++namespace {
++
++class FilePathWatcherImpl : public FilePathWatcher::PlatformDelegate {
++ public:
++ FilePathWatcherImpl() = default;
++ FilePathWatcherImpl(const FilePathWatcherImpl&) = delete;
++ FilePathWatcherImpl& operator=(const FilePathWatcherImpl&) = delete;
++ ~FilePathWatcherImpl() override = default;
++
++ bool Watch(const FilePath& path,
++ Type type,
++ const FilePathWatcher::Callback& callback) override {
++ DCHECK(!impl_.get());
++ if (type == Type::kRecursive) {
++ if (!FilePathWatcher::RecursiveWatchAvailable())
++ return false;
++ } else {
++ impl_ = std::make_unique<FilePathWatcherKQueue>();
++ }
++ DCHECK(impl_.get());
++ return impl_->Watch(path, type, callback);
++ }
++
++ void Cancel() override {
++ if (impl_.get())
++ impl_->Cancel();
++ set_cancelled();
++ }
++
++ private:
++ std::unique_ptr<PlatformDelegate> impl_;
++};
++
++} // namespace
++
++FilePathWatcher::FilePathWatcher() {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++ impl_ = std::make_unique<FilePathWatcherImpl>();
++}
++
++} // namespace base
diff --git a/devel/electron28/files/patch-base_files_file__path__watcher__kqueue.h b/devel/electron28/files/patch-base_files_file__path__watcher__kqueue.h
new file mode 100644
index 000000000000..821858b75711
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__path__watcher__kqueue.h
@@ -0,0 +1,10 @@
+--- base/files/file_path_watcher_kqueue.h.orig 2022-02-07 13:39:41 UTC
++++ base/files/file_path_watcher_kqueue.h
+@@ -5,6 +5,7 @@
+ #ifndef BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+ #define BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+
++#include <sys/time.h>
+ #include <sys/event.h>
+
+ #include <memory>
diff --git a/devel/electron28/files/patch-base_files_file__path__watcher__unittest.cc b/devel/electron28/files/patch-base_files_file__path__watcher__unittest.cc
new file mode 100644
index 000000000000..056794376d4c
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__path__watcher__unittest.cc
@@ -0,0 +1,29 @@
+--- base/files/file_path_watcher_unittest.cc.orig 2023-11-29 21:39:40 UTC
++++ base/files/file_path_watcher_unittest.cc
+@@ -703,7 +703,7 @@ TEST_F(FilePathWatcherTest, WatchDirectory) {
+ }
+ delegate.RunUntilEventsMatch(event_expecter);
+
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && BUILDFLAG(IS_BSD)
+ ASSERT_TRUE(WriteFile(file1, "content v2"));
+ // Mac implementation does not detect files modified in a directory.
+ // TODO(https://crbug.com/1432064): Expect that no events are fired on Mac.
+@@ -1639,7 +1639,7 @@ enum Permission { Read, Write, Execute };
+
+ enum Permission { Read, Write, Execute };
+
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ bool ChangeFilePermissions(const FilePath& path, Permission perm, bool allow) {
+ struct stat stat_buf;
+
+@@ -1673,7 +1673,7 @@ bool ChangeFilePermissions(const FilePath& path, Permi
+
+ } // namespace
+
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) && BUILDFLAG(IS_BSD)
+ // Linux implementation of FilePathWatcher doesn't catch attribute changes.
+ // http://crbug.com/78043
+ // Windows implementation of FilePathWatcher catches attribute changes that
diff --git a/devel/electron28/files/patch-base_files_file__util__posix.cc b/devel/electron28/files/patch-base_files_file__util__posix.cc
new file mode 100644
index 000000000000..131be37e33a4
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__util__posix.cc
@@ -0,0 +1,53 @@
+--- base/files/file_util_posix.cc.orig 2023-11-29 21:39:40 UTC
++++ base/files/file_util_posix.cc
+@@ -756,33 +756,34 @@ bool CreateDirectoryAndGetError(const FilePath& full_p
+ File::Error* error) {
+ ScopedBlockingCall scoped_blocking_call(
+ FROM_HERE, BlockingType::MAY_BLOCK); // For call to mkdir().
++ const FilePath kFileSystemRoot("/");
+ std::vector<FilePath> subpaths;
+
+ // Collect a list of all parent directories.
+ FilePath last_path = full_path;
+- subpaths.push_back(full_path);
++ if (full_path != kFileSystemRoot)
++ subpaths.push_back(full_path);
+ for (FilePath path = full_path.DirName();
+- path.value() != last_path.value(); path = path.DirName()) {
++ (path.value() != last_path.value() &&
++ (path != kFileSystemRoot)); path = path.DirName()) {
+ subpaths.push_back(path);
+ last_path = path;
+ }
+
+ // Iterate through the parents and create the missing ones.
+ for (const FilePath& subpath : base::Reversed(subpaths)) {
+- if (DirectoryExists(subpath))
+- continue;
+- if (mkdir(subpath.value().c_str(), 0700) == 0)
+- continue;
+- // Mkdir failed, but it might have failed with EEXIST, or some other error
+- // due to the directory appearing out of thin air. This can occur if
+- // two processes are trying to create the same file system tree at the same
+- // time. Check to see if it exists and make sure it is a directory.
+- int saved_errno = errno;
+- if (!DirectoryExists(subpath)) {
+- if (error)
+- *error = File::OSErrorToFileError(saved_errno);
+- errno = saved_errno;
+- return false;
++ if (!PathExists(subpath)) {
++ if ((mkdir(subpath.value().c_str(), 0700) == -1) &&
++ ((full_path != subpath) ? (errno != ENOENT) : (-1))) {
++ int saved_errno = errno;
++ if (error)
++ *error = File::OSErrorToFileError(saved_errno);
++ return false;
++ }
++ } else if (!DirectoryExists(subpath)) {
++ if (error)
++ *error = File::OSErrorToFileError(ENOTDIR);
++ return false;
+ }
+ }
+ return true;
diff --git a/devel/electron28/files/patch-base_files_file__util__unittest.cc b/devel/electron28/files/patch-base_files_file__util__unittest.cc
new file mode 100644
index 000000000000..b6a2ac734ecc
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_file__util__unittest.cc
@@ -0,0 +1,20 @@
+--- base/files/file_util_unittest.cc.orig 2023-11-29 21:39:40 UTC
++++ base/files/file_util_unittest.cc
+@@ -3878,7 +3878,7 @@ TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
+ }
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ TEST_F(FileUtilTest, ReadFileToStringWithProcFileSystem) {
+ FilePath file_path("/proc/cpuinfo");
+ std::string data = "temp";
+@@ -4601,7 +4601,7 @@ TEST(FileUtilMultiThreadedTest, MultiThreadedTempFiles
+ NULL);
+ #else
+ size_t bytes_written =
+- ::write(::fileno(output_file.get()), content.c_str(), content.length());
++ ::write(fileno(output_file.get()), content.c_str(), content.length());
+ #endif
+ EXPECT_EQ(content.length(), bytes_written);
+ ::fflush(output_file.get());
diff --git a/devel/electron28/files/patch-base_files_important__file__writer__cleaner.cc b/devel/electron28/files/patch-base_files_important__file__writer__cleaner.cc
new file mode 100644
index 000000000000..80f08d51a819
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_important__file__writer__cleaner.cc
@@ -0,0 +1,12 @@
+--- base/files/important_file_writer_cleaner.cc.orig 2022-02-28 16:54:41 UTC
++++ base/files/important_file_writer_cleaner.cc
+@@ -25,7 +25,8 @@ namespace base {
+ namespace {
+
+ base::Time GetUpperBoundTime() {
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
++// needed because of .CreationTime() pledge
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // If process creation time is not available then use instance creation
+ // time as the upper-bound for old files. Modification times may be
+ // rounded-down to coarse-grained increments, e.g. FAT has 2s granularity,
diff --git a/devel/electron28/files/patch-base_files_scoped__file.cc b/devel/electron28/files/patch-base_files_scoped__file.cc
new file mode 100644
index 000000000000..350c73cc76e7
--- /dev/null
+++ b/devel/electron28/files/patch-base_files_scoped__file.cc
@@ -0,0 +1,11 @@
+--- base/files/scoped_file.cc.orig 2022-02-28 16:54:41 UTC
++++ base/files/scoped_file.cc
+@@ -31,7 +31,7 @@ void ScopedFDCloseTraits::Free(int fd) {
+ int ret = IGNORE_EINTR(close(fd));
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
+- BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // NB: Some file descriptors can return errors from close() e.g. network
+ // filesystems such as NFS and Linux input devices. On Linux, macOS, and
+ // Fuchsia's POSIX layer, errors from close other than EBADF do not indicate
diff --git a/devel/electron28/files/patch-base_functional_unretained__traits.h b/devel/electron28/files/patch-base_functional_unretained__traits.h
new file mode 100644
index 000000000000..75006c20500d
--- /dev/null
+++ b/devel/electron28/files/patch-base_functional_unretained__traits.h
@@ -0,0 +1,11 @@
+--- base/functional/unretained_traits.h.orig 2023-02-01 18:43:07 UTC
++++ base/functional/unretained_traits.h
+@@ -130,7 +130,7 @@ struct TypeSupportsUnretained {
+ // official builds, and then in non-test code as well.
+ #if !defined(UNIT_TEST) && !defined(OFFICIAL_BUILD)
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \
+- defined(FORCE_UNRETAINED_COMPLETENESS_CHECKS_FOR_TESTS)
++ || BUILDFLAGS(IS_BSD) || defined(FORCE_UNRETAINED_COMPLETENESS_CHECKS_FOR_TESTS)
+ static_assert(IsCompleteTypeV<T> ||
+ IsIncompleteTypeSafeForUnretained<std::remove_cv_t<T>>,
+ "T must be fully defined.");
diff --git a/devel/electron28/files/patch-base_i18n_icu__util.cc b/devel/electron28/files/patch-base_i18n_icu__util.cc
new file mode 100644
index 000000000000..eb80767b9855
--- /dev/null
+++ b/devel/electron28/files/patch-base_i18n_icu__util.cc
@@ -0,0 +1,20 @@
+--- base/i18n/icu_util.cc.orig 2023-10-19 19:57:58 UTC
++++ base/i18n/icu_util.cc
+@@ -51,7 +51,7 @@
+ #include "third_party/icu/source/common/unicode/unistr.h"
+ #endif
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || \
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
+ #include "third_party/icu/source/i18n/unicode/timezone.h"
+ #endif
+@@ -345,7 +345,7 @@ void InitializeIcuTimeZone() {
+ FuchsiaIntlProfileWatcher::GetPrimaryTimeZoneIdForIcuInitialization();
+ icu::TimeZone::adoptDefault(
+ icu::TimeZone::createTimeZone(icu::UnicodeString::fromUTF8(zone_id)));
+-#elif BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#elif BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || BUILDFLAG(IS_BSD)
+ // To respond to the time zone change properly, the default time zone
+ // cache in ICU has to be populated on starting up.
+ // See TimeZoneMonitorLinux::NotifyClientsFromImpl().
diff --git a/devel/electron28/files/patch-base_linux__util.cc b/devel/electron28/files/patch-base_linux__util.cc
new file mode 100644
index 000000000000..312e33795abe
--- /dev/null
+++ b/devel/electron28/files/patch-base_linux__util.cc
@@ -0,0 +1,25 @@
+--- base/linux_util.cc.orig 2023-11-29 21:39:40 UTC
++++ base/linux_util.cc
+@@ -15,6 +15,7 @@
+
+ #include <iomanip>
+ #include <memory>
++#include <sstream>
+
+ #include "base/base_export.h"
+ #include "base/files/dir_reader_posix.h"
+@@ -153,10 +154,14 @@ bool GetThreadsForProcess(pid_t pid, std::vector<pid_t
+ }
+
+ bool GetThreadsForProcess(pid_t pid, std::vector<pid_t>* tids) {
++#if BUILDFLAG(IS_BSD)
++ return false;
++#else
+ // 25 > strlen("/proc//task") + strlen(std::to_string(INT_MAX)) + 1 = 22
+ char buf[25];
+ strings::SafeSPrintf(buf, "/proc/%d/task", pid);
+ return GetThreadsFromProcessDir(buf, tids);
++#endif
+ }
+
+ bool GetThreadsForCurrentProcess(std::vector<pid_t>* tids) {
diff --git a/devel/electron28/files/patch-base_logging__unittest.cc b/devel/electron28/files/patch-base_logging__unittest.cc
new file mode 100644
index 000000000000..46ed9c5c2a22
--- /dev/null
+++ b/devel/electron28/files/patch-base_logging__unittest.cc
@@ -0,0 +1,31 @@
+--- base/logging_unittest.cc.orig 2023-02-01 18:43:07 UTC
++++ base/logging_unittest.cc
+@@ -32,7 +32,7 @@
+ #include "base/posix/eintr_wrapper.h"
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FREEBSD)
+ #include <ucontext.h>
+ #endif
+
+@@ -575,14 +575,18 @@ void CheckCrashTestSighandler(int, siginfo_t* info, vo
+ // need the arch-specific boilerplate below, which is inspired by breakpad.
+ // At the same time, on OSX, ucontext.h is deprecated but si_addr works fine.
+ uintptr_t crash_addr = 0;
+-#if BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FREEBSD)
+ crash_addr = reinterpret_cast<uintptr_t>(info->si_addr);
+ #else // OS_*
+ ucontext_t* context = reinterpret_cast<ucontext_t*>(context_ptr);
+ #if defined(ARCH_CPU_X86)
+ crash_addr = static_cast<uintptr_t>(context->uc_mcontext.gregs[REG_EIP]);
+ #elif defined(ARCH_CPU_X86_64)
++#if BUILDFLAG(IS_OPENBSD)
++ crash_addr = static_cast<uintptr_t>(context->sc_rip);
++#else
+ crash_addr = static_cast<uintptr_t>(context->uc_mcontext.gregs[REG_RIP]);
++#endif
+ #elif defined(ARCH_CPU_ARMEL)
+ crash_addr = static_cast<uintptr_t>(context->uc_mcontext.arm_pc);
+ #elif defined(ARCH_CPU_ARM64)
diff --git a/devel/electron28/files/patch-base_memory_discardable__memory.cc b/devel/electron28/files/patch-base_memory_discardable__memory.cc
new file mode 100644
index 000000000000..bd043476fc97
--- /dev/null
+++ b/devel/electron28/files/patch-base_memory_discardable__memory.cc
@@ -0,0 +1,38 @@
+--- base/memory/discardable_memory.cc.orig 2022-11-30 08:12:58 UTC
++++ base/memory/discardable_memory.cc
+@@ -26,7 +26,7 @@ BASE_FEATURE(kMadvFreeDiscardableMemory,
+ base::FEATURE_DISABLED_BY_DEFAULT);
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kDiscardableMemoryBackingTrial,
+ "DiscardableMemoryBackingTrial",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+@@ -52,7 +52,7 @@ const base::FeatureParam<DiscardableMemoryTrialGroup>
+
+ namespace {
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ DiscardableMemoryBacking GetBackingForFieldTrial() {
+ DiscardableMemoryTrialGroup trial_group =
+@@ -71,7 +71,7 @@ DiscardableMemoryBacking GetBackingForFieldTrial() {
+
+ } // namespace
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ // Probe capabilities of this device to determine whether we should participate
+ // in the discardable memory backing trial.
+@@ -101,7 +101,7 @@ DiscardableMemory::DiscardableMemory() = default;
+ DiscardableMemory::~DiscardableMemory() = default;
+
+ DiscardableMemoryBacking GetDiscardableMemoryBacking() {
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (DiscardableMemoryBackingFieldTrialIsEnabled()) {
+ return GetBackingForFieldTrial();
+ }
diff --git a/devel/electron28/files/patch-base_memory_discardable__memory__internal.h b/devel/electron28/files/patch-base_memory_discardable__memory__internal.h
new file mode 100644
index 000000000000..13bef7210432
--- /dev/null
+++ b/devel/electron28/files/patch-base_memory_discardable__memory__internal.h
@@ -0,0 +1,11 @@
+--- base/memory/discardable_memory_internal.h.orig 2022-02-28 16:54:41 UTC
++++ base/memory/discardable_memory_internal.h
+@@ -10,7 +10,7 @@
+ #include "base/metrics/field_trial_params.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ namespace base {
+
diff --git a/devel/electron28/files/patch-base_memory_madv__free__discardable__memory__posix.cc b/devel/electron28/files/patch-base_memory_madv__free__discardable__memory__posix.cc
new file mode 100644
index 000000000000..eab961b93ef3
--- /dev/null
+++ b/devel/electron28/files/patch-base_memory_madv__free__discardable__memory__posix.cc
@@ -0,0 +1,21 @@
+--- base/memory/madv_free_discardable_memory_posix.cc.orig 2023-05-25 00:41:38 UTC
++++ base/memory/madv_free_discardable_memory_posix.cc
+@@ -306,6 +306,10 @@ void MadvFreeDiscardableMemoryPosix::SetKeepMemoryForT
+
+ bool MadvFreeDiscardableMemoryPosix::IsResident() const {
+ DFAKE_SCOPED_RECURSIVE_LOCK(thread_collision_warner_);
++// XXX mincore
++#if BUILDFLAG(IS_BSD)
++ return false;
++#else
+ #if BUILDFLAG(IS_APPLE)
+ std::vector<char> vec(allocated_pages_);
+ #else
+@@ -321,6 +325,7 @@ bool MadvFreeDiscardableMemoryPosix::IsResident() cons
+ return false;
+ }
+ return true;
++#endif
+ }
+
+ bool MadvFreeDiscardableMemoryPosix::IsDiscarded() const {
diff --git a/devel/electron28/files/patch-base_memory_platform__shared__memory__region.h b/devel/electron28/files/patch-base_memory_platform__shared__memory__region.h
new file mode 100644
index 000000000000..a9ddfa6dd2df
--- /dev/null
+++ b/devel/electron28/files/patch-base_memory_platform__shared__memory__region.h
@@ -0,0 +1,29 @@
+--- base/memory/platform_shared_memory_region.h.orig 2023-08-10 01:48:30 UTC
++++ base/memory/platform_shared_memory_region.h
+@@ -16,7 +16,7 @@
+
+ #include <stdint.h>
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ namespace content {
+ class SandboxIPCHandler;
+ }
+@@ -83,7 +83,7 @@ class BASE_EXPORT PlatformSharedMemoryRegion {
+ kMaxValue = GET_SHMEM_TEMP_DIR_FAILURE
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Structure to limit access to executable region creation.
+ struct ExecutableRegion {
+ private:
+@@ -215,7 +215,7 @@ class BASE_EXPORT PlatformSharedMemoryRegion {
+ CheckPlatformHandlePermissionsCorrespondToMode);
+ static PlatformSharedMemoryRegion Create(Mode mode,
+ size_t size
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ bool executable = false
+ #endif
diff --git a/devel/electron28/files/patch-base_memory_platform__shared__memory__region__posix.cc b/devel/electron28/files/patch-base_memory_platform__shared__memory__region__posix.cc
new file mode 100644
index 000000000000..fc212fadf786
--- /dev/null
+++ b/devel/electron28/files/patch-base_memory_platform__shared__memory__region__posix.cc
@@ -0,0 +1,29 @@
+--- base/memory/platform_shared_memory_region_posix.cc.orig 2023-02-01 18:43:07 UTC
++++ base/memory/platform_shared_memory_region_posix.cc
+@@ -55,7 +55,7 @@ bool CheckFDAccessMode(int fd, int expected_mode) {
+
+ } // namespace
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // static
+ ScopedFD PlatformSharedMemoryRegion::ExecutableRegion::CreateFD(size_t size) {
+ PlatformSharedMemoryRegion region =
+@@ -168,7 +168,7 @@ bool PlatformSharedMemoryRegion::ConvertToUnsafe() {
+ // static
+ PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Create(Mode mode,
+ size_t size
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ bool executable
+ #endif
+@@ -197,7 +197,7 @@ PlatformSharedMemoryRegion PlatformSharedMemoryRegion:
+ // flag.
+ FilePath directory;
+ if (!GetShmemTempDir(
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ executable,
+ #else
+ false /* executable */,
diff --git a/devel/electron28/files/patch-base_message__loop_message__pump__glib.cc b/devel/electron28/files/patch-base_message__loop_message__pump__glib.cc
new file mode 100644
index 000000000000..6734d01e8bf0
--- /dev/null
+++ b/devel/electron28/files/patch-base_message__loop_message__pump__glib.cc
@@ -0,0 +1,28 @@
+--- base/message_loop/message_pump_glib.cc.orig 2022-08-31 12:19:35 UTC
++++ base/message_loop/message_pump_glib.cc
+@@ -8,6 +8,11 @@
+ #include <glib.h>
+ #include <math.h>
+
++#if BUILDFLAG(IS_BSD)
++#include <pthread.h>
++#include <pthread_np.h>
++#endif
++
+ #include "base/logging.h"
+ #include "base/memory/raw_ptr.h"
+ #include "base/notreached.h"
+@@ -51,9 +56,13 @@ int GetTimeIntervalMilliseconds(TimeTicks next_task_ti
+ }
+
+ bool RunningOnMainThread() {
++#if BUILDFLAG(IS_BSD)
++ return pthread_main_np();
++#else
+ auto pid = getpid();
+ auto tid = PlatformThread::CurrentId();
+ return pid > 0 && tid > 0 && pid == tid;
++#endif
+ }
+
+ // A brief refresher on GLib:
diff --git a/devel/electron28/files/patch-base_native__library__posix.cc b/devel/electron28/files/patch-base_native__library__posix.cc
new file mode 100644
index 000000000000..c2b8d0e5e970
--- /dev/null
+++ b/devel/electron28/files/patch-base_native__library__posix.cc
@@ -0,0 +1,11 @@
+--- base/native_library_posix.cc.orig 2022-05-19 14:06:27 UTC
++++ base/native_library_posix.cc
+@@ -33,7 +33,7 @@ NativeLibrary LoadNativeLibraryWithOptions(const FileP
+ // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892,
+ // and http://crbug.com/40794.
+ int flags = RTLD_LAZY;
+-#if BUILDFLAG(IS_ANDROID) || !defined(RTLD_DEEPBIND)
++#if BUILDFLAG(IS_ANDROID) || !defined(RTLD_DEEPBIND) || BUILDFLAG(IS_BSD)
+ // Certain platforms don't define RTLD_DEEPBIND. Android dlopen() requires
+ // further investigation, as it might vary across versions. Crash here to
+ // warn developers that they're trying to rely on uncertain behavior.
diff --git a/devel/electron28/files/patch-base_native__library__unittest.cc b/devel/electron28/files/patch-base_native__library__unittest.cc
new file mode 100644
index 000000000000..ef6934877037
--- /dev/null
+++ b/devel/electron28/files/patch-base_native__library__unittest.cc
@@ -0,0 +1,11 @@
+--- base/native_library_unittest.cc.orig 2022-10-24 13:33:33 UTC
++++ base/native_library_unittest.cc
+@@ -134,7 +134,7 @@ TEST(NativeLibraryTest, LoadLibrary) {
+ // versions with respect to symbol resolution scope.
+ // TSan and MSan error out on RTLD_DEEPBIND, https://crbug.com/705255
+ #if !BUILDFLAG(IS_ANDROID) && !defined(THREAD_SANITIZER) && \
+- !defined(MEMORY_SANITIZER)
++ !defined(MEMORY_SANITIZER) && !BUILDFLAG(IS_BSD)
+
+ // Verifies that the |prefer_own_symbols| option satisfies its guarantee that
+ // a loaded library will always prefer local symbol resolution before
diff --git a/devel/electron28/files/patch-base_posix_can__lower__nice__to.cc b/devel/electron28/files/patch-base_posix_can__lower__nice__to.cc
new file mode 100644
index 000000000000..67a5d35808ae
--- /dev/null
+++ b/devel/electron28/files/patch-base_posix_can__lower__nice__to.cc
@@ -0,0 +1,16 @@
+--- base/posix/can_lower_nice_to.cc.orig 2022-02-28 16:54:41 UTC
++++ base/posix/can_lower_nice_to.cc
+@@ -11,8 +11,12 @@
+
+ #include "build/build_config.h"
+
++#if BUILDFLAG(IS_FREEBSD)
++#include <sys/param.h>
++#endif
++
+ // Not defined on AIX by default.
+-#if BUILDFLAG(IS_AIX)
++#if BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ #if defined(RLIMIT_NICE)
+ #error Assumption about OS_AIX is incorrect
+ #endif
diff --git a/devel/electron28/files/patch-base_posix_sysctl.cc b/devel/electron28/files/patch-base_posix_sysctl.cc
new file mode 100644
index 000000000000..7599323d6f5b
--- /dev/null
+++ b/devel/electron28/files/patch-base_posix_sysctl.cc
@@ -0,0 +1,10 @@
+--- base/posix/sysctl.cc.orig 2023-11-29 21:39:40 UTC
++++ base/posix/sysctl.cc
+@@ -4,6 +4,7 @@
+
+ #include "base/posix/sysctl.h"
+
++#include <sys/types.h>
+ #include <sys/sysctl.h>
+
+ #include <initializer_list>
diff --git a/devel/electron28/files/patch-base_posix_unix__domain__socket.cc b/devel/electron28/files/patch-base_posix_unix__domain__socket.cc
new file mode 100644
index 000000000000..1ae00278ecd3
--- /dev/null
+++ b/devel/electron28/files/patch-base_posix_unix__domain__socket.cc
@@ -0,0 +1,39 @@
+--- base/posix/unix_domain_socket.cc.orig 2022-08-31 12:19:35 UTC
++++ base/posix/unix_domain_socket.cc
+@@ -51,7 +51,7 @@ bool CreateSocketPair(ScopedFD* one, ScopedFD* two) {
+
+ // static
+ bool UnixDomainSocket::EnableReceiveProcessId(int fd) {
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ const int enable = 1;
+ return setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable)) == 0;
+ #else
+@@ -149,7 +149,7 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+
+ const size_t kControlBufferSize =
+ CMSG_SPACE(sizeof(int) * kMaxFileDescriptors)
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ // macOS does not support ucred.
+ // macOS supports xucred, but this structure is insufficient.
+ + CMSG_SPACE(sizeof(struct ucred))
+@@ -177,7 +177,7 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ wire_fds = reinterpret_cast<int*>(CMSG_DATA(cmsg));
+ wire_fds_len = payload_len / sizeof(int);
+ }
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ // macOS does not support SCM_CREDENTIALS.
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_CREDENTIALS) {
+@@ -211,6 +211,9 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ socklen_t pid_size = sizeof(pid);
+ if (getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &pid, &pid_size) != 0)
+ pid = -1;
++#elif BUILDFLAG(IS_BSD)
++ NOTIMPLEMENTED();
++ pid = -1;
+ #else
+ // |pid| will legitimately be -1 if we read EOF, so only DCHECK if we
+ // actually received a message. Unfortunately, Linux allows sending zero
diff --git a/devel/electron28/files/patch-base_posix_unix__domain__socket__unittest.cc b/devel/electron28/files/patch-base_posix_unix__domain__socket__unittest.cc
new file mode 100644
index 000000000000..69118fd94c29
--- /dev/null
+++ b/devel/electron28/files/patch-base_posix_unix__domain__socket__unittest.cc
@@ -0,0 +1,11 @@
+--- base/posix/unix_domain_socket_unittest.cc.orig 2023-03-30 00:33:38 UTC
++++ base/posix/unix_domain_socket_unittest.cc
+@@ -10,6 +10,8 @@
+ #include <sys/types.h>
+ #include <unistd.h>
+
++#include <signal.h>
++
+ #include "base/files/file_util.h"
+ #include "base/files/scoped_file.h"
+ #include "base/functional/bind.h"
diff --git a/devel/electron28/files/patch-base_process_kill.h b/devel/electron28/files/patch-base_process_kill.h
new file mode 100644
index 000000000000..1463ba9ed811
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_kill.h
@@ -0,0 +1,11 @@
+--- base/process/kill.h.orig 2022-05-19 14:06:27 UTC
++++ base/process/kill.h
+@@ -113,7 +113,7 @@ BASE_EXPORT TerminationStatus GetTerminationStatus(Pro
+ BASE_EXPORT TerminationStatus GetKnownDeadTerminationStatus(
+ ProcessHandle handle, int* exit_code);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Spawns a thread to wait asynchronously for the child |process| to exit
+ // and then reaps it.
+ BASE_EXPORT void EnsureProcessGetsReaped(Process process);
diff --git a/devel/electron28/files/patch-base_process_kill__posix.cc b/devel/electron28/files/patch-base_process_kill__posix.cc
new file mode 100644
index 000000000000..b197dc3675c5
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_kill__posix.cc
@@ -0,0 +1,11 @@
+--- base/process/kill_posix.cc.orig 2023-03-30 00:33:38 UTC
++++ base/process/kill_posix.cc
+@@ -157,7 +157,7 @@ void EnsureProcessTerminated(Process process) {
+ 0, new BackgroundReaper(std::move(process), Seconds(2)));
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void EnsureProcessGetsReaped(Process process) {
+ DCHECK(!process.is_current());
+
diff --git a/devel/electron28/files/patch-base_process_launch.h b/devel/electron28/files/patch-base_process_launch.h
new file mode 100644
index 000000000000..7357acf2f254
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_launch.h
@@ -0,0 +1,11 @@
+--- base/process/launch.h.orig 2023-05-25 00:41:38 UTC
++++ base/process/launch.h
+@@ -200,7 +200,7 @@ struct BASE_EXPORT LaunchOptions {
+ bool clear_environment = false;
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // If non-zero, start the process using clone(), using flags as provided.
+ // Unlike in clone, clone_flags may not contain a custom termination signal
+ // that is sent to the parent when the child dies. The termination signal will
diff --git a/devel/electron28/files/patch-base_process_launch__posix.cc b/devel/electron28/files/patch-base_process_launch__posix.cc
new file mode 100644
index 000000000000..656ff7be03d3
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_launch__posix.cc
@@ -0,0 +1,12 @@
+--- base/process/launch_posix.cc.orig 2022-08-31 12:19:35 UTC
++++ base/process/launch_posix.cc
+@@ -64,6 +64,9 @@
+ #error "macOS should use launch_mac.cc"
+ #endif
+
++#if defined(OS_FREEBSD)
++#pragma weak environ
++#endif
+ extern char** environ;
+
+ namespace base {
diff --git a/devel/electron28/files/patch-base_process_memory__linux.cc b/devel/electron28/files/patch-base_process_memory__linux.cc
new file mode 100644
index 000000000000..7953b4340aa9
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_memory__linux.cc
@@ -0,0 +1,44 @@
+--- base/process/memory_linux.cc.orig 2023-02-01 18:43:07 UTC
++++ base/process/memory_linux.cc
+@@ -20,6 +20,7 @@
+
+ namespace base {
+
++#if !BUILDFLAG(IS_BSD)
+ namespace {
+
+ void ReleaseReservationOrTerminate() {
+@@ -29,12 +30,14 @@ void ReleaseReservationOrTerminate() {
+ }
+
+ } // namespace
++#endif
+
+ void EnableTerminationOnHeapCorruption() {
+ // On Linux, there nothing to do AFAIK.
+ }
+
+ void EnableTerminationOnOutOfMemory() {
++#if !BUILDFLAG(IS_BSD)
+ // Set the new-out of memory handler.
+ std::set_new_handler(&ReleaseReservationOrTerminate);
+ // If we're using glibc's allocator, the above functions will override
+@@ -43,8 +46,10 @@ void EnableTerminationOnOutOfMemory() {
+ #if BUILDFLAG(USE_ALLOCATOR_SHIM)
+ allocator_shim::SetCallNewHandlerOnMallocFailure(true);
+ #endif
++#endif
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ // ScopedAllowBlocking() has private constructor and it can only be used in
+ // friend classes/functions. Declaring a class is easier in this situation to
+ // avoid adding more dependency to thread_restrictions.h because of the
+@@ -104,6 +109,7 @@ bool AdjustOOMScoreHelper::AdjustOOMScore(ProcessId pr
+ bool AdjustOOMScore(ProcessId process, int score) {
+ return AdjustOOMScoreHelper::AdjustOOMScore(process, score);
+ }
++#endif
+
+ bool UncheckedMalloc(size_t size, void** result) {
+ #if BUILDFLAG(USE_ALLOCATOR_SHIM)
diff --git a/devel/electron28/files/patch-base_process_process__handle.cc b/devel/electron28/files/patch-base_process_process__handle.cc
new file mode 100644
index 000000000000..efb95e7c3b54
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__handle.cc
@@ -0,0 +1,11 @@
+--- base/process/process_handle.cc.orig 2022-02-28 16:54:41 UTC
++++ base/process/process_handle.cc
+@@ -30,7 +30,7 @@ UniqueProcId GetUniqueIdForProcess() {
+ : UniqueProcId(GetCurrentProcId());
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+
+ void InitUniqueIdForProcessInPidNamespace(ProcessId pid_outside_of_namespace) {
+ DCHECK(pid_outside_of_namespace != kNullProcessId);
diff --git a/devel/electron28/files/patch-base_process_process__handle.h b/devel/electron28/files/patch-base_process_process__handle.h
new file mode 100644
index 000000000000..5e25e86d099c
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__handle.h
@@ -0,0 +1,11 @@
+--- base/process/process_handle.h.orig 2022-02-28 16:54:41 UTC
++++ base/process/process_handle.h
+@@ -106,7 +106,7 @@ BASE_EXPORT ProcessId GetCurrentProcId();
+ // processes may be reused.
+ BASE_EXPORT UniqueProcId GetUniqueIdForProcess();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // When a process is started in a different PID namespace from the browser
+ // process, this function must be called with the process's PID in the browser's
+ // PID namespace in order to initialize its unique ID. Not thread safe.
diff --git a/devel/electron28/files/patch-base_process_process__handle__freebsd.cc b/devel/electron28/files/patch-base_process_process__handle__freebsd.cc
new file mode 100644
index 000000000000..bbf2632fedac
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__handle__freebsd.cc
@@ -0,0 +1,25 @@
+--- base/process/process_handle_freebsd.cc.orig 2023-11-29 21:39:40 UTC
++++ base/process/process_handle_freebsd.cc
+@@ -3,6 +3,7 @@
+ // found in the LICENSE file.
+
+ #include "base/process/process_handle.h"
++#include "base/files/file_util.h"
+
+ #include <limits.h>
+ #include <stddef.h>
+@@ -19,10 +20,13 @@ ProcessId GetParentProcessId(ProcessHandle process) {
+
+ ProcessId GetParentProcessId(ProcessHandle process) {
+ struct kinfo_proc info;
+- size_t length;
++ size_t length = sizeof(struct kinfo_proc);
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process };
+
+ if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
++ return -1;
++
++ if (length < sizeof(struct kinfo_proc))
+ return -1;
+
+ return info.ki_ppid;
diff --git a/devel/electron28/files/patch-base_process_process__handle__openbsd.cc b/devel/electron28/files/patch-base_process_process__handle__openbsd.cc
new file mode 100644
index 000000000000..f8e318565de3
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__handle__openbsd.cc
@@ -0,0 +1,89 @@
+--- base/process/process_handle_openbsd.cc.orig 2022-04-21 18:48:31 UTC
++++ base/process/process_handle_openbsd.cc
+@@ -3,8 +3,11 @@
+ // found in the LICENSE file.
+
+ #include "base/process/process_handle.h"
++#include "base/files/file_util.h"
+
+ #include <stddef.h>
++#include <sys/param.h>
++#include <sys/proc.h>
+ #include <sys/sysctl.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -12,39 +15,59 @@
+ namespace base {
+
+ ProcessId GetParentProcessId(ProcessHandle process) {
+- struct kinfo_proc info;
++ struct kinfo_proc *info;
+ size_t length;
++ pid_t ppid;
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process,
+ sizeof(struct kinfo_proc), 0 };
+
+ if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0)
+ return -1;
+
++ info = (struct kinfo_proc *)malloc(length);
++
+ mib[5] = (length / sizeof(struct kinfo_proc));
+
+- if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
+- return -1;
++ if (sysctl(mib, std::size(mib), info, &length, NULL, 0) < 0) {
++ ppid = -1;
++ goto out;
++ }
+
+- return info.p_ppid;
++ ppid = info->p_ppid;
++
++out:
++ free(info);
++ return ppid;
+ }
+
+ FilePath GetProcessExecutablePath(ProcessHandle process) {
+- struct kinfo_proc kp;
+- size_t len;
++ struct kinfo_proc *info;
++ size_t length;
++ char *path = NULL;
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process,
+ sizeof(struct kinfo_proc), 0 };
+
+- if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) == -1)
++ if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) == -1)
+ return FilePath();
+- mib[5] = (len / sizeof(struct kinfo_proc));
+- if (sysctl(mib, std::size(mib), &kp, &len, NULL, 0) < 0)
+- return FilePath();
+- if ((kp.p_flag & P_SYSTEM) != 0)
+- return FilePath();
+- if (strcmp(kp.p_comm, "chrome") == 0)
+- return FilePath(kp.p_comm);
+
+- return FilePath();
++ info = (struct kinfo_proc *)malloc(length);
++
++ mib[5] = (length / sizeof(struct kinfo_proc));
++
++ if (sysctl(mib, std::size(mib), info, &length, NULL, 0) < 0)
++ goto out;
++
++ if ((info->p_flag & P_SYSTEM) != 0)
++ goto out;
++
++ if (strcmp(info->p_comm, "chrome") == 0) {
++ path = info->p_comm;
++ goto out;
++ }
++
++out:
++ free(info);
++ return FilePath(path);
+ }
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_process_process__iterator__freebsd.cc b/devel/electron28/files/patch-base_process_process__iterator__freebsd.cc
new file mode 100644
index 000000000000..0b752cea1428
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__iterator__freebsd.cc
@@ -0,0 +1,51 @@
+--- base/process/process_iterator_freebsd.cc.orig 2023-03-30 00:33:38 UTC
++++ base/process/process_iterator_freebsd.cc
+@@ -18,7 +18,7 @@ namespace base {
+
+ ProcessIterator::ProcessIterator(const ProcessFilter* filter)
+ : filter_(filter) {
+- int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_UID, getuid() };
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_UID, (int) getuid() };
+
+ bool done = false;
+ int try_num = 1;
+@@ -37,7 +37,7 @@ ProcessIterator::ProcessIterator(const ProcessFilter*
+ num_of_kinfo_proc += 16;
+ kinfo_procs_.resize(num_of_kinfo_proc);
+ len = num_of_kinfo_proc * sizeof(struct kinfo_proc);
+- if (sysctl(mib, std::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
++ if (sysctl(mib, std::size(mib), kinfo_procs_.data(), &len, NULL, 0) < 0) {
+ // If we get a mem error, it just means we need a bigger buffer, so
+ // loop around again. Anything else is a real error and give up.
+ if (errno != ENOMEM) {
+@@ -47,7 +47,7 @@ ProcessIterator::ProcessIterator(const ProcessFilter*
+ }
+ } else {
+ // Got the list, just make sure we're sized exactly right
+- size_t num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
++ num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
+ kinfo_procs_.resize(num_of_kinfo_proc);
+ done = true;
+ }
+@@ -68,18 +68,13 @@ bool ProcessIterator::CheckForNextProcess() {
+ for (; index_of_kinfo_proc_ < kinfo_procs_.size(); ++index_of_kinfo_proc_) {
+ size_t length;
+ struct kinfo_proc kinfo = kinfo_procs_[index_of_kinfo_proc_];
+- int mib[] = { CTL_KERN, KERN_PROC_ARGS, kinfo.ki_pid };
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, kinfo.ki_pid };
+
+ if ((kinfo.ki_pid > 0) && (kinfo.ki_stat == SZOMB))
+ continue;
+
+- length = 0;
+- if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0) {
+- LOG(ERROR) << "failed to figure out the buffer size for a command line";
+- continue;
+- }
+-
+- data.resize(length);
++ data.resize(ARG_MAX);
++ length = ARG_MAX;
+
+ if (sysctl(mib, std::size(mib), &data[0], &length, NULL, 0) < 0) {
+ LOG(ERROR) << "failed to fetch a commandline";
diff --git a/devel/electron28/files/patch-base_process_process__iterator__openbsd.cc b/devel/electron28/files/patch-base_process_process__iterator__openbsd.cc
new file mode 100644
index 000000000000..ca96780b7ba2
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__iterator__openbsd.cc
@@ -0,0 +1,45 @@
+--- base/process/process_iterator_openbsd.cc.orig 2023-03-30 00:33:38 UTC
++++ base/process/process_iterator_openbsd.cc
+@@ -6,6 +6,9 @@
+
+ #include <errno.h>
+ #include <stddef.h>
++#include <unistd.h>
++#include <sys/param.h>
++#include <sys/proc.h>
+ #include <sys/sysctl.h>
+
+ #include "base/logging.h"
+@@ -16,12 +19,13 @@ namespace base {
+
+ ProcessIterator::ProcessIterator(const ProcessFilter* filter)
+ : filter_(filter) {
+- int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_UID, getuid(),
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_UID, static_cast<int>(getuid()),
+ sizeof(struct kinfo_proc), 0 };
+
+ bool done = false;
+ int try_num = 1;
+ const int max_tries = 10;
++ size_t num_of_kinfo_proc;
+
+ do {
+ size_t len = 0;
+@@ -30,7 +34,7 @@ ProcessIterator::ProcessIterator(const ProcessFilter*
+ kinfo_procs_.resize(0);
+ done = true;
+ } else {
+- size_t num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
++ num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
+ // Leave some spare room for process table growth (more could show up
+ // between when we check and now)
+ num_of_kinfo_proc += 16;
+@@ -46,7 +50,7 @@ ProcessIterator::ProcessIterator(const ProcessFilter*
+ }
+ } else {
+ // Got the list, just make sure we're sized exactly right
+- size_t num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
++ num_of_kinfo_proc = len / sizeof(struct kinfo_proc);
+ kinfo_procs_.resize(num_of_kinfo_proc);
+ done = true;
+ }
diff --git a/devel/electron28/files/patch-base_process_process__metrics.cc b/devel/electron28/files/patch-base_process_process__metrics.cc
new file mode 100644
index 000000000000..26f0e14e31a0
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics.cc
@@ -0,0 +1,54 @@
+--- base/process/process_metrics.cc.orig 2023-05-25 00:41:38 UTC
++++ base/process/process_metrics.cc
+@@ -17,7 +17,7 @@ namespace base {
+ namespace {
+
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ int CalculateEventsPerSecond(uint64_t event_count,
+ uint64_t* last_event_count,
+ base::TimeTicks* last_calculated) {
+@@ -54,7 +54,7 @@ SystemMetrics SystemMetrics::Sample() {
+ SystemMetrics system_metrics;
+
+ system_metrics.committed_memory_ = GetSystemCommitCharge();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ GetSystemMemoryInfo(&system_metrics.memory_info_);
+ GetVmStatInfo(&system_metrics.vmstat_info_);
+ GetSystemDiskInfo(&system_metrics.disk_info_);
+@@ -73,7 +73,7 @@ Value::Dict SystemMetrics::ToDict() const {
+ Value::Dict res;
+
+ res.Set("committed_memory", static_cast<int>(committed_memory_));
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ Value::Dict meminfo = memory_info_.ToDict();
+ meminfo.Merge(vmstat_info_.ToDict());
+ res.Set("meminfo", std::move(meminfo));
+@@ -100,7 +100,6 @@ std::unique_ptr<ProcessMetrics> ProcessMetrics::Create
+ #endif // !BUILDFLAG(IS_MAC)
+ }
+
+-#if !BUILDFLAG(IS_FREEBSD) || !BUILDFLAG(IS_POSIX)
+ double ProcessMetrics::GetPlatformIndependentCPUUsage(
+ TimeDelta cumulative_cpu) {
+ TimeTicks time = TimeTicks::Now();
+@@ -126,7 +125,6 @@ double ProcessMetrics::GetPlatformIndependentCPUUsage(
+ double ProcessMetrics::GetPlatformIndependentCPUUsage() {
+ return GetPlatformIndependentCPUUsage(GetCumulativeCPUUsage());
+ }
+-#endif
+
+ #if BUILDFLAG(IS_WIN)
+ double ProcessMetrics::GetPreciseCPUUsage(TimeDelta cumulative_cpu) {
+@@ -157,7 +155,7 @@ double ProcessMetrics::GetPreciseCPUUsage() {
+ #endif // BUILDFLAG(IS_WIN)
+
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ int ProcessMetrics::CalculateIdleWakeupsPerSecond(
+ uint64_t absolute_idle_wakeups) {
+ return CalculateEventsPerSecond(absolute_idle_wakeups,
diff --git a/devel/electron28/files/patch-base_process_process__metrics.h b/devel/electron28/files/patch-base_process_process__metrics.h
new file mode 100644
index 000000000000..8916b9bb36ae
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics.h
@@ -0,0 +1,120 @@
+--- base/process/process_metrics.h.orig 2023-11-29 21:39:40 UTC
++++ base/process/process_metrics.h
+@@ -37,7 +37,7 @@
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ #include <string>
+ #include <utility>
+ #include <vector>
+@@ -50,7 +50,7 @@ struct IoCounters;
+ // Full declaration is in process_metrics_iocounters.h.
+ struct IoCounters;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Minor and major page fault counts since the process creation.
+ // Both counts are process-wide, and exclude child processes.
+ //
+@@ -105,7 +105,7 @@ class BASE_EXPORT ProcessMetrics {
+ // convenience wrapper for CreateProcessMetrics().
+ static std::unique_ptr<ProcessMetrics> CreateCurrentProcessMetrics();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Resident Set Size is a Linux/Android specific memory concept. Do not
+ // attempt to extend this to other platforms.
+ BASE_EXPORT size_t GetResidentSetSize() const;
+@@ -163,7 +163,7 @@ class BASE_EXPORT ProcessMetrics {
+ #endif // BUILDFLAG(IS_WIN)
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ // Emits the cumulative CPU usage for all currently active threads since they
+ // were started into the output parameter (replacing its current contents).
+ // Threads that have already terminated will not be reported. Thus, the sum of
+@@ -219,7 +219,7 @@ class BASE_EXPORT ProcessMetrics {
+ int GetOpenFdSoftLimit() const;
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Bytes of swap as reported by /proc/[pid]/status.
+ uint64_t GetVmSwapBytes() const;
+
+@@ -240,7 +240,7 @@ class BASE_EXPORT ProcessMetrics {
+ #endif // !BUILDFLAG(IS_MAC)
+
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups);
+ #endif
+ #if BUILDFLAG(IS_APPLE)
+@@ -262,9 +262,7 @@ class BASE_EXPORT ProcessMetrics {
+ // Used to store the previous times and CPU usage counts so we can
+ // compute the CPU usage between calls.
+ TimeTicks last_cpu_time_;
+-#if !BUILDFLAG(IS_FREEBSD) || !BUILDFLAG(IS_POSIX)
+ TimeDelta last_cumulative_cpu_;
+-#endif
+
+ #if BUILDFLAG(IS_WIN)
+ TimeTicks last_cpu_time_for_precise_cpu_usage_;
+@@ -272,7 +270,7 @@ class BASE_EXPORT ProcessMetrics {
+ #endif
+
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ // Same thing for idle wakeups.
+ TimeTicks last_idle_wakeups_time_;
+ uint64_t last_absolute_idle_wakeups_;
+@@ -313,7 +311,7 @@ BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_de
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Data about system-wide memory consumption. Values are in KB. Available on
+ // Windows, Mac, Linux, Android and Chrome OS.
+ //
+@@ -348,7 +346,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ // This provides an estimate of available memory as described here:
+ // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
+ // NOTE: this is ONLY valid in kernels 3.14 and up. Its value will always
+@@ -363,7 +361,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ #endif
+
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ int buffers = 0;
+ int cached = 0;
+ int active_anon = 0;
+@@ -400,7 +398,7 @@ BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoK
+ // BUILDFLAG(IS_FUCHSIA)
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ // Parse the data found in /proc/<pid>/stat and return the sum of the
+ // CPU-related ticks. Returns -1 on parse error.
+ // Exposed for testing.
+@@ -588,7 +586,7 @@ class BASE_EXPORT SystemMetrics {
+ FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics);
+
+ size_t committed_memory_;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ SystemMemoryInfoKB memory_info_;
+ VmStatInfo vmstat_info_;
+ SystemDiskInfo disk_info_;
diff --git a/devel/electron28/files/patch-base_process_process__metrics__freebsd.cc b/devel/electron28/files/patch-base_process_process__metrics__freebsd.cc
new file mode 100644
index 000000000000..0c884ddeb65a
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics__freebsd.cc
@@ -0,0 +1,305 @@
+--- base/process/process_metrics_freebsd.cc.orig 2023-03-30 00:33:38 UTC
++++ base/process/process_metrics_freebsd.cc
+@@ -3,20 +3,39 @@
+ // found in the LICENSE file.
+
+ #include "base/process/process_metrics.h"
++#include "base/notreached.h"
+
+ #include <stddef.h>
++#include <sys/types.h>
+ #include <sys/sysctl.h>
+ #include <sys/user.h>
+ #include <unistd.h>
+
++#include <fcntl.h> /* O_RDONLY */
++#include <kvm.h>
++#include <libutil.h>
++
+ #include "base/memory/ptr_util.h"
+ #include "base/process/process_metrics_iocounters.h"
++#include "base/values.h"
+
+ namespace base {
++namespace {
++int GetPageShift() {
++ int pagesize = getpagesize();
++ int pageshift = 0;
+
++ while (pagesize > 1) {
++ pageshift++;
++ pagesize >>= 1;
++ }
++
++ return pageshift;
++}
++}
++
+ ProcessMetrics::ProcessMetrics(ProcessHandle process)
+- : process_(process),
+- last_cpu_(0) {}
++ : process_(process) {}
+
+ // static
+ std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics(
+@@ -24,22 +43,19 @@ std::unique_ptr<ProcessMetrics> ProcessMetrics::Create
+ return WrapUnique(new ProcessMetrics(process));
+ }
+
+-double ProcessMetrics::GetPlatformIndependentCPUUsage() {
++TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
+ struct kinfo_proc info;
+- int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, process_};
+- size_t length = sizeof(info);
++ size_t length = sizeof(struct kinfo_proc);
++ struct timeval tv;
+
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_ };
++
+ if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
+- return 0;
++ return TimeDelta();
+
+- return (info.ki_pctcpu / FSCALE) * 100.0;
++ return Microseconds(info.ki_runtime);
+ }
+
+-TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
+- NOTREACHED();
+- return TimeDelta();
+-}
+-
+ bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const {
+ return false;
+ }
+@@ -65,6 +81,230 @@ size_t GetSystemCommitCharge() {
+ pagesize = getpagesize();
+
+ return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize);
++}
++
++int64_t GetNumberOfThreads(ProcessHandle process) {
++ // Taken from FreeBSD top (usr.bin/top/machine.c)
++
++ kvm_t* kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "kvm_open");
++ if (kd == NULL)
++ return 0;
++
++ struct kinfo_proc* pbase;
++ int nproc;
++ pbase = kvm_getprocs(kd, KERN_PROC_PID, process, &nproc);
++ if (pbase == NULL)
++ return 0;
++
++ if (kvm_close(kd) == -1)
++ return 0;
++
++ return nproc;
++}
++
++bool GetSystemMemoryInfo(SystemMemoryInfoKB *meminfo) {
++ unsigned int mem_total, mem_free, swap_total, swap_used;
++ size_t length;
++ int pagesizeKB;
++
++ pagesizeKB = getpagesize() / 1024;
++
++ length = sizeof(mem_total);
++ if (sysctlbyname("vm.stats.vm.v_page_count", &mem_total,
++ &length, NULL, 0) != 0 || length != sizeof(mem_total))
++ return false;
++
++ length = sizeof(mem_free);
++ if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &length, NULL, 0)
++ != 0 || length != sizeof(mem_free))
++ return false;
++
++ length = sizeof(swap_total);
++ if (sysctlbyname("vm.swap_size", &swap_total, &length, NULL, 0)
++ != 0 || length != sizeof(swap_total))
++ return false;
++
++ length = sizeof(swap_used);
++ if (sysctlbyname("vm.swap_anon_use", &swap_used, &length, NULL, 0)
++ != 0 || length != sizeof(swap_used))
++ return false;
++
++ meminfo->total = mem_total * pagesizeKB;
++ meminfo->free = mem_free * pagesizeKB;
++ meminfo->swap_total = swap_total * pagesizeKB;
++ meminfo->swap_free = (swap_total - swap_used) * pagesizeKB;
++
++ return true;
++}
++
++int ProcessMetrics::GetOpenFdCount() const {
++ struct kinfo_file * kif;
++ int cnt;
++
++ if ((kif = kinfo_getfile(process_, &cnt)) == NULL)
++ return -1;
++
++ free(kif);
++
++ return cnt;
++}
++
++int ProcessMetrics::GetOpenFdSoftLimit() const {
++ size_t length;
++ int total_count = 0;
++ int mib[] = { CTL_KERN, KERN_MAXFILESPERPROC };
++
++ length = sizeof(total_count);
++
++ if (sysctl(mib, std::size(mib), &total_count, &length, NULL, 0) < 0) {
++ total_count = -1;
++ }
++
++ return total_count;
++}
++
++size_t ProcessMetrics::GetResidentSetSize() const {
++ kvm_t *kd = kvm_open(nullptr, "/dev/null", nullptr, O_RDONLY, "kvm_open");
++
++ if (kd == nullptr)
++ return 0;
++
++ struct kinfo_proc *pp;
++ int nproc;
++
++ if ((pp = kvm_getprocs(kd, KERN_PROC_PID, process_, &nproc)) == nullptr) {
++ kvm_close(kd);
++ return 0;
++ }
++
++ size_t rss;
++
++ if (nproc > 0) {
++ rss = pp->ki_rssize << GetPageShift();
++ } else {
++ rss = 0;
++ }
++
++ kvm_close(kd);
++ return rss;
++}
++
++uint64_t ProcessMetrics::GetVmSwapBytes() const {
++ kvm_t *kd = kvm_open(nullptr, "/dev/null", nullptr, O_RDONLY, "kvm_open");
++
++ if (kd == nullptr)
++ return 0;
++
++ struct kinfo_proc *pp;
++ int nproc;
++
++ if ((pp = kvm_getprocs(kd, KERN_PROC_PID, process_, &nproc)) == nullptr) {
++ kvm_close(kd);
++ return 0;
++ }
++
++ size_t swrss;
++
++ if (nproc > 0) {
++ swrss = pp->ki_swrss > pp->ki_rssize
++ ? (pp->ki_swrss - pp->ki_rssize) << GetPageShift()
++ : 0;
++ } else {
++ swrss = 0;
++ }
++
++ kvm_close(kd);
++ return swrss;
++}
++
++int ProcessMetrics::GetIdleWakeupsPerSecond() {
++ NOTIMPLEMENTED();
++ return 0;
++}
++
++bool GetSystemDiskInfo(SystemDiskInfo* diskinfo) {
++ NOTIMPLEMENTED();
++ return false;
++}
++
++bool GetVmStatInfo(VmStatInfo* vmstat) {
++ NOTIMPLEMENTED();
++ return false;
++}
++
++SystemDiskInfo::SystemDiskInfo() {
++ reads = 0;
++ reads_merged = 0;
++ sectors_read = 0;
++ read_time = 0;
++ writes = 0;
++ writes_merged = 0;
++ sectors_written = 0;
++ write_time = 0;
++ io = 0;
++ io_time = 0;
++ weighted_io_time = 0;
++}
++
++SystemDiskInfo::SystemDiskInfo(const SystemDiskInfo& other) = default;
++
++SystemDiskInfo& SystemDiskInfo::operator=(const SystemDiskInfo&) = default;
++
++Value::Dict SystemDiskInfo::ToDict() const {
++ Value::Dict res;
++
++ // Write out uint64_t variables as doubles.
++ // Note: this may discard some precision, but for JS there's no other option.
++ res.Set("reads", static_cast<double>(reads));
++ res.Set("reads_merged", static_cast<double>(reads_merged));
++ res.Set("sectors_read", static_cast<double>(sectors_read));
++ res.Set("read_time", static_cast<double>(read_time));
++ res.Set("writes", static_cast<double>(writes));
++ res.Set("writes_merged", static_cast<double>(writes_merged));
++ res.Set("sectors_written", static_cast<double>(sectors_written));
++ res.Set("write_time", static_cast<double>(write_time));
++ res.Set("io", static_cast<double>(io));
++ res.Set("io_time", static_cast<double>(io_time));
++ res.Set("weighted_io_time", static_cast<double>(weighted_io_time));
++
++ NOTIMPLEMENTED();
++
++ return res;
++}
++
++Value::Dict SystemMemoryInfoKB::ToDict() const {
++ Value::Dict res;
++ res.Set("total", total);
++ res.Set("free", free);
++ res.Set("available", available);
++ res.Set("buffers", buffers);
++ res.Set("cached", cached);
++ res.Set("active_anon", active_anon);
++ res.Set("inactive_anon", inactive_anon);
++ res.Set("active_file", active_file);
++ res.Set("inactive_file", inactive_file);
++ res.Set("swap_total", swap_total);
++ res.Set("swap_free", swap_free);
++ res.Set("swap_used", swap_total - swap_free);
++ res.Set("dirty", dirty);
++ res.Set("reclaimable", reclaimable);
++
++ NOTIMPLEMENTED();
++
++ return res;
++}
++
++Value::Dict VmStatInfo::ToDict() const {
++ Value::Dict res;
++ // TODO(crbug.com/1334256): Make base::Value able to hold uint64_t and remove
++ // casts below.
++ res.Set("pswpin", static_cast<int>(pswpin));
++ res.Set("pswpout", static_cast<int>(pswpout));
++ res.Set("pgmajfault", static_cast<int>(pgmajfault));
++
++ NOTIMPLEMENTED();
++
++ return res;
+ }
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_process_process__metrics__openbsd.cc b/devel/electron28/files/patch-base_process_process__metrics__openbsd.cc
new file mode 100644
index 000000000000..b90a65357cb2
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics__openbsd.cc
@@ -0,0 +1,219 @@
+--- base/process/process_metrics_openbsd.cc.orig 2023-10-19 19:57:58 UTC
++++ base/process/process_metrics_openbsd.cc
+@@ -6,14 +6,23 @@
+
+ #include <stddef.h>
+ #include <stdint.h>
++#include <fcntl.h>
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
++#include <sys/vmmeter.h>
+
++#include <kvm.h>
++
+ #include "base/memory/ptr_util.h"
+ #include "base/process/process_metrics_iocounters.h"
++#include "base/values.h"
++#include "base/notreached.h"
+
+ namespace base {
+
++ProcessMetrics::ProcessMetrics(ProcessHandle process)
++ : process_(process) {}
++
+ // static
+ std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics(
+ ProcessHandle process) {
+@@ -24,49 +33,23 @@ bool ProcessMetrics::GetIOCounters(IoCounters* io_coun
+ return false;
+ }
+
+-static int GetProcessCPU(pid_t pid) {
++TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
+ struct kinfo_proc info;
+- size_t length;
+- int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid,
+- sizeof(struct kinfo_proc), 0 };
++ size_t length = sizeof(struct kinfo_proc);
++ struct timeval tv;
+
+- if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0)
+- return -1;
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_,
++ sizeof(struct kinfo_proc), 1 };
+
+- mib[5] = (length / sizeof(struct kinfo_proc));
+-
+ if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
+- return 0;
++ return TimeDelta();
+
+- return info.p_pctcpu;
+-}
++ tv.tv_sec = info.p_rtime_sec;
++ tv.tv_usec = info.p_rtime_usec;
+
+-double ProcessMetrics::GetPlatformIndependentCPUUsage() {
+- TimeTicks time = TimeTicks::Now();
+-
+- if (last_cpu_time_.is_zero()) {
+- // First call, just set the last values.
+- last_cpu_time_ = time;
+- return 0;
+- }
+-
+- int cpu = GetProcessCPU(process_);
+-
+- last_cpu_time_ = time;
+- double percentage = static_cast<double>((cpu * 100.0) / FSCALE);
+-
+- return percentage;
++ return Microseconds(TimeValToMicroseconds(tv));
+ }
+
+-TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
+- NOTREACHED();
+- return TimeDelta();
+-}
+-
+-ProcessMetrics::ProcessMetrics(ProcessHandle process)
+- : process_(process),
+- last_cpu_(0) {}
+-
+ size_t GetSystemCommitCharge() {
+ int mib[] = { CTL_VM, VM_METER };
+ int pagesize;
+@@ -84,6 +67,133 @@ size_t GetSystemCommitCharge() {
+ pagesize = getpagesize();
+
+ return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize);
++}
++
++int ProcessMetrics::GetOpenFdCount() const {
++#if 0
++ struct kinfo_file *files;
++ kvm_t *kd = NULL;
++ int total_count = 0;
++ char errbuf[_POSIX2_LINE_MAX];
++
++ if ((kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf)) == NULL)
++ goto out;
++
++ if ((files = kvm_getfiles(kd, KERN_FILE_BYPID, process_,
++ sizeof(struct kinfo_file), &total_count)) == NULL) {
++ total_count = 0;
++ goto out;
++ }
++
++ kvm_close(kd);
++
++out:
++ return total_count;
++#endif
++ return getdtablecount();
++}
++
++int ProcessMetrics::GetOpenFdSoftLimit() const {
++ return getdtablesize();
++// return GetMaxFds();
++}
++
++uint64_t ProcessMetrics::GetVmSwapBytes() const {
++ NOTIMPLEMENTED();
++ return 0;
++}
++
++bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) {
++ NOTIMPLEMENTED_LOG_ONCE();
++ return false;
++}
++
++bool GetSystemDiskInfo(SystemDiskInfo* diskinfo) {
++ NOTIMPLEMENTED();
++ return false;
++}
++
++bool GetVmStatInfo(VmStatInfo* vmstat) {
++ NOTIMPLEMENTED();
++ return false;
++}
++
++int ProcessMetrics::GetIdleWakeupsPerSecond() {
++ NOTIMPLEMENTED();
++ return 0;
++}
++
++Value::Dict SystemMemoryInfoKB::ToDict() const {
++ Value::Dict res;
++ res.Set("total", total);
++ res.Set("free", free);
++ res.Set("available", available);
++ res.Set("buffers", buffers);
++ res.Set("cached", cached);
++ res.Set("active_anon", active_anon);
++ res.Set("inactive_anon", inactive_anon);
++ res.Set("active_file", active_file);
++ res.Set("inactive_file", inactive_file);
++ res.Set("swap_total", swap_total);
++ res.Set("swap_free", swap_free);
++ res.Set("swap_used", swap_total - swap_free);
++ res.Set("dirty", dirty);
++ res.Set("reclaimable", reclaimable);
++
++ NOTIMPLEMENTED();
++
++ return res;
++}
++
++Value::Dict VmStatInfo::ToDict() const {
++ Value::Dict res;
++ res.Set("pswpin", static_cast<int>(pswpin));
++ res.Set("pswpout", static_cast<int>(pswpout));
++ res.Set("pgmajfault", static_cast<int>(pgmajfault));
++
++ NOTIMPLEMENTED();
++
++ return res;
++}
++
++SystemDiskInfo::SystemDiskInfo() {
++ reads = 0;
++ reads_merged = 0;
++ sectors_read = 0;
++ read_time = 0;
++ writes = 0;
++ writes_merged = 0;
++ sectors_written = 0;
++ write_time = 0;
++ io = 0;
++ io_time = 0;
++ weighted_io_time = 0;
++}
++
++SystemDiskInfo::SystemDiskInfo(const SystemDiskInfo&) = default;
++
++SystemDiskInfo& SystemDiskInfo::operator=(const SystemDiskInfo&) = default;
++
++Value::Dict SystemDiskInfo::ToDict() const {
++ Value::Dict res;
++
++ // Write out uint64_t variables as doubles.
++ // Note: this may discard some precision, but for JS there's no other option.
++ res.Set("reads", static_cast<double>(reads));
++ res.Set("reads_merged", static_cast<double>(reads_merged));
++ res.Set("sectors_read", static_cast<double>(sectors_read));
++ res.Set("read_time", static_cast<double>(read_time));
++ res.Set("writes", static_cast<double>(writes));
++ res.Set("writes_merged", static_cast<double>(writes_merged));
++ res.Set("sectors_written", static_cast<double>(sectors_written));
++ res.Set("write_time", static_cast<double>(write_time));
++ res.Set("io", static_cast<double>(io));
++ res.Set("io_time", static_cast<double>(io_time));
++ res.Set("weighted_io_time", static_cast<double>(weighted_io_time));
++
++ NOTIMPLEMENTED();
++
++ return res;
+ }
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_process_process__metrics__posix.cc b/devel/electron28/files/patch-base_process_process__metrics__posix.cc
new file mode 100644
index 000000000000..ba800ec06711
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics__posix.cc
@@ -0,0 +1,20 @@
+--- base/process/process_metrics_posix.cc.orig 2023-08-10 01:48:31 UTC
++++ base/process/process_metrics_posix.cc
+@@ -21,6 +21,8 @@
+
+ #if BUILDFLAG(IS_APPLE)
+ #include <malloc/malloc.h>
++#elif BUILDFLAG(IS_OPENBSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -134,7 +136,7 @@ size_t ProcessMetrics::GetMallocUsage() {
+ return stats.size_in_use;
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+ return GetMallocUsageMallinfo();
+-#elif BUILDFLAG(IS_FUCHSIA)
++#elif BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // TODO(fuchsia): Not currently exposed. https://crbug.com/735087.
+ return 0;
+ #endif
diff --git a/devel/electron28/files/patch-base_process_process__metrics__unittest.cc b/devel/electron28/files/patch-base_process_process__metrics__unittest.cc
new file mode 100644
index 000000000000..f0fa39019b93
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__metrics__unittest.cc
@@ -0,0 +1,18 @@
+--- base/process/process_metrics_unittest.cc.orig 2023-11-29 21:39:40 UTC
++++ base/process/process_metrics_unittest.cc
+@@ -35,13 +35,13 @@
+ #include <sys/mman.h>
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "base/process/internal_linux.h"
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_APPLE)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ #define ENABLE_CPU_TESTS 1
+ #else
+ #define ENABLE_CPU_TESTS 0
diff --git a/devel/electron28/files/patch-base_process_process__posix.cc b/devel/electron28/files/patch-base_process_process__posix.cc
new file mode 100644
index 000000000000..96114257c2cb
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__posix.cc
@@ -0,0 +1,94 @@
+--- base/process/process_posix.cc.orig 2023-10-19 19:57:58 UTC
++++ base/process/process_posix.cc
+@@ -23,10 +23,15 @@
+ #include "base/trace_event/base_tracing.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include <sys/event.h>
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#endif
++
+ #if BUILDFLAG(CLANG_PROFILING)
+ #include "base/test/clang_profiling.h"
+ #endif
+@@ -93,7 +98,7 @@ bool WaitpidWithTimeout(base::ProcessHandle handle,
+ return ret_pid > 0;
+ }
+
+-#if BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // Using kqueue on Mac so that we can wait on non-child processes.
+ // We can't use kqueues on child processes because we need to reap
+ // our own children using wait.
+@@ -198,7 +203,7 @@ bool WaitForExitWithTimeoutImpl(base::ProcessHandle ha
+ const bool exited = (parent_pid < 0);
+
+ if (!exited && parent_pid != our_pid) {
+-#if BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // On Mac we can wait on non child processes.
+ return WaitForSingleNonChildProcess(handle, timeout);
+ #else
+@@ -387,7 +392,56 @@ void Process::Exited(int exit_code) const {
+
+ int Process::GetOSPriority() const {
+ DCHECK(IsValid());
++// avoid pledge(2) violation
++#if BUILDFLAG(IS_BSD)
++ return 0;
++#else
+ return getpriority(PRIO_PROCESS, static_cast<id_t>(process_));
++#endif
+ }
++
++Time Process::CreationTime() const {
++// avoid ps pledge in the network process
++#if !BUILDFLAG(IS_BSD)
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid(),
++ sizeof(struct kinfo_proc), 0 };
++ struct kinfo_proc *info = nullptr;
++ size_t info_size;
++#endif
++ Time ct = Time();
++
++#if !BUILDFLAG(IS_BSD)
++ if (sysctl(mib, std::size(mib), NULL, &info_size, NULL, 0) < 0)
++ goto out;
++
++ mib[5] = (info_size / sizeof(struct kinfo_proc));
++ if ((info = reinterpret_cast<kinfo_proc*>(malloc(info_size))) == NULL)
++ goto out;
++
++ if (sysctl(mib, std::size(mib), info, &info_size, NULL, 0) < 0)
++ goto out;
++
++ ct = Time::FromTimeT(info->p_ustart_sec);
++
++out:
++ if (info)
++ free(info);
++#endif
++ return ct;
++}
++
++#if BUILDFLAG(IS_BSD)
++Process::Priority Process::GetPriority() const {
++ return Priority::kUserBlocking;
++}
++
++bool Process::SetPriority(Priority priority) {
++ return false;
++}
++
++bool Process::CanSetPriority() {
++ return false;
++}
++#endif
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_process_process__unittest.cc b/devel/electron28/files/patch-base_process_process__unittest.cc
new file mode 100644
index 000000000000..02415d56271a
--- /dev/null
+++ b/devel/electron28/files/patch-base_process_process__unittest.cc
@@ -0,0 +1,11 @@
+--- base/process/process_unittest.cc.orig 2023-11-29 21:39:40 UTC
++++ base/process/process_unittest.cc
+@@ -198,7 +198,7 @@ TEST_F(ProcessTest, CreationTimeOtherProcess) {
+ // was spawned and a time recorded after it was spawned. However, since the
+ // base::Time and process creation clocks don't match, tolerate some error.
+ constexpr base::TimeDelta kTolerance =
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, process creation time is relative to boot time which has a
+ // 1-second resolution. Tolerate 1 second for the imprecise boot time and
+ // 100 ms for the imprecise clock.
diff --git a/devel/electron28/files/patch-base_profiler_module__cache.cc b/devel/electron28/files/patch-base_profiler_module__cache.cc
new file mode 100644
index 000000000000..ec5f354defe7
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_module__cache.cc
@@ -0,0 +1,11 @@
+--- base/profiler/module_cache.cc.orig 2023-11-29 21:39:40 UTC
++++ base/profiler/module_cache.cc
+@@ -37,7 +37,7 @@ std::string TransformModuleIDToSymbolServerFormat(Stri
+ // Android and Linux Chrome builds use the "breakpad" format to index their
+ // build id, so we transform the build id for these platforms. All other
+ // platforms keep their symbols indexed by the original build ID.
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Linux ELF module IDs are 160bit integers, which we need to mangle
+ // down to 128bit integers to match the id that Breakpad outputs.
+ // Example on version '66.0.3359.170' x64:
diff --git a/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.cc b/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.cc
new file mode 100644
index 000000000000..d41258e8bd74
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.cc
@@ -0,0 +1,20 @@
+--- base/profiler/sampling_profiler_thread_token.cc.orig 2023-02-01 18:43:07 UTC
++++ base/profiler/sampling_profiler_thread_token.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <pthread.h>
+
+ #include "base/profiler/stack_base_address_posix.h"
+@@ -18,7 +18,7 @@ SamplingProfilerThreadToken GetSamplingProfilerCurrent
+ PlatformThreadId id = PlatformThread::CurrentId();
+ #if BUILDFLAG(IS_ANDROID)
+ return {id, pthread_self()};
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ absl::optional<uintptr_t> maybe_stack_base =
+ GetThreadStackBaseAddress(id, pthread_self());
+ return {id, maybe_stack_base};
diff --git a/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.h b/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.h
new file mode 100644
index 000000000000..af658eb9b446
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_sampling__profiler__thread__token.h
@@ -0,0 +1,20 @@
+--- base/profiler/sampling_profiler_thread_token.h.orig 2023-02-01 18:43:07 UTC
++++ base/profiler/sampling_profiler_thread_token.h
+@@ -12,7 +12,7 @@
+
+ #if BUILDFLAG(IS_ANDROID)
+ #include <pthread.h>
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <stdint.h>
+ #endif
+
+@@ -26,7 +26,7 @@ struct SamplingProfilerThreadToken {
+ PlatformThreadId id;
+ #if BUILDFLAG(IS_ANDROID)
+ pthread_t pthread_id;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Due to the sandbox, we can only retrieve the stack base address for the
+ // current thread. We must grab it during
+ // GetSamplingProfilerCurrentThreadToken() and not try to get it later.
diff --git a/devel/electron28/files/patch-base_profiler_stack__base__address__posix.cc b/devel/electron28/files/patch-base_profiler_stack__base__address__posix.cc
new file mode 100644
index 000000000000..30a8bf37fab5
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_stack__base__address__posix.cc
@@ -0,0 +1,50 @@
+--- base/profiler/stack_base_address_posix.cc.orig 2023-02-01 18:43:07 UTC
++++ base/profiler/stack_base_address_posix.cc
+@@ -17,6 +17,10 @@
+ #include "base/files/scoped_file.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include <pthread_np.h>
++#endif
++
+ #if BUILDFLAG(IS_CHROMEOS)
+ extern "C" void* __libc_stack_end;
+ #endif
+@@ -45,7 +49,21 @@ absl::optional<uintptr_t> GetAndroidMainThreadStackBas
+
+ #if !BUILDFLAG(IS_LINUX)
+ uintptr_t GetThreadStackBaseAddressImpl(pthread_t pthread_id) {
++#if BUILDFLAG(IS_OPENBSD)
++ stack_t ss;
++ void *address;
++ size_t size;
++ if (pthread_stackseg_np(pthread_id, &ss) != 0)
++ return 0;
++ size = ss.ss_size;
++ address = (void*)((size_t) ss.ss_sp - ss.ss_size);
++#else
+ pthread_attr_t attr;
++#if BUILDFLAG(IS_FREEBSD)
++ int result;
++ pthread_attr_init(&attr);
++ pthread_attr_get_np(pthread_id, &attr);
++#else
+ // pthread_getattr_np will crash on ChromeOS & Linux if we are in the sandbox
+ // and pthread_id refers to a different thread, due to the use of
+ // sched_getaffinity().
+@@ -58,12 +76,14 @@ uintptr_t GetThreadStackBaseAddressImpl(pthread_t pthr
+ << logging::SystemErrorCodeToString(result);
+ // See crbug.com/617730 for limitations of this approach on Linux-like
+ // systems.
++#endif
+ void* address;
+ size_t size;
+ result = pthread_attr_getstack(&attr, &address, &size);
+ CHECK_EQ(result, 0) << "pthread_attr_getstack returned "
+ << logging::SystemErrorCodeToString(result);
+ pthread_attr_destroy(&attr);
++#endif
+ const uintptr_t base_address = reinterpret_cast<uintptr_t>(address) + size;
+ return base_address;
+ }
diff --git a/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__test__util.cc b/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__test__util.cc
new file mode 100644
index 000000000000..0119cd60187d
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__test__util.cc
@@ -0,0 +1,11 @@
+--- base/profiler/stack_sampling_profiler_test_util.cc.orig 2023-05-25 00:41:38 UTC
++++ base/profiler/stack_sampling_profiler_test_util.cc
+@@ -36,7 +36,7 @@
+ // Fortunately, it provides _alloca, which functions identically.
+ #include <malloc.h>
+ #define alloca _alloca
+-#else
++#elif !BUILDFLAG(IS_BSD)
+ #include <alloca.h>
+ #endif
+
diff --git a/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__unittest.cc b/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
new file mode 100644
index 000000000000..d739c9137c77
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
@@ -0,0 +1,11 @@
+--- base/profiler/stack_sampling_profiler_unittest.cc.orig 2022-02-28 16:54:41 UTC
++++ base/profiler/stack_sampling_profiler_unittest.cc
+@@ -41,7 +41,7 @@
+ #include <intrin.h>
+ #include <malloc.h>
+ #include <windows.h>
+-#else
++#elif !BUILDFLAG(IS_BSD)
+ #include <alloca.h>
+ #endif
+
diff --git a/devel/electron28/files/patch-base_profiler_thread__delegate__posix.cc b/devel/electron28/files/patch-base_profiler_thread__delegate__posix.cc
new file mode 100644
index 000000000000..568e6236f393
--- /dev/null
+++ b/devel/electron28/files/patch-base_profiler_thread__delegate__posix.cc
@@ -0,0 +1,20 @@
+--- base/profiler/thread_delegate_posix.cc.orig 2022-10-24 13:33:33 UTC
++++ base/profiler/thread_delegate_posix.cc
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "third_party/abseil-cpp/absl/types/optional.h"
+
+-#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ #include "base/profiler/stack_base_address_posix.h"
+ #endif
+
+@@ -22,7 +22,7 @@ namespace base {
+ std::unique_ptr<ThreadDelegatePosix> ThreadDelegatePosix::Create(
+ SamplingProfilerThreadToken thread_token) {
+ absl::optional<uintptr_t> base_address;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base_address = thread_token.stack_base_address;
+ #else
+ base_address =
diff --git a/devel/electron28/files/patch-base_rand__util.h b/devel/electron28/files/patch-base_rand__util.h
new file mode 100644
index 000000000000..7872875b58c9
--- /dev/null
+++ b/devel/electron28/files/patch-base_rand__util.h
@@ -0,0 +1,11 @@
+--- base/rand_util.h.orig 2023-11-29 21:39:40 UTC
++++ base/rand_util.h
+@@ -136,7 +136,7 @@ void RandomShuffle(Itr first, Itr last) {
+ std::shuffle(first, last, RandomBitGenerator());
+ }
+
+-#if BUILDFLAG(IS_POSIX)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_BSD)
+ BASE_EXPORT int GetUrandomFD();
+ #endif
+
diff --git a/devel/electron28/files/patch-base_rand__util__posix.cc b/devel/electron28/files/patch-base_rand__util__posix.cc
new file mode 100644
index 000000000000..9156bf032e5c
--- /dev/null
+++ b/devel/electron28/files/patch-base_rand__util__posix.cc
@@ -0,0 +1,62 @@
+--- base/rand_util_posix.cc.orig 2023-11-29 21:39:40 UTC
++++ base/rand_util_posix.cc
+@@ -22,7 +22,7 @@
+ #include "base/time/time.h"
+ #include "build/build_config.h"
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_NACL)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_BSD)
+ #include "third_party/lss/linux_syscall_support.h"
+ #elif BUILDFLAG(IS_MAC)
+ // TODO(crbug.com/995996): Waiting for this header to appear in the iOS SDK.
+@@ -39,6 +39,7 @@ namespace {
+
+ namespace {
+
++#if !BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(IS_AIX)
+ // AIX has no 64-bit support for O_CLOEXEC.
+ static constexpr int kOpenFlags = O_RDONLY;
+@@ -63,10 +64,11 @@ class URandomFd {
+ private:
+ const int fd_;
+ };
++#endif
+
+ #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+ BUILDFLAG(IS_ANDROID)) && \
+- !BUILDFLAG(IS_NACL)
++ !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_BSD)
+ // TODO(pasko): Unify reading kernel version numbers in:
+ // mojo/core/channel_linux.cc
+ // chrome/browser/android/seccomp_support_detector.cc
+@@ -176,6 +178,7 @@ void RandBytes(void* output, size_t output_length, boo
+ namespace {
+
+ void RandBytes(void* output, size_t output_length, bool avoid_allocation) {
++#if !BUILDFLAG(IS_BSD)
+ #if !BUILDFLAG(IS_NACL)
+ // The BoringSSL experiment takes priority over everything else.
+ if (!avoid_allocation && internal::UseBoringSSLForRandBytes()) {
+@@ -214,6 +217,9 @@ void RandBytes(void* output, size_t output_length, boo
+ const bool success =
+ ReadFromFD(urandom_fd, static_cast<char*>(output), output_length);
+ CHECK(success);
++#else
++ arc4random_buf(static_cast<char*>(output), output_length);
++#endif
+ }
+
+ } // namespace
+@@ -233,9 +239,11 @@ void RandBytes(void* output, size_t output_length) {
+ RandBytes(output, output_length, /*avoid_allocation=*/false);
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ int GetUrandomFD() {
+ static NoDestructor<URandomFd> urandom_fd;
+ return urandom_fd->fd();
+ }
++#endif
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_strings_safe__sprintf__unittest.cc b/devel/electron28/files/patch-base_strings_safe__sprintf__unittest.cc
new file mode 100644
index 000000000000..24d7dc7adc9e
--- /dev/null
+++ b/devel/electron28/files/patch-base_strings_safe__sprintf__unittest.cc
@@ -0,0 +1,18 @@
+--- base/strings/safe_sprintf_unittest.cc.orig 2023-03-30 00:33:38 UTC
++++ base/strings/safe_sprintf_unittest.cc
+@@ -733,6 +733,7 @@ TEST(SafeSPrintfTest, EmbeddedNul) {
+ #endif
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ TEST(SafeSPrintfTest, EmitNULL) {
+ char buf[40];
+ #if defined(__GNUC__)
+@@ -749,6 +750,7 @@ TEST(SafeSPrintfTest, EmitNULL) {
+ #pragma GCC diagnostic pop
+ #endif
+ }
++#endif
+
+ TEST(SafeSPrintfTest, PointerSize) {
+ // The internal data representation is a 64bit value, independent of the
diff --git a/devel/electron28/files/patch-base_synchronization_lock__impl.h b/devel/electron28/files/patch-base_synchronization_lock__impl.h
new file mode 100644
index 000000000000..f2ababc5391a
--- /dev/null
+++ b/devel/electron28/files/patch-base_synchronization_lock__impl.h
@@ -0,0 +1,23 @@
+--- base/synchronization/lock_impl.h.orig 2023-03-30 00:33:38 UTC
++++ base/synchronization/lock_impl.h
+@@ -104,6 +104,10 @@ void LockImpl::Unlock() {
+ }
+
+ #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FREEBSD)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wthread-safety-analysis"
++#endif
+
+ #if DCHECK_IS_ON()
+ BASE_EXPORT void dcheck_trylock_result(int rv);
+@@ -124,6 +128,9 @@ void LockImpl::Unlock() {
+ dcheck_unlock_result(rv);
+ #endif
+ }
++#if BUILDFLAG(IS_FREEBSD)
++#pragma GCC diagnostic pop
++#endif
+ #endif
+
+ // This is an implementation used for AutoLock templated on the lock type.
diff --git a/devel/electron28/files/patch-base_syslog__logging.cc b/devel/electron28/files/patch-base_syslog__logging.cc
new file mode 100644
index 000000000000..5c1921e82d4a
--- /dev/null
+++ b/devel/electron28/files/patch-base_syslog__logging.cc
@@ -0,0 +1,20 @@
+--- base/syslog_logging.cc.orig 2022-02-28 16:54:41 UTC
++++ base/syslog_logging.cc
+@@ -15,7 +15,7 @@
+ #include "base/strings/string_util.h"
+ #include "base/win/scoped_handle.h"
+ #include "base/win/win_util.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // <syslog.h> defines LOG_INFO, LOG_WARNING macros that could conflict with
+ // base::LOG_INFO, base::LOG_WARNING.
+ #include <syslog.h>
+@@ -147,7 +147,7 @@ EventLogMessage::~EventLogMessage() {
+
+ if (user_sid != nullptr)
+ ::LocalFree(user_sid);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kEventSource[] = "chrome";
+ openlog(kEventSource, LOG_NOWAIT | LOG_PID, LOG_USER);
+ // We can't use the defined names for the logging severity from syslog.h
diff --git a/devel/electron28/files/patch-base_system_sys__info.cc b/devel/electron28/files/patch-base_system_sys__info.cc
new file mode 100644
index 000000000000..2759f3169b2b
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info.cc
@@ -0,0 +1,11 @@
+--- base/system/sys_info.cc.orig 2023-11-29 21:39:40 UTC
++++ base/system/sys_info.cc
+@@ -225,7 +225,7 @@ void SysInfo::GetHardwareInfo(base::OnceCallback<void(
+ #endif
+
+ void SysInfo::GetHardwareInfo(base::OnceCallback<void(HardwareInfo)> callback) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ constexpr base::TaskTraits kTraits = {base::MayBlock()};
+ #else
+ constexpr base::TaskTraits kTraits = {};
diff --git a/devel/electron28/files/patch-base_system_sys__info.h b/devel/electron28/files/patch-base_system_sys__info.h
new file mode 100644
index 000000000000..38d9e9ec8887
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info.h
@@ -0,0 +1,20 @@
+--- base/system/sys_info.h.orig 2023-11-29 21:39:40 UTC
++++ base/system/sys_info.h
+@@ -321,6 +321,8 @@ class BASE_EXPORT SysInfo {
+ static void ResetCpuSecurityMitigationsEnabledForTesting();
+ #endif
+
++ static uint64_t MaxSharedMemorySize();
++
+ private:
+ friend class test::ScopedAmountOfPhysicalMemoryOverride;
+ FRIEND_TEST_ALL_PREFIXES(SysInfoTest, AmountOfAvailablePhysicalMemory);
+@@ -333,7 +335,7 @@ class BASE_EXPORT SysInfo {
+ static HardwareInfo GetHardwareInfoSync();
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ static uint64_t AmountOfAvailablePhysicalMemory(
+ const SystemMemoryInfoKB& meminfo);
+ #endif
diff --git a/devel/electron28/files/patch-base_system_sys__info__freebsd.cc b/devel/electron28/files/patch-base_system_sys__info__freebsd.cc
new file mode 100644
index 000000000000..81e026100278
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info__freebsd.cc
@@ -0,0 +1,115 @@
+--- base/system/sys_info_freebsd.cc.orig 2022-09-01 17:22:07 UTC
++++ base/system/sys_info_freebsd.cc
+@@ -9,30 +9,106 @@
+ #include <sys/sysctl.h>
+
+ #include "base/notreached.h"
++#include "base/process/process_metrics.h"
++#include "base/strings/string_util.h"
+
+ namespace base {
+
+-int64_t SysInfo::AmountOfPhysicalMemoryImpl() {
+- int pages, page_size;
++int SysInfo::NumberOfProcessors() {
++ int mib[] = {CTL_HW, HW_NCPU};
++ int ncpu;
++ size_t size = sizeof(ncpu);
++ if (sysctl(mib, std::size(mib), &ncpu, &size, NULL, 0) < 0) {
++ NOTREACHED();
++ return 1;
++ }
++ return ncpu;
++}
++
++uint64_t SysInfo::AmountOfPhysicalMemoryImpl() {
++ int pages, page_size, r = 0;
+ size_t size = sizeof(pages);
+- sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0);
+- sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
+- if (pages == -1 || page_size == -1) {
++
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0);
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
++
++ if (r == -1) {
+ NOTREACHED();
+ return 0;
+ }
+- return static_cast<int64_t>(pages) * page_size;
++
++ return static_cast<uint64_t>(pages) * page_size;
+ }
+
++uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() {
++ int page_size, r = 0;
++ unsigned int pgfree, pginact, pgcache;
++ size_t size = sizeof(page_size);
++ size_t szpg = sizeof(pgfree);
++
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0);
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_free_count", &pgfree, &szpg, NULL, 0);
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_inactive_count", &pginact, &szpg, NULL, 0);
++ if (r == 0)
++ r = sysctlbyname("vm.stats.vm.v_cache_count", &pgcache, &szpg, NULL, 0);
++
++ if (r == -1) {
++ NOTREACHED();
++ return 0;
++ }
++
++ return static_cast<uint64_t>((pgfree + pginact + pgcache) * page_size);
++}
++
+ // static
++uint64_t SysInfo::AmountOfAvailablePhysicalMemory(const SystemMemoryInfoKB& info) {
++ uint64_t res_kb = info.available != 0
++ ? info.available - info.active_file
++ : info.free + info.reclaimable + info.inactive_file;
++ return res_kb * 1024;
++}
++
++// static
++std::string SysInfo::CPUModelName() {
++ int mib[] = { CTL_HW, HW_MODEL };
++ char name[256];
++ size_t size = std::size(name);
++
++ if (sysctl(mib, std::size(mib), &name, &size, NULL, 0) == 0) {
++ return name;
++ }
++
++ return std::string();
++}
++
++// static
+ uint64_t SysInfo::MaxSharedMemorySize() {
+ size_t limit;
+ size_t size = sizeof(limit);
++
+ if (sysctlbyname("kern.ipc.shmmax", &limit, &size, NULL, 0) < 0) {
+ NOTREACHED();
+ return 0;
+ }
++
+ return static_cast<uint64_t>(limit);
++}
++
++SysInfo::HardwareInfo SysInfo::GetHardwareInfoSync() {
++ HardwareInfo info;
++
++ info.manufacturer = "FreeBSD";
++ info.model = HardwareModelName();
++
++ DCHECK(IsStringUTF8(info.manufacturer));
++ DCHECK(IsStringUTF8(info.model));
++
++ return info;
+ }
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_system_sys__info__openbsd.cc b/devel/electron28/files/patch-base_system_sys__info__openbsd.cc
new file mode 100644
index 000000000000..13f0bc199bd4
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info__openbsd.cc
@@ -0,0 +1,87 @@
+--- base/system/sys_info_openbsd.cc.orig 2023-11-29 21:39:40 UTC
++++ base/system/sys_info_openbsd.cc
+@@ -12,6 +12,7 @@
+
+ #include "base/notreached.h"
+ #include "base/posix/sysctl.h"
++#include "base/strings/string_util.h"
+
+ namespace {
+
+@@ -27,9 +28,15 @@ namespace base {
+
+ namespace base {
+
++// pledge(2)
++int64_t aofpmem = 0;
++int64_t aofapmem = 0;
++int64_t shmmax = 0;
++char cpumodel[256];
++
+ // static
+ int SysInfo::NumberOfProcessors() {
+- int mib[] = {CTL_HW, HW_NCPU};
++ int mib[] = {CTL_HW, HW_NCPUONLINE};
+ int ncpu;
+ size_t size = sizeof(ncpu);
+ if (sysctl(mib, std::size(mib), &ncpu, &size, NULL, 0) < 0) {
+@@ -41,10 +48,26 @@ uint64_t SysInfo::AmountOfPhysicalMemoryImpl() {
+
+ // static
+ uint64_t SysInfo::AmountOfPhysicalMemoryImpl() {
+- return AmountOfMemory(_SC_PHYS_PAGES);
++ // pledge(2)
++ if (!aofpmem)
++ aofpmem = AmountOfMemory(_SC_PHYS_PAGES);
++ return aofpmem;
+ }
+
+ // static
++std::string SysInfo::CPUModelName() {
++ int mib[] = {CTL_HW, HW_MODEL};
++ size_t len = std::size(cpumodel);
++
++ if (cpumodel[0] == '\0') {
++ if (sysctl(mib, std::size(mib), cpumodel, &len, NULL, 0) < 0)
++ return std::string();
++ }
++
++ return std::string(cpumodel, len - 1);
++}
++
++// static
+ uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() {
+ // We should add inactive file-backed memory also but there is no such
+ // information from OpenBSD unfortunately.
+@@ -56,16 +79,28 @@ uint64_t SysInfo::MaxSharedMemorySize() {
+ int mib[] = {CTL_KERN, KERN_SHMINFO, KERN_SHMINFO_SHMMAX};
+ size_t limit;
+ size_t size = sizeof(limit);
++ // pledge(2)
++ if (shmmax)
++ goto out;
+ if (sysctl(mib, std::size(mib), &limit, &size, NULL, 0) < 0) {
+ NOTREACHED();
+ return 0;
+ }
+- return static_cast<uint64_t>(limit);
++ shmmax = static_cast<uint64_t>(limit);
++out:
++ return shmmax;
+ }
+
+ // static
+-std::string SysInfo::CPUModelName() {
+- return StringSysctl({CTL_HW, HW_MODEL}).value();
++SysInfo::HardwareInfo SysInfo::GetHardwareInfoSync() {
++ HardwareInfo info;
++ // Set the manufacturer to "OpenBSD" and the model to
++ // an empty string.
++ info.manufacturer = "OpenBSD";
++ info.model = HardwareModelName();
++ DCHECK(IsStringUTF8(info.manufacturer));
++ DCHECK(IsStringUTF8(info.model));
++ return info;
+ }
+
+ } // namespace base
diff --git a/devel/electron28/files/patch-base_system_sys__info__posix.cc b/devel/electron28/files/patch-base_system_sys__info__posix.cc
new file mode 100644
index 000000000000..4448fb0a734e
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info__posix.cc
@@ -0,0 +1,29 @@
+--- base/system/sys_info_posix.cc.orig 2023-11-29 21:39:40 UTC
++++ base/system/sys_info_posix.cc
+@@ -117,7 +117,7 @@ namespace base {
+
+ namespace base {
+
+-#if !BUILDFLAG(IS_OPENBSD)
++#if !BUILDFLAG(IS_BSD)
+ // static
+ int SysInfo::NumberOfProcessors() {
+ #if BUILDFLAG(IS_MAC)
+@@ -174,7 +174,7 @@ int SysInfo::NumberOfProcessors() {
+
+ return cached_num_cpus;
+ }
+-#endif // !BUILDFLAG(IS_OPENBSD)
++#endif // !BUILDFLAG(IS_BSD)
+
+ // static
+ uint64_t SysInfo::AmountOfVirtualMemory() {
+@@ -264,6 +264,8 @@ std::string SysInfo::OperatingSystemArchitecture() {
+ arch = "x86";
+ } else if (arch == "amd64") {
+ arch = "x86_64";
++ } else if (arch == "arm64") {
++ arch = "aarch64";
+ } else if (std::string(info.sysname) == "AIX") {
+ arch = "ppc64";
+ }
diff --git a/devel/electron28/files/patch-base_system_sys__info__unittest.cc b/devel/electron28/files/patch-base_system_sys__info__unittest.cc
new file mode 100644
index 000000000000..34b3a8a2bdf6
--- /dev/null
+++ b/devel/electron28/files/patch-base_system_sys__info__unittest.cc
@@ -0,0 +1,20 @@
+--- base/system/sys_info_unittest.cc.orig 2023-08-10 01:48:31 UTC
++++ base/system/sys_info_unittest.cc
+@@ -263,12 +263,16 @@ TEST_F(SysInfoTest, GetHardwareInfo) {
+ EXPECT_TRUE(IsStringUTF8(hardware_info->model));
+ bool empty_result_expected =
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || \
++ BUILDFLAG(IS_BSD)
+ false;
+ #else
+ true;
+ #endif
+ EXPECT_EQ(hardware_info->manufacturer.empty(), empty_result_expected);
++#if BUILDFLAG(IS_BSD)
++ empty_result_expected = true;
++#endif
+ EXPECT_EQ(hardware_info->model.empty(), empty_result_expected);
+ }
+
diff --git a/devel/electron28/files/patch-base_task_thread__pool_environment__config__unittest.cc b/devel/electron28/files/patch-base_task_thread__pool_environment__config__unittest.cc
new file mode 100644
index 000000000000..abb639bc986d
--- /dev/null
+++ b/devel/electron28/files/patch-base_task_thread__pool_environment__config__unittest.cc
@@ -0,0 +1,11 @@
+--- base/task/thread_pool/environment_config_unittest.cc.orig 2022-08-31 12:19:35 UTC
++++ base/task/thread_pool/environment_config_unittest.cc
+@@ -15,7 +15,7 @@ TEST(ThreadPoolEnvironmentConfig, CanUseBackgroundPrio
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
+ EXPECT_TRUE(CanUseBackgroundThreadTypeForWorkerThread());
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_NACL)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_NACL) || BUILDFLAG(IS_BSD)
+ EXPECT_FALSE(CanUseBackgroundThreadTypeForWorkerThread());
+ #else
+ #error Platform doesn't match any block
diff --git a/devel/electron28/files/patch-base_test_launcher_test__launcher.cc b/devel/electron28/files/patch-base_test_launcher_test__launcher.cc
new file mode 100644
index 000000000000..48cc21f620c2
--- /dev/null
+++ b/devel/electron28/files/patch-base_test_launcher_test__launcher.cc
@@ -0,0 +1,10 @@
+--- base/test/launcher/test_launcher.cc.orig 2023-11-29 21:39:40 UTC
++++ base/test/launcher/test_launcher.cc
+@@ -70,6 +70,7 @@
+ #include "testing/gtest/include/gtest/gtest.h"
+
+ #if BUILDFLAG(IS_POSIX)
++#include <signal.h>
+ #include <fcntl.h>
+
+ #include "base/files/file_descriptor_watcher_posix.h"
diff --git a/devel/electron28/files/patch-base_test_test__file__util__linux.cc b/devel/electron28/files/patch-base_test_test__file__util__linux.cc
new file mode 100644
index 000000000000..a64bf500d0dd
--- /dev/null
+++ b/devel/electron28/files/patch-base_test_test__file__util__linux.cc
@@ -0,0 +1,13 @@
+--- base/test/test_file_util_linux.cc.orig 2023-10-19 19:57:58 UTC
++++ base/test/test_file_util_linux.cc
+@@ -54,8 +54,10 @@ bool EvictFileFromSystemCache(const FilePath& file) {
+ return false;
+ if (fdatasync(fd.get()) != 0)
+ return false;
++#if !BUILDFLAG(IS_BSD)
+ if (posix_fadvise(fd.get(), 0, 0, POSIX_FADV_DONTNEED) != 0)
+ return false;
++#endif
+ return true;
+ }
+
diff --git a/devel/electron28/files/patch-base_test_test__file__util__posix.cc b/devel/electron28/files/patch-base_test_test__file__util__posix.cc
new file mode 100644
index 000000000000..37c9bbbb70ec
--- /dev/null
+++ b/devel/electron28/files/patch-base_test_test__file__util__posix.cc
@@ -0,0 +1,11 @@
+--- base/test/test_file_util_posix.cc.orig 2022-02-28 16:54:41 UTC
++++ base/test/test_file_util_posix.cc
+@@ -88,7 +88,7 @@ void SyncPageCacheToDisk() {
+ }
+
+ #if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_APPLE) && \
+- !BUILDFLAG(IS_ANDROID)
++ !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_BSD)
+ bool EvictFileFromSystemCache(const FilePath& file) {
+ // There doesn't seem to be a POSIX way to cool the disk cache.
+ NOTIMPLEMENTED();
diff --git a/devel/electron28/files/patch-base_threading_hang__watcher.cc b/devel/electron28/files/patch-base_threading_hang__watcher.cc
new file mode 100644
index 000000000000..2860dc614b05
--- /dev/null
+++ b/devel/electron28/files/patch-base_threading_hang__watcher.cc
@@ -0,0 +1,11 @@
+--- base/threading/hang_watcher.cc.orig 2023-10-19 19:57:58 UTC
++++ base/threading/hang_watcher.cc
+@@ -331,7 +331,7 @@ void HangWatcher::InitializeOnMainThread(ProcessType p
+
+ bool enable_hang_watcher = base::FeatureList::IsEnabled(kEnableHangWatcher);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ if (is_zygote_child) {
+ enable_hang_watcher =
+ enable_hang_watcher &&
diff --git a/devel/electron28/files/patch-base_threading_platform__thread__bsd.cc b/devel/electron28/files/patch-base_threading_platform__thread__bsd.cc
new file mode 100644
index 000000000000..62c58e833494
--- /dev/null
+++ b/devel/electron28/files/patch-base_threading_platform__thread__bsd.cc
@@ -0,0 +1,34 @@
+--- base/threading/platform_thread_bsd.cc.orig 2023-10-25 09:14:08 UTC
++++ base/threading/platform_thread_bsd.cc
+@@ -0,0 +1,31 @@
++// Copyright 2023 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++// Description: These are stubs for *BSD.
++
++#include "base/threading/platform_thread.h"
++
++namespace base {
++namespace internal {
++
++bool CanSetThreadTypeToRealtimeAudio() {
++ return false;
++}
++
++bool SetCurrentThreadTypeForPlatform(ThreadType thread_type,
++ MessagePumpType pump_type_hint) {
++ return false;
++}
++
++absl::optional<ThreadPriorityForTest>
++GetCurrentThreadPriorityForPlatformForTest() {
++ return absl::nullopt;
++}
++} // namespace internal
++
++// static
++void PlatformThreadBase::SetName(const std::string& name) {
++ SetNameCommon(name);
++}
++
++} // namespace base
diff --git a/devel/electron28/files/patch-base_threading_platform__thread__internal__posix.cc b/devel/electron28/files/patch-base_threading_platform__thread__internal__posix.cc
new file mode 100644
index 000000000000..ef986a857f49
--- /dev/null
+++ b/devel/electron28/files/patch-base_threading_platform__thread__internal__posix.cc
@@ -0,0 +1,11 @@
+--- base/threading/platform_thread_internal_posix.cc.orig 2023-10-19 19:57:58 UTC
++++ base/threading/platform_thread_internal_posix.cc
+@@ -41,7 +41,7 @@ ThreadPriorityForTest NiceValueToThreadPriorityForTest
+ }
+
+ int GetCurrentThreadNiceValue() {
+-#if BUILDFLAG(IS_NACL)
++#if BUILDFLAG(IS_NACL) || BUILDFLAG(IS_BSD)
+ NOTIMPLEMENTED();
+ return 0;
+ #else
diff --git a/devel/electron28/files/patch-base_threading_platform__thread__posix.cc b/devel/electron28/files/patch-base_threading_platform__thread__posix.cc
new file mode 100644
index 000000000000..f24d1b116bf2
--- /dev/null
+++ b/devel/electron28/files/patch-base_threading_platform__thread__posix.cc
@@ -0,0 +1,45 @@
+--- base/threading/platform_thread_posix.cc.orig 2023-10-19 19:57:58 UTC
++++ base/threading/platform_thread_posix.cc
+@@ -76,12 +76,12 @@ void* ThreadFunc(void* params) {
+ if (!thread_params->joinable)
+ base::DisallowSingleton();
+
+-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(USE_STARSCAN)
++#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(USE_STARSCAN) && !BUILDFLAG(IS_BSD)
+ partition_alloc::internal::PCScan::NotifyThreadCreated(
+ partition_alloc::internal::GetStackPointer());
+ #endif
+
+-#if !BUILDFLAG(IS_NACL)
++#if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(IS_APPLE)
+ PlatformThread::SetCurrentThreadRealtimePeriodValue(
+ delegate->GetRealtimePeriod());
+@@ -353,7 +353,7 @@ void PlatformThreadBase::Detach(PlatformThreadHandle t
+
+ // static
+ bool PlatformThreadBase::CanChangeThreadType(ThreadType from, ThreadType to) {
+-#if BUILDFLAG(IS_NACL)
++#if BUILDFLAG(IS_NACL) || BUILDFLAG(IS_BSD)
+ return false;
+ #else
+ if (from >= to) {
+@@ -374,6 +374,9 @@ void SetCurrentThreadTypeImpl(ThreadType thread_type,
+ MessagePumpType pump_type_hint) {
+ #if BUILDFLAG(IS_NACL)
+ NOTIMPLEMENTED();
++// avoid pledge(2) violation
++#elif BUILDFLAG(IS_BSD)
++ NOTIMPLEMENTED();
+ #else
+ if (internal::SetCurrentThreadTypeForPlatform(thread_type, pump_type_hint))
+ return;
+@@ -396,7 +399,7 @@ void SetCurrentThreadTypeImpl(ThreadType thread_type,
+
+ // static
+ ThreadPriorityForTest PlatformThreadBase::GetCurrentThreadPriorityForTest() {
+-#if BUILDFLAG(IS_NACL)
++#if BUILDFLAG(IS_NACL) || BUILDFLAG(IS_BSD)
+ NOTIMPLEMENTED();
+ return ThreadPriorityForTest::kNormal;
+ #else
diff --git a/devel/electron28/files/patch-base_threading_platform__thread__unittest.cc b/devel/electron28/files/patch-base_threading_platform__thread__unittest.cc
new file mode 100644
index 000000000000..6808637e03e4
--- /dev/null
+++ b/devel/electron28/files/patch-base_threading_platform__thread__unittest.cc
@@ -0,0 +1,38 @@
+--- base/threading/platform_thread_unittest.cc.orig 2023-11-29 21:39:40 UTC
++++ base/threading/platform_thread_unittest.cc
+@@ -32,7 +32,7 @@
+ #include "base/time/time.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <pthread.h>
+ #include <sys/syscall.h>
+ #include <sys/types.h>
+@@ -423,7 +423,7 @@ TEST(PlatformThreadTest, CanChangeThreadType) {
+ // and hardcodes what we know. Please inform scheduler-dev@chromium.org if this
+ // proprerty changes for a given platform.
+ TEST(PlatformThreadTest, CanChangeThreadType) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Ubuntu, RLIMIT_NICE and RLIMIT_RTPRIO are 0 by default, so we won't be
+ // able to increase priority to any level unless we are root (euid == 0).
+ bool kCanIncreasePriority = false;
+@@ -706,12 +706,16 @@ INSTANTIATE_TEST_SUITE_P(
+
+ #endif // BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ namespace {
+
+ bool IsTidCacheCorrect() {
++#if BUILDFLAG(IS_BSD)
++ return PlatformThread::CurrentId() == reinterpret_cast<int64_t>(pthread_self());
++#else
+ return PlatformThread::CurrentId() == syscall(__NR_gettid);
++#endif
+ }
+
+ void* CheckTidCacheCorrectWrapper(void*) {
diff --git a/devel/electron28/files/patch-base_trace__event_malloc__dump__provider.cc b/devel/electron28/files/patch-base_trace__event_malloc__dump__provider.cc
new file mode 100644
index 000000000000..099a1db9f3a8
--- /dev/null
+++ b/devel/electron28/files/patch-base_trace__event_malloc__dump__provider.cc
@@ -0,0 +1,30 @@
+--- base/trace_event/malloc_dump_provider.cc.orig 2023-10-19 19:57:58 UTC
++++ base/trace_event/malloc_dump_provider.cc
+@@ -25,6 +25,8 @@
+
+ #if BUILDFLAG(IS_APPLE)
+ #include <malloc/malloc.h>
++#elif BUILDFLAG(IS_BSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -188,7 +190,7 @@ void ReportAppleAllocStats(size_t* total_virtual_size,
+
+ #if (BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(IS_ANDROID)) || \
+ (!BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && !BUILDFLAG(IS_WIN) && \
+- !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_FUCHSIA))
++ !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_BSD))
+ void ReportMallinfoStats(ProcessMemoryDump* pmd,
+ size_t* total_virtual_size,
+ size_t* resident_size,
+@@ -359,6 +361,9 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDump
+ &allocated_objects_count);
+ #elif BUILDFLAG(IS_FUCHSIA)
+ // TODO(fuchsia): Port, see https://crbug.com/706592.
++#elif BUILDFLAG(IS_BSD)
++ total_virtual_size = 0;
++ allocated_objects_size = 0;
+ #else
+ ReportMallinfoStats(/*pmd=*/nullptr, &total_virtual_size, &resident_size,
+ &allocated_objects_size, &allocated_objects_count);
diff --git a/devel/electron28/files/patch-base_trace__event_memory__dump__manager.cc b/devel/electron28/files/patch-base_trace__event_memory__dump__manager.cc
new file mode 100644
index 000000000000..f1f228e38e7b
--- /dev/null
+++ b/devel/electron28/files/patch-base_trace__event_memory__dump__manager.cc
@@ -0,0 +1,11 @@
+--- base/trace_event/memory_dump_manager.cc.orig 2022-03-25 21:59:56 UTC
++++ base/trace_event/memory_dump_manager.cc
+@@ -82,7 +82,7 @@ const char* const MemoryDumpManager::kSystemAllocatorP
+ #if defined(MALLOC_MEMORY_TRACING_SUPPORTED)
+ MallocDumpProvider::kAllocatedObjects;
+ #else
+- nullptr;
++ "";
+ #endif
+
+ // static
diff --git a/devel/electron28/files/patch-base_trace__event_process__memory__dump.cc b/devel/electron28/files/patch-base_trace__event_process__memory__dump.cc
new file mode 100644
index 000000000000..4a938cc94c34
--- /dev/null
+++ b/devel/electron28/files/patch-base_trace__event_process__memory__dump.cc
@@ -0,0 +1,20 @@
+--- base/trace_event/process_memory_dump.cc.orig 2022-09-24 10:57:32 UTC
++++ base/trace_event/process_memory_dump.cc
+@@ -112,7 +112,7 @@ absl::optional<size_t> ProcessMemoryDump::CountResiden
+ #if BUILDFLAG(IS_WIN)
+ std::unique_ptr<PSAPI_WORKING_SET_EX_INFORMATION[]> vec(
+ new PSAPI_WORKING_SET_EX_INFORMATION[max_vec_size]);
+-#elif BUILDFLAG(IS_APPLE)
++#elif BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<char[]> vec(new char[max_vec_size]);
+ #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+ std::unique_ptr<unsigned char[]> vec(new unsigned char[max_vec_size]);
+@@ -134,7 +134,7 @@ absl::optional<size_t> ProcessMemoryDump::CountResiden
+
+ for (size_t i = 0; i < page_count; i++)
+ resident_page_count += vec[i].VirtualAttributes.Valid;
+-#elif BUILDFLAG(IS_FUCHSIA)
++#elif BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/851760): Implement counting resident bytes.
+ // For now, log and avoid unused variable warnings.
+ NOTIMPLEMENTED_LOG_ONCE();
diff --git a/devel/electron28/files/patch-base_trace__event_trace__log.cc b/devel/electron28/files/patch-base_trace__event_trace__log.cc
new file mode 100644
index 000000000000..7ac057b3b291
--- /dev/null
+++ b/devel/electron28/files/patch-base_trace__event_trace__log.cc
@@ -0,0 +1,16 @@
+--- base/trace_event/trace_log.cc.orig 2023-11-29 21:39:40 UTC
++++ base/trace_event/trace_log.cc
+@@ -2191,8 +2191,13 @@ void TraceLog::OnSetup(const perfetto::DataSourceBase:
+ #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
+ void TraceLog::OnSetup(const perfetto::DataSourceBase::SetupArgs& args) {
+ AutoLock lock(track_event_lock_);
++#if defined(__clang__) && (__clang_major__ >= 16)
+ track_event_sessions_.emplace_back(args.internal_instance_index, *args.config,
+ args.backend_type);
++#else
++ track_event_sessions_.emplace_back(TrackEventSession{args.internal_instance_index, *args.config,
++ args.backend_type});
++#endif
+ }
+
+ void TraceLog::OnStart(const perfetto::DataSourceBase::StartArgs&) {
diff --git a/devel/electron28/files/patch-base_tracing_trace__time.cc b/devel/electron28/files/patch-base_tracing_trace__time.cc
new file mode 100644
index 000000000000..36c6113518f4
--- /dev/null
+++ b/devel/electron28/files/patch-base_tracing_trace__time.cc
@@ -0,0 +1,28 @@
+--- base/tracing/trace_time.cc.orig 2022-02-28 16:54:41 UTC
++++ base/tracing/trace_time.cc
+@@ -8,13 +8,17 @@
+ #include "build/build_config.h"
+ #include "third_party/perfetto/include/perfetto/base/time.h"
+
++#if BUILDFLAG(IS_FREEBSD)
++#define CLOCK_BOOTTIME CLOCK_UPTIME
++#endif
++
+ namespace base {
+ namespace tracing {
+
+ int64_t TraceBootTicksNow() {
+ // On Windows and Mac, TRACE_TIME_TICKS_NOW() behaves like boottime already.
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ struct timespec ts;
+ int res = clock_gettime(CLOCK_BOOTTIME, &ts);
+ if (res != -1)
+@@ -24,4 +28,4 @@ int64_t TraceBootTicksNow() {
+ }
+
+ } // namespace tracing
+-} // namespace base
+\ No newline at end of file
++} // namespace base
diff --git a/devel/electron28/files/patch-base_tracing_trace__time.h b/devel/electron28/files/patch-base_tracing_trace__time.h
new file mode 100644
index 000000000000..0394e382ee6e
--- /dev/null
+++ b/devel/electron28/files/patch-base_tracing_trace__time.h
@@ -0,0 +1,11 @@
+--- base/tracing/trace_time.h.orig 2022-02-28 16:54:41 UTC
++++ base/tracing/trace_time.h
+@@ -12,7 +12,7 @@ namespace base {
+ namespace tracing {
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Linux, Android, and Fuchsia all use CLOCK_MONOTONIC. See crbug.com/166153
+ // about efforts to unify base::TimeTicks across all platforms.
+ constexpr perfetto::protos::pbzero::BuiltinClock kTraceClockId =
diff --git a/devel/electron28/files/patch-build_config_BUILD.gn b/devel/electron28/files/patch-build_config_BUILD.gn
new file mode 100644
index 000000000000..e49d3088166c
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_BUILD.gn
@@ -0,0 +1,13 @@
+--- build/config/BUILD.gn.orig 2023-08-10 01:48:31 UTC
++++ build/config/BUILD.gn
+@@ -214,6 +214,10 @@ config("default_libs") {
+ # Targets should choose to explicitly link frameworks they require. Since
+ # linking can have run-time side effects, nothing should be listed here.
+ libs = []
++ } else if (is_bsd) {
++ libs = [
++ "pthread",
++ ]
+ } else if (is_linux || is_chromeos) {
+ libs = [
+ "dl",
diff --git a/devel/electron28/files/patch-build_config_BUILDCONFIG.gn b/devel/electron28/files/patch-build_config_BUILDCONFIG.gn
new file mode 100644
index 000000000000..987fef14793c
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_BUILDCONFIG.gn
@@ -0,0 +1,45 @@
+--- build/config/BUILDCONFIG.gn.orig 2023-02-15 13:08:45 UTC
++++ build/config/BUILDCONFIG.gn
+@@ -139,7 +139,8 @@ declare_args() {
+ is_official_build = false
+
+ # Set to true when compiling with the Clang compiler.
+- is_clang = current_os != "linux" ||
++ is_clang = current_os != "linux" || current_os == "openbsd" ||
++ current_os == "freebsd" ||
+ (current_cpu != "s390x" && current_cpu != "s390" &&
+ current_cpu != "ppc64" && current_cpu != "ppc" &&
+ current_cpu != "mips" && current_cpu != "mips64" &&
+@@ -228,6 +229,10 @@ if (host_toolchain == "") {
+ host_toolchain = "//build/toolchain/aix:$host_cpu"
+ } else if (host_os == "zos") {
+ host_toolchain = "//build/toolchain/zos:$host_cpu"
++ } else if (host_os == "openbsd") {
++ host_toolchain = "//build/toolchain/openbsd:clang_$host_cpu"
++ } else if (host_os == "freebsd") {
++ host_toolchain = "//build/toolchain/freebsd:clang_$host_cpu"
+ } else {
+ assert(false, "Unsupported host_os: $host_os")
+ }
+@@ -271,6 +276,8 @@ if (target_os == "android") {
+ _default_toolchain = "//build/toolchain/aix:$target_cpu"
+ } else if (target_os == "zos") {
+ _default_toolchain = "//build/toolchain/zos:$target_cpu"
++} else if (target_os == "openbsd" || target_os == "freebsd") {
++ _default_toolchain = host_toolchain
+ } else {
+ assert(false, "Unsupported target_os: $target_os")
+ }
+@@ -305,7 +312,11 @@ is_android = current_os == "android"
+ is_chromeos = current_os == "chromeos"
+ is_fuchsia = current_os == "fuchsia"
+ is_ios = current_os == "ios"
+-is_linux = current_os == "linux"
++is_linux = current_os == "linux" || current_os == "openbsd" ||
++ current_os == "freebsd"
++is_openbsd = current_os == "openbsd"
++is_freebsd = current_os == "freebsd"
++is_bsd = current_os == "openbsd" || current_os == "freebsd"
+ is_mac = current_os == "mac"
+ is_nacl = current_os == "nacl"
+ is_win = current_os == "win" || current_os == "winuwp"
diff --git a/devel/electron28/files/patch-build_config_compiler_BUILD.gn b/devel/electron28/files/patch-build_config_compiler_BUILD.gn
new file mode 100644
index 000000000000..09d8ced6be36
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_compiler_BUILD.gn
@@ -0,0 +1,140 @@
+--- build/config/compiler/BUILD.gn.orig 2023-11-29 21:39:40 UTC
++++ build/config/compiler/BUILD.gn
+@@ -202,7 +202,7 @@ declare_args() {
+ # This greatly reduces the size of debug builds, at the cost of
+ # debugging information which is required by some specialized
+ # debugging tools.
+- simple_template_names = is_clang && !is_nacl && !is_win && !is_apple
++ simple_template_names = is_clang && !is_nacl && !is_win && !is_apple && !is_bsd
+ }
+
+ declare_args() {
+@@ -266,13 +266,16 @@ config("no_unresolved_symbols") {
+ # Compiler instrumentation can introduce dependencies in DSOs to symbols in
+ # the executable they are loaded into, so they are unresolved at link-time.
+ config("no_unresolved_symbols") {
+- if (!using_sanitizer &&
++ if (!using_sanitizer && !is_bsd &&
+ (is_linux || is_chromeos || is_android || is_fuchsia)) {
+ ldflags = [
+ "-Wl,-z,defs",
+ "-Wl,--as-needed",
+ ]
+ }
++ if (current_cpu == "x86" && is_openbsd) {
++ ldflags = [ "-Wl,-z,notext" ]
++ }
+ }
+
+ # compiler ---------------------------------------------------------------------
+@@ -518,6 +521,10 @@ config("compiler") {
+ }
+ }
+
++ if (is_openbsd) {
++ ldflags += [ "-Wl,-z,wxneeded" ]
++ }
++
+ # Linux-specific compiler flags setup.
+ # ------------------------------------
+ if (use_gold) {
+@@ -593,7 +600,7 @@ config("compiler") {
+ ldflags += [ "-Wl,-z,keep-text-section-prefix" ]
+ }
+
+- if (is_clang && !is_nacl && current_os != "zos") {
++ if (is_clang && !is_nacl && current_os != "zos" && !is_bsd) {
+ cflags += [ "-fcrash-diagnostics-dir=" + clang_diagnostic_dir ]
+ if (save_reproducers_on_lld_crash && use_lld) {
+ ldflags += [
+@@ -800,7 +807,7 @@ config("compiler") {
+ if (is_apple) {
+ ldflags += [ "-Wcrl,object_path_lto" ]
+ }
+- if (!is_chromeos) {
++ if (!is_chromeos && !is_bsd) {
+ # TODO(https://crbug.com/972449): turn on for ChromeOS when that
+ # toolchain has this flag.
+ # We only use one version of LLVM within a build so there's no need to
+@@ -1173,7 +1180,7 @@ config("compiler_cpu_abi") {
+ ]
+ }
+ } else if (current_cpu == "arm") {
+- if (is_clang && !is_android && !is_nacl &&
++ if (is_clang && !is_android && !is_nacl && !is_bsd &&
+ !(is_chromeos_lacros && is_chromeos_device)) {
+ cflags += [ "--target=arm-linux-gnueabihf" ]
+ ldflags += [ "--target=arm-linux-gnueabihf" ]
+@@ -1188,7 +1195,7 @@ config("compiler_cpu_abi") {
+ cflags += [ "-mtune=$arm_tune" ]
+ }
+ } else if (current_cpu == "arm64") {
+- if (is_clang && !is_android && !is_nacl && !is_fuchsia &&
++ if (is_clang && !is_android && !is_nacl && !is_fuchsia && !is_bsd &&
+ !(is_chromeos_lacros && is_chromeos_device)) {
+ cflags += [ "--target=aarch64-linux-gnu" ]
+ ldflags += [ "--target=aarch64-linux-gnu" ]
+@@ -1523,7 +1530,7 @@ config("compiler_deterministic") {
+ # different build directory like "out/feature_a" and "out/feature_b" if
+ # we build same files with same compile flag.
+ # Other paths are already given in relative, no need to normalize them.
+- if (is_nacl) {
++ if (is_nacl || is_bsd) {
+ # TODO(https://crbug.com/1231236): Use -ffile-compilation-dir= here.
+ cflags += [
+ "-Xclang",
+@@ -1575,7 +1582,7 @@ config("clang_revision") {
+ }
+
+ config("clang_revision") {
+- if (is_clang && clang_base_path == default_clang_base_path) {
++ if (is_clang && !is_bsd && clang_base_path == default_clang_base_path) {
+ update_args = [
+ "--print-revision",
+ "--verify-version=$clang_version",
+@@ -1860,7 +1867,7 @@ config("default_warnings") {
+ "-Wno-ignored-pragma-optimize",
+ ]
+
+- if (!is_nacl) {
++ if (!is_nacl && !is_bsd) {
+ cflags += [
+ # TODO(crbug.com/1343975) Evaluate and possibly enable.
+ "-Wno-deprecated-builtins",
+@@ -2066,7 +2073,7 @@ config("no_chromium_code") {
+ # third-party libraries.
+ "-Wno-c++11-narrowing",
+ ]
+- if (!is_nacl) {
++ if (!is_nacl && !is_freebsd) {
+ cflags += [
+ # Disabled for similar reasons as -Wunused-variable.
+ "-Wno-unused-but-set-variable",
+@@ -2595,7 +2602,7 @@ config("afdo") {
+ # There are some targeted places that AFDO regresses, so we provide a separate
+ # config to allow AFDO to be disabled per-target.
+ config("afdo") {
+- if (is_clang) {
++ if (is_clang && !is_bsd) {
+ cflags = []
+ if (clang_emit_debug_info_for_profiling) {
+ # Add the following flags to generate debug info for profiling.
+@@ -2622,7 +2629,7 @@ config("afdo") {
+ cflags += [ "-Wno-backend-plugin" ]
+ inputs = [ _clang_sample_profile ]
+ }
+- } else if (auto_profile_path != "" && is_a_target_toolchain) {
++ } else if (auto_profile_path != "" && is_a_target_toolchain && !is_bsd) {
+ cflags = [ "-fauto-profile=${auto_profile_path}" ]
+ inputs = [ auto_profile_path ]
+ }
+@@ -2786,7 +2793,8 @@ config("symbols") {
+ configs += [ "//build/config:compress_debug_sections" ]
+ }
+
+- if (is_clang && (!is_nacl || is_nacl_saigo) && current_os != "zos") {
++ if (is_clang && (!is_nacl || is_nacl_saigo) && current_os != "zos" &&
++ !is_bsd) {
+ if (is_apple) {
+ # TODO(https://crbug.com/1050118): Investigate missing debug info on mac.
+ # Make sure we don't use constructor homing on mac.
diff --git a/devel/electron28/files/patch-build_config_compiler_pgo_BUILD.gn b/devel/electron28/files/patch-build_config_compiler_pgo_BUILD.gn
new file mode 100644
index 000000000000..17d4e301cdc8
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_compiler_pgo_BUILD.gn
@@ -0,0 +1,19 @@
+--- build/config/compiler/pgo/BUILD.gn.orig 2023-11-29 21:39:40 UTC
++++ build/config/compiler/pgo/BUILD.gn
+@@ -139,13 +139,14 @@ config("pgo_optimization_flags") {
+
+ # Enable basic block layout based on the extended TSP problem. This aims to
+ # improve icache utilization and reduce the binary size.
+- if (use_thin_lto) {
++ # __clang_major__ >= 15
++ if (use_thin_lto && !is_bsd) {
+ if (is_win) {
+ ldflags = [ "-mllvm:-enable-ext-tsp-block-placement=1" ]
+ } else {
+ ldflags = [ "-Wl,-mllvm,-enable-ext-tsp-block-placement=1" ]
+ }
+- } else {
++ } else if (!is_bsd) {
+ cflags += [
+ "-mllvm",
+ "-enable-ext-tsp-block-placement=1",
diff --git a/devel/electron28/files/patch-build_config_linux_BUILD.gn b/devel/electron28/files/patch-build_config_linux_BUILD.gn
new file mode 100644
index 000000000000..2e93980f3e50
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_linux_BUILD.gn
@@ -0,0 +1,11 @@
+--- build/config/linux/BUILD.gn.orig 2022-05-19 14:06:27 UTC
++++ build/config/linux/BUILD.gn
+@@ -41,7 +41,7 @@ config("runtime_library") {
+ }
+
+ if ((!is_chromeos || default_toolchain != "//build/toolchain/cros:target") &&
+- (!use_custom_libcxx || current_cpu == "mipsel")) {
++ (!use_custom_libcxx || current_cpu == "mipsel") && !is_bsd) {
+ libs = [ "atomic" ]
+ }
+ }
diff --git a/devel/electron28/files/patch-build_config_linux_atspi2_BUILD.gn b/devel/electron28/files/patch-build_config_linux_atspi2_BUILD.gn
new file mode 100644
index 000000000000..3894b322fe6a
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_linux_atspi2_BUILD.gn
@@ -0,0 +1,25 @@
+--- build/config/linux/atspi2/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ build/config/linux/atspi2/BUILD.gn
+@@ -20,10 +20,21 @@ if (use_atk) {
+ minor = atspi_version[1]
+ micro = atspi_version[2]
+
++ # These aren't necessarily used if atspi is not old enough to require them.
++ # Also, gn considers variables unused if the only use of them is
++ # short-circuited away, so for example if major == 2 and minor == 48, micro
++ # would be unused.
++ not_needed([
++ "major",
++ "minor",
++ "micro",
++ ])
++
+ # ATSPI 2.49.90 now defines these for us and it's an error for us to
+ # redefine them on the compiler command line.
+ # See ATSPI 927344a34cd5bf81fc64da4968241735ecb4f03b
+- if (minor < 49 || (minor == 49 && micro < 90)) {
++ if (major < 2 || (major == 2 && minor < 49) ||
++ (major == 2 && minor == 49 && micro < 90)) {
+ defines = [
+ "ATSPI_MAJOR_VERSION=$major",
+ "ATSPI_MINOR_VERSION=$minor",
diff --git a/devel/electron28/files/patch-build_config_linux_pkg-config.py b/devel/electron28/files/patch-build_config_linux_pkg-config.py
new file mode 100644
index 000000000000..3b8ffa5a822d
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_linux_pkg-config.py
@@ -0,0 +1,11 @@
+--- build/config/linux/pkg-config.py.orig 2023-03-30 00:33:39 UTC
++++ build/config/linux/pkg-config.py
+@@ -108,7 +108,7 @@ def main():
+ # If this is run on non-Linux platforms, just return nothing and indicate
+ # success. This allows us to "kind of emulate" a Linux build from other
+ # platforms.
+- if "linux" not in sys.platform:
++ if not sys.platform.startswith(tuple(['linux', 'openbsd', 'freebsd'])):
+ print("[[],[],[],[],[]]")
+ return 0
+
diff --git a/devel/electron28/files/patch-build_config_ozone.gni b/devel/electron28/files/patch-build_config_ozone.gni
new file mode 100644
index 000000000000..917f5aa3c178
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_ozone.gni
@@ -0,0 +1,19 @@
+--- build/config/ozone.gni.orig 2023-10-19 19:57:59 UTC
++++ build/config/ozone.gni
+@@ -84,7 +84,15 @@ declare_args() {
+ } else if (is_chromeos_lacros) {
+ ozone_platform = "wayland"
+ ozone_platform_wayland = true
+- } else if (is_linux) {
++ } else if (is_linux && !is_bsd) {
++ ozone_platform = "x11"
++ ozone_platform_wayland = true
++ ozone_platform_x11 = true
++ } else if (is_openbsd) {
++ ozone_platform = "x11"
++ ozone_platform_wayland = false
++ ozone_platform_x11 = true
++ } else if (is_freebsd) {
+ ozone_platform = "x11"
+ ozone_platform_wayland = true
+ ozone_platform_x11 = true
diff --git a/devel/electron28/files/patch-build_config_v8__target__cpu.gni b/devel/electron28/files/patch-build_config_v8__target__cpu.gni
new file mode 100644
index 000000000000..40fa8f6348e3
--- /dev/null
+++ b/devel/electron28/files/patch-build_config_v8__target__cpu.gni
@@ -0,0 +1,13 @@
+--- build/config/v8_target_cpu.gni.orig 2022-02-07 13:39:41 UTC
++++ build/config/v8_target_cpu.gni
+@@ -36,6 +36,10 @@ declare_args() {
+ if (v8_target_cpu == "") {
+ if (current_toolchain == "//build/toolchain/linux:clang_x64_v8_arm64") {
+ v8_target_cpu = "arm64"
++ } else if (current_toolchain == "//build/toolchain/openbsd:clang_arm64") {
++ v8_target_cpu = "arm64"
++ } else if (current_toolchain == "//build/toolchain/freebsd:clang_arm64") {
++ v8_target_cpu = "arm64"
+ } else if (current_toolchain == "//build/toolchain/linux:clang_x86_v8_arm") {
+ v8_target_cpu = "arm"
+ } else if (current_toolchain ==
diff --git a/devel/electron28/files/patch-build_detect__host__arch.py b/devel/electron28/files/patch-build_detect__host__arch.py
new file mode 100644
index 000000000000..673554933a91
--- /dev/null
+++ b/devel/electron28/files/patch-build_detect__host__arch.py
@@ -0,0 +1,11 @@
+--- build/detect_host_arch.py.orig 2023-03-30 00:33:39 UTC
++++ build/detect_host_arch.py
+@@ -20,6 +20,8 @@ def HostArch():
+ host_arch = 'ia32'
+ elif host_arch in ['x86_64', 'amd64']:
+ host_arch = 'x64'
++ elif host_arch.startswith('arm64'):
++ host_arch = 'arm64'
+ elif host_arch.startswith('arm'):
+ host_arch = 'arm'
+ elif host_arch.startswith('aarch64'):
diff --git a/devel/electron28/files/patch-build_gn__run__binary.py b/devel/electron28/files/patch-build_gn__run__binary.py
new file mode 100644
index 000000000000..08fb97b6a1e9
--- /dev/null
+++ b/devel/electron28/files/patch-build_gn__run__binary.py
@@ -0,0 +1,11 @@
+--- build/gn_run_binary.py.orig 2023-03-30 00:33:39 UTC
++++ build/gn_run_binary.py
+@@ -23,7 +23,7 @@ if not os.path.isabs(path):
+ # The rest of the arguments are passed directly to the executable.
+ args = [path] + sys.argv[2:]
+
+-ret = subprocess.call(args)
++ret = subprocess.call(args, env={"CHROME_EXE_PATH":"${WRKSRC}/out/Release/chrome","LD_LIBRARY_PATH":"${WRKSRC}/out/Release"})
+ if ret != 0:
+ if ret <= -100:
+ # Windows error codes such as 0xC0000005 and 0xC0000409 are much easier to
diff --git a/devel/electron28/files/patch-build_linux_chrome.map b/devel/electron28/files/patch-build_linux_chrome.map
new file mode 100644
index 000000000000..992585036b7b
--- /dev/null
+++ b/devel/electron28/files/patch-build_linux_chrome.map
@@ -0,0 +1,13 @@
+--- build/linux/chrome.map.orig 2022-02-28 16:54:41 UTC
++++ build/linux/chrome.map
+@@ -20,6 +20,10 @@ global:
+ # Program entry point.
+ _start;
+
++ # FreeBSD specific variables.
++ __progname;
++ environ;
++
+ # Memory allocation symbols. We want chrome and any libraries to
+ # share the same heap, so it is correct to export these symbols.
+ aligned_alloc;
diff --git a/devel/electron28/files/patch-build_linux_strip__binary.py b/devel/electron28/files/patch-build_linux_strip__binary.py
new file mode 100644
index 000000000000..9dd3c051630b
--- /dev/null
+++ b/devel/electron28/files/patch-build_linux_strip__binary.py
@@ -0,0 +1,10 @@
+--- build/linux/strip_binary.py.orig 2022-02-07 13:39:41 UTC
++++ build/linux/strip_binary.py
+@@ -10,6 +10,7 @@ import sys
+
+
+ def main():
++ return 0
+ argparser = argparse.ArgumentParser(description='eu-strip binary.')
+
+ argparser.add_argument('--eu-strip-binary-path', help='eu-strip path.')
diff --git a/devel/electron28/files/patch-build_linux_unbundle_icu.gn b/devel/electron28/files/patch-build_linux_unbundle_icu.gn
new file mode 100644
index 000000000000..bd3567f59977
--- /dev/null
+++ b/devel/electron28/files/patch-build_linux_unbundle_icu.gn
@@ -0,0 +1,18 @@
+--- build/linux/unbundle/icu.gn.orig 2023-04-04 21:42:43 UTC
++++ build/linux/unbundle/icu.gn
+@@ -17,6 +17,15 @@ config("icu_config") {
+ "USING_SYSTEM_ICU=1",
+ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC",
+
++ # As of icu 73 C++ nullptr, char16_t, override, final and noexcept are used
++ # instead of defines. These definitions can be removed when the bundled icu
++ # gets updated to 73. For more details, see:
++ # https://unicode-org.atlassian.net/browse/ICU-21833 and
++ # https://github.com/unicode-org/icu/commit/28643799377ecf654564f6f31854b02788cebe33
++ "U_FINAL=final",
++ "U_NOEXCEPT=noexcept",
++ "U_OVERRIDE=override",
++
+ # U_EXPORT (defined in unicode/platform.h) is used to set public visibility
+ # on classes through the U_COMMON_API and U_I18N_API macros (among others).
+ # When linking against the system ICU library, we want its symbols to have
diff --git a/devel/electron28/files/patch-build_linux_unbundle_libevent.gn b/devel/electron28/files/patch-build_linux_unbundle_libevent.gn
new file mode 100644
index 000000000000..d5f276de574d
--- /dev/null
+++ b/devel/electron28/files/patch-build_linux_unbundle_libevent.gn
@@ -0,0 +1,15 @@
+--- build/linux/unbundle/libevent.gn.orig 2022-05-28 07:21:18 UTC
++++ build/linux/unbundle/libevent.gn
+@@ -9,7 +9,12 @@ shim_headers("libevent_shim") {
+ headers = [ "event.h" ]
+ }
+
++config("system_libevent") {
++ defines = [ "USE_SYSTEM_LIBEVENT=1" ]
++}
++
+ source_set("libevent") {
+ deps = [ ":libevent_shim" ]
+ libs = [ "event" ]
++ public_configs = [ ":system_libevent" ]
+ }
diff --git a/devel/electron28/files/patch-build_linux_unbundle_libusb.gn b/devel/electron28/files/patch-build_linux_unbundle_libusb.gn
new file mode 100644
index 000000000000..a99cdcd835d6
--- /dev/null
+++ b/devel/electron28/files/patch-build_linux_unbundle_libusb.gn
@@ -0,0 +1,30 @@
+--- build/linux/unbundle/libusb.gn.orig 2023-11-29 21:39:40 UTC
++++ build/linux/unbundle/libusb.gn
+@@ -1,3 +1,27 @@
++# Copyright 2016 The Chromium Authors. All rights reserved.
++# Use of this source code is governed by a BSD-style license that can be
++# found in the LICENSE file.
++
++import("//build/config/linux/pkg_config.gni")
++import("//build/shim_headers.gni")
++
++pkg_config("system_libusb") {
++ packages = [ "libusb-1.0" ]
++}
++
++shim_headers("libusb_shim") {
++ root_path = "src/libusb"
++ headers = [
++ "libusb.h",
++ ]
++}
++
++source_set("libusb") {
++ deps = [
++ ":libusb_shim",
++ ]
++ public_configs = [ ":system_libusb" ]
++}
+ import("//build/config/linux/pkg_config.gni")
+ import("//build/shim_headers.gni")
+
diff --git a/devel/electron28/files/patch-build_toolchain_freebsd_BUILD.gn b/devel/electron28/files/patch-build_toolchain_freebsd_BUILD.gn
new file mode 100644
index 000000000000..7857149615a0
--- /dev/null
+++ b/devel/electron28/files/patch-build_toolchain_freebsd_BUILD.gn
@@ -0,0 +1,69 @@
+--- build/toolchain/freebsd/BUILD.gn.orig 2022-02-07 13:39:41 UTC
++++ build/toolchain/freebsd/BUILD.gn
+@@ -0,0 +1,66 @@
++# Copyright 2013 The Chromium Authors. All rights reserved.
++# Use of this source code is governed by a BSD-style license that can be
++# found in the LICENSE file.
++
++import("//build/config/sysroot.gni")
++import("//build/toolchain/gcc_toolchain.gni")
++
++clang_toolchain("clang_x86") {
++ toolchain_args = {
++ current_cpu = "x86"
++ current_os = "freebsd"
++ }
++}
++
++gcc_toolchain("x86") {
++ cc = "gcc"
++ cxx = "g++"
++
++ readelf = "readelf"
++ nm = "nm"
++ ar = "ar"
++ ld = cxx
++
++ toolchain_args = {
++ current_cpu = "x86"
++ current_os = "freebsd"
++ is_clang = false
++ }
++}
++
++clang_toolchain("clang_x64") {
++ toolchain_args = {
++ current_cpu = "x64"
++ current_os = "freebsd"
++ }
++}
++
++gcc_toolchain("x64") {
++ cc = "gcc"
++ cxx = "g++"
++
++ readelf = "readelf"
++ nm = "nm"
++ ar = "ar"
++ ld = cxx
++
++ toolchain_args = {
++ current_cpu = "x64"
++ current_os = "freebsd"
++ is_clang = false
++ }
++}
++
++clang_toolchain("clang_arm") {
++ toolchain_args = {
++ current_cpu = "arm64"
++ current_os = "freebsd"
++ }
++}
++
++clang_toolchain("clang_arm64") {
++ toolchain_args = {
++ current_cpu = "arm64"
++ current_os = "freebsd"
++ }
++}
diff --git a/devel/electron28/files/patch-build_toolchain_gcc__solink__wrapper.py b/devel/electron28/files/patch-build_toolchain_gcc__solink__wrapper.py
new file mode 100644
index 000000000000..34debf134bea
--- /dev/null
+++ b/devel/electron28/files/patch-build_toolchain_gcc__solink__wrapper.py
@@ -0,0 +1,11 @@
+--- build/toolchain/gcc_solink_wrapper.py.orig 2022-02-07 13:39:41 UTC
++++ build/toolchain/gcc_solink_wrapper.py
+@@ -39,7 +39,7 @@ def CollectDynSym(args):
+ """Replaces: nm --format=posix -g -D -p $sofile | cut -f1-2 -d' '"""
+ toc = ''
+ nm = subprocess.Popen(wrapper_utils.CommandToRun(
+- [args.nm, '--format=posix', '-g', '-D', '-p', args.sofile]),
++ [args.nm, '-g', '-D', '-p', args.sofile]),
+ stdout=subprocess.PIPE,
+ bufsize=-1,
+ universal_newlines=True)
diff --git a/devel/electron28/files/patch-build_toolchain_gcc__toolchain.gni b/devel/electron28/files/patch-build_toolchain_gcc__toolchain.gni
new file mode 100644
index 000000000000..964acfc10ca2
--- /dev/null
+++ b/devel/electron28/files/patch-build_toolchain_gcc__toolchain.gni
@@ -0,0 +1,44 @@
+--- build/toolchain/gcc_toolchain.gni.orig 2023-11-29 21:39:40 UTC
++++ build/toolchain/gcc_toolchain.gni
+@@ -53,6 +53,13 @@ if (enable_resource_allowlist_generation) {
+ "enable_resource_allowlist_generation=true does not work for target_os=$target_os")
+ }
+
++declare_args() {
++ extra_cflags = ""
++ extra_cppflags = ""
++ extra_cxxflags = ""
++ extra_ldflags = ""
++}
++
+ # This template defines a toolchain for something that works like gcc
+ # (including clang).
+ #
+@@ -878,22 +885,12 @@ template("clang_toolchain") {
+ # use_gold too.
+ template("clang_toolchain") {
+ gcc_toolchain(target_name) {
+- _path = "$clang_base_path/bin"
+- _is_path_absolute = get_path_info(_path, "abspath") == _path
+-
+- # Preserve absolute paths for tools like distcc.
+- if (_is_path_absolute && filter_include([ _path ], [ "//*" ]) == []) {
+- prefix = _path
+- } else {
+- prefix = rebase_path(_path, root_build_dir)
+- }
+-
+- cc = "${prefix}/clang"
+- cxx = "${prefix}/clang++"
++ cc = "cc"
++ cxx = "c++"
+ ld = cxx
+- readelf = "${prefix}/llvm-readelf"
+- ar = "${prefix}/llvm-ar"
+- nm = "${prefix}/llvm-nm"
++ readelf = "readelf"
++ ar = "ar"
++ nm = "nm"
+
+ forward_variables_from(invoker, "*", [ "toolchain_args" ])
+
diff --git a/devel/electron28/files/patch-build_toolchain_openbsd_BUILD.gn b/devel/electron28/files/patch-build_toolchain_openbsd_BUILD.gn
new file mode 100644
index 000000000000..04e6f6b416e2
--- /dev/null
+++ b/devel/electron28/files/patch-build_toolchain_openbsd_BUILD.gn
@@ -0,0 +1,69 @@
+--- build/toolchain/openbsd/BUILD.gn.orig 2022-02-07 13:39:41 UTC
++++ build/toolchain/openbsd/BUILD.gn
+@@ -0,0 +1,66 @@
++# Copyright 2013 The Chromium Authors. All rights reserved.
++# Use of this source code is governed by a BSD-style license that can be
++# found in the LICENSE file.
++
++import("//build/config/sysroot.gni")
++import("//build/toolchain/gcc_toolchain.gni")
++
++clang_toolchain("clang_x86") {
++ toolchain_args = {
++ current_cpu = "x86"
++ current_os = "openbsd"
++ }
++}
++
++gcc_toolchain("x86") {
++ cc = "gcc"
++ cxx = "g++"
++
++ readelf = "readelf"
++ nm = "nm"
++ ar = "ar"
++ ld = cxx
++
++ toolchain_args = {
++ current_cpu = "x86"
++ current_os = "openbsd"
++ is_clang = false
++ }
++}
++
++clang_toolchain("clang_x64") {
++ toolchain_args = {
++ current_cpu = "x64"
++ current_os = "openbsd"
++ }
++}
++
++gcc_toolchain("x64") {
++ cc = "gcc"
++ cxx = "g++"
++
++ readelf = "readelf"
++ nm = "nm"
++ ar = "ar"
++ ld = cxx
++
++ toolchain_args = {
++ current_cpu = "x64"
++ current_os = "openbsd"
++ is_clang = false
++ }
++}
++
++clang_toolchain("clang_arm") {
++ toolchain_args = {
++ current_cpu = "arm64"
++ current_os = "openbsd"
++ }
++}
++
++clang_toolchain("clang_arm64") {
++ toolchain_args = {
++ current_cpu = "arm64"
++ current_os = "openbsd"
++ }
++}
diff --git a/devel/electron28/files/patch-build_toolchain_toolchain.gni b/devel/electron28/files/patch-build_toolchain_toolchain.gni
new file mode 100644
index 000000000000..656b3e4ac9d4
--- /dev/null
+++ b/devel/electron28/files/patch-build_toolchain_toolchain.gni
@@ -0,0 +1,11 @@
+--- build/toolchain/toolchain.gni.orig 2023-11-29 21:39:40 UTC
++++ build/toolchain/toolchain.gni
+@@ -72,7 +72,7 @@ if (host_os == "mac") {
+ host_shlib_extension = ".dylib"
+ } else if (host_os == "win") {
+ host_shlib_extension = ".dll"
+-} else if (host_os == "linux" || host_os == "aix") {
++} else if (is_posix) {
+ host_shlib_extension = ".so"
+ } else {
+ assert(false, "Host platform not supported")
diff --git a/devel/electron28/files/patch-cc_BUILD.gn b/devel/electron28/files/patch-cc_BUILD.gn
new file mode 100644
index 000000000000..c32f915c78cd
--- /dev/null
+++ b/devel/electron28/files/patch-cc_BUILD.gn
@@ -0,0 +1,19 @@
+--- cc/BUILD.gn.orig 2023-11-29 21:39:40 UTC
++++ cc/BUILD.gn
+@@ -676,7 +676,7 @@ cc_test_static_library("test_support") {
+ if (enable_vulkan) {
+ deps += [ "//gpu/vulkan/init" ]
+ }
+- if (!is_android) {
++ if (!is_android && !is_bsd) {
+ data_deps = [ "//third_party/mesa_headers" ]
+ }
+ if (skia_use_dawn) {
+@@ -931,7 +931,6 @@ cc_test("cc_unittests") {
+ data = [ "//components/test/data/viz/" ]
+ data_deps = [
+ "//testing/buildbot/filters:cc_unittests_filters",
+- "//third_party/mesa_headers",
+ ]
+
+ if (is_android && enable_chrome_android_internal) {
diff --git a/devel/electron28/files/patch-cc_base_features.cc b/devel/electron28/files/patch-cc_base_features.cc
new file mode 100644
index 000000000000..48f868b02c3b
--- /dev/null
+++ b/devel/electron28/files/patch-cc_base_features.cc
@@ -0,0 +1,11 @@
+--- cc/base/features.cc.orig 2023-11-29 21:39:40 UTC
++++ cc/base/features.cc
+@@ -84,7 +84,7 @@ BASE_FEATURE(kUseDMSAAForTiles,
+ // be using a separate flag to control the launch on GL.
+ BASE_FEATURE(kUseDMSAAForTiles,
+ "UseDMSAAForTiles",
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-cc_paint_paint__op__writer.h b/devel/electron28/files/patch-cc_paint_paint__op__writer.h
new file mode 100644
index 000000000000..f505d0b6e7a9
--- /dev/null
+++ b/devel/electron28/files/patch-cc_paint_paint__op__writer.h
@@ -0,0 +1,41 @@
+--- cc/paint/paint_op_writer.h.orig 2023-11-29 21:39:40 UTC
++++ cc/paint/paint_op_writer.h
+@@ -122,10 +122,17 @@ class CC_PAINT_EXPORT PaintOpWriter {
+ // easier to keep serialized size calculation in sync with serialization and
+ // deserialization, and make it possible to allow dynamic sizing for some
+ // data types (see the specialized/overloaded functions).
++#if defined(__clang__) && (__clang_major__ >= 15)
+ template <typename T>
+ static constexpr size_t SerializedSize();
+ template <typename T>
+ static constexpr size_t SerializedSize(const T& data);
++#else
++ template <typename T>
++ static size_t SerializedSize();
++ template <typename T>
++ static size_t SerializedSize(const T& data);
++#endif
+ static size_t SerializedSize(const PaintImage& image);
+ static size_t SerializedSize(const PaintRecord& record);
+ static size_t SerializedSize(const SkHighContrastConfig& config);
+@@ -463,12 +470,20 @@ template <typename T>
+ }
+
+ template <typename T>
++#if defined(__clang__) && (__clang_major__ >= 15)
+ constexpr size_t PaintOpWriter::SerializedSize() {
++#else
++size_t PaintOpWriter::SerializedSize() {
++#endif
+ static_assert(std::is_arithmetic_v<T> || std::is_enum_v<T>);
+ return SerializedSizeSimple<T>();
+ }
+ template <typename T>
++#if defined(__clang__) && (__clang_major__ >= 15)
+ constexpr size_t PaintOpWriter::SerializedSize(const T& data) {
++#else
++size_t PaintOpWriter::SerializedSize(const T& data) {
++#endif
+ return SerializedSizeSimple<T>();
+ }
+
diff --git a/devel/electron28/files/patch-chrome_app_app__management__strings.grdp b/devel/electron28/files/patch-chrome_app_app__management__strings.grdp
new file mode 100644
index 000000000000..295574c31326
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_app__management__strings.grdp
@@ -0,0 +1,11 @@
+--- chrome/app/app_management_strings.grdp.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/app_management_strings.grdp
+@@ -194,7 +194,7 @@
+ You can open and edit supported files with this app from Finder or other apps. To control which files open this app by default, <ph name="BEGIN_LINK">&lt;a href="#"&gt;</ph>learn how to set default apps on your device<ph name="END_LINK">&lt;/a&gt;</ph>.
+ </message>
+ </if>
+- <if expr="is_fuchsia or is_linux">
++ <if expr="is_fuchsia or is_posix">
+ <message name="IDS_APP_MANAGEMENT_FILE_HANDLING_SET_DEFAULTS_LINK" desc="Further explanation of the File Handling API, including text describing the purpose of the toggle (referencing a generic Linux file browser app) and a link to a learn more link for default filetype associations.">
+ You can open and edit supported files with this app from your file browser or other apps. To control which files open this app by default, <ph name="BEGIN_LINK">&lt;a href="#"&gt;</ph>learn how to set default apps on your device<ph name="END_LINK">&lt;/a&gt;</ph>.
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_chrome__command__ids.h b/devel/electron28/files/patch-chrome_app_chrome__command__ids.h
new file mode 100644
index 000000000000..4ea858b669a2
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_chrome__command__ids.h
@@ -0,0 +1,17 @@
+--- chrome/app/chrome_command_ids.h.orig 2023-10-19 19:58:00 UTC
++++ chrome/app/chrome_command_ids.h
+@@ -68,12 +68,12 @@
+ #define IDC_TOGGLE_MULTITASK_MENU 34050
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #define IDC_USE_SYSTEM_TITLE_BAR 34051
+ #endif
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #define IDC_RESTORE_WINDOW 34052
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_app_chrome__main.cc b/devel/electron28/files/patch-chrome_app_chrome__main.cc
new file mode 100644
index 000000000000..5b722e039fc3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_chrome__main.cc
@@ -0,0 +1,34 @@
+--- chrome/app/chrome_main.cc.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/chrome_main.cc
+@@ -29,11 +29,11 @@
+ #include "chrome/app/notification_metrics.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/base_switches.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/app/chrome_main_linux.h"
+ #endif
+
+@@ -138,7 +138,7 @@ int ChromeMain(int argc, const char** argv) {
+ SetUpBundleOverrides();
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ AppendExtraArgumentsToCommandLine(command_line);
+ #endif
+
+@@ -167,7 +167,7 @@ int ChromeMain(int argc, const char** argv) {
+ headless_mode_handle = headless::InitHeadlessMode();
+ } else {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (headless::IsOldHeadlessMode()) {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ command_line->AppendSwitch(::headless::switches::kEnableCrashReporter);
diff --git a/devel/electron28/files/patch-chrome_app_chrome__main__delegate.cc b/devel/electron28/files/patch-chrome_app_chrome__main__delegate.cc
new file mode 100644
index 000000000000..aae884db8bc7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_chrome__main__delegate.cc
@@ -0,0 +1,112 @@
+--- chrome/app/chrome_main_delegate.cc.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/chrome_main_delegate.cc
+@@ -145,7 +145,7 @@
+ #include "components/about_ui/credit_utils.h"
+ #endif
+
+-#if BUILDFLAG(ENABLE_NACL) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++#if BUILDFLAG(ENABLE_NACL) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ #include "components/nacl/common/nacl_paths.h"
+ #include "components/nacl/zygote/nacl_fork_delegate_linux.h"
+ #endif
+@@ -189,16 +189,16 @@
+ #include "v8/include/v8.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "base/message_loop/message_pump_libevent.h"
+ #endif
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/policy/policy_path_parser.h"
+ #include "components/crash/core/app/crashpad.h"
+ #endif
+@@ -337,7 +337,7 @@ bool SubprocessNeedsResourceBundle(const std::string&
+ // and resources loaded.
+ bool SubprocessNeedsResourceBundle(const std::string& process_type) {
+ return
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The zygote process opens the resources for the renderers.
+ process_type == switches::kZygoteProcess ||
+ #endif
+@@ -422,7 +422,7 @@ bool HandleVersionSwitches(const base::CommandLine& co
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Show the man page if --help or -h is on the command line.
+ void HandleHelpSwitches(const base::CommandLine& command_line) {
+ if (command_line.HasSwitch(switches::kHelp) ||
+@@ -600,7 +600,7 @@ void InitializeUserDataDir(base::CommandLine* command_
+ std::string process_type =
+ command_line->GetSwitchValueASCII(switches::kProcessType);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, Chrome does not support running multiple copies under different
+ // DISPLAYs, so the profile directory can be specified in the environment to
+ // support the virtual desktop use-case.
+@@ -690,7 +690,7 @@ void RecordMainStartupMetrics(base::TimeTicks applicat
+ #endif
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Record the startup process creation time on supported platforms. On Android
+ // this is recorded in ChromeMainDelegateAndroid.
+ startup_metric_utils::GetCommon().RecordStartupProcessCreationTime(
+@@ -1044,7 +1044,7 @@ void ChromeMainDelegate::CommonEarlyInitialization(Inv
+ base::InitializeCpuReductionExperiment();
+ base::sequence_manager::internal::SequenceManagerImpl::InitializeFeatures();
+ base::sequence_manager::internal::ThreadController::InitializeFeatures();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ base::MessagePumpLibevent::InitializeFeatures();
+ #elif BUILDFLAG(IS_MAC)
+ base::PlatformThread::InitFeaturesPostFieldTrial();
+@@ -1196,7 +1196,7 @@ absl::optional<int> ChromeMainDelegate::BasicStartupCo
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag
+ // switch of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // This will directly exit if the user asked for help.
+ HandleHelpSwitches(command_line);
+ #endif
+@@ -1226,7 +1226,7 @@ absl::optional<int> ChromeMainDelegate::BasicStartupCo
+ #if BUILDFLAG(IS_CHROMEOS)
+ chromeos::dbus_paths::RegisterPathProvider();
+ #endif
+-#if BUILDFLAG(ENABLE_NACL) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++#if BUILDFLAG(ENABLE_NACL) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ nacl::RegisterPathProvider();
+ #endif
+
+@@ -1637,7 +1637,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ CHECK(!loaded_locale.empty()) << "Locale could not be found for " << locale;
+ }
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ // Zygote needs to call InitCrashReporter() in RunZygote().
+ if (process_type != switches::kZygoteProcess) {
+ if (command_line.HasSwitch(switches::kPreCrashpadCrashTest)) {
+@@ -1746,7 +1746,7 @@ absl::variant<int, content::MainFunctionParams> Chrome
+
+ // This entry is not needed on Linux, where the NaCl loader
+ // process is launched via nacl_helper instead.
+-#if BUILDFLAG(ENABLE_NACL) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(ENABLE_NACL) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ {switches::kNaClLoaderProcess, NaClMain},
+ #else
+ {"<invalid>", nullptr}, // To avoid constant array of size 0
diff --git a/devel/electron28/files/patch-chrome_app_chromium__strings.grd b/devel/electron28/files/patch-chrome_app_chromium__strings.grd
new file mode 100644
index 000000000000..ad1c35f25b01
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_chromium__strings.grd
@@ -0,0 +1,38 @@
+--- chrome/app/chromium_strings.grd.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/chromium_strings.grd
+@@ -315,7 +315,7 @@ If you update this file, be sure also to update google
+ Welcome to Chromium; new browser window opened
+ </message>
+ </if>
+- <if expr="is_macosx or is_linux">
++ <if expr="is_macosx or is_posix">
+ <message name="IDS_FIRST_RUN_DIALOG_WINDOW_TITLE" desc="Window title of First Run dialog on Mac and Linux, displayed in title bar">
+ Welcome to Chromium
+ </message>
+@@ -465,7 +465,7 @@ If you update this file, be sure also to update google
+ To get future Chromium updates, you'll need Windows 10 or later. This computer is using Windows 8.1.
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_LINUX_OBSOLETE" desc="A message displayed on an at-launch infobar and about:help warning the user that the OS version they are using is no longer supported.">
+ Chromium may not function correctly because it is no longer supported on this Linux distribution
+ </message>
+@@ -892,7 +892,7 @@ Permissions you've already given to websites and apps
+ </message>
+ </if>
+
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <message name="IDS_RELAUNCH_TO_UPDATE_ALT" desc="Alternate text label of the relaunch to update Chrome menu item" translateable="false">
+ Not used in Chromium. Placeholder to keep resource maps in sync.
+ </message>
+@@ -1277,7 +1277,7 @@ Permissions you've already given to websites and apps
+ </message>
+ </if>
+
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <message name="IDS_UPDATE_RECOMMENDED_DIALOG_TITLE_ALT" desc="Alternate window title for the Update Recommended dialog." translateable="false">
+ Not used in Chromium. Placeholder to keep resource maps in sync.
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_generated__resources.grd b/devel/electron28/files/patch-chrome_app_generated__resources.grd
new file mode 100644
index 000000000000..e69b87254b09
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_generated__resources.grd
@@ -0,0 +1,92 @@
+--- chrome/app/generated_resources.grd.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/generated_resources.grd
+@@ -2,7 +2,7 @@ This file contains definitions of resources that will
+
+ <!--
+ This file contains definitions of resources that will be translated for each
+-locale. The variables is_win, is_macosx, is_linux, and is_posix are available
++locale. The variables is_win, is_macosx, is_posix, and is_posix are available
+ for making strings OS specific. Other platform defines such as use_titlecase
+ are declared in tools/grit/grit_rule.gni.
+ -->
+@@ -3609,7 +3609,7 @@ -->
+ </if>
+
+ <!-- Bluetooth Device Credentials (i.e. PIN/Passkey) dialog -->
+- <if expr="is_win or is_linux">
++ <if expr="is_win or is_posix">
+ <message name="IDS_BLUETOOTH_DEVICE_CREDENTIALS_TITLE" desc="Title of the Bluetooth device credentials prompt dialog.">
+ Device Credentials
+ </message>
+@@ -5494,7 +5494,7 @@ -->
+ Read information about your browser, OS, device, installed software, registry values and files
+ </message>
+ </if>
+- <if expr="is_macosx or is_linux">
++ <if expr="is_macosx or is_posix">
+ <message name="IDS_EXTENSION_PROMPT_WARNING_ENTERPRISE_REPORTING_PRIVATE_ENABLED_LINUX_AND_MACOS" desc="Permission string for enterprise private reporting permission on Linux and MacOS.">
+ Read information about your browser, OS, device, installed software and files
+ </message>
+@@ -6207,7 +6207,7 @@ Keep your key file in a safe place. You will need it t
+ Old versions of Chrome Apps won't open on Windows devices after December 2022. Contact your administrator to update to a new version or remove this app.
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_FORCE_INSTALLED_DEPRECATED_APPS_CONTENT" desc="Content of the force installed deprecated app dialog">
+ Old versions of Chrome Apps won't open on Linux devices after December 2022. Contact your administrator to update to a new version or remove this app.
+ </message>
+@@ -6253,7 +6253,7 @@ Keep your key file in a safe place. You will need it t
+ Old versions of Chrome apps won't open on Windows devices after December 2022. You can check if there's a new version available.
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_DEPRECATED_APPS_MONITOR_RENDERER" desc="Dialog content that educates users that Chrome Apps will soon no longer launch.">
+ Old versions of Chrome apps won't open on Linux devices after December 2022. You can check if there's a new version available.
+ </message>
+@@ -10611,7 +10611,7 @@ Check your passwords anytime in <ph name="GOOGLE_PASSW
+ <message name="IDS_APP_MENU_BUTTON_UPDATE" desc="Short label next to app-menu button when an update is available.">
+ Update
+ </message>
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <message name="IDS_APP_MENU_BUTTON_UPDATE_ALT1" desc="Alternate short label next to app-menu button when an update is available.">
+ Finish update
+ </message>
+@@ -10958,7 +10958,7 @@ Check your passwords anytime in <ph name="GOOGLE_PASSW
+ Google Pay
+ </message>
+
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_SHOW_WINDOW_DECORATIONS" desc="The label of a radio button in the options dialog for using the system title bar and borders.">
+ Use system title bar and borders
+ </message>
+@@ -11956,7 +11956,7 @@ Check your passwords anytime in <ph name="GOOGLE_PASSW
+ </message>
+
+ <!-- Device Trust Consent dialog -->
+- <if expr="is_win or is_macosx or is_linux or is_chromeos">
++ <if expr="is_win or is_macosx or is_posix or is_chromeos">
+ <message name="IDS_DEVICE_SIGNALS_CONSENT_DIALOG_TITLE" desc="Title of the dialog shown when user consent is required to share device signals.">
+ Share information about your device?
+ </message>
+@@ -12364,7 +12364,7 @@ Please help our engineers fix this problem. Tell us wh
+ Set as default
+ </message>
+
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_MINIMIZE_WINDOW_MENU" desc="The Linux browser window menu item text for minimizing the window.">
+ Minimize
+ </message>
+@@ -14571,7 +14571,7 @@ Please help our engineers fix this problem. Tell us wh
+ Open Anyway
+ </message>
+
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <message name="IDS_UTILITY_PROCESS_SYSTEM_SIGNALS_NAME" desc="The name of the utility process used to collect system signals. Only spawned on Windows, Mac or Linux.">
+ System Signals Utilities
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_google__chrome__strings.grd b/devel/electron28/files/patch-chrome_app_google__chrome__strings.grd
new file mode 100644
index 000000000000..e0b97b63a604
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_google__chrome__strings.grd
@@ -0,0 +1,38 @@
+--- chrome/app/google_chrome_strings.grd.orig 2023-11-29 21:39:41 UTC
++++ chrome/app/google_chrome_strings.grd
+@@ -301,7 +301,7 @@ chromium_strings.grd. -->
+ Welcome to Chrome; new browser window opened
+ </message>
+ </if>
+- <if expr="is_macosx or is_linux">
++ <if expr="is_macosx or is_posix">
+ <message name="IDS_FIRST_RUN_DIALOG_WINDOW_TITLE" desc="Window title of First Run dialog on Mac and Linux, displayed in title bar">
+ Welcome to Google Chrome
+ </message>
+@@ -453,7 +453,7 @@ chromium_strings.grd. -->
+ To get future Google Chrome updates, you'll need Windows 10 or later. This computer is using Windows 8.1.
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_LINUX_OBSOLETE" desc="A message displayed on an at-launch infobar and about:help warning the user that the OS version they are using is no longer supported.">
+ Google Chrome may not function correctly because it is no longer supported on this Linux distribution
+ </message>
+@@ -877,7 +877,7 @@ Permissions you've already given to websites and apps
+ </if>
+ </if>
+
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <if expr="use_titlecase">
+ <message name="IDS_RELAUNCH_TO_UPDATE_ALT" desc="Alternate text label of the relaunch to update Chrome menu item">
+ Relaunch to Update - Your tabs will reopen
+@@ -1302,7 +1302,7 @@ Permissions you've already given to websites and apps
+ </message>
+ </if>
+
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <message name="IDS_UPDATE_RECOMMENDED_DIALOG_TITLE_ALT" desc="Alternate window title for the Update Recommended dialog.">
+ Relaunch to finish Chrome update
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_profiles__strings.grdp b/devel/electron28/files/patch-chrome_app_profiles__strings.grdp
new file mode 100644
index 000000000000..eabb192ffa85
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_profiles__strings.grdp
@@ -0,0 +1,11 @@
+--- chrome/app/profiles_strings.grdp.orig 2023-10-19 19:58:00 UTC
++++ chrome/app/profiles_strings.grdp
+@@ -54,7 +54,7 @@
+ Add Profile...
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_PROFILES_ADD_PROFILE_LABEL" desc="Menu item for adding a new profile.">
+ Add profile...
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_settings__strings.grdp b/devel/electron28/files/patch-chrome_app_settings__strings.grdp
new file mode 100644
index 000000000000..f3f6313e8a2e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_settings__strings.grdp
@@ -0,0 +1,35 @@
+--- chrome/app/settings_strings.grdp.orig 2023-11-29 21:39:45 UTC
++++ chrome/app/settings_strings.grdp
+@@ -183,12 +183,12 @@
+ Manage accessibility features
+ </message>
+ </if>
+- <if expr="is_win or is_linux or is_macosx">
++ <if expr="is_win or is_posix or is_macosx">
+ <message name="IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_TITLE" desc="Title for the overscroll history navigation setting, which allows you to navigate back and forward by swiping left or right with a touch device.">
+ Swipe between pages
+ </message>
+ </if>
+- <if expr="is_win or is_linux">
++ <if expr="is_win or is_posix">
+ <message name="IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_SUBTITLE" desc="Subtitle for the overscroll history navigation setting, which allows you to navigate back and forward by swiping left or right with a touch device.">
+ Navigate back and forward with a swipe gesture
+ </message>
+@@ -222,7 +222,7 @@
+ Theme
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_SETTINGS_GTK_THEME" desc="Text of the label describing the system (GTK) browser theme on Linux">
+ GTK
+ </message>
+@@ -242,7 +242,7 @@
+ Use Classic
+ </message>
+ </if>
+- <if expr="not is_linux or is_chromeos or is_fuchsia">
++ <if expr="not is_posix or is_chromeos or is_fuchsia">
+ <message name="IDS_SETTINGS_RESET_TO_DEFAULT_THEME" desc="Name of the control which resets the browser theme back to the default theme.">
+ Reset to default
+ </message>
diff --git a/devel/electron28/files/patch-chrome_app_theme_chrome__unscaled__resources.grd b/devel/electron28/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
new file mode 100644
index 000000000000..0fb866f711c5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
@@ -0,0 +1,29 @@
+--- chrome/app/theme/chrome_unscaled_resources.grd.orig 2023-11-29 21:39:46 UTC
++++ chrome/app/theme/chrome_unscaled_resources.grd
+@@ -16,7 +16,7 @@
+ <includes>
+ <if expr="_google_chrome">
+ <then>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <include name="IDR_PRODUCT_LOGO_64" file="google_chrome/linux/product_logo_64.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_128" file="google_chrome/linux/product_logo_128.png" type="BINDATA" />
+@@ -63,7 +63,7 @@
+ <else> <!-- not _google_chrome -->
+ <if expr="_is_chrome_for_testing_branded">
+ <then>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <include name="IDR_PRODUCT_LOGO_64" file="google_chrome/google_chrome_for_testing/linux/product_logo_64.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_128" file="google_chrome/google_chrome_for_testing/linux/product_logo_128.png" type="BINDATA" />
+@@ -77,7 +77,7 @@
+ </if>
+ </then>
+ <else> <!-- not _is_chrome_for_testing_branded -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <include name="IDR_PRODUCT_LOGO_64" file="chromium/linux/product_logo_64.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_128" file="chromium/linux/product_logo_128.png" type="BINDATA" />
diff --git a/devel/electron28/files/patch-chrome_app_theme_theme__resources.grd b/devel/electron28/files/patch-chrome_app_theme_theme__resources.grd
new file mode 100644
index 000000000000..1afb045522bb
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_app_theme_theme__resources.grd
@@ -0,0 +1,59 @@
+--- chrome/app/theme/theme_resources.grd.orig 2023-10-19 19:58:02 UTC
++++ chrome/app/theme/theme_resources.grd
+@@ -146,14 +146,14 @@
+ </if>
+ <if expr="_google_chrome">
+ <then>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="google_chrome/linux/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="google_chrome/linux/product_logo_32.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32_BETA" file="google_chrome/linux/product_logo_32_beta.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32_DEV" file="google_chrome/linux/product_logo_32_dev.png" />
+ </then>
+- <else> <!-- not is_linux -->
++ <else> <!-- not is_posix -->
+ <if expr="not is_android">
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="google_chrome/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="google_chrome/product_logo_32.png" />
+@@ -161,7 +161,7 @@
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32_BETA" file="google_chrome/product_logo_32_beta.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32_DEV" file="google_chrome/product_logo_32_dev.png" />
+ </else>
+- </if> <!-- is_linux -->
++ </if> <!-- is_posix -->
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32_CANARY" file="google_chrome/product_logo_32_canary.png" />
+ <if expr="not is_android">
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_NAME_22" file="google_chrome/product_logo_name_22.png" />
+@@ -173,7 +173,7 @@
+ <else> <!-- not _google_chrome -->
+ <if expr="_is_chrome_for_testing_branded">
+ <then>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="google_chrome/google_chrome_for_testing/linux/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="google_chrome/google_chrome_for_testing/linux/product_logo_32.png" />
+@@ -182,10 +182,10 @@
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="google_chrome/google_chrome_for_testing/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="google_chrome/google_chrome_for_testing/product_logo_32.png" />
+ </else>
+- </if> <!-- is_linux -->
++ </if> <!-- is_posix -->
+ </then>
+ <else> <!-- not _is_chrome_for_testing_branded -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="chromium/linux/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="chromium/linux/product_logo_32.png" />
+@@ -194,7 +194,7 @@
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_16" file="chromium/product_logo_16.png" />
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_32" file="chromium/product_logo_32.png" />
+ </else>
+- </if> <!-- is_linux -->
++ </if> <!-- is_posix -->
+ </else>
+ </if> <!-- _is_chrome_for_testing_branded -->
+ <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_NAME_22" file="chromium/product_logo_name_22.png" />
diff --git a/devel/electron28/files/patch-chrome_browser_BUILD.gn b/devel/electron28/files/patch-chrome_browser_BUILD.gn
new file mode 100644
index 000000000000..ac325f51ed41
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_BUILD.gn
@@ -0,0 +1,16 @@
+--- chrome/browser/BUILD.gn.orig 2024-01-26 06:59:56 UTC
++++ chrome/browser/BUILD.gn
+@@ -6526,6 +6526,13 @@ static_library("browser") {
+ }
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "metrics/bluetooth_metrics_provider.cc",
++ "metrics/bluetooth_metrics_provider.h",
++ ]
++ }
++
+ if (is_linux && use_dbus) {
+ sources += [
+ "dbus_memory_pressure_evaluator_linux.cc",
diff --git a/devel/electron28/files/patch-chrome_browser_about__flags.cc b/devel/electron28/files/patch-chrome_browser_about__flags.cc
new file mode 100644
index 000000000000..16c13627d390
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_about__flags.cc
@@ -0,0 +1,180 @@
+--- chrome/browser/about_flags.cc.orig 2023-12-24 08:42:05 UTC
++++ chrome/browser/about_flags.cc
+@@ -231,7 +231,7 @@
+ #include "ui/ui_features.h"
+ #include "url/url_features.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/allocator/buildflags.h"
+ #endif
+
+@@ -330,7 +330,7 @@
+ #include "device/vr/public/cpp/features.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "ui/ozone/buildflags.h"
+ #include "ui/ozone/public/ozone_switches.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -344,7 +344,7 @@
+ #include "chrome/browser/win/titlebar_config.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/profile_management/profile_management_features.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+
+@@ -474,7 +474,7 @@ const FeatureEntry::FeatureVariation kDXGIWaitableSwap
+ {"Max 3 Frames", &kDXGIWaitableSwapChain3Frames, 1, nullptr}};
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const FeatureEntry::Choice kOzonePlatformHintRuntimeChoices[] = {
+ {flag_descriptions::kOzonePlatformHintChoiceDefault, "", ""},
+ {flag_descriptions::kOzonePlatformHintChoiceAuto,
+@@ -1463,7 +1463,7 @@ const FeatureEntry::FeatureVariation kChromeRefresh202
+ nullptr}};
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const FeatureEntry::FeatureParam kShortcutBoostSearchAndUrl1414[] = {
+ {"ShortcutBoostSearchScore", "1414"},
+ {"ShortcutBoostUrlScore", "1414"}};
+@@ -5295,13 +5295,13 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(features::kWebShare)},
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {"ozone-platform-hint", flag_descriptions::kOzonePlatformHintName,
+ flag_descriptions::kOzonePlatformHintDescription, kOsLinux,
+ MULTI_VALUE_TYPE(kOzonePlatformHintRuntimeChoices)},
+ #endif // BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ {"skip-undecryptable-passwords",
+ flag_descriptions::kSkipUndecryptablePasswordsName,
+ flag_descriptions::kSkipUndecryptablePasswordsDescription,
+@@ -5612,7 +5612,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(feed::kFeedSportsCard)},
+ #endif // BUILDFLAG(IS_ANDROID)
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {"following-feed-sidepanel", flag_descriptions::kFollowingFeedSidepanelName,
+ flag_descriptions::kFollowingFeedSidepanelDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(feed::kWebUiFeed)},
+@@ -6251,7 +6251,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(omnibox::kZeroSuggestInMemoryCaching)},
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {"omnibox-actions-ui-simplification",
+ flag_descriptions::kOmniboxActionsUISimplificationName,
+ flag_descriptions::kOmniboxActionsUISimplificationDescription, kOsDesktop,
+@@ -7087,7 +7087,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kParallelDownloadingDescription, kOsAll,
+ FEATURE_VALUE_TYPE(download::features::kParallelDownloading)},
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {"enable-async-dns", flag_descriptions::kAsyncDnsName,
+ flag_descriptions::kAsyncDnsDescription, kOsWin | kOsLinux,
+ FEATURE_VALUE_TYPE(features::kAsyncDns)},
+@@ -8122,7 +8122,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(supervised_user::kEnableProtoApiForClassifyUrl)},
+ #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ {"enable-network-service-sandbox",
+ flag_descriptions::kEnableNetworkServiceSandboxName,
+ flag_descriptions::kEnableNetworkServiceSandboxDescription,
+@@ -8147,7 +8147,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(
+ supervised_user::kFilterWebsitesForSupervisedUsersOnDesktopAndIOS)},
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ {"enable-family-link-extensions-permissions",
+ flag_descriptions::
+ kEnableExtensionsPermissionsForSupervisedUsersOnDesktopName,
+@@ -8817,7 +8817,7 @@ const FeatureEntry kFeatureEntries[] = {
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {"quick-commands", flag_descriptions::kQuickCommandsName,
+ flag_descriptions::kQuickCommandsDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(features::kQuickCommands)},
+@@ -9092,7 +9092,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(ash::features::kWallpaperPerDesk)},
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {"enable-get-all-screens-media", flag_descriptions::kGetAllScreensMediaName,
+ flag_descriptions::kGetAllScreensMediaDescription,
+ kOsCrOS | kOsLacros | kOsLinux,
+@@ -9134,7 +9134,7 @@ const FeatureEntry kFeatureEntries[] = {
+
+ #if BUILDFLAG(IS_WIN) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {
+ "ui-debug-tools",
+ flag_descriptions::kUIDebugToolsName,
+@@ -9692,7 +9692,7 @@ const FeatureEntry kFeatureEntries[] = {
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ {"document-picture-in-picture-api",
+ flag_descriptions::kDocumentPictureInPictureApiName,
+ flag_descriptions::kDocumentPictureInPictureApiDescription,
+@@ -10799,7 +10799,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(features::kProcessPerSiteUpToMainFrameThreshold)},
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {"camera-mic-effects", flag_descriptions::kCameraMicEffectsName,
+ flag_descriptions::kCameraMicEffectsDescription,
+ static_cast<unsigned short>(kOsMac | kOsWin | kOsLinux | kOsFuchsia),
+@@ -10981,7 +10981,7 @@ const FeatureEntry kFeatureEntries[] = {
+ password_manager::features::kFillingAcrossAffiliatedWebsitesAndroid)},
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ {"third-party-profile-management",
+ flag_descriptions::kThirdPartyProfileManagementName,
+ flag_descriptions::kThirdPartyProfileManagementDescription,
+@@ -11295,7 +11295,7 @@ const FeatureEntry kFeatureEntries[] = {
+ kOsDesktop, FEATURE_VALUE_TYPE(blink::features::kPasswordStrongLabel)},
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ {"attach-logs-to-autofill-rater-extentsion-report",
+ flag_descriptions::kAttachLogsToAutofillRaterExtensionReportName,
+ flag_descriptions::kAttachLogsToAutofillRaterExtensionReportDescription,
+@@ -11304,7 +11304,7 @@ const FeatureEntry kFeatureEntries[] = {
+ kAttachLogsToAutofillRaterExtensionReport)},
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ {"fill-multi-line", flag_descriptions::kFillMultiLineName,
+ flag_descriptions::kFillMultiLineDescription, kOsWin | kOsLinux | kOsMac,
+ FEATURE_VALUE_TYPE(compose::features::kFillMultiLine)},
diff --git a/devel/electron28/files/patch-chrome_browser_after__startup__task__utils.cc b/devel/electron28/files/patch-chrome_browser_after__startup__task__utils.cc
new file mode 100644
index 000000000000..ef6940d77ab3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_after__startup__task__utils.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/after_startup_task_utils.cc.orig 2022-08-31 12:19:35 UTC
++++ chrome/browser/after_startup_task_utils.cc
+@@ -107,7 +107,7 @@ void SetBrowserStartupIsComplete() {
+ TRACE_EVENT0("startup", "SetBrowserStartupIsComplete");
+ g_startup_complete_flag.Get().Set();
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Process::Current().CreationTime() is not available on all platforms.
+ const base::Time process_creation_time =
+ base::Process::Current().CreationTime();
diff --git a/devel/electron28/files/patch-chrome_browser_apps_app__service_publishers_extension__apps.cc b/devel/electron28/files/patch-chrome_browser_apps_app__service_publishers_extension__apps.cc
new file mode 100644
index 000000000000..5b642e2a006b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_apps_app__service_publishers_extension__apps.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/apps/app_service/publishers/extension_apps.cc.orig 2023-05-25 00:41:41 UTC
++++ chrome/browser/apps/app_service/publishers/extension_apps.cc
+@@ -25,7 +25,7 @@ ExtensionApps::~ExtensionApps() = default;
+
+ bool ExtensionApps::Accepts(const extensions::Extension* extension) {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ if (extensions::IsExtensionUnsupportedDeprecatedApp(profile(),
+ extension->id())) {
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.cc b/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.cc
new file mode 100644
index 000000000000..2ced238e07fd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/apps/platform_apps/platform_app_launch.cc.orig 2023-05-25 00:41:41 UTC
++++ chrome/browser/apps/platform_apps/platform_app_launch.cc
+@@ -20,7 +20,7 @@
+ #include "extensions/common/extension.h"
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/browser.h"
+ #include "chrome/browser/ui/browser_navigator.h"
+ #include "chrome/browser/ui/browser_window.h"
+@@ -138,7 +138,7 @@ bool OpenExtensionApplicationTab(Profile* profile, con
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ bool OpenDeprecatedApplicationPrompt(Profile* profile,
+ const std::string& app_id) {
+ if (!extensions::IsExtensionUnsupportedDeprecatedApp(profile, app_id))
diff --git a/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.h b/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.h
new file mode 100644
index 000000000000..40e68e983c40
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_apps_platform__apps_platform__app__launch.h
@@ -0,0 +1,11 @@
+--- chrome/browser/apps/platform_apps/platform_app_launch.h.orig 2023-05-25 00:41:41 UTC
++++ chrome/browser/apps/platform_apps/platform_app_launch.h
+@@ -37,7 +37,7 @@ bool OpenExtensionApplicationWindow(Profile* profile,
+ bool OpenExtensionApplicationTab(Profile* profile, const std::string& app_id);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Opens the deprecated Chrome Apps flow if |app_id| refers to a Chrome App and
+ // Chrome Apps are deprecated on the |profile|. Returns true if that was the
+ // case, or false otherwise.
diff --git a/devel/electron28/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc b/devel/electron28/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
new file mode 100644
index 000000000000..273b95d3f16f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc.orig 2023-03-30 00:33:42 UTC
++++ chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+@@ -90,7 +90,7 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForSch
+ return metrics::OmniboxInputType::QUERY;
+
+ case ExternalProtocolHandler::UNKNOWN: {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Linux impl of GetApplicationNameForScheme doesn't distinguish
+ // between URL schemes with handers and those without. This will
+ // make the default behaviour be search on Linux.
diff --git a/devel/electron28/files/patch-chrome_browser_background_background__mode__manager.cc b/devel/electron28/files/patch-chrome_browser_background_background__mode__manager.cc
new file mode 100644
index 000000000000..6661a5b7aeeb
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_background_background__mode__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/background/background_mode_manager.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/background/background_mode_manager.cc
+@@ -869,7 +869,7 @@ gfx::ImageSkia GetStatusTrayIcon() {
+ return gfx::ImageSkia();
+
+ return family->CreateExact(size).AsImageSkia();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+ IDR_PRODUCT_LOGO_128);
+ #elif BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-chrome_browser_background_background__mode__optimizer.cc b/devel/electron28/files/patch-chrome_browser_background_background__mode__optimizer.cc
new file mode 100644
index 000000000000..fea4af8ffb4d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_background_background__mode__optimizer.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/background/background_mode_optimizer.cc.orig 2023-05-25 00:41:42 UTC
++++ chrome/browser/background/background_mode_optimizer.cc
+@@ -31,7 +31,7 @@ std::unique_ptr<BackgroundModeOptimizer> BackgroundMod
+ return nullptr;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(features::kBackgroundModeAllowRestart)) {
+ return base::WrapUnique(new BackgroundModeOptimizer());
+ }
diff --git a/devel/electron28/files/patch-chrome_browser_browser__features.cc b/devel/electron28/files/patch-chrome_browser_browser__features.cc
new file mode 100644
index 000000000000..f7f867ecef03
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_browser__features.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/browser_features.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/browser_features.cc
+@@ -28,7 +28,7 @@ BASE_FEATURE(kDestroyProfileOnBrowserClose,
+ BASE_FEATURE(kDestroyProfileOnBrowserClose,
+ "DestroyProfileOnBrowserClose",
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT);
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT);
+@@ -292,7 +292,7 @@ BASE_FEATURE(kOmniboxTriggerForNoStatePrefetch,
+ "OmniboxTriggerForNoStatePrefetch",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kPayloadTestComponent,
+ "PayloadTestComponent",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/devel/electron28/files/patch-chrome_browser_browser__features.h b/devel/electron28/files/patch-chrome_browser_browser__features.h
new file mode 100644
index 000000000000..291a845d43f9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_browser__features.h
@@ -0,0 +1,11 @@
+--- chrome/browser/browser_features.h.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/browser_features.h
+@@ -121,7 +121,7 @@ BASE_DECLARE_FEATURE(kOmniboxTriggerForNoStatePrefetch
+
+ BASE_DECLARE_FEATURE(kOmniboxTriggerForNoStatePrefetch);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kPayloadTestComponent);
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_browser__process__impl.cc b/devel/electron28/files/patch-chrome_browser_browser__process__impl.cc
new file mode 100644
index 000000000000..d32bf20eee67
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_browser__process__impl.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/browser_process_impl.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/browser_process_impl.cc
+@@ -215,7 +215,7 @@
+ #include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/error_reporting/chrome_js_error_report_processor.h" // nogncheck
+ #endif
+
+@@ -1212,7 +1212,7 @@ void BrowserProcessImpl::PreMainMessageLoopRun() {
+
+ ApplyMetricsReportingPolicy();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ChromeJsErrorReportProcessor::Create();
+ #endif
+
+@@ -1477,7 +1477,7 @@ void BrowserProcessImpl::Unpin() {
+ // Mac is currently not supported.
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+
+ bool BrowserProcessImpl::IsRunningInBackground() const {
+ // Check if browser is in the background.
diff --git a/devel/electron28/files/patch-chrome_browser_browser__process__impl.h b/devel/electron28/files/patch-chrome_browser_browser__process__impl.h
new file mode 100644
index 000000000000..ac1146d8f235
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_browser__process__impl.h
@@ -0,0 +1,11 @@
+--- chrome/browser/browser_process_impl.h.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/browser_process_impl.h
+@@ -388,7 +388,7 @@ class BrowserProcessImpl : public BrowserProcess,
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ base::RepeatingTimer autoupdate_timer_;
+
+ // Gets called by autoupdate timer to see if browser needs restart and can be
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__browser__interface__binders.cc b/devel/electron28/files/patch-chrome_browser_chrome__browser__interface__binders.cc
new file mode 100644
index 000000000000..e1f140a1384f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__browser__interface__binders.cc
@@ -0,0 +1,81 @@
+--- chrome/browser/chrome_browser_interface_binders.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/chrome_browser_interface_binders.cc
+@@ -130,13 +130,13 @@
+ #endif // BUILDFLAG(FULL_SAFE_BROWSING)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom.h"
+ #include "chrome/browser/ui/webui/connectors_internals/connectors_internals_ui.h"
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
+ #include "ui/webui/resources/cr_components/app_management/app_management.mojom.h"
+ #endif
+@@ -224,7 +224,7 @@
+ #endif // BUILDFLAG(IS_ANDROID)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/companion/visual_search/visual_search_suggestions_service_factory.h"
+ #include "chrome/browser/ui/web_applications/sub_apps_service_impl.h"
+ #include "chrome/browser/ui/webui/discards/discards.mojom.h"
+@@ -863,7 +863,7 @@ void BindScreen2xMainContentExtractor(
+ #endif
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ void BindVisualSuggestionsModelProvider(
+ content::RenderFrameHost* frame_host,
+ mojo::PendingReceiver<
+@@ -1009,7 +1009,7 @@ void PopulateChromeFrameBinders(
+ #endif // BUILDFLAG(ENABLE_SPEECH_SERVICE)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!render_frame_host->GetParent()) {
+ map->Add<chrome::mojom::DraggableRegions>(
+ base::BindRepeating(&DraggableRegionsHostImpl::CreateIfAllowed));
+@@ -1017,7 +1017,7 @@ void PopulateChromeFrameBinders(
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(blink::features::kDesktopPWAsSubApps) &&
+ !render_frame_host->GetParentOrOuterDocument()) {
+ // The service binder will reject non-primary main frames, but we still need
+@@ -1097,7 +1097,7 @@ void PopulateChromeWebUIFrameBinders(
+ commerce::CommerceInternalsUI>(map);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ RegisterWebUIControllerInterfaceBinder<
+ connectors_internals::mojom::PageHandler,
+ enterprise_connectors::ConnectorsInternalsUI>(map);
+@@ -1118,7 +1118,7 @@ void PopulateChromeWebUIFrameBinders(
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ RegisterWebUIControllerInterfaceBinder<
+ app_management::mojom::PageHandlerFactory, WebAppSettingsUI>(map);
+ #endif
+@@ -1651,7 +1651,7 @@ void PopulateChromeWebUIFrameBinders(
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ RegisterWebUIControllerInterfaceBinder<discards::mojom::DetailsProvider,
+ DiscardsUI>(map);
+
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__browser__main.cc b/devel/electron28/files/patch-chrome_browser_chrome__browser__main.cc
new file mode 100644
index 000000000000..043cab5fc97f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__browser__main.cc
@@ -0,0 +1,78 @@
+--- chrome/browser/chrome_browser_main.cc.orig 2024-01-22 19:39:42 UTC
++++ chrome/browser/chrome_browser_main.cc
+@@ -246,11 +246,11 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/first_run/upgrade_util_linux.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crashpad.h"
+ #endif
+
+@@ -284,14 +284,14 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+ #include "chrome/browser/metrics/desktop_session_duration/touch_mode_stats_tracker.h"
+ #include "chrome/browser/profiles/profile_activity_metrics_recorder.h"
+ #include "ui/base/pointer/touch_ui_controller.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/headless/headless_mode_metrics.h" // nogncheck
+ #include "chrome/browser/headless/headless_mode_util.h" // nogncheck
+ #include "components/headless/select_file_dialog/headless_select_file_dialog.h"
+@@ -1039,7 +1039,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ browser_creator_->AddFirstRunTabs(master_prefs_->new_tabs);
+ }
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Create directory for user-level Native Messaging manifest files. This
+ // makes it less likely that the directory will be created by third-party
+ // software with incorrect owner or permission. See crbug.com/725513 .
+@@ -1095,7 +1095,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ metrics::DesktopSessionDurationTracker::Initialize();
+ ProfileActivityMetricsRecorder::Initialize();
+ TouchModeStatsTracker::Initialize(
+@@ -1331,7 +1331,7 @@ void ChromeBrowserMainParts::PostProfileInit(Profile*
+ *UrlLanguageHistogramFactory::GetForBrowserContext(profile));
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (headless::IsHeadlessMode()) {
+ headless::ReportHeadlessActionMetrics();
+ }
+@@ -1437,7 +1437,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl(
+ // In headless mode provide alternate SelectFileDialog factory overriding
+ // any platform specific SelectFileDialog implementation that may have been
+ // set.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (headless::IsHeadlessMode()) {
+ headless::HeadlessSelectFileDialogFactory::SetUp();
+ }
+@@ -1969,7 +1969,7 @@ bool ChromeBrowserMainParts::ProcessSingletonNotificat
+
+ // Drop the request if headless mode is in effect or the request is from
+ // a headless Chrome process.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (headless::IsHeadlessMode() ||
+ command_line.HasSwitch(switches::kHeadless)) {
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__browser__main__extra__parts__linux.cc b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__extra__parts__linux.cc
new file mode 100644
index 000000000000..009b0cbbe1e2
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__extra__parts__linux.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/chrome_browser_main_extra_parts_linux.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/chrome_browser_main_extra_parts_linux.cc
+@@ -120,7 +120,7 @@ ChromeBrowserMainExtraPartsLinux::ChromeBrowserMainExt
+ ChromeBrowserMainExtraPartsLinux::~ChromeBrowserMainExtraPartsLinux() = default;
+
+ void ChromeBrowserMainExtraPartsLinux::PreEarlyInitialization() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On the desktop, we fix the platform name if necessary.
+ // See https://crbug.com/1246928.
+ auto* const command_line = base::CommandLine::ForCurrentProcess();
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__browser__main__linux.cc b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__linux.cc
new file mode 100644
index 000000000000..be841fe06579
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__linux.cc
@@ -0,0 +1,21 @@
+--- chrome/browser/chrome_browser_main_linux.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/chrome_browser_main_linux.cc
+@@ -67,7 +67,9 @@ void ChromeBrowserMainPartsLinux::PostCreateMainMessag
+ #endif // BUILDFLAG(IS_CHROMEOS)
+
+ #if !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_BSD)
+ bluez::BluezDBusManager::Initialize(nullptr /* system_bus */);
++#endif
+
+ // Set up crypt config. This needs to be done before anything starts the
+ // network service, as the raw encryption key needs to be shared with the
+@@ -124,7 +126,7 @@ void ChromeBrowserMainPartsLinux::PostDestroyThreads()
+ #endif // defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS)
+
+ void ChromeBrowserMainPartsLinux::PostDestroyThreads() {
+-#if BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // No-op; per PostBrowserStart() comment, this is done elsewhere.
+ #else
+ bluez::BluezDBusManager::Shutdown();
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__browser__main__posix.cc b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__posix.cc
new file mode 100644
index 000000000000..0c5acc3fd1b5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__browser__main__posix.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/chrome_browser_main_posix.cc.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/chrome_browser_main_posix.cc
+@@ -73,7 +73,7 @@ void ExitHandler::ExitWhenPossibleOnUIThread(int signa
+ } else {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ switch (signal) {
+ case SIGINT:
+ case SIGHUP:
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.cc b/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.cc
new file mode 100644
index 000000000000..00015442c093
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.cc
@@ -0,0 +1,160 @@
+--- chrome/browser/chrome_content_browser_client.cc.orig 2023-12-20 07:12:20 UTC
++++ chrome/browser/chrome_content_browser_client.cc
+@@ -447,7 +447,7 @@
+ #include "storage/browser/file_system/external_mount_points.h"
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/chrome_browser_main_linux.h"
+ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
+ #elif BUILDFLAG(IS_ANDROID)
+@@ -548,12 +548,12 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ #include "chrome/browser/browser_switcher/browser_switcher_navigation_throttle.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crash_switches.h"
+ #include "components/crash/core/app/crashpad.h"
+ #endif
+@@ -564,14 +564,14 @@
+ #include "chrome/browser/apps/link_capturing/web_app_link_capturing_delegate.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/chrome_browser_main_extra_parts_enterprise.h"
+ #include "chrome/browser/enterprise/profile_management/profile_management_navigation_throttle.h"
+ #include "chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h"
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/device_trust/navigation_throttle.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) ||
+ // BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -587,7 +587,7 @@
+ #include "components/lens/lens_features.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/chrome_browser_main_extra_parts_linux.h"
+ #elif BUILDFLAG(IS_OZONE)
+ #include "chrome/browser/chrome_browser_main_extra_parts_ozone.h"
+@@ -1591,7 +1591,7 @@ void ChromeContentBrowserClient::RegisterLocalStatePre
+ registry->RegisterBooleanPref(prefs::kNativeClientForceAllowed, false);
+ registry->RegisterBooleanPref(
+ policy::policy_prefs::kPPAPISharedImagesForVideoDecoderAllowed, true);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kOutOfProcessSystemDnsResolutionEnabled,
+ true);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
+@@ -1715,7 +1715,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(boo
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ main_parts = std::make_unique<ChromeBrowserMainPartsLacros>(
+ is_integration_test, &startup_data_);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ main_parts = std::make_unique<ChromeBrowserMainPartsLinux>(
+ is_integration_test, &startup_data_);
+ #elif BUILDFLAG(IS_ANDROID)
+@@ -1752,7 +1752,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(boo
+ std::make_unique<ChromeBrowserMainExtraPartsViewsLacros>());
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ main_parts->AddParts(
+ std::make_unique<ChromeBrowserMainExtraPartsViewsLinux>());
+ #else
+@@ -1773,7 +1773,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(boo
+ main_parts->AddParts(std::make_unique<ChromeBrowserMainExtraPartsLacros>());
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ main_parts->AddParts(std::make_unique<ChromeBrowserMainExtraPartsLinux>());
+ #elif BUILDFLAG(IS_OZONE)
+ main_parts->AddParts(std::make_unique<ChromeBrowserMainExtraPartsOzone>());
+@@ -1792,7 +1792,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(boo
+
+ chrome::AddMetricsExtraParts(main_parts.get());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ main_parts->AddParts(
+ std::make_unique<
+ chrome::enterprise_util::ChromeBrowserMainExtraPartsEnterprise>());
+@@ -2625,6 +2625,8 @@ void ChromeContentBrowserClient::AppendExtraCommandLin
+ #elif BUILDFLAG(IS_POSIX)
+ #if BUILDFLAG(IS_ANDROID)
+ bool enable_crash_reporter = true;
++#elif BUILDFLAG(IS_BSD)
++ bool enable_crash_reporter = false;
+ #elif BUILDFLAG(IS_CHROMEOS)
+ bool enable_crash_reporter = false;
+ if (crash_reporter::IsCrashpadEnabled()) {
+@@ -2990,7 +2992,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLin
+ ThreadProfilerConfiguration::Get()->AppendCommandLineSwitchForChildProcess(
+ command_line);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ // Opt into a hardened stack canary mitigation if it hasn't already been
+ // force-disabled.
+ if (!browser_command_line.HasSwitch(switches::kChangeStackGuardOnFork)) {
+@@ -4661,7 +4663,7 @@ void ChromeContentBrowserClient::GetAdditionalFileSyst
+ }
+ }
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -5221,7 +5223,7 @@ ChromeContentBrowserClient::CreateThrottlesForNavigati
+ &throttles);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ MaybeAddThrottle(
+ WebAppSettingsNavigationThrottle::MaybeCreateThrottleFor(handle),
+ &throttles);
+@@ -5231,7 +5233,7 @@ ChromeContentBrowserClient::CreateThrottlesForNavigati
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ MaybeAddThrottle(enterprise_connectors::DeviceTrustNavigationThrottle::
+ MaybeCreateThrottleFor(handle),
+ &throttles);
+@@ -5270,7 +5272,7 @@ ChromeContentBrowserClient::CreateThrottlesForNavigati
+ handle));
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ MaybeAddThrottle(browser_switcher::BrowserSwitcherNavigationThrottle::
+ MaybeCreateThrottleFor(handle),
+ &throttles);
+@@ -7164,7 +7166,7 @@ bool ChromeContentBrowserClient::ShouldRunOutOfProcess
+ bool ChromeContentBrowserClient::ShouldRunOutOfProcessSystemDnsResolution() {
+ // This enterprise policy is supported on Android, but the feature will not be
+ // launched there.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // This is possibly called before `g_browser_process` is initialized.
+ PrefService* local_state;
+ if (g_browser_process) {
diff --git a/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.h b/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.h
new file mode 100644
index 000000000000..e562882ab5e2
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_chrome__content__browser__client.h
@@ -0,0 +1,11 @@
+--- chrome/browser/chrome_content_browser_client.h.orig 2023-12-20 07:12:20 UTC
++++ chrome/browser/chrome_content_browser_client.h
+@@ -484,7 +484,7 @@ class ChromeContentBrowserClient : public content::Con
+ void OverridePageVisibilityState(
+ content::RenderFrameHost* render_frame_host,
+ content::PageVisibilityState* visibility_state) override;
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
diff --git a/devel/electron28/files/patch-chrome_browser_component__updater_registration.cc b/devel/electron28/files/patch-chrome_browser_component__updater_registration.cc
new file mode 100644
index 000000000000..fe9b4c2fbcfa
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_component__updater_registration.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/component_updater/registration.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/component_updater/registration.cc
+@@ -223,7 +223,7 @@ void RegisterComponentsForUpdate() {
+
+ RegisterTpcdMetadataComponent(cus);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1490685): Remove this test component once the
+ // experiment has concluded.
+ if (base::FeatureList::IsEnabled(features::kPayloadTestComponent)) {
diff --git a/devel/electron28/files/patch-chrome_browser_component__updater_widevine__cdm__component__installer.cc b/devel/electron28/files/patch-chrome_browser_component__updater_widevine__cdm__component__installer.cc
new file mode 100644
index 000000000000..9f5104fca3e6
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_component__updater_widevine__cdm__component__installer.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/component_updater/widevine_cdm_component_installer.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/component_updater/widevine_cdm_component_installer.cc
+@@ -40,7 +40,7 @@
+ #include "third_party/widevine/cdm/buildflags.h"
+ #include "third_party/widevine/cdm/widevine_cdm_common.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/common/media/component_widevine_cdm_hint_file_linux.h"
+ #endif
+
+@@ -77,7 +77,7 @@ static_assert(std::size(kWidevineSha2Hash) == crypto::
+ const char ImageLoaderComponentName[] = "WidevineCdm";
+ #endif
+
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ // On Linux and ChromeOS the Widevine CDM is loaded at startup before the
+ // zygote is locked down. As a result there is no need to register the CDM
+ // with Chrome as it can't be used until Chrome is restarted.
+@@ -363,7 +363,7 @@ void WidevineCdmComponentInstallerPolicy::UpdateCdmPat
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ VLOG(1) << "Updating hint file with Widevine CDM " << cdm_version;
+
+ // This is running on a thread that allows IO, so simply update the hint file.
diff --git a/devel/electron28/files/patch-chrome_browser_content__settings_one__time__permission__provider.cc b/devel/electron28/files/patch-chrome_browser_content__settings_one__time__permission__provider.cc
new file mode 100644
index 000000000000..af730d369f35
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_content__settings_one__time__permission__provider.cc
@@ -0,0 +1,30 @@
+--- chrome/browser/content_settings/one_time_permission_provider.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/content_settings/one_time_permission_provider.cc
+@@ -226,8 +226,13 @@ void OneTimePermissionProvider::OnSuspend() {
+
+ while (rule_iterator && rule_iterator->HasNext()) {
+ auto rule = rule_iterator->Next();
++#if defined(__clang__) && (__clang_major__ >= 16)
+ patterns_to_delete.emplace_back(setting_type, rule->primary_pattern,
+ rule->secondary_pattern);
++#else
++ patterns_to_delete.emplace_back(ContentSettingEntry{setting_type, rule->primary_pattern,
++ rule->secondary_pattern});
++#endif
+ permissions::PermissionUmaUtil::RecordOneTimePermissionEvent(
+ setting_type,
+ permissions::OneTimePermissionEvent::EXPIRED_ON_SUSPEND);
+@@ -329,8 +334,13 @@ void OneTimePermissionProvider::DeleteEntriesMatchingG
+ auto rule = rule_iterator->Next();
+ if (rule->primary_pattern.Matches(origin_gurl) &&
+ rule->secondary_pattern.Matches(origin_gurl)) {
++#if defined(__clang__) && (__clang_major__ >= 16)
+ patterns_to_delete.emplace_back(
+ content_setting_type, rule->primary_pattern, rule->secondary_pattern);
++#else
++ patterns_to_delete.emplace_back(
++ ContentSettingEntry{content_setting_type, rule->primary_pattern, rule->secondary_pattern});
++#endif
+ permissions::PermissionUmaUtil::RecordOneTimePermissionEvent(
+ content_setting_type, trigger_event);
+ }
diff --git a/devel/electron28/files/patch-chrome_browser_custom__handlers_chrome__protocol__handler__registry__delegate.cc b/devel/electron28/files/patch-chrome_browser_custom__handlers_chrome__protocol__handler__registry__delegate.cc
new file mode 100644
index 000000000000..3271f4e113a9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_custom__handlers_chrome__protocol__handler__registry__delegate.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.cc.orig 2023-03-30 00:33:42 UTC
++++ chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.cc
+@@ -68,7 +68,7 @@ void ChromeProtocolHandlerRegistryDelegate::CheckDefau
+ // If true default protocol handlers will be removed if the OS level
+ // registration for a protocol is no longer Chrome.
+ bool ChromeProtocolHandlerRegistryDelegate::ShouldRemoveHandlersNotInOS() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // We don't do this on Linux as the OS registration there is not reliable,
+ // and Chrome OS doesn't have any notion of OS registration.
+ // TODO(benwells): When Linux support is more reliable remove this
diff --git a/devel/electron28/files/patch-chrome_browser_defaults.cc b/devel/electron28/files/patch-chrome_browser_defaults.cc
new file mode 100644
index 000000000000..e210570512b3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_defaults.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/defaults.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/defaults.cc
+@@ -44,7 +44,7 @@ const bool kShowHelpMenuItemIcon = true;
+ const bool kShowHelpMenuItemIcon = false;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const bool kScrollEventChangesTab = true;
+ #else
+ const bool kScrollEventChangesTab = false;
diff --git a/devel/electron28/files/patch-chrome_browser_device__identity_device__oauth2__token__service__factory.cc b/devel/electron28/files/patch-chrome_browser_device__identity_device__oauth2__token__service__factory.cc
new file mode 100644
index 000000000000..e5e00061d6ab
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_device__identity_device__oauth2__token__service__factory.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/device_identity/device_oauth2_token_service_factory.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/device_identity/device_oauth2_token_service_factory.cc
+@@ -28,7 +28,7 @@ std::unique_ptr<DeviceOAuth2TokenStore> CreatePlatform
+ return std::make_unique<chromeos::DeviceOAuth2TokenStoreChromeOS>(
+ local_state);
+ #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ return std::make_unique<DeviceOAuth2TokenStoreDesktop>(local_state);
+ #else
+ NOTREACHED();
diff --git a/devel/electron28/files/patch-chrome_browser_diagnostics_diagnostics__writer.h b/devel/electron28/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
new file mode 100644
index 000000000000..43c1038a8248
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
@@ -0,0 +1,11 @@
+--- chrome/browser/diagnostics/diagnostics_writer.h.orig 2022-02-07 13:39:41 UTC
++++ chrome/browser/diagnostics/diagnostics_writer.h
+@@ -14,6 +14,8 @@ namespace diagnostics {
+ // Console base class used internally.
+ class SimpleConsole;
+
++#undef MACHINE
++
+ class DiagnosticsWriter : public DiagnosticsModel::Observer {
+ public:
+ // The type of formatting done by this writer.
diff --git a/devel/electron28/files/patch-chrome_browser_download_bubble_download__bubble__update__service.cc b/devel/electron28/files/patch-chrome_browser_download_bubble_download__bubble__update__service.cc
new file mode 100644
index 000000000000..4e1d469a2d5c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_bubble_download__bubble__update__service.cc
@@ -0,0 +1,32 @@
+--- chrome/browser/download/bubble/download_bubble_update_service.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/bubble/download_bubble_update_service.cc
+@@ -89,7 +89,11 @@ template <typename Item>
+ // Helper to get an iterator to the last element in the cache. The cache
+ // must not be empty.
+ template <typename Item>
++#if defined(__clang__) && (__clang_major__ >= 16)
+ SortedItems<Item>::const_iterator GetLastIter(const SortedItems<Item>& cache) {
++#else
++typename SortedItems<Item>::const_iterator GetLastIter(const SortedItems<Item>& cache) {
++#endif
+ CHECK(!cache.empty());
+ auto it = cache.end();
+ return std::prev(it);
+@@ -1089,9 +1093,17 @@ template <typename Id, typename Item>
+ }
+
+ template <typename Id, typename Item>
++#if defined(__clang__) && (__clang_major__ >= 16)
+ SortedItems<Item>::iterator
++#else
++typename SortedItems<Item>::iterator
++#endif
+ DownloadBubbleUpdateService::CacheManager::RemoveItemFromCacheByIter(
++#if defined(__clang__) && (__clang_major__ >= 16)
+ SortedItems<Item>::iterator iter,
++#else
++ typename SortedItems<Item>::iterator iter,
++#endif
+ SortedItems<Item>& cache,
+ IterMap<Id, Item>& iter_map) {
+ CHECK(iter != cache.end());
diff --git a/devel/electron28/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc b/devel/electron28/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
new file mode 100644
index 000000000000..c0e11516cc58
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/download/chrome_download_manager_delegate.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/chrome_download_manager_delegate.cc
+@@ -1623,7 +1623,7 @@ bool ChromeDownloadManagerDelegate::IsOpenInBrowserPre
+ bool ChromeDownloadManagerDelegate::IsOpenInBrowserPreferreredForFile(
+ const base::FilePath& path) {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf"))) {
+ return !download_prefs_->ShouldOpenPdfInSystemReader();
+ }
+@@ -1742,7 +1742,7 @@ void ChromeDownloadManagerDelegate::CheckDownloadAllow
+ content::CheckDownloadAllowedCallback check_download_allowed_cb) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // Don't download pdf if it is a file URL, as that might cause an infinite
+ // download loop if Chrome is not the system pdf viewer.
+ if (url.SchemeIsFile() && download_prefs_->ShouldOpenPdfInSystemReader()) {
+@@ -1788,7 +1788,7 @@ void ChromeDownloadManagerDelegate::CheckSavePackageAl
+ DCHECK(download_item->IsSavePackageDownload());
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ absl::optional<enterprise_connectors::AnalysisSettings> settings =
+ safe_browsing::DeepScanningRequest::ShouldUploadBinary(download_item);
+
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__commands.cc b/devel/electron28/files/patch-chrome_browser_download_download__commands.cc
new file mode 100644
index 000000000000..64002dd0fec3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__commands.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_commands.cc.orig 2022-05-19 14:06:27 UTC
++++ chrome/browser/download/download_commands.cc
+@@ -26,7 +26,7 @@
+ #include "ui/base/clipboard/scoped_clipboard_writer.h"
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/browser.h"
+ #include "chrome/browser/ui/browser_finder.h"
+ #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+@@ -167,7 +167,7 @@ void DownloadCommands::ExecuteCommand(Command command)
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+
+ Browser* DownloadCommands::GetBrowser() const {
+ if (!model_)
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__commands.h b/devel/electron28/files/patch-chrome_browser_download_download__commands.h
new file mode 100644
index 000000000000..53147ce4d879
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__commands.h
@@ -0,0 +1,11 @@
+--- chrome/browser/download/download_commands.h.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/download_commands.h
+@@ -63,7 +63,7 @@ class DownloadCommands {
+ void ExecuteCommand(Command command);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ bool IsDownloadPdf() const;
+ bool CanOpenPdfInSystemViewer() const;
+ Browser* GetBrowser() const;
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__file__picker.cc b/devel/electron28/files/patch-chrome_browser_download_download__file__picker.cc
new file mode 100644
index 000000000000..0d82ba222dc9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__file__picker.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_file_picker.cc.orig 2023-02-01 18:43:11 UTC
++++ chrome/browser/download/download_file_picker.cc
+@@ -17,7 +17,7 @@
+ #include "content/public/browser/download_manager.h"
+ #include "content/public/browser/web_contents.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/browser_list.h"
+ #include "chrome/browser/ui/browser_window.h"
+ #include "ui/aura/window.h"
+@@ -82,7 +82,7 @@ DownloadFilePicker::DownloadFilePicker(download::Downl
+ // dialog in Linux (See SelectFileImpl() in select_file_dialog_linux_gtk.cc).
+ // and windows.Here we make owning_window host to browser current active
+ // window if it is null. https://crbug.com/1301898
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (!owning_window || !owning_window->GetHost()) {
+ owning_window = BrowserList::GetInstance()
+ ->GetLastActive()
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__item__model.cc b/devel/electron28/files/patch-chrome_browser_download_download__item__model.cc
new file mode 100644
index 000000000000..722ee7d67c3b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__item__model.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/download/download_item_model.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/download_item_model.cc
+@@ -755,7 +755,7 @@ bool DownloadItemModel::IsCommandChecked(
+ download_crx_util::IsExtensionDownload(*download_);
+ case DownloadCommands::ALWAYS_OPEN_TYPE:
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (download_commands->CanOpenPdfInSystemViewer()) {
+ DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(profile());
+ return prefs->ShouldOpenPdfInSystemReader();
+@@ -801,7 +801,7 @@ void DownloadItemModel::ExecuteCommand(DownloadCommand
+ DownloadCommands::ALWAYS_OPEN_TYPE);
+ DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(profile());
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (download_commands->CanOpenPdfInSystemViewer()) {
+ prefs->SetShouldOpenPdfInSystemReader(!is_checked);
+ SetShouldPreferOpeningInBrowser(is_checked);
+@@ -1170,7 +1170,7 @@ void DownloadItemModel::DetermineAndSetShouldPreferOpe
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (download_->GetOriginalMimeType() == "application/x-x509-user-cert") {
+ SetShouldPreferOpeningInBrowser(true);
+ return;
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__prefs.cc b/devel/electron28/files/patch-chrome_browser_download_download__prefs.cc
new file mode 100644
index 000000000000..0200de025b75
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__prefs.cc
@@ -0,0 +1,90 @@
+--- chrome/browser/download/download_prefs.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/download_prefs.cc
+@@ -11,6 +11,7 @@
+ #include <vector>
+
+ #include "base/check.h"
++#include "base/command_line.h"
+ #include "base/feature_list.h"
+ #include "base/files/file_util.h"
+ #include "base/functional/bind.h"
+@@ -63,6 +64,10 @@
+ #include "chrome/browser/download/bubble/download_bubble_prefs.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#endif
++
+ using content::BrowserContext;
+ using content::BrowserThread;
+ using content::DownloadManager;
+@@ -73,7 +78,7 @@ bool DownloadPathIsDangerous(const base::FilePath& dow
+ // Consider downloads 'dangerous' if they go to the home directory on Linux and
+ // to the desktop on any platform.
+ bool DownloadPathIsDangerous(const base::FilePath& download_path) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FilePath home_dir = base::GetHomeDir();
+ if (download_path == home_dir) {
+ return true;
+@@ -181,7 +186,7 @@ DownloadPrefs::DownloadPrefs(Profile* profile) : profi
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ should_open_pdf_in_system_reader_ =
+ prefs->GetBoolean(prefs::kOpenPdfDownloadInSystemReader);
+ #endif
+@@ -310,7 +315,7 @@ void DownloadPrefs::RegisterProfilePrefs(
+ registry->RegisterFilePathPref(prefs::kSaveFileDefaultDirectory,
+ default_download_path);
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kOpenPdfDownloadInSystemReader, false);
+ #endif
+ #if BUILDFLAG(IS_ANDROID)
+@@ -474,7 +479,7 @@ void DownloadPrefs::DisableAutoOpenByUserBasedOnExtens
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ void DownloadPrefs::SetShouldOpenPdfInSystemReader(bool should_open) {
+ if (should_open_pdf_in_system_reader_ == should_open)
+ return;
+@@ -506,7 +511,7 @@ void DownloadPrefs::ResetAutoOpenByUser() {
+
+ void DownloadPrefs::ResetAutoOpenByUser() {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ SetShouldOpenPdfInSystemReader(false);
+ #endif
+ auto_open_by_user_.clear();
+@@ -537,7 +542,7 @@ bool DownloadPrefs::CanPlatformEnableAutoOpenForPdf()
+ bool DownloadPrefs::CanPlatformEnableAutoOpenForPdf() const {
+ #if BUILDFLAG(IS_CHROMEOS)
+ return false; // There is no UI for auto-open on ChromeOS.
+-#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return ShouldOpenPdfInSystemReader();
+ #else
+ return false;
+@@ -661,7 +666,14 @@ base::FilePath DownloadPrefs::SanitizeDownloadTargetPa
+ #else
+ // If the stored download directory is an absolute path, we presume it's
+ // correct; there's not really much more validation we can do here.
++#if BUILDFLAG(IS_OPENBSD)
++ // If unveil(2) is used, force the file dialog directory to something we
++ // know is available.
++ auto* sandbox = sandbox::policy::SandboxLinux::GetInstance();
++ if (!sandbox->unveil_initialized() && path.IsAbsolute())
++#else
+ if (path.IsAbsolute())
++#endif
+ return path;
+
+ // When the default download directory is *not* an absolute path, we use the
diff --git a/devel/electron28/files/patch-chrome_browser_download_download__prefs.h b/devel/electron28/files/patch-chrome_browser_download_download__prefs.h
new file mode 100644
index 000000000000..b636b64019e0
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_download_download__prefs.h
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_prefs.h.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/download/download_prefs.h
+@@ -115,7 +115,7 @@ class DownloadPrefs {
+ void DisableAutoOpenByUserBasedOnExtension(const base::FilePath& file_name);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // Store the user preference to disk. If |should_open| is true, also disable
+ // the built-in PDF plugin. If |should_open| is false, enable the PDF plugin.
+ void SetShouldOpenPdfInSystemReader(bool should_open);
+@@ -179,7 +179,7 @@ class DownloadPrefs {
+ std::unique_ptr<policy::URLBlocklist> auto_open_allowed_by_urls_;
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ bool should_open_pdf_in_system_reader_;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_analysis_analysis__service__settings.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_analysis_analysis__service__settings.cc
new file mode 100644
index 000000000000..0aaab5e08983
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_analysis_analysis__service__settings.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
+@@ -143,7 +143,7 @@ AnalysisServiceSettings::AnalysisServiceSettings(
+ const char* verification_key = kKeyWindowsVerification;
+ #elif BUILDFLAG(IS_MAC)
+ const char* verification_key = kKeyMacVerification;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char* verification_key = kKeyLinuxVerification;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_connectors__service.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_connectors__service.cc
new file mode 100644
index 000000000000..e8518f3f700d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_connectors__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/enterprise/connectors/connectors_service.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/enterprise/connectors/connectors_service.cc
+@@ -560,7 +560,7 @@ bool ConnectorsService::ConnectorsEnabled() const {
+
+ Profile* profile = Profile::FromBrowserContext(context_);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On desktop, the guest profile is actually the primary OTR profile of
+ // the "regular" guest profile. The regular guest profile is never used
+ // directly by users. Also, user are not able to create child OTR profiles
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__connector__service__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__connector__service__factory.cc
new file mode 100644
index 000000000000..95af211b7ddd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__connector__service__factory.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service_factory.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service_factory.cc
+@@ -10,7 +10,7 @@
+ #include "chrome/browser/profiles/profile.h"
+ #include "components/keyed_service/core/keyed_service.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/browser_process.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/browser/signing_key_policy_observer.h"
+ #include "chrome/browser/policy/chrome_browser_policy_connector.h"
+@@ -40,7 +40,7 @@ bool DeviceTrustConnectorServiceFactory::ServiceIsCrea
+
+ bool DeviceTrustConnectorServiceFactory::ServiceIsCreatedWithBrowserContext()
+ const {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
+@@ -79,7 +79,7 @@ DeviceTrustConnectorServiceFactory::BuildServiceInstan
+ std::unique_ptr<DeviceTrustConnectorService> service =
+ std::make_unique<DeviceTrustConnectorService>(profile->GetPrefs());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ auto* key_manager = g_browser_process->browser_policy_connector()
+ ->chrome_browser_cloud_management_controller()
+ ->GetDeviceTrustKeyManager();
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__service__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__service__factory.cc
new file mode 100644
index 000000000000..eca40f40099c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_device__trust__service__factory.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/enterprise/connectors/device_trust/device_trust_service_factory.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/enterprise/connectors/device_trust/device_trust_service_factory.cc
+@@ -23,7 +23,7 @@
+ #include "components/policy/core/common/management/management_service.h"
+ #include "content/public/browser/browser_context.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/browser_process.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/attestation/browser/device_attester.h"
+@@ -54,7 +54,7 @@ bool IsProfileManaged(Profile* profile) {
+ return management_service && management_service->IsManaged();
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ policy::CloudPolicyStore* GetUserCloudPolicyStore(Profile* profile) {
+ policy::CloudPolicyManager* user_policy_manager =
+ profile->GetUserCloudPolicyManager();
+@@ -104,7 +104,7 @@ DeviceTrustServiceFactory::DeviceTrustServiceFactory()
+ DependsOn(DeviceTrustConnectorServiceFactory::GetInstance());
+ DependsOn(policy::ManagementServiceFactory::GetInstance());
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Depends on this service via the SignalsService having a dependency on it.
+ DependsOn(enterprise_signals::SignalsAggregatorFactory::GetInstance());
+ // Depends on this service via the ProfileAttester having a dependency on it
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_browser_commands_key__rotation__command__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_browser_commands_key__rotation__command__factory.cc
new file mode 100644
index 000000000000..b53d2051fa45
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_browser_commands_key__rotation__command__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc
+@@ -13,7 +13,7 @@
+
+ #if BUILDFLAG(IS_WIN)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/linux_key_rotation_command.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h"
+@@ -46,7 +46,7 @@ std::unique_ptr<KeyRotationCommand> KeyRotationCommand
+ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
+ #if BUILDFLAG(IS_WIN)
+ return std::make_unique<WinKeyRotationCommand>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return std::make_unique<LinuxKeyRotationCommand>(url_loader_factory);
+ #elif BUILDFLAG(IS_MAC)
+ return std::make_unique<MacKeyRotationCommand>(url_loader_factory);
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_core_persistence_key__persistence__delegate__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_core_persistence_key__persistence__delegate__factory.cc
new file mode 100644
index 000000000000..9710b4d0893f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_key__management_core_persistence_key__persistence__delegate__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate_factory.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate_factory.cc
+@@ -13,7 +13,7 @@
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/win_key_persistence_delegate.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/linux_key_persistence_delegate.h"
+ #endif
+
+@@ -45,7 +45,7 @@ KeyPersistenceDelegateFactory::CreateKeyPersistenceDel
+ return std::make_unique<WinKeyPersistenceDelegate>();
+ #elif BUILDFLAG(IS_MAC)
+ return std::make_unique<MacKeyPersistenceDelegate>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return std::make_unique<LinuxKeyPersistenceDelegate>();
+ #else
+ NOTREACHED();
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_signals_signals__service__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_signals_signals__service__factory.cc
new file mode 100644
index 000000000000..f50d21511cdf
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_device__trust_signals_signals__service__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/connectors/device_trust/signals/signals_service_factory.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/enterprise/connectors/device_trust/signals/signals_service_factory.cc
+@@ -21,7 +21,7 @@
+ #include "chrome/browser/profiles/profile.h"
+ #include "components/policy/core/common/management/management_service.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "base/check.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/signals/dependency_factory.h"
+@@ -58,7 +58,7 @@ std::unique_ptr<SignalsService> CreateSignalsService(P
+ enterprise_signals::ContextInfoFetcher::CreateInstance(
+ profile, ConnectorsServiceFactory::GetForBrowserContext(profile))));
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+
+ policy::CloudPolicyManager* browser_policy_manager = nullptr;
+ if (management_service->HasManagementAuthority(
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_browser__crash__event__router.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_browser__crash__event__router.cc
new file mode 100644
index 000000000000..374a52d23a3a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_browser__crash__event__router.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/connectors/reporting/browser_crash_event_router.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/enterprise/connectors/reporting/browser_crash_event_router.cc
+@@ -11,7 +11,7 @@ namespace enterprise_connectors {
+
+ BrowserCrashEventRouter::BrowserCrashEventRouter(
+ content::BrowserContext* context) {
+-#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH)
++#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_BSD)
+ CrashReportingContext* crash_reporting_context =
+ CrashReportingContext::GetInstance();
+ Profile* profile = Profile::FromBrowserContext(context);
+@@ -21,7 +21,7 @@ BrowserCrashEventRouter::BrowserCrashEventRouter(
+ }
+
+ BrowserCrashEventRouter::~BrowserCrashEventRouter() {
+-#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH)
++#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_BSD)
+ CrashReportingContext* crash_reporting_context =
+ CrashReportingContext::GetInstance();
+ crash_reporting_context->RemoveProfile(this);
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_crash__reporting__context.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_crash__reporting__context.cc
new file mode 100644
index 000000000000..ad84f90c36e0
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_crash__reporting__context.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/enterprise/connectors/reporting/crash_reporting_context.cc.orig 2023-03-30 00:33:42 UTC
++++ chrome/browser/enterprise/connectors/reporting/crash_reporting_context.cc
+@@ -18,7 +18,7 @@
+
+ namespace enterprise_connectors {
+
+-#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH)
++#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_BSD)
+
+ namespace {
+
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.cc b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.cc
new file mode 100644
index 000000000000..b8bf0259375c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.cc.orig 2023-11-29 21:39:47 UTC
++++ chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.cc
+@@ -58,7 +58,7 @@
+ #include "base/strings/utf_string_conversions.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/signals/signals_aggregator_factory.h"
+ #include "components/device_signals/core/browser/signals_aggregator.h"
+ #include "components/device_signals/core/common/signals_constants.h"
+@@ -132,7 +132,7 @@ void UploadSecurityEventReport(base::Value::Dict event
+ std::move(upload_callback));
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void PopulateSignals(base::Value::Dict event,
+ policy::CloudPolicyClient* client,
+ std::string name,
+@@ -427,7 +427,7 @@ void RealtimeReportingClient::ReportPastEvent(const st
+ /*include_profile_user_name=*/false);
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ void AddCrowdstrikeSignalsToEvent(
+ base::Value::Dict& event,
+@@ -486,7 +486,7 @@ void RealtimeReportingClient::ReportEventWithTimestamp
+ if (include_profile_user_name) {
+ event.Set(kKeyProfileUserName, GetProfileUserName());
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ Profile* profile = Profile::FromBrowserContext(context_);
+ device_signals::SignalsAggregator* signals_aggregator =
+ enterprise_signals::SignalsAggregatorFactory::GetForProfile(profile);
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.h b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.h
new file mode 100644
index 000000000000..e953940ad410
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_connectors_reporting_realtime__reporting__client.h
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.h.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.h
+@@ -16,7 +16,7 @@
+ #include "components/keyed_service/core/keyed_service.h"
+ #include "components/policy/core/common/cloud/cloud_policy_client.h"
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/device_signals/core/browser/signals_types.h"
+ #endif
+
+@@ -184,7 +184,7 @@ class RealtimeReportingClient : public KeyedService,
+ base::WeakPtrFactory<RealtimeReportingClient> weak_ptr_factory_{this};
+ };
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Populate event dict with CrowdStrike signal values. If those signals are
+ // available in `response`, this function returns a Dict with the following
+ // fields added:
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_identifiers_profile__id__delegate__impl.cc b/devel/electron28/files/patch-chrome_browser_enterprise_identifiers_profile__id__delegate__impl.cc
new file mode 100644
index 000000000000..0911288fdfbd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_identifiers_profile__id__delegate__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/identifiers/profile_id_delegate_impl.cc.orig 2023-02-01 18:43:11 UTC
++++ chrome/browser/enterprise/identifiers/profile_id_delegate_impl.cc
+@@ -12,7 +12,7 @@
+ #include "components/enterprise/browser/identifiers/identifiers_prefs.h"
+ #include "components/prefs/pref_service.h"
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
+ #if BUILDFLAG(IS_WIN)
+ #include "base/strings/utf_string_conversions.h"
+@@ -36,7 +36,7 @@ void CreateProfileGUID(PrefService* prefs) {
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Gets the device ID from the BrowserDMTokenStorage.
+ std::string GetId() {
+ std::string device_id =
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_profile__management_profile__management__navigation__throttle.cc b/devel/electron28/files/patch-chrome_browser_enterprise_profile__management_profile__management__navigation__throttle.cc
new file mode 100644
index 000000000000..f2d8902b46c8
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_profile__management_profile__management__navigation__throttle.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/enterprise/profile_management/profile_management_navigation_throttle.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/enterprise/profile_management/profile_management_navigation_throttle.cc
+@@ -67,8 +67,8 @@ base::flat_map<std::string, SAMLProfileAttributes>& Ge
+ // TODO(crbug.com/1445072): Add actual domains with attribute names.
+ profile_attributes->insert(std::make_pair(
+ "supported.test",
+- SAMLProfileAttributes("placeholderName", "placeholderDomain",
+- "placeholderToken")));
++ SAMLProfileAttributes(SAMLProfileAttributes{"placeholderName", "placeholderDomain",
++ "placeholderToken"})));
+
+ // Extract domains and attributes from the command line switch.
+ const base::CommandLine& command_line =
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_remote__commands_cbcm__remote__commands__factory.cc b/devel/electron28/files/patch-chrome_browser_enterprise_remote__commands_cbcm__remote__commands__factory.cc
new file mode 100644
index 000000000000..46b9ab15d198
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_remote__commands_cbcm__remote__commands__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/remote_commands/cbcm_remote_commands_factory.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/enterprise/remote_commands/cbcm_remote_commands_factory.cc
+@@ -11,7 +11,7 @@
+ #include "chrome/browser/profiles/profile_manager.h"
+ #include "components/policy/core/common/remote_commands/remote_command_job.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/remote_commands/rotate_attestation_credential_job.h"
+ #include "chrome/browser/policy/chrome_browser_policy_connector.h"
+ #include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
+@@ -30,7 +30,7 @@ CBCMRemoteCommandsFactory::BuildJobForType(
+ g_browser_process->profile_manager());
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (type == enterprise_management::
+ RemoteCommand_Type_BROWSER_ROTATE_ATTESTATION_CREDENTIAL) {
+ return std::make_unique<RotateAttestationCredentialJob>(
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher.cc b/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher.cc
new file mode 100644
index 000000000000..ca94f525274f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/enterprise/signals/device_info_fetcher.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/enterprise/signals/device_info_fetcher.cc
+@@ -10,7 +10,7 @@
+ #include "chrome/browser/enterprise/signals/device_info_fetcher_mac.h"
+ #elif BUILDFLAG(IS_WIN)
+ #include "chrome/browser/enterprise/signals/device_info_fetcher_win.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/signals/device_info_fetcher_linux.h"
+ #endif
+
+@@ -67,7 +67,7 @@ std::unique_ptr<DeviceInfoFetcher> DeviceInfoFetcher::
+ return CreateInstanceInternal();
+ }
+
+-#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN) && \
++#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_BSD) && \
+ !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
+ // static
+ std::unique_ptr<DeviceInfoFetcher> DeviceInfoFetcher::CreateInstanceInternal() {
diff --git a/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher__linux.cc b/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher__linux.cc
new file mode 100644
index 000000000000..7499a1993a65
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_enterprise_signals_device__info__fetcher__linux.cc
@@ -0,0 +1,78 @@
+--- chrome/browser/enterprise/signals/device_info_fetcher_linux.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/enterprise/signals/device_info_fetcher_linux.cc
+@@ -4,12 +4,23 @@
+
+ #include "chrome/browser/enterprise/signals/device_info_fetcher_linux.h"
+
++#include "build/build_config.h"
++
+ #if defined(USE_GIO)
+ #include <gio/gio.h>
+ #endif // defined(USE_GIO)
+ #include <sys/stat.h>
++#if !BUILDFLAG(IS_BSD)
+ #include <sys/sysmacros.h>
++#endif
+
++#if BUILDFLAG(IS_BSD)
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <ifaddrs.h>
++#include <net/if_dl.h>
++#endif
++
+ #include <string>
+
+ #include "base/environment.h"
+@@ -118,6 +129,7 @@ SettingValue GetScreenlockSecured() {
+ // Implements the logic from the native host installation script. First find the
+ // root device identifier, then locate its parent and get its type.
+ SettingValue GetDiskEncrypted() {
++#if !BUILDFLAG(IS_BSD)
+ struct stat info;
+ // First figure out the device identifier. Fail fast if this fails.
+ if (stat("/", &info) != 0)
+@@ -139,11 +151,35 @@ SettingValue GetDiskEncrypted() {
+ }
+ return SettingValue::UNKNOWN;
+ }
++#endif
+ return SettingValue::DISABLED;
+ }
+
+ std::vector<std::string> GetMacAddresses() {
+ std::vector<std::string> result;
++#if BUILDFLAG(IS_BSD)
++ struct ifaddrs* ifa = nullptr;
++
++ if (getifaddrs(&ifa) != 0)
++ return result;
++
++ struct ifaddrs* interface = ifa;
++ for (; interface != nullptr; interface = interface->ifa_next) {
++ if (interface->ifa_addr == nullptr ||
++ interface->ifa_addr->sa_family != AF_LINK) {
++ continue;
++ }
++ struct sockaddr_dl* sdl =
++ reinterpret_cast<struct sockaddr_dl*>(interface->ifa_addr);
++ if (!sdl || sdl->sdl_alen != 6)
++ continue;
++ char* link_address = static_cast<char*>(LLADDR(sdl));
++ result.push_back(base::StringPrintf(
++ "%02x:%02x:%02x:%02x:%02x:%02x", link_address[0] & 0xff,
++ link_address[1] & 0xff, link_address[2] & 0xff, link_address[3] & 0xff,
++ link_address[4] & 0xff, link_address[5] & 0xff));
++ }
++#else
+ base::DirReaderPosix reader("/sys/class/net");
+ if (!reader.IsValid())
+ return result;
+@@ -166,6 +202,7 @@ std::vector<std::string> GetMacAddresses() {
+ &address);
+ result.push_back(address);
+ }
++#endif
+ return result;
+ }
+
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_BUILD.gn b/devel/electron28/files/patch-chrome_browser_extensions_BUILD.gn
new file mode 100644
index 000000000000..5f0dc34246e9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_BUILD.gn
@@ -0,0 +1,13 @@
+--- chrome/browser/extensions/BUILD.gn.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/extensions/BUILD.gn
+@@ -1372,6 +1372,10 @@ static_library("extensions") {
+ deps += [ "//chrome/services/printing/public/mojom" ]
+ }
+
++ if (is_bsd) {
++ sources -= [ "api/image_writer_private/removable_storage_provider_linux.cc" ]
++ }
++
+ if (enable_service_discovery) {
+ sources += [
+ "api/mdns/mdns_api.cc",
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_api__browser__context__keyed__service__factories.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_api__browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..03140586fe05
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_api__browser__context__keyed__service__factories.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/api_browser_context_keyed_service_factories.cc
+@@ -43,7 +43,7 @@
+ #include "extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h"
+ #include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
+ #endif
+
+@@ -119,7 +119,7 @@ void EnsureApiBrowserContextKeyedServiceFactoriesBuilt
+ extensions::SettingsPrivateEventRouterFactory::GetInstance();
+ extensions::SettingsOverridesAPI::GetFactoryInstance();
+ extensions::SidePanelService::GetFactoryInstance();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ extensions::SystemIndicatorManagerFactory::GetInstance();
+ #endif
+ extensions::TabGroupsEventRouterFactory::GetInstance();
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_chrome__desktop__report__request__helper.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_chrome__desktop__report__request__helper.cc
new file mode 100644
index 000000000000..6ddb4b1c7de4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_chrome__desktop__report__request__helper.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc.orig 2022-07-22 17:30:31 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
+@@ -24,7 +24,7 @@
+ #include "base/win/registry.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #endif
+@@ -256,7 +256,7 @@ base::FilePath GetEndpointVerificationDir() {
+ bool got_path = false;
+ #if BUILDFLAG(IS_WIN)
+ got_path = base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ path = base::nix::GetXDGDirectory(env.get(), base::nix::kXdgConfigHomeEnvVar,
+ base::nix::kDotConfigDir);
+@@ -267,7 +267,7 @@ base::FilePath GetEndpointVerificationDir() {
+ if (!got_path)
+ return path;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ path = path.AppendASCII("google");
+ #else
+ path = path.AppendASCII("Google");
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.cc
new file mode 100644
index 000000000000..82dd2b1604b2
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/conversion_utils.cc.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/conversion_utils.cc
+@@ -8,7 +8,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ #include <memory>
+ #include <utility>
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.h b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.h
new file mode 100644
index 000000000000..cd8c69565344
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_conversion__utils.h
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/conversion_utils.h.orig 2022-08-31 12:19:35 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/conversion_utils.h
+@@ -7,7 +7,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ #include <vector>
+
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.cc
new file mode 100644
index 000000000000..97fd48a91631
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc.orig 2023-05-25 00:41:42 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
+@@ -32,7 +32,7 @@
+ #include "components/reporting/util/statusor.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/strings/string_util.h"
+ #include "chrome/browser/enterprise/signals/signals_aggregator_factory.h"
+ #include "chrome/browser/extensions/api/enterprise_reporting_private/conversion_utils.h"
+@@ -149,7 +149,7 @@ api::enterprise_reporting_private::ContextInfo ToConte
+ return info;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ device_signals::SignalsAggregationRequest CreateAggregationRequest(
+ device_signals::SignalName signal_name) {
+@@ -210,7 +210,7 @@ EnterpriseReportingPrivateGetDeviceIdFunction::
+
+ // getPersistentSecret
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+
+ EnterpriseReportingPrivateGetPersistentSecretFunction::
+ EnterpriseReportingPrivateGetPersistentSecretFunction() = default;
+@@ -637,7 +637,7 @@ void EnterpriseReportingPrivateEnqueueRecordFunction::
+ }
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ // getFileSystemInfo
+
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.h b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.h
new file mode 100644
index 000000000000..65033dd688ae
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_enterprise__reporting__private__api.h
@@ -0,0 +1,29 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h.orig 2023-03-30 00:33:42 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
+@@ -20,7 +20,7 @@
+ #include "components/reporting/proto/synced/record.pb.h"
+ #include "components/reporting/proto/synced/record_constants.pb.h"
+ #include "components/reporting/util/statusor.h"
+-#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/time/time.h"
+ #include "components/device_signals/core/browser/signals_types.h"
+ #endif // BUILDFLAG(IS_CHROMEOS)
+@@ -56,7 +56,7 @@ class EnterpriseReportingPrivateGetDeviceIdFunction :
+ ~EnterpriseReportingPrivateGetDeviceIdFunction() override;
+ };
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+
+ class EnterpriseReportingPrivateGetPersistentSecretFunction
+ : public ExtensionFunction {
+@@ -266,7 +266,7 @@ class EnterpriseReportingPrivateEnqueueRecordFunction
+
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ class EnterpriseReportingPrivateGetFileSystemInfoFunction
+ : public ExtensionFunction {
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc
new file mode 100644
index 000000000000..4ae88b1de3b7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
+@@ -20,6 +20,7 @@ static base::LazyInstance<scoped_refptr<StorageDeviceL
+
+ void RemovableStorageProvider::GetAllDevices(DeviceListReadyCallback callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
++#if !BUILDFLAG(IS_BSD)
+ if (g_test_device_list.Get().get() != nullptr) {
+ base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
+ FROM_HERE,
+@@ -33,6 +34,9 @@ void RemovableStorageProvider::GetAllDevices(DeviceLis
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+ base::BindOnce(&RemovableStorageProvider::PopulateDeviceList),
+ std::move(callback));
++#else
++ NOTIMPLEMENTED();
++#endif
+ }
+
+ // static
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_messaging_native__process__launcher__posix.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_messaging_native__process__launcher__posix.cc
new file mode 100644
index 000000000000..0b28ab7e6abd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_messaging_native__process__launcher__posix.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/messaging/native_process_launcher_posix.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/messaging/native_process_launcher_posix.cc
+@@ -84,7 +84,7 @@ bool NativeProcessLauncher::LaunchNativeProcess(
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Don't use no_new_privs mode, e.g. in case the host needs to use sudo.
+ options.allow_new_privs = true;
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_passwords__private_passwords__private__delegate__impl.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_passwords__private_passwords__private__delegate__impl.cc
new file mode 100644
index 000000000000..f725927be4c4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_passwords__private_passwords__private__delegate__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+@@ -601,7 +601,7 @@ void PasswordsPrivateDelegateImpl::OsReauthTimeoutCall
+ }
+
+ void PasswordsPrivateDelegateImpl::OsReauthTimeoutCall() {
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ PasswordsPrivateEventRouter* router =
+ PasswordsPrivateEventRouterFactory::GetForProfile(profile_);
+ if (router) {
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
new file mode 100644
index 000000000000..da892b23b77f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+@@ -279,7 +279,9 @@ bool ChromeRuntimeAPIDelegate::GetPlatformInfo(Platfor
+ } else if (strcmp(os, "linux") == 0) {
+ info->os = extensions::api::runtime::PlatformOs::kLinux;
+ } else if (strcmp(os, "openbsd") == 0) {
+- info->os = extensions::api::runtime::PlatformOs::kOpenbsd;
++ info->os = extensions::api::runtime::PlatformOs::kLinux;
++ } else if (strcmp(os, "freebsd") == 0) {
++ info->os = extensions::api::runtime::PlatformOs::kLinux;
+ } else if (strcmp(os, "fuchsia") == 0) {
+ info->os = extensions::api::runtime::PlatformOs::kFuchsia;
+ } else {
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc
new file mode 100644
index 000000000000..8870ed00d0bb
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/settings_private/prefs_util.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/settings_private/prefs_util.cc
+@@ -195,7 +195,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlist
+ (*s_allowlist)[::prefs::kSidePanelHorizontalAlignment] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ (*s_allowlist)[::prefs::kUseCustomChromeFrame] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ #endif
+@@ -207,7 +207,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlist
+ settings_api::PrefType::PREF_TYPE_STRING;
+ (*s_allowlist)[::prefs::kPolicyThemeColor] =
+ settings_api::PrefType::PREF_TYPE_NUMBER;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ (*s_allowlist)[::prefs::kSystemTheme] =
+ settings_api::PrefType::PREF_TYPE_NUMBER;
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_tabs_tabs__api.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_tabs_tabs__api.cc
new file mode 100644
index 000000000000..d2f14adf6bda
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_tabs_tabs__api.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/tabs/tabs_api.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/tabs/tabs_api.cc
+@@ -861,7 +861,7 @@ ExtensionFunction::ResponseAction WindowsCreateFunctio
+ // ui::SHOW_STATE_MINIMIZED above, on Linux the window is not created as
+ // minimized.
+ // TODO(crbug.com/1410400): Remove this workaround when linux is fixed.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1410400): Find a fix for wayland as well.
+
+ // Must be defined inside IS_LINUX to compile on windows/mac.
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc
new file mode 100644
index 000000000000..643e85fb5537
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc.orig 2022-07-22 17:30:31 UTC
++++ chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
+@@ -29,7 +29,7 @@
+ #include "extensions/browser/process_manager.h"
+ #include "extensions/common/error_utils.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "extensions/common/permissions/permissions_data.h"
+ #endif
+
+@@ -38,7 +38,7 @@ namespace {
+ bool CanEnableAudioDebugRecordingsFromExtension(
+ const extensions::Extension* extension) {
+ bool enabled_by_permissions = false;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (extension) {
+ enabled_by_permissions =
+ extension->permissions_data()->active_permissions().HasAPIPermission(
+@@ -580,7 +580,7 @@ void WebrtcLoggingPrivateStartEventLoggingFunction::Fi
+
+ ExtensionFunction::ResponseAction
+ WebrtcLoggingPrivateGetLogsDirectoryFunction::Run() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Unlike other WebrtcLoggingPrivate functions that take a RequestInfo object,
+ // this function shouldn't be called by a component extension on behalf of
+ // some web code. It returns a DirectoryEntry for use directly in the calling
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_api_webstore__private_webstore__private__api.cc b/devel/electron28/files/patch-chrome_browser_extensions_api_webstore__private_webstore__private__api.cc
new file mode 100644
index 000000000000..83e5f2ecd90b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_api_webstore__private_webstore__private__api.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/webstore_private/webstore_private_api.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+@@ -919,7 +919,7 @@ void WebstorePrivateBeginInstallWithManifest3Function:
+ RequestExtensionApproval(contents);
+ return;
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Shows a parental permission dialog directly bypassing the extension
+ // install dialog view. The parental permission dialog contains a superset
+ // of data from the extension install dialog: requested extension
diff --git a/devel/electron28/files/patch-chrome_browser_extensions_external__provider__impl.cc b/devel/electron28/files/patch-chrome_browser_extensions_external__provider__impl.cc
new file mode 100644
index 000000000000..13b46fa61f0d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_extensions_external__provider__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/external_provider_impl.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/extensions/external_provider_impl.cc
+@@ -830,7 +830,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ if (!profile->GetPrefs()->GetBoolean(pref_names::kBlockExternalExtensions)) {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
+ base::MakeRefCounted<ExternalPrefLoader>(
+@@ -858,7 +858,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ bundled_extension_creation_flags));
+
+ // Define a per-user source of external extensions.
+-#if BUILDFLAG(IS_MAC) || ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if BUILDFLAG(IS_MAC) || ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ BUILDFLAG(CHROMIUM_BRANDING))
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
diff --git a/devel/electron28/files/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc b/devel/electron28/files/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc
new file mode 100644
index 000000000000..831ea66bda0b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
+@@ -322,7 +322,7 @@ const struct {
+ FILE_PATH_LITERAL("Library/Mobile Documents/com~apple~CloudDocs"),
+ kDontBlockChildren},
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux also block access to devices via /dev.
+ {kNoBasePathKey, FILE_PATH_LITERAL("/dev"), kBlockAllChildren},
+ // And security sensitive data in /proc and /sys.
diff --git a/devel/electron28/files/patch-chrome_browser_first__run_first__run__dialog.h b/devel/electron28/files/patch-chrome_browser_first__run_first__run__dialog.h
new file mode 100644
index 000000000000..8f7d4918c91a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_first__run_first__run__dialog.h
@@ -0,0 +1,11 @@
+--- chrome/browser/first_run/first_run_dialog.h.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/first_run/first_run_dialog.h
+@@ -12,7 +12,7 @@
+ // Hide this function on platforms where the dialog does not exist.
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+
+ namespace first_run {
+
diff --git a/devel/electron28/files/patch-chrome_browser_first__run_first__run__internal.h b/devel/electron28/files/patch-chrome_browser_first__run_first__run__internal.h
new file mode 100644
index 000000000000..c20f89819d93
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_first__run_first__run__internal.h
@@ -0,0 +1,11 @@
+--- chrome/browser/first_run/first_run_internal.h.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/first_run/first_run_internal.h
+@@ -54,7 +54,7 @@ FirstRunState DetermineFirstRunState(bool has_sentinel
+ bool force_first_run,
+ bool no_first_run);
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // For testing, forces the first run dialog to either be shown or not. If not
+ // called, the decision to show the dialog or not will be made by Chrome based
+ // on a number of factors (such as install type, whether it's a Chrome-branded
diff --git a/devel/electron28/files/patch-chrome_browser_flag__descriptions.cc b/devel/electron28/files/patch-chrome_browser_flag__descriptions.cc
new file mode 100644
index 000000000000..879ea15f0339
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_flag__descriptions.cc
@@ -0,0 +1,83 @@
+--- chrome/browser/flag_descriptions.cc.orig 2023-12-24 08:42:05 UTC
++++ chrome/browser/flag_descriptions.cc
+@@ -7256,7 +7256,7 @@ const char kLacrosMergeIcuDataFileDescription[] =
+ "Enables sharing common areas of icudtl.dat between Ash and Lacros.";
+ #endif // #if BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kGetAllScreensMediaName[] = "GetAllScreensMedia API";
+ const char kGetAllScreensMediaDescription[] =
+ "When enabled, the getAllScreensMedia API for capturing multiple screens "
+@@ -7495,7 +7495,7 @@ const char kSearchWebInSidePanelDescription[] =
+ // Random platform combinations -----------------------------------------------
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kQuickCommandsName[] = "Quick Commands";
+ const char kQuickCommandsDescription[] =
+ "Enable a text interface to browser features. Invoke with Ctrl-Space.";
+@@ -7504,7 +7504,7 @@ const char kQuickCommandsDescription[] =
+ // BUILDFLAG(IS_FUCHSIA)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kFollowingFeedSidepanelName[] = "Following feed in the sidepanel";
+ const char kFollowingFeedSidepanelDescription[] =
+ "Enables the following feed in the sidepanel.";
+@@ -7519,7 +7519,7 @@ const char kEnableProtoApiForClassifyUrlDescription[]
+ "instead of JSON.";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kEnableNetworkServiceSandboxName[] =
+ "Enable the network service sandbox.";
+ const char kEnableNetworkServiceSandboxDescription[] =
+@@ -7543,7 +7543,7 @@ const char kWebShareDescription[] =
+ "platforms.";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ const char kOzonePlatformHintChoiceDefault[] = "Default";
+ const char kOzonePlatformHintChoiceAuto[] = "Auto";
+ const char kOzonePlatformHintChoiceX11[] = "X11";
+@@ -7563,7 +7563,7 @@ const char kWebBluetoothConfirmPairingSupportDescripti
+ "Bluetooth";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ const char kSkipUndecryptablePasswordsName[] =
+ "Skip undecryptable passwords to use the available decryptable "
+ "passwords.";
+@@ -7577,7 +7577,7 @@ const char kForcePasswordInitialSyncWhenDecryptionFail
+ "storage and requests initial sync.";
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kAsyncDnsName[] = "Async DNS resolver";
+ const char kAsyncDnsDescription[] = "Enables the built-in DNS resolver.";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+@@ -7676,7 +7676,7 @@ const char kElasticOverscrollDescription[] =
+
+ #if BUILDFLAG(IS_WIN) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kUIDebugToolsName[] = "Debugging tools for UI";
+ const char kUIDebugToolsDescription[] =
+ "Enables additional keyboard shortcuts to help debugging.";
+@@ -7722,7 +7722,7 @@ const char kEnableAudioFocusEnforcementDescription[] =
+ "any one time. Requires #enable-media-session-service to be enabled too.";
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ const char kThirdPartyProfileManagementName[] =
+ "Third party profile management";
+ const char kThirdPartyProfileManagementDescription[] =
diff --git a/devel/electron28/files/patch-chrome_browser_flag__descriptions.h b/devel/electron28/files/patch-chrome_browser_flag__descriptions.h
new file mode 100644
index 000000000000..addcc4c4f93b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_flag__descriptions.h
@@ -0,0 +1,89 @@
+--- chrome/browser/flag_descriptions.h.orig 2023-12-24 08:42:05 UTC
++++ chrome/browser/flag_descriptions.h
+@@ -4172,7 +4172,7 @@ extern const char kLacrosMergeIcuDataFileDescription[]
+ extern const char kLacrosMergeIcuDataFileDescription[];
+ #endif // #if BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ extern const char kGetAllScreensMediaName[];
+ extern const char kGetAllScreensMediaDescription[];
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+@@ -4312,14 +4312,14 @@ extern const char kSearchWebInSidePanelDescription[];
+ // Random platform combinations -----------------------------------------------
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ extern const char kQuickCommandsName[];
+ extern const char kQuickCommandsDescription[];
+
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+ // defined (OS_FUCHSIA)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ extern const char kWebShareName[];
+ extern const char kWebShareDescription[];
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+@@ -4329,7 +4329,7 @@ extern const char kWebBluetoothConfirmPairingSupportDe
+ extern const char kWebBluetoothConfirmPairingSupportDescription[];
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ extern const char kOzonePlatformHintChoiceDefault[];
+ extern const char kOzonePlatformHintChoiceAuto[];
+ extern const char kOzonePlatformHintChoiceX11[];
+@@ -4339,7 +4339,7 @@ extern const char kOzonePlatformHintDescription[];
+ extern const char kOzonePlatformHintDescription[];
+ #endif // BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ extern const char kSkipUndecryptablePasswordsName[];
+ extern const char kSkipUndecryptablePasswordsDescription[];
+
+@@ -4347,13 +4347,13 @@ extern const char kForcePasswordInitialSyncWhenDecrypt
+ extern const char kForcePasswordInitialSyncWhenDecryptionFailsDescription[];
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ extern const char kAsyncDnsName[];
+ extern const char kAsyncDnsDescription[];
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ extern const char kFollowingFeedSidepanelName[];
+ extern const char kFollowingFeedSidepanelDescription[];
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+@@ -4364,7 +4364,7 @@ extern const char kEnableProtoApiForClassifyUrlDescrip
+ extern const char kEnableProtoApiForClassifyUrlDescription[];
+ #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ extern const char kEnableNetworkServiceSandboxName[];
+ extern const char kEnableNetworkServiceSandboxDescription[];
+
+@@ -4441,7 +4441,7 @@ extern const char kElasticOverscrollDescription[];
+
+ #if BUILDFLAG(IS_WIN) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ extern const char kUIDebugToolsName[];
+ extern const char kUIDebugToolsDescription[];
+
+@@ -4471,7 +4471,7 @@ extern const char kEnableAudioFocusEnforcementDescript
+ extern const char kEnableAudioFocusEnforcementDescription[];
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ extern const char kThirdPartyProfileManagementName[];
+ extern const char kThirdPartyProfileManagementDescription[];
+
diff --git a/devel/electron28/files/patch-chrome_browser_gcm_gcm__profile__service__factory.cc b/devel/electron28/files/patch-chrome_browser_gcm_gcm__profile__service__factory.cc
new file mode 100644
index 000000000000..d01366f4733c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_gcm_gcm__profile__service__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/gcm/gcm_profile_service_factory.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/gcm/gcm_profile_service_factory.cc
+@@ -89,7 +89,7 @@ GCMProfileServiceFactory::ScopedTestingFactoryInstalle
+ // static
+ GCMProfileService* GCMProfileServiceFactory::GetForProfile(
+ content::BrowserContext* profile) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On desktop, incognito profiles are checked with IsIncognitoProfile().
+ // It's possible for non-incognito profiles to also be off-the-record.
+ bool is_profile_supported =
+@@ -129,7 +129,7 @@ GCMProfileServiceFactory::~GCMProfileServiceFactory()
+ KeyedService* GCMProfileServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ Profile* profile = Profile::FromBrowserContext(context);
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ DCHECK(!profile->IsIncognitoProfile());
+ #else
+ DCHECK(!profile->IsOffTheRecord());
diff --git a/devel/electron28/files/patch-chrome_browser_gcm_instance__id_instance__id__profile__service__factory.cc b/devel/electron28/files/patch-chrome_browser_gcm_instance__id_instance__id__profile__service__factory.cc
new file mode 100644
index 000000000000..a7ba9652284f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_gcm_instance__id_instance__id__profile__service__factory.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/gcm/instance_id/instance_id_profile_service_factory.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/gcm/instance_id/instance_id_profile_service_factory.cc
+@@ -16,7 +16,7 @@ namespace instance_id {
+ // static
+ InstanceIDProfileService* InstanceIDProfileServiceFactory::GetForProfile(
+ content::BrowserContext* profile) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On desktop, the guest profile is actually the primary OTR profile of
+ // the "regular" guest profile. The regular guest profile is never used
+ // directly by users. Also, user are not able to create child OTR profiles
+@@ -61,7 +61,7 @@ InstanceIDProfileServiceFactory::~InstanceIDProfileSer
+ KeyedService* InstanceIDProfileServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ Profile* profile = Profile::FromBrowserContext(context);
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On desktop, incognito profiles are checked with IsIncognitoProfile().
+ // It's possible for non-incognito profiles to also be off-the-record.
+ bool is_incognito = profile->IsIncognitoProfile();
diff --git a/devel/electron28/files/patch-chrome_browser_headless_headless__mode__util.cc b/devel/electron28/files/patch-chrome_browser_headless_headless__mode__util.cc
new file mode 100644
index 000000000000..da5b31ce430f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_headless_headless__mode__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/headless/headless_mode_util.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/headless/headless_mode_util.cc
+@@ -18,7 +18,7 @@
+ #include "chrome/common/chrome_switches.h"
+ #include "content/public/common/content_switches.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/gl/gl_switches.h" // nogncheck
+ #include "ui/ozone/public/ozone_switches.h" // nogncheck
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -81,7 +81,7 @@ class HeadlessModeHandleImpl : public HeadlessModeHand
+ command_line->AppendSwitchPath(switches::kUserDataDir, GetUserDataDir());
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Headless mode on Linux relies on ozone/headless platform.
+ command_line->AppendSwitchASCII(::switches::kOzonePlatform,
+ switches::kHeadless);
diff --git a/devel/electron28/files/patch-chrome_browser_intranet__redirect__detector.h b/devel/electron28/files/patch-chrome_browser_intranet__redirect__detector.h
new file mode 100644
index 000000000000..80b21bbe87bd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_intranet__redirect__detector.h
@@ -0,0 +1,11 @@
+--- chrome/browser/intranet_redirect_detector.h.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/intranet_redirect_detector.h
+@@ -25,7 +25,7 @@ class PrefRegistrySimple;
+ class PrefRegistrySimple;
+
+ #if !(BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA))
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD))
+ #error "IntranetRedirectDetector should only be built on Desktop platforms."
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc b/devel/electron28/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc
new file mode 100644
index 000000000000..a50541a8f114
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc
+@@ -39,10 +39,12 @@ void MTPDeviceMapService::RegisterMTPFileSystem(
+ // Note that this initializes the delegate asynchronously, but since
+ // the delegate will only be used from the IO thread, it is guaranteed
+ // to be created before use of it expects it to be there.
++#if !BUILDFLAG(IS_BSD)
+ CreateMTPDeviceAsyncDelegate(
+ device_location, read_only,
+ base::BindOnce(&MTPDeviceMapService::AddAsyncDelegate,
+ base::Unretained(this), device_location, read_only));
++#endif
+ mtp_device_usage_map_[key] = 0;
+ }
+
diff --git a/devel/electron28/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc b/devel/electron28/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
new file mode 100644
index 000000000000..eebf4fed5a36
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
@@ -0,0 +1,16 @@
+--- chrome/browser/media_galleries/media_file_system_registry.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/media_galleries/media_file_system_registry.cc
+@@ -586,7 +586,12 @@ class MediaFileSystemRegistry::MediaFileSystemContextI
+ // Constructor in 'private' section because depends on private class definition.
+ MediaFileSystemRegistry::MediaFileSystemRegistry()
+ : file_system_context_(new MediaFileSystemContextImpl) {
+- StorageMonitor::GetInstance()->AddObserver(this);
++ /*
++ * This conditional is needed for shutdown. Destructors
++ * try to get the media file system registry.
++ */
++ if (StorageMonitor::GetInstance())
++ StorageMonitor::GetInstance()->AddObserver(this);
+ }
+
+ MediaFileSystemRegistry::~MediaFileSystemRegistry() {
diff --git a/devel/electron28/files/patch-chrome_browser_media_audio__service__util.cc b/devel/electron28/files/patch-chrome_browser_media_audio__service__util.cc
new file mode 100644
index 000000000000..93af34d33a38
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_audio__service__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/media/audio_service_util.cc.orig 2023-02-01 18:43:11 UTC
++++ chrome/browser/media/audio_service_util.cc
+@@ -21,7 +21,7 @@
+
+ namespace {
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
+ const base::Value* GetPolicy(const char* policy_name) {
+ const policy::PolicyMap& policies =
+@@ -43,7 +43,7 @@ bool GetPolicyOrFeature(const char* policy_name, const
+ bool IsAudioServiceSandboxEnabled() {
+ // TODO(crbug.com/1052397): Remove !IS_CHROMEOS_LACROS once lacros starts being
+ // built with OS_CHROMEOS instead of OS_LINUX.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
+ return GetPolicyOrFeature(policy::key::kAudioSandboxEnabled,
+ features::kAudioServiceSandbox);
diff --git a/devel/electron28/files/patch-chrome_browser_media_router_discovery_BUILD.gn b/devel/electron28/files/patch-chrome_browser_media_router_discovery_BUILD.gn
new file mode 100644
index 000000000000..2ae678c19811
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_router_discovery_BUILD.gn
@@ -0,0 +1,11 @@
+--- chrome/browser/media/router/discovery/BUILD.gn.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/media/router/discovery/BUILD.gn
+@@ -81,7 +81,7 @@ static_library("discovery") {
+ ]
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [ "discovery_network_list_wifi_linux.cc" ]
+ }
+
diff --git a/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc b/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
new file mode 100644
index 000000000000..71650219d44a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
@@ -0,0 +1,48 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_posix.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_posix.cc
+@@ -5,11 +5,12 @@
+ #include "chrome/browser/media/router/discovery/discovery_network_list.h"
+
+ #include <ifaddrs.h>
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <sys/time.h>
+ #include <net/if.h>
+ #include <net/if_arp.h>
+ #include <netinet/in.h>
+-#include <sys/socket.h>
+-#include <sys/types.h>
+
+ #include <algorithm>
+
+@@ -18,7 +19,7 @@
+ #include "chrome/browser/media/router/discovery/discovery_network_list_wifi.h"
+ #include "net/base/net_errors.h"
+
+-#if !BUILDFLAG(IS_MAC)
++#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ #include <netpacket/packet.h>
+ #else
+ #include <net/if_dl.h>
+@@ -27,7 +28,7 @@
+ namespace media_router {
+ namespace {
+
+-#if !BUILDFLAG(IS_MAC)
++#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ using sll = struct sockaddr_ll;
+ #define SOCKET_ARP_TYPE(s) ((s)->sll_hatype)
+ #define SOCKET_ADDRESS_LEN(s) ((s)->sll_halen)
+@@ -38,6 +39,12 @@ using sll = struct sockaddr_dl;
+ #define SOCKET_ARP_TYPE(s) ((s)->sdl_type)
+ #define SOCKET_ADDRESS_LEN(s) ((s)->sdl_alen)
+ #define SOCKET_ADDRESS(s) (LLADDR(s))
++#endif
++
++#if BUILDFLAG(IS_BSD)
++bool MaybeGetWifiSSID(const std::string& if_name, std::string* ssid_out) {
++ return false;
++}
+ #endif
+
+ void GetDiscoveryNetworkInfoListImpl(
diff --git a/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc b/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
new file mode 100644
index 000000000000..9a2666e365ac
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
@@ -0,0 +1,30 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc
+@@ -9,7 +9,11 @@
+ #include <sys/socket.h>
+ #include <sys/types.h>
+
++#include "build/build_config.h"
++
++#if !BUILDFLAG(IS_BSD)
+ #include <linux/wireless.h>
++#endif
+
+ #include "base/check.h"
+ #include "base/files/scoped_file.h"
+@@ -20,6 +24,7 @@ namespace media_router {
+ bool MaybeGetWifiSSID(const std::string& if_name, std::string* ssid_out) {
+ DCHECK(ssid_out);
+
++#if !BUILDFLAG(IS_BSD)
+ base::ScopedFD ioctl_socket(socket(AF_INET, SOCK_DGRAM, 0));
+ if (!ioctl_socket.is_valid()) {
+ // AF_INET is for IPv4, so it may fail for IPv6-only hosts even when there
+@@ -41,6 +46,7 @@ bool MaybeGetWifiSSID(const std::string& if_name, std:
+ ssid_out->assign(ssid);
+ return true;
+ }
++#endif
+ return false;
+ }
+
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_capture__policy__utils.cc b/devel/electron28/files/patch-chrome_browser_media_webrtc_capture__policy__utils.cc
new file mode 100644
index 000000000000..1831d72f7998
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_capture__policy__utils.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/media/webrtc/capture_policy_utils.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/media/webrtc/capture_policy_utils.cc
+@@ -140,7 +140,7 @@ bool IsGetAllScreensMediaAllowedForAnySite(content::Br
+ }
+
+ bool IsGetAllScreensMediaAllowedForAnySite(content::BrowserContext* context) {
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ Profile* profile = Profile::FromBrowserContext(context);
+ if (!profile) {
+ return false;
+@@ -175,7 +175,7 @@ bool IsGetAllScreensMediaAllowed(content::BrowserConte
+
+ bool IsGetAllScreensMediaAllowed(content::BrowserContext* context,
+ const GURL& url) {
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ Profile* profile = Profile::FromBrowserContext(context);
+ if (!profile) {
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.cc b/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.cc
new file mode 100644
index 000000000000..2d5082b9e4e7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.cc
@@ -0,0 +1,47 @@
+--- chrome/browser/media/webrtc/chrome_screen_enumerator.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/media/webrtc/chrome_screen_enumerator.cc
+@@ -21,7 +21,7 @@
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ #include "ash/shell.h"
+ #include "ui/aura/window.h"
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/functional/callback.h"
+ #include "content/public/browser/desktop_capture.h"
+ #endif
+@@ -32,7 +32,7 @@ base::LazyInstance<std::vector<aura::Window*>>::Destru
+ root_windows_for_testing_ = LAZY_INSTANCE_INITIALIZER;
+ } // namespace
+
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ namespace {
+ base::LazyInstance<std::unique_ptr<webrtc::DesktopCapturer>>::DestructorAtExit
+ g_desktop_capturer_for_testing = LAZY_INSTANCE_INITIALIZER;
+@@ -78,7 +78,7 @@ blink::mojom::StreamDevicesSetPtr EnumerateScreens(
+ return stream_devices_set;
+ }
+
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ blink::mojom::StreamDevicesSetPtr EnumerateScreens(
+ blink::mojom::MediaStreamType stream_type) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+@@ -129,7 +129,7 @@ void ChromeScreenEnumerator::SetRootWindowsForTesting(
+ root_windows_for_testing_.Get() = std::move(root_windows);
+ }
+
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void ChromeScreenEnumerator::SetDesktopCapturerForTesting(
+ std::unique_ptr<webrtc::DesktopCapturer> capturer) {
+ g_desktop_capturer_for_testing.Get() = std::move(capturer);
+@@ -142,7 +142,7 @@ void ChromeScreenEnumerator::EnumerateScreens(
+ ScreensCallback screens_callback) const {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ content::GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult(
+ FROM_HERE, base::BindOnce(::EnumerateScreens, stream_type),
+ base::BindOnce(
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.h b/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.h
new file mode 100644
index 000000000000..a706fa6dd69c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_chrome__screen__enumerator.h
@@ -0,0 +1,20 @@
+--- chrome/browser/media/webrtc/chrome_screen_enumerator.h.orig 2023-03-30 00:33:43 UTC
++++ chrome/browser/media/webrtc/chrome_screen_enumerator.h
+@@ -21,7 +21,7 @@ namespace aura {
+ class Window;
+ }
+
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ namespace webrtc {
+ class DesktopCapturer;
+ }
+@@ -42,7 +42,7 @@ class ChromeScreenEnumerator : public media::ScreenEnu
+
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ static void SetRootWindowsForTesting(std::vector<aura::Window*> root_windows);
+-#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ static void SetDesktopCapturerForTesting(
+ std::unique_ptr<webrtc::DesktopCapturer> capturer);
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc
new file mode 100644
index 000000000000..b91c5597298b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/media/webrtc/webrtc_event_log_uploader.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
+@@ -42,7 +42,7 @@ const char kProduct[] = "Chrome";
+ const char kProduct[] = "Chrome_Mac";
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ const char kProduct[] = "Chrome_ChromeOS";
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ const char kProduct[] = "Chrome_Linux";
+ #elif BUILDFLAG(IS_ANDROID)
+ const char kProduct[] = "Chrome_Android";
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
new file mode 100644
index 000000000000..4dffdd0c5d49
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/media/webrtc/webrtc_log_uploader.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/media/webrtc/webrtc_log_uploader.cc
+@@ -374,6 +374,10 @@ void WebRtcLogUploader::SetupMultipart(
+ const char product[] = "Chrome_ChromeOS";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ const char product[] = "Chrome_Fuchsia";
++#elif defined(OS_OPENBSD)
++ const char product[] = "Chrome_OpenBSD";
++#elif defined(OS_FREEBSD)
++ const char product[] = "Chrome_FreeBSD";
+ #else
+ #error Platform not supported.
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc
new file mode 100644
index 000000000000..0812a7901649
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc
@@ -0,0 +1,33 @@
+--- chrome/browser/media/webrtc/webrtc_logging_controller.cc.orig 2023-05-25 00:41:43 UTC
++++ chrome/browser/media/webrtc/webrtc_logging_controller.cc
+@@ -25,10 +25,10 @@
+ #include "components/webrtc_logging/browser/text_log_list.h"
+ #include "content/public/browser/render_process_host.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/public/browser/child_process_security_policy.h"
+ #include "storage/browser/file_system/isolated_context.h"
+-#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ using webrtc_event_logging::WebRtcEventLogManager;
+
+@@ -284,7 +284,7 @@ void WebRtcLoggingController::StartEventLogging(
+ web_app_id, callback);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void WebRtcLoggingController::GetLogsDirectory(
+ LogsDirectoryCallback callback,
+ LogsDirectoryErrorCallback error_callback) {
+@@ -329,7 +329,7 @@ void WebRtcLoggingController::GrantLogsDirectoryAccess
+ FROM_HERE,
+ base::BindOnce(std::move(callback), file_system.id(), registered_name));
+ }
+-#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ void WebRtcLoggingController::OnRtpPacket(
+ std::unique_ptr<uint8_t[]> packet_header,
diff --git a/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h
new file mode 100644
index 000000000000..b32b1ba8907f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h
@@ -0,0 +1,20 @@
+--- chrome/browser/media/webrtc/webrtc_logging_controller.h.orig 2023-05-25 00:41:43 UTC
++++ chrome/browser/media/webrtc/webrtc_logging_controller.h
+@@ -134,7 +134,7 @@ class WebRtcLoggingController
+ size_t web_app_id,
+ const StartEventLoggingCallback& callback);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Ensures that the WebRTC Logs directory exists and then grants render
+ // process access to the 'WebRTC Logs' directory, and invokes |callback| with
+ // the ids necessary to create a DirectoryEntry object.
+@@ -199,7 +199,7 @@ class WebRtcLoggingController
+
+ content::BrowserContext* GetBrowserContext() const;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Grants the render process access to the 'WebRTC Logs' directory, and
+ // invokes |callback| with the ids necessary to create a DirectoryEntry
+ // object. If the |logs_path| couldn't be created or found, |error_callback|
diff --git a/devel/electron28/files/patch-chrome_browser_memory__details.cc b/devel/electron28/files/patch-chrome_browser_memory__details.cc
new file mode 100644
index 000000000000..be11020c7e44
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_memory__details.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/memory_details.cc.orig 2023-10-19 19:58:04 UTC
++++ chrome/browser/memory_details.cc
+@@ -38,7 +38,7 @@
+ #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_BSD)
+ #include "content/public/browser/zygote_host/zygote_host_linux.h"
+ #endif
+
+@@ -335,7 +335,7 @@ void MemoryDetails::CollectChildInfoOnUIThread() {
+ std::ref(process)));
+ }
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_BSD)
+ if (content::ZygoteHost::GetInstance()->IsZygotePid(process.pid)) {
+ process.process_type = content::PROCESS_TYPE_ZYGOTE;
+ }
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc b/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
new file mode 100644
index 000000000000..cf3168b02ece
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
@@ -0,0 +1,55 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+@@ -78,8 +78,10 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if defined(__GLIBC__) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if defined(__GLIBC__) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
++#if !BUILDFLAG(IS_BSD)
+ #include <gnu/libc-version.h>
++#endif
+
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -108,7 +110,7 @@
+ #include "chromeos/crosapi/cpp/crosapi_constants.h"
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/metrics/pressure/pressure_metrics_reporter.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -117,7 +119,7 @@
+ #include "components/user_manager/user_manager.h"
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/power_metrics/system_power_monitor.h"
+ #endif
+
+@@ -917,7 +919,7 @@ void RecordStartupMetrics() {
+
+ // Record whether Chrome is the default browser or not.
+ // Disabled on Linux due to hanging browser tests, see crbug.com/1216328.
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ shell_integration::DefaultWebClientState default_state =
+ shell_integration::GetDefaultBrowser();
+ base::UmaHistogramEnumeration("DefaultBrowser.State", default_state,
+@@ -1239,11 +1241,11 @@ void ChromeBrowserMainExtraPartsMetrics::PostBrowserSt
+ }
+ #endif // !BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ pressure_metrics_reporter_ = std::make_unique<PressureMetricsReporter>();
+ #endif // BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(
+ power_metrics::SystemPowerMonitor::GetInstance());
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.h b/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.h
new file mode 100644
index 000000000000..d3c0c1d84165
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.h
@@ -0,0 +1,20 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h.orig 2023-09-05 21:57:50 UTC
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h
+@@ -33,7 +33,7 @@ class PowerMetricsReporter;
+ class ProcessMonitor;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class PressureMetricsReporter;
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -139,7 +139,7 @@ class ChromeBrowserMainExtraPartsMetrics : public Chro
+ std::unique_ptr<BatteryDischargeReporter> battery_discharge_reporter_;
+ #endif // !BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Reports pressure metrics.
+ std::unique_ptr<PressureMetricsReporter> pressure_metrics_reporter_;
+ #endif // BUILDFLAG(IS_LINUX)
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc b/devel/electron28/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc
new file mode 100644
index 000000000000..894263ea071b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc
@@ -0,0 +1,56 @@
+--- chrome/browser/metrics/chrome_metrics_service_client.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/metrics/chrome_metrics_service_client.cc
+@@ -184,7 +184,7 @@
+ #include "chrome/notification_helper/notification_helper_constants.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/metrics/motherboard_metrics_provider.h"
+ #endif
+
+@@ -210,7 +210,7 @@
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/metrics/family_link_user_metrics_provider.h"
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS_LACROS))||BUILDFLAG(IS_ANDROID))
+@@ -810,7 +810,7 @@ void ChromeMetricsServiceClient::RegisterMetricsServic
+ metrics_service_->RegisterMetricsProvider(
+ std::make_unique<metrics::CPUMetricsProvider>());
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ metrics_service_->RegisterMetricsProvider(
+ std::make_unique<metrics::MotherboardMetricsProvider>());
+ #endif
+@@ -894,7 +894,7 @@ void ChromeMetricsServiceClient::RegisterMetricsServic
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ metrics_service_->RegisterMetricsProvider(
+ std::make_unique<DesktopPlatformFeaturesMetricsProvider>());
+@@ -1013,7 +1013,7 @@ void ChromeMetricsServiceClient::RegisterMetricsServic
+ std::make_unique<PowerMetricsProvider>());
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ metrics_service_->RegisterMetricsProvider(
+ metrics::CreateDesktopSessionMetricsProvider());
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX)
+@@ -1212,7 +1212,7 @@ bool ChromeMetricsServiceClient::RegisterForProfileEve
+ #endif
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ // This creates the DesktopProfileSessionDurationsServices if it didn't exist
+ // already.
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_perf_cpu__identity.cc b/devel/electron28/files/patch-chrome_browser_metrics_perf_cpu__identity.cc
new file mode 100644
index 000000000000..25685c40b0cb
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_perf_cpu__identity.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/metrics/perf/cpu_identity.cc.orig 2023-02-01 18:43:11 UTC
++++ chrome/browser/metrics/perf/cpu_identity.cc
+@@ -141,7 +141,7 @@ CPUIdentity GetCPUIdentity() {
+ result.release =
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ base::SysInfo::KernelVersion();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ base::SysInfo::OperatingSystemVersion();
+ #else
+ #error "Unsupported configuration"
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_power_process__metrics__recorder__util.cc b/devel/electron28/files/patch-chrome_browser_metrics_power_process__metrics__recorder__util.cc
new file mode 100644
index 000000000000..167de82c10fa
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_power_process__metrics__recorder__util.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/metrics/power/process_metrics_recorder_util.cc.orig 2022-07-22 17:30:31 UTC
++++ chrome/browser/metrics/power/process_metrics_recorder_util.cc
+@@ -59,7 +59,7 @@ void RecordProcessHistograms(const char* histogram_suf
+ const ProcessMonitor::Metrics& metrics) {
+ RecordAverageCPUUsage(histogram_suffix, metrics.cpu_usage);
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ base::UmaHistogramCounts10000(
+ base::StrCat({"PerformanceMonitor.IdleWakeups2.", histogram_suffix}),
+ metrics.idle_wakeups);
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.cc b/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.cc
new file mode 100644
index 000000000000..0fca24d5039f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/metrics/power/process_monitor.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/metrics/power/process_monitor.cc
+@@ -65,7 +65,7 @@ ProcessMonitor::Metrics SampleMetrics(base::ProcessMet
+ #endif
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ metrics.idle_wakeups = process_metrics.GetIdleWakeupsPerSecond();
+ #endif
+ #if BUILDFLAG(IS_MAC)
+@@ -81,7 +81,7 @@ void ScaleMetrics(ProcessMonitor::Metrics* metrics, do
+ metrics->cpu_usage *= factor;
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ metrics->idle_wakeups *= factor;
+ #endif
+
+@@ -172,7 +172,7 @@ ProcessMonitor::Metrics& operator+=(ProcessMonitor::Me
+ lhs.cpu_usage += rhs.cpu_usage;
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ lhs.idle_wakeups += rhs.idle_wakeups;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.h b/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.h
new file mode 100644
index 000000000000..16db05f3bd3c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_metrics_power_process__monitor.h
@@ -0,0 +1,11 @@
+--- chrome/browser/metrics/power/process_monitor.h.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/metrics/power/process_monitor.h
+@@ -75,7 +75,7 @@ class ProcessMonitor : public content::BrowserChildPro
+ double cpu_usage = 0.0;
+
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_AIX)
++ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_BSD)
+ // Returns the number of average idle cpu wakeups per second since the last
+ // time the metric was sampled.
+ int idle_wakeups = 0;
diff --git a/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.cc b/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.cc
new file mode 100644
index 000000000000..80c0e8544f3b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.cc
@@ -0,0 +1,174 @@
+--- chrome/browser/net/system_network_context_manager.cc.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/net/system_network_context_manager.cc
+@@ -92,7 +92,7 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "chrome/common/chrome_paths_internal.h"
+ #include "chrome/grit/branded_strings.h"
+ #include "ui/base/l10n/l10n_util.h"
+@@ -136,7 +136,7 @@ bool g_previously_failed_to_launch_sandboxed_service =
+ // received a failed launch for a sandboxed network service.
+ bool g_previously_failed_to_launch_sandboxed_service = false;
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Whether kerberos library loading will work in the network service due to the
+ // sandbox.
+ bool g_network_service_will_allow_gssapi_library_load = false;
+@@ -144,7 +144,7 @@ const char* kGssapiDesiredPref =
+ const char* kGssapiDesiredPref =
+ #if BUILDFLAG(IS_CHROMEOS)
+ prefs::kKerberosEnabled;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ prefs::kReceivedHttpAuthNegotiateHeader;
+ #endif
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+@@ -190,7 +190,7 @@ network::mojom::HttpAuthDynamicParamsPtr CreateHttpAut
+ auth_dynamic_params->basic_over_http_enabled =
+ local_state->GetBoolean(prefs::kBasicAuthOverHttpEnabled);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ auth_dynamic_params->delegate_by_kdc_policy =
+ local_state->GetBoolean(prefs::kAuthNegotiateDelegateByKdcPolicy);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
+@@ -205,7 +205,7 @@ network::mojom::HttpAuthDynamicParamsPtr CreateHttpAut
+ local_state->GetString(prefs::kAuthAndroidNegotiateAccountType);
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auth_dynamic_params->allow_gssapi_library_load =
+ local_state->GetBoolean(kGssapiDesiredPref);
+ #endif // BUILDFLAG(IS_CHROMEOS)
+@@ -215,7 +215,7 @@ void OnNewHttpAuthDynamicParams(
+
+ void OnNewHttpAuthDynamicParams(
+ network::mojom::HttpAuthDynamicParamsPtr& params) {
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The kerberos library is incompatible with the network service sandbox, so
+ // if library loading is now enabled, the network service needs to be
+ // restarted. It will be restarted unsandboxed because is
+@@ -257,11 +257,11 @@ NetworkSandboxState IsNetworkSandboxEnabledInternal()
+ if (g_previously_failed_to_launch_sandboxed_service) {
+ return NetworkSandboxState::kDisabledBecauseOfFailedLaunch;
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* local_state = g_browser_process->local_state();
+ #endif
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The network service sandbox and the kerberos library are incompatible.
+ // If kerberos is enabled by policy, disable the network service sandbox.
+ if (g_network_service_will_allow_gssapi_library_load ||
+@@ -277,7 +277,7 @@ NetworkSandboxState IsNetworkSandboxEnabledInternal()
+ }
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (local_state &&
+ local_state->HasPrefPath(prefs::kNetworkServiceSandboxEnabled)) {
+ return local_state->GetBoolean(prefs::kNetworkServiceSandboxEnabled)
+@@ -472,7 +472,7 @@ void SystemNetworkContextManager::DeleteInstance() {
+ g_system_network_context_manager = nullptr;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ SystemNetworkContextManager::GssapiLibraryLoadObserver::
+ GssapiLibraryLoadObserver(SystemNetworkContextManager* owner)
+ : owner_(owner) {}
+@@ -530,7 +530,7 @@ SystemNetworkContextManager::SystemNetworkContextManag
+ pref_change_registrar_.Add(prefs::kAllHttpAuthSchemesAllowedForOrigins,
+ auth_pref_callback);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ pref_change_registrar_.Add(prefs::kAuthNegotiateDelegateByKdcPolicy,
+ auth_pref_callback);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
+@@ -544,7 +544,7 @@ SystemNetworkContextManager::SystemNetworkContextManag
+ auth_pref_callback);
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ pref_change_registrar_.Add(kGssapiDesiredPref, auth_pref_callback);
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
+@@ -577,7 +577,7 @@ SystemNetworkContextManager::SystemNetworkContextManag
+ #endif // BUILDFLAG(CHROME_ROOT_STORE_POLICY_SUPPORTED)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ pref_change_registrar_.Add(
+ prefs::kEnforceLocalAnchorConstraintsEnabled,
+ base::BindRepeating(&SystemNetworkContextManager::
+@@ -632,7 +632,7 @@ void SystemNetworkContextManager::RegisterPrefs(PrefRe
+ registry->RegisterBooleanPref(prefs::kKerberosEnabled, false);
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kAuthNegotiateDelegateByKdcPolicy,
+ false);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
+@@ -661,7 +661,7 @@ void SystemNetworkContextManager::RegisterPrefs(PrefRe
+ registry->RegisterBooleanPref(prefs::kChromeRootStoreEnabled, false);
+ #endif // BUILDFLAG(CHROME_ROOT_STORE_POLICY_SUPPORTED)
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Note that the default value is not relevant because the pref is only
+ // evaluated when it is managed.
+ registry->RegisterBooleanPref(prefs::kEnforceLocalAnchorConstraintsEnabled,
+@@ -670,11 +670,11 @@ void SystemNetworkContextManager::RegisterPrefs(PrefRe
+
+ registry->RegisterListPref(prefs::kExplicitlyAllowedNetworkPorts);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kNetworkServiceSandboxEnabled, true);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kReceivedHttpAuthNegotiateHeader, false);
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -727,7 +727,7 @@ void SystemNetworkContextManager::OnNetworkServiceCrea
+ OnNewHttpAuthDynamicParams(http_auth_dynamic_params);
+ network_service->ConfigureHttpAuthPrefs(std::move(http_auth_dynamic_params));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gssapi_library_loader_observer_.Install(network_service);
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -938,7 +938,7 @@ bool SystemNetworkContextManager::IsNetworkSandboxEnab
+ break;
+ }
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!enabled) {
+ g_network_service_will_allow_gssapi_library_load = true;
+ }
+@@ -1052,7 +1052,7 @@ void SystemNetworkContextManager::UpdateChromeRootStor
+ #endif // BUILDFLAG(CHROME_ROOT_STORE_POLICY_SUPPORTED)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ void SystemNetworkContextManager::UpdateEnforceLocalAnchorConstraintsEnabled() {
+ const PrefService::Preference* enforce_local_anchor_constraints_enabled_pref =
+ local_state_->FindPreference(
diff --git a/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.h b/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.h
new file mode 100644
index 000000000000..f9a2140544bd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_net_system__network__context__manager.h
@@ -0,0 +1,29 @@
+--- chrome/browser/net/system_network_context_manager.h.orig 2023-11-29 21:39:48 UTC
++++ chrome/browser/net/system_network_context_manager.h
+@@ -185,7 +185,7 @@ class SystemNetworkContextManager {
+ class URLLoaderFactoryForSystem;
+ class NetworkProcessLaunchWatcher;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class GssapiLibraryLoadObserver
+ : public network::mojom::GssapiLibraryLoadObserver {
+ public:
+@@ -229,7 +229,7 @@ class SystemNetworkContextManager {
+ #endif // BUILDFLAG(CHROME_ROOT_STORE_POLICY_SUPPORTED)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Applies the current value of the kEnforceLocalAnchorConstraintsEnabled
+ // pref to the enforcement state.
+ void UpdateEnforceLocalAnchorConstraintsEnabled();
+@@ -277,7 +277,7 @@ class SystemNetworkContextManager {
+
+ static absl::optional<bool> certificate_transparency_enabled_for_testing_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ GssapiLibraryLoadObserver gssapi_library_loader_observer_{this};
+ #endif // BUILDFLAG(IS_LINUX)
+ };
diff --git a/devel/electron28/files/patch-chrome_browser_new__tab__page_modules_drive_drive__service.cc b/devel/electron28/files/patch-chrome_browser_new__tab__page_modules_drive_drive__service.cc
new file mode 100644
index 000000000000..69a0fdee9ce1
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_new__tab__page_modules_drive_drive__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/new_tab_page/modules/drive/drive_service.cc.orig 2023-10-19 19:58:05 UTC
++++ chrome/browser/new_tab_page/modules/drive/drive_service.cc
+@@ -32,7 +32,7 @@
+ #include "services/network/public/cpp/resource_request.h"
+
+ namespace {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ constexpr char kPlatform[] = "LINUX";
+ #elif BUILDFLAG(IS_WIN)
+ constexpr char kPlatform[] = "WINDOWS";
diff --git a/devel/electron28/files/patch-chrome_browser_new__tab__page_new__tab__page__util.cc b/devel/electron28/files/patch-chrome_browser_new__tab__page_new__tab__page__util.cc
new file mode 100644
index 000000000000..d0f0036afb0f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_new__tab__page_new__tab__page__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/new_tab_page/new_tab_page_util.cc.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/new_tab_page/new_tab_page_util.cc
+@@ -11,7 +11,7 @@
+
+ namespace {
+ bool IsOsSupportedForRecipe() {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
+@@ -27,7 +27,7 @@ bool IsOsSupportedForCart() {
+ }
+
+ bool IsOsSupportedForDrive() {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_notifications_notification__display__service__impl.cc b/devel/electron28/files/patch-chrome_browser_notifications_notification__display__service__impl.cc
new file mode 100644
index 000000000000..cf7943370f20
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_notifications_notification__display__service__impl.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/notifications/notification_display_service_impl.cc.orig 2022-05-19 14:06:27 UTC
++++ chrome/browser/notifications/notification_display_service_impl.cc
+@@ -32,7 +32,7 @@
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/send_tab_to_self/desktop_notification_handler.h"
+ #include "chrome/browser/sharing/sharing_notification_handler.h"
+ #endif
+@@ -65,7 +65,7 @@ NotificationDisplayServiceImpl* NotificationDisplaySer
+ // static
+ void NotificationDisplayServiceImpl::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kAllowSystemNotifications, true);
+ #endif
+ }
+@@ -81,7 +81,7 @@ NotificationDisplayServiceImpl::NotificationDisplaySer
+ std::make_unique<PersistentNotificationHandler>());
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ AddNotificationHandler(
+ NotificationHandler::Type::SEND_TAB_TO_SELF,
+ std::make_unique<send_tab_to_self::DesktopNotificationHandler>(
+@@ -89,7 +89,7 @@ NotificationDisplayServiceImpl::NotificationDisplaySer
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ AddNotificationHandler(
+ NotificationHandler::Type::TAILORED_SECURITY,
+ std::make_unique<safe_browsing::TailoredSecurityNotificationHandler>());
diff --git a/devel/electron28/files/patch-chrome_browser_notifications_notification__platform__bridge__delegator.cc b/devel/electron28/files/patch-chrome_browser_notifications_notification__platform__bridge__delegator.cc
new file mode 100644
index 000000000000..1d138c9c3cb0
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_notifications_notification__platform__bridge__delegator.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/notifications/notification_platform_bridge_delegator.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/notifications/notification_platform_bridge_delegator.cc
+@@ -57,7 +57,7 @@ bool SystemNotificationsEnabled(Profile* profile) {
+ #elif BUILDFLAG(IS_WIN)
+ return NotificationPlatformBridgeWin::SystemNotificationEnabled();
+ #else
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (profile) {
+ // Prefs take precedence over flags.
+ PrefService* prefs = profile->GetPrefs();
diff --git a/devel/electron28/files/patch-chrome_browser_password__manager_password__reuse__manager__factory.cc b/devel/electron28/files/patch-chrome_browser_password__manager_password__reuse__manager__factory.cc
new file mode 100644
index 000000000000..88427093f05e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_password__manager_password__reuse__manager__factory.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/password_manager/password_reuse_manager_factory.cc.orig 2023-10-19 19:58:05 UTC
++++ chrome/browser/password_manager/password_reuse_manager_factory.cc
+@@ -115,7 +115,7 @@ PasswordReuseManagerFactory::BuildServiceInstanceForBr
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<password_manager::PasswordStoreSigninNotifier> notifier =
+ std::make_unique<password_manager::PasswordStoreSigninNotifierImpl>(
+ IdentityManagerFactory::GetForProfile(profile));
diff --git a/devel/electron28/files/patch-chrome_browser_performance__manager_metrics_cpu__probe_cpu__probe.cc b/devel/electron28/files/patch-chrome_browser_performance__manager_metrics_cpu__probe_cpu__probe.cc
new file mode 100644
index 000000000000..288e5214b5d8
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_performance__manager_metrics_cpu__probe_cpu__probe.cc
@@ -0,0 +1,12 @@
+--- chrome/browser/performance_manager/metrics/cpu_probe/cpu_probe.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/performance_manager/metrics/cpu_probe/cpu_probe.cc
+@@ -30,6 +30,9 @@ std::unique_ptr<CpuProbe> CpuProbe::Create() {
+ return CpuProbeWin::Create();
+ #elif BUILDFLAG(IS_MAC)
+ return CpuProbeMac::Create();
++#elif BUILDFLAG(IS_BSD)
++ NOTIMPLEMENTED();
++ return nullptr;
+ #else
+ return nullptr;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-chrome_browser_platform__util__linux.cc b/devel/electron28/files/patch-chrome_browser_platform__util__linux.cc
new file mode 100644
index 000000000000..85de0672eeb3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_platform__util__linux.cc
@@ -0,0 +1,12 @@
+--- chrome/browser/platform_util_linux.cc.orig 2023-10-19 19:58:05 UTC
++++ chrome/browser/platform_util_linux.cc
+@@ -299,7 +299,9 @@ void RunCommand(const std::string& command,
+
+ base::LaunchOptions options;
+ options.current_directory = working_directory;
++#if !BUILDFLAG(IS_BSD)
+ options.allow_new_privs = true;
++#endif
+ // xdg-open can fall back on mailcap which eventually might plumb through
+ // to a command that needs a terminal. Set the environment variable telling
+ // it that we definitely don't have a terminal available and that it should
diff --git a/devel/electron28/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc b/devel/electron28/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc
new file mode 100644
index 000000000000..c423fdd7f157
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/policy/browser_signin_policy_handler.cc.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/policy/browser_signin_policy_handler.cc
+@@ -45,7 +45,7 @@ void BrowserSigninPolicyHandler::ApplyPolicySettings(c
+ policies.GetValue(policy_name(), base::Value::Type::INTEGER);
+ switch (static_cast<BrowserSigninMode>(value->GetInt())) {
+ case BrowserSigninMode::kForced:
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ prefs->SetValue(prefs::kForceBrowserSignin, base::Value(true));
+ #endif
+ [[fallthrough]];
diff --git a/devel/electron28/files/patch-chrome_browser_policy_chrome__browser__cloud__management__controller__desktop.cc b/devel/electron28/files/patch-chrome_browser_policy_chrome__browser__cloud__management__controller__desktop.cc
new file mode 100644
index 000000000000..020a2be09743
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_policy_chrome__browser__cloud__management__controller__desktop.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.cc
+@@ -49,7 +49,7 @@
+ #include "chrome/browser/policy/browser_dm_token_storage_mac.h"
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/policy/browser_dm_token_storage_linux.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -58,7 +58,7 @@
+ #include "chrome/install_static/install_util.h"
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher.h"
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+@@ -90,7 +90,7 @@ void ChromeBrowserCloudManagementControllerDesktop::
+
+ #if BUILDFLAG(IS_MAC)
+ storage_delegate = std::make_unique<BrowserDMTokenStorageMac>();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ storage_delegate = std::make_unique<BrowserDMTokenStorageLinux>();
+ #elif BUILDFLAG(IS_WIN)
+ storage_delegate = std::make_unique<BrowserDMTokenStorageWin>();
+@@ -245,7 +245,7 @@ ChromeBrowserCloudManagementControllerDesktop::CreateD
+
+ std::unique_ptr<enterprise_connectors::DeviceTrustKeyManager>
+ ChromeBrowserCloudManagementControllerDesktop::CreateDeviceTrustKeyManager() {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ auto* browser_dm_token_storage = BrowserDMTokenStorage::Get();
+ auto* device_management_service = GetDeviceManagementService();
+ auto shared_url_loader_factory = GetSharedURLLoaderFactory();
diff --git a/devel/electron28/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc b/devel/electron28/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc
new file mode 100644
index 000000000000..17a49db83903
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc
@@ -0,0 +1,221 @@
+--- chrome/browser/policy/configuration_policy_handler_list_factory.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/policy/configuration_policy_handler_list_factory.cc
+@@ -218,19 +218,20 @@
+ #include "components/spellcheck/browser/pref_names.h"
+ #endif // BUILDFLAG(ENABLE_SPELLCHECK)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/idle/action.h"
+ #include "chrome/browser/enterprise/signin/enterprise_signin_prefs.h"
+ #include "components/device_signals/core/browser/pref_names.h" // nogncheck due to crbug.com/1125897
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "components/enterprise/idle/idle_timeout_policy_handler.h"
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) || \
++ BUILDFLAG(IS_BSD)
+ #include "chrome/browser/privacy_sandbox/privacy_sandbox_policy_handler.h"
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) ||
+@@ -827,7 +828,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ prefs::kManagedDefaultGeolocationSetting,
+ base::Value::Type::INTEGER },
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) \
+- || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_MAC)
++ || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ { key::kRequireOnlineRevocationChecksForLocalAnchors,
+ prefs::kCertRevocationCheckingRequiredLocalAnchors,
+ base::Value::Type::BOOLEAN },
+@@ -837,7 +838,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ #endif // #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+ // || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_MAC)
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) \
+- || BUILDFLAG(IS_FUCHSIA)
++ || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ { key::kFullscreenAllowed,
+ prefs::kFullscreenAllowed,
+ base::Value::Type::BOOLEAN },
+@@ -1569,7 +1570,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::LIST },
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kGSSAPILibraryName,
+ prefs::kGSSAPILibraryName,
+ base::Value::Type::STRING },
+@@ -1614,7 +1615,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::BOOLEAN },
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kNetworkServiceSandboxEnabled,
+ prefs::kNetworkServiceSandboxEnabled,
+ base::Value::Type::BOOLEAN },
+@@ -1640,12 +1641,12 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ prefs::kTotalMemoryLimitMb,
+ base::Value::Type::INTEGER },
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kBackgroundModeEnabled,
+ prefs::kBackgroundModeEnabled,
+ base::Value::Type::BOOLEAN },
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kUnmanagedDeviceSignalsConsentFlowEnabled,
+ device_signals::prefs::kUnmanagedDeviceSignalsConsentFlowEnabled,
+ base::Value::Type::BOOLEAN },
+@@ -1654,7 +1655,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::LIST },
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) \
+- || BUILDFLAG(IS_FUCHSIA)
++ || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ { key::kDefaultBrowserSettingEnabled,
+ prefs::kDefaultBrowserSettingEnabled,
+ base::Value::Type::BOOLEAN },
+@@ -1667,7 +1668,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+ // || BUILDFLAG(IS_FUCHSIA)
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) \
+- || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ { key::kAutoplayAllowed,
+ prefs::kAutoplayAllowed,
+ base::Value::Type::BOOLEAN },
+@@ -1768,7 +1769,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::BOOLEAN },
+ #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ { key::kAlternativeBrowserPath,
+ browser_switcher::prefs::kAlternativeBrowserPath,
+ base::Value::Type::STRING },
+@@ -1870,7 +1871,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::BOOLEAN },
+ #endif // BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1454054): replace the
+ // kGetDisplayMediaSetSelectAllScreensAllowedForUrls policy by a policy that
+ // matches the name of the new `getAllScreensMedia` API.
+@@ -1879,7 +1880,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ base::Value::Type::LIST },
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ { key::kAuthNegotiateDelegateByKdcPolicy,
+ prefs::kAuthNegotiateDelegateByKdcPolicy,
+ base::Value::Type::BOOLEAN },
+@@ -1910,7 +1911,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ #endif // BUILDFLAG(CHROME_ROOT_STORE_POLICY_SUPPORTED)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ { key::kEnforceLocalAnchorConstraintsEnabled,
+ prefs::kEnforceLocalAnchorConstraintsEnabled,
+ base::Value::Type::BOOLEAN },
+@@ -1986,7 +1987,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ ash::prefs::kUrlParameterToAutofillSAMLUsername,
+ base::Value::Type::STRING },
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ { key::kBatterySaverModeAvailability,
+ performance_manager::user_tuning::prefs::kBatterySaverModeState,
+ base::Value::Type::INTEGER },
+@@ -2017,7 +2018,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ prefs::kCloudApAuthEnabled,
+ base::Value::Type::INTEGER },
+ #endif // BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kOutOfProcessSystemDnsResolutionEnabled,
+ prefs::kOutOfProcessSystemDnsResolutionEnabled,
+ base::Value::Type::BOOLEAN },
+@@ -2057,7 +2058,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ prefs::kManagedPrivateNetworkAccessRestrictionsEnabled,
+ base::Value::Type::BOOLEAN },
+ #if BUILDFLAG(ENABLE_EXTENSIONS)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ { key::kExtensionInstallTypeBlocklist,
+ extensions::pref_names::kExtensionInstallTypeBlocklist,
+ base::Value::Type::LIST},
+@@ -2154,7 +2155,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ // Policies for all platforms - End
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ handlers->AddHandler(
+ std::make_unique<performance_manager::HighEfficiencyPolicyHandler>());
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+@@ -2350,7 +2351,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ #endif // BUILDFLAG(IS_ANDROID)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ handlers->AddHandler(
+ std::make_unique<enterprise_idle::IdleTimeoutPolicyHandler>());
+ handlers->AddHandler(
+@@ -2408,7 +2409,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ key::kBrowsingDataLifetime, browsing_data::prefs::kBrowsingDataLifetime,
+ chrome_schema));
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ handlers->AddHandler(std::make_unique<LocalSyncPolicyHandler>());
+ handlers->AddHandler(std::make_unique<ThemeColorPolicyHandler>());
+ handlers->AddHandler(
+@@ -2472,7 +2473,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ std::vector<std::unique_ptr<ConfigurationPolicyHandler>>
+ signin_legacy_policies;
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ signin_legacy_policies.push_back(std::make_unique<SimplePolicyHandler>(
+ key::kForceBrowserSignin, prefs::kForceBrowserSignin,
+ base::Value::Type::BOOLEAN));
+@@ -2834,7 +2835,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ #endif
+
+ #if BUILDFLAG(ENABLE_SPELLCHECK)
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ handlers->AddHandler(std::make_unique<SpellcheckLanguagePolicyHandler>());
+ handlers->AddHandler(
+ std::make_unique<SpellcheckLanguageBlocklistPolicyHandler>(
+@@ -2842,7 +2843,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+ #endif // BUILDFLAG(ENABLE_SPELLCHECK)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ handlers->AddHandler(std::make_unique<SimplePolicyHandler>(
+ key::kAllowSystemNotifications, prefs::kAllowSystemNotifications,
+ base::Value::Type::BOOLEAN));
+@@ -2859,7 +2860,7 @@ std::unique_ptr<ConfigurationPolicyHandlerList> BuildH
+ /*new_policy_handler=*/std::make_unique<
+ first_party_sets::FirstPartySetsOverridesPolicyHandler>(
+ policy::key::kRelatedWebsiteSetsOverrides, chrome_schema)));
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID)
+ handlers->AddHandler(std::make_unique<PrivacySandboxPolicyHandler>());
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
diff --git a/devel/electron28/files/patch-chrome_browser_policy_device__management__service__configuration.cc b/devel/electron28/files/patch-chrome_browser_policy_device__management__service__configuration.cc
new file mode 100644
index 000000000000..67f9ade69538
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_policy_device__management__service__configuration.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/policy/device_management_service_configuration.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/policy/device_management_service_configuration.cc
+@@ -22,7 +22,7 @@
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
+- !BUILDFLAG(IS_ANDROID))
++ !BUILDFLAG(IS_ANDROID)) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/common.h"
+ #include "chrome/browser/enterprise/connectors/connectors_service.h"
+ #endif
+@@ -100,7 +100,7 @@ DeviceManagementServiceConfiguration::GetReportingConn
+ content::BrowserContext* context) const {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
+- !BUILDFLAG(IS_ANDROID))
++ !BUILDFLAG(IS_ANDROID)) || BUILDFLAG(IS_BSD)
+ auto* service =
+ enterprise_connectors::ConnectorsServiceFactory::GetForBrowserContext(
+ context);
diff --git a/devel/electron28/files/patch-chrome_browser_policy_policy__value__and__status__aggregator.cc b/devel/electron28/files/patch-chrome_browser_policy_policy__value__and__status__aggregator.cc
new file mode 100644
index 000000000000..d54f5647304b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_policy_policy__value__and__status__aggregator.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/policy/policy_value_and_status_aggregator.cc.orig 2023-10-19 19:58:05 UTC
++++ chrome/browser/policy/policy_value_and_status_aggregator.cc
+@@ -53,7 +53,7 @@
+ #include "chrome/browser/policy/value_provider/extension_policies_value_provider.h"
+ #endif // BUILDFLAG(ENABLE_EXTENSIONS)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/policy/core/common/cloud/profile_cloud_policy_manager.h"
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+@@ -99,7 +99,7 @@ std::unique_ptr<policy::PolicyStatusProvider> GetUserP
+ #else // BUILDFLAG(IS_CHROMEOS_ASH)
+ policy::CloudPolicyManager* cloud_policy_manager =
+ profile->GetUserCloudPolicyManager();
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!cloud_policy_manager) {
+ cloud_policy_manager = profile->GetProfileCloudPolicyManager();
+ }
diff --git a/devel/electron28/files/patch-chrome_browser_prefs_browser__prefs.cc b/devel/electron28/files/patch-chrome_browser_prefs_browser__prefs.cc
new file mode 100644
index 000000000000..97802e4ce740
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_prefs_browser__prefs.cc
@@ -0,0 +1,75 @@
+--- chrome/browser/prefs/browser_prefs.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/prefs/browser_prefs.cc
+@@ -485,18 +485,18 @@
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "components/device_signals/core/browser/pref_names.h" // nogncheck due to crbug.com/1125897
+ #endif
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ #include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/signin/enterprise_signin_prefs.h"
+ #endif
+
+@@ -528,7 +528,7 @@
+ #include "chrome/browser/sessions/session_service_log.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/color/system_theme.h"
+ #endif
+
+@@ -652,7 +652,7 @@ const char kPluginsShowDetails[] = "plugins.show_detai
+ const char kPluginsShowDetails[] = "plugins.show_details";
+
+ // Deprecated 02/2023.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kWebAppsUrlHandlerInfo[] = "web_apps.url_handler_info";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+@@ -982,7 +982,7 @@ void RegisterLocalStatePrefsForMigration(PrefRegistryS
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ // Deprecated 02/2023.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ registry->RegisterDictionaryPref(kWebAppsUrlHandlerInfo);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+@@ -1959,12 +1959,12 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySync
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ device_signals::RegisterProfilePrefs(registry);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ browser_switcher::BrowserSwitcherPrefs::RegisterProfilePrefs(registry);
+ enterprise_signin::RegisterProfilePrefs(registry);
+ #endif
+@@ -2121,7 +2121,7 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ // Added 02/2023
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ local_state->ClearPref(kWebAppsUrlHandlerInfo);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-chrome_browser_prefs_pref__service__incognito__allowlist.cc b/devel/electron28/files/patch-chrome_browser_prefs_pref__service__incognito__allowlist.cc
new file mode 100644
index 000000000000..91f187be0e73
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_prefs_pref__service__incognito__allowlist.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/prefs/pref_service_incognito_allowlist.cc.orig 2023-08-10 01:48:35 UTC
++++ chrome/browser/prefs/pref_service_incognito_allowlist.cc
+@@ -168,7 +168,7 @@ const char* const kPersistentPrefNames[] = {
+ prefs::kShowFullscreenToolbar,
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Toggleing custom frames affects all open windows in the profile, hence
+ // should be written to the regular profile when changed in incognito mode.
+ prefs::kUseCustomChromeFrame,
diff --git a/devel/electron28/files/patch-chrome_browser_printing_print__backend__service__manager.cc b/devel/electron28/files/patch-chrome_browser_printing_print__backend__service__manager.cc
new file mode 100644
index 000000000000..46b6924f5e1c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_printing_print__backend__service__manager.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/printing/print_backend_service_manager.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/printing/print_backend_service_manager.cc
+@@ -33,7 +33,7 @@
+ #include "printing/buildflags/buildflags.h"
+ #include "printing/printing_features.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "content/public/common/content_switches.h"
+ #endif
+
+@@ -849,7 +849,7 @@ PrintBackendServiceManager::GetServiceFromBundle(
+ host.BindNewPipeAndPassReceiver(),
+ content::ServiceProcessHost::Options()
+ .WithDisplayName(IDS_UTILITY_PROCESS_PRINT_BACKEND_SERVICE_NAME)
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ .WithExtraCommandLineSwitches({switches::kMessageLoopTypeUi})
+ #endif
+ .Pass());
+@@ -1022,7 +1022,7 @@ PrintBackendServiceManager::DetermineIdleTimeoutUpdate
+ return kNoClientsRegisteredResetOnIdleTimeout;
+
+ case ClientType::kQueryWithUi:
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // No need to update if there were other query with UI clients.
+ if (HasQueryWithUiClientForRemoteId(remote_id)) {
+ return absl::nullopt;
diff --git a/devel/electron28/files/patch-chrome_browser_printing_printer__query.cc b/devel/electron28/files/patch-chrome_browser_printing_printer__query.cc
new file mode 100644
index 000000000000..3e0443cbfaf6
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_printing_printer__query.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/printing/printer_query.cc.orig 2023-06-07 04:52:04 UTC
++++ chrome/browser/printing/printer_query.cc
+@@ -341,7 +341,7 @@ void PrinterQuery::UpdatePrintSettings(base::Value::Di
+ crash_key = std::make_unique<crash_keys::ScopedPrinterInfo>(
+ print_backend->GetPrinterDriverInfo(printer_name));
+
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
++#if (BUILDFLAG(IS_BSD) || BUILDFLAG(IS_LINUX)) && BUILDFLAG(USE_CUPS)
+ PrinterBasicInfo basic_info;
+ if (print_backend->GetPrinterBasicInfo(printer_name, &basic_info) ==
+ mojom::ResultCode::kSuccess) {
diff --git a/devel/electron28/files/patch-chrome_browser_process__singleton__posix.cc b/devel/electron28/files/patch-chrome_browser_process__singleton__posix.cc
new file mode 100644
index 000000000000..4d4721bd5193
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_process__singleton__posix.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/process_singleton_posix.cc.orig 2023-08-20 00:00:06 UTC
++++ chrome/browser/process_singleton_posix.cc
+@@ -362,7 +362,7 @@ bool DisplayProfileInUseError(const base::FilePath& lo
+ if (g_disable_prompt)
+ return g_user_opted_unlock_in_use_profile;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::u16string relaunch_button_text =
+ l10n_util::GetStringUTF16(IDS_PROFILE_IN_USE_LINUX_RELAUNCH);
+ return ShowProcessSingletonDialog(error, relaunch_button_text);
diff --git a/devel/electron28/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc b/devel/electron28/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
new file mode 100644
index 000000000000..10ad84e81b91
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
@@ -0,0 +1,96 @@
+--- chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+@@ -401,18 +401,18 @@
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service_factory.h"
+ #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service_factory.h"
+ #include "chrome/browser/enterprise/signals/user_permission_service_factory.h"
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/idle/idle_service_factory.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/browser_switcher/browser_switcher_service_factory.h"
+ #include "chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_factory.h"
+ #include "chrome/browser/enterprise/signals/signals_aggregator_factory.h"
+@@ -621,7 +621,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ if (breadcrumbs::IsEnabled()) {
+ BreadcrumbManagerKeyedServiceFactory::GetInstance();
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ browser_switcher::BrowserSwitcherServiceFactory::GetInstance();
+ #endif
+ browser_sync::UserEventServiceFactory::GetInstance();
+@@ -727,29 +727,29 @@ void ChromeBrowserMainExtraPartsProfiles::
+ enterprise_commands::UserRemoteCommandsServiceFactory::GetInstance();
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ enterprise_connectors::DeviceTrustConnectorServiceFactory::GetInstance();
+ enterprise_connectors::DeviceTrustServiceFactory::GetInstance();
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ enterprise_connectors::LocalBinaryUploadServiceFactory::GetInstance();
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ enterprise_idle::IdleServiceFactory::GetInstance();
+ #endif
+ #if !BUILDFLAG(IS_CHROMEOS_ASH)
+ enterprise_reporting::CloudProfileReportingServiceFactory::GetInstance();
+ #endif
+ enterprise_reporting::LegacyTechServiceFactory::GetInstance();
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ enterprise_signals::SignalsAggregatorFactory::GetInstance();
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ enterprise_signals::UserPermissionServiceFactory::GetInstance();
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ enterprise_signin::EnterpriseSigninServiceFactory::GetInstance();
+ #endif
+ #if BUILDFLAG(ENABLE_SESSION_SERVICE)
+@@ -865,7 +865,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ #endif
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ metrics::DesktopProfileSessionDurationsServiceFactory::GetInstance();
+ #endif
+@@ -963,7 +963,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ #if BUILDFLAG(IS_CHROMEOS)
+ policy::PolicyCertServiceFactory::GetInstance();
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ policy::ProfileTokenPolicyWebSigninServiceFactory::GetInstance();
+ #endif
+ policy::UserCloudPolicyInvalidatorFactory::GetInstance();
+@@ -1007,7 +1007,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ #if !BUILDFLAG(IS_ANDROID)
+ ProfileThemeUpdateServiceFactory::GetInstance();
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ProfileTokenWebSigninInterceptorFactory::GetInstance();
+ #endif
+ #if !BUILDFLAG(IS_ANDROID)
diff --git a/devel/electron28/files/patch-chrome_browser_profiles_profile__impl.cc b/devel/electron28/files/patch-chrome_browser_profiles_profile__impl.cc
new file mode 100644
index 000000000000..90ce353e85f5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_profiles_profile__impl.cc
@@ -0,0 +1,40 @@
+--- chrome/browser/profiles/profile_impl.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/profiles/profile_impl.cc
+@@ -260,6 +260,10 @@
+ #include "chrome/browser/spellchecker/spellcheck_service.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#endif
++
+ using bookmarks::BookmarkModel;
+ using content::BrowserThread;
+ using content::DownloadManagerDelegate;
+@@ -605,7 +609,7 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async
+ #else
+ {
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ ProfileAttributesEntry* entry =
+ profile_manager->GetProfileAttributesStorage()
+@@ -884,7 +888,17 @@ base::FilePath ProfileImpl::last_selected_directory()
+ }
+
+ base::FilePath ProfileImpl::last_selected_directory() {
++#if BUILDFLAG(IS_OPENBSD)
++ // If unveil(2) is used, force the file dialog directory to something we
++ // know is available.
++ auto* sandbox = sandbox::policy::SandboxLinux::GetInstance();
++ if (sandbox->unveil_initialized())
++ return GetPrefs()->GetFilePath(prefs::kDownloadDefaultDirectory);
++ else
++ return GetPrefs()->GetFilePath(prefs::kSelectFileLastDirectory);
++#else
+ return GetPrefs()->GetFilePath(prefs::kSelectFileLastDirectory);
++#endif
+ }
+
+ void ProfileImpl::set_last_selected_directory(const base::FilePath& path) {
diff --git a/devel/electron28/files/patch-chrome_browser_profiles_profiles__state.cc b/devel/electron28/files/patch-chrome_browser_profiles_profiles__state.cc
new file mode 100644
index 000000000000..5ab185615ce0
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_profiles_profiles__state.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/profiles/profiles_state.cc.orig 2023-05-25 00:41:43 UTC
++++ chrome/browser/profiles/profiles_state.cc
+@@ -182,7 +182,7 @@ bool IsGuestModeRequested(const base::CommandLine& com
+ PrefService* local_state,
+ bool show_warning) {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ DCHECK(local_state);
+
+ // Check if guest mode enforcement commandline switch or policy are provided.
diff --git a/devel/electron28/files/patch-chrome_browser_renderer__preferences__util.cc b/devel/electron28/files/patch-chrome_browser_renderer__preferences__util.cc
new file mode 100644
index 000000000000..d67a03044703
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_renderer__preferences__util.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/renderer_preferences_util.cc.orig 2023-11-29 21:39:49 UTC
++++ chrome/browser/renderer_preferences_util.cc
+@@ -38,7 +38,7 @@
+ #include "ui/views/controls/textfield/textfield.h"
+ #endif
+
+-#if defined(USE_AURA) && BUILDFLAG(IS_LINUX)
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD))
+ #include "chrome/browser/themes/theme_service.h"
+ #include "chrome/browser/themes/theme_service_factory.h"
+ #include "ui/linux/linux_ui.h"
+@@ -152,7 +152,7 @@ void UpdateFromSystemSettings(blink::RendererPreferenc
+ prefs->caret_blink_interval = views::Textfield::GetCaretBlinkInterval();
+ #endif
+
+-#if defined(USE_AURA) && BUILDFLAG(IS_LINUX)
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD))
+ auto* linux_ui_theme = ui::LinuxUiTheme::GetForProfile(profile);
+ if (linux_ui_theme) {
+ if (ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) {
+@@ -175,7 +175,7 @@ void UpdateFromSystemSettings(blink::RendererPreferenc
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ content::UpdateFontRendererPreferencesFromSystemSettings(prefs);
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_resources_sandbox__internals_sandbox__internals.ts b/devel/electron28/files/patch-chrome_browser_resources_sandbox__internals_sandbox__internals.ts
new file mode 100644
index 000000000000..5b36ac3f8636
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_sandbox__internals_sandbox__internals.ts
@@ -0,0 +1,29 @@
+--- chrome/browser/resources/sandbox_internals/sandbox_internals.ts.orig 2023-02-01 18:43:12 UTC
++++ chrome/browser/resources/sandbox_internals/sandbox_internals.ts
+@@ -2,7 +2,7 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
+-// <if expr="is_linux or is_chromeos">
++// <if expr="is_posix or is_chromeos">
+ import './strings.m.js';
+
+ import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+@@ -121,7 +121,7 @@ function androidHandler() {
+ }
+ // </if>
+
+-// <if expr="is_linux or is_chromeos">
++// <if expr="is_posix or is_chromeos">
+
+ /**
+ * Adds a status row that reports either Yes or No.
+@@ -182,7 +182,7 @@ document.addEventListener('DOMContentLoaded', () => {
+ // <if expr="is_android">
+ androidHandler();
+ // </if>
+- // <if expr="is_linux or is_chromeos">
++ // <if expr="is_posix or is_chromeos">
+ linuxHandler();
+ // </if>
+ });
diff --git a/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.ts b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.ts
new file mode 100644
index 000000000000..721a49b00c3e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.ts
@@ -0,0 +1,20 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.ts.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.ts
+@@ -18,7 +18,7 @@ export interface AppearanceBrowserProxy {
+
+ useDefaultTheme(): void;
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ useGtkTheme(): void;
+ useQtTheme(): void;
+ // </if>
+@@ -48,7 +48,7 @@ export class AppearanceBrowserProxyImpl implements App
+ chrome.send('useDefaultTheme');
+ }
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ useGtkTheme() {
+ chrome.send('useGtkTheme');
+ }
diff --git a/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html
new file mode 100644
index 000000000000..b1a4b560020f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html
@@ -0,0 +1,29 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_page.html.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.html
+@@ -27,7 +27,7 @@
+ <cr-link-row class="first" hidden="[[!pageVisibility.setTheme]]"
+ label="$i18n{themes}" sub-label="[[themeSublabel_]]"
+ on-click="openThemeUrl_" external></cr-link-row>
+-<if expr="not is_linux">
++<if expr="not is_posix">
+ <template is="dom-if" if="[[prefs.extensions.theme.id.value]]">
+ <div class="separator"></div>
+ <cr-button id="useDefault" on-click="onUseDefaultClick_">
+@@ -35,7 +35,7 @@
+ </cr-button>
+ </template>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <div class="settings-row continuation"
+ hidden="[[!showThemesSecondary_(
+ prefs.extensions.theme.id.value, systemTheme_)]]"
+@@ -172,7 +172,7 @@
+ </div>
+ </template>
+
+-<if expr="is_linux">
++<if expr="is_posix">
+ <div class="hr" hidden="[[!pageVisibility.bookmarksBar]]"></div>
+ <settings-toggle-button
+ hidden="[[!showCustomChromeFrame_]]"
diff --git a/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.ts b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.ts
new file mode 100644
index 000000000000..b18e9e71f0bf
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.ts
@@ -0,0 +1,65 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_page.ts.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.ts
+@@ -72,7 +72,7 @@ export interface SettingsAppearancePageElement {
+ export enum SystemTheme {
+ // Either classic or web theme.
+ DEFAULT = 0,
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ GTK = 1,
+ QT = 2,
+ // </if>
+@@ -193,7 +193,7 @@ export class SettingsAppearancePageElement extends
+ 'prefs.autogenerated.theme.policy.color.controlledBy)',
+ },
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ /**
+ * Whether to show the "Custom Chrome Frame" setting.
+ */
+@@ -229,7 +229,7 @@ export class SettingsAppearancePageElement extends
+ 'themeChanged_(' +
+ 'prefs.extensions.theme.id.value, systemTheme_, isForcedTheme_)',
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ 'systemThemePrefChanged_(prefs.extensions.theme.system_theme.value)',
+ // </if>
+ ];
+@@ -253,7 +253,7 @@ export class SettingsAppearancePageElement extends
+ private isForcedTheme_: boolean;
+ private showHoverCardImagesOption_: boolean;
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ private showCustomChromeFrame_: boolean;
+ // </if>
+
+@@ -354,7 +354,7 @@ export class SettingsAppearancePageElement extends
+ this.appearanceBrowserProxy_.useDefaultTheme();
+ }
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ private systemThemePrefChanged_(systemTheme: SystemTheme) {
+ this.systemTheme_ = systemTheme;
+ }
+@@ -427,7 +427,7 @@ export class SettingsAppearancePageElement extends
+ }
+
+ let i18nId;
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ switch (this.systemTheme_) {
+ case SystemTheme.GTK:
+ i18nId = 'gtkTheme';
+@@ -440,7 +440,7 @@ export class SettingsAppearancePageElement extends
+ break;
+ }
+ // </if>
+- // <if expr="not is_linux">
++ // <if expr="not is_posix">
+ i18nId = 'chooseFromWebStore';
+ // </if>
+ this.themeSublabel_ = this.i18n(i18nId);
diff --git a/devel/electron28/files/patch-chrome_browser_resources_settings_autofill__page_passwords__shared.css b/devel/electron28/files/patch-chrome_browser_resources_settings_autofill__page_passwords__shared.css
new file mode 100644
index 000000000000..8df7a08eb462
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_settings_autofill__page_passwords__shared.css
@@ -0,0 +1,11 @@
+--- chrome/browser/resources/settings/autofill_page/passwords_shared.css.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/resources/settings/autofill_page/passwords_shared.css
+@@ -100,7 +100,7 @@ cr-input.password-input::part(input),
+ * necessary to prevent Chrome from using the operating system's font
+ * instead of the Material Design font.
+ * TODO(dbeam): why not font: inherit? */
+-<if expr="is_linux or is_chromeos">
++<if expr="is_posix or is_chromeos">
+ font-family: 'DejaVu Sans Mono', monospace;
+ </if>
+ <if expr="is_win">
diff --git a/devel/electron28/files/patch-chrome_browser_resources_settings_route.ts b/devel/electron28/files/patch-chrome_browser_resources_settings_route.ts
new file mode 100644
index 000000000000..90fd968af2a7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_settings_route.ts
@@ -0,0 +1,11 @@
+--- chrome/browser/resources/settings/route.ts.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/resources/settings/route.ts
+@@ -242,7 +242,7 @@ function createBrowserSettingsRoutes(): SettingsRoutes
+ r.ACCESSIBILITY = r.ADVANCED.createSection(
+ '/accessibility', 'a11y', loadTimeData.getString('a11yPageTitle'));
+
+- // <if expr="is_linux">
++ // <if expr="is_posix">
+ r.CAPTIONS = r.ACCESSIBILITY.createChild('/captions');
+ // </if>
+
diff --git a/devel/electron28/files/patch-chrome_browser_resources_signin_signin__shared.css b/devel/electron28/files/patch-chrome_browser_resources_signin_signin__shared.css
new file mode 100644
index 000000000000..1531cc39292f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_signin_signin__shared.css
@@ -0,0 +1,11 @@
+--- chrome/browser/resources/signin/signin_shared.css.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/resources/signin/signin_shared.css
+@@ -54,7 +54,7 @@ a {
+ border-radius: var(--scrollbar-width);
+ }
+
+-<if expr="is_macosx or is_linux or is_chromeos">
++<if expr="is_macosx or is_posix or is_chromeos">
+ .action-container {
+ flex-flow: row-reverse;
+ justify-content: flex-start;
diff --git a/devel/electron28/files/patch-chrome_browser_resources_signin_sync__confirmation_sync__confirmation__app.html b/devel/electron28/files/patch-chrome_browser_resources_signin_sync__confirmation_sync__confirmation__app.html
new file mode 100644
index 000000000000..6b73d6f8b525
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_resources_signin_sync__confirmation_sync__confirmation__app.html
@@ -0,0 +1,20 @@
+--- chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html
+@@ -290,7 +290,7 @@
+ autofocus="[[isModalDialog_]]">
+ $i18n{syncConfirmationConfirmLabel}
+ </cr-button>
+- <if expr="is_macosx or is_linux or chromeos_ash or chromeos_lacros">
++ <if expr="is_macosx or is_posix or chromeos_ash or chromeos_lacros">
+ <cr-button id="settingsButton" on-click="onGoToSettings_"
+ disabled="[[anyButtonClicked_]]" consent-confirmation>
+ $i18n{syncConfirmationSettingsLabel}
+@@ -300,7 +300,7 @@
+ disabled="[[anyButtonClicked_]]">
+ $i18n{syncConfirmationUndoLabel}
+ </cr-button>
+- <if expr="not (is_macosx or is_linux or chromeos_ash or chromeos_lacros)">
++ <if expr="not (is_macosx or is_posix or chromeos_ash or chromeos_lacros)">
+ <cr-button id="settingsButton" on-click="onGoToSettings_"
+ disabled="[[anyButtonClicked_]]" consent-confirmation>
+ $i18n{syncConfirmationSettingsLabel}
diff --git a/devel/electron28/files/patch-chrome_browser_safe__browsing_cloud__content__scanning_binary__upload__service.cc b/devel/electron28/files/patch-chrome_browser_safe__browsing_cloud__content__scanning_binary__upload__service.cc
new file mode 100644
index 000000000000..b987a977d5fa
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_safe__browsing_cloud__content__scanning_binary__upload__service.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
+@@ -18,7 +18,7 @@
+ #include "net/base/url_util.h"
+ #include "third_party/abseil-cpp/absl/types/variant.h"
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_factory.h"
+ #endif
+
+@@ -421,7 +421,7 @@ BinaryUploadService* BinaryUploadService::GetForProfil
+ Profile* profile,
+ const enterprise_connectors::AnalysisSettings& settings) {
+ // Local content analysis is supported only on desktop platforms.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (settings.cloud_or_local_settings.is_cloud_analysis()) {
+ return CloudBinaryUploadServiceFactory::GetForProfile(profile);
+ } else {
diff --git a/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.cc b/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.cc
new file mode 100644
index 000000000000..d914a3f05a91
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/safe_browsing/download_protection/file_analyzer.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/safe_browsing/download_protection/file_analyzer.cc
+@@ -21,7 +21,7 @@
+ #include "content/public/browser/browser_thread.h"
+ #include "url/gurl.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/safe_browsing/download_protection/document_analysis_service.h"
+ #endif
+
+@@ -85,7 +85,7 @@ void FileAnalyzer::Start(const base::FilePath& target_
+ } else if (inspection_type == DownloadFileType::DMG) {
+ StartExtractDmgFeatures();
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ } else if (inspection_type == DownloadFileType::OFFICE_DOCUMENT) {
+ StartExtractDocumentFeatures();
+ #endif
+@@ -314,7 +314,7 @@ void FileAnalyzer::OnDmgAnalysisFinished(
+ }
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ void FileAnalyzer::StartExtractDocumentFeatures() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
diff --git a/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.h b/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.h
new file mode 100644
index 000000000000..e7fef7d0b6be
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_safe__browsing_download__protection_file__analyzer.h
@@ -0,0 +1,29 @@
+--- chrome/browser/safe_browsing/download_protection/file_analyzer.h.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/safe_browsing/download_protection/file_analyzer.h
+@@ -18,7 +18,7 @@
+ #include "components/safe_browsing/core/common/proto/csd.pb.h"
+ #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/services/file_util/public/cpp/sandboxed_document_analyzer.h"
+ #endif
+
+@@ -110,7 +110,7 @@ class FileAnalyzer {
+ const safe_browsing::ArchiveAnalyzerResults& archive_results);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ void StartExtractDocumentFeatures();
+ void OnDocumentAnalysisFinished(
+ const DocumentAnalyzerResults& document_results);
+@@ -141,7 +141,7 @@ class FileAnalyzer {
+ dmg_analyzer_{nullptr, base::OnTaskRunnerDeleter(nullptr)};
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<SandboxedDocumentAnalyzer, base::OnTaskRunnerDeleter>
+ document_analyzer_{nullptr, base::OnTaskRunnerDeleter(nullptr)};
+ base::TimeTicks document_analysis_start_time_;
diff --git a/devel/electron28/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc b/devel/electron28/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc
new file mode 100644
index 000000000000..1bce1d5e5d0e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+@@ -694,7 +694,7 @@ void IncidentReportingService::OnEnvironmentDataCollec
+
+ // Process::Current().CreationTime() is missing on some platforms.
+ #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::TimeDelta uptime =
+ first_incident_time_ - base::Process::Current().CreationTime();
+ environment_data->mutable_process()->set_uptime_msec(uptime.InMilliseconds());
diff --git a/devel/electron28/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc b/devel/electron28/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc
new file mode 100644
index 000000000000..aab704eb461e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/send_tab_to_self/receiving_ui_handler_registry.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/send_tab_to_self/receiving_ui_handler_registry.cc
+@@ -16,7 +16,7 @@
+ #include "components/send_tab_to_self/features.h"
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/send_tab_to_self/desktop_notification_handler.h"
+ #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_toolbar_icon_controller.h"
+ #endif
+@@ -48,7 +48,7 @@ SendTabToSelfToolbarIconController*
+ ReceivingUiHandlerRegistry::GetToolbarButtonControllerForProfile(
+ Profile* profile) {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ for (const std::unique_ptr<ReceivingUiHandler>& handler :
+ applicable_handlers_) {
+ auto* button_controller =
diff --git a/devel/electron28/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc b/devel/electron28/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc
new file mode 100644
index 000000000000..5e174e544e28
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/send_tab_to_self/send_tab_to_self_client_service.cc.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/send_tab_to_self/send_tab_to_self_client_service.cc
+@@ -17,7 +17,7 @@
+ #include "components/send_tab_to_self/send_tab_to_self_model.h"
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_toolbar_icon_controller.h"
+ #endif
+
+@@ -51,7 +51,7 @@ void SendTabToSelfClientService::EntriesAddedRemotely(
+ const std::vector<const SendTabToSelfEntry*>& new_entries) {
+ for (const std::unique_ptr<ReceivingUiHandler>& handler : GetHandlers()) {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Only respond to notifications corresponding to this service's profile
+ // for these OSes; mobile does not have a Profile.
+ // Cast note: on desktop, handlers are guaranteed to be the derived class
diff --git a/devel/electron28/files/patch-chrome_browser_sharing_sharing__device__registration.cc b/devel/electron28/files/patch-chrome_browser_sharing_sharing__device__registration.cc
new file mode 100644
index 000000000000..608073247f7b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sharing_sharing__device__registration.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/sharing/sharing_device_registration.cc.orig 2022-07-22 17:30:31 UTC
++++ chrome/browser/sharing/sharing_device_registration.cc
+@@ -326,7 +326,7 @@ bool SharingDeviceRegistration::IsSmsFetcherSupported(
+
+ bool SharingDeviceRegistration::IsRemoteCopySupported() const {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc b/devel/electron28/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc
new file mode 100644
index 000000000000..77f951f7c396
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/sharing/sharing_handler_registry_impl.cc.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/sharing/sharing_handler_registry_impl.cc
+@@ -23,7 +23,7 @@
+ #endif // BUILDFLAG(IS_ANDROID)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/sharing/shared_clipboard/remote_copy_message_handler.h"
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS_LACROS)) BUILDFLAG(IS_CHROMEOS)
+@@ -77,7 +77,7 @@ SharingHandlerRegistryImpl::SharingHandlerRegistryImpl
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (sharing_device_registration->IsRemoteCopySupported()) {
+ AddSharingHandler(
+ std::make_unique<RemoteCopyMessageHandler>(profile),
diff --git a/devel/electron28/files/patch-chrome_browser_signin_signin__util.cc b/devel/electron28/files/patch-chrome_browser_signin_signin__util.cc
new file mode 100644
index 000000000000..b5a04df69669
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_signin_signin__util.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/signin/signin_util.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/signin/signin_util.cc
+@@ -75,7 +75,7 @@ void CookiesMover::StartMovingCookies() {
+ CookiesMover::~CookiesMover() = default;
+
+ void CookiesMover::StartMovingCookies() {
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ bool allow_cookies_to_be_moved = base::FeatureList::IsEnabled(
+ profile_management::features::kThirdPartyProfileManagement);
+ #else
diff --git a/devel/electron28/files/patch-chrome_browser_supervised__user_supervised__user__navigation__observer.cc b/devel/electron28/files/patch-chrome_browser_supervised__user_supervised__user__navigation__observer.cc
new file mode 100644
index 000000000000..c538946f8eef
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_supervised__user_supervised__user__navigation__observer.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/supervised_user/supervised_user_navigation_observer.cc.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/supervised_user/supervised_user_navigation_observer.cc
+@@ -44,7 +44,7 @@
+ #include "chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.h"
+ #elif BUILDFLAG(IS_CHROMEOS)
+ #include "chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.h"
+-#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/supervised_user/linux_mac_windows/supervised_user_web_content_handler_impl.h"
+ #endif
+
+@@ -64,7 +64,7 @@ std::unique_ptr<supervised_user::WebContentHandler> Cr
+ #elif BUILDFLAG(IS_ANDROID)
+ return std::make_unique<SupervisedUserWebContentHandlerImpl>(
+ web_contents, frame_id, navigation_id);
+-#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return std::make_unique<SupervisedUserWebContentHandlerImpl>(
+ web_contents, frame_id, navigation_id);
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_sync_chrome__sync__client.cc b/devel/electron28/files/patch-chrome_browser_sync_chrome__sync__client.cc
new file mode 100644
index 000000000000..eda5a8629c92
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sync_chrome__sync__client.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/sync/chrome_sync_client.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/sync/chrome_sync_client.cc
+@@ -111,7 +111,7 @@
+ #endif // BUILDFLAG(ENABLE_SPELLCHECK)
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h"
+ #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_service_factory.h"
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
+@@ -441,7 +441,7 @@ ChromeSyncClient::CreateDataTypeControllers(syncer::Sy
+ #endif // !BUILDFLAG(IS_ANDROID)
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(features::kTabGroupsSave)) {
+ controllers.push_back(std::make_unique<syncer::ModelTypeController>(
+ syncer::SAVED_TAB_GROUP,
+@@ -454,7 +454,7 @@ ChromeSyncClient::CreateDataTypeControllers(syncer::Sy
+
+ // Chrome prefers OS provided spell checkers where they exist. So only sync the
+ // custom dictionary on platforms that typically don't provide one.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Dictionary sync is enabled by default.
+ if (GetPrefService()->GetBoolean(spellcheck::prefs::kSpellCheckEnable)) {
+ controllers.push_back(
+@@ -610,7 +610,7 @@ ChromeSyncClient::GetControllerDelegateForModelType(sy
+ ChromeSyncClient::GetControllerDelegateForModelType(syncer::ModelType type) {
+ switch (type) {
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ case syncer::SAVED_TAB_GROUP: {
+ DCHECK(base::FeatureList::IsEnabled(features::kTabGroupsSave));
+ return SavedTabGroupServiceFactory::GetForProfile(profile_)
diff --git a/devel/electron28/files/patch-chrome_browser_sync_device__info__sync__client__impl.cc b/devel/electron28/files/patch-chrome_browser_sync_device__info__sync__client__impl.cc
new file mode 100644
index 000000000000..d585344ac921
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sync_device__info__sync__client__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/sync/device_info_sync_client_impl.cc.orig 2023-03-30 00:33:44 UTC
++++ chrome/browser/sync/device_info_sync_client_impl.cc
+@@ -41,7 +41,7 @@ std::string DeviceInfoSyncClientImpl::GetSigninScopedD
+ // in lacros-chrome once build flag switch of lacros-chrome is
+ // complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ syncer::SyncPrefs prefs(profile_->GetPrefs());
+ if (prefs.IsLocalSyncEnabled()) {
+ return "local_device";
diff --git a/devel/electron28/files/patch-chrome_browser_sync_sync__service__factory.cc b/devel/electron28/files/patch-chrome_browser_sync_sync__service__factory.cc
new file mode 100644
index 000000000000..a5aa3b1e1503
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sync_sync__service__factory.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/sync/sync_service_factory.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/sync/sync_service_factory.cc
+@@ -84,7 +84,7 @@
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_service_factory.h"
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
+ // BUILDFLAG(IS_WIN)
+@@ -131,7 +131,7 @@ std::unique_ptr<KeyedService> BuildSyncService(
+ // TODO(crbug.com/1052397): Reassess whether the following block needs to be
+ // included in lacros-chrome once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ syncer::SyncPrefs prefs(profile->GetPrefs());
+ local_sync_backend_enabled = prefs.IsLocalSyncEnabled();
+@@ -258,7 +258,7 @@ SyncServiceFactory::SyncServiceFactory()
+ DependsOn(ProfilePasswordStoreFactory::GetInstance());
+ DependsOn(PowerBookmarkServiceFactory::GetInstance());
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ DependsOn(SavedTabGroupServiceFactory::GetInstance());
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
+ // BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-chrome_browser_sync_sync__service__util.cc b/devel/electron28/files/patch-chrome_browser_sync_sync__service__util.cc
new file mode 100644
index 000000000000..7d0650231587
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_sync_sync__service__util.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/sync/sync_service_util.cc.orig 2023-11-29 21:39:50 UTC
++++ chrome/browser/sync/sync_service_util.cc
+@@ -9,7 +9,7 @@
+ #include "components/sync/base/features.h"
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "components/variations/service/variations_service.h"
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
+ // BUILDFLAG(IS_WIN)
+@@ -22,7 +22,7 @@ bool IsDesktopEnUSLocaleOnlySyncPollFeatureEnabled() {
+ }
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ std::string country_code;
+ auto* variations_service = g_browser_process->variations_service();
+ if (variations_service) {
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.cc b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.cc
new file mode 100644
index 000000000000..66573c3610d6
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/task_manager/sampling/task_group.cc.orig 2023-02-01 18:43:12 UTC
++++ chrome/browser/task_manager/sampling/task_group.cc
+@@ -38,7 +38,7 @@ const int kBackgroundRefreshTypesMask =
+ #if BUILDFLAG(IS_WIN)
+ REFRESH_TYPE_START_TIME | REFRESH_TYPE_CPU_TIME |
+ #endif // BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ REFRESH_TYPE_FD_COUNT |
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ #if BUILDFLAG(ENABLE_NACL)
+@@ -123,7 +123,7 @@ TaskGroup::TaskGroup(
+ #if BUILDFLAG(ENABLE_NACL)
+ nacl_debug_stub_port_(nacl::kGdbDebugStubPortUnknown),
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ open_fd_count_(-1),
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ idle_wakeups_per_second_(-1),
+@@ -142,7 +142,7 @@ TaskGroup::TaskGroup(
+ weak_ptr_factory_.GetWeakPtr()),
+ base::BindRepeating(&TaskGroup::OnIdleWakeupsRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ base::BindRepeating(&TaskGroup::OnOpenFdCountRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+@@ -322,7 +322,7 @@ void TaskGroup::OnRefreshNaClDebugStubPortDone(int nac
+ }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ void TaskGroup::OnOpenFdCountRefreshDone(int open_fd_count) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.h b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.h
new file mode 100644
index 000000000000..297c83f35efc
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group.h
@@ -0,0 +1,38 @@
+--- chrome/browser/task_manager/sampling/task_group.h.orig 2023-05-25 00:41:44 UTC
++++ chrome/browser/task_manager/sampling/task_group.h
+@@ -44,7 +44,7 @@ constexpr int kUnsupportedVMRefreshFlags =
+ REFRESH_TYPE_WEBCACHE_STATS | REFRESH_TYPE_NETWORK_USAGE |
+ REFRESH_TYPE_NACL | REFRESH_TYPE_IDLE_WAKEUPS | REFRESH_TYPE_HANDLES |
+ REFRESH_TYPE_START_TIME | REFRESH_TYPE_CPU_TIME | REFRESH_TYPE_PRIORITY |
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ REFRESH_TYPE_FD_COUNT |
+ #endif
+ REFRESH_TYPE_HARD_FAULTS;
+@@ -150,7 +150,7 @@ class TaskGroup {
+ }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ int open_fd_count() const { return open_fd_count_; }
+ void set_open_fd_count(int open_fd_count) { open_fd_count_ = open_fd_count; }
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+@@ -170,7 +170,7 @@ class TaskGroup {
+ void RefreshNaClDebugStubPort(int child_process_unique_id);
+ void OnRefreshNaClDebugStubPortDone(int port);
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ void OnOpenFdCountRefreshDone(int open_fd_count);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+
+@@ -243,7 +243,7 @@ class TaskGroup {
+ #if BUILDFLAG(ENABLE_NACL)
+ int nacl_debug_stub_port_;
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // The number of file descriptors currently open by the process.
+ int open_fd_count_;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
new file mode 100644
index 000000000000..f1261c4fb26e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
@@ -0,0 +1,47 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.cc.orig 2023-03-30 00:33:44 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.cc
+@@ -45,7 +45,7 @@ TaskGroupSampler::TaskGroupSampler(
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_swapped_mem_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ const OnProcessPriorityCallback& on_process_priority)
+@@ -55,7 +55,7 @@ TaskGroupSampler::TaskGroupSampler(
+ on_cpu_refresh_callback_(on_cpu_refresh),
+ on_swapped_mem_refresh_callback_(on_swapped_mem_refresh),
+ on_idle_wakeups_callback_(on_idle_wakeups),
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ on_open_fd_count_callback_(on_open_fd_count),
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ on_process_priority_callback_(on_process_priority) {
+@@ -85,7 +85,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ base::BindOnce(on_swapped_mem_refresh_callback_));
+ }
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_IDLE_WAKEUPS,
+ refresh_flags)) {
+ blocking_pool_runner_->PostTaskAndReplyWithResult(
+@@ -95,7 +95,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ }
+ #endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_FD_COUNT,
+ refresh_flags)) {
+ blocking_pool_runner_->PostTaskAndReplyWithResult(
+@@ -144,7 +144,7 @@ int TaskGroupSampler::RefreshIdleWakeupsPerSecond() {
+ return process_metrics_->GetIdleWakeupsPerSecond();
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ int TaskGroupSampler::RefreshOpenFdCount() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(worker_pool_sequenced_checker_);
+
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
new file mode 100644
index 000000000000..d148301a5b99
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
@@ -0,0 +1,38 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.h.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.h
+@@ -31,7 +31,7 @@ class TaskGroupSampler : public base::RefCountedThread
+ using OnCpuRefreshCallback = base::RepeatingCallback<void(double)>;
+ using OnSwappedMemRefreshCallback = base::RepeatingCallback<void(int64_t)>;
+ using OnIdleWakeupsCallback = base::RepeatingCallback<void(int)>;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ using OnOpenFdCountCallback = base::RepeatingCallback<void(int)>;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ using OnProcessPriorityCallback =
+@@ -43,7 +43,7 @@ class TaskGroupSampler : public base::RefCountedThread
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_memory_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ const OnProcessPriorityCallback& on_process_priority);
+@@ -63,7 +63,7 @@ class TaskGroupSampler : public base::RefCountedThread
+ double RefreshCpuUsage();
+ int64_t RefreshSwappedMem();
+ int RefreshIdleWakeupsPerSecond();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ int RefreshOpenFdCount();
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ base::Process::Priority RefreshProcessPriority();
+@@ -87,7 +87,7 @@ class TaskGroupSampler : public base::RefCountedThread
+ const OnCpuRefreshCallback on_cpu_refresh_callback_;
+ const OnSwappedMemRefreshCallback on_swapped_mem_refresh_callback_;
+ const OnIdleWakeupsCallback on_idle_wakeups_callback_;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ const OnOpenFdCountCallback on_open_fd_count_callback_;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
+ const OnProcessPriorityCallback on_process_priority_callback_;
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
new file mode 100644
index 000000000000..c035082c0ced
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/task_manager/sampling/task_manager_impl.cc.orig 2023-05-25 00:41:44 UTC
++++ chrome/browser/task_manager/sampling/task_manager_impl.cc
+@@ -217,7 +217,7 @@ void TaskManagerImpl::GetUSERHandles(TaskId task_id,
+ }
+
+ int TaskManagerImpl::GetOpenFdCount(TaskId task_id) const {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return GetTaskGroupByTaskId(task_id)->open_fd_count();
+ #else
+ return -1;
diff --git a/devel/electron28/files/patch-chrome_browser_task__manager_task__manager__observer.h b/devel/electron28/files/patch-chrome_browser_task__manager_task__manager__observer.h
new file mode 100644
index 000000000000..a2f4e51049f7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_task__manager_task__manager__observer.h
@@ -0,0 +1,11 @@
+--- chrome/browser/task_manager/task_manager_observer.h.orig 2022-02-28 16:54:41 UTC
++++ chrome/browser/task_manager/task_manager_observer.h
+@@ -47,7 +47,7 @@ enum RefreshType {
+ // or backgrounded.
+ REFRESH_TYPE_PRIORITY = 1 << 13,
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // For observers interested in getting the number of open file descriptors of
+ // processes.
+ REFRESH_TYPE_FD_COUNT = 1 << 14,
diff --git a/devel/electron28/files/patch-chrome_browser_themes_theme__helper.cc b/devel/electron28/files/patch-chrome_browser_themes_theme__helper.cc
new file mode 100644
index 000000000000..032985e9aeae
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_themes_theme__helper.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/themes/theme_helper.cc.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/themes/theme_helper.cc
+@@ -18,7 +18,7 @@
+ #include "ui/gfx/image/image.h"
+ #include "ui/native_theme/native_theme.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_themes_theme__service.cc b/devel/electron28/files/patch-chrome_browser_themes_theme__service.cc
new file mode 100644
index 000000000000..68c42565c70b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_themes_theme__service.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/themes/theme_service.cc.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/themes/theme_service.cc
+@@ -74,7 +74,7 @@
+ #include "extensions/browser/extension_registry_observer.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif
+@@ -330,7 +330,7 @@ CustomThemeSupplier* ThemeService::GetThemeSupplier()
+ }
+
+ bool ThemeService::ShouldUseCustomFrame() const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!ui::OzonePlatform::GetInstance()
+ ->GetPlatformRuntimeProperties()
+ .supports_server_side_window_decorations) {
diff --git a/devel/electron28/files/patch-chrome_browser_themes_theme__service__aura__linux.cc b/devel/electron28/files/patch-chrome_browser_themes_theme__service__aura__linux.cc
new file mode 100644
index 000000000000..1e9040e78ce0
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_themes_theme__service__aura__linux.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/themes/theme_service_aura_linux.cc.orig 2022-11-30 08:12:58 UTC
++++ chrome/browser/themes/theme_service_aura_linux.cc
+@@ -24,7 +24,7 @@ namespace {
+ ui::SystemTheme ValidateSystemTheme(ui::SystemTheme system_theme) {
+ switch (system_theme) {
+ case ui::SystemTheme::kDefault:
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ case ui::SystemTheme::kGtk:
+ case ui::SystemTheme::kQt:
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_themes_theme__service__factory.cc b/devel/electron28/files/patch-chrome_browser_themes_theme__service__factory.cc
new file mode 100644
index 000000000000..df05b30b2005
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_themes_theme__service__factory.cc
@@ -0,0 +1,37 @@
+--- chrome/browser/themes/theme_service_factory.cc.orig 2023-10-19 19:58:06 UTC
++++ chrome/browser/themes/theme_service_factory.cc
+@@ -27,11 +27,11 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/themes/theme_service_aura_linux.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui_factory.h"
+ #endif
+
+@@ -103,7 +103,7 @@ ThemeServiceFactory::~ThemeServiceFactory() = default;
+
+ KeyedService* ThemeServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* profile) const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ using ThemeService = ThemeServiceAuraLinux;
+ #endif
+
+@@ -117,9 +117,9 @@ void ThemeServiceFactory::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ ui::SystemTheme default_system_theme = ui::SystemTheme::kDefault;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ default_system_theme = ui::GetDefaultSystemTheme();
+ #endif
+ registry->RegisterIntegerPref(prefs::kSystemTheme,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_actions_chrome__action__id.h b/devel/electron28/files/patch-chrome_browser_ui_actions_chrome__action__id.h
new file mode 100644
index 000000000000..3ece5d1b68da
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_actions_chrome__action__id.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/actions/chrome_action_id.h.orig 2023-11-29 21:39:51 UTC
++++ chrome/browser/ui/actions/chrome_action_id.h
+@@ -526,7 +526,7 @@
+ IDC_CONTENT_CONTEXT_QUICK_ANSWERS_INLINE_ANSWER) \
+ E(kActionContentContextQuickAnswersInlineQuery, \
+ IDC_CONTENT_CONTEXT_QUICK_ANSWERS_INLINE_QUERY)
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #define CHROME_PLATFORM_SPECIFIC_ACTION_IDS \
+ E(kUseSystemTitleBar, IDC_USE_SYSTEM_TITLE_BAR) \
+ E(kRestoreWindow, IDC_RESTORE_WINDOW)
diff --git a/devel/electron28/files/patch-chrome_browser_ui_browser.h b/devel/electron28/files/patch-chrome_browser_ui_browser.h
new file mode 100644
index 000000000000..c5797ef57dec
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_browser.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/browser.h.orig 2023-12-20 07:12:20 UTC
++++ chrome/browser/ui/browser.h
+@@ -293,7 +293,7 @@ class Browser : public TabStripModelObserver,
+ absl::optional<int64_t> display_id;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // When the browser window is shown, the desktop environment is notified
+ // using this ID. In response, the desktop will stop playing the "waiting
+ // for startup" animation (if any).
diff --git a/devel/electron28/files/patch-chrome_browser_ui_browser__command__controller.cc b/devel/electron28/files/patch-chrome_browser_ui_browser__command__controller.cc
new file mode 100644
index 000000000000..c822d00a36b8
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_browser__command__controller.cc
@@ -0,0 +1,53 @@
+--- chrome/browser/ui/browser_command_controller.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/browser_command_controller.cc
+@@ -121,7 +121,7 @@
+ #include "components/user_manager/user_manager.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/base/ime/text_input_flags.h"
+ #include "ui/linux/linux_ui.h"
+ #endif
+@@ -303,7 +303,7 @@ bool BrowserCommandController::IsReservedCommandOrKey(
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // If this key was registered by the user as a content editing hotkey, then
+ // it is not reserved.
+ auto* linux_ui = ui::LinuxUi::instance();
+@@ -555,7 +555,7 @@ bool BrowserCommandController::ExecuteCommandWithDispo
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ case IDC_MINIMIZE_WINDOW:
+ browser_->window()->Minimize();
+ break;
+@@ -567,7 +567,7 @@ bool BrowserCommandController::ExecuteCommandWithDispo
+ break;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ case IDC_USE_SYSTEM_TITLE_BAR: {
+ PrefService* prefs = profile()->GetPrefs();
+ prefs->SetBoolean(prefs::kUseCustomChromeFrame,
+@@ -1234,12 +1234,12 @@ void BrowserCommandController::InitCommandState() {
+ #endif
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_MAXIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_WINDOW, true);
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool use_system_title_bar = true;
+ #if BUILDFLAG(IS_OZONE)
+ use_system_title_bar = ui::OzonePlatform::GetInstance()
diff --git a/devel/electron28/files/patch-chrome_browser_ui_browser__view__prefs.cc b/devel/electron28/files/patch-chrome_browser_ui_browser__view__prefs.cc
new file mode 100644
index 000000000000..a46310ac1ca2
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_browser__view__prefs.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/browser_view_prefs.cc.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/ui/browser_view_prefs.cc
+@@ -15,7 +15,7 @@
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool GetCustomFramePrefDefault() {
+ #if BUILDFLAG(IS_OZONE)
+ return ui::OzonePlatform::GetInstance()
+@@ -31,7 +31,7 @@ bool GetCustomFramePrefDefault() {
+
+ void RegisterBrowserViewProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ registry->RegisterBooleanPref(prefs::kUseCustomChromeFrame,
+ GetCustomFramePrefDefault());
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.cc b/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.cc
new file mode 100644
index 000000000000..cb74d2f80fe5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/chrome_pages.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/chrome_pages.cc
+@@ -79,7 +79,7 @@
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/web_applications/web_app_utils.h"
+ #endif
+
+@@ -672,7 +672,7 @@ void ShowShortcutCustomizationApp(Profile* profile,
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ void ShowWebAppSettingsImpl(Browser* browser,
+ Profile* profile,
+ const std::string& app_id,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.h b/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.h
new file mode 100644
index 000000000000..7003b49eaeea
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_chrome__pages.h
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/chrome_pages.h.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/chrome_pages.h
+@@ -38,7 +38,7 @@ enum class ConsentLevel;
+ } // namespace signin
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ namespace web_app {
+ enum class AppSettingsPageEntryPoint;
+ } // namespace web_app
+@@ -255,7 +255,7 @@ void ShowShortcutCustomizationApp(Profile* profile,
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Show chrome://app-settings/<app-id> page.
+ void ShowWebAppSettings(Browser* browser,
+ const std::string& app_id,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_color_native__chrome__color__mixer.cc b/devel/electron28/files/patch-chrome_browser_ui_color_native__chrome__color__mixer.cc
new file mode 100644
index 000000000000..ec344b260e7c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_color_native__chrome__color__mixer.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/color/native_chrome_color_mixer.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/color/native_chrome_color_mixer.cc
+@@ -7,7 +7,7 @@
+ #include "build/build_config.h"
+
+ #if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_MAC) && \
+- !BUILDFLAG(IS_WIN)
++ !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_BSD)
+ void AddNativeChromeColorMixer(ui::ColorProvider* provider,
+ const ui::ColorProviderKey& key) {}
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc b/devel/electron28/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc
new file mode 100644
index 000000000000..13a3e0261eb1
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/exclusive_access/exclusive_access_bubble.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/exclusive_access/exclusive_access_bubble.cc
+@@ -19,7 +19,7 @@
+
+ // NOTE(koz): Linux doesn't use the thick shadowed border, so we add padding
+ // here.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const int ExclusiveAccessBubble::kPaddingPx = 8;
+ #else
+ const int ExclusiveAccessBubble::kPaddingPx = 15;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_omnibox_chrome__omnibox__client.cc b/devel/electron28/files/patch-chrome_browser_ui_omnibox_chrome__omnibox__client.cc
new file mode 100644
index 000000000000..084f9070886a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_omnibox_chrome__omnibox__client.cc
@@ -0,0 +1,21 @@
+--- chrome/browser/ui/omnibox/chrome_omnibox_client.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/omnibox/chrome_omnibox_client.cc
+@@ -474,10 +474,18 @@ void ChromeOmniboxClient::OnAutocompleteAccept(
+ alternative_nav_match);
+
+ // Store the details necessary to open the omnibox match via browser commands.
++#if defined(__clang__) && (__clang_major__ >= 16)
+ location_bar_->set_navigation_params(LocationBar::NavigationParams(
+ destination_url, disposition, transition, match_selection_timestamp,
+ destination_url_entered_without_scheme,
+ destination_url_entered_with_http_scheme));
++#else
++ LocationBar::NavigationParams np = {
++ destination_url, disposition, transition, match_selection_timestamp,
++ destination_url_entered_without_scheme,
++ destination_url_entered_with_http_scheme };
++ location_bar_->set_navigation_params(np);
++#endif
+
+ if (browser_) {
+ auto navigation = chrome::OpenCurrentURL(browser_);
diff --git a/devel/electron28/files/patch-chrome_browser_ui_omnibox_omnibox__pedal__implementations.cc b/devel/electron28/files/patch-chrome_browser_ui_omnibox_omnibox__pedal__implementations.cc
new file mode 100644
index 000000000000..6d2b0ddf78b5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_omnibox_omnibox__pedal__implementations.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc
+@@ -1995,7 +1995,7 @@ const gfx::VectorIcon& GetSharingHubVectorIcon() {
+ OmniboxFieldTrial::IsChromeRefreshActionChipIconsEnabled()
+ ? omnibox::kShareWinChromeRefreshIcon
+ : omnibox::kShareWinIcon;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return OmniboxFieldTrial::IsChromeRefreshIconsEnabled() ||
+ OmniboxFieldTrial::IsChromeRefreshActionChipIconsEnabled()
+ ? omnibox::kShareLinuxChromeRefreshIcon
diff --git a/devel/electron28/files/patch-chrome_browser_ui_sad__tab.cc b/devel/electron28/files/patch-chrome_browser_ui_sad__tab.cc
new file mode 100644
index 000000000000..6a631ca76209
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_sad__tab.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/sad_tab.cc.orig 2023-02-01 18:43:13 UTC
++++ chrome/browser/ui/sad_tab.cc
+@@ -176,7 +176,7 @@ std::vector<int> SadTab::GetSubMessages() {
+ // Only show Incognito suggestion if not already in Incognito mode.
+ if (!web_contents_->GetBrowserContext()->IsOffTheRecord())
+ message_ids.insert(message_ids.begin(), IDS_SAD_TAB_RELOAD_INCOGNITO);
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Note: on macOS, Linux and ChromeOS, the first bullet is either one of
+ // IDS_SAD_TAB_RELOAD_CLOSE_TABS or IDS_SAD_TAB_RELOAD_CLOSE_NOTABS
+ // followed by one of the above suggestions.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_sharing__hub_sharing__hub__bubble__controller.h b/devel/electron28/files/patch-chrome_browser_ui_sharing__hub_sharing__hub__bubble__controller.h
new file mode 100644
index 000000000000..8b790cb8a2f4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_sharing__hub_sharing__hub__bubble__controller.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h.orig 2023-03-30 00:33:44 UTC
++++ chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h
+@@ -37,7 +37,7 @@ class SharingHubBubbleController {
+ virtual bool ShouldOfferOmniboxIcon() = 0;
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // This method returns the set of first-party actions, which are actions
+ // internal to Chrome. Third-party actions (those outside Chrome) are
+ // currently not supported.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller.cc b/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller.cc
new file mode 100644
index 000000000000..34b1aebd380e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/signin/signin_view_controller.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/signin/signin_view_controller.cc
+@@ -253,7 +253,7 @@ void SigninViewController::ShowModalEnterpriseConfirma
+ bool show_link_data_option,
+ signin::SigninChoiceCallback callback) {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ CloseModalSignin();
+ dialog_ = std::make_unique<SigninModalDialogImpl>(
+ SigninViewControllerDelegate::CreateEnterpriseConfirmationDelegate(
diff --git a/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller__delegate.h b/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller__delegate.h
new file mode 100644
index 000000000000..39813bf629c9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_signin_signin__view__controller__delegate.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/signin/signin_view_controller_delegate.h.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/signin/signin_view_controller_delegate.h
+@@ -81,7 +81,7 @@ class SigninViewControllerDelegate {
+ #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Returns a platform-specific SigninViewContolllerDelegate instance that
+ // displays the enterprise confirmation modal dialog. The returned object
+ // should delete itself when the window it's managing is closed.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc b/devel/electron28/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
new file mode 100644
index 000000000000..e8d1cdaea74f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/startup/bad_flags_prompt.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/startup/bad_flags_prompt.cc
+@@ -104,7 +104,7 @@ const char* const kBadFlags[] = {
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Speech dispatcher is buggy, it can crash and it can make Chrome freeze.
+ // http://crbug.com/327295
+ switches::kEnableSpeechDispatcher,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc b/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
new file mode 100644
index 000000000000..5cc31bed6ddc
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/startup/startup_browser_creator.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/startup/startup_browser_creator.cc
+@@ -133,7 +133,7 @@
+ #include "chrome/credential_provider/common/gcp_strings.h"
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/headless/headless_mode_util.h"
+ #include "chrome/browser/ui/startup/web_app_info_recorder_utils.h"
+ #include "components/headless/policy/headless_mode_policy.h"
+@@ -925,7 +925,7 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
+ TRACE_EVENT0("startup", "StartupBrowserCreator::ProcessCmdLineImpl");
+ ComputeAndRecordLaunchMode(command_line);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (headless::IsHeadlessMode() &&
+ headless::HeadlessModePolicy::IsHeadlessModeDisabled(
+ g_browser_process->local_state())) {
+@@ -1029,7 +1029,7 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
+ silent_launch = true;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Writes open and installed web apps to the specified file without
+ // launching a new browser window or tab.
+ if (base::FeatureList::IsEnabled(features::kListWebAppsSwitch) &&
+@@ -1242,7 +1242,7 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
+ CHECK_EQ(profile_info.mode, StartupProfileMode::kBrowserWindow)
+ << "Failed launch with app: couldn't pick a profile";
+ std::string app_id = command_line.GetSwitchValueASCII(switches::kAppId);
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // If Chrome Apps are deprecated and |app_id| is a Chrome App, display the
+ // deprecation UI instead of launching the app.
+ if (apps::OpenDeprecatedApplicationPrompt(privacy_safe_profile, app_id))
diff --git a/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator__impl.cc b/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator__impl.cc
new file mode 100644
index 000000000000..a8ff05235989
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_startup_startup__browser__creator__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/startup/startup_browser_creator_impl.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/startup/startup_browser_creator_impl.cc
+@@ -255,7 +255,7 @@ Browser* StartupBrowserCreatorImpl::OpenTabsInBrowser(
+ // at the state of the MessageLoop.
+ Browser::CreateParams params = Browser::CreateParams(profile_, false);
+ params.creation_source = Browser::CreationSource::kStartupCreator;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ params.startup_id =
+ command_line_->GetSwitchValueASCII("desktop-startup-id");
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_tab__helpers.cc b/devel/electron28/files/patch-chrome_browser_ui_tab__helpers.cc
new file mode 100644
index 000000000000..c78c6ebda51b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_tab__helpers.cc
@@ -0,0 +1,26 @@
+--- chrome/browser/ui/tab_helpers.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/tab_helpers.cc
+@@ -225,7 +225,7 @@
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/blocked_content/framebust_block_tab_helper.h"
+ #include "chrome/browser/ui/browser_finder.h"
+ #include "chrome/browser/ui/hats/hats_helper.h"
+@@ -658,12 +658,12 @@ void TabHelpers::AttachTabHelpers(WebContents* web_con
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ metrics::DesktopSessionDurationObserver::CreateForWebContents(web_contents);
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(
+ features::kHappinessTrackingSurveysForDesktopDemo) ||
+ base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurvey) ||
diff --git a/devel/electron28/files/patch-chrome_browser_ui_tabs_organization_trigger__observer.h b/devel/electron28/files/patch-chrome_browser_ui_tabs_organization_trigger__observer.h
new file mode 100644
index 000000000000..d5a060e5fce6
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_tabs_organization_trigger__observer.h
@@ -0,0 +1,10 @@
+--- chrome/browser/ui/tabs/organization/trigger_observer.h.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/tabs/organization/trigger_observer.h
+@@ -6,6 +6,7 @@
+ #define CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_OBSERVER_H_
+
+ #include <memory>
++#include <unordered_map>
+
+ #include "base/functional/callback.h"
+ #include "chrome/browser/ui/browser_list_observer.h"
diff --git a/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc b/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
new file mode 100644
index 000000000000..410884208108
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/task_manager/task_manager_columns.cc.orig 2022-04-21 18:48:31 UTC
++++ chrome/browser/ui/task_manager/task_manager_columns.cc
+@@ -93,7 +93,7 @@ const TableColumnData kColumns[] = {
+ std::size("100000") * kCharWidth, -1, true, false, false},
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ {IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN, ui::TableColumn::RIGHT, -1, 0,
+ std::size("999") * kCharWidth, -1, true, false, false},
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc b/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
new file mode 100644
index 000000000000..cd5505de6bab
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/task_manager/task_manager_table_model.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/task_manager/task_manager_table_model.cc
+@@ -454,7 +454,7 @@ std::u16string TaskManagerTableModel::GetText(size_t r
+ ? stringifier_->backgrounded_string()
+ : stringifier_->foregrounded_string();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN: {
+ const int fd_count = observed_task_manager()->GetOpenFdCount(tasks_[row]);
+ return fd_count >= 0 ? base::FormatNumber(fd_count)
+@@ -621,7 +621,7 @@ int TaskManagerTableModel::CompareValues(size_t row1,
+ return BooleanCompare(is_proc1_bg, is_proc2_bg);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN: {
+ const int proc1_fd_count =
+ observed_task_manager()->GetOpenFdCount(tasks_[row1]);
+@@ -799,7 +799,7 @@ void TaskManagerTableModel::UpdateRefreshTypes(int col
+ type = REFRESH_TYPE_KEEPALIVE_COUNT;
+ break;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN:
+ type = REFRESH_TYPE_FD_COUNT;
+ break;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_test_popup__browsertest.cc b/devel/electron28/files/patch-chrome_browser_ui_test_popup__browsertest.cc
new file mode 100644
index 000000000000..843ed0eb1959
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_test_popup__browsertest.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/test/popup_browsertest.cc.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/ui/test/popup_browsertest.cc
+@@ -74,7 +74,7 @@ IN_PROC_BROWSER_TEST_F(PopupTest, OpenLeftAndTopZeroCo
+ const display::Display display = GetDisplayNearestBrowser(popup);
+ gfx::Rect expected(popup->window()->GetBounds().size());
+ expected.AdjustToFit(display.work_area());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1286870) Desktop Linux window bounds are inaccurate.
+ expected.Outset(50);
+ EXPECT_TRUE(expected.Contains(popup->window()->GetBounds()))
+@@ -106,7 +106,7 @@ IN_PROC_BROWSER_TEST_F(PopupTest, OpenClampedToCurrent
+ // The popup should be constrained to the opener's available display space.
+ EXPECT_EQ(display, GetDisplayNearestBrowser(popup));
+ gfx::Rect work_area(display.work_area());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1286870) Desktop Linux bounds flakily extend outside the
+ // work area on trybots, when opening with excessive width and height, e.g.:
+ // width=${screen.availWidth+300},height=${screen.availHeight+300} yields:
diff --git a/devel/electron28/files/patch-chrome_browser_ui_test_test__browser__ui.cc b/devel/electron28/files/patch-chrome_browser_ui_test_test__browser__ui.cc
new file mode 100644
index 000000000000..41503b53488c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_test_test__browser__ui.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/test/test_browser_ui.cc.orig 2023-08-10 01:48:36 UTC
++++ chrome/browser/ui/test/test_browser_ui.cc
+@@ -22,7 +22,7 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ #include "content/public/common/content_switches.h"
+ #include "ui/base/test/skia_gold_matching_algorithm.h"
+@@ -35,7 +35,7 @@
+ // TODO(https://crbug.com/958242) support Mac for pixel tests.
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ #define SUPPORTS_PIXEL_TEST
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_ui__features.cc b/devel/electron28/files/patch-chrome_browser_ui_ui__features.cc
new file mode 100644
index 000000000000..b3b09b313965
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_ui__features.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/ui_features.cc.orig 2023-12-13 00:26:35 UTC
++++ chrome/browser/ui/ui_features.cc
+@@ -315,7 +315,7 @@ BASE_FEATURE(kTopChromeWebUIUsesSpareRenderer,
+ "TopChromeWebUIUsesSpareRenderer",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Enables alternate update-related text to be displayed in browser app menu
+ // button, menu item and confirmation dialog.
+ BASE_FEATURE(kUpdateTextOptions,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_ui__features.h b/devel/electron28/files/patch-chrome_browser_ui_ui__features.h
new file mode 100644
index 000000000000..35bc653b5959
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_ui__features.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/ui_features.h.orig 2023-12-13 00:26:35 UTC
++++ chrome/browser/ui/ui_features.h
+@@ -195,7 +195,7 @@ BASE_DECLARE_FEATURE(kTopChromeWebUIUsesSpareRenderer)
+
+ BASE_DECLARE_FEATURE(kTopChromeWebUIUsesSpareRenderer);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kUpdateTextOptions);
+ extern const base::FeatureParam<int> kUpdateTextOptionNumber;
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_accelerator__table.cc b/devel/electron28/files/patch-chrome_browser_ui_views_accelerator__table.cc
new file mode 100644
index 000000000000..18f25af0364a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_accelerator__table.cc
@@ -0,0 +1,43 @@
+--- chrome/browser/ui/views/accelerator_table.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/accelerator_table.cc
+@@ -72,11 +72,11 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_S, ui::EF_PLATFORM_ACCELERATOR, IDC_SAVE_PAGE},
+ {ui::VKEY_9, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NUMPAD9, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_LAST_TAB},
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {ui::VKEY_9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NUMPAD9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ #endif // BUILDFLAG(IS_LINUX)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ {ui::VKEY_NEXT, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, IDC_MOVE_TAB_NEXT},
+ {ui::VKEY_PRIOR, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
+ IDC_MOVE_TAB_PREVIOUS},
+@@ -104,7 +104,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_NUMPAD7, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_6},
+ {ui::VKEY_8, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_7},
+ {ui::VKEY_NUMPAD8, ui::EF_PLATFORM_ACCELERATOR, IDC_SELECT_TAB_7},
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {ui::VKEY_1, ui::EF_ALT_DOWN, IDC_SELECT_TAB_0},
+ {ui::VKEY_NUMPAD1, ui::EF_ALT_DOWN, IDC_SELECT_TAB_0},
+ {ui::VKEY_2, ui::EF_ALT_DOWN, IDC_SELECT_TAB_1},
+@@ -154,7 +154,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ IDC_SHOW_AVATAR_MENU},
+
+ // Platform-specific key maps.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ {ui::VKEY_BROWSER_BACK, ui::EF_NONE, IDC_BACK},
+ {ui::VKEY_BROWSER_FORWARD, ui::EF_NONE, IDC_FORWARD},
+ {ui::VKEY_BROWSER_HOME, ui::EF_NONE, IDC_HOME},
+@@ -249,7 +249,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ #endif // !BUILDFLAG(IS_CHROMEOS)
+ #endif // !BUILDFLAG(IS_MAC)
+ #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ {ui::VKEY_S, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
+ IDC_CONTENT_CONTEXT_RUN_LAYOUT_EXTRACTION},
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_apps_chrome__native__app__window__views__aura.cc b/devel/electron28/files/patch-chrome_browser_ui_views_apps_chrome__native__app__window__views__aura.cc
new file mode 100644
index 000000000000..4e0a6bba92a4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_apps_chrome__native__app__window__views__aura.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc.orig 2022-07-22 17:30:31 UTC
++++ chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
+@@ -19,7 +19,7 @@
+ #include "ui/gfx/image/image_skia.h"
+ #include "ui/views/widget/widget.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/shell_integration_linux.h"
+ #endif
+
+@@ -55,7 +55,7 @@ void ChromeNativeAppWindowViewsAura::OnBeforeWidgetIni
+ const AppWindow::CreateParams& create_params,
+ views::Widget::InitParams* init_params,
+ views::Widget* widget) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string app_name =
+ web_app::GenerateApplicationNameFromAppId(app_window()->extension_id());
+ // Set up a custom WM_CLASS for app windows. This allows task switchers in
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
new file mode 100644
index 000000000000..5108d0db643f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc
+@@ -39,7 +39,7 @@
+ #include "ui/wm/core/wm_state.h"
+ #endif // defined(USE_AURA)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -132,7 +132,7 @@ void ChromeBrowserMainExtraPartsViews::PreProfileInit(
+ return controller;
+ }));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On the Linux desktop, we want to prevent the user from logging in as root,
+ // so that we don't destroy the profile. Now that we have some minimal ui
+ // initialized, check to see if we're running as root and bail if we are.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate.h b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
new file mode 100644
index 000000000000..a9bec03c6f1e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
@@ -0,0 +1,16 @@
+--- chrome/browser/ui/views/chrome_views_delegate.h.orig 2023-02-01 18:43:13 UTC
++++ chrome/browser/ui/views/chrome_views_delegate.h
+@@ -54,11 +54,11 @@ class ChromeViewsDelegate : public views::ViewsDelegat
+ base::OnceClosure callback) override;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ bool WindowManagerProvidesTitleBar(bool maximized) override;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate__linux.cc b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate__linux.cc
new file mode 100644
index 000000000000..3fd43d757d06
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_chrome__views__delegate__linux.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/chrome_views_delegate_linux.cc.orig 2022-08-31 12:19:35 UTC
++++ chrome/browser/ui/views/chrome_views_delegate_linux.cc
+@@ -23,7 +23,7 @@ bool IsDesktopEnvironmentUnity() {
+ return desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ int GetWindowIconResourceId() {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ switch (chrome::GetChannel()) {
+@@ -67,7 +67,7 @@ views::NativeWidget* ChromeViewsDelegate::CreateNative
+ delegate);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::ImageSkia* ChromeViewsDelegate::GetDefaultWindowIcon() const {
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+ return rb.GetImageSkiaNamed(GetWindowIconResourceId());
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_dark__mode__manager__linux.h b/devel/electron28/files/patch-chrome_browser_ui_views_dark__mode__manager__linux.h
new file mode 100644
index 000000000000..3bef63d6fdcd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_dark__mode__manager__linux.h
@@ -0,0 +1,10 @@
+--- chrome/browser/ui/views/dark_mode_manager_linux.h.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/views/dark_mode_manager_linux.h
+@@ -6,6 +6,7 @@
+ #define CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_
+
+ #include <string>
++#include <vector>
+
+ #include "base/gtest_prod_util.h"
+ #include "base/memory/scoped_refptr.h"
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
new file mode 100644
index 000000000000..b20ad1eeffa5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
@@ -0,0 +1,56 @@
+--- chrome/browser/ui/views/frame/browser_frame.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/views/frame/browser_frame.cc
+@@ -54,7 +54,7 @@
+ #include "components/user_manager/user_manager.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/display/screen.h"
+ #include "ui/linux/linux_ui.h"
+ #endif
+@@ -89,7 +89,7 @@ class ThemeChangedObserver : public views::WidgetObser
+ };
+
+ bool IsUsingLinuxSystemTheme(Profile* profile) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme();
+ #else
+ return false;
+@@ -180,7 +180,7 @@ void BrowserFrame::InitBrowserFrame() {
+
+ Init(std::move(params));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Because getting `linux_ui_theme` requires `native_widget_` to be
+ // initialized, this needs to happen after Init().
+ if (!IsIncognitoBrowser() &&
+@@ -370,7 +370,7 @@ void BrowserFrame::OnNativeWidgetWorkspaceChanged() {
+ chrome::SaveWindowWorkspace(browser_view_->browser(), GetWorkspace());
+ chrome::SaveWindowVisibleOnAllWorkspaces(browser_view_->browser(),
+ IsVisibleOnAllWorkspaces());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // If the window was sent to a different workspace, prioritize it if
+ // it was sent to the current workspace and deprioritize it
+ // otherwise. This is done by MoveBrowsersInWorkspaceToFront()
+@@ -558,7 +558,7 @@ void BrowserFrame::OnMenuClosed() {
+ }
+
+ void BrowserFrame::SelectNativeTheme() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Use the regular NativeTheme instance if running incognito mode, regardless
+ // of system theme (gtk, qt etc).
+ ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi();
+@@ -599,7 +599,7 @@ void BrowserFrame::OnTouchUiChanged() {
+ bool BrowserFrame::RegenerateFrameOnThemeChange(
+ BrowserThemeChangeType theme_change_type) {
+ bool need_regenerate = false;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // System and user theme changes can both change frame buttons, so the frame
+ // always needs to be regenerated on Linux.
+ need_regenerate = true;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.h b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.h
new file mode 100644
index 000000000000..ba455f863cf3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__frame.h
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/frame/browser_frame.h.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/views/frame/browser_frame.h
+@@ -12,7 +12,7 @@
+ #include "ui/views/context_menu_controller.h"
+ #include "ui/views/widget/widget.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "ui/base/ui_base_types.h"
+ #endif
+
+@@ -68,7 +68,7 @@ class BrowserFrame : public views::Widget, public view
+
+ ~BrowserFrame() override;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Returns which edges of the frame are tiled.
+ const ui::WindowTiledEdges& tiled_edges() const { return tiled_edges_; }
+ void set_tiled_edges(ui::WindowTiledEdges tiled_edges) {
+@@ -230,7 +230,7 @@ class BrowserFrame : public views::Widget, public view
+ // contents for smoother dragging.
+ TabDragKind tab_drag_kind_ = TabDragKind::kNone;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ ui::WindowTiledEdges tiled_edges_;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
new file mode 100644
index 000000000000..be88a699b00f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc.orig 2023-05-25 00:41:45 UTC
++++ chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
+@@ -16,7 +16,7 @@
+ #include "chrome/browser/ui/views/frame/browser_frame_view_win.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux.h"
+ #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h"
+ #include "chrome/browser/ui/views/frame/browser_frame_view_linux_native.h"
+@@ -33,7 +33,7 @@ namespace {
+ std::unique_ptr<OpaqueBrowserFrameView> CreateOpaqueBrowserFrameView(
+ BrowserFrame* frame,
+ BrowserView* browser_view) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* profile = browser_view->browser()->profile();
+ auto* linux_ui_theme = ui::LinuxUiTheme::GetForProfile(profile);
+ auto* theme_service_factory = ThemeServiceFactory::GetForProfile(profile);
+@@ -81,7 +81,7 @@ std::unique_ptr<BrowserNonClientFrameView> CreateBrows
+ if (browser_view->browser()->is_type_picture_in_picture()) {
+ auto view =
+ std::make_unique<PictureInPictureBrowserFrameView>(frame, browser_view);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* profile = browser_view->browser()->profile();
+ auto* linux_ui_theme = ui::LinuxUiTheme::GetForProfile(profile);
+ auto* theme_service_factory = ThemeServiceFactory::GetForProfile(profile);
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__view.cc
new file mode 100644
index 000000000000..69bee8236d56
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_browser__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/browser_view.cc.orig 2024-01-03 23:42:23 UTC
++++ chrome/browser/ui/views/frame/browser_view.cc
+@@ -2168,7 +2168,7 @@ void BrowserView::TabDraggingStatusChanged(bool is_dra
+ // CrOS cleanup is done.
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ contents_web_view_->SetFastResize(is_dragging);
+ if (!is_dragging) {
+ // When tab dragging is ended, we need to make sure the web contents get
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
new file mode 100644
index 000000000000..db6be53484c5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+@@ -54,7 +54,7 @@
+ #include "ui/views/window/vector_icons/vector_icons.h"
+ #include "ui/views/window/window_shape.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/views/controls/menu/menu_runner.h"
+ #endif
+
+@@ -566,7 +566,7 @@ OpaqueBrowserFrameView::GetFrameButtonStyle() const {
+ OpaqueBrowserFrameView::GetFrameButtonStyle() const {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return FrameButtonStyle::kMdButton;
+ #else
+ return FrameButtonStyle::kImageButton;
+@@ -589,7 +589,7 @@ bool OpaqueBrowserFrameView::ShouldDrawRestoredFrameSh
+ return false;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ ui::WindowTiledEdges OpaqueBrowserFrameView::GetTiledEdges() const {
+ return frame()->tiled_edges();
+ }
+@@ -787,7 +787,7 @@ void OpaqueBrowserFrameView::WindowIconPressed() {
+ }
+
+ void OpaqueBrowserFrameView::WindowIconPressed() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Chrome OS doesn't show the window icon, and Windows handles this on its own
+ // due to the hit test being HTSYSMENU.
+ menu_runner_ = std::make_unique<views::MenuRunner>(
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.h b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.h
new file mode 100644
index 000000000000..1dfb9f48dcc5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.h
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view.h.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view.h
+@@ -115,7 +115,7 @@ class OpaqueBrowserFrameView : public BrowserNonClient
+ const gfx::Rect& bounding_rect) const override;
+ bool IsTranslucentWindowOpacitySupported() const override;
+ bool ShouldDrawRestoredFrameShadow() const override;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ ui::WindowTiledEdges GetTiledEdges() const override;
+ #endif
+ int WebAppButtonHeight() const override;
+@@ -232,7 +232,7 @@ class OpaqueBrowserFrameView : public BrowserNonClient
+ // Background painter for the window frame.
+ std::unique_ptr<views::FrameBackground> frame_background_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<views::MenuRunner> menu_runner_;
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout__delegate.h b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout__delegate.h
new file mode 100644
index 000000000000..87fd64835ef4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__layout__delegate.h
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h.orig 2023-03-30 00:33:44 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h
+@@ -10,7 +10,7 @@
+ #include "build/build_config.h"
+ #include "build/chromeos_buildflags.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "ui/base/ui_base_types.h"
+ #endif
+
+@@ -97,7 +97,7 @@ class OpaqueBrowserFrameViewLayoutDelegate {
+ // Returns true if a client-side shadow should be drawn for restored windows.
+ virtual bool ShouldDrawRestoredFrameShadow() const = 0;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Returns which edges of the window are snapped to the edges of the desktop
+ // (or "tiled").
+ virtual ui::WindowTiledEdges GetTiledEdges() const = 0;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.cc
new file mode 100644
index 000000000000..b380019766f9
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.cc
@@ -0,0 +1,92 @@
+--- chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
+@@ -55,7 +55,7 @@
+ #include "ui/aura/window.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/views/frame/browser_frame_view_paint_utils_linux.h"
+ #include "chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h"
+ #endif
+@@ -83,7 +83,7 @@ constexpr int kTopControlsHeight = 30;
+ // The height of the controls bar at the top of the window.
+ constexpr int kTopControlsHeight = 30;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Frame border when window shadow is not drawn.
+ constexpr int kFrameBorderThickness = 4;
+ #endif
+@@ -178,7 +178,7 @@ class WindowEventObserver : public ui::EventObserver {
+
+ gfx::Rect input_bounds = pip_browser_frame_view_->GetLocalBounds();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Calculate input bounds for Linux. This is needed because the input bounds
+ // is not necessary the same as the local bounds on Linux.
+ if (pip_browser_frame_view_->ShouldDrawFrameShadow()) {
+@@ -560,7 +560,7 @@ PictureInPictureBrowserFrameView::PictureInPictureBrow
+ AddChildView(std::move(auto_pip_setting_overlay));
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ frame_background_ = std::make_unique<views::FrameBackground>();
+ #endif
+
+@@ -736,7 +736,7 @@ void PictureInPictureBrowserFrameView::OnThemeChanged(
+ for (ContentSettingImageView* view : content_setting_views_)
+ view->SetIconColor(color_provider->GetColor(kColorPipWindowForeground));
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ // On Linux the top bar background will be drawn in OnPaint().
+ top_bar_container_view_->SetBackground(views::CreateSolidBackground(
+ color_provider->GetColor(kColorPipWindowTopBarBackground)));
+@@ -811,7 +811,7 @@ void PictureInPictureBrowserFrameView::RemovedFromWidg
+ BrowserNonClientFrameView::RemovedFromWidget();
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::Insets PictureInPictureBrowserFrameView::MirroredFrameBorderInsets()
+ const {
+ auto border = FrameBorderInsets();
+@@ -1058,7 +1058,7 @@ void PictureInPictureBrowserFrameView::OnPaint(gfx::Ca
+ // views::View implementations:
+
+ void PictureInPictureBrowserFrameView::OnPaint(gfx::Canvas* canvas) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Draw the PiP window frame borders and shadows, including the top bar
+ // background.
+ if (window_frame_provider_) {
+@@ -1182,7 +1182,7 @@ gfx::Insets PictureInPictureBrowserFrameView::FrameBor
+ }
+
+ gfx::Insets PictureInPictureBrowserFrameView::FrameBorderInsets() const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (window_frame_provider_) {
+ const auto insets = window_frame_provider_->GetFrameThicknessDip();
+ const auto tiled_edges = frame()->tiled_edges();
+@@ -1203,7 +1203,7 @@ gfx::Insets PictureInPictureBrowserFrameView::ResizeBo
+ }
+
+ gfx::Insets PictureInPictureBrowserFrameView::ResizeBorderInsets() const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return FrameBorderInsets();
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ return gfx::Insets(chromeos::kResizeInsideBoundsSize);
+@@ -1224,7 +1224,7 @@ gfx::Size PictureInPictureBrowserFrameView::GetNonClie
+ top_height + border_thickness.bottom());
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void PictureInPictureBrowserFrameView::SetWindowFrameProvider(
+ ui::WindowFrameProvider* window_frame_provider) {
+ DCHECK(window_frame_provider);
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.h b/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.h
new file mode 100644
index 000000000000..c9457eeb0423
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_picture__in__picture__browser__frame__view.h
@@ -0,0 +1,47 @@
+--- chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h
+@@ -24,7 +24,7 @@
+ #include "ui/views/controls/image_view.h"
+ #include "ui/views/widget/widget_observer.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/window_frame_provider.h"
+ #endif
+
+@@ -32,7 +32,7 @@
+ // window, so to prevent cutting off important dialogs we resize the
+ // picture-in-picture window to fit them. While ChromeOS also uses Aura, it does
+ // not have this issue so we do not resize on ChromeOS.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #define RESIZE_DOCUMENT_PICTURE_IN_PICTURE_TO_DIALOG 1
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+
+@@ -97,7 +97,7 @@ class PictureInPictureBrowserFrameView
+ void Layout() override;
+ void AddedToWidget() override;
+ void RemovedFromWidget() override;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::Insets MirroredFrameBorderInsets() const override;
+ gfx::Insets GetInputInsets() const override;
+ SkRRect GetRestoredClipRegion() const override;
+@@ -191,7 +191,7 @@ class PictureInPictureBrowserFrameView
+ // Returns true if there's an overlay view that's currently shown.
+ bool IsOverlayViewVisible() const;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Sets the window frame provider so that it will be used for drawing.
+ void SetWindowFrameProvider(ui::WindowFrameProvider* window_frame_provider);
+
+@@ -358,7 +358,7 @@ class PictureInPictureBrowserFrameView
+ // `top_bar_color_animation_`.
+ absl::optional<SkColor> current_foreground_color_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Used to draw window frame borders and shadow on Linux when GTK theme is
+ // enabled.
+ raw_ptr<ui::WindowFrameProvider> window_frame_provider_ = nullptr;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc
new file mode 100644
index 000000000000..690e3233c671
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/frame/system_menu_model_builder.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_builder.cc
+@@ -75,7 +75,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForBrowser
+ ui::SimpleMenuModel* model) {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+ model->AddItemWithStringId(IDC_MINIMIZE_WINDOW, IDS_MINIMIZE_WINDOW_MENU);
+ model->AddItemWithStringId(IDC_MAXIMIZE_WINDOW, IDS_MAXIMIZE_WINDOW_MENU);
+ model->AddItemWithStringId(IDC_RESTORE_WINDOW, IDS_RESTORE_WINDOW_MENU);
+@@ -91,7 +91,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForBrowser
+ }
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ bool supports_server_side_decorations = true;
+ #if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_CHROMEOS)
+@@ -147,7 +147,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForAppOrPo
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
+ }
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_CLOSE_WINDOW, IDS_CLOSE);
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc
new file mode 100644
index 000000000000..e483940cbf92
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/frame/system_menu_model_delegate.cc.orig 2023-08-10 01:48:37 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_delegate.cc
+@@ -21,7 +21,7 @@
+ #include "chromeos/ui/frame/desks/move_to_desks_menu_model.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/common/pref_names.h"
+ #include "components/prefs/pref_service.h"
+ #endif
+@@ -36,7 +36,7 @@ SystemMenuModelDelegate::SystemMenuModelDelegate(
+ SystemMenuModelDelegate::~SystemMenuModelDelegate() {}
+
+ bool SystemMenuModelDelegate::IsCommandIdChecked(int command_id) const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (command_id == IDC_USE_SYSTEM_TITLE_BAR) {
+ PrefService* prefs = browser_->profile()->GetPrefs();
+ return !prefs->GetBoolean(prefs::kUseCustomChromeFrame);
+@@ -58,7 +58,7 @@ bool SystemMenuModelDelegate::IsCommandIdEnabled(int c
+ bool SystemMenuModelDelegate::IsCommandIdVisible(int command_id) const {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ bool is_maximized = browser_->window()->IsMaximized();
+ switch (command_id) {
+ case IDC_MAXIMIZE_WINDOW:
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_frame_tab__strip__region__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_frame_tab__strip__region__view.cc
new file mode 100644
index 000000000000..511bbbb2ca8e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_frame_tab__strip__region__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/tab_strip_region_view.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/frame/tab_strip_region_view.cc
+@@ -195,7 +195,7 @@ TabStripRegionView::TabStripRegionView(std::unique_ptr
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag
+ // switch of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // The New Tab Button can be middle-clicked on Linux.
+ new_tab_button_->SetTriggerableEventFlags(
+ new_tab_button_->GetTriggerableEventFlags() |
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_hung__renderer__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_hung__renderer__view.cc
new file mode 100644
index 000000000000..8df600876ce8
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_hung__renderer__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/hung_renderer_view.cc.orig 2023-11-29 21:39:52 UTC
++++ chrome/browser/ui/views/hung_renderer_view.cc
+@@ -405,7 +405,7 @@ void HungRendererDialogView::ForceCrashHungRenderer()
+ content::RenderProcessHost* rph =
+ hung_pages_table_model_->GetRenderWidgetHost()->GetProcess();
+ if (rph) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // A generic |CrashDumpHungChildProcess()| is not implemented for Linux.
+ // Instead we send an explicit IPC to crash on the renderer's IO thread.
+ rph->ForceCrash();
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_profiles_dice__web__signin__interception__backdrop__layer.cc b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_dice__web__signin__interception__backdrop__layer.cc
new file mode 100644
index 000000000000..6a8208586e89
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_dice__web__signin__interception__backdrop__layer.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/profiles/dice_web_signin_interception_backdrop_layer.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/profiles/dice_web_signin_interception_backdrop_layer.cc
+@@ -89,7 +89,7 @@ void DiceWebSigninInterceptionBackdropLayer::DrawDarkB
+ // The dark layer should be drawn on top of this region, but it's not easily
+ // accessible in code, and requires specific implementations.
+ // After the 2023 refresh, this drag area no longer exists.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On linux, the drag area is accessible through the
+ // `MirroredFrameBorderInsets()` function, which crashes on non-Linux
+ // platforms.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_profiles_profile__menu__view__base.cc b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_profile__menu__view__base.cc
new file mode 100644
index 000000000000..7b914f8922eb
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_profile__menu__view__base.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/profiles/profile_menu_view_base.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+@@ -660,7 +660,7 @@ void ProfileMenuViewBase::SetProfileIdentityInfo(
+
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // crbug.com/1161166: Orca does not read the accessible window title of the
+ // bubble, so we duplicate it in the top-level menu item. To be revisited
+ // after considering other options, including fixes on the AT side.
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.cc b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.cc
new file mode 100644
index 000000000000..43fbf4852599
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.cc
@@ -0,0 +1,47 @@
+--- chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
+@@ -56,7 +56,7 @@ const int kModalDialogWidth = 448;
+
+ const int kModalDialogWidth = 448;
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ const int kEnterpriseConfirmationDialogWidth = 512;
+ const int kEnterpriseConfirmationDialogHeight = 576;
+ #endif
+@@ -182,7 +182,7 @@ SigninViewControllerDelegateViews::CreateProfileCustom
+ #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // static
+ std::unique_ptr<views::WebView>
+ SigninViewControllerDelegateViews::CreateEnterpriseConfirmationWebView(
+@@ -327,7 +327,7 @@ SigninViewControllerDelegateViews::SigninViewControlle
+ SetButtons(ui::DIALOG_BUTTON_NONE);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // On the local profile creation dialog, cancelling the dialog (for instance
+ // through the VKEY_ESCAPE accelerator) should delete the profile.
+ if (delete_profile_on_cancel) {
+@@ -417,7 +417,7 @@ void SigninViewControllerDelegateViews::DisplayModal()
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ void SigninViewControllerDelegateViews::DeleteProfileOnCancel() {
+ ProfileAttributesEntry* entry =
+ g_browser_process->profile_manager()
+@@ -490,7 +490,7 @@ SigninViewControllerDelegate::CreateProfileCustomizati
+ #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // static
+ SigninViewControllerDelegate*
+ SigninViewControllerDelegate::CreateEnterpriseConfirmationDelegate(
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.h b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.h
new file mode 100644
index 000000000000..f077bf5c55de
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_profiles_signin__view__controller__delegate__views.h
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
+@@ -73,7 +73,7 @@ class SigninViewControllerDelegateViews
+ #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ static std::unique_ptr<views::WebView> CreateEnterpriseConfirmationWebView(
+ Browser* browser,
+ const AccountInfo& account_info,
+@@ -137,7 +137,7 @@ class SigninViewControllerDelegateViews
+ InitializeSigninWebDialogUI initialize_signin_web_dialog_ui);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Deletes the ephemeral profile when cancelling the local profile creation
+ // dialog.
+ void DeleteProfileOnCancel();
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tab__search__bubble__host.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tab__search__bubble__host.cc
new file mode 100644
index 000000000000..5739793c8daf
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tab__search__bubble__host.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tab_search_bubble_host.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/tab_search_bubble_host.cc
+@@ -222,7 +222,7 @@ bool TabSearchBubbleHost::ShouldTabSearchRenderBeforeT
+ // Mac should have tabsearch on the right side. Windows >= Win10 has the
+ // Tab Search button as a FrameCaptionButton, but it still needs to be on the
+ // left if it exists.
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return features::IsChromeRefresh2023();
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab.cc
new file mode 100644
index 000000000000..4ff1481599de
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/tab.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/tabs/tab.cc
+@@ -611,7 +611,7 @@ void Tab::MaybeUpdateHoverStatus(const ui::MouseEvent&
+ if (mouse_hovered_ || !GetWidget()->IsMouseEventsEnabled())
+ return;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Move the hit test area for hovering up so that it is not overlapped by tab
+ // hover cards when they are shown.
+ // TODO(crbug.com/978134): Once Linux/CrOS widget transparency is solved,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
new file mode 100644
index 000000000000..1b11f8375c72
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
@@ -0,0 +1,56 @@
+--- chrome/browser/ui/views/tabs/tab_drag_controller.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/tabs/tab_drag_controller.cc
+@@ -89,7 +89,7 @@
+ #include "components/remote_cocoa/browser/window.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/aura/client/drag_drop_client.h"
+ #endif
+
+@@ -206,7 +206,7 @@ void UpdateSystemDnDDragImage(TabDragContext* attached
+
+ void UpdateSystemDnDDragImage(TabDragContext* attached_context,
+ const gfx::ImageSkia& image) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ aura::Window* root_window =
+ attached_context->GetWidget()->GetNativeWindow()->GetRootWindow();
+ if (aura::client::GetDragDropClient(root_window)) {
+@@ -386,7 +386,7 @@ void TabDragController::Init(TabDragContext* source_co
+ // synchronous on desktop Linux, so use that.
+ // - ChromeOS Ash
+ // Releasing capture on Ash cancels gestures so avoid it.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ can_release_capture_ = false;
+ #endif
+ start_point_in_screen_ = gfx::Point(source_view_offset, mouse_offset.y());
+@@ -1011,7 +1011,7 @@ TabDragController::DragBrowserToNewTabStrip(TabDragCon
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ // EndMoveLoop is going to snap the window back to its original location.
+ // Hide it so users don't see this. Hiding a window in Linux aura causes
+ // it to lose capture so skip it.
+@@ -2059,7 +2059,7 @@ void TabDragController::CompleteDrag() {
+ }
+
+ // If source window was maximized - maximize the new window as well.
+-#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_MAC)
++#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ // Keeping maximized state breaks snap to Grid on Windows when dragging
+ // tabs from maximized windows. TODO:(crbug.com/727051) Explore doing this
+ // for other desktop OS's. kMaximizedStateRetainedOnTabDrag in
+@@ -2483,7 +2483,7 @@ TabDragController::Liveness TabDragController::GetLoca
+ }
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Exclude windows which are pending deletion via Browser::TabStripEmpty().
+ // These windows can be returned in the Linux Aura port because the browser
+ // window which was used for dragging is not hidden once all of its tabs are
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__bubble__view.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__bubble__view.cc
new file mode 100644
index 000000000000..00691c729414
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__bubble__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
+@@ -376,7 +376,7 @@ TabHoverCardBubbleView::TabHoverCardBubbleView(Tab* ta
+ // not become active. Setting this to false creates the need to explicitly
+ // hide the hovercard on press, touch, and keyboard events.
+ SetCanActivate(false);
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ set_accept_events(false);
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__controller.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__controller.cc
new file mode 100644
index 000000000000..386c3b80ed08
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__hover__card__controller.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/tab_hover_card_controller.cc.orig 2023-08-10 01:48:37 UTC
++++ chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
+@@ -81,7 +81,7 @@ void FixWidgetStackOrder(views::Widget* widget, const
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Ensure the hover card Widget assumes the highest z-order to avoid occlusion
+ // by other secondary UI Widgets (such as the omnibox Widget, see
+ // crbug.com/1226536).
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__style__views.cc b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__style__views.cc
new file mode 100644
index 000000000000..92892b903a1c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_tabs_tab__style__views.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/tab_style_views.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/views/tabs/tab_style_views.cc
+@@ -490,7 +490,7 @@ float GM2TabStyleViews::GetCurrentActiveOpacity() cons
+ if (!IsHoverAnimationActive()) {
+ return base_opacity;
+ }
+- return std::lerp(base_opacity, GetHoverOpacity(), GetHoverAnimationValue());
++ return std::lerp(base_opacity, GetHoverOpacity(), static_cast<float>(GetHoverAnimationValue()));
+ }
+
+ TabActive GM2TabStyleViews::GetApparentActiveState() const {
diff --git a/devel/electron28/files/patch-chrome_browser_ui_views_web__apps_web__app__integration__test__driver.cc b/devel/electron28/files/patch-chrome_browser_ui_views_web__apps_web__app__integration__test__driver.cc
new file mode 100644
index 000000000000..f6cc27f70a1c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_views_web__apps_web__app__integration__test__driver.cc
@@ -0,0 +1,83 @@
+--- chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+@@ -463,7 +463,7 @@ std::string GetFileExtension(FileExtension file_extens
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD) || BUILDFLAG(IS_BSD)
+ SiteConfig GetSiteConfigurationFromAppName(const std::string& app_name) {
+ SiteConfig config;
+ bool is_app_found = false;
+@@ -1924,7 +1924,7 @@ void WebAppIntegrationTestDriver::DeletePlatformShortc
+ if (app_name.empty()) {
+ app_name = GetSiteConfiguration(site).app_name;
+ }
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ASSERT_TRUE(override_registration_->test_override->IsShortcutCreated(
+ profile(), app_id, app_name));
+ ASSERT_TRUE(
+@@ -3243,7 +3243,7 @@ void WebAppIntegrationTestDriver::CheckRunOnOsLoginEna
+ app_state->id, app_state->name);
+ ASSERT_TRUE(icon_color.has_value());
+ ASSERT_THAT(site_config.icon_color, testing::Eq(icon_color.value()));
+-#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ASSERT_TRUE(override_registration_->test_override->IsRunOnOsLoginEnabled(
+ profile(), app_state->id, app_state->name));
+ #endif
+@@ -3258,7 +3258,7 @@ void WebAppIntegrationTestDriver::CheckRunOnOsLoginDis
+ GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site);
+ ASSERT_TRUE(app_state);
+ base::ScopedAllowBlockingForTesting allow_blocking;
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ASSERT_FALSE(override_registration_->test_override->IsRunOnOsLoginEnabled(
+ profile(), app_state->id, app_state->name));
+ #endif
+@@ -3268,7 +3268,7 @@ void WebAppIntegrationTestDriver::CheckSiteHandlesFile
+ void WebAppIntegrationTestDriver::CheckSiteHandlesFile(
+ Site site,
+ FileExtension file_extension) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!BeforeStateCheckAction(__FUNCTION__)) {
+ return;
+ }
+@@ -3284,7 +3284,7 @@ void WebAppIntegrationTestDriver::CheckSiteNotHandlesF
+ void WebAppIntegrationTestDriver::CheckSiteNotHandlesFile(
+ Site site,
+ FileExtension file_extension) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!BeforeStateCheckAction(__FUNCTION__)) {
+ return;
+ }
+@@ -4077,7 +4077,7 @@ base::FilePath WebAppIntegrationTestDriver::GetShortcu
+ base::FilePath shortcut_dir,
+ const std::string& app_name,
+ const webapps::AppId& app_id) {
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return override_registration_->test_override->GetShortcutPath(
+ profile(), shortcut_dir, app_id, app_name);
+ #else
+@@ -4271,7 +4271,7 @@ bool WebAppIntegrationTestDriver::IsShortcutAndIconCre
+ const webapps::AppId& id) {
+ base::ScopedAllowBlockingForTesting allow_blocking;
+ bool is_shortcut_and_icon_correct = false;
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool is_shortcut_correct =
+ override_registration_->test_override->IsShortcutCreated(profile, id,
+ name);
+@@ -4315,7 +4315,7 @@ bool WebAppIntegrationTestDriver::DoIconColorsMatch(Pr
+ do_icon_colors_match =
+ (expected_icon_pixel_color == shortcut_pixel_color_apps_folder.value());
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SkColor expected_icon_pixel_color =
+ GetSiteConfigurationFromAppName(name).icon_color;
+ absl::optional<SkColor> actual_color_install_icon_size =
diff --git a/devel/electron28/files/patch-chrome_browser_ui_web__applications_web__app__dialogs.h b/devel/electron28/files/patch-chrome_browser_ui_web__applications_web__app__dialogs.h
new file mode 100644
index 000000000000..4fa46264e800
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_web__applications_web__app__dialogs.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/web_applications/web_app_dialogs.h.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/web_applications/web_app_dialogs.h
+@@ -20,7 +20,7 @@ static_assert(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) |
+ #include "ui/gfx/native_widget_types.h"
+
+ static_assert(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA));
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD));
+
+ class GURL;
+ class Profile;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_about__ui.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_about__ui.cc
new file mode 100644
index 000000000000..b9772f210b52
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_about__ui.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/about_ui.cc.orig 2023-08-10 01:48:37 UTC
++++ chrome/browser/ui/webui/about_ui.cc
+@@ -635,7 +635,7 @@ std::string ChromeURLs() {
+ return html;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::string AboutLinuxProxyConfig() {
+ std::string data;
+ AppendHeader(&data,
+@@ -689,7 +689,7 @@ void AboutUIHTMLSource::StartDataRequest(
+ response =
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(idr);
+ }
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ } else if (source_name_ == chrome::kChromeUILinuxProxyConfigHost) {
+ response = AboutLinuxProxyConfig();
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_app__home_app__home__page__handler.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_app__home_app__home__page__handler.cc
new file mode 100644
index 000000000000..2213a04ef3b1
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_app__home_app__home__page__handler.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/app_home/app_home_page_handler.cc.orig 2023-10-19 19:58:07 UTC
++++ chrome/browser/ui/webui/app_home/app_home_page_handler.cc
+@@ -415,7 +415,7 @@ app_home::mojom::AppInfoPtr AppHomePageHandler::Create
+
+ bool deprecated_app = false;
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ auto* context = extension_system_->extension_service()->GetBrowserContext();
+ deprecated_app =
+ extensions::IsExtensionUnsupportedDeprecatedApp(context, extension->id());
+@@ -478,7 +478,7 @@ void AppHomePageHandler::FillExtensionInfoList(
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ auto* context = extension_system_->extension_service()->GetBrowserContext();
+ const bool is_deprecated_app =
+ extensions::IsExtensionUnsupportedDeprecatedApp(context,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
new file mode 100644
index 000000000000..783420528a2f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
@@ -0,0 +1,92 @@
+--- chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+@@ -210,7 +210,7 @@
+ #include "chrome/browser/ui/webui/chromeos/chrome_url_disabled/chrome_url_disabled_ui.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/webui_js_error/webui_js_error_ui.h"
+ #endif
+
+@@ -236,17 +236,17 @@
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/discards/discards_ui.h"
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/sandbox/sandbox_internals_ui.h"
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/ui/webui/connectors_internals/connectors_internals_ui.h"
+ #endif
+
+@@ -403,7 +403,7 @@ bool IsAboutUI(const GURL& url) {
+ #if !BUILDFLAG(IS_ANDROID)
+ || url.host_piece() == chrome::kChromeUITermsHost
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ || url.host_piece() == chrome::kChromeUILinuxProxyConfigHost
+ #endif
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -667,7 +667,7 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ if (url.host_piece() == chrome::kChromeUIMobileSetupHost)
+ return &NewWebUI<ash::cellular_setup::MobileSetupUI>;
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUIWebUIJsErrorHost)
+ return &NewWebUI<WebUIJsErrorUI>;
+ #endif
+@@ -730,7 +730,7 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ if (url.host_piece() == chrome::kChromeUINaClHost)
+ return &NewWebUI<NaClUI>;
+ #endif
+-#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ defined(TOOLKIT_VIEWS)) || \
+ defined(USE_AURA)
+ if (url.host_piece() == chrome::kChromeUITabModalConfirmDialogHost)
+@@ -791,27 +791,27 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ }
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUISandboxHost) {
+ return &NewWebUI<SandboxInternalsUI>;
+ }
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUIConnectorsInternalsHost)
+ return &NewWebUI<enterprise_connectors::ConnectorsInternalsUI>;
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUIDiscardsHost)
+ return &NewWebUI<DiscardsUI>;
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUIBrowserSwitchHost)
+ return &NewWebUI<BrowserSwitchUI>;
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ if (url.host_piece() == chrome::kChromeUIWebAppSettingsHost)
+ return &NewWebUI<WebAppSettingsUI>;
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_connectors__internals_device__trust__utils.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_connectors__internals_device__trust__utils.cc
new file mode 100644
index 000000000000..ffa032e80476
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_connectors__internals_device__trust__utils.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #include "base/base64url.h"
+ #include "chrome/browser/browser_process.h"
+ #include "chrome/browser/policy/chrome_browser_policy_connector.h"
+@@ -29,7 +29,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+
+ connectors_internals::mojom::KeyTrustLevel ParseTrustLevel(
+ BPKUR::KeyTrustLevel trust_level) {
+@@ -97,7 +97,7 @@ connectors_internals::mojom::KeyInfoPtr GetKeyInfo() {
+ } // namespace
+
+ connectors_internals::mojom::KeyInfoPtr GetKeyInfo() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ auto* key_manager = g_browser_process->browser_policy_connector()
+ ->chrome_browser_cloud_management_controller()
+ ->GetDeviceTrustKeyManager();
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui.cc
new file mode 100644
index 000000000000..cb187eb6a642
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/webui/management/management_ui.cc.orig 2023-03-30 00:33:44 UTC
++++ chrome/browser/ui/webui/management/management_ui.cc
+@@ -92,7 +92,7 @@ content::WebUIDataSource* CreateAndAddManagementUIHtml
+ {kManagementOnFileTransferVisibleData,
+ IDS_MANAGEMENT_FILE_TRANSFER_VISIBLE_DATA},
+ #endif // BUILDFLAG(IS_CHROMEOS)
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {kManagementScreenCaptureEvent, IDS_MANAGEMENT_SCREEN_CAPTURE_EVENT},
+ {kManagementScreenCaptureData, IDS_MANAGEMENT_SCREEN_CAPTURE_DATA},
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.cc
new file mode 100644
index 000000000000..a80cb3f2069d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.cc
@@ -0,0 +1,53 @@
+--- chrome/browser/ui/webui/management/management_ui_handler.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/ui/webui/management/management_ui_handler.cc
+@@ -94,7 +94,7 @@
+ #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/enterprise/signals/user_permission_service_factory.h"
+ #include "components/device_signals/core/browser/user_permission_service.h" // nogncheck
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+@@ -190,12 +190,12 @@ enum class ReportingType {
+ kLegacyTech,
+ };
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kManagementScreenCaptureEvent[] = "managementScreenCaptureEvent";
+ const char kManagementScreenCaptureData[] = "managementScreenCaptureData";
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kManagementDeviceSignalsDisclosure[] =
+ "managementDeviceSignalsDisclosure";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+@@ -773,7 +773,7 @@ void ManagementUIHandler::AddReportingInfo(base::Value
+ GetReportingTypeValue(report_definition.reporting_type));
+ report_sources->Append(std::move(data));
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Insert the device signals consent disclosure at the end of browser
+ // reporting section.
+ auto* user_permission_service = GetUserPermissionService();
+@@ -1061,7 +1061,7 @@ base::Value::Dict ManagementUIHandler::GetThreatProtec
+ kManagementOnPageVisitedVisibleData, &info);
+ }
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (capture_policy::IsGetAllScreensMediaAllowedForAnySite(profile)) {
+ AddThreatProtectionPermission(kManagementScreenCaptureEvent,
+ kManagementScreenCaptureData, &info);
+@@ -1145,7 +1145,7 @@ policy::PolicyService* ManagementUIHandler::GetPolicyS
+ ->policy_service();
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ device_signals::UserPermissionService*
+ ManagementUIHandler::GetUserPermissionService() {
+ return enterprise_signals::UserPermissionServiceFactory::GetForProfile(
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.h b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.h
new file mode 100644
index 000000000000..d9b193aad53c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_management_management__ui__handler.h
@@ -0,0 +1,37 @@
+--- chrome/browser/ui/webui/management/management_ui_handler.h.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/ui/webui/management/management_ui_handler.h
+@@ -24,14 +24,14 @@
+ #include "extensions/common/extension_id.h"
+ #include "url/gurl.h"
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Constants defining the IDs for the localized strings sent to the page as
+ // load time data.
+ extern const char kManagementScreenCaptureEvent[];
+ extern const char kManagementScreenCaptureData[];
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ extern const char kManagementDeviceSignalsDisclosure[];
+ #endif // #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+@@ -117,7 +117,7 @@ class StatusCollector;
+ class SystemLogUploader;
+ } // namespace policy
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ namespace device_signals {
+ class UserPermissionService;
+ } // namespace device_signals
+@@ -177,7 +177,7 @@ class ManagementUIHandler : public content::WebUIMessa
+ base::Value::List GetManagedWebsitesInfo(Profile* profile) const;
+ base::Value::List GetApplicationsInfo(Profile* profile) const;
+ virtual policy::PolicyService* GetPolicyService();
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ virtual device_signals::UserPermissionService* GetUserPermissionService();
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_ntp_app__launcher__handler.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_ntp_app__launcher__handler.cc
new file mode 100644
index 000000000000..728e75e2a9c8
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_ntp_app__launcher__handler.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/webui/ntp/app_launcher_handler.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+@@ -311,7 +311,7 @@ base::Value::Dict AppLauncherHandler::CreateExtensionI
+ bool is_deprecated_app = false;
+ auto* context = extension_service_->GetBrowserContext();
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ is_deprecated_app =
+ extensions::IsExtensionUnsupportedDeprecatedApp(context, extension->id());
+ #endif
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_realbox_realbox__handler.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_realbox_realbox__handler.cc
new file mode 100644
index 000000000000..e63240d41c3c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_realbox_realbox__handler.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/realbox/realbox_handler.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/ui/webui/realbox/realbox_handler.cc
+@@ -146,7 +146,7 @@ constexpr char kMacShareIconResourceName[] =
+ #elif BUILDFLAG(IS_WIN)
+ constexpr char kWinShareIconResourceName[] =
+ "//resources/cr_components/omnibox/icons/win_share.svg";
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ constexpr char kLinuxShareIconResourceName[] =
+ "//resources/cr_components/omnibox/icons/share.svg";
+ #else
+@@ -745,7 +745,7 @@ std::string RealboxHandler::PedalVectorIconToResourceN
+ icon.name == omnibox::kShareWinChromeRefreshIcon.name) {
+ return kWinShareIconResourceName;
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (icon.name == omnibox::kShareIcon.name ||
+ icon.name == omnibox::kShareLinuxChromeRefreshIcon.name) {
+ return kLinuxShareIconResourceName;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
new file mode 100644
index 000000000000..f744fa8fd2d3
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/webui/settings/appearance_handler.cc.orig 2022-10-24 13:33:33 UTC
++++ chrome/browser/ui/webui/settings/appearance_handler.cc
+@@ -28,7 +28,7 @@ void AppearanceHandler::RegisterMessages() {
+ "useDefaultTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseTheme,
+ base::Unretained(this), ui::SystemTheme::kDefault));
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ web_ui()->RegisterMessageCallback(
+ "useGtkTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseTheme,
diff --git a/devel/electron28/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc b/devel/electron28/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc
new file mode 100644
index 000000000000..1c7c1aaa587f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc
@@ -0,0 +1,65 @@
+--- chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+@@ -137,7 +137,7 @@
+ #include "ash/webui/settings/public/constants/routes.mojom.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ #include "ui/display/screen.h"
+ #endif
+
+@@ -156,7 +156,7 @@
+ #include "chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui_factory.h"
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif
+@@ -264,7 +264,7 @@ void AddCommonStrings(content::WebUIDataSource* html_s
+ base::FeatureList::IsEnabled(
+ supervised_user::kClearingCookiesKeepsSupervisedUsersSignedIn));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool allow_qt_theme = base::FeatureList::IsEnabled(ui::kAllowQt);
+ #else
+ bool allow_qt_theme = false;
+@@ -295,7 +295,7 @@ void AddA11yStrings(content::WebUIDataSource* html_sou
+ {"focusHighlightLabel",
+ IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION},
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ {"overscrollHistoryNavigationTitle",
+ IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_TITLE},
+ {"overscrollHistoryNavigationSubtitle",
+@@ -434,7 +434,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ {"huge", IDS_SETTINGS_HUGE_FONT_SIZE},
+ {"sidePanelAlignLeft", IDS_SETTINGS_SIDE_PANEL_ALIGN_LEFT},
+ {"sidePanelAlignRight", IDS_SETTINGS_SIDE_PANEL_ALIGN_RIGHT},
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ {"gtkTheme", IDS_SETTINGS_GTK_THEME},
+ {"useGtkTheme", IDS_SETTINGS_USE_GTK_THEME},
+ {"qtTheme", IDS_SETTINGS_QT_THEME},
+@@ -444,7 +444,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ #else
+ {"resetToDefaultTheme", IDS_SETTINGS_RESET_TO_DEFAULT_THEME},
+ #endif
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS},
+ #endif
+ #if BUILDFLAG(IS_MAC)
+@@ -469,7 +469,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ bool show_custom_chrome_frame = ui::OzonePlatform::GetInstance()
+ ->GetPlatformRuntimeProperties()
+ .supports_server_side_window_decorations;
diff --git a/devel/electron28/files/patch-chrome_browser_ui_window__sizer_window__sizer.cc b/devel/electron28/files/patch-chrome_browser_ui_window__sizer_window__sizer.cc
new file mode 100644
index 000000000000..d8eb5e2b4e9b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_ui_window__sizer_window__sizer.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/window_sizer/window_sizer.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/ui/window_sizer/window_sizer.cc
+@@ -216,7 +216,7 @@ void WindowSizer::GetBrowserWindowBoundsAndShowState(
+ browser, window_bounds, show_state);
+ }
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Linux has its own implementation, see WindowSizerLinux.
+ // static
+ void WindowSizer::GetBrowserWindowBoundsAndShowState(
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_commands_install__app__locally__command.cc b/devel/electron28/files/patch-chrome_browser_web__applications_commands_install__app__locally__command.cc
new file mode 100644
index 000000000000..83013ef66395
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_commands_install__app__locally__command.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/commands/install_app_locally_command.cc.orig 2023-08-10 01:48:37 UTC
++++ chrome/browser/web_applications/commands/install_app_locally_command.cc
+@@ -80,7 +80,7 @@ void InstallAppLocallyCommand::StartWithLock(
+ options.os_hooks[OsHookType::kUninstallationViaOsSettings] =
+ web_app->CanUserUninstallWebApp();
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
+ options.os_hooks[web_app::OsHookType::kUrlHandlers] = true;
+ #else
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_extension__status__utils.h b/devel/electron28/files/patch-chrome_browser_web__applications_extension__status__utils.h
new file mode 100644
index 000000000000..b15f3acc38dd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_extension__status__utils.h
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/extension_status_utils.h.orig 2023-05-25 00:41:46 UTC
++++ chrome/browser/web_applications/extension_status_utils.h
+@@ -56,7 +56,7 @@ bool ClearExternalExtensionUninstalled(content::Browse
+ const std::string& extension_id);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Returns whether |extension_id| is a Chrome App and should be blocked by the
+ // Chrome Apps Deprecation. Policy installed Chrome Apps are still allowed, and
+ // all apps are allowed if the deprecation feature flag is not enabled.
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_extensions_extension__status__utils.cc b/devel/electron28/files/patch-chrome_browser_web__applications_extensions_extension__status__utils.cc
new file mode 100644
index 000000000000..768f5b402e96
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_extensions_extension__status__utils.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/web_applications/extensions/extension_status_utils.cc.orig 2023-05-25 00:41:46 UTC
++++ chrome/browser/web_applications/extensions/extension_status_utils.cc
+@@ -26,7 +26,7 @@ namespace {
+ const char* g_preinstalled_app_for_testing = nullptr;
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // TODO(b/268221237): Remove this allow-list.
+ const char kDefaultAllowedExtensionIds[] =
+ "alhngdkjgnedakdlnamimgfihgkmenbh,"
+@@ -116,7 +116,7 @@ bool ClearExternalExtensionUninstalled(content::Browse
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ bool IsExtensionUnsupportedDeprecatedApp(content::BrowserContext* context,
+ const std::string& extension_id) {
+ if (testing::g_enable_chrome_apps_for_testing) {
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_os__integration__test__override.h b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_os__integration__test__override.h
new file mode 100644
index 000000000000..a7706328f18b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_os__integration__test__override.h
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/os_integration/os_integration_test_override.h.orig 2023-05-25 00:41:46 UTC
++++ chrome/browser/web_applications/os_integration/os_integration_test_override.h
+@@ -92,7 +92,7 @@ class OsIntegrationTestOverride
+ virtual const base::FilePath& chrome_apps_folder() = 0;
+ virtual void EnableOrDisablePathOnLogin(const base::FilePath& file_path,
+ bool enable_on_login) = 0;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ virtual const base::FilePath& desktop() = 0;
+ virtual const base::FilePath& startup() = 0;
+ virtual const base::FilePath& applications_dir() = 0;
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_run__on__os__login__sub__manager.cc b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_run__on__os__login__sub__manager.cc
new file mode 100644
index 000000000000..1e83c5d1b12c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_run__on__os__login__sub__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc
+@@ -54,7 +54,7 @@ proto::RunOnOsLoginMode ConvertWebAppRunOnOsLoginModeT
+ // different from other platforms, see web_app_run_on_os_login_manager.h for
+ // more info.
+ bool DoesRunOnOsLoginRequireExecution() {
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin);
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_shortcut__sub__manager.cc b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_shortcut__sub__manager.cc
new file mode 100644
index 000000000000..e3569da6941d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_shortcut__sub__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/os_integration/shortcut_sub_manager.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/os_integration/shortcut_sub_manager.cc
+@@ -182,7 +182,7 @@ void ShortcutSubManager::Execute(
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // Protocol handler update detection. Shortcuts need to be updated in this
+ // case on Linux & Mac because the shortcut itself includes the protocol
+ // handling metadata.
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__file__handler__registration.h b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__file__handler__registration.h
new file mode 100644
index 000000000000..95f3077295e6
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__file__handler__registration.h
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/os_integration/web_app_file_handler_registration.h.orig 2023-05-25 00:41:46 UTC
++++ chrome/browser/web_applications/os_integration/web_app_file_handler_registration.h
+@@ -43,7 +43,7 @@ void UnregisterFileHandlersWithOs(const AppId& app_id,
+ const base::FilePath& profile_path,
+ ResultCallback callback);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Exposed for testing purposes. Register the set of
+ // MIME-type-to-file-extensions mappings corresponding to |file_handlers|. File
+ // I/O and callouts to the Linux shell are performed asynchronously.
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.cc b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.cc
new file mode 100644
index 000000000000..09558002af2c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/web_applications/os_integration/web_app_shortcut.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/os_integration/web_app_shortcut.cc
+@@ -65,7 +65,7 @@ namespace {
+
+ #if BUILDFLAG(IS_MAC)
+ const int kDesiredIconSizesForShortcut[] = {16, 32, 128, 256, 512};
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Linux supports icons of any size. FreeDesktop Icon Theme Specification states
+ // that "Minimally you should install a 48x48 icon in the hicolor theme."
+ const int kDesiredIconSizesForShortcut[] = {16, 32, 48, 128, 256, 512};
+@@ -227,7 +227,7 @@ std::unique_ptr<ShortcutInfo> BuildShortcutInfoWithout
+
+ // TODO(crbug.com/1416965): Implement tests on Linux for using shortcuts_menu
+ // actions.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos =
+ CreateShortcutsMenuItemInfos(state.shortcut_menus());
+ DCHECK_LE(shortcuts_menu_item_infos.size(), kMaxApplicationDockMenuItems);
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.h b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.h
new file mode 100644
index 000000000000..7994b0589e4c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut.h
@@ -0,0 +1,20 @@
+--- chrome/browser/web_applications/os_integration/web_app_shortcut.h.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/os_integration/web_app_shortcut.h
+@@ -21,7 +21,7 @@
+ #include "ui/gfx/image/image_family.h"
+ #include "url/gurl.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/web_applications/os_integration/web_app_shortcut_linux.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -70,7 +70,7 @@ struct ShortcutInfo {
+ std::set<std::string> file_handler_extensions;
+ std::set<std::string> file_handler_mime_types;
+ std::set<std::string> protocol_handlers;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::set<DesktopActionInfo> actions;
+ #endif // BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut__manager.cc b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut__manager.cc
new file mode 100644
index 000000000000..250124860e01
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_os__integration_web__app__shortcut__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/os_integration/web_app_shortcut_manager.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/os_integration/web_app_shortcut_manager.cc
+@@ -434,7 +434,7 @@ std::unique_ptr<ShortcutInfo> WebAppShortcutManager::B
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos =
+ app->shortcuts_menu_item_infos();
+ DCHECK_LE(shortcuts_menu_item_infos.size(), kMaxApplicationDockMenuItems);
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_policy_web__app__policy__manager.cc b/devel/electron28/files/patch-chrome_browser_web__applications_policy_web__app__policy__manager.cc
new file mode 100644
index 000000000000..cf7abfff1f01
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_policy_web__app__policy__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/policy/web_app_policy_manager.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/web_applications/policy/web_app_policy_manager.cc
+@@ -128,7 +128,7 @@ BASE_FEATURE(kDesktopPWAsForceUnregisterOSIntegration,
+
+ BASE_FEATURE(kDesktopPWAsForceUnregisterOSIntegration,
+ "DesktopPWAsForceUnregisterOSIntegration",
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.cc b/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.cc
new file mode 100644
index 000000000000..41c6cd06f9c4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.cc
@@ -0,0 +1,119 @@
+--- chrome/browser/web_applications/test/os_integration_test_override_impl.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/web_applications/test/os_integration_test_override_impl.cc
+@@ -127,7 +127,7 @@ std::vector<std::wstring> GetFileExtensionsForProgId(
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Performs a blocking read of app icons from the disk.
+ SkColor IconManagerReadIconTopLeftColorForSize(WebAppIconManager& icon_manager,
+ const webapps::AppId& app_id,
+@@ -224,7 +224,7 @@ bool OsIntegrationTestOverrideImpl::SimulateDeleteShor
+ GetShortcutPath(profile, chrome_apps_folder(), app_id, app_name);
+ CHECK(base::PathExists(app_folder_shortcut_path));
+ return base::DeletePathRecursively(app_folder_shortcut_path);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FilePath desktop_shortcut_path =
+ GetShortcutPath(profile, desktop(), app_id, app_name);
+ LOG(INFO) << desktop_shortcut_path;
+@@ -264,7 +264,7 @@ bool OsIntegrationTestOverrideImpl::DeleteApplicationM
+ }
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool OsIntegrationTestOverrideImpl::DeleteDesktopDirOnLinux() {
+ if (desktop_.IsValid()) {
+ return desktop_.Delete();
+@@ -278,7 +278,7 @@ bool OsIntegrationTestOverrideImpl::IsRunOnOsLoginEnab
+ Profile* profile,
+ const webapps::AppId& app_id,
+ const std::string& app_name) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string shortcut_filename =
+ "chrome-" + app_id + "-" + profile->GetBaseName().value() + ".desktop";
+ return base::PathExists(startup().Append(shortcut_filename));
+@@ -334,7 +334,7 @@ bool OsIntegrationTestOverrideImpl::IsFileExtensionHan
+ is_file_handled =
+ shell_integration::CanApplicationHandleURL(app_path, test_file_url);
+ base::DeleteFile(test_file_path);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FilePath user_applications_dir =
+ applications_dir().Append("applications");
+ bool database_update_called = false;
+@@ -378,7 +378,7 @@ OsIntegrationTestOverrideImpl::GetShortcutIconTopLeftC
+ return absl::nullopt;
+ }
+ return GetIconTopLeftColorFromShortcutFile(shortcut_path);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ WebAppProvider* provider = WebAppProvider::GetForLocalAppsUnchecked(profile);
+ if (!provider) {
+ return absl::nullopt;
+@@ -428,7 +428,7 @@ base::FilePath OsIntegrationTestOverrideImpl::GetShort
+ app_installed_profiles.end()) {
+ return shortcut_path;
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string shortcut_filename =
+ "chrome-" + app_id + "-" + profile->GetBaseName().value() + ".desktop";
+ base::FilePath shortcut_path = shortcut_dir.Append(shortcut_filename);
+@@ -454,7 +454,7 @@ bool OsIntegrationTestOverrideImpl::IsShortcutCreated(
+ base::FilePath app_shortcut_path =
+ GetShortcutPath(profile, chrome_apps_folder(), app_id, app_name);
+ return base::PathExists(app_shortcut_path);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FilePath desktop_shortcut_path =
+ GetShortcutPath(profile, desktop(), app_id, app_name);
+ return base::PathExists(desktop_shortcut_path);
+@@ -643,7 +643,7 @@ void OsIntegrationTestOverrideImpl::EnableOrDisablePat
+ }
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const base::FilePath& OsIntegrationTestOverrideImpl::desktop() {
+ return desktop_.GetPath();
+ }
+@@ -678,7 +678,7 @@ OsIntegrationTestOverrideImpl::OsIntegrationTestOverri
+ #elif BUILDFLAG(IS_MAC)
+ bool success = chrome_apps_folder_.CreateUniqueTempDirUnderPath(base_path);
+ CHECK(success);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool success = desktop_.CreateUniqueTempDirUnderPath(base_path);
+ CHECK(success);
+ success = startup_.CreateUniqueTempDirUnderPath(base_path);
+@@ -699,7 +699,7 @@ OsIntegrationTestOverrideImpl::OsIntegrationTestOverri
+ #elif BUILDFLAG(IS_MAC)
+ bool success = chrome_apps_folder_.CreateUniqueTempDir();
+ CHECK(success);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool success = desktop_.CreateUniqueTempDir();
+ CHECK(success);
+ success = startup_.CreateUniqueTempDir();
+@@ -709,7 +709,7 @@ OsIntegrationTestOverrideImpl::OsIntegrationTestOverri
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto callback = base::BindRepeating([](base::FilePath filename_in,
+ std::string xdg_command,
+ std::string file_contents) {
+@@ -756,7 +756,7 @@ OsIntegrationTestOverrideImpl::~OsIntegrationTestOverr
+ }
+ }
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Reset the file handling callback.
+ SetUpdateMimeInfoDatabaseOnLinuxCallbackForTesting(
+ UpdateMimeInfoDatabaseOnLinuxCallback());
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.h b/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.h
new file mode 100644
index 000000000000..a634e56f5b1b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_test_os__integration__test__override__impl.h
@@ -0,0 +1,38 @@
+--- chrome/browser/web_applications/test/os_integration_test_override_impl.h.orig 2023-10-19 19:58:08 UTC
++++ chrome/browser/web_applications/test/os_integration_test_override_impl.h
+@@ -38,7 +38,7 @@ class ShellLinkItem;
+
+ namespace web_app {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ struct LinuxFileRegistration {
+ base::FilePath file_name;
+ std::string xdg_command;
+@@ -112,7 +112,7 @@ class OsIntegrationTestOverrideImpl : public OsIntegra
+ bool DeleteApplicationMenuDirOnWin();
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool DeleteDesktopDirOnLinux();
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -231,7 +231,7 @@ class OsIntegrationTestOverrideImpl : public OsIntegra
+ const base::FilePath& chrome_apps_folder() override;
+ void EnableOrDisablePathOnLogin(const base::FilePath& file_path,
+ bool enable_on_login) override;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const base::FilePath& desktop() override;
+ const base::FilePath& startup() override;
+ const base::FilePath& applications_dir() override;
+@@ -278,7 +278,7 @@ class OsIntegrationTestOverrideImpl : public OsIntegra
+ base::ScopedTempDir chrome_apps_folder_;
+ std::map<base::FilePath, bool> startup_enabled_;
+
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::ScopedTempDir desktop_;
+ base::ScopedTempDir startup_;
+ base::ScopedTempDir applications_dir_;
diff --git a/devel/electron28/files/patch-chrome_browser_web__applications_web__app__install__info.h b/devel/electron28/files/patch-chrome_browser_web__applications_web__app__install__info.h
new file mode 100644
index 000000000000..1d5d9df262d1
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_web__applications_web__app__install__info.h
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/web_app_install_info.h.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/web_applications/web_app_install_info.h
+@@ -35,7 +35,7 @@ static_assert(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) |
+ #include "url/gurl.h"
+
+ static_assert(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA));
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD));
+
+ namespace web_app {
+
diff --git a/devel/electron28/files/patch-chrome_browser_webauthn_chrome__authenticator__request__delegate.cc b/devel/electron28/files/patch-chrome_browser_webauthn_chrome__authenticator__request__delegate.cc
new file mode 100644
index 000000000000..4c554f917e9d
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_browser_webauthn_chrome__authenticator__request__delegate.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/webauthn/chrome_authenticator_request_delegate.cc.orig 2023-11-29 21:39:53 UTC
++++ chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+@@ -677,7 +677,7 @@ void ChromeAuthenticatorRequestDelegate::ConfigureDisc
+ g_observer->ConfiguringCable(request_type);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // No caBLEv1 on Linux. It tends to crash bluez.
+ if (base::Contains(pairings_from_extension,
+ device::CableDiscoveryData::Version::V1,
diff --git a/devel/electron28/files/patch-chrome_common_channel__info.h b/devel/electron28/files/patch-chrome_common_channel__info.h
new file mode 100644
index 000000000000..d16632abac29
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_channel__info.h
@@ -0,0 +1,18 @@
+--- chrome/common/channel_info.h.orig 2023-05-25 00:41:46 UTC
++++ chrome/common/channel_info.h
+@@ -104,13 +104,13 @@ void ClearChannelForTesting();
+ std::string GetChannelSuffixForDataDir();
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string GetChannelSuffixForExtraFlagsEnvVarName();
+ #endif
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Returns the channel-specific filename of the desktop shortcut used to launch
+ // the browser.
+ std::string GetDesktopName(base::Environment* env);
diff --git a/devel/electron28/files/patch-chrome_common_channel__info__posix.cc b/devel/electron28/files/patch-chrome_common_channel__info__posix.cc
new file mode 100644
index 000000000000..374979ffc16a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_channel__info__posix.cc
@@ -0,0 +1,20 @@
+--- chrome/common/channel_info_posix.cc.orig 2023-05-25 00:41:46 UTC
++++ chrome/common/channel_info_posix.cc
+@@ -92,7 +92,7 @@ std::string GetChannelSuffixForDataDir() {
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string GetChannelSuffixForExtraFlagsEnvVarName() {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ const auto channel_state = GetChannelImpl();
+@@ -118,7 +118,7 @@ std::string GetChannelSuffixForExtraFlagsEnvVarName()
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ std::string GetDesktopName(base::Environment* env) {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ // Google Chrome packaged as a snap is a special case: the application name
diff --git a/devel/electron28/files/patch-chrome_common_chrome__features.cc b/devel/electron28/files/patch-chrome_common_chrome__features.cc
new file mode 100644
index 000000000000..5cd3994260fc
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__features.cc
@@ -0,0 +1,83 @@
+--- chrome/common/chrome_features.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/chrome_features.cc
+@@ -76,7 +76,7 @@ BASE_FEATURE(kAsyncDns,
+ BASE_FEATURE(kAsyncDns,
+ "AsyncDns",
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -84,7 +84,7 @@ BASE_FEATURE(kAsyncDns,
+ );
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Enables or disables the Autofill survey triggered by opening a prompt to
+ // save address info.
+ BASE_FEATURE(kAutofillAddressSurvey,
+@@ -102,7 +102,7 @@ BASE_FEATURE(kAutofillPasswordSurvey,
+ base::FEATURE_DISABLED_BY_DEFAULT);
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Enables the Restart background mode optimization. When all Chrome UI is
+ // closed and it goes in the background, allows to restart the browser to
+ // discard memory.
+@@ -304,7 +304,7 @@ BASE_FEATURE(kDesktopPWAsRunOnOsLogin,
+ BASE_FEATURE(kDesktopPWAsRunOnOsLogin,
+ "DesktopPWAsRunOnOsLogin",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -338,7 +338,7 @@ BASE_FEATURE(kDesktopPWAsWebBundles,
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Controls whether Chrome Apps are supported. See https://crbug.com/1221251.
+ // If the feature is disabled, Chrome Apps continue to work. If enabled, Chrome
+ // Apps will not launch and will be marked in the UI as deprecated.
+@@ -366,7 +366,7 @@ BASE_FEATURE(kDnsOverHttps,
+ BASE_FEATURE(kDnsOverHttps,
+ "DnsOverHttps",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -382,7 +382,7 @@ const base::FeatureParam<bool> kDnsOverHttpsShowUiPara
+ const base::FeatureParam<bool> kDnsOverHttpsShowUiParam {
+ &kDnsOverHttps, "ShowUi",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ true
+ #else
+ false
+@@ -912,7 +912,7 @@ BASE_FEATURE(kLacrosSharedComponentsDir,
+ base::FEATURE_ENABLED_BY_DEFAULT);
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kLinuxLowMemoryMonitor,
+ "LinuxLowMemoryMonitor",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+@@ -925,7 +925,7 @@ constexpr base::FeatureParam<int> kLinuxLowMemoryMonit
+ &kLinuxLowMemoryMonitor, "critical_level", 255};
+ #endif // BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kListWebAppsSwitch,
+ "ListWebAppsSwitch",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/devel/electron28/files/patch-chrome_common_chrome__features.h b/devel/electron28/files/patch-chrome_common_chrome__features.h
new file mode 100644
index 000000000000..d1a2d519963b
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__features.h
@@ -0,0 +1,45 @@
+--- chrome/common/chrome_features.h.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/chrome_features.h
+@@ -61,13 +61,13 @@ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kAsyncDns);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kAutofillAddressSurvey);
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kAutofillCardSurvey);
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kAutofillPasswordSurvey);
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES)
+ BASE_DECLARE_FEATURE(kBackgroundModeAllowRestart);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -204,7 +204,7 @@ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kDesktopPWAsWebBundles);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kChromeAppsDeprecation);
+ COMPONENT_EXPORT(CHROME_FEATURES)
+ BASE_DECLARE_FEATURE(kKeepForceInstalledPreinstalledApps);
+@@ -523,7 +523,7 @@ BASE_DECLARE_FEATURE(kLacrosSharedComponentsDir);
+ BASE_DECLARE_FEATURE(kLacrosSharedComponentsDir);
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kLinuxLowMemoryMonitor);
+ COMPONENT_EXPORT(CHROME_FEATURES)
+ extern const base::FeatureParam<int> kLinuxLowMemoryMonitorModerateLevel;
+@@ -531,7 +531,7 @@ extern const base::FeatureParam<int> kLinuxLowMemoryMo
+ extern const base::FeatureParam<int> kLinuxLowMemoryMonitorCriticalLevel;
+ #endif // BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kListWebAppsSwitch);
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_common_chrome__paths.cc b/devel/electron28/files/patch-chrome_common_chrome__paths.cc
new file mode 100644
index 000000000000..b1fc775a0981
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__paths.cc
@@ -0,0 +1,84 @@
+--- chrome/common/chrome_paths.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/chrome_paths.cc
+@@ -30,7 +30,7 @@
+ #include "base/apple/foundation_util.h"
+ #endif
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
+ #include "components/policy/core/common/policy_paths.h"
+ #endif
+
+@@ -52,14 +52,14 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The path to the external extension <id>.json files.
+ // /usr/share seems like a good choice, see: http://www.pathname.com/fhs/
+ const base::FilePath::CharType kFilepathSinglePrefExtensions[] =
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+- FILE_PATH_LITERAL("/usr/share/google-chrome/extensions");
++ FILE_PATH_LITERAL("/usr/local/share/chromium/extensions");
+ #else
+- FILE_PATH_LITERAL("/usr/share/chromium/extensions");
++ FILE_PATH_LITERAL("/usr/local/share/chromium/extensions");
+ #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -220,7 +220,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ }
+ break;
+ case chrome::DIR_DEFAULT_DOWNLOADS_SAFE:
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!GetUserDownloadsDirectorySafe(&cur)) {
+ return false;
+ }
+@@ -523,7 +523,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ return false;
+ }
+ break;
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
+ case chrome::DIR_POLICY_FILES: {
+ cur = base::FilePath(policy::kPolicyPath);
+ break;
+@@ -534,7 +534,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ #if BUILDFLAG(IS_CHROMEOS_ASH) || \
+ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
+ BUILDFLAG(CHROMIUM_BRANDING)) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ case chrome::DIR_USER_EXTERNAL_EXTENSIONS: {
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &cur)) {
+ return false;
+@@ -543,7 +543,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ break;
+ }
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS: {
+ cur = base::FilePath(kFilepathSinglePrefExtensions);
+ break;
+@@ -590,7 +590,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ break;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ case chrome::DIR_NATIVE_MESSAGING:
+ #if BUILDFLAG(IS_MAC)
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+@@ -604,6 +604,9 @@ bool PathProvider(int key, base::FilePath* result) {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/etc/opt/chrome/native-messaging-hosts"));
++#elif BUILDFLAG(IS_FREEBSD)
++ cur = base::FilePath(FILE_PATH_LITERAL(
++ "/usr/local/etc/chromium/native-messaging-hosts"));
+ #else
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/etc/chromium/native-messaging-hosts"));
diff --git a/devel/electron28/files/patch-chrome_common_chrome__paths.h b/devel/electron28/files/patch-chrome_common_chrome__paths.h
new file mode 100644
index 000000000000..3ebd94100d2f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__paths.h
@@ -0,0 +1,29 @@
+--- chrome/common/chrome_paths.h.orig 2023-10-19 19:58:08 UTC
++++ chrome/common/chrome_paths.h
+@@ -57,7 +57,7 @@ enum {
+ #if BUILDFLAG(IS_CHROMEOS_ASH) || \
+ ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
+ BUILDFLAG(CHROMIUM_BRANDING)) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ DIR_USER_EXTERNAL_EXTENSIONS, // Directory for per-user external extensions
+ // on Chrome Mac and Chromium Linux.
+ // On Chrome OS, this path is used for OEM
+@@ -65,7 +65,7 @@ enum {
+ // create it.
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ DIR_STANDALONE_EXTERNAL_EXTENSIONS, // Directory for 'per-extension'
+ // definition manifest files that
+ // describe extensions which are to be
+@@ -123,7 +123,7 @@ enum {
+ // must be cleared on device reboot.
+
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ DIR_NATIVE_MESSAGING, // System directory where native messaging host
+ // manifest files are stored.
+ DIR_USER_NATIVE_MESSAGING, // Directory with Native Messaging Hosts
diff --git a/devel/electron28/files/patch-chrome_common_chrome__paths__internal.h b/devel/electron28/files/patch-chrome_common_chrome__paths__internal.h
new file mode 100644
index 000000000000..85641ebae453
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__paths__internal.h
@@ -0,0 +1,11 @@
+--- chrome/common/chrome_paths_internal.h.orig 2023-05-25 00:41:46 UTC
++++ chrome/common/chrome_paths_internal.h
+@@ -43,7 +43,7 @@ void GetUserCacheDirectory(const base::FilePath& profi
+ // Get the path to the user's documents directory.
+ bool GetUserDocumentsDirectory(base::FilePath* result);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Gets the path to a safe default download directory for a user.
+ bool GetUserDownloadsDirectorySafe(base::FilePath* result);
+ #endif
diff --git a/devel/electron28/files/patch-chrome_common_chrome__switches.cc b/devel/electron28/files/patch-chrome_common_chrome__switches.cc
new file mode 100644
index 000000000000..6553093476e7
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__switches.cc
@@ -0,0 +1,19 @@
+--- chrome/common/chrome_switches.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/chrome_switches.cc
+@@ -857,14 +857,14 @@ const char kAllowNaClSocketAPI[] = "allow-nacl-socket-
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kEnableNewAppMenuIcon[] = "enable-new-app-menu-icon";
+
+ // Causes the browser to launch directly in guest mode.
+ const char kGuest[] = "guest";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Writes open and installed web apps for each profile to the specified file
+ // without launching a new browser window or tab. Pass a absolute file path to
+ // specify where to output the information. Can be used together with optional
diff --git a/devel/electron28/files/patch-chrome_common_chrome__switches.h b/devel/electron28/files/patch-chrome_common_chrome__switches.h
new file mode 100644
index 000000000000..212a944f2c7c
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_chrome__switches.h
@@ -0,0 +1,17 @@
+--- chrome/common/chrome_switches.h.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/chrome_switches.h
+@@ -272,12 +272,12 @@ extern const char kAllowNaClSocketAPI[];
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ extern const char kEnableNewAppMenuIcon[];
+ extern const char kGuest[];
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ extern const char kListApps[];
+ extern const char kProfileBaseName[];
+ extern const char kProfileManagementAttributes[];
diff --git a/devel/electron28/files/patch-chrome_common_crash__keys.cc b/devel/electron28/files/patch-chrome_common_crash__keys.cc
new file mode 100644
index 000000000000..3abbc834a220
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_crash__keys.cc
@@ -0,0 +1,23 @@
+--- chrome/common/crash_keys.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/crash_keys.cc
+@@ -32,20 +32,10 @@ namespace {
+ namespace {
+
+ // A convenient wrapper around a crash key and its name.
+-//
+-// The CrashKey contract requires that CrashKeyStrings are never
+-// moved, copied, or deleted (see
+-// third_party/crashpad/crashpad/client/annotation.h); since this class holds
+-// a CrashKeyString, it likewise cannot be moved, copied, or deleted.
+ class CrashKeyWithName {
+ public:
+ explicit CrashKeyWithName(std::string name)
+ : name_(std::move(name)), crash_key_(name_.c_str()) {}
+- CrashKeyWithName(const CrashKeyWithName&) = delete;
+- CrashKeyWithName& operator=(const CrashKeyWithName&) = delete;
+- CrashKeyWithName(CrashKeyWithName&&) = delete;
+- CrashKeyWithName& operator=(CrashKeyWithName&&) = delete;
+- ~CrashKeyWithName() = delete;
+
+ void Clear() { crash_key_.Clear(); }
+ void Set(base::StringPiece value) { crash_key_.Set(value); }
diff --git a/devel/electron28/files/patch-chrome_common_extensions_permissions_chrome__permission__message__rules.cc b/devel/electron28/files/patch-chrome_common_extensions_permissions_chrome__permission__message__rules.cc
new file mode 100644
index 000000000000..80a2b15f15dd
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_extensions_permissions_chrome__permission__message__rules.cc
@@ -0,0 +1,11 @@
+--- chrome/common/extensions/permissions/chrome_permission_message_rules.cc.orig 2022-11-30 08:12:58 UTC
++++ chrome/common/extensions/permissions/chrome_permission_message_rules.cc
+@@ -285,7 +285,7 @@ int GetEnterpriseReportingPrivatePermissionMessageId()
+ }
+ #if BUILDFLAG(IS_WIN)
+ return IDS_EXTENSION_PROMPT_WARNING_ENTERPRISE_REPORTING_PRIVATE_ENABLED_WIN;
+-#elif BUILDFLAG(IS_LINUX) or BUILDFLAG(IS_MAC)
++#elif BUILDFLAG(IS_LINUX) or BUILDFLAG(IS_MAC) or BUILDFLAG(IS_BSD)
+ return IDS_EXTENSION_PROMPT_WARNING_ENTERPRISE_REPORTING_PRIVATE_ENABLED_LINUX_AND_MACOS;
+ #else
+ return IDS_EXTENSION_PROMPT_WARNING_ENTERPRISE_REPORTING_PRIVATE;
diff --git a/devel/electron28/files/patch-chrome_common_media_cdm__host__file__path.cc b/devel/electron28/files/patch-chrome_common_media_cdm__host__file__path.cc
new file mode 100644
index 000000000000..3b4f828a367e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_media_cdm__host__file__path.cc
@@ -0,0 +1,11 @@
+--- chrome/common/media/cdm_host_file_path.cc.orig 2023-02-01 18:43:13 UTC
++++ chrome/common/media/cdm_host_file_path.cc
+@@ -90,7 +90,7 @@ void AddCdmHostFilePaths(
+ cdm_host_file_paths->emplace_back(chrome_framework_path,
+ chrome_framework_sig_path);
+
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ base::FilePath chrome_exe_dir;
+ if (!base::PathService::Get(base::DIR_EXE, &chrome_exe_dir))
diff --git a/devel/electron28/files/patch-chrome_common_media_cdm__registration.cc b/devel/electron28/files/patch-chrome_common_media_cdm__registration.cc
new file mode 100644
index 000000000000..216f57441983
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_media_cdm__registration.cc
@@ -0,0 +1,52 @@
+--- chrome/common/media/cdm_registration.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/media/cdm_registration.cc
+@@ -26,11 +26,11 @@
+
+ #if BUILDFLAG(ENABLE_WIDEVINE)
+ #include "third_party/widevine/cdm/widevine_cdm_common.h" // nogncheck
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "base/native_library.h"
+ #include "chrome/common/chrome_paths.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/no_destructor.h"
+ #include "chrome/common/media/component_widevine_cdm_hint_file_linux.h"
+ #include "media/cdm/supported_audio_codecs.h"
+@@ -56,7 +56,7 @@ using Robustness = content::CdmInfo::Robustness;
+ #if BUILDFLAG(ENABLE_WIDEVINE)
+ #if (BUILDFLAG(BUNDLE_WIDEVINE_CDM) || \
+ BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ // Create a CdmInfo for a Widevine CDM, using |version|, |cdm_library_path|, and
+ // |capability|.
+ std::unique_ptr<content::CdmInfo> CreateWidevineCdmInfo(
+@@ -101,7 +101,7 @@ std::unique_ptr<content::CdmInfo> CreateCdmInfoFromWid
+ // BUILDFLAG(IS_CHROMEOS))
+
+ #if BUILDFLAG(BUNDLE_WIDEVINE_CDM) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ // On Linux/ChromeOS we have to preload the CDM since it uses the zygote
+ // sandbox. On Windows and Mac, the bundled CDM is handled by the component
+ // updater.
+@@ -125,7 +125,7 @@ content::CdmInfo* GetBundledWidevine() {
+ // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
+
+ #if BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ // This code checks to see if a component updated Widevine CDM can be found. If
+ // there is one and it looks valid, return the CdmInfo for that CDM. Otherwise
+ // return nullptr.
+@@ -160,7 +160,7 @@ void AddSoftwareSecureWidevine(std::vector<content::Cd
+ /*supports_sub_key_systems=*/false, kWidevineCdmDisplayName,
+ kWidevineCdmType, base::Version(), base::FilePath());
+
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION)
+ base::Version glibc_version(gnu_get_libc_version());
+ DCHECK(glibc_version.IsValid());
diff --git a/devel/electron28/files/patch-chrome_common_media_component__widevine__cdm__hint__file__linux.h b/devel/electron28/files/patch-chrome_common_media_component__widevine__cdm__hint__file__linux.h
new file mode 100644
index 000000000000..154465a50f92
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_media_component__widevine__cdm__hint__file__linux.h
@@ -0,0 +1,11 @@
+--- chrome/common/media/component_widevine_cdm_hint_file_linux.h.orig 2023-10-19 19:58:08 UTC
++++ chrome/common/media/component_widevine_cdm_hint_file_linux.h
+@@ -15,7 +15,7 @@
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ #error "This file only applies to desktop Linux and ChromeOS."
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_common_pref__names.h b/devel/electron28/files/patch-chrome_common_pref__names.h
new file mode 100644
index 000000000000..ba17980f6e46
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_pref__names.h
@@ -0,0 +1,82 @@
+--- chrome/common/pref_names.h.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/pref_names.h
+@@ -1315,7 +1315,7 @@ inline constexpr char kUseAshProxy[] = "lacros.proxy.u
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Linux specific preference on whether we should match the system theme.
+ inline constexpr char kSystemTheme[] = "extensions.theme.system_theme";
+ #endif
+@@ -1441,7 +1441,7 @@ inline constexpr char kShowUpdatePromotionInfoBar[] =
+ "browser.show_update_promotion_info_bar";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Boolean that is false if we should show window manager decorations. If
+ // true, we draw a custom chrome frame (thicker title bar and blue border).
+ inline constexpr char kUseCustomChromeFrame[] = "browser.custom_chrome_frame";
+@@ -1989,7 +1989,7 @@ inline constexpr char kDownloadDirUpgraded[] = "downlo
+ inline constexpr char kDownloadDirUpgraded[] = "download.directory_upgrade";
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ inline constexpr char kOpenPdfDownloadInSystemReader[] =
+ "download.open_pdf_in_system_reader";
+ #endif
+@@ -2407,14 +2407,14 @@ inline constexpr char kMediaCdmOriginData[] = "media.c
+ inline constexpr char kMediaCdmOriginData[] = "media.cdm.origin_data";
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // A boolean pref to determine whether or not the network service is running
+ // sandboxed.
+ inline constexpr char kNetworkServiceSandboxEnabled[] =
+ "net.network_service_sandbox";
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Records whether the user has seen an HTTP auth "negotiate" header.
+ inline constexpr char kReceivedHttpAuthNegotiateHeader[] =
+ "net.received_http_auth_negotiate_headers";
+@@ -2492,7 +2492,7 @@ inline constexpr char kBasicAuthOverHttpEnabled[] =
+ inline constexpr char kBasicAuthOverHttpEnabled[] =
+ "auth.basic_over_http_enabled";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Boolean that specifies whether OK-AS-DELEGATE flag from KDC is respected
+ // along with kAuthNegotiateDelegateAllowlist.
+ inline constexpr char kAuthNegotiateDelegateByKdcPolicy[] =
+@@ -3533,7 +3533,7 @@ inline constexpr char kSandboxExternalProtocolBlocked[
+ inline constexpr char kSandboxExternalProtocolBlocked[] =
+ "profile.sandbox_external_protocol_blocked";
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Boolean that indicates if system notifications are allowed to be used in
+ // place of Chrome notifications.
+ inline constexpr char kAllowSystemNotifications[] =
+@@ -3589,7 +3589,7 @@ inline constexpr char kChromeRootStoreEnabled[] = "chr
+ inline constexpr char kChromeRootStoreEnabled[] = "chrome_root_store_enabled";
+ #endif
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ inline constexpr char kEnforceLocalAnchorConstraintsEnabled[] =
+ "enforce_local_anchor_constraints_enabled";
+ #endif
+@@ -3903,7 +3903,7 @@ inline constexpr char kNewBaseUrlInheritanceBehaviorAl
+ inline constexpr char kNewBaseUrlInheritanceBehaviorAllowed[] =
+ "new_base_url_inheritance_behavior_allowed";
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // If this exists and is true, Chrome may run system DNS resolution out of the
+ // network process. If false, Chrome will run system DNS resolution in the
+ // network process. If non-existent, Chrome will decide where to run system DNS
diff --git a/devel/electron28/files/patch-chrome_common_url__constants.h b/devel/electron28/files/patch-chrome_common_url__constants.h
new file mode 100644
index 000000000000..4ce3cf5f2370
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_url__constants.h
@@ -0,0 +1,11 @@
+--- chrome/common/url_constants.h.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/url_constants.h
+@@ -824,7 +824,7 @@ inline constexpr char kPhoneHubPermissionLearnMoreURL[
+ "https://support.google.com/chromebook?p=multidevice";
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // "Learn more" URL for the chrome apps deprecation dialog.
+ inline constexpr char kChromeAppsDeprecationLearnMoreURL[] =
+ "https://support.google.com/chrome?p=chrome_app_deprecation";
diff --git a/devel/electron28/files/patch-chrome_common_webui__url__constants.cc b/devel/electron28/files/patch-chrome_common_webui__url__constants.cc
new file mode 100644
index 000000000000..ad89f985ed2a
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_webui__url__constants.cc
@@ -0,0 +1,68 @@
+--- chrome/common/webui_url_constants.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/webui_url_constants.cc
+@@ -512,18 +512,18 @@ const char kOsUIVersionURL[] = "os://version";
+ const char kOsUIVersionURL[] = "os://version";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kChromeUIWebUIJsErrorHost[] = "webuijserror";
+ const char kChromeUIWebUIJsErrorURL[] = "chrome://webuijserror/";
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ const char kChromeUIConnectorsInternalsHost[] = "connectors-internals";
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kChromeUIDiscardsHost[] = "discards";
+ const char kChromeUIDiscardsURL[] = "chrome://discards/";
+ #endif
+@@ -538,14 +538,14 @@ const char kChromeUILinuxProxyConfigHost[] = "linux-pr
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ const char kChromeUISandboxHost[] = "sandbox";
+ #endif
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ const char kChromeUIBrowserSwitchHost[] = "browser-switch";
+ const char kChromeUIBrowserSwitchURL[] = "chrome://browser-switch/";
+ const char kChromeUIEnterpriseProfileWelcomeHost[] =
+@@ -564,7 +564,7 @@ const char kChromeUIProfilePickerStartupQuery[] = "sta
+ const char kChromeUIProfilePickerStartupQuery[] = "startup";
+ #endif
+
+-#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ defined(TOOLKIT_VIEWS)) || \
+ defined(USE_AURA)
+ const char kChromeUITabModalConfirmDialogHost[] = "tab-modal-confirm-dialog";
+@@ -650,7 +650,7 @@ const char kCookiesSubPagePath[] = "/cookies";
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kChromeUIWebAppSettingsURL[] = "chrome://app-settings/";
+ const char kChromeUIWebAppSettingsHost[] = "app-settings";
+ #endif
+@@ -889,7 +889,7 @@ const char* const kChromeDebugURLs[] = {
+ blink::kChromeUIGpuJavaCrashURL,
+ kChromeUIJavaCrashURL,
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ kChromeUIWebUIJsErrorURL,
+ #endif
+ kChromeUIQuitURL,
diff --git a/devel/electron28/files/patch-chrome_common_webui__url__constants.h b/devel/electron28/files/patch-chrome_common_webui__url__constants.h
new file mode 100644
index 000000000000..f3b3c5a56393
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_common_webui__url__constants.h
@@ -0,0 +1,58 @@
+--- chrome/common/webui_url_constants.h.orig 2023-11-29 21:39:54 UTC
++++ chrome/common/webui_url_constants.h
+@@ -426,24 +426,24 @@ extern const char kOsUIVersionURL[];
+ extern const char kOsUIVersionURL[];
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUIWebUIJsErrorHost[];
+ extern const char kChromeUIWebUIJsErrorURL[];
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUIConnectorsInternalsHost[];
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUIDiscardsHost[];
+ extern const char kChromeUIDiscardsURL[];
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUIWebAppSettingsURL[];
+ extern const char kChromeUIWebAppSettingsHost[];
+ #endif
+@@ -458,7 +458,7 @@ extern const char kChromeUILinuxProxyConfigHost[];
+ #endif
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUISandboxHost[];
+ #endif
+
+@@ -470,7 +470,7 @@ extern const char kChromeUISearchEngineChoiceHost[];
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_BSD)
+ extern const char kChromeUIBrowserSwitchHost[];
+ extern const char kChromeUIBrowserSwitchURL[];
+ extern const char kChromeUIEnterpriseProfileWelcomeHost[];
+@@ -486,7 +486,7 @@ extern const char kChromeUIProfilePickerStartupQuery[]
+ extern const char kChromeUIProfilePickerStartupQuery[];
+ #endif
+
+-#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ defined(TOOLKIT_VIEWS)) || \
+ defined(USE_AURA)
+ extern const char kChromeUITabModalConfirmDialogHost[];
diff --git a/devel/electron28/files/patch-chrome_renderer_chrome__render__frame__observer.cc b/devel/electron28/files/patch-chrome_renderer_chrome__render__frame__observer.cc
new file mode 100644
index 000000000000..c2db0232d558
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_renderer_chrome__render__frame__observer.cc
@@ -0,0 +1,11 @@
+--- chrome/renderer/chrome_render_frame_observer.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/renderer/chrome_render_frame_observer.cc
+@@ -349,7 +349,7 @@ void ChromeRenderFrameObserver::OnDestruct() {
+
+ void ChromeRenderFrameObserver::DraggableRegionsChanged() {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Only the main frame is allowed to control draggable regions, to avoid other
+ // frames manipulate the regions in the browser process.
+ if (!render_frame()->IsMainFrame())
diff --git a/devel/electron28/files/patch-chrome_services_file__util_public_mojom_safe__document__analyzer__mojom__traits.h b/devel/electron28/files/patch-chrome_services_file__util_public_mojom_safe__document__analyzer__mojom__traits.h
new file mode 100644
index 000000000000..b9fac547b013
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_services_file__util_public_mojom_safe__document__analyzer__mojom__traits.h
@@ -0,0 +1,11 @@
+--- chrome/services/file_util/public/mojom/safe_document_analyzer_mojom_traits.h.orig 2023-03-30 00:33:45 UTC
++++ chrome/services/file_util/public/mojom/safe_document_analyzer_mojom_traits.h
+@@ -16,7 +16,7 @@
+ #include "mojo/public/cpp/bindings/struct_traits.h"
+
+ #if !BUILDFLAG(FULL_SAFE_BROWSING) || \
+- (!BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_WIN))
++ (!BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_BSD))
+ #error FULL_SAFE_BROWSING should be set and either IS_LINUX or IS_WIN set.
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_services_printing_print__backend__service__impl.cc b/devel/electron28/files/patch-chrome_services_printing_print__backend__service__impl.cc
new file mode 100644
index 000000000000..2cf82de940e4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_services_printing_print__backend__service__impl.cc
@@ -0,0 +1,47 @@
+--- chrome/services/printing/print_backend_service_impl.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/services/printing/print_backend_service_impl.cc
+@@ -46,7 +46,7 @@
+ #include "printing/backend/cups_connection_pool.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/no_destructor.h"
+ #include "ui/linux/linux_ui.h"
+ #include "ui/linux/linux_ui_delegate_stub.h"
+@@ -73,7 +73,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void InstantiateLinuxUiDelegate() {
+ // TODO(crbug.com/809738) Until a real UI can be used in a utility process,
+ // need to use the stub version.
+@@ -82,7 +82,7 @@ scoped_refptr<base::SequencedTaskRunner> GetPrintingTa
+ #endif
+
+ scoped_refptr<base::SequencedTaskRunner> GetPrintingTaskRunner() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Use task runner associated with equivalent of UI thread. Needed for calls
+ // made through `PrintDialogLinuxInterface` to properly execute.
+ CHECK(base::SequencedTaskRunner::HasCurrentDefault());
+@@ -460,7 +460,7 @@ void PrintBackendServiceImpl::Init(
+ // `InitCommon()`.
+ InitializeProcessForPrinting();
+ print_backend_ = PrintBackend::CreateInstance(locale);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Test framework already initializes the UI, so this should not go in
+ // `InitCommon()`. Additionally, low-level Linux UI is not needed when tests
+ // are using `TestPrintingContext`.
+@@ -681,7 +681,7 @@ void PrintBackendServiceImpl::UpdatePrintSettings(
+ crash_keys_ = std::make_unique<crash_keys::ScopedPrinterInfo>(
+ print_backend_->GetPrinterDriverInfo(*printer_name));
+
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_CUPS)
+ // Try to fill in advanced settings based upon basic info options.
+ PrinterBasicInfo basic_info;
+ if (print_backend_->GetPrinterBasicInfo(*printer_name, &basic_info) ==
diff --git a/devel/electron28/files/patch-chrome_services_speech_audio__source__fetcher__impl.cc b/devel/electron28/files/patch-chrome_services_speech_audio__source__fetcher__impl.cc
new file mode 100644
index 000000000000..072df86627ca
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_services_speech_audio__source__fetcher__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/services/speech/audio_source_fetcher_impl.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/services/speech/audio_source_fetcher_impl.cc
+@@ -129,7 +129,7 @@ void AudioSourceFetcherImpl::Start(
+
+ // TODO(crbug.com/1185978): Check implementation / sandbox policy on Mac and
+ // Windows.
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ is_started_ = true;
+ // Initialize the AudioCapturerSource with |this| as the CaptureCallback,
+ // get the parameters for the device ID, then start audio capture.
diff --git a/devel/electron28/files/patch-chrome_test_BUILD.gn b/devel/electron28/files/patch-chrome_test_BUILD.gn
new file mode 100644
index 000000000000..4ec5e2d14ebf
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_BUILD.gn
@@ -0,0 +1,11 @@
+--- chrome/test/BUILD.gn.orig 2023-12-24 08:42:05 UTC
++++ chrome/test/BUILD.gn
+@@ -11247,7 +11247,7 @@ test("chrome_app_unittests") {
+ "//components/heap_profiling/in_process",
+ "//components/safe_browsing:buildflags",
+ ]
+- if (!is_fuchsia && !is_mac) {
++ if (!is_fuchsia && !is_mac && !is_bsd) {
+ deps += [ "//third_party/breakpad:client" ]
+ }
+ if (is_android) {
diff --git a/devel/electron28/files/patch-chrome_test_chromedriver_capabilities.cc b/devel/electron28/files/patch-chrome_test_chromedriver_capabilities.cc
new file mode 100644
index 000000000000..ed3452d44f0e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_chromedriver_capabilities.cc
@@ -0,0 +1,26 @@
+--- chrome/test/chromedriver/capabilities.cc.orig 2023-10-19 19:58:08 UTC
++++ chrome/test/chromedriver/capabilities.cc
+@@ -346,7 +346,11 @@ Status ParseMobileEmulation(const base::Value& option,
+ "'version' field of type string");
+ }
+
++#if defined(__clang__) && (__clang_major__ >= 15)
+ brands.emplace_back(*brand, *version);
++#else
++ brands.emplace_back() = {*brand, *version};
++#endif
+ }
+
+ client_hints.brands = std::move(brands);
+@@ -384,7 +388,11 @@ Status ParseMobileEmulation(const base::Value& option,
+ "a 'version' field of type string");
+ }
+
++#if defined(__clang__) && (__clang_major__ >= 15)
+ full_version_list.emplace_back(*brand, *version);
++#else
++ full_version_list.emplace_back() = {*brand, *version};
++#endif
+ }
+
+ client_hints.full_version_list = std::move(full_version_list);
diff --git a/devel/electron28/files/patch-chrome_test_chromedriver_chrome__launcher.cc b/devel/electron28/files/patch-chrome_test_chromedriver_chrome__launcher.cc
new file mode 100644
index 000000000000..4f8af7b9f114
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_chromedriver_chrome__launcher.cc
@@ -0,0 +1,10 @@
+--- chrome/test/chromedriver/chrome_launcher.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/test/chromedriver/chrome_launcher.cc
+@@ -73,6 +73,7 @@
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
++#include <sys/wait.h>
+ #include <unistd.h>
+ #elif BUILDFLAG(IS_WIN)
+ #include <windows.h>
diff --git a/devel/electron28/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc b/devel/electron28/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
new file mode 100644
index 000000000000..10e112a6408f
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
@@ -0,0 +1,29 @@
+--- chrome/test/chromedriver/chrome/chrome_finder.cc.orig 2023-11-29 21:39:54 UTC
++++ chrome/test/chromedriver/chrome/chrome_finder.cc
+@@ -58,7 +58,7 @@ void GetApplicationDirs(std::vector<base::FilePath>* l
+ installation_locations[i].Append(L"Chromium\\Application"));
+ }
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void GetApplicationDirs(std::vector<base::FilePath>* locations) {
+ // TODO: Respect users' PATH variables.
+ // Until then, we use an approximation of the most common defaults.
+@@ -125,7 +125,7 @@ std::vector<base::FilePath> GetChromeProgramNames() {
+ chrome::kGoogleChromeForTestingBrowserProcessExecutablePath),
+ base::FilePath(chrome::kGoogleChromeBrowserProcessExecutablePath),
+ base::FilePath(chrome::kChromiumBrowserProcessExecutablePath),
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FilePath(chrome::kBrowserProcessExecutablePath),
+ base::FilePath("chrome"), // Chrome for Testing or Google Chrome
+ base::FilePath("google-chrome"), base::FilePath("chromium"),
+@@ -141,7 +141,7 @@ std::vector<base::FilePath> GetHeadlessShellProgramNam
+ return {
+ #if BUILDFLAG(IS_WIN)
+ base::FilePath(FILE_PATH_LITERAL("chrome-headless-shell.exe")),
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FilePath("chrome-headless-shell"),
+ #else
+ // it will compile but won't work on other OSes
diff --git a/devel/electron28/files/patch-chrome_test_chromedriver_key__converter__unittest.cc b/devel/electron28/files/patch-chrome_test_chromedriver_key__converter__unittest.cc
new file mode 100644
index 000000000000..656e8e79e233
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_chromedriver_key__converter__unittest.cc
@@ -0,0 +1,20 @@
+--- chrome/test/chromedriver/key_converter_unittest.cc.orig 2022-03-25 21:59:56 UTC
++++ chrome/test/chromedriver/key_converter_unittest.cc
+@@ -246,7 +246,7 @@ TEST(KeyConverter, ToggleModifiers) {
+ CheckEventsReleaseModifiers(keys, key_events);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Fails on bots: crbug.com/174962
+ #define MAYBE_AllEnglishKeyboardSymbols DISABLED_AllEnglishKeyboardSymbols
+ #else
+@@ -303,7 +303,7 @@ TEST(KeyConverter, AllEnglishKeyboardTextChars) {
+ TEST(KeyConverter, AllSpecialWebDriverKeysOnEnglishKeyboard) {
+ ui::ScopedKeyboardLayout keyboard_layout(ui::KEYBOARD_LAYOUT_ENGLISH_US);
+ const char kTextForKeys[] = {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ 0, 0, 0, 0, '\t', 0, '\r', '\r', 0, 0, 0, 0, 0,
+ #else
+ 0, 0, 0, 0, 0, 0, '\r', '\r', 0, 0, 0, 0, 0,
diff --git a/devel/electron28/files/patch-chrome_test_chromedriver_keycode__text__conversion__unittest.cc b/devel/electron28/files/patch-chrome_test_chromedriver_keycode__text__conversion__unittest.cc
new file mode 100644
index 000000000000..41305b1e68f5
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_test_chromedriver_keycode__text__conversion__unittest.cc
@@ -0,0 +1,20 @@
+--- chrome/test/chromedriver/keycode_text_conversion_unittest.cc.orig 2022-09-24 10:57:32 UTC
++++ chrome/test/chromedriver/keycode_text_conversion_unittest.cc
+@@ -67,7 +67,7 @@ std::string ConvertKeyCodeToTextNoError(ui::KeyboardCo
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Fails on bots: crbug.com/174962
+ #define MAYBE_KeyCodeToText DISABLED_KeyCodeToText
+ #else
+@@ -104,7 +104,7 @@ TEST(KeycodeTextConversionTest, MAYBE_KeyCodeToText) {
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Fails on bots: crbug.com/174962
+ #define MAYBE_CharToKeyCode DISABLED_CharToKeyCode
+ #else
diff --git a/devel/electron28/files/patch-chrome_updater_configurator.cc b/devel/electron28/files/patch-chrome_updater_configurator.cc
new file mode 100644
index 000000000000..1a595f0122b4
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_updater_configurator.cc
@@ -0,0 +1,11 @@
+--- chrome/updater/configurator.cc.orig 2023-08-10 01:48:39 UTC
++++ chrome/updater/configurator.cc
+@@ -63,7 +63,7 @@ Configurator::Configurator(scoped_refptr<UpdaterPrefs>
+ return absl::nullopt;
+ #endif
+ }()) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux creating the NetworkFetcherFactory requires performing blocking IO
+ // to load an external library. This should be done when the configurator is
+ // created.
diff --git a/devel/electron28/files/patch-chrome_updater_util_posix__util.cc b/devel/electron28/files/patch-chrome_updater_util_posix__util.cc
new file mode 100644
index 000000000000..05e4f3184a4e
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_updater_util_posix__util.cc
@@ -0,0 +1,11 @@
+--- chrome/updater/util/posix_util.cc.orig 2023-05-25 00:41:49 UTC
++++ chrome/updater/util/posix_util.cc
+@@ -16,7 +16,7 @@
+ #include "chrome/updater/updater_branding.h"
+ #include "chrome/updater/util/util.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/updater/util/linux_util.h"
+ #endif
+
diff --git a/devel/electron28/files/patch-chrome_utility_services.cc b/devel/electron28/files/patch-chrome_utility_services.cc
new file mode 100644
index 000000000000..343b4a96ec38
--- /dev/null
+++ b/devel/electron28/files/patch-chrome_utility_services.cc
@@ -0,0 +1,56 @@
+--- chrome/utility/services.cc.orig 2023-11-29 21:39:56 UTC
++++ chrome/utility/services.cc
+@@ -56,7 +56,7 @@
+ #include "chrome/services/system_signals/mac/mac_system_signals_service.h"
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/services/system_signals/linux/linux_system_signals_service.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -82,7 +82,7 @@
+ #include "chrome/services/file_util/file_util_service.h" // nogncheck
+ #endif
+
+-#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN))
++#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD))
+ #include "chrome/services/file_util/document_analysis_service.h" // nogncheck
+ #endif
+
+@@ -218,7 +218,7 @@ auto RunMacNotificationService(
+ }
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto RunSystemSignalsService(
+ mojo::PendingReceiver<device_signals::mojom::SystemSignalsService>
+ receiver) {
+@@ -278,7 +278,7 @@ auto RunCupsIppParser(
+ }
+ #endif
+
+-#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN))
++#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD))
+ auto RunDocumentAnalysis(
+ mojo::PendingReceiver<chrome::mojom::DocumentAnalysisService> receiver) {
+ return std::make_unique<DocumentAnalysisService>(std::move(receiver));
+@@ -466,7 +466,7 @@ void RegisterMainThreadServices(mojo::ServiceFactory&
+ services.Add(RunWindowsIconReader);
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ services.Add(RunSystemSignalsService);
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+@@ -482,7 +482,7 @@ void RegisterMainThreadServices(mojo::ServiceFactory&
+ services.Add(RunFileUtil);
+ #endif
+
+-#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN))
++#if BUILDFLAG(FULL_SAFE_BROWSING) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD))
+ services.Add(RunDocumentAnalysis);
+ #endif
+
diff --git a/devel/electron28/files/patch-chromecast_browser_cast__browser__main__parts.cc b/devel/electron28/files/patch-chromecast_browser_cast__browser__main__parts.cc
new file mode 100644
index 000000000000..24cd19dc3d80
--- /dev/null
+++ b/devel/electron28/files/patch-chromecast_browser_cast__browser__main__parts.cc
@@ -0,0 +1,38 @@
+--- chromecast/browser/cast_browser_main_parts.cc.orig 2023-08-10 01:48:39 UTC
++++ chromecast/browser/cast_browser_main_parts.cc
+@@ -90,7 +90,7 @@
+ #include "ui/base/ui_base_switches.h"
+ #include "ui/gl/gl_switches.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <fontconfig/fontconfig.h>
+ #include <signal.h>
+ #include <sys/prctl.h>
+@@ -263,7 +263,7 @@ class CastViewsDelegate : public views::ViewsDelegate
+
+ #endif // defined(USE_AURA)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ base::FilePath GetApplicationFontsDir() {
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+@@ -309,7 +309,7 @@ const DefaultCommandLineSwitch kDefaultSwitches[] = {
+ {cc::switches::kDisableThreadedAnimation, ""},
+ #endif // BUILDFLAG(IS_ANDROID)
+ #endif // BUILDFLAG(IS_CAST_AUDIO_ONLY)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if defined(ARCH_CPU_X86_FAMILY)
+ // This is needed for now to enable the x11 Ozone platform to work with
+ // current Linux/NVidia OpenGL drivers.
+@@ -479,7 +479,7 @@ void CastBrowserMainParts::ToolkitInitialized() {
+ views_delegate_ = std::make_unique<CastViewsDelegate>();
+ #endif // defined(USE_AURA)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FilePath dir_font = GetApplicationFontsDir();
+ const FcChar8* dir_font_char8 =
+ reinterpret_cast<const FcChar8*>(dir_font.value().data());
diff --git a/devel/electron28/files/patch-chromecast_browser_cast__content__browser__client.cc b/devel/electron28/files/patch-chromecast_browser_cast__content__browser__client.cc
new file mode 100644
index 000000000000..5d7494c9e32c
--- /dev/null
+++ b/devel/electron28/files/patch-chromecast_browser_cast__content__browser__client.cc
@@ -0,0 +1,11 @@
+--- chromecast/browser/cast_content_browser_client.cc.orig 2023-11-29 21:39:56 UTC
++++ chromecast/browser/cast_content_browser_client.cc
+@@ -435,7 +435,7 @@ void CastContentBrowserClient::AppendExtraCommandLineS
+ switches::kAudioOutputChannels));
+ }
+ } else if (process_type == switches::kGpuProcess) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Necessary for accelerated 2d canvas. By default on Linux, Chromium
+ // assumes GLES2 contexts can be lost to a power-save mode, which breaks GPU
+ // canvas apps.
diff --git a/devel/electron28/files/patch-chromecast_media_base_default__monotonic__clock.cc b/devel/electron28/files/patch-chromecast_media_base_default__monotonic__clock.cc
new file mode 100644
index 000000000000..effe33ff128d
--- /dev/null
+++ b/devel/electron28/files/patch-chromecast_media_base_default__monotonic__clock.cc
@@ -0,0 +1,20 @@
+--- chromecast/media/base/default_monotonic_clock.cc.orig 2022-02-28 16:54:41 UTC
++++ chromecast/media/base/default_monotonic_clock.cc
+@@ -11,7 +11,7 @@
+ #include "base/time/time.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "chromecast/media/base/buildflags.h"
+ #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS)
+@@ -28,7 +28,7 @@ std::unique_ptr<MonotonicClock> MonotonicClock::Create
+ return std::make_unique<DefaultMonotonicClock>();
+ }
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ int64_t MonotonicClockNow() {
+ timespec now = {0, 0};
+ #if BUILDFLAG(MEDIA_CLOCK_MONOTONIC_RAW)
diff --git a/devel/electron28/files/patch-components_autofill__payments__strings.grdp b/devel/electron28/files/patch-components_autofill__payments__strings.grdp
new file mode 100644
index 000000000000..c306863ce879
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill__payments__strings.grdp
@@ -0,0 +1,11 @@
+--- components/autofill_payments_strings.grdp.orig 2023-11-29 21:39:57 UTC
++++ components/autofill_payments_strings.grdp
+@@ -134,7 +134,7 @@
+ <message name="IDS_AUTOFILL_FIX_FLOW_PROMPT_SAVE_CARD_LABEL" desc="Text to show on the button to save the card to Google when the fix flow dialog is shown after the Autofill save card prompt." formatter_data="android_java">
+ Save card
+ </message>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <then>
+ <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD" desc="Title text for the Autofill save card prompt when the card is to be saved by uploading it to Google Payments and also saved locally. The prompt is a bubble.">
+ Do you want to save this card in your Google Account?
diff --git a/devel/electron28/files/patch-components_autofill_core_browser_data__model_autofill__i18n__api.h b/devel/electron28/files/patch-components_autofill_core_browser_data__model_autofill__i18n__api.h
new file mode 100644
index 000000000000..c401b5855fb3
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill_core_browser_data__model_autofill__i18n__api.h
@@ -0,0 +1,16 @@
+--- components/autofill/core/browser/data_model/autofill_i18n_api.h.orig 2023-11-29 21:39:57 UTC
++++ components/autofill/core/browser/data_model/autofill_i18n_api.h
+@@ -15,9 +15,13 @@ namespace autofill::i18n_model_definition {
+ // Country code that represents autofill's legacy address hierarchy model as
+ // stored `kAutofillModelRules`. As a workaround for GCC we declare the
+ // std::string constexpr first.
++// XXX
++#if 0
+ constexpr inline std::string kLegacyHierarchyCountryCodeString{"XX"};
+ constexpr AddressCountryCode kLegacyHierarchyCountryCode =
+ AddressCountryCode(kLegacyHierarchyCountryCodeString);
++#endif
++inline AddressCountryCode kLegacyHierarchyCountryCode = AddressCountryCode("XX");
+
+ // Creates an instance of the address hierarchy model corresponding to the
+ // provided country. All the nodes have empty values, except for the country
diff --git a/devel/electron28/files/patch-components_autofill_core_browser_payments_iban__save__manager.cc b/devel/electron28/files/patch-components_autofill_core_browser_payments_iban__save__manager.cc
new file mode 100644
index 000000000000..036d1f444101
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill_core_browser_payments_iban__save__manager.cc
@@ -0,0 +1,14 @@
+--- components/autofill/core/browser/payments/iban_save_manager.cc.orig 2023-11-29 21:39:57 UTC
++++ components/autofill/core/browser/payments/iban_save_manager.cc
+@@ -123,7 +123,11 @@ bool IbanSaveManager::ShouldOfferUploadSave(
+
+ // Offer server save for this IBAN if it doesn't already match an existing
+ // server IBAN.
++#if (_LIBCPP_VERSION >= 160000)
+ return std::ranges::none_of(
++#else
++ return base::ranges::none_of(
++#endif
+ personal_data_manager_->GetServerIbans(),
+ [&iban_import_candidate](const auto& iban) {
+ return iban->MatchesPrefixSuffixAndLength(iban_import_candidate);
diff --git a/devel/electron28/files/patch-components_autofill_core_browser_personal__data__manager.cc b/devel/electron28/files/patch-components_autofill_core_browser_personal__data__manager.cc
new file mode 100644
index 000000000000..a34036e74bdd
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill_core_browser_personal__data__manager.cc
@@ -0,0 +1,12 @@
+--- components/autofill/core/browser/personal_data_manager.cc.orig 2023-11-29 21:39:57 UTC
++++ components/autofill/core/browser/personal_data_manager.cc
+@@ -2397,7 +2397,8 @@ bool PersonalDataManager::ShouldShowCardsFromAccountOp
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA) || \
++ BUILDFLAG(IS_BSD)
+ // This option should only be shown for users that have not enabled the Sync
+ // Feature and that have server credit cards available.
+ // TODO(crbug.com/1462552): Simplify once ConsentLevel::kSync and
diff --git a/devel/electron28/files/patch-components_autofill_core_common_autofill__payments__features.cc b/devel/electron28/files/patch-components_autofill_core_common_autofill__payments__features.cc
new file mode 100644
index 000000000000..267dae43ce28
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill_core_common_autofill__payments__features.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/common/autofill_payments_features.cc.orig 2023-11-29 21:39:57 UTC
++++ components/autofill/core/common/autofill_payments_features.cc
+@@ -261,7 +261,7 @@ bool ShouldShowImprovedUserConsentForCreditCardSave()
+ bool ShouldShowImprovedUserConsentForCreditCardSave() {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ // The new user consent UI is fully launched on MacOS, Windows and Linux.
+ return true;
diff --git a/devel/electron28/files/patch-components_autofill_core_common_autofill__util.cc b/devel/electron28/files/patch-components_autofill_core_common_autofill__util.cc
new file mode 100644
index 000000000000..0ef991f59486
--- /dev/null
+++ b/devel/electron28/files/patch-components_autofill_core_common_autofill__util.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/common/autofill_util.cc.orig 2023-11-29 21:39:57 UTC
++++ components/autofill/core/common/autofill_util.cc
+@@ -207,7 +207,7 @@ bool ShouldAutoselectFirstSuggestionOnArrowDown() {
+
+ bool ShouldAutoselectFirstSuggestionOnArrowDown() {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-components_commerce__strings.grdp b/devel/electron28/files/patch-components_commerce__strings.grdp
new file mode 100644
index 000000000000..368d61f9d498
--- /dev/null
+++ b/devel/electron28/files/patch-components_commerce__strings.grdp
@@ -0,0 +1,11 @@
+--- components/commerce_strings.grdp.orig 2023-11-29 21:39:57 UTC
++++ components/commerce_strings.grdp
+@@ -304,7 +304,7 @@
+ <message name="IDS_PRICE_HISTORY_DESCRIPTION" desc="The description of the Price History section in the Shopping Insights side panel explaining how the prices are gathered.">
+ Typical prices are based on stores across the web over the past 90 days.
+ </message>
+- <if expr="is_win or is_linux">
++ <if expr="is_win or is_posix">
+ <then>
+ <message name="IDS_PRICE_HISTORY_GRAPH_ACCESSIBILITY" desc="Accessibility string for the price history graph indicating how users can review the price changes on the graph.">
+ Browse mode, you can change to Forms mode to use the left/right arrow to review price changes on the graph
diff --git a/devel/electron28/files/patch-components_commerce_core_commerce__feature__list.cc b/devel/electron28/files/patch-components_commerce_core_commerce__feature__list.cc
new file mode 100644
index 000000000000..dfe9d9d1b3f0
--- /dev/null
+++ b/devel/electron28/files/patch-components_commerce_core_commerce__feature__list.cc
@@ -0,0 +1,11 @@
+--- components/commerce/core/commerce_feature_list.cc.orig 2023-11-29 21:39:57 UTC
++++ components/commerce/core/commerce_feature_list.cc
+@@ -225,7 +225,7 @@ BASE_FEATURE(kShoppingList, "ShoppingList", base::FEAT
+
+ BASE_FEATURE(kShoppingList, "ShoppingList", base::FEATURE_DISABLED_BY_DEFAULT);
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_IOS)
++ BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kShoppingListRegionLaunched,
+ "ShoppingListRegionLaunched",
+ base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/devel/electron28/files/patch-components_components__chromium__strings.grd b/devel/electron28/files/patch-components_components__chromium__strings.grd
new file mode 100644
index 000000000000..3fd6d8fe54a4
--- /dev/null
+++ b/devel/electron28/files/patch-components_components__chromium__strings.grd
@@ -0,0 +1,11 @@
+--- components/components_chromium_strings.grd.orig 2023-08-10 01:48:40 UTC
++++ components/components_chromium_strings.grd
+@@ -226,7 +226,7 @@
+ </message>
+ </if>
+ <!-- The ChromeOS version of this string is defined in //components/error_page_strings.grdp. -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="Linux instructions for disabling use of a proxy server.">
+ Go to
+ the Chromium menu &gt;
diff --git a/devel/electron28/files/patch-components_components__google__chrome__strings.grd b/devel/electron28/files/patch-components_components__google__chrome__strings.grd
new file mode 100644
index 000000000000..2ce4926caad6
--- /dev/null
+++ b/devel/electron28/files/patch-components_components__google__chrome__strings.grd
@@ -0,0 +1,11 @@
+--- components/components_google_chrome_strings.grd.orig 2023-08-10 01:48:40 UTC
++++ components/components_google_chrome_strings.grd
+@@ -226,7 +226,7 @@
+ </message>
+ </if>
+ <!-- The ChromeOS version of this string is defined in //components/error_page_strings.grdp. -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="Linux instructions for disabling use of a proxy server.">
+ Go to
+ the Chrome menu &gt;
diff --git a/devel/electron28/files/patch-components_content__settings_core_browser_website__settings__registry.cc b/devel/electron28/files/patch-components_content__settings_core_browser_website__settings__registry.cc
new file mode 100644
index 000000000000..ec6aa3e29ca0
--- /dev/null
+++ b/devel/electron28/files/patch-components_content__settings_core_browser_website__settings__registry.cc
@@ -0,0 +1,11 @@
+--- components/content_settings/core/browser/website_settings_registry.cc.orig 2022-02-28 16:54:41 UTC
++++ components/content_settings/core/browser/website_settings_registry.cc
+@@ -66,7 +66,7 @@ const WebsiteSettingsInfo* WebsiteSettingsRegistry::Re
+ #if BUILDFLAG(IS_WIN)
+ if (!(platform & PLATFORM_WINDOWS))
+ return nullptr;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!(platform & PLATFORM_LINUX))
+ return nullptr;
+ #elif BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-components_cookie__config_cookie__store__util.cc b/devel/electron28/files/patch-components_cookie__config_cookie__store__util.cc
new file mode 100644
index 000000000000..d11bc58134db
--- /dev/null
+++ b/devel/electron28/files/patch-components_cookie__config_cookie__store__util.cc
@@ -0,0 +1,11 @@
+--- components/cookie_config/cookie_store_util.cc.orig 2022-02-28 16:54:41 UTC
++++ components/cookie_config/cookie_store_util.cc
+@@ -12,7 +12,7 @@
+ namespace cookie_config {
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ namespace {
+
+ // Use the operating system's mechanisms to encrypt cookies before writing
diff --git a/devel/electron28/files/patch-components_crash_core_app_BUILD.gn b/devel/electron28/files/patch-components_crash_core_app_BUILD.gn
new file mode 100644
index 000000000000..d6a22afcd0e4
--- /dev/null
+++ b/devel/electron28/files/patch-components_crash_core_app_BUILD.gn
@@ -0,0 +1,43 @@
+--- components/crash/core/app/BUILD.gn.orig 2023-11-29 21:39:57 UTC
++++ components/crash/core/app/BUILD.gn
+@@ -76,7 +76,7 @@ static_library("app") {
+ "crashpad.h",
+ ]
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [ "crashpad_linux.cc" ]
+ }
+
+@@ -89,6 +89,10 @@ static_library("app") {
+ ]
+ }
+
++ if (is_bsd) {
++ sources -= [ "crashpad.cc" ]
++ }
++
+ defines = [ "CRASH_IMPLEMENTATION" ]
+
+ public_deps = [ ":lib" ]
+@@ -117,7 +121,7 @@ static_library("app") {
+ libs = [ "log" ]
+ }
+
+- if (is_android || is_linux || is_chromeos) {
++ if ((is_android || is_linux || is_chromeos) && !is_bsd) {
+ deps += [
+ "//base:base_static",
+ "//components/crash/core/common",
+@@ -245,11 +249,6 @@ if (is_mac || is_android || is_linux || is_chromeos) {
+ # define custom UserStreamDataSources.
+ executable("chrome_crashpad_handler") {
+ sources = [ "chrome_crashpad_handler.cc" ]
+-
+- deps = [
+- ":crashpad_handler_main",
+- "//third_party/crashpad/crashpad/handler",
+- ]
+
+ if (is_mac && (is_component_build || is_asan)) {
+ ldflags = [
diff --git a/devel/electron28/files/patch-components_crash_core_app_chrome__crashpad__handler.cc b/devel/electron28/files/patch-components_crash_core_app_chrome__crashpad__handler.cc
new file mode 100644
index 000000000000..a9adae723bc6
--- /dev/null
+++ b/devel/electron28/files/patch-components_crash_core_app_chrome__crashpad__handler.cc
@@ -0,0 +1,12 @@
+--- components/crash/core/app/chrome_crashpad_handler.cc.orig 2022-02-07 13:39:41 UTC
++++ components/crash/core/app/chrome_crashpad_handler.cc
+@@ -6,5 +6,9 @@
+ extern "C" int CrashpadHandlerMain(int argc, char* argv[]);
+
+ int main(int argc, char* argv[]) {
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++ return -1;
++#else
+ return CrashpadHandlerMain(argc, argv);
++#endif
+ }
diff --git a/devel/electron28/files/patch-components_crash_core_browser_crash__upload__list__crashpad.cc b/devel/electron28/files/patch-components_crash_core_browser_crash__upload__list__crashpad.cc
new file mode 100644
index 000000000000..d4a1ed1d7daf
--- /dev/null
+++ b/devel/electron28/files/patch-components_crash_core_browser_crash__upload__list__crashpad.cc
@@ -0,0 +1,26 @@
+--- components/crash/core/browser/crash_upload_list_crashpad.cc.orig 2023-10-19 19:58:18 UTC
++++ components/crash/core/browser/crash_upload_list_crashpad.cc
+@@ -38,7 +38,9 @@ CrashUploadListCrashpad::~CrashUploadListCrashpad() =
+ std::vector<std::unique_ptr<UploadList::UploadInfo>>
+ CrashUploadListCrashpad::LoadUploadList() {
+ std::vector<crash_reporter::Report> reports;
++#if !BUILDFLAG(IS_BSD)
+ crash_reporter::GetReports(&reports);
++#endif
+
+ std::vector<std::unique_ptr<UploadInfo>> uploads;
+ for (const crash_reporter::Report& report : reports) {
+@@ -52,9 +54,13 @@ CrashUploadListCrashpad::LoadUploadList() {
+
+ void CrashUploadListCrashpad::ClearUploadList(const base::Time& begin,
+ const base::Time& end) {
++#if !BUILDFLAG(IS_BSD)
+ crash_reporter::ClearReportsBetween(begin, end);
++#endif
+ }
+
+ void CrashUploadListCrashpad::RequestSingleUpload(const std::string& local_id) {
++#if !BUILDFLAG(IS_BSD)
+ crash_reporter::RequestSingleCrashUpload(local_id);
++#endif
+ }
diff --git a/devel/electron28/files/patch-components_crash_core_common_BUILD.gn b/devel/electron28/files/patch-components_crash_core_common_BUILD.gn
new file mode 100644
index 000000000000..e10540b90e26
--- /dev/null
+++ b/devel/electron28/files/patch-components_crash_core_common_BUILD.gn
@@ -0,0 +1,11 @@
+--- components/crash/core/common/BUILD.gn.orig 2023-05-25 00:41:50 UTC
++++ components/crash/core/common/BUILD.gn
+@@ -9,7 +9,7 @@ import("//components/gwp_asan/buildflags/buildflags.gn
+
+ declare_args() {
+ # If set to true, this will stub out and disable the entire crash key system.
+- use_crash_key_stubs = is_fuchsia
++ use_crash_key_stubs = is_fuchsia || is_bsd
+ }
+
+ group("common") {
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_mock__signals__aggregator.h b/devel/electron28/files/patch-components_device__signals_core_browser_mock__signals__aggregator.h
new file mode 100644
index 000000000000..f9e075904ee8
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_mock__signals__aggregator.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/mock_signals_aggregator.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/mock_signals_aggregator.h
+@@ -17,7 +17,7 @@ class MockSignalsAggregator : public SignalsAggregator
+ MockSignalsAggregator();
+ ~MockSignalsAggregator() override;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ MOCK_METHOD(void,
+ GetSignalsForUser,
+ (const UserContext&,
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator.h b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator.h
new file mode 100644
index 000000000000..290cc0f1df04
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/signals_aggregator.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/signals_aggregator.h
+@@ -22,7 +22,7 @@ class SignalsAggregator : public KeyedService {
+
+ ~SignalsAggregator() override = default;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Will asynchronously collect signals whose names are specified in the
+ // `request` object, and will also use a `user_context` to validate that the
+ // user has permissions to the device's signals. Invokes `callback` with the
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.cc b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.cc
new file mode 100644
index 000000000000..093426c3376e
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.cc
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/signals_aggregator_impl.cc.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/signals_aggregator_impl.cc
+@@ -65,7 +65,7 @@ SignalsAggregatorImpl::SignalsAggregatorImpl(
+
+ SignalsAggregatorImpl::~SignalsAggregatorImpl() = default;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SignalsAggregatorImpl::GetSignalsForUser(
+ const UserContext& user_context,
+ const SignalsAggregationRequest& request,
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.h b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.h
new file mode 100644
index 000000000000..52958644ed30
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_signals__aggregator__impl.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/signals_aggregator_impl.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/signals_aggregator_impl.h
+@@ -29,7 +29,7 @@ class SignalsAggregatorImpl : public SignalsAggregator
+ ~SignalsAggregatorImpl() override;
+
+ // SignalsAggregator:
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void GetSignalsForUser(const UserContext& user_context,
+ const SignalsAggregationRequest& request,
+ GetSignalsCallback callback) override;
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service.h b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service.h
new file mode 100644
index 000000000000..f97fd34746cc
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/user_permission_service.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/user_permission_service.h
+@@ -57,7 +57,7 @@ class UserPermissionService : public KeyedService {
+ // missing.
+ virtual bool ShouldCollectConsent() const = 0;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Will verify whether context-aware signals can be collected
+ // on behalf of the user represented by `user_context`. Returns `kGranted` if
+ // collection is allowed.
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.cc b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.cc
new file mode 100644
index 000000000000..08d888148106
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.cc
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/user_permission_service_impl.cc.orig 2023-10-19 19:58:18 UTC
++++ components/device_signals/core/browser/user_permission_service_impl.cc
+@@ -92,7 +92,7 @@ bool UserPermissionServiceImpl::ShouldCollectConsent()
+ consent_required_by_dependent_policy;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ UserPermission UserPermissionServiceImpl::CanUserCollectSignals(
+ const UserContext& user_context) const {
+ // Return "unknown user" if no user ID was given.
diff --git a/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.h b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.h
new file mode 100644
index 000000000000..dd9f409ab719
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_browser_user__permission__service__impl.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/browser/user_permission_service_impl.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/browser/user_permission_service_impl.h
+@@ -39,7 +39,7 @@ class UserPermissionServiceImpl : public UserPermissio
+
+ // UserPermissionService:
+ bool ShouldCollectConsent() const override;
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ UserPermission CanUserCollectSignals(
+ const UserContext& user_context) const override;
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX
diff --git a/devel/electron28/files/patch-components_device__signals_core_common_signals__features.cc b/devel/electron28/files/patch-components_device__signals_core_common_signals__features.cc
new file mode 100644
index 000000000000..382881995b65
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_common_signals__features.cc
@@ -0,0 +1,11 @@
+--- components/device_signals/core/common/signals_features.cc.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/common/signals_features.cc
+@@ -46,7 +46,7 @@ bool IsNewFunctionEnabled(NewEvFunction new_ev_functio
+ }
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ // Enables the triggering of device signals consent dialog when conditions met
+ // This feature also requires UnmanagedDeviceSignalsConsentFlowEnabled policy to
+ // be enabled
diff --git a/devel/electron28/files/patch-components_device__signals_core_common_signals__features.h b/devel/electron28/files/patch-components_device__signals_core_common_signals__features.h
new file mode 100644
index 000000000000..17c6b8eba372
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_common_signals__features.h
@@ -0,0 +1,11 @@
+--- components/device_signals/core/common/signals_features.h.orig 2023-08-10 01:48:40 UTC
++++ components/device_signals/core/common/signals_features.h
+@@ -28,7 +28,7 @@ enum class NewEvFunction { kFileSystemInfo, kSettings,
+ bool IsNewFunctionEnabled(NewEvFunction new_ev_function);
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_CHROMEOS_ASH)
++ BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kDeviceSignalsConsentDialog);
+
+ // Returns true if device signals consent dialog has been enabled for
diff --git a/devel/electron28/files/patch-components_device__signals_core_system__signals_platform__delegate.cc b/devel/electron28/files/patch-components_device__signals_core_system__signals_platform__delegate.cc
new file mode 100644
index 000000000000..c5dea15ace97
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_core_system__signals_platform__delegate.cc
@@ -0,0 +1,11 @@
+--- components/device_signals/core/system_signals/platform_delegate.cc.orig 2022-09-24 10:57:32 UTC
++++ components/device_signals/core/system_signals/platform_delegate.cc
+@@ -11,7 +11,7 @@ namespace device_signals {
+
+ bool CustomFilePathComparator::operator()(const base::FilePath& a,
+ const base::FilePath& b) const {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux, the file system is case sensitive.
+ return a < b;
+ #else
diff --git a/devel/electron28/files/patch-components_device__signals_test_signals__contract.cc b/devel/electron28/files/patch-components_device__signals_test_signals__contract.cc
new file mode 100644
index 000000000000..d28129cda700
--- /dev/null
+++ b/devel/electron28/files/patch-components_device__signals_test_signals__contract.cc
@@ -0,0 +1,11 @@
+--- components/device_signals/test/signals_contract.cc.orig 2023-10-19 19:58:18 UTC
++++ components/device_signals/test/signals_contract.cc
+@@ -212,7 +212,7 @@ GetSignalsContract() {
+ base::BindRepeating(VerifyUnset, names::kCrowdStrike);
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUIDLFLAG(IS_BSD)
+ contract[names::kAllowScreenLock] =
+ base::BindRepeating(VerifyUnset, names::kAllowScreenLock);
+ contract[names::kImei] = base::BindRepeating(VerifyUnset, names::kImei);
diff --git a/devel/electron28/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc b/devel/electron28/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc
new file mode 100644
index 000000000000..eaedbb99faff
--- /dev/null
+++ b/devel/electron28/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc
@@ -0,0 +1,11 @@
+--- components/discardable_memory/service/discardable_shared_memory_manager.cc.orig 2023-11-29 21:39:57 UTC
++++ components/discardable_memory/service/discardable_shared_memory_manager.cc
+@@ -172,7 +172,7 @@ uint64_t GetDefaultMemoryLimit() {
+ // Limits the number of FDs used to 32, assuming a 4MB allocation size.
+ uint64_t max_default_memory_limit = 128 * kMegabyte;
+ #else
+- uint64_t max_default_memory_limit = 512 * kMegabyte;
++ uint64_t max_default_memory_limit = 128 * kMegabyte;
+ #endif
+
+ // Use 1/8th of discardable memory on low-end devices.
diff --git a/devel/electron28/files/patch-components_embedder__support_user__agent__utils.cc b/devel/electron28/files/patch-components_embedder__support_user__agent__utils.cc
new file mode 100644
index 000000000000..7473e72a65ca
--- /dev/null
+++ b/devel/electron28/files/patch-components_embedder__support_user__agent__utils.cc
@@ -0,0 +1,12 @@
+--- components/embedder_support/user_agent_utils.cc.orig 2023-10-19 19:58:18 UTC
++++ components/embedder_support/user_agent_utils.cc
+@@ -432,6 +432,9 @@ std::string GetPlatformForUAMetadata() {
+ # else
+ return "Chromium OS";
+ # endif
++#elif BUILDFLAG(IS_BSD)
++ // The internet is weird...
++ return "Linux";
+ #else
+ return std::string(version_info::GetOSType());
+ #endif
diff --git a/devel/electron28/files/patch-components_embedder__support_user__agent__utils__unittest.cc b/devel/electron28/files/patch-components_embedder__support_user__agent__utils__unittest.cc
new file mode 100644
index 000000000000..8651848f62ee
--- /dev/null
+++ b/devel/electron28/files/patch-components_embedder__support_user__agent__utils__unittest.cc
@@ -0,0 +1,20 @@
+--- components/embedder_support/user_agent_utils_unittest.cc.orig 2023-10-19 19:58:18 UTC
++++ components/embedder_support/user_agent_utils_unittest.cc
+@@ -84,7 +84,7 @@ const char kDesktop[] =
+ "Safari/537.36";
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::string GetMachine() {
+ struct utsname unixinfo;
+ uname(&unixinfo);
+@@ -192,7 +192,7 @@ void CheckUserAgentStringOrdering(bool mobile_device)
+ int value;
+ ASSERT_TRUE(base::StringToInt(pieces[i], &value));
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // X11; Linux x86_64
+ ASSERT_EQ(2u, pieces.size());
+ ASSERT_EQ("X11", pieces[0]);
diff --git a/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view.cc b/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view.cc
new file mode 100644
index 000000000000..9689e26829e5
--- /dev/null
+++ b/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view.cc
@@ -0,0 +1,11 @@
+--- components/eye_dropper/eye_dropper_view.cc.orig 2023-11-29 21:39:58 UTC
++++ components/eye_dropper/eye_dropper_view.cc
+@@ -196,7 +196,7 @@ EyeDropperView::EyeDropperView(gfx::NativeView parent,
+ // EyeDropper/WidgetDelegate.
+ set_owned_by_client();
+ SetPreferredSize(GetSize());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Use TYPE_MENU for Linux to ensure that the eye dropper view is displayed
+ // above the color picker.
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_MENU);
diff --git a/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view__aura.cc b/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view__aura.cc
new file mode 100644
index 000000000000..ac11bee6ffa5
--- /dev/null
+++ b/devel/electron28/files/patch-components_eye__dropper_eye__dropper__view__aura.cc
@@ -0,0 +1,11 @@
+--- components/eye_dropper/eye_dropper_view_aura.cc.orig 2023-11-29 21:39:58 UTC
++++ components/eye_dropper/eye_dropper_view_aura.cc
+@@ -129,7 +129,7 @@ void EyeDropperView::CaptureInputIfNeeded() {
+ }
+
+ void EyeDropperView::CaptureInputIfNeeded() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The eye dropper needs to capture input since it is not activated
+ // in order to avoid dismissing the color picker.
+ GetWidget()->GetNativeWindow()->SetCapture();
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_event__constants.cc b/devel/electron28/files/patch-components_feature__engagement_public_event__constants.cc
new file mode 100644
index 000000000000..e2eaf62b7d02
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_event__constants.cc
@@ -0,0 +1,11 @@
+--- components/feature_engagement/public/event_constants.cc.orig 2022-02-28 16:54:41 UTC
++++ components/feature_engagement/public/event_constants.cc
+@@ -11,7 +11,7 @@ namespace feature_engagement {
+ namespace events {
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kNewTabOpened[] = "new_tab_opened";
+ const char kSixthTabOpened[] = "sixth_tab_opened";
+ const char kTabGroupCreated[] = "tab_group_created";
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_event__constants.h b/devel/electron28/files/patch-components_feature__engagement_public_event__constants.h
new file mode 100644
index 000000000000..2308fc5d4293
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_event__constants.h
@@ -0,0 +1,11 @@
+--- components/feature_engagement/public/event_constants.h.orig 2023-10-19 19:58:18 UTC
++++ components/feature_engagement/public/event_constants.h
+@@ -14,7 +14,7 @@ namespace events {
+
+ // Desktop
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // The user has explicitly opened a new tab via an entry point from inside of
+ // Chrome.
+ extern const char kNewTabOpened[];
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_feature__configurations.cc b/devel/electron28/files/patch-components_feature__engagement_public_feature__configurations.cc
new file mode 100644
index 000000000000..833e5738d9ff
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_feature__configurations.cc
@@ -0,0 +1,21 @@
+--- components/feature_engagement/public/feature_configurations.cc.orig 2023-11-29 21:39:58 UTC
++++ components/feature_engagement/public/feature_configurations.cc
+@@ -49,7 +49,7 @@ absl::optional<FeatureConfig> GetClientSideFeatureConf
+ absl::optional<FeatureConfig> GetClientSideFeatureConfig(
+ const base::Feature* feature) {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (kIPHPasswordsAccountStorageFeature.name == feature->name) {
+ absl::optional<FeatureConfig> config = FeatureConfig();
+ config->valid = true;
+@@ -1440,7 +1440,8 @@ absl::optional<FeatureConfig> GetClientSideFeatureConf
+ #endif // BUILDFLAG(IS_ANDROID)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || \
++ BUILDFLAG(IS_BSD)
+
+ if (kIPHAutofillExternalAccountProfileSuggestionFeature.name ==
+ feature->name) {
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.cc b/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.cc
new file mode 100644
index 000000000000..27ee3e71fe67
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.cc
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_constants.cc.orig 2023-11-29 21:39:58 UTC
++++ components/feature_engagement/public/feature_constants.cc
+@@ -21,7 +21,7 @@ BASE_FEATURE(kIPHDummyFeature, "IPH_Dummy", base::FEAT
+ BASE_FEATURE(kIPHDummyFeature, "IPH_Dummy", base::FEATURE_DISABLED_BY_DEFAULT);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kIPHBatterySaverModeFeature,
+ "IPH_BatterySaverMode",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+@@ -560,7 +560,7 @@ constexpr base::FeatureParam<int> kDefaultBrowserEligi
+ /*default_value=*/365};
+ #endif // BUILDFLAG(IS_IOS)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ BASE_FEATURE(kIPHAutofillExternalAccountProfileSuggestionFeature,
+ "IPH_AutofillExternalAccountProfileSuggestion",
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.h b/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.h
new file mode 100644
index 000000000000..31a4ee4b0ac3
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_feature__constants.h
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_constants.h.orig 2023-11-29 21:39:58 UTC
++++ components/feature_engagement/public/feature_constants.h
+@@ -24,7 +24,7 @@ BASE_DECLARE_FEATURE(kIPHDummyFeature);
+ BASE_DECLARE_FEATURE(kIPHDummyFeature);
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kIPHBatterySaverModeFeature);
+ BASE_DECLARE_FEATURE(kIPHCompanionSidePanelFeature);
+ BASE_DECLARE_FEATURE(kIPHCompanionSidePanelRegionSearchFeature);
+@@ -233,7 +233,7 @@ extern const base::FeatureParam<int>
+ kDefaultBrowserEligibilitySlidingWindowParam;
+ #endif // BUILDFLAG(IS_IOS)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ BASE_DECLARE_FEATURE(kIPHAutofillExternalAccountProfileSuggestionFeature);
+ BASE_DECLARE_FEATURE(kIPHAutofillVirtualCardCVCSuggestionFeature);
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_feature__list.cc b/devel/electron28/files/patch-components_feature__engagement_public_feature__list.cc
new file mode 100644
index 000000000000..4ccbf6bb2d15
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_feature__list.cc
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_list.cc.orig 2023-11-29 21:39:58 UTC
++++ components/feature_engagement/public/feature_list.cc
+@@ -146,7 +146,7 @@ const base::Feature* const kAllFeatures[] = {
+ &kIPHiOSParcelTrackingFeature,
+ #endif // BUILDFLAG(IS_IOS)
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ &kIPHBatterySaverModeFeature,
+ &kIPHCompanionSidePanelFeature,
+ &kIPHCompanionSidePanelRegionSearchFeature,
+@@ -196,7 +196,7 @@ const base::Feature* const kAllFeatures[] = {
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ &kIPHAutofillExternalAccountProfileSuggestionFeature,
+ &kIPHAutofillVirtualCardCVCSuggestionFeature,
diff --git a/devel/electron28/files/patch-components_feature__engagement_public_feature__list.h b/devel/electron28/files/patch-components_feature__engagement_public_feature__list.h
new file mode 100644
index 000000000000..76a9f2e40d12
--- /dev/null
+++ b/devel/electron28/files/patch-components_feature__engagement_public_feature__list.h
@@ -0,0 +1,38 @@
+--- components/feature_engagement/public/feature_list.h.orig 2023-11-29 21:39:58 UTC
++++ components/feature_engagement/public/feature_list.h
+@@ -269,7 +269,7 @@ DEFINE_VARIATION_PARAM(kIPHiOSParcelTrackingFeature,
+ #endif // BUILDFLAG(IS_IOS)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ DEFINE_VARIATION_PARAM(kIPHBatterySaverModeFeature, "IPH_BatterySaverMode");
+ DEFINE_VARIATION_PARAM(kIPHCompanionSidePanelFeature, "IPH_CompanionSidePanel");
+ DEFINE_VARIATION_PARAM(kIPHCompanionSidePanelRegionSearchFeature,
+@@ -352,7 +352,7 @@ DEFINE_VARIATION_PARAM(kIPHBackNavigationMenuFeature,
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ DEFINE_VARIATION_PARAM(kIPHAutofillExternalAccountProfileSuggestionFeature,
+ "IPH_AutofillExternalAccountProfileSuggestion");
+@@ -567,7 +567,7 @@ constexpr flags_ui::FeatureEntry::FeatureVariation
+ VARIATION_ENTRY(kIPHiOSChoiceScreenFeature),
+ VARIATION_ENTRY(kIPHiOSParcelTrackingFeature),
+ #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ VARIATION_ENTRY(kIPHBatterySaverModeFeature),
+ VARIATION_ENTRY(kIPHCompanionSidePanelFeature),
+ VARIATION_ENTRY(kIPHCompanionSidePanelRegionSearchFeature),
+@@ -617,7 +617,7 @@ constexpr flags_ui::FeatureEntry::FeatureVariation
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+ // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ VARIATION_ENTRY(kIPHAutofillExternalAccountProfileSuggestionFeature),
+ VARIATION_ENTRY(kIPHAutofillVirtualCardCVCSuggestionFeature),
diff --git a/devel/electron28/files/patch-components_feed_core_proto_v2_wire_version.proto b/devel/electron28/files/patch-components_feed_core_proto_v2_wire_version.proto
new file mode 100644
index 000000000000..96224d006191
--- /dev/null
+++ b/devel/electron28/files/patch-components_feed_core_proto_v2_wire_version.proto
@@ -0,0 +1,13 @@
+--- components/feed/core/proto/v2/wire/version.proto.orig 2021-05-12 22:05:49 UTC
++++ components/feed/core/proto/v2/wire/version.proto
+@@ -25,8 +25,8 @@ message Version {
+ BETA = 3;
+ RELEASE = 4;
+ }
+- optional int32 major = 1;
+- optional int32 minor = 2;
++ optional int32 gmajor = 1;
++ optional int32 gminor = 2;
+ optional int32 build = 3;
+ optional int32 revision = 4;
+ optional Architecture architecture = 5;
diff --git a/devel/electron28/files/patch-components_feed_core_v2_feed__network__impl__unittest.cc b/devel/electron28/files/patch-components_feed_core_v2_feed__network__impl__unittest.cc
new file mode 100644
index 000000000000..c3de0fe4663d
--- /dev/null
+++ b/devel/electron28/files/patch-components_feed_core_v2_feed__network__impl__unittest.cc
@@ -0,0 +1,13 @@
+--- components/feed/core/v2/feed_network_impl_unittest.cc.orig 2023-11-29 21:39:58 UTC
++++ components/feed/core/v2/feed_network_impl_unittest.cc
+@@ -781,8 +781,8 @@ TEST_F(FeedNetworkTest, SendApiRequest_DecodesClientIn
+
+ EXPECT_EQ(feedwire::ClientInfo::CHROME_ANDROID, client_info.app_type());
+ EXPECT_EQ(feedwire::Version::RELEASE, client_info.app_version().build_type());
+- EXPECT_EQ(1, client_info.app_version().major());
+- EXPECT_EQ(2, client_info.app_version().minor());
++ EXPECT_EQ(1, client_info.app_version().gmajor());
++ EXPECT_EQ(2, client_info.app_version().gminor());
+ EXPECT_EQ(3, client_info.app_version().build());
+ EXPECT_EQ(4, client_info.app_version().revision());
+ EXPECT_FALSE(client_info.chrome_client_info().start_surface());
diff --git a/devel/electron28/files/patch-components_feed_core_v2_proto__util.cc b/devel/electron28/files/patch-components_feed_core_v2_proto__util.cc
new file mode 100644
index 000000000000..feec3240231a
--- /dev/null
+++ b/devel/electron28/files/patch-components_feed_core_v2_proto__util.cc
@@ -0,0 +1,24 @@
+--- components/feed/core/v2/proto_util.cc.orig 2023-08-10 01:48:40 UTC
++++ components/feed/core/v2/proto_util.cc
+@@ -93,8 +93,8 @@ feedwire::Version GetPlatformVersionMessage() {
+
+ int32_t major, minor, revision;
+ base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &revision);
+- result.set_major(major);
+- result.set_minor(minor);
++ result.set_gmajor(major);
++ result.set_gminor(minor);
+ result.set_revision(revision);
+ #if BUILDFLAG(IS_ANDROID)
+ result.set_api_version(base::android::BuildInfo::GetInstance()->sdk_int());
+@@ -109,8 +109,8 @@ feedwire::Version GetAppVersionMessage(const ChromeInf
+ // Chrome's version is in the format: MAJOR,MINOR,BUILD,PATCH.
+ const std::vector<uint32_t>& numbers = chrome_info.version.components();
+ if (numbers.size() > 3) {
+- result.set_major(static_cast<int32_t>(numbers[0]));
+- result.set_minor(static_cast<int32_t>(numbers[1]));
++ result.set_gmajor(static_cast<int32_t>(numbers[0]));
++ result.set_gminor(static_cast<int32_t>(numbers[1]));
+ result.set_build(static_cast<int32_t>(numbers[2]));
+ result.set_revision(static_cast<int32_t>(numbers[3]));
+ }
diff --git a/devel/electron28/files/patch-components_feed_core_v2_proto__util__unittest.cc b/devel/electron28/files/patch-components_feed_core_v2_proto__util__unittest.cc
new file mode 100644
index 000000000000..3447ab3e638b
--- /dev/null
+++ b/devel/electron28/files/patch-components_feed_core_v2_proto__util__unittest.cc
@@ -0,0 +1,13 @@
+--- components/feed/core/v2/proto_util_unittest.cc.orig 2023-10-19 19:58:18 UTC
++++ components/feed/core/v2/proto_util_unittest.cc
+@@ -44,8 +44,8 @@ TEST(ProtoUtilTest, CreateClientInfo) {
+ feedwire::ClientInfo result = CreateClientInfo(request_metadata);
+ EXPECT_EQ(feedwire::ClientInfo::CHROME_ANDROID, result.app_type());
+ EXPECT_EQ(feedwire::Version::RELEASE, result.app_version().build_type());
+- EXPECT_EQ(1, result.app_version().major());
+- EXPECT_EQ(2, result.app_version().minor());
++ EXPECT_EQ(1, result.app_version().gmajor());
++ EXPECT_EQ(2, result.app_version().gminor());
+ EXPECT_EQ(3, result.app_version().build());
+ EXPECT_EQ(4, result.app_version().revision());
+ EXPECT_FALSE(result.chrome_client_info().start_surface());
diff --git a/devel/electron28/files/patch-components_feed_core_v2_test_proto__printer.cc b/devel/electron28/files/patch-components_feed_core_v2_test_proto__printer.cc
new file mode 100644
index 000000000000..693a8da91003
--- /dev/null
+++ b/devel/electron28/files/patch-components_feed_core_v2_test_proto__printer.cc
@@ -0,0 +1,13 @@
+--- components/feed/core/v2/test/proto_printer.cc.orig 2023-08-10 01:48:40 UTC
++++ components/feed/core/v2/test/proto_printer.cc
+@@ -158,8 +158,8 @@ class TextProtoPrinter {
+ }
+ TextProtoPrinter& operator<<(const feedwire::Version& v) {
+ BeginMessage();
+- PRINT_FIELD(major);
+- PRINT_FIELD(minor);
++ PRINT_FIELD(gmajor);
++ PRINT_FIELD(gminor);
+ PRINT_FIELD(build);
+ PRINT_FIELD(revision);
+ PRINT_FIELD(architecture);
diff --git a/devel/electron28/files/patch-components_flags__ui_flags__state.cc b/devel/electron28/files/patch-components_flags__ui_flags__state.cc
new file mode 100644
index 000000000000..812aeaa73b9f
--- /dev/null
+++ b/devel/electron28/files/patch-components_flags__ui_flags__state.cc
@@ -0,0 +1,11 @@
+--- components/flags_ui/flags_state.cc.orig 2023-10-19 19:58:18 UTC
++++ components/flags_ui/flags_state.cc
+@@ -741,7 +741,7 @@ unsigned short FlagsState::GetCurrentPlatform() {
+ return kOsCrOS;
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ return kOsLacros;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_OPENBSD)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return kOsLinux;
+ #elif BUILDFLAG(IS_ANDROID)
+ return kOsAndroid;
diff --git a/devel/electron28/files/patch-components_gwp__asan_BUILD.gn b/devel/electron28/files/patch-components_gwp__asan_BUILD.gn
new file mode 100644
index 000000000000..416067b4053b
--- /dev/null
+++ b/devel/electron28/files/patch-components_gwp__asan_BUILD.gn
@@ -0,0 +1,11 @@
+--- components/gwp_asan/BUILD.gn.orig 2022-11-30 08:12:58 UTC
++++ components/gwp_asan/BUILD.gn
+@@ -15,7 +15,7 @@ test("gwp_asan_unittests") {
+ "//testing/gtest",
+ "//third_party/boringssl",
+ ]
+- if (is_win || is_mac || is_linux || is_chromeos || is_android) {
++ if ((is_win || is_mac || is_linux || is_chromeos || is_android) && !is_bsd) {
+ deps += [
+ "//components/gwp_asan/client:unit_tests",
+ "//components/gwp_asan/crash_handler:unit_tests",
diff --git a/devel/electron28/files/patch-components_gwp__asan_client_guarded__page__allocator__posix.cc b/devel/electron28/files/patch-components_gwp__asan_client_guarded__page__allocator__posix.cc
new file mode 100644
index 000000000000..357eb0881122
--- /dev/null
+++ b/devel/electron28/files/patch-components_gwp__asan_client_guarded__page__allocator__posix.cc
@@ -0,0 +1,13 @@
+--- components/gwp_asan/client/guarded_page_allocator_posix.cc.orig 2023-10-19 19:58:18 UTC
++++ components/gwp_asan/client/guarded_page_allocator_posix.cc
+@@ -35,8 +35,9 @@ void GuardedPageAllocator::MarkPageInaccessible(void*
+ // mmap() a PROT_NONE page over the address to release it to the system, if
+ // we used mprotect() here the system would count pages in the quarantine
+ // against the RSS.
++ // MAP_ANONYMOUS requires the fd to be -1 on !linux
+ void* err = mmap(ptr, state_.page_size, PROT_NONE,
+- MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
++ MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ PCHECK(err == ptr) << "mmap";
+ }
+
diff --git a/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan.cc b/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan.cc
new file mode 100644
index 000000000000..ddfe858aec7e
--- /dev/null
+++ b/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan.cc
@@ -0,0 +1,11 @@
+--- components/gwp_asan/client/gwp_asan.cc.orig 2023-11-29 21:39:58 UTC
++++ components/gwp_asan/client/gwp_asan.cc
+@@ -66,7 +66,7 @@ constexpr bool kCpuIs64Bit =
+ // ProcessSamplingBoost is the multiplier to increase the
+ // ProcessSamplingProbability in scenarios where we want to perform additional
+ // testing (e.g., on canary/dev builds).
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ constexpr int kDefaultMaxAllocations = 50;
+ constexpr int kDefaultMaxMetadata = 210;
+ constexpr int kDefaultTotalPages = kCpuIs64Bit ? 2048 : kDefaultMaxMetadata * 2;
diff --git a/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan__features.cc b/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan__features.cc
new file mode 100644
index 000000000000..65643abb442c
--- /dev/null
+++ b/devel/electron28/files/patch-components_gwp__asan_client_gwp__asan__features.cc
@@ -0,0 +1,11 @@
+--- components/gwp_asan/client/gwp_asan_features.cc.orig 2023-11-29 21:39:58 UTC
++++ components/gwp_asan/client/gwp_asan_features.cc
+@@ -9,7 +9,7 @@ namespace gwp_asan::internal {
+ namespace gwp_asan::internal {
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ constexpr base::FeatureState kDefaultEnabled = base::FEATURE_ENABLED_BY_DEFAULT;
+ #else
+ constexpr base::FeatureState kDefaultEnabled =
diff --git a/devel/electron28/files/patch-components_gwp__asan_crash__handler_crash__analyzer.cc b/devel/electron28/files/patch-components_gwp__asan_crash__handler_crash__analyzer.cc
new file mode 100644
index 000000000000..189e9222f0a4
--- /dev/null
+++ b/devel/electron28/files/patch-components_gwp__asan_crash__handler_crash__analyzer.cc
@@ -0,0 +1,20 @@
+--- components/gwp_asan/crash_handler/crash_analyzer.cc.orig 2023-05-25 00:41:50 UTC
++++ components/gwp_asan/crash_handler/crash_analyzer.cc
+@@ -30,7 +30,7 @@
+ #include "third_party/crashpad/crashpad/snapshot/process_snapshot.h"
+ #include "third_party/crashpad/crashpad/util/process/process_memory.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include <signal.h>
+ #elif BUILDFLAG(IS_APPLE)
+ #include <mach/exception_types.h>
+@@ -90,7 +90,7 @@ bool CrashAnalyzer::GetExceptionInfo(
+
+ crashpad::VMAddress CrashAnalyzer::GetAccessAddress(
+ const crashpad::ExceptionSnapshot& exception) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ if (exception.Exception() == SIGSEGV || exception.Exception() == SIGBUS)
+ return exception.ExceptionAddress();
+ #elif BUILDFLAG(IS_APPLE)
diff --git a/devel/electron28/files/patch-components_live__caption_caption__util.cc b/devel/electron28/files/patch-components_live__caption_caption__util.cc
new file mode 100644
index 000000000000..c435409a49bd
--- /dev/null
+++ b/devel/electron28/files/patch-components_live__caption_caption__util.cc
@@ -0,0 +1,20 @@
+--- components/live_caption/caption_util.cc.orig 2023-08-10 01:48:40 UTC
++++ components/live_caption/caption_util.cc
+@@ -145,7 +145,7 @@ bool IsLiveCaptionFeatureSupported() {
+ return false;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Check if the CPU has the required instruction set to run the Speech
+ // On-Device API (SODA) library.
+ static bool has_sse41 = base::CPU().has_sse41();
+@@ -167,7 +167,7 @@ std::string GetCaptionSettingsUrl() {
+ return "chrome://os-settings/audioAndCaptions";
+ #endif // BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return "chrome://settings/captions";
+ #endif // BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-components_live__caption_caption__util.h b/devel/electron28/files/patch-components_live__caption_caption__util.h
new file mode 100644
index 000000000000..452a76c2634f
--- /dev/null
+++ b/devel/electron28/files/patch-components_live__caption_caption__util.h
@@ -0,0 +1,11 @@
+--- components/live_caption/caption_util.h.orig 2023-08-10 01:48:40 UTC
++++ components/live_caption/caption_util.h
+@@ -14,7 +14,7 @@ class PrefService;
+ namespace captions {
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ extern const char kCaptionSettingsUrl[];
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) ||
+ // BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-components_management__strings.grdp b/devel/electron28/files/patch-components_management__strings.grdp
new file mode 100644
index 000000000000..e5f815eb60db
--- /dev/null
+++ b/devel/electron28/files/patch-components_management__strings.grdp
@@ -0,0 +1,11 @@
+--- components/management_strings.grdp.orig 2023-10-19 19:58:18 UTC
++++ components/management_strings.grdp
+@@ -346,7 +346,7 @@
+ </if>
+
+ <!-- Strings related to Chrome Enterprise Device Signals Sharing -->
+- <if expr="is_win or is_linux or is_macosx">
++ <if expr="is_win or is_posix or is_macosx">
+ <message name="IDS_MANAGEMENT_DEVICE_SIGNALS_DISCLOSURE" desc="Disclosure message explaining that device signals can be shared.">
+ Information about your browser, OS, device, installed software, and files
+ </message>
diff --git a/devel/electron28/files/patch-components_media__router_common_providers_cast_channel_cast__message__util.cc b/devel/electron28/files/patch-components_media__router_common_providers_cast_channel_cast__message__util.cc
new file mode 100644
index 000000000000..6fb1b7a94e22
--- /dev/null
+++ b/devel/electron28/files/patch-components_media__router_common_providers_cast_channel_cast__message__util.cc
@@ -0,0 +1,11 @@
+--- components/media_router/common/providers/cast/channel/cast_message_util.cc.orig 2023-11-29 21:39:58 UTC
++++ components/media_router/common/providers/cast/channel/cast_message_util.cc
+@@ -169,7 +169,7 @@ int GetVirtualConnectPlatformValue() {
+ return 4;
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ return 5;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return 6;
+ #else
+ return 0;
diff --git a/devel/electron28/files/patch-components_metrics_drive__metrics__provider__linux.cc b/devel/electron28/files/patch-components_metrics_drive__metrics__provider__linux.cc
new file mode 100644
index 000000000000..105b380f89b9
--- /dev/null
+++ b/devel/electron28/files/patch-components_metrics_drive__metrics__provider__linux.cc
@@ -0,0 +1,16 @@
+--- components/metrics/drive_metrics_provider_linux.cc.orig 2023-10-19 19:58:18 UTC
++++ components/metrics/drive_metrics_provider_linux.cc
+@@ -4,7 +4,13 @@
+
+ #include "components/metrics/drive_metrics_provider.h"
+
++#if BUILDFLAG(IS_BSD)
++#include <sys/types.h>
++#define MAJOR(dev) major(dev)
++#define MINOR(dev) minor(dev)
++#else
+ #include <linux/kdev_t.h> // For MAJOR()/MINOR().
++#endif
+ #include <sys/stat.h>
+ #include <string>
+
diff --git a/devel/electron28/files/patch-components_metrics_metrics__log.cc b/devel/electron28/files/patch-components_metrics_metrics__log.cc
new file mode 100644
index 000000000000..627ae3722fb8
--- /dev/null
+++ b/devel/electron28/files/patch-components_metrics_metrics__log.cc
@@ -0,0 +1,38 @@
+--- components/metrics/metrics_log.cc.orig 2023-10-19 19:58:18 UTC
++++ components/metrics/metrics_log.cc
+@@ -53,7 +53,7 @@
+ #include "base/win/current_module.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #endif
+@@ -139,7 +139,7 @@ void RecordCurrentTime(
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ metrics::SystemProfileProto::OS::XdgSessionType ToProtoSessionType(
+ base::nix::SessionType session_type) {
+ switch (session_type) {
+@@ -399,7 +399,7 @@ void MetricsLog::RecordCoreSystemProfile(
+ // OperatingSystemVersion refers to the ChromeOS release version.
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ os->set_kernel_version(base::SysInfo::KernelVersion());
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Linux operating system version is copied over into kernel version to be
+ // consistent.
+ os->set_kernel_version(base::SysInfo::OperatingSystemVersion());
+@@ -416,7 +416,7 @@ void MetricsLog::RecordCoreSystemProfile(
+ os->set_build_number(base::SysInfo::GetIOSBuildNumber());
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<base::Environment> env = base::Environment::Create();
+ os->set_xdg_session_type(ToProtoSessionType(base::nix::GetSessionType(*env)));
+ os->set_xdg_current_desktop(
diff --git a/devel/electron28/files/patch-components_metrics_motherboard.cc b/devel/electron28/files/patch-components_metrics_motherboard.cc
new file mode 100644
index 000000000000..a639aaec5b72
--- /dev/null
+++ b/devel/electron28/files/patch-components_metrics_motherboard.cc
@@ -0,0 +1,10 @@
+--- components/metrics/motherboard.cc.orig 2022-10-24 13:33:33 UTC
++++ components/metrics/motherboard.cc
+@@ -1,6 +1,7 @@
+ // Copyright 2022 The Chromium Authors
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
++// CHECK
+
+ #include "components/metrics/motherboard.h"
+
diff --git a/devel/electron28/files/patch-components_named__mojo__ipc__server_connection__info.h b/devel/electron28/files/patch-components_named__mojo__ipc__server_connection__info.h
new file mode 100644
index 000000000000..b3cb8477ac40
--- /dev/null
+++ b/devel/electron28/files/patch-components_named__mojo__ipc__server_connection__info.h
@@ -0,0 +1,20 @@
+--- components/named_mojo_ipc_server/connection_info.h.orig 2023-02-01 18:43:16 UTC
++++ components/named_mojo_ipc_server/connection_info.h
+@@ -13,7 +13,7 @@
+ #include "base/win/scoped_handle.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include <bsm/libbsm.h>
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <sys/socket.h>
+ #endif
+
+@@ -32,7 +32,7 @@ struct ConnectionInfo {
+ absl::optional<base::win::ScopedHandle> impersonation_token{};
+ #elif BUILDFLAG(IS_MAC)
+ audit_token_t audit_token{};
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ucred credentials{};
+ #endif
+ };
diff --git a/devel/electron28/files/patch-components_named__mojo__ipc__server_named__mojo__ipc__server__client__util.cc b/devel/electron28/files/patch-components_named__mojo__ipc__server_named__mojo__ipc__server__client__util.cc
new file mode 100644
index 000000000000..c10005cda29a
--- /dev/null
+++ b/devel/electron28/files/patch-components_named__mojo__ipc__server_named__mojo__ipc__server__client__util.cc
@@ -0,0 +1,11 @@
+--- components/named_mojo_ipc_server/named_mojo_ipc_server_client_util.cc.orig 2023-02-01 18:43:16 UTC
++++ components/named_mojo_ipc_server/named_mojo_ipc_server_client_util.cc
+@@ -22,7 +22,7 @@ namespace named_mojo_ipc_server {
+ // static
+ mojo::PlatformChannelEndpoint ConnectToServer(
+ const mojo::NamedPlatformChannel::ServerName& server_name) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return mojo::NamedPlatformChannel::ConnectToServer(server_name);
+ #elif BUILDFLAG(IS_MAC)
+ mojo::PlatformChannelEndpoint endpoint =
diff --git a/devel/electron28/files/patch-components_neterror_resources_neterror.js b/devel/electron28/files/patch-components_neterror_resources_neterror.js
new file mode 100644
index 000000000000..35b17e5e5327
--- /dev/null
+++ b/devel/electron28/files/patch-components_neterror_resources_neterror.js
@@ -0,0 +1,11 @@
+--- components/neterror/resources/neterror.js.orig 2023-11-29 21:39:58 UTC
++++ components/neterror/resources/neterror.js
+@@ -141,7 +141,7 @@ let primaryControlOnLeft = true;
+
+ let primaryControlOnLeft = true;
+ // clang-format off
+-// <if expr="is_macosx or is_ios or is_linux or is_chromeos or is_android">
++// <if expr="is_macosx or is_ios or is_posix or is_chromeos or is_android">
+ // clang-format on
+ primaryControlOnLeft = false;
+ // </if>
diff --git a/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator.cc b/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator.cc
new file mode 100644
index 000000000000..8ed8d5bee3cc
--- /dev/null
+++ b/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator.cc
@@ -0,0 +1,11 @@
+--- components/network_session_configurator/browser/network_session_configurator.cc.orig 2023-11-29 21:39:58 UTC
++++ components/network_session_configurator/browser/network_session_configurator.cc
+@@ -801,7 +801,7 @@ net::URLRequestContextBuilder::HttpCacheParams::Type C
+ // backport, having it behave differently than in stable would be a bigger
+ // problem. TODO: Does this work in later macOS releases?
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
+ #else
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE;
diff --git a/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator__unittest.cc b/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator__unittest.cc
new file mode 100644
index 000000000000..206fd3947e74
--- /dev/null
+++ b/devel/electron28/files/patch-components_network__session__configurator_browser_network__session__configurator__unittest.cc
@@ -0,0 +1,11 @@
+--- components/network_session_configurator/browser/network_session_configurator_unittest.cc.orig 2023-10-19 19:58:18 UTC
++++ components/network_session_configurator/browser/network_session_configurator_unittest.cc
+@@ -775,7 +775,7 @@ TEST_F(NetworkSessionConfiguratorTest, HostRules) {
+
+ TEST_F(NetworkSessionConfiguratorTest, DefaultCacheBackend) {
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ EXPECT_EQ(net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE,
+ ChooseCacheType());
+ #else
diff --git a/devel/electron28/files/patch-components_new__or__sad__tab__strings.grdp b/devel/electron28/files/patch-components_new__or__sad__tab__strings.grdp
new file mode 100644
index 000000000000..e781a06fe05c
--- /dev/null
+++ b/devel/electron28/files/patch-components_new__or__sad__tab__strings.grdp
@@ -0,0 +1,20 @@
+--- components/new_or_sad_tab_strings.grdp.orig 2022-07-22 17:30:31 UTC
++++ components/new_or_sad_tab_strings.grdp
+@@ -66,7 +66,7 @@
+ Close other tabs or apps
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_SAD_TAB_RELOAD_CLOSE_TABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other Chrome tabs or programs running on their computer.">
+ Close other tabs or programs
+ </message>
+@@ -76,7 +76,7 @@
+ Close other apps
+ </message>
+ </if>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_SAD_TAB_RELOAD_CLOSE_NOTABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other programs running on their computer (Linux).">
+ Close other programs
+ </message>
diff --git a/devel/electron28/files/patch-components_omnibox_browser_omnibox__edit__model.cc b/devel/electron28/files/patch-components_omnibox_browser_omnibox__edit__model.cc
new file mode 100644
index 000000000000..e8b869042eea
--- /dev/null
+++ b/devel/electron28/files/patch-components_omnibox_browser_omnibox__edit__model.cc
@@ -0,0 +1,10 @@
+--- components/omnibox/browser/omnibox_edit_model.cc.orig 2023-05-25 00:41:50 UTC
++++ components/omnibox/browser/omnibox_edit_model.cc
+@@ -23,6 +23,7 @@
+ #include "base/trace_event/trace_event.h"
+ #include "base/trace_event/typed_macros.h"
+ #include "build/build_config.h"
++#include "build/branding_buildflags.h"
+ #include "components/bookmarks/browser/bookmark_model.h"
+ #include "components/dom_distiller/core/url_constants.h"
+ #include "components/dom_distiller/core/url_utils.h"
diff --git a/devel/electron28/files/patch-components_optimization__guide_core_optimization__guide__util.cc b/devel/electron28/files/patch-components_optimization__guide_core_optimization__guide__util.cc
new file mode 100644
index 000000000000..fe96805c5c11
--- /dev/null
+++ b/devel/electron28/files/patch-components_optimization__guide_core_optimization__guide__util.cc
@@ -0,0 +1,11 @@
+--- components/optimization_guide/core/optimization_guide_util.cc.orig 2023-11-29 21:39:58 UTC
++++ components/optimization_guide/core/optimization_guide_util.cc
+@@ -34,7 +34,7 @@ optimization_guide::proto::Platform GetPlatform() {
+ return optimization_guide::proto::PLATFORM_CHROMEOS;
+ #elif BUILDFLAG(IS_ANDROID)
+ return optimization_guide::proto::PLATFORM_ANDROID;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return optimization_guide::proto::PLATFORM_LINUX;
+ #else
+ return optimization_guide::proto::PLATFORM_UNDEFINED;
diff --git a/devel/electron28/files/patch-components_optimization__guide_core_tflite__model__executor.h b/devel/electron28/files/patch-components_optimization__guide_core_tflite__model__executor.h
new file mode 100644
index 000000000000..c1d6d0bf9825
--- /dev/null
+++ b/devel/electron28/files/patch-components_optimization__guide_core_tflite__model__executor.h
@@ -0,0 +1,62 @@
+--- components/optimization_guide/core/tflite_model_executor.h.orig 2023-10-19 19:58:18 UTC
++++ components/optimization_guide/core/tflite_model_executor.h
+@@ -240,7 +240,11 @@ class TFLiteModelExecutor : public ModelExecutor<Outpu
+ void SendForBatchExecution(
+ BatchExecutionCallback callback_on_complete,
+ base::TimeTicks start_time,
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs)
++#else
++ typename ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs)
++#endif
+ override {
+ DCHECK(execution_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+@@ -262,7 +266,11 @@ class TFLiteModelExecutor : public ModelExecutor<Outpu
+ // Starts the synchronous execution of the model. Returns model outputs.
+ // Model needs to be loaded. Synchronous calls do not load or unload model.
+ std::vector<absl::optional<OutputType>> SendForBatchExecutionSync(
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs)
++#else
++ typename ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs)
++#endif
+ override {
+ DCHECK(execution_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+@@ -417,7 +425,11 @@ class TFLiteModelExecutor : public ModelExecutor<Outpu
+ // executes it on the model execution thread.
+ void LoadModelFileAndBatchExecute(
+ BatchExecutionCallback callback_on_complete,
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs) {
++#else
++ typename ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs) {
++#endif
+ DCHECK(execution_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+@@ -434,7 +446,11 @@ class TFLiteModelExecutor : public ModelExecutor<Outpu
+
+ // Batch executes the loaded model for inputs.
+ void BatchExecuteLoadedModel(
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs,
++#else
++ typename ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs,
++#endif
+ std::vector<absl::optional<OutputType>>* outputs) {
+ DCHECK(execution_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+@@ -494,7 +510,11 @@ class TFLiteModelExecutor : public ModelExecutor<Outpu
+ // Unloads the model if needed.
+ void BatchExecuteLoadedModelAndRunCallback(
+ BatchExecutionCallback callback_on_complete,
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs,
++#else
++ typename ModelExecutor<OutputType, InputType>::ConstRefInputVector inputs,
++#endif
+ ExecutionStatus execution_status) {
+ DCHECK(execution_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/devel/electron28/files/patch-components_os__crypt_sync_libsecret__util__linux.cc b/devel/electron28/files/patch-components_os__crypt_sync_libsecret__util__linux.cc
new file mode 100644
index 000000000000..02506f94945b
--- /dev/null
+++ b/devel/electron28/files/patch-components_os__crypt_sync_libsecret__util__linux.cc
@@ -0,0 +1,27 @@
+--- components/os_crypt/sync/libsecret_util_linux.cc.orig 2023-05-25 00:41:51 UTC
++++ components/os_crypt/sync/libsecret_util_linux.cc
+@@ -99,16 +99,22 @@ bool LibsecretLoader::EnsureLibsecretLoaded() {
+
+ // static
+ bool LibsecretLoader::LoadLibsecret() {
++#if BUILDFLAG(IS_BSD)
++ const char* kSecretLib = "libsecret-1.so";
++#else
++ const char* kSecretLib = "libsecret-1.so.0";
++#endif
++
+ if (libsecret_loaded_)
+ return true;
+
+- static void* handle = dlopen("libsecret-1.so.0", RTLD_NOW | RTLD_GLOBAL);
++ static void* handle = dlopen(kSecretLib, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle) {
+ // We wanted to use libsecret, but we couldn't load it. Warn, because
+ // either the user asked for this, or we autodetected it incorrectly. (Or
+ // the system has broken libraries, which is also good to warn about.)
+ // TODO(crbug.com/607435): Channel this message to the user-facing log
+- VLOG(1) << "Could not load libsecret-1.so.0: " << dlerror();
++ VLOG(1) << "Could not load << " << kSecretLib << ": " << dlerror();
+ return false;
+ }
+
diff --git a/devel/electron28/files/patch-components_os__crypt_sync_os__crypt.h b/devel/electron28/files/patch-components_os__crypt_sync_os__crypt.h
new file mode 100644
index 000000000000..3b80b3d2dbfa
--- /dev/null
+++ b/devel/electron28/files/patch-components_os__crypt_sync_os__crypt.h
@@ -0,0 +1,72 @@
+--- components/os_crypt/sync/os_crypt.h.orig 2023-05-25 00:41:51 UTC
++++ components/os_crypt/sync/os_crypt.h
+@@ -14,7 +14,7 @@
+ #include "build/build_config.h"
+ #include "build/chromecast_buildflags.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class KeyStorageLinux;
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -23,7 +23,7 @@ class PrefRegistrySimple;
+ class PrefService;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ namespace crypto {
+ class SymmetricKey;
+ }
+@@ -36,7 +36,7 @@ struct Config;
+ // Temporary interface due to OSCrypt refactor. See OSCryptImpl for descriptions
+ // of what each function does.
+ namespace OSCrypt {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(OS_CRYPT)
+ void SetConfig(std::unique_ptr<os_crypt::Config> config);
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -81,7 +81,7 @@ COMPONENT_EXPORT(OS_CRYPT) void UseMockKeyForTesting(b
+ COMPONENT_EXPORT(OS_CRYPT) void SetLegacyEncryptionForTesting(bool legacy);
+ COMPONENT_EXPORT(OS_CRYPT) void ResetStateForTesting();
+ #endif // BUILDFLAG(IS_WIN)
+-#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(OS_CRYPT)
+ void UseMockKeyStorageForTesting(
+ base::OnceCallback<std::unique_ptr<KeyStorageLinux>()>
+@@ -108,7 +108,7 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCryptImpl {
+ // Returns singleton instance of OSCryptImpl.
+ static OSCryptImpl* GetInstance();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Set the configuration of OSCryptImpl.
+ // This method, or SetRawEncryptionKey(), must be called before using
+ // EncryptString() and DecryptString().
+@@ -200,7 +200,7 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCryptImpl {
+ void ResetStateForTesting();
+ #endif
+
+-#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || BUILDFLAG(IS_BSD)
+ // For unit testing purposes, inject methods to be used.
+ // |storage_provider_factory| provides the desired |KeyStorage|
+ // implementation. If the provider returns |nullptr|, a hardcoded password
+@@ -225,13 +225,13 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCryptImpl {
+ crypto::SymmetricKey* GetEncryptionKey();
+ #endif // BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ // This lock is used to make the GetEncryptionKey and
+ // GetRawEncryptionKey methods thread-safe.
+ static base::Lock& GetLock();
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Create the KeyStorage. Will be null if no service is found. A Config must
+ // be set before every call to this method.
+ std::unique_ptr<KeyStorageLinux> CreateKeyStorage();
diff --git a/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client.cc b/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client.cc
new file mode 100644
index 000000000000..9f4a97ea381b
--- /dev/null
+++ b/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client.cc
@@ -0,0 +1,13 @@
+--- components/paint_preview/browser/paint_preview_client.cc.orig 2023-03-30 00:33:48 UTC
++++ components/paint_preview/browser/paint_preview_client.cc
+@@ -310,8 +310,8 @@ void PaintPreviewClient::CapturePaintPreview(
+ metadata->set_url(url.spec());
+ metadata->set_version(kPaintPreviewVersion);
+ auto* chromeVersion = metadata->mutable_chrome_version();
+- chromeVersion->set_major(CHROME_VERSION_MAJOR);
+- chromeVersion->set_minor(CHROME_VERSION_MINOR);
++ chromeVersion->set_gmajor(CHROME_VERSION_MAJOR);
++ chromeVersion->set_gminor(CHROME_VERSION_MINOR);
+ chromeVersion->set_build(CHROME_VERSION_BUILD);
+ chromeVersion->set_patch(CHROME_VERSION_PATCH);
+ document_data.callback = std::move(callback);
diff --git a/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client__unittest.cc b/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client__unittest.cc
new file mode 100644
index 000000000000..28c077793e5d
--- /dev/null
+++ b/devel/electron28/files/patch-components_paint__preview_browser_paint__preview__client__unittest.cc
@@ -0,0 +1,13 @@
+--- components/paint_preview/browser/paint_preview_client_unittest.cc.orig 2022-02-28 16:54:41 UTC
++++ components/paint_preview/browser/paint_preview_client_unittest.cc
+@@ -171,8 +171,8 @@ TEST_P(PaintPreviewClientRenderViewHostTest, CaptureMa
+ metadata->set_url(expected_url.spec());
+ metadata->set_version(kPaintPreviewVersion);
+ auto* chromeVersion = metadata->mutable_chrome_version();
+- chromeVersion->set_major(CHROME_VERSION_MAJOR);
+- chromeVersion->set_minor(CHROME_VERSION_MINOR);
++ chromeVersion->set_gmajor(CHROME_VERSION_MAJOR);
++ chromeVersion->set_gminor(CHROME_VERSION_MINOR);
+ chromeVersion->set_build(CHROME_VERSION_BUILD);
+ chromeVersion->set_patch(CHROME_VERSION_PATCH);
+ PaintPreviewFrameProto* main_frame = expected_proto.mutable_root_frame();
diff --git a/devel/electron28/files/patch-components_paint__preview_common_proto_paint__preview.proto b/devel/electron28/files/patch-components_paint__preview_common_proto_paint__preview.proto
new file mode 100644
index 000000000000..7c3f6367e147
--- /dev/null
+++ b/devel/electron28/files/patch-components_paint__preview_common_proto_paint__preview.proto
@@ -0,0 +1,13 @@
+--- components/paint_preview/common/proto/paint_preview.proto.orig 2021-12-14 11:45:03 UTC
++++ components/paint_preview/common/proto/paint_preview.proto
+@@ -82,8 +82,8 @@ message PaintPreviewFrameProto {
+ // Stores Chrome version.
+ // NEXT_TAG = 5
+ message ChromeVersionProto {
+- optional uint64 major = 1;
+- optional uint64 minor = 2;
++ optional uint64 gmajor = 1;
++ optional uint64 gminor = 2;
+ optional uint64 build = 3;
+ optional uint64 patch = 4;
+ }
diff --git a/devel/electron28/files/patch-components_paint__preview_player_player__compositor__delegate.cc b/devel/electron28/files/patch-components_paint__preview_player_player__compositor__delegate.cc
new file mode 100644
index 000000000000..0b708c509dd5
--- /dev/null
+++ b/devel/electron28/files/patch-components_paint__preview_player_player__compositor__delegate.cc
@@ -0,0 +1,13 @@
+--- components/paint_preview/player/player_compositor_delegate.cc.orig 2023-03-30 00:33:48 UTC
++++ components/paint_preview/player/player_compositor_delegate.cc
+@@ -452,8 +452,8 @@ void PlayerCompositorDelegate::ValidateProtoAndLoadAXT
+ // use the AXTreeUpdate.
+ auto chrome_version = capture_result_->proto.metadata().chrome_version();
+ if (capture_result_->proto.metadata().has_chrome_version() &&
+- chrome_version.major() == CHROME_VERSION_MAJOR &&
+- chrome_version.minor() == CHROME_VERSION_MINOR &&
++ chrome_version.gmajor() == CHROME_VERSION_MAJOR &&
++ chrome_version.gminor() == CHROME_VERSION_MINOR &&
+ chrome_version.build() == CHROME_VERSION_BUILD &&
+ chrome_version.patch() == CHROME_VERSION_PATCH) {
+ paint_preview_service_->GetFileMixin()->GetAXTreeUpdate(
diff --git a/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.cc b/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.cc
new file mode 100644
index 000000000000..64223a2681b2
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.cc
@@ -0,0 +1,20 @@
+--- components/password_manager/core/browser/features/password_features.cc.orig 2023-11-29 21:39:58 UTC
++++ components/password_manager/core/browser/features/password_features.cc
+@@ -8,7 +8,7 @@ namespace password_manager::features {
+
+ namespace password_manager::features {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Enables attaching password manager and autofill internals logs to an Autofill
+ // Rater Extension Report.
+ BASE_FEATURE(kAttachLogsToAutofillRaterExtensionReport,
+@@ -30,7 +30,7 @@ BASE_FEATURE(kClearUndecryptablePasswordsOnSync,
+ // Delete undecryptable passwords from the store when Sync is active.
+ BASE_FEATURE(kClearUndecryptablePasswordsOnSync,
+ "ClearUndecryptablePasswordsInSync",
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_IOS)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.h b/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.h
new file mode 100644
index 000000000000..e2e937e408a1
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_browser_features_password__features.h
@@ -0,0 +1,11 @@
+--- components/password_manager/core/browser/features/password_features.h.orig 2023-11-29 21:39:58 UTC
++++ components/password_manager/core/browser/features/password_features.h
+@@ -15,7 +15,7 @@ namespace password_manager::features {
+ // All features in alphabetical order. The features should be documented
+ // alongside the definition of their values in the .cc file.
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kAttachLogsToAutofillRaterExtensionReport);
+ #endif
+
diff --git a/devel/electron28/files/patch-components_password__manager_core_browser_login__database__unittest.cc b/devel/electron28/files/patch-components_password__manager_core_browser_login__database__unittest.cc
new file mode 100644
index 000000000000..cbb6f72c89fe
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_browser_login__database__unittest.cc
@@ -0,0 +1,11 @@
+--- components/password_manager/core/browser/login_database_unittest.cc.orig 2023-11-29 21:39:58 UTC
++++ components/password_manager/core/browser/login_database_unittest.cc
+@@ -2102,7 +2102,7 @@ INSTANTIATE_TEST_SUITE_P(MigrationToVCurrent,
+ LoginDatabaseMigrationTestBroken,
+ testing::Values(1, 2, 3, 24));
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_IOS)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ class LoginDatabaseUndecryptableLoginsTest : public testing::Test {
+ protected:
+ LoginDatabaseUndecryptableLoginsTest() = default;
diff --git a/devel/electron28/files/patch-components_password__manager_core_browser_sync_password__sync__bridge.cc b/devel/electron28/files/patch-components_password__manager_core_browser_sync_password__sync__bridge.cc
new file mode 100644
index 000000000000..c34a9c91d045
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_browser_sync_password__sync__bridge.cc
@@ -0,0 +1,11 @@
+--- components/password_manager/core/browser/sync/password_sync_bridge.cc.orig 2023-11-01 19:29:05 UTC
++++ components/password_manager/core/browser/sync/password_sync_bridge.cc
+@@ -197,7 +197,7 @@ bool ShouldRecoverPasswordsDuringMerge() {
+ }
+
+ bool ShouldCleanSyncMetadataDuringStartupWhenDecryptionFails() {
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return ShouldRecoverPasswordsDuringMerge() &&
+ base::FeatureList::IsEnabled(
+ features::kForceInitialSyncWhenDecryptionFails);
diff --git a/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.cc b/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.cc
new file mode 100644
index 000000000000..ec78d5802b60
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.cc
@@ -0,0 +1,11 @@
+--- components/password_manager/core/common/password_manager_features.cc.orig 2023-11-01 19:29:05 UTC
++++ components/password_manager/core/common/password_manager_features.cc
+@@ -18,7 +18,7 @@ BASE_FEATURE(kEnableOverwritingPlaceholderUsernames,
+ "EnableOverwritingPlaceholderUsernames",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // When enabled, initial sync will be forced during startup if the password
+ // store has encryption service failures.
+ BASE_FEATURE(kForceInitialSyncWhenDecryptionFails,
diff --git a/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.h b/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.h
new file mode 100644
index 000000000000..57e222050de8
--- /dev/null
+++ b/devel/electron28/files/patch-components_password__manager_core_common_password__manager__features.h
@@ -0,0 +1,11 @@
+--- components/password_manager/core/common/password_manager_features.h.orig 2023-11-29 21:39:58 UTC
++++ components/password_manager/core/common/password_manager_features.h
+@@ -19,7 +19,7 @@ BASE_DECLARE_FEATURE(kEnableOverwritingPlaceholderUser
+ // alongside the definition of their values in the .cc file.
+ BASE_DECLARE_FEATURE(kEnableOverwritingPlaceholderUsernames);
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kForceInitialSyncWhenDecryptionFails);
+ #endif
+ BASE_DECLARE_FEATURE(kForgotPasswordFormSupport);
diff --git a/devel/electron28/files/patch-components_performance__manager_public_features.h b/devel/electron28/files/patch-components_performance__manager_public_features.h
new file mode 100644
index 000000000000..66c470b3852f
--- /dev/null
+++ b/devel/electron28/files/patch-components_performance__manager_public_features.h
@@ -0,0 +1,11 @@
+--- components/performance_manager/public/features.h.orig 2023-11-29 21:39:58 UTC
++++ components/performance_manager/public/features.h
+@@ -28,7 +28,7 @@ BASE_DECLARE_FEATURE(kRunOnDedicatedThreadPoolThread);
+
+ #if !BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #define URGENT_DISCARDING_FROM_PERFORMANCE_MANAGER() false
+ #else
+ #define URGENT_DISCARDING_FROM_PERFORMANCE_MANAGER() true
diff --git a/devel/electron28/files/patch-components_permissions_prediction__service_prediction__common.cc b/devel/electron28/files/patch-components_permissions_prediction__service_prediction__common.cc
new file mode 100644
index 000000000000..049516814c6a
--- /dev/null
+++ b/devel/electron28/files/patch-components_permissions_prediction__service_prediction__common.cc
@@ -0,0 +1,20 @@
+--- components/permissions/prediction_service/prediction_common.cc.orig 2022-08-31 12:19:35 UTC
++++ components/permissions/prediction_service/prediction_common.cc
+@@ -33,7 +33,7 @@ int BucketizeValue(int count) {
+
+ ClientFeatures_Platform GetCurrentPlatformProto() {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return permissions::ClientFeatures_Platform_PLATFORM_DESKTOP;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ return permissions::ClientFeatures_Platform_PLATFORM_MOBILE;
+@@ -44,7 +44,7 @@ ClientFeatures_Platform GetCurrentPlatformProto() {
+
+ ClientFeatures_PlatformEnum GetCurrentPlatformEnumProto() {
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return permissions::ClientFeatures_PlatformEnum_PLATFORM_DESKTOP_V2;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+ return permissions::ClientFeatures_PlatformEnum_PLATFORM_MOBILE_V2;
diff --git a/devel/electron28/files/patch-components_policy_core_browser_policy__pref__mapping__test.cc b/devel/electron28/files/patch-components_policy_core_browser_policy__pref__mapping__test.cc
new file mode 100644
index 000000000000..4e256f997bc5
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_core_browser_policy__pref__mapping__test.cc
@@ -0,0 +1,11 @@
+--- components/policy/core/browser/policy_pref_mapping_test.cc.orig 2023-05-25 00:41:51 UTC
++++ components/policy/core/browser/policy_pref_mapping_test.cc
+@@ -327,7 +327,7 @@ class PolicyTestCase {
+ const std::string os("chromeos_lacros");
+ #elif BUILDFLAG(IS_IOS)
+ const std::string os("ios");
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const std::string os("linux");
+ #elif BUILDFLAG(IS_MAC)
+ const std::string os("mac");
diff --git a/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__client.cc b/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__client.cc
new file mode 100644
index 000000000000..90668eb8a868
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__client.cc
@@ -0,0 +1,11 @@
+--- components/policy/core/common/cloud/cloud_policy_client.cc.orig 2023-11-29 21:39:58 UTC
++++ components/policy/core/common/cloud/cloud_policy_client.cc
+@@ -508,7 +508,7 @@ void CloudPolicyClient::FetchPolicy(PolicyFetchReason
+ fetch_request->set_invalidation_payload(invalidation_payload_);
+ }
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Only set browser device identifier for CBCM Chrome cloud policy on
+ // desktop.
+ if (type_to_fetch.first ==
diff --git a/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc b/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc
new file mode 100644
index 000000000000..cb3c963e92df
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc
@@ -0,0 +1,55 @@
+--- components/policy/core/common/cloud/cloud_policy_util.cc.orig 2023-11-29 21:39:58 UTC
++++ components/policy/core/common/cloud/cloud_policy_util.cc
+@@ -20,7 +20,7 @@
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || \
+- BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include <pwd.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -35,10 +35,15 @@
+ #import <SystemConfiguration/SCDynamicStoreCopySpecific.h>
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include <limits.h> // For HOST_NAME_MAX
+ #endif
+
++#if BUILDFLAG(IS_FREEBSD)
++#include <sys/param.h>
++#define HOST_NAME_MAX MAXHOSTNAMELEN
++#endif
++
+ #include <algorithm>
+ #include <utility>
+
+@@ -86,7 +91,7 @@ std::string GetMachineName() {
+
+ std::string GetMachineName() {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ char hostname[HOST_NAME_MAX];
+ if (gethostname(hostname, HOST_NAME_MAX) == 0) // Success.
+ return hostname;
+@@ -143,7 +148,7 @@ std::string GetOSVersion() {
+
+ std::string GetOSVersion() {
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return base::SysInfo::OperatingSystemVersion();
+ #elif BUILDFLAG(IS_WIN)
+ base::win::OSInfo::VersionNumber version_number =
+@@ -166,7 +171,7 @@ std::string GetOSUsername() {
+ }
+
+ std::string GetOSUsername() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ struct passwd* creds = getpwuid(getuid());
+ if (!creds || !creds->pw_name)
+ return std::string();
diff --git a/devel/electron28/files/patch-components_policy_core_common_policy__loader__common.cc b/devel/electron28/files/patch-components_policy_core_common_policy__loader__common.cc
new file mode 100644
index 000000000000..4685aa0ccac7
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_core_common_policy__loader__common.cc
@@ -0,0 +1,20 @@
+--- components/policy/core/common/policy_loader_common.cc.orig 2023-10-19 19:58:19 UTC
++++ components/policy/core/common/policy_loader_common.cc
+@@ -46,7 +46,7 @@ const char* kSensitivePolicies[] = {
+ key::kDefaultSearchProviderEnabled,
+ key::kSafeBrowsingEnabled,
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ key::kAutoOpenFileTypes,
+ key::kSafeBrowsingAllowlistDomains,
+ key::kHomepageIsNewTabPage,
+@@ -55,7 +55,7 @@ const char* kSensitivePolicies[] = {
+ key::kRestoreOnStartup,
+ key::kRestoreOnStartupURLs,
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ key::kCommandLineFlagSecurityWarningsEnabled,
+ #endif
+ #if !BUILDFLAG(IS_IOS)
diff --git a/devel/electron28/files/patch-components_policy_core_common_policy__paths.cc b/devel/electron28/files/patch-components_policy_core_common_policy__paths.cc
new file mode 100644
index 000000000000..b440c03e3b91
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_core_common_policy__paths.cc
@@ -0,0 +1,11 @@
+--- components/policy/core/common/policy_paths.cc.orig 2023-10-19 19:58:19 UTC
++++ components/policy/core/common/policy_paths.cc
+@@ -16,6 +16,8 @@ namespace policy {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING) || \
+ BUILDFLAG(GOOGLE_CHROME_FOR_TESTING_BRANDING)
+ const char kPolicyPath[] = "/etc/opt/chrome/policies";
++#elif BUILDFLAG(IS_FREEBSD)
++const char kPolicyPath[] = "/usr/local/etc/chromium/policies";
+ #else
+ const char kPolicyPath[] = "/etc/chromium/policies";
+ #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) || \
diff --git a/devel/electron28/files/patch-components_policy_tools_generate__policy__source.py b/devel/electron28/files/patch-components_policy_tools_generate__policy__source.py
new file mode 100644
index 000000000000..9c86e74db411
--- /dev/null
+++ b/devel/electron28/files/patch-components_policy_tools_generate__policy__source.py
@@ -0,0 +1,14 @@
+--- components/policy/tools/generate_policy_source.py.orig 2023-10-19 19:58:19 UTC
++++ components/policy/tools/generate_policy_source.py
+@@ -37,9 +37,9 @@ PLATFORM_STRINGS = {
+ 'ios': ['ios'],
+ 'fuchsia': ['fuchsia'],
+ 'chrome.win': ['win'],
+- 'chrome.linux': ['linux'],
++ 'chrome.linux': ['linux', 'openbsd', 'freebsd'],
+ 'chrome.mac': ['mac'],
+- 'chrome.*': ['win', 'mac', 'linux'],
++ 'chrome.*': ['win', 'mac', 'linux', 'openbsd', 'freebsd'],
+ 'chrome.win7': ['win'],
+ }
+
diff --git a/devel/electron28/files/patch-components_power__metrics_BUILD.gn b/devel/electron28/files/patch-components_power__metrics_BUILD.gn
new file mode 100644
index 000000000000..5faa0a4e5e0c
--- /dev/null
+++ b/devel/electron28/files/patch-components_power__metrics_BUILD.gn
@@ -0,0 +1,11 @@
+--- components/power_metrics/BUILD.gn.orig 2023-10-19 19:58:19 UTC
++++ components/power_metrics/BUILD.gn
+@@ -41,7 +41,7 @@ static_library("power_metrics") {
+ ldflags = [ "/DELAYLOAD:setupapi.dll" ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux && !is_bsd) || is_chromeos) {
+ sources += [
+ "energy_metrics_provider_linux.cc",
+ "energy_metrics_provider_linux.h",
diff --git a/devel/electron28/files/patch-components_power__metrics_energy__metrics__provider.cc b/devel/electron28/files/patch-components_power__metrics_energy__metrics__provider.cc
new file mode 100644
index 000000000000..41e8a386d76f
--- /dev/null
+++ b/devel/electron28/files/patch-components_power__metrics_energy__metrics__provider.cc
@@ -0,0 +1,21 @@
+--- components/power_metrics/energy_metrics_provider.cc.orig 2023-08-10 01:48:41 UTC
++++ components/power_metrics/energy_metrics_provider.cc
+@@ -9,6 +9,8 @@
+ #include "components/power_metrics/energy_metrics_provider_win.h"
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ #include "components/power_metrics/energy_metrics_provider_linux.h"
++#elif BUILDFLAG(IS_BSD)
++#include "base/notreached.h"
+ #endif // BUILDFLAG(IS_WIN)
+
+ namespace power_metrics {
+@@ -22,6 +24,9 @@ std::unique_ptr<EnergyMetricsProvider> EnergyMetricsPr
+ return EnergyMetricsProviderWin::Create();
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ return EnergyMetricsProviderLinux::Create();
++#elif BUILDFLAG(IS_BSD)
++ NOTIMPLEMENTED();
++ return nullptr;
+ #else
+ return nullptr;
+ #endif // BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-components_safe__browsing_content_common_file__type__policies__unittest.cc b/devel/electron28/files/patch-components_safe__browsing_content_common_file__type__policies__unittest.cc
new file mode 100644
index 000000000000..92f539f394ef
--- /dev/null
+++ b/devel/electron28/files/patch-components_safe__browsing_content_common_file__type__policies__unittest.cc
@@ -0,0 +1,11 @@
+--- components/safe_browsing/content/common/file_type_policies_unittest.cc.orig 2022-03-25 21:59:56 UTC
++++ components/safe_browsing/content/common/file_type_policies_unittest.cc
+@@ -139,7 +139,7 @@ TEST_F(FileTypePoliciesTest, UnpackResourceBundle) {
+ EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting());
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
+ file_type.platform_settings(0).danger_level());
+ EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN,
diff --git a/devel/electron28/files/patch-components_safe__browsing_content_resources_gen__file__type__proto.py b/devel/electron28/files/patch-components_safe__browsing_content_resources_gen__file__type__proto.py
new file mode 100644
index 000000000000..a02717059420
--- /dev/null
+++ b/devel/electron28/files/patch-components_safe__browsing_content_resources_gen__file__type__proto.py
@@ -0,0 +1,20 @@
+--- components/safe_browsing/content/resources/gen_file_type_proto.py.orig 2023-02-01 18:43:17 UTC
++++ components/safe_browsing/content/resources/gen_file_type_proto.py
+@@ -38,6 +38,8 @@ def PlatformTypes():
+ "fuchsia":
+ download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_FUCHSIA,
+ "linux": download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_LINUX,
++ "openbsd": download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_LINUX,
++ "freebsd": download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_LINUX,
+ "mac": download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_MAC,
+ "win": download_file_types_pb2.DownloadFileType.PLATFORM_TYPE_WINDOWS,
+ }
+@@ -181,7 +183,7 @@ class DownloadFileTypeProtoGenerator(BinaryProtoGenera
+ '-t',
+ '--type',
+ help='The platform type. One of android, chromeos, ' +
+- 'linux, mac, win')
++ 'linux, mac, win, openbsd, freebsd')
+
+ def AddExtraCommandLineArgsForVirtualEnvRun(self, opts, command):
+ if opts.type is not None:
diff --git a/devel/electron28/files/patch-components_safe__browsing_core_browser_db_v4__protocol__manager__util.cc b/devel/electron28/files/patch-components_safe__browsing_core_browser_db_v4__protocol__manager__util.cc
new file mode 100644
index 000000000000..346b428308d5
--- /dev/null
+++ b/devel/electron28/files/patch-components_safe__browsing_core_browser_db_v4__protocol__manager__util.cc
@@ -0,0 +1,11 @@
+--- components/safe_browsing/core/browser/db/v4_protocol_manager_util.cc.orig 2023-11-29 21:39:59 UTC
++++ components/safe_browsing/core/browser/db/v4_protocol_manager_util.cc
+@@ -116,7 +116,7 @@ PlatformType GetCurrentPlatformType() {
+ PlatformType GetCurrentPlatformType() {
+ #if BUILDFLAG(IS_WIN)
+ return WINDOWS_PLATFORM;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return LINUX_PLATFORM;
+ #elif BUILDFLAG(IS_IOS)
+ return IOS_PLATFORM;
diff --git a/devel/electron28/files/patch-components_safe__browsing_core_browser_realtime_url__lookup__service__base.cc b/devel/electron28/files/patch-components_safe__browsing_core_browser_realtime_url__lookup__service__base.cc
new file mode 100644
index 000000000000..93c14e64b7f7
--- /dev/null
+++ b/devel/electron28/files/patch-components_safe__browsing_core_browser_realtime_url__lookup__service__base.cc
@@ -0,0 +1,11 @@
+--- components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc.orig 2022-02-28 16:54:41 UTC
++++ components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc
+@@ -109,7 +109,7 @@ RTLookupRequest::OSType GetRTLookupRequestOSType() {
+ return RTLookupRequest::OS_TYPE_FUCHSIA;
+ #elif BUILDFLAG(IS_IOS)
+ return RTLookupRequest::OS_TYPE_IOS;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return RTLookupRequest::OS_TYPE_LINUX;
+ #elif BUILDFLAG(IS_MAC)
+ return RTLookupRequest::OS_TYPE_MAC;
diff --git a/devel/electron28/files/patch-components_security__interstitials_content_utils.cc b/devel/electron28/files/patch-components_security__interstitials_content_utils.cc
new file mode 100644
index 000000000000..ce119e003a26
--- /dev/null
+++ b/devel/electron28/files/patch-components_security__interstitials_content_utils.cc
@@ -0,0 +1,11 @@
+--- components/security_interstitials/content/utils.cc.orig 2023-02-01 18:43:17 UTC
++++ components/security_interstitials/content/utils.cc
+@@ -38,7 +38,7 @@ void LaunchDateAndTimeSettings() {
+ #if BUILDFLAG(IS_ANDROID)
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_DateAndTimeSettingsHelper_openDateAndTimeSettings(env);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ struct ClockCommand {
+ const char* const pathname;
+ const char* const argument;
diff --git a/devel/electron28/files/patch-components_segmentation__platform_embedder_default__model_cross__device__user__segment.cc b/devel/electron28/files/patch-components_segmentation__platform_embedder_default__model_cross__device__user__segment.cc
new file mode 100644
index 000000000000..b288a715d454
--- /dev/null
+++ b/devel/electron28/files/patch-components_segmentation__platform_embedder_default__model_cross__device__user__segment.cc
@@ -0,0 +1,11 @@
+--- components/segmentation_platform/embedder/default_model/cross_device_user_segment.cc.orig 2023-11-29 21:39:59 UTC
++++ components/segmentation_platform/embedder/default_model/cross_device_user_segment.cc
+@@ -148,7 +148,7 @@ void CrossDeviceUserSegment::ExecuteModelWithInput(
+ // Check for current device type and subtract it from the device count
+ // calculation.
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ desktop_count -= 1;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
diff --git a/devel/electron28/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc b/devel/electron28/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc
new file mode 100644
index 000000000000..e7ac6f04029f
--- /dev/null
+++ b/devel/electron28/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc
@@ -0,0 +1,29 @@
+--- components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.cc.orig 2023-10-19 19:58:19 UTC
++++ components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.cc
+@@ -21,7 +21,7 @@
+
+ #if BUILDFLAG(IS_WIN)
+ #include "content/public/child/dwrite_font_proxy_init_win.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #endif
+
+@@ -78,7 +78,7 @@ PaintPreviewCompositorCollectionImpl::PaintPreviewComp
+ // Initialize font access for Skia.
+ #if BUILDFLAG(IS_WIN)
+ content::InitializeDWriteFontProxy();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ content::UtilityThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -101,7 +101,7 @@ PaintPreviewCompositorCollectionImpl::PaintPreviewComp
+ base::BindOnce([] { SkFontMgr::RefDefault(); }));
+
+ // Sanity check that fonts are working.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // No WebSandbox is provided on Linux so the local fonts aren't accessible.
+ // This is fine since since the subsetted fonts are provided in the SkPicture.
+ // However, we still need to check that the SkFontMgr starts as it is used by
diff --git a/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.cc b/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..2b6d687b2995
--- /dev/null
+++ b/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.cc
@@ -0,0 +1,18 @@
+--- components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc.orig 2023-10-19 19:58:19 UTC
++++ components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc
+@@ -53,6 +53,7 @@ bool ScreenAIPreSandboxHook(sandbox::policy::SandboxLi
+ }
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ auto* instance = sandbox::policy::SandboxLinux::GetInstance();
+
+ std::vector<BrokerFilePermission> permissions{
+@@ -82,6 +83,7 @@ bool ScreenAIPreSandboxHook(sandbox::policy::SandboxLi
+ sandbox::syscall_broker::COMMAND_OPEN}),
+ permissions, sandbox::policy::SandboxLinux::PreSandboxHook(), options);
+ instance->EngageNamespaceSandboxIfPossible();
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.h b/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.h
new file mode 100644
index 000000000000..a9a32ea57ae9
--- /dev/null
+++ b/devel/electron28/files/patch-components_services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.h
@@ -0,0 +1,16 @@
+--- components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.h.orig 2023-05-25 00:41:52 UTC
++++ components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.h
+@@ -5,7 +5,13 @@
+ #ifndef COMPONENTS_SERVICES_SCREEN_AI_SANDBOX_SCREEN_AI_SANDBOX_HOOK_LINUX_H_
+ #define COMPONENTS_SERVICES_SCREEN_AI_SANDBOX_SCREEN_AI_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
++
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace screen_ai {
+
diff --git a/devel/electron28/files/patch-components_services_screen__ai_screen__ai__library__wrapper.cc b/devel/electron28/files/patch-components_services_screen__ai_screen__ai__library__wrapper.cc
new file mode 100644
index 000000000000..34a559afcce8
--- /dev/null
+++ b/devel/electron28/files/patch-components_services_screen__ai_screen__ai__library__wrapper.cc
@@ -0,0 +1,29 @@
+--- components/services/screen_ai/screen_ai_library_wrapper.cc.orig 2023-11-29 21:39:59 UTC
++++ components/services/screen_ai/screen_ai_library_wrapper.cc
+@@ -190,7 +190,7 @@ ScreenAILibraryWrapper::PerformOcr(const SkBitmap& ima
+
+ // TODO(crbug.com/1443341): Remove this after fixing the crash issue on Linux
+ // official.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ free_library_allocated_char_array_(library_buffer.release());
+ #endif
+
+@@ -222,7 +222,7 @@ ScreenAILibraryWrapper::ExtractLayout(const SkBitmap&
+
+ // TODO(crbug.com/1443341): Remove this after fixing the crash issue on Linux
+ // official.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ free_library_allocated_char_array_(library_buffer.release());
+ #endif
+
+@@ -256,7 +256,7 @@ absl::optional<std::vector<int32_t>> ScreenAILibraryWr
+
+ // TODO(crbug.com/1443341): Remove this after fixing the crash issue on Linux
+ // official.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ free_library_allocated_int32_array_(library_buffer.release());
+ #endif
+
diff --git a/devel/electron28/files/patch-components_startup__metric__utils_common_startup__metric__utils.cc b/devel/electron28/files/patch-components_startup__metric__utils_common_startup__metric__utils.cc
new file mode 100644
index 000000000000..0fdebc9fe200
--- /dev/null
+++ b/devel/electron28/files/patch-components_startup__metric__utils_common_startup__metric__utils.cc
@@ -0,0 +1,11 @@
+--- components/startup_metric_utils/common/startup_metric_utils.cc.orig 2023-10-19 19:58:20 UTC
++++ components/startup_metric_utils/common/startup_metric_utils.cc
+@@ -78,7 +78,7 @@ base::TimeTicks CommonStartupMetricRecorder::StartupTi
+ // Enabling this logic on OS X causes a significant performance regression.
+ // TODO(crbug.com/601270): Remove IS_APPLE ifdef once priority changes are
+ // ignored on Mac main thread.
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ static bool statics_initialized = false;
+ if (!statics_initialized) {
+ statics_initialized = true;
diff --git a/devel/electron28/files/patch-components_storage__monitor_BUILD.gn b/devel/electron28/files/patch-components_storage__monitor_BUILD.gn
new file mode 100644
index 000000000000..36f7159c56fc
--- /dev/null
+++ b/devel/electron28/files/patch-components_storage__monitor_BUILD.gn
@@ -0,0 +1,20 @@
+--- components/storage_monitor/BUILD.gn.orig 2023-11-29 21:39:59 UTC
++++ components/storage_monitor/BUILD.gn
+@@ -77,7 +77,7 @@ static_library("storage_monitor") {
+ deps += [ "//services/device/public/mojom" ]
+ }
+ } else if (is_linux || is_chromeos_lacros) {
+- if (use_udev) {
++ if (use_udev && !is_bsd) {
+ sources += [
+ "mtab_watcher_linux.cc",
+ "mtab_watcher_linux.h",
+@@ -184,7 +184,7 @@ source_set("unit_tests") {
+ "storage_monitor_chromeos_unittest.cc",
+ ]
+ }
+- } else if (is_linux || is_chromeos_lacros) {
++ } else if ((is_linux || is_chromeos_lacros) && !is_bsd) {
+ if (use_udev) {
+ sources += [ "storage_monitor_linux_unittest.cc" ]
+ }
diff --git a/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.cc b/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.cc
new file mode 100644
index 000000000000..b5f275ed96b3
--- /dev/null
+++ b/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.cc
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.cc.orig 2022-02-28 16:54:41 UTC
++++ components/storage_monitor/removable_device_constants.cc
+@@ -10,7 +10,7 @@ namespace storage_monitor {
+ const char kFSUniqueIdPrefix[] = "UUID:";
+ const char kVendorModelSerialPrefix[] = "VendorModelSerial:";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kVendorModelVolumeStoragePrefix[] = "VendorModelVolumeStorage:";
+ #endif
+
diff --git a/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.h b/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.h
new file mode 100644
index 000000000000..71ac1f80d945
--- /dev/null
+++ b/devel/electron28/files/patch-components_storage__monitor_removable__device__constants.h
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.h.orig 2022-02-28 16:54:41 UTC
++++ components/storage_monitor/removable_device_constants.h
+@@ -14,7 +14,7 @@ namespace storage_monitor {
+ extern const char kFSUniqueIdPrefix[];
+ extern const char kVendorModelSerialPrefix[];
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ extern const char kVendorModelVolumeStoragePrefix[];
+ #endif
+
diff --git a/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.cc b/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.cc
new file mode 100644
index 000000000000..b54904a78810
--- /dev/null
+++ b/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.cc
@@ -0,0 +1,39 @@
+--- components/supervised_user/core/browser/proto_fetcher.cc.orig 2023-11-29 21:40:00 UTC
++++ components/supervised_user/core/browser/proto_fetcher.cc
+@@ -525,8 +525,11 @@ class RetryingFetcherImpl final : public DeferredFetch
+ // Not copyable.
+ RetryingFetcherImpl(const RetryingFetcherImpl&) = delete;
+ RetryingFetcherImpl& operator=(const RetryingFetcherImpl&) = delete;
+-
++#if defined(__clang__) && (__clang_major__ >= 15)
+ void Start(ProtoFetcher<Response>::Callback callback) override {
++#else
++ void Start(typename ProtoFetcher<Response>::Callback callback) override {
++#endif
+ callback_ = std::move(callback);
+ Retry();
+ }
+@@ -564,7 +567,11 @@ class RetryingFetcherImpl final : public DeferredFetch
+ }
+
+ // Client callback.
++#if defined(__clang__) && (__clang_major__ >= 15)
+ ProtoFetcher<Response>::Callback callback_;
++#else
++ typename ProtoFetcher<Response>::Callback callback_;
++#endif
+
+ // Retry controls.
+ base::OneShotTimer timer_;
+@@ -707,7 +714,11 @@ void ParallelFetchManager<Request, Response>::Fetch(
+ template <typename Request, typename Response>
+ void ParallelFetchManager<Request, Response>::Fetch(
+ const Request& request,
++#if defined(__clang__) && (__clang_major__ >= 15)
+ Fetcher::Callback callback) {
++#else
++ typename Fetcher::Callback callback) {
++#endif
+ CHECK(callback) << "Use base::DoNothing() instead of empty callback.";
+ KeyType key = requests_in_flight_.Add(MakeFetcher(request));
+ requests_in_flight_.Lookup(key)->Start(
diff --git a/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.h b/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.h
new file mode 100644
index 000000000000..b88a6376b365
--- /dev/null
+++ b/devel/electron28/files/patch-components_supervised__user_core_browser_proto__fetcher.h
@@ -0,0 +1,21 @@
+--- components/supervised_user/core/browser/proto_fetcher.h.orig 2023-10-19 19:58:20 UTC
++++ components/supervised_user/core/browser/proto_fetcher.h
+@@ -165,10 +165,18 @@ class ParallelFetchManager {
+
+ // Starts the fetch. Underlying fetcher is stored internally, and will be
+ // cleaned up after finish or when this manager is destroyed.
++#if defined(__clang__) && (__clang_major__ >= 15)
+ void Fetch(const Request& request, Fetcher::Callback callback);
++#else
++ void Fetch(const Request& request, typename Fetcher::Callback callback);
++#endif
+
+ private:
++#if defined(__clang__) && (__clang_major__ >= 15)
+ using KeyType = base::IDMap<std::unique_ptr<Fetcher>>::KeyType;
++#else
++ using KeyType = typename base::IDMap<std::unique_ptr<Fetcher>>::KeyType;
++#endif
+
+ // Remove fetcher under key from requests_in_flight_.
+ void Remove(KeyType key);
diff --git a/devel/electron28/files/patch-components_supervised__user_core_browser_supervised__user__service.cc b/devel/electron28/files/patch-components_supervised__user_core_browser_supervised__user__service.cc
new file mode 100644
index 000000000000..1f99cb64a039
--- /dev/null
+++ b/devel/electron28/files/patch-components_supervised__user_core_browser_supervised__user__service.cc
@@ -0,0 +1,11 @@
+--- components/supervised_user/core/browser/supervised_user_service.cc.orig 2023-11-29 21:40:00 UTC
++++ components/supervised_user/core/browser/supervised_user_service.cc
+@@ -212,7 +212,7 @@ FirstTimeInterstitialBannerState SupervisedUserService
+ const FirstTimeInterstitialBannerState original_state) {
+ FirstTimeInterstitialBannerState target_state = original_state;
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_IOS)
++ BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ if (supervised_user::CanDisplayFirstTimeInterstitialBanner()) {
+ if (original_state != FirstTimeInterstitialBannerState::kSetupComplete &&
+ can_show_first_time_interstitial_banner_) {
diff --git a/devel/electron28/files/patch-components_supervised__user_core_common_features.cc b/devel/electron28/files/patch-components_supervised__user_core_common_features.cc
new file mode 100644
index 000000000000..a119a9c19698
--- /dev/null
+++ b/devel/electron28/files/patch-components_supervised__user_core_common_features.cc
@@ -0,0 +1,20 @@
+--- components/supervised_user/core/common/features.cc.orig 2023-11-29 21:40:00 UTC
++++ components/supervised_user/core/common/features.cc
+@@ -91,7 +91,7 @@ BASE_FEATURE(kEnableManagedByParentUi,
+ "EnableManagedByParentUi",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kEnableExtensionsPermissionsForSupervisedUsersOnDesktop,
+ "EnableExtensionsPermissionsForSupervisedUsersOnDesktop",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+@@ -149,7 +149,7 @@ bool IsChildAccountSupervisionEnabled() {
+ return base::FeatureList::IsEnabled(
+ supervised_user::
+ kFilterWebsitesForSupervisedUsersOnDesktopAndIOS) ||
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ base::FeatureList::IsEnabled(
+ supervised_user::
+ kEnableExtensionsPermissionsForSupervisedUsersOnDesktop) ||
diff --git a/devel/electron28/files/patch-components_supervised__user_core_common_features.h b/devel/electron28/files/patch-components_supervised__user_core_common_features.h
new file mode 100644
index 000000000000..ca2b6df7e1d5
--- /dev/null
+++ b/devel/electron28/files/patch-components_supervised__user_core_common_features.h
@@ -0,0 +1,11 @@
+--- components/supervised_user/core/common/features.h.orig 2023-11-29 21:40:00 UTC
++++ components/supervised_user/core/common/features.h
+@@ -24,7 +24,7 @@ BASE_DECLARE_FEATURE(kClearingCookiesKeepsSupervisedUs
+ extern const base::FeatureParam<std::string> kManagedByParentUiMoreInfoUrl;
+ BASE_DECLARE_FEATURE(kClearingCookiesKeepsSupervisedUsersSignedIn);
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ BASE_DECLARE_FEATURE(kEnableExtensionsPermissionsForSupervisedUsersOnDesktop);
+ #endif
+
diff --git a/devel/electron28/files/patch-components_sync__device__info_local__device__info__util.cc b/devel/electron28/files/patch-components_sync__device__info_local__device__info__util.cc
new file mode 100644
index 000000000000..53fb30f5808c
--- /dev/null
+++ b/devel/electron28/files/patch-components_sync__device__info_local__device__info__util.cc
@@ -0,0 +1,29 @@
+--- components/sync_device_info/local_device_info_util.cc.orig 2023-10-19 19:58:20 UTC
++++ components/sync_device_info/local_device_info_util.cc
+@@ -82,7 +82,7 @@ void OnMachineStatisticsLoaded(LocalDeviceNameInfo* na
+ sync_pb::SyncEnums::DeviceType GetLocalDeviceType() {
+ #if BUILDFLAG(IS_CHROMEOS)
+ return sync_pb::SyncEnums_DeviceType_TYPE_CROS;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return sync_pb::SyncEnums_DeviceType_TYPE_LINUX;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+ switch (ui::GetDeviceFormFactor()) {
+@@ -107,7 +107,7 @@ DeviceInfo::OsType GetLocalDeviceOSType() {
+ return DeviceInfo::OsType::kChromeOsAsh;
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ return DeviceInfo::OsType::kChromeOsLacros;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return DeviceInfo::OsType::kLinux;
+ #elif BUILDFLAG(IS_ANDROID)
+ return DeviceInfo::OsType::kAndroid;
+@@ -126,7 +126,7 @@ DeviceInfo::OsType GetLocalDeviceOSType() {
+
+ DeviceInfo::FormFactor GetLocalDeviceFormFactor() {
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return DeviceInfo::FormFactor::kDesktop;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+ return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET
diff --git a/devel/electron28/files/patch-components_sync__device__info_local__device__info__util__linux.cc b/devel/electron28/files/patch-components_sync__device__info_local__device__info__util__linux.cc
new file mode 100644
index 000000000000..1edb88b39884
--- /dev/null
+++ b/devel/electron28/files/patch-components_sync__device__info_local__device__info__util__linux.cc
@@ -0,0 +1,14 @@
+--- components/sync_device_info/local_device_info_util_linux.cc.orig 2022-09-24 10:57:32 UTC
++++ components/sync_device_info/local_device_info_util_linux.cc
+@@ -9,6 +9,11 @@
+
+ #include "base/linux_util.h"
+
++#if defined(__FreeBSD__)
++#include <sys/param.h>
++#define HOST_NAME_MAX MAXHOSTNAMELEN
++#endif
++
+ namespace syncer {
+
+ std::string GetPersonalizableDeviceNameInternal() {
diff --git a/devel/electron28/files/patch-components_sync_base_features.cc b/devel/electron28/files/patch-components_sync_base_features.cc
new file mode 100644
index 000000000000..ee15f4941b5c
--- /dev/null
+++ b/devel/electron28/files/patch-components_sync_base_features.cc
@@ -0,0 +1,11 @@
+--- components/sync/base/features.cc.orig 2023-11-29 21:40:00 UTC
++++ components/sync/base/features.cc
+@@ -101,7 +101,7 @@ BASE_FEATURE(kSyncPollImmediatelyOnEveryStartup,
+ BASE_FEATURE(kSyncPollImmediatelyOnEveryStartup,
+ "SyncPollImmediatelyOnEveryStartup",
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-components_translate_core_common_translate__util.cc b/devel/electron28/files/patch-components_translate_core_common_translate__util.cc
new file mode 100644
index 000000000000..6f53bd06ff6b
--- /dev/null
+++ b/devel/electron28/files/patch-components_translate_core_common_translate__util.cc
@@ -0,0 +1,11 @@
+--- components/translate/core/common/translate_util.cc.orig 2023-10-19 19:58:21 UTC
++++ components/translate/core/common/translate_util.cc
+@@ -21,7 +21,7 @@ const char kSecurityOrigin[] = "https://translate.goog
+ BASE_FEATURE(kTFLiteLanguageDetectionEnabled,
+ "TFLiteLanguageDetectionEnabled",
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-components_update__client_update__query__params.cc b/devel/electron28/files/patch-components_update__client_update__query__params.cc
new file mode 100644
index 000000000000..b9b184514eab
--- /dev/null
+++ b/devel/electron28/files/patch-components_update__client_update__query__params.cc
@@ -0,0 +1,11 @@
+--- components/update_client/update_query_params.cc.orig 2023-08-10 01:48:42 UTC
++++ components/update_client/update_query_params.cc
+@@ -42,6 +42,8 @@ const char kOs[] =
+ "fuchsia";
+ #elif BUILDFLAG(IS_OPENBSD)
+ "openbsd";
++#elif defined(OS_FREEBSD)
++ "freebsd";
+ #else
+ #error "unknown os"
+ #endif
diff --git a/devel/electron28/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc b/devel/electron28/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc
new file mode 100644
index 000000000000..0499da4e5b21
--- /dev/null
+++ b/devel/electron28/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc
@@ -0,0 +1,11 @@
+--- components/url_formatter/spoof_checks/idn_spoof_checker.cc.orig 2023-10-19 19:58:21 UTC
++++ components/url_formatter/spoof_checks/idn_spoof_checker.cc
+@@ -293,7 +293,7 @@ IDNSpoofChecker::IDNSpoofChecker() {
+ // The ideal fix would be to change the omnibox font used for Thai. In
+ // that case, the Linux-only list should be revisited and potentially
+ // removed.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ "[ทนบพรหเแ๐ดลปฟม]",
+ #else
+ "[บพเแ๐]",
diff --git a/devel/electron28/files/patch-components_user__education_common_product__messaging__controller.cc b/devel/electron28/files/patch-components_user__education_common_product__messaging__controller.cc
new file mode 100644
index 000000000000..f2b28d616804
--- /dev/null
+++ b/devel/electron28/files/patch-components_user__education_common_product__messaging__controller.cc
@@ -0,0 +1,10 @@
+--- components/user_education/common/product_messaging_controller.cc.orig 2023-11-29 21:40:00 UTC
++++ components/user_education/common/product_messaging_controller.cc
+@@ -6,6 +6,7 @@
+
+ #include <sstream>
+ #include <utility>
++#include <vector>
+
+ #include "base/containers/contains.h"
+ #include "base/functional/callback.h"
diff --git a/devel/electron28/files/patch-components_user__education_views_help__bubble__view.cc b/devel/electron28/files/patch-components_user__education_views_help__bubble__view.cc
new file mode 100644
index 000000000000..e71496679b4d
--- /dev/null
+++ b/devel/electron28/files/patch-components_user__education_views_help__bubble__view.cc
@@ -0,0 +1,11 @@
+--- components/user_education/views/help_bubble_view.cc.orig 2023-11-29 21:40:00 UTC
++++ components/user_education/views/help_bubble_view.cc
+@@ -1003,7 +1003,7 @@ void HelpBubbleView::OnBeforeBubbleWidgetInit(views::W
+ void HelpBubbleView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
+ views::Widget* widget) const {
+ BubbleDialogDelegateView::OnBeforeBubbleWidgetInit(params, widget);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Help bubbles anchored to menus may be clipped to their anchors' bounds,
+ // resulting in visual errors, unless they use accelerated rendering. See
+ // crbug.com/1445770 for details.
diff --git a/devel/electron28/files/patch-components_variations_service_variations__service.cc b/devel/electron28/files/patch-components_variations_service_variations__service.cc
new file mode 100644
index 000000000000..9fafda6f0ae5
--- /dev/null
+++ b/devel/electron28/files/patch-components_variations_service_variations__service.cc
@@ -0,0 +1,11 @@
+--- components/variations/service/variations_service.cc.orig 2023-11-29 21:40:00 UTC
++++ components/variations/service/variations_service.cc
+@@ -96,7 +96,7 @@ std::string GetPlatformString() {
+ return "android";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return "fuchsia";
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || BUILDFLAG(IS_SOLARIS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || BUILDFLAG(IS_SOLARIS) || BUILDFLAG(IS_BSD)
+ // Default BSD and SOLARIS to Linux to not break those builds, although these
+ // platforms are not officially supported by Chrome.
+ return "linux";
diff --git a/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc b/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc
new file mode 100644
index 000000000000..f047029ad4bc
--- /dev/null
+++ b/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc
@@ -0,0 +1,11 @@
+--- components/viz/service/display_embedder/skia_output_surface_impl.cc.orig 2023-11-29 21:40:01 UTC
++++ components/viz/service/display_embedder/skia_output_surface_impl.cc
+@@ -1512,7 +1512,7 @@ GrBackendFormat SkiaOutputSurfaceImpl::GetGrBackendFor
+ ->GetDeviceQueue()
+ ->GetVulkanPhysicalDevice(),
+ VK_IMAGE_TILING_OPTIMAL, vk_format, yuv_color_space, ycbcr_info);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Textures that were allocated _on linux_ with ycbcr info came from
+ // VaapiVideoDecoder, which exports using DRM format modifiers.
+ return GrBackendFormats::MakeVk(gr_ycbcr_info,
diff --git a/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl__on__gpu.cc b/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl__on__gpu.cc
new file mode 100644
index 000000000000..7bca67bf5119
--- /dev/null
+++ b/devel/electron28/files/patch-components_viz_service_display__embedder_skia__output__surface__impl__on__gpu.cc
@@ -0,0 +1,15 @@
+--- components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc.orig 2023-11-29 21:40:01 UTC
++++ components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+@@ -1567,7 +1567,12 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutputNV12(
+
+ // Issue readbacks from the surfaces:
+ for (size_t i = 0; i < CopyOutputResult::kNV12MaxPlanes; ++i) {
++#if defined(__clang__) && (__clang_major__ >= 16)
+ SkISize size(plane_surfaces[i]->width(), plane_surfaces[i]->height());
++#else
++ SkISize s = { plane_surfaces[i]->width(), plane_surfaces[i]->height() };
++ SkISize size(s);
++#endif
+ SkImageInfo dst_info = SkImageInfo::Make(
+ size, (i == 0) ? kAlpha_8_SkColorType : kR8G8_unorm_SkColorType,
+ kUnpremul_SkAlphaType);
diff --git a/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.cc b/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.cc
new file mode 100644
index 000000000000..f791ebd31b39
--- /dev/null
+++ b/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.cc
@@ -0,0 +1,20 @@
+--- components/viz/service/display_embedder/software_output_surface.cc.orig 2023-11-29 21:40:01 UTC
++++ components/viz/service/display_embedder/software_output_surface.cc
+@@ -124,7 +124,7 @@ void SoftwareOutputSurface::SwapBuffersCallback(base::
+ now.SnappedToNextTick(refresh_timebase_, refresh_interval_) - now;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ if (needs_swap_size_notifications_)
+ client_->DidSwapWithSize(pixel_size);
+ #endif
+@@ -151,7 +151,7 @@ gfx::OverlayTransform SoftwareOutputSurface::GetDispla
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ void SoftwareOutputSurface::SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) {
+ needs_swap_size_notifications_ = needs_swap_size_notifications;
diff --git a/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.h b/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.h
new file mode 100644
index 000000000000..4f799e7e235f
--- /dev/null
+++ b/devel/electron28/files/patch-components_viz_service_display__embedder_software__output__surface.h
@@ -0,0 +1,20 @@
+--- components/viz/service/display_embedder/software_output_surface.h.orig 2023-11-29 21:40:01 UTC
++++ components/viz/service/display_embedder/software_output_surface.h
+@@ -47,7 +47,7 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : publi
+ gfx::OverlayTransform GetDisplayTransform() override;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ void SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) override;
+ #endif
+@@ -70,7 +70,7 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : publi
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ bool needs_swap_size_notifications_ = false;
+ #endif
+
diff --git a/devel/electron28/files/patch-components_viz_service_display_skia__renderer.cc b/devel/electron28/files/patch-components_viz_service_display_skia__renderer.cc
new file mode 100644
index 000000000000..9900a782d50d
--- /dev/null
+++ b/devel/electron28/files/patch-components_viz_service_display_skia__renderer.cc
@@ -0,0 +1,11 @@
+--- components/viz/service/display/skia_renderer.cc.orig 2023-11-29 21:40:01 UTC
++++ components/viz/service/display/skia_renderer.cc
+@@ -1219,7 +1219,7 @@ void SkiaRenderer::ClearFramebuffer() {
+ if (current_frame()->current_render_pass->has_transparent_background) {
+ ClearCanvas(SkColors::kTransparent);
+ } else {
+-#if DCHECK_IS_ON() && !BUILDFLAG(IS_LINUX)
++#if DCHECK_IS_ON() && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ // On DEBUG builds, opaque render passes are cleared to blue
+ // to easily see regions that were not drawn on the screen.
+ // ClearCavas() call causes slight pixel difference, so linux-ref and
diff --git a/devel/electron28/files/patch-content_app_content__main.cc b/devel/electron28/files/patch-content_app_content__main.cc
new file mode 100644
index 000000000000..23b35c967bc0
--- /dev/null
+++ b/devel/electron28/files/patch-content_app_content__main.cc
@@ -0,0 +1,11 @@
+--- content/app/content_main.cc.orig 2023-12-20 07:12:20 UTC
++++ content/app/content_main.cc
+@@ -206,7 +206,7 @@ RunContentProcess(ContentMainParams params,
+ #endif
+ base::EnableTerminationOnOutOfMemory();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The various desktop environments set this environment variable that
+ // allows the dbus client library to connect directly to the bus. When this
+ // variable is not set (test environments like xvfb-run), the dbus client
diff --git a/devel/electron28/files/patch-content_app_content__main__runner__impl.cc b/devel/electron28/files/patch-content_app_content__main__runner__impl.cc
new file mode 100644
index 000000000000..edf313775872
--- /dev/null
+++ b/devel/electron28/files/patch-content_app_content__main__runner__impl.cc
@@ -0,0 +1,122 @@
+--- content/app/content_main_runner_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/app/content_main_runner_impl.cc
+@@ -143,13 +143,13 @@
+ #include "content/browser/posix_file_descriptor_info_impl.h"
+ #include "content/public/common/content_descriptors.h"
+
+-#if !BUILDFLAG(IS_MAC)
++#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ #include "content/public/common/zygote/zygote_fork_delegate_linux.h"
+ #endif
+
+ #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/files/file_path_watcher_inotify.h"
+ #include "base/native_library.h"
+ #include "base/rand_util.h"
+@@ -187,6 +187,10 @@
+ #include "media/base/media_switches.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "base/system/sys_info.h"
++#endif
++
+ #if BUILDFLAG(IS_ANDROID)
+ #include "base/system/sys_info.h"
+ #include "content/browser/android/battery_metrics.h"
+@@ -376,7 +380,7 @@ void InitializeZygoteSandboxForBrowserProcess(
+ }
+ #endif // BUILDFLAG(USE_ZYGOTE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ #if BUILDFLAG(ENABLE_PPAPI)
+ // Loads the (native) libraries but does not initialize them (i.e., does not
+@@ -414,7 +418,10 @@ void PreSandboxInit() {
+
+ void PreSandboxInit() {
+ // Ensure the /dev/urandom is opened.
++ // we use arc4random
++#if !BUILDFLAG(IS_BSD)
+ base::GetUrandomFD();
++#endif
+
+ // May use sysinfo(), sched_getaffinity(), and open various /sys/ and /proc/
+ // files.
+@@ -426,9 +433,16 @@ void PreSandboxInit() {
+ // https://boringssl.googlesource.com/boringssl/+/HEAD/SANDBOXING.md
+ CRYPTO_pre_sandbox_init();
+
++#if BUILDFLAG(IS_BSD)
++ // "cache" the amount of physical memory before pledge(2)
++ base::SysInfo::AmountOfPhysicalMemoryMB();
++#endif
++
++#if !BUILDFLAG(IS_BSD)
+ // Pre-read /proc/sys/fs/inotify/max_user_watches so it doesn't have to be
+ // allowed by the sandbox.
+ base::GetMaxNumberOfInotifyWatches();
++#endif
+
+ #if BUILDFLAG(ENABLE_PPAPI)
+ // Ensure access to the Pepper plugins before the sandbox is turned on.
+@@ -835,11 +849,10 @@ int ContentMainRunnerImpl::Initialize(ContentMainParam
+ kFieldTrialDescriptor + base::GlobalDescriptors::kBaseDescriptor);
+ #endif // !BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OPENBSD)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ g_fds->Set(kCrashDumpSignal,
+ kCrashDumpSignal + base::GlobalDescriptors::kBaseDescriptor);
+-#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
+- // BUILDFLAG(IS_OPENBSD)
++#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+ #endif // !BUILDFLAG(IS_WIN)
+
+@@ -1035,8 +1048,20 @@ int ContentMainRunnerImpl::Initialize(ContentMainParam
+ process_type == switches::kZygoteProcess) {
+ PreSandboxInit();
+ }
++#elif BUILDFLAG(IS_BSD)
++ PreSandboxInit();
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++ if (process_type.empty()) {
++ sandbox::policy::SandboxLinux::Options sandbox_options;
++ sandbox::policy::SandboxLinux::GetInstance()->InitializeSandbox(
++ sandbox::policy::SandboxTypeFromCommandLine(
++ *base::CommandLine::ForCurrentProcess()),
++ sandbox::policy::SandboxLinux::PreSandboxHook(), sandbox_options);
++ }
++#endif
++
+ delegate_->SandboxInitialized(process_type);
+
+ #if BUILDFLAG(USE_ZYGOTE)
+@@ -1104,7 +1129,7 @@ int NO_STACK_PROTECTOR ContentMainRunnerImpl::Run() {
+ ->ReconfigureAfterFeatureListInit(process_type);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // If dynamic Mojo Core is being used, ensure that it's loaded very early in
+ // the child/zygote process, before any sandbox is initialized. The library
+ // is not fully initialized with IPC support until a ChildProcess is later
+@@ -1139,6 +1164,11 @@ int NO_STACK_PROTECTOR ContentMainRunnerImpl::Run() {
+ content_main_params_.reset();
+
+ RegisterMainThreadFactories();
++
++#if BUILDFLAG(IS_BSD)
++ if (!process_type.empty())
++ PreSandboxInit();
++#endif
+
+ if (process_type.empty())
+ return RunBrowser(std::move(main_params), start_minimal_browser);
diff --git a/devel/electron28/files/patch-content_browser_BUILD.gn b/devel/electron28/files/patch-content_browser_BUILD.gn
new file mode 100644
index 000000000000..614eb8dc2c4a
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_BUILD.gn
@@ -0,0 +1,16 @@
+--- content/browser/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ content/browser/BUILD.gn
+@@ -2474,6 +2474,13 @@ source_set("browser") {
+ deps += [ "//media/mojo/mojom/stable:stable_video_decoder" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "sandbox_ipc_linux.cc",
++ "sandbox_ipc_linux.h",
++ ]
++ }
++
+ if (is_chromeos) {
+ sources += [
+ "handwriting/handwriting_recognition_service_impl_cros.cc",
diff --git a/devel/electron28/files/patch-content_browser_audio_audio__service.cc b/devel/electron28/files/patch-content_browser_audio_audio__service.cc
new file mode 100644
index 000000000000..acf3247eeb79
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_audio_audio__service.cc
@@ -0,0 +1,20 @@
+--- content/browser/audio/audio_service.cc.orig 2023-03-30 00:33:50 UTC
++++ content/browser/audio/audio_service.cc
+@@ -33,7 +33,7 @@
+ #if BUILDFLAG(ENABLE_PASSTHROUGH_AUDIO_CODECS)
+ #include "ui/display/util/edid_parser.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/display/display_util.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -225,7 +225,7 @@ audio::mojom::AudioService& GetAudioService() {
+ ->PostTaskAndReplyWithResult(
+ FROM_HERE, base::BindOnce(&ScanEdidBitstreams),
+ base::BindOnce(&LaunchAudioService, std::move(receiver)));
+-#elif BUILDFLAG(ENABLE_PASSTHROUGH_AUDIO_CODECS) && BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(ENABLE_PASSTHROUGH_AUDIO_CODECS) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD))
+ LaunchAudioService(
+ std::move(receiver),
+ ConvertEdidBitstreams(display::DisplayUtil::GetAudioFormats()));
diff --git a/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.cc b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.cc
new file mode 100644
index 000000000000..295be64c5b2b
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.cc
@@ -0,0 +1,19 @@
+--- content/browser/browser_child_process_host_impl.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/browser_child_process_host_impl.cc
+@@ -321,6 +321,7 @@ void BrowserChildProcessHostImpl::LaunchWithoutExtraCo
+ switches::kDisableBestEffortTasks,
+ switches::kDisableLogging,
+ switches::kEnableLogging,
++ switches::kDisableUnveil,
+ switches::kIPCConnectionTimeout,
+ switches::kLogBestEffortTasks,
+ switches::kLogFile,
+@@ -630,7 +631,7 @@ void BrowserChildProcessHostImpl::OnProcessLaunched()
+ ->child_process());
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ child_thread_type_switcher_.SetPid(process.Pid());
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
diff --git a/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.h b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.h
new file mode 100644
index 000000000000..88e0dce7ac1c
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl.h
@@ -0,0 +1,20 @@
+--- content/browser/browser_child_process_host_impl.h.orig 2023-11-29 21:40:01 UTC
++++ content/browser/browser_child_process_host_impl.h
+@@ -33,7 +33,7 @@
+ #include "base/win/object_watcher.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/browser/child_thread_type_switcher_linux.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -261,7 +261,7 @@ class BrowserChildProcessHostImpl
+ std::unique_ptr<tracing::SystemTracingService> system_tracing_service_;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ChildThreadTypeSwitcher child_thread_type_switcher_;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
diff --git a/devel/electron28/files/patch-content_browser_browser__child__process__host__impl__receiver__bindings.cc b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl__receiver__bindings.cc
new file mode 100644
index 000000000000..6e61caae18dd
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_browser__child__process__host__impl__receiver__bindings.cc
@@ -0,0 +1,11 @@
+--- content/browser/browser_child_process_host_impl_receiver_bindings.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/browser_child_process_host_impl_receiver_bindings.cc
+@@ -62,7 +62,7 @@ void BrowserChildProcessHostImpl::BindHostReceiver(
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (auto r = receiver.As<mojom::ThreadTypeSwitcher>()) {
+ child_thread_type_switcher_.Bind(std::move(r));
+ return;
diff --git a/devel/electron28/files/patch-content_browser_browser__main__loop.cc b/devel/electron28/files/patch-content_browser_browser__main__loop.cc
new file mode 100644
index 000000000000..9f4484f6906e
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_browser__main__loop.cc
@@ -0,0 +1,37 @@
+--- content/browser/browser_main_loop.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/browser_main_loop.cc
+@@ -247,6 +247,12 @@
+ #include "mojo/public/cpp/bindings/lib/test_random_mojo_delays.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "content/browser/sandbox_host_linux.h"
++#include "content/public/common/zygote/sandbox_support_linux.h"
++#include "sandbox/policy/sandbox.h"
++#endif
++
+ // One of the linux specific headers defines this as a macro.
+ #ifdef DestroyAll
+ #undef DestroyAll
+@@ -552,6 +558,12 @@ int BrowserMainLoop::EarlyInitialization() {
+ // by now since a thread to start the ServiceManager has been created
+ // before the browser main loop starts.
+ DCHECK(SandboxHostLinux::GetInstance()->IsInitialized());
++#elif BUILDFLAG(IS_BSD)
++ base::FileHandleMappingVector additional_remapped_fds;
++ base::LaunchOptions options;
++ SandboxHostLinux::GetInstance()->Init();
++ const int sfd = SandboxHostLinux::GetInstance()->GetChildSocket();
++ options.fds_to_remap.push_back(std::make_pair(sfd, GetSandboxFD()));
+ #endif
+
+ // GLib's spawning of new processes is buggy, so it's important that at this
+@@ -589,7 +601,7 @@ int BrowserMainLoop::EarlyInitialization() {
+ base::PlatformThread::SetCurrentThreadType(base::ThreadType::kCompositing);
+
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // We use quite a few file descriptors for our IPC as well as disk the disk
+ // cache, and the default limit on Apple is low (256), so bump it up.
+
diff --git a/devel/electron28/files/patch-content_browser_child__process__launcher__helper.h b/devel/electron28/files/patch-content_browser_child__process__launcher__helper.h
new file mode 100644
index 000000000000..1376baddc847
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_child__process__launcher__helper.h
@@ -0,0 +1,11 @@
+--- content/browser/child_process_launcher_helper.h.orig 2023-11-29 21:40:01 UTC
++++ content/browser/child_process_launcher_helper.h
+@@ -262,7 +262,7 @@ class ChildProcessLauncherHelper
+ std::unique_ptr<SandboxedProcessLauncherDelegate> delegate_;
+ base::WeakPtr<ChildProcessLauncher> child_process_launcher_;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The priority of the process. The state is stored to avoid changing the
+ // setting repeatedly.
+ absl::optional<base::Process::Priority> priority_;
diff --git a/devel/electron28/files/patch-content_browser_child__process__launcher__helper__linux.cc b/devel/electron28/files/patch-content_browser_child__process__launcher__helper__linux.cc
new file mode 100644
index 000000000000..c2d85ddce12e
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_child__process__launcher__helper__linux.cc
@@ -0,0 +1,139 @@
+--- content/browser/child_process_launcher_helper_linux.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/child_process_launcher_helper_linux.cc
+@@ -21,7 +21,9 @@
+ #include "content/public/common/result_codes.h"
+ #include "content/public/common/sandboxed_process_launcher_delegate.h"
+ #include "content/public/common/zygote/sandbox_support_linux.h"
++#if !BUILDFLAG(IS_BSD)
+ #include "content/public/common/zygote/zygote_handle.h"
++#endif
+ #include "sandbox/policy/linux/sandbox_linux.h"
+
+ namespace content {
+@@ -46,14 +48,20 @@ bool ChildProcessLauncherHelper::IsUsingLaunchOptions(
+ }
+
+ bool ChildProcessLauncherHelper::IsUsingLaunchOptions() {
++#if !BUILDFLAG(IS_BSD)
+ return !GetZygoteForLaunch();
++#else
++ return true;
++#endif
+ }
+
+ bool ChildProcessLauncherHelper::BeforeLaunchOnLauncherThread(
+ PosixFileDescriptorInfo& files_to_register,
+ base::LaunchOptions* options) {
+ if (options) {
++#if !BUILDFLAG(IS_BSD)
+ DCHECK(!GetZygoteForLaunch());
++#endif
+ // Convert FD mapping to FileHandleMappingVector
+ options->fds_to_remap = files_to_register.GetMappingWithIDAdjustment(
+ base::GlobalDescriptors::kBaseDescriptor);
+@@ -68,6 +76,7 @@ bool ChildProcessLauncherHelper::BeforeLaunchOnLaunche
+ remapped_fd.first);
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ // (For Electron), if we're launching without zygote, that means we're
+ // launching an unsandboxed process (since all sandboxed processes are
+ // forked from the zygote). Relax the allow_new_privs option to permit
+@@ -76,12 +85,15 @@ bool ChildProcessLauncherHelper::BeforeLaunchOnLaunche
+ delegate_->GetZygote() == nullptr) {
+ options->allow_new_privs = true;
+ }
++#endif
+
+ options->current_directory = delegate_->GetCurrentDirectory();
+ options->environment = delegate_->GetEnvironment();
+ options->clear_environment = !delegate_->ShouldInheritEnvironment();
+ } else {
++#if !BUILDFLAG(IS_BSD)
+ DCHECK(GetZygoteForLaunch());
++#endif
+ // Environment variables could be supported in the future, but are not
+ // currently supported when launching with the zygote.
+ DCHECK(delegate_->GetEnvironment().empty());
+@@ -98,6 +110,7 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ int* launch_result) {
+ *is_synchronous_launch = true;
+ Process process;
++#if !BUILDFLAG(IS_BSD)
+ ZygoteCommunication* zygote_handle = GetZygoteForLaunch();
+ if (zygote_handle) {
+ // TODO(crbug.com/569191): If chrome supported multiple zygotes they could
+@@ -108,7 +121,6 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ GetProcessType());
+ *launch_result = LAUNCH_RESULT_SUCCESS;
+
+-#if !BUILDFLAG(IS_OPENBSD)
+ if (handle) {
+ // It could be a renderer process or an utility process.
+ int oom_score = content::kMiscOomScore;
+@@ -117,15 +129,17 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ oom_score = content::kLowestRendererOomScore;
+ ZygoteHostImpl::GetInstance()->AdjustRendererOOMScore(handle, oom_score);
+ }
+-#endif
+
+ process.process = base::Process(handle);
+ process.zygote = zygote_handle;
+ } else {
++#endif
+ process.process = base::LaunchProcess(*command_line(), *options);
+ *launch_result = process.process.IsValid() ? LAUNCH_RESULT_SUCCESS
+ : LAUNCH_RESULT_FAILURE;
++#if !BUILDFLAG(IS_BSD)
+ }
++#endif
+
+ #if BUILDFLAG(IS_CHROMEOS)
+ if (GetProcessType() == switches::kRendererProcess) {
+@@ -147,10 +161,14 @@ ChildProcessTerminationInfo ChildProcessLauncherHelper
+ const ChildProcessLauncherHelper::Process& process,
+ bool known_dead) {
+ ChildProcessTerminationInfo info;
++#if !BUILDFLAG(IS_BSD)
+ if (process.zygote) {
+ info.status = process.zygote->GetTerminationStatus(
+ process.process.Handle(), known_dead, &info.exit_code);
+ } else if (known_dead) {
++#else
++ if (known_dead) {
++#endif
+ info.status = base::GetKnownDeadTerminationStatus(process.process.Handle(),
+ &info.exit_code);
+ } else {
+@@ -176,13 +194,17 @@ void ChildProcessLauncherHelper::ForceNormalProcessTer
+ DCHECK(CurrentlyOnProcessLauncherTaskRunner());
+ process.process.Terminate(RESULT_CODE_NORMAL_EXIT, false);
+ // On POSIX, we must additionally reap the child.
++#if !BUILDFLAG(IS_BSD)
+ if (process.zygote) {
+ // If the renderer was created via a zygote, we have to proxy the reaping
+ // through the zygote process.
+ process.zygote->EnsureProcessTerminated(process.process.Handle());
+ } else {
++#endif
+ base::EnsureProcessTerminated(std::move(process.process));
++#if !BUILDFLAG(IS_BSD)
+ }
++#endif
+ }
+
+ void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread(
+@@ -195,11 +217,13 @@ void ChildProcessLauncherHelper::SetProcessPriorityOnL
+ }
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ ZygoteCommunication* ChildProcessLauncherHelper::GetZygoteForLaunch() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoZygote)
+ ? nullptr
+ : delegate_->GetZygote();
+ }
++#endif
+
+ base::File OpenFileToShare(const base::FilePath& path,
+ base::MemoryMappedFile::Region* region) {
diff --git a/devel/electron28/files/patch-content_browser_child__thread__type__switcher__linux.cc b/devel/electron28/files/patch-content_browser_child__thread__type__switcher__linux.cc
new file mode 100644
index 000000000000..ab8685db002d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_child__thread__type__switcher__linux.cc
@@ -0,0 +1,20 @@
+--- content/browser/child_thread_type_switcher_linux.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/child_thread_type_switcher_linux.cc
+@@ -20,6 +20,9 @@ void SetThreadTypeOnLauncherThread(base::ProcessId pee
+ base::ThreadType thread_type) {
+ DCHECK(CurrentlyOnProcessLauncherTaskRunner());
+
++#if BUILDFLAG(IS_BSD)
++ NOTIMPLEMENTED();
++#else
+ bool ns_pid_supported = false;
+ pid_t peer_tid = base::FindThreadID(peer_pid, ns_tid, &ns_pid_supported);
+ if (peer_tid == -1) {
+@@ -37,6 +40,7 @@ void SetThreadTypeOnLauncherThread(base::ProcessId pee
+
+ base::PlatformThread::SetThreadType(peer_pid, peer_tid, thread_type,
+ base::IsViaIPC(true));
++#endif
+ }
+
+ } // namespace
diff --git a/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.cc b/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.cc
new file mode 100644
index 000000000000..46dc874f5dac
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.cc
@@ -0,0 +1,38 @@
+--- content/browser/devtools/devtools_frontend_host_impl.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/devtools/devtools_frontend_host_impl.cc
+@@ -22,7 +22,7 @@
+ #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+ #include "ui/base/webui/resource_path.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/crash/content/browser/error_reporting/javascript_error_report.h" // nogncheck
+ #include "components/crash/content/browser/error_reporting/js_error_report_processor.h" // nogncheck
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -37,7 +37,7 @@ const char kCompatibilityScriptSourceURL[] =
+ "\n//# "
+ "sourceURL=devtools://devtools/bundled/devtools_compatibility.js";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Remove the pieces of the URL we don't want to send back with the error
+ // reports. In particular, do not send query or fragments as those can have
+ // privacy-sensitive information in them.
+@@ -107,7 +107,7 @@ DevToolsFrontendHostImpl::DevToolsFrontendHostImpl(
+ const HandleMessageCallback& handle_message_callback)
+ : web_contents_(WebContents::FromRenderFrameHost(frame_host)),
+ handle_message_callback_(handle_message_callback) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ Observe(web_contents_);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ mojo::AssociatedRemote<blink::mojom::DevToolsFrontend> frontend;
+@@ -132,7 +132,7 @@ void DevToolsFrontendHostImpl::DispatchEmbedderMessage
+ handle_message_callback_.Run(std::move(message));
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void DevToolsFrontendHostImpl::OnDidAddMessageToConsole(
+ RenderFrameHost* source_frame,
+ blink::mojom::ConsoleMessageLevel log_level,
diff --git a/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.h b/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.h
new file mode 100644
index 000000000000..bc6318e52c06
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_devtools_devtools__frontend__host__impl.h
@@ -0,0 +1,11 @@
+--- content/browser/devtools/devtools_frontend_host_impl.h.orig 2023-11-29 21:40:01 UTC
++++ content/browser/devtools/devtools_frontend_host_impl.h
+@@ -33,7 +33,7 @@ class DevToolsFrontendHostImpl : public DevToolsFronte
+
+ void BadMessageReceived() override;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void OnDidAddMessageToConsole(
+ RenderFrameHost* source_frame,
+ blink::mojom::ConsoleMessageLevel log_level,
diff --git a/devel/electron28/files/patch-content_browser_devtools_protocol_system__info__handler.cc b/devel/electron28/files/patch-content_browser_devtools_protocol_system__info__handler.cc
new file mode 100644
index 000000000000..212f0c608a0a
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_devtools_protocol_system__info__handler.cc
@@ -0,0 +1,11 @@
+--- content/browser/devtools/protocol/system_info_handler.cc.orig 2023-10-19 19:58:21 UTC
++++ content/browser/devtools/protocol/system_info_handler.cc
+@@ -49,7 +49,7 @@ std::unique_ptr<SystemInfo::Size> GfxSizeToSystemInfoS
+ // 1046598, and 1153667.
+ // Windows builds need more time -- see Issue 873112 and 1004472.
+ // Mac builds need more time - see Issue angleproject:6182.
+-#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !defined(NDEBUG)) || \
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && !defined(NDEBUG)) || \
+ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_OZONE)
+ static constexpr int kGPUInfoWatchdogTimeoutMultiplierOS = 3;
+ #else
diff --git a/devel/electron28/files/patch-content_browser_download_save__package.cc b/devel/electron28/files/patch-content_browser_download_save__package.cc
new file mode 100644
index 000000000000..dfc141f8a45d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_download_save__package.cc
@@ -0,0 +1,16 @@
+--- content/browser/download/save_package.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/download/save_package.cc
+@@ -767,8 +767,13 @@ void SavePackage::Finish() {
+ if (download_) {
+ std::vector<download::DownloadSaveItemData::ItemInfo> files;
+ for (auto& item : saved_success_items_) {
++#if defined(__clang__) && (__clang_major__ >= 16)
+ files.emplace_back(item.second->full_path(), item.second->url(),
+ item.second->referrer().url);
++#else
++ files.emplace_back(download::DownloadSaveItemData::ItemInfo{item.second->full_path(), item.second->url(),
++ item.second->referrer().url});
++#endif
+ }
+ download::DownloadSaveItemData::AttachItemData(download_, std::move(files));
+ }
diff --git a/devel/electron28/files/patch-content_browser_file__system__access_file__system__access__local__path__watcher.cc b/devel/electron28/files/patch-content_browser_file__system__access_file__system__access__local__path__watcher.cc
new file mode 100644
index 000000000000..c0267dda647d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_file__system__access_file__system__access__local__path__watcher.cc
@@ -0,0 +1,11 @@
+--- content/browser/file_system_access/file_system_access_local_path_watcher.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/file_system_access/file_system_access_local_path_watcher.cc
+@@ -63,7 +63,7 @@ void FileSystemAccessLocalPathWatcher::Initialize(
+ base::FilePathWatcher::WatchOptions watch_options {
+ .type = scope().IsRecursive() ? base::FilePathWatcher::Type::kRecursive
+ : base::FilePathWatcher::Type::kNonRecursive,
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Note: `report_modified_path` is also present on Android
+ // and Fuchsia. Update this switch if support for watching
+ // the local file system is added on those platforms.
diff --git a/devel/electron28/files/patch-content_browser_font__access_font__enumeration__data__source.cc b/devel/electron28/files/patch-content_browser_font__access_font__enumeration__data__source.cc
new file mode 100644
index 000000000000..c97bace8497b
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_font__access_font__enumeration__data__source.cc
@@ -0,0 +1,29 @@
+--- content/browser/font_access/font_enumeration_data_source.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/font_access/font_enumeration_data_source.cc
+@@ -16,7 +16,7 @@
+ #include "content/browser/font_access/font_enumeration_data_source_win.h"
+ #elif BUILDFLAG(IS_APPLE)
+ #include "content/browser/font_access/font_enumeration_data_source_mac.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/browser/font_access/font_enumeration_data_source_linux.h"
+ #endif // BUILDFLAG(IS_WIN)
+
+@@ -61,7 +61,7 @@ std::unique_ptr<FontEnumerationDataSource> FontEnumera
+ return std::make_unique<FontEnumerationDataSourceWin>();
+ #elif BUILDFLAG(IS_APPLE)
+ return std::make_unique<FontEnumerationDataSourceMac>();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return std::make_unique<FontEnumerationDataSourceLinux>();
+ #else
+ return std::make_unique<FontEnumerationDataSourceNull>();
+@@ -76,7 +76,7 @@ bool FontEnumerationDataSource::IsOsSupported() {
+ return true;
+ #elif BUILDFLAG(IS_APPLE)
+ return true;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-content_browser_generic__sensor_frame__sensor__provider__proxy.cc b/devel/electron28/files/patch-content_browser_generic__sensor_frame__sensor__provider__proxy.cc
new file mode 100644
index 000000000000..a8ef7418569e
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_generic__sensor_frame__sensor__provider__proxy.cc
@@ -0,0 +1,14 @@
+--- content/browser/generic_sensor/frame_sensor_provider_proxy.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/generic_sensor/frame_sensor_provider_proxy.cc
+@@ -20,7 +20,11 @@ namespace {
+
+ namespace {
+
++#if (_LIBCPP_VERSION >= 160000)
+ constexpr std::vector<blink::mojom::PermissionsPolicyFeature>
++#else
++std::vector<blink::mojom::PermissionsPolicyFeature>
++#endif
+ SensorTypeToPermissionsPolicyFeatures(SensorType type) {
+ switch (type) {
+ case SensorType::AMBIENT_LIGHT:
diff --git a/devel/electron28/files/patch-content_browser_gpu_compositor__util.cc b/devel/electron28/files/patch-content_browser_gpu_compositor__util.cc
new file mode 100644
index 000000000000..6d93c8e311d7
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_compositor__util.cc
@@ -0,0 +1,20 @@
+--- content/browser/gpu/compositor_util.cc.orig 2023-02-01 18:43:19 UTC
++++ content/browser/gpu/compositor_util.cc
+@@ -148,7 +148,7 @@ const GpuFeatureData GetGpuFeatureData(
+ {"video_decode",
+ SafeGetFeatureStatus(gpu_feature_info,
+ gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE),
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ !base::FeatureList::IsEnabled(media::kVaapiVideoDecodeLinux) ||
+ #endif // BUILDFLAG(IS_LINUX)
+ command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode),
+@@ -159,7 +159,7 @@ const GpuFeatureData GetGpuFeatureData(
+ {"video_encode",
+ SafeGetFeatureStatus(gpu_feature_info,
+ gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE),
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ !base::FeatureList::IsEnabled(media::kVaapiVideoEncodeLinux),
+ #else
+ command_line.HasSwitch(switches::kDisableAcceleratedVideoEncode),
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.cc b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.cc
new file mode 100644
index 000000000000..9eecfdc8b420
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.cc
@@ -0,0 +1,11 @@
+--- content/browser/gpu/gpu_data_manager_impl.cc.orig 2023-06-07 04:52:05 UTC
++++ content/browser/gpu/gpu_data_manager_impl.cc
+@@ -410,7 +410,7 @@ void GpuDataManagerImpl::OnDisplayMetricsChanged(
+ private_->OnDisplayMetricsChanged(display, changed_metrics);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool GpuDataManagerImpl::IsGpuMemoryBufferNV12Supported() {
+ base::AutoLock auto_lock(lock_);
+ return private_->IsGpuMemoryBufferNV12Supported();
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.h b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.h
new file mode 100644
index 000000000000..717d74036860
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl.h
@@ -0,0 +1,11 @@
+--- content/browser/gpu/gpu_data_manager_impl.h.orig 2023-06-07 04:52:05 UTC
++++ content/browser/gpu/gpu_data_manager_impl.h
+@@ -222,7 +222,7 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDa
+ void OnDisplayMetricsChanged(const display::Display& display,
+ uint32_t changed_metrics) override;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool IsGpuMemoryBufferNV12Supported();
+ void SetGpuMemoryBufferNV12Supported(bool supported);
+ #endif // BUILDFLAG(IS_LINUX)
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.cc b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.cc
new file mode 100644
index 000000000000..1db6646784b4
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.cc
@@ -0,0 +1,11 @@
+--- content/browser/gpu/gpu_data_manager_impl_private.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/gpu/gpu_data_manager_impl_private.cc
+@@ -1789,7 +1789,7 @@ void GpuDataManagerImplPrivate::RecordCompositingMode(
+ UMA_HISTOGRAM_ENUMERATION("GPU.CompositingMode", compositing_mode);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool GpuDataManagerImplPrivate::IsGpuMemoryBufferNV12Supported() {
+ return is_gpu_memory_buffer_NV12_supported_;
+ }
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.h b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.h
new file mode 100644
index 000000000000..e396c6624f3d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__data__manager__impl__private.h
@@ -0,0 +1,20 @@
+--- content/browser/gpu/gpu_data_manager_impl_private.h.orig 2023-10-25 09:13:44 UTC
++++ content/browser/gpu/gpu_data_manager_impl_private.h
+@@ -152,7 +152,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
+ void OnDisplayMetricsChanged(const display::Display& display,
+ uint32_t changed_metrics);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool IsGpuMemoryBufferNV12Supported();
+ void SetGpuMemoryBufferNV12Supported(bool supported);
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -307,7 +307,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
+ bool application_is_visible_ = true;
+
+ bool disable_gpu_compositing_ = false;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool is_gpu_memory_buffer_NV12_supported_ = false;
+ #endif // BUILDFLAG(IS_LINUX)
+ };
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__memory__buffer__manager__singleton.cc b/devel/electron28/files/patch-content_browser_gpu_gpu__memory__buffer__manager__singleton.cc
new file mode 100644
index 000000000000..553b0844c285
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__memory__buffer__manager__singleton.cc
@@ -0,0 +1,20 @@
+--- content/browser/gpu/gpu_memory_buffer_manager_singleton.cc.orig 2023-05-25 00:41:54 UTC
++++ content/browser/gpu/gpu_memory_buffer_manager_singleton.cc
+@@ -53,7 +53,7 @@ scoped_refptr<base::SingleThreadTaskRunner> GetTaskRun
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool IsGpuMemoryBufferNV12Supported() {
+ static bool is_computed = false;
+ static bool supported = false;
+@@ -116,7 +116,7 @@ void GpuMemoryBufferManagerSingleton::OnGpuExtraInfoUp
+ SetNativeConfigurations(std::move(configs));
+ }
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Dynamic check whether the NV12 format is supported as it may be
+ // inconsistent between the system GBM (Generic Buffer Management) and
+ // chromium miniGBM.
diff --git a/devel/electron28/files/patch-content_browser_gpu_gpu__process__host.cc b/devel/electron28/files/patch-content_browser_gpu_gpu__process__host.cc
new file mode 100644
index 000000000000..537b2b641c85
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_gpu_gpu__process__host.cc
@@ -0,0 +1,19 @@
+--- content/browser/gpu/gpu_process_host.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/gpu/gpu_process_host.cc
+@@ -255,6 +255,7 @@ static const char* const kSwitchNames[] = {
+ switches::kEnableGpuRasterization,
+ switches::kEnableSkiaGraphite,
+ switches::kEnableLogging,
++ switches::kDisableUnveil,
+ switches::kDoubleBufferCompositing,
+ switches::kHeadless,
+ switches::kLoggingLevel,
+@@ -290,7 +291,7 @@ static const char* const kSwitchNames[] = {
+ switches::kOzoneDumpFile,
+ switches::kDisableBufferBWCompression,
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ switches::kX11Display,
+ switches::kNoXshm,
+ #endif
diff --git a/devel/electron28/files/patch-content_browser_interest__group_header__direct__from__seller__signals.cc b/devel/electron28/files/patch-content_browser_interest__group_header__direct__from__seller__signals.cc
new file mode 100644
index 000000000000..96d210263aa7
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_interest__group_header__direct__from__seller__signals.cc
@@ -0,0 +1,14 @@
+--- content/browser/interest_group/header_direct_from_seller_signals.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/interest_group/header_direct_from_seller_signals.cc
+@@ -206,7 +206,11 @@ void OnJsonDecoded(
+
+ } // namespace
+
++#if defined(__clang__) && (__clang_major__ >= 16)
+ HeaderDirectFromSellerSignals::HeaderDirectFromSellerSignals() = default;
++#else
++HeaderDirectFromSellerSignals::HeaderDirectFromSellerSignals() {}
++#endif
+
+ HeaderDirectFromSellerSignals::~HeaderDirectFromSellerSignals() = default;
+
diff --git a/devel/electron28/files/patch-content_browser_media_frameless__media__interface__proxy.h b/devel/electron28/files/patch-content_browser_media_frameless__media__interface__proxy.h
new file mode 100644
index 000000000000..c3269a9e39de
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_media_frameless__media__interface__proxy.h
@@ -0,0 +1,20 @@
+--- content/browser/media/frameless_media_interface_proxy.h.orig 2022-10-24 13:33:33 UTC
++++ content/browser/media/frameless_media_interface_proxy.h
+@@ -19,7 +19,7 @@
+ #include "mojo/public/cpp/bindings/receiver_set.h"
+ #include "mojo/public/cpp/bindings/remote.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "media/mojo/mojom/stable/stable_video_decoder.mojom.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -100,7 +100,7 @@ class FramelessMediaInterfaceProxy final
+ // Connections to the renderer.
+ mojo::ReceiverSet<media::mojom::InterfaceFactory> receivers_;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Connection to the StableVideoDecoderFactory that lives in a utility
+ // process. This is only used for out-of-process video decoding and only when
+ // the FramelessMediaInterfaceProxy is created without a RenderProcessHost
diff --git a/devel/electron28/files/patch-content_browser_media_media__keys__listener__manager__impl.cc b/devel/electron28/files/patch-content_browser_media_media__keys__listener__manager__impl.cc
new file mode 100644
index 000000000000..98242da95391
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_media_media__keys__listener__manager__impl.cc
@@ -0,0 +1,11 @@
+--- content/browser/media/media_keys_listener_manager_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/media/media_keys_listener_manager_impl.cc
+@@ -256,7 +256,7 @@ void MediaKeysListenerManagerImpl::StartListeningForMe
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+ #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
+- BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ system_media_controls_ = system_media_controls::SystemMediaControls::Create(
+ media::AudioManager::GetGlobalAppName());
+ #endif
diff --git a/devel/electron28/files/patch-content_browser_network__service__instance__impl.cc b/devel/electron28/files/patch-content_browser_network__service__instance__impl.cc
new file mode 100644
index 000000000000..4c579b5d4e30
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_network__service__instance__impl.cc
@@ -0,0 +1,29 @@
+--- content/browser/network_service_instance_impl.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/network_service_instance_impl.cc
+@@ -80,7 +80,7 @@
+ #include "content/browser/network/network_service_process_tracker_win.h"
+ #endif
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/browser/system_dns_resolution/system_dns_resolver.h"
+ #include "services/network/public/mojom/system_dns_resolution.mojom-forward.h"
+ #endif
+@@ -357,7 +357,7 @@ void CreateInProcessNetworkService(
+ std::move(receiver)));
+ }
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Runs a self-owned SystemDnsResolverMojoImpl. This is meant to run on a
+ // high-priority thread pool.
+ void RunSystemDnsResolverOnThreadPool(
+@@ -426,7 +426,7 @@ network::mojom::NetworkServiceParamsPtr CreateNetworkS
+ }
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (GetContentClient()
+ ->browser()
+ ->ShouldRunOutOfProcessSystemDnsResolution() &&
diff --git a/devel/electron28/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc b/devel/electron28/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc
new file mode 100644
index 000000000000..db671fc88b41
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc
@@ -0,0 +1,20 @@
+--- content/browser/ppapi_plugin_process_host_receiver_bindings.cc.orig 2022-02-28 16:54:41 UTC
++++ content/browser/ppapi_plugin_process_host_receiver_bindings.cc
+@@ -8,7 +8,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/services/font/public/mojom/font_service.mojom.h" // nogncheck
+ #include "content/browser/font_service.h" // nogncheck
+ #endif
+@@ -17,7 +17,7 @@ namespace content {
+
+ void PpapiPluginProcessHost::BindHostReceiver(
+ mojo::GenericPendingReceiver receiver) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>())
+ ConnectToFontService(std::move(font_receiver));
+ #endif
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_delegated__frame__host.cc b/devel/electron28/files/patch-content_browser_renderer__host_delegated__frame__host.cc
new file mode 100644
index 000000000000..72a75cc20c59
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_delegated__frame__host.cc
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/delegated_frame_host.cc.orig 2023-10-19 19:58:22 UTC
++++ content/browser/renderer_host/delegated_frame_host.cc
+@@ -312,7 +312,7 @@ void DelegatedFrameHost::EmbedSurface(
+
+ if (!primary_surface_id ||
+ primary_surface_id->local_surface_id() != local_surface_id_) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // On Windows and Linux, we would like to produce new content as soon as
+ // possible or the OS will create an additional black gutter. Until we can
+ // block resize on surface synchronization on these platforms, we will not
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc b/devel/electron28/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc
new file mode 100644
index 000000000000..00e9275d7d0d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/input/input_device_change_observer.cc.orig 2022-02-28 16:54:41 UTC
++++ content/browser/renderer_host/input/input_device_change_observer.cc
+@@ -9,7 +9,7 @@
+
+ #if BUILDFLAG(IS_WIN)
+ #include "ui/events/devices/input_device_observer_win.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/events/devices/device_data_manager.h"
+ #elif BUILDFLAG(IS_ANDROID)
+ #include "ui/events/devices/input_device_observer_android.h"
+@@ -21,7 +21,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ render_view_host_impl_ = rvhi;
+ #if BUILDFLAG(IS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->AddObserver(this);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ui::DeviceDataManager::GetInstance()->AddObserver(this);
+ #elif BUILDFLAG(IS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->AddObserver(this);
+@@ -31,7 +31,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ InputDeviceChangeObserver::~InputDeviceChangeObserver() {
+ #if BUILDFLAG(IS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->RemoveObserver(this);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
+ #elif BUILDFLAG(IS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->RemoveObserver(this);
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_media_service__video__capture__device__launcher.cc b/devel/electron28/files/patch-content_browser_renderer__host_media_service__video__capture__device__launcher.cc
new file mode 100644
index 000000000000..20d781553ce6
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_media_service__video__capture__device__launcher.cc
@@ -0,0 +1,20 @@
+--- content/browser/renderer_host/media/service_video_capture_device_launcher.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/renderer_host/media/service_video_capture_device_launcher.cc
+@@ -25,7 +25,7 @@
+ #include "media/base/media_switches.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "content/browser/gpu/gpu_data_manager_impl.h"
+ #endif
+
+@@ -172,7 +172,7 @@ void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAs
+ }
+ #else
+ if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux, additionally check whether the NV12 GPU memory buffer is
+ // supported.
+ if (GpuDataManagerImpl::GetInstance()->IsGpuMemoryBufferNV12Supported())
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc b/devel/electron28/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc
new file mode 100644
index 000000000000..e747d1f7a861
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc
@@ -0,0 +1,20 @@
+--- content/browser/renderer_host/pepper/pepper_file_io_host.cc.orig 2022-05-19 14:06:27 UTC
++++ content/browser/renderer_host/pepper/pepper_file_io_host.cc
+@@ -455,7 +455,7 @@ void PepperFileIOHost::OnLocalFileOpened(
+ ppapi::host::ReplyMessageContext reply_context,
+ const base::FilePath& path,
+ base::File::Error error_code) {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Quarantining a file before its contents are available is only supported on
+ // Windows and Linux.
+ if (!FileOpenForWrite(open_flags_) || error_code != base::File::FILE_OK) {
+@@ -489,7 +489,7 @@ void PepperFileIOHost::OnLocalFileOpened(
+ #endif
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void PepperFileIOHost::OnLocalFileQuarantined(
+ ppapi::host::ReplyMessageContext reply_context,
+ const base::FilePath& path,
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.cc b/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.cc
new file mode 100644
index 000000000000..c941b2bcbc88
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.cc
@@ -0,0 +1,55 @@
+--- content/browser/renderer_host/render_process_host_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/renderer_host/render_process_host_impl.cc
+@@ -222,7 +222,7 @@
+ #include "third_party/blink/public/mojom/android_font_lookup/android_font_lookup.mojom.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <sys/resource.h>
+
+ #include "components/services/font/public/mojom/font_service.mojom.h" // nogncheck
+@@ -952,7 +952,7 @@ size_t GetPlatformProcessLimit() {
+ // to indicate failure and std::numeric_limits<size_t>::max() to indicate
+ // unlimited.
+ size_t GetPlatformProcessLimit() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ struct rlimit limit;
+ if (getrlimit(RLIMIT_NPROC, &limit) != 0)
+ return kUnknownPlatformProcessLimit;
+@@ -1159,7 +1159,7 @@ class RenderProcessHostImpl::IOThreadHostImpl : public
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>()) {
+ ConnectToFontService(std::move(font_receiver));
+ return;
+@@ -1253,7 +1253,7 @@ class RenderProcessHostImpl::IOThreadHostImpl : public
+ std::unique_ptr<service_manager::BinderRegistry> binders_;
+ mojo::Receiver<mojom::ChildProcessHost> receiver_{this};
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::Remote<media::mojom::VideoEncodeAcceleratorProviderFactory>
+ video_encode_accelerator_factory_remote_;
+ ChildThreadTypeSwitcher child_thread_type_switcher_;
+@@ -3336,7 +3336,7 @@ void RenderProcessHostImpl::AppendRendererCommandLine(
+ base::TimeTicks::UnixEpoch().since_origin().InMicroseconds()));
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Append `kDisableVideoCaptureUseGpuMemoryBuffer` flag if there is no support
+ // for NV12 GPU memory buffer.
+ if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled() &&
+@@ -3397,6 +3397,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLin
+ switches::kDisableSpeechAPI,
+ switches::kDisableThreadedCompositing,
+ switches::kDisableTouchDragDrop,
++ switches::kDisableUnveil,
+ switches::kDisableUseSharedImagesForPepperVideo,
+ switches::kDisableV8IdleTasks,
+ switches::kDisableVideoCaptureUseGpuMemoryBuffer,
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.h b/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.h
new file mode 100644
index 000000000000..3bac766de3c7
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__process__host__impl.h
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_process_host_impl.h.orig 2023-10-19 19:58:22 UTC
++++ content/browser/renderer_host/render_process_host_impl.h
+@@ -540,7 +540,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
+ // Sets this RenderProcessHost to be guest only. For Testing only.
+ void SetForGuestsOnlyForTesting();
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ // Launch the zygote early in the browser startup.
+ static void EarlyZygoteLaunch();
+ #endif // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__view__host__impl.cc b/devel/electron28/files/patch-content_browser_renderer__host_render__view__host__impl.cc
new file mode 100644
index 000000000000..77ee1adb5a40
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__view__host__impl.cc
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_view_host_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/renderer_host/render_view_host_impl.cc
+@@ -271,7 +271,7 @@ void RenderViewHostImpl::GetPlatformSpecificPrefs(
+ display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYVSCROLL);
+ prefs->arrow_bitmap_width_horizontal_scroll_bar_in_dips =
+ display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXHSCROLL);
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kSystemFontFamily)) {
+ prefs->system_font_family_name =
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
new file mode 100644
index 000000000000..5aaef700738c
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
@@ -0,0 +1,47 @@
+--- content/browser/renderer_host/render_widget_host_view_aura.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/renderer_host/render_widget_host_view_aura.cc
+@@ -121,7 +121,7 @@
+ #include "ui/gfx/gdi_util.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "content/browser/accessibility/browser_accessibility_auralinux.h"
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/text_input_flags.h"
+@@ -463,7 +463,7 @@ gfx::NativeViewAccessible RenderWidgetHostViewAura::Ge
+ return ToBrowserAccessibilityWin(manager->GetBrowserAccessibilityRoot())
+ ->GetCOM();
+
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ BrowserAccessibilityManager* manager =
+ host()->GetOrCreateRootBrowserAccessibilityManager();
+ if (manager && manager->GetBrowserAccessibilityRoot())
+@@ -1724,7 +1724,7 @@ bool RenderWidgetHostViewAura::ShouldDoLearning() {
+ return GetTextInputManager() && GetTextInputManager()->should_do_learning();
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool RenderWidgetHostViewAura::SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
+@@ -2562,7 +2562,7 @@ bool RenderWidgetHostViewAura::NeedsMouseCapture() {
+ }
+
+ bool RenderWidgetHostViewAura::NeedsMouseCapture() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return NeedsInputGrab();
+ #else
+ return false;
+@@ -2745,7 +2745,7 @@ void RenderWidgetHostViewAura::ForwardKeyboardEventWit
+ if (!target_host)
+ return;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* linux_ui = ui::LinuxUi::instance();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
+ if (!event.skip_if_unhandled && linux_ui && event.os_event &&
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.h b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.h
new file mode 100644
index 000000000000..4e4a85061915
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__aura.h
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_widget_host_view_aura.h.orig 2023-10-19 19:58:22 UTC
++++ content/browser/renderer_host/render_widget_host_view_aura.h
+@@ -257,7 +257,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura
+ ukm::SourceId GetClientSourceForMetrics() const override;
+ bool ShouldDoLearning() override;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
diff --git a/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc
new file mode 100644
index 000000000000..7c33a37295c5
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc
@@ -0,0 +1,11 @@
+--- content/browser/renderer_host/render_widget_host_view_event_handler.cc.orig 2023-08-10 01:48:43 UTC
++++ content/browser/renderer_host/render_widget_host_view_event_handler.cc
+@@ -597,7 +597,7 @@ bool RenderWidgetHostViewEventHandler::CanRendererHand
+ if (event->type() == ui::ET_MOUSE_EXITED) {
+ if (mouse_locked || selection_popup)
+ return false;
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Don't forward the mouse leave message which is received when the context
+ // menu is displayed by the page. This confuses the page and causes state
+ // changes.
diff --git a/devel/electron28/files/patch-content_browser_sandbox__host__linux.cc b/devel/electron28/files/patch-content_browser_sandbox__host__linux.cc
new file mode 100644
index 000000000000..d8ad72022d43
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_sandbox__host__linux.cc
@@ -0,0 +1,18 @@
+--- content/browser/sandbox_host_linux.cc.orig 2023-10-19 19:58:22 UTC
++++ content/browser/sandbox_host_linux.cc
+@@ -45,6 +45,7 @@ void SandboxHostLinux::Init() {
+ // Instead, it replies on a temporary socket provided by the caller.
+ PCHECK(0 == shutdown(browser_socket, SHUT_WR)) << "shutdown";
+
++#if !BUILDFLAG(IS_BSD)
+ int pipefds[2];
+ CHECK(0 == pipe(pipefds));
+ const int child_lifeline_fd = pipefds[0];
+@@ -55,6 +56,7 @@ void SandboxHostLinux::Init() {
+ ipc_thread_ = std::make_unique<base::DelegateSimpleThread>(
+ ipc_handler_.get(), "sandbox_ipc_thread");
+ ipc_thread_->Start();
++#endif
+ }
+
+ } // namespace content
diff --git a/devel/electron28/files/patch-content_browser_scheduler_responsiveness_jank__monitor__impl.cc b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_jank__monitor__impl.cc
new file mode 100644
index 000000000000..c0257efeed32
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_jank__monitor__impl.cc
@@ -0,0 +1,11 @@
+--- content/browser/scheduler/responsiveness/jank_monitor_impl.cc.orig 2023-08-10 01:48:43 UTC
++++ content/browser/scheduler/responsiveness/jank_monitor_impl.cc
+@@ -340,7 +340,7 @@ void JankMonitorImpl::ThreadExecutionState::DidRunTask
+ // in context menus, among others). Simply ignore the mismatches for now.
+ // See https://crbug.com/929813 for the details of why the mismatch
+ // happens.
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)) && \
+ BUILDFLAG(IS_OZONE)
+ task_execution_metadata_.clear();
+ #endif
diff --git a/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc
new file mode 100644
index 000000000000..07a8c97d46c8
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc
@@ -0,0 +1,20 @@
+--- content/browser/scheduler/responsiveness/native_event_observer.cc.orig 2022-02-28 16:54:41 UTC
++++ content/browser/scheduler/responsiveness/native_event_observer.cc
+@@ -15,7 +15,7 @@
+
+ #include "ui/events/platform/platform_event_source.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/aura/env.h"
+ #include "ui/events/event.h"
+ #endif
+@@ -39,7 +39,7 @@ NativeEventObserver::~NativeEventObserver() {
+ DeregisterObserver();
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void NativeEventObserver::RegisterObserver() {
+ aura::Env::GetInstance()->AddWindowEventDispatcherObserver(this);
+ }
diff --git a/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h
new file mode 100644
index 000000000000..a051fea15045
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h
@@ -0,0 +1,47 @@
+--- content/browser/scheduler/responsiveness/native_event_observer.h.orig 2023-02-01 18:43:19 UTC
++++ content/browser/scheduler/responsiveness/native_event_observer.h
+@@ -16,7 +16,7 @@
+ #include "content/public/browser/native_event_processor_observer_mac.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/aura/window_event_dispatcher_observer.h"
+ #endif
+
+@@ -41,7 +41,7 @@ namespace responsiveness {
+ class CONTENT_EXPORT NativeEventObserver
+ #if BUILDFLAG(IS_MAC)
+ : public NativeEventProcessorObserver
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ : public aura::WindowEventDispatcherObserver
+ #elif BUILDFLAG(IS_WIN)
+ : public base::MessagePumpForUI::Observer
+@@ -58,7 +58,7 @@ class CONTENT_EXPORT NativeEventObserver
+ NativeEventObserver(WillRunEventCallback will_run_event_callback,
+ DidRunEventCallback did_run_event_callback);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ NativeEventObserver(const NativeEventObserver&) = delete;
+ NativeEventObserver& operator=(const NativeEventObserver&) = delete;
+@@ -74,7 +74,7 @@ class CONTENT_EXPORT NativeEventObserver
+ // Exposed for tests.
+ void WillRunNativeEvent(const void* opaque_identifier) override;
+ void DidRunNativeEvent(const void* opaque_identifier) override;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // aura::WindowEventDispatcherObserver overrides:
+ void OnWindowEventDispatcherStartedProcessing(
+ aura::WindowEventDispatcher* dispatcher,
+@@ -91,7 +91,7 @@ class CONTENT_EXPORT NativeEventObserver
+ void RegisterObserver();
+ void DeregisterObserver();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ struct EventInfo {
+ raw_ptr<const void> unique_id;
+ };
diff --git a/devel/electron28/files/patch-content_browser_service__worker_service__worker__context__wrapper.cc b/devel/electron28/files/patch-content_browser_service__worker_service__worker__context__wrapper.cc
new file mode 100644
index 000000000000..dd50c0017875
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_service__worker_service__worker__context__wrapper.cc
@@ -0,0 +1,15 @@
+--- content/browser/service_worker/service_worker_context_wrapper.cc.orig 2023-12-24 08:42:05 UTC
++++ content/browser/service_worker/service_worker_context_wrapper.cc
+@@ -1470,7 +1470,12 @@ void ServiceWorkerContextWrapper::MaybeProcessPendingW
+ return;
+ }
+
++#if defined(__clang__) && (__clang_major__ >= 16)
+ auto [document_url, key, callback] = std::move(*request);
++#else
++ auto [d_u, key, callback] = std::move(*request);
++ auto document_url = d_u;
++#endif
+
+ DCHECK(document_url.is_valid());
+ TRACE_EVENT1("ServiceWorker",
diff --git a/devel/electron28/files/patch-content_browser_utility__process__host.cc b/devel/electron28/files/patch-content_browser_utility__process__host.cc
new file mode 100644
index 000000000000..1f73a80d9e78
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_utility__process__host.cc
@@ -0,0 +1,56 @@
+--- content/browser/utility_process_host.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/utility_process_host.cc
+@@ -60,7 +60,7 @@
+ #include "content/browser/v8_snapshot_files.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/files/file_util.h"
+ #include "base/files/scoped_file.h"
+ #include "base/pickle.h"
+@@ -70,7 +70,7 @@
+ #include "media/capture/capture_switches.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "base/task/sequenced_task_runner.h"
+ #include "components/viz/host/gpu_client.h"
+ #include "media/capture/capture_switches.h"
+@@ -81,7 +81,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::ScopedFD PassNetworkContextParentDirs(
+ std::vector<base::FilePath> network_context_parent_dirs) {
+ base::Pickle pickle;
+@@ -130,7 +130,7 @@ UtilityProcessHost::UtilityProcessHost(std::unique_ptr
+ started_(false),
+ name_(u"utility process"),
+ file_data_(std::make_unique<ChildProcessLauncherFileData>()),
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ gpu_client_(nullptr, base::OnTaskRunnerDeleter(nullptr)),
+ #endif
+ client_(std::move(client)) {
+@@ -437,7 +437,7 @@ bool UtilityProcessHost::StartProcess() {
+ file_data_->files_to_preload.merge(GetV8SnapshotFilesToPreload());
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The network service should have access to the parent directories
+ // necessary for its usage.
+ if (sandbox_type_ == sandbox::mojom::Sandbox::kNetwork) {
+@@ -448,7 +448,7 @@ bool UtilityProcessHost::StartProcess() {
+ }
+ #endif // BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Pass `kVideoCaptureUseGpuMemoryBuffer` flag to video capture service only
+ // when the video capture use GPU memory buffer enabled and NV12 GPU memory
+ // buffer supported.
diff --git a/devel/electron28/files/patch-content_browser_utility__process__host.h b/devel/electron28/files/patch-content_browser_utility__process__host.h
new file mode 100644
index 000000000000..abc8ee17846a
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_utility__process__host.h
@@ -0,0 +1,20 @@
+--- content/browser/utility_process_host.h.orig 2023-10-25 09:13:45 UTC
++++ content/browser/utility_process_host.h
+@@ -43,7 +43,7 @@ namespace base {
+ class Thread;
+ } // namespace base
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ namespace viz {
+ class GpuClient;
+ } // namespace viz
+@@ -259,7 +259,7 @@ class CONTENT_EXPORT UtilityProcessHost
+ std::vector<RunServiceDeprecatedCallback> pending_run_service_callbacks_;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<viz::GpuClient, base::OnTaskRunnerDeleter> gpu_client_;
+ #endif
+
diff --git a/devel/electron28/files/patch-content_browser_utility__process__host__receiver__bindings.cc b/devel/electron28/files/patch-content_browser_utility__process__host__receiver__bindings.cc
new file mode 100644
index 000000000000..15fa9d46576b
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_utility__process__host__receiver__bindings.cc
@@ -0,0 +1,33 @@
+--- content/browser/utility_process_host_receiver_bindings.cc.orig 2023-10-19 19:58:22 UTC
++++ content/browser/utility_process_host_receiver_bindings.cc
+@@ -10,12 +10,12 @@
+ #include "content/public/browser/content_browser_client.h"
+ #include "content/public/common/content_client.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "components/services/font/public/mojom/font_service.mojom.h" // nogncheck
+ #include "content/browser/font_service.h" // nogncheck
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "components/viz/host/gpu_client.h"
+ #include "content/public/browser/gpu_client.h"
+ #endif
+@@ -24,13 +24,13 @@ namespace content {
+
+ void UtilityProcessHost::BindHostReceiver(
+ mojo::GenericPendingReceiver receiver) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>()) {
+ ConnectToFontService(std::move(font_receiver));
+ return;
+ }
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (auto gpu_receiver = receiver.As<viz::mojom::Gpu>()) {
+ gpu_client_ =
+ content::CreateGpuClient(std::move(gpu_receiver), base::DoNothing());
diff --git a/devel/electron28/files/patch-content_browser_utility__sandbox__delegate.cc b/devel/electron28/files/patch-content_browser_utility__sandbox__delegate.cc
new file mode 100644
index 000000000000..b873f630baea
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_utility__sandbox__delegate.cc
@@ -0,0 +1,32 @@
+--- content/browser/utility_sandbox_delegate.cc.orig 2023-12-20 07:12:20 UTC
++++ content/browser/utility_sandbox_delegate.cc
+@@ -66,13 +66,13 @@ UtilitySandboxedProcessLauncherDelegate::
+ #if BUILDFLAG(ENABLE_PPAPI)
+ sandbox_type_ == sandbox::mojom::Sandbox::kPpapi ||
+ #endif
+-#if BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ sandbox_type_ == sandbox::mojom::Sandbox::kVideoCapture ||
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding ||
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoEncoding ||
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -133,10 +133,10 @@ ZygoteCommunication* UtilitySandboxedProcessLauncherDe
+ // unsandboxed zygote and then apply their actual sandboxes in the forked
+ // process upon startup.
+ if (sandbox_type_ == sandbox::mojom::Sandbox::kNetwork ||
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding ||
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoEncoding ||
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/devel/electron28/files/patch-content_browser_v8__snapshot__files.cc b/devel/electron28/files/patch-content_browser_v8__snapshot__files.cc
new file mode 100644
index 000000000000..0190bfd7a69d
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_v8__snapshot__files.cc
@@ -0,0 +1,11 @@
+--- content/browser/v8_snapshot_files.cc.orig 2023-03-30 00:33:50 UTC
++++ content/browser/v8_snapshot_files.cc
+@@ -13,7 +13,7 @@ namespace content {
+ std::map<std::string, absl::variant<base::FilePath, base::ScopedFD>>
+ GetV8SnapshotFilesToPreload() {
+ std::map<std::string, absl::variant<base::FilePath, base::ScopedFD>> files;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(USE_V8_CONTEXT_SNAPSHOT)
+ files[kV8ContextSnapshotDataDescriptor] = base::FilePath(
+ FILE_PATH_LITERAL(BUILDFLAG(V8_CONTEXT_SNAPSHOT_FILENAME)));
diff --git a/devel/electron28/files/patch-content_browser_web__contents_web__contents__view__aura.cc b/devel/electron28/files/patch-content_browser_web__contents_web__contents__view__aura.cc
new file mode 100644
index 000000000000..e13668532710
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_web__contents_web__contents__view__aura.cc
@@ -0,0 +1,29 @@
+--- content/browser/web_contents/web_contents_view_aura.cc.orig 2023-11-29 21:40:01 UTC
++++ content/browser/web_contents/web_contents_view_aura.cc
+@@ -174,7 +174,7 @@ class WebDragSourceAura : public content::WebContentsO
+ raw_ptr<aura::Window> window_;
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Fill out the OSExchangeData with a file contents, synthesizing a name if
+ // necessary.
+ void PrepareDragForFileContents(const DropData& drop_data,
+@@ -258,7 +258,7 @@ void PrepareDragData(const DropData& drop_data,
+ if (!drop_data.download_metadata.empty())
+ PrepareDragForDownload(drop_data, provider, web_contents);
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // We set the file contents before the URL because the URL also sets file
+ // contents (to a .URL shortcut). We want to prefer file content data over
+ // a shortcut so we add it first.
+@@ -1319,7 +1319,7 @@ void WebContentsViewAura::OnMouseEvent(ui::MouseEvent*
+ // Linux window managers like to handle raise-on-click themselves. If we
+ // raise-on-click manually, this may override user settings that prevent
+ // focus-stealing.
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ // It is possible for the web-contents to be destroyed while it is being
+ // activated. Use a weak-ptr to track whether that happened or not.
+ // More in https://crbug.com/1040725
diff --git a/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.cc b/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.cc
new file mode 100644
index 000000000000..7ab0fdb481b4
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.cc
@@ -0,0 +1,38 @@
+--- content/browser/webui/web_ui_main_frame_observer.cc.orig 2023-05-25 00:41:55 UTC
++++ content/browser/webui/web_ui_main_frame_observer.cc
+@@ -13,7 +13,7 @@
+ #include "content/public/browser/navigation_handle.h"
+ #include "content/public/browser/web_ui_controller.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/feature_list.h"
+ #include "base/functional/callback_helpers.h"
+ #include "base/logging.h"
+@@ -31,7 +31,7 @@ namespace content {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Remove the pieces of the URL we don't want to send back with the error
+ // reports. In particular, do not send query or fragments as those can have
+ // privacy-sensitive information in them.
+@@ -55,7 +55,7 @@ WebUIMainFrameObserver::WebUIMainFrameObserver(WebUIIm
+
+ WebUIMainFrameObserver::~WebUIMainFrameObserver() = default;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void WebUIMainFrameObserver::OnDidAddMessageToConsole(
+ RenderFrameHost* source_frame,
+ blink::mojom::ConsoleMessageLevel log_level,
+@@ -167,7 +167,7 @@ void WebUIMainFrameObserver::ReadyToCommitNavigation(
+
+ // TODO(crbug.com/1129544) This is currently disabled due to Windows DLL
+ // thunking issues. Fix & re-enable.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ MaybeEnableWebUIJavaScriptErrorReporting(navigation_handle);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ }
diff --git a/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.h b/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.h
new file mode 100644
index 000000000000..20f198f06ca5
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_webui_web__ui__main__frame__observer.h
@@ -0,0 +1,20 @@
+--- content/browser/webui/web_ui_main_frame_observer.h.orig 2022-07-22 17:30:31 UTC
++++ content/browser/webui/web_ui_main_frame_observer.h
+@@ -44,7 +44,7 @@ class CONTENT_EXPORT WebUIMainFrameObserver : public W
+
+ // TODO(crbug.com/1129544) This is currently disabled due to Windows DLL
+ // thunking issues. Fix & re-enable.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On official Google builds, capture and report JavaScript error messages on
+ // WebUI surfaces back to Google. This allows us to fix JavaScript errors and
+ // exceptions.
+@@ -60,7 +60,7 @@ class CONTENT_EXPORT WebUIMainFrameObserver : public W
+ void ReadyToCommitNavigation(NavigationHandle* navigation_handle) override;
+
+ private:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ void MaybeEnableWebUIJavaScriptErrorReporting(
+ NavigationHandle* navigation_handle);
+
diff --git a/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.cc b/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.cc
new file mode 100644
index 000000000000..1b8d4dee24b0
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.cc
@@ -0,0 +1,81 @@
+--- content/browser/zygote_host/zygote_host_impl_linux.cc.orig 2022-11-30 08:12:58 UTC
++++ content/browser/zygote_host/zygote_host_impl_linux.cc
+@@ -19,8 +19,10 @@
+ #include "build/chromeos_buildflags.h"
+ #include "content/common/zygote/zygote_commands_linux.h"
+ #include "content/common/zygote/zygote_communication_linux.h"
++#if !BUILDFLAG(IS_BSD)
+ #include "content/common/zygote/zygote_handle_impl_linux.h"
+ #include "content/public/common/zygote/zygote_handle.h"
++#endif
+ #include "sandbox/linux/services/credentials.h"
+ #include "sandbox/linux/services/namespace_sandbox.h"
+ #include "sandbox/linux/suid/client/setuid_sandbox_host.h"
+@@ -38,6 +40,7 @@ namespace content {
+
+ namespace {
+
++#if !BUILDFLAG(IS_BSD)
+ // Receive a fixed message on fd and return the sender's PID.
+ // Returns true if the message received matches the expected message.
+ bool ReceiveFixedMessage(int fd,
+@@ -59,6 +62,7 @@ bool ReceiveFixedMessage(int fd,
+ return false;
+ return true;
+ }
++#endif
+
+ } // namespace
+
+@@ -68,9 +72,13 @@ ZygoteHost* ZygoteHost::GetInstance() {
+ }
+
+ ZygoteHostImpl::ZygoteHostImpl()
++#if !BUILDFLAG(IS_BSD)
+ : use_namespace_sandbox_(false),
+ use_suid_sandbox_(false),
+ use_suid_sandbox_for_adj_oom_score_(false),
++#else
++ :
++#endif
+ sandbox_binary_(),
+ zygote_pids_lock_(),
+ zygote_pids_() {}
+@@ -83,6 +91,7 @@ ZygoteHostImpl* ZygoteHostImpl::GetInstance() {
+ }
+
+ void ZygoteHostImpl::Init(const base::CommandLine& command_line) {
++#if !BUILDFLAG(IS_BSD)
+ if (command_line.HasSwitch(sandbox::policy::switches::kNoSandbox)) {
+ return;
+ }
+@@ -133,6 +142,7 @@ void ZygoteHostImpl::Init(const base::CommandLine& com
+ "you can try using --"
+ << sandbox::policy::switches::kNoSandbox << ".";
+ }
++#endif
+ }
+
+ void ZygoteHostImpl::AddZygotePid(pid_t pid) {
+@@ -157,6 +167,7 @@ pid_t ZygoteHostImpl::LaunchZygote(
+ base::CommandLine* cmd_line,
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds) {
++#if !BUILDFLAG(IS_BSD)
+ int fds[2];
+ CHECK_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds));
+ CHECK(base::UnixDomainSocket::EnableReceiveProcessId(fds[0]));
+@@ -224,9 +235,12 @@ pid_t ZygoteHostImpl::LaunchZygote(
+
+ AddZygotePid(pid);
+ return pid;
++#else
++ return 0;
++#endif
+ }
+
+-#if !BUILDFLAG(IS_OPENBSD)
++#if !BUILDFLAG(IS_BSD)
+ void ZygoteHostImpl::AdjustRendererOOMScore(base::ProcessHandle pid,
+ int score) {
+ // 1) You can't change the oom_score_adj of a non-dumpable process
diff --git a/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.h b/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.h
new file mode 100644
index 000000000000..ef9868a470dc
--- /dev/null
+++ b/devel/electron28/files/patch-content_browser_zygote__host_zygote__host__impl__linux.h
@@ -0,0 +1,29 @@
+--- content/browser/zygote_host/zygote_host_impl_linux.h.orig 2023-02-01 18:43:19 UTC
++++ content/browser/zygote_host/zygote_host_impl_linux.h
+@@ -47,12 +47,14 @@ class CONTENT_EXPORT ZygoteHostImpl : public ZygoteHos
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds);
+
++#if !BUILDFLAG(IS_BSD)
+ void AdjustRendererOOMScore(base::ProcessHandle process_handle,
+ int score) override;
+ #if BUILDFLAG(IS_CHROMEOS)
+ void ReinitializeLogging(uint32_t logging_dest,
+ base::PlatformFile log_file_fd) override;
+ #endif // BUILDFLAG(IS_CHROMEOS)
++#endif
+
+ bool HasZygote() { return !zygote_pids_.empty(); }
+
+@@ -67,9 +69,11 @@ class CONTENT_EXPORT ZygoteHostImpl : public ZygoteHos
+
+ int renderer_sandbox_status_;
+
++#if !BUILDFLAG(IS_BSD)
+ bool use_namespace_sandbox_;
+ bool use_suid_sandbox_;
+ bool use_suid_sandbox_for_adj_oom_score_;
++#endif
+ std::string sandbox_binary_;
+
+ // This lock protects the |zygote_pids_| set.
diff --git a/devel/electron28/files/patch-content_child_BUILD.gn b/devel/electron28/files/patch-content_child_BUILD.gn
new file mode 100644
index 000000000000..844fa12ed5a5
--- /dev/null
+++ b/devel/electron28/files/patch-content_child_BUILD.gn
@@ -0,0 +1,16 @@
+--- content/child/BUILD.gn.orig 2023-11-29 21:40:01 UTC
++++ content/child/BUILD.gn
+@@ -128,6 +128,13 @@ target(link_target_type, "child") {
+ ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "sandboxed_process_thread_type_handler.cc",
++ "sandboxed_process_thread_type_handler.h",
++ ]
++ }
++
+ if (is_win) {
+ sources += [
+ "dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc",
diff --git a/devel/electron28/files/patch-content_child_child__process.cc b/devel/electron28/files/patch-content_child_child__process.cc
new file mode 100644
index 000000000000..7f24d1d27e5a
--- /dev/null
+++ b/devel/electron28/files/patch-content_child_child__process.cc
@@ -0,0 +1,11 @@
+--- content/child/child_process.cc.orig 2023-11-29 21:40:01 UTC
++++ content/child/child_process.cc
+@@ -66,7 +66,7 @@ ChildProcess::ChildProcess(base::ThreadType io_thread_
+ thread_pool_init_params)
+ : resetter_(&child_process, this, nullptr),
+ io_thread_(std::make_unique<ChildIOThread>()) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+ const bool is_embedded_in_browser_process =
diff --git a/devel/electron28/files/patch-content_common_BUILD.gn b/devel/electron28/files/patch-content_common_BUILD.gn
new file mode 100644
index 000000000000..281bffcbe565
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_BUILD.gn
@@ -0,0 +1,12 @@
+--- content/common/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ content/common/BUILD.gn
+@@ -439,6 +439,9 @@ if (is_linux || is_chromeos) {
+ public = [ "set_process_title_linux.h" ]
+ sources = [ "set_process_title_linux.cc" ]
+ deps = [ "//base" ]
++ if (is_bsd) {
++ sources -= [ "set_process_title_linux.cc" ]
++ }
+ }
+ }
+
diff --git a/devel/electron28/files/patch-content_common_features.cc b/devel/electron28/files/patch-content_common_features.cc
new file mode 100644
index 000000000000..1f6011ae7cdf
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_features.cc
@@ -0,0 +1,20 @@
+--- content/common/features.cc.orig 2023-11-29 21:40:01 UTC
++++ content/common/features.cc
+@@ -154,7 +154,7 @@ BASE_FEATURE(kEnableBackForwardCacheForScreenReader,
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+ // Enables error reporting for JS errors inside DevTools frontend host
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kEnableDevToolsJsErrorReporting,
+ "EnableDevToolsJsErrorReporting",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+@@ -246,7 +246,7 @@ BASE_FEATURE(kGroupNIKByJoiningOrigin,
+ // process and having browser process handle adjusting thread properties (nice
+ // value, c-group, latency sensitivity...) for children which have sandbox
+ // restrictions.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ BASE_FEATURE(kHandleChildThreadTypeChangesInBrowser,
+ "HandleChildThreadTypeChangesInBrowser",
+ base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/devel/electron28/files/patch-content_common_features.h b/devel/electron28/files/patch-content_common_features.h
new file mode 100644
index 000000000000..b7e3b27233df
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_features.h
@@ -0,0 +1,20 @@
+--- content/common/features.h.orig 2023-11-29 21:40:01 UTC
++++ content/common/features.h
+@@ -37,7 +37,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableBackForward
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kDocumentPolicyNegotiation);
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnumerateDevicesHideDeviceIDs);
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableBackForwardCacheForScreenReader);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableDevToolsJsErrorReporting);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnsureAllowBindingsIsAlwaysForWebUI);
+@@ -58,7 +58,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kGroupNIKByJoining
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kGpuInfoCollectionSeparatePrefetch);
+ #endif
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kGroupNIKByJoiningOrigin);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kHandleChildThreadTypeChangesInBrowser);
+ #endif
+ CONTENT_EXPORT BASE_DECLARE_FEATURE(kHighPriorityBeforeUnload);
diff --git a/devel/electron28/files/patch-content_common_font__list__unittest.cc b/devel/electron28/files/patch-content_common_font__list__unittest.cc
new file mode 100644
index 000000000000..ecb7c11ec57a
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_font__list__unittest.cc
@@ -0,0 +1,11 @@
+--- content/common/font_list_unittest.cc.orig 2023-02-01 18:43:19 UTC
++++ content/common/font_list_unittest.cc
+@@ -47,7 +47,7 @@ TEST(FontList, GetFontList) {
+ EXPECT_TRUE(HasFontWithName(fonts, "MS Gothic", "MS Gothic"));
+ EXPECT_TRUE(HasFontWithName(fonts, "Segoe UI", "Segoe UI"));
+ EXPECT_TRUE(HasFontWithName(fonts, "Verdana", "Verdana"));
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ EXPECT_TRUE(HasFontWithName(fonts, "Arimo", "Arimo"));
+ #else
+ EXPECT_TRUE(HasFontWithName(fonts, "Arial", "Arial"));
diff --git a/devel/electron28/files/patch-content_common_mojo__core__library__support.cc b/devel/electron28/files/patch-content_common_mojo__core__library__support.cc
new file mode 100644
index 000000000000..06c2981025ca
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_mojo__core__library__support.cc
@@ -0,0 +1,11 @@
+--- content/common/mojo_core_library_support.cc.orig 2022-02-28 16:54:41 UTC
++++ content/common/mojo_core_library_support.cc
+@@ -15,7 +15,7 @@ bool IsMojoCoreSharedLibraryEnabled() {
+ }
+
+ absl::optional<base::FilePath> GetMojoCoreSharedLibraryPath() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+ if (!command_line.HasSwitch(switches::kMojoCoreLibraryPath))
diff --git a/devel/electron28/files/patch-content_common_user__agent.cc b/devel/electron28/files/patch-content_common_user__agent.cc
new file mode 100644
index 000000000000..b29b11284b7a
--- /dev/null
+++ b/devel/electron28/files/patch-content_common_user__agent.cc
@@ -0,0 +1,37 @@
+--- content/common/user_agent.cc.orig 2023-03-30 00:33:51 UTC
++++ content/common/user_agent.cc
+@@ -45,7 +45,7 @@ std::string GetUserAgentPlatform() {
+ return "";
+ #elif BUILDFLAG(IS_MAC)
+ return "Macintosh; ";
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return "X11; "; // strange, but that's what Firefox uses
+ #elif BUILDFLAG(IS_ANDROID)
+ return "Linux; ";
+@@ -71,7 +71,7 @@ std::string GetUnifiedPlatform() {
+ return "Windows NT 10.0; Win64; x64";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return "Fuchsia";
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return "X11; Linux x86_64";
+ #elif BUILDFLAG(IS_IOS)
+ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
+@@ -296,6 +296,16 @@ std::string BuildOSCpuInfoFromOSVersionAndCpuType(cons
+ "Android %s", os_version.c_str()
+ #elif BUILDFLAG(IS_FUCHSIA)
+ "Fuchsia"
++#elif BUILDFLAG(IS_BSD)
++#if defined(__x86_64__)
++ "Linux x86_64; %s %s",
++#elif defined(__aarch64__)
++ "Linux aarch64; %s %s",
++#else
++ "Linux i686; %s %s",
++#endif
++ unixinfo.sysname, // e.g. Linux
++ cpu_type.c_str() // e.g. i686
+ #elif BUILDFLAG(IS_IOS)
+ "CPU %s OS %s like Mac OS X", cpu_type.c_str(),
+ os_version.c_str()
diff --git a/devel/electron28/files/patch-content_gpu_BUILD.gn b/devel/electron28/files/patch-content_gpu_BUILD.gn
new file mode 100644
index 000000000000..d7b1c6f61a76
--- /dev/null
+++ b/devel/electron28/files/patch-content_gpu_BUILD.gn
@@ -0,0 +1,20 @@
+--- content/gpu/BUILD.gn.orig 2023-05-25 00:41:55 UTC
++++ content/gpu/BUILD.gn
+@@ -104,6 +104,17 @@ target(link_target_type, "gpu_sources") {
+ }
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "gpu_sandbox_hook_linux.cc",
++ "gpu_sandbox_hook_linux.h",
++ ]
++ sources += [
++ "gpu_sandbox_hook_bsd.cc",
++ "gpu_sandbox_hook_bsd.h",
++ ]
++ }
++
+ if (is_chromeos_ash) {
+ deps += [
+ "//components/services/font/public/cpp",
diff --git a/devel/electron28/files/patch-content_gpu_gpu__child__thread.cc b/devel/electron28/files/patch-content_gpu_gpu__child__thread.cc
new file mode 100644
index 000000000000..7c0c2e917b55
--- /dev/null
+++ b/devel/electron28/files/patch-content_gpu_gpu__child__thread.cc
@@ -0,0 +1,21 @@
+--- content/gpu/gpu_child_thread.cc.orig 2023-11-29 21:40:01 UTC
++++ content/gpu/gpu_child_thread.cc
+@@ -59,7 +59,7 @@
+ #include "third_party/skia/include/ports/SkFontConfigInterface.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/sandboxed_process_thread_type_handler.h"
+ #endif
+
+@@ -143,7 +143,8 @@ void GpuChildThread::Init(const base::TimeTicks& proce
+
+ viz_main_.gpu_service()->set_start_time(process_start_time);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++// XXX BSD
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ SandboxedProcessThreadTypeHandler::NotifyMainChildThreadCreated();
+ #endif
+
diff --git a/devel/electron28/files/patch-content_gpu_gpu__main.cc b/devel/electron28/files/patch-content_gpu_gpu__main.cc
new file mode 100644
index 000000000000..7c7beeea48b4
--- /dev/null
+++ b/devel/electron28/files/patch-content_gpu_gpu__main.cc
@@ -0,0 +1,66 @@
+--- content/gpu/gpu_main.cc.orig 2023-12-20 07:12:20 UTC
++++ content/gpu/gpu_main.cc
+@@ -91,7 +91,7 @@
+ #include "sandbox/win/src/sandbox.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/sandboxed_process_thread_type_handler.h"
+ #include "content/gpu/gpu_sandbox_hook_linux.h"
+ #include "sandbox/policy/linux/sandbox_linux.h"
+@@ -114,7 +114,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread*,
+ const gpu::GPUInfo*,
+ const gpu::GpuPreferences&);
+@@ -179,7 +179,7 @@ class ContentSandboxHelper : public gpu::GpuSandboxHel
+ bool EnsureSandboxInitialized(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) override {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return StartSandboxLinux(watchdog_thread, gpu_info, gpu_prefs);
+ #elif BUILDFLAG(IS_WIN)
+ return StartSandboxWindows(sandbox_info_);
+@@ -293,7 +293,7 @@ int GpuMain(MainFunctionParams parameters) {
+ std::make_unique<base::SingleThreadTaskExecutor>(
+ gpu_preferences.message_pump_type);
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #error "Unsupported Linux platform."
+ #elif BUILDFLAG(IS_MAC)
+ // Cross-process CoreAnimation requires a CFRunLoop to function at all, and
+@@ -332,7 +332,8 @@ int GpuMain(MainFunctionParams parameters) {
+ // before it.
+ InitializeSkia();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++// XXX BSD
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ // Thread type delegate of the process should be registered before
+ // first thread type change in ChildProcess constructor.
+ // It also needs to be registered before the process has multiple threads,
+@@ -439,7 +440,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) {
+@@ -479,7 +480,7 @@ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdo
+ sandbox_options.accelerated_video_encode_enabled =
+ !gpu_prefs.disable_accelerated_video_encode;
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Video decoding of many video streams can use thousands of FDs as well as
+ // Exo clients like Lacros.
+ // See https://crbug.com/1417237
diff --git a/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.cc b/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.cc
new file mode 100644
index 000000000000..f13abb4dbcca
--- /dev/null
+++ b/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.cc
@@ -0,0 +1,72 @@
+--- content/gpu/gpu_sandbox_hook_bsd.cc.orig 2023-06-07 04:52:28 UTC
++++ content/gpu/gpu_sandbox_hook_bsd.cc
+@@ -0,0 +1,69 @@
++// Copyright 2023 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "content/gpu/gpu_sandbox_hook_bsd.h"
++
++#include <dlfcn.h>
++#include <errno.h>
++#include <sys/stat.h>
++
++#include <memory>
++#include <sstream>
++#include <utility>
++#include <vector>
++
++#include "base/base_paths.h"
++#include "base/files/file_enumerator.h"
++#include "base/files/file_path.h"
++#include "base/files/scoped_file.h"
++#include "base/functional/bind.h"
++#include "base/logging.h"
++#include "base/path_service.h"
++#include "base/strings/stringprintf.h"
++#include "build/build_config.h"
++#include "build/buildflag.h"
++#include "build/chromeos_buildflags.h"
++#include "content/common/set_process_title.h"
++#include "content/public/common/content_switches.h"
++#include "media/gpu/buildflags.h"
++
++namespace content {
++namespace {
++
++constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE;
++
++void LoadVulkanLibraries() {
++ // Try to preload Vulkan libraries. Failure is not an error as not all may be
++ // present.
++ const char* kLibraries[] = {
++ "libvulkan.so",
++ "libvulkan_intel.so",
++ "libvulkan_intel_hasvk.so",
++ "libvulkan_radeon.so",
++ };
++ for (const auto* library : kLibraries) {
++ dlopen(library, dlopen_flag);
++ }
++}
++
++bool LoadLibrariesForGpu(
++ const sandbox::policy::SandboxSeccompBPF::Options& options) {
++ LoadVulkanLibraries();
++
++ return true;
++}
++
++} // namespace
++
++bool GpuProcessPreSandboxHook(sandbox::policy::SandboxLinux::Options options) {
++ if (!LoadLibrariesForGpu(options))
++ return false;
++
++ // TODO(tsepez): enable namspace sandbox here once crashes are understood.
++
++ errno = 0;
++ return true;
++}
++
++} // namespace content
diff --git a/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.h b/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.h
new file mode 100644
index 000000000000..af78665753d8
--- /dev/null
+++ b/devel/electron28/files/patch-content_gpu_gpu__sandbox__hook__bsd.h
@@ -0,0 +1,19 @@
+--- content/gpu/gpu_sandbox_hook_bsd.h.orig 2023-06-07 04:52:28 UTC
++++ content/gpu/gpu_sandbox_hook_bsd.h
+@@ -0,0 +1,16 @@
++// Copyright 2023 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef CONTENT_GPU_GPU_SANDBOX_HOOK_BSD_H_
++#define CONTENT_GPU_GPU_SANDBOX_HOOK_BSD_H_
++
++#include "sandbox/policy/sandbox.h"
++
++namespace content {
++
++bool GpuProcessPreSandboxHook(sandbox::policy::SandboxLinux::Options options);
++
++} // namespace content
++
++#endif // CONTENT_GPU_GPU_SANDBOX_HOOK_BSD_H_
diff --git a/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
new file mode 100644
index 000000000000..54e1c3cfe9fb
--- /dev/null
+++ b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
@@ -0,0 +1,29 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.cc.orig 2023-05-25 00:41:55 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.cc
+@@ -20,7 +20,7 @@
+
+ #if BUILDFLAG(IS_MAC)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #include "mojo/public/cpp/bindings/pending_remote.h"
+ #endif
+@@ -35,7 +35,7 @@ typedef struct CGFont* CGFontRef;
+ namespace content {
+
+ PpapiBlinkPlatformImpl::PpapiBlinkPlatformImpl() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ ChildThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -54,7 +54,7 @@ PpapiBlinkPlatformImpl::~PpapiBlinkPlatformImpl() {
+ void PpapiBlinkPlatformImpl::Shutdown() {}
+
+ blink::WebSandboxSupport* PpapiBlinkPlatformImpl::GetSandboxSupport() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return sandbox_support_.get();
+ #else
+ return nullptr;
diff --git a/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
new file mode 100644
index 000000000000..730f7963c140
--- /dev/null
+++ b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
@@ -0,0 +1,11 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.h.orig 2023-05-25 00:41:55 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.h
+@@ -33,7 +33,7 @@ class PpapiBlinkPlatformImpl : public BlinkPlatformImp
+ blink::WebString DefaultLocale() override;
+
+ private:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+ };
diff --git a/devel/electron28/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc
new file mode 100644
index 000000000000..8db52fe29e7b
--- /dev/null
+++ b/devel/electron28/files/patch-content_ppapi__plugin_ppapi__plugin__main.cc
@@ -0,0 +1,23 @@
+--- content/ppapi_plugin/ppapi_plugin_main.cc.orig 2023-08-10 01:48:43 UTC
++++ content/ppapi_plugin/ppapi_plugin_main.cc
+@@ -54,6 +54,11 @@
+ #include "gin/v8_initializer.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#include "sandbox/policy/sandbox_type.h"
++#endif
++
+ #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
+ #include <stdlib.h>
+ #endif
+@@ -150,7 +155,7 @@ int PpapiPluginMain(MainFunctionParams parameters) {
+ gin::V8Initializer::LoadV8Snapshot();
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OPENBSD)
+ sandbox::policy::SandboxLinux::GetInstance()->InitializeSandbox(
+ sandbox::policy::SandboxTypeFromCommandLine(command_line),
+ sandbox::policy::SandboxLinux::PreSandboxHook(),
diff --git a/devel/electron28/files/patch-content_public_browser_content__browser__client.cc b/devel/electron28/files/patch-content_public_browser_content__browser__client.cc
new file mode 100644
index 000000000000..ca2e993ca1cd
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_browser_content__browser__client.cc
@@ -0,0 +1,11 @@
+--- content/public/browser/content_browser_client.cc.orig 2023-12-20 07:12:20 UTC
++++ content/public/browser/content_browser_client.cc
+@@ -1275,7 +1275,7 @@ bool ContentBrowserClient::ShouldRunOutOfProcessSystem
+ // that can be adequately sandboxed.
+ // Currently Android's network service will not run out of process or sandboxed,
+ // so OutOfProcessSystemDnsResolution is not currently enabled on Android.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-content_public_browser_web__ui__browser__interface__broker__registry.h b/devel/electron28/files/patch-content_public_browser_web__ui__browser__interface__broker__registry.h
new file mode 100644
index 000000000000..f8705fce2f03
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_browser_web__ui__browser__interface__broker__registry.h
@@ -0,0 +1,16 @@
+--- content/public/browser/web_ui_browser_interface_broker_registry.h.orig 2023-08-10 01:48:43 UTC
++++ content/public/browser/web_ui_browser_interface_broker_registry.h
+@@ -127,10 +127,10 @@ class CONTENT_EXPORT WebUIBrowserInterfaceBrokerRegist
+ //
+ // TODO(crbug.com/1407936): Point to WebUIJsBridge documentation.
+ template <typename ControllerType>
+- JsBridgeTraits<ControllerType>::BinderInitializer& ForWebUIWithJsBridge() {
++ typename JsBridgeTraits<ControllerType>::BinderInitializer& ForWebUIWithJsBridge() {
+ using Traits = JsBridgeTraits<ControllerType>;
+- using Interface = Traits::Interface;
+- using JsBridgeBinderInitializer = Traits::BinderInitializer;
++ using Interface = typename Traits::Interface;
++ using JsBridgeBinderInitializer = typename Traits::BinderInitializer;
+
+ // WebUIController::GetType() requires an instantiated WebUIController
+ // (because it's a virtual method and can't be static). Here we only have
diff --git a/devel/electron28/files/patch-content_public_browser_zygote__host_zygote__host__linux.h b/devel/electron28/files/patch-content_public_browser_zygote__host_zygote__host__linux.h
new file mode 100644
index 000000000000..d5adcef76c4f
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_browser_zygote__host_zygote__host__linux.h
@@ -0,0 +1,16 @@
+--- content/public/browser/zygote_host/zygote_host_linux.h.orig 2023-02-01 18:43:19 UTC
++++ content/public/browser/zygote_host/zygote_host_linux.h
+@@ -35,11 +35,13 @@ class ZygoteHost {
+ // after the first render has been forked.
+ virtual int GetRendererSandboxStatus() = 0;
+
++#if !BUILDFLAG(IS_BSD)
+ // Adjust the OOM score of the given renderer's PID. The allowed
+ // range for the score is [0, 1000], where higher values are more
+ // likely to be killed by the OOM killer.
+ virtual void AdjustRendererOOMScore(base::ProcessHandle process_handle,
+ int score) = 0;
++#endif
+
+ #if BUILDFLAG(IS_CHROMEOS)
+ // Reinitialize logging for the Zygote processes. Needed on ChromeOS, which
diff --git a/devel/electron28/files/patch-content_public_common_content__features.cc b/devel/electron28/files/patch-content_public_common_content__features.cc
new file mode 100644
index 000000000000..4929db9c1f18
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_common_content__features.cc
@@ -0,0 +1,41 @@
+--- content/public/common/content_features.cc.orig 2023-11-29 21:40:02 UTC
++++ content/public/common/content_features.cc
+@@ -40,7 +40,7 @@ BASE_FEATURE(kAudioServiceOutOfProcess,
+ "AudioServiceOutOfProcess",
+ // TODO(crbug.com/1052397): Remove !IS_CHROMEOS_LACROS once lacros starts being
+ // built with OS_CHROMEOS instead of OS_LINUX.
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS))
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+@@ -52,7 +52,7 @@ BASE_FEATURE(kAudioServiceSandbox,
+ // kAudioServiceOutOfProcess feature is enabled.
+ BASE_FEATURE(kAudioServiceSandbox,
+ "AudioServiceSandbox",
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -1170,7 +1170,7 @@ BASE_FEATURE(kWebAssemblyTrapHandler,
+ BASE_FEATURE(kWebAssemblyTrapHandler,
+ "WebAssemblyTrapHandler",
+ #if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC)) && \
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)) && \
+ defined(ARCH_CPU_X86_64)) || \
+ (BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64))
+ base::FEATURE_ENABLED_BY_DEFAULT
+@@ -1212,7 +1212,11 @@ BASE_FEATURE(kWebUICodeCache,
+
+ // Controls whether the WebUSB API is enabled:
+ // https://wicg.github.io/webusb
++#if BUILDFLAG(IS_BSD)
++BASE_FEATURE(kWebUsb, "WebUSB", base::FEATURE_DISABLED_BY_DEFAULT);
++#else
+ BASE_FEATURE(kWebUsb, "WebUSB", base::FEATURE_ENABLED_BY_DEFAULT);
++#endif
+
+ // Controls whether the WebXR Device API is enabled.
+ BASE_FEATURE(kWebXr, "WebXR", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/devel/electron28/files/patch-content_public_common_content__switches.cc b/devel/electron28/files/patch-content_public_common_content__switches.cc
new file mode 100644
index 000000000000..d697a9885058
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_common_content__switches.cc
@@ -0,0 +1,20 @@
+--- content/public/common/content_switches.cc.orig 2023-11-29 21:40:02 UTC
++++ content/public/common/content_switches.cc
+@@ -364,6 +364,8 @@ const char kEnableLogging[] = "enable-
+ // builds.
+ const char kEnableLogging[] = "enable-logging";
+
++const char kDisableUnveil[] = "disable-unveil";
++
+ // Enables the type, downlinkMax attributes of the NetInfo API. Also, enables
+ // triggering of change attribute of the NetInfo API when there is a change in
+ // the connection type.
+@@ -994,7 +996,7 @@ const char kEnableAutomation[] = "enable-automation";
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Allows sending text-to-speech requests to speech-dispatcher, a common
+ // Linux speech service. Because it's buggy, the user must explicitly
+ // enable it so that visiting a random webpage can't cause instability.
diff --git a/devel/electron28/files/patch-content_public_common_content__switches.h b/devel/electron28/files/patch-content_public_common_content__switches.h
new file mode 100644
index 000000000000..d1a098809438
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_common_content__switches.h
@@ -0,0 +1,19 @@
+--- content/public/common/content_switches.h.orig 2023-11-29 21:40:02 UTC
++++ content/public/common/content_switches.h
+@@ -115,6 +115,7 @@ CONTENT_EXPORT extern const char kEnableLogging[];
+ CONTENT_EXPORT extern const char kEnableIsolatedWebAppsInRenderer[];
+ CONTENT_EXPORT extern const char kEnableLCDText[];
+ CONTENT_EXPORT extern const char kEnableLogging[];
++CONTENT_EXPORT extern const char kDisableUnveil[];
+ CONTENT_EXPORT extern const char kEnableNetworkInformationDownlinkMax[];
+ CONTENT_EXPORT extern const char kEnableCanvas2DLayers[];
+ CONTENT_EXPORT extern const char kEnablePluginPlaceholderTesting[];
+@@ -265,7 +266,7 @@ CONTENT_EXPORT extern const char kRendererWaitForJavaD
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ CONTENT_EXPORT extern const char kEnableSpeechDispatcher[];
+ CONTENT_EXPORT extern const char kLLVMProfileFile[];
+ #endif
diff --git a/devel/electron28/files/patch-content_public_common_zygote_features.gni b/devel/electron28/files/patch-content_public_common_zygote_features.gni
new file mode 100644
index 000000000000..0b01fb059dea
--- /dev/null
+++ b/devel/electron28/files/patch-content_public_common_zygote_features.gni
@@ -0,0 +1,8 @@
+--- content/public/common/zygote/features.gni.orig 2023-03-30 00:33:51 UTC
++++ content/public/common/zygote/features.gni
+@@ -2,4 +2,4 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+
+-use_zygote = is_posix && !is_android && !is_apple
++use_zygote = is_posix && !is_android && !is_mac && !is_bsd
diff --git a/devel/electron28/files/patch-content_renderer_render__process__impl.cc b/devel/electron28/files/patch-content_renderer_render__process__impl.cc
new file mode 100644
index 000000000000..9cf872add7fb
--- /dev/null
+++ b/devel/electron28/files/patch-content_renderer_render__process__impl.cc
@@ -0,0 +1,20 @@
+--- content/renderer/render_process_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/renderer/render_process_impl.cc
+@@ -47,7 +47,7 @@
+ #if BUILDFLAG(IS_WIN)
+ #include "base/win/win_util.h"
+ #endif
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_X86_64)
+ #include "v8/include/v8-wasm-trap-handler-posix.h"
+ #endif
+
+@@ -227,7 +227,7 @@ RenderProcessImpl::RenderProcessImpl()
+ // Freezing flags after init conflicts with node in the renderer.
+ v8::V8::SetFlagsFromString("--no-freeze-flags-after-init");
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(ARCH_CPU_X86_64)
+ if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
+ base::CommandLine* const command_line =
+ base::CommandLine::ForCurrentProcess();
diff --git a/devel/electron28/files/patch-content_renderer_render__thread__impl.cc b/devel/electron28/files/patch-content_renderer_render__thread__impl.cc
new file mode 100644
index 000000000000..1e3bf7b5a320
--- /dev/null
+++ b/devel/electron28/files/patch-content_renderer_render__thread__impl.cc
@@ -0,0 +1,38 @@
+--- content/renderer/render_thread_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/renderer/render_thread_impl.cc
+@@ -205,6 +205,8 @@
+
+ #if BUILDFLAG(IS_APPLE)
+ #include <malloc/malloc.h>
++#elif BUILDFLAG(IS_BSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -1020,7 +1022,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl:
+ kGpuStreamIdMedia, kGpuStreamPriorityMedia);
+
+ const bool enable_video_decode_accelerator =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FeatureList::IsEnabled(media::kVaapiVideoDecodeLinux) &&
+ #endif // BUILDFLAG(IS_LINUX)
+ !cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode) &&
+@@ -1029,7 +1031,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl:
+ gpu::kGpuFeatureStatusEnabled);
+
+ const bool enable_video_encode_accelerator =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FeatureList::IsEnabled(media::kVaapiVideoEncodeLinux) &&
+ #else
+ !cmd_line->HasSwitch(switches::kDisableAcceleratedVideoEncode) &&
+@@ -1807,7 +1809,7 @@ std::unique_ptr<CodecFactory> RenderThreadImpl::Create
+ bool enable_video_encode_accelerator) {
+ mojo::PendingRemote<media::mojom::VideoEncodeAcceleratorProvider>
+ vea_provider;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(media::kUseOutOfProcessVideoEncoding)) {
+ BindHostReceiver(vea_provider.InitWithNewPipeAndPassReceiver());
+ } else {
diff --git a/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.cc b/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.cc
new file mode 100644
index 000000000000..496f94a797ef
--- /dev/null
+++ b/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.cc
@@ -0,0 +1,45 @@
+--- content/renderer/renderer_blink_platform_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ content/renderer/renderer_blink_platform_impl.cc
+@@ -113,7 +113,7 @@
+
+ #if BUILDFLAG(IS_MAC)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #include "content/child/sandboxed_process_thread_type_handler.h"
+ #endif
+@@ -182,13 +182,13 @@ RendererBlinkPlatformImpl::RendererBlinkPlatformImpl(
+ sudden_termination_disables_(0),
+ is_locked_to_site_(false),
+ main_thread_scheduler_(main_thread_scheduler) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ sk_sp<font_service::FontLoader> font_loader;
+ #endif
+
+ // RenderThread may not exist in some tests.
+ if (RenderThreadImpl::current()) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ RenderThreadImpl::current()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -197,7 +197,7 @@ RendererBlinkPlatformImpl::RendererBlinkPlatformImpl(
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ if (sandboxEnabled()) {
+ #if BUILDFLAG(IS_MAC)
+ sandbox_support_ = std::make_unique<WebSandboxSupportMac>();
+@@ -258,7 +258,7 @@ blink::WebSandboxSupport* RendererBlinkPlatformImpl::G
+ #endif
+
+ blink::WebSandboxSupport* RendererBlinkPlatformImpl::GetSandboxSupport() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return sandbox_support_.get();
+ #else
+ // These platforms do not require sandbox support.
diff --git a/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.h b/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.h
new file mode 100644
index 000000000000..ce026825371a
--- /dev/null
+++ b/devel/electron28/files/patch-content_renderer_renderer__blink__platform__impl.h
@@ -0,0 +1,11 @@
+--- content/renderer/renderer_blink_platform_impl.h.orig 2023-08-20 00:00:06 UTC
++++ content/renderer/renderer_blink_platform_impl.h
+@@ -237,7 +237,7 @@ class CONTENT_EXPORT RendererBlinkPlatformImpl : publi
+ void Collect3DContextInformation(blink::Platform::GraphicsInfo* gl_info,
+ const gpu::GPUInfo& gpu_info) const;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+
diff --git a/devel/electron28/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc b/devel/electron28/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
new file mode 100644
index 000000000000..aad0a7035f0b
--- /dev/null
+++ b/devel/electron28/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
@@ -0,0 +1,18 @@
+--- content/renderer/renderer_main_platform_delegate_linux.cc.orig 2023-10-19 19:58:22 UTC
++++ content/renderer/renderer_main_platform_delegate_linux.cc
+@@ -44,6 +44,7 @@ bool RendererMainPlatformDelegate::EnableSandbox() {
+ // any renderer has been started.
+ // Here, we test that the status of SeccompBpf in the renderer is consistent
+ // with what SandboxLinux::GetStatus() said we would do.
++#if !BUILDFLAG(IS_BSD)
+ auto* linux_sandbox = sandbox::policy::SandboxLinux::GetInstance();
+ if (linux_sandbox->GetStatus() & sandbox::policy::SandboxLinux::kSeccompBPF) {
+ CHECK(linux_sandbox->seccomp_bpf_started());
+@@ -65,6 +66,7 @@ bool RendererMainPlatformDelegate::EnableSandbox() {
+ CHECK_EQ(errno, EPERM);
+ }
+ #endif // __x86_64__
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-content_shell_BUILD.gn b/devel/electron28/files/patch-content_shell_BUILD.gn
new file mode 100644
index 000000000000..de9fba000501
--- /dev/null
+++ b/devel/electron28/files/patch-content_shell_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/shell/BUILD.gn.orig 2023-11-29 21:40:02 UTC
++++ content/shell/BUILD.gn
+@@ -1026,7 +1026,7 @@ group("content_shell_crash_test") {
+ if (is_win) {
+ data_deps += [ "//build/win:copy_cdb_to_output" ]
+ }
+- if (is_posix) {
++ if (is_posix && !is_bsd) {
+ data_deps += [
+ "//third_party/breakpad:dump_syms",
+ "//third_party/breakpad:minidump_stackwalk",
diff --git a/devel/electron28/files/patch-content_shell_app_shell__main__delegate.cc b/devel/electron28/files/patch-content_shell_app_shell__main__delegate.cc
new file mode 100644
index 000000000000..e444975c574c
--- /dev/null
+++ b/devel/electron28/files/patch-content_shell_app_shell__main__delegate.cc
@@ -0,0 +1,11 @@
+--- content/shell/app/shell_main_delegate.cc.orig 2023-11-29 21:40:02 UTC
++++ content/shell/app/shell_main_delegate.cc
+@@ -227,7 +227,7 @@ void ShellMainDelegate::PreSandboxStartup() {
+ // Reporting for sub-processes will be initialized in ZygoteForked.
+ if (process_type != switches::kZygoteProcess) {
+ crash_reporter::InitializeCrashpad(process_type.empty(), process_type);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ crash_reporter::SetFirstChanceExceptionHandler(
+ v8::TryHandleWebAssemblyTrapPosix);
+ #endif
diff --git a/devel/electron28/files/patch-content_shell_browser_shell__browser__main__parts.cc b/devel/electron28/files/patch-content_shell_browser_shell__browser__main__parts.cc
new file mode 100644
index 000000000000..f463ffc51529
--- /dev/null
+++ b/devel/electron28/files/patch-content_shell_browser_shell__browser__main__parts.cc
@@ -0,0 +1,47 @@
+--- content/shell/browser/shell_browser_main_parts.cc.orig 2023-10-19 19:58:22 UTC
++++ content/shell/browser/shell_browser_main_parts.cc
+@@ -51,7 +51,7 @@
+ #include "net/base/network_change_notifier.h"
+ #endif
+
+-#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ #include "ui/base/ime/init/input_method_initializer.h"
+ #endif
+
+@@ -68,7 +68,7 @@
+ #include "chromeos/lacros/dbus/lacros_dbus_thread_manager.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h" // nogncheck
+ #include "ui/linux/linux_ui_factory.h" // nogncheck
+ #endif
+@@ -139,7 +139,7 @@ void ShellBrowserMainParts::PostCreateMainMessageLoop(
+ }
+
+ int ShellBrowserMainParts::PreEarlyInitialization() {
+-#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ ui::InitializeInputMethodForTesting();
+ #endif
+ #if BUILDFLAG(IS_ANDROID)
+@@ -168,7 +168,7 @@ void ShellBrowserMainParts::ToolkitInitialized() {
+ if (switches::IsRunWebTestsSwitchPresent())
+ return;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ui::LinuxUi::SetInstance(ui::GetDefaultLinuxUi());
+ #endif
+ }
+@@ -215,7 +215,7 @@ void ShellBrowserMainParts::PostMainMessageLoopRun() {
+ ShellDevToolsManagerDelegate::StopHttpHandler();
+ browser_context_.reset();
+ off_the_record_browser_context_.reset();
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ui::LinuxUi::SetInstance(nullptr);
+ #endif
+ performance_manager_lifetime_.reset();
diff --git a/devel/electron28/files/patch-content_shell_browser_shell__paths.cc b/devel/electron28/files/patch-content_shell_browser_shell__paths.cc
new file mode 100644
index 000000000000..c00a1c66a5a2
--- /dev/null
+++ b/devel/electron28/files/patch-content_shell_browser_shell__paths.cc
@@ -0,0 +1,20 @@
+--- content/shell/browser/shell_paths.cc.orig 2022-02-28 16:54:41 UTC
++++ content/shell/browser/shell_paths.cc
+@@ -13,7 +13,7 @@
+
+ #if BUILDFLAG(IS_FUCHSIA)
+ #include "base/fuchsia/file_utils.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/nix/xdg_util.h"
+ #endif
+
+@@ -25,7 +25,7 @@ bool GetDefaultUserDataDirectory(base::FilePath* resul
+ #if BUILDFLAG(IS_WIN)
+ CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, result));
+ *result = result->Append(std::wstring(L"content_shell"));
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ base::FilePath config_dir(base::nix::GetXDGDirectory(
+ env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir));
diff --git a/devel/electron28/files/patch-content_shell_utility_shell__content__utility__client.cc b/devel/electron28/files/patch-content_shell_utility_shell__content__utility__client.cc
new file mode 100644
index 000000000000..6096106c4f80
--- /dev/null
+++ b/devel/electron28/files/patch-content_shell_utility_shell__content__utility__client.cc
@@ -0,0 +1,20 @@
+--- content/shell/utility/shell_content_utility_client.cc.orig 2023-03-30 00:33:51 UTC
++++ content/shell/utility/shell_content_utility_client.cc
+@@ -38,7 +38,7 @@
+ #include "sandbox/policy/sandbox.h"
+ #include "services/test/echo/echo_service.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/test/sandbox_status_service.h"
+ #endif
+
+@@ -187,7 +187,7 @@ void ShellContentUtilityClient::ExposeInterfacesToBrow
+ binders->Add<mojom::PowerMonitorTest>(
+ base::BindRepeating(&PowerMonitorTestImpl::MakeSelfOwnedReceiver),
+ base::SingleThreadTaskRunner::GetCurrentDefault());
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (register_sandbox_status_helper_) {
+ binders->Add<content::mojom::SandboxStatusService>(
+ base::BindRepeating(
diff --git a/devel/electron28/files/patch-content_test_BUILD.gn b/devel/electron28/files/patch-content_test_BUILD.gn
new file mode 100644
index 000000000000..ff22f0ba9427
--- /dev/null
+++ b/devel/electron28/files/patch-content_test_BUILD.gn
@@ -0,0 +1,20 @@
+--- content/test/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ content/test/BUILD.gn
+@@ -2270,7 +2270,7 @@ static_library("run_all_unittests") {
+ ":test_support",
+ "//base/test:test_support",
+ ]
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ deps += [ "//content/common:set_process_title_linux" ]
+ }
+ }
+@@ -3368,7 +3368,7 @@ test("content_unittests") {
+ deps += [ "//third_party/boringssl" ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [ "../common/set_process_title_linux_unittest.cc" ]
+ deps += [ "//content/common:set_process_title_linux" ]
+ }
diff --git a/devel/electron28/files/patch-content_utility_services.cc b/devel/electron28/files/patch-content_utility_services.cc
new file mode 100644
index 000000000000..97b58f64e829
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_services.cc
@@ -0,0 +1,92 @@
+--- content/utility/services.cc.orig 2023-11-29 21:40:02 UTC
++++ content/utility/services.cc
+@@ -67,7 +67,7 @@ extern sandbox::TargetServices* g_utility_target_servi
+ extern sandbox::TargetServices* g_utility_target_services;
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "media/mojo/services/mojo_video_encode_accelerator_provider_factory.h"
+ #include "sandbox/linux/services/libc_interceptor.h"
+ #include "sandbox/policy/mojom/sandbox.mojom.h"
+@@ -90,7 +90,7 @@ extern sandbox::TargetServices* g_utility_target_servi
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH) && (BUILDFLAG(USE_VAAPI) ||
+ // BUILDFLAG(USE_V4L2_CODEC))
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)) && \
+ (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+ #include "content/common/features.h"
+ #include "media/mojo/services/stable_video_decoder_factory_process_service.h" // nogncheck
+@@ -107,7 +107,7 @@ extern sandbox::TargetServices* g_utility_target_servi
+ #include "ui/accessibility/accessibility_features.h"
+ #endif // BUILDFLAG(ENABLE_ACCESSIBILITY_SERVICE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "media/capture/capture_switches.h"
+ #include "services/viz/public/cpp/gpu/gpu.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+@@ -224,7 +224,7 @@ auto RunAudio(mojo::PendingReceiver<audio::mojom::Audi
+ << "task_policy_set TASK_QOS_POLICY";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ auto* command_line = base::CommandLine::ForCurrentProcess();
+ if (sandbox::policy::SandboxTypeFromCommandLine(*command_line) ==
+ sandbox::mojom::Sandbox::kNoSandbox) {
+@@ -306,7 +306,7 @@ auto RunVideoCapture(
+ mojo::PendingReceiver<video_capture::mojom::VideoCaptureService> receiver) {
+ auto service = std::make_unique<UtilityThreadVideoCaptureServiceImpl>(
+ std::move(receiver), base::SingleThreadTaskRunner::GetCurrentDefault());
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) {
+ mojo::PendingRemote<viz::mojom::Gpu> remote_gpu;
+ content::UtilityThread::Get()->BindHostReceiver(
+@@ -345,7 +345,7 @@ auto RunOOPArcVideoAcceleratorFactoryService(
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH) && (BUILDFLAG(USE_VAAPI) ||
+ // BUILDFLAG(USE_V4L2_CODEC))
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)) && \
+ (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+ auto RunStableVideoDecoderFactoryProcessService(
+ mojo::PendingReceiver<
+@@ -356,7 +356,7 @@ auto RunStableVideoDecoderFactoryProcessService(
+ #endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) &&
+ // (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ auto RunVideoEncodeAcceleratorProviderFactory(
+ mojo::PendingReceiver<media::mojom::VideoEncodeAcceleratorProviderFactory>
+ receiver) {
+@@ -379,7 +379,7 @@ void RegisterIOThreadServices(mojo::ServiceFactory& se
+ // loop of type IO that can get notified when pipes have data.
+ services.Add(RunNetworkService);
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)) && \
+ (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+ if (base::FeatureList::IsEnabled(
+ features::kRunStableVideoDecoderFactoryProcessServiceOnIOThread)) {
+@@ -428,7 +428,7 @@ void RegisterMainThreadServices(mojo::ServiceFactory&
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH) && (BUILDFLAG(USE_VAAPI) ||
+ // BUILDFLAG(USE_V4L2_CODEC))
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)) && \
+ (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+ if (!base::FeatureList::IsEnabled(
+ features::kRunStableVideoDecoderFactoryProcessServiceOnIOThread)) {
+@@ -437,7 +437,7 @@ void RegisterMainThreadServices(mojo::ServiceFactory&
+ #endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)) &&
+ // (BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC))
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ services.Add(RunVideoEncodeAcceleratorProviderFactory);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
diff --git a/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.cc b/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..d03589c019e2
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.cc
@@ -0,0 +1,37 @@
+--- content/utility/speech/speech_recognition_sandbox_hook_linux.cc.orig 2023-02-01 18:43:20 UTC
++++ content/utility/speech/speech_recognition_sandbox_hook_linux.cc
+@@ -12,11 +12,14 @@
+ #include "sandbox/linux/syscall_broker/broker_command.h"
+ #include "sandbox/linux/syscall_broker/broker_file_permission.h"
+
++#if !BUILDFLAG(IS_BSD)
+ using sandbox::syscall_broker::BrokerFilePermission;
+ using sandbox::syscall_broker::MakeBrokerCommandSet;
++#endif
+
+ namespace speech {
+
++#if !BUILDFLAG(IS_BSD)
+ namespace {
+
+ // Gets the file permissions required by the Speech On-Device API (SODA).
+@@ -50,9 +53,11 @@ std::vector<BrokerFilePermission> GetSodaFilePermissio
+ }
+
+ } // namespace
++#endif
+
+ bool SpeechRecognitionPreSandboxHook(
+ sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(ENABLE_SODA_INTEGRATION_TESTS)
+ base::FilePath test_binary_path = GetSodaTestBinaryPath();
+ DVLOG(0) << "SODA test binary path: " << test_binary_path.value().c_str();
+@@ -77,6 +82,7 @@ bool SpeechRecognitionPreSandboxHook(
+ sandbox::policy::SandboxLinux::PreSandboxHook(),
+ options);
+ instance->EngageNamespaceSandboxIfPossible();
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.h b/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.h
new file mode 100644
index 000000000000..cbeba4accc3e
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_speech_speech__recognition__sandbox__hook__linux.h
@@ -0,0 +1,16 @@
+--- content/utility/speech/speech_recognition_sandbox_hook_linux.h.orig 2023-10-19 19:58:23 UTC
++++ content/utility/speech/speech_recognition_sandbox_hook_linux.h
+@@ -5,7 +5,13 @@
+ #ifndef CONTENT_UTILITY_SPEECH_SPEECH_RECOGNITION_SANDBOX_HOOK_LINUX_H_
+ #define CONTENT_UTILITY_SPEECH_SPEECH_RECOGNITION_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
++
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace speech {
+
diff --git a/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc b/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc
new file mode 100644
index 000000000000..d954dca7e1c3
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc
@@ -0,0 +1,29 @@
+--- content/utility/utility_blink_platform_with_sandbox_support_impl.cc.orig 2023-05-25 00:41:55 UTC
++++ content/utility/utility_blink_platform_with_sandbox_support_impl.cc
+@@ -9,7 +9,7 @@
+
+ #if BUILDFLAG(IS_MAC)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #endif
+
+@@ -17,7 +17,7 @@ namespace content {
+
+ UtilityBlinkPlatformWithSandboxSupportImpl::
+ UtilityBlinkPlatformWithSandboxSupportImpl() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ UtilityThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -35,7 +35,7 @@ UtilityBlinkPlatformWithSandboxSupportImpl::
+
+ blink::WebSandboxSupport*
+ UtilityBlinkPlatformWithSandboxSupportImpl::GetSandboxSupport() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ return sandbox_support_.get();
+ #else
+ return nullptr;
diff --git a/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h b/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h
new file mode 100644
index 000000000000..c92332ad1c74
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h
@@ -0,0 +1,11 @@
+--- content/utility/utility_blink_platform_with_sandbox_support_impl.h.orig 2023-05-25 00:41:55 UTC
++++ content/utility/utility_blink_platform_with_sandbox_support_impl.h
+@@ -33,7 +33,7 @@ class UtilityBlinkPlatformWithSandboxSupportImpl : pub
+ blink::WebSandboxSupport* GetSandboxSupport() override;
+
+ private:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+ };
diff --git a/devel/electron28/files/patch-content_utility_utility__main.cc b/devel/electron28/files/patch-content_utility_utility__main.cc
new file mode 100644
index 000000000000..0ce2fcc7c839
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_utility__main.cc
@@ -0,0 +1,112 @@
+--- content/utility/utility_main.cc.orig 2023-11-29 21:40:02 UTC
++++ content/utility/utility_main.cc
+@@ -37,7 +37,7 @@
+ #include "third_party/icu/source/common/unicode/unistr.h"
+ #include "third_party/icu/source/i18n/unicode/timezone.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/file_descriptor_store.h"
+ #include "base/files/file_util.h"
+ #include "base/pickle.h"
+@@ -46,7 +46,9 @@
+ #include "content/utility/speech/speech_recognition_sandbox_hook_linux.h"
+ #include "gpu/config/gpu_info_collector.h"
+ #include "media/gpu/sandbox/hardware_video_encoding_sandbox_hook_linux.h"
++#if !BUILDFLAG(IS_BSD)
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+ #include "services/audio/audio_sandbox_hook_linux.h"
+ #include "services/network/network_sandbox_hook_linux.h"
+ // gn check is not smart enough to realize that this include only applies to
+@@ -58,10 +60,14 @@
+ #endif
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ #include "media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#endif
++
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ #include "chromeos/ash/components/assistant/buildflags.h"
+ #include "chromeos/ash/services/ime/ime_sandbox_hook.h"
+@@ -73,7 +79,7 @@
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ #if (BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)))
+ #include "components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.h" // nogncheck
+ #endif
+
+@@ -99,7 +105,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::vector<std::string> GetNetworkContextsParentDirectories() {
+ base::MemoryMappedFile::Region region;
+ base::ScopedFD read_pipe_fd = base::FileDescriptorStore::GetInstance().TakeFD(
+@@ -127,7 +133,7 @@ bool ShouldUseAmdGpuPolicy(sandbox::mojom::Sandbox san
+
+ bool ShouldUseAmdGpuPolicy(sandbox::mojom::Sandbox sandbox_type) {
+ const bool obtain_gpu_info =
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ sandbox_type == sandbox::mojom::Sandbox::kHardwareVideoDecoding ||
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+ sandbox_type == sandbox::mojom::Sandbox::kHardwareVideoEncoding;
+@@ -248,7 +254,8 @@ int UtilityMain(MainFunctionParams parameters) {
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++// XXX BSD
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ // Thread type delegate of the process should be registered before
+ // first thread type change in ChildProcess constructor.
+ // It also needs to be registered before the process has multiple threads,
+@@ -259,7 +266,7 @@ int UtilityMain(MainFunctionParams parameters) {
+ }
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Initializes the sandbox before any threads are created.
+ // TODO(jorgelo): move this after GTK initialization when we enable a strict
+ // Seccomp-BPF policy.
+@@ -288,7 +295,7 @@ int UtilityMain(MainFunctionParams parameters) {
+ pre_sandbox_hook = base::BindOnce(&screen_ai::ScreenAIPreSandboxHook);
+ break;
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ case sandbox::mojom::Sandbox::kHardwareVideoDecoding:
+ pre_sandbox_hook =
+ base::BindOnce(&media::HardwareVideoDecodingPreSandboxHook);
+@@ -315,6 +322,7 @@ int UtilityMain(MainFunctionParams parameters) {
+ default:
+ break;
+ }
++#if !BUILDFLAG(IS_BSD)
+ if (!sandbox::policy::IsUnsandboxedSandboxType(sandbox_type) &&
+ (parameters.zygote_child || !pre_sandbox_hook.is_null())) {
+ sandbox::policy::SandboxLinux::Options sandbox_options;
+@@ -323,6 +331,11 @@ int UtilityMain(MainFunctionParams parameters) {
+ sandbox::policy::Sandbox::Initialize(
+ sandbox_type, std::move(pre_sandbox_hook), sandbox_options);
+ }
++#else
++ sandbox::policy::Sandbox::Initialize(
++ sandbox_type, std::move(pre_sandbox_hook),
++ sandbox::policy::SandboxLinux::Options());
++#endif
+
+ // Start the HangWatcher now that the sandbox is engaged, if it hasn't
+ // already been started.
diff --git a/devel/electron28/files/patch-content_utility_utility__thread__impl.cc b/devel/electron28/files/patch-content_utility_utility__thread__impl.cc
new file mode 100644
index 000000000000..99ab2f23a4f5
--- /dev/null
+++ b/devel/electron28/files/patch-content_utility_utility__thread__impl.cc
@@ -0,0 +1,21 @@
+--- content/utility/utility_thread_impl.cc.orig 2023-11-29 21:40:02 UTC
++++ content/utility/utility_thread_impl.cc
+@@ -32,7 +32,7 @@
+ #include "mojo/public/cpp/bindings/service_factory.h"
+ #include "third_party/abseil-cpp/absl/types/optional.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "content/child/sandboxed_process_thread_type_handler.h"
+ #endif
+
+@@ -252,7 +252,8 @@ void UtilityThreadImpl::Init() {
+
+ GetContentClient()->utility()->UtilityThreadStarted();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++// XXX BSD
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_BSD)
+ SandboxedProcessThreadTypeHandler::NotifyMainChildThreadCreated();
+ #endif
+
diff --git a/devel/electron28/files/patch-content_zygote_BUILD.gn b/devel/electron28/files/patch-content_zygote_BUILD.gn
new file mode 100644
index 000000000000..b9c3d8fe8cdc
--- /dev/null
+++ b/devel/electron28/files/patch-content_zygote_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/zygote/BUILD.gn.orig 2022-02-07 13:39:41 UTC
++++ content/zygote/BUILD.gn
+@@ -5,7 +5,7 @@
+ import("//build/config/nacl/config.gni")
+ import("//content/public/common/zygote/features.gni")
+
+-if (is_linux || is_chromeos) {
++if ((is_linux || is_chromeos) && !is_bsd) {
+ source_set("zygote") {
+ sources = [
+ "zygote_linux.cc",
diff --git a/devel/electron28/files/patch-content_zygote_zygote__linux.cc b/devel/electron28/files/patch-content_zygote_zygote__linux.cc
new file mode 100644
index 000000000000..c6a5656910c4
--- /dev/null
+++ b/devel/electron28/files/patch-content_zygote_zygote__linux.cc
@@ -0,0 +1,15 @@
+--- content/zygote/zygote_linux.cc.orig 2023-10-19 19:58:23 UTC
++++ content/zygote/zygote_linux.cc
+@@ -1,6 +1,7 @@
+ // Copyright 2012 The Chromium Authors
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
++#if 0
+
+ #include "content/zygote/zygote_linux.h"
+
+@@ -707,3 +708,4 @@ void Zygote::HandleReinitializeLoggingRequest(base::Pi
+ }
+
+ } // namespace content
++#endif
diff --git a/devel/electron28/files/patch-content_zygote_zygote__main__linux.cc b/devel/electron28/files/patch-content_zygote_zygote__main__linux.cc
new file mode 100644
index 000000000000..cd698a7423d4
--- /dev/null
+++ b/devel/electron28/files/patch-content_zygote_zygote__main__linux.cc
@@ -0,0 +1,58 @@
+--- content/zygote/zygote_main_linux.cc.orig 2023-10-19 19:58:23 UTC
++++ content/zygote/zygote_main_linux.cc
+@@ -11,7 +11,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !BUILDFLAG(IS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -41,7 +43,9 @@
+ #include "sandbox/linux/services/thread_helpers.h"
+ #include "sandbox/linux/suid/client/setuid_sandbox_client.h"
+ #include "sandbox/policy/linux/sandbox_debug_handling_linux.h"
++#if !BUILDFLAG(IS_BSD)
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+ #include "sandbox/policy/sandbox.h"
+ #include "sandbox/policy/switches.h"
+ #include "third_party/icu/source/i18n/unicode/timezone.h"
+@@ -50,11 +54,13 @@ namespace content {
+
+ namespace {
+
++#if !BUILDFLAG(IS_BSD)
+ void CloseFds(const std::vector<int>& fds) {
+ for (const auto& it : fds) {
+ PCHECK(0 == IGNORE_EINTR(close(it)));
+ }
+ }
++#endif
+
+ base::OnceClosure ClosureFromTwoClosures(base::OnceClosure one,
+ base::OnceClosure two) {
+@@ -157,9 +163,11 @@ static void EnterLayerOneSandbox(sandbox::policy::Sand
+ CHECK(!using_layer1_sandbox);
+ }
+ }
++#endif
+
+ bool ZygoteMain(
+ std::vector<std::unique_ptr<ZygoteForkDelegate>> fork_delegates) {
++#if !BUILDFLAG(IS_BSD)
+ sandbox::SetAmZygoteOrRenderer(true, GetSandboxFD());
+
+ auto* linux_sandbox = sandbox::policy::SandboxLinux::GetInstance();
+@@ -224,6 +232,9 @@ bool ZygoteMain(
+
+ // This function call can return multiple times, once per fork().
+ return zygote.ProcessRequests();
++#else
++ return false;
++#endif
+ }
+
+ } // namespace content
diff --git a/devel/electron28/files/patch-device_bluetooth_bluetooth__adapter.cc b/devel/electron28/files/patch-device_bluetooth_bluetooth__adapter.cc
new file mode 100644
index 000000000000..574ca1ce9e7c
--- /dev/null
+++ b/devel/electron28/files/patch-device_bluetooth_bluetooth__adapter.cc
@@ -0,0 +1,11 @@
+--- device/bluetooth/bluetooth_adapter.cc.orig 2023-05-25 00:41:56 UTC
++++ device/bluetooth/bluetooth_adapter.cc
+@@ -31,7 +31,7 @@ namespace device {
+ BluetoothAdapter::ServiceOptions::ServiceOptions() = default;
+ BluetoothAdapter::ServiceOptions::~ServiceOptions() = default;
+
+-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) && \
++#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD) && \
+ !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX)
+ // static
+ scoped_refptr<BluetoothAdapter> BluetoothAdapter::CreateAdapter() {
diff --git a/devel/electron28/files/patch-device_bluetooth_cast__bluetooth.gni b/devel/electron28/files/patch-device_bluetooth_cast__bluetooth.gni
new file mode 100644
index 000000000000..0fcfccc24b76
--- /dev/null
+++ b/devel/electron28/files/patch-device_bluetooth_cast__bluetooth.gni
@@ -0,0 +1,9 @@
+--- device/bluetooth/cast_bluetooth.gni.orig 2022-08-31 12:19:35 UTC
++++ device/bluetooth/cast_bluetooth.gni
+@@ -2,5 +2,5 @@ import("//build/config/features.gni")
+
+ declare_args() {
+ force_cast_bluetooth = false
+- use_bluez = (is_linux && !is_castos && use_dbus) || is_chromeos
++ use_bluez = use_dbus && !is_bsd
+ }
diff --git a/devel/electron28/files/patch-device_gamepad_BUILD.gn b/devel/electron28/files/patch-device_gamepad_BUILD.gn
new file mode 100644
index 000000000000..ef656feb8ebb
--- /dev/null
+++ b/devel/electron28/files/patch-device_gamepad_BUILD.gn
@@ -0,0 +1,11 @@
+--- device/gamepad/BUILD.gn.orig 2023-11-29 21:40:02 UTC
++++ device/gamepad/BUILD.gn
+@@ -99,7 +99,7 @@ component("gamepad") {
+ "hid_writer_linux.cc",
+ "hid_writer_linux.h",
+ ]
+- if (use_udev) {
++ if (use_udev && !is_bsd) {
+ sources += [
+ "gamepad_device_linux.cc",
+ "gamepad_device_linux.h",
diff --git a/devel/electron28/files/patch-device_gamepad_gamepad__provider.cc b/devel/electron28/files/patch-device_gamepad_gamepad__provider.cc
new file mode 100644
index 000000000000..5f74852478e2
--- /dev/null
+++ b/devel/electron28/files/patch-device_gamepad_gamepad__provider.cc
@@ -0,0 +1,11 @@
+--- device/gamepad/gamepad_provider.cc.orig 2023-03-30 00:33:51 UTC
++++ device/gamepad/gamepad_provider.cc
+@@ -219,7 +219,7 @@ void GamepadProvider::Initialize(std::unique_ptr<Gamep
+
+ if (!polling_thread_)
+ polling_thread_ = std::make_unique<base::Thread>("Gamepad polling thread");
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, the data fetcher needs to watch file descriptors, so the message
+ // loop needs to be a libevent loop.
+ const base::MessagePumpType kMessageLoopType = base::MessagePumpType::IO;
diff --git a/devel/electron28/files/patch-device_gamepad_hid__writer__linux.cc b/devel/electron28/files/patch-device_gamepad_hid__writer__linux.cc
new file mode 100644
index 000000000000..439446240bac
--- /dev/null
+++ b/devel/electron28/files/patch-device_gamepad_hid__writer__linux.cc
@@ -0,0 +1,11 @@
+--- device/gamepad/hid_writer_linux.cc.orig 2022-02-28 16:54:41 UTC
++++ device/gamepad/hid_writer_linux.cc
+@@ -2,6 +2,8 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
++#include <unistd.h>
++
+ #include "device/gamepad/hid_writer_linux.h"
+
+ #include <unistd.h>
diff --git a/devel/electron28/files/patch-electron_BUILD.gn b/devel/electron28/files/patch-electron_BUILD.gn
new file mode 100644
index 000000000000..43c23c76a1e8
--- /dev/null
+++ b/devel/electron28/files/patch-electron_BUILD.gn
@@ -0,0 +1,60 @@
+--- electron/BUILD.gn.orig 2023-12-04 18:19:02 UTC
++++ electron/BUILD.gn
+@@ -519,7 +519,7 @@ source_set("electron_lib") {
+ defines += [ "GDK_DISABLE_DEPRECATION_WARNINGS" ]
+ }
+
+- if (!is_mas_build) {
++ if (!is_mas_build && !is_bsd) {
+ deps += [
+ "//components/crash/core/app",
+ "//components/crash/core/browser",
+@@ -612,6 +612,12 @@ source_set("electron_lib") {
+ cflags_objcc = [ "-fobjc-weak" ]
+ }
+ }
++ if (is_bsd) {
++ sources -= [
++ "shell/common/crash_keys.cc",
++ "shell/common/crash_keys.h",
++ ]
++ }
+ if (is_linux) {
+ libs = [ "xshmfence" ]
+ deps += [
+@@ -1195,7 +1201,7 @@ if (is_mac) {
+ ":electron_lib",
+ ":electron_win32_resources",
+ ":packed_resources",
+- "//components/crash/core/app",
++ # "//components/crash/core/app",
+ "//content:sandbox_helper_win",
+ "//electron/buildflags",
+ "//ui/strings",
+@@ -1221,7 +1227,7 @@ if (is_mac) {
+ public_deps = [ "//tools/v8_context_snapshot:v8_context_snapshot" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [ "//components/crash/core/app:chrome_crashpad_handler" ]
+ }
+
+@@ -1288,7 +1294,7 @@ if (is_mac) {
+ configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ deps += [ "//sandbox/linux:chrome_sandbox" ]
+ }
+ }
+@@ -1415,7 +1421,7 @@ dist_zip("electron_dist_zip") {
+ ":electron_version_file",
+ ":licenses",
+ ]
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [ "//sandbox/linux:chrome_sandbox" ]
+ }
+ deps = data_deps
diff --git a/devel/electron28/files/patch-electron_build_args_all.gn b/devel/electron28/files/patch-electron_build_args_all.gn
new file mode 100644
index 000000000000..e482b2c2b360
--- /dev/null
+++ b/devel/electron28/files/patch-electron_build_args_all.gn
@@ -0,0 +1,13 @@
+--- electron/build/args/all.gn.orig 2023-08-27 08:03:01 UTC
++++ electron/build/args/all.gn
+@@ -14,8 +14,8 @@ v8_enable_snapshot_native_code_counters = false
+ v8_enable_javascript_promise_hooks = true
+
+ enable_cdm_host_verification = false
+-proprietary_codecs = true
+-ffmpeg_branding = "Chrome"
++# proprietary_codecs = true
++# ffmpeg_branding = "Chrome"
+
+ enable_printing = true
+
diff --git a/devel/electron28/files/patch-electron_build_args_release.gn b/devel/electron28/files/patch-electron_build_args_release.gn
new file mode 100644
index 000000000000..99262be2e1ef
--- /dev/null
+++ b/devel/electron28/files/patch-electron_build_args_release.gn
@@ -0,0 +1,11 @@
+--- electron/build/args/release.gn.orig 2023-08-27 08:03:35 UTC
++++ electron/build/args/release.gn
+@@ -7,7 +7,7 @@ is_official_build = true
+ # explicitly override here to build OpenH264 encoder/FFmpeg decoder.
+ # The initialization of the decoder depends on whether ffmpeg has
+ # been built with H.264 support.
+-rtc_use_h264 = proprietary_codecs
++# rtc_use_h264 = proprietary_codecs
+
+ # By default, Electron builds ffmpeg with proprietary codecs enabled. In order
+ # to facilitate users who don't want to ship proprietary codecs in ffmpeg, or
diff --git a/devel/electron28/files/patch-electron_default__app_default__app.ts b/devel/electron28/files/patch-electron_default__app_default__app.ts
new file mode 100644
index 000000000000..bcba0762b54b
--- /dev/null
+++ b/devel/electron28/files/patch-electron_default__app_default__app.ts
@@ -0,0 +1,11 @@
+--- electron/default_app/default_app.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/default_app/default_app.ts
+@@ -60,7 +60,7 @@ async function createWindow (backgroundColor?: string)
+ show: false
+ };
+
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ options.icon = url.fileURLToPath(new URL('icon.png', import.meta.url));
+ }
+
diff --git a/devel/electron28/files/patch-electron_filenames.gni b/devel/electron28/files/patch-electron_filenames.gni
new file mode 100644
index 000000000000..a67db939b624
--- /dev/null
+++ b/devel/electron28/files/patch-electron_filenames.gni
@@ -0,0 +1,13 @@
+--- electron/filenames.gni.orig 2023-12-21 15:40:26 UTC
++++ electron/filenames.gni
+@@ -241,8 +241,8 @@ filenames = {
+ "shell/app/command_line_args.h",
+ "shell/app/electron_content_client.cc",
+ "shell/app/electron_content_client.h",
+- "shell/app/electron_crash_reporter_client.cc",
+- "shell/app/electron_crash_reporter_client.h",
++ # "shell/app/electron_crash_reporter_client.cc",
++ # "shell/app/electron_crash_reporter_client.h",
+ "shell/app/electron_main_delegate.cc",
+ "shell/app/electron_main_delegate.h",
+ "shell/app/node_main.cc",
diff --git a/devel/electron28/files/patch-electron_lib_browser_api_app.ts b/devel/electron28/files/patch-electron_lib_browser_api_app.ts
new file mode 100644
index 000000000000..3164c1cd0c87
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_api_app.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/app.ts.orig 2023-01-24 16:58:16 UTC
++++ electron/lib/browser/api/app.ts
+@@ -68,7 +68,7 @@ if (process.platform === 'darwin') {
+ app.dock!.getMenu = () => dockMenu;
+ }
+
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd') {
+ const patternVmRSS = /^VmRSS:\s*(\d+) kB$/m;
+ const patternVmHWM = /^VmHWM:\s*(\d+) kB$/m;
+
diff --git a/devel/electron28/files/patch-electron_lib_browser_api_dialog.ts b/devel/electron28/files/patch-electron_lib_browser_api_dialog.ts
new file mode 100644
index 000000000000..7c30509a8597
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_api_dialog.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/dialog.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/lib/browser/api/dialog.ts
+@@ -40,7 +40,7 @@ const normalizeAccessKey = (text: string) => {
+ // existing single underscores with a second underscore, replace double
+ // ampersands with a single ampersand, and replace a single ampersand with
+ // a single underscore
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ return text.replaceAll('_', '__').replaceAll(/&(.?)/g, (match, after) => {
+ if (after === '&') return after;
+ return `_${after}`;
diff --git a/devel/electron28/files/patch-electron_lib_browser_api_menu-item-roles.ts b/devel/electron28/files/patch-electron_lib_browser_api_menu-item-roles.ts
new file mode 100644
index 000000000000..e89259c7e505
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_api_menu-item-roles.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/menu-item-roles.ts.orig 2022-05-18 15:31:32 UTC
++++ electron/lib/browser/api/menu-item-roles.ts
+@@ -2,7 +2,7 @@ import { app, BrowserWindow, session, webContents, Web
+
+ const isMac = process.platform === 'darwin';
+ const isWindows = process.platform === 'win32';
+-const isLinux = process.platform === 'linux';
++const isLinux = (process.platform === 'linux' || process.platform === 'freebsd');
+
+ type RoleId = 'about' | 'close' | 'copy' | 'cut' | 'delete' | 'forcereload' | 'front' | 'help' | 'hide' | 'hideothers' | 'minimize' |
+ 'paste' | 'pasteandmatchstyle' | 'quit' | 'redo' | 'reload' | 'resetzoom' | 'selectall' | 'services' | 'recentdocuments' | 'clearrecentdocuments' |
diff --git a/devel/electron28/files/patch-electron_lib_browser_api_power-monitor.ts b/devel/electron28/files/patch-electron_lib_browser_api_power-monitor.ts
new file mode 100644
index 000000000000..24713c283fe7
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_api_power-monitor.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/api/power-monitor.ts.orig 2023-08-14 18:19:06 UTC
++++ electron/lib/browser/api/power-monitor.ts
+@@ -17,7 +17,7 @@ class PowerMonitor extends EventEmitter {
+ const pm = createPowerMonitor();
+ pm.emit = this.emit.bind(this);
+
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // On Linux, we inhibit shutdown in order to give the app a chance to
+ // decide whether or not it wants to prevent the shutdown. We don't
+ // inhibit the shutdown event unless there's a listener for it. This
diff --git a/devel/electron28/files/patch-electron_lib_browser_init.ts b/devel/electron28/files/patch-electron_lib_browser_init.ts
new file mode 100644
index 000000000000..e97987122f28
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_init.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/init.ts.orig 2023-10-20 08:29:17 UTC
++++ electron/lib/browser/init.ts
+@@ -158,7 +158,7 @@ const mainStartupScript = packageJson.main || 'index.j
+ const KNOWN_XDG_DESKTOP_VALUES = new Set(['Pantheon', 'Unity:Unity7', 'pop:GNOME']);
+
+ function currentPlatformSupportsAppIndicator () {
+- if (process.platform !== 'linux') return false;
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') return false;
+ const currentDesktop = process.env.XDG_CURRENT_DESKTOP;
+
+ if (!currentDesktop) return false;
diff --git a/devel/electron28/files/patch-electron_lib_browser_rpc-server.ts b/devel/electron28/files/patch-electron_lib_browser_rpc-server.ts
new file mode 100644
index 000000000000..2e2fca45dfa6
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_browser_rpc-server.ts
@@ -0,0 +1,11 @@
+--- electron/lib/browser/rpc-server.ts.orig 2022-05-11 15:32:29 UTC
++++ electron/lib/browser/rpc-server.ts
+@@ -26,7 +26,7 @@ const allowedClipboardMethods = (() => {
+ switch (process.platform) {
+ case 'darwin':
+ return new Set(['readFindText', 'writeFindText']);
+- case 'linux':
++ case 'linux': case 'freebsd':
+ return new Set(Object.keys(clipboard));
+ default:
+ return new Set();
diff --git a/devel/electron28/files/patch-electron_lib_renderer_api_clipboard.ts b/devel/electron28/files/patch-electron_lib_renderer_api_clipboard.ts
new file mode 100644
index 000000000000..5941a466e994
--- /dev/null
+++ b/devel/electron28/files/patch-electron_lib_renderer_api_clipboard.ts
@@ -0,0 +1,11 @@
+--- electron/lib/renderer/api/clipboard.ts.orig 2023-08-14 18:19:06 UTC
++++ electron/lib/renderer/api/clipboard.ts
+@@ -7,7 +7,7 @@ const makeRemoteMethod = function (method: keyof Elect
+ return (...args: any[]) => ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, ...args);
+ };
+
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // On Linux we could not access clipboard in renderer process.
+ for (const method of Object.keys(clipboard) as (keyof Electron.Clipboard)[]) {
+ clipboard[method] = makeRemoteMethod(method);
diff --git a/devel/electron28/files/patch-electron_script_lib_config.py b/devel/electron28/files/patch-electron_script_lib_config.py
new file mode 100644
index 000000000000..a9d7ef33f534
--- /dev/null
+++ b/devel/electron28/files/patch-electron_script_lib_config.py
@@ -0,0 +1,12 @@
+--- electron/script/lib/config.py.orig 2021-11-08 18:41:28 UTC
++++ electron/script/lib/config.py
+@@ -8,6 +8,9 @@ PLATFORM = {
+ 'cygwin': 'win32',
+ 'msys': 'win32',
+ 'darwin': 'darwin',
++ 'freebsd12': 'freebsd',
++ 'freebsd13': 'freebsd',
++ 'freebsd14': 'freebsd',
+ 'linux': 'linux',
+ 'linux2': 'linux',
+ 'win32': 'win32',
diff --git a/devel/electron28/files/patch-electron_script_lib_utils.js b/devel/electron28/files/patch-electron_script_lib_utils.js
new file mode 100644
index 000000000000..0536bc294b99
--- /dev/null
+++ b/devel/electron28/files/patch-electron_script_lib_utils.js
@@ -0,0 +1,11 @@
+--- electron/script/lib/utils.js.orig 2023-10-20 08:29:17 UTC
++++ electron/script/lib/utils.js
+@@ -19,7 +19,7 @@ function getElectronExec () {
+ return `out/${OUT_DIR}/Electron.app/Contents/MacOS/Electron`;
+ case 'win32':
+ return `out/${OUT_DIR}/electron.exe`;
+- case 'linux':
++ case 'linux': case 'freebsd':
+ return `out/${OUT_DIR}/electron`;
+ default:
+ throw new Error('Unknown platform');
diff --git a/devel/electron28/files/patch-electron_script_spec-runner.js b/devel/electron28/files/patch-electron_script_spec-runner.js
new file mode 100644
index 000000000000..5f28ddd319d8
--- /dev/null
+++ b/devel/electron28/files/patch-electron_script_spec-runner.js
@@ -0,0 +1,11 @@
+--- electron/script/spec-runner.js.orig 2023-05-17 11:09:55 UTC
++++ electron/script/spec-runner.js
+@@ -163,7 +163,7 @@ async function runTestUsingElectron (specDir, testName
+ exe = path.resolve(BASE, utils.getElectronExec());
+ }
+ const runnerArgs = [`electron/${specDir}`, ...unknownArgs.slice(2)];
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ runnerArgs.unshift(path.resolve(__dirname, 'dbus_mock.py'), exe);
+ exe = 'python3';
+ }
diff --git a/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.cc b/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.cc
new file mode 100644
index 000000000000..7acc91ea3214
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.cc
@@ -0,0 +1,11 @@
+--- electron/shell/app/electron_crash_reporter_client.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/app/electron_crash_reporter_client.cc
+@@ -196,7 +196,7 @@ void ElectronCrashReporterClient::GetProcessSimpleAnno
+ (*annotations)["ver"] = ELECTRON_VERSION_STRING;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ bool ElectronCrashReporterClient::ShouldMonitorCrashHandlerExpensively() {
+ return false;
+ }
diff --git a/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.h b/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.h
new file mode 100644
index 000000000000..cc3ed5d5322c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_app_electron__crash__reporter__client.h
@@ -0,0 +1,11 @@
+--- electron/shell/app/electron_crash_reporter_client.h.orig 2023-04-03 22:25:21 UTC
++++ electron/shell/app/electron_crash_reporter_client.h
+@@ -70,7 +70,7 @@ class ElectronCrashReporterClient : public crash_repor
+ bool ReportingIsEnforcedByPolicy(bool* breakpad_enabled) override;
+ #endif
+
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool ShouldMonitorCrashHandlerExpensively() override;
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_app_electron__main__delegate.cc b/devel/electron28/files/patch-electron_shell_app_electron__main__delegate.cc
new file mode 100644
index 000000000000..66e0d2e7d3af
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_app_electron__main__delegate.cc
@@ -0,0 +1,57 @@
+--- electron/shell/app/electron_main_delegate.cc.orig 2023-06-07 10:09:25 UTC
++++ electron/shell/app/electron_main_delegate.cc
+@@ -58,13 +58,16 @@
+ #include "chrome/child/v8_crashpad_support_win.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/nix/xdg_util.h"
++#endif
++
++#if BUILDFLAG(IS_LINUX)
+ #include "v8/include/v8-wasm-trap-handler-posix.h"
+ #include "v8/include/v8.h"
+ #endif
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crash_switches.h" // nogncheck
+ #include "components/crash/core/app/crashpad.h" // nogncheck
+ #include "components/crash/core/common/crash_key.h"
+@@ -156,7 +159,7 @@ bool ElectronPathProvider(int key, base::FilePath* res
+ create_dir = true;
+ break;
+ }
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ case DIR_APP_DATA: {
+ auto env = base::Environment::Create();
+ cur = base::nix::GetXDGDirectory(
+@@ -288,7 +291,7 @@ absl::optional<int> ElectronMainDelegate::BasicStartup
+ base::win::PinUser32();
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Check for --no-sandbox parameter when running as root.
+ if (getuid() == 0 && IsSandboxEnabled(command_line))
+ LOG(FATAL) << "Running as root without --"
+@@ -338,7 +341,7 @@ void ElectronMainDelegate::PreSandboxStartup() {
+ /* is_preinit = */ IsBrowserProcess() || IsZygoteProcess());
+ #endif
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ crash_reporter::InitializeCrashKeys();
+ #endif
+
+@@ -373,7 +376,7 @@ void ElectronMainDelegate::PreSandboxStartup() {
+ }
+ #endif
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ crash_keys::SetCrashKeysFromCommandLine(*command_line);
+ crash_keys::SetPlatformCrashKey();
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_app_node__main.cc b/devel/electron28/files/patch-electron_shell_app_node__main.cc
new file mode 100644
index 000000000000..fba25a6af28c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_app_node__main.cc
@@ -0,0 +1,38 @@
+--- electron/shell/app/node_main.cc.orig 2024-01-10 12:21:58 UTC
++++ electron/shell/app/node_main.cc
+@@ -48,7 +48,7 @@
+ #include "shell/common/mac/codesign_util.h"
+ #endif
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crashpad.h" // nogncheck
+ #include "shell/app/electron_crash_reporter_client.h"
+ #include "shell/common/crash_keys.h"
+@@ -83,7 +83,7 @@ void ExitIfContainsDisallowedFlags(const std::vector<s
+ }
+ }
+
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void SetCrashKeyStub(const std::string& key, const std::string& value) {}
+ void ClearCrashKeyStub(const std::string& key) {}
+ #endif
+@@ -94,7 +94,7 @@ v8::Local<v8::Value> GetParameters(v8::Isolate* isolat
+
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+ std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+ return gin::ConvertToV8(isolate, keys);
+@@ -254,7 +254,7 @@ int NodeMain(int argc, char* argv[]) {
+ // Setup process.crashReporter in child node processes
+ auto reporter = gin_helper::Dictionary::CreateEmpty(isolate);
+ reporter.SetMethod("getParameters", &GetParameters);
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ reporter.SetMethod("addExtraParameter", &SetCrashKeyStub);
+ reporter.SetMethod("removeExtraParameter", &ClearCrashKeyStub);
+ #else
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__app.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__app.cc
new file mode 100644
index 000000000000..7c4e5cd2c574
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__app.cc
@@ -0,0 +1,47 @@
+--- electron/shell/browser/api/electron_api_app.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/api/electron_api_app.cc
+@@ -656,7 +656,7 @@ void App::OnFinishLaunching(base::Value::Dict launch_i
+ }
+
+ void App::OnFinishLaunching(base::Value::Dict launch_info) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Set the application name for audio streams shown in external
+ // applications. Only affects pulseaudio currently.
+ media::AudioManager::SetGlobalAppName(Browser::Get()->GetName());
+@@ -991,7 +991,7 @@ void App::SetDesktopName(const std::string& desktop_na
+ }
+
+ void App::SetDesktopName(const std::string& desktop_name) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto env = base::Environment::Create();
+ env->SetVar("CHROME_DESKTOP", desktop_name);
+ #endif
+@@ -1378,7 +1378,7 @@ std::vector<gin_helper::Dictionary> App::GetAppMetrics
+ pid_dict.Set("name", process_metric.second->name);
+ }
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ auto memory_info = process_metric.second->GetMemoryInfo();
+
+ auto memory_dict = gin_helper::Dictionary::CreateEmpty(isolate);
+@@ -1669,7 +1669,7 @@ gin::ObjectTemplateBuilder App::GetObjectTemplateBuild
+ .SetMethod(
+ "removeAsDefaultProtocolClient",
+ base::BindRepeating(&Browser::RemoveAsDefaultProtocolClient, browser))
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ .SetMethod(
+ "getApplicationInfoForProtocol",
+ base::BindRepeating(&Browser::GetApplicationInfoForProtocol, browser))
+@@ -1727,7 +1727,7 @@ gin::ObjectTemplateBuilder App::GetObjectTemplateBuild
+ .SetMethod("getJumpListSettings", &App::GetJumpListSettings)
+ .SetMethod("setJumpList", &App::SetJumpList)
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ .SetMethod("isUnityRunning",
+ base::BindRepeating(&Browser::IsUnityRunning, browser))
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__base__window.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__base__window.cc
new file mode 100644
index 000000000000..5a099e08badb
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__base__window.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/api/electron_api_base_window.cc.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/browser/api/electron_api_base_window.cc
+@@ -1079,7 +1079,7 @@ void BaseWindow::SetIconImpl(v8::Isolate* isolate,
+ static_cast<NativeWindowViews*>(window_.get())
+ ->SetIcon(native_image->GetHICON(GetSystemMetrics(SM_CXSMICON)),
+ native_image->GetHICON(GetSystemMetrics(SM_CXICON)));
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ static_cast<NativeWindowViews*>(window_.get())
+ ->SetIcon(native_image->image().AsImageSkia());
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__crash__reporter.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
new file mode 100644
index 000000000000..f229a1bde031
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
@@ -0,0 +1,72 @@
+--- electron/shell/browser/api/electron_api_crash_reporter.cc.orig 2023-06-07 10:09:25 UTC
++++ electron/shell/browser/api/electron_api_crash_reporter.cc
+@@ -31,7 +31,7 @@
+ #include "shell/common/process_util.h"
+ #include "shell/common/thread_restrictions.h"
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crashpad.h" // nogncheck
+ #include "components/crash/core/browser/crash_upload_list_crashpad.h" // nogncheck
+ #include "components/crash/core/common/crash_key.h"
+@@ -66,7 +66,7 @@ bool g_crash_reporter_initialized = false;
+
+ namespace electron::api::crash_reporter {
+
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ namespace {
+
+ void NoOp() {}
+@@ -133,7 +133,7 @@ void Start(const std::string& submit_url,
+ const std::map<std::string, std::string>& extra,
+ bool is_node_process) {
+ TRACE_EVENT0("electron", "crash_reporter::Start");
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ if (g_crash_reporter_initialized)
+ return;
+ g_crash_reporter_initialized = true;
+@@ -179,7 +179,7 @@ void Start(const std::string& submit_url,
+
+ namespace {
+
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void GetUploadedReports(
+ v8::Isolate* isolate,
+ base::OnceCallback<void(v8::Local<v8::Value>)> callback) {
+@@ -235,13 +235,13 @@ v8::Local<v8::Value> GetUploadedReports(v8::Isolate* i
+ #endif
+
+ void SetUploadToServer(bool upload) {
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ ElectronCrashReporterClient::Get()->SetCollectStatsConsent(upload);
+ #endif
+ }
+
+ bool GetUploadToServer() {
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ return false;
+ #else
+ return ElectronCrashReporterClient::Get()->GetCollectStatsConsent();
+@@ -250,7 +250,7 @@ bool GetUploadToServer() {
+
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+ std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+ return gin::ConvertToV8(isolate, keys);
+@@ -262,7 +262,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ void* priv) {
+ gin_helper::Dictionary dict(context->GetIsolate(), exports);
+ dict.SetMethod("start", &electron::api::crash_reporter::Start);
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ dict.SetMethod("addExtraParameter", &electron::api::crash_reporter::NoOp);
+ dict.SetMethod("removeExtraParameter", &electron::api::crash_reporter::NoOp);
+ #else
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
new file mode 100644
index 000000000000..db1f8598d2aa
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
@@ -0,0 +1,29 @@
+--- electron/shell/browser/api/electron_api_desktop_capturer.cc.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/browser/api/electron_api_desktop_capturer.cc
+@@ -37,7 +37,7 @@
+ #include "third_party/webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h"
+ #include "third_party/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h"
+ #include "ui/display/win/display_info.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #if defined(USE_OZONE_PLATFORM_X11)
+ #include "base/logging.h"
+ #include "ui/base/x/x11_display_util.h"
+@@ -49,7 +49,7 @@
+ #endif // defined(USE_OZONE_PLATFORM_X11)
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Private function in ui/base/x/x11_display_util.cc
+ std::map<x11::RandR::Output, int> GetMonitors(int version,
+ x11::RandR* randr,
+@@ -389,7 +389,7 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaLi
+ for (auto& source : screen_sources) {
+ source.display_id = base::NumberToString(source.media_list_source.id.id);
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #if defined(USE_OZONE_PLATFORM_X11)
+ // On Linux, with X11, the source id is the numeric value of the
+ // display name atom and the display id is either the EDID or the
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.cc
new file mode 100644
index 000000000000..accdebd37eaf
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.cc
@@ -0,0 +1,23 @@
+--- electron/shell/browser/api/electron_api_power_monitor.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/browser/api/electron_api_power_monitor.cc
+@@ -118,6 +118,11 @@ void PowerMonitor::OnSpeedLimitChange(int speed_limit)
+ gin::DataObjectBuilder(isolate).Set("limit", speed_limit).Build());
+ }
+
++#if BUILDFLAG(IS_BSD)
++void PowerMonitor::SetListeningForShutdown(bool is_listening) {
++}
++#endif
++
+ #if BUILDFLAG(IS_LINUX)
+ void PowerMonitor::SetListeningForShutdown(bool is_listening) {
+ if (is_listening) {
+@@ -143,7 +148,7 @@ gin::ObjectTemplateBuilder PowerMonitor::GetObjectTemp
+ auto builder =
+ gin_helper::EventEmitterMixin<PowerMonitor>::GetObjectTemplateBuilder(
+ isolate);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ builder.SetMethod("setListeningForShutdown",
+ &PowerMonitor::SetListeningForShutdown);
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.h b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.h
new file mode 100644
index 000000000000..7aa5993e972e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__power__monitor.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/api/electron_api_power_monitor.h.orig 2023-05-03 13:27:52 UTC
++++ electron/shell/browser/api/electron_api_power_monitor.h
+@@ -40,7 +40,7 @@ class PowerMonitor : public gin::Wrappable<PowerMonito
+ explicit PowerMonitor(v8::Isolate* isolate);
+ ~PowerMonitor() override;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SetListeningForShutdown(bool);
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__safe__storage.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__safe__storage.cc
new file mode 100644
index 000000000000..b9302ba7f004
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__safe__storage.cc
@@ -0,0 +1,29 @@
+--- electron/shell/browser/api/electron_api_safe_storage.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/browser/api/electron_api_safe_storage.cc
+@@ -22,7 +22,7 @@ static const char* kEncryptionVersionPrefixV11 = "v11"
+ static bool use_password_v10 = false;
+
+ bool IsEncryptionAvailable() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Calling IsEncryptionAvailable() before the app is ready results in a crash
+ // on Linux.
+ // Refs: https://github.com/electron/electron/issues/32206.
+@@ -41,7 +41,7 @@ void SetUsePasswordV10(bool use) {
+ use_password_v10 = use;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string GetSelectedLinuxBackend() {
+ if (!Browser::Get()->is_ready())
+ return "unknown";
+@@ -142,7 +142,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ dict.SetMethod("decryptString", &electron::safestorage::DecryptString);
+ dict.SetMethod("setUsePlainTextEncryption",
+ &electron::safestorage::SetUsePasswordV10);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ dict.SetMethod("getSelectedStorageBackend",
+ &electron::safestorage::GetSelectedLinuxBackend);
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.cc b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.cc
new file mode 100644
index 000000000000..1b30719d5745
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.cc
@@ -0,0 +1,61 @@
+--- electron/shell/browser/api/electron_api_web_contents.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/api/electron_api_web_contents.cc
+@@ -153,11 +153,11 @@
+ #include "ui/base/cocoa/defaults_utils.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "ui/gfx/font_render_params.h"
+ #endif
+
+@@ -488,7 +488,7 @@ absl::optional<base::TimeDelta> GetCursorBlinkInterval
+ ui::TextInsertionCaretBlinkPeriodFromDefaults());
+ if (system_value)
+ return *system_value;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (auto* linux_ui = ui::LinuxUi::instance())
+ return linux_ui->GetCursorBlinkInterval();
+ #elif BUILDFLAG(IS_WIN)
+@@ -936,7 +936,7 @@ void WebContents::InitWithSessionAndOptions(
+ accept_languages.pop_back();
+ prefs->accept_languages = accept_languages;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Update font settings.
+ static const gfx::FontRenderParams params(
+ gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), nullptr));
+@@ -2639,7 +2639,7 @@ void WebContents::ForcefullyCrashRenderer() {
+
+ content::RenderProcessHost* rph = rwh->GetProcess();
+ if (rph) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // A generic |CrashDumpHungChildProcess()| is not implemented for Linux.
+ // Instead we send an explicit IPC to crash on the renderer's IO thread.
+ rph->ForceCrash();
+@@ -3317,7 +3317,7 @@ void WebContents::Focus() {
+ void WebContents::Focus() {
+ // Focusing on WebContents does not automatically focus the window on macOS
+ // and Linux, do it manually to match the behavior on Windows.
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (owner_window())
+ owner_window()->Focus(true);
+ #endif
+@@ -4107,7 +4107,7 @@ ui::ImageModel WebContents::GetDevToolsWindowIcon() {
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void WebContents::GetDevToolsWindowWMClass(std::string* name,
+ std::string* class_name) {
+ *class_name = Browser::Get()->GetName();
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.h b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.h
new file mode 100644
index 000000000000..9502e38223bc
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_electron__api__web__contents.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/api/electron_api_web_contents.h.orig 2023-11-15 10:20:22 UTC
++++ electron/shell/browser/api/electron_api_web_contents.h
+@@ -733,7 +733,7 @@ class WebContents : public ExclusiveAccessContext,
+ #if defined(TOOLKIT_VIEWS) && !BUILDFLAG(IS_MAC)
+ ui::ImageModel GetDevToolsWindowIcon() override;
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void GetDevToolsWindowWMClass(std::string* name,
+ std::string* class_name) override;
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_api_process__metric.h b/devel/electron28/files/patch-electron_shell_browser_api_process__metric.h
new file mode 100644
index 000000000000..d6ff67a703bf
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_api_process__metric.h
@@ -0,0 +1,20 @@
+--- electron/shell/browser/api/process_metric.h.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/browser/api/process_metric.h
+@@ -14,7 +14,7 @@
+
+ namespace electron {
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ struct ProcessMemoryInfo {
+ size_t working_set_size = 0;
+ size_t peak_working_set_size = 0;
+@@ -48,7 +48,7 @@ struct ProcessMetric {
+ const std::string& name = std::string());
+ ~ProcessMetric();
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ ProcessMemoryInfo GetMemoryInfo() const;
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_browser_browser.cc b/devel/electron28/files/patch-electron_shell_browser_browser.cc
new file mode 100644
index 000000000000..647de53a03be
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_browser.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/browser.cc.orig 2023-04-03 22:25:21 UTC
++++ electron/shell/browser/browser.cc
+@@ -67,7 +67,7 @@ Browser* Browser::Get() {
+ return ElectronBrowserMainParts::Get()->browser();
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void Browser::Focus(gin::Arguments* args) {
+ // Focus on the first visible window.
+ for (auto* const window : WindowList::GetWindows()) {
diff --git a/devel/electron28/files/patch-electron_shell_browser_browser.h b/devel/electron28/files/patch-electron_shell_browser_browser.h
new file mode 100644
index 000000000000..da9319ec94ce
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_browser.h
@@ -0,0 +1,24 @@
+--- electron/shell/browser/browser.h.orig 2023-04-03 22:25:21 UTC
++++ electron/shell/browser/browser.h
+@@ -101,7 +101,7 @@ class Browser : public WindowListObserver {
+
+ std::u16string GetApplicationNameForProtocol(const GURL& url);
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ // get the name, icon and path for an application
+ v8::Local<v8::Promise> GetApplicationInfoForProtocol(v8::Isolate* isolate,
+ const GURL& url);
+@@ -263,10 +263,10 @@ class Browser : public WindowListObserver {
+ PCWSTR GetAppUserModelID();
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Whether Unity launcher is running.
+ bool IsUnityRunning();
+-#endif // BUILDFLAG(IS_LINUX)
++#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ // Tell the application to open a file.
+ bool OpenFile(const std::string& file_path);
diff --git a/devel/electron28/files/patch-electron_shell_browser_browser__linux.cc b/devel/electron28/files/patch-electron_shell_browser_browser__linux.cc
new file mode 100644
index 000000000000..07c2e5a4bf8f
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_browser__linux.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/browser_linux.cc.orig 2023-02-06 19:29:11 UTC
++++ electron/shell/browser/browser_linux.cc
+@@ -16,7 +16,7 @@
+ #include "shell/common/application_info.h"
+ #include "shell/common/thread_restrictions.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "shell/browser/linux/unity_service.h"
+ #include "ui/gtk/gtk_util.h" // nogncheck
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.cc b/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.cc
new file mode 100644
index 000000000000..a6ce405ad703
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.cc
@@ -0,0 +1,20 @@
+--- electron/shell/browser/browser_process_impl.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/browser_process_impl.cc
+@@ -316,7 +316,7 @@ const std::string& BrowserProcessImpl::GetSystemLocale
+ return system_locale_;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void BrowserProcessImpl::SetLinuxStorageBackend(
+ os_crypt::SelectedLinuxBackend selected_backend) {
+ switch (selected_backend) {
+@@ -344,7 +344,7 @@ const std::string& BrowserProcessImpl::GetLinuxStorage
+ const std::string& BrowserProcessImpl::GetLinuxStorageBackend() const {
+ return selected_linux_storage_backend_;
+ }
+-#endif // BUILDFLAG(IS_LINUX)
++#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ void BrowserProcessImpl::SetApplicationLocale(const std::string& locale) {
+ locale_ = locale;
diff --git a/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.h b/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.h
new file mode 100644
index 000000000000..d0fc74533b8c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_browser__process__impl.h
@@ -0,0 +1,29 @@
+--- electron/shell/browser/browser_process_impl.h.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/browser_process_impl.h
+@@ -23,7 +23,7 @@
+ #include "services/network/public/cpp/shared_url_loader_factory.h"
+ #include "shell/browser/net/system_network_context_manager.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/os_crypt/sync/key_storage_util_linux.h"
+ #endif
+
+@@ -57,7 +57,7 @@ class BrowserProcessImpl : public BrowserProcess {
+ void SetSystemLocale(const std::string& locale);
+ const std::string& GetSystemLocale() const;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SetLinuxStorageBackend(os_crypt::SelectedLinuxBackend selected_backend);
+ const std::string& GetLinuxStorageBackend() const;
+ #endif
+@@ -132,7 +132,7 @@ class BrowserProcessImpl : public BrowserProcess {
+ std::unique_ptr<PrefService> local_state_;
+ std::string locale_;
+ std::string system_locale_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string selected_linux_storage_backend_;
+ #endif
+ embedder_support::OriginTrialsSettingsStorage origin_trials_settings_storage_;
diff --git a/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.cc b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.cc
new file mode 100644
index 000000000000..c314057fec3c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.cc
@@ -0,0 +1,84 @@
+--- electron/shell/browser/electron_browser_main_parts.cc.orig 2024-01-10 12:21:58 UTC
++++ electron/shell/browser/electron_browser_main_parts.cc
+@@ -77,7 +77,7 @@
+ #include "ui/wm/core/wm_state.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "chrome/browser/ui/views/dark_mode_manager_linux.h"
+ #include "device/bluetooth/bluetooth_adapter_factory.h"
+@@ -129,7 +129,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class LinuxUiGetterImpl : public ui::LinuxUiGetter {
+ public:
+ LinuxUiGetterImpl() = default;
+@@ -212,7 +212,7 @@ int ElectronBrowserMainParts::PreEarlyInitialization()
+ #if BUILDFLAG(IS_POSIX)
+ HandleSIGCHLD();
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ DetectOzonePlatform();
+ ui::OzonePlatform::PreEarlyInitialization();
+ #endif
+@@ -302,7 +302,7 @@ int ElectronBrowserMainParts::PreCreateThreads() {
+ // happen before the ResourceBundle is loaded
+ if (locale.empty())
+ l10n_util::OverrideLocaleWithCocoaLocale();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // l10n_util::GetApplicationLocaleInternal uses g_get_language_names(),
+ // which keys off of getenv("LC_ALL").
+ // We must set this env first to make ui::ResourceBundle accept the custom
+@@ -333,7 +333,7 @@ int ElectronBrowserMainParts::PreCreateThreads() {
+ ElectronBrowserClient::SetApplicationLocale(app_locale);
+ fake_browser_process_->SetApplicationLocale(app_locale);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Reset to the original LC_ALL since we should not be changing it.
+ if (!locale.empty()) {
+ if (lc_all)
+@@ -393,7 +393,7 @@ void ElectronBrowserMainParts::ToolkitInitialized() {
+ }
+
+ void ElectronBrowserMainParts::ToolkitInitialized() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* linux_ui = ui::GetDefaultLinuxUi();
+ CHECK(linux_ui);
+ linux_ui_getter_ = std::make_unique<LinuxUiGetterImpl>();
+@@ -500,7 +500,7 @@ void ElectronBrowserMainParts::PostCreateMainMessageLo
+ }
+
+ void ElectronBrowserMainParts::PostCreateMainMessageLoop() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ std::string app_name = electron::Browser::Get()->GetName();
+ #endif
+ #if BUILDFLAG(IS_LINUX)
+@@ -511,7 +511,9 @@ void ElectronBrowserMainParts::PostCreateMainMessageLo
+ content::GetUIThreadTaskRunner({content::BrowserTaskType::kUserInput}));
+ if (!bluez::BluezDBusManager::IsInitialized())
+ bluez::DBusBluezManagerWrapperLinux::Initialize();
++#endif
+
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Set up crypt config. This needs to be done before anything starts the
+ // network service, as the raw encryption key needs to be shared with the
+ // network service for encrypted cookie storage.
+@@ -610,7 +612,7 @@ void ElectronBrowserMainParts::PostMainMessageLoopRun(
+ fake_browser_process_->PostMainMessageLoopRun();
+ content::DevToolsAgentHost::StopRemoteDebuggingPipeHandler();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ui::OzonePlatform::GetInstance()->PostMainMessageLoopRun();
+ #endif
+ }
diff --git a/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.h b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.h
new file mode 100644
index 000000000000..c9596387818f
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts.h
@@ -0,0 +1,20 @@
+--- electron/shell/browser/electron_browser_main_parts.h.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/browser/electron_browser_main_parts.h
+@@ -119,7 +119,7 @@ class ElectronBrowserMainParts : public content::Brows
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void DetectOzonePlatform();
+ #endif
+
+@@ -141,7 +141,7 @@ class ElectronBrowserMainParts : public content::Brows
+ std::unique_ptr<display::Screen> screen_;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<ui::DarkModeManagerLinux> dark_mode_manager_;
+ std::unique_ptr<ui::LinuxUiGetter> linux_ui_getter_;
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts__posix.cc b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
new file mode 100644
index 000000000000..37f52e6f9b94
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
@@ -0,0 +1,19 @@
+--- electron/shell/browser/electron_browser_main_parts_posix.cc.orig 2022-08-03 15:31:32 UTC
++++ electron/shell/browser/electron_browser_main_parts_posix.cc
+@@ -198,12 +198,16 @@ void ElectronBrowserMainParts::InstallShutdownSignalHa
+ g_pipe_pid = getpid();
+ g_shutdown_pipe_read_fd = pipefd[0];
+ g_shutdown_pipe_write_fd = pipefd[1];
++#if defined(OS_BSD)
++ const size_t kShutdownDetectorThreadStackSize = 0;
++#else
+ #if !defined(ADDRESS_SANITIZER)
+ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2;
+ #else
+ // ASan instrumentation bloats the stack frames, so we need to increase the
+ // stack size to avoid hitting the guard page.
+ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4;
++#endif
+ #endif
+ ShutdownDetector* detector = new ShutdownDetector(
+ g_shutdown_pipe_read_fd, std::move(shutdown_callback), task_runner);
diff --git a/devel/electron28/files/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc b/devel/electron28/files/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
new file mode 100644
index 000000000000..91481f5ae73c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc.orig 2023-08-09 14:05:20 UTC
++++ electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc
+@@ -55,6 +55,8 @@ bool ElectronRuntimeAPIDelegate::GetPlatformInfo(Platf
+ info->os = extensions::api::runtime::PlatformOs::kLinux;
+ } else if (strcmp(os, "openbsd") == 0) {
+ info->os = extensions::api::runtime::PlatformOs::kOpenbsd;
++ } else if (strcmp(os, "freebsd") == 0) {
++ info->os = extensions::api::runtime::PlatformOs::kFreebsd;
+ } else {
+ NOTREACHED();
+ return false;
diff --git a/devel/electron28/files/patch-electron_shell_browser_native__window.cc b/devel/electron28/files/patch-electron_shell_browser_native__window.cc
new file mode 100644
index 000000000000..575e491b3569
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_native__window.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/native_window.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/native_window.cc
+@@ -205,7 +205,7 @@ void NativeWindow::InitFromOptions(const gin_helper::D
+ } else {
+ SetSizeConstraints(size_constraints);
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool closable;
+ if (options.Get(options::kClosable, &closable)) {
+ SetClosable(closable);
diff --git a/devel/electron28/files/patch-electron_shell_browser_native__window__views.cc b/devel/electron28/files/patch-electron_shell_browser_native__window__views.cc
new file mode 100644
index 000000000000..7a8134be8b96
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_native__window__views.cc
@@ -0,0 +1,128 @@
+--- electron/shell/browser/native_window_views.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/browser/native_window_views.cc
+@@ -56,7 +56,7 @@
+ #include "ui/wm/core/shadow_types.h"
+ #include "ui/wm/core/window_util.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/strings/string_util.h"
+ #include "shell/browser/browser.h"
+ #include "shell/browser/linux/unity_service.h"
+@@ -316,7 +316,7 @@ NativeWindowViews::NativeWindowViews(const gin_helper:
+ params.parent = parent->GetNativeWindow();
+
+ params.native_widget = new ElectronDesktopNativeWidgetAura(this);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string name = Browser::Get()->GetName();
+ // Set WM_WINDOW_ROLE.
+ params.wm_role_name = "browser-window";
+@@ -341,7 +341,7 @@ NativeWindowViews::NativeWindowViews(const gin_helper:
+ std::string window_type;
+ options.Get(options::kType, &window_type);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Set _GTK_THEME_VARIANT to dark if we have "dark-theme" option set.
+ bool use_dark_theme = false;
+ if (options.Get(options::kDarkTheme, &use_dark_theme) && use_dark_theme) {
+@@ -443,7 +443,7 @@ NativeWindowViews::NativeWindowViews(const gin_helper:
+ if (window)
+ window->AddPreTargetHandler(this);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On linux after the widget is initialized we might have to force set the
+ // bounds if the bounds are smaller than the current display
+ SetBounds(gfx::Rect(GetPosition(), bounds.size()), false);
+@@ -603,7 +603,7 @@ bool NativeWindowViews::IsEnabled() {
+ bool NativeWindowViews::IsEnabled() {
+ #if BUILDFLAG(IS_WIN)
+ return ::IsWindowEnabled(GetAcceleratedWidget());
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #if defined(USE_OZONE_PLATFORM_X11)
+ if (IsX11())
+ return !event_disabler_.get();
+@@ -661,7 +661,7 @@ void NativeWindowViews::SetEnabledInternal(bool enable
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void NativeWindowViews::Maximize() {
+ if (IsVisible()) {
+ widget()->Maximize();
+@@ -801,7 +801,7 @@ void NativeWindowViews::SetBounds(const gfx::Rect& bou
+ }
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux and Windows the minimum and maximum size should be updated with
+ // window size when window is not resizable.
+ if (!resizable_) {
+@@ -1061,7 +1061,7 @@ bool NativeWindowViews::IsClosable() {
+ return false;
+ }
+ return !(info.fState & MFS_DISABLED);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #endif
+ }
+@@ -1449,7 +1449,7 @@ void NativeWindowViews::SetProgressBar(double progress
+ NativeWindow::ProgressState state) {
+ #if BUILDFLAG(IS_WIN)
+ taskbar_host_.SetProgressBar(GetAcceleratedWidget(), progress, state);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (unity::IsRunning()) {
+ unity::SetProgressFraction(progress);
+ }
+@@ -1541,7 +1541,7 @@ content::DesktopMediaID NativeWindowViews::GetDesktopM
+ #if BUILDFLAG(IS_WIN)
+ window_handle =
+ reinterpret_cast<content::DesktopMediaID::Id>(accelerated_widget);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ window_handle = static_cast<uint32_t>(accelerated_widget);
+ #endif
+ aura::WindowTreeHost* const host =
+@@ -1639,7 +1639,7 @@ void NativeWindowViews::SetIcon(HICON window_icon, HIC
+ SendMessage(hwnd, WM_SETICON, ICON_BIG,
+ reinterpret_cast<LPARAM>(app_icon_.get()));
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void NativeWindowViews::SetIcon(const gfx::ImageSkia& icon) {
+ auto* tree_host = views::DesktopWindowTreeHostLinux::GetHostForWidget(
+ GetAcceleratedWidget());
+@@ -1725,7 +1725,7 @@ bool NativeWindowViews::CanMinimize() const {
+ bool NativeWindowViews::CanMinimize() const {
+ #if BUILDFLAG(IS_WIN)
+ return minimizable_;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #endif
+ }
+@@ -1777,7 +1777,7 @@ void NativeWindowViews::HandleKeyboardEvent(
+ if (widget_destroyed_)
+ return;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (event.windows_key_code == ui::VKEY_BROWSER_BACK)
+ NotifyWindowExecuteAppCommand(kBrowserBackward);
+ else if (event.windows_key_code == ui::VKEY_BROWSER_FORWARD)
+@@ -1796,7 +1796,7 @@ void NativeWindowViews::OnMouseEvent(ui::MouseEvent* e
+ // Alt+Click should not toggle menu bar.
+ root_view_.ResetAltState();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (event->changed_button_flags() == ui::EF_BACK_MOUSE_BUTTON)
+ NotifyWindowExecuteAppCommand(kBrowserBackward);
+ else if (event->changed_button_flags() == ui::EF_FORWARD_MOUSE_BUTTON)
diff --git a/devel/electron28/files/patch-electron_shell_browser_native__window__views.h b/devel/electron28/files/patch-electron_shell_browser_native__window__views.h
new file mode 100644
index 000000000000..57cd7e7f4938
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_native__window__views.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/native_window_views.h.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/browser/native_window_views.h
+@@ -169,7 +169,7 @@ class NativeWindowViews : public NativeWindow,
+ LPARAM l_param,
+ LRESULT* result);
+ void SetIcon(HICON small_icon, HICON app_icon);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SetIcon(const gfx::ImageSkia& icon);
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_browser_net_system__network__context__manager.cc b/devel/electron28/files/patch-electron_shell_browser_net_system__network__context__manager.cc
new file mode 100644
index 000000000000..9a324567ff54
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_net_system__network__context__manager.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/net/system_network_context_manager.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/browser/net/system_network_context_manager.cc
+@@ -42,7 +42,7 @@
+ #include "shell/common/options_switches.h"
+ #include "url/gurl.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/os_crypt/sync/key_storage_config_linux.h"
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.cc b/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.cc
new file mode 100644
index 000000000000..bd1e1964984e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/osr/osr_host_display_client.cc.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/browser/osr/osr_host_display_client.cc
+@@ -96,7 +96,7 @@ void OffScreenHostDisplayClient::CreateLayeredWindowUp
+ layered_window_updater_->SetActive(active_);
+ }
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ void OffScreenHostDisplayClient::DidCompleteSwapWithNewSize(
+ const gfx::Size& size) {}
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.h b/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.h
new file mode 100644
index 000000000000..2c08a68bc878
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_osr_osr__host__display__client.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/osr/osr_host_display_client.h.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/browser/osr/osr_host_display_client.h
+@@ -72,7 +72,7 @@ class OffScreenHostDisplayClient : public viz::HostDis
+ mojo::PendingReceiver<viz::mojom::LayeredWindowUpdater> receiver)
+ override;
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ void DidCompleteSwapWithNewSize(const gfx::Size& size) override;
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_browser_relauncher__linux.cc b/devel/electron28/files/patch-electron_shell_browser_relauncher__linux.cc
new file mode 100644
index 000000000000..e5f44888577e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_relauncher__linux.cc
@@ -0,0 +1,32 @@
+--- electron/shell/browser/relauncher_linux.cc.orig 2023-01-24 16:58:16 UTC
++++ electron/shell/browser/relauncher_linux.cc
+@@ -6,8 +6,10 @@
+
+ #include <fcntl.h>
+ #include <signal.h>
++#if !defined(__FreeBSD__)
+ #include <sys/prctl.h>
+ #include <sys/signalfd.h>
++#endif
+
+ #include "base/files/file_util.h"
+ #include "base/files/scoped_file.h"
+@@ -24,6 +26,10 @@ void RelauncherSynchronizeWithParent() {
+ base::ScopedFD relauncher_sync_fd(kRelauncherSyncFD);
+ static const auto signum = SIGUSR2;
+
++#if defined(__FreeBSD__)
++ PLOG(ERROR) << "signalfd & prctl";
++ fprintf(stderr, "Not Implemented signalfd & prctl in atom/browser/relauncher_linux.cc");
++#else
+ // send signum to current process when parent process ends.
+ if (HANDLE_EINTR(prctl(PR_SET_PDEATHSIG, signum)) != 0) {
+ PLOG(ERROR) << "prctl";
+@@ -48,6 +54,7 @@ void RelauncherSynchronizeWithParent() {
+
+ // Wait for the parent to exit
+ parentWaiter.Wait();
++#endif
+ }
+
+ int LaunchProgram(const StringVector& relauncher_args,
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h b/devel/electron28/files/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
new file mode 100644
index 000000000000..36fa491f6daa
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/inspectable_web_contents_view_delegate.h.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/browser/ui/inspectable_web_contents_view_delegate.h
+@@ -24,7 +24,7 @@ class InspectableWebContentsViewDelegate {
+ // Returns the icon of devtools window.
+ virtual ui::ImageModel GetDevToolsWindowIcon();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Called when creating devtools window.
+ virtual void GetDevToolsWindowWMClass(std::string* name,
+ std::string* class_name) {}
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.cc b/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
new file mode 100644
index 000000000000..21bc4a31c5f9
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
@@ -0,0 +1,38 @@
+--- electron/shell/browser/ui/views/electron_views_delegate.cc.orig 2023-01-24 16:58:16 UTC
++++ electron/shell/browser/ui/views/electron_views_delegate.cc
+@@ -9,7 +9,7 @@
+ #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
+ #include "ui/views/widget/native_widget_aura.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #include "ui/linux/linux_ui.h"
+@@ -17,7 +17,7 @@
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool IsDesktopEnvironmentUnity() {
+ auto env = base::Environment::Create();
+ base::nix::DesktopEnvironment desktop_env =
+@@ -53,7 +53,7 @@ void ViewsDelegate::NotifyMenuItemFocused(const std::u
+ int item_count,
+ bool has_submenu) {}
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return nullptr;
+ }
+@@ -85,7 +85,7 @@ void ViewsDelegate::OnBeforeWidgetInit(
+ }
+
+ bool ViewsDelegate::WindowManagerProvidesTitleBar(bool maximized) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Ubuntu Unity, the system always provides a title bar for maximized
+ // windows.
+ if (!maximized)
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.h b/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.h
new file mode 100644
index 000000000000..19ff8533f684
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_electron__views__delegate.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/views/electron_views_delegate.h.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/browser/ui/views/electron_views_delegate.h
+@@ -44,7 +44,7 @@ class ViewsDelegate : public views::ViewsDelegate {
+ HICON GetSmallWindowIcon() const override;
+ int GetAppbarAutohideEdges(HMONITOR monitor,
+ base::OnceClosure callback) override;
+-#elif BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#elif (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ #endif
+ std::unique_ptr<views::NonClientFrameView> CreateDefaultNonClientFrameView(
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc b/devel/electron28/files/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
new file mode 100644
index 000000000000..deb56a27ac39
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/views/inspectable_web_contents_view_views.cc.orig 2023-10-10 23:44:27 UTC
++++ electron/shell/browser/ui/views/inspectable_web_contents_view_views.cc
+@@ -184,7 +184,7 @@ void InspectableWebContentsViewViews::SetIsDocked(bool
+ params.delegate = devtools_window_delegate_;
+ params.bounds = inspectable_web_contents()->GetDevToolsBounds();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ params.wm_role_name = "devtools";
+ if (GetDelegate())
+ GetDelegate()->GetDevToolsWindowWMClass(&params.wm_class_name,
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.cc b/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.cc
new file mode 100644
index 000000000000..c703555b96e3
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.cc
@@ -0,0 +1,38 @@
+--- electron/shell/browser/ui/views/menu_bar.cc.orig 2023-04-03 22:25:21 UTC
++++ electron/shell/browser/ui/views/menu_bar.cc
+@@ -13,7 +13,7 @@
+ #include "ui/views/background.h"
+ #include "ui/views/layout/box_layout.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/gtk/gtk_util.h" // nogncheck
+ #endif
+
+@@ -218,7 +218,7 @@ void MenuBar::ViewHierarchyChanged(
+
+ void MenuBar::RefreshColorCache(const ui::NativeTheme* theme) {
+ if (theme) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ background_color_ = gtk::GetBgColor("GtkMenuBar#menubar");
+ enabled_color_ =
+ gtk::GetFgColor("GtkMenuBar#menubar GtkMenuItem#menuitem GtkLabel");
+@@ -243,7 +243,7 @@ void MenuBar::RebuildChildren() {
+ }
+
+ void MenuBar::UpdateViewColors() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // set menubar background color
+ SetBackground(views::CreateSolidBackground(background_color_));
+ #endif
+@@ -251,7 +251,7 @@ void MenuBar::UpdateViewColors() {
+ // set child colors
+ if (menu_model_ == nullptr)
+ return;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const auto& textColor =
+ window_->IsFocused() ? enabled_color_ : disabled_color_;
+ for (auto* child : GetChildrenInZOrder()) {
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.h b/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.h
new file mode 100644
index 000000000000..76b5b9eb0016
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_menu__bar.h
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/views/menu_bar.h.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/browser/ui/views/menu_bar.h
+@@ -83,7 +83,7 @@ class MenuBar : public views::AccessiblePaneView,
+ View* FindAccelChild(char16_t key);
+
+ SkColor background_color_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ SkColor enabled_color_;
+ SkColor disabled_color_;
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_browser_ui_views_submenu__button.cc b/devel/electron28/files/patch-electron_shell_browser_ui_views_submenu__button.cc
new file mode 100644
index 000000000000..075d978a0d27
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_browser_ui_views_submenu__button.cc
@@ -0,0 +1,11 @@
+--- electron/shell/browser/ui/views/submenu_button.cc.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/browser/ui/views/submenu_button.cc
+@@ -22,7 +22,7 @@ SubmenuButton::SubmenuButton(PressedCallback callback,
+ const SkColor& background_color)
+ : views::MenuButton(callback, gfx::RemoveAccelerator(title)),
+ background_color_(background_color) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Dont' use native style border.
+ SetBorder(CreateDefaultBorder());
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_common_api_electron__api__clipboard.cc b/devel/electron28/files/patch-electron_shell_common_api_electron__api__clipboard.cc
new file mode 100644
index 000000000000..7dca2d0ba775
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_api_electron__api__clipboard.cc
@@ -0,0 +1,20 @@
+--- electron/shell/common/api/electron_api_clipboard.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/common/api/electron_api_clipboard.cc
+@@ -57,7 +57,7 @@ std::string Clipboard::Read(const std::string& format_
+ ui::ClipboardFormatType::CustomPlatformType(format_string));
+ bool rawFormatAvailable = clipboard->IsFormatAvailable(
+ rawFormat, ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!rawFormatAvailable) {
+ rawFormatAvailable = clipboard->IsFormatAvailable(
+ rawFormat, ui::ClipboardBuffer::kSelection, /* data_dst = */ nullptr);
+@@ -73,7 +73,7 @@ std::string Clipboard::Read(const std::string& format_
+ custom_format_names =
+ clipboard->ExtractCustomPlatformNames(ui::ClipboardBuffer::kCopyPaste,
+ /* data_dst = */ nullptr);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!base::Contains(custom_format_names, format_string)) {
+ custom_format_names =
+ clipboard->ExtractCustomPlatformNames(ui::ClipboardBuffer::kSelection,
diff --git a/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.cc b/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.cc
new file mode 100644
index 000000000000..aa720f7b402f
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.cc
@@ -0,0 +1,11 @@
+--- electron/shell/common/api/electron_api_native_image.cc.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/common/api/electron_api_native_image.cc
+@@ -653,7 +653,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ native_image.SetMethod("createFromDataURL", &NativeImage::CreateFromDataURL);
+ native_image.SetMethod("createFromNamedImage",
+ &NativeImage::CreateFromNamedImage);
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ native_image.SetMethod("createThumbnailFromPath",
+ &NativeImage::CreateThumbnailFromPath);
+ #endif
diff --git a/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.h b/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.h
new file mode 100644
index 000000000000..a92f3e17e880
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_api_electron__api__native__image.h
@@ -0,0 +1,11 @@
+--- electron/shell/common/api/electron_api_native_image.h.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/common/api/electron_api_native_image.h
+@@ -78,7 +78,7 @@ class NativeImage : public gin::Wrappable<NativeImage>
+ const GURL& url);
+ static gin::Handle<NativeImage> CreateFromNamedImage(gin::Arguments* args,
+ std::string name);
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ static v8::Local<v8::Promise> CreateThumbnailFromPath(
+ v8::Isolate* isolate,
+ const base::FilePath& path,
diff --git a/devel/electron28/files/patch-electron_shell_common_api_electron__bindings.cc b/devel/electron28/files/patch-electron_shell_common_api_electron__bindings.cc
new file mode 100644
index 000000000000..e10707789e59
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_api_electron__bindings.cc
@@ -0,0 +1,11 @@
+--- electron/shell/common/api/electron_bindings.cc.orig 2023-12-04 18:19:02 UTC
++++ electron/shell/common/api/electron_bindings.cc
+@@ -265,7 +265,7 @@ void ElectronBindings::DidReceiveMemoryDump(
+ if (target_pid == dump.pid()) {
+ auto dict = gin_helper::Dictionary::CreateEmpty(isolate);
+ const auto& osdump = dump.os_dump();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ dict.Set("residentSet", osdump.resident_set_kb);
+ #endif
+ dict.Set("private", osdump.private_footprint_kb);
diff --git a/devel/electron28/files/patch-electron_shell_common_electron__command__line.cc b/devel/electron28/files/patch-electron_shell_common_electron__command__line.cc
new file mode 100644
index 000000000000..10eb673c987e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_electron__command__line.cc
@@ -0,0 +1,11 @@
+--- electron/shell/common/electron_command_line.cc.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/common/electron_command_line.cc
+@@ -26,7 +26,7 @@ void ElectronCommandLine::Init(int argc, base::Command
+ argv_.assign(argv, argv + argc);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // static
+ void ElectronCommandLine::InitializeFromCommandLine() {
+ argv_ = base::CommandLine::ForCurrentProcess()->argv();
diff --git a/devel/electron28/files/patch-electron_shell_common_electron__command__line.h b/devel/electron28/files/patch-electron_shell_common_electron__command__line.h
new file mode 100644
index 000000000000..faf234d31c46
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_electron__command__line.h
@@ -0,0 +1,11 @@
+--- electron/shell/common/electron_command_line.h.orig 2022-05-18 15:31:32 UTC
++++ electron/shell/common/electron_command_line.h
+@@ -22,7 +22,7 @@ class ElectronCommandLine {
+
+ static void Init(int argc, base::CommandLine::CharType** argv);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux the command line has to be read from base::CommandLine since
+ // it is using zygote.
+ static void InitializeFromCommandLine();
diff --git a/devel/electron28/files/patch-electron_shell_common_electron__paths.h b/devel/electron28/files/patch-electron_shell_common_electron__paths.h
new file mode 100644
index 000000000000..5ca6a126e4b3
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_electron__paths.h
@@ -0,0 +1,11 @@
+--- electron/shell/common/electron_paths.h.orig 2022-08-03 15:31:32 UTC
++++ electron/shell/common/electron_paths.h
+@@ -30,7 +30,7 @@ enum {
+ DIR_RECENT, // Directory where recent files live
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ DIR_APP_DATA, // Application Data directory under the user profile.
+ #endif
+
diff --git a/devel/electron28/files/patch-electron_shell_common_gin__converters_std__converter.h b/devel/electron28/files/patch-electron_shell_common_gin__converters_std__converter.h
new file mode 100644
index 000000000000..8fb16f713e95
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_gin__converters_std__converter.h
@@ -0,0 +1,11 @@
+--- electron/shell/common/gin_converters/std_converter.h.orig 2023-08-14 18:19:06 UTC
++++ electron/shell/common/gin_converters/std_converter.h
+@@ -28,7 +28,7 @@ v8::Local<v8::Value> ConvertToV8(v8::Isolate* isolate,
+ isolate, std::forward<T>(input));
+ }
+
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ template <>
+ struct Converter<unsigned long> { // NOLINT(runtime/int)
+ static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
diff --git a/devel/electron28/files/patch-electron_shell_common_node__bindings.cc b/devel/electron28/files/patch-electron_shell_common_node__bindings.cc
new file mode 100644
index 000000000000..757b2260bba5
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_node__bindings.cc
@@ -0,0 +1,29 @@
+--- electron/shell/common/node_bindings.cc.orig 2024-01-23 19:02:02 UTC
++++ electron/shell/common/node_bindings.cc
+@@ -39,7 +39,7 @@
+ #include "third_party/electron_node/src/debug_utils.h"
+ #include "third_party/electron_node/src/module_wrap.h"
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "shell/common/crash_keys.h"
+ #endif
+
+@@ -154,7 +154,7 @@ void V8FatalErrorCallback(const char* location, const
+ void V8FatalErrorCallback(const char* location, const char* message) {
+ LOG(ERROR) << "Fatal error in V8: " << location << " " << message;
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ electron::crash_keys::SetCrashKey("electron.v8-fatal.message", message);
+ electron::crash_keys::SetCrashKey("electron.v8-fatal.location", location);
+ #endif
+@@ -505,7 +505,7 @@ void NodeBindings::Initialize(v8::Local<v8::Context> c
+ TRACE_EVENT0("electron", "NodeBindings::Initialize");
+ // Open node's error reporting system for browser process.
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Get real command line in renderer process forked by zygote.
+ if (browser_env_ != BrowserEnvironment::kBrowser)
+ ElectronCommandLine::InitializeFromCommandLine();
diff --git a/devel/electron28/files/patch-electron_shell_common_node__bindings__linux.cc b/devel/electron28/files/patch-electron_shell_common_node__bindings__linux.cc
new file mode 100644
index 000000000000..0dabd6390a8d
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_node__bindings__linux.cc
@@ -0,0 +1,69 @@
+--- electron/shell/common/node_bindings_linux.cc.orig 2023-10-20 08:29:17 UTC
++++ electron/shell/common/node_bindings_linux.cc
+@@ -4,12 +4,25 @@
+
+ #include "shell/common/node_bindings_linux.h"
+
++#if !defined(OS_BSD)
+ #include <sys/epoll.h>
++#else
++#include <errno.h>
++#include <sys/select.h>
++#include <sys/sysctl.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#endif
+
+ namespace electron {
+
+ NodeBindingsLinux::NodeBindingsLinux(BrowserEnvironment browser_env)
++#if !defined(OS_BSD)
+ : NodeBindings(browser_env), epoll_(epoll_create(1)) {
++#else
++ : NodeBindings(browser_env) {
++#endif
++#if !defined(OS_BSD)
+ auto* const event_loop = uv_loop();
+
+ int backend_fd = uv_backend_fd(event_loop);
+@@ -17,11 +30,13 @@ NodeBindingsLinux::NodeBindingsLinux(BrowserEnvironmen
+ ev.events = EPOLLIN;
+ ev.data.fd = backend_fd;
+ epoll_ctl(epoll_, EPOLL_CTL_ADD, backend_fd, &ev);
++#endif
+ }
+
+ void NodeBindingsLinux::PollEvents() {
+ auto* const event_loop = uv_loop();
+
++#if !defined(OS_BSD)
+ int timeout = uv_backend_timeout(event_loop);
+
+ // Wait for new libuv events.
+@@ -30,6 +45,26 @@ void NodeBindingsLinux::PollEvents() {
+ struct epoll_event ev;
+ r = epoll_wait(epoll_, &ev, 1, timeout);
+ } while (r == -1 && errno == EINTR);
++#else
++ struct timeval tv;
++ int timeout = uv_backend_timeout(event_loop);
++ if (timeout != -1) {
++ tv.tv_sec = timeout / 1000;
++ tv.tv_usec = (timeout % 1000) * 1000;
++ }
++
++ fd_set readset;
++ int fd = uv_backend_fd(event_loop);
++ FD_ZERO(&readset);
++ FD_SET(fd, &readset);
++
++ // Wait for new libuv events.
++ int r;
++ do {
++ r = select(fd + 1, &readset, nullptr, nullptr,
++ timeout == -1 ? nullptr : &tv);
++ } while (r == -1 && errno == EINTR);
++#endif
+ }
+
+ // static
diff --git a/devel/electron28/files/patch-electron_shell_common_platform__util.h b/devel/electron28/files/patch-electron_shell_common_platform__util.h
new file mode 100644
index 000000000000..c0fa34d2b4c4
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_common_platform__util.h
@@ -0,0 +1,11 @@
+--- electron/shell/common/platform_util.h.orig 2023-04-03 22:25:21 UTC
++++ electron/shell/common/platform_util.h
+@@ -53,7 +53,7 @@ bool GetLoginItemEnabled();
+ bool SetLoginItemEnabled(bool enabled);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Returns a success flag.
+ // Unlike libgtkui, does *not* use "chromium-browser.desktop" as a fallback.
+ bool GetDesktopName(std::string* setme);
diff --git a/devel/electron28/files/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc b/devel/electron28/files/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
new file mode 100644
index 000000000000..56b9420c6ec8
--- /dev/null
+++ b/devel/electron28/files/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
@@ -0,0 +1,36 @@
+--- electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc.orig 2023-02-06 19:29:11 UTC
++++ electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc
+@@ -6,7 +6,7 @@
+ #include "shell/common/gin_helper/dictionary.h"
+ #include "shell/common/node_includes.h"
+
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "shell/common/crash_keys.h"
+ #endif
+
+@@ -14,13 +14,13 @@ namespace {
+
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+ std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+ return gin::ConvertToV8(isolate, keys);
+ }
+
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void SetCrashKeyStub(const std::string& key, const std::string& value) {}
+ void ClearCrashKeyStub(const std::string& key) {}
+ #endif
+@@ -30,7 +30,7 @@ void Initialize(v8::Local<v8::Object> exports,
+ v8::Local<v8::Context> context,
+ void* priv) {
+ gin_helper::Dictionary dict(context->GetIsolate(), exports);
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ dict.SetMethod("addExtraParameter", &SetCrashKeyStub);
+ dict.SetMethod("removeExtraParameter", &ClearCrashKeyStub);
+ #else
diff --git a/devel/electron28/files/patch-electron_spec_api-app-spec.ts b/devel/electron28/files/patch-electron_spec_api-app-spec.ts
new file mode 100644
index 000000000000..875c92c9ef53
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-app-spec.ts
@@ -0,0 +1,133 @@
+--- electron/spec/api-app-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/api-app-spec.ts
+@@ -122,11 +122,11 @@ describe('app module', () => {
+ });
+
+ describe('app.getPreferredSystemLanguages()', () => {
+- ifit(process.platform !== 'linux')('should not be empty', () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should not be empty', () => {
+ expect(app.getPreferredSystemLanguages().length).to.not.equal(0);
+ });
+
+- ifit(process.platform === 'linux')('should be empty or contain C entry', () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('should be empty or contain C entry', () => {
+ const languages = app.getPreferredSystemLanguages();
+ if (languages.length) {
+ expect(languages).to.not.include('C');
+@@ -189,7 +189,7 @@ describe('app module', () => {
+ expect(code).to.equal(123, 'exit code should be 123, if you see this please tag @MarshallOfSound');
+ });
+
+- ifit(['darwin', 'linux'].includes(process.platform))('exits gracefully', async function () {
++ ifit(['darwin', 'linux', 'freebsd'].includes(process.platform))('exits gracefully', async function () {
+ const electronPath = process.execPath;
+ const appPath = path.join(fixturesPath, 'api', 'singleton');
+ appProcess = cp.spawn(electronPath, [appPath]);
+@@ -443,7 +443,7 @@ describe('app module', () => {
+ // let w = null
+
+ // before(function () {
+- // if (process.platform !== 'linux') {
++ // if (process.platform !== 'linux' && process.platform !== 'freebsd') {
+ // this.skip()
+ // }
+ // })
+@@ -571,7 +571,7 @@ describe('app module', () => {
+ describe('app.badgeCount', () => {
+ const platformIsNotSupported =
+ (process.platform === 'win32') ||
+- (process.platform === 'linux' && !app.isUnityRunning());
++ ((process.platform === 'linux' || process.platform === 'freebsd') && !app.isUnityRunning());
+
+ const expectedBadgeCount = 42;
+
+@@ -615,7 +615,7 @@ describe('app module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux' && !process.mas)('app.get/setLoginItemSettings API', function () {
++ ifdescribe((process.platform !== 'linux' && process.platform !== 'freebsd') && !process.mas)('app.get/setLoginItemSettings API', function () {
+ const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe');
+ const processStartArgs = [
+ '--processStart', `"${path.basename(process.execPath)}"`,
+@@ -930,7 +930,7 @@ describe('app module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('accessibilitySupportEnabled property', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('accessibilitySupportEnabled property', () => {
+ it('with properties', () => {
+ it('can set accessibility support enabled', () => {
+ expect(app.accessibilitySupportEnabled).to.eql(false);
+@@ -1092,7 +1092,7 @@ describe('app module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('select-client-certificate event', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('select-client-certificate event', () => {
+ let w: BrowserWindow;
+
+ before(function () {
+@@ -1227,7 +1227,7 @@ describe('app module', () => {
+
+ describe('getApplicationNameForProtocol()', () => {
+ // TODO: Linux CI doesn't have registered http & https handlers
+- ifit(!(process.env.CI && process.platform === 'linux'))('returns application names for common protocols', function () {
++ ifit(!(process.env.CI && (process.platform === 'linux' || process.platform === 'freebsd')))('returns application names for common protocols', function () {
+ // We can't expect particular app names here, but these protocols should
+ // at least have _something_ registered. Except on our Linux CI
+ // environment apparently.
+@@ -1245,7 +1245,7 @@ describe('app module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('getApplicationInfoForProtocol()', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('getApplicationInfoForProtocol()', () => {
+ it('returns promise rejection for a bogus protocol', async function () {
+ await expect(
+ app.getApplicationInfoForProtocol('bogus-protocol://')
+@@ -1295,7 +1295,7 @@ describe('app module', () => {
+ });
+
+ // FIXME Get these specs running on Linux CI
+- ifdescribe(process.platform !== 'linux')('getFileIcon() API', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('getFileIcon() API', () => {
+ const iconPath = path.join(__dirname, 'fixtures/assets/icon.ico');
+ const sizes = {
+ small: 16,
+@@ -1376,7 +1376,7 @@ describe('app module', () => {
+ expect(entry.memory).to.have.property('privateBytes').that.is.greaterThan(0);
+ }
+
+- if (process.platform !== 'linux') {
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') {
+ expect(entry.sandboxed).to.be.a('boolean');
+ }
+
+@@ -1402,7 +1402,7 @@ describe('app module', () => {
+ });
+
+ // FIXME https://github.com/electron/electron/issues/24224
+- ifdescribe(process.platform !== 'linux')('getGPUInfo() API', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('getGPUInfo() API', () => {
+ const appPath = path.join(fixturesPath, 'api', 'gpu-info.js');
+
+ const getGPUInfo = async (type: string) => {
+@@ -1451,7 +1451,7 @@ describe('app module', () => {
+
+ it('succeeds with complete GPUInfo', async () => {
+ const completeInfo = await getGPUInfo('complete');
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ // For linux and macOS complete info is same as basic info
+ await verifyBasicGPUInfo(completeInfo);
+ const basicInfo = await getGPUInfo('basic');
+@@ -1475,7 +1475,7 @@ describe('app module', () => {
+ });
+ });
+
+- ifdescribe(!(process.platform === 'linux' && (process.arch === 'arm64' || process.arch === 'arm')))('sandbox options', () => {
++ ifdescribe(!((process.platform === 'linux' || process.platform === 'freebsd') && (process.arch === 'arm64' || process.arch === 'arm')))('sandbox options', () => {
+ // Our ARM tests are run on VSTS rather than CircleCI, and the Docker
+ // setup on VSTS disallows syscalls that Chrome requires for setting up
+ // sandboxing.
diff --git a/devel/electron28/files/patch-electron_spec_api-browser-window-spec.ts b/devel/electron28/files/patch-electron_spec_api-browser-window-spec.ts
new file mode 100644
index 000000000000..5eeadf81dee9
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-browser-window-spec.ts
@@ -0,0 +1,155 @@
+--- electron/spec/api-browser-window-spec.ts.orig 2024-01-10 12:21:58 UTC
++++ electron/spec/api-browser-window-spec.ts
+@@ -64,7 +64,7 @@ describe('BrowserWindow module', () => {
+ }).not.to.throw();
+ });
+
+- ifit(process.platform === 'linux')('does not crash when setting large window icons', async () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('does not crash when setting large window icons', async () => {
+ const appPath = path.join(fixtures, 'apps', 'xwindow-icon');
+ const appProcess = childProcess.spawn(process.execPath, [appPath]);
+ await once(appProcess, 'exit');
+@@ -1113,7 +1113,7 @@ describe('BrowserWindow module', () => {
+
+ describe('BrowserWindow.minimize()', () => {
+ // TODO(codebytere): Enable for Linux once maximize/minimize events work in CI.
+- ifit(process.platform !== 'linux')('should not be visible when the window is minimized', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should not be visible when the window is minimized', async () => {
+ const minimize = once(w, 'minimize');
+ w.minimize();
+ await minimize;
+@@ -1130,7 +1130,7 @@ describe('BrowserWindow module', () => {
+ });
+
+ // TODO(dsanders11): Enable for Linux once CI plays nice with these kinds of tests
+- ifit(process.platform !== 'linux')('should not restore maximized windows', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should not restore maximized windows', async () => {
+ const maximize = once(w, 'maximize');
+ const shown = once(w, 'show');
+ w.maximize();
+@@ -1195,7 +1195,7 @@ describe('BrowserWindow module', () => {
+ expect(w.isFocused()).to.equal(true);
+ });
+
+- ifit(process.platform !== 'linux')('acquires focus status from the other windows', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('acquires focus status from the other windows', async () => {
+ const w1 = new BrowserWindow({ show: false });
+ const w2 = new BrowserWindow({ show: false });
+ const w3 = new BrowserWindow({ show: false });
+@@ -1296,7 +1296,7 @@ describe('BrowserWindow module', () => {
+ expect(w.isFocused()).to.equal(false);
+ });
+
+- ifit(process.platform !== 'linux')('transfers focus status to the next window', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('transfers focus status to the next window', async () => {
+ const w1 = new BrowserWindow({ show: false });
+ const w2 = new BrowserWindow({ show: false });
+ const w3 = new BrowserWindow({ show: false });
+@@ -1707,7 +1707,7 @@ describe('BrowserWindow module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('Maximized state', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('Maximized state', () => {
+ it('checks normal bounds when maximized', async () => {
+ const bounds = w.getBounds();
+ const maximize = once(w, 'maximize');
+@@ -1887,7 +1887,7 @@ describe('BrowserWindow module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('Minimized state', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('Minimized state', () => {
+ it('checks normal bounds when minimized', async () => {
+ const bounds = w.getBounds();
+ const minimize = once(w, 'minimize');
+@@ -2834,7 +2834,7 @@ describe('BrowserWindow module', () => {
+ describe('BrowserWindow.setOpacity(opacity)', () => {
+ afterEach(closeAllWindows);
+
+- ifdescribe(process.platform !== 'linux')(('Windows and Mac'), () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')(('Windows and Mac'), () => {
+ it('make window with initial opacity', () => {
+ const w = new BrowserWindow({ show: false, opacity: 0.5 });
+ expect(w.getOpacity()).to.equal(0.5);
+@@ -2860,7 +2860,7 @@ describe('BrowserWindow module', () => {
+ });
+ });
+
+- ifdescribe(process.platform === 'linux')(('Linux'), () => {
++ ifdescribe(process.platform === 'linux' || process.platform === 'freebsd')(('Linux'), () => {
+ it('sets 1 regardless of parameter', () => {
+ const w = new BrowserWindow({ show: false });
+ w.setOpacity(0);
+@@ -3790,7 +3790,7 @@ describe('BrowserWindow module', () => {
+ expect(test.nodeTimers).to.equal(true);
+ expect(test.nodeUrl).to.equal(true);
+
+- if (process.platform === 'linux' && test.osSandbox) {
++ if ((process.platform === 'linux' || process.platform === 'freebsd') && test.osSandbox) {
+ expect(test.creationTime).to.be.null('creation time');
+ expect(test.systemMemoryInfo).to.be.null('system memory info');
+ } else {
+@@ -4295,7 +4295,7 @@ describe('BrowserWindow module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('max/minimize events', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('max/minimize events', () => {
+ afterEach(closeAllWindows);
+ it('emits an event when window is maximized', async () => {
+ const w = new BrowserWindow({ show: false });
+@@ -4566,7 +4566,7 @@ describe('BrowserWindow module', () => {
+ // TODO(zcbenz):
+ // This test does not run on Linux CI. See:
+ // https://github.com/electron/electron/issues/28699
+- ifit(process.platform === 'linux' && !process.env.CI)('should bring a minimized maximized window back to maximized state', async () => {
++ ifit((process.platform === 'linux' || process.platform === 'freebsd') && !process.env.CI)('should bring a minimized maximized window back to maximized state', async () => {
+ const w = new BrowserWindow({});
+ const maximize = once(w, 'maximize');
+ w.maximize();
+@@ -4583,7 +4583,7 @@ describe('BrowserWindow module', () => {
+ });
+
+ // TODO(dsanders11): Enable once maximize event works on Linux again on CI
+- ifdescribe(process.platform !== 'linux')('BrowserWindow.maximize()', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('BrowserWindow.maximize()', () => {
+ afterEach(closeAllWindows);
+ it('should show the window if it is not currently shown', async () => {
+ const w = new BrowserWindow({ show: false });
+@@ -4620,7 +4620,7 @@ describe('BrowserWindow module', () => {
+
+ // TODO(dsanders11): Enable once minimize event works on Linux again.
+ // See https://github.com/electron/electron/issues/28699
+- ifit(process.platform !== 'linux')('should not restore a minimized window', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should not restore a minimized window', async () => {
+ const w = new BrowserWindow();
+ const minimize = once(w, 'minimize');
+ w.minimize();
+@@ -5094,7 +5094,7 @@ describe('BrowserWindow module', () => {
+ });
+
+ // On Linux there is no "resizable" property of a window.
+- ifit(process.platform !== 'linux')('does affect maximizability when disabled and enabled', () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('does affect maximizability when disabled and enabled', () => {
+ const w = new BrowserWindow({ show: false });
+ expect(w.resizable).to.be.true('resizable');
+
+@@ -5233,7 +5233,7 @@ describe('BrowserWindow module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('window states (excluding Linux)', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('window states (excluding Linux)', () => {
+ // Not implemented on Linux.
+ afterEach(closeAllWindows);
+
+@@ -6398,7 +6398,7 @@ describe('BrowserWindow module', () => {
+ describe('"transparent" option', () => {
+ afterEach(closeAllWindows);
+
+- ifit(process.platform !== 'linux')('correctly returns isMaximized() when the window is maximized then minimized', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('correctly returns isMaximized() when the window is maximized then minimized', async () => {
+ const w = new BrowserWindow({
+ frame: false,
+ transparent: true
diff --git a/devel/electron28/files/patch-electron_spec_api-clipboard-spec.ts b/devel/electron28/files/patch-electron_spec_api-clipboard-spec.ts
new file mode 100644
index 000000000000..bb37bb57ca7e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-clipboard-spec.ts
@@ -0,0 +1,29 @@
+--- electron/spec/api-clipboard-spec.ts.orig 2023-08-14 18:19:06 UTC
++++ electron/spec/api-clipboard-spec.ts
+@@ -48,7 +48,7 @@ ifdescribe(process.platform !== 'win32' || process.arc
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('clipboard.readBookmark', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('clipboard.readBookmark', () => {
+ it('returns title and url', () => {
+ clipboard.writeBookmark('a title', 'https://electronjs.org');
+
+@@ -67,7 +67,7 @@ ifdescribe(process.platform !== 'win32' || process.arc
+ });
+
+ describe('clipboard.read()', () => {
+- ifit(process.platform !== 'linux')('does not crash when reading various custom clipboard types', () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('does not crash when reading various custom clipboard types', () => {
+ const type = process.platform === 'darwin' ? 'NSFilenamesPboardType' : 'FileNameW';
+
+ expect(() => {
+@@ -104,7 +104,7 @@ ifdescribe(process.platform !== 'win32' || process.arc
+ const readImage = clipboard.readImage();
+ expect(readImage.toDataURL()).to.equal(i.toDataURL());
+
+- if (process.platform !== 'linux') {
++ if (process.platform !== 'linux' && process.platform !== 'freebsd') {
+ if (process.platform !== 'win32') {
+ expect(clipboard.readBookmark()).to.deep.equal(bookmark);
+ } else {
diff --git a/devel/electron28/files/patch-electron_spec_api-content-tracing-spec.ts b/devel/electron28/files/patch-electron_spec_api-content-tracing-spec.ts
new file mode 100644
index 000000000000..526dde3fc788
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-content-tracing-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-content-tracing-spec.ts.orig 2023-09-16 04:46:51 UTC
++++ electron/spec/api-content-tracing-spec.ts
+@@ -6,7 +6,7 @@ import { setTimeout } from 'timers/promises';
+ import { ifdescribe } from './lib/spec-helpers';
+
+ // FIXME: The tests are skipped on linux arm/arm64
+-ifdescribe(!(['arm', 'arm64'].includes(process.arch)) || (process.platform !== 'linux'))('contentTracing', () => {
++ifdescribe(!(['arm', 'arm64'].includes(process.arch)) || (process.platform !== 'linux' && process.platform !== 'freebsd'))('contentTracing', () => {
+ const record = async (options: TraceConfig | TraceCategoriesAndOptions, outputFilePath: string | undefined, recordTimeInMilliseconds = 1e1) => {
+ await app.whenReady();
+
diff --git a/devel/electron28/files/patch-electron_spec_api-crash-reporter-spec.ts b/devel/electron28/files/patch-electron_spec_api-crash-reporter-spec.ts
new file mode 100644
index 000000000000..3f0149ee4234
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-crash-reporter-spec.ts
@@ -0,0 +1,56 @@
+--- electron/spec/api-crash-reporter-spec.ts.orig 2024-01-23 19:02:02 UTC
++++ electron/spec/api-crash-reporter-spec.ts
+@@ -11,7 +11,7 @@ const isWindowsOnArm = process.platform === 'win32' &&
+ import { setTimeout } from 'node:timers/promises';
+
+ const isWindowsOnArm = process.platform === 'win32' && process.arch === 'arm64';
+-const isLinuxOnArm = process.platform === 'linux' && process.arch.includes('arm');
++const isLinuxOnArm = ((process.platform === 'linux' || process.platform === 'freebsd') && process.arch.includes('arm'));
+
+ type CrashInfo = {
+ prod: string
+@@ -44,7 +44,7 @@ function checkCrash (expectedProcessType: string, fiel
+
+ // TODO(nornagon): minidumps are sometimes (not always) turning up empty on
+ // 32-bit Linux. Figure out why.
+- if (!(process.platform === 'linux' && process.arch === 'ia32')) {
++ if (!((process.platform === 'linux' || process.platform === 'freebsd') && process.arch === 'ia32')) {
+ expect(fields.upload_file_minidump.length).to.be.greaterThan(0);
+ }
+ }
+@@ -181,7 +181,7 @@ ifdescribe(!isLinuxOnArm && !process.mas && !process.e
+
+ // Ensures that passing in crashpadHandlerPID flag for Linx child processes
+ // does not affect child proocess args.
+- ifit(process.platform === 'linux')('ensure linux child process args are not modified', async () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('ensure linux child process args are not modified', async () => {
+ const { port, waitForCrash } = await startServer();
+ let exitCode: number | null = null;
+ const appPath = path.join(__dirname, 'fixtures', 'apps', 'crash');
+@@ -530,7 +530,7 @@ ifdescribe(!isLinuxOnArm && !process.mas && !process.e
+ }
+ }
+
+- const processList = process.platform === 'linux' ? ['main', 'renderer', 'sandboxed-renderer']
++ const processList = (process.platform === 'linux' || process.platform === 'freebsd') ? ['main', 'renderer', 'sandboxed-renderer']
+ : ['main', 'renderer', 'sandboxed-renderer', 'node'];
+ for (const crashingProcess of processList) {
+ describe(`when ${crashingProcess} crashes`, () => {
+@@ -542,7 +542,7 @@ ifdescribe(!isLinuxOnArm && !process.mas && !process.e
+ return app.getPath('crashDumps');
+ });
+ let reportsDir = crashesDir;
+- if (process.platform === 'darwin' || process.platform === 'linux') {
++ if (process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'freebsd') {
+ reportsDir = path.join(crashesDir, 'completed');
+ } else if (process.platform === 'win32') {
+ reportsDir = path.join(crashesDir, 'reports');
+@@ -566,7 +566,7 @@ ifdescribe(!isLinuxOnArm && !process.mas && !process.e
+ expect(remoteCrashesDir).to.equal(crashesDir);
+
+ let reportsDir = crashesDir;
+- if (process.platform === 'darwin' || process.platform === 'linux') {
++ if (process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'freebsd') {
+ reportsDir = path.join(crashesDir, 'completed');
+ } else if (process.platform === 'win32') {
+ reportsDir = path.join(crashesDir, 'reports');
diff --git a/devel/electron28/files/patch-electron_spec_api-desktop-capturer-spec.ts b/devel/electron28/files/patch-electron_spec_api-desktop-capturer-spec.ts
new file mode 100644
index 000000000000..7001a56b8b90
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-desktop-capturer-spec.ts
@@ -0,0 +1,47 @@
+--- electron/spec/api-desktop-capturer-spec.ts.orig 2023-08-14 18:19:06 UTC
++++ electron/spec/api-desktop-capturer-spec.ts
+@@ -43,7 +43,7 @@ ifdescribe(!process.arch.includes('arm') && process.pl
+ });
+
+ // Linux doesn't return any window sources.
+- ifit(process.platform !== 'linux')('returns an empty display_id for window sources', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('returns an empty display_id for window sources', async () => {
+ const w = new BrowserWindow({ width: 200, height: 200 });
+ await w.loadURL('about:blank');
+
+@@ -55,7 +55,7 @@ ifdescribe(!process.arch.includes('arm') && process.pl
+ }
+ });
+
+- ifit(process.platform !== 'linux')('returns display_ids matching the Screen API', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('returns display_ids matching the Screen API', async () => {
+ const displays = screen.getAllDisplays();
+ const sources = await desktopCapturer.getSources({ types: ['screen'] });
+ expect(sources).to.be.an('array').of.length(displays.length);
+@@ -100,7 +100,7 @@ ifdescribe(!process.arch.includes('arm') && process.pl
+ // TODO(julien.isorce): investigate why |sources| is empty on the linux
+ // bots while it is not on my workstation, as expected, with and without
+ // the --ci parameter.
+- if (process.platform === 'linux' && sources.length === 0) {
++ if ((process.platform === 'linux' || process.platform === 'freebsd') && sources.length === 0) {
+ it.skip('desktopCapturer.getSources returned an empty source list');
+ return;
+ }
+@@ -136,7 +136,7 @@ ifdescribe(!process.arch.includes('arm') && process.pl
+ // TODO(julien.isorce): investigate why |sources| is empty on the linux
+ // bots while it is not on my workstation, as expected, with and without
+ // the --ci parameter.
+- if (process.platform === 'linux' && sources.length === 0) {
++ if ((process.platform === 'linux' || process.platform === 'freebsd') && sources.length === 0) {
+ it.skip('desktopCapturer.getSources returned an empty source list');
+ return;
+ }
+@@ -191,7 +191,7 @@ ifdescribe(!process.arch.includes('arm') && process.pl
+ // TODO(julien.isorce): investigate why |sources| is empty on the linux
+ // bots while it is not on my workstation, as expected, with and without
+ // the --ci parameter.
+- if (process.platform === 'linux' && sources.length === 0) {
++ if ((process.platform === 'linux' || process.platform === 'freebsd') && sources.length === 0) {
+ destroyWindows();
+ it.skip('desktopCapturer.getSources returned an empty source list');
+ return;
diff --git a/devel/electron28/files/patch-electron_spec_api-menu-spec.ts b/devel/electron28/files/patch-electron_spec_api-menu-spec.ts
new file mode 100644
index 000000000000..968e47dfb9c0
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-menu-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-menu-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/api-menu-spec.ts
+@@ -887,7 +887,7 @@ describe('Menu module', function () {
+ // https://github.com/electron/electron/issues/35724
+ // Maximizing window is enough to trigger the bug
+ // FIXME(dsanders11): Test always passes on CI, even pre-fix
+- ifit(process.platform === 'linux' && !process.env.CI)('does not trigger issue #35724', (done) => {
++ ifit((process.platform === 'linux' || process.platform === 'freebsd') && !process.env.CI)('does not trigger issue #35724', (done) => {
+ const showAndCloseMenu = async () => {
+ await setTimeout(1000);
+ menu.popup({ window: w, x: 50, y: 50 });
diff --git a/devel/electron28/files/patch-electron_spec_api-native-image-spec.ts b/devel/electron28/files/patch-electron_spec_api-native-image-spec.ts
new file mode 100644
index 000000000000..b77bfa124351
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-native-image-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-native-image-spec.ts.orig 2023-01-24 16:58:16 UTC
++++ electron/spec/api-native-image-spec.ts
+@@ -423,7 +423,7 @@ describe('nativeImage module', () => {
+ });
+ });
+
+- ifdescribe(process.platform !== 'linux')('createThumbnailFromPath(path, size)', () => {
++ ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('createThumbnailFromPath(path, size)', () => {
+ it('throws when invalid size is passed', async () => {
+ const badSize = { width: -1, height: -1 };
+
diff --git a/devel/electron28/files/patch-electron_spec_api-net-log-spec.ts b/devel/electron28/files/patch-electron_spec_api-net-log-spec.ts
new file mode 100644
index 000000000000..b20241e2213d
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-net-log-spec.ts
@@ -0,0 +1,29 @@
+--- electron/spec/api-net-log-spec.ts.orig 2023-05-31 14:28:29 UTC
++++ electron/spec/api-net-log-spec.ts
+@@ -118,7 +118,7 @@ describe('netLog module', () => {
+ expect(JSON.parse(dump).events.some((x: any) => x.params && x.params.bytes && Buffer.from(x.params.bytes, 'base64').includes(unique))).to.be.true('uuid present in dump');
+ });
+
+- ifit(process.platform !== 'linux')('should begin and end logging automatically when --log-net-log is passed', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should begin and end logging automatically when --log-net-log is passed', async () => {
+ const appProcess = ChildProcess.spawn(process.execPath,
+ [appPath], {
+ env: {
+@@ -131,7 +131,7 @@ describe('netLog module', () => {
+ expect(fs.existsSync(dumpFile)).to.be.true('dump file exists');
+ });
+
+- ifit(process.platform !== 'linux')('should begin and end logging automatically when --log-net-log is passed, and behave correctly when .startLogging() and .stopLogging() is called', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should begin and end logging automatically when --log-net-log is passed, and behave correctly when .startLogging() and .stopLogging() is called', async () => {
+ const appProcess = ChildProcess.spawn(process.execPath,
+ [appPath], {
+ env: {
+@@ -147,7 +147,7 @@ describe('netLog module', () => {
+ expect(fs.existsSync(dumpFileDynamic)).to.be.true('dynamic dump file exists');
+ });
+
+- ifit(process.platform !== 'linux')('should end logging automatically when only .startLogging() is called', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should end logging automatically when only .startLogging() is called', async () => {
+ const appProcess = ChildProcess.spawn(process.execPath,
+ [appPath], {
+ env: {
diff --git a/devel/electron28/files/patch-electron_spec_api-notification-dbus-spec.ts b/devel/electron28/files/patch-electron_spec_api-notification-dbus-spec.ts
new file mode 100644
index 000000000000..fe6b085a28f6
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-notification-dbus-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-notification-dbus-spec.ts.orig 2023-10-20 08:29:17 UTC
++++ electron/spec/api-notification-dbus-spec.ts
+@@ -12,7 +12,7 @@ import { app } from 'electron/main';
+ import { ifdescribe } from './lib/spec-helpers';
+ import { promisify } from 'node:util';
+
+-const skip = process.platform !== 'linux' ||
++const skip = (process.platform !== 'linux' && process.platform !== 'freebsd') ||
+ process.arch === 'ia32' ||
+ process.arch.indexOf('arm') === 0 ||
+ !process.env.DBUS_SESSION_BUS_ADDRESS;
diff --git a/devel/electron28/files/patch-electron_spec_api-power-monitor-spec.ts b/devel/electron28/files/patch-electron_spec_api-power-monitor-spec.ts
new file mode 100644
index 000000000000..4a003c1739dd
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-power-monitor-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-power-monitor-spec.ts.orig 2023-05-31 14:28:29 UTC
++++ electron/spec/api-power-monitor-spec.ts
+@@ -15,7 +15,7 @@ import { setTimeout } from 'timers/promises';
+ describe('powerMonitor', () => {
+ let logindMock: any, dbusMockPowerMonitor: any, getCalls: any, emitSignal: any, reset: any;
+
+- ifdescribe(process.platform === 'linux' && process.env.DBUS_SYSTEM_BUS_ADDRESS != null)('when powerMonitor module is loaded with dbus mock', () => {
++ ifdescribe((process.platform === 'linux' || process.platform === 'freebsd') && process.env.DBUS_SYSTEM_BUS_ADDRESS != null)('when powerMonitor module is loaded with dbus mock', () => {
+ before(async () => {
+ const systemBus = dbus.systemBus();
+ const loginService = systemBus.getService('org.freedesktop.login1');
diff --git a/devel/electron28/files/patch-electron_spec_api-process-spec.ts b/devel/electron28/files/patch-electron_spec_api-process-spec.ts
new file mode 100644
index 000000000000..fa4aaff9d16f
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-process-spec.ts
@@ -0,0 +1,20 @@
+--- electron/spec/api-process-spec.ts.orig 2023-01-24 16:58:16 UTC
++++ electron/spec/api-process-spec.ts
+@@ -54,7 +54,7 @@ describe('process module', () => {
+ it('resolves promise successfully with valid data', async () => {
+ const memoryInfo = await w.webContents.executeJavaScript('process.getProcessMemoryInfo()');
+ expect(memoryInfo).to.be.an('object');
+- if (process.platform === 'linux' || process.platform === 'win32') {
++ if (process.platform === 'linux' || process.platform === 'win32' || process.platform === 'freebsd') {
+ expect(memoryInfo.residentSet).to.be.a('number').greaterThan(0);
+ }
+ expect(memoryInfo.private).to.be.a('number').greaterThan(0);
+@@ -164,7 +164,7 @@ describe('process module', () => {
+ it('resolves promise successfully with valid data', async () => {
+ const memoryInfo = await process.getProcessMemoryInfo();
+ expect(memoryInfo).to.be.an('object');
+- if (process.platform === 'linux' || process.platform === 'win32') {
++ if (process.platform === 'linux' || process.platform === 'win32' || process.platform === 'freebsd') {
+ expect(memoryInfo.residentSet).to.be.a('number').greaterThan(0);
+ }
+ expect(memoryInfo.private).to.be.a('number').greaterThan(0);
diff --git a/devel/electron28/files/patch-electron_spec_api-protocol-spec.ts b/devel/electron28/files/patch-electron_spec_api-protocol-spec.ts
new file mode 100644
index 000000000000..fd4baf97bd6c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-protocol-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-protocol-spec.ts.orig 2023-12-21 15:40:26 UTC
++++ electron/spec/api-protocol-spec.ts
+@@ -1549,7 +1549,7 @@ describe('protocol module', () => {
+ });
+
+ // TODO(nornagon): this test doesn't pass on Linux currently, investigate.
+- ifit(process.platform !== 'linux')('is fast', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('is fast', async () => {
+ // 128 MB of spaces.
+ const chunk = new Uint8Array(128 * 1024 * 1024);
+ chunk.fill(' '.charCodeAt(0));
diff --git a/devel/electron28/files/patch-electron_spec_api-safe-storage-spec.ts b/devel/electron28/files/patch-electron_spec_api-safe-storage-spec.ts
new file mode 100644
index 000000000000..e491b37ce996
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-safe-storage-spec.ts
@@ -0,0 +1,20 @@
+--- electron/spec/api-safe-storage-spec.ts.orig 2023-08-09 14:05:20 UTC
++++ electron/spec/api-safe-storage-spec.ts
+@@ -26,7 +26,7 @@ describe('safeStorage module', () => {
+
+ describe('safeStorage module', () => {
+ before(() => {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ safeStorage.setUsePlainTextEncryption(true);
+ }
+ });
+@@ -44,7 +44,7 @@ describe('safeStorage module', () => {
+ });
+ });
+
+- ifdescribe(process.platform === 'linux')('SafeStorage.getSelectedStorageBackend()', () => {
++ ifdescribe(process.platform === 'linux' || process.platform === 'freebsd')('SafeStorage.getSelectedStorageBackend()', () => {
+ it('should return a valid backend', () => {
+ expect(safeStorage.getSelectedStorageBackend()).to.equal('basic_text');
+ });
diff --git a/devel/electron28/files/patch-electron_spec_api-screen-spec.ts b/devel/electron28/files/patch-electron_spec_api-screen-spec.ts
new file mode 100644
index 000000000000..a3e2e6459309
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-screen-spec.ts
@@ -0,0 +1,29 @@
+--- electron/spec/api-screen-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/api-screen-spec.ts
+@@ -74,7 +74,7 @@ describe('screen module', () => {
+
+ const { size } = display!;
+
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ expect(size).to.have.property('width').that.is.a('number');
+ expect(size).to.have.property('height').that.is.a('number');
+ } else {
+@@ -88,7 +88,7 @@ describe('screen module', () => {
+
+ const { workAreaSize } = display!;
+
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ expect(workAreaSize).to.have.property('width').that.is.a('number');
+ expect(workAreaSize).to.have.property('height').that.is.a('number');
+ } else {
+@@ -104,7 +104,7 @@ describe('screen module', () => {
+ expect(bounds).to.have.property('x').that.is.a('number');
+ expect(bounds).to.have.property('y').that.is.a('number');
+
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ expect(bounds).to.have.property('width').that.is.a('number');
+ expect(bounds).to.have.property('height').that.is.a('number');
+ } else {
diff --git a/devel/electron28/files/patch-electron_spec_api-shell-spec.ts b/devel/electron28/files/patch-electron_spec_api-shell-spec.ts
new file mode 100644
index 000000000000..61a222b481bb
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-shell-spec.ts
@@ -0,0 +1,23 @@
+--- electron/spec/api-shell-spec.ts.orig 2023-05-31 14:28:29 UTC
++++ electron/spec/api-shell-spec.ts
+@@ -23,7 +23,7 @@ describe('shell module', () => {
+
+ afterEach(async () => {
+ // reset env vars to prevent side effects
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ process.env.DE = envVars.de;
+ process.env.BROWSER = envVars.browser;
+ process.env.DISPLAY = envVars.display;
+@@ -36,6 +36,11 @@ describe('shell module', () => {
+ let requestReceived: Promise<any>;
+ if (process.platform === 'linux') {
+ process.env.BROWSER = '/bin/true';
++ process.env.DE = 'generic';
++ process.env.DISPLAY = '';
++ requestReceived = Promise.resolve();
++ } else if (process.platform === 'freebsd') {
++ process.env.BROWSER = '/usr/bin/true';
+ process.env.DE = 'generic';
+ process.env.DISPLAY = '';
+ requestReceived = Promise.resolve();
diff --git a/devel/electron28/files/patch-electron_spec_api-subframe-spec.ts b/devel/electron28/files/patch-electron_spec_api-subframe-spec.ts
new file mode 100644
index 000000000000..87352017d992
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-subframe-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-subframe-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/api-subframe-spec.ts
+@@ -215,7 +215,7 @@ describe('renderer nodeIntegrationInSubFrames', () =>
+ });
+
+ // app.getAppMetrics() does not return sandbox information on Linux.
+-ifdescribe(process.platform !== 'linux')('cross-site frame sandboxing', () => {
++ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('cross-site frame sandboxing', () => {
+ let server: http.Server;
+ let crossSiteUrl: string;
+ let serverUrl: string;
diff --git a/devel/electron28/files/patch-electron_spec_api-tray-spec.ts b/devel/electron28/files/patch-electron_spec_api-tray-spec.ts
new file mode 100644
index 000000000000..3cd3905614ca
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-tray-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-tray-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/api-tray-spec.ts
+@@ -128,7 +128,7 @@ describe('tray module', () => {
+ describe('tray.getBounds()', () => {
+ afterEach(() => { tray.destroy(); });
+
+- ifit(process.platform !== 'linux')('returns a bounds object', function () {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('returns a bounds object', function () {
+ const bounds = tray.getBounds();
+ expect(bounds).to.be.an('object').and.to.have.all.keys('x', 'y', 'width', 'height');
+ });
diff --git a/devel/electron28/files/patch-electron_spec_api-utility-process-spec.ts b/devel/electron28/files/patch-electron_spec_api-utility-process-spec.ts
new file mode 100644
index 000000000000..fcfaf8a6916b
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-utility-process-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-utility-process-spec.ts.orig 2024-01-23 19:02:02 UTC
++++ electron/spec/api-utility-process-spec.ts
+@@ -400,7 +400,7 @@ describe('utilityProcess module', () => {
+ await closeWindow(w);
+ });
+
+- ifit(process.platform === 'linux')('allows executing a setuid binary with child_process', async () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('allows executing a setuid binary with child_process', async () => {
+ const child = utilityProcess.fork(path.join(fixturesPath, 'suid.js'));
+ await once(child, 'spawn');
+ const [data] = await once(child, 'message');
diff --git a/devel/electron28/files/patch-electron_spec_api-web-frame-main-spec.ts b/devel/electron28/files/patch-electron_spec_api-web-frame-main-spec.ts
new file mode 100644
index 000000000000..f6167c9b5419
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_api-web-frame-main-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/api-web-frame-main-spec.ts.orig 2023-05-31 14:28:29 UTC
++++ electron/spec/api-web-frame-main-spec.ts
+@@ -289,7 +289,7 @@ describe('webFrameMain module', () => {
+ });
+
+ // TODO(jkleinsc) fix this flaky test on linux
+- ifit(process.platform !== 'linux')('throws upon accessing properties when disposed', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('throws upon accessing properties when disposed', async () => {
+ await w.loadFile(path.join(subframesPath, 'frame-with-frame-container.html'));
+ const { mainFrame } = w.webContents;
+ w.destroy();
diff --git a/devel/electron28/files/patch-electron_spec_chromium-spec.ts b/devel/electron28/files/patch-electron_spec_chromium-spec.ts
new file mode 100644
index 000000000000..35ce07c8b6ab
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_chromium-spec.ts
@@ -0,0 +1,44 @@
+--- electron/spec/chromium-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/chromium-spec.ts
+@@ -470,13 +470,13 @@ describe('command line switches', () => {
+ it('should not set an invalid locale', async () => testLocale('asdfkl', `${currentLocale}|${currentSystemLocale}|${currentPreferredLanguages}`));
+
+ const lcAll = String(process.env.LC_ALL);
+- ifit(process.platform === 'linux')('current process has a valid LC_ALL env', async () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('current process has a valid LC_ALL env', async () => {
+ // The LC_ALL env should not be set to DOM locale string.
+ expect(lcAll).to.not.equal(app.getLocale());
+ });
+- ifit(process.platform === 'linux')('should not change LC_ALL', async () => testLocale('fr', lcAll, true));
+- ifit(process.platform === 'linux')('should not change LC_ALL when setting invalid locale', async () => testLocale('asdfkl', lcAll, true));
+- ifit(process.platform === 'linux')('should not change LC_ALL when --lang is not set', async () => testLocale('', lcAll, true));
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('should not change LC_ALL', async () => testLocale('fr', lcAll, true));
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('should not change LC_ALL when setting invalid locale', async () => testLocale('asdfkl', lcAll, true));
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('should not change LC_ALL when --lang is not set', async () => testLocale('', lcAll, true));
+ });
+
+ describe('--remote-debugging-pipe switch', () => {
+@@ -2492,12 +2492,12 @@ describe('font fallback', () => {
+ expect(fonts[0].familyName).to.equal('Arial');
+ } else if (process.platform === 'darwin') {
+ expect(fonts[0].familyName).to.equal('Helvetica');
+- } else if (process.platform === 'linux') {
++ } else if (process.platform === 'linux' || process.platform === 'freebsd') {
+ expect(fonts[0].familyName).to.equal('DejaVu Sans');
+ } // I think this depends on the distro? We don't specify a default.
+ });
+
+- ifit(process.platform !== 'linux')('should fall back to Japanese font for sans-serif Japanese script', async function () {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('should fall back to Japanese font for sans-serif Japanese script', async function () {
+ const html = `
+ <html lang="ja-JP">
+ <head>
+@@ -2891,7 +2891,7 @@ describe('navigator.clipboard.write', () => {
+ });
+ });
+
+-ifdescribe((process.platform !== 'linux' || app.isUnityRunning()))('navigator.setAppBadge/clearAppBadge', () => {
++ifdescribe(((process.platform !== 'linux' && process.platform !== 'freebsd') || app.isUnityRunning()))('navigator.setAppBadge/clearAppBadge', () => {
+ let w: BrowserWindow;
+
+ const expectedBadgeCount = 42;
diff --git a/devel/electron28/files/patch-electron_spec_crash-spec.ts b/devel/electron28/files/patch-electron_spec_crash-spec.ts
new file mode 100644
index 000000000000..68323c4c6b98
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_crash-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/crash-spec.ts.orig 2023-02-21 16:55:58 UTC
++++ electron/spec/crash-spec.ts
+@@ -42,7 +42,7 @@ const shouldRunCase = (crashCase: string) => {
+ }
+ // TODO(jkleinsc) fix this test on Linux on arm/arm64
+ case 'js-execute-iframe': {
+- return (process.platform !== 'linux' || (process.arch !== 'arm64' && process.arch !== 'arm'));
++ return ((process.platform !== 'linux' && process.platform !== 'freebsd') || (process.arch !== 'arm64' && process.arch !== 'arm'));
+ }
+ default: {
+ return true;
diff --git a/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js b/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
new file mode 100644
index 000000000000..12b51534b625
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
@@ -0,0 +1,11 @@
+--- electron/spec/fixtures/api/safe-storage/decrypt-app/main.js.orig 2023-08-12 11:44:47 UTC
++++ electron/spec/fixtures/api/safe-storage/decrypt-app/main.js
+@@ -6,7 +6,7 @@ const pathToEncryptedString = path.resolve(__dirname,
+ const readFile = fs.readFile;
+
+ app.whenReady().then(async () => {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ safeStorage.setUsePlainTextEncryption(true);
+ }
+ const encryptedString = await readFile(pathToEncryptedString);
diff --git a/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js b/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
new file mode 100644
index 000000000000..119940f8b89f
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
@@ -0,0 +1,11 @@
+--- electron/spec/fixtures/api/safe-storage/encrypt-app/main.js.orig 2023-08-12 11:45:22 UTC
++++ electron/spec/fixtures/api/safe-storage/encrypt-app/main.js
+@@ -6,7 +6,7 @@ const pathToEncryptedString = path.resolve(__dirname,
+ const writeFile = fs.writeFile;
+
+ app.whenReady().then(async () => {
+- if (process.platform === 'linux') {
++ if (process.platform === 'linux' || process.platform === 'freebsd') {
+ safeStorage.setUsePlainTextEncryption(true);
+ }
+ const encrypted = safeStorage.encryptString('plaintext');
diff --git a/devel/electron28/files/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js b/devel/electron28/files/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
new file mode 100644
index 000000000000..a15503e9df07
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
@@ -0,0 +1,11 @@
+--- electron/spec/fixtures/crash-cases/safe-storage/index.js.orig 2022-05-18 15:31:32 UTC
++++ electron/spec/fixtures/crash-cases/safe-storage/index.js
+@@ -21,7 +21,7 @@ const { expect } = require('chai');
+ await app.whenReady();
+ // isEncryptionAvailable() will always return false on CI due to a mocked
+ // dbus as mentioned above.
+- expect(safeStorage.isEncryptionAvailable()).to.equal(process.platform !== 'linux');
++ expect(safeStorage.isEncryptionAvailable()).to.equal(process.platform !== 'linux' && process.platform !== 'freebsd');
+ if (safeStorage.isEncryptionAvailable()) {
+ const plaintext = 'plaintext';
+ const ciphertext = safeStorage.encryptString(plaintext);
diff --git a/devel/electron28/files/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js b/devel/electron28/files/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
new file mode 100644
index 000000000000..eb0f4828be47
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
@@ -0,0 +1,11 @@
+--- electron/spec/fixtures/native-addon/uv-dlopen/index.js.orig 2021-01-25 12:27:55 UTC
++++ electron/spec/fixtures/native-addon/uv-dlopen/index.js
+@@ -2,7 +2,7 @@ const testLoadLibrary = require('./build/Release/test_
+
+ const lib = (() => {
+ switch (process.platform) {
+- case 'linux':
++ case 'linux': case 'freebsd':
+ return `${__dirname}/build/Release/foo.so`;
+ case 'darwin':
+ return `${__dirname}/build/Release/foo.dylib`;
diff --git a/devel/electron28/files/patch-electron_spec_node-spec.ts b/devel/electron28/files/patch-electron_spec_node-spec.ts
new file mode 100644
index 000000000000..a9d5c04b145e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_node-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/node-spec.ts.orig 2023-12-21 15:40:26 UTC
++++ electron/spec/node-spec.ts
+@@ -138,7 +138,7 @@ describe('node feature', () => {
+ });
+
+ describe('child_process.exec', () => {
+- ifit(process.platform === 'linux')('allows executing a setuid binary from non-sandboxed renderer', async () => {
++ ifit(process.platform === 'linux' || process.platform === 'freebsd')('allows executing a setuid binary from non-sandboxed renderer', async () => {
+ // Chrome uses prctl(2) to set the NO_NEW_PRIVILEGES flag on Linux (see
+ // https://github.com/torvalds/linux/blob/40fde647cc/Documentation/userspace-api/no_new_privs.rst).
+ // We disable this for unsandboxed processes, which the renderer tests
diff --git a/devel/electron28/files/patch-electron_spec_version-bump-spec.ts b/devel/electron28/files/patch-electron_spec_version-bump-spec.ts
new file mode 100644
index 000000000000..b21840512b7c
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_version-bump-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/version-bump-spec.ts.orig 2023-01-24 16:58:16 UTC
++++ electron/spec/version-bump-spec.ts
+@@ -92,7 +92,7 @@ describe('version-bumper', () => {
+
+ // On macOS Circle CI we don't have a real git environment due to running
+ // gclient sync on a linux machine. These tests therefore don't run as expected.
+- ifdescribe(!(process.platform === 'linux' && process.arch.indexOf('arm') === 0) && process.platform !== 'darwin')('nextVersion', () => {
++ ifdescribe(!((process.platform === 'linux' || process.platform === 'freebsd') && process.arch.indexOf('arm') === 0) && process.platform !== 'darwin')('nextVersion', () => {
+ describe('bump versions', () => {
+ const nightlyPattern = /[0-9.]*(-nightly.(\d{4})(\d{2})(\d{2}))$/g;
+ const betaPattern = /[0-9.]*(-beta[0-9.]*)/g;
diff --git a/devel/electron28/files/patch-electron_spec_visibility-state-spec.ts b/devel/electron28/files/patch-electron_spec_visibility-state-spec.ts
new file mode 100644
index 000000000000..ac150c261a6a
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_visibility-state-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/visibility-state-spec.ts.orig 2023-05-31 14:28:29 UTC
++++ electron/spec/visibility-state-spec.ts
+@@ -10,7 +10,7 @@ import { setTimeout } from 'timers/promises';
+
+ // visibilityState specs pass on linux with a real window manager but on CI
+ // the environment does not let these specs pass
+-ifdescribe(process.platform !== 'linux')('document.visibilityState', () => {
++ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd')('document.visibilityState', () => {
+ let w: BrowserWindow;
+
+ afterEach(() => {
diff --git a/devel/electron28/files/patch-electron_spec_webview-spec.ts b/devel/electron28/files/patch-electron_spec_webview-spec.ts
new file mode 100644
index 000000000000..2376dcf1365e
--- /dev/null
+++ b/devel/electron28/files/patch-electron_spec_webview-spec.ts
@@ -0,0 +1,11 @@
+--- electron/spec/webview-spec.ts.orig 2023-12-04 18:19:02 UTC
++++ electron/spec/webview-spec.ts
+@@ -530,7 +530,7 @@ describe('<webview> tag', function () {
+ });
+
+ // FIXME(zcbenz): Fullscreen events do not work on Linux.
+- ifit(process.platform !== 'linux')('exiting fullscreen should unfullscreen window', async () => {
++ ifit(process.platform !== 'linux' && process.platform !== 'freebsd')('exiting fullscreen should unfullscreen window', async () => {
+ const [w, webview] = await loadWebViewWindow();
+ const enterFullScreen = once(w, 'enter-full-screen');
+ await webview.executeJavaScript('document.getElementById("div").requestFullscreen()', true);
diff --git a/devel/electron28/files/patch-extensions_browser_api_api__browser__context__keyed__service__factories.cc b/devel/electron28/files/patch-extensions_browser_api_api__browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..e9816aa6be08
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_browser_api_api__browser__context__keyed__service__factories.cc
@@ -0,0 +1,11 @@
+--- extensions/browser/api/api_browser_context_keyed_service_factories.cc.orig 2023-11-29 21:40:03 UTC
++++ extensions/browser/api/api_browser_context_keyed_service_factories.cc
+@@ -107,7 +107,7 @@ void EnsureApiBrowserContextKeyedServiceFactoriesBuilt
+ MessagingAPIMessageFilter::EnsureAssociatedFactoryBuilt();
+ #endif
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ NetworkingPrivateEventRouterFactory::GetInstance();
+ #endif
+ OffscreenDocumentManager::GetFactory();
diff --git a/devel/electron28/files/patch-extensions_browser_api_management_management__api.cc b/devel/electron28/files/patch-extensions_browser_api_management_management__api.cc
new file mode 100644
index 000000000000..e42cb895a72b
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_browser_api_management_management__api.cc
@@ -0,0 +1,11 @@
+--- extensions/browser/api/management/management_api.cc.orig 2023-11-29 21:40:03 UTC
++++ extensions/browser/api/management/management_api.cc
+@@ -278,7 +278,7 @@ bool PlatformSupportsApprovalFlowForExtensions() {
+ #if BUILDFLAG(IS_CHROMEOS)
+ // ChromeOS devices have this feature already shipped.
+ return true;
+-#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return base::FeatureList::IsEnabled(
+ supervised_user::kEnableExtensionsPermissionsForSupervisedUsersOnDesktop);
+ #else
diff --git a/devel/electron28/files/patch-extensions_browser_api_messaging_message__service.cc b/devel/electron28/files/patch-extensions_browser_api_messaging_message__service.cc
new file mode 100644
index 000000000000..5388c9c1009f
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_browser_api_messaging_message__service.cc
@@ -0,0 +1,20 @@
+--- extensions/browser/api/messaging/message_service.cc.orig 2023-11-29 21:40:03 UTC
++++ extensions/browser/api/messaging/message_service.cc
+@@ -70,7 +70,7 @@ const char kReceivingEndDoesntExistError[] =
+ const char kReceivingEndDoesntExistError[] =
+ "Could not establish connection. Receiving end does not exist.";
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kMissingPermissionError[] =
+ "Access to native messaging requires nativeMessaging permission.";
+ const char kProhibitedByPoliciesError[] =
+@@ -541,7 +541,7 @@ void MessageService::OpenChannelToNativeAppImpl(
+ return;
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool has_permission = extension->permissions_data()->HasAPIPermission(
+ mojom::APIPermissionID::kNativeMessaging);
+ if (!has_permission) {
diff --git a/devel/electron28/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc b/devel/electron28/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc
new file mode 100644
index 000000000000..18aba68d624b
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc
@@ -0,0 +1,20 @@
+--- extensions/browser/api/networking_private/networking_private_delegate_factory.cc.orig 2023-10-19 19:58:24 UTC
++++ extensions/browser/api/networking_private/networking_private_delegate_factory.cc
+@@ -14,7 +14,7 @@
+ #include "extensions/browser/api/networking_private/networking_private_chromeos.h"
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ #include "extensions/browser/api/networking_private/networking_private_lacros.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "extensions/browser/api/networking_private/networking_private_linux.h"
+ #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+ #include "components/wifi/wifi_service.h"
+@@ -67,7 +67,7 @@ NetworkingPrivateDelegateFactory::BuildServiceInstance
+ delegate = std::make_unique<NetworkingPrivateChromeOS>(browser_context);
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ delegate = std::make_unique<NetworkingPrivateLacros>(browser_context);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ delegate = std::make_unique<NetworkingPrivateLinux>();
+ #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+ std::unique_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create());
diff --git a/devel/electron28/files/patch-extensions_common_api___permission__features.json b/devel/electron28/files/patch-extensions_common_api___permission__features.json
new file mode 100644
index 000000000000..51f6457cb14c
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_common_api___permission__features.json
@@ -0,0 +1,29 @@
+--- extensions/common/api/_permission_features.json.orig 2023-11-29 21:40:03 UTC
++++ extensions/common/api/_permission_features.json
+@@ -138,7 +138,7 @@
+ {
+ "channel": "stable",
+ "extension_types": ["platform_app"],
+- "platforms": ["chromeos", "lacros", "win", "mac", "linux"],
++ "platforms": ["chromeos", "lacros", "win", "mac", "linux", "openbsd", "freebsd"],
+ "allowlist": [
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/387169
+ "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/387169
+@@ -432,7 +432,7 @@
+ }, {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "mac", "win", "linux", "fuchsia"],
++ "platforms": ["chromeos", "mac", "win", "linux", "fuchsia", "openbsd", "freebsd"],
+ "allowlist": [
+ "0DE0F05680A4A056BCEC864ED8DDA84296F82B40", // http://crbug.com/434651
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/293683
+@@ -476,7 +476,7 @@
+ "networkingPrivate": {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "lacros", "mac", "win", "linux", "fuchsia"],
++ "platforms": ["chromeos", "lacros", "mac", "win", "linux", "fuchsia", "openbsd", "freebsd"],
+ "allowlist": [
+ // DO NOT ADD ANY MORE ENTRIES HERE.
+ // networkingPrivate is being migrated to networking.onc.
diff --git a/devel/electron28/files/patch-extensions_common_api_runtime.json b/devel/electron28/files/patch-extensions_common_api_runtime.json
new file mode 100644
index 000000000000..9dd23db03b95
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_common_api_runtime.json
@@ -0,0 +1,10 @@
+--- extensions/common/api/runtime.json.orig 2023-10-19 19:58:24 UTC
++++ extensions/common/api/runtime.json
+@@ -89,6 +89,7 @@
+ {"name": "cros", "description": "Specifies the Chrome operating system."},
+ {"name": "linux", "description": "Specifies the Linux operating system."},
+ {"name": "openbsd", "description": "Specifies the OpenBSD operating system."},
++ {"name": "freebsd", "description": "Specifies the FreeBSD operating system."},
+ {"name": "fuchsia", "description": "Specifies the Fuchsia operating system."}
+ ]
+ },
diff --git a/devel/electron28/files/patch-extensions_common_command.cc b/devel/electron28/files/patch-extensions_common_command.cc
new file mode 100644
index 000000000000..e675b787e219
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_common_command.cc
@@ -0,0 +1,11 @@
+--- extensions/common/command.cc.orig 2023-10-19 19:58:24 UTC
++++ extensions/common/command.cc
+@@ -282,7 +282,7 @@ std::string Command::CommandPlatform() {
+ return values::kKeybindingPlatformMac;
+ #elif BUILDFLAG(IS_CHROMEOS)
+ return values::kKeybindingPlatformChromeOs;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return values::kKeybindingPlatformLinux;
+ #elif BUILDFLAG(IS_FUCHSIA)
+ // TODO(crbug.com/1312215): Change this once we decide what string should be
diff --git a/devel/electron28/files/patch-extensions_common_features_feature.cc b/devel/electron28/files/patch-extensions_common_features_feature.cc
new file mode 100644
index 000000000000..b729c127c3cd
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_common_features_feature.cc
@@ -0,0 +1,11 @@
+--- extensions/common/features/feature.cc.orig 2023-10-19 19:58:24 UTC
++++ extensions/common/features/feature.cc
+@@ -34,6 +34,8 @@ Feature::Platform Feature::GetCurrentPlatform() {
+ return WIN_PLATFORM;
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return FUCHSIA_PLATFORM;
++#elif BUILDFLAG(IS_BSD)
++ return LINUX_PLATFORM;
+ #else
+ return UNSPECIFIED_PLATFORM;
+ #endif
diff --git a/devel/electron28/files/patch-extensions_renderer_bindings_api__binding__util.cc b/devel/electron28/files/patch-extensions_renderer_bindings_api__binding__util.cc
new file mode 100644
index 000000000000..80e3d05fea23
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_renderer_bindings_api__binding__util.cc
@@ -0,0 +1,11 @@
+--- extensions/renderer/bindings/api_binding_util.cc.orig 2022-02-28 16:54:41 UTC
++++ extensions/renderer/bindings/api_binding_util.cc
+@@ -132,7 +132,7 @@ std::string GetPlatformString() {
+ return "lacros";
+ #elif BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+ return "chromeos";
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return "linux";
+ #elif BUILDFLAG(IS_MAC)
+ return "mac";
diff --git a/devel/electron28/files/patch-extensions_renderer_bindings_argument__spec.cc b/devel/electron28/files/patch-extensions_renderer_bindings_argument__spec.cc
new file mode 100644
index 000000000000..13961c2dfbe9
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_renderer_bindings_argument__spec.cc
@@ -0,0 +1,11 @@
+--- extensions/renderer/bindings/argument_spec.cc.orig 2022-11-30 08:12:58 UTC
++++ extensions/renderer/bindings/argument_spec.cc
+@@ -18,6 +18,8 @@
+ #include "gin/data_object_builder.h"
+ #include "gin/dictionary.h"
+
++#include <cmath>
++
+ namespace extensions {
+
+ namespace {
diff --git a/devel/electron28/files/patch-extensions_shell_app_shell__main__delegate.cc b/devel/electron28/files/patch-extensions_shell_app_shell__main__delegate.cc
new file mode 100644
index 000000000000..61d835ba87ba
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_shell_app_shell__main__delegate.cc
@@ -0,0 +1,20 @@
+--- extensions/shell/app/shell_main_delegate.cc.orig 2023-11-29 21:40:03 UTC
++++ extensions/shell/app/shell_main_delegate.cc
+@@ -43,7 +43,7 @@
+ #if BUILDFLAG(IS_WIN)
+ #include "base/base_paths_win.h"
+ #include "base/process/process_info.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "base/base_paths_mac.h"
+@@ -62,7 +62,7 @@ base::FilePath GetDataPath() {
+ return cmd_line->GetSwitchValuePath(switches::kContentShellDataPath);
+
+ base::FilePath data_dir;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ data_dir = base::nix::GetXDGDirectory(
+ env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir);
diff --git a/devel/electron28/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc b/devel/electron28/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc
new file mode 100644
index 000000000000..7dbbe632990e
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc
@@ -0,0 +1,11 @@
+--- extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc.orig 2023-05-25 00:41:56 UTC
++++ extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc
+@@ -44,7 +44,7 @@ void ShellRuntimeAPIDelegate::OpenURL(const GURL& unin
+ bool ShellRuntimeAPIDelegate::GetPlatformInfo(PlatformInfo* info) {
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ info->os = api::runtime::PlatformOs::kCros;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ info->os = api::runtime::PlatformOs::kLinux;
+ #endif
+ return true;
diff --git a/devel/electron28/files/patch-extensions_shell_browser_shell__browser__main__parts.cc b/devel/electron28/files/patch-extensions_shell_browser_shell__browser__main__parts.cc
new file mode 100644
index 000000000000..77da3a83720f
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_shell_browser_shell__browser__main__parts.cc
@@ -0,0 +1,11 @@
+--- extensions/shell/browser/shell_browser_main_parts.cc.orig 2022-09-24 10:57:32 UTC
++++ extensions/shell/browser/shell_browser_main_parts.cc
+@@ -150,7 +150,7 @@ void ShellBrowserMainParts::PostCreateMainMessageLoop(
+ switches::kAppShellAllowRoaming)) {
+ network_controller_->SetCellularAllowRoaming(true);
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // app_shell doesn't need GTK, so the fake input method context can work.
+ // See crbug.com/381852 and revision fb69f142.
+ // TODO(michaelpg): Verify this works for target environments.
diff --git a/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.cc b/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.cc
new file mode 100644
index 000000000000..6d35272bfa2a
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.cc
@@ -0,0 +1,11 @@
+--- extensions/shell/browser/shell_extensions_api_client.cc.orig 2022-02-28 16:54:41 UTC
++++ extensions/shell/browser/shell_extensions_api_client.cc
+@@ -58,7 +58,7 @@ ShellExtensionsAPIClient::CreateDisplayInfoProvider()
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ FileSystemDelegate* ShellExtensionsAPIClient::GetFileSystemDelegate() {
+ if (!file_system_delegate_)
+ file_system_delegate_ = std::make_unique<ShellFileSystemDelegate>();
diff --git a/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.h b/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.h
new file mode 100644
index 000000000000..5c420402f722
--- /dev/null
+++ b/devel/electron28/files/patch-extensions_shell_browser_shell__extensions__api__client.h
@@ -0,0 +1,20 @@
+--- extensions/shell/browser/shell_extensions_api_client.h.orig 2022-02-28 16:54:41 UTC
++++ extensions/shell/browser/shell_extensions_api_client.h
+@@ -36,7 +36,7 @@ class ShellExtensionsAPIClient : public ExtensionsAPIC
+ const override;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ FileSystemDelegate* GetFileSystemDelegate() override;
+ #endif
+ MessagingDelegate* GetMessagingDelegate() override;
+@@ -45,7 +45,7 @@ class ShellExtensionsAPIClient : public ExtensionsAPIC
+ private:
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<FileSystemDelegate> file_system_delegate_;
+ #endif
+ std::unique_ptr<MessagingDelegate> messaging_delegate_;
diff --git a/devel/electron28/files/patch-google__apis_gcm_engine_heartbeat__manager.cc b/devel/electron28/files/patch-google__apis_gcm_engine_heartbeat__manager.cc
new file mode 100644
index 000000000000..49299d817e4c
--- /dev/null
+++ b/devel/electron28/files/patch-google__apis_gcm_engine_heartbeat__manager.cc
@@ -0,0 +1,29 @@
+--- google_apis/gcm/engine/heartbeat_manager.cc.orig 2023-05-25 00:41:56 UTC
++++ google_apis/gcm/engine/heartbeat_manager.cc
+@@ -32,7 +32,7 @@ const int kMinClientHeartbeatIntervalMs = 1000 * 30;
+ // Minimum time spent sleeping before we force a new heartbeat.
+ const int kMinSuspendTimeMs = 1000 * 10; // 10 seconds.
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // The period at which to check if the heartbeat time has passed. Used to
+ // protect against platforms where the timer is delayed by the system being
+ // suspended. Only needed on linux because the other OSes provide a standard
+@@ -191,7 +191,7 @@ void HeartbeatManager::RestartTimer() {
+ base::BindRepeating(&HeartbeatManager::OnHeartbeatTriggered,
+ weak_ptr_factory_.GetWeakPtr()));
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Windows, Mac, Android, iOS, and Chrome OS all provide a way to be notified
+ // when the system is suspending or resuming. The only one that does not is
+ // Linux so we need to poll to check for missed heartbeats.
+@@ -214,7 +214,7 @@ void HeartbeatManager::CheckForMissedHeartbeat() {
+ return;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Otherwise check again later.
+ io_task_runner_->PostDelayedTask(
+ FROM_HERE,
diff --git a/devel/electron28/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc b/devel/electron28/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc
new file mode 100644
index 000000000000..0c132e745c69
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/common/gpu_memory_buffer_support.cc.orig 2023-10-19 19:58:24 UTC
++++ gpu/command_buffer/common/gpu_memory_buffer_support.cc
+@@ -182,7 +182,7 @@ uint32_t GetPlatformSpecificTextureTarget() {
+ #if BUILDFLAG(IS_MAC)
+ return macos_specific_texture_target;
+ #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return GL_TEXTURE_EXTERNAL_OES;
+ #elif BUILDFLAG(IS_IOS)
+ return GL_TEXTURE_2D;
+@@ -217,7 +217,7 @@ GPU_EXPORT bool NativeBufferNeedsPlatformSpecificTextu
+ gfx::BufferFormat format,
+ gfx::BufferPlane plane) {
+ #if BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Always use GL_TEXTURE_2D as the target for RGB textures.
+ // https://crbug.com/916728
+ if (format == gfx::BufferFormat::R_8 || format == gfx::BufferFormat::RG_88 ||
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_dawn__context__provider.cc b/devel/electron28/files/patch-gpu_command__buffer_service_dawn__context__provider.cc
new file mode 100644
index 000000000000..3b25c37d2fc0
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_dawn__context__provider.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/dawn_context_provider.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/dawn_context_provider.cc
+@@ -178,7 +178,7 @@ wgpu::BackendType DawnContextProvider::GetDefaultBacke
+ return base::FeatureList::IsEnabled(features::kSkiaGraphiteDawnUseD3D12)
+ ? wgpu::BackendType::D3D12
+ : wgpu::BackendType::D3D11;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return wgpu::BackendType::Vulkan;
+ #elif BUILDFLAG(IS_APPLE)
+ return wgpu::BackendType::Metal;
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_gles2__cmd__decoder.cc b/devel/electron28/files/patch-gpu_command__buffer_service_gles2__cmd__decoder.cc
new file mode 100644
index 000000000000..65c922b4bd63
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_gles2__cmd__decoder.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/gles2_cmd_decoder.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/gles2_cmd_decoder.cc
+@@ -2999,7 +2999,7 @@ GLES2Decoder* GLES2Decoder::Create(
+ }
+
+ // Allow linux to run fuzzers.
+-#if BUILDFLAG(ENABLE_VALIDATING_COMMAND_DECODER) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(ENABLE_VALIDATING_COMMAND_DECODER) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return new GLES2DecoderImpl(client, command_buffer_service, outputter, group);
+ #else
+ LOG(FATAL) << "Validating command decoder is not supported.";
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_angle__vulkan__image__backing__factory.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_angle__vulkan__image__backing__factory.cc
new file mode 100644
index 000000000000..28520be03d1f
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_angle__vulkan__image__backing__factory.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc.orig 2023-05-25 00:41:56 UTC
++++ gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc
+@@ -21,7 +21,7 @@ namespace {
+ // TODO(penghuang): verify the scanout is the right usage for video playback.
+ // crbug.com/1280798
+ constexpr uint32_t kSupportedUsage =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ SHARED_IMAGE_USAGE_SCANOUT |
+ #endif
+ SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing.cc
new file mode 100644
index 000000000000..a6e208f290ff
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/service/shared_image/external_vk_image_backing.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
+@@ -47,7 +47,7 @@
+ #include "ui/gl/gl_version_info.h"
+ #include "ui/gl/scoped_binders.h"
+
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_DAWN)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_DAWN)
+ #include "gpu/command_buffer/service/shared_image/external_vk_image_dawn_representation.h"
+ #endif
+
+@@ -679,7 +679,7 @@ std::unique_ptr<DawnImageRepresentation> ExternalVkIma
+ const wgpu::Device& wgpuDevice,
+ wgpu::BackendType backend_type,
+ std::vector<wgpu::TextureFormat> view_formats) {
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_DAWN)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_DAWN)
+ auto wgpu_format = ToDawnFormat(format());
+
+ if (wgpu_format == wgpu::TextureFormat::Undefined) {
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing__factory.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing__factory.cc
new file mode 100644
index 000000000000..88b330a2301d
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_external__vk__image__backing__factory.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
+@@ -99,7 +99,7 @@ constexpr uint32_t kSupportedUsage =
+ } // namespace
+
+ constexpr uint32_t kSupportedUsage =
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_DAWN)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_DAWN)
+ SHARED_IMAGE_USAGE_WEBGPU | SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE |
+ SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE |
+ #endif
+@@ -268,7 +268,7 @@ bool ExternalVkImageBackingFactory::IsSupported(
+ return false;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (format.IsLegacyMultiplanar()) {
+ // ExternalVkImageBacking doesn't work properly with external sampler
+ // multi-planar formats on Linux, see https://crbug.com/1394888.
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_ozone__image__gl__textures__holder.h b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_ozone__image__gl__textures__holder.h
new file mode 100644
index 000000000000..5a9d3dc19346
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_ozone__image__gl__textures__holder.h
@@ -0,0 +1,10 @@
+--- gpu/command_buffer/service/shared_image/ozone_image_gl_textures_holder.h.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/shared_image/ozone_image_gl_textures_holder.h
+@@ -6,6 +6,7 @@
+ #define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_OZONE_IMAGE_GL_TEXTURES_HOLDER_H_
+
+ #include <memory>
++#include <vector>
+
+ #include "base/memory/raw_ptr.h"
+ #include "base/memory/ref_counted.h"
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__factory.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__factory.cc
new file mode 100644
index 000000000000..11d165702508
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__factory.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/shared_image/shared_image_factory.cc.orig 2023-10-19 19:58:24 UTC
++++ gpu/command_buffer/service/shared_image/shared_image_factory.cc
+@@ -142,7 +142,7 @@ gfx::GpuMemoryBufferType GetNativeBufferType() {
+ return gfx::GpuMemoryBufferType::IO_SURFACE_BUFFER;
+ #elif BUILDFLAG(IS_ANDROID)
+ return gfx::GpuMemoryBufferType::ANDROID_HARDWARE_BUFFER;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return gfx::GpuMemoryBufferType::NATIVE_PIXMAP;
+ #elif BUILDFLAG(IS_WIN)
+ return gfx::GpuMemoryBufferType::DXGI_SHARED_HANDLE;
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__manager.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__manager.cc
new file mode 100644
index 000000000000..8d9469a40c81
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_shared__image__manager.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/shared_image/shared_image_manager.cc.orig 2023-10-19 19:58:24 UTC
++++ gpu/command_buffer/service/shared_image/shared_image_manager.cc
+@@ -507,7 +507,7 @@ bool SharedImageManager::SupportsScanoutImages() {
+ return true;
+ #elif BUILDFLAG(IS_ANDROID)
+ return base::AndroidHardwareBufferCompat::IsSupportAvailable();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return ui::OzonePlatform::GetInstance()
+ ->GetPlatformRuntimeProperties()
+ .supports_native_pixmaps;
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_wrapped__sk__image__backing.cc b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_wrapped__sk__image__backing.cc
new file mode 100644
index 000000000000..3bc54b6a7ae4
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_shared__image_wrapped__sk__image__backing.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc
+@@ -212,7 +212,7 @@ bool WrappedSkImageBacking::Initialize(const std::stri
+
+ constexpr GrRenderable is_renderable = GrRenderable::kYes;
+ constexpr GrProtected is_protected = GrProtected::kNo;
+-#if DCHECK_IS_ON() && !BUILDFLAG(IS_LINUX)
++#if DCHECK_IS_ON() && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ // Blue for single-planar and magenta-ish for multi-planar.
+ SkColor4f fallback_color =
+ format().is_single_plane() ? SkColors::kBlue : SkColors::kWhite;
diff --git a/devel/electron28/files/patch-gpu_command__buffer_service_webgpu__decoder__impl.cc b/devel/electron28/files/patch-gpu_command__buffer_service_webgpu__decoder__impl.cc
new file mode 100644
index 000000000000..19c759af32f5
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_service_webgpu__decoder__impl.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/service/webgpu_decoder_impl.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/command_buffer/service/webgpu_decoder_impl.cc
+@@ -1252,7 +1252,7 @@ void WebGPUDecoderImpl::RequestAdapterImpl(
+ force_fallback_adapter = true;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!shared_context_state_->GrContextIsVulkan() &&
+ !shared_context_state_->IsGraphiteDawnVulkan() &&
+ use_webgpu_adapter_ != WebGPUAdapterName::kOpenGLES) {
+@@ -1879,7 +1879,7 @@ WebGPUDecoderImpl::AssociateMailboxDawn(
+ }
+
+ #if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_APPLE) && \
+- !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_LINUX)
++ !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ if (usage & wgpu::TextureUsage::StorageBinding) {
+ LOG(ERROR) << "AssociateMailbox: wgpu::TextureUsage::StorageBinding is NOT "
+ "supported yet on this platform.";
diff --git a/devel/electron28/files/patch-gpu_command__buffer_tests_gl__gpu__memory__buffer__unittest.cc b/devel/electron28/files/patch-gpu_command__buffer_tests_gl__gpu__memory__buffer__unittest.cc
new file mode 100644
index 000000000000..b2162e0a9eda
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_command__buffer_tests_gl__gpu__memory__buffer__unittest.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc.orig 2023-05-25 00:41:56 UTC
++++ gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
+@@ -27,7 +27,7 @@
+ #include "ui/gfx/half_float.h"
+ #include "ui/gl/test/gl_test_support.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap.h"
+ #include "ui/gfx/linux/client_native_pixmap_factory_dmabuf.h"
+ #endif
+@@ -70,7 +70,7 @@ class GpuMemoryBufferTest : public testing::TestWithPa
+ GLManager gl_;
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ class GpuMemoryBufferTestEGL : public testing::Test,
+ public gpu::GpuCommandBufferTestEGL {
+ public:
diff --git a/devel/electron28/files/patch-gpu_config_gpu__control__list.cc b/devel/electron28/files/patch-gpu_config_gpu__control__list.cc
new file mode 100644
index 000000000000..f86d6d0e5b75
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_config_gpu__control__list.cc
@@ -0,0 +1,20 @@
+--- gpu/config/gpu_control_list.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/config/gpu_control_list.cc
+@@ -276,7 +276,7 @@ GpuControlList::GLType GpuControlList::More::GetDefaul
+ GpuControlList::GLType GpuControlList::More::GetDefaultGLType() {
+ #if BUILDFLAG(IS_CHROMEOS)
+ return kGLTypeGL;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_OPENBSD)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return kGLTypeGL;
+ #elif BUILDFLAG(IS_MAC)
+ return kGLTypeGL;
+@@ -820,7 +820,7 @@ GpuControlList::OsType GpuControlList::GetOsType() {
+ return kOsAndroid;
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return kOsFuchsia;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_OPENBSD)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return kOsLinux;
+ #elif BUILDFLAG(IS_MAC)
+ return kOsMacosx;
diff --git a/devel/electron28/files/patch-gpu_config_gpu__finch__features.cc b/devel/electron28/files/patch-gpu_config_gpu__finch__features.cc
new file mode 100644
index 000000000000..31b4db78a03d
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_config_gpu__finch__features.cc
@@ -0,0 +1,21 @@
+--- gpu/config/gpu_finch_features.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/config/gpu_finch_features.cc
+@@ -63,7 +63,7 @@ BASE_FEATURE(kUseGles2ForOopR,
+ BASE_FEATURE(kUseGles2ForOopR,
+ "UseGles2ForOopR",
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_DISABLED_BY_DEFAULT
+ #else
+ base::FEATURE_ENABLED_BY_DEFAULT
+@@ -147,7 +147,8 @@ BASE_FEATURE(kDefaultEnableGpuRasterization,
+ BASE_FEATURE(kDefaultEnableGpuRasterization,
+ "DefaultEnableGpuRasterization",
+ #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
++ BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-gpu_config_gpu__test__config.cc b/devel/electron28/files/patch-gpu_config_gpu__test__config.cc
new file mode 100644
index 000000000000..86cc37845dcf
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_config_gpu__test__config.cc
@@ -0,0 +1,11 @@
+--- gpu/config/gpu_test_config.cc.orig 2022-02-28 16:54:41 UTC
++++ gpu/config/gpu_test_config.cc
+@@ -29,7 +29,7 @@ GPUTestConfig::OS GetCurrentOS() {
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ return GPUTestConfig::kOsChromeOS;
+ #elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
+- BUILDFLAG(IS_OPENBSD)
++ BUILDFLAG(IS_BSD)
+ return GPUTestConfig::kOsLinux;
+ #elif BUILDFLAG(IS_WIN)
+ int32_t major_version = 0;
diff --git a/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc b/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
new file mode 100644
index 000000000000..2878982e6d9c
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
@@ -0,0 +1,20 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.cc.orig 2023-08-10 01:48:45 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.cc
+@@ -26,7 +26,7 @@
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif
+
+-#if BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap.h"
+ #endif
+
+@@ -56,7 +56,7 @@ GpuMemoryBufferSupport::GetNativeGpuMemoryBufferType()
+ return gfx::IO_SURFACE_BUFFER;
+ #elif BUILDFLAG(IS_ANDROID)
+ return gfx::ANDROID_HARDWARE_BUFFER;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ return gfx::NATIVE_PIXMAP;
+ #elif BUILDFLAG(IS_WIN)
+ return gfx::DXGI_SHARED_HANDLE;
diff --git a/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h b/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
new file mode 100644
index 000000000000..2ab58073a4b1
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
@@ -0,0 +1,11 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.h.orig 2023-08-10 01:48:45 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.h
+@@ -21,7 +21,7 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/gpu_memory_buffer.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ namespace gfx {
+ class ClientNativePixmapFactory;
+ } // namespace gfx
diff --git a/devel/electron28/files/patch-gpu_ipc_service_gpu__init.cc b/devel/electron28/files/patch-gpu_ipc_service_gpu__init.cc
new file mode 100644
index 000000000000..acaa98491a9f
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_ipc_service_gpu__init.cc
@@ -0,0 +1,74 @@
+--- gpu/ipc/service/gpu_init.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/ipc/service/gpu_init.cc
+@@ -357,7 +357,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ enable_watchdog = false;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool gpu_sandbox_start_early = gpu_preferences_.gpu_sandbox_start_early;
+ #else // !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
+ // For some reasons MacOSX's VideoToolbox might crash when called after
+@@ -394,7 +394,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ }
+
+ bool attempted_startsandbox = false;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Chrome OS ARM Mali, GPU driver userspace creates threads when
+ // initializing a GL context, so start the sandbox early.
+ // TODO(zmo): Need to collect OS version before this.
+@@ -491,7 +491,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ gpu_preferences_.gr_context_type = GrContextType::kGL;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The ContentSandboxHelper is currently the only one implementation of
+ // GpuSandboxHelper and it has no dependency. Except on Linux where
+ // VaapiWrapper checks the GL implementation to determine which display
+@@ -573,7 +573,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ command_line, gpu_feature_info_,
+ gpu_preferences_.disable_software_rasterizer, false);
+ if (gl_use_swiftshader_) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
+ << "on Linux";
+ return false;
+@@ -726,7 +726,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+
+ InitializePlatformOverlaySettings(&gpu_info_, gpu_feature_info_);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Driver may create a compatibility profile context when collect graphics
+ // information on Linux platform. Try to collect graphics information
+ // based on core profile context after disabling platform extensions.
+@@ -781,7 +781,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ }
+ }
+ }
+-#if BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_CHROMEOS_DEVICE))
+ if (!gl_disabled && !gl_use_swiftshader_ && std::getenv("RUNNING_UNDER_RR")) {
+ // https://rr-project.org/ is a Linux-only record-and-replay debugger that
+@@ -935,7 +935,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* c
+ }
+ bool gl_disabled = gl::GetGLImplementation() == gl::kGLImplementationDisabled;
+
+-#if BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_CHROMEOS_DEVICE))
+ if (!gl_disabled && !gl_use_swiftshader_ && std::getenv("RUNNING_UNDER_RR")) {
+ // https://rr-project.org/ is a Linux-only record-and-replay debugger that
+@@ -1005,7 +1005,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* c
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Driver may create a compatibility profile context when collect graphics
+ // information on Linux platform. Try to collect graphics information
+ // based on core profile context after disabling platform extensions.
diff --git a/devel/electron28/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc b/devel/electron28/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
new file mode 100644
index 000000000000..ca21ea726636
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
@@ -0,0 +1,20 @@
+--- gpu/ipc/service/gpu_memory_buffer_factory.cc.orig 2023-03-30 00:33:52 UTC
++++ gpu/ipc/service/gpu_memory_buffer_factory.cc
+@@ -13,7 +13,7 @@
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.h"
+ #endif
+
+@@ -36,7 +36,7 @@ GpuMemoryBufferFactory::CreateNativeType(
+ return std::make_unique<GpuMemoryBufferFactoryIOSurface>();
+ #elif BUILDFLAG(IS_ANDROID)
+ return std::make_unique<GpuMemoryBufferFactoryAndroidHardwareBuffer>();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return std::make_unique<GpuMemoryBufferFactoryNativePixmap>(
+ vulkan_context_provider);
+ #elif BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-gpu_ipc_service_x__util.h b/devel/electron28/files/patch-gpu_ipc_service_x__util.h
new file mode 100644
index 000000000000..610c08c17125
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_ipc_service_x__util.h
@@ -0,0 +1,16 @@
+--- gpu/ipc/service/x_util.h.orig 2022-02-28 16:54:41 UTC
++++ gpu/ipc/service/x_util.h
+@@ -11,11 +11,11 @@
+ #include "build/build_config.h"
+ #include "gpu/ipc/service/gpu_config.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/ozone/buildflags.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(OZONE_PLATFORM_X11)
+
+ namespace gpu {
diff --git a/devel/electron28/files/patch-gpu_vulkan_generate__bindings.py b/devel/electron28/files/patch-gpu_vulkan_generate__bindings.py
new file mode 100644
index 000000000000..1f8cb4602e1f
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_generate__bindings.py
@@ -0,0 +1,11 @@
+--- gpu/vulkan/generate_bindings.py.orig 2023-11-29 21:40:03 UTC
++++ gpu/vulkan/generate_bindings.py
+@@ -270,7 +270,7 @@ VULKAN_DEVICE_FUNCTIONS = [
+ ]
+ },
+ {
+- 'ifdef': 'BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)',
++ 'ifdef': 'BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)',
+ 'extension': 'VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME',
+ 'functions': [
+ 'vkGetImageDrmFormatModifierPropertiesEXT',
diff --git a/devel/electron28/files/patch-gpu_vulkan_semaphore__handle.cc b/devel/electron28/files/patch-gpu_vulkan_semaphore__handle.cc
new file mode 100644
index 000000000000..a95de189e1fc
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_semaphore__handle.cc
@@ -0,0 +1,20 @@
+--- gpu/vulkan/semaphore_handle.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/vulkan/semaphore_handle.cc
+@@ -39,7 +39,7 @@ SemaphoreHandle::SemaphoreHandle(gfx::GpuFenceHandle f
+ // https://fuchsia.dev/reference/fidl/fuchsia.ui.scenic.
+ Init(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA,
+ fence_handle.Release());
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ Init(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR,
+ fence_handle.Release());
+ #elif BUILDFLAG(IS_POSIX)
+@@ -64,7 +64,7 @@ gfx::GpuFenceHandle SemaphoreHandle::ToGpuFenceHandle(
+ // VkSemaphore, which can then be used to submit present work, see
+ // https://fuchsia.dev/reference/fidl/fuchsia.ui.scenic.
+ fence_handle.Adopt(TakeHandle());
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ if (type_ == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR) {
+ fence_handle.Adopt(TakeHandle());
+ } else {
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.cc b/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.cc
new file mode 100644
index 000000000000..2a82b1e399ed
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.cc
@@ -0,0 +1,20 @@
+--- gpu/vulkan/vulkan_device_queue.cc.orig 2023-10-19 19:58:24 UTC
++++ gpu/vulkan/vulkan_device_queue.cc
+@@ -121,7 +121,7 @@ bool VulkanDeviceQueue::Initialize(
+
+ // In dual-CPU cases, we cannot detect the active GPU correctly on Linux,
+ // so don't select GPU device based on the |gpu_info|.
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ // If gpu_info is provided, the device should match it.
+ if (gpu_info && (device_properties.vendorID != gpu_info->gpu.vendor_id ||
+ device_properties.deviceID != gpu_info->gpu.device_id)) {
+@@ -263,7 +263,7 @@ bool VulkanDeviceQueue::Initialize(
+ // Android, Fuchsia, Linux, and CrOS (VaapiVideoDecoder) need YCbCr sampler
+ // support.
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!physical_device_info.feature_sampler_ycbcr_conversion) {
+ LOG(ERROR) << "samplerYcbcrConversion is not supported.";
+ return false;
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.h b/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.h
new file mode 100644
index 000000000000..ab5ddf8c0a0f
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__device__queue.h
@@ -0,0 +1,11 @@
+--- gpu/vulkan/vulkan_device_queue.h.orig 2023-10-19 19:58:24 UTC
++++ gpu/vulkan/vulkan_device_queue.h
+@@ -166,7 +166,7 @@ class COMPONENT_EXPORT(VULKAN) VulkanDeviceQueue
+ bool allow_protected_memory_ = false;
+
+ #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures
+ sampler_ycbcr_conversion_features_{
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES};
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.cc b/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.cc
new file mode 100644
index 000000000000..4cd3153cdf99
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.cc
@@ -0,0 +1,20 @@
+--- gpu/vulkan/vulkan_function_pointers.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/vulkan/vulkan_function_pointers.cc
+@@ -1241,7 +1241,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointer
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (gfx::HasExtension(enabled_extensions,
+ VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME)) {
+ vkGetImageDrmFormatModifierPropertiesEXT =
+@@ -1440,7 +1440,7 @@ void VulkanFunctionPointers::ResetForTesting() {
+ vkGetSwapchainImagesKHR = nullptr;
+ vkQueuePresentKHR = nullptr;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ vkGetImageDrmFormatModifierPropertiesEXT = nullptr;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ }
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.h b/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.h
new file mode 100644
index 000000000000..19fecc6a14fe
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__function__pointers.h
@@ -0,0 +1,27 @@
+--- gpu/vulkan/vulkan_function_pointers.h.orig 2023-11-29 21:40:03 UTC
++++ gpu/vulkan/vulkan_function_pointers.h
+@@ -321,7 +321,7 @@ struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers
+ VulkanFunction<PFN_vkGetSwapchainImagesKHR> vkGetSwapchainImagesKHR;
+ VulkanFunction<PFN_vkQueuePresentKHR> vkQueuePresentKHR;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ VulkanFunction<PFN_vkGetImageDrmFormatModifierPropertiesEXT>
+ vkGetImageDrmFormatModifierPropertiesEXT;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -1324,7 +1324,7 @@ ALWAYS_INLINE VkResult vkQueuePresentKHR(VkQueue queue
+ pPresentInfo);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ALWAYS_INLINE VkResult vkGetImageDrmFormatModifierPropertiesEXT(
+ VkDevice device,
+ VkImage image,
+@@ -1334,4 +1334,4 @@ ALWAYS_INLINE VkResult vkGetImageDrmFormatModifierProp
+ }
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#endif // GPU_VULKAN_VULKAN_FUNCTION_POINTERS_H_
+\ No newline at end of file
++#endif // GPU_VULKAN_VULKAN_FUNCTION_POINTERS_H_
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__image.h b/devel/electron28/files/patch-gpu_vulkan_vulkan__image.h
new file mode 100644
index 000000000000..7960e8e43873
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__image.h
@@ -0,0 +1,20 @@
+--- gpu/vulkan/vulkan_image.h.orig 2023-02-01 18:43:21 UTC
++++ gpu/vulkan/vulkan_image.h
+@@ -87,7 +87,7 @@ class COMPONENT_EXPORT(VULKAN) VulkanImage {
+ VkImageUsageFlags usage,
+ VkImageCreateFlags flags);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static std::unique_ptr<VulkanImage> CreateWithExternalMemoryAndModifiers(
+ VulkanDeviceQueue* device_queue,
+ const gfx::Size& size,
+@@ -199,7 +199,7 @@ class COMPONENT_EXPORT(VULKAN) VulkanImage {
+ VkImageTiling image_tiling,
+ uint32_t queue_family_index);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool InitializeWithExternalMemoryAndModifiers(VulkanDeviceQueue* device_queue,
+ const gfx::Size& size,
+ VkFormat format,
diff --git a/devel/electron28/files/patch-gpu_vulkan_vulkan__util.cc b/devel/electron28/files/patch-gpu_vulkan_vulkan__util.cc
new file mode 100644
index 000000000000..2bb6d67a4e4f
--- /dev/null
+++ b/devel/electron28/files/patch-gpu_vulkan_vulkan__util.cc
@@ -0,0 +1,11 @@
+--- gpu/vulkan/vulkan_util.cc.orig 2023-11-29 21:40:03 UTC
++++ gpu/vulkan/vulkan_util.cc
+@@ -433,7 +433,7 @@ bool CheckVulkanCompabilities(const VulkanInfo& vulkan
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) && !defined(OZONE_PLATFORM_IS_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !defined(OZONE_PLATFORM_IS_X11)
+ // Vulkan is only supported with X11 on Linux for now.
+ return false;
+ #else
diff --git a/devel/electron28/files/patch-headless_lib_browser_headless__browser__main__parts__posix.cc b/devel/electron28/files/patch-headless_lib_browser_headless__browser__main__parts__posix.cc
new file mode 100644
index 000000000000..5b0861b003d6
--- /dev/null
+++ b/devel/electron28/files/patch-headless_lib_browser_headless__browser__main__parts__posix.cc
@@ -0,0 +1,39 @@
+--- headless/lib/browser/headless_browser_main_parts_posix.cc.orig 2023-10-19 19:58:24 UTC
++++ headless/lib/browser/headless_browser_main_parts_posix.cc
+@@ -21,13 +21,13 @@
+ #include "content/public/browser/browser_thread.h"
+ #include "headless/lib/browser/headless_browser_impl.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/command_line.h"
+ #include "components/os_crypt/sync/key_storage_config_linux.h"
+ #include "components/os_crypt/sync/os_crypt.h"
+ #include "headless/public/switches.h"
+
+-#if defined(USE_DBUS)
++#if defined(USE_DBUS) && !BUILDFLAG(IS_BSD)
+ #include "device/bluetooth/dbus/bluez_dbus_manager.h"
+ #endif
+
+@@ -161,7 +161,7 @@ class BrowserShutdownHandler {
+
+ } // namespace
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ constexpr char kProductName[] = "HeadlessChrome";
+ #endif
+
+@@ -169,9 +169,9 @@ void HeadlessBrowserMainParts::PostCreateMainMessageLo
+ BrowserShutdownHandler::Install(base::BindOnce(
+ &HeadlessBrowserImpl::ShutdownWithExitCode, browser_->GetWeakPtr()));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+-#if defined(USE_DBUS)
++#if defined(USE_DBUS) && !BUILDFLAG(IS_BSD)
+ bluez::BluezDBusManager::Initialize(/*system_bus=*/nullptr);
+ #endif
+
diff --git a/devel/electron28/files/patch-headless_lib_browser_headless__content__browser__client.h b/devel/electron28/files/patch-headless_lib_browser_headless__content__browser__client.h
new file mode 100644
index 000000000000..0322c0b43d71
--- /dev/null
+++ b/devel/electron28/files/patch-headless_lib_browser_headless__content__browser__client.h
@@ -0,0 +1,11 @@
+--- headless/lib/browser/headless_content_browser_client.h.orig 2023-02-01 18:43:21 UTC
++++ headless/lib/browser/headless_content_browser_client.h
+@@ -45,7 +45,7 @@ class HeadlessContentBrowserClient : public content::C
+ CreateDevToolsManagerDelegate() override;
+ content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
+ content::BrowserContext* context) override;
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
diff --git a/devel/electron28/files/patch-headless_lib_browser_headless__request__context__manager.cc b/devel/electron28/files/patch-headless_lib_browser_headless__request__context__manager.cc
new file mode 100644
index 000000000000..244ad62eab49
--- /dev/null
+++ b/devel/electron28/files/patch-headless_lib_browser_headless__request__context__manager.cc
@@ -0,0 +1,11 @@
+--- headless/lib/browser/headless_request_context_manager.cc.orig 2022-06-17 14:20:10 UTC
++++ headless/lib/browser/headless_request_context_manager.cc
+@@ -65,7 +65,7 @@ void SetCryptKeyOnce(const base::FilePath& user_data_p
+ return;
+ done_once = true;
+
+-#if (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)) && defined(HEADLESS_USE_PREFS)
++#if (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(HEADLESS_USE_PREFS)
+ // The OSCrypt keys are process bound, so if network service is out of
+ // process, send it the required key if it is available.
+ if (content::IsOutOfProcessNetworkService()
diff --git a/devel/electron28/files/patch-headless_lib_browser_headless__web__contents__impl.cc b/devel/electron28/files/patch-headless_lib_browser_headless__web__contents__impl.cc
new file mode 100644
index 000000000000..fb6f39394623
--- /dev/null
+++ b/devel/electron28/files/patch-headless_lib_browser_headless__web__contents__impl.cc
@@ -0,0 +1,11 @@
+--- headless/lib/browser/headless_web_contents_impl.cc.orig 2023-06-07 04:52:05 UTC
++++ headless/lib/browser/headless_web_contents_impl.cc
+@@ -60,7 +60,7 @@ namespace headless {
+ namespace {
+
+ void UpdatePrefsFromSystemSettings(blink::RendererPreferences* prefs) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ content::UpdateFontRendererPreferencesFromSystemSettings(prefs);
+ #endif
+
diff --git a/devel/electron28/files/patch-headless_lib_headless__content__main__delegate.cc b/devel/electron28/files/patch-headless_lib_headless__content__main__delegate.cc
new file mode 100644
index 000000000000..551826e5a651
--- /dev/null
+++ b/devel/electron28/files/patch-headless_lib_headless__content__main__delegate.cc
@@ -0,0 +1,11 @@
+--- headless/lib/headless_content_main_delegate.cc.orig 2023-11-29 21:40:03 UTC
++++ headless/lib/headless_content_main_delegate.cc
+@@ -362,7 +362,7 @@ void HeadlessContentMainDelegate::InitCrashReporter(
+ if (process_type != ::switches::kZygoteProcess) {
+ g_headless_crash_client.Pointer()->set_crash_dumps_dir(
+ command_line.GetSwitchValuePath(switches::kCrashDumpsDir));
+-#if !BUILDFLAG(IS_WIN)
++#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_BSD)
+ crash_reporter::InitializeCrashpad(process_type.empty(), process_type);
+ #endif // !BUILDFLAG(IS_WIN)
+ crash_keys::SetSwitchesFromCommandLine(command_line, nullptr);
diff --git a/devel/electron28/files/patch-ipc_ipc__channel.h b/devel/electron28/files/patch-ipc_ipc__channel.h
new file mode 100644
index 000000000000..41d3952503bc
--- /dev/null
+++ b/devel/electron28/files/patch-ipc_ipc__channel.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel.h.orig 2023-03-30 00:33:53 UTC
++++ ipc/ipc_channel.h
+@@ -233,7 +233,7 @@ class COMPONENT_EXPORT(IPC) Channel : public Sender {
+ static std::string GenerateUniqueRandomChannelID();
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Sandboxed processes live in a PID namespace, so when sending the IPC hello
+ // message from client to server we need to send the PID from the global
+ // PID namespace.
diff --git a/devel/electron28/files/patch-ipc_ipc__channel__common.cc b/devel/electron28/files/patch-ipc_ipc__channel__common.cc
new file mode 100644
index 000000000000..c68294ff75b0
--- /dev/null
+++ b/devel/electron28/files/patch-ipc_ipc__channel__common.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel_common.cc.orig 2023-02-01 18:43:22 UTC
++++ ipc/ipc_channel_common.cc
+@@ -10,7 +10,7 @@
+
+ namespace IPC {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ namespace {
+ int g_global_pid = 0;
diff --git a/devel/electron28/files/patch-ipc_ipc__channel__mojo.cc b/devel/electron28/files/patch-ipc_ipc__channel__mojo.cc
new file mode 100644
index 000000000000..aad0bd25fa8f
--- /dev/null
+++ b/devel/electron28/files/patch-ipc_ipc__channel__mojo.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel_mojo.cc.orig 2023-02-01 18:43:22 UTC
++++ ipc/ipc_channel_mojo.cc
+@@ -105,7 +105,7 @@ class ThreadSafeChannelProxy : public mojo::ThreadSafe
+ };
+
+ base::ProcessId GetSelfPID() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (int global_pid = Channel::GetGlobalPid())
+ return global_pid;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-ipc_ipc__message__utils.cc b/devel/electron28/files/patch-ipc_ipc__message__utils.cc
new file mode 100644
index 000000000000..3c710761b621
--- /dev/null
+++ b/devel/electron28/files/patch-ipc_ipc__message__utils.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.cc.orig 2023-10-19 19:58:26 UTC
++++ ipc/ipc_message_utils.cc
+@@ -393,7 +393,7 @@ void ParamTraits<unsigned int>::Log(const param_type&
+ }
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_FUCHSIA) || \
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_64_BITS))
+ void ParamTraits<long>::Log(const param_type& p, std::string* l) {
+ l->append(base::NumberToString(p));
diff --git a/devel/electron28/files/patch-ipc_ipc__message__utils.h b/devel/electron28/files/patch-ipc_ipc__message__utils.h
new file mode 100644
index 000000000000..0b1c49c55797
--- /dev/null
+++ b/devel/electron28/files/patch-ipc_ipc__message__utils.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.h.orig 2022-09-24 10:57:32 UTC
++++ ipc/ipc_message_utils.h
+@@ -214,7 +214,7 @@ struct ParamTraits<unsigned int> {
+ // Since we want to support Android 32<>64 bit IPC, as long as we don't have
+ // these traits for 32 bit ARM then that'll catch any errors.
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_FUCHSIA) || \
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_64_BITS))
+ template <>
+ struct ParamTraits<long> {
diff --git a/devel/electron28/files/patch-media_BUILD.gn b/devel/electron28/files/patch-media_BUILD.gn
new file mode 100644
index 000000000000..4b33301049fe
--- /dev/null
+++ b/devel/electron28/files/patch-media_BUILD.gn
@@ -0,0 +1,12 @@
+--- media/BUILD.gn.orig 2023-11-29 21:40:05 UTC
++++ media/BUILD.gn
+@@ -95,6 +95,9 @@ config("media_config") {
+ defines += [ "DLOPEN_PULSEAUDIO" ]
+ }
+ }
++ if (use_sndio) {
++ defines += [ "USE_SNDIO" ]
++ }
+ if (use_cras) {
+ defines += [ "USE_CRAS" ]
+ }
diff --git a/devel/electron28/files/patch-media_audio_BUILD.gn b/devel/electron28/files/patch-media_audio_BUILD.gn
new file mode 100644
index 000000000000..6df470a975b9
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_BUILD.gn
@@ -0,0 +1,24 @@
+--- media/audio/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ media/audio/BUILD.gn
+@@ -287,9 +287,20 @@ source_set("audio") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !use_sndio) {
+ sources += [ "linux/audio_manager_linux.cc" ]
+ }
++
++ if (use_sndio) {
++ libs += [ "sndio" ]
++ sources += [
++ "sndio/audio_manager_sndio.cc",
++ "sndio/sndio_input.cc",
++ "sndio/sndio_input.h",
++ "sndio/sndio_output.cc",
++ "sndio/sndio_output.h"
++ ]
++ }
+
+ if (use_alsa) {
+ libs += [ "asound" ]
diff --git a/devel/electron28/files/patch-media_audio_alsa_audio__manager__alsa.cc b/devel/electron28/files/patch-media_audio_alsa_audio__manager__alsa.cc
new file mode 100644
index 000000000000..a26dd20d89cf
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_alsa_audio__manager__alsa.cc
@@ -0,0 +1,54 @@
+--- media/audio/alsa/audio_manager_alsa.cc.orig 2022-04-21 18:48:31 UTC
++++ media/audio/alsa/audio_manager_alsa.cc
+@@ -88,7 +88,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ int card = -1;
+
+ // Loop through the sound cards to get ALSA device hints.
++#if !BUILDFLAG(IS_BSD)
+ while (!wrapper_->CardNext(&card) && card >= 0) {
++#endif
+ void** hints = NULL;
+ int error = wrapper_->DeviceNameHint(card, kPcmInterfaceName, &hints);
+ if (!error) {
+@@ -100,7 +102,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ DLOG(WARNING) << "GetAlsaAudioDevices: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#if !BUILDFLAG(IS_BSD)
+ }
++#endif
+ }
+
+ void AudioManagerAlsa::GetAlsaDevicesInfo(AudioManagerAlsa::StreamType type,
+@@ -183,7 +187,11 @@ bool AudioManagerAlsa::IsAlsaDeviceAvailable(
+ // goes through software conversion if needed (e.g. incompatible
+ // sample rate).
+ // TODO(joi): Should we prefer "hw" instead?
++#if BUILDFLAG(IS_BSD)
++ static const char kDeviceTypeDesired[] = "plug";
++#else
+ static const char kDeviceTypeDesired[] = "plughw";
++#endif
+ return strncmp(kDeviceTypeDesired, device_name,
+ std::size(kDeviceTypeDesired) - 1) == 0;
+ }
+@@ -205,7 +213,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ // Loop through the sound cards.
+ // Don't use snd_device_name_hint(-1,..) since there is an access violation
+ // inside this ALSA API with libasound.so.2.0.0.
++#if !BUILDFLAG(IS_BSD)
+ while (!wrapper_->CardNext(&card) && (card >= 0) && !has_device) {
++#endif
+ int error = wrapper_->DeviceNameHint(card, kPcmInterfaceName, &hints);
+ if (!error) {
+ for (void** hint_iter = hints; *hint_iter != NULL; hint_iter++) {
+@@ -229,7 +239,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ DLOG(WARNING) << "HasAnyAudioDevice: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#if !BUILDFLAG(IS_BSD)
+ }
++#endif
+
+ return has_device;
+ }
diff --git a/devel/electron28/files/patch-media_audio_audio__input__device.cc b/devel/electron28/files/patch-media_audio_audio__input__device.cc
new file mode 100644
index 000000000000..1f3dd49535e2
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_audio__input__device.cc
@@ -0,0 +1,11 @@
+--- media/audio/audio_input_device.cc.orig 2023-05-25 00:41:58 UTC
++++ media/audio/audio_input_device.cc
+@@ -262,7 +262,7 @@ void AudioInputDevice::OnStreamCreated(
+ // here. See comments in AliveChecker and PowerObserverHelper for details and
+ // todos.
+ if (detect_dead_stream_ == DeadStreamDetection::kEnabled) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const bool stop_at_first_alive_notification = true;
+ const bool pause_check_during_suspend = false;
+ #else
diff --git a/devel/electron28/files/patch-media_audio_audio__output__proxy__unittest.cc b/devel/electron28/files/patch-media_audio_audio__output__proxy__unittest.cc
new file mode 100644
index 000000000000..09cfeab169e1
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_audio__output__proxy__unittest.cc
@@ -0,0 +1,14 @@
+--- media/audio/audio_output_proxy_unittest.cc.orig 2023-03-30 00:33:53 UTC
++++ media/audio/audio_output_proxy_unittest.cc
+@@ -443,7 +443,11 @@ class AudioOutputProxyTest : public testing::Test {
+ // |stream| is closed at this point. Start() should reopen it again.
+ EXPECT_CALL(manager(), MakeAudioOutputStream(_, _, _))
+ .Times(2)
++#if BUILDFLAG(IS_BSD)
++ .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
++#else
+ .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL)));
++#endif
+
+ EXPECT_CALL(callback_, OnError(_)).Times(2);
+
diff --git a/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.cc b/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.cc
new file mode 100644
index 000000000000..e4880eb7f7e9
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.cc
@@ -0,0 +1,184 @@
+--- media/audio/sndio/audio_manager_sndio.cc.orig 2022-10-24 13:33:33 UTC
++++ media/audio/sndio/audio_manager_sndio.cc
+@@ -0,0 +1,181 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "base/command_line.h"
++#include "base/metrics/histogram_macros.h"
++#include "base/memory/ptr_util.h"
++
++#include "media/audio/sndio/audio_manager_sndio.h"
++
++#include "media/audio/audio_device_description.h"
++#include "media/audio/audio_output_dispatcher.h"
++#if defined(USE_SNDIO)
++#include "media/audio/sndio/sndio_input.h"
++#include "media/audio/sndio/sndio_output.h"
++#endif
++#include "media/audio/fake_audio_manager.h"
++#include "media/base/limits.h"
++#include "media/base/media_switches.h"
++
++namespace media {
++
++enum SndioAudioIO {
++ kPulse,
++ kSndio,
++ kAudioIOMax = kSndio
++};
++
++#if defined(USE_SNDIO)
++// Maximum number of output streams that can be open simultaneously.
++static const int kMaxOutputStreams = 50;
++
++// Default sample rate for input and output streams.
++static const int kDefaultSampleRate = 48000;
++
++void AddDefaultDevice(AudioDeviceNames* device_names) {
++ DCHECK(device_names->empty());
++ device_names->push_front(AudioDeviceName::CreateDefault());
++}
++
++bool AudioManagerSndio::HasAudioOutputDevices() {
++ return true;
++}
++
++bool AudioManagerSndio::HasAudioInputDevices() {
++ return true;
++}
++
++void AudioManagerSndio::GetAudioInputDeviceNames(
++ AudioDeviceNames* device_names) {
++ DCHECK(device_names->empty());
++ AddDefaultDevice(device_names);
++}
++
++void AudioManagerSndio::GetAudioOutputDeviceNames(
++ AudioDeviceNames* device_names) {
++ AddDefaultDevice(device_names);
++}
++
++#if defined(USE_SNDIO)
++const char* AudioManagerSndio::GetName() {
++ return "SNDIO";
++}
++#endif
++
++AudioParameters AudioManagerSndio::GetInputStreamParameters(
++ const std::string& device_id) {
++ static const int kDefaultInputBufferSize = 1024;
++
++ int user_buffer_size = GetUserBufferSize();
++ int buffer_size = user_buffer_size ?
++ user_buffer_size : kDefaultInputBufferSize;
++
++ return AudioParameters(
++ AudioParameters::AUDIO_PCM_LOW_LATENCY, ChannelLayoutConfig::Stereo(),
++ kDefaultSampleRate, buffer_size);
++}
++
++AudioManagerSndio::AudioManagerSndio(std::unique_ptr<AudioThread> audio_thread,
++ AudioLogFactory* audio_log_factory)
++ : AudioManagerBase(std::move(audio_thread),
++ audio_log_factory) {
++ DLOG(WARNING) << "AudioManagerSndio";
++ SetMaxOutputStreamsAllowed(kMaxOutputStreams);
++}
++
++AudioManagerSndio::~AudioManagerSndio() = default;
++
++AudioOutputStream* AudioManagerSndio::MakeLinearOutputStream(
++ const AudioParameters& params,
++ const LogCallback& log_callback) {
++ DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
++ return MakeOutputStream(params);
++}
++
++AudioOutputStream* AudioManagerSndio::MakeLowLatencyOutputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) {
++ DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!";
++ DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
++ return MakeOutputStream(params);
++}
++
++AudioInputStream* AudioManagerSndio::MakeLinearInputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) {
++ DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
++ return MakeInputStream(params);
++}
++
++AudioInputStream* AudioManagerSndio::MakeLowLatencyInputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) {
++ DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
++ return MakeInputStream(params);
++}
++
++AudioParameters AudioManagerSndio::GetPreferredOutputStreamParameters(
++ const std::string& output_device_id,
++ const AudioParameters& input_params) {
++ // TODO(tommi): Support |output_device_id|.
++ DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!";
++ static const int kDefaultOutputBufferSize = 2048;
++
++ ChannelLayoutConfig channel_layout_config = ChannelLayoutConfig::Stereo();
++ int sample_rate = kDefaultSampleRate;
++ int buffer_size = kDefaultOutputBufferSize;
++ if (input_params.IsValid()) {
++ sample_rate = input_params.sample_rate();
++ channel_layout_config = input_params.channel_layout_config();
++ buffer_size = std::min(buffer_size, input_params.frames_per_buffer());
++ }
++
++ int user_buffer_size = GetUserBufferSize();
++ if (user_buffer_size)
++ buffer_size = user_buffer_size;
++
++ return AudioParameters(
++ AudioParameters::AUDIO_PCM_LOW_LATENCY,
++ channel_layout_config, sample_rate, buffer_size);
++}
++
++AudioInputStream* AudioManagerSndio::MakeInputStream(
++ const AudioParameters& params) {
++ DLOG(WARNING) << "MakeInputStream";
++ return new SndioAudioInputStream(this,
++ AudioDeviceDescription::kDefaultDeviceId, params);
++}
++
++AudioOutputStream* AudioManagerSndio::MakeOutputStream(
++ const AudioParameters& params) {
++ DLOG(WARNING) << "MakeOutputStream";
++ return new SndioAudioOutputStream(params, this);
++}
++#endif
++
++std::unique_ptr<media::AudioManager> CreateAudioManager(
++ std::unique_ptr<AudioThread> audio_thread,
++ AudioLogFactory* audio_log_factory) {
++ DLOG(WARNING) << "CreateAudioManager";
++ // For testing allow audio output to be disabled.
++ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
++ switches::kDisableAudioOutput)) {
++ return std::make_unique<FakeAudioManager>(std::move(audio_thread),
++ audio_log_factory);
++ }
++#if defined(USE_SNDIO)
++ UMA_HISTOGRAM_ENUMERATION("Media.SndioAudioIO", kSndio, kAudioIOMax + 1);
++ return std::make_unique<AudioManagerSndio>(std::move(audio_thread),
++ audio_log_factory);
++#else
++ return std::make_unique<FakeAudioManager>(std::move(audio_thread),
++ audio_log_factory);
++#endif
++
++}
++
++} // namespace media
diff --git a/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.h b/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.h
new file mode 100644
index 000000000000..33428cfc37d1
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_audio__manager__sndio.h
@@ -0,0 +1,69 @@
+--- media/audio/sndio/audio_manager_sndio.h.orig 2022-02-07 13:39:41 UTC
++++ media/audio/sndio/audio_manager_sndio.h
+@@ -0,0 +1,66 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef MEDIA_AUDIO_SNDIO_AUDIO_MANAGER_SNDIO_H_
++#define MEDIA_AUDIO_SNDIO_AUDIO_MANAGER_SNDIO_H_
++
++#include <set>
++
++#include "base/compiler_specific.h"
++#include "base/memory/ref_counted.h"
++#include "base/threading/thread.h"
++#include "media/audio/audio_manager_base.h"
++
++namespace media {
++
++class MEDIA_EXPORT AudioManagerSndio : public AudioManagerBase {
++ public:
++ AudioManagerSndio(std::unique_ptr<AudioThread> audio_thread,
++ AudioLogFactory* audio_log_factory);
++
++ AudioManagerSndio(const AudioManagerSndio&) = delete;
++ AudioManagerSndio& operator=(const AudioManagerSndio&) = delete;
++
++ ~AudioManagerSndio() override;
++
++ // Implementation of AudioManager.
++ bool HasAudioOutputDevices() override;
++ bool HasAudioInputDevices() override;
++ void GetAudioInputDeviceNames(AudioDeviceNames* device_names) override;
++ void GetAudioOutputDeviceNames(AudioDeviceNames* device_names) override;
++ AudioParameters GetInputStreamParameters(
++ const std::string& device_id) override;
++ const char* GetName() override;
++
++ // Implementation of AudioManagerBase.
++ AudioOutputStream* MakeLinearOutputStream(
++ const AudioParameters& params,
++ const LogCallback& log_callback) override;
++ AudioOutputStream* MakeLowLatencyOutputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) override;
++ AudioInputStream* MakeLinearInputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) override;
++ AudioInputStream* MakeLowLatencyInputStream(
++ const AudioParameters& params,
++ const std::string& device_id,
++ const LogCallback& log_callback) override;
++
++ protected:
++ AudioParameters GetPreferredOutputStreamParameters(
++ const std::string& output_device_id,
++ const AudioParameters& input_params) override;
++
++ private:
++ // Called by MakeLinearOutputStream and MakeLowLatencyOutputStream.
++ AudioOutputStream* MakeOutputStream(const AudioParameters& params);
++ AudioInputStream* MakeInputStream(const AudioParameters& params);
++};
++
++} // namespace media
++
++#endif // MEDIA_AUDIO_SNDIO_AUDIO_MANAGER_SNDIO_H_
diff --git a/devel/electron28/files/patch-media_audio_sndio_sndio__input.cc b/devel/electron28/files/patch-media_audio_sndio_sndio__input.cc
new file mode 100644
index 000000000000..f0c3135e90d2
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_sndio__input.cc
@@ -0,0 +1,203 @@
+--- media/audio/sndio/sndio_input.cc.orig 2023-06-07 04:52:29 UTC
++++ media/audio/sndio/sndio_input.cc
+@@ -0,0 +1,200 @@
++// Copyright 2013 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "base/logging.h"
++#include "media/base/audio_timestamp_helper.h"
++#include "media/audio/sndio/audio_manager_sndio.h"
++#include "media/audio/audio_manager.h"
++#include "media/audio/sndio/sndio_input.h"
++
++namespace media {
++
++static const SampleFormat kSampleFormat = kSampleFormatS16;
++
++void SndioAudioInputStream::OnMoveCallback(void *arg, int delta)
++{
++ SndioAudioInputStream* self = static_cast<SndioAudioInputStream*>(arg);
++
++ self->hw_delay += delta;
++}
++
++void *SndioAudioInputStream::ThreadEntry(void *arg) {
++ SndioAudioInputStream* self = static_cast<SndioAudioInputStream*>(arg);
++
++ self->ThreadLoop();
++ return NULL;
++}
++
++SndioAudioInputStream::SndioAudioInputStream(AudioManagerBase* manager,
++ const std::string& device_name,
++ const AudioParameters& params)
++ : manager(manager),
++ params(params),
++ audio_bus(AudioBus::Create(params)),
++ state(kClosed) {
++}
++
++SndioAudioInputStream::~SndioAudioInputStream() {
++ if (state != kClosed)
++ Close();
++}
++
++AudioInputStream::OpenOutcome SndioAudioInputStream::Open() {
++ struct sio_par par;
++ int sig;
++
++ if (state != kClosed)
++ return OpenOutcome::kFailed;
++
++ if (params.format() != AudioParameters::AUDIO_PCM_LINEAR &&
++ params.format() != AudioParameters::AUDIO_PCM_LOW_LATENCY) {
++ LOG(WARNING) << "Unsupported audio format.";
++ return OpenOutcome::kFailed;
++ }
++
++ sio_initpar(&par);
++ par.rate = params.sample_rate();
++ par.rchan = params.channels();
++ par.bits = SampleFormatToBitsPerChannel(kSampleFormat);
++ par.bps = par.bits / 8;
++ par.sig = sig = par.bits != 8 ? 1 : 0;
++ par.le = SIO_LE_NATIVE;
++ par.appbufsz = params.frames_per_buffer();
++
++ hdl = sio_open(SIO_DEVANY, SIO_REC, 0);
++
++ if (hdl == NULL) {
++ LOG(ERROR) << "Couldn't open audio device.";
++ return OpenOutcome::kFailed;
++ }
++
++ if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) {
++ LOG(ERROR) << "Couldn't set audio parameters.";
++ goto bad_close;
++ }
++
++ if (par.rate != (unsigned int)params.sample_rate() ||
++ par.rchan != (unsigned int)params.channels() ||
++ par.bits != (unsigned int)SampleFormatToBitsPerChannel(kSampleFormat) ||
++ par.sig != (unsigned int)sig ||
++ (par.bps > 1 && par.le != SIO_LE_NATIVE) ||
++ (par.bits != par.bps * 8)) {
++ LOG(ERROR) << "Unsupported audio parameters.";
++ goto bad_close;
++ }
++ state = kStopped;
++ buffer = new char[audio_bus->frames() * params.GetBytesPerFrame(kSampleFormat)];
++ sio_onmove(hdl, &OnMoveCallback, this);
++ return OpenOutcome::kSuccess;
++bad_close:
++ sio_close(hdl);
++ return OpenOutcome::kFailed;
++}
++
++void SndioAudioInputStream::Start(AudioInputCallback* cb) {
++
++ StartAgc();
++
++ state = kRunning;
++ hw_delay = 0;
++ callback = cb;
++ sio_start(hdl);
++ if (pthread_create(&thread, NULL, &ThreadEntry, this) != 0) {
++ LOG(ERROR) << "Failed to create real-time thread for recording.";
++ sio_stop(hdl);
++ state = kStopped;
++ }
++}
++
++void SndioAudioInputStream::Stop() {
++
++ if (state == kStopped)
++ return;
++
++ state = kStopWait;
++ pthread_join(thread, NULL);
++ sio_stop(hdl);
++ state = kStopped;
++
++ StopAgc();
++}
++
++void SndioAudioInputStream::Close() {
++
++ if (state == kClosed)
++ goto release;
++
++ if (state == kRunning)
++ Stop();
++
++ state = kClosed;
++ delete [] buffer;
++ sio_close(hdl);
++
++release:
++ manager->ReleaseInputStream(this);
++}
++
++double SndioAudioInputStream::GetMaxVolume() {
++ // Not supported
++ return 0.0;
++}
++
++void SndioAudioInputStream::SetVolume(double volume) {
++ // Not supported. Do nothing.
++}
++
++double SndioAudioInputStream::GetVolume() {
++ // Not supported.
++ return 0.0;
++}
++
++bool SndioAudioInputStream::IsMuted() {
++ // Not supported.
++ return false;
++}
++
++void SndioAudioInputStream::SetOutputDeviceForAec(
++ const std::string& output_device_id) {
++ // Not supported.
++}
++
++void SndioAudioInputStream::ThreadLoop(void) {
++ size_t todo, n;
++ char *data;
++ unsigned int nframes;
++ double normalized_volume = 0.0;
++
++ nframes = audio_bus->frames();
++
++ while (state == kRunning && !sio_eof(hdl)) {
++
++ GetAgcVolume(&normalized_volume);
++
++ // read one block
++ todo = nframes * params.GetBytesPerFrame(kSampleFormat);
++ data = buffer;
++ while (todo > 0) {
++ n = sio_read(hdl, data, todo);
++ if (n == 0)
++ return; // unrecoverable I/O error
++ todo -= n;
++ data += n;
++ }
++ hw_delay -= nframes;
++
++ // convert frames count to TimeDelta
++ const base::TimeDelta delay = AudioTimestampHelper::FramesToTime(hw_delay,
++ params.sample_rate());
++
++ // push into bus
++ audio_bus->FromInterleaved<SignedInt16SampleTypeTraits>(reinterpret_cast<int16_t*>(buffer), nframes);
++
++
++ // invoke callback
++ callback->OnData(audio_bus.get(), base::TimeTicks::Now() - delay, 1., {});
++ }
++}
++
++} // namespace media
diff --git a/devel/electron28/files/patch-media_audio_sndio_sndio__input.h b/devel/electron28/files/patch-media_audio_sndio_sndio__input.h
new file mode 100644
index 000000000000..b5684256703a
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_sndio__input.h
@@ -0,0 +1,94 @@
+--- media/audio/sndio/sndio_input.h.orig 2022-02-07 13:39:41 UTC
++++ media/audio/sndio/sndio_input.h
+@@ -0,0 +1,91 @@
++// Copyright 2013 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
++#define MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
++
++#include <stdint.h>
++#include <string>
++#include <sndio.h>
++
++#include "base/compiler_specific.h"
++#include "base/memory/weak_ptr.h"
++#include "base/time/time.h"
++#include "media/audio/agc_audio_stream.h"
++#include "media/audio/audio_io.h"
++#include "media/audio/audio_device_description.h"
++#include "media/base/audio_parameters.h"
++
++namespace media {
++
++class AudioManagerBase;
++
++// Implementation of AudioOutputStream using sndio(7)
++class SndioAudioInputStream : public AgcAudioStream<AudioInputStream> {
++ public:
++ // Pass this to the constructor if you want to attempt auto-selection
++ // of the audio recording device.
++ static const char kAutoSelectDevice[];
++
++ // Create a PCM Output stream for the SNDIO device identified by
++ // |device_name|. If unsure of what to use for |device_name|, use
++ // |kAutoSelectDevice|.
++ SndioAudioInputStream(AudioManagerBase* audio_manager,
++ const std::string& device_name,
++ const AudioParameters& params);
++
++ SndioAudioInputStream(const SndioAudioInputStream&) = delete;
++ SndioAudioInputStream& operator=(const SndioAudioInputStream&) = delete;
++
++ ~SndioAudioInputStream() override;
++
++ // Implementation of AudioInputStream.
++ OpenOutcome Open() override;
++ void Start(AudioInputCallback* callback) override;
++ void Stop() override;
++ void Close() override;
++ double GetMaxVolume() override;
++ void SetVolume(double volume) override;
++ double GetVolume() override;
++ bool IsMuted() override;
++ void SetOutputDeviceForAec(const std::string& output_device_id) override;
++
++ private:
++
++ enum StreamState {
++ kClosed, // Not opened yet
++ kStopped, // Device opened, but not started yet
++ kRunning, // Started, device playing
++ kStopWait // Stopping, waiting for the real-time thread to exit
++ };
++
++ // C-style call-backs
++ static void OnMoveCallback(void *arg, int delta);
++ static void* ThreadEntry(void *arg);
++
++ // Continuously moves data from the device to the consumer
++ void ThreadLoop();
++ // Our creator, the audio manager needs to be notified when we close.
++ AudioManagerBase* manager;
++ // Parameters of the source
++ AudioParameters params;
++ // We store data here for consumer
++ std::unique_ptr<AudioBus> audio_bus;
++ // Call-back that consumes recorded data
++ AudioInputCallback* callback; // Valid during a recording session.
++ // Handle of the audio device
++ struct sio_hdl* hdl;
++ // Current state of the stream
++ enum StreamState state;
++ // High priority thread running ThreadLoop()
++ pthread_t thread;
++ // Number of frames buffered in the hardware
++ int hw_delay;
++ // Temporary buffer where data is stored sndio-compatible format
++ char* buffer;
++};
++
++} // namespace media
++
++#endif // MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
diff --git a/devel/electron28/files/patch-media_audio_sndio_sndio__output.cc b/devel/electron28/files/patch-media_audio_sndio_sndio__output.cc
new file mode 100644
index 000000000000..2672bf645702
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_sndio__output.cc
@@ -0,0 +1,190 @@
+--- media/audio/sndio/sndio_output.cc.orig 2023-02-15 13:09:00 UTC
++++ media/audio/sndio/sndio_output.cc
+@@ -0,0 +1,187 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "base/logging.h"
++#include "base/time/time.h"
++#include "base/time/default_tick_clock.h"
++#include "media/audio/audio_manager_base.h"
++#include "media/base/audio_timestamp_helper.h"
++#include "media/audio/sndio/sndio_output.h"
++
++namespace media {
++
++static const SampleFormat kSampleFormat = kSampleFormatS16;
++
++void SndioAudioOutputStream::OnMoveCallback(void *arg, int delta) {
++ SndioAudioOutputStream* self = static_cast<SndioAudioOutputStream*>(arg);
++
++ self->hw_delay -= delta;
++}
++
++void SndioAudioOutputStream::OnVolCallback(void *arg, unsigned int vol) {
++ SndioAudioOutputStream* self = static_cast<SndioAudioOutputStream*>(arg);
++
++ self->vol = vol;
++}
++
++void *SndioAudioOutputStream::ThreadEntry(void *arg) {
++ SndioAudioOutputStream* self = static_cast<SndioAudioOutputStream*>(arg);
++
++ self->ThreadLoop();
++ return NULL;
++}
++
++SndioAudioOutputStream::SndioAudioOutputStream(const AudioParameters& params,
++ AudioManagerBase* manager)
++ : manager(manager),
++ params(params),
++ audio_bus(AudioBus::Create(params)),
++ state(kClosed),
++ mutex(PTHREAD_MUTEX_INITIALIZER) {
++}
++
++SndioAudioOutputStream::~SndioAudioOutputStream() {
++ if (state != kClosed)
++ Close();
++}
++
++bool SndioAudioOutputStream::Open() {
++ if (params.format() != AudioParameters::AUDIO_PCM_LINEAR &&
++ params.format() != AudioParameters::AUDIO_PCM_LOW_LATENCY) {
++ LOG(WARNING) << "Unsupported audio format.";
++ return false;
++ }
++ state = kStopped;
++ volpending = 0;
++ vol = SIO_MAXVOL;
++ buffer = new char[audio_bus->frames() * params.GetBytesPerFrame(kSampleFormat)];
++ return true;
++}
++
++void SndioAudioOutputStream::Close() {
++ if (state == kClosed)
++ goto release;
++ if (state == kRunning)
++ Stop();
++ state = kClosed;
++ delete [] buffer;
++release:
++ manager->ReleaseOutputStream(this); // Calls the destructor
++}
++
++void SndioAudioOutputStream::Start(AudioSourceCallback* callback) {
++ struct sio_par par;
++ int sig;
++
++ sio_initpar(&par);
++ par.rate = params.sample_rate();
++ par.pchan = params.channels();
++ par.bits = SampleFormatToBitsPerChannel(kSampleFormat);
++ par.bps = par.bits / 8;
++ par.sig = sig = par.bits != 8 ? 1 : 0;
++ par.le = SIO_LE_NATIVE;
++ par.appbufsz = params.frames_per_buffer();
++
++ hdl = sio_open(SIO_DEVANY, SIO_PLAY, 0);
++ if (hdl == NULL) {
++ LOG(ERROR) << "Couldn't open audio device.";
++ return;
++ }
++ if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) {
++ LOG(ERROR) << "Couldn't set audio parameters.";
++ sio_close(hdl);
++ return;
++ }
++ if (par.rate != (unsigned int)params.sample_rate() ||
++ par.pchan != (unsigned int)params.channels() ||
++ par.bits != (unsigned int)SampleFormatToBitsPerChannel(kSampleFormat) ||
++ par.sig != (unsigned int)sig ||
++ (par.bps > 1 && par.le != SIO_LE_NATIVE) ||
++ (par.bits != par.bps * 8)) {
++ LOG(ERROR) << "Unsupported audio parameters.";
++ sio_close(hdl);
++ return;
++ }
++
++ sio_onmove(hdl, &OnMoveCallback, this);
++ sio_onvol(hdl, &OnVolCallback, this);
++
++ state = kRunning;
++ hw_delay = 0;
++ source = callback;
++ sio_start(hdl);
++
++ if (pthread_create(&thread, NULL, &ThreadEntry, this) != 0) {
++ LOG(ERROR) << "Failed to create real-time thread.";
++ sio_stop(hdl);
++ sio_close(hdl);
++ state = kStopped;
++ }
++}
++
++void SndioAudioOutputStream::Stop() {
++ if (state == kStopped)
++ return;
++ state = kStopWait;
++ pthread_join(thread, NULL);
++ sio_stop(hdl);
++ sio_close(hdl);
++ state = kStopped;
++}
++
++void SndioAudioOutputStream::SetVolume(double v) {
++ pthread_mutex_lock(&mutex);
++ vol = v * SIO_MAXVOL;
++ volpending = 1;
++ pthread_mutex_unlock(&mutex);
++}
++
++void SndioAudioOutputStream::GetVolume(double* v) {
++ pthread_mutex_lock(&mutex);
++ *v = vol * (1. / SIO_MAXVOL);
++ pthread_mutex_unlock(&mutex);
++}
++
++// This stream is always used with sub second buffer sizes, where it's
++// sufficient to simply always flush upon Start().
++void SndioAudioOutputStream::Flush() {}
++
++void SndioAudioOutputStream::ThreadLoop(void) {
++ int avail, count, result;
++
++ while (state == kRunning) {
++ // Update volume if needed
++ pthread_mutex_lock(&mutex);
++ if (volpending) {
++ volpending = 0;
++ sio_setvol(hdl, vol);
++ }
++ pthread_mutex_unlock(&mutex);
++
++ // Get data to play
++ const base::TimeDelta delay = AudioTimestampHelper::FramesToTime(hw_delay,
++ params.sample_rate());
++ count = source->OnMoreData(delay, base::TimeTicks::Now(), {}, audio_bus.get());
++ audio_bus->ToInterleaved<SignedInt16SampleTypeTraits>(count, reinterpret_cast<int16_t*>(buffer));
++ if (count == 0) {
++ // We have to submit something to the device
++ count = audio_bus->frames();
++ memset(buffer, 0, count * params.GetBytesPerFrame(kSampleFormat));
++ LOG(WARNING) << "No data to play, running empty cycle.";
++ }
++
++ // Submit data to the device
++ avail = count * params.GetBytesPerFrame(kSampleFormat);
++ result = sio_write(hdl, buffer, avail);
++ if (result == 0) {
++ LOG(WARNING) << "Audio device disconnected.";
++ break;
++ }
++
++ // Update hardware pointer
++ hw_delay += count;
++ }
++}
++
++} // namespace media
diff --git a/devel/electron28/files/patch-media_audio_sndio_sndio__output.h b/devel/electron28/files/patch-media_audio_sndio_sndio__output.h
new file mode 100644
index 000000000000..bb8603b68d9c
--- /dev/null
+++ b/devel/electron28/files/patch-media_audio_sndio_sndio__output.h
@@ -0,0 +1,91 @@
+--- media/audio/sndio/sndio_output.h.orig 2022-02-07 13:39:41 UTC
++++ media/audio/sndio/sndio_output.h
+@@ -0,0 +1,88 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef MEDIA_AUDIO_SNDIO_SNDIO_OUTPUT_H_
++#define MEDIA_AUDIO_SNDIO_SNDIO_OUTPUT_H_
++
++#include <pthread.h>
++#include <sndio.h>
++
++#include "base/time/tick_clock.h"
++#include "base/time/time.h"
++#include "media/audio/audio_io.h"
++
++namespace media {
++
++class AudioManagerBase;
++
++// Implementation of AudioOutputStream using sndio(7)
++class SndioAudioOutputStream : public AudioOutputStream {
++ public:
++ // The manager is creating this object
++ SndioAudioOutputStream(const AudioParameters& params,
++ AudioManagerBase* manager);
++
++ SndioAudioOutputStream(const SndioAudioOutputStream&) = delete;
++ SndioAudioOutputStream& operator=(const SndioAudioOutputStream&) = delete;
++
++ virtual ~SndioAudioOutputStream();
++
++ // Implementation of AudioOutputStream.
++ bool Open() override;
++ void Close() override;
++ void Start(AudioSourceCallback* callback) override;
++ void Stop() override;
++ void SetVolume(double volume) override;
++ void GetVolume(double* volume) override;
++ void Flush() override;
++
++ friend void sndio_onmove(void *arg, int delta);
++ friend void sndio_onvol(void *arg, unsigned int vol);
++ friend void *sndio_threadstart(void *arg);
++
++ private:
++ enum StreamState {
++ kClosed, // Not opened yet
++ kStopped, // Device opened, but not started yet
++ kRunning, // Started, device playing
++ kStopWait // Stopping, waiting for the real-time thread to exit
++ };
++
++ // C-style call-backs
++ static void OnMoveCallback(void *arg, int delta);
++ static void OnVolCallback(void *arg, unsigned int vol);
++ static void* ThreadEntry(void *arg);
++
++ // Continuously moves data from the producer to the device
++ void ThreadLoop(void);
++
++ // Our creator, the audio manager needs to be notified when we close.
++ AudioManagerBase* manager;
++ // Parameters of the source
++ AudioParameters params;
++ // Source stores data here
++ std::unique_ptr<AudioBus> audio_bus;
++ // Call-back that produces data to play
++ AudioSourceCallback* source;
++ // Handle of the audio device
++ struct sio_hdl* hdl;
++ // Current state of the stream
++ enum StreamState state;
++ // High priority thread running ThreadLoop()
++ pthread_t thread;
++ // Protects vol, volpending and hw_delay
++ pthread_mutex_t mutex;
++ // Current volume in the 0..SIO_MAXVOL range
++ int vol;
++ // Set to 1 if volumes must be refreshed in the realtime thread
++ int volpending;
++ // Number of frames buffered in the hardware
++ int hw_delay;
++ // Temporary buffer where data is stored sndio-compatible format
++ char* buffer;
++};
++
++} // namespace media
++
++#endif // MEDIA_AUDIO_SNDIO_SNDIO_OUTPUT_H_
diff --git a/devel/electron28/files/patch-media_base_audio__latency.cc b/devel/electron28/files/patch-media_base_audio__latency.cc
new file mode 100644
index 000000000000..0efa4319f0ee
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_audio__latency.cc
@@ -0,0 +1,11 @@
+--- media/base/audio_latency.cc.orig 2023-03-30 00:33:53 UTC
++++ media/base/audio_latency.cc
+@@ -147,7 +147,7 @@ int AudioLatency::GetRtcBufferSize(int sample_rate, in
+ }
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // On Linux, MacOS and Fuchsia, the low level IO implementations on the
+ // browser side supports all buffer size the clients want. We use the native
+ // peer connection buffer size (10ms) to achieve best possible performance.
diff --git a/devel/electron28/files/patch-media_base_cdm__promise__adapter.cc b/devel/electron28/files/patch-media_base_cdm__promise__adapter.cc
new file mode 100644
index 000000000000..32bcd3f145dd
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_cdm__promise__adapter.cc
@@ -0,0 +1,16 @@
+--- media/base/cdm_promise_adapter.cc.orig 2023-08-10 01:48:46 UTC
++++ media/base/cdm_promise_adapter.cc
+@@ -94,7 +94,13 @@ void CdmPromiseAdapter::RejectPromise(uint32_t promise
+ void CdmPromiseAdapter::Clear(ClearReason reason) {
+ // Reject all outstanding promises.
+ DCHECK(thread_checker_.CalledOnValidThread());
++#if defined(__clang__) && (__clang_major__ >= 16)
+ for (auto& [promise_id, promise] : promises_) {
++#else
++ for (auto& [p_i, p_e] : promises_) {
++ auto& promise_id = p_i;
++ auto& promise = p_e;
++#endif
+ TRACE_EVENT_NESTABLE_ASYNC_END1(
+ "media", "CdmPromise", TRACE_ID_WITH_SCOPE("CdmPromise", promise_id),
+ "status", "cleared");
diff --git a/devel/electron28/files/patch-media_base_media__switches.cc b/devel/electron28/files/patch-media_base_media__switches.cc
new file mode 100644
index 000000000000..56b9d1d5aa2c
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_media__switches.cc
@@ -0,0 +1,65 @@
+--- media/base/media_switches.cc.orig 2023-11-29 21:40:05 UTC
++++ media/base/media_switches.cc
+@@ -17,7 +17,7 @@
+ #include "ui/gl/gl_features.h"
+ #include "ui/gl/gl_utils.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/cpu.h"
+ #endif
+
+@@ -702,7 +702,7 @@ BASE_FEATURE(kGlobalMediaControls,
+ // Show toolbar button that opens dialog for controlling media sessions.
+ BASE_FEATURE(kGlobalMediaControls,
+ "GlobalMediaControls",
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -725,7 +725,7 @@ BASE_FEATURE(kMediaRemotingWithoutFullscreen,
+ // If enabled, users can request Media Remoting without fullscreen-in-tab.
+ BASE_FEATURE(kMediaRemotingWithoutFullscreen,
+ "MediaRemotingWithoutFullscreen",
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -737,7 +737,7 @@ BASE_FEATURE(kGlobalMediaControlsPictureInPicture,
+ BASE_FEATURE(kGlobalMediaControlsPictureInPicture,
+ "GlobalMediaControlsPictureInPicture",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -776,7 +776,7 @@ BASE_FEATURE(kUnifiedAutoplay,
+ "UnifiedAutoplay",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Enable vaapi video decoding on linux. This is already enabled by default on
+ // chromeos, but needs an experiment on linux.
+ BASE_FEATURE(kVaapiVideoDecodeLinux,
+@@ -856,7 +856,7 @@ BASE_FEATURE(kVaapiVp9SModeHWEncoding,
+ "VaapiVp9SModeHWEncoding",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+ #endif // defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS)
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Enables the new V4L2StatefulVideoDecoder instead of V4L2VideoDecoder.
+ BASE_FEATURE(kV4L2FlatStatelessVideoDecoder,
+ "V4L2FlatStatelessVideoDecoder",
+@@ -1384,7 +1384,7 @@ const base::Feature MEDIA_EXPORT kUseOutOfProcessVideo
+ };
+ #endif // BUILDFLAG(ALLOW_OOP_VIDEO_DECODER)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Spawn utility processes to perform hardware encode acceleration instead of
+ // using the GPU process.
+ const base::Feature MEDIA_EXPORT kUseOutOfProcessVideoEncoding{
diff --git a/devel/electron28/files/patch-media_base_media__switches.h b/devel/electron28/files/patch-media_base_media__switches.h
new file mode 100644
index 000000000000..fcdbe4529268
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_media__switches.h
@@ -0,0 +1,29 @@
+--- media/base/media_switches.h.orig 2023-11-29 21:40:05 UTC
++++ media/base/media_switches.h
+@@ -322,7 +322,7 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseMediaHistoryStor
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseElementInsteadOfRegionCapture);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseFakeDeviceForMediaStream);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseMediaHistoryStore);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVideoDecodeLinux);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVideoDecodeLinuxGL);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVideoEncodeLinux);
+@@ -340,7 +340,7 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVp9SModeHWEnco
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVp8TemporalLayerHWEncoding);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kVaapiVp9SModeHWEncoding);
+ #endif // defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS)
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kV4L2FlatStatelessVideoDecoder);
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kV4L2FlatStatefulVideoDecoder);
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+@@ -461,7 +461,7 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseOutOfProcessVide
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseOutOfProcessVideoDecoding);
+ #endif // BUILDFLAG(ALLOW_OOP_VIDEO_DECODER)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseOutOfProcessVideoEncoding);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
diff --git a/devel/electron28/files/patch-media_base_scopedfd__helper.h b/devel/electron28/files/patch-media_base_scopedfd__helper.h
new file mode 100644
index 000000000000..8bf62e4233ce
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_scopedfd__helper.h
@@ -0,0 +1,11 @@
+--- media/base/scopedfd_helper.h.orig 2022-02-28 16:54:41 UTC
++++ media/base/scopedfd_helper.h
+@@ -15,7 +15,7 @@ namespace media {
+ // but since the only current user is V4L2 we are limiting the scope to OS_LINUX
+ // so the binary size does not inflate on non-using systems. Feel free to adapt
+ // this and BUILD.gn as our needs evolve.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ // Return a new vector containing duplicates of |fds|, or PCHECKs in case of an
+ // error.
diff --git a/devel/electron28/files/patch-media_base_user__input__monitor__unittest.cc b/devel/electron28/files/patch-media_base_user__input__monitor__unittest.cc
new file mode 100644
index 000000000000..15d4c34336ae
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_user__input__monitor__unittest.cc
@@ -0,0 +1,29 @@
+--- media/base/user_input_monitor_unittest.cc.orig 2023-02-01 18:43:22 UTC
++++ media/base/user_input_monitor_unittest.cc
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "testing/gtest/include/gtest/gtest.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/files/file_descriptor_watcher_posix.h"
+ #endif
+
+@@ -49,7 +49,7 @@ class UserInputMonitorTest : public testing::Test {
+ } // namespace
+
+ TEST_F(UserInputMonitorTest, CreatePlatformSpecific) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::test::TaskEnvironment task_environment(
+ base::test::TaskEnvironment::MainThreadType::IO);
+ #else
+@@ -72,7 +72,7 @@ TEST_F(UserInputMonitorTest, CreatePlatformSpecific) {
+ }
+
+ TEST_F(UserInputMonitorTest, CreatePlatformSpecificWithMapping) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::test::TaskEnvironment task_environment(
+ base::test::TaskEnvironment::MainThreadType::IO);
+ #else
diff --git a/devel/electron28/files/patch-media_base_video__frame.cc b/devel/electron28/files/patch-media_base_video__frame.cc
new file mode 100644
index 000000000000..cc3ad09d71e0
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_video__frame.cc
@@ -0,0 +1,74 @@
+--- media/base/video_frame.cc.orig 2023-11-29 21:40:05 UTC
++++ media/base/video_frame.cc
+@@ -80,7 +80,7 @@ std::string VideoFrame::StorageTypeToString(
+ return "OWNED_MEMORY";
+ case VideoFrame::STORAGE_SHMEM:
+ return "SHMEM";
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case VideoFrame::STORAGE_DMABUFS:
+ return "DMABUFS";
+ #endif
+@@ -95,7 +95,7 @@ bool VideoFrame::IsStorageTypeMappable(VideoFrame::Sto
+ // static
+ bool VideoFrame::IsStorageTypeMappable(VideoFrame::StorageType storage_type) {
+ return
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // This is not strictly needed but makes explicit that, at VideoFrame
+ // level, DmaBufs are not mappable from userspace.
+ storage_type != VideoFrame::STORAGE_DMABUFS &&
+@@ -306,7 +306,7 @@ static absl::optional<VideoFrameLayout> GetDefaultLayo
+ return VideoFrameLayout::CreateWithPlanes(format, coded_size, planes);
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // This class allows us to embed a vector<ScopedFD> into a scoped_refptr, and
+ // thus to have several VideoFrames share the same set of DMABUF FDs.
+ class VideoFrame::DmabufHolder
+@@ -636,7 +636,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalGpuM
+ for (size_t i = 0; i < num_planes; ++i)
+ planes[i].stride = gpu_memory_buffer->stride(i);
+ uint64_t modifier = gfx::NativePixmapHandle::kNoModifier;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (gpu_memory_buffer->GetType() == gfx::NATIVE_PIXMAP) {
+ const auto gmb_handle = gpu_memory_buffer->CloneHandle();
+ if (gmb_handle.is_null() ||
+@@ -682,7 +682,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalGpuM
+ return frame;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // static
+ scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
+ const VideoFrameLayout& layout,
+@@ -903,7 +903,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
+ }
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ DCHECK(frame->dmabuf_fds_);
+ // If there are any |dmabuf_fds_| plugged in, we should refer them too.
+ wrapping_frame->dmabuf_fds_ = frame->dmabuf_fds_;
+@@ -1311,7 +1311,7 @@ const gpu::MailboxHolder& VideoFrame::mailbox_holder(
+ : mailbox_holders_[texture_index];
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const std::vector<base::ScopedFD>& VideoFrame::DmabufFds() const {
+ DCHECK_EQ(storage_type_, STORAGE_DMABUFS);
+
+@@ -1424,7 +1424,7 @@ VideoFrame::VideoFrame(const VideoFrameLayout& layout,
+ storage_type_(storage_type),
+ visible_rect_(Intersection(visible_rect, gfx::Rect(layout.coded_size()))),
+ natural_size_(natural_size),
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ dmabuf_fds_(base::MakeRefCounted<DmabufHolder>()),
+ #endif
+ timestamp_(timestamp),
diff --git a/devel/electron28/files/patch-media_base_video__frame.h b/devel/electron28/files/patch-media_base_video__frame.h
new file mode 100644
index 000000000000..36006a27d386
--- /dev/null
+++ b/devel/electron28/files/patch-media_base_video__frame.h
@@ -0,0 +1,47 @@
+--- media/base/video_frame.h.orig 2023-10-19 19:58:26 UTC
++++ media/base/video_frame.h
+@@ -44,7 +44,7 @@
+ #include "base/apple/scoped_cftyperef.h"
+ #endif // BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/files/scoped_file.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -110,7 +110,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ STORAGE_UNOWNED_MEMORY = 2, // External, non owned data pointers.
+ STORAGE_OWNED_MEMORY = 3, // VideoFrame has allocated its own data buffer.
+ STORAGE_SHMEM = 4, // Backed by read-only shared memory.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // TODO(mcasas): Consider turning this type into STORAGE_NATIVE
+ // based on the idea of using this same enum value for both DMA
+ // buffers on Linux and CVPixelBuffers on Mac (which currently use
+@@ -313,7 +313,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ ReleaseMailboxAndGpuMemoryBufferCB mailbox_holder_and_gmb_release_cb,
+ base::TimeDelta timestamp);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Wraps provided dmabufs
+ // (https://www.kernel.org/doc/html/latest/driver-api/dma-buf.html) with a
+ // VideoFrame. The frame will take ownership of |dmabuf_fds|, and will
+@@ -593,7 +593,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ // mailbox, the caller must wait for the included sync point.
+ const gpu::MailboxHolder& mailbox_holder(size_t texture_index) const;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Returns a vector containing the backing DmaBufs for this frame. The number
+ // of returned DmaBufs will be equal or less than the number of planes of
+ // the frame. If there are less, this means that the last FD contains the
+@@ -811,7 +811,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ // GPU memory buffer, if this frame is STORAGE_GPU_MEMORY_BUFFER.
+ std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ class DmabufHolder;
+
+ // Dmabufs for the frame, used when storage is STORAGE_DMABUFS. Size is either
diff --git a/devel/electron28/files/patch-media_capture_video_create__video__capture__device__factory.cc b/devel/electron28/files/patch-media_capture_video_create__video__capture__device__factory.cc
new file mode 100644
index 000000000000..d6dc7e2bf5ec
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_create__video__capture__device__factory.cc
@@ -0,0 +1,20 @@
+--- media/capture/video/create_video_capture_device_factory.cc.orig 2023-03-30 00:33:53 UTC
++++ media/capture/video/create_video_capture_device_factory.cc
+@@ -13,7 +13,7 @@
+ #include "media/capture/video/fake_video_capture_device_factory.h"
+ #include "media/capture/video/file_video_capture_device_factory.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ #include "media/capture/video/linux/video_capture_device_factory_linux.h"
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ #include "media/capture/video/chromeos/public/cros_features.h"
+@@ -56,7 +56,7 @@ CreateFakeVideoCaptureDeviceFactory() {
+ std::unique_ptr<VideoCaptureDeviceFactory>
+ CreatePlatformSpecificVideoCaptureDeviceFactory(
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return std::make_unique<VideoCaptureDeviceFactoryLinux>(ui_task_runner);
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ if (base::SysInfo::IsRunningOnChromeOS())
diff --git a/devel/electron28/files/patch-media_capture_video_fake__video__capture__device__factory.cc b/devel/electron28/files/patch-media_capture_video_fake__video__capture__device__factory.cc
new file mode 100644
index 000000000000..3848b7d8c912
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_fake__video__capture__device__factory.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/fake_video_capture_device_factory.cc.orig 2023-08-10 01:48:46 UTC
++++ media/capture/video/fake_video_capture_device_factory.cc
+@@ -229,7 +229,7 @@ void FakeVideoCaptureDeviceFactory::GetDevicesInfo(
+ int entry_index = 0;
+ for (const auto& entry : devices_config_) {
+ VideoCaptureApi api =
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE;
+ #elif BUILDFLAG(IS_IOS)
+ VideoCaptureApi::UNKNOWN;
diff --git a/devel/electron28/files/patch-media_capture_video_file__video__capture__device__factory.cc b/devel/electron28/files/patch-media_capture_video_file__video__capture__device__factory.cc
new file mode 100644
index 000000000000..91bf3d7255cc
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_file__video__capture__device__factory.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/file_video_capture_device_factory.cc.orig 2022-02-28 16:54:41 UTC
++++ media/capture/video/file_video_capture_device_factory.cc
+@@ -52,7 +52,7 @@ void FileVideoCaptureDeviceFactory::GetDevicesInfo(
+ VideoCaptureApi::WIN_DIRECT_SHOW;
+ #elif BUILDFLAG(IS_MAC)
+ VideoCaptureApi::MACOSX_AVFOUNDATION;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE;
+ #else
+ VideoCaptureApi::UNKNOWN;
diff --git a/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.cc b/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.cc
new file mode 100644
index 000000000000..f61a9cadf431
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/linux/fake_v4l2_impl.cc.orig 2023-10-19 19:58:26 UTC
++++ media/capture/video/linux/fake_v4l2_impl.cc
+@@ -560,7 +560,7 @@ int FakeV4L2Impl::close(int fd) {
+ return kSuccessReturnValue;
+ }
+
+-int FakeV4L2Impl::ioctl(int fd, int request, void* argp) {
++int FakeV4L2Impl::ioctl(int fd, unsigned long request, void* argp) {
+ base::AutoLock lock(lock_);
+ auto device_iter = opened_devices_.find(fd);
+ if (device_iter == opened_devices_.end())
diff --git a/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.h b/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.h
new file mode 100644
index 000000000000..ce6bba028f1c
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_fake__v4l2__impl.h
@@ -0,0 +1,25 @@
+--- media/capture/video/linux/fake_v4l2_impl.h.orig 2023-10-19 19:58:26 UTC
++++ media/capture/video/linux/fake_v4l2_impl.h
+@@ -8,7 +8,13 @@
+ #include <map>
+ #include <string>
+
++#include "build/build_config.h"
++#if BUILDFLAG(IS_OPENBSD)
++#include <sys/videoio.h>
++typedef __uint32_t __u32;
++#else
+ #include <linux/videodev2.h>
++#endif
+
+ #include "base/synchronization/lock.h"
+ #include "media/capture/capture_export.h"
+@@ -38,7 +44,7 @@ class CAPTURE_EXPORT FakeV4L2Impl : public V4L2Capture
+ // Implementation of V4L2CaptureDevice interface:
+ int open(const char* device_name, int flags) override;
+ int close(int fd) override;
+- int ioctl(int fd, int request, void* argp) override;
++ int ioctl(int fd, unsigned long request, void* argp) override;
+ void* mmap(void* start,
+ size_t length,
+ int prot,
diff --git a/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
new file mode 100644
index 000000000000..7f91123143c8
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
@@ -0,0 +1,156 @@
+--- media/capture/video/linux/v4l2_capture_delegate.cc.orig 2023-11-29 21:40:05 UTC
++++ media/capture/video/linux/v4l2_capture_delegate.cc
+@@ -5,8 +5,10 @@
+ #include "media/capture/video/linux/v4l2_capture_delegate.h"
+
+ #include <fcntl.h>
++#if !BUILDFLAG(IS_BSD)
+ #include <linux/version.h>
+ #include <linux/videodev2.h>
++#endif
+ #include <poll.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+@@ -26,17 +28,19 @@
+ #include "media/capture/video/blob_utils.h"
+ #include "media/capture/video/linux/video_capture_device_linux.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "media/capture/capture_switches.h"
+ #include "media/capture/video/linux/v4l2_capture_delegate_gpu_helper.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+ using media::mojom::MeteringMode;
+
++#if !BUILDFLAG(IS_BSD)
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+ // 16 bit depth, Realsense F200.
+ #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ')
+ #endif
++#endif
+
+ // TODO(aleksandar.stojiljkovic): Wrap this with kernel version check once the
+ // format is introduced to kernel.
+@@ -46,6 +50,14 @@ using media::mojom::MeteringMode;
+ #define V4L2_PIX_FMT_INVZ v4l2_fourcc('I', 'N', 'V', 'Z')
+ #endif
+
++#ifndef V4L2_COLORSPACE_OPRGB
++#define V4L2_COLORSPACE_OPRGB V4L2_COLORSPACE_ADOBERGB
++#endif
++
++#ifndef V4L2_XFER_FUNC_OPRGB
++#define V4L2_XFER_FUNC_OPRGB V4L2_XFER_FUNC_ADOBERGB
++#endif
++
+ namespace media {
+
+ namespace {
+@@ -260,7 +272,7 @@ bool V4L2CaptureDelegate::IsControllableControl(
+ // static
+ bool V4L2CaptureDelegate::IsControllableControl(
+ int control_id,
+- const base::RepeatingCallback<int(int, void*)>& do_ioctl) {
++ const base::RepeatingCallback<int(unsigned int, void*)>& do_ioctl) {
+ const int special_control_id = GetControllingSpecialControl(control_id);
+ if (!special_control_id) {
+ // The control is not controlled by a special control thus the control is
+@@ -316,7 +328,7 @@ V4L2CaptureDelegate::V4L2CaptureDelegate(
+ is_capturing_(false),
+ timeout_count_(0),
+ rotation_(rotation) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ use_gpu_buffer_ = switches::IsVideoCaptureUseGpuMemoryBufferEnabled();
+ #endif // BUILDFLAG(IS_LINUX)
+ }
+@@ -443,7 +455,7 @@ void V4L2CaptureDelegate::AllocateAndStart(
+
+ client_->OnStarted();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (use_gpu_buffer_) {
+ v4l2_gpu_helper_ = std::make_unique<V4L2CaptureDelegateGpuHelper>(
+ std::move(gmb_support_test_));
+@@ -793,7 +805,7 @@ V4L2CaptureDelegate::~V4L2CaptureDelegate() = default;
+
+ V4L2CaptureDelegate::~V4L2CaptureDelegate() = default;
+
+-bool V4L2CaptureDelegate::RunIoctl(int request, void* argp) {
++bool V4L2CaptureDelegate::RunIoctl(unsigned int request, void* argp) {
+ int num_retries = 0;
+ for (; DoIoctl(request, argp) < 0 && num_retries < kMaxIOCtrlRetries;
+ ++num_retries) {
+@@ -803,7 +815,7 @@ bool V4L2CaptureDelegate::RunIoctl(int request, void*
+ return num_retries != kMaxIOCtrlRetries;
+ }
+
+-int V4L2CaptureDelegate::DoIoctl(int request, void* argp) {
++int V4L2CaptureDelegate::DoIoctl(unsigned int request, void* argp) {
+ return HANDLE_EINTR(v4l2_->ioctl(device_fd_.get(), request, argp));
+ }
+
+@@ -814,6 +826,7 @@ void V4L2CaptureDelegate::ReplaceControlEventSubscript
+ }
+
+ void V4L2CaptureDelegate::ReplaceControlEventSubscriptions() {
++#if !BUILDFLAG(IS_BSD)
+ constexpr uint32_t kControlIds[] = {V4L2_CID_AUTO_EXPOSURE_BIAS,
+ V4L2_CID_AUTO_WHITE_BALANCE,
+ V4L2_CID_BRIGHTNESS,
+@@ -841,6 +854,7 @@ void V4L2CaptureDelegate::ReplaceControlEventSubscript
+ << ", {type = V4L2_EVENT_CTRL, id = " << control_id << "}";
+ }
+ }
++#endif
+ }
+
+ mojom::RangePtr V4L2CaptureDelegate::RetrieveUserControlRange(int control_id) {
+@@ -1021,7 +1035,11 @@ void V4L2CaptureDelegate::DoCapture() {
+
+ pollfd device_pfd = {};
+ device_pfd.fd = device_fd_.get();
++#if !BUILDFLAG(IS_BSD)
+ device_pfd.events = POLLIN | POLLPRI;
++#else
++ device_pfd.events = POLLIN;
++#endif
+
+ const int result =
+ HANDLE_EINTR(v4l2_->poll(&device_pfd, 1, kCaptureTimeoutMs));
+@@ -1059,6 +1077,7 @@ void V4L2CaptureDelegate::DoCapture() {
+ timeout_count_ = 0;
+ }
+
++#if !BUILDFLAG(IS_BSD)
+ // Dequeue events if the driver has filled in some.
+ if (device_pfd.revents & POLLPRI) {
+ bool controls_changed = false;
+@@ -1093,6 +1112,7 @@ void V4L2CaptureDelegate::DoCapture() {
+ client_->OnCaptureConfigurationChanged();
+ }
+ }
++#endif
+
+ // Deenqueue, send and reenqueue a buffer if the driver has filled one in.
+ if (device_pfd.revents & POLLIN) {
+@@ -1146,7 +1166,7 @@ void V4L2CaptureDelegate::DoCapture() {
+ // workable on Linux.
+
+ // See http://crbug.com/959919.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (use_gpu_buffer_) {
+ v4l2_gpu_helper_->OnIncomingCapturedData(
+ client_.get(), buffer_tracker->start(),
+@@ -1219,7 +1239,7 @@ void V4L2CaptureDelegate::SetErrorState(VideoCaptureEr
+ client_->OnError(error, from_here, reason);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::ColorSpace V4L2CaptureDelegate::BuildColorSpaceFromv4l2() {
+ v4l2_colorspace v4l2_primary = (v4l2_colorspace)video_fmt_.fmt.pix.colorspace;
+ v4l2_quantization v4l2_range =
diff --git a/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.h b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.h
new file mode 100644
index 000000000000..3adf1ccdcb47
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__delegate.h
@@ -0,0 +1,51 @@
+--- media/capture/video/linux/v4l2_capture_delegate.h.orig 2023-10-19 19:58:26 UTC
++++ media/capture/video/linux/v4l2_capture_delegate.h
+@@ -35,7 +35,7 @@ class Location;
+
+ namespace media {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class V4L2CaptureDelegateGpuHelper;
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -86,7 +86,7 @@ class CAPTURE_EXPORT V4L2CaptureDelegate final {
+ static bool IsBlockedControl(int control_id);
+ static bool IsControllableControl(
+ int control_id,
+- const base::RepeatingCallback<int(int, void*)>& do_ioctl);
++ const base::RepeatingCallback<int(unsigned int, void*)>& do_ioctl);
+
+ void SetGPUEnvironmentForTesting(
+ std::unique_ptr<gpu::GpuMemoryBufferSupport> gmb_support);
+@@ -100,10 +100,10 @@ class CAPTURE_EXPORT V4L2CaptureDelegate final {
+ // device file descriptor or (re)starting streaming, can fail but works after
+ // retrying (https://crbug.com/670262). Returns false if the |request| ioctl
+ // fails too many times.
+- bool RunIoctl(int request, void* argp);
++ bool RunIoctl(unsigned int request, void* argp);
+
+ // Simple wrapper to do HANDLE_EINTR(v4l2_->ioctl(device_fd_.get(), ...)).
+- int DoIoctl(int request, void* argp);
++ int DoIoctl(unsigned int request, void* argp);
+
+ // Check whether the control is controllable (and not changed automatically).
+ bool IsControllableControl(int control_id);
+@@ -133,7 +133,7 @@ class CAPTURE_EXPORT V4L2CaptureDelegate final {
+ const base::Location& from_here,
+ const std::string& reason);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Systems which describe a "color space" usually map that to one or more of
+ // {primary, matrix, transfer, range}. BuildColorSpaceFromv4l2() will use the
+ // matched value as first priority. Otherwise, if there is no best matching
+@@ -167,7 +167,7 @@ class CAPTURE_EXPORT V4L2CaptureDelegate final {
+ // Clockwise rotation in degrees. This value should be 0, 90, 180, or 270.
+ int rotation_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Support GPU memory buffer.
+ bool use_gpu_buffer_;
+ std::unique_ptr<V4L2CaptureDelegateGpuHelper> v4l2_gpu_helper_;
diff --git a/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device.h b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device.h
new file mode 100644
index 000000000000..cbba776523a9
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device.h
@@ -0,0 +1,11 @@
+--- media/capture/video/linux/v4l2_capture_device.h.orig 2022-02-07 13:39:41 UTC
++++ media/capture/video/linux/v4l2_capture_device.h
+@@ -21,7 +21,7 @@ class CAPTURE_EXPORT V4L2CaptureDevice
+ public:
+ virtual int open(const char* device_name, int flags) = 0;
+ virtual int close(int fd) = 0;
+- virtual int ioctl(int fd, int request, void* argp) = 0;
++ virtual int ioctl(int fd, unsigned long request, void* argp) = 0;
+ virtual void* mmap(void* start,
+ size_t length,
+ int prot,
diff --git a/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.cc b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.cc
new file mode 100644
index 000000000000..902427b862a2
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/linux/v4l2_capture_device_impl.cc.orig 2022-02-07 13:39:41 UTC
++++ media/capture/video/linux/v4l2_capture_device_impl.cc
+@@ -22,7 +22,7 @@ int V4L2CaptureDeviceImpl::close(int fd) {
+ return ::close(fd);
+ }
+
+-int V4L2CaptureDeviceImpl::ioctl(int fd, int request, void* argp) {
++int V4L2CaptureDeviceImpl::ioctl(int fd, unsigned long request, void* argp) {
+ return ::ioctl(fd, request, argp);
+ }
+
diff --git a/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.h b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.h
new file mode 100644
index 000000000000..21a77244eca8
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_v4l2__capture__device__impl.h
@@ -0,0 +1,11 @@
+--- media/capture/video/linux/v4l2_capture_device_impl.h.orig 2022-02-07 13:39:41 UTC
++++ media/capture/video/linux/v4l2_capture_device_impl.h
+@@ -19,7 +19,7 @@ class CAPTURE_EXPORT V4L2CaptureDeviceImpl : public V4
+ public:
+ int open(const char* device_name, int flags) override;
+ int close(int fd) override;
+- int ioctl(int fd, int request, void* argp) override;
++ int ioctl(int fd, unsigned long request, void* argp) override;
+ void* mmap(void* start,
+ size_t length,
+ int prot,
diff --git a/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.cc b/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.cc
new file mode 100644
index 000000000000..3dcf0564af06
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.cc
@@ -0,0 +1,45 @@
+--- media/capture/video/linux/video_capture_device_factory_v4l2.cc.orig 2023-05-25 00:41:58 UTC
++++ media/capture/video/linux/video_capture_device_factory_v4l2.cc
+@@ -75,6 +75,9 @@ class DevVideoFilePathsDeviceProvider
+ : public VideoCaptureDeviceFactoryV4L2::DeviceProvider {
+ public:
+ void GetDeviceIds(std::vector<std::string>* target_container) override {
++#if BUILDFLAG(IS_OPENBSD)
++ target_container->emplace_back("/dev/video");
++#else
+ const base::FilePath path("/dev/");
+ base::FileEnumerator enumerator(path, false, base::FileEnumerator::FILES,
+ "video*");
+@@ -82,9 +85,13 @@ class DevVideoFilePathsDeviceProvider
+ const base::FileEnumerator::FileInfo info = enumerator.GetInfo();
+ target_container->emplace_back(path.value() + info.GetName().value());
+ }
++#endif
+ }
+
+ std::string GetDeviceModelId(const std::string& device_id) override {
++#if BUILDFLAG(IS_OPENBSD)
++ return std::string();
++#endif
+ const std::string file_name = ExtractFileNameFromDeviceId(device_id);
+ std::string usb_id;
+ const std::string vid_path =
+@@ -104,6 +111,9 @@ class DevVideoFilePathsDeviceProvider
+ }
+
+ std::string GetDeviceDisplayName(const std::string& device_id) override {
++#if BUILDFLAG(IS_OPENBSD)
++ return std::string();
++#endif
+ const std::string file_name = ExtractFileNameFromDeviceId(device_id);
+ const std::string interface_path =
+ base::StringPrintf(kInterfacePathTemplate, file_name.c_str());
+@@ -219,7 +229,7 @@ void VideoCaptureDeviceFactoryV4L2::GetDevicesInfo(
+ std::move(callback).Run(std::move(devices_info));
+ }
+
+-int VideoCaptureDeviceFactoryV4L2::DoIoctl(int fd, int request, void* argp) {
++int VideoCaptureDeviceFactoryV4L2::DoIoctl(int fd, unsigned int request, void* argp) {
+ return HANDLE_EINTR(v4l2_->ioctl(fd, request, argp));
+ }
+
diff --git a/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.h b/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.h
new file mode 100644
index 000000000000..892b5de1714d
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_linux_video__capture__device__factory__v4l2.h
@@ -0,0 +1,11 @@
+--- media/capture/video/linux/video_capture_device_factory_v4l2.h.orig 2023-03-30 00:33:53 UTC
++++ media/capture/video/linux/video_capture_device_factory_v4l2.h
+@@ -51,7 +51,7 @@ class CAPTURE_EXPORT VideoCaptureDeviceFactoryV4L2
+
+ private:
+ // Simple wrapper to do HANDLE_EINTR(v4l2_->ioctl(fd, ...)).
+- int DoIoctl(int fd, int request, void* argp);
++ int DoIoctl(int fd, unsigned int request, void* argp);
+
+ VideoCaptureControlSupport GetControlSupport(int fd);
+ bool GetControlSupport(int fd, int control_id);
diff --git a/devel/electron28/files/patch-media_capture_video_video__capture__buffer__tracker__factory__impl.cc b/devel/electron28/files/patch-media_capture_video_video__capture__buffer__tracker__factory__impl.cc
new file mode 100644
index 000000000000..1a1f895f2805
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_video__capture__buffer__tracker__factory__impl.cc
@@ -0,0 +1,20 @@
+--- media/capture/video/video_capture_buffer_tracker_factory_impl.cc.orig 2023-11-29 21:40:06 UTC
++++ media/capture/video/video_capture_buffer_tracker_factory_impl.cc
+@@ -14,7 +14,7 @@
+ #include "media/capture/video/chromeos/gpu_memory_buffer_tracker_cros.h"
+ #elif BUILDFLAG(IS_APPLE)
+ #include "media/capture/video/apple/gpu_memory_buffer_tracker_apple.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "media/capture/video/linux/v4l2_gpu_memory_buffer_tracker.h"
+ #elif BUILDFLAG(IS_WIN)
+ #include "media/capture/video/win/gpu_memory_buffer_tracker_win.h"
+@@ -42,7 +42,7 @@ VideoCaptureBufferTrackerFactoryImpl::CreateTracker(
+ return std::make_unique<GpuMemoryBufferTrackerCros>();
+ #elif BUILDFLAG(IS_APPLE)
+ return std::make_unique<GpuMemoryBufferTrackerApple>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return std::make_unique<V4L2GpuMemoryBufferTracker>();
+ #elif BUILDFLAG(IS_WIN)
+ if (!dxgi_device_manager_) {
diff --git a/devel/electron28/files/patch-media_capture_video_video__capture__device__client.cc b/devel/electron28/files/patch-media_capture_video_video__capture__device__client.cc
new file mode 100644
index 000000000000..e0e91858d530
--- /dev/null
+++ b/devel/electron28/files/patch-media_capture_video_video__capture__device__client.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/video_capture_device_client.cc.orig 2023-11-29 21:40:06 UTC
++++ media/capture/video/video_capture_device_client.cc
+@@ -150,7 +150,7 @@ FourccAndFlip GetFourccAndFlipFromPixelFormat(
+ CHECK(!is_width_odd && !is_height_odd);
+ return {libyuv::FOURCC_UYVY};
+ case media::PIXEL_FORMAT_RGB24:
+- if constexpr (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) {
++ if constexpr (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) {
+ // Linux RGB24 defines red at lowest byte address,
+ // see http://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html.
+ return {libyuv::FOURCC_RAW};
diff --git a/devel/electron28/files/patch-media_cdm_cdm__paths__unittest.cc b/devel/electron28/files/patch-media_cdm_cdm__paths__unittest.cc
new file mode 100644
index 000000000000..e225b2ebe8c7
--- /dev/null
+++ b/devel/electron28/files/patch-media_cdm_cdm__paths__unittest.cc
@@ -0,0 +1,11 @@
+--- media/cdm/cdm_paths_unittest.cc.orig 2022-10-24 13:33:33 UTC
++++ media/cdm/cdm_paths_unittest.cc
+@@ -27,7 +27,7 @@ const char kComponentPlatform[] =
+ "win";
+ #elif BUILDFLAG(IS_CHROMEOS)
+ "cros";
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ "linux";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ "fuchsia";
diff --git a/devel/electron28/files/patch-media_cdm_library__cdm_cdm__paths.gni b/devel/electron28/files/patch-media_cdm_library__cdm_cdm__paths.gni
new file mode 100644
index 000000000000..37e25e725134
--- /dev/null
+++ b/devel/electron28/files/patch-media_cdm_library__cdm_cdm__paths.gni
@@ -0,0 +1,11 @@
+--- media/cdm/library_cdm/cdm_paths.gni.orig 2023-10-19 19:58:27 UTC
++++ media/cdm/library_cdm/cdm_paths.gni
+@@ -15,7 +15,7 @@ assert(enable_library_cdms)
+ # Explicitly define what we use to avoid confusion.
+ if (is_chromeos) {
+ component_os = "cros"
+-} else if (is_linux) {
++} else if (is_linux || is_bsd) {
+ component_os = "linux"
+ } else if (is_win) {
+ component_os = "win"
diff --git a/devel/electron28/files/patch-media_gpu_buffer__validation.cc b/devel/electron28/files/patch-media_gpu_buffer__validation.cc
new file mode 100644
index 000000000000..a94b7b336ba6
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_buffer__validation.cc
@@ -0,0 +1,29 @@
+--- media/gpu/buffer_validation.cc.orig 2023-11-29 21:40:06 UTC
++++ media/gpu/buffer_validation.cc
+@@ -15,7 +15,7 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/gpu_memory_buffer.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <sys/types.h>
+ #include <unistd.h>
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -23,7 +23,7 @@ bool GetFileSize(const int fd, size_t* size) {
+ namespace media {
+
+ bool GetFileSize(const int fd, size_t* size) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (fd < 0) {
+ VLOG(1) << "Invalid file descriptor";
+ return false;
+@@ -77,7 +77,7 @@ bool VerifyGpuMemoryBufferHandle(
+ VLOG(1) << "Unsupported: " << pixel_format;
+ return false;
+ }
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format);
+ if (num_planes != gmb_handle.native_pixmap_handle.planes.size() ||
+ num_planes == 0) {
diff --git a/devel/electron28/files/patch-media_gpu_chromeos_mailbox__video__frame__converter.cc b/devel/electron28/files/patch-media_gpu_chromeos_mailbox__video__frame__converter.cc
new file mode 100644
index 000000000000..33fee31148bc
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_chromeos_mailbox__video__frame__converter.cc
@@ -0,0 +1,11 @@
+--- media/gpu/chromeos/mailbox_video_frame_converter.cc.orig 2023-11-29 21:40:06 UTC
++++ media/gpu/chromeos/mailbox_video_frame_converter.cc
+@@ -59,7 +59,7 @@ viz::SharedImageFormat GetSharedImageFormat(gfx::Buffe
+ << static_cast<int>(buffer_format);
+ NOTREACHED_NORETURN();
+ }
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // If format is true multiplanar format, we prefer external sampler on
+ // ChromeOS and Linux.
+ if (format.is_multi_plane()) {
diff --git a/devel/electron28/files/patch-media_gpu_chromeos_video__decoder__pipeline.cc b/devel/electron28/files/patch-media_gpu_chromeos_video__decoder__pipeline.cc
new file mode 100644
index 000000000000..db8f52bf3c98
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_chromeos_video__decoder__pipeline.cc
@@ -0,0 +1,28 @@
+--- media/gpu/chromeos/video_decoder_pipeline.cc.orig 2023-11-29 21:40:06 UTC
++++ media/gpu/chromeos/video_decoder_pipeline.cc
+@@ -1048,14 +1048,14 @@ VideoDecoderPipeline::PickDecoderOutputFormat(
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_VAAPI)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_VAAPI)
+ // Linux should always use a custom allocator (to allocate buffers using
+ // libva) and a PlatformVideoFramePool.
+ CHECK(allocator.has_value());
+ CHECK(main_frame_pool_->AsPlatformVideoFramePool());
+ main_frame_pool_->AsPlatformVideoFramePool()->SetCustomFrameAllocator(
+ *allocator);
+-#elif BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_V4L2_CODEC)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_V4L2_CODEC)
+ // Linux w/ V4L2 should not use a custom allocator
+ // Only tested with video_decode_accelerator_tests
+ // TODO(wenst@) Test with full Chromium Browser
+@@ -1192,7 +1192,7 @@ VideoDecoderPipeline::PickDecoderOutputFormat(
+ << " VideoFrames";
+ auxiliary_frame_pool_->set_parent_task_runner(decoder_task_runner_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auxiliary_frame_pool_->AsPlatformVideoFramePool()->SetCustomFrameAllocator(
+ *allocator);
+ #endif
diff --git a/devel/electron28/files/patch-media_gpu_gpu__video__encode__accelerator__factory.cc b/devel/electron28/files/patch-media_gpu_gpu__video__encode__accelerator__factory.cc
new file mode 100644
index 000000000000..6132dda3840f
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_gpu__video__encode__accelerator__factory.cc
@@ -0,0 +1,11 @@
+--- media/gpu/gpu_video_encode_accelerator_factory.cc.orig 2023-10-19 19:58:27 UTC
++++ media/gpu/gpu_video_encode_accelerator_factory.cc
+@@ -119,7 +119,7 @@ std::vector<VEAFactoryFunction> GetVEAFactoryFunctions
+ return vea_factory_functions;
+
+ #if BUILDFLAG(USE_VAAPI)
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (base::FeatureList::IsEnabled(kVaapiVideoEncodeLinux))
+ vea_factory_functions.push_back(base::BindRepeating(&CreateVaapiVEA));
+ #else
diff --git a/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.cc b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..d82db796fbc7
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.cc
@@ -0,0 +1,44 @@
+--- media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.cc.orig 2023-08-10 01:48:46 UTC
++++ media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.cc
+@@ -15,7 +15,9 @@
+ #include "media/gpu/vaapi/vaapi_wrapper.h"
+ #endif
+
++#if !BUILDFLAG(IS_BSD)
+ using sandbox::syscall_broker::BrokerFilePermission;
++#endif
+
+ // TODO(b/195769334): the hardware video decoding sandbox is really only useful
+ // when building with VA-API or V4L2 (otherwise, we're not really doing hardware
+@@ -31,6 +33,7 @@ using sandbox::syscall_broker::BrokerFilePermission;
+ namespace media {
+ namespace {
+
++#if !BUILDFLAG(IS_BSD)
+ void AllowAccessToRenderNodes(std::vector<BrokerFilePermission>& permissions,
+ bool include_sys_dev_char,
+ bool read_write) {
+@@ -165,6 +168,7 @@ bool HardwareVideoDecodingPreSandboxHookForV4L2(
+ NOTREACHED_NORETURN();
+ #endif // BUILDFLAG(USE_V4L2_CODEC)
+ }
++#endif
+
+ } // namespace
+
+@@ -180,6 +184,7 @@ bool HardwareVideoDecodingPreSandboxHookForV4L2(
+ // (at least).
+ bool HardwareVideoDecodingPreSandboxHook(
+ sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ using HardwareVideoDecodingProcessPolicy =
+ sandbox::policy::HardwareVideoDecodingProcessPolicy;
+ using PolicyType =
+@@ -217,6 +222,7 @@ bool HardwareVideoDecodingPreSandboxHook(
+ sandbox::policy::SandboxLinux::GetInstance()->StartBrokerProcess(
+ command_set, permissions, sandbox::policy::SandboxLinux::PreSandboxHook(),
+ options);
++#endif
+ return true;
+ }
+
diff --git a/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.h b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.h
new file mode 100644
index 000000000000..767032bf10a4
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__decoding__sandbox__hook__linux.h
@@ -0,0 +1,16 @@
+--- media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h.orig 2023-05-25 00:41:58 UTC
++++ media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h
+@@ -5,7 +5,13 @@
+ #ifndef MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_DECODING_SANDBOX_HOOK_LINUX_H_
+ #define MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_DECODING_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
++
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace media {
+
diff --git a/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.cc b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..d45a585d94e6
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.cc
@@ -0,0 +1,26 @@
+--- media/gpu/sandbox/hardware_video_encoding_sandbox_hook_linux.cc.orig 2023-10-19 19:58:27 UTC
++++ media/gpu/sandbox/hardware_video_encoding_sandbox_hook_linux.cc
+@@ -18,12 +18,15 @@
+ #include "media/gpu/v4l2/v4l2_device.h"
+ #endif
+
++#if !BUILDFLAG(IS_BSD)
+ using sandbox::syscall_broker::BrokerFilePermission;
++#endif
+
+ namespace media {
+
+ bool HardwareVideoEncodingPreSandboxHook(
+ sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ sandbox::syscall_broker::BrokerCommandSet command_set;
+ std::vector<BrokerFilePermission> permissions;
+
+@@ -121,6 +124,7 @@ bool HardwareVideoEncodingPreSandboxHook(
+ return false;
+ }
+ }
++#endif
+ #endif
+ return true;
+ }
diff --git a/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.h b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.h
new file mode 100644
index 000000000000..7134a7a79f35
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_sandbox_hardware__video__encoding__sandbox__hook__linux.h
@@ -0,0 +1,23 @@
+--- media/gpu/sandbox/hardware_video_encoding_sandbox_hook_linux.h.orig 2023-05-25 00:41:58 UTC
++++ media/gpu/sandbox/hardware_video_encoding_sandbox_hook_linux.h
+@@ -5,7 +5,13 @@
+ #ifndef MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_ENCODING_SANDBOX_HOOK_LINUX_H_
+ #define MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_ENCODING_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
++
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace media {
+
+@@ -14,4 +20,4 @@ bool HardwareVideoEncodingPreSandboxHook(
+
+ } // namespace media
+
+-#endif // MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_ENCODING_SANDBOX_HOOK_LINUX_H_
+\ No newline at end of file
++#endif // MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_ENCODING_SANDBOX_HOOK_LINUX_H_
diff --git a/devel/electron28/files/patch-media_gpu_vaapi_vaapi__video__decoder.cc b/devel/electron28/files/patch-media_gpu_vaapi_vaapi__video__decoder.cc
new file mode 100644
index 000000000000..c118867d18e9
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_vaapi_vaapi__video__decoder.cc
@@ -0,0 +1,11 @@
+--- media/gpu/vaapi/vaapi_video_decoder.cc.orig 2023-11-29 21:40:06 UTC
++++ media/gpu/vaapi/vaapi_video_decoder.cc
+@@ -776,7 +776,7 @@ void VaapiVideoDecoder::ApplyResolutionChangeWithScree
+ const gfx::Size decoder_natural_size =
+ aspect_ratio_.GetNaturalSize(decoder_visible_rect);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ absl::optional<DmabufVideoFramePool::CreateFrameCB> allocator =
+ base::BindRepeating(&AllocateCustomFrameProxy, weak_this_);
+ std::vector<ImageProcessor::PixelLayoutCandidate> candidates = {
diff --git a/devel/electron28/files/patch-media_gpu_vaapi_vaapi__wrapper.cc b/devel/electron28/files/patch-media_gpu_vaapi_vaapi__wrapper.cc
new file mode 100644
index 000000000000..981755de7345
--- /dev/null
+++ b/devel/electron28/files/patch-media_gpu_vaapi_vaapi__wrapper.cc
@@ -0,0 +1,47 @@
+--- media/gpu/vaapi/vaapi_wrapper.cc.orig 2023-11-29 21:40:06 UTC
++++ media/gpu/vaapi/vaapi_wrapper.cc
+@@ -71,7 +71,7 @@ using media_gpu_vaapi::kModuleVa_prot;
+ using media_gpu_vaapi::kModuleVa_prot;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/files/file_util.h"
+ #include "base/strings/string_split.h"
+ #endif
+@@ -1445,7 +1445,7 @@ bool IsVBREncodingSupported(VAProfile va_profile) {
+ return VASupportedProfiles::Get().IsProfileSupported(mode, va_profile);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Some VA-API drivers (vdpau-va-driver) will crash if used with VA/DRM on
+ // NVIDIA GPUs. This function checks if such drivers are present.
+ bool IsBrokenNvidiaVaapiDriverPresent() {
+@@ -1506,7 +1506,7 @@ void VADisplayStateSingleton::PreSandboxInitialization
+ VADisplayStateSingleton& va_display_state = GetInstance();
+ base::AutoLock lock(va_display_state.lock_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string va_driver_name;
+ auto env = base::Environment::Create();
+ if (env->GetVar("LIBVA_DRIVER_NAME", &va_driver_name) &&
+@@ -1543,7 +1543,7 @@ void VADisplayStateSingleton::PreSandboxInitialization
+ if (base::EqualsCaseInsensitiveASCII(version_name, "vgem")) {
+ continue;
+ }
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Skip NVIDIA GPUs if the VA-API driver used for them is known for crashing
+ // with VA/DRM.
+ if (is_nvidia_va_drm_broken &&
+@@ -1576,7 +1576,7 @@ VADisplayStateHandle VADisplayStateSingleton::GetHandl
+ return {};
+ }
+
+-#if BUILDFLAG(IS_OZONE) && BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_OZONE) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD))
+ // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
+ // Linux. See comment in OzonePlatform::PlatformProperties::supports_vaapi
+ // for more details. This will also require revisiting everything that's
diff --git a/devel/electron28/files/patch-media_media__options.gni b/devel/electron28/files/patch-media_media__options.gni
new file mode 100644
index 000000000000..2a56612814d5
--- /dev/null
+++ b/devel/electron28/files/patch-media_media__options.gni
@@ -0,0 +1,30 @@
+--- media/media_options.gni.orig 2023-11-29 21:40:06 UTC
++++ media/media_options.gni
+@@ -187,12 +187,15 @@ declare_args() {
+ # Enables runtime selection of ALSA library for audio.
+ use_alsa = false
+
++ # Enable runtime selection of sndio(7)
++ use_sndio = false
++
+ # Alsa should be used on all non-Android, non-Mac POSIX systems - with the
+ # exception of CastOS desktop builds.
+ #
+ # TODO(crbug.com/1336055): Remove legacy target_cpu hack used for targeting
+ # desktop Chromecast builds.
+- if (is_posix && !is_android && !is_apple &&
++ if (is_posix && !is_android && !is_apple && !is_bsd &&
+ (!is_castos || (target_cpu == "x86" || target_cpu == "x64") ||
+ is_cast_audio_only)) {
+ use_alsa = true
+@@ -208,6 +211,10 @@ declare_args() {
+ if (!use_cras && !is_castos && !is_asan && !is_tsan) {
+ use_pulseaudio = true
+ }
++ }
++ if (is_openbsd) {
++ use_sndio = true
++ use_pulseaudio = false
+ }
+ }
+
diff --git a/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.cc b/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.cc
new file mode 100644
index 000000000000..aaf5fc1d8cf7
--- /dev/null
+++ b/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.cc
@@ -0,0 +1,20 @@
+--- media/mojo/mojom/stable/stable_video_decoder_types_mojom_traits.cc.orig 2023-10-19 19:58:27 UTC
++++ media/mojo/mojom/stable/stable_video_decoder_types_mojom_traits.cc
+@@ -837,7 +837,7 @@ const gfx::GpuMemoryBufferId& StructTraits<
+ return input.id;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // static
+ gfx::NativePixmapHandle StructTraits<
+ media::stable::mojom::NativeGpuMemoryBufferHandleDataView,
+@@ -858,7 +858,7 @@ bool StructTraits<media::stable::mojom::NativeGpuMemor
+
+ output->type = gfx::NATIVE_PIXMAP;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!data.ReadPlatformHandle(&output->native_pixmap_handle))
+ return false;
+ return true;
diff --git a/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.h b/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.h
new file mode 100644
index 000000000000..74a5d3a2d4ac
--- /dev/null
+++ b/devel/electron28/files/patch-media_mojo_mojom_stable_stable__video__decoder__types__mojom__traits.h
@@ -0,0 +1,11 @@
+--- media/mojo/mojom/stable/stable_video_decoder_types_mojom_traits.h.orig 2023-10-19 19:58:27 UTC
++++ media/mojo/mojom/stable/stable_video_decoder_types_mojom_traits.h
+@@ -693,7 +693,7 @@ struct StructTraits<media::stable::mojom::NativeGpuMem
+ static const gfx::GpuMemoryBufferId& id(
+ const gfx::GpuMemoryBufferHandle& input);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static gfx::NativePixmapHandle platform_handle(
+ gfx::GpuMemoryBufferHandle& input);
+ #else
diff --git a/devel/electron28/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc b/devel/electron28/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc
new file mode 100644
index 000000000000..abaff21f1ca3
--- /dev/null
+++ b/devel/electron28/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc
@@ -0,0 +1,11 @@
+--- media/mojo/mojom/video_frame_mojom_traits.cc.orig 2022-10-24 13:33:33 UTC
++++ media/mojo/mojom/video_frame_mojom_traits.cc
+@@ -22,7 +22,7 @@
+ #include "ui/gfx/mojom/color_space_mojom_traits.h"
+ #include "ui/gfx/mojom/hdr_metadata_mojom_traits.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/posix/eintr_wrapper.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
diff --git a/devel/electron28/files/patch-media_video_fake__gpu__memory__buffer.cc b/devel/electron28/files/patch-media_video_fake__gpu__memory__buffer.cc
new file mode 100644
index 000000000000..72654e9803f2
--- /dev/null
+++ b/devel/electron28/files/patch-media_video_fake__gpu__memory__buffer.cc
@@ -0,0 +1,38 @@
+--- media/video/fake_gpu_memory_buffer.cc.orig 2022-02-28 16:54:41 UTC
++++ media/video/fake_gpu_memory_buffer.cc
+@@ -9,7 +9,7 @@
+ #include "media/base/format_utils.h"
+ #include "media/base/video_frame.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+@@ -47,7 +47,7 @@ class FakeGpuMemoryBufferImpl : public gpu::GpuMemoryB
+
+ } // namespace
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::ScopedFD GetDummyFD() {
+ base::ScopedFD fd(open("/dev/zero", O_RDWR));
+ DCHECK(fd.is_valid());
+@@ -77,7 +77,7 @@ FakeGpuMemoryBuffer::FakeGpuMemoryBuffer(const gfx::Si
+ static base::AtomicSequenceNumber buffer_id_generator;
+ handle_.id = gfx::GpuMemoryBufferId(buffer_id_generator.GetNext());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ for (size_t i = 0; i < VideoFrame::NumPlanes(video_pixel_format_); i++) {
+ const gfx::Size plane_size_in_bytes =
+ VideoFrame::PlaneSize(video_pixel_format_, i, size_);
+@@ -134,7 +134,7 @@ gfx::GpuMemoryBufferHandle FakeGpuMemoryBuffer::CloneH
+ gfx::GpuMemoryBufferHandle handle;
+ handle.type = gfx::NATIVE_PIXMAP;
+ handle.id = handle_.id;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ handle.native_pixmap_handle =
+ gfx::CloneHandleForIPC(handle_.native_pixmap_handle);
+ #endif
diff --git a/devel/electron28/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc b/devel/electron28/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc
new file mode 100644
index 000000000000..ba84d7d0b0e3
--- /dev/null
+++ b/devel/electron28/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc
@@ -0,0 +1,29 @@
+--- media/video/gpu_memory_buffer_video_frame_pool.cc.orig 2023-11-29 21:40:06 UTC
++++ media/video/gpu_memory_buffer_video_frame_pool.cc
+@@ -774,7 +774,7 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::CreateHa
+ }
+
+ bool is_software_backed_video_frame = !video_frame->HasTextures();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ is_software_backed_video_frame &= !video_frame->HasDmaBufs();
+ #endif
+
+@@ -1224,7 +1224,7 @@ scoped_refptr<VideoFrame> GpuMemoryBufferVideoFramePoo
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ is_webgpu_compatible = (gpu_memory_buffer != nullptr);
+ if (is_webgpu_compatible) {
+ is_webgpu_compatible &=
+@@ -1243,7 +1243,7 @@ scoped_refptr<VideoFrame> GpuMemoryBufferVideoFramePoo
+ gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+ gpu::SHARED_IMAGE_USAGE_SCANOUT;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1241537): Always add the flag once the
+ // OzoneImageBacking is by default turned on.
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter.cc b/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter.cc
new file mode 100644
index 000000000000..5ba12fb5199e
--- /dev/null
+++ b/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter.cc
@@ -0,0 +1,20 @@
+--- media/video/video_encode_accelerator_adapter.cc.orig 2023-11-29 21:40:06 UTC
++++ media/video/video_encode_accelerator_adapter.cc
+@@ -153,7 +153,7 @@ VideoEncodeAccelerator::Config SetUpVeaConfig(
+ if (is_rgb)
+ config.input_format = PIXEL_FORMAT_I420;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (format != PIXEL_FORMAT_I420 ||
+ !VideoFrame::IsStorageTypeMappable(storage_type)) {
+ // ChromeOS/Linux hardware video encoders supports I420 on-memory
+@@ -478,7 +478,7 @@ void VideoEncodeAcceleratorAdapter::InitializeInternal
+ SetUpVeaConfig(profile_, options_, format, first_frame->storage_type(),
+ supported_rc_modes_, required_encoder_type_);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Linux/ChromeOS require a special configuration to use dmabuf storage.
+ // We need to keep sending frames the same way the first frame was sent.
+ // Other platforms will happily mix GpuMemoryBuffer storage with regular
diff --git a/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter__test.cc b/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter__test.cc
new file mode 100644
index 000000000000..f7608ae4b83b
--- /dev/null
+++ b/devel/electron28/files/patch-media_video_video__encode__accelerator__adapter__test.cc
@@ -0,0 +1,11 @@
+--- media/video/video_encode_accelerator_adapter_test.cc.orig 2023-08-10 01:48:46 UTC
++++ media/video/video_encode_accelerator_adapter_test.cc
+@@ -459,7 +459,7 @@ TEST_P(VideoEncodeAcceleratorAdapterTest, TwoFramesRes
+ CreateGreenFrame(large_size, pixel_format, base::Milliseconds(2));
+
+ VideoPixelFormat expected_input_format = PIXEL_FORMAT_I420;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (pixel_format != PIXEL_FORMAT_I420 || !small_frame->IsMappable())
+ expected_input_format = PIXEL_FORMAT_NV12;
+ #endif
diff --git a/devel/electron28/files/patch-media_webrtc_audio__processor.cc b/devel/electron28/files/patch-media_webrtc_audio__processor.cc
new file mode 100644
index 000000000000..04a5b69e342f
--- /dev/null
+++ b/devel/electron28/files/patch-media_webrtc_audio__processor.cc
@@ -0,0 +1,11 @@
+--- media/webrtc/audio_processor.cc.orig 2023-03-30 00:33:54 UTC
++++ media/webrtc/audio_processor.cc
+@@ -513,7 +513,7 @@ absl::optional<double> AudioProcessor::ProcessData(
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+ DCHECK_LE(volume, 1.0);
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || \
+- BUILDFLAG(IS_OPENBSD)
++ BUILDFLAG(IS_BSD)
+ // We have a special situation on Linux where the microphone volume can be
+ // "higher than maximum". The input volume slider in the sound preference
+ // allows the user to set a scaling that is higher than 100%. It means that
diff --git a/devel/electron28/files/patch-media_webrtc_helpers.cc b/devel/electron28/files/patch-media_webrtc_helpers.cc
new file mode 100644
index 000000000000..93f9848f0f02
--- /dev/null
+++ b/devel/electron28/files/patch-media_webrtc_helpers.cc
@@ -0,0 +1,11 @@
+--- media/webrtc/helpers.cc.orig 2023-02-01 18:43:22 UTC
++++ media/webrtc/helpers.cc
+@@ -40,7 +40,7 @@ void ConfigAutomaticGainControl(const AudioProcessingS
+ apm_config.gain_controller2.enabled = false;
+ return;
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Use the Hybrid AGC setup, which combines the AGC1 input volume controller
+ // and the AGC2 digital adaptive controller.
+
diff --git a/devel/electron28/files/patch-media_webrtc_helpers__unittests.cc b/devel/electron28/files/patch-media_webrtc_helpers__unittests.cc
new file mode 100644
index 000000000000..f5ee0232f3e1
--- /dev/null
+++ b/devel/electron28/files/patch-media_webrtc_helpers__unittests.cc
@@ -0,0 +1,29 @@
+--- media/webrtc/helpers_unittests.cc.orig 2023-02-01 18:43:22 UTC
++++ media/webrtc/helpers_unittests.cc
+@@ -39,7 +39,7 @@ TEST(CreateWebRtcAudioProcessingModuleTest, CheckDefau
+ EXPECT_FALSE(config.pre_amplifier.enabled);
+ EXPECT_TRUE(config.echo_canceller.enabled);
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ EXPECT_TRUE(config.gain_controller1.enabled);
+ EXPECT_TRUE(config.gain_controller2.enabled);
+ #elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+@@ -77,7 +77,7 @@ TEST(CreateWebRtcAudioProcessingModuleTest,
+ EXPECT_EQ(config.gain_controller2, kDefaultApmConfig.gain_controller2);
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ TEST(CreateWebRtcAudioProcessingModuleTest,
+ InputVolumeAdjustmentEnabledWithHybridAgc) {
+ ::base::test::ScopedFeatureList feature_list;
+@@ -103,7 +103,7 @@ TEST(CreateWebRtcAudioProcessingModuleTest,
+ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ TEST(CreateWebRtcAudioProcessingModuleTest,
+ OnlyOneInputVolumeControllerEnabledOnDesktopPlatforms) {
+ auto config = CreateApmGetConfig(
diff --git a/devel/electron28/files/patch-mojo_core_BUILD.gn b/devel/electron28/files/patch-mojo_core_BUILD.gn
new file mode 100644
index 000000000000..a47ecdd9ec14
--- /dev/null
+++ b/devel/electron28/files/patch-mojo_core_BUILD.gn
@@ -0,0 +1,11 @@
+--- mojo/core/BUILD.gn.orig 2023-05-25 00:41:59 UTC
++++ mojo/core/BUILD.gn
+@@ -166,7 +166,7 @@ template("core_impl_source_set") {
+ ]
+ }
+
+- if ((is_linux || is_chromeos || is_android) && !is_nacl) {
++ if ((is_linux || is_chromeos || is_android) && !is_nacl && !is_bsd) {
+ sources += [
+ "channel_linux.cc",
+ "channel_linux.h",
diff --git a/devel/electron28/files/patch-mojo_core_channel.cc b/devel/electron28/files/patch-mojo_core_channel.cc
new file mode 100644
index 000000000000..0abd6b8d4eb1
--- /dev/null
+++ b/devel/electron28/files/patch-mojo_core_channel.cc
@@ -0,0 +1,14 @@
+--- mojo/core/channel.cc.orig 2023-03-30 00:33:54 UTC
++++ mojo/core/channel.cc
+@@ -75,7 +75,11 @@ const size_t kMaxUnusedReadBufferCapacity = 4096;
+ // Fuchsia: The zx_channel_write() API supports up to 64 handles.
+ const size_t kMaxAttachedHandles = 64;
+
++#if defined(__i386__) && defined(OS_FREEBSD)
++const size_t kChannelMessageAlignment = 4;
++#else
+ static_assert(alignof(std::max_align_t) >= kChannelMessageAlignment, "");
++#endif
+ Channel::AlignedBuffer MakeAlignedBuffer(size_t size) {
+ // Generic allocators (such as malloc) return a pointer that is suitably
+ // aligned for storing any type of object with a fundamental alignment
diff --git a/devel/electron28/files/patch-mojo_core_embedder_features.h b/devel/electron28/files/patch-mojo_core_embedder_features.h
new file mode 100644
index 000000000000..ae158663d373
--- /dev/null
+++ b/devel/electron28/files/patch-mojo_core_embedder_features.h
@@ -0,0 +1,11 @@
+--- mojo/core/embedder/features.h.orig 2023-05-25 00:41:59 UTC
++++ mojo/core/embedder/features.h
+@@ -16,7 +16,7 @@ namespace core {
+
+ #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && \
+ !BUILDFLAG(MOJO_USE_APPLE_CHANNEL)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
+ BASE_DECLARE_FEATURE(kMojoLinuxChannelSharedMem);
+
diff --git a/devel/electron28/files/patch-mojo_public_c_system_thunks.cc b/devel/electron28/files/patch-mojo_public_c_system_thunks.cc
new file mode 100644
index 000000000000..586b643490c5
--- /dev/null
+++ b/devel/electron28/files/patch-mojo_public_c_system_thunks.cc
@@ -0,0 +1,38 @@
+--- mojo/public/c/system/thunks.cc.orig 2023-11-29 21:40:06 UTC
++++ mojo/public/c/system/thunks.cc
+@@ -24,7 +24,7 @@
+ #include "mojo/public/c/system/message_pipe.h"
+
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/files/file_path.h"
+ #include "base/scoped_native_library.h"
+@@ -73,7 +73,7 @@ class CoreLibraryInitializer {
+
+ MojoResult LoadLibrary(base::FilePath library_path) {
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ if (library_ && library_->is_valid())
+ return MOJO_RESULT_OK;
+
+@@ -87,7 +87,7 @@ class CoreLibraryInitializer {
+
+ if (library_path.empty()) {
+ // Default to looking for the library in the current working directory.
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const base::FilePath::CharType kDefaultLibraryPathValue[] =
+ FILE_PATH_LITERAL("./libmojo_core.so");
+ #elif BUILDFLAG(IS_FUCHSIA)
+@@ -143,7 +143,7 @@ class CoreLibraryInitializer {
+
+ private:
+ #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ absl::optional<base::ScopedNativeLibrary> library_;
+ #endif
+ };
diff --git a/devel/electron28/files/patch-mojo_public_tools_bindings_mojom.gni b/devel/electron28/files/patch-mojo_public_tools_bindings_mojom.gni
new file mode 100644
index 000000000000..6334b11c8428
--- /dev/null
+++ b/devel/electron28/files/patch-mojo_public_tools_bindings_mojom.gni
@@ -0,0 +1,19 @@
+--- mojo/public/tools/bindings/mojom.gni.orig 2023-11-29 21:40:06 UTC
++++ mojo/public/tools/bindings/mojom.gni
+@@ -758,6 +758,16 @@ template("mojom") {
+ enabled_features += [ "is_apple" ]
+ }
+
++ if (is_openbsd) {
++ enabled_features += [ "is_openbsd" ]
++ enabled_features += [ "is_bsd" ]
++ }
++
++ if (is_freebsd) {
++ enabled_features += [ "is_freebsd" ]
++ enabled_features += [ "is_bsd" ]
++ }
++
+ action(parser_target_name) {
+ allow_remote = true
+ custom_processor = "mojom_parser"
diff --git a/devel/electron28/files/patch-net_BUILD.gn b/devel/electron28/files/patch-net_BUILD.gn
new file mode 100644
index 000000000000..1fc6b6ff83da
--- /dev/null
+++ b/devel/electron28/files/patch-net_BUILD.gn
@@ -0,0 +1,78 @@
+--- net/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ net/BUILD.gn
+@@ -122,7 +122,7 @@ net_configs = [
+ "//build/config/compiler:wexit_time_destructors",
+ ]
+
+-if (is_linux || is_chromeos) {
++if ((is_linux || is_chromeos) && !is_bsd) {
+ net_configs += [ "//build/config/linux:libresolv" ]
+ }
+
+@@ -1242,6 +1242,19 @@ component("net") {
+ ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "base/address_map_cache_linux.cc",
++ "base/address_map_cache_linux.h",
++ "base/address_map_linux.cc",
++ "base/address_map_linux.h",
++ "base/address_tracker_linux.cc",
++ "base/address_tracker_linux.h",
++ "base/network_change_notifier_linux.cc",
++ "base/network_interfaces_linux.cc",
++ ]
++ }
++
+ if (is_mac) {
+ sources += [
+ "base/network_notification_thread_mac.cc",
+@@ -1398,7 +1411,7 @@ component("net") {
+ }
+
+ # Use getifaddrs() on POSIX platforms, except Linux.
+- if (is_posix && !is_linux && !is_chromeos) {
++ if ((is_posix && !is_linux && !is_chromeos) || is_bsd) {
+ sources += [
+ "base/network_interfaces_getifaddrs.cc",
+ "base/network_interfaces_getifaddrs.h",
+@@ -2888,7 +2901,7 @@ test("net_unittests") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "base/address_tracker_linux_unittest.cc",
+ "base/network_interfaces_linux_unittest.cc",
+@@ -2976,6 +2989,10 @@ test("net_unittests") {
+ ]
+ }
+
++ if (is_bsd) {
++ deps += [ "//sandbox/policy" ]
++ }
++
+ if (enable_websockets) {
+ deps += [ "//net/server:tests" ]
+ }
+@@ -3046,7 +3063,7 @@ test("net_unittests") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [ "tools/quic/quic_simple_server_test.cc" ]
+ }
+
+@@ -3181,7 +3198,7 @@ test("net_unittests") {
+ }
+
+ # Use getifaddrs() on POSIX platforms, except Linux.
+- if (is_posix && !is_linux && !is_chromeos) {
++ if (is_posix && !is_linux && !is_chromeos && !is_bsd) {
+ sources += [ "base/network_interfaces_getifaddrs_unittest.cc" ]
+ }
+
diff --git a/devel/electron28/files/patch-net_base_features.cc b/devel/electron28/files/patch-net_base_features.cc
new file mode 100644
index 000000000000..2be5ba67eb7e
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_features.cc
@@ -0,0 +1,15 @@
+--- net/base/features.cc.orig 2023-12-20 07:12:20 UTC
++++ net/base/features.cc
+@@ -472,7 +472,12 @@ BASE_FEATURE(kSpdyHeadersToHttpResponseUseBuilder,
+ "SpdyHeadersToHttpResponseUseBuilder",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
++#if BUILDFLAG(IS_OPENBSD)
++// No IP_RECVTOS support
+ BASE_FEATURE(kReceiveEcn, "ReceiveEcn", base::FEATURE_DISABLED_BY_DEFAULT);
++#else
++BASE_FEATURE(kReceiveEcn, "ReceiveEcn", base::FEATURE_DISABLED_BY_DEFAULT);
++#endif
+
+ // TODO(crbug.com/634470): Remove this feature flag in January 2024 if the new
+ // limit sticks.
diff --git a/devel/electron28/files/patch-net_base_mock__network__change__notifier.cc b/devel/electron28/files/patch-net_base_mock__network__change__notifier.cc
new file mode 100644
index 000000000000..c03d3070a457
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_mock__network__change__notifier.cc
@@ -0,0 +1,11 @@
+--- net/base/mock_network_change_notifier.cc.orig 2023-08-10 01:48:47 UTC
++++ net/base/mock_network_change_notifier.cc
+@@ -103,7 +103,7 @@ MockNetworkChangeNotifier::GetCurrentConnectionCost()
+ return connection_cost_;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ AddressMapOwnerLinux* MockNetworkChangeNotifier::GetAddressMapOwnerInternal() {
+ return address_map_owner_;
+ }
diff --git a/devel/electron28/files/patch-net_base_mock__network__change__notifier.h b/devel/electron28/files/patch-net_base_mock__network__change__notifier.h
new file mode 100644
index 000000000000..a9375c70dee1
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_mock__network__change__notifier.h
@@ -0,0 +1,20 @@
+--- net/base/mock_network_change_notifier.h.orig 2023-08-10 01:48:47 UTC
++++ net/base/mock_network_change_notifier.h
+@@ -84,7 +84,7 @@ class MockNetworkChangeNotifier : public NetworkChange
+ // use_default_connection_cost_implementation is set to true.
+ ConnectionCost GetCurrentConnectionCost() override;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SetAddressMapOwnerLinux(AddressMapOwnerLinux* address_map_owner) {
+ address_map_owner_ = address_map_owner;
+ }
+@@ -104,7 +104,7 @@ class MockNetworkChangeNotifier : public NetworkChange
+ bool use_default_connection_cost_implementation_ = false;
+ NetworkChangeNotifier::NetworkList connected_networks_;
+ std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ raw_ptr<AddressMapOwnerLinux> address_map_owner_ = nullptr;
+ #endif
+ };
diff --git a/devel/electron28/files/patch-net_base_network__change__notifier.cc b/devel/electron28/files/patch-net_base_network__change__notifier.cc
new file mode 100644
index 000000000000..7fba2fee11aa
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_network__change__notifier.cc
@@ -0,0 +1,21 @@
+--- net/base/network_change_notifier.cc.orig 2023-05-25 00:42:00 UTC
++++ net/base/network_change_notifier.cc
+@@ -37,7 +37,7 @@
+ #include "net/base/network_change_notifier_linux.h"
+ #elif BUILDFLAG(IS_APPLE)
+ #include "net/base/network_change_notifier_mac.h"
+-#elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "net/base/network_change_notifier_passive.h"
+ #elif BUILDFLAG(IS_FUCHSIA)
+ #include "net/base/network_change_notifier_fuchsia.h"
+@@ -329,6 +329,9 @@ std::unique_ptr<NetworkChangeNotifier> NetworkChangeNo
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return std::make_unique<NetworkChangeNotifierFuchsia>(
+ /*require_wlan=*/false);
++#elif BUILDFLAG(IS_BSD)
++ return std::make_unique<MockNetworkChangeNotifier>(
++ /*dns_config_notifier*/nullptr);
+ #else
+ NOTIMPLEMENTED();
+ return nullptr;
diff --git a/devel/electron28/files/patch-net_base_network__change__notifier__passive.cc b/devel/electron28/files/patch-net_base_network__change__notifier__passive.cc
new file mode 100644
index 000000000000..c9075b11c3ea
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_network__change__notifier__passive.cc
@@ -0,0 +1,11 @@
+--- net/base/network_change_notifier_passive.cc.orig 2023-05-25 00:42:00 UTC
++++ net/base/network_change_notifier_passive.cc
+@@ -107,7 +107,7 @@ NetworkChangeNotifierPassive::GetAddressMapOwnerIntern
+ NetworkChangeNotifier::NetworkChangeCalculatorParams
+ NetworkChangeNotifierPassive::NetworkChangeCalculatorParamsPassive() {
+ NetworkChangeCalculatorParams params;
+-#if BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Delay values arrived at by simple experimentation and adjusted so as to
+ // produce a single signal when switching between network connections.
+ params.ip_address_offline_delay_ = base::Milliseconds(4000);
diff --git a/devel/electron28/files/patch-net_base_network__interfaces__posix.h b/devel/electron28/files/patch-net_base_network__interfaces__posix.h
new file mode 100644
index 000000000000..cb3379e3ba8d
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_network__interfaces__posix.h
@@ -0,0 +1,11 @@
+--- net/base/network_interfaces_posix.h.orig 2022-02-07 13:39:41 UTC
++++ net/base/network_interfaces_posix.h
+@@ -8,6 +8,8 @@
+ // This file provides some basic functionality shared between
+ // network_interfaces_linux.cc and network_interfaces_getifaddrs.cc.
+
++#include <sys/socket.h>
++
+ #include <string>
+
+ struct sockaddr;
diff --git a/devel/electron28/files/patch-net_base_sockaddr__util__posix.cc b/devel/electron28/files/patch-net_base_sockaddr__util__posix.cc
new file mode 100644
index 000000000000..825c0490c3f1
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_sockaddr__util__posix.cc
@@ -0,0 +1,12 @@
+--- net/base/sockaddr_util_posix.cc.orig 2022-07-22 17:30:31 UTC
++++ net/base/sockaddr_util_posix.cc
+@@ -41,7 +41,8 @@ bool FillUnixAddress(const std::string& socket_path,
+ return true;
+ }
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
++ // XXX ?
+ // Convert the path given into abstract socket name. It must start with
+ // the '\0' character, so we are adding it. |addr_len| must specify the
+ // length of the structure exactly, as potentially the socket name may
diff --git a/devel/electron28/files/patch-net_base_sockaddr__util__posix__unittest.cc b/devel/electron28/files/patch-net_base_sockaddr__util__posix__unittest.cc
new file mode 100644
index 000000000000..50ed6dc7f90d
--- /dev/null
+++ b/devel/electron28/files/patch-net_base_sockaddr__util__posix__unittest.cc
@@ -0,0 +1,12 @@
+--- net/base/sockaddr_util_posix_unittest.cc.orig 2022-06-17 14:20:10 UTC
++++ net/base/sockaddr_util_posix_unittest.cc
+@@ -83,7 +83,8 @@ TEST(FillUnixAddressTest, AbstractLinuxAddress) {
+ size_t path_max = MaxPathLength(&storage);
+ std::string path(path_max, '0');
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
++ // XXX?
+ EXPECT_TRUE(FillUnixAddress(path, /*use_abstract_namespace=*/true, &storage));
+
+ EXPECT_EQ(path.size() + 1U + offsetof(struct sockaddr_un, sun_path),
diff --git a/devel/electron28/files/patch-net_cert_cert__verify__proc.h b/devel/electron28/files/patch-net_cert_cert__verify__proc.h
new file mode 100644
index 000000000000..1e7bb88cd1b1
--- /dev/null
+++ b/devel/electron28/files/patch-net_cert_cert__verify__proc.h
@@ -0,0 +1,11 @@
+--- net/cert/cert_verify_proc.h.orig 2023-08-10 01:48:47 UTC
++++ net/cert/cert_verify_proc.h
+@@ -79,7 +79,7 @@ class NET_EXPORT CertVerifyProc
+ kMaxValue = kChainLengthOne
+ };
+
+-#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
++#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(CHROME_ROOT_STORE_ONLY))
+ // Creates and returns a CertVerifyProc that uses the system verifier.
+ // |cert_net_fetcher| may not be used, depending on the implementation.
diff --git a/devel/electron28/files/patch-net_cert_pki_general__names.h b/devel/electron28/files/patch-net_cert_pki_general__names.h
new file mode 100644
index 000000000000..220f929c71ad
--- /dev/null
+++ b/devel/electron28/files/patch-net_cert_pki_general__names.h
@@ -0,0 +1,10 @@
+--- net/cert/pki/general_names.h.orig 2023-11-29 21:40:07 UTC
++++ net/cert/pki/general_names.h
+@@ -8,6 +8,7 @@
+ #include <memory>
+ #include <string_view>
+ #include <vector>
++#include <string>
+
+ #include "net/base/net_export.h"
+ #include "net/cert/pki/cert_error_id.h"
diff --git a/devel/electron28/files/patch-net_disk__cache_simple_simple__file__tracker.cc b/devel/electron28/files/patch-net_disk__cache_simple_simple__file__tracker.cc
new file mode 100644
index 000000000000..ea6580b0cab2
--- /dev/null
+++ b/devel/electron28/files/patch-net_disk__cache_simple_simple__file__tracker.cc
@@ -0,0 +1,20 @@
+--- net/disk_cache/simple/simple_file_tracker.cc.orig 2022-06-17 14:20:10 UTC
++++ net/disk_cache/simple/simple_file_tracker.cc
+@@ -29,7 +29,17 @@ void RecordFileDescripterLimiterOp(FileDescriptorLimit
+ } // namespace
+
+ SimpleFileTracker::SimpleFileTracker(int file_limit)
++#if defined(OS_OPENBSD)
++{
++ // cap the file descriptor limit at 85% of the size of the
++ // file descriptor table and also substract the amount of
++ // currently used file descriptors as this should give us
++ // enough reserve to avoid hitting the limit
++ file_limit_ = (getdtablesize() * 0.85) - getdtablecount();
++}
++#else
+ : file_limit_(file_limit) {}
++#endif
+
+ SimpleFileTracker::~SimpleFileTracker() {
+ DCHECK(lru_.empty());
diff --git a/devel/electron28/files/patch-net_dns_BUILD.gn b/devel/electron28/files/patch-net_dns_BUILD.gn
new file mode 100644
index 000000000000..ace61b87cb0b
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_BUILD.gn
@@ -0,0 +1,31 @@
+--- net/dns/BUILD.gn.orig 2023-08-20 00:00:07 UTC
++++ net/dns/BUILD.gn
+@@ -128,7 +128,7 @@ source_set("dns") {
+ "dns_config_service_android.cc",
+ "dns_config_service_android.h",
+ ]
+- } else if (is_linux) {
++ } else if (is_linux && !is_bsd) {
+ sources += [
+ "dns_config_service_linux.cc",
+ "dns_config_service_linux.h",
+@@ -169,6 +169,7 @@ source_set("dns") {
+ ":host_resolver_manager",
+ ":mdns_client",
+ "//net:net_public_deps",
++ "//printing/buildflags",
+ ]
+
+ allow_circular_includes_from = [
+@@ -436,9 +437,9 @@ source_set("tests") {
+
+ if (is_android) {
+ sources += [ "dns_config_service_android_unittest.cc" ]
+- } else if (is_linux) {
++ } else if (is_linux && !is_bsd) {
+ sources += [ "dns_config_service_linux_unittest.cc" ]
+- } else if (is_posix) {
++ } else if (is_posix && !is_bsd) {
+ sources += [ "dns_config_service_posix_unittest.cc" ]
+ }
+
diff --git a/devel/electron28/files/patch-net_dns_address__info.cc b/devel/electron28/files/patch-net_dns_address__info.cc
new file mode 100644
index 000000000000..9b53f037ffa4
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_address__info.cc
@@ -0,0 +1,16 @@
+--- net/dns/address_info.cc.orig 2023-10-19 19:58:28 UTC
++++ net/dns/address_info.cc
+@@ -77,8 +77,12 @@ AddressInfo::AddressInfoAndResult AddressInfo::Get(
+ // error.
+ // http://crbug.com/134142
+ err = ERR_NAME_NOT_RESOLVED;
+-#elif BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_FREEBSD)
++#elif BUILDFLAG(IS_POSIX)
++#ifdef EAI_NODATA
+ if (os_error != EAI_NONAME && os_error != EAI_NODATA)
++#else
++ if (os_error != EAI_NONAME)
++#endif
+ err = ERR_NAME_RESOLUTION_FAILED;
+ #endif
+
diff --git a/devel/electron28/files/patch-net_dns_address__sorter__posix.cc b/devel/electron28/files/patch-net_dns_address__sorter__posix.cc
new file mode 100644
index 000000000000..5f8999b1e61d
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_address__sorter__posix.cc
@@ -0,0 +1,10 @@
+--- net/dns/address_sorter_posix.cc.orig 2023-05-25 00:42:00 UTC
++++ net/dns/address_sorter_posix.cc
+@@ -27,6 +27,7 @@
+ #include "net/dns/netinet_in_var_ios.h"
+ #else
+ #include <netinet/in_var.h>
++#include <netinet6/in6_var.h>
+ #endif // BUILDFLAG(IS_IOS)
+ #endif
+
diff --git a/devel/electron28/files/patch-net_dns_dns__config__service__posix.cc b/devel/electron28/files/patch-net_dns_dns__config__service__posix.cc
new file mode 100644
index 000000000000..f54393c1baf8
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_dns__config__service__posix.cc
@@ -0,0 +1,27 @@
+--- net/dns/dns_config_service_posix.cc.orig 2023-02-15 13:08:44 UTC
++++ net/dns/dns_config_service_posix.cc
+@@ -34,6 +34,11 @@
+ #include "net/dns/dns_config_watcher_mac.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include "base/command_line.h"
++#include "sandbox/policy/switches.h"
++#endif
++
+ namespace net {
+
+ namespace internal {
+@@ -130,6 +135,12 @@ class DnsConfigServicePosix::Watcher : public DnsConfi
+
+ bool Watch() override {
+ CheckOnCorrectSequence();
++
++// pledge + unveil
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ if (!command_line->HasSwitch(sandbox::policy::switches::kNoSandbox))
++ return false;
++
+ bool success = true;
+ #if !IS_MAS_BUILD()
+ if (!config_watcher_.Watch(base::BindRepeating(&Watcher::OnConfigChanged,
diff --git a/devel/electron28/files/patch-net_dns_dns__reloader.cc b/devel/electron28/files/patch-net_dns_dns__reloader.cc
new file mode 100644
index 000000000000..9a8ed94039dc
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_dns__reloader.cc
@@ -0,0 +1,10 @@
+--- net/dns/dns_reloader.cc.orig 2023-03-30 00:33:54 UTC
++++ net/dns/dns_reloader.cc
+@@ -10,6 +10,7 @@
+ // - there's not guarantee it exists at all. :(
+ #if BUILDFLAG(IS_POSIX)
+
++#include <netinet/in.h>
+ #include <resolv.h>
+
+ // This code only works on systems where the C library provides res_ninit(3) and
diff --git a/devel/electron28/files/patch-net_dns_dns__util.cc b/devel/electron28/files/patch-net_dns_dns__util.cc
new file mode 100644
index 000000000000..7de4f95330dc
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_dns__util.cc
@@ -0,0 +1,11 @@
+--- net/dns/dns_util.cc.orig 2023-02-01 18:43:23 UTC
++++ net/dns/dns_util.cc
+@@ -29,6 +29,8 @@
+ #include "net/dns/public/util.h"
+ #include "net/third_party/uri_template/uri_template.h"
+
++#include <sys/socket.h>
++
+ #if BUILDFLAG(IS_POSIX)
+ #include <net/if.h>
+ #include <netinet/in.h>
diff --git a/devel/electron28/files/patch-net_dns_host__resolver__proc.cc b/devel/electron28/files/patch-net_dns_host__resolver__proc.cc
new file mode 100644
index 000000000000..3e1336aaa4eb
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_host__resolver__proc.cc
@@ -0,0 +1,13 @@
+--- net/dns/host_resolver_proc.cc.orig 2022-11-30 08:12:58 UTC
++++ net/dns/host_resolver_proc.cc
+@@ -15,10 +15,6 @@
+ #include "net/base/net_errors.h"
+ #include "net/dns/host_resolver_system_task.h"
+
+-#if BUILDFLAG(IS_OPENBSD)
+-#define AI_ADDRCONFIG 0
+-#endif
+-
+ namespace net {
+
+ HostResolverProc* HostResolverProc::default_proc_ = nullptr;
diff --git a/devel/electron28/files/patch-net_dns_public_BUILD.gn b/devel/electron28/files/patch-net_dns_public_BUILD.gn
new file mode 100644
index 000000000000..dbafaec5f0f6
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_public_BUILD.gn
@@ -0,0 +1,11 @@
+--- net/dns/public/BUILD.gn.orig 2023-11-29 21:40:07 UTC
++++ net/dns/public/BUILD.gn
+@@ -77,7 +77,7 @@ source_set("tests") {
+ "doh_provider_entry_unittest.cc",
+ ]
+
+- if (is_posix && !is_android) {
++ if (is_posix && !is_android && !is_bsd) {
+ sources += [ "resolv_reader_unittest.cc" ]
+ }
+
diff --git a/devel/electron28/files/patch-net_dns_public_resolv__reader.h b/devel/electron28/files/patch-net_dns_public_resolv__reader.h
new file mode 100644
index 000000000000..8e97c9b36f33
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_public_resolv__reader.h
@@ -0,0 +1,10 @@
+--- net/dns/public/resolv_reader.h.orig 2022-02-28 16:54:41 UTC
++++ net/dns/public/resolv_reader.h
+@@ -5,6 +5,7 @@
+ #ifndef NET_DNS_PUBLIC_RESOLV_READER_H_
+ #define NET_DNS_PUBLIC_RESOLV_READER_H_
+
++#include <netinet/in.h>
+ #include <resolv.h>
+
+ #include <memory>
diff --git a/devel/electron28/files/patch-net_dns_public_scoped__res__state.h b/devel/electron28/files/patch-net_dns_public_scoped__res__state.h
new file mode 100644
index 000000000000..b31a6ae09de1
--- /dev/null
+++ b/devel/electron28/files/patch-net_dns_public_scoped__res__state.h
@@ -0,0 +1,10 @@
+--- net/dns/public/scoped_res_state.h.orig 2022-02-28 16:54:41 UTC
++++ net/dns/public/scoped_res_state.h
+@@ -5,6 +5,7 @@
+ #ifndef NET_DNS_PUBLIC_SCOPED_RES_STATE_H_
+ #define NET_DNS_PUBLIC_SCOPED_RES_STATE_H_
+
++#include <netinet/in.h>
+ #include <resolv.h>
+
+ #include "build/build_config.h"
diff --git a/devel/electron28/files/patch-net_filter_zstd__source__stream.cc b/devel/electron28/files/patch-net_filter_zstd__source__stream.cc
new file mode 100644
index 000000000000..9bd3ce173f25
--- /dev/null
+++ b/devel/electron28/files/patch-net_filter_zstd__source__stream.cc
@@ -0,0 +1,10 @@
+--- net/filter/zstd_source_stream.cc.orig 2023-10-19 19:58:28 UTC
++++ net/filter/zstd_source_stream.cc
+@@ -6,6 +6,7 @@
+
+ #include <algorithm>
+ #include <utility>
++#include <unordered_map>
+
+ #define ZSTD_STATIC_LINKING_ONLY
+
diff --git a/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.cc b/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.cc
new file mode 100644
index 000000000000..920576227b0d
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.cc
@@ -0,0 +1,14 @@
+--- net/http/http_auth_gssapi_posix.cc.orig 2023-05-25 00:42:00 UTC
++++ net/http/http_auth_gssapi_posix.cc
+@@ -370,8 +370,9 @@ base::NativeLibrary GSSAPISharedLibrary::LoadSharedLib
+ static const char* const kDefaultLibraryNames[] = {
+ #if BUILDFLAG(IS_APPLE)
+ "/System/Library/Frameworks/GSS.framework/GSS"
+-#elif BUILDFLAG(IS_OPENBSD)
+- "libgssapi.so" // Heimdal - OpenBSD
++#elif BUILDFLAG(IS_BSD)
++ "libgssapi_krb5.so.2", // MIT Kerberos - FreeBSD
++ "libgssapi.so" // Heimdal - OpenBSD, FreeBSD
+ #else
+ "libgssapi_krb5.so.2", // MIT Kerberos - FC, Suse10, Debian
+ "libgssapi.so.4", // Heimdal - Suse10, MDK
diff --git a/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.h b/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.h
new file mode 100644
index 000000000000..a5df8462e3a1
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__auth__gssapi__posix.h
@@ -0,0 +1,12 @@
+--- net/http/http_auth_gssapi_posix.h.orig 2022-08-31 12:19:35 UTC
++++ net/http/http_auth_gssapi_posix.h
+@@ -21,6 +21,9 @@
+ #if BUILDFLAG(IS_APPLE)
+ #include <GSS/gssapi.h>
+ #elif BUILDFLAG(IS_FREEBSD)
++#ifndef GSS_C_DELEG_POLICY_FLAG
++#define GSS_C_DELEG_POLICY_FLAG 32768
++#endif
+ #include <gssapi/gssapi.h>
+ #else
+ #include <gssapi.h>
diff --git a/devel/electron28/files/patch-net_http_http__auth__handler__negotiate.cc b/devel/electron28/files/patch-net_http_http__auth__handler__negotiate.cc
new file mode 100644
index 000000000000..c3fa7a302e69
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__auth__handler__negotiate.cc
@@ -0,0 +1,11 @@
+--- net/http/http_auth_handler_negotiate.cc.orig 2023-10-19 19:58:28 UTC
++++ net/http/http_auth_handler_negotiate.cc
+@@ -121,7 +121,7 @@ int HttpAuthHandlerNegotiate::Factory::CreateAuthHandl
+ #elif BUILDFLAG(IS_POSIX)
+ if (is_unsupported_)
+ return ERR_UNSUPPORTED_AUTH_SCHEME;
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Note: Don't set is_unsupported_ = true here. AllowGssapiLibraryLoad()
+ // might change to true during a session.
+ if (!http_auth_preferences() ||
diff --git a/devel/electron28/files/patch-net_http_http__auth__preferences.cc b/devel/electron28/files/patch-net_http_http__auth__preferences.cc
new file mode 100644
index 000000000000..d30b0907f30e
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__auth__preferences.cc
@@ -0,0 +1,11 @@
+--- net/http/http_auth_preferences.cc.orig 2023-10-19 19:58:28 UTC
++++ net/http/http_auth_preferences.cc
+@@ -39,7 +39,7 @@ std::string HttpAuthPreferences::AuthAndroidNegotiateA
+ }
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool HttpAuthPreferences::AllowGssapiLibraryLoad() const {
+ return allow_gssapi_library_load_;
+ }
diff --git a/devel/electron28/files/patch-net_http_http__auth__preferences.h b/devel/electron28/files/patch-net_http_http__auth__preferences.h
new file mode 100644
index 000000000000..1dd6c8db3248
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__auth__preferences.h
@@ -0,0 +1,29 @@
+--- net/http/http_auth_preferences.h.orig 2023-10-19 19:58:28 UTC
++++ net/http/http_auth_preferences.h
+@@ -50,7 +50,7 @@ class NET_EXPORT HttpAuthPreferences {
+ #if BUILDFLAG(IS_ANDROID)
+ virtual std::string AuthAndroidNegotiateAccountType() const;
+ #endif
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ virtual bool AllowGssapiLibraryLoad() const;
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+ virtual bool CanUseDefaultCredentials(
+@@ -86,7 +86,7 @@ class NET_EXPORT HttpAuthPreferences {
+ }
+ #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void set_allow_gssapi_library_load(bool allow_gssapi_library_load) {
+ allow_gssapi_library_load_ = allow_gssapi_library_load;
+ }
+@@ -137,7 +137,7 @@ class NET_EXPORT HttpAuthPreferences {
+ std::string auth_android_negotiate_account_type_;
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool allow_gssapi_library_load_ = true;
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-net_http_http__network__session.cc b/devel/electron28/files/patch-net_http_http__network__session.cc
new file mode 100644
index 000000000000..b1e15c11990a
--- /dev/null
+++ b/devel/electron28/files/patch-net_http_http__network__session.cc
@@ -0,0 +1,12 @@
+--- net/http/http_network_session.cc.orig 2023-02-01 18:43:23 UTC
++++ net/http/http_network_session.cc
+@@ -19,7 +19,9 @@
+ #include "build/build_config.h"
+ #include "net/base/features.h"
+ #include "net/dns/host_resolver.h"
++#if defined(USE_KERBEROS)
+ #include "net/http/http_auth_handler_factory.h"
++#endif
+ #include "net/http/http_response_body_drainer.h"
+ #include "net/http/http_stream_factory.h"
+ #include "net/http/url_security_manager.h"
diff --git a/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service.cc b/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service.cc
new file mode 100644
index 000000000000..1a4a43ada141
--- /dev/null
+++ b/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service.cc
@@ -0,0 +1,35 @@
+--- net/proxy_resolution/proxy_config_service.cc.orig 2023-03-30 00:33:55 UTC
++++ net/proxy_resolution/proxy_config_service.cc
+@@ -19,20 +19,20 @@
+ #include "net/proxy_resolution/proxy_config_service_ios.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "net/proxy_resolution/proxy_config_service_mac.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "net/proxy_resolution/proxy_config_service_linux.h"
+ #elif BUILDFLAG(IS_ANDROID)
+ #include "net/proxy_resolution/proxy_config_service_android.h"
+ #endif
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "net/traffic_annotation/network_traffic_annotation.h"
+ #endif
+
+ namespace net {
+
+ namespace {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ constexpr net::NetworkTrafficAnnotationTag kSystemProxyConfigTrafficAnnotation =
+ net::DefineNetworkTrafficAnnotation("proxy_config_system", R"(
+ semantics {
+@@ -108,7 +108,7 @@ ProxyConfigService::CreateSystemProxyConfigService(
+ << "profile_io_data.cc::CreateProxyConfigService and this should "
+ << "be used only for examples.";
+ return std::make_unique<UnsetProxyConfigService>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<ProxyConfigServiceLinux> linux_config_service(
+ std::make_unique<ProxyConfigServiceLinux>());
+
diff --git a/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service__linux.cc b/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
new file mode 100644
index 000000000000..ae2949bf4e4c
--- /dev/null
+++ b/devel/electron28/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
@@ -0,0 +1,40 @@
+--- net/proxy_resolution/proxy_config_service_linux.cc.orig 2023-05-25 00:42:00 UTC
++++ net/proxy_resolution/proxy_config_service_linux.cc
+@@ -6,7 +6,9 @@
+
+ #include <errno.h>
+ #include <limits.h>
++#if !BUILDFLAG(IS_BSD)
+ #include <sys/inotify.h>
++#endif
+ #include <unistd.h>
+
+ #include <map>
+@@ -504,6 +506,7 @@ bool SettingGetterImplGSettings::CheckVersion(
+ }
+ #endif // defined(USE_GIO)
+
++#if !BUILDFLAG(IS_BSD)
+ // Converts |value| from a decimal string to an int. If there was a failure
+ // parsing, returns |default_value|.
+ int StringToIntOrDefault(base::StringPiece value, int default_value) {
+@@ -1032,6 +1035,7 @@ class SettingGetterImplKDE : public ProxyConfigService
+ // events on.
+ scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
+ };
++#endif
+
+ } // namespace
+
+@@ -1249,9 +1253,11 @@ ProxyConfigServiceLinux::Delegate::Delegate(
+ case base::nix::DESKTOP_ENVIRONMENT_KDE4:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE5:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE6:
++#if !BUILDFLAG(IS_BSD)
+ setting_getter_ =
+ std::make_unique<SettingGetterImplKDE>(env_var_getter_.get());
+ break;
++#endif
+ case base::nix::DESKTOP_ENVIRONMENT_XFCE:
+ case base::nix::DESKTOP_ENVIRONMENT_LXQT:
+ case base::nix::DESKTOP_ENVIRONMENT_OTHER:
diff --git a/devel/electron28/files/patch-net_socket_socket__posix.cc b/devel/electron28/files/patch-net_socket_socket__posix.cc
new file mode 100644
index 000000000000..665305fd5623
--- /dev/null
+++ b/devel/electron28/files/patch-net_socket_socket__posix.cc
@@ -0,0 +1,11 @@
+--- net/socket/socket_posix.cc.orig 2022-07-22 17:30:31 UTC
++++ net/socket/socket_posix.cc
+@@ -516,7 +516,7 @@ void SocketPosix::ReadCompleted() {
+ }
+
+ int SocketPosix::DoWrite(IOBuffer* buf, int buf_len) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Disable SIGPIPE for this write. Although Chromium globally disables
+ // SIGPIPE, the net stack may be used in other consumers which do not do
+ // this. MSG_NOSIGNAL is a Linux-only API. On OS X, this is a setsockopt on
diff --git a/devel/electron28/files/patch-net_socket_socks5__client__socket.cc b/devel/electron28/files/patch-net_socket_socks5__client__socket.cc
new file mode 100644
index 000000000000..d80844cdf1be
--- /dev/null
+++ b/devel/electron28/files/patch-net_socket_socks5__client__socket.cc
@@ -0,0 +1,12 @@
+--- net/socket/socks5_client_socket.cc.orig 2022-04-21 18:48:31 UTC
++++ net/socket/socks5_client_socket.cc
+@@ -19,6 +19,9 @@
+ #include "net/log/net_log_event_type.h"
+ #include "net/traffic_annotation/network_traffic_annotation.h"
+
++#include <sys/types.h>
++#include <netinet/in.h>
++
+ namespace net {
+
+ const unsigned int SOCKS5ClientSocket::kGreetReadHeaderSize = 2;
diff --git a/devel/electron28/files/patch-net_socket_tcp__socket__posix.cc b/devel/electron28/files/patch-net_socket_tcp__socket__posix.cc
new file mode 100644
index 000000000000..de9944328b67
--- /dev/null
+++ b/devel/electron28/files/patch-net_socket_tcp__socket__posix.cc
@@ -0,0 +1,20 @@
+--- net/socket/tcp_socket_posix.cc.orig 2023-05-25 00:42:00 UTC
++++ net/socket/tcp_socket_posix.cc
+@@ -98,6 +98,17 @@ bool SetTCPKeepAlive(int fd, bool enable, int delay) {
+ PLOG(ERROR) << "Failed to set TCP_KEEPALIVE on fd: " << fd;
+ return false;
+ }
++#elif BUILDFLAG(IS_FREEBSD)
++ // Set seconds until first TCP keep alive.
++ if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay))) {
++ PLOG(ERROR) << "Failed to set TCP_KEEPIDLE on fd: " << fd;
++ return false;
++ }
++ // Set seconds between TCP keep alives.
++ if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &delay, sizeof(delay))) {
++ PLOG(ERROR) << "Failed to set TCP_KEEPINTVL on fd: " << fd;
++ return false;
++ }
+ #endif
+ }
+
diff --git a/devel/electron28/files/patch-net_socket_udp__socket__posix.cc b/devel/electron28/files/patch-net_socket_udp__socket__posix.cc
new file mode 100644
index 000000000000..88bded32bca1
--- /dev/null
+++ b/devel/electron28/files/patch-net_socket_udp__socket__posix.cc
@@ -0,0 +1,39 @@
+--- net/socket/udp_socket_posix.cc.orig 2023-11-29 21:40:07 UTC
++++ net/socket/udp_socket_posix.cc
+@@ -612,12 +612,17 @@ int UDPSocketPosix::SetRecvEcn() {
+ }
+ }
+
++#ifdef IP_RECVTOS
+ int rv = setsockopt(socket_, IPPROTO_IP, IP_RECVTOS, &ecn, sizeof(ecn));
++#else
++ int rv = -1;
++ errno = EOPNOTSUPP;
++#endif
+ return rv == 0 ? OK : MapSystemError(errno);
+ }
+
+ void UDPSocketPosix::SetMsgConfirm(bool confirm) {
+-#if !BUILDFLAG(IS_APPLE)
++#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ if (confirm) {
+ sendto_flags_ |= MSG_CONFIRM;
+ } else {
+@@ -638,7 +643,7 @@ int UDPSocketPosix::SetBroadcast(bool broadcast) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ int value = broadcast ? 1 : 0;
+ int rv;
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ // SO_REUSEPORT on OSX permits multiple processes to each receive
+ // UDP multicast or broadcast datagrams destined for the bound
+ // port.
+@@ -951,7 +956,7 @@ int UDPSocketPosix::DoBind(const IPEndPoint& address)
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ if (last_error == EINVAL)
+ return ERR_ADDRESS_IN_USE;
+-#elif BUILDFLAG(IS_APPLE)
++#elif BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ if (last_error == EADDRNOTAVAIL)
+ return ERR_ADDRESS_IN_USE;
+ #endif
diff --git a/devel/electron28/files/patch-net_socket_udp__socket__unittest.cc b/devel/electron28/files/patch-net_socket_udp__socket__unittest.cc
new file mode 100644
index 000000000000..9b8b0f4153cb
--- /dev/null
+++ b/devel/electron28/files/patch-net_socket_udp__socket__unittest.cc
@@ -0,0 +1,47 @@
+--- net/socket/udp_socket_unittest.cc.orig 2023-03-30 00:33:55 UTC
++++ net/socket/udp_socket_unittest.cc
+@@ -345,7 +345,7 @@ TEST_F(UDPSocketTest, PartialRecv) {
+ EXPECT_EQ(second_packet, received);
+ }
+
+-#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // - MacOS: requires root permissions on OSX 10.7+.
+ // - Android: devices attached to testbots don't have default network, so
+ // broadcasting to 255.255.255.255 returns error -109 (Address not reachable).
+@@ -656,7 +656,7 @@ TEST_F(UDPSocketTest, ClientSetDoNotFragment) {
+ EXPECT_THAT(rv, IsOk());
+
+ rv = client.SetDoNotFragment();
+-#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/945590): IP_MTU_DISCOVER is not implemented on Fuchsia.
+ EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
+ #elif BUILDFLAG(IS_MAC)
+@@ -684,7 +684,7 @@ TEST_F(UDPSocketTest, ServerSetDoNotFragment) {
+ EXPECT_THAT(rv, IsOk());
+
+ rv = server.SetDoNotFragment();
+-#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/945590): IP_MTU_DISCOVER is not implemented on Fuchsia.
+ EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
+ #elif BUILDFLAG(IS_MAC)
+@@ -749,7 +749,7 @@ TEST_F(UDPSocketTest, JoinMulticastGroup) {
+
+ // TODO(https://crbug.com/947115): failing on device on iOS 12.2.
+ // TODO(https://crbug.com/1227554): flaky on Mac 11.
+-#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ #define MAYBE_SharedMulticastAddress DISABLED_SharedMulticastAddress
+ #else
+ #define MAYBE_SharedMulticastAddress SharedMulticastAddress
+@@ -803,7 +803,7 @@ TEST_F(UDPSocketTest, MAYBE_SharedMulticastAddress) {
+ NetLogSource());
+ ASSERT_THAT(client_socket.Connect(send_address), IsOk());
+
+-#if !BUILDFLAG(IS_CHROMEOS_ASH)
++#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_BSD)
+ // Send a message via the multicast group. That message is expected be be
+ // received by both receving sockets.
+ //
diff --git a/devel/electron28/files/patch-net_third__party_quiche_BUILD.gn b/devel/electron28/files/patch-net_third__party_quiche_BUILD.gn
new file mode 100644
index 000000000000..a3a1f5329930
--- /dev/null
+++ b/devel/electron28/files/patch-net_third__party_quiche_BUILD.gn
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ net/third_party/quiche/BUILD.gn
+@@ -29,7 +29,7 @@ import("//third_party/protobuf/proto_library.gni")
+ import("//testing/libfuzzer/fuzzer_test.gni")
+ import("//third_party/protobuf/proto_library.gni")
+
+-build_epoll_based_tools = is_linux || is_chromeos
++build_epoll_based_tools = (is_linux && !is_bsd) || is_chromeos
+
+ config("quiche_internal_config") {
+ cflags = []
diff --git a/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__comparision__tool.cc b/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__comparision__tool.cc
new file mode 100644
index 000000000000..9b0cfdb86fa5
--- /dev/null
+++ b/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__comparision__tool.cc
@@ -0,0 +1,29 @@
+--- net/tools/cert_verify_tool/cert_verify_comparision_tool.cc.orig 2023-11-29 21:40:08 UTC
++++ net/tools/cert_verify_tool/cert_verify_comparision_tool.cc
+@@ -34,7 +34,7 @@
+ #include "net/url_request/url_request_context_builder.h"
+ #include "net/url_request/url_request_context_getter.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "net/proxy_resolution/proxy_config.h"
+ #include "net/proxy_resolution/proxy_config_service_fixed.h"
+ #endif
+@@ -54,7 +54,7 @@ void SetUpOnNetworkThread(
+ base::WaitableEvent* initialization_complete_event) {
+ net::URLRequestContextBuilder url_request_context_builder;
+ url_request_context_builder.set_user_agent(GetUserAgent());
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, use a fixed ProxyConfigService, since the default one
+ // depends on glib.
+ //
+@@ -125,7 +125,7 @@ std::unique_ptr<CertVerifyImpl> CreateCertVerifyImplFr
+ std::unique_ptr<CertVerifyImpl> CreateCertVerifyImplFromName(
+ base::StringPiece impl_name,
+ scoped_refptr<net::CertNetFetcher> cert_net_fetcher) {
+-#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
++#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(CHROME_ROOT_STORE_ONLY))
+ if (impl_name == "platform") {
+ return std::make_unique<CertVerifyImpl>(
diff --git a/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc b/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
new file mode 100644
index 000000000000..5af10aa3617a
--- /dev/null
+++ b/devel/electron28/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
@@ -0,0 +1,29 @@
+--- net/tools/cert_verify_tool/cert_verify_tool.cc.orig 2023-11-29 21:40:08 UTC
++++ net/tools/cert_verify_tool/cert_verify_tool.cc
+@@ -31,7 +31,7 @@
+ #include "net/url_request/url_request_context_builder.h"
+ #include "net/url_request/url_request_context_getter.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "net/proxy_resolution/proxy_config.h"
+ #include "net/proxy_resolution/proxy_config_service_fixed.h"
+ #endif
+@@ -63,7 +63,7 @@ void SetUpOnNetworkThread(
+ base::WaitableEvent* initialization_complete_event) {
+ net::URLRequestContextBuilder url_request_context_builder;
+ url_request_context_builder.set_user_agent(GetUserAgent());
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, use a fixed ProxyConfigService, since the default one
+ // depends on glib.
+ //
+@@ -545,7 +545,7 @@ int main(int argc, char** argv) {
+ std::string impls_str = command_line.GetSwitchValueASCII("impls");
+ if (impls_str.empty()) {
+ // Default value.
+-#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
++#if !(BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(CHROME_ROOT_STORE_ONLY))
+ impls_str = "platform,";
+ #endif
diff --git a/devel/electron28/files/patch-net_tools_net__watcher_net__watcher.cc b/devel/electron28/files/patch-net_tools_net__watcher_net__watcher.cc
new file mode 100644
index 000000000000..d8394f46016a
--- /dev/null
+++ b/devel/electron28/files/patch-net_tools_net__watcher_net__watcher.cc
@@ -0,0 +1,29 @@
+--- net/tools/net_watcher/net_watcher.cc.orig 2023-02-01 18:43:23 UTC
++++ net/tools/net_watcher/net_watcher.cc
+@@ -32,7 +32,7 @@
+ #include "net/proxy_resolution/proxy_config_service.h"
+ #include "net/proxy_resolution/proxy_config_with_annotation.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "net/base/network_change_notifier_linux.h"
+ #endif
+
+@@ -44,7 +44,7 @@ namespace {
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Flag to specifies which network interfaces to ignore. Interfaces should
+ // follow as a comma seperated list.
+ const char kIgnoreNetifFlag[] = "ignore-netif";
+@@ -163,7 +163,7 @@ int main(int argc, char* argv[]) {
+
+ NetWatcher net_watcher;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ std::string ignored_netifs_str =
+ command_line->GetSwitchValueASCII(kIgnoreNetifFlag);
diff --git a/devel/electron28/files/patch-net_traffic__annotation_network__traffic__annotation.h b/devel/electron28/files/patch-net_traffic__annotation_network__traffic__annotation.h
new file mode 100644
index 000000000000..71e4b623311b
--- /dev/null
+++ b/devel/electron28/files/patch-net_traffic__annotation_network__traffic__annotation.h
@@ -0,0 +1,20 @@
+--- net/traffic_annotation/network_traffic_annotation.h.orig 2022-09-24 10:57:32 UTC
++++ net/traffic_annotation/network_traffic_annotation.h
+@@ -373,7 +373,7 @@ struct MutablePartialNetworkTrafficAnnotationTag {
+ } // namespace net
+
+ // Placeholder for unannotated usages.
+-#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ #define TRAFFIC_ANNOTATION_WITHOUT_PROTO(ANNOTATION_ID) \
+ net::DefineNetworkTrafficAnnotation(ANNOTATION_ID, "No proto yet.")
+ #endif
+@@ -387,7 +387,7 @@ struct MutablePartialNetworkTrafficAnnotationTag {
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+ #if !BUILDFLAG(IS_WIN) && \
+- !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+
+ #define NO_TRAFFIC_ANNOTATION_YET \
+ net::DefineNetworkTrafficAnnotation("undefined", "Nothing here yet.")
diff --git a/devel/electron28/files/patch-net_url__request_url__request__context.cc b/devel/electron28/files/patch-net_url__request_url__request__context.cc
new file mode 100644
index 000000000000..9e4c9907097b
--- /dev/null
+++ b/devel/electron28/files/patch-net_url__request_url__request__context.cc
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context.cc.orig 2023-02-01 18:43:23 UTC
++++ net/url_request/url_request_context.cc
+@@ -109,7 +109,7 @@ const HttpNetworkSessionContext* URLRequestContext::Ge
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+ #if !BUILDFLAG(IS_WIN) && \
+- !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ std::unique_ptr<URLRequest> URLRequestContext::CreateRequest(
+ const GURL& url,
+ RequestPriority priority,
diff --git a/devel/electron28/files/patch-net_url__request_url__request__context.h b/devel/electron28/files/patch-net_url__request_url__request__context.h
new file mode 100644
index 000000000000..d1f856bcb520
--- /dev/null
+++ b/devel/electron28/files/patch-net_url__request_url__request__context.h
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context.h.orig 2023-02-01 18:43:23 UTC
++++ net/url_request/url_request_context.h
+@@ -86,7 +86,7 @@ class NET_EXPORT URLRequestContext final {
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+ #if !BUILDFLAG(IS_WIN) && \
+- !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++ !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ // This function should not be used in Chromium, please use the version with
+ // NetworkTrafficAnnotationTag in the future.
+ //
diff --git a/devel/electron28/files/patch-net_url__request_url__request__context__builder.cc b/devel/electron28/files/patch-net_url__request_url__request__context__builder.cc
new file mode 100644
index 000000000000..0f5c255fed8a
--- /dev/null
+++ b/devel/electron28/files/patch-net_url__request_url__request__context__builder.cc
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context_builder.cc.orig 2023-10-19 19:58:29 UTC
++++ net/url_request/url_request_context_builder.cc
+@@ -446,7 +446,7 @@ std::unique_ptr<URLRequestContext> URLRequestContextBu
+ }
+
+ if (!proxy_resolution_service_) {
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_BSD)
+ // TODO(willchan): Switch to using this code when
+ // ProxyConfigService::CreateSystemProxyConfigService()'s
+ // signature doesn't suck.
diff --git a/devel/electron28/files/patch-pdf_pdfium_pdfium__engine.cc b/devel/electron28/files/patch-pdf_pdfium_pdfium__engine.cc
new file mode 100644
index 000000000000..2b98240df5f4
--- /dev/null
+++ b/devel/electron28/files/patch-pdf_pdfium_pdfium__engine.cc
@@ -0,0 +1,20 @@
+--- pdf/pdfium/pdfium_engine.cc.orig 2023-08-10 01:48:48 UTC
++++ pdf/pdfium/pdfium_engine.cc
+@@ -83,7 +83,7 @@
+ #include "gin/public/cppgc.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "pdf/pdfium/pdfium_font_linux.h"
+ #endif
+
+@@ -525,7 +525,7 @@ void InitializeSDK(bool enable_v8,
+
+ FPDF_InitLibraryWithConfig(&config);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ g_font_mapping_mode = font_mapping_mode;
+ InitializeLinuxFontMapper();
+ #endif
diff --git a/devel/electron28/files/patch-printing_backend_cups__ipp__helper.cc b/devel/electron28/files/patch-printing_backend_cups__ipp__helper.cc
new file mode 100644
index 000000000000..30a5bc213145
--- /dev/null
+++ b/devel/electron28/files/patch-printing_backend_cups__ipp__helper.cc
@@ -0,0 +1,11 @@
+--- printing/backend/cups_ipp_helper.cc.orig 2023-10-19 19:58:29 UTC
++++ printing/backend/cups_ipp_helper.cc
+@@ -215,7 +215,7 @@ void ExtractResolutions(const CupsOptionProvider& prin
+ // Provide a default DPI if no valid DPI is found.
+ #if BUILDFLAG(IS_MAC)
+ constexpr gfx::Size kDefaultMissingDpi(kDefaultMacDpi, kDefaultMacDpi);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ constexpr gfx::Size kDefaultMissingDpi(kPixelsPerInch, kPixelsPerInch);
+ #else
+ constexpr gfx::Size kDefaultMissingDpi(kDefaultPdfDpi, kDefaultPdfDpi);
diff --git a/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.cc b/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.cc
new file mode 100644
index 000000000000..c94ddbc40968
--- /dev/null
+++ b/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.cc
@@ -0,0 +1,29 @@
+--- printing/mojom/printing_context_mojom_traits.cc.orig 2023-11-29 21:40:08 UTC
++++ printing/mojom/printing_context_mojom_traits.cc
+@@ -19,7 +19,7 @@
+ #include "base/numerics/safe_conversions.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "mojo/public/mojom/base/values.mojom.h"
+ #endif
+
+@@ -161,7 +161,7 @@ bool StructTraits<
+ }
+
+ out->set_pages_per_sheet(data.pages_per_sheet());
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ DCHECK(out->advanced_settings().empty());
+ if (!data.ReadAdvancedSettings(&out->advanced_settings()))
+ return false;
+@@ -238,7 +238,7 @@ bool StructTraits<
+ if (system_print_dialog_data.size() != dictionary_entries) {
+ return false;
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The dictionary must contain three strings.
+ const base::Value* value = system_print_dialog_data.Find(
+ printing::kLinuxSystemPrintDialogDataPrinter);
diff --git a/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.h b/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.h
new file mode 100644
index 000000000000..26b80145a15c
--- /dev/null
+++ b/devel/electron28/files/patch-printing_mojom_printing__context__mojom__traits.h
@@ -0,0 +1,11 @@
+--- printing/mojom/printing_context_mojom_traits.h.orig 2023-10-19 19:58:29 UTC
++++ printing/mojom/printing_context_mojom_traits.h
+@@ -166,7 +166,7 @@ struct StructTraits<printing::mojom::PrintSettingsData
+ return s.pages_per_sheet();
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static const printing::PrintSettings::AdvancedSettings& advanced_settings(
+ const printing::PrintSettings& s) {
+ return s.advanced_settings();
diff --git a/devel/electron28/files/patch-printing_print__settings.cc b/devel/electron28/files/patch-printing_print__settings.cc
new file mode 100644
index 000000000000..4ad593f843d2
--- /dev/null
+++ b/devel/electron28/files/patch-printing_print__settings.cc
@@ -0,0 +1,38 @@
+--- printing/print_settings.cc.orig 2023-10-19 19:58:29 UTC
++++ printing/print_settings.cc
+@@ -320,7 +320,7 @@ PrintSettings& PrintSettings::operator=(const PrintSet
+ #endif
+ is_modifiable_ = settings.is_modifiable_;
+ pages_per_sheet_ = settings.pages_per_sheet_;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ for (const auto& item : settings.advanced_settings_)
+ advanced_settings_.emplace(item.first, item.second.Clone());
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -350,7 +350,7 @@ bool PrintSettings::operator==(const PrintSettings& ot
+ #endif
+ is_modifiable_, requested_custom_margins_in_points_,
+ pages_per_sheet_
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ advanced_settings_
+ #endif
+@@ -374,7 +374,7 @@ bool PrintSettings::operator==(const PrintSettings& ot
+ other.is_modifiable_,
+ other.requested_custom_margins_in_points_,
+ other.pages_per_sheet_
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ other.advanced_settings_
+ #endif
+@@ -414,7 +414,7 @@ void PrintSettings::Clear() {
+ #endif
+ is_modifiable_ = true;
+ pages_per_sheet_ = 1;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ advanced_settings_.clear();
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ #if BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-printing_print__settings.h b/devel/electron28/files/patch-printing_print__settings.h
new file mode 100644
index 000000000000..da0ca9671815
--- /dev/null
+++ b/devel/electron28/files/patch-printing_print__settings.h
@@ -0,0 +1,47 @@
+--- printing/print_settings.h.orig 2023-10-19 19:58:29 UTC
++++ printing/print_settings.h
+@@ -25,7 +25,7 @@
+ #include "base/values.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <map>
+
+ #include "base/values.h"
+@@ -51,7 +51,7 @@ inline constexpr char kMacSystemPrintDialogDataPrintSe
+ "print_settings";
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ inline constexpr char kLinuxSystemPrintDialogDataPrinter[] = "printer_name";
+ inline constexpr char kLinuxSystemPrintDialogDataPrintSettings[] =
+ "print_settings";
+@@ -101,7 +101,7 @@ class COMPONENT_EXPORT(PRINTING) PrintSettings {
+ std::string vendor_id;
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ using AdvancedSettings = std::map<std::string, base::Value>;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -276,7 +276,7 @@ class COMPONENT_EXPORT(PRINTING) PrintSettings {
+ pages_per_sheet_ = pages_per_sheet;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ AdvancedSettings& advanced_settings() { return advanced_settings_; }
+ const AdvancedSettings& advanced_settings() const {
+ return advanced_settings_;
+@@ -429,7 +429,7 @@ class COMPONENT_EXPORT(PRINTING) PrintSettings {
+ // Number of pages per sheet.
+ int pages_per_sheet_;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Advanced settings.
+ AdvancedSettings advanced_settings_;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-printing_print__settings__conversion.cc b/devel/electron28/files/patch-printing_print__settings__conversion.cc
new file mode 100644
index 000000000000..f221e300b0dd
--- /dev/null
+++ b/devel/electron28/files/patch-printing_print__settings__conversion.cc
@@ -0,0 +1,11 @@
+--- printing/print_settings_conversion.cc.orig 2023-10-19 19:58:29 UTC
++++ printing/print_settings_conversion.cc
+@@ -287,7 +287,7 @@ std::unique_ptr<PrintSettings> PrintSettingsFromJobSet
+ settings->set_is_modifiable(is_modifiable.value());
+ }
+
+-#if BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS))
++#if BUILDFLAG(IS_CHROMEOS) || ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && BUILDFLAG(USE_CUPS))
+ const base::Value::Dict* advanced_settings =
+ job_settings.FindDict(kSettingAdvancedSettings);
+ if (advanced_settings) {
diff --git a/devel/electron28/files/patch-printing_printing__context__linux.cc b/devel/electron28/files/patch-printing_printing__context__linux.cc
new file mode 100644
index 000000000000..8d6303eb6860
--- /dev/null
+++ b/devel/electron28/files/patch-printing_printing__context__linux.cc
@@ -0,0 +1,38 @@
+--- printing/printing_context_linux.cc.orig 2023-11-29 21:40:08 UTC
++++ printing/printing_context_linux.cc
+@@ -23,7 +23,7 @@
+ #endif
+
+ // Avoid using LinuxUi on Fuchsia.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -68,7 +68,7 @@ mojom::ResultCode PrintingContextLinux::UseDefaultSett
+
+ ResetSettings();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!ui::LinuxUi::instance())
+ return mojom::ResultCode::kSuccess;
+
+@@ -84,7 +84,7 @@ gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceU
+ }
+
+ gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (ui::LinuxUi::instance())
+ return ui::LinuxUi::instance()->GetPdfPaperSize(this);
+ #endif
+@@ -97,7 +97,7 @@ mojom::ResultCode PrintingContextLinux::UpdatePrinterS
+ DCHECK(!printer_settings.show_system_dialog);
+ DCHECK(!in_print_job_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!ui::LinuxUi::instance())
+ return mojom::ResultCode::kSuccess;
+
diff --git a/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.cc b/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..4358925ddb91
--- /dev/null
+++ b/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.cc
@@ -0,0 +1,50 @@
+--- printing/sandbox/print_backend_sandbox_hook_linux.cc.orig 2023-05-25 00:42:01 UTC
++++ printing/sandbox/print_backend_sandbox_hook_linux.cc
+@@ -10,20 +10,27 @@
+ #include "base/path_service.h"
+ #include "build/build_config.h"
+ #include "printing/buildflags/buildflags.h"
++#if !BUILDFLAG(IS_BSD)
+ #include "sandbox/linux/syscall_broker/broker_command.h"
+ #include "sandbox/linux/syscall_broker/broker_file_permission.h"
+ #include "sandbox/policy/export.h"
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#else
++#include "sandbox/policy/sandbox.h"
++#endif
+
+ #if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_CUPS)
+ #include "printing/backend/cups_connection_pool.h"
+ #endif
+
++#if !BUILDFLAG(IS_BSD)
+ using sandbox::syscall_broker::BrokerFilePermission;
+ using sandbox::syscall_broker::MakeBrokerCommandSet;
++#endif
+
+ namespace printing {
+
++#if !BUILDFLAG(IS_BSD)
+ namespace {
+
+ sandbox::syscall_broker::BrokerCommandSet GetPrintBackendBrokerCommandSet() {
+@@ -76,9 +83,11 @@ std::vector<BrokerFilePermission> GetPrintBackendFileP
+ }
+
+ } // namespace
++#endif
+
+ bool PrintBackendPreSandboxHook(
+ sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_CUPS)
+ // Create the socket connections to the CUPS server before engaging the
+ // sandbox, since new connections cannot be made after that.
+@@ -92,6 +101,7 @@ bool PrintBackendPreSandboxHook(
+ sandbox::policy::SandboxLinux::PreSandboxHook(), options);
+
+ instance->EngageNamespaceSandboxIfPossible();
++#endif
+ return true;
+ }
+
diff --git a/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.h b/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.h
new file mode 100644
index 000000000000..6788d8214042
--- /dev/null
+++ b/devel/electron28/files/patch-printing_sandbox_print__backend__sandbox__hook__linux.h
@@ -0,0 +1,16 @@
+--- printing/sandbox/print_backend_sandbox_hook_linux.h.orig 2023-10-19 19:58:29 UTC
++++ printing/sandbox/print_backend_sandbox_hook_linux.h
+@@ -5,8 +5,13 @@
+ #ifndef PRINTING_SANDBOX_PRINT_BACKEND_SANDBOX_HOOK_LINUX_H_
+ #define PRINTING_SANDBOX_PRINT_BACKEND_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
+ #include "base/component_export.h"
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace printing {
+
diff --git a/devel/electron28/files/patch-remoting_base_chromoting__event.cc b/devel/electron28/files/patch-remoting_base_chromoting__event.cc
new file mode 100644
index 000000000000..85d96833a2f5
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_base_chromoting__event.cc
@@ -0,0 +1,11 @@
+--- remoting/base/chromoting_event.cc.orig 2022-11-30 08:12:58 UTC
++++ remoting/base/chromoting_event.cc
+@@ -192,7 +192,7 @@ void ChromotingEvent::AddSystemInfo() {
+ SetString(kCpuKey, base::SysInfo::OperatingSystemArchitecture());
+ SetString(kOsVersionKey, base::SysInfo::OperatingSystemVersion());
+ SetString(kWebAppVersionKey, STRINGIZE(VERSION));
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ Os os = Os::CHROMOTING_LINUX;
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ Os os = Os::CHROMOTING_CHROMEOS;
diff --git a/devel/electron28/files/patch-remoting_base_host__settings.cc b/devel/electron28/files/patch-remoting_base_host__settings.cc
new file mode 100644
index 000000000000..7a7c6d643459
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_base_host__settings.cc
@@ -0,0 +1,20 @@
+--- remoting/base/host_settings.cc.orig 2022-02-28 16:54:41 UTC
++++ remoting/base/host_settings.cc
+@@ -7,7 +7,7 @@
+ #include "base/no_destructor.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_APPLE) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS))
++#if BUILDFLAG(IS_APPLE) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ #include "remoting/base/file_host_settings.h"
+ #endif // BUILDFLAG(IS_LINUX)
+
+@@ -44,7 +44,7 @@ HostSettings::~HostSettings() = default;
+
+ // static
+ HostSettings* HostSettings::GetInstance() {
+-#if BUILDFLAG(IS_APPLE) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS))
++#if BUILDFLAG(IS_APPLE) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ static base::NoDestructor<FileHostSettings> instance(
+ FileHostSettings::GetSettingsFilePath());
+ #elif BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-remoting_client_display_sys__opengl.h b/devel/electron28/files/patch-remoting_client_display_sys__opengl.h
new file mode 100644
index 000000000000..78ba20a4ba8b
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_client_display_sys__opengl.h
@@ -0,0 +1,11 @@
+--- remoting/client/display/sys_opengl.h.orig 2022-02-28 16:54:41 UTC
++++ remoting/client/display/sys_opengl.h
+@@ -9,7 +9,7 @@
+
+ #if BUILDFLAG(IS_IOS)
+ #include <OpenGLES/ES3/gl.h>
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #define GL_GLEXT_PROTOTYPES
+ #include <GL/gl.h>
+ #include <GL/glext.h>
diff --git a/devel/electron28/files/patch-remoting_codec_webrtc__video__encoder__vpx.cc b/devel/electron28/files/patch-remoting_codec_webrtc__video__encoder__vpx.cc
new file mode 100644
index 000000000000..8c9384ed5e26
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_codec_webrtc__video__encoder__vpx.cc
@@ -0,0 +1,11 @@
+--- remoting/codec/webrtc_video_encoder_vpx.cc.orig 2023-05-25 00:42:01 UTC
++++ remoting/codec/webrtc_video_encoder_vpx.cc
+@@ -88,7 +88,7 @@ void SetVp8CodecParameters(vpx_codec_enc_cfg_t* config
+ const webrtc::DesktopSize& size) {
+ SetCommonCodecParameters(config, size);
+
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
++#if (BUILDFLAG(IS_BSD) || BUILDFLAG(IS_LINUX)) && !BUILDFLAG(IS_CHROMEOS_LACROS)
+ // On Linux, using too many threads for VP8 encoding has been linked to high
+ // CPU usage on machines that are under stress. See http://crbug.com/1151148.
+ // 5/3/2022 update: Perf testing has shown that doubling the number of threads
diff --git a/devel/electron28/files/patch-remoting_host_base_desktop__environment__options.cc b/devel/electron28/files/patch-remoting_host_base_desktop__environment__options.cc
new file mode 100644
index 000000000000..5cba0f0d6fb6
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_base_desktop__environment__options.cc
@@ -0,0 +1,11 @@
+--- remoting/host/base/desktop_environment_options.cc.orig 2023-03-30 00:33:55 UTC
++++ remoting/host/base/desktop_environment_options.cc
+@@ -119,7 +119,7 @@ bool DesktopEnvironmentOptions::capture_video_on_dedic
+ // TODO(joedow): Determine whether we can migrate additional platforms to
+ // using the DesktopCaptureWrapper instead of the DesktopCaptureProxy. Then
+ // clean up DesktopCapturerProxy::Core::CreateCapturer().
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return capture_video_on_dedicated_thread_;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-remoting_host_base_switches.cc b/devel/electron28/files/patch-remoting_host_base_switches.cc
new file mode 100644
index 000000000000..5bdc44c55b98
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_base_switches.cc
@@ -0,0 +1,18 @@
+--- remoting/host/base/switches.cc.orig 2022-04-21 18:48:31 UTC
++++ remoting/host/base/switches.cc
+@@ -23,13 +23,13 @@ const char kProcessTypeEvaluateCapability[] = "evaluat
+ const char kProcessTypeFileChooser[] = "file_chooser";
+ const char kProcessTypeUrlForwarderConfigurator[] =
+ "url_forwarder_configurator";
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kProcessTypeXSessionChooser[] = "xsession_chooser";
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+ const char kEvaluateCapabilitySwitchName[] = "evaluate-type";
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const char kEnableUtempter[] = "enable-utempter";
+ #endif
+
diff --git a/devel/electron28/files/patch-remoting_host_base_switches.h b/devel/electron28/files/patch-remoting_host_base_switches.h
new file mode 100644
index 000000000000..100a7d5df7ff
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_base_switches.h
@@ -0,0 +1,18 @@
+--- remoting/host/base/switches.h.orig 2022-04-21 18:48:31 UTC
++++ remoting/host/base/switches.h
+@@ -35,13 +35,13 @@ extern const char kProcessTypeRdpDesktopSession[];
+ extern const char kProcessTypeEvaluateCapability[];
+ extern const char kProcessTypeFileChooser[];
+ extern const char kProcessTypeUrlForwarderConfigurator[];
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ extern const char kProcessTypeXSessionChooser[];
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+ extern const char kEvaluateCapabilitySwitchName[];
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Used to record client sessions to utmp/wtmp.
+ extern const char kEnableUtempter[];
+ #endif
diff --git a/devel/electron28/files/patch-remoting_host_basic__desktop__environment.cc b/devel/electron28/files/patch-remoting_host_basic__desktop__environment.cc
new file mode 100644
index 000000000000..b5177b4dff15
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_basic__desktop__environment.cc
@@ -0,0 +1,11 @@
+--- remoting/host/basic_desktop_environment.cc.orig 2023-08-10 01:48:48 UTC
++++ remoting/host/basic_desktop_environment.cc
+@@ -195,7 +195,7 @@ BasicDesktopEnvironment::CreateVideoCapturer() {
+ scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner;
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ capture_task_runner = ui_task_runner_;
+-#elif BUILDFLAG(IS_LINUX) && defined(REMOTING_USE_WAYLAND)
++#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_WAYLAND)
+ // Each capturer instance should get its own thread so the capturers don't
+ // compete with each other in multistream mode.
+ capture_task_runner = base::ThreadPool::CreateSingleThreadTaskRunner(
diff --git a/devel/electron28/files/patch-remoting_host_chromoting__host.cc b/devel/electron28/files/patch-remoting_host_chromoting__host.cc
new file mode 100644
index 000000000000..5a4bfe1ca050
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_chromoting__host.cc
@@ -0,0 +1,11 @@
+--- remoting/host/chromoting_host.cc.orig 2023-10-19 19:58:29 UTC
++++ remoting/host/chromoting_host.cc
+@@ -128,7 +128,7 @@ void ChromotingHost::Start(const std::string& host_own
+ &ChromotingHost::OnIncomingSession, base::Unretained(this)));
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void ChromotingHost::StartChromotingHostServices() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ DCHECK(!ipc_server_);
diff --git a/devel/electron28/files/patch-remoting_host_chromoting__host.h b/devel/electron28/files/patch-remoting_host_chromoting__host.h
new file mode 100644
index 000000000000..a0246dbea95d
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_chromoting__host.h
@@ -0,0 +1,29 @@
+--- remoting/host/chromoting_host.h.orig 2023-10-19 19:58:29 UTC
++++ remoting/host/chromoting_host.h
+@@ -32,7 +32,7 @@
+ #include "remoting/protocol/session_manager.h"
+ #include "remoting/protocol/transport_context.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/chromoting_host_services_server.h"
+ #endif
+
+@@ -97,7 +97,7 @@ class ChromotingHost : public ClientSession::EventHand
+ // This method can only be called once during the lifetime of this object.
+ void Start(const std::string& host_owner);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Starts running the ChromotingHostServices server and listening for incoming
+ // IPC binding requests.
+ // Currently only Linux runs the ChromotingHostServices server on the host
+@@ -206,7 +206,7 @@ class ChromotingHost : public ClientSession::EventHand
+ // List of host extensions.
+ std::vector<std::unique_ptr<HostExtension>> extensions_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // IPC server that runs the CRD host service API. Non-null if the server name
+ // is set and the host is started.
+ // Currently only Linux runs the ChromotingHostServices server on the host
diff --git a/devel/electron28/files/patch-remoting_host_chromoting__host__context.cc b/devel/electron28/files/patch-remoting_host_chromoting__host__context.cc
new file mode 100644
index 000000000000..15aee6b1d902
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_chromoting__host__context.cc
@@ -0,0 +1,11 @@
+--- remoting/host/chromoting_host_context.cc.orig 2023-08-10 01:48:48 UTC
++++ remoting/host/chromoting_host_context.cc
+@@ -294,7 +294,7 @@ std::unique_ptr<ChromotingHostContext> ChromotingHostC
+ // on a UI thread.
+ scoped_refptr<AutoThreadTaskRunner> input_task_runner =
+ AutoThread::CreateWithType("ChromotingInputThread", ui_task_runner,
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::MessagePumpType::UI);
+ #else
+ base::MessagePumpType::IO);
diff --git a/devel/electron28/files/patch-remoting_host_chromoting__host__services__client.cc b/devel/electron28/files/patch-remoting_host_chromoting__host__services__client.cc
new file mode 100644
index 000000000000..8e52f1fcd588
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_chromoting__host__services__client.cc
@@ -0,0 +1,20 @@
+--- remoting/host/chromoting_host_services_client.cc.orig 2023-10-19 19:58:29 UTC
++++ remoting/host/chromoting_host_services_client.cc
+@@ -59,7 +59,7 @@ mojo::PendingRemote<mojom::ChromotingHostServices> Con
+
+ } // namespace
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ // static
+ constexpr char
+@@ -136,7 +136,7 @@ bool ChromotingHostServicesClient::EnsureSessionServic
+ if (session_services_remote_.is_bound()) {
+ return true;
+ }
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (!environment_->HasVar(kChromeRemoteDesktopSessionEnvVar)) {
+ LOG(WARNING) << "Current desktop environment is not remotable.";
+ return false;
diff --git a/devel/electron28/files/patch-remoting_host_client__session.cc b/devel/electron28/files/patch-remoting_host_client__session.cc
new file mode 100644
index 000000000000..9b7f7c028c44
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_client__session.cc
@@ -0,0 +1,11 @@
+--- remoting/host/client_session.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/host/client_session.cc
+@@ -157,7 +157,7 @@ void ClientSession::NotifyClientResolution(
+ if (desktop_environment_options_.enable_curtaining()) {
+ dpi_vector.set(resolution.x_dpi(), resolution.y_dpi());
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ dpi_vector.set(resolution.x_dpi(), resolution.y_dpi());
+ #endif
+
diff --git a/devel/electron28/files/patch-remoting_host_desktop__and__cursor__conditional__composer.cc b/devel/electron28/files/patch-remoting_host_desktop__and__cursor__conditional__composer.cc
new file mode 100644
index 000000000000..90a094f7cc47
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_desktop__and__cursor__conditional__composer.cc
@@ -0,0 +1,20 @@
+--- remoting/host/desktop_and_cursor_conditional_composer.cc.orig 2023-03-30 00:33:55 UTC
++++ remoting/host/desktop_and_cursor_conditional_composer.cc
+@@ -7,7 +7,7 @@
+ #include "base/functional/bind.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/linux/wayland_utils.h"
+ #endif
+
+@@ -96,7 +96,7 @@ bool DesktopAndCursorConditionalComposer::IsOccluded(
+ }
+
+ bool DesktopAndCursorConditionalComposer::SupportsFrameCallbacks() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return IsRunningWayland();
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-remoting_host_desktop__capturer__proxy.cc b/devel/electron28/files/patch-remoting_host_desktop__capturer__proxy.cc
new file mode 100644
index 000000000000..9ba6d7b5485e
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_desktop__capturer__proxy.cc
@@ -0,0 +1,29 @@
+--- remoting/host/desktop_capturer_proxy.cc.orig 2023-08-10 01:48:48 UTC
++++ remoting/host/desktop_capturer_proxy.cc
+@@ -26,7 +26,7 @@
+ #include "remoting/host/chromeos/frame_sink_desktop_capturer.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #include "remoting/host/linux/wayland_desktop_capturer.h"
+@@ -89,7 +89,7 @@ void DesktopCapturerProxy::Core::CreateCapturer(
+
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ capturer_ = std::make_unique<FrameSinkDesktopCapturer>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ static base::nix::SessionType session_type = base::nix::SessionType::kUnset;
+ if (session_type == base::nix::SessionType::kUnset) {
+ std::unique_ptr<base::Environment> env = base::Environment::Create();
+@@ -293,7 +293,7 @@ void DesktopCapturerProxy::OnMetadata(webrtc::DesktopC
+ bool DesktopCapturerProxy::SupportsFrameCallbacks() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return IsRunningWayland();
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-remoting_host_desktop__capturer__wrapper.cc b/devel/electron28/files/patch-remoting_host_desktop__capturer__wrapper.cc
new file mode 100644
index 000000000000..9a6ddaf53c72
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_desktop__capturer__wrapper.cc
@@ -0,0 +1,29 @@
+--- remoting/host/desktop_capturer_wrapper.cc.orig 2023-05-25 00:42:01 UTC
++++ remoting/host/desktop_capturer_wrapper.cc
+@@ -13,7 +13,7 @@
+ #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
+ #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/linux/wayland_desktop_capturer.h"
+ #include "remoting/host/linux/wayland_utils.h"
+ #endif
+@@ -32,7 +32,7 @@ void DesktopCapturerWrapper::CreateCapturer(
+ const webrtc::DesktopCaptureOptions& options) {
+ DCHECK(!capturer_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ capturer_ = std::make_unique<WaylandDesktopCapturer>(options);
+ } else {
+@@ -109,7 +109,7 @@ void DesktopCapturerWrapper::OnCaptureResult(
+ bool DesktopCapturerWrapper::SupportsFrameCallbacks() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return capturer_ && IsRunningWayland();
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-remoting_host_evaluate__capability.cc b/devel/electron28/files/patch-remoting_host_evaluate__capability.cc
new file mode 100644
index 000000000000..336d7f574080
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_evaluate__capability.cc
@@ -0,0 +1,11 @@
+--- remoting/host/evaluate_capability.cc.orig 2022-02-28 16:54:41 UTC
++++ remoting/host/evaluate_capability.cc
+@@ -55,7 +55,7 @@ base::FilePath BuildHostBinaryPath() {
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (path.BaseName().value() ==
+ FILE_PATH_LITERAL("chrome-remote-desktop-host")) {
+ return path;
diff --git a/devel/electron28/files/patch-remoting_host_host__attributes.cc b/devel/electron28/files/patch-remoting_host_host__attributes.cc
new file mode 100644
index 000000000000..838220ce135f
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_host__attributes.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_attributes.cc.orig 2023-05-25 00:42:01 UTC
++++ remoting/host/host_attributes.cc
+@@ -105,7 +105,7 @@ std::string GetHostAttributes() {
+ if (media::InitializeMediaFoundation()) {
+ result.push_back("HWEncoder");
+ }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ result.push_back("HWEncoder");
+ #endif
+
diff --git a/devel/electron28/files/patch-remoting_host_host__details.cc b/devel/electron28/files/patch-remoting_host_host__details.cc
new file mode 100644
index 000000000000..556c96a8d502
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_host__details.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_details.cc.orig 2022-02-28 16:54:41 UTC
++++ remoting/host/host_details.cc
+@@ -23,7 +23,7 @@ std::string GetHostOperatingSystemName() {
+ return "Mac";
+ #elif BUILDFLAG(IS_CHROMEOS_ASH)
+ return "ChromeOS";
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return "Linux";
+ #elif BUILDFLAG(IS_ANDROID)
+ return "Android";
diff --git a/devel/electron28/files/patch-remoting_host_host__main.cc b/devel/electron28/files/patch-remoting_host_host__main.cc
new file mode 100644
index 000000000000..ab6eaa2c694c
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_host__main.cc
@@ -0,0 +1,29 @@
+--- remoting/host/host_main.cc.orig 2023-03-30 00:33:55 UTC
++++ remoting/host/host_main.cc
+@@ -50,7 +50,7 @@ int FileChooserMain();
+ int RdpDesktopSessionMain();
+ int UrlForwarderConfiguratorMain();
+ #endif // BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ int XSessionChooserMain();
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -63,7 +63,7 @@ const char kUsageMessage[] =
+ "\n"
+ "Options:\n"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ " --audio-pipe-name=<pipe> - Sets the pipe name to capture audio on "
+ "Linux.\n"
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -156,7 +156,7 @@ MainRoutineFn SelectMainRoutine(const std::string& pro
+ } else if (process_type == kProcessTypeUrlForwarderConfigurator) {
+ main_routine = &UrlForwarderConfiguratorMain;
+ #endif // BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ } else if (process_type == kProcessTypeXSessionChooser) {
+ main_routine = &XSessionChooserMain;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-remoting_host_ipc__constants.cc b/devel/electron28/files/patch-remoting_host_ipc__constants.cc
new file mode 100644
index 000000000000..dc885465c844
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_ipc__constants.cc
@@ -0,0 +1,20 @@
+--- remoting/host/ipc_constants.cc.orig 2023-02-01 18:43:24 UTC
++++ remoting/host/ipc_constants.cc
+@@ -17,7 +17,7 @@ namespace remoting {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ #if !defined(NDEBUG)
+ // Use a different IPC name for debug builds so that we can run the host
+@@ -68,7 +68,7 @@ GetChromotingHostServicesServerName() {
+ static const base::NoDestructor<mojo::NamedPlatformChannel::ServerName>
+ server_name(
+ named_mojo_ipc_server::WorkingDirectoryIndependentServerNameFromUTF8(
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Linux host creates the socket file in /tmp, and it won't be
+ // deleted until reboot, so we put username in the path in case
+ // the user switches the host owner.
diff --git a/devel/electron28/files/patch-remoting_host_it2me_it2me__host.cc b/devel/electron28/files/patch-remoting_host_it2me_it2me__host.cc
new file mode 100644
index 000000000000..659663360d66
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_it2me_it2me__host.cc
@@ -0,0 +1,29 @@
+--- remoting/host/it2me/it2me_host.cc.orig 2023-10-19 19:58:29 UTC
++++ remoting/host/it2me/it2me_host.cc
+@@ -49,7 +49,7 @@
+ #include "remoting/host/chromeos/features.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/linux/wayland_manager.h"
+ #include "remoting/host/linux/wayland_utils.h"
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -121,7 +121,7 @@ void It2MeHost::Connect(
+
+ OnPolicyUpdate(std::move(policies));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ WaylandManager::Get()->Init(host_context_->ui_task_runner());
+ }
+@@ -261,7 +261,7 @@ void It2MeHost::ConnectOnNetworkThread(
+
+ // Set up the desktop environment options.
+ DesktopEnvironmentOptions options(DesktopEnvironmentOptions::CreateDefault());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ options.desktop_capture_options()->set_prefer_cursor_embedded(true);
+ }
diff --git a/devel/electron28/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc b/devel/electron28/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
new file mode 100644
index 000000000000..410dd257aad0
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
@@ -0,0 +1,47 @@
+--- remoting/host/it2me/it2me_native_messaging_host_main.cc.orig 2023-10-19 19:58:29 UTC
++++ remoting/host/it2me/it2me_native_messaging_host_main.cc
+@@ -30,7 +30,7 @@
+ #include "remoting/host/resources.h"
+ #include "remoting/host/usage_stats_consent.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if defined(REMOTING_USE_X11)
+ #include <gtk/gtk.h>
+ #include "base/linux_util.h"
+@@ -77,7 +77,7 @@ bool CurrentProcessHasUiAccess() {
+ // Creates a It2MeNativeMessagingHost instance, attaches it to stdin/stdout and
+ // runs the task executor until It2MeNativeMessagingHost signals shutdown.
+ int It2MeNativeMessagingHostMain(int argc, char** argv) {
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ if (!IsRunningWayland()) {
+ // Initialize Xlib for multi-threaded use, allowing non-Chromium code to
+ // use X11 safely (such as the WebRTC capturer, GTK ...)
+@@ -125,7 +125,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+
+ remoting::LoadResources("");
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ // Required for any calls into GTK functions, such as the Disconnect and
+ // Continue windows. Calling with nullptr arguments because we don't have
+ // any command line arguments for gtk to consume.
+@@ -257,7 +257,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+ PolicyWatcher::CreateWithTaskRunner(context->file_task_runner(),
+ context->management_service());
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ scoped_refptr<AutoThreadTaskRunner> input_task_runner;
+ if (!IsRunningWayland()) {
+ // Create an X11EventSource on all UI threads, so the global X11 connection
+@@ -284,7 +284,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+ // Run the loop until channel is alive.
+ run_loop.Run();
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ if (!IsRunningWayland()) {
+ input_task_runner->PostTask(FROM_HERE, base::BindOnce([]() {
+ delete ui::X11EventSource::GetInstance();
diff --git a/devel/electron28/files/patch-remoting_host_me2me__desktop__environment.cc b/devel/electron28/files/patch-remoting_host_me2me__desktop__environment.cc
new file mode 100644
index 000000000000..f9569f665c1d
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_me2me__desktop__environment.cc
@@ -0,0 +1,38 @@
+--- remoting/host/me2me_desktop_environment.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/host/me2me_desktop_environment.cc
+@@ -125,7 +125,7 @@ std::string Me2MeDesktopEnvironment::GetCapabilities()
+ capabilities += protocol::kRemoteWebAuthnCapability;
+ }
+
+-#if BUILDFLAG(IS_LINUX) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ if (!IsRunningWayland()) {
+ capabilities += " ";
+ capabilities += protocol::kMultiStreamCapability;
+@@ -171,7 +171,7 @@ Me2MeDesktopEnvironment::Me2MeDesktopEnvironment(
+ // properly under Xvfb.
+ mutable_desktop_capture_options()->set_use_update_notifications(true);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Setting this option to false means that the capture differ wrapper will not
+ // be used when the X11 capturer is selected. This reduces the X11 capture
+ // time by a few milliseconds per frame and is safe because we can rely on
+@@ -180,7 +180,7 @@ Me2MeDesktopEnvironment::Me2MeDesktopEnvironment(
+ mutable_desktop_capture_options()->set_detect_updated_region(false);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ mutable_desktop_capture_options()->set_prefer_cursor_embedded(false);
+ }
+@@ -205,7 +205,7 @@ bool Me2MeDesktopEnvironment::InitializeSecurity(
+
+ // Otherwise, if the session is shared with the local user start monitoring
+ // the local input and create the in-session UI.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool want_user_interface = false;
+ #elif BUILDFLAG(IS_APPLE)
+ // Don't try to display any UI on top of the system's login screen as this
diff --git a/devel/electron28/files/patch-remoting_host_mouse__cursor__monitor__proxy.cc b/devel/electron28/files/patch-remoting_host_mouse__cursor__monitor__proxy.cc
new file mode 100644
index 000000000000..bb69e58176b4
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_mouse__cursor__monitor__proxy.cc
@@ -0,0 +1,11 @@
+--- remoting/host/mouse_cursor_monitor_proxy.cc.orig 2023-03-30 00:33:55 UTC
++++ remoting/host/mouse_cursor_monitor_proxy.cc
+@@ -73,7 +73,7 @@ void MouseCursorMonitorProxy::Core::CreateMouseCursorM
+
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+ mouse_cursor_monitor_ = std::make_unique<MouseCursorMonitorAura>();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ mouse_cursor_monitor_ = webrtc::MouseCursorMonitor::Create(options);
+ } else {
diff --git a/devel/electron28/files/patch-remoting_host_policy__watcher.cc b/devel/electron28/files/patch-remoting_host_policy__watcher.cc
new file mode 100644
index 000000000000..41121dcbdbba
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_policy__watcher.cc
@@ -0,0 +1,11 @@
+--- remoting/host/policy_watcher.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/host/policy_watcher.cc
+@@ -191,7 +191,7 @@ base::Value::Dict PolicyWatcher::GetDefaultPolicies()
+ true);
+ result.Set(key::kRemoteAccessHostAllowEnterpriseFileTransfer, false);
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ result.Set(key::kRemoteAccessHostMatchUsername, false);
+ #endif
+ #if !BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__client.cc b/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__client.cc
new file mode 100644
index 000000000000..e8f1cbd06f50
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__client.cc
@@ -0,0 +1,20 @@
+--- remoting/host/remote_open_url/remote_open_url_client.cc.orig 2022-05-19 14:06:27 UTC
++++ remoting/host/remote_open_url/remote_open_url_client.cc
+@@ -18,7 +18,7 @@
+ #include "remoting/host/mojom/chromoting_host_services.mojom.h"
+ #include "remoting/host/mojom/remote_url_opener.mojom.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/remote_open_url/remote_open_url_client_delegate_linux.h"
+ #elif BUILDFLAG(IS_WIN)
+ #include "remoting/host/remote_open_url/remote_open_url_client_delegate_win.h"
+@@ -31,7 +31,7 @@ namespace {
+ constexpr base::TimeDelta kRequestTimeout = base::Seconds(5);
+
+ std::unique_ptr<RemoteOpenUrlClient::Delegate> CreateDelegate() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return std::make_unique<RemoteOpenUrlClientDelegateLinux>();
+ #elif BUILDFLAG(IS_WIN)
+ return std::make_unique<RemoteOpenUrlClientDelegateWin>();
diff --git a/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__util.cc b/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__util.cc
new file mode 100644
index 000000000000..84686704aae1
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_remote__open__url_remote__open__url__util.cc
@@ -0,0 +1,11 @@
+--- remoting/host/remote_open_url/remote_open_url_util.cc.orig 2023-03-30 00:33:55 UTC
++++ remoting/host/remote_open_url/remote_open_url_util.cc
+@@ -29,7 +29,7 @@ const wchar_t kRegisteredApplicationsKeyName[] =
+ #endif // BUILDFLAG(IS_WIN)
+
+ bool IsRemoteOpenUrlSupported() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return true;
+ #elif BUILDFLAG(IS_WIN)
+ // The MSI installs the ProgID and capabilities into registry, but not the
diff --git a/devel/electron28/files/patch-remoting_host_remote__open__url_url__forwarder__configurator.cc b/devel/electron28/files/patch-remoting_host_remote__open__url_url__forwarder__configurator.cc
new file mode 100644
index 000000000000..b59e8f067d2b
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_remote__open__url_url__forwarder__configurator.cc
@@ -0,0 +1,11 @@
+--- remoting/host/remote_open_url/url_forwarder_configurator.cc.orig 2022-02-28 16:54:41 UTC
++++ remoting/host/remote_open_url/url_forwarder_configurator.cc
+@@ -12,7 +12,7 @@ UrlForwarderConfigurator::UrlForwarderConfigurator() =
+
+ UrlForwarderConfigurator::~UrlForwarderConfigurator() = default;
+
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_WIN)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_BSD)
+
+ // static
+ std::unique_ptr<UrlForwarderConfigurator> UrlForwarderConfigurator::Create() {
diff --git a/devel/electron28/files/patch-remoting_host_remoting__me2me__host.cc b/devel/electron28/files/patch-remoting_host_remoting__me2me__host.cc
new file mode 100644
index 000000000000..9185a52c9d26
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_remoting__me2me__host.cc
@@ -0,0 +1,169 @@
+--- remoting/host/remoting_me2me_host.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/host/remoting_me2me_host.cc
+@@ -127,7 +127,7 @@
+ #include "remoting/host/mac/permission_utils.h"
+ #endif // BUILDFLAG(IS_APPLE)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if defined(REMOTING_USE_X11)
+ #include <gtk/gtk.h>
+ #endif // defined(REMOTING_USE_X11)
+@@ -138,13 +138,13 @@
+ #endif // defined(REMOTING_USE_X11)
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/linux_util.h"
+ #include "remoting/host/audio_capturer_linux.h"
+ #include "remoting/host/linux/certificate_watcher.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/host_utmp_logger.h"
+ #endif
+
+@@ -157,7 +157,7 @@
+ #include "remoting/host/win/session_desktop_environment.h"
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/linux/wayland_manager.h"
+ #include "remoting/host/linux/wayland_utils.h"
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -187,7 +187,7 @@ const char kStdinConfigPath[] = "-";
+ const char kStdinConfigPath[] = "-";
+ #endif // !defined(REMOTING_MULTI_PROCESS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The command line switch used to pass name of the pipe to capture audio on
+ // linux.
+ const char kAudioPipeSwitchName[] = "audio-pipe-name";
+@@ -394,7 +394,7 @@ class HostProcess : public ConfigWatcher::Delegate,
+
+ std::unique_ptr<ChromotingHostContext> context_;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Watch for certificate changes and kill the host when changes occur
+ std::unique_ptr<CertificateWatcher> cert_watcher_;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -463,7 +463,7 @@ class HostProcess : public ConfigWatcher::Delegate,
+
+ std::unique_ptr<HostStatusLogger> host_status_logger_;
+ std::unique_ptr<HostEventLogger> host_event_logger_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<HostUTMPLogger> host_utmp_logger_;
+ #endif
+ std::unique_ptr<HostPowerSaveBlocker> power_save_blocker_;
+@@ -772,7 +772,7 @@ void HostProcess::ShutdownOnNetworkThread() {
+ void HostProcess::ShutdownOnNetworkThread() {
+ DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
+ config_watcher_.reset();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ cert_watcher_.reset();
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ }
+@@ -833,7 +833,7 @@ void HostProcess::CreateAuthenticatorFactory() {
+ DCHECK(third_party_auth_config_.token_url.is_valid());
+ DCHECK(third_party_auth_config_.token_validation_url.is_valid());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!cert_watcher_) {
+ cert_watcher_ = std::make_unique<CertificateWatcher>(
+ base::BindRepeating(&HostProcess::ShutdownHost,
+@@ -952,13 +952,13 @@ void HostProcess::StartOnUiThread() {
+ base::BindRepeating(&HostProcess::OnPolicyUpdate, base::Unretained(this)),
+ base::BindRepeating(&HostProcess::OnPolicyError, base::Unretained(this)));
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (IsRunningWayland()) {
+ WaylandManager::Get()->Init(context_->ui_task_runner());
+ }
+ #endif // BUILDFLAG(IS_LINUX)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // If an audio pipe is specific on the command-line then initialize
+ // AudioCapturerLinux to capture from it.
+ base::FilePath audio_pipe_name =
+@@ -1030,7 +1030,7 @@ void HostProcess::ShutdownOnUiThread() {
+ // It is now safe for the HostProcess to be deleted.
+ self_ = nullptr;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Cause the global AudioPipeReader to be freed, otherwise the audio
+ // thread will remain in-use and prevent the process from exiting.
+ // TODO(wez): DesktopEnvironmentFactory should own the pipe reader.
+@@ -1038,7 +1038,7 @@ void HostProcess::ShutdownOnUiThread() {
+ AudioCapturerLinux::InitializePipeReader(nullptr, base::FilePath());
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ context_->input_task_runner()->PostTask(
+ FROM_HERE,
+ base::BindOnce([]() { delete ui::X11EventSource::GetInstance(); }));
+@@ -1391,7 +1391,7 @@ bool HostProcess::OnUsernamePolicyUpdate(const base::V
+ // Returns false: never restart the host after this policy update.
+ DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ absl::optional<bool> host_username_match_required =
+ policies.FindBool(policy::key::kRemoteAccessHostMatchUsername);
+ if (!host_username_match_required.has_value()) {
+@@ -1800,7 +1800,7 @@ void HostProcess::StartHost() {
+ // won't be advertised if it's missing a registry key or something.
+ desktop_environment_options_.set_enable_remote_open_url(true);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ desktop_environment_options_.set_enable_remote_webauthn(is_googler_);
+ #endif
+
+@@ -1833,7 +1833,7 @@ void HostProcess::StartHost() {
+ host_status_logger_ = std::make_unique<HostStatusLogger>(
+ host_->status_monitor(), log_to_server_.get());
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+ if (cmd_line->HasSwitch(kEnableUtempter)) {
+ host_utmp_logger_ =
+@@ -1865,7 +1865,7 @@ void HostProcess::StartHost() {
+
+ host_->Start(host_owner_);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // For Windows, ChromotingHostServices connections are handled by the daemon
+ // process, then the message pipe is forwarded to the network process.
+ host_->StartChromotingHostServices();
+@@ -1998,7 +1998,7 @@ int HostProcessMain() {
+ HOST_LOG << "Starting host process: version " << STRINGIZE(VERSION);
+ const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if defined(REMOTING_USE_X11)
+ // Initialize Xlib for multi-threaded use, allowing non-Chromium code to
+ // use X11 safely (such as the WebRTC capturer, GTK ...)
+@@ -2047,7 +2047,7 @@ int HostProcessMain() {
+ std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier(
+ net::NetworkChangeNotifier::CreateIfNeeded());
+
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(REMOTING_USE_X11)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && defined(REMOTING_USE_X11)
+ // Create an X11EventSource on all UI threads, so the global X11 connection
+ // (x11::Connection::Get()) can dispatch X events.
+ auto event_source =
diff --git a/devel/electron28/files/patch-remoting_host_setup_start__host__main.cc b/devel/electron28/files/patch-remoting_host_setup_start__host__main.cc
new file mode 100644
index 000000000000..98b96322c033
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_setup_start__host__main.cc
@@ -0,0 +1,29 @@
+--- remoting/host/setup/start_host_main.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/host/setup/start_host_main.cc
+@@ -36,7 +36,7 @@
+ #include <unistd.h>
+ #endif // BUILDFLAG(IS_POSIX)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "remoting/host/setup/daemon_controller_delegate_linux.h"
+ #include "remoting/host/setup/start_host_as_root.h"
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -242,7 +242,7 @@ int StartHostMain(int argc, char** argv) {
+ } // namespace
+
+ int StartHostMain(int argc, char** argv) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Minimize the amount of code that runs as root on Posix systems.
+ if (getuid() == 0) {
+ return remoting::StartHostAsRoot(argc, argv);
+@@ -274,7 +274,7 @@ int StartHostMain(int argc, char** argv) {
+
+ mojo::core::Init();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (command_line->HasSwitch("no-start")) {
+ // On Linux, registering the host with systemd and starting it is the only
+ // reason start_host requires root. The --no-start options skips that final
diff --git a/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__caller__security__utils.cc b/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__caller__security__utils.cc
new file mode 100644
index 000000000000..c85a55010f3b
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__caller__security__utils.cc
@@ -0,0 +1,29 @@
+--- remoting/host/webauthn/remote_webauthn_caller_security_utils.cc.orig 2022-10-24 13:33:33 UTC
++++ remoting/host/webauthn/remote_webauthn_caller_security_utils.cc
+@@ -9,7 +9,7 @@
+ #include "base/strings/utf_string_conversions.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "base/containers/fixed_flat_set.h"
+ #include "base/files/file_path.h"
+ #include "base/process/process_handle.h"
+@@ -37,7 +37,7 @@ namespace {
+
+ // No static variables needed for debug builds.
+
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+
+ constexpr auto kAllowedCallerPrograms =
+ base::MakeFixedFlatSet<base::FilePath::StringPieceType>({
+@@ -81,7 +81,7 @@ bool IsLaunchedByTrustedProcess() {
+ #if !defined(NDEBUG)
+ // Just return true on debug builds for the convenience of development.
+ return true;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::ProcessId parent_pid =
+ base::GetParentProcessId(base::GetCurrentProcessHandle());
+ // Note that on Linux the process image may no longer exist in its original
diff --git a/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__extension__notifier.cc b/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__extension__notifier.cc
new file mode 100644
index 000000000000..bfe627837a1a
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_host_webauthn_remote__webauthn__extension__notifier.cc
@@ -0,0 +1,28 @@
+--- remoting/host/webauthn/remote_webauthn_extension_notifier.cc.orig 2023-02-01 18:43:24 UTC
++++ remoting/host/webauthn/remote_webauthn_extension_notifier.cc
+@@ -24,7 +24,7 @@
+ #include "base/task/thread_pool.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #include "base/strings/string_util.h"
+@@ -69,14 +69,14 @@ static constexpr char kExtensionWakeupFileContent[] =
+ // Caller should check if the directory exists before writing files to it. A
+ // directory only exists if the corresponding Chrome version is installed.
+ std::vector<base::FilePath> GetRemoteStateChangeDirPaths() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ constexpr base::FilePath::CharType kStateChangeDirName[] =
+ FILE_PATH_LITERAL("WebAuthenticationProxyRemoteSessionStateChange");
+ #endif
+
+ std::vector<base::FilePath> dirs;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // See: chrome/common/chrome_paths_linux.cc
+ auto env = base::Environment::Create();
+ base::FilePath base_path;
diff --git a/devel/electron28/files/patch-remoting_protocol_webrtc__video__stream.cc b/devel/electron28/files/patch-remoting_protocol_webrtc__video__stream.cc
new file mode 100644
index 000000000000..3f5eb101cafb
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_protocol_webrtc__video__stream.cc
@@ -0,0 +1,11 @@
+--- remoting/protocol/webrtc_video_stream.cc.orig 2023-11-29 21:40:08 UTC
++++ remoting/protocol/webrtc_video_stream.cc
+@@ -263,7 +263,7 @@ WebrtcVideoStream::WebrtcVideoStream(const std::string
+ : stream_name_(stream_name), session_options_(session_options) {
+ // TODO(joedow): Dig into the threading model on other platforms to see if they
+ // can also be updated to run on a dedicated thread.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ core_task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner(
+ {base::TaskPriority::HIGHEST},
+ base::SingleThreadTaskRunnerThreadMode::DEDICATED);
diff --git a/devel/electron28/files/patch-remoting_resources_remoting__strings.grd b/devel/electron28/files/patch-remoting_resources_remoting__strings.grd
new file mode 100644
index 000000000000..7ab1d6f71943
--- /dev/null
+++ b/devel/electron28/files/patch-remoting_resources_remoting__strings.grd
@@ -0,0 +1,20 @@
+--- remoting/resources/remoting_strings.grd.orig 2022-05-19 14:06:27 UTC
++++ remoting/resources/remoting_strings.grd
+@@ -955,7 +955,7 @@ If '<ph name="SERVICE_SCRIPT_NAME">$3<ex>org.chromium.
+ <message name="IDS_URL_FORWARDER_INCORRECTLY_CONFIGURED" desc="Message shown when the Chrome Remote Desktop URL forwarder is incorrectly configured.">
+ <ph name="URL_FORWARDER_NAME">%s<ex>Chrome Remote Desktop URL Forwarder</ex></ph> is not configured correctly. Please choose a different default web browser and then enable URL forwarding again.
+ </message>
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_SESSION_DIALOG_MESSAGE" desc="The message to show at the top of the session-selection dialog.">
+ Select a session to launch within your Chrome Remote Desktop environment. (Note that some session types may not support running within Chrome Remote Desktop and on the local console simultaneously.)
+ </message>
+@@ -971,7 +971,7 @@ If '<ph name="SERVICE_SCRIPT_NAME">$3<ex>org.chromium.
+ <message name="IDS_SESSION_DIALOG_DEFAULT_SESSION_COMMENT" desc="The comment for the entry to launch the default session.">
+ Launch the default XSession
+ </message>
+- </if> <!-- is_linux -->
++ </if> <!-- is_posix -->
+ </messages>
+ </release>
+ </grit>
diff --git a/devel/electron28/files/patch-sandbox_BUILD.gn b/devel/electron28/files/patch-sandbox_BUILD.gn
new file mode 100644
index 000000000000..6b1329566d7d
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_BUILD.gn
@@ -0,0 +1,11 @@
+--- sandbox/BUILD.gn.orig 2022-08-31 12:19:35 UTC
++++ sandbox/BUILD.gn
+@@ -49,7 +49,7 @@ group("sandbox") {
+ "//sandbox/mac:system_services",
+ "//sandbox/mac/mojom",
+ ]
+- } else if (is_linux || is_chromeos || is_android) {
++ } else if ((is_linux && !is_bsd) || is_chromeos || is_android) {
+ public_deps = [ "//sandbox/linux:sandbox" ]
+ }
+ }
diff --git a/devel/electron28/files/patch-sandbox_features.gni b/devel/electron28/files/patch-sandbox_features.gni
new file mode 100644
index 000000000000..9f5a00868f96
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_features.gni
@@ -0,0 +1,11 @@
+--- sandbox/features.gni.orig 2022-02-07 13:39:41 UTC
++++ sandbox/features.gni
+@@ -6,7 +6,7 @@
+ # currently.
+ # Do not disable seccomp_bpf anywhere without talking to
+ # security@chromium.org!
+-use_seccomp_bpf = (is_linux || is_chromeos || is_android) &&
++use_seccomp_bpf = !is_bsd && (is_linux || is_chromeos || is_android) &&
+ (current_cpu == "x86" || current_cpu == "x64" ||
+ current_cpu == "arm" || current_cpu == "arm64" ||
+ current_cpu == "mipsel" || current_cpu == "mips64el")
diff --git a/devel/electron28/files/patch-sandbox_linux_BUILD.gn b/devel/electron28/files/patch-sandbox_linux_BUILD.gn
new file mode 100644
index 000000000000..b0f6c5b497b6
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_linux_BUILD.gn
@@ -0,0 +1,35 @@
+--- sandbox/linux/BUILD.gn.orig 2023-08-10 01:48:48 UTC
++++ sandbox/linux/BUILD.gn
+@@ -12,11 +12,11 @@ if (is_android) {
+ }
+
+ declare_args() {
+- compile_suid_client = is_linux || is_chromeos
++ compile_suid_client = (is_linux || is_chromeos) && !is_bsd
+
+- compile_credentials = is_linux || is_chromeos
++ compile_credentials = (is_linux || is_chromeos) && !is_bsd
+
+- compile_syscall_broker = is_linux || is_chromeos
++ compile_syscall_broker = (is_linux || is_chromeos) && !is_bsd
+
+ # On Android, use plain GTest.
+ use_base_test_suite = is_linux || is_chromeos
+@@ -379,6 +379,17 @@ component("sandbox_services") {
+ "services/libc_interceptor.h",
+ ]
+ }
++
++ if (is_bsd) {
++ sources -= [
++ "services/scoped_process.cc",
++ "services/scoped_process.h",
++ "services/syscall_wrappers.cc",
++ "services/syscall_wrappers.h",
++ "services/yama.cc",
++ "services/yama.h",
++ ]
++ }
+ }
+
+ source_set("sandbox_services_headers") {
diff --git a/devel/electron28/files/patch-sandbox_linux_services_init__process__reaper.cc b/devel/electron28/files/patch-sandbox_linux_services_init__process__reaper.cc
new file mode 100644
index 000000000000..8ec351166a19
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_linux_services_init__process__reaper.cc
@@ -0,0 +1,15 @@
+--- sandbox/linux/services/init_process_reaper.cc.orig 2022-02-07 13:39:41 UTC
++++ sandbox/linux/services/init_process_reaper.cc
+@@ -2,6 +2,7 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
++#if 0
+ #include "sandbox/linux/services/init_process_reaper.h"
+
+ #include <signal.h>
+@@ -100,3 +101,4 @@ bool CreateInitProcessReaper(base::OnceClosure post_fo
+ }
+
+ } // namespace sandbox.
++#endif
diff --git a/devel/electron28/files/patch-sandbox_linux_services_libc__interceptor.cc b/devel/electron28/files/patch-sandbox_linux_services_libc__interceptor.cc
new file mode 100644
index 000000000000..37b2a96ff10b
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_linux_services_libc__interceptor.cc
@@ -0,0 +1,21 @@
+--- sandbox/linux/services/libc_interceptor.cc.orig 2023-10-19 19:58:30 UTC
++++ sandbox/linux/services/libc_interceptor.cc
+@@ -12,7 +12,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !BUILDFLAG(IS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <time.h>
+@@ -167,7 +169,7 @@ bool ReadTimeStruct(base::PickleIterator* iter,
+ } else {
+ base::AutoLock lock(g_timezones_lock.Get());
+ auto ret_pair = g_timezones.Get().insert(timezone);
+- output->tm_zone = ret_pair.first->c_str();
++ output->tm_zone = (char *)ret_pair.first->c_str();
+ }
+
+ return true;
diff --git a/devel/electron28/files/patch-sandbox_policy_BUILD.gn b/devel/electron28/files/patch-sandbox_policy_BUILD.gn
new file mode 100644
index 000000000000..5de0f892e44b
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_BUILD.gn
@@ -0,0 +1,39 @@
+--- sandbox/policy/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/BUILD.gn
+@@ -48,7 +48,7 @@ component("policy") {
+ "//sandbox/linux:seccomp_bpf",
+ ]
+ }
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "linux/bpf_audio_policy_linux.cc",
+ "linux/bpf_audio_policy_linux.h",
+@@ -119,6 +119,27 @@ component("policy") {
+ "//sandbox/linux:sandbox_services",
+ "//sandbox/linux:seccomp_bpf",
+ "//sandbox/linux:suid_sandbox_client",
++ ]
++ }
++ if (is_openbsd) {
++ sources += [
++ "openbsd/sandbox_openbsd.cc",
++ "openbsd/sandbox_openbsd.h",
++ ]
++ deps += [
++ "//sandbox:sandbox_buildflags",
++ "//ui/gfx/x",
++ ]
++ libs = [ "util" ]
++ }
++ if (is_freebsd) {
++ sources += [
++ "freebsd/sandbox_freebsd.cc",
++ "freebsd/sandbox_freebsd.h",
++ ]
++ deps += [
++ "//sandbox:sandbox_buildflags",
++ "//ui/gfx/x",
+ ]
+ }
+ if (is_chromeos_ash) {
diff --git a/devel/electron28/files/patch-sandbox_policy_features.cc b/devel/electron28/files/patch-sandbox_policy_features.cc
new file mode 100644
index 000000000000..fac44a496078
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_features.cc
@@ -0,0 +1,23 @@
+--- sandbox/policy/features.cc.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/features.cc
+@@ -19,7 +19,11 @@ BASE_FEATURE(kNetworkServiceSandbox,
+ // (Only causes an effect when feature kNetworkServiceInProcess is disabled.)
+ BASE_FEATURE(kNetworkServiceSandbox,
+ "NetworkServiceSandbox",
++#if BUILDFLAG(IS_BSD)
++ base::FEATURE_ENABLED_BY_DEFAULT);
++#else
+ base::FEATURE_DISABLED_BY_DEFAULT);
++#endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ // Enables a fine-grained seccomp-BPF syscall filter for the network service.
+@@ -126,7 +130,7 @@ BASE_FEATURE(kForceSpectreVariant2Mitigation,
+ base::FEATURE_DISABLED_BY_DEFAULT);
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Enabling the kNetworkServiceSandbox feature automatically enables Spectre
+ // variant 2 mitigations in the network service. This can lead to performance
+ // regressions, so enabling this feature will turn off the Spectre Variant 2
diff --git a/devel/electron28/files/patch-sandbox_policy_features.h b/devel/electron28/files/patch-sandbox_policy_features.h
new file mode 100644
index 000000000000..de9df08904a8
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_features.h
@@ -0,0 +1,11 @@
+--- sandbox/policy/features.h.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/features.h
+@@ -44,7 +44,7 @@ SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kForceSpect
+ SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kForceSpectreVariant2Mitigation);
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(
+ kForceDisableSpectreVariant2MitigationInNetworkService);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.cc b/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
new file mode 100644
index 000000000000..1ca1d8cffe42
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
@@ -0,0 +1,248 @@
+--- sandbox/policy/freebsd/sandbox_freebsd.cc.orig 2023-06-07 04:52:30 UTC
++++ sandbox/policy/freebsd/sandbox_freebsd.cc
+@@ -0,0 +1,245 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "sandbox/policy/freebsd/sandbox_freebsd.h"
++
++#include <dirent.h>
++#include <fcntl.h>
++#include <stdint.h>
++#include <sys/resource.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#include <unistd.h>
++
++#include <limits>
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "base/command_line.h"
++#include "base/debug/stack_trace.h"
++#include "base/feature_list.h"
++#include "base/files/file_path.h"
++#include "base/files/file_util.h"
++#include "base/files/scoped_file.h"
++#include "base/logging.h"
++#include "base/memory/singleton.h"
++#include "base/path_service.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/system/sys_info.h"
++#include "base/threading/thread.h"
++#include "base/time/time.h"
++#include "build/build_config.h"
++#include "crypto/crypto_buildflags.h"
++#include "ppapi/buildflags/buildflags.h"
++#include "sandbox/constants.h"
++#include "sandbox/linux/services/credentials.h"
++#include "sandbox/linux/services/namespace_sandbox.h"
++#include "sandbox/linux/services/proc_util.h"
++#include "sandbox/linux/services/resource_limits.h"
++#include "sandbox/linux/services/thread_helpers.h"
++#include "sandbox/linux/syscall_broker/broker_command.h"
++#include "sandbox/linux/syscall_broker/broker_process.h"
++#include "sandbox/policy/sandbox.h"
++#include "sandbox/policy/sandbox_type.h"
++#include "sandbox/policy/mojom/sandbox.mojom.h"
++#include "sandbox/policy/switches.h"
++#include "sandbox/sandbox_buildflags.h"
++
++#if BUILDFLAG(USING_SANITIZER)
++#include <sanitizer/common_interface_defs.h>
++#endif
++
++#if BUILDFLAG(USE_NSS_CERTS)
++#include "crypto/nss_util.h"
++#endif
++
++#include "third_party/boringssl/src/include/openssl/crypto.h"
++
++#include "ui/gfx/font_util.h"
++
++namespace sandbox {
++namespace policy {
++
++SandboxLinux::SandboxLinux()
++ : sandbox_status_flags_(kInvalid),
++ pre_initialized_(false),
++ initialize_sandbox_ran_(false),
++ broker_process_(nullptr) {
++}
++
++SandboxLinux::~SandboxLinux() {
++ if (pre_initialized_) {
++ CHECK(initialize_sandbox_ran_);
++ }
++}
++
++SandboxLinux* SandboxLinux::GetInstance() {
++ SandboxLinux* instance = base::Singleton<SandboxLinux>::get();
++ CHECK(instance);
++ return instance;
++}
++
++void SandboxLinux::StopThread(base::Thread* thread) {
++ DCHECK(thread);
++ thread->Stop();
++}
++
++void SandboxLinux::PreinitializeSandbox(sandbox::mojom::Sandbox sandbox_type) {
++ CHECK(!pre_initialized_);
++#if BUILDFLAG(USING_SANITIZER)
++ // Sanitizers need to open some resources before the sandbox is enabled.
++ // This should not fork, not launch threads, not open a directory.
++ __sanitizer_sandbox_on_notify(sanitizer_args());
++ sanitizer_args_.reset();
++#endif
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ const std::string process_type =
++ command_line->GetSwitchValueASCII(switches::kProcessType);
++
++ base::SysInfo::AmountOfPhysicalMemory();
++ base::SysInfo::NumberOfProcessors();
++ base::SysInfo::CPUModelName();
++
++ switch (sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ {
++#if BUILDFLAG(USE_NSS_CERTS)
++ // The main process has to initialize the ~/.pki dir which won't work
++ // after unveil(2).
++ crypto::EnsureNSSInit();
++#endif
++ CRYPTO_pre_sandbox_init();
++
++ base::FilePath cache_directory, local_directory;
++
++ base::PathService::Get(base::DIR_CACHE, &cache_directory);
++ base::PathService::Get(base::DIR_HOME, &local_directory);
++
++ cache_directory = cache_directory.AppendASCII("chromium");
++ local_directory = local_directory.AppendASCII(".local").AppendASCII("share").AppendASCII("applications");
++
++ if (!base::CreateDirectory(cache_directory)) {
++ LOG(ERROR) << "Failed to create " << cache_directory.value() << " directory.";
++ }
++
++ if (!base::CreateDirectory(local_directory)) {
++ LOG(ERROR) << "Failed to create " << local_directory.value() << " directory.";
++ }
++
++ break;
++ }
++ case sandbox::mojom::Sandbox::kRenderer:
++ gfx::InitializeFonts();
++ break;
++ default:
++ break;
++ }
++
++ pre_initialized_ = true;
++}
++
++bool SandboxLinux::InitializeSandbox(sandbox::mojom::Sandbox sandbox_type,
++ SandboxLinux::PreSandboxHook hook,
++ const Options& options) {
++ DCHECK(!initialize_sandbox_ran_);
++ initialize_sandbox_ran_ = true;
++
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ const std::string process_type =
++ command_line->GetSwitchValueASCII(switches::kProcessType);
++
++ if (command_line->HasSwitch(switches::kNoSandbox))
++ return true;
++
++ VLOG(1) << "SandboxLinux::InitializeSandbox: process_type="
++ << process_type << " sandbox_type=" << GetSandboxTypeInEnglish(sandbox_type);
++
++ // Only one thread is running, pre-initialize if not already done.
++ if (!pre_initialized_)
++ PreinitializeSandbox(sandbox_type);
++
++ // Attempt to limit the future size of the address space of the process.
++ int error = 0;
++ const bool limited_as = LimitAddressSpace(&error);
++ if (error) {
++ // Restore errno. Internally to |LimitAddressSpace|, the errno due to
++ // setrlimit may be lost.
++ errno = error;
++ PCHECK(limited_as);
++ }
++
++ if (hook)
++ CHECK(std::move(hook).Run(options));
++
++ return true;
++}
++
++bool SandboxLinux::LimitAddressSpace(int* error) {
++#if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \
++ !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER)
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ if (SandboxTypeFromCommandLine(*command_line) == sandbox::mojom::Sandbox::kNoSandbox) {
++ return false;
++ }
++
++ // Unfortunately, it does not appear possible to set RLIMIT_AS such that it
++ // will both (a) be high enough to support V8's and WebAssembly's address
++ // space requirements while also (b) being low enough to mitigate exploits
++ // using integer overflows that require large allocations, heap spray, or
++ // other memory-hungry attack modes.
++
++ *error = sandbox::ResourceLimits::Lower(
++ RLIMIT_DATA, static_cast<rlim_t>(sandbox::kDataSizeLimit));
++
++ // Cache the resource limit before turning on the sandbox.
++ base::SysInfo::AmountOfVirtualMemory();
++ base::SysInfo::MaxSharedMemorySize();
++
++ return *error == 0;
++#else
++ base::SysInfo::AmountOfVirtualMemory();
++ return false;
++#endif // !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) &&
++ // !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER)
++}
++
++// static
++std::string SandboxLinux::GetSandboxTypeInEnglish(sandbox::mojom::Sandbox sandbox_type) {
++ switch (sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ return "Unsandboxed";
++ case sandbox::mojom::Sandbox::kRenderer:
++ return "Renderer";
++ case sandbox::mojom::Sandbox::kUtility:
++ return "Utility";
++ case sandbox::mojom::Sandbox::kGpu:
++ return "GPU";
++#if BUILDFLAG(ENABLE_PPAPI)
++ case sandbox::mojom::Sandbox::kPpapi:
++ return "PPAPI";
++#endif
++ case sandbox::mojom::Sandbox::kNetwork:
++ return "Network";
++ case sandbox::mojom::Sandbox::kCdm:
++ return "CDM";
++ case sandbox::mojom::Sandbox::kPrintCompositor:
++ return "Print Compositor";
++ case sandbox::mojom::Sandbox::kAudio:
++ return "Audio";
++ case sandbox::mojom::Sandbox::kSpeechRecognition:
++ return "Speech Recognition";
++ case sandbox::mojom::Sandbox::kService:
++ return "Service";
++ case sandbox::mojom::Sandbox::kVideoCapture:
++ return "Video Capture";
++ default:
++ return "Unknown";
++ }
++}
++
++} // namespace policy
++} // namespace sandbox
diff --git a/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.h b/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.h
new file mode 100644
index 000000000000..8a18b8317c14
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_freebsd_sandbox__freebsd.h
@@ -0,0 +1,281 @@
+--- sandbox/policy/freebsd/sandbox_freebsd.h.orig 2022-11-30 08:12:58 UTC
++++ sandbox/policy/freebsd/sandbox_freebsd.h
+@@ -0,0 +1,278 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++#ifndef SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
++#define SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
++
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "base/logging.h"
++#include "base/posix/global_descriptors.h"
++#include "sandbox/policy/export.h"
++#include "sandbox/policy/linux/sandbox_seccomp_bpf_linux.h"
++#include "sandbox/policy/mojom/sandbox.mojom.h"
++#include "base/sanitizer_buildflags.h"
++
++#if BUILDFLAG(USING_SANITIZER)
++#include <sanitizer/common_interface_defs.h>
++#endif
++
++namespace base {
++template <typename T>
++struct DefaultSingletonTraits;
++class Thread;
++} // namespace base
++
++namespace sandbox {
++namespace syscall_broker {
++class BrokerProcess;
++} // namespace syscall_broker
++} // namespace sandbox
++
++namespace sandbox {
++namespace policy {
++
++// A singleton class to represent and change our sandboxing state for the
++// three main Linux sandboxes.
++// The sandboxing model allows using two layers of sandboxing. The first layer
++// can be implemented either with unprivileged namespaces or with the setuid
++// sandbox. This class provides a way to engage the namespace sandbox, but does
++// not deal with the legacy setuid sandbox directly.
++// The second layer is mainly based on seccomp-bpf and is engaged with
++// InitializeSandbox(). InitializeSandbox() is also responsible for "sealing"
++// the first layer of sandboxing. That is, InitializeSandbox must always be
++// called to have any meaningful sandboxing at all.
++class SANDBOX_POLICY_EXPORT SandboxLinux {
++ public:
++ // This is a list of sandbox IPC methods which the renderer may send to the
++ // sandbox host. See
++ // https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandbox_ipc.md
++ // This isn't the full list, values < 32 are reserved for methods called from
++ // Skia, and values < 64 are reserved for libc_interceptor.cc.
++ enum LinuxSandboxIPCMethods {
++ DEPRECATED_METHOD_GET_FALLBACK_FONT_FOR_CHAR = 64,
++ DEPRECATED_METHOD_GET_CHILD_WITH_INODE,
++ DEPRECATED_METHOD_GET_STYLE_FOR_STRIKE,
++ METHOD_MAKE_SHARED_MEMORY_SEGMENT,
++ DEPRECATED_METHOD_MATCH_WITH_FALLBACK,
++ };
++
++ // These form a bitmask which describes the conditions of the Linux sandbox.
++ // Note: this doesn't strictly give you the current status, it states
++ // what will be enabled when the relevant processes are initialized.
++ enum Status {
++ // SUID sandbox active.
++ kSUID = 1 << 0,
++
++ // Sandbox is using a new PID namespace.
++ kPIDNS = 1 << 1,
++
++ // Sandbox is using a new network namespace.
++ kNetNS = 1 << 2,
++
++ // seccomp-bpf sandbox active.
++ kSeccompBPF = 1 << 3,
++
++ // The Yama LSM module is present and enforcing.
++ kYama = 1 << 4,
++
++ // seccomp-bpf sandbox is active and the kernel supports TSYNC.
++ kSeccompTSYNC = 1 << 5,
++
++ // User namespace sandbox active.
++ kUserNS = 1 << 6,
++
++ // A flag that denotes an invalid sandbox status.
++ kInvalid = 1 << 31,
++ };
++
++ // SandboxLinux Options are a superset of SandboxSecompBPF Options.
++ struct Options : public SandboxSeccompBPF::Options {
++ // When running with a zygote, the namespace sandbox will have already
++ // been engaged prior to initializing SandboxLinux itself, and need not
++ // be done so again. Set to true to indicate that there isn't a zygote
++ // for this process and the step is to be performed here explicitly.
++ bool engage_namespace_sandbox = false;
++
++ // Allow starting the sandbox with multiple threads already running. This
++ // will enable TSYNC for seccomp-BPF, which syncs the seccomp-BPF policy
++ // across all running threads.
++ bool allow_threads_during_sandbox_init = false;
++
++ // Enables the CHECK for open directories. The open directory check is only
++ // useful for the chroot jail (from the semantic layer of the sandbox), and
++ // can safely be disabled if we are only enabling the seccomp-BPF layer.
++ bool check_for_open_directories = true;
++ };
++
++ // Callers can provide this hook to run code right before the policy
++ // is passed to the BPF compiler and the sandbox is engaged. If
++ // pre_sandbox_hook() returns true, the sandbox will be engaged
++ // afterwards, otherwise the process is terminated.
++ using PreSandboxHook = base::OnceCallback<bool(Options)>;
++
++ // Get our singleton instance.
++ static SandboxLinux* GetInstance();
++
++ SandboxLinux(const SandboxLinux&) = delete;
++ SandboxLinux& operator=(const SandboxLinux&) = delete;
++
++ bool SetPledge(const char *pstring, const char *ppath);
++ bool SetUnveil(const std::string process_type, sandbox::mojom::Sandbox sandbox_type);
++
++ // Do some initialization that can only be done before any of the sandboxes
++ // are enabled. If using the setuid sandbox, this should be called manually
++ // before the setuid sandbox is engaged.
++ // Security: When this runs, it is imperative that either InitializeSandbox()
++ // runs as well or that all file descriptors returned in
++ // GetFileDescriptorsToClose() get closed.
++ // Otherwise file descriptors that bypass the security of the setuid sandbox
++ // would be kept open. One must be particularly careful if a process performs
++ // a fork().
++ void PreinitializeSandbox(sandbox::mojom::Sandbox sandbox_type);
++
++ // Check that the current process is the init process of a new PID
++ // namespace and then proceed to drop access to the file system by using
++ // a new unprivileged namespace. This is a layer-1 sandbox.
++ // In order for this sandbox to be effective, it must be "sealed" by calling
++ // InitializeSandbox().
++ void EngageNamespaceSandbox(bool from_zygote);
++
++ // Return a list of file descriptors to close if PreinitializeSandbox() ran
++ // but InitializeSandbox() won't. Avoid using.
++ // TODO(jln): get rid of this hack.
++ std::vector<int> GetFileDescriptorsToClose();
++
++ // Seal an eventual layer-1 sandbox and initialize the layer-2 sandbox with
++ // an adequate policy depending on the process type and command line
++ // arguments.
++ // Currently the layer-2 sandbox is composed of seccomp-bpf and address space
++ // limitations.
++ // This function should only be called without any thread running.
++ bool InitializeSandbox(sandbox::mojom::Sandbox sandbox_type,
++ PreSandboxHook hook,
++ const Options& options);
++
++ // Stop |thread| in a way that can be trusted by the sandbox.
++ void StopThread(base::Thread* thread);
++
++ // Returns the status of the renderer, worker and ppapi sandbox. Can only
++ // be queried after going through PreinitializeSandbox(). This is a bitmask
++ // and uses the constants defined in "enum Status" above. Since the
++ // status needs to be provided before the sandboxes are actually started,
++ // this returns what will actually happen once InitializeSandbox()
++ // is called from inside these processes.
++ int GetStatus();
++
++ static std::string GetSandboxTypeInEnglish(sandbox::mojom::Sandbox sandbox_type);
++
++ // Returns true if the current process is single-threaded or if the number
++ // of threads cannot be determined.
++ bool IsSingleThreaded() const;
++
++ // Returns true if we started Seccomp BPF.
++ bool seccomp_bpf_started() const;
++
++ // Check the policy and eventually start the seccomp-bpf sandbox. This should
++ // never be called with threads started. If we detect that threads have
++ // started we will crash.
++ bool StartSeccompBPF(sandbox::mojom::Sandbox sandbox_type,
++ PreSandboxHook hook,
++ const Options& options);
++
++ // Limit the address space of the current process (and its children) to make
++ // some vulnerabilities harder to exploit. Writes the errno due to setrlimit
++ // (including 0 if no error) into |error|.
++ bool LimitAddressSpace(int* error);
++
++ // Returns a file descriptor to proc. The file descriptor is no longer valid
++ // after the sandbox has been sealed.
++ int proc_fd() const {
++ DCHECK_NE(-1, proc_fd_);
++ return proc_fd_;
++ }
++
++#if BUILDFLAG(USING_SANITIZER)
++ __sanitizer_sandbox_arguments* sanitizer_args() const {
++ return sanitizer_args_.get();
++ };
++#endif
++
++ // A BrokerProcess is a helper that is started before the sandbox is engaged,
++ // typically from a pre-sandbox hook, that will serve requests to access
++ // files over an IPC channel. The client of this runs from a SIGSYS handler
++ // triggered by the seccomp-bpf sandbox.
++ // |client_sandbox_policy| is the policy being run by the client, and is
++ // used to derive the equivalent broker-side policy.
++ // |broker_side_hook| is an alternate pre-sandbox hook to be run before the
++ // broker itself gets sandboxed, to which the broker side policy and
++ // |options| are passed.
++ // Crashes the process if the broker can not be started since continuation
++ // is impossible (and presumably unsafe).
++ // This should never be destroyed, as after the sandbox is started it is
++ // vital to the process.
++#if 0
++ void StartBrokerProcess(
++ const sandbox::syscall_broker::BrokerCommandSet& allowed_command_set,
++ std::vector<sandbox::syscall_broker::BrokerFilePermission> permissions,
++ PreSandboxHook broker_side_hook,
++ const Options& options);
++
++ sandbox::syscall_broker::BrokerProcess* broker_process() const {
++ return broker_process_;
++ }
++#endif
++
++ private:
++ friend struct base::DefaultSingletonTraits<SandboxLinux>;
++
++ SandboxLinux();
++ ~SandboxLinux();
++
++ // We must have been pre_initialized_ before using these.
++ bool seccomp_bpf_supported() const;
++ bool seccomp_bpf_with_tsync_supported() const;
++
++ // Returns true if it can be determined that the current process has open
++ // directories that are not managed by the SandboxLinux class. This would
++ // be a vulnerability as it would allow to bypass the setuid sandbox.
++ bool HasOpenDirectories() const;
++
++ // The last part of the initialization is to make sure any temporary "hole"
++ // in the sandbox is closed. For now, this consists of closing proc_fd_.
++ void SealSandbox();
++
++ // GetStatus() makes promises as to how the sandbox will behave. This
++ // checks that no promises have been broken.
++ void CheckForBrokenPromises(sandbox::mojom::Sandbox sandbox_type);
++
++ // Stop |thread| and make sure it does not appear in /proc/self/tasks/
++ // anymore.
++ void StopThreadAndEnsureNotCounted(base::Thread* thread) const;
++
++ // A file descriptor to /proc. It's dangerous to have it around as it could
++ // allow for sandbox bypasses. It needs to be closed before we consider
++ // ourselves sandboxed.
++ int proc_fd_;
++
++ bool seccomp_bpf_started_;
++ // The value returned by GetStatus(). Gets computed once and then cached.
++ int sandbox_status_flags_;
++ // Did PreinitializeSandbox() run?
++ bool pre_initialized_;
++ bool seccomp_bpf_supported_; // Accurate if pre_initialized_.
++ bool seccomp_bpf_with_tsync_supported_; // Accurate if pre_initialized_.
++ bool yama_is_enforcing_; // Accurate if pre_initialized_.
++ bool initialize_sandbox_ran_; // InitializeSandbox() was called.
++#if BUILDFLAG(USING_SANITIZER)
++ std::unique_ptr<__sanitizer_sandbox_arguments> sanitizer_args_;
++#endif
++ sandbox::syscall_broker::BrokerProcess* broker_process_; // Leaked as global.
++};
++
++} // namespace policy
++} // namespace sandbox
++
++#endif // SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
diff --git a/devel/electron28/files/patch-sandbox_policy_mojom_sandbox.mojom b/devel/electron28/files/patch-sandbox_policy_mojom_sandbox.mojom
new file mode 100644
index 000000000000..5de6ad251b67
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_mojom_sandbox.mojom
@@ -0,0 +1,15 @@
+--- sandbox/policy/mojom/sandbox.mojom.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/mojom/sandbox.mojom
+@@ -77,6 +77,12 @@ enum Sandbox {
+ [EnableIf=is_fuchsia]
+ kVideoCapture,
+
++ [EnableIf=is_openbsd]
++ kVideoCapture,
++
++ [EnableIf=is_freebsd]
++ kVideoCapture,
++
+ // Allows access to file contents and Windows APIs for parsing icons from PE
+ // files.
+ [EnableIf=is_win]
diff --git a/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.cc b/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
new file mode 100644
index 000000000000..6ed29365a1d9
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
@@ -0,0 +1,423 @@
+--- sandbox/policy/openbsd/sandbox_openbsd.cc.orig 2023-06-07 04:52:30 UTC
++++ sandbox/policy/openbsd/sandbox_openbsd.cc
+@@ -0,0 +1,420 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "sandbox/policy/openbsd/sandbox_openbsd.h"
++
++#include <dirent.h>
++#include <fcntl.h>
++#include <stdint.h>
++#include <sys/resource.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#include <unistd.h>
++#include <util.h>
++
++#include <limits>
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "base/command_line.h"
++#include "base/debug/stack_trace.h"
++#include "base/feature_list.h"
++#include "base/files/file_path.h"
++#include "base/files/file_util.h"
++#include "base/files/scoped_file.h"
++#include "base/logging.h"
++#include "base/memory/singleton.h"
++#include "base/path_service.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/system/sys_info.h"
++#include "base/threading/thread.h"
++#include "base/time/time.h"
++#include "build/build_config.h"
++#include "crypto/crypto_buildflags.h"
++#include "ppapi/buildflags/buildflags.h"
++#include "sandbox/constants.h"
++#include "sandbox/linux/services/credentials.h"
++#include "sandbox/linux/services/namespace_sandbox.h"
++#include "sandbox/linux/services/proc_util.h"
++#include "sandbox/linux/services/resource_limits.h"
++#include "sandbox/linux/services/thread_helpers.h"
++#include "sandbox/linux/syscall_broker/broker_command.h"
++#include "sandbox/linux/syscall_broker/broker_process.h"
++#include "sandbox/policy/sandbox.h"
++#include "sandbox/policy/sandbox_type.h"
++#include "sandbox/policy/mojom/sandbox.mojom.h"
++#include "sandbox/policy/switches.h"
++#include "sandbox/sandbox_buildflags.h"
++
++#if BUILDFLAG(USING_SANITIZER)
++#include <sanitizer/common_interface_defs.h>
++#endif
++
++#if BUILDFLAG(USE_NSS_CERTS)
++#include "crypto/nss_util.h"
++#endif
++
++#include "third_party/boringssl/src/include/openssl/crypto.h"
++
++#include "ui/gfx/font_util.h"
++
++#define MAXTOKENS 3
++
++#define _UNVEIL_MAIN "/etc/chromium/unveil.main";
++#define _UNVEIL_GPU "/etc/chromium/unveil.gpu";
++#define _UNVEIL_UTILITY_NETWORK "/etc/chromium/unveil.utility_network";
++#define _UNVEIL_UTILITY_AUDIO "/etc/chromium/unveil.utility_audio";
++#define _UNVEIL_UTILITY_VIDEO "/etc/chromium/unveil.utility_video";
++
++namespace sandbox {
++namespace policy {
++
++SandboxLinux::SandboxLinux()
++ : unveil_initialized_(false),
++ sandbox_status_flags_(kInvalid),
++ pre_initialized_(false),
++ initialize_sandbox_ran_(false),
++ broker_process_(nullptr) {
++}
++
++SandboxLinux::~SandboxLinux() {
++ if (pre_initialized_) {
++ CHECK(initialize_sandbox_ran_);
++ }
++}
++
++SandboxLinux* SandboxLinux::GetInstance() {
++ SandboxLinux* instance = base::Singleton<SandboxLinux>::get();
++ CHECK(instance);
++ return instance;
++}
++
++void SandboxLinux::StopThread(base::Thread* thread) {
++ DCHECK(thread);
++ thread->Stop();
++}
++
++void SandboxLinux::PreinitializeSandbox(sandbox::mojom::Sandbox sandbox_type) {
++ CHECK(!pre_initialized_);
++#if BUILDFLAG(USING_SANITIZER)
++ // Sanitizers need to open some resources before the sandbox is enabled.
++ // This should not fork, not launch threads, not open a directory.
++ __sanitizer_sandbox_on_notify(sanitizer_args());
++ sanitizer_args_.reset();
++#endif
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ const std::string process_type =
++ command_line->GetSwitchValueASCII(switches::kProcessType);
++
++ base::SysInfo::AmountOfPhysicalMemory();
++ base::SysInfo::NumberOfProcessors();
++ base::SysInfo::CPUModelName();
++
++ switch (sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ {
++#if BUILDFLAG(USE_NSS_CERTS)
++ // The main process has to initialize the ~/.pki dir which won't work
++ // after unveil(2).
++ crypto::EnsureNSSInit();
++#endif
++ CRYPTO_pre_sandbox_init();
++
++ base::FilePath cache_directory, local_directory;
++
++ base::PathService::Get(base::DIR_CACHE, &cache_directory);
++ base::PathService::Get(base::DIR_HOME, &local_directory);
++
++ cache_directory = cache_directory.AppendASCII("chromium");
++ local_directory = local_directory.AppendASCII(".local").AppendASCII("share").AppendASCII("applications");
++
++ if (!base::CreateDirectory(cache_directory)) {
++ LOG(ERROR) << "Failed to create " << cache_directory.value() << " directory.";
++ }
++
++ if (!base::CreateDirectory(local_directory)) {
++ LOG(ERROR) << "Failed to create " << local_directory.value() << " directory.";
++ }
++
++ break;
++ }
++ case sandbox::mojom::Sandbox::kRenderer:
++ gfx::InitializeFonts();
++ break;
++ default:
++ break;
++ }
++
++ pre_initialized_ = true;
++}
++
++bool SandboxLinux::SetPledge(const char *pstring, const char *ppath) {
++ FILE *fp;
++ char *s = NULL;
++ size_t len = 0;
++ ssize_t read;
++
++ if (pstring != NULL) {
++ if (pledge(pstring, NULL) == -1)
++ goto err;
++ VLOG(5) << "pledge " << pstring;
++ } else if (ppath != NULL) {
++ fp = fopen(ppath, "r");
++ if (fp != NULL) {
++ while ((read = getline(&s, &len, fp)) != -1 ) {
++ if (s[strlen(s)-1] == '\n')
++ s[strlen(s)-1] = '\0';
++ if (pledge(s, NULL) == -1)
++ goto err;
++ VLOG(5) << "pledge " << s;
++ }
++ fclose(fp);
++ } else {
++ LOG(ERROR) << "fopen(" << ppath << ") failed, errno: " << errno;
++ return false;
++ }
++ }
++ return true;
++err:
++ LOG(ERROR) << "pledge() failed, errno: " << errno;
++ return false;
++}
++
++bool SandboxLinux::SetUnveil(const std::string process_type, sandbox::mojom::Sandbox sandbox_type) {
++ FILE *fp;
++ char *s = NULL, *cp = NULL, *home = NULL, **ap, *tokens[MAXTOKENS];
++ char path[PATH_MAX];
++ const char *ufile;
++ size_t len = 0, lineno = 0;
++
++ switch (sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ ufile = _UNVEIL_MAIN;
++ break;
++ case sandbox::mojom::Sandbox::kGpu:
++ ufile = _UNVEIL_GPU;
++ break;
++ case sandbox::mojom::Sandbox::kNetwork:
++ ufile = _UNVEIL_UTILITY_NETWORK;
++ break;
++ case sandbox::mojom::Sandbox::kAudio:
++ ufile = _UNVEIL_UTILITY_AUDIO;
++ break;
++ case sandbox::mojom::Sandbox::kVideoCapture:
++ ufile = _UNVEIL_UTILITY_VIDEO;
++ break;
++ default:
++ unveil("/dev/null", "r");
++ goto done;
++ }
++
++ fp = fopen(ufile, "r");
++ if (fp != NULL) {
++ while (!feof(fp)) {
++ if ((s = fparseln(fp, &len, &lineno, NULL,
++ FPARSELN_UNESCCOMM | FPARSELN_UNESCCONT)) == NULL) {
++ if (ferror(fp)) {
++ LOG(ERROR) << "ferror(), errno: " << errno;
++ _exit(1);
++ } else {
++ continue;
++ }
++ }
++ cp = s;
++ cp += strspn(cp, " \t\n"); /* eat whitespace */
++ if (cp[0] == '\0')
++ continue;
++
++ for (ap = tokens; ap < &tokens[MAXTOKENS - 1] &&
++ (*ap = strsep(&cp, " \t")) != NULL;) {
++ if (**ap != '\0')
++ ap++;
++ }
++ *ap = NULL;
++
++ if (tokens[1] == NULL) {
++ LOG(ERROR) << ufile << ": line " << lineno << ": must supply value to " << s;
++ _exit(1);
++ }
++
++ if (tokens[0][0] == '~') {
++ if ((home = getenv("HOME")) == NULL || *home == '\0') {
++ LOG(ERROR) << "failed to get home";
++ _exit(1);
++ }
++ memmove(tokens[0], tokens[0] + 1, strlen(tokens[0]));
++ strncpy(path, home, sizeof(path) - 1);
++ path[sizeof(path) - 1] = '\0';
++ strncat(path, tokens[0], sizeof(path) - 1 - strlen(path));
++ } else {
++ strncpy(path, tokens[0], sizeof(path) - 1);
++ path[sizeof(path) - 1] = '\0';
++ }
++
++ if (unveil(path, tokens[1]) == -1) {
++ LOG(ERROR) << "failed unveiling " << path << " with permissions " << tokens[1];
++ _exit(1);
++ } else {
++ VLOG(5) << "unveiling " << path << " with permissions " << tokens[1];
++ }
++ }
++ fclose(fp);
++ } else {
++ LOG(ERROR) << "failed to open " << ufile << " errno: " << errno;
++ _exit(1);
++ }
++
++done:
++ unveil_initialized_ = true;
++
++ return true;
++}
++
++bool SandboxLinux::unveil_initialized() const {
++ return unveil_initialized_;
++}
++
++bool SandboxLinux::InitializeSandbox(sandbox::mojom::Sandbox sandbox_type,
++ SandboxLinux::PreSandboxHook hook,
++ const Options& options) {
++ DCHECK(!initialize_sandbox_ran_);
++ initialize_sandbox_ran_ = true;
++
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ const std::string process_type =
++ command_line->GetSwitchValueASCII(switches::kProcessType);
++
++ if (command_line->HasSwitch(switches::kNoSandbox))
++ return true;
++
++ VLOG(1) << "SandboxLinux::InitializeSandbox: process_type="
++ << process_type << " sandbox_type=" << GetSandboxTypeInEnglish(sandbox_type);
++
++ // Only one thread is running, pre-initialize if not already done.
++ if (!pre_initialized_)
++ PreinitializeSandbox(sandbox_type);
++
++ // Attempt to limit the future size of the address space of the process.
++ int error = 0;
++ const bool limited_as = LimitAddressSpace(&error);
++ if (error) {
++ // Restore errno. Internally to |LimitAddressSpace|, the errno due to
++ // setrlimit may be lost.
++ errno = error;
++ PCHECK(limited_as);
++ }
++
++ if (hook)
++ CHECK(std::move(hook).Run(options));
++
++ if (!command_line->HasSwitch(switches::kDisableUnveil))
++ SetUnveil(process_type, sandbox_type);
++
++ switch(sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ SetPledge(NULL, "/etc/chromium/pledge.main");
++ break;
++ case sandbox::mojom::Sandbox::kRenderer:
++ // prot_exec needed by v8
++ // flock needed by sqlite3 locking
++ SetPledge("stdio rpath flock prot_exec recvfd sendfd ps", NULL);
++ break;
++ case sandbox::mojom::Sandbox::kGpu:
++ SetPledge("stdio drm rpath flock cpath wpath prot_exec recvfd sendfd tmppath", NULL);
++ break;
++#if BUILDFLAG(ENABLE_PPAPI)
++ case sandbox::mojom::Sandbox::kPpapi:
++ // prot_exec needed by v8
++ SetPledge("stdio rpath prot_exec recvfd sendfd", NULL);
++ break;
++#endif
++ case sandbox::mojom::Sandbox::kAudio:
++ SetPledge(NULL, "/etc/chromium/pledge.utility_audio");
++ break;
++ case sandbox::mojom::Sandbox::kNetwork:
++ SetPledge(NULL, "/etc/chromium/pledge.utility_network");
++ break;
++ case sandbox::mojom::Sandbox::kVideoCapture:
++ SetPledge(NULL, "/etc/chromium/pledge.utility_video");
++ break;
++ case sandbox::mojom::Sandbox::kUtility:
++ case sandbox::mojom::Sandbox::kService:
++ SetPledge("stdio rpath cpath wpath fattr flock sendfd recvfd prot_exec", NULL);
++ break;
++ default:
++ LOG(ERROR) << "non-pledge()'d process: " << GetSandboxTypeInEnglish(sandbox_type);
++ break;
++ }
++
++ return true;
++}
++
++bool SandboxLinux::LimitAddressSpace(int* error) {
++#if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \
++ !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER)
++ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++ if (SandboxTypeFromCommandLine(*command_line) == sandbox::mojom::Sandbox::kNoSandbox) {
++ return false;
++ }
++
++ // Unfortunately, it does not appear possible to set RLIMIT_AS such that it
++ // will both (a) be high enough to support V8's and WebAssembly's address
++ // space requirements while also (b) being low enough to mitigate exploits
++ // using integer overflows that require large allocations, heap spray, or
++ // other memory-hungry attack modes.
++
++ *error = sandbox::ResourceLimits::Lower(
++ RLIMIT_DATA, static_cast<rlim_t>(sandbox::kDataSizeLimit));
++
++ // Cache the resource limit before turning on the sandbox.
++ base::SysInfo::AmountOfVirtualMemory();
++ base::SysInfo::MaxSharedMemorySize();
++
++ return *error == 0;
++#else
++ base::SysInfo::AmountOfVirtualMemory();
++ return false;
++#endif // !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) &&
++ // !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER)
++}
++
++// static
++std::string SandboxLinux::GetSandboxTypeInEnglish(sandbox::mojom::Sandbox sandbox_type) {
++ switch (sandbox_type) {
++ case sandbox::mojom::Sandbox::kNoSandbox:
++ return "Unsandboxed";
++ case sandbox::mojom::Sandbox::kRenderer:
++ return "Renderer";
++ case sandbox::mojom::Sandbox::kUtility:
++ return "Utility";
++ case sandbox::mojom::Sandbox::kGpu:
++ return "GPU";
++#if BUILDFLAG(ENABLE_PPAPI)
++ case sandbox::mojom::Sandbox::kPpapi:
++ return "PPAPI";
++#endif
++ case sandbox::mojom::Sandbox::kNetwork:
++ return "Network";
++ case sandbox::mojom::Sandbox::kCdm:
++ return "CDM";
++ case sandbox::mojom::Sandbox::kPrintCompositor:
++ return "Print Compositor";
++ case sandbox::mojom::Sandbox::kAudio:
++ return "Audio";
++ case sandbox::mojom::Sandbox::kSpeechRecognition:
++ return "Speech Recognition";
++ case sandbox::mojom::Sandbox::kService:
++ return "Service";
++ case sandbox::mojom::Sandbox::kVideoCapture:
++ return "Video Capture";
++ default:
++ return "Unknown";
++ }
++}
++
++} // namespace policy
++} // namespace sandbox
diff --git a/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.h b/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.h
new file mode 100644
index 000000000000..88378f8d083c
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_openbsd_sandbox__openbsd.h
@@ -0,0 +1,285 @@
+--- sandbox/policy/openbsd/sandbox_openbsd.h.orig 2022-11-30 08:12:58 UTC
++++ sandbox/policy/openbsd/sandbox_openbsd.h
+@@ -0,0 +1,282 @@
++// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++#ifndef SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
++#define SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
++
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "base/logging.h"
++#include "base/posix/global_descriptors.h"
++#include "sandbox/policy/export.h"
++#include "sandbox/policy/linux/sandbox_seccomp_bpf_linux.h"
++#include "sandbox/policy/mojom/sandbox.mojom.h"
++#include "base/sanitizer_buildflags.h"
++
++#if BUILDFLAG(USING_SANITIZER)
++#include <sanitizer/common_interface_defs.h>
++#endif
++
++namespace base {
++template <typename T>
++struct DefaultSingletonTraits;
++class Thread;
++} // namespace base
++
++namespace sandbox {
++namespace syscall_broker {
++class BrokerProcess;
++} // namespace syscall_broker
++} // namespace sandbox
++
++namespace sandbox {
++namespace policy {
++
++// A singleton class to represent and change our sandboxing state for the
++// three main Linux sandboxes.
++// The sandboxing model allows using two layers of sandboxing. The first layer
++// can be implemented either with unprivileged namespaces or with the setuid
++// sandbox. This class provides a way to engage the namespace sandbox, but does
++// not deal with the legacy setuid sandbox directly.
++// The second layer is mainly based on seccomp-bpf and is engaged with
++// InitializeSandbox(). InitializeSandbox() is also responsible for "sealing"
++// the first layer of sandboxing. That is, InitializeSandbox must always be
++// called to have any meaningful sandboxing at all.
++class SANDBOX_POLICY_EXPORT SandboxLinux {
++ public:
++ // This is a list of sandbox IPC methods which the renderer may send to the
++ // sandbox host. See
++ // https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandbox_ipc.md
++ // This isn't the full list, values < 32 are reserved for methods called from
++ // Skia, and values < 64 are reserved for libc_interceptor.cc.
++ enum LinuxSandboxIPCMethods {
++ DEPRECATED_METHOD_GET_FALLBACK_FONT_FOR_CHAR = 64,
++ DEPRECATED_METHOD_GET_CHILD_WITH_INODE,
++ DEPRECATED_METHOD_GET_STYLE_FOR_STRIKE,
++ METHOD_MAKE_SHARED_MEMORY_SEGMENT,
++ DEPRECATED_METHOD_MATCH_WITH_FALLBACK,
++ };
++
++ // These form a bitmask which describes the conditions of the Linux sandbox.
++ // Note: this doesn't strictly give you the current status, it states
++ // what will be enabled when the relevant processes are initialized.
++ enum Status {
++ // SUID sandbox active.
++ kSUID = 1 << 0,
++
++ // Sandbox is using a new PID namespace.
++ kPIDNS = 1 << 1,
++
++ // Sandbox is using a new network namespace.
++ kNetNS = 1 << 2,
++
++ // seccomp-bpf sandbox active.
++ kSeccompBPF = 1 << 3,
++
++ // The Yama LSM module is present and enforcing.
++ kYama = 1 << 4,
++
++ // seccomp-bpf sandbox is active and the kernel supports TSYNC.
++ kSeccompTSYNC = 1 << 5,
++
++ // User namespace sandbox active.
++ kUserNS = 1 << 6,
++
++ // A flag that denotes an invalid sandbox status.
++ kInvalid = 1 << 31,
++ };
++
++ // SandboxLinux Options are a superset of SandboxSecompBPF Options.
++ struct Options : public SandboxSeccompBPF::Options {
++ // When running with a zygote, the namespace sandbox will have already
++ // been engaged prior to initializing SandboxLinux itself, and need not
++ // be done so again. Set to true to indicate that there isn't a zygote
++ // for this process and the step is to be performed here explicitly.
++ bool engage_namespace_sandbox = false;
++
++ // Allow starting the sandbox with multiple threads already running. This
++ // will enable TSYNC for seccomp-BPF, which syncs the seccomp-BPF policy
++ // across all running threads.
++ bool allow_threads_during_sandbox_init = false;
++
++ // Enables the CHECK for open directories. The open directory check is only
++ // useful for the chroot jail (from the semantic layer of the sandbox), and
++ // can safely be disabled if we are only enabling the seccomp-BPF layer.
++ bool check_for_open_directories = true;
++ };
++
++ // Callers can provide this hook to run code right before the policy
++ // is passed to the BPF compiler and the sandbox is engaged. If
++ // pre_sandbox_hook() returns true, the sandbox will be engaged
++ // afterwards, otherwise the process is terminated.
++ using PreSandboxHook = base::OnceCallback<bool(Options)>;
++
++ // Get our singleton instance.
++ static SandboxLinux* GetInstance();
++
++ SandboxLinux(const SandboxLinux&) = delete;
++ SandboxLinux& operator=(const SandboxLinux&) = delete;
++
++ bool SetPledge(const char *pstring, const char *ppath);
++ bool SetUnveil(const std::string process_type, sandbox::mojom::Sandbox sandbox_type);
++
++ // Do some initialization that can only be done before any of the sandboxes
++ // are enabled. If using the setuid sandbox, this should be called manually
++ // before the setuid sandbox is engaged.
++ // Security: When this runs, it is imperative that either InitializeSandbox()
++ // runs as well or that all file descriptors returned in
++ // GetFileDescriptorsToClose() get closed.
++ // Otherwise file descriptors that bypass the security of the setuid sandbox
++ // would be kept open. One must be particularly careful if a process performs
++ // a fork().
++ void PreinitializeSandbox(sandbox::mojom::Sandbox sandbox_type);
++
++ // Check that the current process is the init process of a new PID
++ // namespace and then proceed to drop access to the file system by using
++ // a new unprivileged namespace. This is a layer-1 sandbox.
++ // In order for this sandbox to be effective, it must be "sealed" by calling
++ // InitializeSandbox().
++ void EngageNamespaceSandbox(bool from_zygote);
++
++ // Return a list of file descriptors to close if PreinitializeSandbox() ran
++ // but InitializeSandbox() won't. Avoid using.
++ // TODO(jln): get rid of this hack.
++ std::vector<int> GetFileDescriptorsToClose();
++
++ // Seal an eventual layer-1 sandbox and initialize the layer-2 sandbox with
++ // an adequate policy depending on the process type and command line
++ // arguments.
++ // Currently the layer-2 sandbox is composed of seccomp-bpf and address space
++ // limitations.
++ // This function should only be called without any thread running.
++ bool InitializeSandbox(sandbox::mojom::Sandbox sandbox_type,
++ PreSandboxHook hook,
++ const Options& options);
++
++ // Stop |thread| in a way that can be trusted by the sandbox.
++ void StopThread(base::Thread* thread);
++
++ // Returns the status of the renderer, worker and ppapi sandbox. Can only
++ // be queried after going through PreinitializeSandbox(). This is a bitmask
++ // and uses the constants defined in "enum Status" above. Since the
++ // status needs to be provided before the sandboxes are actually started,
++ // this returns what will actually happen once InitializeSandbox()
++ // is called from inside these processes.
++ int GetStatus();
++
++ static std::string GetSandboxTypeInEnglish(sandbox::mojom::Sandbox sandbox_type);
++
++ // Returns true if the current process is single-threaded or if the number
++ // of threads cannot be determined.
++ bool IsSingleThreaded() const;
++
++ // Returns true if we started Seccomp BPF.
++ bool seccomp_bpf_started() const;
++
++ // Returns true if unveil(2) is used.
++ bool unveil_initialized() const;
++
++ // Check the policy and eventually start the seccomp-bpf sandbox. This should
++ // never be called with threads started. If we detect that threads have
++ // started we will crash.
++ bool StartSeccompBPF(sandbox::mojom::Sandbox sandbox_type,
++ PreSandboxHook hook,
++ const Options& options);
++
++ // Limit the address space of the current process (and its children) to make
++ // some vulnerabilities harder to exploit. Writes the errno due to setrlimit
++ // (including 0 if no error) into |error|.
++ bool LimitAddressSpace(int* error);
++
++ // Returns a file descriptor to proc. The file descriptor is no longer valid
++ // after the sandbox has been sealed.
++ int proc_fd() const {
++ DCHECK_NE(-1, proc_fd_);
++ return proc_fd_;
++ }
++
++#if BUILDFLAG(USING_SANITIZER)
++ __sanitizer_sandbox_arguments* sanitizer_args() const {
++ return sanitizer_args_.get();
++ };
++#endif
++
++ // A BrokerProcess is a helper that is started before the sandbox is engaged,
++ // typically from a pre-sandbox hook, that will serve requests to access
++ // files over an IPC channel. The client of this runs from a SIGSYS handler
++ // triggered by the seccomp-bpf sandbox.
++ // |client_sandbox_policy| is the policy being run by the client, and is
++ // used to derive the equivalent broker-side policy.
++ // |broker_side_hook| is an alternate pre-sandbox hook to be run before the
++ // broker itself gets sandboxed, to which the broker side policy and
++ // |options| are passed.
++ // Crashes the process if the broker can not be started since continuation
++ // is impossible (and presumably unsafe).
++ // This should never be destroyed, as after the sandbox is started it is
++ // vital to the process.
++#if 0
++ void StartBrokerProcess(
++ const sandbox::syscall_broker::BrokerCommandSet& allowed_command_set,
++ std::vector<sandbox::syscall_broker::BrokerFilePermission> permissions,
++ PreSandboxHook broker_side_hook,
++ const Options& options);
++
++ sandbox::syscall_broker::BrokerProcess* broker_process() const {
++ return broker_process_;
++ }
++#endif
++
++ private:
++ friend struct base::DefaultSingletonTraits<SandboxLinux>;
++
++ SandboxLinux();
++ ~SandboxLinux();
++
++ // We must have been pre_initialized_ before using these.
++ bool seccomp_bpf_supported() const;
++ bool seccomp_bpf_with_tsync_supported() const;
++
++ // Returns true if it can be determined that the current process has open
++ // directories that are not managed by the SandboxLinux class. This would
++ // be a vulnerability as it would allow to bypass the setuid sandbox.
++ bool HasOpenDirectories() const;
++
++ // The last part of the initialization is to make sure any temporary "hole"
++ // in the sandbox is closed. For now, this consists of closing proc_fd_.
++ void SealSandbox();
++
++ // GetStatus() makes promises as to how the sandbox will behave. This
++ // checks that no promises have been broken.
++ void CheckForBrokenPromises(sandbox::mojom::Sandbox sandbox_type);
++
++ // Stop |thread| and make sure it does not appear in /proc/self/tasks/
++ // anymore.
++ void StopThreadAndEnsureNotCounted(base::Thread* thread) const;
++
++ // A file descriptor to /proc. It's dangerous to have it around as it could
++ // allow for sandbox bypasses. It needs to be closed before we consider
++ // ourselves sandboxed.
++ int proc_fd_;
++
++ bool seccomp_bpf_started_;
++ bool unveil_initialized_;
++ // The value returned by GetStatus(). Gets computed once and then cached.
++ int sandbox_status_flags_;
++ // Did PreinitializeSandbox() run?
++ bool pre_initialized_;
++ bool seccomp_bpf_supported_; // Accurate if pre_initialized_.
++ bool seccomp_bpf_with_tsync_supported_; // Accurate if pre_initialized_.
++ bool yama_is_enforcing_; // Accurate if pre_initialized_.
++ bool initialize_sandbox_ran_; // InitializeSandbox() was called.
++#if BUILDFLAG(USING_SANITIZER)
++ std::unique_ptr<__sanitizer_sandbox_arguments> sanitizer_args_;
++#endif
++ sandbox::syscall_broker::BrokerProcess* broker_process_; // Leaked as global.
++};
++
++} // namespace policy
++} // namespace sandbox
++
++#endif // SANDBOX_POLICY_LINUX_SANDBOX_OPENBSD_H_
diff --git a/devel/electron28/files/patch-sandbox_policy_sandbox.cc b/devel/electron28/files/patch-sandbox_policy_sandbox.cc
new file mode 100644
index 000000000000..add95e5a37ca
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_sandbox.cc
@@ -0,0 +1,22 @@
+--- sandbox/policy/sandbox.cc.orig 2023-05-25 00:42:01 UTC
++++ sandbox/policy/sandbox.cc
+@@ -18,6 +18,10 @@
+ #include "sandbox/policy/linux/sandbox_linux.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#endif // BUILDFLAG(IS_BSD)
++
+ #if BUILDFLAG(IS_MAC)
+ #include "sandbox/mac/seatbelt.h"
+ #endif // BUILDFLAG(IS_MAC)
+@@ -31,7 +35,7 @@
+ namespace sandbox {
+ namespace policy {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool Sandbox::Initialize(sandbox::mojom::Sandbox sandbox_type,
+ SandboxLinux::PreSandboxHook hook,
+ const SandboxLinux::Options& options) {
diff --git a/devel/electron28/files/patch-sandbox_policy_sandbox.h b/devel/electron28/files/patch-sandbox_policy_sandbox.h
new file mode 100644
index 000000000000..47c41a0262f4
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_sandbox.h
@@ -0,0 +1,24 @@
+--- sandbox/policy/sandbox.h.orig 2023-05-25 00:42:01 UTC
++++ sandbox/policy/sandbox.h
+@@ -12,6 +12,12 @@
+ #include "sandbox/policy/linux/sandbox_linux.h"
+ #endif
+
++#if BUILDFLAG(IS_OPENBSD)
++#include "sandbox/policy/openbsd/sandbox_openbsd.h"
++#elif BUILDFLAG(IS_FREEBSD)
++#include "sandbox/policy/freebsd/sandbox_freebsd.h"
++#endif
++
+ namespace sandbox {
+ namespace mojom {
+ enum class Sandbox;
+@@ -32,7 +38,7 @@ namespace policy {
+
+ class SANDBOX_POLICY_EXPORT Sandbox {
+ public:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static bool Initialize(sandbox::mojom::Sandbox sandbox_type,
+ SandboxLinux::PreSandboxHook hook,
+ const SandboxLinux::Options& options);
diff --git a/devel/electron28/files/patch-sandbox_policy_sandbox__type.cc b/devel/electron28/files/patch-sandbox_policy_sandbox__type.cc
new file mode 100644
index 000000000000..2b9455899cb0
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_sandbox__type.cc
@@ -0,0 +1,115 @@
+--- sandbox/policy/sandbox_type.cc.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/sandbox_type.cc
+@@ -38,7 +38,7 @@ bool IsUnsandboxedSandboxType(Sandbox sandbox_type) {
+ #endif
+ case Sandbox::kAudio:
+ return false;
+-#if BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ case Sandbox::kVideoCapture:
+ return false;
+ #endif
+@@ -63,7 +63,7 @@ bool IsUnsandboxedSandboxType(Sandbox sandbox_type) {
+ case Sandbox::kMirroring:
+ case Sandbox::kNaClLoader:
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ case Sandbox::kHardwareVideoDecoding:
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -73,7 +73,7 @@ bool IsUnsandboxedSandboxType(Sandbox sandbox_type) {
+ case Sandbox::kLibassistant:
+ #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
+ #endif // // BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) | BUILDFLAG(IS_BSD)
+ case Sandbox::kZygoteIntermediateSandbox:
+ case Sandbox::kHardwareVideoEncoding:
+ #endif
+@@ -130,7 +130,7 @@ void SetCommandLineFlagsForSandboxType(base::CommandLi
+ #endif
+ case Sandbox::kPrintCompositor:
+ case Sandbox::kAudio:
+-#if BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ case Sandbox::kVideoCapture:
+ #endif
+ #if BUILDFLAG(IS_WIN)
+@@ -141,10 +141,10 @@ void SetCommandLineFlagsForSandboxType(base::CommandLi
+ case Sandbox::kMediaFoundationCdm:
+ case Sandbox::kWindowsSystemProxyResolver:
+ #endif // BUILDFLAG(IS_WIN)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ case Sandbox::kHardwareVideoDecoding:
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case Sandbox::kHardwareVideoEncoding:
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+@@ -172,7 +172,7 @@ void SetCommandLineFlagsForSandboxType(base::CommandLi
+ case Sandbox::kNaClLoader:
+ break;
+ #endif // BUILDFLAG(IS_MAC)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case Sandbox::kZygoteIntermediateSandbox:
+ break;
+ #endif
+@@ -216,7 +216,7 @@ sandbox::mojom::Sandbox SandboxTypeFromCommandLine(
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Intermediate process gains a sandbox later.
+ if (process_type == switches::kZygoteProcessType)
+ return Sandbox::kZygoteIntermediateSandbox;
+@@ -262,7 +262,7 @@ std::string StringFromUtilitySandboxType(Sandbox sandb
+ return switches::kUtilitySandbox;
+ case Sandbox::kAudio:
+ return switches::kAudioSandbox;
+-#if BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ case Sandbox::kVideoCapture:
+ return switches::kVideoCaptureSandbox;
+ #endif
+@@ -292,11 +292,11 @@ std::string StringFromUtilitySandboxType(Sandbox sandb
+ case Sandbox::kMirroring:
+ return switches::kMirroringSandbox;
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ case Sandbox::kHardwareVideoDecoding:
+ return switches::kHardwareVideoDecodingSandbox;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case Sandbox::kHardwareVideoEncoding:
+ return switches::kHardwareVideoEncodingSandbox;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -316,7 +316,7 @@ std::string StringFromUtilitySandboxType(Sandbox sandb
+ #if BUILDFLAG(IS_MAC)
+ case Sandbox::kNaClLoader:
+ #endif // BUILDFLAG(IS_MAC)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ case Sandbox::kZygoteIntermediateSandbox:
+ #endif
+ NOTREACHED();
+@@ -388,11 +388,11 @@ sandbox::mojom::Sandbox UtilitySandboxTypeFromString(
+ if (sandbox_string == switches::kScreenAISandbox)
+ return Sandbox::kScreenAI;
+ #endif
+-#if BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ if (sandbox_string == switches::kVideoCaptureSandbox)
+ return Sandbox::kVideoCapture;
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ if (sandbox_string == switches::kHardwareVideoDecodingSandbox)
+ return Sandbox::kHardwareVideoDecoding;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/devel/electron28/files/patch-sandbox_policy_switches.cc b/devel/electron28/files/patch-sandbox_policy_switches.cc
new file mode 100644
index 000000000000..1e762ab1b068
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_switches.cc
@@ -0,0 +1,26 @@
+--- sandbox/policy/switches.cc.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/switches.cc
+@@ -54,10 +54,10 @@ const char kMirroringSandbox[] = "mirroring";
+ const char kMirroringSandbox[] = "mirroring";
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ const char kHardwareVideoDecodingSandbox[] = "hardware_video_decoding";
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ const char kHardwareVideoEncodingSandbox[] = "hardware_video_encoding";
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -96,7 +96,9 @@ const char kNoSandbox[] = "no-sandbox";
+ // Meant to be used as a browser-level switch for testing purposes only.
+ const char kNoSandbox[] = "no-sandbox";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++const char kDisableUnveil[] = "disable-unveil";
++
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Instructs the zygote to launch without a sandbox. Processes forked from this
+ // type of zygote will apply their own custom sandboxes later.
+ const char kNoZygoteSandbox[] = "no-zygote-sandbox";
diff --git a/devel/electron28/files/patch-sandbox_policy_switches.h b/devel/electron28/files/patch-sandbox_policy_switches.h
new file mode 100644
index 000000000000..0dfc4490e521
--- /dev/null
+++ b/devel/electron28/files/patch-sandbox_policy_switches.h
@@ -0,0 +1,25 @@
+--- sandbox/policy/switches.h.orig 2023-11-29 21:40:08 UTC
++++ sandbox/policy/switches.h
+@@ -57,10 +57,10 @@ SANDBOX_POLICY_EXPORT extern const char kMirroringSand
+ SANDBOX_POLICY_EXPORT extern const char kMirroringSandbox[];
+ #endif // BUILDFLAG(IS_MAC)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_BSD)
+ SANDBOX_POLICY_EXPORT extern const char kHardwareVideoDecodingSandbox[];
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SANDBOX_POLICY_EXPORT extern const char kHardwareVideoEncodingSandbox[];
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+
+@@ -81,7 +81,8 @@ SANDBOX_POLICY_EXPORT extern const char kNoSandbox[];
+ SANDBOX_POLICY_EXPORT extern const char kGpuSandboxAllowSysVShm[];
+ SANDBOX_POLICY_EXPORT extern const char kGpuSandboxFailuresFatal[];
+ SANDBOX_POLICY_EXPORT extern const char kNoSandbox[];
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++SANDBOX_POLICY_EXPORT extern const char kDisableUnveil[];
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SANDBOX_POLICY_EXPORT extern const char kNoZygoteSandbox[];
+ #endif
+ #if BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.cc b/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..002a2628997f
--- /dev/null
+++ b/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.cc
@@ -0,0 +1,31 @@
+--- services/audio/audio_sandbox_hook_linux.cc.orig 2023-10-19 19:58:30 UTC
++++ services/audio/audio_sandbox_hook_linux.cc
+@@ -143,6 +143,7 @@ void AddPulseAudioFilePermissions(
+ }
+ #endif
+
++#if !BUILDFLAG(IS_BSD)
+ std::vector<BrokerFilePermission> GetAudioFilePermissions() {
+ std::vector<BrokerFilePermission> permissions{
+ BrokerFilePermission::ReadOnly("/dev/urandom"),
+@@ -171,10 +172,12 @@ void LoadAudioLibraries() {
+ }
+ }
+ }
++#endif
+
+ } // namespace
+
+ bool AudioPreSandboxHook(sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ LoadAudioLibraries();
+ auto* instance = sandbox::policy::SandboxLinux::GetInstance();
+ instance->StartBrokerProcess(MakeBrokerCommandSet({
+@@ -194,6 +197,7 @@ bool AudioPreSandboxHook(sandbox::policy::SandboxLinux
+ // TODO(https://crbug.com/850878) enable namespace sandbox. Currently, if
+ // enabled, connect() on pulse native socket fails with ENOENT (called from
+ // pa_context_connect).
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.h b/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.h
new file mode 100644
index 000000000000..02d4b785c791
--- /dev/null
+++ b/devel/electron28/files/patch-services_audio_audio__sandbox__hook__linux.h
@@ -0,0 +1,16 @@
+--- services/audio/audio_sandbox_hook_linux.h.orig 2023-10-19 19:58:30 UTC
++++ services/audio/audio_sandbox_hook_linux.h
+@@ -5,7 +5,13 @@
+ #ifndef SERVICES_AUDIO_AUDIO_SANDBOX_HOOK_LINUX_H_
+ #define SERVICES_AUDIO_AUDIO_SANDBOX_HOOK_LINUX_H_
+
++#include "build/build_config.h"
++
++#if BUILDFLAG(IS_BSD)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace audio {
+
diff --git a/devel/electron28/files/patch-services_device_BUILD.gn b/devel/electron28/files/patch-services_device_BUILD.gn
new file mode 100644
index 000000000000..dd48650f1e69
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/device/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ services/device/BUILD.gn
+@@ -13,7 +13,7 @@ is_serial_enabled_platform =
+ }
+
+ is_serial_enabled_platform =
+- is_win || ((is_linux || is_chromeos) && use_udev) || is_mac
++ is_win || ((!is_bsd && is_linux || is_chromeos) && use_udev) || is_mac
+
+ source_set("lib") {
+ # This should be visible only to embedders of the Device Service, and the
diff --git a/devel/electron28/files/patch-services_device_compute__pressure_cpu__probe.cc b/devel/electron28/files/patch-services_device_compute__pressure_cpu__probe.cc
new file mode 100644
index 000000000000..19d9708f1335
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_compute__pressure_cpu__probe.cc
@@ -0,0 +1,10 @@
+--- services/device/compute_pressure/cpu_probe.cc.orig 2023-05-25 00:42:01 UTC
++++ services/device/compute_pressure/cpu_probe.cc
+@@ -44,6 +44,7 @@ std::unique_ptr<CpuProbe> CpuProbe::Create(
+ #elif BUILDFLAG(IS_MAC)
+ return CpuProbeMac::Create(sampling_interval, std::move(sampling_callback));
+ #else
++ NOTIMPLEMENTED();
+ return nullptr;
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ }
diff --git a/devel/electron28/files/patch-services_device_geolocation_location__arbitrator.cc b/devel/electron28/files/patch-services_device_geolocation_location__arbitrator.cc
new file mode 100644
index 000000000000..eb3e87c59a0c
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_geolocation_location__arbitrator.cc
@@ -0,0 +1,11 @@
+--- services/device/geolocation/location_arbitrator.cc.orig 2023-11-29 21:40:08 UTC
++++ services/device/geolocation/location_arbitrator.cc
+@@ -193,7 +193,7 @@ LocationArbitrator::NewSystemLocationProvider() {
+
+ std::unique_ptr<LocationProvider>
+ LocationArbitrator::NewSystemLocationProvider() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return nullptr;
+ #else
+ return device::NewSystemLocationProvider(main_task_runner_,
diff --git a/devel/electron28/files/patch-services_device_hid_BUILD.gn b/devel/electron28/files/patch-services_device_hid_BUILD.gn
new file mode 100644
index 000000000000..359bc1016a64
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_BUILD.gn
@@ -0,0 +1,30 @@
+--- services/device/hid/BUILD.gn.orig 2023-08-10 01:48:48 UTC
++++ services/device/hid/BUILD.gn
+@@ -34,7 +34,26 @@ source_set("hid") {
+ "//services/device/public/mojom",
+ ]
+
+- if ((is_linux || is_chromeos) && use_udev) {
++ if (is_openbsd) {
++ sources += [
++ "hid_connection_fido.cc",
++ "hid_connection_fido.h",
++ "hid_service_fido.cc",
++ "hid_service_fido.h",
++ ]
++ libs = ["fido2", "cbor", "usbhid", "crypto", "util"]
++ }
++
++ if (is_freebsd) {
++ sources += [
++ "hid_connection_freebsd.cc",
++ "hid_connection_freebsd.h",
++ "hid_service_freebsd.cc",
++ "hid_service_freebsd.h",
++ ]
++ }
++
++ if ((is_linux || is_chromeos) && !is_bsd && use_udev) {
+ sources += [
+ "hid_connection_linux.cc",
+ "hid_connection_linux.h",
diff --git a/devel/electron28/files/patch-services_device_hid_hid__connection__fido.cc b/devel/electron28/files/patch-services_device_hid_hid__connection__fido.cc
new file mode 100644
index 000000000000..2b241a4be27e
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__connection__fido.cc
@@ -0,0 +1,219 @@
+--- services/device/hid/hid_connection_fido.cc.orig 2023-04-10 14:02:12 UTC
++++ services/device/hid/hid_connection_fido.cc
+@@ -0,0 +1,216 @@
++// Copyright 2014 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_connection_fido.h"
++
++#include <errno.h>
++#include <sys/ioctl.h>
++
++#include <memory>
++#include <string>
++#include <utility>
++
++#include "base/files/file_descriptor_watcher_posix.h"
++#include "base/memory/ref_counted_memory.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_service.h"
++
++namespace device {
++
++class HidConnectionFido::BlockingTaskRunnerHelper {
++ public:
++ BlockingTaskRunnerHelper(base::ScopedFD fd,
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::WeakPtr<HidConnectionFido> connection)
++ : fd_(std::move(fd)),
++ connection_(connection),
++ origin_task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++ // Report buffers must always have room for the report ID.
++ report_buffer_size_ = device_info->max_input_report_size() + 1;
++ has_report_id_ = device_info->has_report_id();
++ }
++
++ BlockingTaskRunnerHelper(const BlockingTaskRunnerHelper&) = delete;
++ BlockingTaskRunnerHelper& operator=(const BlockingTaskRunnerHelper&) = delete;
++
++ ~BlockingTaskRunnerHelper() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ }
++
++ // Starts the FileDescriptorWatcher that reads input events from the device.
++ // Must be called on a thread that has a base::MessageLoopForIO.
++ void Start() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
++ fd_.get(), base::BindRepeating(
++ &BlockingTaskRunnerHelper::OnFileCanReadWithoutBlocking,
++ base::Unretained(this)));
++ }
++
++ void Write(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++
++ auto data = buffer->front();
++ size_t size = buffer->size();
++ // if report id is 0, it shouldn't be included
++ if (data[0] == 0) {
++ data++;
++ size--;
++ }
++
++ ssize_t result =
++ HANDLE_EINTR(write(fd_.get(), data, size));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Write failed";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false));
++ } else {
++ if (static_cast<size_t>(result) != size) {
++ HID_LOG(EVENT) << "Incomplete HID write: " << result
++ << " != " << buffer->size();
++ }
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), true));
++ }
++ }
++
++ void GetFeatureReport(uint8_t report_id,
++ scoped_refptr<base::RefCountedBytes> buffer,
++ ReadCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ HID_PLOG(EVENT) << "GendFeatureReport not implemented on OpenBSD";
++ origin_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(std::move(callback), false, nullptr, 0));
++ }
++
++ void SendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ HID_PLOG(EVENT) << "SendFeatureReport not implemented on OpenBSD";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false));
++ }
++
++ private:
++ void OnFileCanReadWithoutBlocking() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ auto buffer =
++ base::MakeRefCounted<base::RefCountedBytes>(report_buffer_size_);
++ uint8_t* data = buffer->front();
++ size_t length = report_buffer_size_;
++ if (!has_report_id_) {
++ // Fido will not prefix the buffer with a report ID if report IDs are not
++ // used by the device. Prefix the buffer with 0.
++ *data++ = 0;
++ length--;
++ }
++
++ ssize_t bytes_read = HANDLE_EINTR(read(fd_.get(), data, length));
++ if (bytes_read < 0) {
++ if (errno != EAGAIN) {
++ HID_PLOG(EVENT) << "Read failed";
++ // This assumes that the error is unrecoverable and disables reading
++ // from the device until it has been re-opened.
++ // TODO(reillyg): Investigate starting and stopping the file descriptor
++ // watcher in response to pending read requests so that per-request
++ // errors can be returned to the client.
++ file_watcher_.reset();
++ }
++ return;
++ }
++ if (!has_report_id_) {
++ // Behave as if the byte prefixed above as the the report ID was read.
++ bytes_read++;
++ }
++
++ origin_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&HidConnectionFido::ProcessInputReport,
++ connection_, buffer, bytes_read));
++ }
++
++ SEQUENCE_CHECKER(sequence_checker_);
++ base::ScopedFD fd_;
++ size_t report_buffer_size_;
++ bool has_report_id_;
++ base::WeakPtr<HidConnectionFido> connection_;
++ const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
++ std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_;
++};
++
++HidConnectionFido::HidConnectionFido(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
++ bool allow_protected_reports,
++ bool allow_fido_reports)
++ : HidConnection(device_info, allow_protected_reports, allow_fido_reports),
++ helper_(nullptr, base::OnTaskRunnerDeleter(blocking_task_runner)),
++ blocking_task_runner_(std::move(blocking_task_runner)) {
++ helper_.reset(new BlockingTaskRunnerHelper(std::move(fd), device_info,
++ weak_factory_.GetWeakPtr()));
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Start,
++ base::Unretained(helper_.get())));
++}
++
++HidConnectionFido::~HidConnectionFido() {}
++
++void HidConnectionFido::PlatformClose() {
++ // By closing the device on the blocking task runner 1) the requirement that
++ // base::ScopedFD is destroyed on a thread where I/O is allowed is satisfied
++ // and 2) any tasks posted to this task runner that refer to this file will
++ // complete before it is closed.
++ helper_.reset();
++}
++
++void HidConnectionFido::PlatformWrite(
++ scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ // Fido expects the first byte of the buffer to always be a report ID so the
++ // buffer can be used directly.
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Write,
++ base::Unretained(helper_.get()), buffer,
++ std::move(callback)));
++}
++
++void HidConnectionFido::PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) {
++ // The first byte of the destination buffer is the report ID being requested
++ // and is overwritten by the feature report.
++ DCHECK_GT(device_info()->max_feature_report_size(), 0u);
++ auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
++ device_info()->max_feature_report_size() + 1);
++ buffer->data()[0] = report_id;
++
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::GetFeatureReport,
++ base::Unretained(helper_.get()), report_id,
++ buffer, std::move(callback)));
++}
++
++void HidConnectionFido::PlatformSendFeatureReport(
++ scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ // Fido expects the first byte of the buffer to always be a report ID so the
++ // buffer can be used directly.
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::SendFeatureReport,
++ base::Unretained(helper_.get()), buffer,
++ std::move(callback)));
++}
++
++} // namespace device
diff --git a/devel/electron28/files/patch-services_device_hid_hid__connection__fido.h b/devel/electron28/files/patch-services_device_hid_hid__connection__fido.h
new file mode 100644
index 000000000000..9e5e403189a4
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__connection__fido.h
@@ -0,0 +1,63 @@
+--- services/device/hid/hid_connection_fido.h.orig 2022-10-28 16:39:00 UTC
++++ services/device/hid/hid_connection_fido.h
+@@ -0,0 +1,60 @@
++// Copyright 2014 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef SERVICES_DEVICE_HID_HID_CONNECTION_LINUX_H_
++#define SERVICES_DEVICE_HID_HID_CONNECTION_LINUX_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++#include "base/files/scoped_file.h"
++#include "base/memory/weak_ptr.h"
++#include "base/task/sequenced_task_runner.h"
++#include "services/device/hid/hid_connection.h"
++
++namespace base {
++class SequencedTaskRunner;
++}
++
++namespace device {
++
++class HidConnectionFido : public HidConnection {
++ public:
++ HidConnectionFido(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
++ bool allow_protected_reports,
++ bool allow_fido_reports);
++ HidConnectionFido(HidConnectionFido&) = delete;
++ HidConnectionFido& operator=(HidConnectionFido&) = delete;
++
++ private:
++ friend class base::RefCountedThreadSafe<HidConnectionFido>;
++ class BlockingTaskRunnerHelper;
++
++ ~HidConnectionFido() override;
++
++ // HidConnection implementation.
++ void PlatformClose() override;
++ void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++ void PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) override;
++ void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++
++ // |helper_| lives on the sequence to which |blocking_task_runner_| posts
++ // tasks so all calls must be posted there including this object's
++ // destruction.
++ std::unique_ptr<BlockingTaskRunnerHelper, base::OnTaskRunnerDeleter> helper_;
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++
++ base::WeakPtrFactory<HidConnectionFido> weak_factory_{this};
++};
++
++} // namespace device
++
++#endif // SERVICES_DEVICE_HID_HID_CONNECTION_LINUX_H_
diff --git a/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.cc b/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.cc
new file mode 100644
index 000000000000..8c98d48d2112
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.cc
@@ -0,0 +1,243 @@
+--- services/device/hid/hid_connection_freebsd.cc.orig 2023-04-10 14:02:12 UTC
++++ services/device/hid/hid_connection_freebsd.cc
+@@ -0,0 +1,240 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_connection_freebsd.h"
++
++#include <dev/usb/usbhid.h>
++#include <dev/usb/usb_ioctl.h>
++
++#include "base/files/file_descriptor_watcher_posix.h"
++#include "base/location.h"
++#include "base/numerics/safe_math.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/strings/stringprintf.h"
++#include "base/task/single_thread_task_runner.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "base/threading/thread_restrictions.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_service.h"
++
++namespace device {
++
++class HidConnectionFreeBSD::BlockingTaskRunnerHelper {
++ public:
++ BlockingTaskRunnerHelper(base::ScopedFD fd,
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::WeakPtr<HidConnectionFreeBSD> connection)
++ : fd_(std::move(fd)),
++ connection_(connection),
++ origin_task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++ // Report buffers must always have room for the report ID.
++ report_buffer_size_ = device_info->max_input_report_size() + 1;
++ has_report_id_ = device_info->has_report_id();
++ }
++
++ BlockingTaskRunnerHelper(const BlockingTaskRunnerHelper&) = delete;
++ BlockingTaskRunnerHelper& operator=(const BlockingTaskRunnerHelper&) = delete;
++
++ ~BlockingTaskRunnerHelper() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
++
++ // Starts the FileDescriptorWatcher that reads input events from the device.
++ // Must be called on a thread that has a base::MessageLoopForIO.
++ void Start() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::internal::AssertBlockingAllowed();
++
++ file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
++ fd_.get(), base::BindRepeating(&BlockingTaskRunnerHelper::OnFileCanReadWithoutBlocking,
++ base::Unretained(this)));
++ }
++
++ void Write(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++
++ auto data = buffer->front();
++ size_t size = buffer->size();
++ // if report id is 0, it shouldn't be included
++ if (data[0] == 0) {
++ data++;
++ size--;
++ }
++
++ ssize_t result = HANDLE_EINTR(write(fd_.get(), data, size));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Write failed";
++ origin_task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback), false));
++ } else {
++ if (static_cast<size_t>(result) != size)
++ HID_LOG(EVENT) << "Incomplete HID write: " << result << " != " << size;
++ origin_task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback), true));
++ }
++ }
++
++ void GetFeatureReport(uint8_t report_id,
++ scoped_refptr<base::RefCountedBytes> buffer,
++ ReadCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_report_type = UHID_FEATURE_REPORT;
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ int result = HANDLE_EINTR(
++ ioctl(fd_.get(), USB_GET_REPORT, &ugd));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Failed to get feature report";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false, nullptr, 0));
++ } else if (result == 0) {
++ HID_LOG(EVENT) << "Get feature result too short.";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false, nullptr, 0));
++ } else {
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), true, buffer, result));
++ }
++ }
++
++ void SendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_report_type = UHID_FEATURE_REPORT;
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ // FreeBSD does not require report id if it's not used
++ if (buffer->front()[0] == 0) {
++ ugd.ugd_data = buffer->front() + 1;
++ ugd.ugd_maxlen = buffer->size() - 1;
++ } else {
++ ugd.ugd_data = buffer->front();
++ ugd.ugd_maxlen = buffer->size();
++ }
++ int result = HANDLE_EINTR(
++ ioctl(fd_.get(), USB_SET_REPORT, &ugd));
++ if (result < 0) {
++ HID_PLOG(EVENT) << "Failed to send feature report";
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), false));
++ } else {
++ origin_task_runner_->PostTask(FROM_HERE,
++ base::BindOnce(std::move(callback), true));
++ }
++ }
++
++ private:
++ void OnFileCanReadWithoutBlocking() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ scoped_refptr<base::RefCountedBytes> buffer(new base::RefCountedBytes(report_buffer_size_));
++ unsigned char* data = buffer->front();
++ size_t length = report_buffer_size_;
++ if (!has_report_id_) {
++ // FreeBSD will not prefix the buffer with a report ID if report IDs are not
++ // used by the device. Prefix the buffer with 0.
++ *data++ = 0;
++ length--;
++ }
++
++ ssize_t bytes_read = HANDLE_EINTR(read(fd_.get(), data, length));
++ if (bytes_read < 0) {
++ if (errno != EAGAIN) {
++ HID_PLOG(EVENT) << "Read failed";
++ // This assumes that the error is unrecoverable and disables reading
++ // from the device until it has been re-opened.
++ // TODO(reillyg): Investigate starting and stopping the file descriptor
++ // watcher in response to pending read requests so that per-request
++ // errors can be returned to the client.
++ file_watcher_.reset();
++ }
++ return;
++ }
++ if (!has_report_id_) {
++ // Behave as if the byte prefixed above as the the report ID was read.
++ bytes_read++;
++ }
++
++ origin_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&HidConnectionFreeBSD::ProcessInputReport,
++ connection_, buffer, bytes_read));
++ }
++
++ SEQUENCE_CHECKER(sequence_checker_);
++ base::ScopedFD fd_;
++ size_t report_buffer_size_;
++ bool has_report_id_;
++ base::WeakPtr<HidConnectionFreeBSD> connection_;
++ const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
++ std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_;
++};
++
++HidConnectionFreeBSD::HidConnectionFreeBSD(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
++ bool allow_protected_reports,
++ bool allow_fido_reports)
++ : HidConnection(device_info, allow_protected_reports, allow_fido_reports),
++ helper_(nullptr, base::OnTaskRunnerDeleter(blocking_task_runner)),
++ blocking_task_runner_(std::move(blocking_task_runner)) {
++ helper_.reset(new BlockingTaskRunnerHelper(std::move(fd), device_info,
++ weak_factory_.GetWeakPtr()));
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Start,
++ base::Unretained(helper_.get())));
++}
++
++HidConnectionFreeBSD::~HidConnectionFreeBSD() {}
++
++void HidConnectionFreeBSD::PlatformClose() {
++ // By closing the device on the blocking task runner 1) the requirement that
++ // base::ScopedFD is destroyed on a thread where I/O is allowed is satisfied
++ // and 2) any tasks posted to this task runner that refer to this file will
++ // complete before it is closed.
++ blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
++}
++
++void HidConnectionFreeBSD::PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskRunnerHelper::Write, base::Unretained(helper_.get()),
++ buffer, std::move(callback)));
++}
++
++void HidConnectionFreeBSD::PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) {
++ // The first byte of the destination buffer is the report ID being requested
++ // and is overwritten by the feature report.
++ DCHECK_GT(device_info()->max_feature_report_size(), 0u);
++ scoped_refptr<base::RefCountedBytes> buffer(
++ new base::RefCountedBytes(device_info()->max_feature_report_size() + 1));
++ if (report_id != 0)
++ buffer->data()[0] = report_id;
++
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskRunnerHelper::GetFeatureReport,
++ base::Unretained(helper_.get()), report_id,
++ buffer, std::move(callback)));
++}
++
++void HidConnectionFreeBSD::PlatformSendFeatureReport(
++ scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) {
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskRunnerHelper::SendFeatureReport,
++ base::Unretained(helper_.get()), buffer, std::move(callback)));
++}
++
++} // namespace device
diff --git a/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.h b/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.h
new file mode 100644
index 000000000000..29870254fa6b
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__connection__freebsd.h
@@ -0,0 +1,70 @@
+--- services/device/hid/hid_connection_freebsd.h.orig 2022-02-07 13:39:41 UTC
++++ services/device/hid/hid_connection_freebsd.h
+@@ -0,0 +1,67 @@
++// Copyright (c) 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef DEVICE_HID_HID_CONNECTION_FREEBSD_H_
++#define DEVICE_HID_HID_CONNECTION_FREEBSD_H_
++
++#include <stddef.h>
++#include <stdint.h>
++
++#include "base/files/scoped_file.h"
++#include "base/memory/weak_ptr.h"
++#include "base/memory/ref_counted_memory.h"
++#include "base/task/sequenced_task_runner.h"
++#include "services/device/hid/hid_connection.h"
++
++namespace base {
++class SequencedTaskRunner;
++}
++
++namespace net {
++class IOBuffer;
++}
++
++namespace device {
++
++class HidConnectionFreeBSD : public HidConnection {
++ public:
++ HidConnectionFreeBSD(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
++ bool allow_protected_reports,
++ bool allow_fido_reports);
++
++ private:
++ friend class base::RefCountedThreadSafe<HidConnectionFreeBSD>;
++ class BlockingTaskRunnerHelper;
++
++ HidConnectionFreeBSD(const HidConnectionFreeBSD&) = delete;
++ HidConnectionFreeBSD& operator=(const HidConnectionFreeBSD&) = delete;
++
++ ~HidConnectionFreeBSD() override;
++
++ // HidConnection implementation.
++ void PlatformClose() override;
++ void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++ void PlatformGetFeatureReport(uint8_t report_id,
++ ReadCallback callback) override;
++ void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
++ WriteCallback callback) override;
++
++ // |helper_| lives on the sequence to which |blocking_task_runner_| posts
++ // tasks so all calls must be posted there including this object's
++ // destruction.
++ std::unique_ptr<BlockingTaskRunnerHelper, base::OnTaskRunnerDeleter> helper_;
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++ const scoped_refptr<base::SequencedTaskRunner> task_runner_;
++
++ base::WeakPtrFactory<HidConnectionFreeBSD> weak_factory_{this};
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_CONNECTION_FREEBSD_H_
diff --git a/devel/electron28/files/patch-services_device_hid_hid__service.cc b/devel/electron28/files/patch-services_device_hid_hid__service.cc
new file mode 100644
index 000000000000..0830326cab3c
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__service.cc
@@ -0,0 +1,24 @@
+--- services/device/hid/hid_service.cc.orig 2022-11-30 08:12:58 UTC
++++ services/device/hid/hid_service.cc
+@@ -20,6 +20,10 @@
+
+ #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_UDEV)
+ #include "services/device/hid/hid_service_linux.h"
++#elif BUILDFLAG(IS_OPENBSD)
++#include "services/device/hid/hid_service_fido.h"
++#elif BUILDFLAG(IS_FREEBSD)
++#include "services/device/hid/hid_service_freebsd.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "services/device/hid/hid_service_mac.h"
+ #elif BUILDFLAG(IS_WIN)
+@@ -68,6 +72,10 @@ constexpr base::TaskTraits HidService::kBlockingTaskTr
+ std::unique_ptr<HidService> HidService::Create() {
+ #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_UDEV)
+ return std::make_unique<HidServiceLinux>();
++#elif BUILDFLAG(IS_OPENBSD)
++ return std::make_unique<HidServiceFido>();
++#elif BUILDFLAG(IS_FREEBSD)
++ return std::make_unique<HidServiceFreeBSD>();
+ #elif BUILDFLAG(IS_MAC)
+ return std::make_unique<HidServiceMac>();
+ #elif BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-services_device_hid_hid__service__fido.cc b/devel/electron28/files/patch-services_device_hid_hid__service__fido.cc
new file mode 100644
index 000000000000..4947633197b6
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__service__fido.cc
@@ -0,0 +1,399 @@
+--- services/device/hid/hid_service_fido.cc.orig 2023-04-10 14:02:12 UTC
++++ services/device/hid/hid_service_fido.cc
+@@ -0,0 +1,396 @@
++// Copyright 2014 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_service_fido.h"
++
++#include <fcntl.h>
++#include <poll.h>
++#include <stdint.h>
++
++#include <dlfcn.h>
++#include <fido.h>
++
++#include <limits>
++#include <memory>
++#include <string>
++#include <utility>
++
++#include "base/files/file.h"
++#include "base/files/file_path.h"
++#include "base/files/file_util.h"
++#include "base/files/scoped_file.h"
++#include "base/location.h"
++#include "base/sequence_checker.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/strings/string_split.h"
++#include "base/strings/string_util.h"
++#include "base/task/sequenced_task_runner.h"
++#include "base/task/thread_pool.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "build/build_config.h"
++#include "build/chromeos_buildflags.h"
++#include "components/device_event_log/device_event_log.h"
++#include "device/udev_linux/scoped_udev.h"
++#include "device/udev_linux/udev_watcher.h"
++#include "services/device/hid/hid_connection_fido.h"
++
++namespace device {
++
++namespace {
++
++bool terrible_ping_kludge(int fd, const std::string &path) {
++ u_char data[256];
++ int i, n;
++ struct pollfd pfd;
++
++ for (i = 0; i < 4; i++) {
++ memset(data, 0, sizeof(data));
++ /* broadcast channel ID */
++ data[1] = 0xff;
++ data[2] = 0xff;
++ data[3] = 0xff;
++ data[4] = 0xff;
++ /* Ping command */
++ data[5] = 0x81;
++ /* One byte ping only, Vasili */
++ data[6] = 0;
++ data[7] = 1;
++ HID_LOG(EVENT) << "send ping " << i << " " << path;
++ if (write(fd, data, 64) == -1) {
++ HID_PLOG(ERROR) << "write " << path;
++ return false;
++ }
++ HID_LOG(EVENT) << "wait reply " << path;
++ memset(&pfd, 0, sizeof(pfd));
++ pfd.fd = fd;
++ pfd.events = POLLIN;
++ if ((n = poll(&pfd, 1, 100)) == -1) {
++ HID_PLOG(EVENT) << "poll " << path;
++ return false;
++ } else if (n == 0) {
++ HID_LOG(EVENT) << "timed out " << path;
++ continue;
++ }
++ if (read(fd, data, 64) == -1) {
++ HID_PLOG(ERROR) << "read " << path;
++ return false;
++ }
++ /*
++ * Ping isn't always supported on the broadcast channel,
++ * so we might get an error, but we don't care - we're
++ * synched now.
++ */
++ HID_LOG(EVENT) << "got reply " << path;
++ return true;
++ }
++ HID_LOG(ERROR) << "no response " << path;
++ return false;
++}
++
++// HID report descriptor for U2F interface. Copied from:
++// https://chromium.googlesource.com/chromiumos/platform2/+/c6c7e4e54fce11932fedaa3ea10236bf75d85a2b%5E%21/u2fd/u2fhid.cc
++// Apparently Chromium wants to see these bytes, but OpenBSD fido(4)
++// devices prohibit USB_GET_REPORT_DESC ioctl that could be used to
++// get the bytes from the USB device.
++constexpr uint8_t kU2fReportDesc[] = {
++ 0x06, 0xD0, 0xF1, /* Usage Page (FIDO Alliance), FIDO_USAGE_PAGE */
++ 0x09, 0x01, /* Usage (U2F HID Auth. Device) FIDO_USAGE_U2FHID */
++ 0xA1, 0x01, /* Collection (Application), HID_APPLICATION */
++ 0x09, 0x20, /* Usage (Input Report Data), FIDO_USAGE_DATA_IN */
++ 0x15, 0x00, /* Logical Minimum (0) */
++ 0x26, 0xFF, 0x00, /* Logical Maximum (255) */
++ 0x75, 0x08, /* Report Size (8) */
++ 0x95, 0x40, /* Report Count (64), HID_INPUT_REPORT_BYTES */
++ 0x81, 0x02, /* Input (Data, Var, Abs), Usage */
++ 0x09, 0x21, /* Usage (Output Report Data), FIDO_USAGE_DATA_OUT */
++ 0x15, 0x00, /* Logical Minimum (0) */
++ 0x26, 0xFF, 0x00, /* Logical Maximum (255) */
++ 0x75, 0x08, /* Report Size (8) */
++ 0x95, 0x40, /* Report Count (64), HID_OUTPUT_REPORT_BYTES */
++ 0x91, 0x02, /* Output (Data, Var, Abs), Usage */
++ 0xC0 /* End Collection */
++};
++
++} // namespace
++
++struct HidServiceFido::ConnectParams {
++ ConnectParams(scoped_refptr<HidDeviceInfo> device_info,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback callback)
++ : device_info(std::move(device_info)),
++ allow_protected_reports(allow_protected_reports),
++ allow_fido_reports(allow_fido_reports),
++ callback(std::move(callback)),
++ task_runner(base::SequencedTaskRunner::GetCurrentDefault()),
++ blocking_task_runner(
++ base::ThreadPool::CreateSequencedTaskRunner(kBlockingTaskTraits)) {}
++ ~ConnectParams() {}
++
++ scoped_refptr<HidDeviceInfo> device_info;
++ bool allow_protected_reports;
++ bool allow_fido_reports;
++ ConnectCallback callback;
++ scoped_refptr<base::SequencedTaskRunner> task_runner;
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner;
++ base::ScopedFD fd;
++};
++
++class HidServiceFido::BlockingTaskRunnerHelper : public UdevWatcher::Observer {
++ public:
++ BlockingTaskRunnerHelper(base::WeakPtr<HidServiceFido> service)
++ : service_(std::move(service)),
++ task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++ }
++
++ BlockingTaskRunnerHelper(const BlockingTaskRunnerHelper&) = delete;
++ BlockingTaskRunnerHelper& operator=(const BlockingTaskRunnerHelper&) = delete;
++
++ ~BlockingTaskRunnerHelper() override {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ }
++
++ void Start() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ void *library = dlopen("libudev.so", RTLD_NOW | RTLD_LOCAL);
++ if (library) {
++ dlclose(library);
++ watcher_ = UdevWatcher::StartWatching(this);
++ watcher_->EnumerateExistingDevices();
++ } else {
++ HID_LOG(ERROR) << "No udev available, failling back to single enumeration";
++ WalkFidoDevices(nullptr);
++ }
++
++ task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&HidServiceFido::FirstEnumerationComplete, service_));
++ }
++
++ private:
++ void WalkFidoDevices(const char *name) {
++ fido_dev_info_t *devlist = NULL;
++ fido_dev_t *dev = NULL;
++ size_t devlist_len = 0, i;
++ const char *path;
++ int r;
++ const int MAX_FIDO_DEVICES = 256;
++
++ if ((devlist = fido_dev_info_new(MAX_FIDO_DEVICES)) == NULL) {
++ HID_LOG(ERROR) << "fido_dev_info_new failed";
++ goto out;
++ }
++ if ((r = fido_dev_info_manifest(devlist, MAX_FIDO_DEVICES, &devlist_len)) !=
++ FIDO_OK) {
++ HID_LOG(ERROR) << "fido_dev_info_manifest: " << fido_strerr(r);
++ goto out;
++ }
++
++ HID_LOG(EVENT) << "fido_dev_info_manifest found " << devlist_len
++ << " device(s)";
++
++ for (i = 0; i < devlist_len; i++) {
++ const fido_dev_info_t *di = fido_dev_info_ptr(devlist, i);
++
++ if (di == NULL) {
++ HID_LOG(ERROR) << "fido_dev_info_ptr " << i << " failed";
++ continue;
++ }
++
++ if ((path = fido_dev_info_path(di)) == NULL) {
++ HID_LOG(ERROR) << "fido_dev_info_path " << i << " failed";
++ continue;
++ }
++
++ if (name != nullptr && !strcmp(path, name)) {
++ HID_LOG(EVENT) << "hotplug device " << i << ": " << path;
++ OnFidoDeviceAdded(di);
++ break;
++ }
++
++ HID_LOG(EVENT) << "trying device " << i << ": " << path;
++ if ((dev = fido_dev_new()) == NULL) {
++ HID_LOG(ERROR) << "fido_dev_new failed";
++ continue;
++ }
++
++ if ((r = fido_dev_open(dev, path)) != FIDO_OK) {
++ HID_LOG(ERROR) << "fido_dev_open failed " << path;
++ fido_dev_free(&dev);
++ continue;
++ }
++
++ fido_dev_close(dev);
++ fido_dev_free(&dev);
++
++ OnFidoDeviceAdded(di);
++ }
++ out:
++ if (devlist != NULL)
++ fido_dev_info_free(&devlist, MAX_FIDO_DEVICES);
++ }
++
++ void OnFidoDeviceAdded(const fido_dev_info_t *di) {
++ auto null_as_empty = [](const char *r) -> std::string {
++ return (r != nullptr) ? r : "";
++ };
++ std::string device_node(null_as_empty(fido_dev_info_path(di)));
++ std::vector<uint8_t> report_descriptor(
++ kU2fReportDesc, kU2fReportDesc + sizeof(kU2fReportDesc));
++
++ auto device_info = base::MakeRefCounted<HidDeviceInfo>(
++ device_node, /*physical_device_id*/"", fido_dev_info_vendor(di),
++ fido_dev_info_product(di), null_as_empty(fido_dev_info_product_string(di)),
++ null_as_empty(fido_dev_info_manufacturer_string(di)),
++ device::mojom::HidBusType::kHIDBusTypeUSB, report_descriptor,
++ device_node);
++
++ task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&HidServiceFido::AddDevice, service_, device_info));
++ }
++
++ // UdevWatcher::Observer
++ void OnDeviceAdded(ScopedUdevDevicePtr device) override {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++
++ const char* subsystem = udev_device_get_subsystem(device.get());
++ if (!subsystem || strcmp(subsystem, "fido") != 0)
++ return;
++
++ const char* device_path = udev_device_get_syspath(device.get());
++ if (!device_path)
++ return;
++
++ WalkFidoDevices(device_path);
++ }
++
++ void OnDeviceRemoved(ScopedUdevDevicePtr device) override {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++
++ const char* device_path = udev_device_get_syspath(device.get());
++ if (device_path) {
++ task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&HidServiceFido::RemoveDevice, service_,
++ std::string(device_path)));
++ }
++ }
++
++ void OnDeviceChanged(ScopedUdevDevicePtr) override {}
++
++ SEQUENCE_CHECKER(sequence_checker_);
++ std::unique_ptr<UdevWatcher> watcher_;
++
++ // This weak pointer is only valid when checked on this task runner.
++ base::WeakPtr<HidServiceFido> service_;
++ scoped_refptr<base::SequencedTaskRunner> task_runner_;
++};
++
++HidServiceFido::HidServiceFido()
++ : blocking_task_runner_(
++ base::ThreadPool::CreateSequencedTaskRunner(kBlockingTaskTraits)),
++ helper_(nullptr, base::OnTaskRunnerDeleter(blocking_task_runner_)) {
++ // We need to properly initialize |blocking_task_helper_| here because we need
++ // |weak_factory_| to be created first.
++ helper_.reset(new BlockingTaskRunnerHelper(weak_factory_.GetWeakPtr()));
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Start,
++ base::Unretained(helper_.get())));
++}
++
++HidServiceFido::~HidServiceFido() = default;
++
++base::WeakPtr<HidService> HidServiceFido::GetWeakPtr() {
++ return weak_factory_.GetWeakPtr();
++}
++
++void HidServiceFido::Connect(const std::string& device_guid,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ const auto& map_entry = devices().find(device_guid);
++ if (map_entry == devices().end()) {
++ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
++ FROM_HERE, base::BindOnce(std::move(callback), nullptr));
++ return;
++ }
++ scoped_refptr<HidDeviceInfo> device_info = map_entry->second;
++
++ auto params =
++ std::make_unique<ConnectParams>(device_info, allow_protected_reports,
++ allow_fido_reports, std::move(callback));
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner =
++ params->blocking_task_runner;
++ blocking_task_runner->PostTask(
++ FROM_HERE, base::BindOnce(&HidServiceFido::OpenOnBlockingThread,
++ std::move(params)));
++}
++
++// static
++void HidServiceFido::OpenOnBlockingThread(
++ std::unique_ptr<ConnectParams> params) {
++ base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
++ base::BlockingType::MAY_BLOCK);
++ scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
++
++ base::FilePath device_path(params->device_info->device_node());
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid()) {
++ base::File::Error file_error = device_file.error_details();
++
++ if (file_error == base::File::FILE_ERROR_ACCESS_DENIED) {
++ HID_LOG(EVENT)
++ << "Access denied opening device read-write, trying read-only.";
++ flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
++ device_file.Initialize(device_path, flags);
++ }
++ }
++ if (!device_file.IsValid()) {
++ HID_LOG(EVENT) << "Failed to open '" << params->device_info->device_node()
++ << "': "
++ << base::File::ErrorToString(device_file.error_details());
++ task_runner->PostTask(FROM_HERE,
++ base::BindOnce(std::move(params->callback), nullptr));
++ return;
++ }
++ if (!terrible_ping_kludge(device_file.GetPlatformFile(), params->device_info->device_node())) {
++ HID_LOG(EVENT) << "Failed to ping " << params->device_info->device_node();
++ task_runner->PostTask(FROM_HERE, base::BindOnce(std::move(params->callback), nullptr));
++ return;
++ }
++ params->fd.reset(device_file.TakePlatformFile());
++
++ task_runner->PostTask(FROM_HERE, base::BindOnce(&HidServiceFido::FinishOpen,
++ std::move(params)));
++}
++
++// static
++void HidServiceFido::FinishOpen(std::unique_ptr<ConnectParams> params) {
++ DCHECK(params->fd.is_valid());
++
++ if (!base::SetNonBlocking(params->fd.get())) {
++ HID_PLOG(DEBUG) << "Failed to set the non-blocking flag on the device fd";
++ std::move(params->callback).Run(nullptr);
++ return;
++ }
++
++ std::move(params->callback)
++ .Run(base::MakeRefCounted<HidConnectionFido>(
++ std::move(params->device_info), std::move(params->fd),
++ std::move(params->blocking_task_runner),
++ params->allow_protected_reports, params->allow_fido_reports));
++}
++
++} // namespace device
diff --git a/devel/electron28/files/patch-services_device_hid_hid__service__fido.h b/devel/electron28/files/patch-services_device_hid_hid__service__fido.h
new file mode 100644
index 000000000000..c5af55c5d3c5
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__service__fido.h
@@ -0,0 +1,68 @@
+--- services/device/hid/hid_service_fido.h.orig 2022-10-28 16:39:00 UTC
++++ services/device/hid/hid_service_fido.h
+@@ -0,0 +1,65 @@
++// Copyright 2014 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef SERVICES_DEVICE_HID_HID_SERVICE_LINUX_H_
++#define SERVICES_DEVICE_HID_HID_SERVICE_LINUX_H_
++
++#include <memory>
++
++#include "base/compiler_specific.h"
++#include "base/files/scoped_file.h"
++#include "base/memory/weak_ptr.h"
++#include "base/task/sequenced_task_runner.h"
++#include "build/build_config.h"
++#include "build/chromeos_buildflags.h"
++#include "services/device/hid/hid_device_info.h"
++#include "services/device/hid/hid_service.h"
++
++namespace device {
++
++class HidServiceFido : public HidService {
++ public:
++ HidServiceFido();
++ HidServiceFido(HidServiceFido&) = delete;
++ HidServiceFido& operator=(HidServiceFido&) = delete;
++ ~HidServiceFido() override;
++
++ // HidService:
++ void Connect(const std::string& device_id,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback callback) override;
++ base::WeakPtr<HidService> GetWeakPtr() override;
++
++ private:
++ struct ConnectParams;
++ class BlockingTaskRunnerHelper;
++
++// These functions implement the process of locating, requesting access to and
++// opening a device. Because this operation crosses multiple threads these
++// functions are static and the necessary parameters are passed as a single
++// struct.
++#if BUILDFLAG(IS_CHROMEOS_ASH)
++ static void OnPathOpenComplete(std::unique_ptr<ConnectParams> params,
++ base::ScopedFD fd);
++ static void OnPathOpenError(const std::string& device_path,
++ ConnectCallback callback,
++ const std::string& error_name,
++ const std::string& error_message);
++#else
++ static void OpenOnBlockingThread(std::unique_ptr<ConnectParams> params);
++#endif
++ static void FinishOpen(std::unique_ptr<ConnectParams> params);
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++
++ // |helper_| lives on the sequence |blocking_task_runner_| posts to and holds
++ // a weak reference back to the service that owns it.
++ std::unique_ptr<BlockingTaskRunnerHelper, base::OnTaskRunnerDeleter> helper_;
++ base::WeakPtrFactory<HidServiceFido> weak_factory_{this};
++};
++
++} // namespace device
++
++#endif // SERVICES_DEVICE_HID_HID_SERVICE_LINUX_H_
diff --git a/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.cc b/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.cc
new file mode 100644
index 000000000000..0e12715a6312
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.cc
@@ -0,0 +1,398 @@
+--- services/device/hid/hid_service_freebsd.cc.orig 2023-04-10 14:02:12 UTC
++++ services/device/hid/hid_service_freebsd.cc
+@@ -0,0 +1,395 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/hid/hid_service_freebsd.h"
++
++#include <dev/usb/usb_ioctl.h>
++#include <stdint.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++
++#include <set>
++#include <string>
++#include <vector>
++
++#include "base/files/file_descriptor_watcher_posix.h"
++#include "base/files/file_enumerator.h"
++#include "base/files/file_util.h"
++#include "base/files/file.h"
++#include "base/location.h"
++#include "base/logging.h"
++#include "base/posix/eintr_wrapper.h"
++#include "base/stl_util.h"
++#include "base/strings/pattern.h"
++#include "base/strings/stringprintf.h"
++#include "base/strings/sys_string_conversions.h"
++#include "base/strings/string_util.h"
++#include "base/strings/string_split.h"
++#include "base/task/single_thread_task_runner.h"
++#include "base/task/thread_pool.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "base/threading/thread_restrictions.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_connection_freebsd.h"
++
++const int kMaxPermissionChecks = 5;
++
++namespace device {
++
++struct HidServiceFreeBSD::ConnectParams {
++ ConnectParams(scoped_refptr<HidDeviceInfo> device_info,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback callback)
++ : device_info(std::move(device_info)),
++ allow_protected_reports(allow_protected_reports),
++ allow_fido_reports(allow_fido_reports),
++ callback(std::move(callback)),
++ task_runner(base::SequencedTaskRunner::GetCurrentDefault()),
++ blocking_task_runner(
++ base::ThreadPool::CreateSequencedTaskRunner(kBlockingTaskTraits)) {}
++ ~ConnectParams() {}
++
++ scoped_refptr<HidDeviceInfo> device_info;
++ bool allow_protected_reports;
++ bool allow_fido_reports;
++ ConnectCallback callback;
++ scoped_refptr<base::SequencedTaskRunner> task_runner;
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner;
++ base::ScopedFD fd;
++};
++
++class HidServiceFreeBSD::BlockingTaskRunnerHelper {
++ public:
++ BlockingTaskRunnerHelper(base::WeakPtr<HidServiceFreeBSD> service)
++ : service_(std::move(service)),
++ task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++
++ timer_.reset(new base::RepeatingTimer());
++ devd_buffer_ = new net::IOBufferWithSize(1024);
++ }
++
++ BlockingTaskRunnerHelper(const BlockingTaskRunnerHelper&) = delete;
++ BlockingTaskRunnerHelper& operator=(const BlockingTaskRunnerHelper&) = delete;
++
++ ~BlockingTaskRunnerHelper() {
++ }
++
++ void Start() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ const base::FilePath kDevRoot("/dev");
++ const std::string kUHIDPattern("/dev/uhid*");
++
++ base::FileEnumerator enumerator(kDevRoot, false, base::FileEnumerator::FILES);
++ do {
++ const base::FilePath next_device_path(enumerator.Next());
++ const std::string next_device = next_device_path.value();
++ if (next_device.empty())
++ break;
++
++ if (base::MatchPattern(next_device, kUHIDPattern))
++ OnDeviceAdded(next_device.substr(5));
++ } while (true);
++
++ SetupDevdMonitor();
++
++ task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&HidServiceFreeBSD::FirstEnumerationComplete, service_));
++ }
++
++ bool HaveReadWritePermissions(std::string device_id) {
++ std::string device_node = "/dev/" + device_id;
++ base::internal::AssertBlockingAllowed();
++
++ base::FilePath device_path(device_node);
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid())
++ return false;
++
++ return true;
++ }
++
++ void OnDeviceAdded(std::string device_id) {
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ std::string device_node = "/dev/" + device_id;
++ uint16_t vendor_id = 0xffff;
++ uint16_t product_id = 0xffff;
++ std::string product_name = "";
++ std::string serial_number = "";
++
++ std::vector<uint8_t> report_descriptor;
++
++ base::internal::AssertBlockingAllowed();
++
++ base::FilePath device_path(device_node);
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid()) {
++ HID_LOG(ERROR) << "Failed to open '" << device_node
++ << "': "
++ << base::File::ErrorToString(device_file.error_details());
++ return;
++ }
++
++ base::ScopedFD fd;
++ fd.reset(device_file.TakePlatformFile());
++
++ struct usb_gen_descriptor ugd;
++ ugd.ugd_data = NULL;
++ ugd.ugd_maxlen = 0xffff;
++ int result = HANDLE_EINTR(
++ ioctl(fd.get(), USB_GET_REPORT_DESC, &ugd));
++
++ if (result < 0) {
++ HID_LOG(ERROR) << "Failed to get report descriptor size";
++ return;
++ }
++
++ report_descriptor.resize(ugd.ugd_actlen);
++
++ ugd.ugd_data = report_descriptor.data();
++ ugd.ugd_maxlen = ugd.ugd_actlen;
++ result = HANDLE_EINTR(
++ ioctl(fd.get(), USB_GET_REPORT_DESC, &ugd));
++
++ if (result < 0) {
++ HID_LOG(ERROR) << "Failed to get report descriptor";
++ return;
++ }
++
++ scoped_refptr<HidDeviceInfo> device_info(new HidDeviceInfo(
++ device_id,
++ /*physical_device_id*/"",
++ vendor_id,
++ product_id,
++ product_name,
++ serial_number,
++ device::mojom::HidBusType::kHIDBusTypeUSB,
++ report_descriptor,
++ device_node));
++
++ task_runner_->PostTask(FROM_HERE, base::BindOnce(&HidServiceFreeBSD::AddDevice,
++ service_, device_info));
++ }
++
++ void OnDeviceRemoved(std::string device_id) {
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&HidServiceFreeBSD::RemoveDevice, service_,
++ device_id));
++ }
++
++ private:
++
++ void CheckPendingPermissionChange() {
++ base::internal::AssertBlockingAllowed();
++ std::map<std::string, int>::iterator it;
++ for (it = permissions_checks_attempts_.begin(); it != permissions_checks_attempts_.end();) {
++ std::string device_name = it->first;
++ bool keep = true;
++ if (HaveReadWritePermissions(device_name)) {
++ OnDeviceAdded(device_name);
++ keep = false;
++ }
++ else if (it->second-- <= 0) {
++ HID_LOG(ERROR) << "Still don't have write permissions to '" << device_name
++ << "' after " << kMaxPermissionChecks << " attempts";
++ keep = false;
++ }
++
++ if (keep)
++ ++it;
++ else
++ permissions_checks_attempts_.erase(it++);
++ }
++
++ if (permissions_checks_attempts_.empty())
++ timer_->Stop();
++ }
++
++ void SetupDevdMonitor() {
++ base::internal::AssertBlockingAllowed();
++
++ int devd_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
++ if (devd_fd < 0)
++ return;
++
++ struct sockaddr_un sa;
++
++ sa.sun_family = AF_UNIX;
++ strlcpy(sa.sun_path, "/var/run/devd.seqpacket.pipe", sizeof(sa.sun_path));
++ if (connect(devd_fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
++ close(devd_fd);
++ return;
++ }
++
++ devd_fd_.reset(devd_fd);
++ file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
++ devd_fd_.get(), base::BindRepeating(&BlockingTaskRunnerHelper::OnDevdMessageCanBeRead,
++ base::Unretained(this)));
++ }
++
++ void OnDevdMessageCanBeRead() {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ ssize_t bytes_read = HANDLE_EINTR(recv(devd_fd_.get(), devd_buffer_->data(),
++ devd_buffer_->size() - 1, MSG_WAITALL));
++ if (bytes_read < 0) {
++ if (errno != EAGAIN) {
++ HID_LOG(ERROR) << "Read failed";
++ file_watcher_.reset();
++ }
++ return;
++ }
++
++ devd_buffer_->data()[bytes_read] = 0;
++ char *data = devd_buffer_->data();
++ // It may take some time for devd to change permissions
++ // on /dev/uhidX node. So do not fail immediately if
++ // open fail. Retry each second for kMaxPermissionChecks
++ // times before giving up entirely
++ if (base::StartsWith(data, "+uhid", base::CompareCase::SENSITIVE)) {
++ std::vector<std::string> parts = base::SplitString(
++ data, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
++ if (!parts.empty()) {
++ std::string device_name = parts[0].substr(1); // skip '+'
++ if (HaveReadWritePermissions(device_name))
++ OnDeviceAdded(parts[0].substr(1));
++ else {
++ // Do not re-add to checks
++ if (permissions_checks_attempts_.find(device_name) == permissions_checks_attempts_.end()) {
++ permissions_checks_attempts_.insert(std::pair<std::string, int>(device_name, kMaxPermissionChecks));
++ timer_->Start(FROM_HERE, base::Seconds(1),
++ this, &BlockingTaskRunnerHelper::CheckPendingPermissionChange);
++ }
++ }
++ }
++ }
++
++ if (base::StartsWith(data, "-uhid", base::CompareCase::SENSITIVE)) {
++ std::vector<std::string> parts = base::SplitString(
++ data, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
++ if (!parts.empty()) {
++ std::string device_name = parts[0].substr(1); // skip '-'
++ auto it = permissions_checks_attempts_.find(device_name);
++ if (it != permissions_checks_attempts_.end()) {
++ permissions_checks_attempts_.erase(it);
++ if (permissions_checks_attempts_.empty())
++ timer_->Stop();
++ }
++ OnDeviceRemoved(parts[0].substr(1));
++ }
++ }
++ }
++
++ SEQUENCE_CHECKER(sequence_checker_);
++
++ // This weak pointer is only valid when checked on this task runner.
++ base::WeakPtr<HidServiceFreeBSD> service_;
++ scoped_refptr<base::SequencedTaskRunner> task_runner_;
++ std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_;
++ std::unique_ptr<base::RepeatingTimer> timer_;
++ base::ScopedFD devd_fd_;
++ scoped_refptr<net::IOBufferWithSize> devd_buffer_;
++ std::map<std::string, int> permissions_checks_attempts_;
++};
++
++HidServiceFreeBSD::HidServiceFreeBSD()
++ : blocking_task_runner_(
++ base::ThreadPool::CreateSequencedTaskRunner(kBlockingTaskTraits)),
++ helper_(nullptr, base::OnTaskRunnerDeleter(blocking_task_runner_)) {
++ helper_.reset(new BlockingTaskRunnerHelper(weak_factory_.GetWeakPtr()));
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::BindOnce(&BlockingTaskRunnerHelper::Start, base::Unretained(helper_.get())));
++}
++
++HidServiceFreeBSD::~HidServiceFreeBSD() {
++ blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
++}
++
++base::WeakPtr<HidService> HidServiceFreeBSD::GetWeakPtr() {
++ return weak_factory_.GetWeakPtr();
++}
++
++// static
++void HidServiceFreeBSD::OpenOnBlockingThread(
++ std::unique_ptr<ConnectParams> params) {
++ base::ScopedBlockingCall scoped_blocking_call(
++ FROM_HERE, base::BlockingType::MAY_BLOCK);
++ scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
++
++ base::FilePath device_path(params->device_info->device_node());
++ base::File device_file;
++ int flags =
++ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
++ device_file.Initialize(device_path, flags);
++ if (!device_file.IsValid()) {
++ HID_LOG(EVENT) << "Failed to open '" << params->device_info->device_node()
++ << "': "
++ << base::File::ErrorToString(device_file.error_details());
++ task_runner->PostTask(FROM_HERE,
++ base::BindOnce(std::move(params->callback), nullptr));
++ return;
++ }
++ params->fd.reset(device_file.TakePlatformFile());
++ task_runner->PostTask(FROM_HERE, base::BindOnce(&HidServiceFreeBSD::FinishOpen,
++ std::move(params)));
++}
++
++void HidServiceFreeBSD::Connect(const std::string& device_guid,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ const auto& map_entry = devices().find(device_guid);
++ if (map_entry == devices().end()) {
++ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
++ FROM_HERE, base::BindOnce(std::move(callback), nullptr));
++ return;
++ }
++
++ scoped_refptr<HidDeviceInfo> device_info = map_entry->second;
++
++ auto params = std::make_unique<ConnectParams>(device_info,
++ allow_protected_reports,
++ allow_fido_reports,
++ std::move(callback));
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner =
++ params->blocking_task_runner;
++
++ blocking_task_runner->PostTask(
++ FROM_HERE, base::BindOnce(&HidServiceFreeBSD::OpenOnBlockingThread,
++ std::move(params)));
++}
++
++// static
++void HidServiceFreeBSD::FinishOpen(std::unique_ptr<ConnectParams> params) {
++ DCHECK(params->fd.is_valid());
++
++ if (!base::SetNonBlocking(params->fd.get())) {
++ HID_PLOG(ERROR) << "Failed to set the non-blocking flag on the device fd";
++ std::move(params->callback).Run(nullptr);
++ }
++
++ std::move(params->callback).Run(base::MakeRefCounted<HidConnectionFreeBSD>(
++ std::move(params->device_info),
++ std::move(params->fd),
++ std::move(params->blocking_task_runner),
++ params->allow_protected_reports,
++ params->allow_fido_reports
++ ));
++}
++
++} // namespace device
diff --git a/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.h b/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.h
new file mode 100644
index 000000000000..b60d2fc84553
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_hid_hid__service__freebsd.h
@@ -0,0 +1,52 @@
+--- services/device/hid/hid_service_freebsd.h.orig 2022-02-07 13:39:41 UTC
++++ services/device/hid/hid_service_freebsd.h
+@@ -0,0 +1,49 @@
++// Copyright 2014 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef DEVICE_HID_HID_SERVICE_FREEBSD_H_
++#define DEVICE_HID_HID_SERVICE_FREEBSD_H_
++
++#include <string>
++
++#include "base/memory/ref_counted.h"
++#include "base/memory/weak_ptr.h"
++#include "base/timer/timer.h"
++#include "services/device/hid/hid_service.h"
++#include "net/base/io_buffer.h"
++
++namespace device {
++
++class HidServiceFreeBSD : public HidService {
++ public:
++ HidServiceFreeBSD();
++
++ HidServiceFreeBSD(const HidServiceFreeBSD&) = delete;
++ HidServiceFreeBSD& operator=(const HidServiceFreeBSD&) = delete;
++
++ ~HidServiceFreeBSD() override;
++
++ void Connect(const std::string& device_guid,
++ bool allow_protected_reports,
++ bool allow_fido_reports,
++ ConnectCallback connect) override;
++ base::WeakPtr<HidService> GetWeakPtr() override;
++
++ private:
++ struct ConnectParams;
++ class BlockingTaskRunnerHelper;
++
++ static void OpenOnBlockingThread(std::unique_ptr<ConnectParams> params);
++ static void FinishOpen(std::unique_ptr<ConnectParams> params);
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++ // |helper_| lives on the sequence |blocking_task_runner_| posts to and holds
++ // a weak reference back to the service that owns it.
++ std::unique_ptr<BlockingTaskRunnerHelper, base::OnTaskRunnerDeleter> helper_;
++ base::WeakPtrFactory<HidServiceFreeBSD> weak_factory_{this};
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_SERVICE_FREEBSD_H_
diff --git a/devel/electron28/files/patch-services_device_public_cpp_generic__sensor_sensor__reading.h b/devel/electron28/files/patch-services_device_public_cpp_generic__sensor_sensor__reading.h
new file mode 100644
index 000000000000..9d6a5751b0d3
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_public_cpp_generic__sensor_sensor__reading.h
@@ -0,0 +1,11 @@
+--- services/device/public/cpp/generic_sensor/sensor_reading.h.orig 2023-11-29 21:40:08 UTC
++++ services/device/public/cpp/generic_sensor/sensor_reading.h
+@@ -8,6 +8,8 @@
+ #include <stddef.h>
+ #include <stdint.h>
+
++#include <cstdint>
++
+ #include <type_traits>
+
+ namespace device {
diff --git a/devel/electron28/files/patch-services_device_public_mojom_BUILD.gn b/devel/electron28/files/patch-services_device_public_mojom_BUILD.gn
new file mode 100644
index 000000000000..7377d91e0df5
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_public_mojom_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/device/public/mojom/BUILD.gn.orig 2023-10-19 19:58:30 UTC
++++ services/device/public/mojom/BUILD.gn
+@@ -97,7 +97,7 @@ mojom("device_service") {
+ enable_js_fuzzing = false
+
+ enabled_features = []
+- if ((is_linux || is_chromeos) && use_udev) {
++ if ((is_linux || is_chromeos) && !is_bsd && use_udev) {
+ enabled_features += [ "enable_input_device_manager" ]
+ }
+
diff --git a/devel/electron28/files/patch-services_device_serial_BUILD.gn b/devel/electron28/files/patch-services_device_serial_BUILD.gn
new file mode 100644
index 000000000000..a1f5f2465a1e
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_serial_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/device/serial/BUILD.gn.orig 2022-11-30 08:12:58 UTC
++++ services/device/serial/BUILD.gn
+@@ -5,7 +5,7 @@
+ import("//build/config/chromeos/ui_mode.gni")
+ import("//build/config/features.gni")
+
+-if (is_win || ((is_linux || is_chromeos) && use_udev) || is_mac) {
++if (is_win || ((!is_bsd && is_linux || is_chromeos) && use_udev) || is_mac) {
+ config("platform_support") {
+ visibility = [ ":serial" ]
+ if (is_win) {
diff --git a/devel/electron28/files/patch-services_device_serial_serial__device__enumerator.cc b/devel/electron28/files/patch-services_device_serial_serial__device__enumerator.cc
new file mode 100644
index 000000000000..b4205ea2e306
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_serial_serial__device__enumerator.cc
@@ -0,0 +1,20 @@
+--- services/device/serial/serial_device_enumerator.cc.orig 2023-03-30 00:33:55 UTC
++++ services/device/serial/serial_device_enumerator.cc
+@@ -12,7 +12,7 @@
+ #include "build/build_config.h"
+ #include "components/device_event_log/device_event_log.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "services/device/serial/serial_device_enumerator_linux.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "services/device/serial/serial_device_enumerator_mac.h"
+@@ -25,7 +25,7 @@ namespace device {
+ // static
+ std::unique_ptr<SerialDeviceEnumerator> SerialDeviceEnumerator::Create(
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return SerialDeviceEnumeratorLinux::Create();
+ #elif BUILDFLAG(IS_MAC)
+ return std::make_unique<SerialDeviceEnumeratorMac>();
diff --git a/devel/electron28/files/patch-services_device_serial_serial__io__handler__posix.cc b/devel/electron28/files/patch-services_device_serial_serial__io__handler__posix.cc
new file mode 100644
index 000000000000..c129abd11188
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_serial_serial__io__handler__posix.cc
@@ -0,0 +1,11 @@
+--- services/device/serial/serial_io_handler_posix.cc.orig 2023-03-30 00:33:55 UTC
++++ services/device/serial/serial_io_handler_posix.cc
+@@ -68,7 +68,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* spee
+ BITRATE_TO_SPEED_CASE(9600)
+ BITRATE_TO_SPEED_CASE(19200)
+ BITRATE_TO_SPEED_CASE(38400)
+-#if !BUILDFLAG(IS_MAC)
++#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_BSD)
+ BITRATE_TO_SPEED_CASE(57600)
+ BITRATE_TO_SPEED_CASE(115200)
+ BITRATE_TO_SPEED_CASE(230400)
diff --git a/devel/electron28/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc b/devel/electron28/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc
new file mode 100644
index 000000000000..48001843b4b1
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc
@@ -0,0 +1,14 @@
+--- services/device/time_zone_monitor/time_zone_monitor_linux.cc.orig 2023-10-19 19:58:30 UTC
++++ services/device/time_zone_monitor/time_zone_monitor_linux.cc
+@@ -131,7 +131,11 @@ class TimeZoneMonitorLinuxImpl
+ // false positives are harmless, assuming the false positive rate is
+ // reasonable.
+ const char* const kFilesToWatch[] = {
++#if BUILDFLAG(IS_BSD)
++ "/etc/localtime",
++#else
+ "/etc/localtime", "/etc/timezone", "/etc/TZ",
++#endif
+ };
+ for (size_t index = 0; index < std::size(kFilesToWatch); ++index) {
+ file_path_watchers_.push_back(std::make_unique<base::FilePathWatcher>());
diff --git a/devel/electron28/files/patch-services_device_usb_BUILD.gn b/devel/electron28/files/patch-services_device_usb_BUILD.gn
new file mode 100644
index 000000000000..494a4d5b0a31
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_usb_BUILD.gn
@@ -0,0 +1,52 @@
+--- services/device/usb/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ services/device/usb/BUILD.gn
+@@ -90,15 +90,17 @@ static_library("usb") {
+ deps += [ "//third_party/re2" ]
+ }
+
+- if (is_mac) {
+- sources += [
+- "usb_device_handle_mac.cc",
+- "usb_device_handle_mac.h",
+- "usb_device_mac.cc",
+- "usb_device_mac.h",
+- "usb_service_mac.cc",
+- "usb_service_mac.h",
+- ]
++ if (is_mac || is_openbsd) {
++ if (is_mac) {
++ sources += [
++ "usb_device_handle_mac.cc",
++ "usb_device_handle_mac.h",
++ "usb_device_mac.cc",
++ "usb_device_mac.h",
++ "usb_service_mac.cc",
++ "usb_service_mac.h",
++ ]
++ }
+
+ # These sources and deps are required for libusb.
+ # TODO(https://crbug.com/1096743) Remove these sources.
+@@ -122,6 +124,13 @@ static_library("usb") {
+ deps += [ "//third_party/libusb" ]
+ }
+
++ if (is_freebsd) {
++ sources += [
++ "usb_service_fake.cc",
++ "usb_service_fake.h",
++ ]
++ }
++
+ if (is_linux || is_chromeos) {
+ sources += [
+ "usb_device_linux.cc",
+@@ -139,7 +148,7 @@ static_library("usb") {
+ deps += [ "//device/udev_linux" ]
+ }
+
+- if (is_android || is_chromeos || is_linux) {
++ if (is_android || is_chromeos || is_linux && !is_bsd) {
+ sources += [
+ "usb_device_handle_usbfs.cc",
+ "usb_device_handle_usbfs.h",
diff --git a/devel/electron28/files/patch-services_device_usb_usb__service.cc b/devel/electron28/files/patch-services_device_usb_usb__service.cc
new file mode 100644
index 000000000000..3e42afc33502
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_usb_usb__service.cc
@@ -0,0 +1,39 @@
+--- services/device/usb/usb_service.cc.orig 2022-11-30 08:12:58 UTC
++++ services/device/usb/usb_service.cc
+@@ -22,13 +22,17 @@
+
+ #if BUILDFLAG(IS_ANDROID)
+ #include "services/device/usb/usb_service_android.h"
+-#elif defined(USE_UDEV)
++#elif defined(USE_UDEV) && !BUILDFLAG(IS_BSD)
+ #include "services/device/usb/usb_service_linux.h"
+ #elif BUILDFLAG(IS_MAC)
+ #include "services/device/usb/usb_service_impl.h"
+ #include "services/device/usb/usb_service_mac.h"
+ #elif BUILDFLAG(IS_WIN)
+ #include "services/device/usb/usb_service_win.h"
++#elif BUILDFLAG(IS_OPENBSD)
++#include "services/device/usb/usb_service_impl.h"
++#elif BUILDFLAG(IS_FREEBSD)
++#include "services/device/usb/usb_service_fake.h"
+ #endif
+
+ namespace device {
+@@ -51,7 +55,7 @@ constexpr base::TaskTraits UsbService::kBlockingTaskTr
+ std::unique_ptr<UsbService> UsbService::Create() {
+ #if BUILDFLAG(IS_ANDROID)
+ return base::WrapUnique(new UsbServiceAndroid());
+-#elif defined(USE_UDEV)
++#elif defined(USE_UDEV) && !BUILDFLAG(IS_BSD)
+ return base::WrapUnique(new UsbServiceLinux());
+ #elif BUILDFLAG(IS_WIN)
+ return base::WrapUnique(new UsbServiceWin());
+@@ -60,6 +64,8 @@ std::unique_ptr<UsbService> UsbService::Create() {
+ return base::WrapUnique(new UsbServiceMac());
+ else
+ return base::WrapUnique(new UsbServiceImpl());
++#elif BUILDFLAG(IS_BSD)
++ return base::WrapUnique(new UsbServiceImpl());
+ #else
+ return nullptr;
+ #endif
diff --git a/devel/electron28/files/patch-services_device_usb_usb__service__fake.cc b/devel/electron28/files/patch-services_device_usb_usb__service__fake.cc
new file mode 100644
index 000000000000..03bcf21b39ab
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_usb_usb__service__fake.cc
@@ -0,0 +1,52 @@
+--- services/device/usb/usb_service_fake.cc.orig 2023-04-10 14:02:12 UTC
++++ services/device/usb/usb_service_fake.cc
+@@ -0,0 +1,49 @@
++// Copyright 2014 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/device/usb/usb_service_fake.h"
++
++#include <stdint.h>
++
++#include <list>
++#include <memory>
++#include <set>
++#include <utility>
++
++#include "base/barrier_closure.h"
++#include "base/containers/contains.h"
++#include "base/location.h"
++#include "base/memory/ref_counted_memory.h"
++#include "base/memory/weak_ptr.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/strings/utf_string_conversions.h"
++#include "base/task/sequenced_task_runner.h"
++#include "base/task/single_thread_task_runner.h"
++#include "base/task/thread_pool.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "build/build_config.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/usb/usb_device_handle.h"
++#include "services/device/usb/usb_error.h"
++#include "services/device/usb/webusb_descriptors.h"
++
++namespace device {
++
++UsbServiceImpl::UsbServiceImpl()
++ : task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
++ NOTIMPLEMENTED();
++}
++
++UsbServiceImpl::~UsbServiceImpl() {
++ NOTIMPLEMENTED();
++ NotifyWillDestroyUsbService();
++}
++
++void UsbServiceImpl::GetDevices(GetDevicesCallback callback) {
++ NOTIMPLEMENTED();
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++ UsbService::GetDevices(std::move(callback));
++}
++
++} // namespace device
diff --git a/devel/electron28/files/patch-services_device_usb_usb__service__fake.h b/devel/electron28/files/patch-services_device_usb_usb__service__fake.h
new file mode 100644
index 000000000000..2e123db7f3be
--- /dev/null
+++ b/devel/electron28/files/patch-services_device_usb_usb__service__fake.h
@@ -0,0 +1,51 @@
+--- services/device/usb/usb_service_fake.h.orig 2022-10-29 13:32:26 UTC
++++ services/device/usb/usb_service_fake.h
+@@ -0,0 +1,48 @@
++// Copyright 2015 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
++#define SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
++
++#include "services/device/usb/usb_service.h"
++
++#include <stddef.h>
++
++#include <map>
++#include <set>
++#include <string>
++#include <vector>
++
++#include "base/containers/queue.h"
++#include "base/memory/weak_ptr.h"
++#include "build/build_config.h"
++#include "services/device/usb/usb_context.h"
++#include "services/device/usb/usb_device_impl.h"
++#include "third_party/abseil-cpp/absl/types/optional.h"
++
++namespace device {
++
++class UsbDeviceImpl;
++
++class UsbServiceImpl final : public UsbService {
++ public:
++ UsbServiceImpl();
++
++ UsbServiceImpl(const UsbServiceImpl&) = delete;
++ UsbServiceImpl& operator=(const UsbServiceImpl&) = delete;
++
++ ~UsbServiceImpl() override;
++
++ private:
++ // device::UsbService implementation
++ void GetDevices(GetDevicesCallback callback) override;
++
++ void OnUsbContext(scoped_refptr<UsbContext> context);
++
++ scoped_refptr<base::SequencedTaskRunner> task_runner_;
++};
++
++} // namespace device
++
++#endif // SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
diff --git a/devel/electron28/files/patch-services_network_BUILD.gn b/devel/electron28/files/patch-services_network_BUILD.gn
new file mode 100644
index 000000000000..af4ca4507ebe
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_BUILD.gn
@@ -0,0 +1,10 @@
+--- services/network/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ services/network/BUILD.gn
+@@ -394,7 +394,6 @@ if (is_linux || is_chromeos) {
+ ]
+ deps = [
+ "//base:base",
+- "//sandbox/linux:sandbox_services",
+ "//sandbox/policy:policy",
+ ]
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
diff --git a/devel/electron28/files/patch-services_network_network__context.cc b/devel/electron28/files/patch-services_network_network__context.cc
new file mode 100644
index 000000000000..42860df4e85c
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__context.cc
@@ -0,0 +1,20 @@
+--- services/network/network_context.cc.orig 2023-12-20 07:12:20 UTC
++++ services/network/network_context.cc
+@@ -568,7 +568,7 @@ NetworkContext::NetworkContextHttpAuthPreferences::
+ NetworkContext::NetworkContextHttpAuthPreferences::
+ ~NetworkContextHttpAuthPreferences() = default;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool NetworkContext::NetworkContextHttpAuthPreferences::AllowGssapiLibraryLoad()
+ const {
+ if (network_service_) {
+@@ -2497,7 +2497,7 @@ void NetworkContext::OnHttpAuthDynamicParamsChanged(
+ http_auth_dynamic_network_service_params->android_negotiate_account_type);
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ http_auth_merged_preferences_.set_allow_gssapi_library_load(
+ http_auth_dynamic_network_service_params->allow_gssapi_library_load);
+ #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
diff --git a/devel/electron28/files/patch-services_network_network__context.h b/devel/electron28/files/patch-services_network_network__context.h
new file mode 100644
index 000000000000..5041c817b8ca
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__context.h
@@ -0,0 +1,11 @@
+--- services/network/network_context.h.orig 2023-12-20 07:12:20 UTC
++++ services/network/network_context.h
+@@ -681,7 +681,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
+ public:
+ explicit NetworkContextHttpAuthPreferences(NetworkService* network_service);
+ ~NetworkContextHttpAuthPreferences() override;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool AllowGssapiLibraryLoad() const override;
+ #endif // BUILDFLAG(IS_LINUX)
+ private:
diff --git a/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.cc b/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..842597f21080
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.cc
@@ -0,0 +1,37 @@
+--- services/network/network_sandbox_hook_linux.cc.orig 2023-05-25 00:42:01 UTC
++++ services/network/network_sandbox_hook_linux.cc
+@@ -14,11 +14,14 @@
+ #include "sandbox/policy/features.h"
+ #include "third_party/abseil-cpp/absl/types/optional.h"
+
++#if !BUILDFLAG(IS_BSD)
+ using sandbox::syscall_broker::BrokerFilePermission;
+ using sandbox::syscall_broker::MakeBrokerCommandSet;
++#endif
+
+ namespace network {
+
++#if !BUILDFLAG(IS_BSD)
+ sandbox::syscall_broker::BrokerCommandSet GetNetworkBrokerCommandSet() {
+ return MakeBrokerCommandSet({
+ sandbox::syscall_broker::COMMAND_ACCESS,
+@@ -102,9 +105,11 @@ void LoadNetworkLibraries() {
+ }
+ }
+ #endif // BUILDFLAG(IS_CHROMEOS)
++#endif
+
+ bool NetworkPreSandboxHook(std::vector<std::string> network_context_parent_dirs,
+ sandbox::policy::SandboxLinux::Options options) {
++#if !BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(IS_CHROMEOS)
+ LoadNetworkLibraries();
+ #endif
+@@ -117,6 +122,7 @@ bool NetworkPreSandboxHook(std::vector<std::string> ne
+ GetNetworkBrokerCommandSet(),
+ GetNetworkFilePermissions(std::move(network_context_parent_dirs)),
+ sandbox::policy::SandboxLinux::PreSandboxHook(), options);
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.h b/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.h
new file mode 100644
index 000000000000..80fe3360382a
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__sandbox__hook__linux.h
@@ -0,0 +1,14 @@
+--- services/network/network_sandbox_hook_linux.h.orig 2023-05-25 00:42:01 UTC
++++ services/network/network_sandbox_hook_linux.h
+@@ -6,7 +6,11 @@
+ #define SERVICES_NETWORK_NETWORK_SANDBOX_HOOK_LINUX_H_
+
+ #include "base/component_export.h"
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++#include "sandbox/policy/sandbox.h"
++#else
+ #include "sandbox/policy/linux/sandbox_linux.h"
++#endif
+
+ namespace network {
+
diff --git a/devel/electron28/files/patch-services_network_network__service.cc b/devel/electron28/files/patch-services_network_network__service.cc
new file mode 100644
index 000000000000..ec3e233fd08a
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__service.cc
@@ -0,0 +1,29 @@
+--- services/network/network_service.cc.orig 2023-11-29 21:40:08 UTC
++++ services/network/network_service.cc
+@@ -96,7 +96,7 @@
+ #include "third_party/boringssl/src/include/openssl/cpu.h"
+ #endif
+
+-#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || \
++#if ((BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || BUILDFLAG(IS_BSD)) || \
+ BUILDFLAG(IS_CHROMEOS_LACROS)
+
+ #include "components/os_crypt/sync/key_storage_config_linux.h"
+@@ -998,7 +998,7 @@ void NetworkService::SetExplicitlyAllowedPorts(
+ net::SetExplicitlyAllowedPorts(ports);
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void NetworkService::SetGssapiLibraryLoadObserver(
+ mojo::PendingRemote<mojom::GssapiLibraryLoadObserver>
+ gssapi_library_load_observer) {
+@@ -1080,7 +1080,7 @@ NetworkService::CreateHttpAuthHandlerFactory(NetworkCo
+ );
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void NetworkService::OnBeforeGssapiLibraryLoad() {
+ if (gssapi_library_load_observer_.is_bound()) {
+ gssapi_library_load_observer_->OnBeforeGssapiLibraryLoad();
diff --git a/devel/electron28/files/patch-services_network_network__service.h b/devel/electron28/files/patch-services_network_network__service.h
new file mode 100644
index 000000000000..657742859ca7
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_network__service.h
@@ -0,0 +1,29 @@
+--- services/network/network_service.h.orig 2023-11-29 21:40:08 UTC
++++ services/network/network_service.h
+@@ -225,7 +225,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService
+ mojo::PendingReceiver<mojom::NetworkServiceTest> receiver) override;
+ void SetFirstPartySets(net::GlobalFirstPartySets sets) override;
+ void SetExplicitlyAllowedPorts(const std::vector<uint16_t>& ports) override;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void SetGssapiLibraryLoadObserver(
+ mojo::PendingRemote<mojom::GssapiLibraryLoadObserver>
+ gssapi_library_load_observer) override;
+@@ -252,7 +252,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService
+ std::unique_ptr<net::HttpAuthHandlerFactory> CreateHttpAuthHandlerFactory(
+ NetworkContext* network_context);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // This is called just before a GSSAPI library may be loaded.
+ void OnBeforeGssapiLibraryLoad();
+ #endif // BUILDFLAG(IS_LINUX)
+@@ -494,7 +494,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService
+ // leaking stale listeners between tests.
+ std::unique_ptr<net::NetworkChangeNotifier> mock_network_change_notifier_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ mojo::Remote<mojom::GssapiLibraryLoadObserver> gssapi_library_load_observer_;
+ #endif // BUILDFLAG(IS_LINUX)
+
diff --git a/devel/electron28/files/patch-services_network_public_cpp_BUILD.gn b/devel/electron28/files/patch-services_network_public_cpp_BUILD.gn
new file mode 100644
index 000000000000..c0b26ad3a385
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_public_cpp_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/network/public/cpp/BUILD.gn.orig 2023-11-29 21:40:08 UTC
++++ services/network/public/cpp/BUILD.gn
+@@ -485,7 +485,7 @@ component("cpp_base") {
+ sources += [ "transferable_directory_fuchsia.cc" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "network_interface_change_listener_mojom_traits.cc",
+ "network_interface_change_listener_mojom_traits.h",
diff --git a/devel/electron28/files/patch-services_network_public_cpp_features.cc b/devel/electron28/files/patch-services_network_public_cpp_features.cc
new file mode 100644
index 000000000000..2cda75a34e2a
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_public_cpp_features.cc
@@ -0,0 +1,11 @@
+--- services/network/public/cpp/features.cc.orig 2023-11-29 21:40:08 UTC
++++ services/network/public/cpp/features.cc
+@@ -98,7 +98,7 @@ BASE_FEATURE(kDnsOverHttpsUpgrade,
+ BASE_FEATURE(kDnsOverHttpsUpgrade,
+ "DnsOverHttpsUpgrade",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-services_network_public_mojom_BUILD.gn b/devel/electron28/files/patch-services_network_public_mojom_BUILD.gn
new file mode 100644
index 000000000000..cbe9e6374d98
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_public_mojom_BUILD.gn
@@ -0,0 +1,25 @@
+--- services/network/public/mojom/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ services/network/public/mojom/BUILD.gn
+@@ -521,11 +521,11 @@ mojom("url_loader_base") {
+ }
+
+ enabled_features = []
+- if (is_android || is_chromeos || is_linux) {
++ if (!is_bsd && (is_android || is_chromeos || is_linux)) {
+ enabled_features += [ "network_change_notifier_in_browser" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ # TODO(crbug.com/1431866): Remove this once is_linux in the mojom IDL does
+ # not include lacros.
+ enabled_features += [ "use_network_interface_change_listener" ]
+@@ -1450,7 +1450,7 @@ mojom("mojom") {
+ }
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ # TODO(crbug.com/1431866): Remove this once is_linux in the mojom IDL does
+ # not include lacros.
+ enabled_features += [ "use_network_interface_change_listener" ]
diff --git a/devel/electron28/files/patch-services_network_shared__dictionary_shared__dictionary__writer__in__memory.h b/devel/electron28/files/patch-services_network_shared__dictionary_shared__dictionary__writer__in__memory.h
new file mode 100644
index 000000000000..dbdbd35867b7
--- /dev/null
+++ b/devel/electron28/files/patch-services_network_shared__dictionary_shared__dictionary__writer__in__memory.h
@@ -0,0 +1,11 @@
+--- services/network/shared_dictionary/shared_dictionary_writer_in_memory.h.orig 2023-08-10 01:48:48 UTC
++++ services/network/shared_dictionary/shared_dictionary_writer_in_memory.h
+@@ -9,6 +9,8 @@
+ #include <string>
+ #include <vector>
+
++#include <vector>
++
+ #include "base/component_export.h"
+ #include "base/functional/callback.h"
+ #include "crypto/secure_hash.h"
diff --git a/devel/electron28/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc b/devel/electron28/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc
new file mode 100644
index 000000000000..93c3d6c554e5
--- /dev/null
+++ b/devel/electron28/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc
@@ -0,0 +1,65 @@
+--- services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc.orig 2023-10-19 19:58:30 UTC
++++ services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
+@@ -53,7 +53,7 @@ uint32_t CalculatePrivateFootprintKb(const mojom::RawO
+ uint32_t shared_resident_kb) {
+ DCHECK(os_dump.platform_private_footprint);
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ uint64_t rss_anon_bytes = os_dump.platform_private_footprint->rss_anon_bytes;
+ uint64_t vm_swap_bytes = os_dump.platform_private_footprint->vm_swap_bytes;
+ return (rss_anon_bytes + vm_swap_bytes) / 1024;
+@@ -81,7 +81,7 @@ memory_instrumentation::mojom::OSMemDumpPtr CreatePubl
+ os_dump->is_peak_rss_resettable = internal_os_dump.is_peak_rss_resettable;
+ os_dump->private_footprint_kb =
+ CalculatePrivateFootprintKb(internal_os_dump, shared_resident_kb);
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ os_dump->private_footprint_swap_kb =
+ internal_os_dump.platform_private_footprint->vm_swap_bytes / 1024;
+ #endif
+@@ -217,7 +217,7 @@ void QueuedRequestDispatcher::SetUpAndDispatch(
+
+ // On most platforms each process can dump data about their own process
+ // so ask each process to do so Linux is special see below.
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ request->pending_responses.insert({client_info.pid, ResponseType::kOSDump});
+ client->RequestOSMemoryDump(request->memory_map_option(),
+ {base::kNullProcessId},
+@@ -232,7 +232,7 @@ void QueuedRequestDispatcher::SetUpAndDispatch(
+
+ // In some cases, OS stats can only be dumped from a privileged process to
+ // get around to sandboxing/selinux restrictions (see crbug.com/461788).
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::vector<base::ProcessId> pids;
+ mojom::ClientProcess* browser_client = nullptr;
+ base::ProcessId browser_client_pid = base::kNullProcessId;
+@@ -278,7 +278,7 @@ void QueuedRequestDispatcher::SetUpAndDispatchVmRegion
+ const OsCallback& os_callback) {
+ // On Linux, OS stats can only be dumped from a privileged process to
+ // get around to sandboxing/selinux restrictions (see crbug.com/461788).
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojom::ClientProcess* browser_client = nullptr;
+ base::ProcessId browser_client_pid = 0;
+ for (const auto& client_info : clients) {
+@@ -328,7 +328,7 @@ QueuedRequestDispatcher::FinalizeVmRegionRequest(
+ // each client process provides 1 OS dump, % the case where the client is
+ // disconnected mid dump.
+ OSMemDumpMap& extra_os_dumps = response.second.os_dumps;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ for (auto& kv : extra_os_dumps) {
+ auto pid = kv.first == base::kNullProcessId ? original_pid : kv.first;
+ DCHECK(results.find(pid) == results.end());
+@@ -389,7 +389,7 @@ void QueuedRequestDispatcher::Finalize(QueuedRequest*
+ // crash). In the latter case (OS_LINUX) we expect the full map to come
+ // from the browser process response.
+ OSMemDumpMap& extra_os_dumps = response.second.os_dumps;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ for (const auto& kv : extra_os_dumps) {
+ auto pid = kv.first == base::kNullProcessId ? original_pid : kv.first;
+ DCHECK_EQ(pid_to_os_dump[pid], nullptr);
diff --git a/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_BUILD.gn b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_BUILD.gn
new file mode 100644
index 000000000000..42b2e8a498af
--- /dev/null
+++ b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_BUILD.gn
@@ -0,0 +1,16 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/BUILD.gn.orig 2023-05-25 00:42:01 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/BUILD.gn
+@@ -29,8 +29,12 @@ component("memory_instrumentation") {
+ sources += [ "os_metrics_win.cc" ]
+ }
+
+- if (is_android || is_linux || is_chromeos) {
++ if ((is_android || is_linux || is_chromeos) && !is_bsd) {
+ sources += [ "os_metrics_linux.cc" ]
++ }
++
++ if (is_bsd) {
++ sources += [ "os_metrics_bsd.cc" ]
+ }
+
+ if (is_fuchsia) {
diff --git a/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
new file mode 100644
index 000000000000..f91b0917c11f
--- /dev/null
+++ b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
@@ -0,0 +1,20 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h.orig 2022-02-28 16:54:41 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
+@@ -45,7 +45,7 @@ class COMPONENT_EXPORT(
+ mojom::RawOSMemDump*);
+ static std::vector<mojom::VmRegionPtr> GetProcessMemoryMaps(base::ProcessId);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ static void SetProcSmapsForTesting(FILE*);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
+ // BUILDFLAG(IS_ANDROID)
+@@ -62,7 +62,7 @@ class COMPONENT_EXPORT(
+ static std::vector<mojom::VmRegionPtr> GetProcessModules(base::ProcessId);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // Provides information on the dump state of resident pages. These values are
+ // written to logs. New enum values can be added, but existing enums must
+ // never be renumbered or deleted and reused.
diff --git a/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
new file mode 100644
index 000000000000..cec6a7646af2
--- /dev/null
+++ b/devel/electron28/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
@@ -0,0 +1,61 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_bsd.cc.orig 2022-03-25 21:59:56 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_bsd.cc
+@@ -0,0 +1,58 @@
++// Copyright 2022 The Chromium Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h"
++
++#include "base/memory/page_size.h"
++#include "base/process/process.h"
++#include "base/process/process_handle.h"
++
++#include <sys/sysctl.h>
++
++#include <vector>
++
++#if BUILDFLAG(IS_OPENBSD)
++#define vm_rssize info.p_vm_rssize
++#elif BUILDFLAG(IS_FREEBSD)
++#include <sys/user.h>
++#define vm_rssize info.ki_rssize
++#endif
++
++namespace memory_instrumentation {
++
++// static
++bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
++ mojom::RawOSMemDump* dump) {
++ base::Process process = pid == base::kNullProcessId
++ ? base::Process::Current()
++ : base::Process::Open(pid);
++ const size_t kPageSize = base::GetPageSize();
++ struct kinfo_proc info;
++ size_t length = sizeof(struct kinfo_proc);
++#if BUILDFLAG(IS_OPENBSD)
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process.Handle(),
++ static_cast<int>(length), 1 };
++#elif BUILDFLAG(IS_FREEBSD)
++ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process.Handle() };
++#endif
++
++ if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
++ return false;
++
++ dump->resident_set_kb = (vm_rssize * kPageSize) / 1024;
++ dump->platform_private_footprint->rss_anon_bytes =
++ vm_rssize * kPageSize;
++ dump->platform_private_footprint->vm_swap_bytes = 0;
++
++ return true;
++}
++
++// static
++std::vector<mojom::VmRegionPtr> OSMetrics::GetProcessMemoryMaps(
++ base::ProcessId) {
++ NOTIMPLEMENTED();
++ return std::vector<mojom::VmRegionPtr>();
++}
++
++} // namespace memory_instrumentation
diff --git a/devel/electron28/files/patch-services_service__manager_BUILD.gn b/devel/electron28/files/patch-services_service__manager_BUILD.gn
new file mode 100644
index 000000000000..feeef0b864c2
--- /dev/null
+++ b/devel/electron28/files/patch-services_service__manager_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/BUILD.gn.orig 2021-12-31 00:57:38 UTC
++++ services/service_manager/BUILD.gn
+@@ -67,7 +67,7 @@ source_set("service_manager") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ deps += [ "//sandbox/linux:sandbox_services" ]
+ }
+ }
diff --git a/devel/electron28/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn b/devel/electron28/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn
new file mode 100644
index 000000000000..b066798326f3
--- /dev/null
+++ b/devel/electron28/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/public/cpp/service_executable/BUILD.gn.orig 2021-04-14 18:41:08 UTC
++++ services/service_manager/public/cpp/service_executable/BUILD.gn
+@@ -22,7 +22,7 @@ source_set("support") {
+ "//services/service_manager/public/mojom",
+ ]
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ deps += [
+ "//sandbox/linux:sandbox",
+ "//sandbox/linux:sandbox_services",
diff --git a/devel/electron28/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc b/devel/electron28/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc
new file mode 100644
index 000000000000..7587b6f58273
--- /dev/null
+++ b/devel/electron28/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc
@@ -0,0 +1,11 @@
+--- services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc.orig 2023-02-01 18:43:24 UTC
++++ services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
+@@ -37,7 +37,7 @@
+ #include "third_party/perfetto/protos/perfetto/trace/track_event/process_descriptor.pbzero.h"
+ #include "third_party/perfetto/protos/perfetto/trace/track_event/thread_descriptor.pbzero.h"
+
+-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD)
+ #include "base/profiler/thread_delegate_posix.h"
+ #define INITIALIZE_THREAD_DELEGATE_POSIX 1
+ #else // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_APPLE)
diff --git a/devel/electron28/files/patch-services_video__capture_public_mojom_video__capture__service.mojom b/devel/electron28/files/patch-services_video__capture_public_mojom_video__capture__service.mojom
new file mode 100644
index 000000000000..40b704c42438
--- /dev/null
+++ b/devel/electron28/files/patch-services_video__capture_public_mojom_video__capture__service.mojom
@@ -0,0 +1,15 @@
+--- services/video_capture/public/mojom/video_capture_service.mojom.orig 2023-03-30 00:33:55 UTC
++++ services/video_capture/public/mojom/video_capture_service.mojom
+@@ -25,10 +25,10 @@ interface AcceleratorFactory {
+ pending_receiver<chromeos_camera.mojom.MjpegDecodeAccelerator> jda);
+ };
+
+-[EnableIf=is_fuchsia]
++[EnableIf=is_openbsd]
+ const sandbox.mojom.Sandbox kVideoCaptureSandbox
+ = sandbox.mojom.Sandbox.kVideoCapture;
+-[EnableIfNot=is_fuchsia]
++[EnableIfNot=is_openbsd]
+ const sandbox.mojom.Sandbox kVideoCaptureSandbox
+ = sandbox.mojom.Sandbox.kNoSandbox;
+
diff --git a/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.cc b/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.cc
new file mode 100644
index 000000000000..ead937518d8f
--- /dev/null
+++ b/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.cc
@@ -0,0 +1,38 @@
+--- services/video_capture/video_capture_service_impl.cc.orig 2023-10-19 19:58:30 UTC
++++ services/video_capture/video_capture_service_impl.cc
+@@ -40,7 +40,7 @@
+ #include "services/video_capture/lacros/device_factory_adapter_lacros.h"
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "media/capture/capture_switches.h"
+ #include "media/capture/video/video_capture_gpu_channel_host.h"
+ #include "services/viz/public/cpp/gpu/context_provider_command_buffer.h"
+@@ -107,7 +107,7 @@ class VideoCaptureServiceImpl::GpuDependenciesContext
+ this};
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Intended usage of this class is to create viz::Gpu in utility process and
+ // connect to viz::GpuClient of browser process, which will call to Gpu service.
+ // Also, this class holds the viz::ContextProvider to listen and monitor Gpu
+@@ -288,7 +288,7 @@ void VideoCaptureServiceImpl::LazyInitializeGpuDepende
+ if (!gpu_dependencies_context_)
+ gpu_dependencies_context_ = std::make_unique<GpuDependenciesContext>();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) {
+ if (!viz_gpu_context_provider_) {
+ viz_gpu_context_provider_ =
+@@ -384,7 +384,7 @@ void VideoCaptureServiceImpl::OnGpuInfoUpdate(const CH
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ void VideoCaptureServiceImpl::SetVizGpu(std::unique_ptr<viz::Gpu> viz_gpu) {
+ viz_gpu_ = std::move(viz_gpu);
+ }
diff --git a/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.h b/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.h
new file mode 100644
index 000000000000..e776a77767e5
--- /dev/null
+++ b/devel/electron28/files/patch-services_video__capture_video__capture__service__impl.h
@@ -0,0 +1,29 @@
+--- services/video_capture/video_capture_service_impl.h.orig 2023-10-19 19:58:30 UTC
++++ services/video_capture/video_capture_service_impl.h
+@@ -24,7 +24,7 @@
+ #include "services/video_capture/ash/video_capture_device_factory_ash.h"
+ #endif // BUILDFLAG(IS_CHROMEOS_ASH)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "services/viz/public/cpp/gpu/gpu.h"
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+
+@@ -62,7 +62,7 @@ class VideoCaptureServiceImpl : public mojom::VideoCap
+ #if BUILDFLAG(IS_WIN)
+ void OnGpuInfoUpdate(const CHROME_LUID& luid) override;
+ #endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ void SetVizGpu(std::unique_ptr<viz::Gpu> viz_gpu);
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+ private:
+@@ -87,7 +87,7 @@ class VideoCaptureServiceImpl : public mojom::VideoCap
+ factory_receivers_ash_;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ class VizGpuContextProvider;
+ std::unique_ptr<VizGpuContextProvider> viz_gpu_context_provider_;
+ std::unique_ptr<viz::Gpu> viz_gpu_;
diff --git a/devel/electron28/files/patch-skia_ext_SkMemory__new__handler.cpp b/devel/electron28/files/patch-skia_ext_SkMemory__new__handler.cpp
new file mode 100644
index 000000000000..a8ecc17a4185
--- /dev/null
+++ b/devel/electron28/files/patch-skia_ext_SkMemory__new__handler.cpp
@@ -0,0 +1,11 @@
+--- skia/ext/SkMemory_new_handler.cpp.orig 2023-05-25 00:42:01 UTC
++++ skia/ext/SkMemory_new_handler.cpp
+@@ -86,7 +86,7 @@ static void* malloc_nothrow(size_t size) {
+ // TODO(b.kelemen): we should always use UncheckedMalloc but currently it
+ // doesn't work as intended everywhere.
+ void* result;
+-#if BUILDFLAG(IS_IOS)
++#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ result = malloc(size);
+ #else
+ // It's the responsibility of the caller to check the return value.
diff --git a/devel/electron28/files/patch-skia_ext_skcolorspace__trfn.cc b/devel/electron28/files/patch-skia_ext_skcolorspace__trfn.cc
new file mode 100644
index 000000000000..bc356680352a
--- /dev/null
+++ b/devel/electron28/files/patch-skia_ext_skcolorspace__trfn.cc
@@ -0,0 +1,11 @@
+--- skia/ext/skcolorspace_trfn.cc.orig 2023-08-10 01:48:48 UTC
++++ skia/ext/skcolorspace_trfn.cc
+@@ -2,6 +2,8 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
++#include <cmath>
++
+ #include "skia/ext/skcolorspace_trfn.h"
+
+ #include <cmath>
diff --git a/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_config.h b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_config.h
new file mode 100644
index 000000000000..6736ba729846
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_config.h
@@ -0,0 +1,21 @@
+--- third_party/abseil-cpp/absl/base/config.h.orig 2023-10-19 19:58:30 UTC
++++ third_party/abseil-cpp/absl/base/config.h
+@@ -450,7 +450,7 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] !=
+ #ifdef ABSL_HAVE_SCHED_YIELD
+ #error ABSL_HAVE_SCHED_YIELD cannot be directly set
+ #elif defined(__linux__) || defined(__ros__) || defined(__native_client__) || \
+- defined(__VXWORKS__)
++ defined(__VXWORKS__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ #define ABSL_HAVE_SCHED_YIELD 1
+ #endif
+
+@@ -465,7 +465,8 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] !=
+ // platforms.
+ #ifdef ABSL_HAVE_SEMAPHORE_H
+ #error ABSL_HAVE_SEMAPHORE_H cannot be directly set
+-#elif defined(__linux__) || defined(__ros__) || defined(__VXWORKS__)
++#elif defined(__linux__) || defined(__ros__) || defined(__VXWORKS__) || \
++ defined(__OpenBSD__) || defined(__FreeBSD__)
+ #define ABSL_HAVE_SEMAPHORE_H 1
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_raw__logging.cc b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_raw__logging.cc
new file mode 100644
index 000000000000..ab323821e8ea
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_raw__logging.cc
@@ -0,0 +1,16 @@
+--- third_party/abseil-cpp/absl/base/internal/raw_logging.cc.orig 2023-08-10 01:48:49 UTC
++++ third_party/abseil-cpp/absl/base/internal/raw_logging.cc
+@@ -56,10 +56,12 @@
+ // ABSL_HAVE_SYSCALL_WRITE is defined when the platform provides the syscall
+ // syscall(SYS_write, /*int*/ fd, /*char* */ buf, /*size_t*/ len);
+ // for low level operations that want to avoid libc.
+-#if (defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && \
++#if (defined(__linux__) || defined(__FreeBSD__)) && \
+ !defined(__ANDROID__)
+ #include <sys/syscall.h>
+ #define ABSL_HAVE_SYSCALL_WRITE 1
++#define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1
++#elif defined(__OpenBSD__)
+ #define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1
+ #else
+ #undef ABSL_HAVE_SYSCALL_WRITE
diff --git a/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_sysinfo.cc b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_sysinfo.cc
new file mode 100644
index 000000000000..22f2e835b02e
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_abseil-cpp_absl_base_internal_sysinfo.cc
@@ -0,0 +1,65 @@
+--- third_party/abseil-cpp/absl/base/internal/sysinfo.cc.orig 2023-11-29 21:40:09 UTC
++++ third_party/abseil-cpp/absl/base/internal/sysinfo.cc
+@@ -30,7 +30,7 @@
+ #include <sys/syscall.h>
+ #endif
+
+-#if defined(__APPLE__) || defined(__FreeBSD__)
++#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+ #include <sys/sysctl.h>
+ #endif
+
+@@ -194,6 +194,7 @@ static double GetNominalCPUFrequency() {
+
+ #else
+
++#if !defined(__OpenBSD__) && !defined(__FreeBSD__)
+ // Helper function for reading a long from a file. Returns true if successful
+ // and the memory location pointed to by value is set to the value read.
+ static bool ReadLongFromFile(const char *file, long *value) {
+@@ -226,6 +227,7 @@ static bool ReadLongFromFile(const char *file, long *v
+ }
+ return ret;
+ }
++#endif
+
+ #if defined(ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY)
+
+@@ -325,9 +327,11 @@ static double GetNominalCPUFrequency() {
+ // a new mode (turbo mode). Essentially, those frequencies cannot
+ // always be relied upon. The same reasons apply to /proc/cpuinfo as
+ // well.
++#if !defined(__OpenBSD__) && !defined(__FreeBSD__) // pledge violation
+ if (ReadLongFromFile("/sys/devices/system/cpu/cpu0/tsc_freq_khz", &freq)) {
+ return freq * 1e3; // Value is kHz.
+ }
++#endif
+
+ #if defined(ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY)
+ // On these platforms, the TSC frequency is the nominal CPU
+@@ -346,10 +350,12 @@ static double GetNominalCPUFrequency() {
+ // If CPU scaling is in effect, we want to use the *maximum*
+ // frequency, not whatever CPU speed some random processor happens
+ // to be using now.
++#if !defined(__OpenBSD__) && !defined(__FreeBSD__) // pledge violation
+ if (ReadLongFromFile("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq",
+ &freq)) {
+ return freq * 1e3; // Value is kHz.
+ }
++#endif
+
+ return 1.0;
+ #endif // !ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
+@@ -459,6 +465,12 @@ pid_t GetTID() {
+ static_assert(sizeof(pid_t) == sizeof(thread),
+ "In NaCL int expected to be the same size as a pointer");
+ return reinterpret_cast<pid_t>(thread);
++}
++
++#elif defined(__OpenBSD__)
++
++pid_t GetTID() {
++ return getthrid();
+ }
+
+ #else
diff --git a/devel/electron28/files/patch-third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.h b/devel/electron28/files/patch-third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.h
new file mode 100644
index 000000000000..9b28bf8ee32a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.h
@@ -0,0 +1,11 @@
+--- third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h.orig 2023-10-19 19:58:30 UTC
++++ third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h
+@@ -34,7 +34,7 @@
+ #if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \
+ !defined(__native_client__) && !defined(__asmjs__) && \
+ !defined(__wasm__) && !defined(__HAIKU__) && !defined(__sun) && \
+- !defined(__VXWORKS__) && !defined(__hexagon__)
++ !defined(__VXWORKS__) && !defined(__hexagon__) && !defined(__FreeBSD__)
+ #define ABSL_HAVE_ELF_MEM_IMAGE 1
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_angle_BUILD.gn b/devel/electron28/files/patch-third__party_angle_BUILD.gn
new file mode 100644
index 000000000000..2fb05eb37203
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_BUILD.gn
@@ -0,0 +1,29 @@
+--- third_party/angle/BUILD.gn.orig 2023-10-19 20:00:24 UTC
++++ third_party/angle/BUILD.gn
+@@ -325,7 +325,6 @@ config("extra_warnings") {
+ "-Wtautological-type-limit-compare",
+ "-Wundefined-reinterpret-cast",
+ "-Wunneeded-internal-declaration",
+- "-Wunused-but-set-variable",
+ "-Wsuggest-destructor-override",
+ "-Wsuggest-override",
+
+@@ -496,7 +495,7 @@ template("angle_common_lib") {
+ all_dependent_configs = [ ":angle_disable_pool_alloc" ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ libs = [ "dl" ]
+ }
+
+@@ -651,6 +650,9 @@ angle_static_library("angle_gpu_info_util") {
+ "Xi",
+ "Xext",
+ ]
++ if (is_bsd) {
++ libs += [ "GL" ]
++ }
+ }
+
+ if (angle_use_wayland && angle_has_build) {
diff --git a/devel/electron28/files/patch-third__party_angle_src_common_platform.h b/devel/electron28/files/patch-third__party_angle_src_common_platform.h
new file mode 100644
index 000000000000..19c34403d542
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_common_platform.h
@@ -0,0 +1,19 @@
+--- third_party/angle/src/common/platform.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/angle/src/common/platform.h
+@@ -26,7 +26,15 @@
+ #elif defined(__linux__) || defined(EMSCRIPTEN)
+ # define ANGLE_PLATFORM_LINUX 1
+ # define ANGLE_PLATFORM_POSIX 1
+-#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
++#elif defined(__OpenBSD__)
++# define ANGLE_PLATFORM_OPENBSD 1
++# define ANGLE_PLATFORM_POSIX 1
++# define ANGLE_PLATFORM_BSD 1
++#elif defined(__FreeBSD__)
++# define ANGLE_PLATFORM_FREEBSD 1
++# define ANGLE_PLATFORM_POSIX 1
++# define ANGLE_PLATFORM_BSD 1
++#elif defined(__NetBSD__) || \
+ defined(__DragonFly__) || defined(__sun) || defined(__GLIBC__) || defined(__GNU__) || \
+ defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__)
+ # define ANGLE_PLATFORM_POSIX 1
diff --git a/devel/electron28/files/patch-third__party_angle_src_common_platform__helpers.h b/devel/electron28/files/patch-third__party_angle_src_common_platform__helpers.h
new file mode 100644
index 000000000000..16a96b460686
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_common_platform__helpers.h
@@ -0,0 +1,11 @@
+--- third_party/angle/src/common/platform_helpers.h.orig 2023-10-19 20:00:24 UTC
++++ third_party/angle/src/common/platform_helpers.h
+@@ -62,7 +62,7 @@ inline constexpr bool IsIOS()
+
+ inline constexpr bool IsLinux()
+ {
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h
new file mode 100644
index 000000000000..8232856560c7
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h
@@ -0,0 +1,16 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_internal.h.orig 2023-05-25 00:46:19 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_internal.h
+@@ -15,6 +15,13 @@
+ namespace angle
+ {
+
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++bool CollectMesaCardInfo(std::vector<GPUDeviceInfo> *devices);
++#if defined(__FreeBSD__)
++bool GetPCIDevicesFreeBSD(std::vector<GPUDeviceInfo> *devices);
++#endif
++#endif
++
+ // Defined in SystemInfo_libpci when GPU_INFO_USE_LIBPCI is defined.
+ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices);
+ // Defined in SystemInfo_x11 when GPU_INFO_USE_X11 is defined.
diff --git a/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp
new file mode 100644
index 000000000000..847b0d538010
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp
@@ -0,0 +1,90 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp.orig 2022-02-23 19:25:59 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp
+@@ -12,6 +12,11 @@
+ #include <pci/pci.h>
+ #include <unistd.h>
+
++#if defined(__FreeBSD__)
++#include <fcntl.h>
++#include <sys/pciio.h>
++#endif
++
+ #include "common/angleutils.h"
+ #include "common/debug.h"
+
+@@ -85,6 +90,75 @@ struct LibPCI : private angle::NonCopyable
+ };
+
+ } // anonymous namespace
++
++#if defined(__FreeBSD__)
++// Adds an entry per PCI GPU found and fills the device and vendor ID.
++bool GetPCIDevicesFreeBSD(std::vector<GPUDeviceInfo> *devices)
++{
++ int fd;
++ struct pci_conf_io conf;
++ struct pci_conf *matches;
++ uint32_t offset = 0;
++
++ fd = open("/dev/pci", O_RDONLY);
++ if (fd < 0)
++ return false;
++
++ matches = new struct pci_conf[32];
++ conf.generation = 0;
++ do {
++ conf.pat_buf_len = 0;
++ conf.num_patterns = 0;
++ conf.patterns = NULL;
++ conf.match_buf_len = 32 * sizeof(struct pci_conf);
++ conf.num_matches = 32;
++ conf.matches = matches;
++ conf.offset = offset;
++ conf.status = PCI_GETCONF_ERROR;
++ if (ioctl(fd, PCIOCGETCONF, &conf) < 0) {
++ if (errno == ENODEV)
++ break;
++ }
++ /* PCI_GETCONF_LIST_CHANGED would require us to start over. */
++ if (conf.status == PCI_GETCONF_ERROR || conf.status == PCI_GETCONF_LIST_CHANGED) {
++ break;
++ }
++
++ for (unsigned int i = 0; i < conf.num_matches; i++) {
++ uint16_t device_class = (matches[i].pc_class << 8) | matches[i].pc_subclass;
++
++ // Skip non-GPU devices
++ switch (device_class)
++ {
++ case PCI_CLASS_DISPLAY_VGA:
++ case PCI_CLASS_DISPLAY_XGA:
++ case PCI_CLASS_DISPLAY_3D:
++ break;
++ default:
++ continue;
++ }
++
++ // Skip unknown devices
++ if (matches[i].pc_vendor == 0 || matches[i].pc_device == 0) {
++ continue;
++ }
++
++ GPUDeviceInfo info;
++ info.vendorId = matches[i].pc_vendor;
++ info.deviceId = matches[i].pc_device;
++
++ devices->push_back(info);
++ }
++ offset += conf.num_matches;
++ } while (conf.status == PCI_GETCONF_MORE_DEVS);
++
++ delete[] matches;
++
++ close(fd);
++
++ return true;
++}
++#endif
+
+ // Adds an entry per PCI GPU found and fills the device and vendor ID.
+ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices)
diff --git a/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
new file mode 100644
index 000000000000..ef2231b48c21
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
@@ -0,0 +1,35 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp.orig 2022-02-23 19:25:59 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
+@@ -71,6 +71,24 @@ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo
+
+ bool GetSystemInfo(SystemInfo *info)
+ {
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++ if (!CollectMesaCardInfo(&(info->gpus)))
++ {
++#if defined(__FreeBSD__)
++ if (!GetPCIDevicesFreeBSD(&(info->gpus)))
++ {
++#endif
++#if defined(ANGLE_USE_VULKAN_SYSTEM_INFO)
++ // Try vulkan backend to get GPU info
++ return GetSystemInfoVulkan(info);
++#else
++ return false;
++#endif
++#if defined(__FreeBSD__)
++ }
++#endif
++ }
++#else
+ if (!GetPCIDevicesWithLibPCI(&(info->gpus)))
+ {
+ #if defined(ANGLE_USE_VULKAN_SYSTEM_INFO)
+@@ -85,6 +103,7 @@ bool GetSystemInfo(SystemInfo *info)
+ {
+ return false;
+ }
++#endif
+
+ GetDualGPUInfo(info);
+
diff --git a/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
new file mode 100644
index 000000000000..9b174b17ae80
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
@@ -0,0 +1,60 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp.orig 2022-02-23 20:48:53 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp
+@@ -8,6 +8,10 @@
+
+ #include "gpu_info_util/SystemInfo_internal.h"
+
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++#include <GL/glx.h>
++#include <GL/glxext.h>
++#endif
+ #include <X11/Xlib.h>
+
+ #include "common/debug.h"
+@@ -18,8 +22,46 @@
+ # error SystemInfo_x11.cpp compiled without GPU_INFO_USE_X11
+ #endif
+
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++#define GLX_RENDERER_VENDOR_ID_MESA 0x8183
++#define GLX_RENDERER_DEVICE_ID_MESA 0x8184
++#endif
++
+ namespace angle
+ {
++
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++bool CollectMesaCardInfo(std::vector<GPUDeviceInfo> *devices)
++{
++ unsigned int vid[3], did[3];
++
++ Display *display = XOpenDisplay(NULL);
++ if (!display) {
++ return false;
++ }
++
++ PFNGLXQUERYRENDERERINTEGERMESAPROC queryInteger =
++ (PFNGLXQUERYRENDERERINTEGERMESAPROC) glXGetProcAddressARB((const GLubyte *)
++ "glXQueryRendererIntegerMESA");
++
++ if (!queryInteger)
++ return false;
++
++ bool vendor_ret =
++ queryInteger(display, 0, 0, GLX_RENDERER_VENDOR_ID_MESA, vid);
++ bool device_ret =
++ queryInteger(display, 0, 0, GLX_RENDERER_DEVICE_ID_MESA, did);
++
++ if (vendor_ret && device_ret) {
++ GPUDeviceInfo info;
++ info.vendorId = vid[0];
++ info.deviceId = did[0];
++ devices->push_back(info);
++ }
++
++ return true;
++}
++#endif
+
+ bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version)
+ {
diff --git a/devel/electron28/files/patch-third__party_angle_src_libANGLE_Display.cpp b/devel/electron28/files/patch-third__party_angle_src_libANGLE_Display.cpp
new file mode 100644
index 000000000000..75f50759c959
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_libANGLE_Display.cpp
@@ -0,0 +1,47 @@
+--- third_party/angle/src/libANGLE/Display.cpp.orig 2023-11-29 21:41:45 UTC
++++ third_party/angle/src/libANGLE/Display.cpp
+@@ -60,7 +60,7 @@
+ # include "libANGLE/renderer/gl/cgl/DisplayCGL.h"
+ # elif ANGLE_ENABLE_EAGL
+ # include "libANGLE/renderer/gl/eagl/DisplayEAGL.h"
+-# elif defined(ANGLE_PLATFORM_LINUX)
++# elif defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ # include "libANGLE/renderer/gl/egl/DisplayEGL.h"
+ # if defined(ANGLE_USE_X11)
+ # include "libANGLE/renderer/gl/glx/DisplayGLX.h"
+@@ -408,7 +408,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(EGLAttrib di
+ impl = new rx::DisplayEAGL(state);
+ break;
+
+-# elif defined(ANGLE_PLATFORM_LINUX)
++# elif defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ # if defined(ANGLE_USE_GBM)
+ if (platformType == 0)
+ {
+@@ -454,7 +454,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(EGLAttrib di
+ #if defined(ANGLE_ENABLE_OPENGL)
+ # if defined(ANGLE_PLATFORM_WINDOWS)
+ impl = new rx::DisplayWGL(state);
+-# elif defined(ANGLE_PLATFORM_LINUX)
++# elif defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ # if defined(ANGLE_USE_GBM)
+ if (platformType == 0)
+ {
+@@ -505,7 +505,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(EGLAttrib di
+ impl = rx::CreateVulkanWin32Display(state);
+ }
+ break;
+-# elif defined(ANGLE_PLATFORM_LINUX)
++# elif defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ # if defined(ANGLE_USE_GBM)
+ if (platformType == EGL_PLATFORM_GBM_KHR && rx::IsVulkanGbmDisplayAvailable())
+ {
+@@ -2106,7 +2106,7 @@ static ClientExtensions GenerateClientExtensions()
+ extensions.x11Visual = true;
+ #endif
+
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ extensions.platformANGLEDeviceTypeEGLANGLE = true;
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_angle_src_libANGLE_formatutils.cpp b/devel/electron28/files/patch-third__party_angle_src_libANGLE_formatutils.cpp
new file mode 100644
index 000000000000..349b0e03729b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_libANGLE_formatutils.cpp
@@ -0,0 +1,11 @@
+--- third_party/angle/src/libANGLE/formatutils.cpp.orig 2023-10-19 20:00:25 UTC
++++ third_party/angle/src/libANGLE/formatutils.cpp
+@@ -1475,7 +1475,7 @@ static InternalFormatInfoMap BuildInternalFormatInfoMa
+ AddYUVFormat(&map, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, true, 8, 8, 8, 0, 0, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::yuvInternalFormatANGLE>, RequireExt<&Extensions::yuvInternalFormatANGLE>, RequireExt<&Extensions::yuvInternalFormatANGLE>, NeverSupported, NeverSupported);
+ AddYUVFormat(&map, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, true, 8, 8, 8, 0, 0, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::yuvInternalFormatANGLE>, RequireExt<&Extensions::yuvInternalFormatANGLE>, RequireExt<&Extensions::yuvInternalFormatANGLE>, NeverSupported, NeverSupported);
+
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_BSD)
+ // From GL_OES_required_internalformat
+ // The |shared| bit shouldn't be 2. But given this hits assertion when bits
+ // are checked, it's fine to have this bit set as 2 as a workaround.
diff --git a/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_gl_glx_FunctionsGLX.cpp b/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_gl_glx_FunctionsGLX.cpp
new file mode 100644
index 000000000000..dba2acc732c5
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_gl_glx_FunctionsGLX.cpp
@@ -0,0 +1,15 @@
+--- third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp.orig 2022-02-07 13:39:41 UTC
++++ third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp
+@@ -144,10 +144,10 @@ bool FunctionsGLX::initialize(Display *xDisplay, int s
+ // which a GLXWindow was ever created.
+ if (!sLibHandle)
+ {
+- sLibHandle = dlopen("libGL.so.1", RTLD_NOW);
++ sLibHandle = dlopen("libGL.so", RTLD_NOW);
+ if (!sLibHandle)
+ {
+- *errorString = std::string("Could not dlopen libGL.so.1: ") + dlerror();
++ *errorString = std::string("Could not dlopen libGL.so: ") + dlerror();
+ return false;
+ }
+ }
diff --git a/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h b/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h
new file mode 100644
index 000000000000..26496368123b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h
@@ -0,0 +1,11 @@
+--- third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk_api.h.orig 2022-06-17 14:20:10 UTC
++++ third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk_api.h
+@@ -23,7 +23,7 @@ bool IsVulkanWin32DisplayAvailable();
+ DisplayImpl *CreateVulkanWin32Display(const egl::DisplayState &state);
+ #endif // defined(ANGLE_PLATFORM_WINDOWS)
+
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_POSIX)
+ bool IsVulkanWaylandDisplayAvailable();
+ DisplayImpl *CreateVulkanWaylandDisplay(const egl::DisplayState &state);
+
diff --git a/devel/electron28/files/patch-third__party_angle_util_BUILD.gn b/devel/electron28/files/patch-third__party_angle_util_BUILD.gn
new file mode 100644
index 000000000000..bbd2ebd24b9d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_angle_util_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/angle/util/BUILD.gn.orig 2023-08-10 01:51:11 UTC
++++ third_party/angle/util/BUILD.gn
+@@ -311,7 +311,7 @@ foreach(is_shared_library,
+ ]
+ libs = []
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ libs += [
+ "rt",
+ "dl",
diff --git a/devel/electron28/files/patch-third__party_blink_common_renderer__preferences_renderer__preferences__mojom__traits.cc b/devel/electron28/files/patch-third__party_blink_common_renderer__preferences_renderer__preferences__mojom__traits.cc
new file mode 100644
index 000000000000..f4b4651f89e1
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_common_renderer__preferences_renderer__preferences__mojom__traits.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc.orig 2023-08-10 01:48:49 UTC
++++ third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
+@@ -66,7 +66,7 @@ bool StructTraits<blink::mojom::RendererPreferencesDat
+
+ out->send_subresource_notification = data.send_subresource_notification();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!data.ReadSystemFontFamilyName(&out->system_font_family_name))
+ return false;
+ #endif
diff --git a/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences.h b/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences.h
new file mode 100644
index 000000000000..114c9b014b6d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences.h
@@ -0,0 +1,11 @@
+--- third_party/blink/public/common/renderer_preferences/renderer_preferences.h.orig 2023-08-10 01:48:49 UTC
++++ third_party/blink/public/common/renderer_preferences/renderer_preferences.h
+@@ -64,7 +64,7 @@ struct BLINK_COMMON_EXPORT RendererPreferences {
+ UserAgentOverride user_agent_override;
+ std::string accept_languages;
+ bool send_subresource_notification{false};
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ std::string system_font_family_name;
+ #endif
+ #if BUILDFLAG(IS_WIN)
diff --git a/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences__mojom__traits.h b/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences__mojom__traits.h
new file mode 100644
index 000000000000..b31ff35ce557
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_public_common_renderer__preferences_renderer__preferences__mojom__traits.h
@@ -0,0 +1,11 @@
+--- third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h.orig 2023-08-10 01:48:49 UTC
++++ third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h
+@@ -162,7 +162,7 @@ struct BLINK_COMMON_EXPORT
+ return data.send_subresource_notification;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static const std::string& system_font_family_name(
+ const ::blink::RendererPreferences& data) {
+ return data.system_font_family_name;
diff --git a/devel/electron28/files/patch-third__party_blink_public_platform_platform.h b/devel/electron28/files/patch-third__party_blink_public_platform_platform.h
new file mode 100644
index 000000000000..c57030d064c8
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_public_platform_platform.h
@@ -0,0 +1,11 @@
+--- third_party/blink/public/platform/platform.h.orig 2023-12-20 07:12:20 UTC
++++ third_party/blink/public/platform/platform.h
+@@ -344,7 +344,7 @@ class BLINK_PLATFORM_EXPORT Platform {
+ return nullptr;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // This is called after the thread is created, so the embedder
+ // can initiate an IPC to change its thread type (on Linux we can't
+ // increase the nice value, so we need to ask the browser process). This
diff --git a/devel/electron28/files/patch-third__party_blink_public_platform_web__vector.h b/devel/electron28/files/patch-third__party_blink_public_platform_web__vector.h
new file mode 100644
index 000000000000..b1fd398c03fd
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_public_platform_web__vector.h
@@ -0,0 +1,11 @@
+--- third_party/blink/public/platform/web_vector.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/blink/public/platform/web_vector.h
+@@ -81,7 +81,7 @@ class WebVector {
+ // The vector can be populated using reserve() and emplace_back().
+ WebVector() = default;
+
+-#if defined(ARCH_CPU_64_BITS)
++#if defined(ARCH_CPU_64_BITS) || defined(__OpenBSD__)
+ // Create a vector with |size| default-constructed elements. We define
+ // a constructor with size_t otherwise we'd have a duplicate define.
+ explicit WebVector(size_t size) : data_(size) {}
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_bindings_scripts_bind__gen_style__format.py b/devel/electron28/files/patch-third__party_blink_renderer_bindings_scripts_bind__gen_style__format.py
new file mode 100644
index 000000000000..85f535fc625d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_bindings_scripts_bind__gen_style__format.py
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py.orig 2022-02-07 13:39:41 UTC
++++ third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py
+@@ -28,7 +28,7 @@ def init(root_src_dir, enable_style_format=True):
+ root_src_dir = os.path.abspath(root_src_dir)
+
+ # Determine //buildtools/<platform>/ directory
+- if sys.platform.startswith("linux"):
++ if sys.platform.startswith(("linux","openbsd","freebsd")):
+ platform = "linux64"
+ exe_suffix = ""
+ elif sys.platform.startswith("darwin"):
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_build_scripts_run__with__pythonpath.py b/devel/electron28/files/patch-third__party_blink_renderer_build_scripts_run__with__pythonpath.py
new file mode 100644
index 000000000000..7d56dad775be
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_build_scripts_run__with__pythonpath.py
@@ -0,0 +1,10 @@
+--- third_party/blink/renderer/build/scripts/run_with_pythonpath.py.orig 2022-02-07 13:39:41 UTC
++++ third_party/blink/renderer/build/scripts/run_with_pythonpath.py
+@@ -22,6 +22,7 @@ def main():
+ existing_pp = (
+ os.pathsep + env['PYTHONPATH']) if 'PYTHONPATH' in env else ''
+ env['PYTHONPATH'] = os.pathsep.join(python_paths) + existing_pp
++ env['LD_LIBRARY_PATH'] = "${WRKSRC}/out/Release"
+ sys.exit(subprocess.call([sys.executable] + args, env=env))
+
+
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_controller_blink__initializer.cc b/devel/electron28/files/patch-third__party_blink_renderer_controller_blink__initializer.cc
new file mode 100644
index 000000000000..23a57a2edc7e
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_controller_blink__initializer.cc
@@ -0,0 +1,35 @@
+--- third_party/blink/renderer/controller/blink_initializer.cc.orig 2023-11-29 21:40:10 UTC
++++ third_party/blink/renderer/controller/blink_initializer.cc
+@@ -78,12 +78,12 @@
+ #include "third_party/blink/renderer/controller/private_memory_footprint_provider.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/renderer/controller/memory_usage_monitor_posix.h"
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/renderer/controller/highest_pmf_reporter.h"
+ #include "third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h"
+ #endif
+@@ -232,7 +232,7 @@ void BlinkInitializer::RegisterInterfaces(mojo::Binder
+ main_thread_task_runner);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ binders.Add<mojom::blink::MemoryUsageMonitorLinux>(
+ ConvertToBaseRepeatingCallback(
+ CrossThreadBindRepeating(&MemoryUsageMonitorPosix::Bind)),
+@@ -271,7 +271,7 @@ void BlinkInitializer::RegisterMemoryWatchers(Platform
+ #endif
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN)
++ BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ // Start reporting the highest private memory footprint after the first
+ // navigation.
+ HighestPmfReporter::Initialize(main_thread_task_runner);
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.cc b/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.cc
new file mode 100644
index 000000000000..cf5b58888909
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.cc
@@ -0,0 +1,21 @@
+--- third_party/blink/renderer/controller/memory_usage_monitor_posix.cc.orig 2023-10-19 19:58:32 UTC
++++ third_party/blink/renderer/controller/memory_usage_monitor_posix.cc
+@@ -128,15 +128,17 @@ void MemoryUsageMonitorPosix::ResetFileDescriptors() {
+
+ void MemoryUsageMonitorPosix::SetProcFiles(base::File statm_file,
+ base::File status_file) {
++#if !BUILDFLAG(IS_BSD)
+ DCHECK(statm_file.IsValid());
+ DCHECK(status_file.IsValid());
+ DCHECK_EQ(-1, statm_fd_.get());
+ DCHECK_EQ(-1, status_fd_.get());
+ statm_fd_.reset(statm_file.TakePlatformFile());
+ status_fd_.reset(status_file.TakePlatformFile());
++#endif
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // static
+ void MemoryUsageMonitorPosix::Bind(
+ mojo::PendingReceiver<mojom::blink::MemoryUsageMonitorLinux> receiver) {
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h b/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h
new file mode 100644
index 000000000000..179fa1f6b946
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h
@@ -0,0 +1,47 @@
+--- third_party/blink/renderer/controller/memory_usage_monitor_posix.h.orig 2022-02-28 16:54:41 UTC
++++ third_party/blink/renderer/controller/memory_usage_monitor_posix.h
+@@ -13,7 +13,7 @@
+ #include "third_party/blink/renderer/controller/controller_export.h"
+ #include "third_party/blink/renderer/controller/memory_usage_monitor.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/public/mojom/memory_usage_monitor_linux.mojom-blink.h"
+ #endif
+
+@@ -22,7 +22,7 @@ namespace blink {
+ // MemoryUsageMonitor implementation for Android and Linux.
+ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ : public MemoryUsageMonitor
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ public mojom::blink::MemoryUsageMonitorLinux
+ #endif
+@@ -30,7 +30,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ public:
+ MemoryUsageMonitorPosix() = default;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static void Bind(
+ mojo::PendingReceiver<mojom::blink::MemoryUsageMonitorLinux> receiver);
+ #endif
+@@ -48,7 +48,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ uint64_t* vm_size,
+ uint64_t* vm_hwm_size);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // mojom::MemoryUsageMonitorLinux implementations:
+ void SetProcFiles(base::File statm_file, base::File status_file) override;
+ #endif
+@@ -66,7 +66,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ base::ScopedFD statm_fd_;
+ base::ScopedFD status_fd_;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ mojo::Receiver<mojom::blink::MemoryUsageMonitorLinux> receiver_{this};
+ #endif
+ };
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc
new file mode 100644
index 000000000000..5bb0477df831
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/editing/editing_behavior.cc.orig 2023-11-29 21:40:10 UTC
++++ third_party/blink/renderer/core/editing/editing_behavior.cc
+@@ -324,7 +324,7 @@ bool EditingBehavior::ShouldInsertCharacter(const Keyb
+ // unexpected behaviour
+ if (ch < ' ')
+ return false;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // According to XKB map no keyboard combinations with ctrl key are mapped to
+ // printable characters, however we need the filter as the DomKey/text could
+ // contain printable characters.
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_execution__context_navigator__base.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_execution__context_navigator__base.cc
new file mode 100644
index 000000000000..47bf6be610e1
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_execution__context_navigator__base.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/execution_context/navigator_base.cc.orig 2023-03-30 00:33:57 UTC
++++ third_party/blink/renderer/core/execution_context/navigator_base.cc
+@@ -31,7 +31,7 @@ String GetReducedNavigatorPlatform() {
+ return "Win32";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return "";
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return "Linux x86_64";
+ #elif BUILDFLAG(IS_IOS)
+ return "iPhone";
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_exported_web__view__impl.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_exported_web__view__impl.cc
new file mode 100644
index 000000000000..2fb808cf4d41
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_exported_web__view__impl.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/core/exported/web_view_impl.cc.orig 2023-12-20 07:12:20 UTC
++++ third_party/blink/renderer/core/exported/web_view_impl.cc
+@@ -425,7 +425,7 @@ SkFontHinting RendererPreferencesToSkiaHinting(
+ const blink::RendererPreferences& prefs) {
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ if (!prefs.should_antialias_text) {
+ // When anti-aliasing is off, GTK maps all non-zero hinting settings to
+ // 'Normal' hinting so we do the same. Otherwise, folks who have 'Slight'
+@@ -3357,7 +3357,7 @@ void WebViewImpl::UpdateFontRenderingFromRendererPrefs
+ renderer_preferences_.use_subpixel_positioning);
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)) && \
+ !BUILDFLAG(IS_ANDROID)
+ if (!renderer_preferences_.system_font_family_name.empty()) {
+ WebFontRenderStyle::SetSystemFontFamily(blink::WebString::FromUTF8(
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_frame_web__frame__test.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_frame_web__frame__test.cc
new file mode 100644
index 000000000000..365f6bca04b8
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_frame_web__frame__test.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/core/frame/web_frame_test.cc.orig 2023-11-29 21:40:10 UTC
++++ third_party/blink/renderer/core/frame/web_frame_test.cc
+@@ -6468,7 +6468,7 @@ TEST_F(WebFrameTest, DISABLED_PositionForPointTest) {
+ }
+
+ #if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1090246): Fix these tests on Fuchsia and re-enable.
+ // TODO(crbug.com/1317375): Build these tests on all platforms.
+ #define MAYBE_SelectRangeStaysHorizontallyAlignedWhenMoved \
+@@ -6877,7 +6877,7 @@ TEST_F(CompositedSelectionBoundsTest, LargeSelectionNo
+ TEST_F(CompositedSelectionBoundsTest, LargeSelectionNoScroll) {
+ RunTest("composited_selection_bounds_large_selection_noscroll.html");
+ }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #if !BUILDFLAG(IS_ANDROID)
+ TEST_F(CompositedSelectionBoundsTest, Input) {
+ web_view_helper_.GetWebView()->GetSettings()->SetDefaultFontSize(16);
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc
new file mode 100644
index 000000000000..174f047514b0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc.orig 2023-10-19 19:58:32 UTC
++++ third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+@@ -48,7 +48,7 @@ constexpr base::TimeDelta kEncodeRowSlackBeforeDeadlin
+
+ /* The value is based on user statistics on Nov 2017. */
+ #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
+- BUILDFLAG(IS_WIN))
++ BUILDFLAG(IS_WIN)) || BUILDFLAG(IS_BSD)
+ const double kIdleTaskStartTimeoutDelayMs = 1000.0;
+ #else
+ const double kIdleTaskStartTimeoutDelayMs = 4000.0; // For ChromeOS, Mobile
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_html_parser_html__document__parser__fastpath.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_html_parser_html__document__parser__fastpath.cc
new file mode 100644
index 000000000000..1a6acebc1858
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_html_parser_html__document__parser__fastpath.cc
@@ -0,0 +1,14 @@
+--- third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc.orig 2023-11-29 21:40:10 UTC
++++ third_party/blink/renderer/core/html/parser/html_document_parser_fastpath.cc
+@@ -172,7 +172,11 @@ class HTMLFastPathParser {
+ using Span = base::span<const Char>;
+ using USpan = base::span<const UChar>;
+ // 32 matches that used by HTMLToken::Attribute.
++#if defined(__clang__) && (__clang_major__ >= 16)
+ typedef std::conditional<std::is_same_v<Char, UChar>,
++#else
++ typedef typename std::conditional<std::is_same_v<Char, UChar>,
++#endif
+ UCharLiteralBuffer<32>,
+ LCharLiteralBuffer<32>>::type LiteralBufferType;
+ typedef UCharLiteralBuffer<32> UCharLiteralBufferType;
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc
new file mode 100644
index 000000000000..395fd6cff11d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/inspector/inspector_memory_agent.cc.orig 2023-11-29 21:40:10 UTC
++++ third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
+@@ -190,7 +190,7 @@ Vector<String> InspectorMemoryAgent::Symbolize(
+
+ Vector<String> InspectorMemoryAgent::Symbolize(
+ const WebVector<const void*>& addresses) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // TODO(alph): Move symbolization to the client.
+ Vector<const void*> addresses_to_symbolize;
+ for (const void* address : addresses) {
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_layout_layout__view.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_layout_layout__view.cc
new file mode 100644
index 000000000000..9b1f7d232208
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_layout_layout__view.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/core/layout/layout_view.cc.orig 2023-11-29 21:40:11 UTC
++++ third_party/blink/renderer/core/layout/layout_view.cc
+@@ -73,7 +73,7 @@
+ #include "ui/gfx/geometry/quad_f.h"
+ #include "ui/gfx/geometry/size_conversions.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/font_cache.h"
+ #endif
+
+@@ -808,7 +808,7 @@ void LayoutView::UpdateLayout() {
+ fragmentation_context_.Clear();
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The font code in FontPlatformData does not have a direct connection to the
+ // document, the frame or anything from which we could retrieve the device
+ // scale factor. After using zoom for DSF, the GraphicsContext does only ever
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_layout_ng_physical__fragment__rare__data.h b/devel/electron28/files/patch-third__party_blink_renderer_core_layout_ng_physical__fragment__rare__data.h
new file mode 100644
index 000000000000..f9146335b0b8
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_layout_ng_physical__fragment__rare__data.h
@@ -0,0 +1,10 @@
+--- third_party/blink/renderer/core/layout/ng/physical_fragment_rare_data.h.orig 2023-10-19 19:58:32 UTC
++++ third_party/blink/renderer/core/layout/ng/physical_fragment_rare_data.h
+@@ -5,6 +5,7 @@
+ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_PHYSICAL_FRAGMENT_RARE_DATA_H_
+ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_PHYSICAL_FRAGMENT_RARE_DATA_H_
+
++#include <bit>
+ #include <climits>
+
+ #include "third_party/blink/renderer/core/layout/geometry/logical_rect.h"
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_paint_object__paint__properties__sparse.h b/devel/electron28/files/patch-third__party_blink_renderer_core_paint_object__paint__properties__sparse.h
new file mode 100644
index 000000000000..dbd47d91aa79
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_paint_object__paint__properties__sparse.h
@@ -0,0 +1,13 @@
+--- third_party/blink/renderer/core/paint/object_paint_properties_sparse.h.orig 2023-10-19 19:58:32 UTC
++++ third_party/blink/renderer/core/paint/object_paint_properties_sparse.h
+@@ -272,8 +272,8 @@ class CORE_EXPORT ObjectPaintPropertiesSparse : public
+ NodeList& nodes,
+ NodeId node_id,
+ const ParentType& parent,
+- NodeType::State&& state,
+- const NodeType::AnimationState& animation_state =
++ typename NodeType::State&& state,
++ const typename NodeType::AnimationState& animation_state =
+ NodeType::AnimationState()) {
+ // First, check if we need to add a new node.
+ if (!nodes.HasField(node_id)) {
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc
new file mode 100644
index 000000000000..8c1b31bb6051
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/paint/paint_layer.cc.orig 2023-11-29 21:40:11 UTC
++++ third_party/blink/renderer/core/paint/paint_layer.cc
+@@ -120,7 +120,7 @@ namespace {
+
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ struct SameSizeAsPaintLayer : GarbageCollected<PaintLayer>, DisplayItemClient {
+ // The bit fields may fit into the machine word of DisplayItemClient which
+ // has only 8-bit data.
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc b/devel/electron28/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc
new file mode 100644
index 000000000000..efa6d8bd2eab
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc.orig 2023-11-29 21:40:11 UTC
++++ third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
+@@ -157,7 +157,7 @@ bool ScrollbarThemeAura::SupportsDragSnapBack() const
+ // is true for at least GTK and QT apps).
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return false;
+ #else
+ return true;
+@@ -360,7 +360,7 @@ bool ScrollbarThemeAura::ShouldCenterOnThumb(const Scr
+ const WebMouseEvent& event) {
+ // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
+ // complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ if (event.button == WebPointerProperties::Button::kMiddle)
+ return true;
+ #endif
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_canvas_canvas2d_canvas__style.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_canvas_canvas2d_canvas__style.cc
new file mode 100644
index 000000000000..f5e54d616895
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_canvas_canvas2d_canvas__style.cc
@@ -0,0 +1,33 @@
+--- third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc
+@@ -83,6 +83,9 @@ void CanvasStyle::ApplyToFlags(cc::PaintFlags& flags,
+
+ void CanvasStyle::ApplyToFlags(cc::PaintFlags& flags,
+ float global_alpha) const {
++#if defined(__clang__) && (__clang_major__ < 16)
++ SkColor4f custom_color = SkColor4f{0.0f, 0.0f, 0.0f, global_alpha};
++#endif
+ switch (type_) {
+ case kColor:
+ ApplyColorToFlags(flags, global_alpha);
+@@ -90,12 +93,20 @@ void CanvasStyle::ApplyToFlags(cc::PaintFlags& flags,
+ case kGradient:
+ GetCanvasGradient()->GetGradient()->ApplyToFlags(flags, SkMatrix::I(),
+ ImageDrawOptions());
++#if defined(__clang__) && (__clang_major__ >= 16)
+ flags.setColor(SkColor4f(0.0f, 0.0f, 0.0f, global_alpha));
++#else
++ flags.setColor(custom_color);
++#endif
+ break;
+ case kImagePattern:
+ GetCanvasPattern()->GetPattern()->ApplyToFlags(
+ flags, AffineTransformToSkMatrix(GetCanvasPattern()->GetTransform()));
++#if defined(__clang__) && (__clang_major__ >= 16)
+ flags.setColor(SkColor4f(0.0f, 0.0f, 0.0f, global_alpha));
++#else
++ flags.setColor(custom_color);
++#endif
+ break;
+ default:
+ NOTREACHED();
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__device__factory.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__device__factory.cc
new file mode 100644
index 000000000000..b457652aa3dc
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__device__factory.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/media/audio/audio_device_factory.cc.orig 2022-11-30 08:12:58 UTC
++++ third_party/blink/renderer/modules/media/audio/audio_device_factory.cc
+@@ -35,7 +35,7 @@ namespace {
+ AudioDeviceFactory* g_factory_override = nullptr;
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS_LACROS)
++ BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Due to driver deadlock issues on Windows (http://crbug/422522) there is a
+ // chance device authorization response is never received from the browser side.
+ // In this case we will time out, to avoid renderer hang forever waiting for
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__renderer__mixer__manager__test.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__renderer__mixer__manager__test.cc
new file mode 100644
index 000000000000..f76009e7ca7a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_media_audio_audio__renderer__mixer__manager__test.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager_test.cc.orig 2023-10-19 19:58:33 UTC
++++ third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager_test.cc
+@@ -724,7 +724,7 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLaten
+ mixer->get_output_params_for_testing().sample_rate());
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Use 10 ms buffer (441 frames per buffer).
+ EXPECT_EQ(output_sample_rate / 100,
+ mixer->get_output_params_for_testing().frames_per_buffer());
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_features.gni b/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_features.gni
new file mode 100644
index 000000000000..cd0ede28a1ec
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_features.gni
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/ml/webnn/features.gni.orig 2023-05-25 00:42:04 UTC
++++ third_party/blink/renderer/modules/ml/webnn/features.gni
+@@ -7,7 +7,7 @@ declare_args() {
+ # This enables building WebNN with XNNPACK. Currently only available for
+ # Windows and Linux on x64 or x86.
+ build_webnn_with_xnnpack =
+- (is_linux || is_win) && (current_cpu == "x64" || current_cpu == "x86")
++ !is_bsd && (is_win && (current_cpu == "x64" || current_cpu == "x86"))
+
+ # This build flag enables WebNN on ChromeOS platform to access hardware
+ # acceleration by using ModelLoader mojo interface.
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_ml__graph__xnnpack.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_ml__graph__xnnpack.cc
new file mode 100644
index 000000000000..2dbf3d14e000
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_ml_webnn_ml__graph__xnnpack.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
+@@ -196,7 +196,7 @@ class SharedXnnpackContext : public ThreadSafeRefCount
+
+ ~SharedXnnpackContext() {
+ base::AutoLock auto_lock(SharedXnnpackContextLock());
+-#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++#if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ // For Linux and ChromeOS, cpuinfo needs to parse /proc/cpuinfo to
+ // initialize in pre sandbox stage. Calling xnn_deinitialize() here will
+ // deinitialize cpuinfo within sandbox and cannot access /proc/cpuinfo
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_peerconnection_webrtc__audio__renderer__test.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_peerconnection_webrtc__audio__renderer__test.cc
new file mode 100644
index 000000000000..13756cbdeb63
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_peerconnection_webrtc__audio__renderer__test.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc
+@@ -298,7 +298,7 @@ TEST_F(WebRtcAudioRendererTest, DISABLED_VerifySinkPar
+ SetupRenderer(kDefaultOutputDeviceId);
+ renderer_proxy_->Start();
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ static const int kExpectedBufferSize = kHardwareSampleRate / 100;
+ #elif BUILDFLAG(IS_ANDROID)
+ static const int kExpectedBufferSize = 2 * kHardwareSampleRate / 100;
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_webaudio_audio__worklet__thread__test.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_webaudio_audio__worklet__thread__test.cc
new file mode 100644
index 000000000000..e729086fb236
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_webaudio_audio__worklet__thread__test.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc.orig 2023-02-01 18:43:26 UTC
++++ third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
+@@ -380,7 +380,7 @@ class AudioWorkletThreadPriorityTest
+
+ // TODO(crbug.com/1022888): The worklet thread priority is always NORMAL
+ // on OS_LINUX and OS_CHROMEOS regardless of the thread priority setting.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (expected_priority == base::ThreadPriorityForTest::kRealtimeAudio ||
+ expected_priority == base::ThreadPriorityForTest::kDisplay) {
+ EXPECT_EQ(actual_priority, base::ThreadPriorityForTest::kNormal);
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_webgl_webgl__rendering__context__base.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_webgl_webgl__rendering__context__base.cc
new file mode 100644
index 000000000000..805c6ce778e0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_webgl_webgl__rendering__context__base.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+@@ -6314,7 +6314,7 @@ void WebGLRenderingContextBase::TexImageHelperMediaVid
+ constexpr bool kAllowZeroCopyImages = true;
+ #endif
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1175907): Only TexImage2D seems to work with the GPU path on
+ // Android M -- appears to work fine on R, but to avoid regressions in <video>
+ // limit to TexImage2D only for now. Fails conformance test on Nexus 5X:
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_modules_webgpu_gpu__queue.cc b/devel/electron28/files/patch-third__party_blink_renderer_modules_webgpu_gpu__queue.cc
new file mode 100644
index 000000000000..599c6b510911
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_modules_webgpu_gpu__queue.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/webgpu/gpu_queue.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/modules/webgpu/gpu_queue.cc
+@@ -746,7 +746,7 @@ bool GPUQueue::CopyFromCanvasSourceImage(
+ // on linux platform.
+ // TODO(crbug.com/1424119): using a webgpu mailbox texture on the OpenGLES
+ // backend is failing for unknown reasons.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ bool forceReadback = true;
+ #elif BUILDFLAG(IS_ANDROID)
+ // TODO(crbug.com/dawn/1969): Some Android devices don't fail to copy from
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_BUILD.gn b/devel/electron28/files/patch-third__party_blink_renderer_platform_BUILD.gn
new file mode 100644
index 000000000000..d0cf5bf5f44d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/BUILD.gn.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/platform/BUILD.gn
+@@ -1925,7 +1925,7 @@ static_library("test_support") {
+ ]
+
+ # fuzzed_data_provider may not work with a custom toolchain.
+- if (custom_toolchain == "" && is_clang) {
++ if ((custom_toolchain == "" && is_clang) && !is_bsd) {
+ sources += [
+ "testing/fuzzed_data_provider.cc",
+ "testing/fuzzed_data_provider.h",
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc
new file mode 100644
index 000000000000..5f4f8efea918
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_cache.cc.orig 2023-08-10 01:48:51 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.cc
+@@ -72,7 +72,7 @@ extern const char kNotoColorEmojiCompat[] = "Noto Colo
+
+ SkFontMgr* FontCache::static_font_manager_ = nullptr;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ float FontCache::device_scale_factor_ = 1.0;
+ #endif
+
+@@ -118,7 +118,7 @@ FontPlatformData* FontCache::SystemFontPlatformData(
+ const FontDescription& font_description) {
+ const AtomicString& family = FontCache::SystemFontFamily();
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || \
+- BUILDFLAG(IS_IOS)
++ BUILDFLAG(IS_IOS) || BUILDFLAG(IS_BSD)
+ if (family.empty() || family == font_family_names::kSystemUi)
+ return nullptr;
+ #else
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
new file mode 100644
index 000000000000..3bfbf624d3da
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
@@ -0,0 +1,47 @@
+--- third_party/blink/renderer/platform/fonts/font_cache.h.orig 2023-10-19 19:58:33 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.h
+@@ -56,7 +56,7 @@
+ #include "third_party/skia/include/core/SkFontMgr.h"
+ #include "third_party/skia/include/core/SkRefCnt.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/gfx/font_fallback_linux.h"
+ #endif
+
+@@ -174,7 +174,7 @@ class PLATFORM_EXPORT FontCache final {
+ static void PrewarmFamily(const AtomicString& family_name) {}
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // These are needed for calling QueryRenderStyleForStrike, since
+ // gfx::GetFontRenderParams makes distinctions based on DSF.
+ static float DeviceScaleFactor() { return device_scale_factor_; }
+@@ -250,7 +250,7 @@ class PLATFORM_EXPORT FontCache final {
+ const char* locale_family_name);
+ #endif // BUILDFLAG(IS_ANDROID)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static bool GetFontForCharacter(UChar32,
+ const char* preferred_locale,
+ gfx::FallbackFontData*);
+@@ -330,7 +330,7 @@ class PLATFORM_EXPORT FontCache final {
+ const FontFaceCreationParams&,
+ std::string& name);
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static AtomicString GetFamilyNameForCharacter(SkFontMgr*,
+ UChar32,
+ const FontDescription&,
+@@ -368,7 +368,7 @@ class PLATFORM_EXPORT FontCache final {
+ bool is_test_font_mgr_ = false;
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static float device_scale_factor_;
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc
new file mode 100644
index 000000000000..5fe90db97bf4
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_description.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/platform/fonts/font_description.cc
+@@ -39,7 +39,7 @@
+ #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+ #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/font_cache.h"
+ #endif
+
+@@ -277,7 +277,7 @@ FontCacheKey FontDescription::CacheKey(
+ static_cast<unsigned>(fields_.orientation_) << 1 | // bit 2-3
+ static_cast<unsigned>(fields_.subpixel_text_position_); // bit 1
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ float device_scale_factor_for_key = FontCache::DeviceScaleFactor();
+ #else
+ float device_scale_factor_for_key = 1.0f;
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc
new file mode 100644
index 000000000000..d360fa692560
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc
@@ -0,0 +1,29 @@
+--- third_party/blink/renderer/platform/fonts/font_metrics.cc.orig 2022-03-25 21:59:56 UTC
++++ third_party/blink/renderer/platform/fonts/font_metrics.cc
+@@ -39,7 +39,7 @@
+ namespace blink {
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // This is the largest VDMX table which we'll try to load and parse.
+ static const size_t kMaxVDMXTableSize = 1024 * 1024; // 1 MB
+ #endif
+@@ -69,7 +69,7 @@ void FontMetrics::AscentDescentWithHacks(
+ bool is_vdmx_valid = false;
+
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Manually digging up VDMX metrics is only applicable when bytecode hinting
+ // using FreeType. With DirectWrite or CoreText, no bytecode hinting is ever
+ // done. This code should be pushed into FreeType (hinted font metrics).
+@@ -117,7 +117,7 @@ void FontMetrics::AscentDescentWithHacks(
+ if (descent < metrics.fDescent) {
+ visual_overflow_inflation_for_descent = 1;
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
+- BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // When subpixel positioning is enabled, if the descent is rounded down,
+ // the descent part of the glyph may be truncated when displayed in a
+ // 'overflow: hidden' container. To avoid that, borrow 1 unit from the
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__palette.h b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__palette.h
new file mode 100644
index 000000000000..fb37ac6a8582
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__palette.h
@@ -0,0 +1,26 @@
+--- third_party/blink/renderer/platform/fonts/font_palette.h.orig 2023-10-19 19:58:33 UTC
++++ third_party/blink/renderer/platform/fonts/font_palette.h
+@@ -96,7 +96,11 @@ class PLATFORM_EXPORT FontPalette : public RefCounted<
+ Color::ColorSpace color_interpolation_space,
+ absl::optional<Color::HueInterpolationMethod> hue_interpolation_method) {
+ return base::AdoptRef(new FontPalette(
++#if defined(__clang__) && (__clang_major__ >= 16)
+ start, end, NonNormalizedPercentages(start_percentage, end_percentage),
++#else
++ start, end, NonNormalizedPercentages(NonNormalizedPercentages{start_percentage, end_percentage}),
++#endif
+ normalized_percentage, alpha_multiplier, color_interpolation_space,
+ hue_interpolation_method));
+ }
+@@ -170,7 +174,11 @@ class PLATFORM_EXPORT FontPalette : public RefCounted<
+ double normalized_percentage) {
+ double end_percentage = normalized_percentage * 100.0;
+ double start_percentage = 100.0 - end_percentage;
++#if defined(__clang__) && (__clang_major__ >= 16)
+ return NonNormalizedPercentages(start_percentage, end_percentage);
++#else
++ return NonNormalizedPercentages(NonNormalizedPercentages{start_percentage, end_percentage});
++#endif
+ }
+
+ double GetAlphaMultiplier() const {
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__platform__data.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__platform__data.cc
new file mode 100644
index 000000000000..8d59ae35befe
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__platform__data.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_platform_data.cc.orig 2023-02-01 18:43:26 UTC
++++ third_party/blink/renderer/platform/fonts/font_platform_data.cc
+@@ -48,7 +48,7 @@
+ namespace blink {
+ namespace {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Getting the system font render style takes a significant amount of time on
+ // Linux because looking up fonts using fontconfig can be very slow. We fetch
+ // the render style for each font family and text size, while it's very
+@@ -127,7 +127,7 @@ FontPlatformData::FontPlatformData(sk_sp<SkTypeface> t
+ style_ = WebFontRenderStyle::GetDefault();
+ #if !BUILDFLAG(IS_WIN)
+ WebFontRenderStyle system_style;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool override_font_name_and_size =
+ base::FeatureList::IsEnabled(kOptimizeLinuxFonts);
+ #else
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc
new file mode 100644
index 000000000000..957a508124f0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/font_unique_name_lookup.cc.orig 2022-03-25 21:59:56 UTC
++++ third_party/blink/renderer/platform/fonts/font_unique_name_lookup.cc
+@@ -9,7 +9,7 @@
+ #if BUILDFLAG(IS_ANDROID)
+ #include "third_party/blink/public/mojom/font_unique_name_lookup/font_unique_name_lookup.mojom-blink.h"
+ #include "third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/linux/font_unique_name_lookup_linux.h"
+ #elif BUILDFLAG(IS_WIN)
+ #include "third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.h"
+@@ -24,7 +24,7 @@ std::unique_ptr<FontUniqueNameLookup>
+ FontUniqueNameLookup::GetPlatformUniqueNameLookup() {
+ #if BUILDFLAG(IS_ANDROID)
+ return std::make_unique<FontUniqueNameLookupAndroid>();
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return std::make_unique<FontUniqueNameLookupLinux>();
+ #elif BUILDFLAG(IS_WIN)
+ return std::make_unique<FontUniqueNameLookupWin>();
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_palette__interpolation.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_palette__interpolation.cc
new file mode 100644
index 000000000000..e1063e41727d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_palette__interpolation.cc
@@ -0,0 +1,15 @@
+--- third_party/blink/renderer/platform/fonts/palette_interpolation.cc.orig 2023-08-10 01:48:51 UTC
++++ third_party/blink/renderer/platform/fonts/palette_interpolation.cc
+@@ -31,7 +31,12 @@ Vector<FontPalette::FontPaletteOverride> PaletteInterp
+ color_interpolation_space, hue_interpolation_method, start_color,
+ end_color, percentage, alpha_multiplier);
+
++#if defined(__clang__) && (__clang_major__ >= 16)
+ FontPalette::FontPaletteOverride result_color_record(i, result_color);
++#else
++ FontPalette::FontPaletteOverride fpo = { static_cast<int>(i), result_color };
++ FontPalette::FontPaletteOverride result_color_record(fpo);
++#endif
+ result_color_records.push_back(result_color_record);
+ }
+ return result_color_records;
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
new file mode 100644
index 000000000000..0a6b6d51fe96
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc.orig 2023-05-25 00:42:04 UTC
++++ third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+@@ -64,7 +64,7 @@ AtomicString ToAtomicString(const SkString& str) {
+ return AtomicString::FromUTF8(str.c_str(), str.size());
+ }
+
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // This function is called on android or when we are emulating android fonts on
+ // linux and the embedder has overriden the default fontManager with
+ // WebFontRendering::setSkiaFontMgr.
+@@ -246,7 +246,7 @@ std::unique_ptr<FontPlatformData> FontCache::CreateFon
+ std::string name;
+
+ sk_sp<SkTypeface> typeface;
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool noto_color_emoji_from_gmscore = false;
+ #if BUILDFLAG(IS_ANDROID)
+ // Use the unique local matching pathway for fetching Noto Color Emoji Compat
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_begin__frame__provider.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_begin__frame__provider.cc
new file mode 100644
index 000000000000..a00b84bd937c
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_begin__frame__provider.cc
@@ -0,0 +1,15 @@
+--- third_party/blink/renderer/platform/graphics/begin_frame_provider.cc.orig 2023-08-10 01:48:51 UTC
++++ third_party/blink/renderer/platform/graphics/begin_frame_provider.cc
+@@ -71,8 +71,12 @@ void BeginFrameProvider::CreateCompositorFrameSinkIfNe
+
+ // Once we are using RAF, this thread is driving user interactive display
+ // updates. Update priority accordingly.
++ // pledge(2)
++ // stop this baloney
++#if !defined(OS_OPENBSD)
+ base::PlatformThread::SetCurrentThreadType(
+ base::ThreadType::kDisplayCritical);
++#endif
+
+ mojo::Remote<mojom::blink::EmbeddedFrameSinkProvider> provider;
+ Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_video__frame__submitter.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_video__frame__submitter.cc
new file mode 100644
index 000000000000..ce5c53e58244
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_graphics_video__frame__submitter.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/graphics/video_frame_submitter.cc.orig 2023-11-29 21:40:12 UTC
++++ third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
+@@ -358,7 +358,7 @@ void VideoFrameSubmitter::OnBeginFrame(
+ continue;
+ auto& feedback =
+ timing_details.find(frame_token)->value.presentation_feedback;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO: On Linux failure flag is unreliable, and perfectly rendered frames
+ // are reported as failures all the time.
+ bool presentation_failure = false;
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_instrumentation_partition__alloc__memory__dump__provider.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_instrumentation_partition__alloc__memory__dump__provider.cc
new file mode 100644
index 000000000000..31ce7b2caf84
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_instrumentation_partition__alloc__memory__dump__provider.cc
@@ -0,0 +1,18 @@
+--- third_party/blink/renderer/platform/instrumentation/partition_alloc_memory_dump_provider.cc.orig 2023-02-01 18:43:26 UTC
++++ third_party/blink/renderer/platform/instrumentation/partition_alloc_memory_dump_provider.cc
+@@ -24,6 +24,7 @@ PartitionAllocMemoryDumpProvider* PartitionAllocMemory
+ bool PartitionAllocMemoryDumpProvider::OnMemoryDump(
+ const base::trace_event::MemoryDumpArgs& args,
+ base::trace_event::ProcessMemoryDump* memory_dump) {
++#if !BUILDFLAG(IS_BSD)
+ using base::trace_event::MemoryDumpLevelOfDetail;
+
+ MemoryDumpLevelOfDetail level_of_detail = args.level_of_detail;
+@@ -49,6 +50,7 @@ bool PartitionAllocMemoryDumpProvider::OnMemoryDump(
+ "size", "bytes", partition_stats_dumper.total_active_bytes());
+ memory_dump->AddOwnershipEdge(allocated_objects_dump->guid(),
+ partitions_dump->guid());
++#endif
+
+ return true;
+ }
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_peerconnection_rtc__video__encoder__factory.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_peerconnection_rtc__video__encoder__factory.cc
new file mode 100644
index 000000000000..4e7d73e3030d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_peerconnection_rtc__video__encoder__factory.cc
@@ -0,0 +1,17 @@
+--- third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc.orig 2023-10-19 19:58:33 UTC
++++ third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc
+@@ -198,12 +198,12 @@ SupportedFormats GetSupportedFormatsInternal(
+ supported_formats.scalability_modes.push_back(profile.scalability_modes);
+ supported_formats.sdp_formats.push_back(std::move(*format));
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #if BUILDFLAG(IS_WIN)
+ const bool kShouldAddH264Cbp =
+ base::FeatureList::IsEnabled(kMediaFoundationH264CbpEncoding) &&
+ profile.profile == media::VideoCodecProfile::H264PROFILE_BASELINE;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const bool kShouldAddH264Cbp =
+ profile.profile == media::VideoCodecProfile::H264PROFILE_BASELINE;
+ #endif
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_runtime__enabled__features.json5 b/devel/electron28/files/patch-third__party_blink_renderer_platform_runtime__enabled__features.json5
new file mode 100644
index 000000000000..0e876242adf5
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_runtime__enabled__features.json5
@@ -0,0 +1,44 @@
+--- third_party/blink/renderer/platform/runtime_enabled_features.json5.orig 2023-11-29 21:40:13 UTC
++++ third_party/blink/renderer/platform/runtime_enabled_features.json5
+@@ -1997,7 +1997,7 @@
+ base_feature_status: "enabled",
+ copied_from_base_feature_if: "overridden",
+ origin_trial_feature_name: "FullscreenPopupWindows",
+- origin_trial_os: ["win", "mac", "linux", "chromeos"],
++ origin_trial_os: ["win", "mac", "linux", "chromeos", "openbsd", "freebsd"],
+ },
+ {
+ name: "GamepadButtonAxisEvents",
+@@ -2920,7 +2920,7 @@
+ name: "PaymentHandlerMinimalHeaderUX",
+ origin_trial_feature_name: "PaymentHandlerMinimalHeaderUX",
+ origin_trial_allows_third_party: true,
+- origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos"],
++ origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos", "openbsd", "freebsd"],
+ status: "stable",
+ },
+ {
+@@ -3967,7 +3967,7 @@
+ name: "UnrestrictedSharedArrayBuffer",
+ base_feature: "none",
+ origin_trial_feature_name: "UnrestrictedSharedArrayBuffer",
+- origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos"],
++ origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos", "openbsd", "freebsd"],
+ },
+ {
+ // This flag makes IDL reflected attributes with the "URL" IDL attribute
+@@ -4185,12 +4185,12 @@
+ status: "experimental",
+ base_feature: "none",
+ origin_trial_feature_name: "WebAppUrlHandling",
+- origin_trial_os: ["win", "mac", "linux"],
++ origin_trial_os: ["win", "mac", "linux", "openbsd", "freebsd"],
+ },
+ {
+ name: "WebAppWindowControlsOverlay",
+ origin_trial_feature_name: "WebAppWindowControlsOverlay",
+- origin_trial_os: ["win", "mac", "linux", "chromeos"],
++ origin_trial_os: ["win", "mac", "linux", "chromeos", "openbsd", "freebsd"],
+ status: "stable",
+ base_feature: "none",
+ },
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_scheduler_common_thread.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_scheduler_common_thread.cc
new file mode 100644
index 000000000000..558a2e0cc3b0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_scheduler_common_thread.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/scheduler/common/thread.cc.orig 2023-05-25 00:42:05 UTC
++++ third_party/blink/renderer/platform/scheduler/common/thread.cc
+@@ -82,7 +82,7 @@ void Thread::CreateAndSetCompositorThread() {
+ std::make_unique<scheduler::CompositorThread>(params);
+ compositor_thread->Init();
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_OPENBSD)
+ compositor_thread->GetTaskRunner()->PostTaskAndReplyWithResult(
+ FROM_HERE, base::BindOnce(&base::PlatformThread::CurrentId),
+ base::BindOnce([](base::PlatformThreadId compositor_thread_id) {
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_text_text__break__iterator.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_text_text__break__iterator.cc
new file mode 100644
index 000000000000..400988580f01
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_text_text__break__iterator.cc
@@ -0,0 +1,13 @@
+--- third_party/blink/renderer/platform/text/text_break_iterator.cc.orig 2023-11-21 08:28:56 UTC
++++ third_party/blink/renderer/platform/text/text_break_iterator.cc
+@@ -161,7 +161,9 @@ static const unsigned char kAsciiLineBreakTable[][(kAs
+ };
+ // clang-format on
+
+-#if U_ICU_VERSION_MAJOR_NUM >= 58
++#if U_ICU_VERSION_MAJOR_NUM >= 74
++#define BA_LB_COUNT (U_LB_COUNT - 8)
++#elif U_ICU_VERSION_MAJOR_NUM >= 58
+ #define BA_LB_COUNT (U_LB_COUNT - 3)
+ #else
+ #define BA_LB_COUNT U_LB_COUNT
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_video__capture_video__capture__impl.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_video__capture_video__capture__impl.cc
new file mode 100644
index 000000000000..dcd55d87de76
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_video__capture_video__capture__impl.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/video_capture/video_capture_impl.cc.orig 2023-11-29 21:40:13 UTC
++++ third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+@@ -634,7 +634,7 @@ bool VideoCaptureImpl::VideoFrameBufferPreparer::BindV
+ }
+
+ const unsigned texture_target =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Explicitly set GL_TEXTURE_EXTERNAL_OES as the
+ // `media::VideoFrame::RequiresExternalSampler()` requires it for NV12
+ // format, while the `ImageTextureTarget()` will return GL_TEXTURE_2D.
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_widget_compositing_blink__categorized__worker__pool__delegate.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_widget_compositing_blink__categorized__worker__pool__delegate.cc
new file mode 100644
index 000000000000..e2e3962011c0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_widget_compositing_blink__categorized__worker__pool__delegate.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/widget/compositing/blink_categorized_worker_pool_delegate.cc.orig 2023-05-25 00:42:05 UTC
++++ third_party/blink/renderer/platform/widget/compositing/blink_categorized_worker_pool_delegate.cc
+@@ -27,7 +27,7 @@ BlinkCategorizedWorkerPoolDelegate& BlinkCategorizedWo
+
+ void BlinkCategorizedWorkerPoolDelegate::NotifyThreadWillRun(
+ base::PlatformThreadId tid) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ scoped_refptr<base::TaskRunner> task_runner =
+ Thread::MainThread()->GetTaskRunner(MainThreadTaskRunnerRestricted());
+ task_runner->PostTask(FROM_HERE, base::BindOnce(
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
new file mode 100644
index 000000000000..25658e65ff2b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/platform/wtf/container_annotations.h.orig 2022-03-25 21:59:56 UTC
++++ third_party/blink/renderer/platform/wtf/container_annotations.h
+@@ -12,7 +12,7 @@
+ // TODO(ochang): Remove the ARCH_CPU_X86_64 condition to enable this for X86
+ // once the crashes there have been fixed: http://crbug.com/461406
+ #if defined(ADDRESS_SANITIZER) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ defined(ARCH_CPU_X86_64)
+
+ // Annotations require buffers to begin on an 8-byte boundary. See
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_math__extras.h b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_math__extras.h
new file mode 100644
index 000000000000..b184b8b79210
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_math__extras.h
@@ -0,0 +1,23 @@
+--- third_party/blink/renderer/platform/wtf/math_extras.h.orig 2022-07-22 17:30:31 UTC
++++ third_party/blink/renderer/platform/wtf/math_extras.h
+@@ -128,6 +128,10 @@ constexpr float Grad2turn(float g) {
+ return g * (1.0f / 400.0f);
+ }
+
++#if defined(OS_FREEBSD)
++#pragma clang diagnostic push
++#pragma clang diagnostic ignored "-Winvalid-constexpr"
++#endif
+ constexpr double RoundHalfTowardsPositiveInfinity(double value) {
+ return std::floor(value + 0.5);
+ }
+@@ -135,6 +139,9 @@ constexpr double RoundHalfTowardsPositiveInfinity(doub
+ constexpr float RoundHalfTowardsPositiveInfinity(float value) {
+ return std::floor(value + 0.5f);
+ }
++#if defined(OS_FREEBSD)
++#pragma clang diagnostic pop
++#endif
+
+ // ClampTo() is implemented by templated helper classes (to allow for partial
+ // template specialization) as well as several helper functions.
diff --git a/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
new file mode 100644
index 000000000000..90040c5a0933
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
@@ -0,0 +1,37 @@
+--- third_party/blink/renderer/platform/wtf/stack_util.cc.orig 2023-03-30 00:33:58 UTC
++++ third_party/blink/renderer/platform/wtf/stack_util.cc
+@@ -18,6 +18,11 @@
+ extern "C" void* __libc_stack_end; // NOLINT
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
++#endif
++
+ namespace WTF {
+
+ size_t GetUnderestimatedStackSize() {
+@@ -62,6 +67,8 @@ size_t GetUnderestimatedStackSize() {
+ // low as 512k.
+ //
+ return 512 * 1024;
++#elif BUILDFLAG(IS_OPENBSD)
++ return 512 * 1024;
+ #elif BUILDFLAG(IS_APPLE)
+ // pthread_get_stacksize_np() returns too low a value for the main thread on
+ // OSX 10.9,
+@@ -148,6 +155,13 @@ void* GetStackStart() {
+ ::GetCurrentThreadStackLimits(&lowLimit, &highLimit);
+ return reinterpret_cast<void*>(highLimit);
+ #endif
++#elif BUILDFLAG(IS_OPENBSD)
++ stack_t ss;
++ void *base;
++ int error = pthread_stackseg_np(pthread_self(), &ss);
++ CHECK(!error);
++ base = (void*)((size_t) ss.ss_sp - ss.ss_size);
++ return reinterpret_cast<uint8_t*>(base) + ss.ss_size;
+ #else
+ #error Unsupported getStackStart on this platform.
+ #endif
diff --git a/devel/electron28/files/patch-third__party_boringssl_src_util_generate__build__files.py b/devel/electron28/files/patch-third__party_boringssl_src_util_generate__build__files.py
new file mode 100644
index 000000000000..3b2a29f0dad1
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_boringssl_src_util_generate__build__files.py
@@ -0,0 +1,34 @@
+--- third_party/boringssl/src/util/generate_build_files.py.orig 2023-11-29 21:40:55 UTC
++++ third_party/boringssl/src/util/generate_build_files.py
+@@ -772,10 +772,10 @@ def main(platforms):
+ ]
+
+ # Generate err_data.c
+- with open('err_data.c', 'w+') as err_data:
+- subprocess.check_call(['go', 'run', 'err_data_generate.go'],
+- cwd=os.path.join('src', 'crypto', 'err'),
+- stdout=err_data)
++# with open('err_data.c', 'w+') as err_data:
++# subprocess.check_call(['go', 'run', 'err_data_generate.go'],
++# cwd=os.path.join('src', 'crypto', 'err'),
++# stdout=err_data)
+ crypto_c_files.append('err_data.c')
+ crypto_c_files.sort()
+
+@@ -786,11 +786,11 @@ def main(platforms):
+ crypto_test_files = []
+ if EMBED_TEST_DATA:
+ # Generate crypto_test_data.cc
+- with open('crypto_test_data.cc', 'w+') as out:
+- subprocess.check_call(
+- ['go', 'run', 'util/embed_test_data.go'] + cmake['CRYPTO_TEST_DATA'],
+- cwd='src',
+- stdout=out)
++# with open('crypto_test_data.cc', 'w+') as out:
++# subprocess.check_call(
++# ['go', 'run', 'util/embed_test_data.go'] + cmake['CRYPTO_TEST_DATA'],
++# cwd='src',
++# stdout=out)
+ crypto_test_files.append('crypto_test_data.cc')
+
+ crypto_test_files += PrefixWithSrc(cmake['CRYPTO_TEST_SOURCES'])
diff --git a/devel/electron28/files/patch-third__party_brotli_common_platform.h b/devel/electron28/files/patch-third__party_brotli_common_platform.h
new file mode 100644
index 000000000000..60ccb4e08e5c
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_brotli_common_platform.h
@@ -0,0 +1,11 @@
+--- third_party/brotli/common/platform.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/brotli/common/platform.h
+@@ -28,7 +28,7 @@
+ #include <brotli/port.h>
+ #include <brotli/types.h>
+
+-#if defined(OS_LINUX) || defined(OS_CYGWIN) || defined(__EMSCRIPTEN__)
++#if defined(OS_LINUX) || defined(OS_CYGWIN) || defined(__EMSCRIPTEN__) || defined(OS_BSD)
+ #include <endian.h>
+ #elif defined(OS_FREEBSD)
+ #include <machine/endian.h>
diff --git a/devel/electron28/files/patch-third__party_cpuinfo_cpuinfo.gni b/devel/electron28/files/patch-third__party_cpuinfo_cpuinfo.gni
new file mode 100644
index 000000000000..afb6d49440a4
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_cpuinfo_cpuinfo.gni
@@ -0,0 +1,11 @@
+--- third_party/cpuinfo/cpuinfo.gni.orig 2023-10-19 19:59:07 UTC
++++ third_party/cpuinfo/cpuinfo.gni
+@@ -7,7 +7,7 @@ use_cpuinfo =
+ current_cpu != "ppc64" && current_cpu != "ppc64le" &&
+ current_cpu != "s390" && current_cpu != "s390x" &&
+ # cpuinfo is not supported on fuchsia.
+- !is_fuchsia &&
++ !is_fuchsia && !is_bsd &&
+ # There's a few arm architectures that are not supported by cpuinfo,
+ # especially amongst ChromeOS devices.
+ # See //third_party/cpuinfo/src/src/arm/linux/cp.h.
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni b/devel/electron28/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
new file mode 100644
index 000000000000..2edbba0f4f8b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/build/crashpad_buildconfig.gni.orig 2023-10-19 19:59:07 UTC
++++ third_party/crashpad/crashpad/build/crashpad_buildconfig.gni
+@@ -61,7 +61,7 @@ if (crashpad_is_in_chromium) {
+ crashpad_is_ios = is_ios
+ crashpad_is_apple = is_apple
+ crashpad_is_win = is_win
+- crashpad_is_linux = is_linux || is_chromeos
++ crashpad_is_linux = (is_linux || is_chromeos) && !is_bsd
+ crashpad_is_android = is_android
+ crashpad_is_fuchsia = is_fuchsia
+
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_client_BUILD.gn b/devel/electron28/files/patch-third__party_crashpad_crashpad_client_BUILD.gn
new file mode 100644
index 000000000000..e1eccd40b032
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_client_BUILD.gn
@@ -0,0 +1,16 @@
+--- third_party/crashpad/crashpad/client/BUILD.gn.orig 2023-10-19 19:59:07 UTC
++++ third_party/crashpad/crashpad/client/BUILD.gn
+@@ -137,6 +137,13 @@ static_library("common") {
+ if (crashpad_is_win) {
+ sources += [ "crash_report_database_win.cc" ]
+ }
++
++ if (crashpad_is_posix) {
++ sources += [
++ "crashpad_client_posix.cc",
++ ]
++ }
++
+ if (crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) {
+ sources += [
+ "crash_report_database_generic.cc",
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
new file mode 100644
index 000000000000..3844bf05eeda
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
@@ -0,0 +1,43 @@
+--- third_party/crashpad/crashpad/client/crashpad_client_posix.cc.orig 2022-02-07 13:39:41 UTC
++++ third_party/crashpad/crashpad/client/crashpad_client_posix.cc
+@@ -0,0 +1,40 @@
++// Copyright 2017 The Crashpad Authors. All rights reserved.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++
++#include "client/crashpad_client.h"
++
++#include "base/logging.h"
++#include "base/notreached.h"
++
++namespace crashpad {
++
++CrashpadClient::CrashpadClient() {}
++
++CrashpadClient::~CrashpadClient() {}
++
++bool CrashpadClient::StartHandler(
++ const base::FilePath& handler,
++ const base::FilePath& database,
++ const base::FilePath& metrics_dir,
++ const std::string& url,
++ const std::map<std::string, std::string>& annotations,
++ const std::vector<std::string>& arguments,
++ bool restartable,
++ bool asynchronous_start,
++ const std::vector<base::FilePath>& attachments) {
++ NOTREACHED(); // TODO(scottmg): https://crashpad.chromium.org/bug/196
++ return false;
++}
++
++} // namespace crashpad
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_minidump_minidump__misc__info__writer.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_minidump_minidump__misc__info__writer.cc
new file mode 100644
index 000000000000..f6a27c5e4420
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_minidump_minidump__misc__info__writer.cc
@@ -0,0 +1,13 @@
+--- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc.orig 2022-07-22 17:30:31 UTC
++++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
+@@ -159,6 +159,10 @@ std::string MinidumpMiscInfoDebugBuildString() {
+ static constexpr char kOS[] = "win";
+ #elif BUILDFLAG(IS_FUCHSIA)
+ static constexpr char kOS[] = "fuchsia";
++#elif defined(OS_OPENBSD)
++ static constexpr char kOS[] = "openbsd";
++#elif defined(OS_FREEBSD)
++ static constexpr char kOS[] = "freebsd";
+ #else
+ #error define kOS for this operating system
+ #endif
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h
new file mode 100644
index 000000000000..bfb69fcfc0d0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/misc/address_types.h.orig 2022-02-28 16:54:41 UTC
++++ third_party/crashpad/crashpad/util/misc/address_types.h
+@@ -25,7 +25,7 @@
+ #include <mach/mach_types.h>
+ #elif BUILDFLAG(IS_WIN)
+ #include "util/win/address_types.h"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include "util/linux/address_types.h"
+ #elif BUILDFLAG(IS_FUCHSIA)
+ #include <zircon/types.h>
+@@ -55,7 +55,7 @@ using VMSize = mach_vm_size_t;
+ using VMAddress = WinVMAddress;
+ using VMSize = WinVMSize;
+
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+
+ using VMAddress = LinuxVMAddress;
+ using VMSize = LinuxVMSize;
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
new file mode 100644
index 000000000000..78dfbf17b79f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
@@ -0,0 +1,22 @@
+--- third_party/crashpad/crashpad/util/misc/capture_context.h.orig 2023-10-19 19:59:07 UTC
++++ third_party/crashpad/crashpad/util/misc/capture_context.h
+@@ -21,7 +21,8 @@
+ #include <mach/mach.h>
+ #elif BUILDFLAG(IS_WIN)
+ #include <windows.h>
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
++ BUILDFLAG(IS_FREEBSD)
+ #include <ucontext.h>
+ #endif // BUILDFLAG(IS_APPLE)
+
+@@ -35,7 +36,8 @@ using NativeCPUContext = arm_unified_thread_state;
+ #endif
+ #elif BUILDFLAG(IS_WIN)
+ using NativeCPUContext = CONTEXT;
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
++ BUILDFLAG(IS_BSD)
+ using NativeCPUContext = ucontext_t;
+ #endif // BUILDFLAG(IS_APPLE)
+
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
new file mode 100644
index 000000000000..a444c9f0a8e6
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/metrics.cc.orig 2022-02-28 16:54:41 UTC
++++ third_party/crashpad/crashpad/util/misc/metrics.cc
+@@ -25,7 +25,7 @@
+ #define METRICS_OS_NAME "Win"
+ #elif BUILDFLAG(IS_ANDROID)
+ #define METRICS_OS_NAME "Android"
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #define METRICS_OS_NAME "Linux"
+ #elif BUILDFLAG(IS_FUCHSIA)
+ #define METRICS_OS_NAME "Fuchsia"
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
new file mode 100644
index 000000000000..114a1c66d674
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/uuid.cc.orig 2022-02-28 16:54:41 UTC
++++ third_party/crashpad/crashpad/util/misc/uuid.cc
+@@ -101,7 +101,7 @@ bool UUID::InitializeWithNew() {
+ InitializeFromBytes(uuid);
+ return true;
+ #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Linux, Android, and Fuchsia do not provide a UUID generator in a
+ // widely-available system library. On Linux and Android, uuid_generate()
+ // from libuuid is not available everywhere.
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
new file mode 100644
index 000000000000..fca107bf7098
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/posix/close_multiple.cc.orig 2023-11-29 21:40:36 UTC
++++ third_party/crashpad/crashpad/util/posix/close_multiple.cc
+@@ -73,7 +73,7 @@ bool CloseMultipleNowOrOnExecUsingFDDir(int min_fd, in
+ // This is an advantage over looping over all possible file descriptors, because
+ // no attempt needs to be made to close file descriptors that are not open.
+ bool CloseMultipleNowOrOnExecUsingFDDir(int min_fd, int preserve_fd) {
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ static constexpr char kFDDir[] = "/dev/fd";
+ #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+ static constexpr char kFDDir[] = "/proc/self/fd";
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc
new file mode 100644
index 000000000000..035241c5dc1b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/posix/drop_privileges.cc.orig 2022-02-28 16:54:41 UTC
++++ third_party/crashpad/crashpad/util/posix/drop_privileges.cc
+@@ -25,7 +25,7 @@ void DropPrivileges() {
+ gid_t gid = getgid();
+ uid_t uid = getuid();
+
+-#if BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ // Based on the POSIX.1-2008 2013 edition documentation for setreuid() and
+ // setregid(), setreuid() and setregid() alone should be sufficient to drop
+ // privileges. The standard specifies that the saved ID should be set to the
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
new file mode 100644
index 000000000000..efaa7aaa5485
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
@@ -0,0 +1,33 @@
+--- third_party/crashpad/crashpad/util/posix/signals.cc.orig 2022-08-31 12:19:35 UTC
++++ third_party/crashpad/crashpad/util/posix/signals.cc
+@@ -51,7 +51,7 @@ constexpr int kCrashSignals[] = {
+ #if defined(SIGEMT)
+ SIGEMT,
+ #endif // defined(SIGEMT)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SIGXCPU,
+ SIGXFSZ,
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+@@ -91,7 +91,7 @@ constexpr int kTerminateSignals[] = {
+ SIGXCPU,
+ SIGXFSZ,
+ #endif // BUILDFLAG(IS_APPLE)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ SIGIO,
+ #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ };
+@@ -251,8 +251,12 @@ bool Signals::WillSignalReraiseAutonomously(const sigi
+ // remains. See 10.12.3 xnu-3789.41.3/bsd/kern/kern_sig.c
+ // psignal_internal().
+ (code > 0 &&
++#if defined(SI_ASYNCIO)
+ code != SI_ASYNCIO &&
++#endif
++#if defined(SI_MESGQ)
+ code != SI_MESGQ &&
++#endif
+ code != SI_QUEUE &&
+ code != SI_TIMER &&
+ code != SI_USER &&
diff --git a/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc
new file mode 100644
index 000000000000..ade30531a9b6
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc.orig 2022-04-21 18:48:31 UTC
++++ third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc
+@@ -67,7 +67,7 @@ constexpr const char* kSignalNames[] = {
+ "INFO",
+ "USR1",
+ "USR2",
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #if defined(ARCH_CPU_MIPS_FAMILY)
+ "HUP",
+ "INT",
+@@ -138,7 +138,7 @@ constexpr const char* kSignalNames[] = {
+ #endif // defined(ARCH_CPU_MIPS_FAMILY)
+ #endif
+ };
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ // NSIG is 64 to account for real-time signals.
+ static_assert(std::size(kSignalNames) == 32, "kSignalNames length");
+ #else
diff --git a/devel/electron28/files/patch-third__party_crc32c_BUILD.gn b/devel/electron28/files/patch-third__party_crc32c_BUILD.gn
new file mode 100644
index 000000000000..fb4e1a944845
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_crc32c_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/crc32c/BUILD.gn.orig 2023-05-25 00:42:42 UTC
++++ third_party/crc32c/BUILD.gn
+@@ -46,7 +46,7 @@ config("crc32c_config") {
+ }
+
+ # Android added <sys/auxv.h> in API level 18.
+- if (is_linux || is_chromeos || is_android) {
++ if (is_linux || is_chromeos || is_android && !is_bsd) {
+ defines += [
+ "HAVE_STRONG_GETAUXVAL=1",
+ "HAVE_WEAK_GETAUXVAL=1",
diff --git a/devel/electron28/files/patch-third__party_dawn_include_dawn_native_VulkanBackend.h b/devel/electron28/files/patch-third__party_dawn_include_dawn_native_VulkanBackend.h
new file mode 100644
index 000000000000..3075e7c997b3
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_dawn_include_dawn_native_VulkanBackend.h
@@ -0,0 +1,11 @@
+--- third_party/dawn/include/dawn/native/VulkanBackend.h.orig 2023-11-29 21:41:27 UTC
++++ third_party/dawn/include/dawn/native/VulkanBackend.h
+@@ -83,7 +83,7 @@ struct ExternalImageExportInfoVk : ExternalImageExport
+ };
+
+ // Can't use DAWN_PLATFORM_IS(LINUX) since header included in both Dawn and Chrome
+-#ifdef __linux__
++#if defined(__linux__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+
+ // Common properties of external images represented by FDs. On successful import the file
+ // descriptor's ownership is transferred to the Dawn implementation and they shouldn't be
diff --git a/devel/electron28/files/patch-third__party_dawn_src_dawn_common_Platform.h b/devel/electron28/files/patch-third__party_dawn_src_dawn_common_Platform.h
new file mode 100644
index 000000000000..ec82787739c8
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_dawn_src_dawn_common_Platform.h
@@ -0,0 +1,14 @@
+--- third_party/dawn/src/dawn/common/Platform.h.orig 2023-11-29 21:41:27 UTC
++++ third_party/dawn/src/dawn/common/Platform.h
+@@ -59,6 +59,11 @@
+ #error "Unsupported Windows platform."
+ #endif
+
++#elif defined(__OpenBSD__) || defined(__FreeBSD__)
++#define DAWN_PLATFORM_IS_LINUX 1
++#define DAWN_PLATFORM_IS_BSD 1
++#define DAWN_PLATFORM_IS_POSIX 1
++
+ #elif defined(__linux__)
+ #define DAWN_PLATFORM_IS_LINUX 1
+ #define DAWN_PLATFORM_IS_POSIX 1
diff --git a/devel/electron28/files/patch-third__party_dawn_src_dawn_native_vulkan_BackendVk.cpp b/devel/electron28/files/patch-third__party_dawn_src_dawn_native_vulkan_BackendVk.cpp
new file mode 100644
index 000000000000..2eab999cdc19
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_dawn_src_dawn_native_vulkan_BackendVk.cpp
@@ -0,0 +1,11 @@
+--- third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp.orig 2023-11-29 21:41:27 UTC
++++ third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp
+@@ -55,7 +55,7 @@ constexpr char kSwiftshaderLibName[] = "libvk_swiftsha
+ #endif
+
+ #if DAWN_PLATFORM_IS(LINUX)
+-#if DAWN_PLATFORM_IS(ANDROID)
++#if DAWN_PLATFORM_IS(ANDROID) || DAWN_PLATFORM_IS(BSD)
+ constexpr char kVulkanLibName[] = "libvulkan.so";
+ #else
+ constexpr char kVulkanLibName[] = "libvulkan.so.1";
diff --git a/devel/electron28/files/patch-third__party_distributed__point__functions_BUILD.gn b/devel/electron28/files/patch-third__party_distributed__point__functions_BUILD.gn
new file mode 100644
index 000000000000..1ea77a5b30ff
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_distributed__point__functions_BUILD.gn
@@ -0,0 +1,12 @@
+--- third_party/distributed_point_functions/BUILD.gn.orig 2023-02-01 18:43:40 UTC
++++ third_party/distributed_point_functions/BUILD.gn
+@@ -61,6 +61,9 @@ source_set("distributed_point_functions") {
+ configs -= [ "//build/config/compiler:chromium_code" ]
+ configs += [ "//build/config/compiler:no_chromium_code" ]
+
++ # XXX clang13 crashes with optimizations
++ configs += [ "//build/config/compiler:no_optimize" ]
++
+ public_configs = [ ":distributed_point_functions_includes" ]
+ }
+
diff --git a/devel/electron28/files/patch-third__party_electron__node_deps_uv_BUILD.gn b/devel/electron28/files/patch-third__party_electron__node_deps_uv_BUILD.gn
new file mode 100644
index 000000000000..91627ef2bc13
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_electron__node_deps_uv_BUILD.gn
@@ -0,0 +1,46 @@
+--- third_party/electron_node/deps/uv/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ third_party/electron_node/deps/uv/BUILD.gn
+@@ -3,7 +3,7 @@ config("libuv_config") {
+
+ defines = []
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ defines += [ "_POSIX_C_SOURCE=200112" ]
+ }
+ if (!is_win) {
+@@ -156,7 +156,7 @@ static_library("uv") {
+ libs += [ "m" ]
+ ldflags += [ "-pthread" ]
+ }
+- if (is_mac || is_linux) {
++ if (is_mac || (is_linux && !is_bsd)) {
+ sources += [ "src/unix/proctitle.c" ]
+ }
+ if (is_mac) {
+@@ -171,7 +171,7 @@ static_library("uv") {
+ "_DARWIN_UNLIMITED_SELECT=1",
+ ]
+ }
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ defines += [ "_GNU_SOURCE" ]
+ sources += [
+ "src/unix/epoll.c",
+@@ -192,6 +192,16 @@ static_library("uv") {
+ sources += [
+ "src/unix/bsd-ifaddrs.c",
+ "src/unix/kqueue.c",
++ ]
++ }
++ if (is_bsd) {
++ sources += [
++ "src/unix/bsd-ifaddrs.c",
++ "src/unix/bsd-proctitle.c",
++ "src/unix/freebsd.c",
++ "src/unix/kqueue.c",
++ "src/unix/posix-hrtime.c",
++ "src/unix/random-getrandom.c",
+ ]
+ }
+ }
diff --git a/devel/electron28/files/patch-third__party_electron__node_deps_uv_src_unix_pipe.c b/devel/electron28/files/patch-third__party_electron__node_deps_uv_src_unix_pipe.c
new file mode 100644
index 000000000000..bf628fa19bf7
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_electron__node_deps_uv_src_unix_pipe.c
@@ -0,0 +1,18 @@
+--- third_party/electron_node/deps/uv/src/unix/pipe.c.orig 2023-02-01 20:54:58 UTC
++++ third_party/electron_node/deps/uv/src/unix/pipe.c
+@@ -152,9 +152,13 @@ int uv_pipe_open(uv_pipe_t* handle, uv_file fd) {
+ if (mode == -1)
+ return UV__ERR(errno); /* according to docs, must be EBADF */
+
++ /* If ioctl(FIONBIO) reports ENOTTY, try fcntl(F_GETFL) + fcntl(F_SETFL).
++ * Workaround for e.g. kqueue fds not supporting ioctls.
++ */
+ err = uv__nonblock(fd, 1);
+- if (err)
+- return err;
++ if (err == UV_ENOTTY)
++ if (uv__nonblock == uv__nonblock_ioctl)
++ err = uv__nonblock_fcntl(fd, 1);
+
+ #if defined(__APPLE__)
+ err = uv__stream_try_select((uv_stream_t*) handle, &fd);
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_BUILD.gn b/devel/electron28/files/patch-third__party_ffmpeg_BUILD.gn
new file mode 100644
index 000000000000..cac1b977b0b2
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_BUILD.gn
@@ -0,0 +1,10 @@
+--- third_party/ffmpeg/BUILD.gn.orig 2022-02-07 13:39:41 UTC
++++ third_party/ffmpeg/BUILD.gn
+@@ -349,7 +349,6 @@ target(link_target_type, "ffmpeg_internal") {
+ libs += [
+ "m",
+ "z",
+- "rt",
+ ]
+ }
+ if (is_component_ffmpeg) {
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_build__ffmpeg.py b/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_build__ffmpeg.py
new file mode 100644
index 000000000000..818b0389068b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_build__ffmpeg.py
@@ -0,0 +1,121 @@
+--- third_party/ffmpeg/chromium/scripts/build_ffmpeg.py.orig 2023-11-29 21:40:59 UTC
++++ third_party/ffmpeg/chromium/scripts/build_ffmpeg.py
+@@ -32,7 +32,7 @@ sys.path.append(os.path.join(CHROMIUM_ROOT_DIR, 'build
+ SUCCESS_TOKEN = 'THIS_BUILD_WORKED'
+
+ sys.path.append(os.path.join(CHROMIUM_ROOT_DIR, 'build'))
+-import gn_helpers
++#import gn_helpers
+
+ BRANDINGS = [
+ 'Chrome',
+@@ -45,6 +45,8 @@ ARCH_MAP = {
+ 'linux': [
+ 'ia32', 'x64', 'noasm-x64', 'arm', 'arm-neon', 'arm64'
+ ],
++ 'openbsd': ['x64', 'arm64', 'ia32'],
++ 'freebsd': ['x64', 'arm64', 'ia32'],
+ 'mac': ['x64', 'arm64'],
+ 'win': ['ia32', 'x64', 'arm64'],
+ }
+@@ -54,6 +56,8 @@ Valid combinations are android [%(android)s]
+ Valid combinations are android [%(android)s]
+ linux [%(linux)s]
+ mac [%(mac)s]
++ openbsd [%(openbsd)s]
++ freebsd [%(freebsd)s]
+ win [%(win)s]
+
+ If no target architecture is specified all will be built.
+@@ -126,6 +130,10 @@ def DetermineHostOsAndArch():
+ def DetermineHostOsAndArch():
+ if platform.system() == 'Linux':
+ host_os = 'linux'
++ if platform.system() == 'OpenBSD':
++ host_os = 'openbsd'
++ elif platform.system() == 'FreeBSD':
++ host_os = 'freebsd'
+ elif platform.system() == 'Darwin':
+ host_os = 'mac'
+ elif platform.system() == 'Windows' or 'CYGWIN_NT' in platform.system():
+@@ -135,7 +143,7 @@ def DetermineHostOsAndArch():
+
+ if re.match(r'i.86', platform.machine()):
+ host_arch = 'ia32'
+- elif platform.machine() == 'x86_64' or platform.machine() == 'AMD64':
++ elif platform.machine() == 'x86_64' or platform.machine() == 'AMD64' or platform.machine() == 'amd64':
+ host_arch = 'x64'
+ elif platform.machine() == 'aarch64':
+ host_arch = 'arm64'
+@@ -152,7 +160,7 @@ def GetDsoName(target_os, dso_name, dso_version):
+
+
+ def GetDsoName(target_os, dso_name, dso_version):
+- if target_os in ('linux', 'linux-noasm', 'android'):
++ if target_os in ('linux', 'linux-noasm', 'android', 'openbsd', 'freebsd'):
+ return 'lib%s.so.%s' % (dso_name, dso_version)
+ elif target_os == 'mac':
+ return 'lib%s.%s.dylib' % (dso_name, dso_version)
+@@ -495,7 +503,7 @@ def BuildFFmpeg(target_os, target_arch, host_os, host_
+ # removing <sys/sysctl.h> soon, so this is needed to silence a deprecation
+ # #warning which will be converted to an error via -Werror.
+ # There is also no prctl.h
+- if target_os in ['linux', 'linux-noasm']:
++ if target_os in ['linux', 'linux-noasm', 'openbsd', 'freebsd']:
+ pre_make_rewrites += [
+ (r'(#define HAVE_SYSCTL [01])',
+ r'#define HAVE_SYSCTL 0 /* \1 -- forced to 0 for Fuchsia */'),
+@@ -622,7 +630,7 @@ def main(argv):
+ configure_args = args[2:]
+
+
+- if target_os not in ('android', 'linux', 'linux-noasm', 'mac', 'win', 'all'):
++ if target_os not in ('android', 'linux', 'linux-noasm', 'mac', 'win', 'all', 'openbsd', 'freebsd'):
+ parser.print_help()
+ return 1
+
+@@ -742,7 +750,7 @@ def ConfigureAndBuild(target_arch, target_os, host_os,
+ '--enable-parser=vp3,vp8',
+ ])
+
+- if target_os in ('linux', 'linux-noasm', 'android'):
++ if target_os in ('linux', 'linux-noasm', 'android', 'openbsd', 'freebsd'):
+ if target_arch == 'x64':
+ if target_os == 'android':
+ configure_flags['Common'].extend([
+@@ -752,7 +760,7 @@ def ConfigureAndBuild(target_arch, target_os, host_os,
+ configure_flags['Common'].extend([
+ '--enable-lto',
+ '--arch=x86_64',
+- '--target-os=linux',
++ '--target-os=' + target_os,
+ ])
+
+ if host_arch != 'x64':
+@@ -843,7 +851,7 @@ def ConfigureAndBuild(target_arch, target_os, host_os,
+ '--extra-cflags=-mfpu=vfpv3-d16',
+ ])
+ elif target_arch == 'arm64':
+- if target_os != 'android':
++ if target_os != 'android' and target_os != 'openbsd' and target_os != 'freebsd':
+ if host_arch != 'arm64':
+ configure_flags['Common'].extend([
+ '--enable-cross-compile',
+@@ -908,7 +916,7 @@ def ConfigureAndBuild(target_arch, target_os, host_os,
+ '--disable-mips64r2',
+ '--enable-msa',
+ ])
+- if target_os == 'linux':
++ if target_os == 'Linux':
+ configure_flags['Common'].extend([
+ '--enable-cross-compile',
+ '--target-os=linux',
+@@ -1059,7 +1067,7 @@ def ConfigureAndBuild(target_arch, target_os, host_os,
+ 'Chrome', configure_flags['Common'] + configure_flags['ChromeAndroid'] +
+ configure_args)
+
+- if target_os in ['linux', 'linux-noasm']:
++ if target_os in ['linux', 'linux-noasm', 'openbsd', 'freebsd']:
+ # ChromeOS enables MPEG4 which requires error resilience :(
+ chrome_os_flags = (
+ configure_flags['Common'] + configure_flags['Chrome'] +
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_robo__lib_config.py b/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_robo__lib_config.py
new file mode 100644
index 000000000000..d7d022a074ae
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_chromium_scripts_robo__lib_config.py
@@ -0,0 +1,53 @@
+--- third_party/ffmpeg/chromium/scripts/robo_lib/config.py.orig 2023-10-19 19:59:38 UTC
++++ third_party/ffmpeg/chromium/scripts/robo_lib/config.py
+@@ -35,7 +35,7 @@ class RoboConfiguration:
+ self._patches_commit_title = "Chromium patches file"
+ # Title of the commit with README.chromium
+ self._readme_chromium_commit_title = "README.chromium file"
+- self.EnsureHostInfo()
++ #self.EnsureHostInfo()
+ self.EnsureChromeSrc()
+ self.EnsureScriptDirectory()
+
+@@ -47,18 +47,15 @@ class RoboConfiguration:
+ self._llvm_path = os.path.join(self.chrome_src(), "third_party",
+ "llvm-build", "Release+Asserts", "bin")
+
+- self.EnsurePathContainsLLVM()
+- self.EnsureNoMakeInfo()
++ #self.EnsurePathContainsLLVM()
++ #self.EnsureNoMakeInfo()
+ self.EnsureFFmpegHome()
+ self.EnsureASANConfig()
+- self.ComputeBranchName()
++ #self.ComputeBranchName()
+ if not quiet:
+ shell.log(f"Using chrome src: {self.chrome_src()}")
+ shell.log(f"Using script dir: {self._script_directory}")
+ shell.log(f"Using ffmpeg home:{self.ffmpeg_home()}")
+- shell.log(f"On branch: {self.branch_name()}")
+- if self.sushi_branch_name():
+- shell.log(f"On sushi branch: {self.sushi_branch_name()}")
+
+ # Filename that we'll ask generate_gn.py to write git commands to.
+ # TODO: Should this use script_directory, or stay with ffmpeg? As long as
+@@ -149,7 +146,7 @@ class RoboConfiguration:
+ """Ensure that the host architecture and platform are set."""
+ kernel, host, os, *rest = shell.output_or_error(["uname", "-a"]).split()
+ assert kernel in ("Linux", "linux")
+- assert "x86_64" in rest
++ assert ("x86_64", "amd64") in rest
+ self._host_operating_system = "linux"
+ self._host_architecture = "x64"
+
+@@ -165,8 +162,8 @@ class RoboConfiguration:
+ wd = os.getcwd()
+ # Walk up the tree until we find src/AUTHORS
+ while wd != "/":
+- if os.path.isfile(os.path.join(wd, "src", "AUTHORS")):
+- self._chrome_src = os.path.join(wd, "src")
++ if os.path.isfile(os.path.join(wd, "third_party", "DEPS")):
++ self._chrome_src = wd
+ return
+ wd = os.path.dirname(wd)
+ raise Exception("could not find src/AUTHORS in any parent of the wd")
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_configure b/devel/electron28/files/patch-third__party_ffmpeg_configure
new file mode 100644
index 000000000000..a7cc90bfe85d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_configure
@@ -0,0 +1,10 @@
+--- third_party/ffmpeg/configure.orig 2023-11-29 21:40:59 UTC
++++ third_party/ffmpeg/configure
+@@ -5604,6 +5604,7 @@ case $target_os in
+ disable symver
+ ;;
+ freebsd)
++ enable section_data_rel_ro
+ ;;
+ bsd/os)
+ add_extralibs -lpoll -lgnugetopt
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_libavcodec_x86_cabac.h b/devel/electron28/files/patch-third__party_ffmpeg_libavcodec_x86_cabac.h
new file mode 100644
index 000000000000..a0d30926495d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_libavcodec_x86_cabac.h
@@ -0,0 +1,12 @@
+--- third_party/ffmpeg/libavcodec/x86/cabac.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/ffmpeg/libavcodec/x86/cabac.h
+@@ -31,7 +31,8 @@
+
+ #if (defined(__i386) && defined(__clang__) && (__clang_major__<2 || (__clang_major__==2 && __clang_minor__<10)))\
+ || ( !defined(__clang__) && defined(__llvm__) && __GNUC__==4 && __GNUC_MINOR__==2 && __GNUC_PATCHLEVEL__<=1)\
+- || (defined(__INTEL_COMPILER) && defined(_MSC_VER))
++ || (defined(__INTEL_COMPILER) && defined(_MSC_VER)) \
++ || ((defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386))
+ # define BROKEN_COMPILER 1
+ #else
+ # define BROKEN_COMPILER 0
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_libavutil_cpu.c b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_cpu.c
new file mode 100644
index 000000000000..aeb14bb03c9d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_cpu.c
@@ -0,0 +1,14 @@
+--- third_party/ffmpeg/libavutil/cpu.c.orig 2022-07-22 17:30:31 UTC
++++ third_party/ffmpeg/libavutil/cpu.c
+@@ -38,10 +38,7 @@
+ #if HAVE_GETPROCESSAFFINITYMASK || HAVE_WINRT
+ #include <windows.h>
+ #endif
+-#if HAVE_SYSCTL
+-#if HAVE_SYS_PARAM_H
+-#include <sys/param.h>
+-#endif
++#if HAVE_SYSCTL && !defined(__OpenBSD__)
+ #include <sys/types.h>
+ #include <sys/sysctl.h>
+ #endif
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_libavutil_mem.c b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_mem.c
new file mode 100644
index 000000000000..6b83f6ed0c81
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_mem.c
@@ -0,0 +1,12 @@
+--- third_party/ffmpeg/libavutil/mem.c.orig 2022-05-19 14:06:27 UTC
++++ third_party/ffmpeg/libavutil/mem.c
+@@ -33,9 +33,6 @@
+ #include <stdlib.h>
+ #include <stdatomic.h>
+ #include <string.h>
+-#if HAVE_MALLOC_H
+-#include <malloc.h>
+-#endif
+
+ #include "attributes.h"
+ #include "avassert.h"
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_libavutil_random__seed.c b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_random__seed.c
new file mode 100644
index 000000000000..178c8c120424
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_random__seed.c
@@ -0,0 +1,14 @@
+--- third_party/ffmpeg/libavutil/random_seed.c.orig 2023-10-19 19:59:55 UTC
++++ third_party/ffmpeg/libavutil/random_seed.c
+@@ -35,6 +35,11 @@
+ #elif CONFIG_OPENSSL
+ #include <openssl/rand.h>
+ #endif
++#if HAVE_ARC4RANDOM_BUF
++#undef __BSD_VISIBLE
++#define __BSD_VISIBLE 1
++#include <stdlib.h>
++#endif
+ #include <fcntl.h>
+ #include <math.h>
+ #include <time.h>
diff --git a/devel/electron28/files/patch-third__party_ffmpeg_libavutil_x86_x86inc.asm b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_x86_x86inc.asm
new file mode 100644
index 000000000000..80480b888d2a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ffmpeg_libavutil_x86_x86inc.asm
@@ -0,0 +1,23 @@
+--- third_party/ffmpeg/libavutil/x86/x86inc.asm.orig 2023-08-10 01:51:13 UTC
++++ third_party/ffmpeg/libavutil/x86/x86inc.asm
+@@ -53,6 +53,12 @@
+ %endif
+ %endif
+
++%if ARCH_X86_64
++ %define _CET_ENDBR endbr64
++%else
++ %define _CET_ENDBR
++%endif
++
+ %define WIN64 0
+ %define UNIX64 0
+ %if ARCH_X86_64
+@@ -768,6 +774,7 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg,
+ %endif
+ align function_align
+ %2:
++ _CET_ENDBR
+ RESET_MM_PERMUTATION ; needed for x86-64, also makes disassembly somewhat nicer
+ %xdefine rstk rsp ; copy of the original stack pointer, used when greater alignment than the known stack alignment is required
+ %assign stack_offset 0 ; stack pointer offset relative to the return address
diff --git a/devel/electron28/files/patch-third__party_fontconfig_include_config.h b/devel/electron28/files/patch-third__party_fontconfig_include_config.h
new file mode 100644
index 000000000000..c16fc7f725f7
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_fontconfig_include_config.h
@@ -0,0 +1,89 @@
+--- third_party/fontconfig/include/config.h.orig 2023-03-30 00:34:12 UTC
++++ third_party/fontconfig/include/config.h
+@@ -18,13 +18,13 @@
+ #define ENABLE_NLS 1
+
+ /* Additional font directories */
+-#define FC_ADD_FONTS "yes"
++#define FC_ADD_FONTS "/usr/local/share/fonts"
+
+ /* Architecture prefix to use for cache file names */
+ /* #undef FC_ARCHITECTURE */
+
+ /* System font directory */
+-#define FC_DEFAULT_FONTS "<dir>/usr/share/fonts</dir>"
++#define FC_DEFAULT_FONTS "<dir>/usr/X11R6/lib/X11/fonts</dir>"
+
+ /* The type of len parameter of the gperf hash/lookup function */
+ #define FC_GPERF_SIZE_T size_t
+@@ -99,7 +99,7 @@
+ #define HAVE_GETPAGESIZE 1
+
+ /* Define to 1 if you have the `getprogname' function. */
+-/* #undef HAVE_GETPROGNAME */
++#define HAVE_GETPROGNAME 1
+
+ /* Define if the GNU gettext() function is already present or preinstalled. */
+ #define HAVE_GETTEXT 1
+@@ -141,7 +141,7 @@
+ /* #undef HAVE_NDIR_H */
+
+ /* Define to 1 if you have the 'posix_fadvise' function. */
+-#define HAVE_POSIX_FADVISE 1
++#define HAVE_POSIX_FADVISE 0
+
+ /* Have POSIX threads */
+ #define HAVE_PTHREAD 1
+@@ -156,11 +156,14 @@
+ #define HAVE_RANDOM 1
+
+ /* Define to 1 if you have the `random_r' function. */
+-#define HAVE_RANDOM_R 1
++/* #undef HAVE_RANDOM_R */
+
+ /* Define to 1 if you have the `rand_r' function. */
+ #define HAVE_RAND_R 1
+
++/* Define to 1 if you have the `arc4_random' function. */
++#define HAVE_ARC4RANDOM 1
++
+ /* Define to 1 if you have the `readlink' function. */
+ #define HAVE_READLINK 1
+
+@@ -204,7 +207,7 @@
+ #define HAVE_STRUCT_STATFS_F_FLAGS 1
+
+ /* Define to 1 if `f_fstypename' is a member of `struct statfs'. */
+-/* #undef HAVE_STRUCT_STATFS_F_FSTYPENAME */
++#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1
+
+ /* Define to 1 if `f_basetype' is a member of `struct statvfs'. */
+ /* #undef HAVE_STRUCT_STATVFS_F_BASETYPE */
+@@ -230,7 +233,7 @@
+ #define HAVE_SYS_PARAM_H 1
+
+ /* Define to 1 if you have the <sys/statfs.h> header file. */
+-#define HAVE_SYS_STATFS_H 1
++/* #undef HAVE_SYS_STATFS_H */
+
+ /* Define to 1 if you have the <sys/statvfs.h> header file. */
+ #define HAVE_SYS_STATVFS_H 1
+@@ -242,7 +245,7 @@
+ #define HAVE_SYS_TYPES_H 1
+
+ /* Define to 1 if you have the <sys/vfs.h> header file. */
+-#define HAVE_SYS_VFS_H 1
++/* #undef HAVE_SYS_VFS_H */
+
+ /* Define to 1 if you have the <unistd.h> header file. */
+ #define HAVE_UNISTD_H 1
+@@ -265,7 +268,8 @@
+ /* Define to 1 if you have the `_mktemp_s' function. */
+ /* #undef HAVE__MKTEMP_S */
+
+-/* Define to the sub-directory where libtool stores uninstalled libraries. */
++/* Define to the sub-directory in which libtool stores uninstalled libraries.
++ */
+ #define LT_OBJDIR ".libs/"
+
+ /* Name of package */
diff --git a/devel/electron28/files/patch-third__party_fontconfig_src_src_fccompat.c b/devel/electron28/files/patch-third__party_fontconfig_src_src_fccompat.c
new file mode 100644
index 000000000000..05f955118627
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_fontconfig_src_src_fccompat.c
@@ -0,0 +1,13 @@
+--- third_party/fontconfig/src/src/fccompat.c.orig 2023-03-30 00:40:33 UTC
++++ third_party/fontconfig/src/src/fccompat.c
+@@ -184,7 +184,9 @@ FcRandom(void)
+ {
+ int32_t result;
+
+-#if HAVE_RANDOM_R
++#if HAVE_ARC4RANDOM
++ result = arc4random() & 0x7fffffff;
++#elif HAVE_RANDOM_R
+ static struct random_data fcrandbuf;
+ static char statebuf[256];
+ static FcBool initialized = FcFalse;
diff --git a/devel/electron28/files/patch-third__party_ipcz_src_reference__drivers_random.cc b/devel/electron28/files/patch-third__party_ipcz_src_reference__drivers_random.cc
new file mode 100644
index 000000000000..3dfbf1791570
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ipcz_src_reference__drivers_random.cc
@@ -0,0 +1,20 @@
+--- third_party/ipcz/src/reference_drivers/random.cc.orig 2023-10-19 19:59:09 UTC
++++ third_party/ipcz/src/reference_drivers/random.cc
+@@ -14,7 +14,7 @@
+ #include <windows.h>
+ #elif BUILDFLAG(IS_FUCHSIA)
+ #include <zircon/syscalls.h>
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ #include <asm/unistd.h>
+ #include <sys/syscall.h>
+ #include <unistd.h>
+@@ -86,7 +86,7 @@ void RandomBytes(absl::Span<uint8_t> destination) {
+ process_prng_fn(destination.data(), destination.size());
+ #elif BUILDFLAG(IS_FUCHSIA)
+ zx_cprng_draw(destination.data(), destination.size());
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+ while (!destination.empty()) {
+ ssize_t result =
+ syscall(__NR_getrandom, destination.data(), destination.size(), 0);
diff --git a/devel/electron28/files/patch-third__party_ipcz_src_standalone_base_logging.cc b/devel/electron28/files/patch-third__party_ipcz_src_standalone_base_logging.cc
new file mode 100644
index 000000000000..e78ffde6fb39
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_ipcz_src_standalone_base_logging.cc
@@ -0,0 +1,12 @@
+--- third_party/ipcz/src/standalone/base/logging.cc.orig 2022-05-19 14:06:27 UTC
++++ third_party/ipcz/src/standalone/base/logging.cc
+@@ -50,6 +50,9 @@ LogMessage::LogMessage(const char* file, int line, Lev
+ #elif BUILDFLAG(IS_ANDROID)
+ stream_ << getpid() << ":" << gettid() << ":";
+ const char* trimmed_file = strrchr(file, '/') + 1;
++#elif BUILDFLAG(IS_BSD)
++ stream_ << getpid() << ":" << pthread_self() << ":";
++ const char* trimmed_file = strrchr(file, '/') + 1;
+ #elif BUILDFLAG(IS_WIN)
+ const char* trimmed_file = file;
+ stream_ << (::GetCurrentProcessId()) << ":" << ::GetCurrentThreadId() << ":";
diff --git a/devel/electron28/files/patch-third__party_leveldatabase_env__chromium.cc b/devel/electron28/files/patch-third__party_leveldatabase_env__chromium.cc
new file mode 100644
index 000000000000..91f413fa1a1f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_leveldatabase_env__chromium.cc
@@ -0,0 +1,12 @@
+--- third_party/leveldatabase/env_chromium.cc.orig 2023-10-19 19:59:09 UTC
++++ third_party/leveldatabase/env_chromium.cc
+@@ -320,7 +320,8 @@ ChromiumWritableFile::ChromiumWritableFile(const std::
+
+ Status ChromiumWritableFile::SyncParent() {
+ TRACE_EVENT0("leveldb", "SyncParent");
+-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
++// pledge violation (directory passed as fd)
++#if (defined(OS_POSIX) || defined(OS_FUCHSIA)) && !defined(OS_OPENBSD)
+ FilePath path = FilePath::FromUTF8Unsafe(parent_dir_);
+ FileErrorOr<base::File> result = filesystem_->OpenFile(
+ path, base::File::FLAG_OPEN | base::File::FLAG_READ);
diff --git a/devel/electron28/files/patch-third__party_libaom_source_libaom_aom__ports_aarch64__cpudetect.c b/devel/electron28/files/patch-third__party_libaom_source_libaom_aom__ports_aarch64__cpudetect.c
new file mode 100644
index 000000000000..2df977c19ed7
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libaom_source_libaom_aom__ports_aarch64__cpudetect.c
@@ -0,0 +1,39 @@
+--- third_party/libaom/source/libaom/aom_ports/aarch64_cpudetect.c.orig 2023-10-19 19:59:38 UTC
++++ third_party/libaom/source/libaom/aom_ports/aarch64_cpudetect.c
+@@ -85,13 +85,35 @@ static int arm_get_cpu_caps(void) {
+ return flags;
+ }
+
+-#elif defined(ANDROID_USE_CPU_FEATURES_LIB)
++#elif defined(ANDROID_USE_CPU_FEATURES_LIB) || defined(__FreeBSD__)
+
+ static int arm_get_cpu_caps(void) {
+ int flags = 0;
+ #if HAVE_NEON
+ flags |= HAS_NEON; // Neon is mandatory in Armv8.0-A.
+ #endif // HAVE_NEON
++ return flags;
++}
++
++#elif defined(__OpenBSD__)
++#include <sys/sysctl.h>
++#include <machine/cpu.h>
++#include <machine/armreg.h>
++
++static int arm_get_cpu_caps(void) {
++ int flags = 0;
++ int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 };
++ uint64_t cpu_id = 0;
++ size_t len = sizeof(cpu_id);
++
++ flags |= HAS_NEON; // Neon is mandatory in Armv8.0-A.
++
++ if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0)
++ return flags;
++
++ if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_CRC32_BASE)
++ flags |= HAS_ARM_CRC32;
++
+ return flags;
+ }
+
diff --git a/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h
new file mode 100644
index 000000000000..d9a9a382fcc4
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h
@@ -0,0 +1,11 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/memory/singleton.h.orig 2022-09-24 10:57:32 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/memory/singleton.h
+@@ -22,7 +22,7 @@
+ #elif (__cplusplus >= 201103L) && defined(I18N_PHONENUMBERS_USE_STDMUTEX)
+ // C++11 Lock implementation based on std::mutex.
+ #include "phonenumbers/base/memory/singleton_stdmutex.h"
+-#elif defined(__linux__) || defined(__APPLE__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD)
++#elif defined(__linux__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD)
+ #include "phonenumbers/base/memory/singleton_posix.h"
+ #elif defined(WIN32)
+ #include "phonenumbers/base/memory/singleton_win32.h"
diff --git a/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h
new file mode 100644
index 000000000000..d3ed3a10d84d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h
@@ -0,0 +1,11 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/synchronization/lock.h.orig 2022-09-24 10:57:32 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/synchronization/lock.h
+@@ -22,7 +22,7 @@
+ #elif (__cplusplus >= 201103L) && defined(I18N_PHONENUMBERS_USE_STDMUTEX)
+ // C++11 Lock implementation based on std::mutex.
+ #include "phonenumbers/base/synchronization/lock_stdmutex.h"
+-#elif defined(__linux__) || defined(__APPLE__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD)
++#elif defined(__linux__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD)
+ #include "phonenumbers/base/synchronization/lock_posix.h"
+ #elif defined(WIN32)
+ #include "phonenumbers/base/synchronization/lock_win32.h"
diff --git a/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
new file mode 100644
index 000000000000..727f486668a0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
@@ -0,0 +1,20 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h.orig 2022-09-24 10:57:32 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h
+@@ -22,7 +22,7 @@
+ // Note that I18N_PHONENUMBERS_NO_THREAD_SAFETY must be defined only to let the
+ // user of the library know that it can't be used in a thread-safe manner when
+ // it is not depending on Boost.
+-#if !defined(__linux__) && !defined(__APPLE__) && !defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD) && \
++#if !defined(__linux__) && !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD) && \
+ !defined(I18N_PHONENUMBERS_NO_THREAD_SAFETY) && \
+ !((__cplusplus >= 201103L) && defined(I18N_PHONENUMBERS_USE_STDMUTEX)) && \
+ !defined(WIN32)
+@@ -33,7 +33,7 @@
+ #endif
+
+ #if !defined(NDEBUG) && !defined(I18N_PHONENUMBERS_USE_BOOST) && \
+- (defined(__linux__) || defined(__APPLE__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD))
++ (defined(__linux__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(I18N_PHONENUMBERS_HAVE_POSIX_THREAD))
+
+ #include <pthread.h>
+
diff --git a/devel/electron28/files/patch-third__party_libsync_src_include_sync_sync.h b/devel/electron28/files/patch-third__party_libsync_src_include_sync_sync.h
new file mode 100644
index 000000000000..a2564e610919
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libsync_src_include_sync_sync.h
@@ -0,0 +1,12 @@
+--- third_party/libsync/src/include/sync/sync.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/libsync/src/include/sync/sync.h
+@@ -22,7 +22,9 @@
+ #include <sys/cdefs.h>
+ #include <stdint.h>
+
++#if !defined(__OpenBSD__) && !defined(__FreeBSD__)
+ #include <linux/types.h>
++#endif
+
+ __BEGIN_DECLS
+
diff --git a/devel/electron28/files/patch-third__party_libsync_src_sync.c b/devel/electron28/files/patch-third__party_libsync_src_sync.c
new file mode 100644
index 000000000000..76580babea99
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libsync_src_sync.c
@@ -0,0 +1,25 @@
+--- third_party/libsync/src/sync.c.orig 2023-10-19 19:59:52 UTC
++++ third_party/libsync/src/sync.c
+@@ -17,8 +17,8 @@
+ */
+
+ #include <fcntl.h>
+-#include <malloc.h>
+ #include <stdint.h>
++#include <stdlib.h>
+ #include <string.h>
+ #include <errno.h>
+ #include <poll.h>
+@@ -29,6 +29,12 @@
+
+ #include <sync/sync.h>
+
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++typedef __uint8_t __u8;
++typedef __uint32_t __u32;
++typedef __int32_t __s32;
++#define ETIME ETIMEDOUT
++#endif
+
+ struct sw_sync_create_fence_data {
+ __u32 value;
diff --git a/devel/electron28/files/patch-third__party_libusb_BUILD.gn b/devel/electron28/files/patch-third__party_libusb_BUILD.gn
new file mode 100644
index 000000000000..685a51ffb189
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libusb_BUILD.gn
@@ -0,0 +1,52 @@
+--- third_party/libusb/BUILD.gn.orig 2023-10-19 19:59:12 UTC
++++ third_party/libusb/BUILD.gn
+@@ -3,7 +3,7 @@
+ # found in the LICENSE file.
+
+ # libusb is only used by //services/device/usb on macOS.
+-assert(is_mac)
++assert(is_mac || is_bsd)
+
+ import("//build/config/chromeos/ui_mode.gni")
+ import("//build/config/features.gni")
+@@ -103,7 +103,7 @@ static_library("libusb") {
+ ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "src/libusb/os/linux_usbfs.c",
+ "src/libusb/os/linux_usbfs.h",
+@@ -114,11 +114,21 @@ static_library("libusb") {
+ ]
+ }
+
++ if (is_openbsd) {
++ sources += [
++ "src/libusb/os/openbsd_usb.c",
++ ]
++ defines += [
++ "OS_OPENBSD=1",
++ "_GNU_SOURCE=1",
++ ]
++ }
++
+ if (is_chromeos_ash) {
+ defines += [ "USBI_TIMERFD_AVAILABLE" ]
+ }
+
+- if (use_udev) {
++ if (use_udev && !is_bsd) {
+ sources += [ "src/libusb/os/linux_udev.cc" ]
+ defines += [
+ "HAVE_LIBUDEV=1",
+@@ -127,7 +137,7 @@ static_library("libusb") {
+ deps += [ "//build/linux/libudev" ]
+ }
+
+- if ((is_linux || is_chromeos) && !use_udev) {
++ if ((is_linux || is_chromeos) && !use_udev && !is_bsd) {
+ sources += [ "src/libusb/os/linux_netlink.c" ]
+ defines += [ "HAVE_LINUX_NETLINK_H" ]
+ }
diff --git a/devel/electron28/files/patch-third__party_libusb_src_libusb_core.c b/devel/electron28/files/patch-third__party_libusb_src_libusb_core.c
new file mode 100644
index 000000000000..f1cb8df07aa7
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libusb_src_libusb_core.c
@@ -0,0 +1,11 @@
+--- third_party/libusb/src/libusb/core.c.orig 2022-02-07 13:39:41 UTC
++++ third_party/libusb/src/libusb/core.c
+@@ -448,7 +448,7 @@ libusb_free_device_list(list, 1);
+ * which grows when required. it can be freed once discovery has completed,
+ * eliminating the need for a list node in the libusb_device structure
+ * itself. */
+-#define DISCOVERED_DEVICES_SIZE_STEP 8
++#define DISCOVERED_DEVICES_SIZE_STEP 16
+
+ static struct discovered_devs *discovered_devs_alloc(void)
+ {
diff --git a/devel/electron28/files/patch-third__party_libusb_src_libusb_os_threads__posix.c b/devel/electron28/files/patch-third__party_libusb_src_libusb_os_threads__posix.c
new file mode 100644
index 000000000000..494904b7f888
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libusb_src_libusb_os_threads__posix.c
@@ -0,0 +1,24 @@
+--- third_party/libusb/src/libusb/os/threads_posix.c.orig 2023-03-30 00:34:13 UTC
++++ third_party/libusb/src/libusb/os/threads_posix.c
+@@ -19,9 +19,11 @@
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+-#if defined(__linux__) || defined(__OpenBSD__)
++#if defined(__linux__)
+ # include <unistd.h>
+ # include <sys/syscall.h>
++#elif defined(__OpenBSD__)
++# include <unistd.h>
+ #elif defined(__APPLE__)
+ # include <mach/mach.h>
+ #elif defined(__CYGWIN__)
+@@ -65,7 +67,7 @@ int usbi_get_tid(void)
+ #elif defined(__OpenBSD__)
+ /* The following only works with OpenBSD > 5.1 as it requires
+ real thread support. For 5.1 and earlier, -1 is returned. */
+- ret = syscall(SYS_getthrid);
++ ret = getthrid();
+ #elif defined(__APPLE__)
+ ret = mach_thread_self();
+ mach_port_deallocate(mach_task_self(), ret);
diff --git a/devel/electron28/files/patch-third__party_libvpx_source_libvpx_vpx__ports_aarch64__cpudetect.c b/devel/electron28/files/patch-third__party_libvpx_source_libvpx_vpx__ports_aarch64__cpudetect.c
new file mode 100644
index 000000000000..c328af636928
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_libvpx_source_libvpx_vpx__ports_aarch64__cpudetect.c
@@ -0,0 +1,27 @@
+--- third_party/libvpx/source/libvpx/vpx_ports/aarch64_cpudetect.c.orig 2024-01-03 23:43:32 UTC
++++ third_party/libvpx/source/libvpx/vpx_ports/aarch64_cpudetect.c
+@@ -91,9 +91,23 @@ static int arm_get_cpu_caps(void) {
+ return flags;
+ }
+
+-#elif defined(__linux__) // end defined(VPX_USE_ANDROID_CPU_FEATURES)
++#elif defined(__linux__) || defined(__FreeBSD__) // end defined(VPX_USE_ANDROID_CPU_FEATURES)
+
+ #include <sys/auxv.h>
++
++#if defined(__FreeBSD__)
++static unsigned long getauxval(unsigned long type)
++{
++ /* Only AT_HWCAP* return unsigned long */
++ if (type != AT_HWCAP && type != AT_HWCAP2) {
++ return 0;
++ }
++
++ unsigned long ret = 0;
++ elf_aux_info(type, &ret, sizeof(ret));
++ return ret;
++}
++#endif
+
+ // Define hwcap values ourselves: building with an old auxv header where these
+ // hwcap values are not defined should not prevent features from being enabled.
diff --git a/devel/electron28/files/patch-third__party_lzma__sdk_C_CpuArch.c b/devel/electron28/files/patch-third__party_lzma__sdk_C_CpuArch.c
new file mode 100644
index 000000000000..e5faa231f03f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_lzma__sdk_C_CpuArch.c
@@ -0,0 +1,44 @@
+--- third_party/lzma_sdk/C/CpuArch.c.orig 2022-09-04 11:56:14 UTC
++++ third_party/lzma_sdk/C/CpuArch.c
+@@ -412,12 +412,40 @@ BoolInt CPU_IsSupported_SHA1(void) { return APPLE_CRYP
+ BoolInt CPU_IsSupported_SHA2(void) { return APPLE_CRYPTO_SUPPORT_VAL; }
+ BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; }
+
++#elif defined(__OpenBSD__)
+
++#include <sys/param.h>
++#include <sys/sysctl.h>
++#include <machine/cpu.h>
++#include <machine/armreg.h>
++
++BoolInt CPU_IsSupported_NEON() { return 1; }
++
++#define MY_HWCAP_CHECK_FUNC_2(name1, name2) \
++ BoolInt CPU_IsSupported_ ## name1() { \
++ int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 }; \
++ size_t len = sizeof(uint64_t); \
++ uint64_t cpu_id = 0; \
++ if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0) \
++ return 0; \
++ if (ID_AA64ISAR0_ ## name2(cpu_id) >= ID_AA64ISAR0_## name2 ##_BASE) \
++ return 1; \
++ return 0; \
++ }
++
++#define MY_HWCAP_CHECK_FUNC(name) \
++ MY_HWCAP_CHECK_FUNC_2(name, name)
++
++MY_HWCAP_CHECK_FUNC (CRC32)
++MY_HWCAP_CHECK_FUNC (SHA1)
++MY_HWCAP_CHECK_FUNC (SHA2)
++MY_HWCAP_CHECK_FUNC (AES)
++
+ #else // __APPLE__
+
+ #include <sys/auxv.h>
+
+-#if !defined(ARMV8_OS_FUCHSIA)
++#if !defined(ARMV8_OS_FUCHSIA) && !defined(__FreeBSD__)
+ #define USE_HWCAP
+ #endif // !defined(ARMV8_OS_FUCHSIA)
+
diff --git a/devel/electron28/files/patch-third__party_maldoca_BUILD.gn b/devel/electron28/files/patch-third__party_maldoca_BUILD.gn
new file mode 100644
index 000000000000..a1f513b5d96b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_maldoca_BUILD.gn
@@ -0,0 +1,13 @@
+--- third_party/maldoca/BUILD.gn.orig 2023-03-30 00:34:13 UTC
++++ third_party/maldoca/BUILD.gn
+@@ -264,6 +264,10 @@ source_set("maldoca-public-headers") {
+ ":maldoca_chromium_config",
+ ":maldoca_flags",
+ ]
++
++ if (is_bsd) {
++ libs = [ "iconv" ]
++ }
+ }
+
+ static_library("maldoca") {
diff --git a/devel/electron28/files/patch-third__party_maldoca_src_maldoca_base_get__runfiles__dir.cc b/devel/electron28/files/patch-third__party_maldoca_src_maldoca_base_get__runfiles__dir.cc
new file mode 100644
index 000000000000..511cb0134922
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_maldoca_src_maldoca_base_get__runfiles__dir.cc
@@ -0,0 +1,32 @@
+--- third_party/maldoca/src/maldoca/base/get_runfiles_dir.cc.orig 2023-11-29 21:40:38 UTC
++++ third_party/maldoca/src/maldoca/base/get_runfiles_dir.cc
+@@ -25,11 +25,6 @@
+ #error "__APPLE__ not supported."
+ #endif
+
+-#if defined(__FreeBSD__)
+-// TODO(#110) FreeBSD-specific headers.
+-#error "__FreeBSD__ not supported."
+-#endif
+-
+ #if defined(_WIN32)
+ #include <windows.h>
+ #define PATH_MAX MAX_PATH
+@@ -51,8 +46,6 @@ std::string GetExecutablePath() {
+ char exe_path[PATH_MAX] = {0};
+ #ifdef __APPLE__
+ #error "__APPLE__ not supported.";
+-#elif defined(__FreeBSD__)
+-#error "__FreeBSD__ not supported.";
+ #elif defined(_WIN32)
+ HMODULE hModule = GetModuleHandleW(NULL);
+ WCHAR wc_file_path[MAX_PATH] = {0};
+@@ -98,8 +91,6 @@ absl::Status IsDirectory(const std::string& name) {
+ absl::Status IsDirectory(const std::string& name) {
+ #ifdef __APPLE__
+ #error "__APPLE__ not supported.";
+-#elif defined(__FreeBSD__)
+-#error "__FreeBSD__ not supported.";
+ #else
+ struct stat sbuf;
+ if (stat(name.c_str(), &sbuf) != 0) {
diff --git a/devel/electron28/files/patch-third__party_maldoca_src_maldoca_service_common_process__doc__wrapper.cc b/devel/electron28/files/patch-third__party_maldoca_src_maldoca_service_common_process__doc__wrapper.cc
new file mode 100644
index 000000000000..72a8da14bd31
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_maldoca_src_maldoca_service_common_process__doc__wrapper.cc
@@ -0,0 +1,29 @@
+--- third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc.orig 2023-10-19 19:59:12 UTC
++++ third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc
+@@ -7,7 +7,7 @@
+ #include "build/build_config.h"
+
+ #include "base/files/file_util.h"
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/strings/string_util.h"
+ #else
+ #include "base/strings/string_util_win.h"
+@@ -21,7 +21,7 @@ namespace third_party_maldoca {
+
+
+ bool ExtensionEqualInCaseSensitive(base::FilePath file_path, std::string extension){
+- #if defined(OS_LINUX)
++ #if defined(OS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string file_extension = file_path.FinalExtension();
+ return base::CompareCaseInsensitiveASCII(file_extension, extension) == 0;
+ #else
+@@ -74,7 +74,7 @@ void AnalyzeOfficeDocument(base::File office_file,
+ maldoca::DocProcessor doc_processor(processor_config);
+
+ maldoca::ProcessDocumentRequest process_doc_request;
+- #if defined(OS_LINUX)
++ #if defined(OS_LINUX) || BUILDFLAG(IS_BSD)
+ const std::string file_name = file_path.BaseName().value().c_str();
+ process_doc_request.set_file_name(file_name);
+ #endif
diff --git a/devel/electron28/files/patch-third__party_material__color__utilities_src_cpp_palettes_tones.cc b/devel/electron28/files/patch-third__party_material__color__utilities_src_cpp_palettes_tones.cc
new file mode 100644
index 000000000000..41d2724dd375
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_material__color__utilities_src_cpp_palettes_tones.cc
@@ -0,0 +1,11 @@
+--- third_party/material_color_utilities/src/cpp/palettes/tones.cc.orig 2023-10-19 19:59:37 UTC
++++ third_party/material_color_utilities/src/cpp/palettes/tones.cc
+@@ -14,6 +14,8 @@
+ * limitations under the License.
+ */
+
++#include <cmath>
++
+ #include "cpp/palettes/tones.h"
+
+ #include "cpp/cam/cam.h"
diff --git a/devel/electron28/files/patch-third__party_nasm_BUILD.gn b/devel/electron28/files/patch-third__party_nasm_BUILD.gn
new file mode 100644
index 000000000000..7f0c88305491
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_nasm_BUILD.gn
@@ -0,0 +1,16 @@
+--- third_party/nasm/BUILD.gn.orig 2023-02-01 18:45:20 UTC
++++ third_party/nasm/BUILD.gn
+@@ -63,6 +63,13 @@ config("nasm_config") {
+
+ defines = [ "HAVE_CONFIG_H" ]
+
++ _string_h_lines =
++ read_file("/usr/include/string.h", "list lines")
++ _mempcpy = filter_include(_string_h_lines, [ "*\*mempcpy*" ])
++ if (_mempcpy != []) {
++ defines += [ "HAVE_MEMPCPY=1" ]
++ }
++
+ if (is_clang) {
+ cflags = [
+ # The inline functions in NASM's headers flag this.
diff --git a/devel/electron28/files/patch-third__party_nasm_config_config-linux.h b/devel/electron28/files/patch-third__party_nasm_config_config-linux.h
new file mode 100644
index 000000000000..09dd91632b61
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_nasm_config_config-linux.h
@@ -0,0 +1,102 @@
+--- third_party/nasm/config/config-linux.h.orig 2023-02-01 18:45:20 UTC
++++ third_party/nasm/config/config-linux.h
+@@ -160,7 +160,7 @@
+
+ /* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+ don't. */
+-#define HAVE_DECL_STRLCPY 0
++#define HAVE_DECL_STRLCPY 1
+
+ /* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
+ don't. */
+@@ -183,7 +183,7 @@
+ #define HAVE_DECL_STRSEP 1
+
+ /* Define to 1 if you have the <endian.h> header file. */
+-#define HAVE_ENDIAN_H 1
++/* #undef HAVE_ENDIAN_H */
+
+ /* Define to 1 if you have the `faccessat' function. */
+ #define HAVE_FACCESSAT 1
+@@ -327,16 +327,16 @@
+ #define HAVE_ISASCII 1
+
+ /* Define to 1 if you have the `iscntrl' function. */
+-/* #undef HAVE_ISCNTRL */
++#define HAVE_ISCNTRL 1
+
+ /* Define to 1 if you have the <machine/endian.h> header file. */
+-/* #undef HAVE_MACHINE_ENDIAN_H */
++#define HAVE_MACHINE_ENDIAN_H 1
+
+ /* Define to 1 if you have the <memory.h> header file. */
+ #define HAVE_MEMORY_H 1
+
+ /* Define to 1 if you have the `mempcpy' function. */
+-#define HAVE_MEMPCPY 1
++/* #undef HAVE_MEMPCPY */
+
+ /* Define to 1 if you have a working `mmap' system call. */
+ #define HAVE_MMAP 1
+@@ -357,7 +357,7 @@
+ #define HAVE_STDARG_H 1
+
+ /* Define to 1 if stdbool.h conforms to C99. */
+-/* #undef HAVE_STDBOOL_H */
++#define HAVE_STDBOOL_H 1
+
+ /* Define to 1 if your compiler supports C99 extern inline */
+ #define HAVE_STDC_INLINE 1
+@@ -384,7 +384,7 @@
+ #define HAVE_STRING_H 1
+
+ /* Define to 1 if you have the `strlcpy' function. */
+-/* #undef HAVE_STRLCPY */
++#define HAVE_STRLCPY 1
+
+ /* Define to 1 if you have the `strncasecmp' function. */
+ #define HAVE_STRNCASECMP 1
+@@ -411,7 +411,7 @@
+ #define HAVE_SYSCONF 1
+
+ /* Define to 1 if you have the <sys/endian.h> header file. */
+-/* #undef HAVE_SYS_ENDIAN_H */
++#define HAVE_SYS_ENDIAN_H 1
+
+ /* Define to 1 if you have the <sys/mman.h> header file. */
+ #define HAVE_SYS_MMAN_H 1
+@@ -486,13 +486,13 @@
+ /* #undef HAVE__STATI64 */
+
+ /* Define to 1 if you have the `__bswap_16' intrinsic function. */
+-#define HAVE___BSWAP_16 1
++/* #undef HAVE___BSWAP_16 */
+
+ /* Define to 1 if you have the `__bswap_32' intrinsic function. */
+-#define HAVE___BSWAP_32 1
++/* #undef HAVE___BSWAP_32 */
+
+ /* Define to 1 if you have the `__bswap_64' intrinsic function. */
+-#define HAVE___BSWAP_64 1
++/* #undef HAVE___BSWAP_64 */
+
+ /* Define to 1 if you have the `__builtin_bswap16' intrinsic function. */
+ #define HAVE___BUILTIN_BSWAP16 1
+@@ -620,7 +620,7 @@
+ /* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+-#define restrict __restrict
++#define restrict __restrict__
+ /* Work around a bug in Sun C++: it does not support _Restrict or
+ __restrict__, even though the corresponding Sun C compiler ends up with
+ "#define restrict _Restrict" or "#define restrict __restrict__" in the
+@@ -637,7 +637,7 @@
+ /* Define if your snprintf function is not named snprintf. */
+ /* #undef snprintf */
+
+-/* Define if your typeof operator is not named typeof. */
++/* Define if your typeof operator is not named `typeof'. */
+ #define typeof __typeof
+
+ /* Define to the type of an unsigned integer type wide enough to hold a
diff --git a/devel/electron28/files/patch-third__party_node_node.gni b/devel/electron28/files/patch-third__party_node_node.gni
new file mode 100644
index 000000000000..bf215e0e0920
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_node_node.gni
@@ -0,0 +1,11 @@
+--- third_party/node/node.gni.orig 2023-11-29 21:40:38 UTC
++++ third_party/node/node.gni
+@@ -19,7 +19,7 @@ template("node") {
+
+ # When use_remoteexec=true or use_siso=true, node actions run on remote
+ # Linux worker. So it should include linux node binary in inputs.
+- if (is_linux || is_chromeos || use_remoteexec || use_siso) {
++ if ((is_linux || is_chromeos || use_remoteexec || use_siso) && !is_bsd) {
+ inputs += [
+ "//third_party/node/linux/node-linux-x64.tar.gz.sha1",
+ "//third_party/node/linux/node-linux-x64/bin/node",
diff --git a/devel/electron28/files/patch-third__party_node_node.py b/devel/electron28/files/patch-third__party_node_node.py
new file mode 100644
index 000000000000..f13b8b6b458d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_node_node.py
@@ -0,0 +1,11 @@
+--- third_party/node/node.py.orig 2022-02-07 13:39:41 UTC
++++ third_party/node/node.py
+@@ -16,6 +16,8 @@ def GetBinaryPath():
+ return os_path.join(os_path.dirname(__file__), *{
+ 'Darwin': ('mac', darwin_name, 'bin', 'node'),
+ 'Linux': ('linux', 'node-linux-x64', 'bin', 'node'),
++ 'OpenBSD': ('openbsd', 'node-openbsd', 'bin', 'node'),
++ 'FreeBSD': ('freebsd', 'node-freebsd', 'bin', 'node'),
+ 'Windows': ('win', 'node.exe'),
+ }[platform.system()])
+
diff --git a/devel/electron28/files/patch-third__party_pdfium_core_fxge_cfx__fontmapper.cpp b/devel/electron28/files/patch-third__party_pdfium_core_fxge_cfx__fontmapper.cpp
new file mode 100644
index 000000000000..2201fad4583f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_core_fxge_cfx__fontmapper.cpp
@@ -0,0 +1,11 @@
+--- third_party/pdfium/core/fxge/cfx_fontmapper.cpp.orig 2023-10-19 20:00:23 UTC
++++ third_party/pdfium/core/fxge/cfx_fontmapper.cpp
+@@ -157,7 +157,7 @@ constexpr AltFontFamily kAltFontFamilies[] = {
+ {"ForteMT", "Forte"},
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || defined(OS_ASMJS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || defined(OS_ASMJS) || BUILDFLAG(IS_BSD)
+ const char kNarrowFamily[] = "LiberationSansNarrow";
+ #elif BUILDFLAG(IS_ANDROID)
+ const char kNarrowFamily[] = "RobotoCondensed";
diff --git a/devel/electron28/files/patch-third__party_pdfium_core_fxge_linux_fx__linux__impl.cpp b/devel/electron28/files/patch-third__party_pdfium_core_fxge_linux_fx__linux__impl.cpp
new file mode 100644
index 000000000000..90d110381036
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_core_fxge_linux_fx__linux__impl.cpp
@@ -0,0 +1,23 @@
+--- third_party/pdfium/core/fxge/linux/fx_linux_impl.cpp.orig 2022-06-17 14:20:10 UTC
++++ third_party/pdfium/core/fxge/linux/fx_linux_impl.cpp
+@@ -18,7 +18,7 @@
+ #include "third_party/base/check.h"
+
+ #if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !defined(OS_FUCHSIA) && \
+- !defined(OS_ASMJS)
++ !defined(OS_ASMJS) && !BUILDFLAG(IS_BSD)
+ #error "Included on the wrong platform"
+ #endif
+
+@@ -166,9 +166,8 @@ class CLinuxPlatform : public CFX_GEModule::PlatformIf
+ std::unique_ptr<SystemFontInfoIface> CreateDefaultSystemFontInfo() override {
+ auto pInfo = std::make_unique<CFX_LinuxFontInfo>();
+ if (!pInfo->ParseFontCfg(CFX_GEModule::Get()->GetUserFontPaths())) {
+- pInfo->AddPath("/usr/share/fonts");
+- pInfo->AddPath("/usr/share/X11/fonts/Type1");
+- pInfo->AddPath("/usr/share/X11/fonts/TTF");
++ pInfo->AddPath("/usr/X11R6/lib/X11/fonts/Type1");
++ pInfo->AddPath("/usr/X11R6/lib/X11/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return pInfo;
diff --git a/devel/electron28/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp b/devel/electron28/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp
new file mode 100644
index 000000000000..b59251adcb62
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp
@@ -0,0 +1,22 @@
+--- third_party/pdfium/fxjs/fx_date_helpers.cpp.orig 2022-06-17 14:20:10 UTC
++++ third_party/pdfium/fxjs/fx_date_helpers.cpp
+@@ -37,6 +37,11 @@ double GetLocalTZA() {
+ return 0;
+ time_t t = 0;
+ FXSYS_time(&t);
++#ifdef __FreeBSD__
++ struct tm lt;
++ localtime_r(&t, &lt);
++ return (double)(-(lt.tm_gmtoff * 1000));
++#else
+ FXSYS_localtime(&t);
+ #if BUILDFLAG(IS_WIN)
+ // In gcc 'timezone' is a global variable declared in time.h. In VC++, that
+@@ -45,6 +50,7 @@ double GetLocalTZA() {
+ _get_timezone(&timezone);
+ #endif
+ return (double)(-(timezone * 1000));
++#endif // __FreeBSD__
+ }
+
+ int GetDaylightSavingTA(double d) {
diff --git a/devel/electron28/files/patch-third__party_pdfium_pdfium.gni b/devel/electron28/files/patch-third__party_pdfium_pdfium.gni
new file mode 100644
index 000000000000..d2c14214ed42
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_pdfium.gni
@@ -0,0 +1,11 @@
+--- third_party/pdfium/pdfium.gni.orig 2023-11-29 21:41:46 UTC
++++ third_party/pdfium/pdfium.gni
+@@ -41,7 +41,7 @@ declare_args() {
+ # PDFium will use PartitionAlloc partitions to separate strings, scalars,
+ # etc. from other allocations. However, the use of PartitionAlloc for new or
+ # malloc is controlled by args in build_overrides/partition_alloc.gni.
+- pdf_use_partition_alloc = pdf_use_partition_alloc_override
++ pdf_use_partition_alloc = pdf_use_partition_alloc_override && use_partition_alloc_as_malloc
+
+ # Build PDFium to use Skia (experimental) for all PDFium graphics.
+ # If enabled, coexists in build with AGG graphics and the default
diff --git a/devel/electron28/files/patch-third__party_pdfium_third__party_base_compiler__specific.h b/devel/electron28/files/patch-third__party_pdfium_third__party_base_compiler__specific.h
new file mode 100644
index 000000000000..e4a3d351308f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_third__party_base_compiler__specific.h
@@ -0,0 +1,11 @@
+--- third_party/pdfium/third_party/base/compiler_specific.h.orig 2023-05-25 00:46:23 UTC
++++ third_party/pdfium/third_party/base/compiler_specific.h
+@@ -17,7 +17,7 @@
+ // Annotate a function indicating it should not be inlined.
+ // Use like:
+ // NOINLINE void DoStuff() { ... }
+-#if defined(__clang__) && HAS_ATTRIBUTE(noinline)
++#if defined(__clang__) && (__clang_major__ >= 15) && HAS_ATTRIBUTE(noinline)
+ #define NOINLINE [[clang::noinline]]
+ #elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(noinline)
+ #define NOINLINE __attribute__((noinline))
diff --git a/devel/electron28/files/patch-third__party_pdfium_xfa_fxfa_parser_cxfa__timezoneprovider.cpp b/devel/electron28/files/patch-third__party_pdfium_xfa_fxfa_parser_cxfa__timezoneprovider.cpp
new file mode 100644
index 000000000000..c9bbf1096187
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_pdfium_xfa_fxfa_parser_cxfa__timezoneprovider.cpp
@@ -0,0 +1,41 @@
+--- third_party/pdfium/xfa/fxfa/parser/cxfa_timezoneprovider.cpp.orig 2022-02-28 16:54:41 UTC
++++ third_party/pdfium/xfa/fxfa/parser/cxfa_timezoneprovider.cpp
+@@ -6,12 +6,16 @@
+
+ #include "xfa/fxfa/parser/cxfa_timezoneprovider.h"
+
++#include <stdint.h>
+ #include <stdlib.h>
+ #include <time.h>
+
+ #include "build/build_config.h"
+
+ static bool g_bProviderTimeZoneSet = false;
++#if defined(OS_FREEBSD)
++static long g_lTimeZoneOffset = 0;
++#endif
+
+ #if BUILDFLAG(IS_WIN)
+ #define TIMEZONE _timezone
+@@ -24,9 +28,21 @@ static bool g_bProviderTimeZoneSet = false;
+ CXFA_TimeZoneProvider::CXFA_TimeZoneProvider() {
+ if (!g_bProviderTimeZoneSet) {
+ g_bProviderTimeZoneSet = true;
++#if defined(OS_FREEBSD)
++ time_t now = time(nullptr);
++ struct tm tm = {};
++
++ localtime_r(&now, &tm);
++ g_lTimeZoneOffset = tm.tm_gmtoff;
++#else
+ TZSET();
++#endif
+ }
++#if defined(OS_FREEBSD)
++ tz_minutes_ = static_cast<int8_t>((abs(g_lTimeZoneOffset) % 3600) / 60);
++#else
+ tz_minutes_ = TIMEZONE / -60;
++#endif
+ }
+
+ CXFA_TimeZoneProvider::~CXFA_TimeZoneProvider() = default;
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_build__config.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
new file mode 100644
index 000000000000..4ff5bff8c746
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
@@ -0,0 +1,66 @@
+--- third_party/perfetto/include/perfetto/base/build_config.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/perfetto/include/perfetto/base/build_config.h
+@@ -27,6 +27,7 @@
+ #if defined(__ANDROID__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
+@@ -38,6 +39,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FUCHSIA() 0
+@@ -51,9 +53,10 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_IOS() 0
+ #endif
+-#elif defined(__linux__)
++#elif defined(__linux__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 1
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
+@@ -64,6 +67,8 @@
+ #elif defined(_WIN32)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
+@@ -74,6 +79,8 @@
+ #elif defined(__EMSCRIPTEN__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
+@@ -87,6 +94,8 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_IOS() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FUCHSIA() 1
+@@ -94,6 +103,8 @@
+ #elif defined(__native_client__)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_BSD() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_APPLE() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MAC() 0
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h
new file mode 100644
index 000000000000..7e6881fb2cc6
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h
@@ -0,0 +1,22 @@
+--- third_party/perfetto/include/perfetto/base/thread_utils.h.orig 2023-02-01 18:45:20 UTC
++++ third_party/perfetto/include/perfetto/base/thread_utils.h
+@@ -34,6 +34,7 @@ __declspec(dllimport) unsigned long __stdcall GetCurre
+ #include <sys/syscall.h>
+ #include <sys/types.h>
+ #include <unistd.h>
++#include <pthread.h>
+ #else
+ #include <pthread.h>
+ #endif
+@@ -45,6 +46,11 @@ namespace base {
+ using PlatformThreadId = pid_t;
+ inline PlatformThreadId GetThreadId() {
+ return gettid();
++}
++#elif PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
++using PlatformThreadId = uint64_t;
++inline PlatformThreadId GetThreadId() {
++ return reinterpret_cast<uint64_t>(pthread_self());
+ }
+ #elif PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX)
+ using PlatformThreadId = pid_t;
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_time.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_time.h
new file mode 100644
index 000000000000..6cf3dcb30932
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_base_time.h
@@ -0,0 +1,34 @@
+--- third_party/perfetto/include/perfetto/base/time.h.orig 2023-11-29 21:41:38 UTC
++++ third_party/perfetto/include/perfetto/base/time.h
+@@ -167,6 +167,9 @@ inline TimeNanos GetBootTimeNs() {
+ // Return ns from boot. Conversely to GetWallTimeNs, this clock counts also time
+ // during suspend (when supported).
+ inline TimeNanos GetBootTimeNs() {
++#if defined(__FreeBSD__)
++ return GetTimeInternalNs(kWallTimeClockSource);
++#else
+ // Determine if CLOCK_BOOTTIME is available on the first call.
+ static const clockid_t kBootTimeClockSource = [] {
+ struct timespec ts = {};
+@@ -174,6 +177,7 @@ inline TimeNanos GetBootTimeNs() {
+ return res == 0 ? CLOCK_BOOTTIME : kWallTimeClockSource;
+ }();
+ return GetTimeInternalNs(kBootTimeClockSource);
++#endif
+ }
+
+ inline TimeNanos GetWallTimeNs() {
+@@ -181,7 +185,13 @@ inline TimeNanos GetWallTimeRawNs() {
+ }
+
+ inline TimeNanos GetWallTimeRawNs() {
++#if defined(__OpenBSD__)
++ return GetTimeInternalNs(CLOCK_MONOTONIC);
++#elif defined(__FreeBSD__)
++ return GetTimeInternalNs(CLOCK_MONOTONIC_FAST);
++#else
+ return GetTimeInternalNs(CLOCK_MONOTONIC_RAW);
++#endif
+ }
+
+ inline TimeNanos GetThreadCPUTimeNs() {
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h
new file mode 100644
index 000000000000..7d9883a23e8f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h
@@ -0,0 +1,11 @@
+--- third_party/perfetto/include/perfetto/ext/base/event_fd.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/perfetto/include/perfetto/ext/base/event_fd.h
+@@ -55,6 +55,8 @@ class EventFd {
+ // On Mac and other non-Linux UNIX platforms a pipe-based fallback is used.
+ // The write end of the wakeup pipe.
+ ScopedFile write_fd_;
++#else
++ ScopedFile write_fd_;
+ #endif
+ };
+
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_thread__utils.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_thread__utils.h
new file mode 100644
index 000000000000..36bd8a14f3d0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_ext_base_thread__utils.h
@@ -0,0 +1,15 @@
+--- third_party/perfetto/include/perfetto/ext/base/thread_utils.h.orig 2023-11-29 21:41:38 UTC
++++ third_party/perfetto/include/perfetto/ext/base/thread_utils.h
+@@ -41,9 +41,10 @@ namespace base {
+ namespace perfetto {
+ namespace base {
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+- PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
++ PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ // Sets the "comm" of the calling thread to the first 15 chars of the given
+ // string.
+ inline bool MaybeSetThreadName(const std::string& name) {
diff --git a/devel/electron28/files/patch-third__party_perfetto_include_perfetto_tracing_internal_track__event__legacy.h b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_tracing_internal_track__event__legacy.h
new file mode 100644
index 000000000000..4858a1ee72d2
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_include_perfetto_tracing_internal_track__event__legacy.h
@@ -0,0 +1,11 @@
+--- third_party/perfetto/include/perfetto/tracing/internal/track_event_legacy.h.orig 2023-05-25 00:46:23 UTC
++++ third_party/perfetto/include/perfetto/tracing/internal/track_event_legacy.h
+@@ -249,7 +249,7 @@ class PERFETTO_EXPORT_COMPONENT LegacyTraceId {
+ // are different. E.g. on Mac size_t is considered a different type from
+ // uint64_t even though it has the same size and signedness.
+ // Below we add overloads for those types that are known to cause ambiguity.
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) || defined(__OpenBSD__)
+ explicit LegacyTraceId(size_t raw_id) : raw_id_(raw_id) {}
+ explicit LegacyTraceId(intptr_t raw_id)
+ : raw_id_(static_cast<uint64_t>(raw_id)) {}
diff --git a/devel/electron28/files/patch-third__party_perfetto_protos_perfetto_trace_ftrace_v4l2.proto b/devel/electron28/files/patch-third__party_perfetto_protos_perfetto_trace_ftrace_v4l2.proto
new file mode 100644
index 000000000000..59893e67db88
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_protos_perfetto_trace_ftrace_v4l2.proto
@@ -0,0 +1,56 @@
+--- third_party/perfetto/protos/perfetto/trace/ftrace/v4l2.proto.orig 2022-09-24 10:57:32 UTC
++++ third_party/perfetto/protos/perfetto/trace/ftrace/v4l2.proto
+@@ -10,7 +10,7 @@ message V4l2QbufFtraceEvent {
+ optional uint32 field = 2;
+ optional uint32 flags = 3;
+ optional uint32 index = 4;
+- optional int32 minor = 5;
++ optional int32 gminor = 5;
+ optional uint32 sequence = 6;
+ optional uint32 timecode_flags = 7;
+ optional uint32 timecode_frames = 8;
+@@ -30,7 +30,7 @@ message V4l2DqbufFtraceEvent {
+ optional uint32 field = 2;
+ optional uint32 flags = 3;
+ optional uint32 index = 4;
+- optional int32 minor = 5;
++ optional int32 gminor = 5;
+ optional uint32 sequence = 6;
+ optional uint32 timecode_flags = 7;
+ optional uint32 timecode_frames = 8;
+@@ -48,7 +48,7 @@ message V4l2DqbufFtraceEvent {
+ message Vb2V4l2BufQueueFtraceEvent {
+ optional uint32 field = 1;
+ optional uint32 flags = 2;
+- optional int32 minor = 3;
++ optional int32 gminor = 3;
+ optional uint32 sequence = 4;
+ optional uint32 timecode_flags = 5;
+ optional uint32 timecode_frames = 6;
+@@ -65,7 +65,7 @@ message Vb2V4l2BufQueueFtraceEvent {
+ message Vb2V4l2BufDoneFtraceEvent {
+ optional uint32 field = 1;
+ optional uint32 flags = 2;
+- optional int32 minor = 3;
++ optional int32 gminor = 3;
+ optional uint32 sequence = 4;
+ optional uint32 timecode_flags = 5;
+ optional uint32 timecode_frames = 6;
+@@ -82,7 +82,7 @@ message Vb2V4l2BufDoneFtraceEvent {
+ message Vb2V4l2QbufFtraceEvent {
+ optional uint32 field = 1;
+ optional uint32 flags = 2;
+- optional int32 minor = 3;
++ optional int32 gminor = 3;
+ optional uint32 sequence = 4;
+ optional uint32 timecode_flags = 5;
+ optional uint32 timecode_frames = 6;
+@@ -99,7 +99,7 @@ message Vb2V4l2QbufFtraceEvent {
+ message Vb2V4l2DqbufFtraceEvent {
+ optional uint32 field = 1;
+ optional uint32 flags = 2;
+- optional int32 minor = 3;
++ optional int32 gminor = 3;
+ optional uint32 sequence = 4;
+ optional uint32 timecode_flags = 5;
+ optional uint32 timecode_frames = 6;
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_event__fd.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_event__fd.cc
new file mode 100644
index 000000000000..5ea355851d89
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_event__fd.cc
@@ -0,0 +1,22 @@
+--- third_party/perfetto/src/base/event_fd.cc.orig 2022-02-07 13:39:41 UTC
++++ third_party/perfetto/src/base/event_fd.cc
+@@ -22,7 +22,8 @@
+ #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+ #include <Windows.h>
+ #include <synchapi.h>
+-#elif PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#elif (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ #include <sys/eventfd.h>
+ #include <unistd.h>
+@@ -57,7 +58,8 @@ void EventFd::Clear() {
+ PERFETTO_DFATAL("EventFd::Clear()");
+ }
+
+-#elif PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#elif (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+
+ EventFd::EventFd() {
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_periodic__task.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_periodic__task.cc
new file mode 100644
index 000000000000..f76f55019b01
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_periodic__task.cc
@@ -0,0 +1,20 @@
+--- third_party/perfetto/src/base/periodic_task.cc.orig 2023-03-30 00:40:41 UTC
++++ third_party/perfetto/src/base/periodic_task.cc
+@@ -24,7 +24,7 @@
+ #include "perfetto/base/time.h"
+ #include "perfetto/ext/base/file_utils.h"
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ (PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && __ANDROID_API__ >= 19)
+ #include <sys/timerfd.h>
+ #endif
+@@ -44,7 +44,7 @@ uint32_t GetNextDelayMs(const TimeMillis& now_ms,
+ }
+
+ ScopedPlatformHandle CreateTimerFd(const PeriodicTask::Args& args) {
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ (PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && __ANDROID_API__ >= 19)
+ ScopedPlatformHandle tfd(
+ timerfd_create(CLOCK_BOOTTIME, TFD_CLOEXEC | TFD_NONBLOCK));
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_string__utils.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_string__utils.cc
new file mode 100644
index 000000000000..ec41d64c1f8d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_string__utils.cc
@@ -0,0 +1,15 @@
+--- third_party/perfetto/src/base/string_utils.cc.orig 2023-11-29 21:41:38 UTC
++++ third_party/perfetto/src/base/string_utils.cc
+@@ -38,9 +38,10 @@ double StrToD(const char* nptr, char** endptr) {
+
+ // Locale-independant as possible version of strtod.
+ double StrToD(const char* nptr, char** endptr) {
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+- PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
++ PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ static auto c_locale = newlocale(LC_ALL, "C", nullptr);
+ return strtod_l(nptr, endptr, c_locale);
+ #else
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_subprocess__posix.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_subprocess__posix.cc
new file mode 100644
index 000000000000..f38b23a79ca9
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_subprocess__posix.cc
@@ -0,0 +1,22 @@
+--- third_party/perfetto/src/base/subprocess_posix.cc.orig 2022-02-07 13:39:41 UTC
++++ third_party/perfetto/src/base/subprocess_posix.cc
+@@ -35,7 +35,8 @@
+ #include <thread>
+ #include <tuple>
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ #include <sys/prctl.h>
+ #endif
+@@ -64,7 +65,8 @@ struct ChildProcessArgs {
+ // Don't add any dynamic allocation in this function. This will be invoked
+ // under a fork(), potentially in a state where the allocator lock is held.
+ void __attribute__((noreturn)) ChildProcess(ChildProcessArgs* args) {
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ // In no case we want a child process to outlive its parent process. This is
+ // relevant for tests, so that a test failure/crash doesn't leave child
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_test_vm__test__utils.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_test_vm__test__utils.cc
new file mode 100644
index 000000000000..17ebe05dd570
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_test_vm__test__utils.cc
@@ -0,0 +1,11 @@
+--- third_party/perfetto/src/base/test/vm_test_utils.cc.orig 2022-06-17 14:20:10 UTC
++++ third_party/perfetto/src/base/test/vm_test_utils.cc
+@@ -91,7 +91,7 @@ bool IsMapped(void* start, size_t size) {
+ // Fuchsia doesn't yet support paging (b/119503290).
+ ignore_result(page_size);
+ return true;
+-#elif PERFETTO_BUILDFLAG(PERFETTO_OS_NACL)
++#elif PERFETTO_BUILDFLAG(PERFETTO_OS_NACL) || PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ // mincore isn't available on NaCL.
+ ignore_result(page_size);
+ return true;
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_thread__task__runner.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_thread__task__runner.cc
new file mode 100644
index 000000000000..3cedb601c7a0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_thread__task__runner.cc
@@ -0,0 +1,14 @@
+--- third_party/perfetto/src/base/thread_task_runner.cc.orig 2022-02-07 13:39:41 UTC
++++ third_party/perfetto/src/base/thread_task_runner.cc
+@@ -27,8 +27,9 @@
+ #include "perfetto/ext/base/thread_utils.h"
+ #include "perfetto/ext/base/unix_task_runner.h"
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+- PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ #include <sys/prctl.h>
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_base_unix__socket.cc b/devel/electron28/files/patch-third__party_perfetto_src_base_unix__socket.cc
new file mode 100644
index 000000000000..d942363bb295
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_base_unix__socket.cc
@@ -0,0 +1,26 @@
+--- third_party/perfetto/src/base/unix_socket.cc.orig 2023-10-19 20:00:18 UTC
++++ third_party/perfetto/src/base/unix_socket.cc
+@@ -44,7 +44,7 @@
+ #include <unistd.h>
+ #endif
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) || defined(__FreeBSD__)
+ #include <sys/ucred.h>
+ #endif
+
+@@ -917,9 +917,13 @@ void UnixSocket::ReadPeerCredentialsPosix() {
+ return;
+ PERFETTO_CHECK(peer_cred_mode_ != SockPeerCredMode::kIgnore);
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if !defined(__FreeBSD__) && PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
++ struct sockpeercred user_cred;
++#else
+ struct ucred user_cred;
++#endif
+ socklen_t len = sizeof(user_cred);
+ int fd = sock_raw_.fd();
+ int res = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &user_cred, &len);
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_trace__processor_db_storage_numeric__storage.cc b/devel/electron28/files/patch-third__party_perfetto_src_trace__processor_db_storage_numeric__storage.cc
new file mode 100644
index 000000000000..2348ceac0181
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_trace__processor_db_storage_numeric__storage.cc
@@ -0,0 +1,16 @@
+--- third_party/perfetto/src/trace_processor/db/storage/numeric_storage.cc.orig 2023-11-29 21:41:38 UTC
++++ third_party/perfetto/src/trace_processor/db/storage/numeric_storage.cc
+@@ -251,8 +251,13 @@ BitVector NumericStorage::LinearSearchInternal(FilterO
+ } else if (const auto* i32 = std::get_if<int32_t>(&*val)) {
+ auto* start = static_cast<const int32_t*>(data_) + range.start;
+ TypedLinearSearch(*i32, start, op, builder);
++#if (defined(__OpenBSD__) || defined(__FreeBSD__)) && defined(__i386__)
++ } else if (const auto* db = std::get_if<long double>(&*val)) {
++ auto* start = static_cast<const long double*>(data_) + range.start;
++#else
+ } else if (const auto* db = std::get_if<double>(&*val)) {
+ auto* start = static_cast<const double*>(data_) + range.start;
++#endif
+ TypedLinearSearch(*db, start, op, builder);
+ } else {
+ PERFETTO_DFATAL("Invalid");
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc b/devel/electron28/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
new file mode 100644
index 000000000000..d863bc45ea9a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
@@ -0,0 +1,12 @@
+--- third_party/perfetto/src/tracing/core/tracing_service_impl.cc.orig 2023-10-19 20:00:21 UTC
++++ third_party/perfetto/src/tracing/core/tracing_service_impl.cc
+@@ -3213,7 +3213,8 @@ bool TracingServiceImpl::SnapshotClocks(
+
+ #if !PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) && \
+ !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) && \
+- !PERFETTO_BUILDFLAG(PERFETTO_OS_NACL)
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_NACL) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ struct {
+ clockid_t id;
+ protos::pbzero::BuiltinClock type;
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_tracing_ipc_memfd.cc b/devel/electron28/files/patch-third__party_perfetto_src_tracing_ipc_memfd.cc
new file mode 100644
index 000000000000..849e51bb1eac
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_tracing_ipc_memfd.cc
@@ -0,0 +1,12 @@
+--- third_party/perfetto/src/tracing/ipc/memfd.cc.orig 2023-10-19 20:00:21 UTC
++++ third_party/perfetto/src/tracing/ipc/memfd.cc
+@@ -20,7 +20,8 @@
+
+ #define PERFETTO_MEMFD_ENABLED() \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+- PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX)
++ (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD))
+
+ #if PERFETTO_MEMFD_ENABLED()
+
diff --git a/devel/electron28/files/patch-third__party_perfetto_src_tracing_track.cc b/devel/electron28/files/patch-third__party_perfetto_src_tracing_track.cc
new file mode 100644
index 000000000000..2b338a848b6a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_perfetto_src_tracing_track.cc
@@ -0,0 +1,11 @@
+--- third_party/perfetto/src/tracing/track.cc.orig 2023-05-25 00:46:23 UTC
++++ third_party/perfetto/src/tracing/track.cc
+@@ -143,7 +143,7 @@ namespace internal {
+ namespace {
+
+ uint64_t GetProcessStartTime() {
+-#if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
++#if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) && !PERFETTO_BUILDFLAG(PERFETTO_OS_BSD)
+ std::string stat;
+ if (!base::ReadFile("/proc/self/stat", &stat))
+ return 0u;
diff --git a/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_arenastring.cc b/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_arenastring.cc
new file mode 100644
index 000000000000..5ecfe8529421
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_arenastring.cc
@@ -0,0 +1,12 @@
+--- third_party/protobuf/src/google/protobuf/arenastring.cc.orig 2022-09-01 14:18:43 UTC
++++ third_party/protobuf/src/google/protobuf/arenastring.cc
+@@ -64,7 +64,9 @@ constexpr size_t kNewAlign = alignof(std::max_align_t)
+ #endif
+ constexpr size_t kStringAlign = alignof(std::string);
+
++#if !(defined(__FreeBSD__) && defined(__i386__))
+ static_assert((kStringAlign > kNewAlign ? kStringAlign : kNewAlign) >= 8, "");
++#endif
+ static_assert(alignof(ExplicitlyConstructedArenaString) >= 8, "");
+
+ } // namespace
diff --git a/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h b/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h
new file mode 100644
index 000000000000..249b75357b53
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h
@@ -0,0 +1,11 @@
+--- third_party/protobuf/src/google/protobuf/stubs/platform_macros.h.orig 2022-08-31 12:19:35 UTC
++++ third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
+@@ -122,7 +122,7 @@ GOOGLE_PROTOBUF_PLATFORM_ERROR
+
+ #undef GOOGLE_PROTOBUF_PLATFORM_ERROR
+
+-#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__OpenBSD__)
++#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE)
+ // Android ndk does not support the __thread keyword very well yet. Here
+ // we use pthread_key_create()/pthread_getspecific()/... methods for
+ // TLS support on android.
diff --git a/devel/electron28/files/patch-third__party_skia_src_base_SkContainers.cpp b/devel/electron28/files/patch-third__party_skia_src_base_SkContainers.cpp
new file mode 100644
index 000000000000..d0ff23f1934a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_skia_src_base_SkContainers.cpp
@@ -0,0 +1,20 @@
+--- third_party/skia/src/base/SkContainers.cpp.orig 2023-03-30 00:40:43 UTC
++++ third_party/skia/src/base/SkContainers.cpp
+@@ -14,7 +14,7 @@
+
+ #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
+ #include <malloc/malloc.h>
+-#elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX)
++#elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX) && !defined(__OpenBSD__)
+ #include <malloc.h>
+ #elif defined(SK_BUILD_FOR_WIN)
+ #include <malloc.h>
+@@ -38,7 +38,7 @@ SkSpan<std::byte> complete_size(void* ptr, size_t size
+ #elif defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 17
+ completeSize = malloc_usable_size(ptr);
+ SkASSERT(completeSize >= size);
+- #elif defined(SK_BUILD_FOR_UNIX)
++ #elif defined(SK_BUILD_FOR_UNIX) && !defined(__OpenBSD__)
+ completeSize = malloc_usable_size(ptr);
+ SkASSERT(completeSize >= size);
+ #elif defined(SK_BUILD_FOR_WIN)
diff --git a/devel/electron28/files/patch-third__party_skia_src_ports_SkOSFile__posix.cpp b/devel/electron28/files/patch-third__party_skia_src_ports_SkOSFile__posix.cpp
new file mode 100644
index 000000000000..bd078ab07755
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_skia_src_ports_SkOSFile__posix.cpp
@@ -0,0 +1,11 @@
+--- third_party/skia/src/ports/SkOSFile_posix.cpp.orig 2022-02-28 16:54:41 UTC
++++ third_party/skia/src/ports/SkOSFile_posix.cpp
+@@ -25,7 +25,7 @@
+ #endif
+
+ void sk_fsync(FILE* f) {
+-#if !defined(SK_BUILD_FOR_ANDROID) && !defined(__UCLIBC__) && !defined(_NEWLIB_VERSION)
++#if !defined(SK_BUILD_FOR_ANDROID) && !defined(__UCLIBC__) && !defined(_NEWLIB_VERSION) && !defined(__OpenBSD__)
+ int fd = fileno(f);
+ fsync(fd);
+ #endif
diff --git a/devel/electron28/files/patch-third__party_speech-dispatcher_libspeechd__version.h b/devel/electron28/files/patch-third__party_speech-dispatcher_libspeechd__version.h
new file mode 100644
index 000000000000..5351debee0df
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_speech-dispatcher_libspeechd__version.h
@@ -0,0 +1,32 @@
+--- third_party/speech-dispatcher/libspeechd_version.h.orig 2023-12-20 07:12:42 UTC
++++ third_party/speech-dispatcher/libspeechd_version.h
+@@ -0,0 +1,29 @@
++/*
++ * libspeechd_version.h - Shared library for easy access to Speech Dispatcher functions (header)
++ *
++ * Copyright (C) 2001, 2002, 2003, 2004 Brailcom, o.p.s.
++ *
++ * This is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Lesser General Public License as published by
++ * the Free Software Foundation; either version 2.1, or (at your option)
++ * any later version.
++ *
++ * This software is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program. If not, see <https://www.gnu.org/licenses/>.
++ *
++ * $Id: libspeechd.h,v 1.29 2008-07-30 09:47:00 hanke Exp $
++ */
++
++#ifndef _LIBSPEECHD_VERSION_H
++#define _LIBSPEECHD_VERSION_H
++
++#define LIBSPEECHD_MAJOR_VERSION 0
++#define LIBSPEECHD_MINOR_VERSION 11
++#define LIBSPEECHD_MICRO_VERSION 5
++
++#endif /* ifndef _LIBSPEECHD_VERSION_H */
diff --git a/devel/electron28/files/patch-third__party_speech-dispatcher_speechd__types.h b/devel/electron28/files/patch-third__party_speech-dispatcher_speechd__types.h
new file mode 100644
index 000000000000..d34c000c4f9d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_speech-dispatcher_speechd__types.h
@@ -0,0 +1,142 @@
+--- third_party/speech-dispatcher/speechd_types.h.orig 2023-11-29 21:40:40 UTC
++++ third_party/speech-dispatcher/speechd_types.h
+@@ -119,4 +119,139 @@ typedef struct {
+ SPDVoice voice;
+ } SPDMsgSettings;
+
++/* TEMP_FAILURE_RETRY seems to be available only on Linux. For systems that
++ * don't have this macro we provide our own version. This code was taken from
++ * file "/usr/include/unistd.h" from Debian package "libc6-dev"
++ * version 2.3.2.ds1-20. */
++#ifndef TEMP_FAILURE_RETRY
++#define TEMP_FAILURE_RETRY(expression) \
++ (__extension__ \
++ ({ long int __result; \
++ do __result = (long int) (expression); \
++ while (__result == -1L && errno == EINTR); \
++ __result; }))
++#endif
++
++#endif /* not ifndef SPEECHD_TYPES */
++
++/*
++ * speechd_types.h - types for Speech Dispatcher
++ *
++ * Copyright (C) 2001, 2002, 2003 Brailcom, o.p.s.
++ *
++ * This is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Lesser General Public License as published by
++ * the Free Software Foundation; either version 2.1, or (at your option)
++ * any later version.
++ *
++ * This software is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program. If not, see <https://www.gnu.org/licenses/>.
++ */
++
++#ifndef SPEECHD_TYPES_H
++#define SPEECHD_TYPES_H
++
++typedef enum {
++ SPD_PUNCT_ALL = 0,
++ SPD_PUNCT_NONE = 1,
++ SPD_PUNCT_SOME = 2,
++ SPD_PUNCT_MOST = 3
++} SPDPunctuation;
++
++typedef enum {
++ SPD_CAP_NONE = 0,
++ SPD_CAP_SPELL = 1,
++ SPD_CAP_ICON = 2
++} SPDCapitalLetters;
++
++typedef enum {
++ SPD_SPELL_OFF = 0,
++ SPD_SPELL_ON = 1
++} SPDSpelling;
++
++typedef enum {
++ SPD_MALE1 = 1,
++ SPD_MALE2 = 2,
++ SPD_MALE3 = 3,
++ SPD_FEMALE1 = 4,
++ SPD_FEMALE2 = 5,
++ SPD_FEMALE3 = 6,
++ SPD_CHILD_MALE = 7,
++ SPD_CHILD_FEMALE = 8,
++ SPD_UNSPECIFIED = -1
++} SPDVoiceType;
++
++typedef struct {
++ char *name; /* Name of the voice (id) */
++ char *language; /* 2/3-letter ISO language code,
++ * possibly followed by 2/3-letter ISO region code,
++ * e.g. en-US */
++ char *variant; /* a not-well defined string describing dialect etc. */
++} SPDVoice;
++
++typedef enum {
++ SPD_DATA_TEXT = 0,
++ SPD_DATA_SSML = 1
++} SPDDataMode;
++
++typedef enum {
++ SPD_IMPORTANT = 1,
++ SPD_MESSAGE = 2,
++ SPD_TEXT = 3,
++ SPD_NOTIFICATION = 4,
++ SPD_PROGRESS = 5
++} SPDPriority;
++
++typedef enum {
++ SPD_BEGIN = 1,
++ SPD_END = 2,
++ SPD_INDEX_MARKS = 4,
++ SPD_CANCEL = 8,
++ SPD_PAUSE = 16,
++ SPD_RESUME = 32,
++
++ SPD_ALL = 0x3f
++} SPDNotification;
++
++typedef enum {
++ SPD_EVENT_BEGIN,
++ SPD_EVENT_END,
++ SPD_EVENT_INDEX_MARK,
++ SPD_EVENT_CANCEL,
++ SPD_EVENT_PAUSE,
++ SPD_EVENT_RESUME
++} SPDNotificationType;
++
++typedef enum {
++ SORT_BY_TIME = 0,
++ SORT_BY_ALPHABET = 1
++} ESort;
++
++typedef enum {
++ SPD_MSGTYPE_TEXT = 0,
++ SPD_MSGTYPE_SOUND_ICON = 1,
++ SPD_MSGTYPE_CHAR = 2,
++ SPD_MSGTYPE_KEY = 3,
++ SPD_MSGTYPE_SPELL = 99
++} SPDMessageType;
++
++typedef struct {
++ signed int rate;
++ signed int pitch;
++ signed int pitch_range;
++ signed int volume;
++
++ SPDPunctuation punctuation_mode;
++ SPDSpelling spelling_mode;
++ SPDCapitalLetters cap_let_recogn;
++
++ SPDVoiceType voice_type;
++ SPDVoice voice;
++} SPDMsgSettings;
++
+ #endif /* not ifndef SPEECHD_TYPES */
diff --git a/devel/electron28/files/patch-third__party_sqlite_BUILD.gn b/devel/electron28/files/patch-third__party_sqlite_BUILD.gn
new file mode 100644
index 000000000000..12e24499246a
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_sqlite_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/sqlite/BUILD.gn.orig 2021-12-31 00:58:29 UTC
++++ third_party/sqlite/BUILD.gn
+@@ -142,7 +142,7 @@ config("sqlite_warnings") {
+ ]
+ }
+ }
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ cflags += [
+ # SQLite doesn't believe in compiler warnings, preferring testing.
+ # http://www.sqlite.org/faq.html#q17
diff --git a/devel/electron28/files/patch-third__party_sqlite_src_amalgamation_sqlite3.c b/devel/electron28/files/patch-third__party_sqlite_src_amalgamation_sqlite3.c
new file mode 100644
index 000000000000..51868ad8880c
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_sqlite_src_amalgamation_sqlite3.c
@@ -0,0 +1,23 @@
+--- third_party/sqlite/src/amalgamation/sqlite3.c.orig 2024-01-03 23:44:05 UTC
++++ third_party/sqlite/src/amalgamation/sqlite3.c
+@@ -44313,7 +44313,12 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nB
+ memset(zBuf, 0, nBuf);
+ randomnessPid = osGetpid(0);
+ #if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS)
++#if defined(__OpenBSD__)
+ {
++ arc4random_buf(zBuf, nBuf);
++ }
++#else
++ {
+ int fd, got;
+ fd = robust_open("/dev/urandom", O_RDONLY, 0);
+ if( fd<0 ){
+@@ -44328,6 +44333,7 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nB
+ robust_close(0, fd, __LINE__);
+ }
+ }
++#endif
+ #endif
+ return nBuf;
+ }
diff --git a/devel/electron28/files/patch-third__party_swiftshader_src_Reactor_Debug.cpp b/devel/electron28/files/patch-third__party_swiftshader_src_Reactor_Debug.cpp
new file mode 100644
index 000000000000..6d183046901d
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_src_Reactor_Debug.cpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/Reactor/Debug.cpp.orig 2022-02-07 13:39:41 UTC
++++ third_party/swiftshader/src/Reactor/Debug.cpp
+@@ -46,7 +46,7 @@ namespace {
+
+ bool IsUnderDebugger()
+ {
+-#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__)
++#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__) && !defined(__OpenBSD__) && !defined(__FreeBSD__)
+ static bool checked = false;
+ static bool res = false;
+
diff --git a/devel/electron28/files/patch-third__party_swiftshader_src_System_Configurator.cpp b/devel/electron28/files/patch-third__party_swiftshader_src_System_Configurator.cpp
new file mode 100644
index 000000000000..8300c60da5ec
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_src_System_Configurator.cpp
@@ -0,0 +1,12 @@
+--- third_party/swiftshader/src/System/Configurator.cpp.orig 2022-06-17 14:20:10 UTC
++++ third_party/swiftshader/src/System/Configurator.cpp
+@@ -38,6 +38,9 @@ namespace sw {
+
+ Configurator::Configurator(const std::string &filePath)
+ {
++#if defined(__OpenBSD__) || defined(__FreeBSD__)
++ return;
++#endif
+ std::fstream file(filePath, std::ios::in);
+ if(file.fail())
+ {
diff --git a/devel/electron28/files/patch-third__party_swiftshader_src_System_Linux_MemFd.cpp b/devel/electron28/files/patch-third__party_swiftshader_src_System_Linux_MemFd.cpp
new file mode 100644
index 000000000000..7e1b9f8f0ad3
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_src_System_Linux_MemFd.cpp
@@ -0,0 +1,37 @@
+--- third_party/swiftshader/src/System/Linux/MemFd.cpp.orig 2023-10-19 19:59:44 UTC
++++ third_party/swiftshader/src/System/Linux/MemFd.cpp
+@@ -25,6 +25,7 @@
+ # define MFD_CLOEXEC 0x0001U
+ #endif
+
++#if !defined(__OpenBSD__) && !defined(__FreeBSD__)
+ #if __aarch64__
+ # define __NR_memfd_create 279
+ #elif __arm__
+@@ -36,6 +37,7 @@
+ #elif __x86_64__
+ # define __NR_memfd_create 319
+ #endif /* __NR_memfd_create__ */
++#endif
+
+ LinuxMemFd::~LinuxMemFd()
+ {
+@@ -63,13 +65,17 @@ bool LinuxMemFd::allocate(const char *name, size_t siz
+ {
+ close();
+
+-#ifndef __NR_memfd_create
++#if !defined(__NR_memfd_create) || defined(__OpenBSD__)
+ TRACE("memfd_create() not supported on this system!");
+ return false;
+ #else
+ // In the event of no system call this returns -1 with errno set
+ // as ENOSYS.
++#if defined(__FreeBSD__)
++ fd_ = memfd_create(name, MFD_CLOEXEC);
++#else
+ fd_ = syscall(__NR_memfd_create, name, MFD_CLOEXEC);
++#endif
+ if(fd_ < 0)
+ {
+ TRACE("memfd_create() returned %d: %s", errno, strerror(errno));
diff --git a/devel/electron28/files/patch-third__party_swiftshader_src_Vulkan_VkSemaphoreExternalLinux.hpp b/devel/electron28/files/patch-third__party_swiftshader_src_Vulkan_VkSemaphoreExternalLinux.hpp
new file mode 100644
index 000000000000..8bd770cf38ef
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_src_Vulkan_VkSemaphoreExternalLinux.hpp
@@ -0,0 +1,20 @@
+--- third_party/swiftshader/src/Vulkan/VkSemaphoreExternalLinux.hpp.orig 2022-02-07 13:39:41 UTC
++++ third_party/swiftshader/src/Vulkan/VkSemaphoreExternalLinux.hpp
+@@ -49,13 +49,17 @@ class SharedSemaphore (public)
+ {
+ pthread_mutexattr_t mattr;
+ pthread_mutexattr_init(&mattr);
++#if 0
+ pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
++#endif
+ pthread_mutex_init(&mutex, &mattr);
+ pthread_mutexattr_destroy(&mattr);
+
+ pthread_condattr_t cattr;
+ pthread_condattr_init(&cattr);
++#if 0
+ pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);
++#endif
+ pthread_cond_init(&cond, &cattr);
+ pthread_condattr_destroy(&cattr);
+ }
diff --git a/devel/electron28/files/patch-third__party_swiftshader_src_WSI_libXCB.cpp b/devel/electron28/files/patch-third__party_swiftshader_src_WSI_libXCB.cpp
new file mode 100644
index 000000000000..4f7a5b044079
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_src_WSI_libXCB.cpp
@@ -0,0 +1,20 @@
+--- third_party/swiftshader/src/WSI/libXCB.cpp.orig 2023-03-30 00:40:41 UTC
++++ third_party/swiftshader/src/WSI/libXCB.cpp
+@@ -57,7 +57,7 @@ LibXcbExports *LibXCB::loadExports()
+ }
+ else
+ {
+- libxcb = loadLibrary("libxcb.so.1");
++ libxcb = loadLibrary("libxcb.so");
+ }
+
+ if(getProcAddress(RTLD_DEFAULT, "xcb_shm_query_version")) // Search the global scope for pre-loaded XCB library.
+@@ -66,7 +66,7 @@ LibXcbExports *LibXCB::loadExports()
+ }
+ else
+ {
+- libshm = loadLibrary("libxcb-shm.so.0");
++ libshm = loadLibrary("libxcb-shm.so");
+ }
+
+ return LibXcbExports(libxcb, libshm);
diff --git a/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-10.0_configs_linux_include_llvm_Config_config.h b/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-10.0_configs_linux_include_llvm_Config_config.h
new file mode 100644
index 000000000000..8e9a23417ae3
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-10.0_configs_linux_include_llvm_Config_config.h
@@ -0,0 +1,174 @@
+--- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig 2022-05-19 14:06:27 UTC
++++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h
+@@ -29,7 +29,7 @@
+
+ /* Define to 1 if you have the declaration of `arc4random', and to 0 if you
+ don't. */
+-#define HAVE_DECL_ARC4RANDOM 0
++#define HAVE_DECL_ARC4RANDOM 1
+
+ /* Define to 1 if you have the declaration of `FE_ALL_EXCEPT', and to 0 if you
+ don't. */
+@@ -53,7 +53,7 @@
+ #define HAVE_DLOPEN 1
+
+ /* Define if dladdr() is available on this platform. */
+-/* #undef HAVE_DLADDR */
++#define HAVE_DLADDR 1
+
+ /* Define to 1 if you have the <errno.h> header file. */
+ #define HAVE_ERRNO_H 1
+@@ -92,7 +92,7 @@
+ #define HAVE_ISATTY 1
+
+ /* Define to 1 if you have the `edit' library (-ledit). */
+-/* #undef HAVE_LIBEDIT */
++#define HAVE_LIBEDIT 1
+
+ /* Define to 1 if you have the `pfm' library (-lpfm). */
+ /* #undef HAVE_LIBPFM */
+@@ -110,13 +110,13 @@
+ /* #undef HAVE_PTHREAD_SETNAME_NP */
+
+ /* Define to 1 if you have the `z' library (-lz). */
+-/* #undef HAVE_LIBZ */
++#define HAVE_LIBZ 1
+
+ /* Define to 1 if you have the <link.h> header file. */
+-#define HAVE_LINK_H 1
++/* #undef HAVE_LINK_H */
+
+ /* Define to 1 if you have the `lseek64' function. */
+-#define HAVE_LSEEK64 1
++/* #undef HAVE_LSEEK64 */
+
+ /* Define to 1 if you have the <mach/mach.h> header file. */
+ /* #undef HAVE_MACH_MACH_H */
+@@ -125,7 +125,7 @@
+ /* #undef HAVE_MALLCTL */
+
+ /* Define to 1 if you have the `mallinfo' function. */
+-#define HAVE_MALLINFO 1
++/* #undef HAVE_MALLINFO */
+
+ /* Define to 1 if you have the <malloc/malloc.h> header file. */
+ /* #undef HAVE_MALLOC_MALLOC_H */
+@@ -134,10 +134,10 @@
+ /* #undef HAVE_MALLOC_ZONE_STATISTICS */
+
+ /* Define to 1 if you have the `posix_fallocate' function. */
+-#define HAVE_POSIX_FALLOCATE 1
++/* #undef HAVE_POSIX_FALLOCATE */
+
+ /* Define to 1 if you have the `posix_spawn' function. */
+-/* #undef HAVE_POSIX_SPAWN */
++#define HAVE_POSIX_SPAWN 1
+
+ /* Define to 1 if you have the `pread' function. */
+ #define HAVE_PREAD 1
+@@ -161,10 +161,10 @@
+ #define HAVE_SETENV 1
+
+ /* Define to 1 if you have the `sched_getaffinity' function. */
+-#define HAVE_SCHED_GETAFFINITY 1
++/* #undef HAVE_SCHED_GETAFFINITY */
+
+ /* Define to 1 if you have the `CPU_COUNT' macro. */
+-#define HAVE_CPU_COUNT 1
++/* #undef HAVE_CPU_COUNT */
+
+ /* Define to 1 if you have the `setrlimit' function. */
+ #define HAVE_SETRLIMIT 1
+@@ -182,7 +182,7 @@
+ #define HAVE_STRERROR_R 1
+
+ /* Define to 1 if you have the `sysconf' function. */
+-#define HAVE_SYSCONF 1
++/* #undef HAVE_SYSCONF */
+
+ /* Define to 1 if you have the <sys/ioctl.h> header file. */
+ #define HAVE_SYS_IOCTL_H 1
+@@ -209,7 +209,7 @@
+ #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+
+ /* Define to 1 if you have the <sys/types.h> header file. */
+-#define HAVE_SYS_TYPES_H 1
++/* #undef HAVE_SYS_TYPES_H */
+
+ /* Define if the setupterm() function is supported this platform. */
+ /* #undef HAVE_TERMINFO */
+@@ -218,16 +218,16 @@
+ /* #undef HAVE_LIBXAR */
+
+ /* Define to 1 if you have the <termios.h> header file. */
+-/* #undef HAVE_TERMIOS_H */
++#define HAVE_TERMIOS_H 1
+
+ /* Define to 1 if you have the <unistd.h> header file. */
+ #define HAVE_UNISTD_H 1
+
+ /* Define to 1 if you have the <valgrind/valgrind.h> header file. */
+-/* #undef HAVE_VALGRIND_VALGRIND_H */
++/* #define HAVE_VALGRIND_VALGRIND_H 1 */
+
+ /* Define to 1 if you have the <zlib.h> header file. */
+-/* #undef HAVE_ZLIB_H */
++#define HAVE_ZLIB_H 1
+
+ /* Have host's _alloca */
+ /* #undef HAVE__ALLOCA */
+@@ -292,30 +292,8 @@
+ /* Linker version detected at compile time. */
+ /* #undef HOST_LINK_VERSION */
+
+-/* Target triple LLVM will generate code for by default */
+-/* Doesn't use `cmakedefine` because it is allowed to be empty. */
+-#if defined(__x86_64__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-linux-gnu"
+-#elif defined(__i386__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "i686-pc-linux-gnu"
+-#elif defined(__arm__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "armv7-linux-gnueabihf"
+-#elif defined(__aarch64__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-linux-gnu"
+-#elif defined(__mips__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "mipsel-linux-gnu"
+-#elif defined(__mips64)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "mips64el-linux-gnuabi64"
+-#elif defined(__powerpc64__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "powerpc64le-unknown-linux-gnu"
+-#elif defined(__riscv) && __riscv_xlen == 64
+-#define LLVM_DEFAULT_TARGET_TRIPLE "riscv64-unknown-linux-gnu"
+-#else
+-#error "unknown architecture"
+-#endif
+-
+ /* Define if zlib compression is available */
+-#define LLVM_ENABLE_ZLIB 0
++/* #define LLVM_ENABLE_ZLIB 1 */
+
+ /* Define if overriding target triple is enabled */
+ /* #undef LLVM_TARGET_TRIPLE_ENV */
+@@ -339,10 +317,10 @@
+ #define PACKAGE_NAME "LLVM"
+
+ /* Define to the full name and version of this package. */
+-#define PACKAGE_STRING "LLVM 10.0.0"
++#define PACKAGE_STRING "LLVM 11.1.0"
+
+ /* Define to the version of this package. */
+-#define PACKAGE_VERSION "10.0.0"
++#define PACKAGE_VERSION "11.1.0"
+
+ /* Define to the vendor of this package. */
+ /* #undef PACKAGE_VENDOR */
+@@ -361,9 +339,6 @@
+
+ /* Whether GlobalISel rule coverage is being collected */
+ #define LLVM_GISEL_COV_ENABLED 0
+-
+-/* Define if we have z3 and want to build it */
+-#define LLVM_WITH_Z3 1
+
+ /* Define to the default GlobalISel coverage file prefix */
+ /* #undef LLVM_GISEL_COV_PREFIX */
diff --git a/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h b/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
new file mode 100644
index 000000000000..9d934bd8e734
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
@@ -0,0 +1,47 @@
+--- third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h
+@@ -5,8 +5,6 @@
+ #include "llvm/Config/llvm-config.h"
+
+ /* For detecting __GLIBC__ usage */
+-#include <features.h>
+-
+ /* Bug report URL. */
+ #define BUG_REPORT_URL "http://llvm.org/bugs/"
+
+@@ -27,7 +25,7 @@
+
+ /* Define to 1 if you have the declaration of `arc4random', and to 0 if you
+ don't. */
+-#define HAVE_DECL_ARC4RANDOM 0
++#define HAVE_DECL_ARC4RANDOM 1
+
+ /* Define to 1 if you have the declaration of `FE_ALL_EXCEPT', and to 0 if you
+ don't. */
+@@ -124,7 +122,7 @@
+ #define HAVE_LINK_H 1
+
+ /* Define to 1 if you have the `lseek64' function. */
+-#define HAVE_LSEEK64 1
++/* #define HAVE_LSEEK64 */
+
+ /* Define to 1 if you have the <mach/mach.h> header file. */
+ /* #undef HAVE_MACH_MACH_H */
+@@ -133,7 +131,7 @@
+ /* #undef HAVE_MALLCTL */
+
+ /* Define to 1 if you have the `mallinfo' function. */
+-#define HAVE_MALLINFO 1
++/* #define HAVE_MALLINFO */
+
+ /* Some projects using SwiftShader bypass cmake (eg Chromium via gn) */
+ /* so we need to check glibc version for the new API to be safe */
+@@ -163,7 +161,7 @@
+ /* #undef HAVE_NDIR_H */
+
+ /* Define to 1 if you have the `posix_fallocate' function. */
+-#define HAVE_POSIX_FALLOCATE 1
++/* #define HAVE_POSIX_FALLOCATE */
+
+ /* Define to 1 if you have the `posix_spawn' function. */
+ #define HAVE_POSIX_SPAWN 1
diff --git a/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp b/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp
new file mode 100644
index 000000000000..c0f589f8f517
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/third_party/marl/src/memory.cpp.orig 2023-08-10 01:51:25 UTC
++++ third_party/swiftshader/third_party/marl/src/memory.cpp
+@@ -19,7 +19,7 @@
+
+ #include <cstring>
+
+-#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__EMSCRIPTEN__)
++#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__EMSCRIPTEN__) || defined(__OpenBSD__)
+ #include <sys/mman.h>
+ #include <unistd.h>
+ namespace {
diff --git a/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp b/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp
new file mode 100644
index 000000000000..61663a17fcaa
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/third_party/marl/src/thread.cpp.orig 2023-08-10 01:51:25 UTC
++++ third_party/swiftshader/third_party/marl/src/thread.cpp
+@@ -444,7 +444,7 @@ void Thread::setName(const char* fmt, ...) {
+ pthread_setname_np(name);
+ #elif defined(__FreeBSD__)
+ pthread_set_name_np(pthread_self(), name);
+-#elif !defined(__Fuchsia__) && !defined(__EMSCRIPTEN__)
++#elif !defined(__Fuchsia__) && !defined(__EMSCRIPTEN__) && !defined(__OpenBSD__) && !defined(__FreeBSD__)
+ pthread_setname_np(pthread_self(), name);
+ #endif
+
diff --git a/devel/electron28/files/patch-third__party_test__fonts_fontconfig_BUILD.gn b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_BUILD.gn
new file mode 100644
index 000000000000..180446a881d8
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_BUILD.gn
@@ -0,0 +1,15 @@
+--- third_party/test_fonts/fontconfig/BUILD.gn.orig 2022-03-01 11:59:41 UTC
++++ third_party/test_fonts/fontconfig/BUILD.gn
+@@ -26,7 +26,11 @@ if (is_linux || is_chromeos) {
+
+ copy("fonts_conf") {
+ sources = [ "fonts.conf" ]
+- outputs = [ "$root_out_dir/etc/fonts/{{source_file_part}}" ]
++ if (is_freebsd) {
++ outputs = [ "$root_out_dir/usr/local/etc/fonts/{{source_file_part}}" ]
++ } else {
++ outputs = [ "$root_out_dir/etc/fonts/{{source_file_part}}" ]
++ }
+ }
+
+ if (current_toolchain == host_toolchain) {
diff --git a/devel/electron28/files/patch-third__party_test__fonts_fontconfig_fontconfig__util__linux.cc b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_fontconfig__util__linux.cc
new file mode 100644
index 000000000000..ffd8c2c19312
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_fontconfig__util__linux.cc
@@ -0,0 +1,27 @@
+--- third_party/test_fonts/fontconfig/fontconfig_util_linux.cc.orig 2022-03-25 21:59:56 UTC
++++ third_party/test_fonts/fontconfig/fontconfig_util_linux.cc
+@@ -2,6 +2,8 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
++#include "build/build_config.h"
++
+ #include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
+
+ #include <fontconfig/fontconfig.h>
+@@ -15,11 +17,15 @@
+ namespace test_fonts {
+
+ std::string GetSysrootDir() {
++#if BUILDFLAG(IS_BSD)
++ return std::string(".");
++#else
+ char buf[PATH_MAX + 1];
+ auto count = readlink("/proc/self/exe", buf, PATH_MAX);
+ assert(count > 0);
+ buf[count] = '\0';
+ return dirname(buf);
++#endif
+ }
+
+ void SetUpFontconfig() {
diff --git a/devel/electron28/files/patch-third__party_test__fonts_fontconfig_generate__fontconfig__caches.cc b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_generate__fontconfig__caches.cc
new file mode 100644
index 000000000000..418a72bc2886
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_test__fonts_fontconfig_generate__fontconfig__caches.cc
@@ -0,0 +1,11 @@
+--- third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc.orig 2023-03-30 00:34:16 UTC
++++ third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc
+@@ -56,7 +56,7 @@ int main() {
+ FcFini();
+
+ // Check existence of intended fontconfig cache file.
+- auto cache = fontconfig_caches + "/" + kCacheKey + "-le64.cache-9";
++ auto cache = fontconfig_caches + "/" + kCacheKey + "-le64.cache-" + FC_CACHE_VERSION;
+ bool cache_exists = access(cache.c_str(), F_OK) == 0;
+ return !cache_exists;
+ }
diff --git a/devel/electron28/files/patch-third__party_tflite_features.gni b/devel/electron28/files/patch-third__party_tflite_features.gni
new file mode 100644
index 000000000000..e860705da7e6
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_tflite_features.gni
@@ -0,0 +1,14 @@
+--- third_party/tflite/features.gni.orig 2023-11-29 21:40:40 UTC
++++ third_party/tflite/features.gni
+@@ -8,9 +8,9 @@ declare_args() {
+ # This enables building TFLite with XNNPACK. Currently only available for
+ # Linux or macOS arm64/x64 and Windows x64 targets.
+ build_tflite_with_xnnpack =
+- ((is_linux || is_mac) &&
++ (((is_linux || is_mac) &&
+ (current_cpu == "arm64" || current_cpu == "x64")) ||
+- (is_win && current_cpu == "x64")
++ (is_win && current_cpu == "x64")) && !is_bsd
+
+ # Turns on TFLITE_WITH_RUY, using ruy as the gemm backend instead of gemmlowp.
+ build_tflite_with_ruy = true
diff --git a/devel/electron28/files/patch-third__party_unrar_src_crypt.cpp b/devel/electron28/files/patch-third__party_unrar_src_crypt.cpp
new file mode 100644
index 000000000000..8769300e8988
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_unrar_src_crypt.cpp
@@ -0,0 +1,11 @@
+--- third_party/unrar/src/crypt.cpp.orig 2022-02-07 13:39:41 UTC
++++ third_party/unrar/src/crypt.cpp
+@@ -120,6 +120,8 @@ void GetRnd(byte *RndBuf,size_t BufSize)
+ Success=CryptGenRandom(hProvider, (DWORD)BufSize, RndBuf) == TRUE;
+ CryptReleaseContext(hProvider, 0);
+ }
++#elif defined(__OpenBSD__)
++ arc4random_buf(RndBuf, BufSize);
+ #elif defined(_UNIX)
+ FILE *rndf = fopen("/dev/urandom", "r");
+ if (rndf!=NULL)
diff --git a/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_BUILD.gn b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_BUILD.gn
new file mode 100644
index 000000000000..81e4a7177f98
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/vulkan-deps/vulkan-loader/src/BUILD.gn.orig 2023-08-10 01:51:21 UTC
++++ third_party/vulkan-deps/vulkan-loader/src/BUILD.gn
+@@ -59,7 +59,7 @@ config("vulkan_internal_config") {
+ defines += [
+ "SYSCONFDIR=\"/etc\"",
+ "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
+- "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
++ "FALLBACK_DATA_DIRS=\"/usr/X11R6/share:/usr/local/share:/usr/share\"",
+ ]
+ }
+ if (!vulkan_loader_shared) {
diff --git a/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_loader_vk__loader__platform.h b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_loader_vk__loader__platform.h
new file mode 100644
index 000000000000..83fa3b9a7134
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-loader_src_loader_vk__loader__platform.h
@@ -0,0 +1,19 @@
+--- third_party/vulkan-deps/vulkan-loader/src/loader/vk_loader_platform.h.orig 2023-11-29 21:41:39 UTC
++++ third_party/vulkan-deps/vulkan-loader/src/loader/vk_loader_platform.h
+@@ -312,7 +312,15 @@ static inline char *loader_platform_executable_path(ch
+
+ return buffer;
+ }
+-#elif defined(__Fuchsia__) || defined(__OpenBSD__)
++#elif defined(__OpenBSD__)
++static inline char *loader_platform_executable_path(char *buffer, size_t size) {
++ if ((buffer = getenv("CHROME_EXE_PATH")) != NULL)
++ return buffer;
++ else
++ buffer = "/usr/local/chrome/chrome";
++ return buffer;
++}
++#elif defined(__Fuchsia__)
+ static inline char *loader_platform_executable_path(char *buffer, size_t size) { return NULL; }
+ #elif defined(__QNX__)
+
diff --git a/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-validation-layers_src_layers_external_vma_vk__mem__alloc.h b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-validation-layers_src_layers_external_vma_vk__mem__alloc.h
new file mode 100644
index 000000000000..73541f0acb60
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_vulkan-deps_vulkan-validation-layers_src_layers_external_vma_vk__mem__alloc.h
@@ -0,0 +1,11 @@
+--- third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h.orig 2023-05-25 00:46:25 UTC
++++ third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h
+@@ -2740,7 +2740,7 @@ static void* vma_aligned_alloc(size_t alignment, size_
+
+ return memalign(alignment, size);
+ }
+-#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))
++#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ #include <cstdlib>
+
+ #if defined(__APPLE__)
diff --git a/devel/electron28/files/patch-third__party_vulkan__memory__allocator_include_vk__mem__alloc.h b/devel/electron28/files/patch-third__party_vulkan__memory__allocator_include_vk__mem__alloc.h
new file mode 100644
index 000000000000..ffbab190e6fd
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_vulkan__memory__allocator_include_vk__mem__alloc.h
@@ -0,0 +1,11 @@
+--- third_party/vulkan_memory_allocator/include/vk_mem_alloc.h.orig 2023-11-29 21:41:06 UTC
++++ third_party/vulkan_memory_allocator/include/vk_mem_alloc.h
+@@ -2760,7 +2760,7 @@ void* vma_aligned_alloc(size_t alignment, size_t size)
+
+ return memalign(alignment, size);
+ }
+-#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))
++#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ #include <cstdlib>
+
+ #if defined(__APPLE__)
diff --git a/devel/electron28/files/patch-third__party_wayland_BUILD.gn b/devel/electron28/files/patch-third__party_wayland_BUILD.gn
new file mode 100644
index 000000000000..4d9191447596
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_wayland_BUILD.gn
@@ -0,0 +1,14 @@
+--- third_party/wayland/BUILD.gn.orig 2023-02-01 18:43:48 UTC
++++ third_party/wayland/BUILD.gn
+@@ -22,6 +22,11 @@ config("wayland_config") {
+ "src/src",
+ ]
+
++ if (is_bsd) {
++ include_dirs += [ "/usr/local/include/libepoll-shim" ]
++ libs = [ "epoll-shim" ]
++ }
++
+ # Client/Server headers are automatically generated. Though, we still need
+ # to pass the path where these headers are located.
+ include_dirs += [ "$root_gen_dir/third_party/wayland/src/protocol" ]
diff --git a/devel/electron28/files/patch-third__party_wayland_include_config.h b/devel/electron28/files/patch-third__party_wayland_include_config.h
new file mode 100644
index 000000000000..7aa6d8dc29e9
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_wayland_include_config.h
@@ -0,0 +1,18 @@
+--- third_party/wayland/include/config.h.orig 2024-01-03 23:43:11 UTC
++++ third_party/wayland/include/config.h
+@@ -25,11 +25,14 @@
+
+ #undef HAVE_SYS_PROCCTL_H
+
++#if defined(__FreeBSD__)
++#define HAVE_SYS_UCRED_H
++#else
+ #undef HAVE_SYS_UCRED_H
++#endif
+
+ #define HAVE_XUCRED_CR_PID 0
+
+ #define PACKAGE "wayland"
+
+ #define PACKAGE_VERSION "1.21.0"
+-
diff --git a/devel/electron28/files/patch-third__party_webrtc_BUILD.gn b/devel/electron28/files/patch-third__party_webrtc_BUILD.gn
new file mode 100644
index 000000000000..0681e6796122
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_BUILD.gn
@@ -0,0 +1,12 @@
+--- third_party/webrtc/BUILD.gn.orig 2023-11-29 21:41:41 UTC
++++ third_party/webrtc/BUILD.gn
+@@ -217,6 +217,9 @@ config("common_inherited_config") {
+ if (is_linux || is_chromeos) {
+ defines += [ "WEBRTC_LINUX" ]
+ }
++ if (is_bsd) {
++ defines += [ "WEBRTC_BSD" ]
++ }
+ if (is_mac) {
+ defines += [ "WEBRTC_MAC" ]
+ }
diff --git a/devel/electron28/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn b/devel/electron28/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
new file mode 100644
index 000000000000..2ccd7e8f494f
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/modules/audio_device/BUILD.gn.orig 2023-10-19 20:00:25 UTC
++++ third_party/webrtc/modules/audio_device/BUILD.gn
+@@ -349,7 +349,7 @@ rtc_library("audio_device_impl") {
+ if (rtc_use_dummy_audio_file_devices) {
+ defines += [ "WEBRTC_DUMMY_FILE_DEVICES" ]
+ } else {
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "linux/alsasymboltable_linux.cc",
+ "linux/alsasymboltable_linux.h",
diff --git a/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_wayland_egl__dmabuf.cc b/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_wayland_egl__dmabuf.cc
new file mode 100644
index 000000000000..6b72e7bf68ed
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_wayland_egl__dmabuf.cc
@@ -0,0 +1,18 @@
+--- third_party/webrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc.orig 2023-08-16 00:44:33 UTC
++++ third_party/webrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc
+@@ -10,11 +10,15 @@
+
+ #include "modules/desktop_capture/linux/wayland/egl_dmabuf.h"
+
++#if !defined(WEBRTC_BSD)
+ #include <asm/ioctl.h>
++#endif
+ #include <dlfcn.h>
+ #include <fcntl.h>
+ #include <libdrm/drm_fourcc.h>
++#if !defined(WEBRTC_BSD)
+ #include <linux/types.h>
++#endif
+ #include <spa/param/video/format-utils.h>
+ #include <unistd.h>
+ #include <xf86drm.h>
diff --git a/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_x11_x__server__pixel__buffer.cc b/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_x11_x__server__pixel__buffer.cc
new file mode 100644
index 000000000000..b789d4a64598
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_modules_desktop__capture_linux_x11_x__server__pixel__buffer.cc
@@ -0,0 +1,15 @@
+--- third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc.orig 2023-05-25 00:46:25 UTC
++++ third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
+@@ -203,6 +203,12 @@ bool XServerPixelBuffer::Init(XAtomCache* cache, Windo
+ void XServerPixelBuffer::InitShm(const XWindowAttributes& attributes) {
+ Visual* default_visual = attributes.visual;
+ int default_depth = attributes.depth;
++#if defined(__OpenBSD__)
++// pledge(2)
++ RTC_LOG(LS_WARNING) << "Unable to use shmget(2) while using pledge(2). "
++ "Performance may be degraded.";
++ return;
++#endif
+
+ int major, minor;
+ Bool have_pixmaps;
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_byte__order.h b/devel/electron28/files/patch-third__party_webrtc_rtc__base_byte__order.h
new file mode 100644
index 000000000000..d003530c55c2
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_byte__order.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/byte_order.h.orig 2023-02-01 18:45:24 UTC
++++ third_party/webrtc/rtc_base/byte_order.h
+@@ -90,6 +90,8 @@
+ #error WEBRTC_ARCH_BIG_ENDIAN or WEBRTC_ARCH_LITTLE_ENDIAN must be defined.
+ #endif // defined(WEBRTC_ARCH_LITTLE_ENDIAN)
+
++#elif defined(WEBRTC_BSD)
++#include <sys/endian.h>
+ #elif defined(WEBRTC_POSIX)
+ #include <endian.h>
+ #else
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_ip__address.cc b/devel/electron28/files/patch-third__party_webrtc_rtc__base_ip__address.cc
new file mode 100644
index 000000000000..5bd234bc4b29
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_ip__address.cc
@@ -0,0 +1,12 @@
+--- third_party/webrtc/rtc_base/ip_address.cc.orig 2022-05-19 14:06:27 UTC
++++ third_party/webrtc/rtc_base/ip_address.cc
+@@ -13,7 +13,8 @@
+ #include <sys/socket.h>
+
+ #include "absl/strings/string_view.h"
+-#ifdef OPENBSD
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
+ #include <netinet/in_systm.h>
+ #endif
+ #ifndef __native_client__
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_net__test__helpers.cc b/devel/electron28/files/patch-third__party_webrtc_rtc__base_net__test__helpers.cc
new file mode 100644
index 000000000000..ee7429dcce2b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_net__test__helpers.cc
@@ -0,0 +1,10 @@
+--- third_party/webrtc/rtc_base/net_test_helpers.cc.orig 2023-10-19 20:00:27 UTC
++++ third_party/webrtc/rtc_base/net_test_helpers.cc
+@@ -21,6 +21,7 @@
+ #endif
+ #if defined(WEBRTC_POSIX) && !defined(__native_client__)
+ #include <arpa/inet.h>
++#include <sys/socket.h>
+ #if defined(WEBRTC_ANDROID)
+ #include "rtc_base/ifaddrs_android.h"
+ #else
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_network.cc b/devel/electron28/files/patch-third__party_webrtc_rtc__base_network.cc
new file mode 100644
index 000000000000..55957af0af35
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_network.cc
@@ -0,0 +1,15 @@
+--- third_party/webrtc/rtc_base/network.cc.orig 2023-05-25 00:46:26 UTC
++++ third_party/webrtc/rtc_base/network.cc
+@@ -292,7 +292,12 @@ AdapterType GetAdapterTypeFromName(absl::string_view n
+ }
+ #endif
+
++#if defined(WEBRTC_BSD)
++ // Treat all other network interface names as ethernet on BSD
++ return ADAPTER_TYPE_ETHERNET;
++#else
+ return ADAPTER_TYPE_UNKNOWN;
++#endif
+ }
+
+ NetworkManager::EnumerationPermission NetworkManager::enumeration_permission()
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc b/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc
new file mode 100644
index 000000000000..a8f7159d3023
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc
@@ -0,0 +1,65 @@
+--- third_party/webrtc/rtc_base/physical_socket_server.cc.orig 2023-11-29 21:41:42 UTC
++++ third_party/webrtc/rtc_base/physical_socket_server.cc
+@@ -53,7 +53,7 @@
+ #include "rtc_base/time_utils.h"
+ #include "system_wrappers/include/field_trial.h"
+
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <linux/sockios.h>
+ #endif
+
+@@ -73,7 +73,7 @@ typedef void* SockOptArg;
+
+ #endif // WEBRTC_POSIX
+
+-#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) && !defined(__native_client__)
++#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) && !defined(__native_client__) && !defined(WEBRTC_BSD)
+
+ int64_t GetSocketRecvTimestamp(int socket) {
+ struct timeval tv_ioctl;
+@@ -307,7 +307,7 @@ int PhysicalSocket::GetOption(Option opt, int* value)
+ return -1;
+ }
+ if (opt == OPT_DONTFRAGMENT) {
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ *value = (*value != IP_PMTUDISC_DONT) ? 1 : 0;
+ #endif
+ } else if (opt == OPT_DSCP) {
+@@ -325,7 +325,7 @@ int PhysicalSocket::SetOption(Option opt, int value) {
+ if (TranslateOption(opt, &slevel, &sopt) == -1)
+ return -1;
+ if (opt == OPT_DONTFRAGMENT) {
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ value = (value) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
+ #endif
+ } else if (opt == OPT_DSCP) {
+@@ -353,7 +353,7 @@ int PhysicalSocket::Send(const void* pv, size_t cb) {
+ int PhysicalSocket::Send(const void* pv, size_t cb) {
+ int sent = DoSend(
+ s_, reinterpret_cast<const char*>(pv), static_cast<int>(cb),
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ // Suppress SIGPIPE. Without this, attempting to send on a socket whose
+ // other end is closed will result in a SIGPIPE signal being raised to
+ // our process, which by default will terminate the process, which we
+@@ -382,7 +382,7 @@ int PhysicalSocket::SendTo(const void* buffer,
+ size_t len = addr.ToSockAddrStorage(&saddr);
+ int sent =
+ DoSendTo(s_, static_cast<const char*>(buffer), static_cast<int>(length),
+-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_BSD)
+ // Suppress SIGPIPE. See above for explanation.
+ MSG_NOSIGNAL,
+ #else
+@@ -641,7 +641,7 @@ int PhysicalSocket::TranslateOption(Option opt, int* s
+ *slevel = IPPROTO_IP;
+ *sopt = IP_DONTFRAGMENT;
+ break;
+-#elif defined(WEBRTC_MAC) || defined(BSD) || defined(__native_client__)
++#elif defined(WEBRTC_MAC) || defined(WEBRTC_BSD) || defined(__native_client__)
+ RTC_LOG(LS_WARNING) << "Socket::OPT_DONTFRAGMENT not supported.";
+ return -1;
+ #elif defined(WEBRTC_POSIX)
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h b/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h
new file mode 100644
index 000000000000..b1dc22dd4eef
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/physical_socket_server.h.orig 2023-11-29 21:41:42 UTC
++++ third_party/webrtc/rtc_base/physical_socket_server.h
+@@ -18,7 +18,7 @@
+ #include "rtc_base/third_party/sigslot/sigslot.h"
+
+ #if defined(WEBRTC_POSIX)
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ // On Linux, use epoll.
+ #include <sys/epoll.h>
+
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc b/devel/electron28/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
new file mode 100644
index 000000000000..2b1e7715b52b
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
@@ -0,0 +1,37 @@
+--- third_party/webrtc/rtc_base/platform_thread_types.cc.orig 2023-02-01 18:45:24 UTC
++++ third_party/webrtc/rtc_base/platform_thread_types.cc
+@@ -11,7 +11,9 @@
+ #include "rtc_base/platform_thread_types.h"
+
+ #if defined(WEBRTC_LINUX)
++#if !defined(WEBRTC_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/syscall.h>
+ #endif
+
+@@ -44,6 +46,8 @@ PlatformThreadId CurrentThreadId() {
+ return gettid();
+ #elif defined(WEBRTC_FUCHSIA)
+ return zx_thread_self();
++#elif defined(WEBRTC_BSD)
++ return reinterpret_cast<uint64_t>(pthread_self());
+ #elif defined(WEBRTC_LINUX)
+ return syscall(__NR_gettid);
+ #elif defined(__EMSCRIPTEN__)
+@@ -74,6 +78,7 @@ bool IsThreadRefEqual(const PlatformThreadRef& a, cons
+ }
+
+ void SetCurrentThreadName(const char* name) {
++#if !defined(WEBRTC_BSD)
+ #if defined(WEBRTC_WIN)
+ // The SetThreadDescription API works even if no debugger is attached.
+ // The names set with this API also show up in ETW traces. Very handy.
+@@ -120,6 +125,7 @@ void SetCurrentThreadName(const char* name) {
+ zx_status_t status = zx_object_set_property(zx_thread_self(), ZX_PROP_NAME,
+ name, strlen(name));
+ RTC_DCHECK_EQ(status, ZX_OK);
++#endif
+ #endif
+ }
+
diff --git a/devel/electron28/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h b/devel/electron28/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h
new file mode 100644
index 000000000000..e5a7ab18c9c0
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h
@@ -0,0 +1,23 @@
+--- third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h.orig 2022-02-07 13:39:41 UTC
++++ third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h
+@@ -178,6 +178,10 @@ class multi_threaded_local {
+ #endif // _SIGSLOT_HAS_WIN32_THREADS
+
+ #ifdef _SIGSLOT_HAS_POSIX_THREADS
++#if defined(OS_FREEBSD)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wthread-safety-analysis"
++#endif
+ // The multi threading policies only get compiled in if they are enabled.
+ class multi_threaded_global {
+ public:
+@@ -201,6 +205,9 @@ class multi_threaded_local {
+ private:
+ pthread_mutex_t m_mutex;
+ };
++#if defined(OS_FREEBSD)
++#pragma GCC diagnostic pop
++#endif
+ #endif // _SIGSLOT_HAS_POSIX_THREADS
+
+ template <class mt_policy>
diff --git a/devel/electron28/files/patch-third__party_webrtc_system__wrappers_BUILD.gn b/devel/electron28/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
new file mode 100644
index 000000000000..40fb708a359e
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/system_wrappers/BUILD.gn.orig 2022-05-19 14:06:27 UTC
++++ third_party/webrtc/system_wrappers/BUILD.gn
+@@ -64,8 +64,6 @@ rtc_library("system_wrappers") {
+ if (!build_with_chromium) {
+ sources += [ "source/cpu_features_linux.cc" ]
+ }
+-
+- libs += [ "rt" ]
+ }
+
+ if (is_win) {
diff --git a/devel/electron28/files/patch-third__party_widevine_cdm_widevine.gni b/devel/electron28/files/patch-third__party_widevine_cdm_widevine.gni
new file mode 100644
index 000000000000..3048ecec5379
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_widevine_cdm_widevine.gni
@@ -0,0 +1,11 @@
+--- third_party/widevine/cdm/widevine.gni.orig 2023-11-29 21:40:41 UTC
++++ third_party/widevine/cdm/widevine.gni
+@@ -28,6 +28,8 @@ library_widevine_cdm_available =
+ (is_chromeos &&
+ (target_cpu == "x64" || target_cpu == "arm" || target_cpu == "arm64")) ||
+ (target_os == "linux" && target_cpu == "x64") ||
++ (target_os == "openbsd" && target_cpu == "x64") ||
++ (target_os == "freebsd" && target_cpu == "x64") ||
+ (target_os == "mac" && (target_cpu == "x64" || target_cpu == "arm64")) ||
+ (target_os == "win" &&
+ (target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm64"))
diff --git a/devel/electron28/files/patch-third__party_zlib_BUILD.gn b/devel/electron28/files/patch-third__party_zlib_BUILD.gn
new file mode 100644
index 000000000000..9fec3a007d1e
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_zlib_BUILD.gn
@@ -0,0 +1,31 @@
+--- third_party/zlib/BUILD.gn.orig 2023-10-25 09:13:45 UTC
++++ third_party/zlib/BUILD.gn
+@@ -127,7 +127,7 @@ if (use_arm_neon_optimizations) {
+ defines = [ "CRC32_ARMV8_CRC32" ]
+ if (is_android) {
+ defines += [ "ARMV8_OS_ANDROID" ]
+- } else if (is_linux || is_chromeos) {
++ } else if ((is_linux || is_chromeos) && !is_bsd) {
+ defines += [ "ARMV8_OS_LINUX" ]
+ } else if (is_mac) {
+ defines += [ "ARMV8_OS_MACOS" ]
+@@ -137,6 +137,10 @@ if (use_arm_neon_optimizations) {
+ defines += [ "ARMV8_OS_FUCHSIA" ]
+ } else if (is_win) {
+ defines += [ "ARMV8_OS_WINDOWS" ]
++ } else if (is_openbsd) {
++ defines += [ "ARMV8_OS_OPENBSD" ]
++ } else if (is_freebsd) {
++ defines += [ "ARMV8_OS_FREEBSD" ]
+ } else {
+ assert(false, "Unsupported ARM OS")
+ }
+@@ -412,7 +416,7 @@ static_library("minizip") {
+ ]
+ }
+
+- if (is_apple || is_android || is_nacl) {
++ if (is_apple || is_android || is_nacl || is_bsd) {
+ # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
+ # use fopen, ftell, and fseek instead on these systems.
+ defines = [ "USE_FILE32API" ]
diff --git a/devel/electron28/files/patch-third__party_zlib_cpu__features.c b/devel/electron28/files/patch-third__party_zlib_cpu__features.c
new file mode 100644
index 000000000000..0e94c9c5be5e
--- /dev/null
+++ b/devel/electron28/files/patch-third__party_zlib_cpu__features.c
@@ -0,0 +1,51 @@
+--- third_party/zlib/cpu_features.c.orig 2023-10-19 19:59:19 UTC
++++ third_party/zlib/cpu_features.c
+@@ -35,7 +35,8 @@ int ZLIB_INTERNAL x86_cpu_enable_avx512 = 0;
+
+ #ifndef CPU_NO_SIMD
+
+-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(ARMV8_OS_IOS)
++#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(ARMV8_OS_IOS) || \
++ defined(ARMV8_OS_OPENBSD) || defined(ARMV8_OS_FREEBSD)
+ #include <pthread.h>
+ #endif
+
+@@ -52,6 +53,10 @@ int ZLIB_INTERNAL x86_cpu_enable_avx512 = 0;
+ #include <windows.h>
+ #elif defined(ARMV8_OS_IOS)
+ #include <sys/sysctl.h>
++#elif defined(ARMV8_OS_OPENBSD)
++#include <sys/sysctl.h>
++#include <machine/cpu.h>
++#include <machine/armreg.h>
+ #elif !defined(_MSC_VER)
+ #include <pthread.h>
+ #else
+@@ -62,7 +67,8 @@ int ZLIB_INTERNAL x86_cpu_enable_avx512 = 0;
+ static void _cpu_check_features(void);
+ #endif
+
+-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_MACOS) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS) || defined(ARMV8_OS_IOS)
++#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_MACOS) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS) || defined(ARMV8_OS_IOS) || \
++ defined(ARMV8_OS_OPENBSD) || defined(ARMV8_OS_FREEBSD)
+ #if !defined(ARMV8_OS_MACOS)
+ // _cpu_check_features() doesn't need to do anything on mac/arm since all
+ // features are known at build time, so don't call it.
+@@ -115,6 +121,17 @@ static void _cpu_check_features(void)
+ unsigned long features = getauxval(AT_HWCAP2);
+ arm_cpu_enable_crc32 = !!(features & HWCAP2_CRC32);
+ arm_cpu_enable_pmull = !!(features & HWCAP2_PMULL);
++#elif defined(ARMV8_OS_OPENBSD)
++ int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 };
++ uint64_t cpu_id = 0;
++ size_t len = sizeof(cpu_id);
++ if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0)
++ return;
++ if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_AES_PMULL)
++ arm_cpu_enable_pmull = 1;
++
++ if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_CRC32_BASE)
++ arm_cpu_enable_crc32 = 1;
+ #elif defined(ARMV8_OS_FUCHSIA)
+ uint32_t features;
+ zx_status_t rc = zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);
diff --git a/devel/electron28/files/patch-tools_generate__shim__headers_generate__shim__headers.py b/devel/electron28/files/patch-tools_generate__shim__headers_generate__shim__headers.py
new file mode 100644
index 000000000000..89fc16651819
--- /dev/null
+++ b/devel/electron28/files/patch-tools_generate__shim__headers_generate__shim__headers.py
@@ -0,0 +1,21 @@
+--- tools/generate_shim_headers/generate_shim_headers.py.orig 2023-05-25 00:42:52 UTC
++++ tools/generate_shim_headers/generate_shim_headers.py
+@@ -18,7 +18,7 @@ import sys
+
+
+ SHIM_TEMPLATE = """
+-#if defined(OFFICIAL_BUILD)
++#if defined(GOOGLE_CHROME_BUILD)
+ #error shim headers must not be used in official builds!
+ #endif
+ """
+@@ -65,6 +65,9 @@ def GeneratorMain(argv):
+ if options.outputs:
+ yield os.path.join(target_directory, header_filename)
+ if options.generate:
++ source_file = os.path.join(root, header_filename)
++ if os.path.exists(source_file):
++ os.unlink(source_file)
+ header_path = os.path.join(target_directory, header_filename)
+ header_dir = os.path.dirname(header_path)
+ if not os.path.exists(header_dir):
diff --git a/devel/electron28/files/patch-tools_generate__stubs_rules.gni b/devel/electron28/files/patch-tools_generate__stubs_rules.gni
new file mode 100644
index 000000000000..a3e779c1b0a6
--- /dev/null
+++ b/devel/electron28/files/patch-tools_generate__stubs_rules.gni
@@ -0,0 +1,10 @@
+--- tools/generate_stubs/rules.gni.orig 2022-08-31 12:19:35 UTC
++++ tools/generate_stubs/rules.gni
+@@ -110,7 +110,6 @@ template("generate_stubs") {
+ "${target_gen_dir}/${invoker.output_name}.cc",
+ "${target_gen_dir}/${invoker.output_name}.h",
+ ]
+- libs = [ "dl" ]
+ include_dirs = [ target_gen_dir ]
+ if (defined(invoker.configs)) {
+ configs += invoker.configs
diff --git a/devel/electron28/files/patch-tools_gn_build_build__linux.ninja.template b/devel/electron28/files/patch-tools_gn_build_build__linux.ninja.template
new file mode 100644
index 000000000000..2636120143e8
--- /dev/null
+++ b/devel/electron28/files/patch-tools_gn_build_build__linux.ninja.template
@@ -0,0 +1,11 @@
+--- tools/gn/build/build_linux.ninja.template.orig 2022-02-07 13:39:41 UTC
++++ tools/gn/build/build_linux.ninja.template
+@@ -5,7 +5,7 @@ rule cxx
+ deps = gcc
+
+ rule alink_thin
+- command = rm -f $out && $ar rcsT $out $in
++ command = rm -f $out && $ar rcs $out $in
+ description = AR $out
+
+ rule link
diff --git a/devel/electron28/files/patch-tools_gn_build_gen.py b/devel/electron28/files/patch-tools_gn_build_gen.py
new file mode 100644
index 000000000000..15aa414c3785
--- /dev/null
+++ b/devel/electron28/files/patch-tools_gn_build_gen.py
@@ -0,0 +1,34 @@
+--- tools/gn/build/gen.py.orig 2023-10-19 20:09:27 UTC
++++ tools/gn/build/gen.py
+@@ -94,6 +94,12 @@ class Platform(object):
+ def is_solaris(self):
+ return self._platform == 'solaris'
+
++ def is_openbsd(self):
++ return self._platform == 'openbsd'
++
++ def is_freebsd(self):
++ return self._platform == 'freebsd'
++
+ def is_posix(self):
+ return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris', 'msys', 'netbsd', 'serenity']
+
+@@ -288,7 +294,7 @@ def WriteGenericNinja(path, static_libraries, executab
+ 'linux': 'build_linux.ninja.template',
+ 'freebsd': 'build_linux.ninja.template',
+ 'aix': 'build_aix.ninja.template',
+- 'openbsd': 'build_openbsd.ninja.template',
++ 'openbsd': 'build_linux.ninja.template',
+ 'haiku': 'build_haiku.ninja.template',
+ 'solaris': 'build_linux.ninja.template',
+ 'netbsd': 'build_linux.ninja.template',
+@@ -512,6 +518,9 @@ def WriteGNNinja(path, platform, host, options, args_l
+
+ if platform.is_posix() and not platform.is_haiku():
+ ldflags.append('-pthread')
++
++ if platform.is_openbsd():
++ libs.append('-lkvm')
+
+ if platform.is_mingw() or platform.is_msys():
+ cflags.extend(['-DUNICODE',
diff --git a/devel/electron28/files/patch-tools_gn_src_base_files_file__posix.cc b/devel/electron28/files/patch-tools_gn_src_base_files_file__posix.cc
new file mode 100644
index 000000000000..de2fe5444183
--- /dev/null
+++ b/devel/electron28/files/patch-tools_gn_src_base_files_file__posix.cc
@@ -0,0 +1,11 @@
+--- tools/gn/src/base/files/file_posix.cc.orig 2022-09-24 10:57:32 UTC
++++ tools/gn/src/base/files/file_posix.cc
+@@ -371,7 +371,7 @@ void File::DoInitialize(const FilePath& path, uint32_t
+ bool File::Flush() {
+ DCHECK(IsValid());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return !HANDLE_EINTR(fdatasync(file_.get()));
+ #else
+ return !HANDLE_EINTR(fsync(file_.get()));
diff --git a/devel/electron28/files/patch-tools_gn_src_gn_version.h b/devel/electron28/files/patch-tools_gn_src_gn_version.h
new file mode 100644
index 000000000000..a3c6f07d4a48
--- /dev/null
+++ b/devel/electron28/files/patch-tools_gn_src_gn_version.h
@@ -0,0 +1,15 @@
+--- tools/gn/src/gn/version.h.orig 2021-09-14 02:05:25 UTC
++++ tools/gn/src/gn/version.h
+@@ -22,9 +22,9 @@ class Version {
+
+ static std::optional<Version> FromString(std::string s);
+
+- int major() const { return major_; }
+- int minor() const { return minor_; }
+- int patch() const { return patch_; }
++ int gmajor() const { return major_; }
++ int gminor() const { return minor_; }
++ int gpatch() const { return patch_; }
+
+ bool operator==(const Version& other) const;
+ bool operator<(const Version& other) const;
diff --git a/devel/electron28/files/patch-tools_gn_src_util_exe__path.cc b/devel/electron28/files/patch-tools_gn_src_util_exe__path.cc
new file mode 100644
index 000000000000..54f6fb40afea
--- /dev/null
+++ b/devel/electron28/files/patch-tools_gn_src_util_exe__path.cc
@@ -0,0 +1,90 @@
+--- tools/gn/src/util/exe_path.cc.orig 2022-02-07 13:39:41 UTC
++++ tools/gn/src/util/exe_path.cc
+@@ -15,7 +15,7 @@
+ #include <windows.h>
+
+ #include "base/win/win_util.h"
+-#elif defined(OS_FREEBSD) || defined(OS_NETBSD)
++#elif defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD)
+ #include <limits.h>
+ #include <sys/sysctl.h>
+ #include <sys/types.h>
+@@ -26,6 +26,10 @@
+ #include <stdlib.h>
+ #endif
+
++#if defined(OS_OPENBSD)
++#include <kvm.h>
++#endif
++
+ #if defined(OS_MACOSX)
+
+ base::FilePath GetExePath() {
+@@ -102,6 +106,67 @@ base::FilePath GetExePath() {
+ return base::FilePath();
+ }
+ return base::FilePath(raw);
++}
++
++#elif defined(OS_OPENBSD)
++
++base::FilePath GetExePath() {
++ struct kinfo_file *files;
++ kvm_t *kd = NULL;
++ char errbuf[_POSIX2_LINE_MAX];
++ char **retvalargs;
++#define MAXTOKENS 2
++ char *tokens[MAXTOKENS];
++ static char retval[PATH_MAX];
++ int cnt;
++ size_t len;
++ struct stat sb;
++ pid_t cpid = getpid();
++
++ int mib[] = { CTL_KERN, KERN_PROC_ARGS, cpid, KERN_PROC_ARGV };
++
++ if (sysctl(mib, 4, NULL, &len, NULL, 0) != -1) {
++ retvalargs = static_cast<char**>(malloc(len));
++ if (!retvalargs)
++ goto out;
++
++ if (sysctl(mib, 4, retvalargs, &len, NULL, 0) < 0)
++ goto out;
++
++ char *cr = strdup(retvalargs[0]);
++ free(retvalargs);
++
++ *tokens = strtok(cr, ":");
++ if (tokens[0] == NULL)
++ goto out;
++
++ if (realpath(tokens[0], retval) == NULL)
++ goto out;
++
++ if (stat(retval, &sb) < 0)
++ goto out;
++
++ if ((kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf)) == NULL)
++ goto out;
++
++ if ((files = kvm_getfiles(kd, KERN_FILE_BYPID, cpid,
++ sizeof(struct kinfo_file), &cnt)) == NULL) {
++ kvm_close(kd);
++ goto out;
++ }
++
++ for (int i = 0; i < cnt; i++) {
++ if (files[i].fd_fd == KERN_FILE_TEXT &&
++ files[i].va_fsid == static_cast<uint32_t>(sb.st_dev) &&
++ files[i].va_fileid == sb.st_ino) {
++ kvm_close(kd);
++ return base::FilePath(retval);
++ }
++ }
++ }
++
++out:
++ return base::FilePath();
+ }
+
+ #elif defined(OS_ZOS)
diff --git a/devel/electron28/files/patch-tools_json__schema__compiler_cpp__bundle__generator.py b/devel/electron28/files/patch-tools_json__schema__compiler_cpp__bundle__generator.py
new file mode 100644
index 000000000000..e9c8ef278ef8
--- /dev/null
+++ b/devel/electron28/files/patch-tools_json__schema__compiler_cpp__bundle__generator.py
@@ -0,0 +1,11 @@
+--- tools/json_schema_compiler/cpp_bundle_generator.py.orig 2023-03-30 00:34:17 UTC
++++ tools/json_schema_compiler/cpp_bundle_generator.py
+@@ -149,7 +149,7 @@ class CppBundleGenerator(object):
+ # BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(IS_CHROMEOS_LACROS).
+ ifdefs.append('BUILDFLAG(IS_CHROMEOS_LACROS)')
+ elif platform == Platforms.LINUX:
+- ifdefs.append('BUILDFLAG(IS_LINUX)')
++ ifdefs.append('BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)')
+ elif platform == Platforms.MAC:
+ ifdefs.append('BUILDFLAG(IS_MAC)')
+ elif platform == Platforms.WIN:
diff --git a/devel/electron28/files/patch-tools_json__schema__compiler_feature__compiler.py b/devel/electron28/files/patch-tools_json__schema__compiler_feature__compiler.py
new file mode 100644
index 000000000000..730a0e9cd269
--- /dev/null
+++ b/devel/electron28/files/patch-tools_json__schema__compiler_feature__compiler.py
@@ -0,0 +1,11 @@
+--- tools/json_schema_compiler/feature_compiler.py.orig 2023-05-25 00:42:52 UTC
++++ tools/json_schema_compiler/feature_compiler.py
+@@ -272,6 +272,8 @@ FEATURE_GRAMMAR = ({
+ 'linux': 'Feature::LINUX_PLATFORM',
+ 'mac': 'Feature::MACOSX_PLATFORM',
+ 'win': 'Feature::WIN_PLATFORM',
++ 'openbsd': 'Feature::LINUX_PLATFORM',
++ 'freebsd': 'Feature::LINUX_PLATFORM',
+ }
+ }
+ },
diff --git a/devel/electron28/files/patch-tools_memory_partition__allocator_inspect__utils.h b/devel/electron28/files/patch-tools_memory_partition__allocator_inspect__utils.h
new file mode 100644
index 000000000000..fd50a70e6715
--- /dev/null
+++ b/devel/electron28/files/patch-tools_memory_partition__allocator_inspect__utils.h
@@ -0,0 +1,11 @@
+--- tools/memory/partition_allocator/inspect_utils.h.orig 2022-06-17 14:20:10 UTC
++++ tools/memory/partition_allocator/inspect_utils.h
+@@ -60,7 +60,7 @@ class RemoteProcessMemoryReader {
+ const pid_t pid_;
+ bool is_valid_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::ScopedFD mem_fd_;
+ #elif BUILDFLAG(IS_MAC)
+ task_t task_;
diff --git a/devel/electron28/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn b/devel/electron28/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
new file mode 100644
index 000000000000..544ea920a8d4
--- /dev/null
+++ b/devel/electron28/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
@@ -0,0 +1,20 @@
+--- tools/perf/chrome_telemetry_build/BUILD.gn.orig 2023-11-29 21:40:43 UTC
++++ tools/perf/chrome_telemetry_build/BUILD.gn
+@@ -47,7 +47,7 @@ group("telemetry_chrome_test") {
+ data_deps += [ "//chrome:reorder_imports" ]
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+
+ # CrOS currently has issues with the locally compiled version of
+@@ -176,7 +176,7 @@ group("telemetry_chrome_test_without_chrome") {
+ ]
+
+ # Cr-Fuchsia doesn't support breakpad.
+- if (!is_win && !is_fuchsia) {
++ if (!is_win && !is_fuchsia && !is_bsd) {
+ data_deps += [
+ # This is defined for Windows, but is unused by Telemetry on
+ # Windows, and including it can have issues when cross-compiling
diff --git a/devel/electron28/files/patch-tools_protoc__wrapper_protoc__wrapper.py b/devel/electron28/files/patch-tools_protoc__wrapper_protoc__wrapper.py
new file mode 100644
index 000000000000..c27764f9a813
--- /dev/null
+++ b/devel/electron28/files/patch-tools_protoc__wrapper_protoc__wrapper.py
@@ -0,0 +1,24 @@
+--- tools/protoc_wrapper/protoc_wrapper.py.orig 2023-10-19 19:59:20 UTC
++++ tools/protoc_wrapper/protoc_wrapper.py
+@@ -179,15 +179,19 @@ def main(argv):
+ if not options.exclude_imports:
+ protoc_cmd += ["--include_imports"]
+
++ nenv = os.environ.copy()
++ nenv["PATH"] = "${WRKOBJDIR}/bin:" + nenv["PATH"]
++ nenv["LD_LIBRARY_PATH"] = "${WRKSRC}/out/Release"
++
+ dependency_file_data = None
+ if options.descriptor_set_out and options.descriptor_set_dependency_file:
+ protoc_cmd += ['--dependency_out', options.descriptor_set_dependency_file]
+- ret = subprocess.call(protoc_cmd)
++ ret = subprocess.call(protoc_cmd, env=nenv)
+
+ with open(options.descriptor_set_dependency_file, 'rb') as f:
+ dependency_file_data = f.read().decode('utf-8')
+
+- ret = subprocess.call(protoc_cmd)
++ ret = subprocess.call(protoc_cmd, env=nenv)
+ if ret != 0:
+ if ret <= -100:
+ # Windows error codes such as 0xC0000005 and 0xC0000409 are much easier to
diff --git a/devel/electron28/files/patch-tools_variations_fieldtrial__to__struct.py b/devel/electron28/files/patch-tools_variations_fieldtrial__to__struct.py
new file mode 100644
index 000000000000..17377bfe54f4
--- /dev/null
+++ b/devel/electron28/files/patch-tools_variations_fieldtrial__to__struct.py
@@ -0,0 +1,11 @@
+--- tools/variations/fieldtrial_to_struct.py.orig 2022-02-07 13:39:41 UTC
++++ tools/variations/fieldtrial_to_struct.py
+@@ -41,6 +41,8 @@ _platforms = [
+ 'linux',
+ 'mac',
+ 'windows',
++ 'openbsd',
++ 'freebsd',
+ ]
+
+ _form_factors = [
diff --git a/devel/electron28/files/patch-ui_aura_client_drag__drop__client.h b/devel/electron28/files/patch-ui_aura_client_drag__drop__client.h
new file mode 100644
index 000000000000..c6a6dfcc8b6a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_aura_client_drag__drop__client.h
@@ -0,0 +1,11 @@
+--- ui/aura/client/drag_drop_client.h.orig 2023-02-01 18:43:51 UTC
++++ ui/aura/client/drag_drop_client.h
+@@ -44,7 +44,7 @@ class AURA_EXPORT DragDropClient {
+ int allowed_operations,
+ ui::mojom::DragEventSource source) = 0;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Updates the drag image. An empty |image| may be used to hide a previously
+ // set non-empty drag image, and a non-empty |image| shows the drag image
+ // again if it was previously hidden.
diff --git a/devel/electron28/files/patch-ui_aura_screen__ozone.cc b/devel/electron28/files/patch-ui_aura_screen__ozone.cc
new file mode 100644
index 000000000000..8f060627c6d1
--- /dev/null
+++ b/devel/electron28/files/patch-ui_aura_screen__ozone.cc
@@ -0,0 +1,11 @@
+--- ui/aura/screen_ozone.cc.orig 2023-11-29 21:40:43 UTC
++++ ui/aura/screen_ozone.cc
+@@ -106,7 +106,7 @@ display::Display ScreenOzone::GetPrimaryDisplay() cons
+ return platform_screen_->GetPrimaryDisplay();
+ }
+
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone(
+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender)
+ : suspender_(std::move(suspender)) {}
diff --git a/devel/electron28/files/patch-ui_aura_screen__ozone.h b/devel/electron28/files/patch-ui_aura_screen__ozone.h
new file mode 100644
index 000000000000..7995b74dbab7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_aura_screen__ozone.h
@@ -0,0 +1,20 @@
+--- ui/aura/screen_ozone.h.orig 2023-11-29 21:40:43 UTC
++++ ui/aura/screen_ozone.h
+@@ -44,7 +44,7 @@ class AURA_EXPORT ScreenOzone : public display::Screen
+ display::Display GetDisplayMatching(
+ const gfx::Rect& match_rect) const override;
+ display::Display GetPrimaryDisplay() const override;
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<display::Screen::ScreenSaverSuspender> SuspendScreenSaver()
+ override;
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+@@ -71,7 +71,7 @@ class AURA_EXPORT ScreenOzone : public display::Screen
+ ui::PlatformScreen* platform_screen() { return platform_screen_.get(); }
+
+ private:
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class ScreenSaverSuspenderOzone
+ : public display::Screen::ScreenSaverSuspender {
+ public:
diff --git a/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.cc b/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.cc
new file mode 100644
index 000000000000..96381b948f79
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.cc
@@ -0,0 +1,11 @@
+--- ui/base/clipboard/clipboard_constants.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/clipboard/clipboard_constants.cc
+@@ -25,7 +25,7 @@ const char kMimeTypeWindowDrag[] = "chromium/x-window-
+ // Used for window dragging on some platforms.
+ const char kMimeTypeWindowDrag[] = "chromium/x-window-drag";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ const char kMimeTypeLinuxUtf8String[] = "UTF8_STRING";
+ const char kMimeTypeLinuxString[] = "STRING";
+ const char kMimeTypeLinuxText[] = "TEXT";
diff --git a/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.h b/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.h
new file mode 100644
index 000000000000..5461d6e0dbb5
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_clipboard_clipboard__constants.h
@@ -0,0 +1,11 @@
+--- ui/base/clipboard/clipboard_constants.h.orig 2023-11-29 21:40:44 UTC
++++ ui/base/clipboard/clipboard_constants.h
+@@ -48,7 +48,7 @@ extern const char kMimeTypeDataTransferEndpoint[];
+
+ // ----- LINUX & CHROMEOS & FUCHSIA MIME TYPES -----
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
+ extern const char kMimeTypeLinuxUtf8String[];
+ COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
diff --git a/devel/electron28/files/patch-ui_base_clipboard_clipboard__non__backed.cc b/devel/electron28/files/patch-ui_base_clipboard_clipboard__non__backed.cc
new file mode 100644
index 000000000000..f7c504f38bf9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_clipboard_clipboard__non__backed.cc
@@ -0,0 +1,11 @@
+--- ui/base/clipboard/clipboard_non_backed.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/clipboard/clipboard_non_backed.cc
+@@ -459,7 +459,7 @@ ClipboardNonBacked::ClipboardNonBacked() {
+ // so create internal clipboards for platform supported clipboard buffers.
+ constexpr ClipboardBuffer kClipboardBuffers[] = {
+ ClipboardBuffer::kCopyPaste,
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ ClipboardBuffer::kSelection,
+ #endif
+ #if BUILDFLAG(IS_MAC)
diff --git a/devel/electron28/files/patch-ui_base_cursor_cursor__factory.cc b/devel/electron28/files/patch-ui_base_cursor_cursor__factory.cc
new file mode 100644
index 000000000000..10626614c04e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_cursor_cursor__factory.cc
@@ -0,0 +1,11 @@
+--- ui/base/cursor/cursor_factory.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/base/cursor/cursor_factory.cc
+@@ -98,7 +98,7 @@ void CursorFactory::ObserveThemeChanges() {
+ NOTIMPLEMENTED();
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+
+ // Returns a cursor name compatible with either X11 or the FreeDesktop.org
+ // cursor spec ([1] and [2]), followed by fallbacks that can work as
diff --git a/devel/electron28/files/patch-ui_base_cursor_cursor__factory.h b/devel/electron28/files/patch-ui_base_cursor_cursor__factory.h
new file mode 100644
index 000000000000..e7cc32bce26e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_cursor_cursor__factory.h
@@ -0,0 +1,11 @@
+--- ui/base/cursor/cursor_factory.h.orig 2023-10-19 19:59:21 UTC
++++ ui/base/cursor/cursor_factory.h
+@@ -93,7 +93,7 @@ class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorFactory {
+ base::ObserverList<CursorFactoryObserver>::Unchecked observers_;
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(UI_BASE_CURSOR)
+ std::vector<std::string> CursorNamesFromType(mojom::CursorType type);
+ #endif
diff --git a/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc b/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc
new file mode 100644
index 000000000000..6726b649d956
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc
@@ -0,0 +1,20 @@
+--- ui/base/dragdrop/os_exchange_data_provider_factory.cc.orig 2022-02-28 16:54:41 UTC
++++ ui/base/dragdrop/os_exchange_data_provider_factory.cc
+@@ -7,7 +7,7 @@
+ #include "base/notreached.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ #include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
+ #include "ui/base/dragdrop/os_exchange_data_provider_non_backed.h"
+ #elif BUILDFLAG(IS_APPLE)
+@@ -21,7 +21,7 @@ namespace ui {
+ // static
+ std::unique_ptr<OSExchangeDataProvider>
+ OSExchangeDataProviderFactory::CreateProvider() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The instance can be nullptr in tests that do not instantiate the platform,
+ // or on platforms that do not implement specific drag'n'drop. For them,
+ // falling back to the Aura provider should be fine.
diff --git a/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__non__backed.cc b/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__non__backed.cc
new file mode 100644
index 000000000000..5a0e5c5cae37
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_dragdrop_os__exchange__data__provider__non__backed.cc
@@ -0,0 +1,11 @@
+--- ui/base/dragdrop/os_exchange_data_provider_non_backed.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
+@@ -96,7 +96,7 @@ bool OSExchangeDataProviderNonBacked::GetString(std::u
+ }
+
+ bool OSExchangeDataProviderNonBacked::GetString(std::u16string* data) const {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (HasFile()) {
+ // Various Linux file managers both pass a list of file:// URIs and set the
+ // string representation to the URI. We explicitly don't want to return use
diff --git a/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.cc b/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.cc
new file mode 100644
index 000000000000..0a400c2d5ac9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.cc
@@ -0,0 +1,11 @@
+--- ui/base/ime/dummy_text_input_client.cc.orig 2022-10-24 13:33:33 UTC
++++ ui/base/ime/dummy_text_input_client.cc
+@@ -159,7 +159,7 @@ bool DummyTextInputClient::ShouldDoLearning() {
+ return false;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool DummyTextInputClient::SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
diff --git a/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.h b/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.h
new file mode 100644
index 000000000000..fd686d8daf7d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_dummy__text__input__client.h
@@ -0,0 +1,11 @@
+--- ui/base/ime/dummy_text_input_client.h.orig 2022-08-31 12:19:35 UTC
++++ ui/base/ime/dummy_text_input_client.h
+@@ -65,7 +65,7 @@ class DummyTextInputClient : public TextInputClient {
+ ukm::SourceId GetClientSourceForMetrics() const override;
+ bool ShouldDoLearning() override;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
diff --git a/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.cc b/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.cc
new file mode 100644
index 000000000000..fc85a7a27c73
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.cc
@@ -0,0 +1,11 @@
+--- ui/base/ime/fake_text_input_client.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/base/ime/fake_text_input_client.cc
+@@ -171,7 +171,7 @@ bool FakeTextInputClient::ShouldDoLearning() {
+ return false;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool FakeTextInputClient::SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
diff --git a/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.h b/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.h
new file mode 100644
index 000000000000..cc875106658d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_fake__text__input__client.h
@@ -0,0 +1,11 @@
+--- ui/base/ime/fake_text_input_client.h.orig 2023-10-19 19:59:21 UTC
++++ ui/base/ime/fake_text_input_client.h
+@@ -74,7 +74,7 @@ class FakeTextInputClient : public TextInputClient {
+ void SetTextEditCommandForNextKeyEvent(TextEditCommand command) override;
+ ukm::SourceId GetClientSourceForMetrics() const override;
+ bool ShouldDoLearning() override;
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
diff --git a/devel/electron28/files/patch-ui_base_ime_linux_linux__input__method__context__factory.cc b/devel/electron28/files/patch-ui_base_ime_linux_linux__input__method__context__factory.cc
new file mode 100644
index 000000000000..1c1f6204ed93
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_linux_linux__input__method__context__factory.cc
@@ -0,0 +1,20 @@
+--- ui/base/ime/linux/linux_input_method_context_factory.cc.orig 2022-09-27 14:30:33 UTC
++++ ui/base/ime/linux/linux_input_method_context_factory.cc
+@@ -9,7 +9,7 @@
+ #include "build/build_config.h"
+ #include "ui/base/ime/linux/fake_input_method_context.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #include "ui/linux/linux_ui_delegate.h"
+ #endif
+@@ -32,7 +32,7 @@ std::unique_ptr<LinuxInputMethodContext> CreateLinuxIn
+ if (auto factory = GetInputMethodContextFactoryForTest())
+ return factory.Run(delegate);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Give the toolkit a chance to create the context.
+ if (auto* linux_ui = LinuxUi::instance()) {
+ if (auto context = linux_ui->CreateInputMethodContext(delegate))
diff --git a/devel/electron28/files/patch-ui_base_ime_text__input__client.h b/devel/electron28/files/patch-ui_base_ime_text__input__client.h
new file mode 100644
index 000000000000..d0390420903c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ime_text__input__client.h
@@ -0,0 +1,11 @@
+--- ui/base/ime/text_input_client.h.orig 2023-08-10 01:49:09 UTC
++++ ui/base/ime/text_input_client.h
+@@ -265,7 +265,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient
+ // fields that are considered 'private' (e.g. in incognito tabs).
+ virtual bool ShouldDoLearning() = 0;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Start composition over a given UTF-16 code range from existing text. This
+ // should only be used for composition scenario when IME wants to start
+ // composition on existing text. Returns whether the operation was successful.
diff --git a/devel/electron28/files/patch-ui_base_resource_resource__bundle.cc b/devel/electron28/files/patch-ui_base_resource_resource__bundle.cc
new file mode 100644
index 000000000000..d4dbfd90c95d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_resource_resource__bundle.cc
@@ -0,0 +1,11 @@
+--- ui/base/resource/resource_bundle.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/resource/resource_bundle.cc
+@@ -925,7 +925,7 @@ ResourceScaleFactor ResourceBundle::GetMaxResourceScal
+ }
+
+ ResourceScaleFactor ResourceBundle::GetMaxResourceScaleFactor() const {
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return max_scale_factor_;
+ #else
+ return GetMaxSupportedResourceScaleFactor();
diff --git a/devel/electron28/files/patch-ui_base_test_skia__gold__pixel__diff.cc b/devel/electron28/files/patch-ui_base_test_skia__gold__pixel__diff.cc
new file mode 100644
index 000000000000..12096619265b
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_test_skia__gold__pixel__diff.cc
@@ -0,0 +1,11 @@
+--- ui/base/test/skia_gold_pixel_diff.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/base/test/skia_gold_pixel_diff.cc
+@@ -115,7 +115,7 @@ const char* GetPlatformName() {
+ return "macOS";
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return "linux";
+ #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+ return "lacros";
diff --git a/devel/electron28/files/patch-ui_base_test_ui__controls.h b/devel/electron28/files/patch-ui_base_test_ui__controls.h
new file mode 100644
index 000000000000..7e3d4401487d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_test_ui__controls.h
@@ -0,0 +1,11 @@
+--- ui/base/test/ui_controls.h.orig 2023-11-29 21:40:44 UTC
++++ ui/base/test/ui_controls.h
+@@ -183,7 +183,7 @@ bool SendTouchEventsNotifyWhenDone(int action,
+ base::OnceClosure task);
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Forces the platform implementation to use screen coordinates, even if they're
+ // not really available, the next time that ui_controls::SendMouseMove() or
+ // ui_controls::SendMouseMoveNotifyWhenDone() is called, or some other method
diff --git a/devel/electron28/files/patch-ui_base_ui__base__features.cc b/devel/electron28/files/patch-ui_base_ui__base__features.cc
new file mode 100644
index 000000000000..d646bdf4baae
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ui__base__features.cc
@@ -0,0 +1,20 @@
+--- ui/base/ui_base_features.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/ui_base_features.cc
+@@ -224,7 +224,7 @@ BASE_FEATURE(kExperimentalFlingAnimation,
+ "ExperimentalFlingAnimation",
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_WIN) || \
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_ASH) && \
+ !BUILDFLAG(IS_CHROMEOS_LACROS))
+ base::FEATURE_ENABLED_BY_DEFAULT
+@@ -337,7 +337,7 @@ BASE_FEATURE(kEyeDropper,
+ BASE_FEATURE(kEyeDropper,
+ "EyeDropper",
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+- BUILDFLAG(IS_CHROMEOS)
++ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-ui_base_ui__base__switches.cc b/devel/electron28/files/patch-ui_base_ui__base__switches.cc
new file mode 100644
index 000000000000..e2f55890a9a2
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ui__base__switches.cc
@@ -0,0 +1,18 @@
+--- ui/base/ui_base_switches.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/base/ui_base_switches.cc
+@@ -31,13 +31,13 @@ const char kShowMacOverlayBorders[] = "show-mac-overla
+ const char kEnableResourcesFileSharing[] = "enable-resources-file-sharing";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Specifies system font family name. Improves determenism when rendering
+ // pages in headless mode.
+ const char kSystemFontFamily[] = "system-font-family";
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Specify the toolkit used to construct the Linux GUI.
+ const char kUiToolkitFlag[] = "ui-toolkit";
+ #endif
diff --git a/devel/electron28/files/patch-ui_base_ui__base__switches.h b/devel/electron28/files/patch-ui_base_ui__base__switches.h
new file mode 100644
index 000000000000..a49665c21424
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ui__base__switches.h
@@ -0,0 +1,16 @@
+--- ui/base/ui_base_switches.h.orig 2023-10-19 19:59:21 UTC
++++ ui/base/ui_base_switches.h
+@@ -27,11 +27,11 @@ COMPONENT_EXPORT(UI_BASE) extern const char kShowMacOv
+ COMPONENT_EXPORT(UI_BASE) extern const char kEnableResourcesFileSharing[];
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(UI_BASE) extern const char kSystemFontFamily[];
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(UI_BASE) extern const char kUiToolkitFlag[];
+ #endif
+
diff --git a/devel/electron28/files/patch-ui_base_ui__base__types.h b/devel/electron28/files/patch-ui_base_ui__base__types.h
new file mode 100644
index 000000000000..9b6073d67093
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_ui__base__types.h
@@ -0,0 +1,11 @@
+--- ui/base/ui_base_types.h.orig 2022-11-30 08:12:58 UTC
++++ ui/base/ui_base_types.h
+@@ -32,7 +32,7 @@ enum WindowShowState {
+ SHOW_STATE_END = 6 // The end of show state enum.
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Specifies which edges of the window are tiled.
+ //
+ // Wayland can notify the application if certain edge of the window is
diff --git a/devel/electron28/files/patch-ui_base_webui_web__ui__util.cc b/devel/electron28/files/patch-ui_base_webui_web__ui__util.cc
new file mode 100644
index 000000000000..77407639d384
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_webui_web__ui__util.cc
@@ -0,0 +1,20 @@
+--- ui/base/webui/web_ui_util.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/webui/web_ui_util.cc
+@@ -38,7 +38,7 @@ std::string GetFontFamilyMd() {
+ constexpr float kMaxScaleFactor = 1000.0f;
+
+ std::string GetFontFamilyMd() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return "Roboto, " + GetFontFamily();
+ #else
+ return GetFontFamily();
+@@ -216,7 +216,7 @@ std::string GetFontFamily() {
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ std::string font_name = ui::ResourceBundle::GetSharedInstance()
+ .GetFont(ui::ResourceBundle::BaseFont)
+ .GetFontName();
diff --git a/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.cc b/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.cc
new file mode 100644
index 000000000000..d6e46bf73bcf
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.cc
@@ -0,0 +1,20 @@
+--- ui/base/x/x11_cursor_factory.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/x/x11_cursor_factory.cc
+@@ -13,7 +13,7 @@
+ #include "ui/gfx/geometry/point.h"
+ #include "ui/gfx/x/connection.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -70,7 +70,7 @@ void X11CursorFactory::ObserveThemeChanges() {
+ }
+
+ void X11CursorFactory::ObserveThemeChanges() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* linux_ui = LinuxUi::instance();
+ DCHECK(linux_ui);
+ cursor_theme_observation_.Observe(linux_ui);
diff --git a/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.h b/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.h
new file mode 100644
index 000000000000..423bdd6d0ae1
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_x_x11__cursor__factory.h
@@ -0,0 +1,20 @@
+--- ui/base/x/x11_cursor_factory.h.orig 2023-11-29 21:40:44 UTC
++++ ui/base/x/x11_cursor_factory.h
+@@ -20,7 +20,7 @@ class XCursorLoader;
+ class X11Cursor;
+ class XCursorLoader;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class LinuxUi;
+ #endif
+
+@@ -62,7 +62,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11CursorFactory
+ // initializing `cursor_loader_` will modify `default_cursors_`.
+ std::unique_ptr<XCursorLoader> cursor_loader_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::ScopedObservation<LinuxUi, CursorThemeManagerObserver>
+ cursor_theme_observation_{this};
+ #endif
diff --git a/devel/electron28/files/patch-ui_base_x_x11__cursor__loader.cc b/devel/electron28/files/patch-ui_base_x_x11__cursor__loader.cc
new file mode 100644
index 000000000000..e5b9c34a58ac
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_x_x11__cursor__loader.cc
@@ -0,0 +1,41 @@
+--- ui/base/x/x11_cursor_loader.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/x/x11_cursor_loader.cc
+@@ -32,7 +32,7 @@
+ #include "ui/gfx/x/xproto.h"
+ #include "ui/gfx/x/xproto_util.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -138,7 +138,11 @@ std::string CursorPathFromLibXcursor() {
+ void operator()(void* ptr) const { dlclose(ptr); }
+ };
+
++#if BUILDFLAG(IS_BSD)
++ std::unique_ptr<void, DlCloser> lib(dlopen("libXcursor.so", RTLD_LAZY));
++#else
+ std::unique_ptr<void, DlCloser> lib(dlopen("libXcursor.so.1", RTLD_LAZY));
++#endif
+ if (!lib)
+ return "";
+
+@@ -249,7 +253,7 @@ scoped_refptr<base::RefCountedMemory> ReadCursorFile(
+ const std::string& rm_xcursor_theme) {
+ constexpr const char kDefaultTheme[] = "default";
+ std::string themes[] = {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The toolkit theme has the highest priority.
+ LinuxUi::instance() ? LinuxUi::instance()->GetCursorThemeName()
+ : std::string(),
+@@ -448,7 +452,7 @@ uint32_t XCursorLoader::GetPreferredCursorSize() const
+ return size;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Let the toolkit have the next say.
+ auto* linux_ui = LinuxUi::instance();
+ size = linux_ui ? linux_ui->GetCursorThemeSize() : 0;
diff --git a/devel/electron28/files/patch-ui_base_x_x11__display__manager.cc b/devel/electron28/files/patch-ui_base_x_x11__display__manager.cc
new file mode 100644
index 000000000000..bb5f7cf53df6
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_x_x11__display__manager.cc
@@ -0,0 +1,20 @@
+--- ui/base/x/x11_display_manager.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/base/x/x11_display_manager.cc
+@@ -15,7 +15,7 @@
+ #include "ui/gfx/x/x11_atom_cache.h"
+ #include "ui/gfx/x/xproto.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -91,7 +91,7 @@ void XDisplayManager::FetchDisplayList() {
+ ? display::Display::GetForcedDeviceScaleFactor()
+ : 1.0f};
+ const auto* display_config = &empty_display_config;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (const auto* linux_ui = ui::LinuxUi::instance()) {
+ display_config = &linux_ui->display_config();
+ }
diff --git a/devel/electron28/files/patch-ui_base_x_x11__shm__image__pool.cc b/devel/electron28/files/patch-ui_base_x_x11__shm__image__pool.cc
new file mode 100644
index 000000000000..354859f6f25f
--- /dev/null
+++ b/devel/electron28/files/patch-ui_base_x_x11__shm__image__pool.cc
@@ -0,0 +1,53 @@
+--- ui/base/x/x11_shm_image_pool.cc.orig 2023-03-30 00:34:18 UTC
++++ ui/base/x/x11_shm_image_pool.cc
+@@ -16,6 +16,7 @@
+ #include "base/functional/callback.h"
+ #include "base/location.h"
+ #include "base/strings/string_util.h"
++#include "base/system/sys_info.h"
+ #include "build/build_config.h"
+ #include "build/chromeos_buildflags.h"
+ #include "net/base/url_util.h"
+@@ -45,10 +46,14 @@ constexpr float kShmResizeShrinkThreshold =
+ 1.0f / (kShmResizeThreshold * kShmResizeThreshold);
+
+ std::size_t MaxShmSegmentSizeImpl() {
++#if BUILDFLAG(IS_BSD)
++ return base::SysInfo::MaxSharedMemorySize();
++#else
+ struct shminfo info;
+ if (shmctl(0, IPC_INFO, reinterpret_cast<struct shmid_ds*>(&info)) == -1)
+ return 0;
+ return info.shmmax;
++#endif
+ }
+
+ std::size_t MaxShmSegmentSize() {
+@@ -65,6 +70,9 @@ bool IsRemoteHost(const std::string& name) {
+ }
+
+ bool ShouldUseMitShm(x11::Connection* connection) {
++#if BUILDFLAG(IS_BSD)
++ return false;
++#endif
+ // MIT-SHM may be available on remote connetions, but it will be unusable. Do
+ // a best-effort check to see if the host is remote to disable the SHM
+ // codepath. It may be possible in contrived cases for there to be a
+@@ -183,7 +191,7 @@ bool XShmImagePool::Resize(const gfx::Size& pixel_size
+ shmctl(state.shmid, IPC_RMID, nullptr);
+ return false;
+ }
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, a shmid can still be attached after IPC_RMID if otherwise
+ // kept alive. Detach before XShmAttach to prevent a memory leak in case
+ // the process dies.
+@@ -202,7 +210,7 @@ bool XShmImagePool::Resize(const gfx::Size& pixel_size
+ return false;
+ state.shmseg = shmseg;
+ state.shmem_attached_to_server = true;
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ // The Linux-specific shmctl behavior above may not be portable, so we're
+ // forced to do IPC_RMID after the server has attached to the segment.
+ shmctl(state.shmid, IPC_RMID, nullptr);
diff --git a/devel/electron28/files/patch-ui_color_color__id.h b/devel/electron28/files/patch-ui_color_color__id.h
new file mode 100644
index 000000000000..eb0d808ff71c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_color_color__id.h
@@ -0,0 +1,11 @@
+--- ui/color/color_id.h.orig 2023-12-20 07:12:20 UTC
++++ ui/color/color_id.h
+@@ -611,7 +611,7 @@
+ E_CPONLY(kColorNativeColor6) \
+ E_CPONLY(kColorNativeBaseColor) \
+ E_CPONLY(kColorNativeSecondaryColor)
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #define PLATFORM_SPECIFIC_COLOR_IDS \
+ E_CPONLY(kColorNativeButtonBorder)\
+ E_CPONLY(kColorNativeHeaderButtonBorderActive) \
diff --git a/devel/electron28/files/patch-ui_color_color__provider__utils.cc b/devel/electron28/files/patch-ui_color_color__provider__utils.cc
new file mode 100644
index 000000000000..333d2eb9c407
--- /dev/null
+++ b/devel/electron28/files/patch-ui_color_color__provider__utils.cc
@@ -0,0 +1,11 @@
+--- ui/color/color_provider_utils.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/color/color_provider_utils.cc
+@@ -187,7 +187,7 @@ base::StringPiece SystemThemeName(ui::SystemTheme syst
+ switch (system_theme) {
+ case ui::SystemTheme::kDefault:
+ return "kDefault";
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ case ui::SystemTheme::kGtk:
+ return "kGtk";
+ case ui::SystemTheme::kQt:
diff --git a/devel/electron28/files/patch-ui_color_system__theme.h b/devel/electron28/files/patch-ui_color_system__theme.h
new file mode 100644
index 000000000000..e251684d8ee6
--- /dev/null
+++ b/devel/electron28/files/patch-ui_color_system__theme.h
@@ -0,0 +1,11 @@
+--- ui/color/system_theme.h.orig 2022-11-30 08:12:58 UTC
++++ ui/color/system_theme.h
+@@ -15,7 +15,7 @@ namespace ui {
+ enum class SystemTheme {
+ // Classic theme, used in the default or users' chosen theme.
+ kDefault = 0,
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ kGtk = 1,
+ kQt = 2,
+ kMaxValue = kQt,
diff --git a/devel/electron28/files/patch-ui_display_screen.cc b/devel/electron28/files/patch-ui_display_screen.cc
new file mode 100644
index 000000000000..c113f555157e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_display_screen.cc
@@ -0,0 +1,11 @@
+--- ui/display/screen.cc.orig 2022-10-24 13:33:33 UTC
++++ ui/display/screen.cc
+@@ -85,7 +85,7 @@ void Screen::SetDisplayForNewWindows(int64_t display_i
+ display_id_for_new_windows_ = display_id;
+ }
+
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ Screen::ScreenSaverSuspender::~ScreenSaverSuspender() = default;
+
+ std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
diff --git a/devel/electron28/files/patch-ui_display_screen.h b/devel/electron28/files/patch-ui_display_screen.h
new file mode 100644
index 000000000000..f6d686da70fa
--- /dev/null
+++ b/devel/electron28/files/patch-ui_display_screen.h
@@ -0,0 +1,20 @@
+--- ui/display/screen.h.orig 2023-02-01 18:43:51 UTC
++++ ui/display/screen.h
+@@ -131,7 +131,7 @@ class DISPLAY_EXPORT Screen {
+ // (both of which may or may not be `nearest_id`).
+ display::ScreenInfos GetScreenInfosNearestDisplay(int64_t nearest_id) const;
+
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Object which suspends the platform-specific screensaver for the duration of
+ // its existence.
+ class ScreenSaverSuspender {
+@@ -232,7 +232,7 @@ class DISPLAY_EXPORT Screen {
+ int64_t display_id_for_new_windows_;
+ int64_t scoped_display_id_for_new_windows_ = display::kInvalidDisplayId;
+
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ uint32_t screen_saver_suspension_count_ = 0;
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+ };
diff --git a/devel/electron28/files/patch-ui_events_devices_x11_device__data__manager__x11.cc b/devel/electron28/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
new file mode 100644
index 000000000000..1ca68aed2cd4
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
@@ -0,0 +1,10 @@
+--- ui/events/devices/x11/device_data_manager_x11.cc.orig 2023-08-10 01:49:09 UTC
++++ ui/events/devices/x11/device_data_manager_x11.cc
+@@ -876,6 +876,7 @@ void DeviceDataManagerX11::SetDisabledKeyboardAllowedK
+ }
+
+ void DeviceDataManagerX11::DisableDevice(x11::Input::DeviceId deviceid) {
++ NOTIMPLEMENTED();
+ blocked_devices_.set(static_cast<uint32_t>(deviceid), true);
+ // TODO(rsadam@): Support blocking touchscreen devices.
+ std::vector<KeyboardDevice> keyboards = GetKeyboardDevices();
diff --git a/devel/electron28/files/patch-ui_events_event.cc b/devel/electron28/files/patch-ui_events_event.cc
new file mode 100644
index 000000000000..e8ae922de2b7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_event.cc
@@ -0,0 +1,29 @@
+--- ui/events/event.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/events/event.cc
+@@ -427,7 +427,7 @@ std::string LocatedEvent::ToString() const {
+ MouseEvent::MouseEvent(const PlatformEvent& native_event)
+ : LocatedEvent(native_event),
+ changed_button_flags_(GetChangedMouseButtonFlagsFromNative(native_event)),
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ movement_(GetMouseMovementFromNative(native_event)),
+ #endif
+ pointer_details_(GetMousePointerDetailsFromNative(native_event)) {
+@@ -676,7 +676,7 @@ std::unique_ptr<Event> MouseWheelEvent::Clone() const
+ return std::make_unique<MouseWheelEvent>(*this);
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // This value matches Windows, Fuchsia WHEEL_DELTA, and (roughly) Firefox on
+ // Linux.
+ // static
+@@ -936,7 +936,7 @@ void KeyEvent::InitializeNative() {
+ if (synthesize_key_repeat_enabled_ && IsRepeated(GetLastKeyEvent()))
+ set_flags(flags() | EF_IS_REPEAT);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ NormalizeFlags();
+ #elif BUILDFLAG(IS_WIN)
+ // Only Windows has native character events.
diff --git a/devel/electron28/files/patch-ui_events_event__switches.cc b/devel/electron28/files/patch-ui_events_event__switches.cc
new file mode 100644
index 000000000000..b7a29bd7d5b7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_event__switches.cc
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.cc.orig 2022-06-17 14:20:10 UTC
++++ ui/events/event_switches.cc
+@@ -21,7 +21,7 @@ const char kCompensateForUnstablePinchZoom[] =
+ // value is a floating point number that is interpreted as a distance in pixels.
+ const char kTouchSlopDistance[] = "touch-slop-distance";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Tells chrome to interpret events from these devices as touch events. Only
+ // available with XInput 2 (i.e. X server 1.8 or above). The id's of the
+ // devices can be retrieved from 'xinput list'.
diff --git a/devel/electron28/files/patch-ui_events_event__switches.h b/devel/electron28/files/patch-ui_events_event__switches.h
new file mode 100644
index 000000000000..a805749948af
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_event__switches.h
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.h.orig 2022-06-17 14:20:10 UTC
++++ ui/events/event_switches.h
+@@ -13,7 +13,7 @@ namespace switches {
+ EVENTS_BASE_EXPORT extern const char kCompensateForUnstablePinchZoom[];
+ EVENTS_BASE_EXPORT extern const char kTouchSlopDistance[];
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ EVENTS_BASE_EXPORT extern const char kTouchDevices[];
+ EVENTS_BASE_EXPORT extern const char kPenDevices[];
+ #endif
diff --git a/devel/electron28/files/patch-ui_events_gesture__detection_motion__event__generic.h b/devel/electron28/files/patch-ui_events_gesture__detection_motion__event__generic.h
new file mode 100644
index 000000000000..920e208d26c9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_gesture__detection_motion__event__generic.h
@@ -0,0 +1,10 @@
+--- ui/events/gesture_detection/motion_event_generic.h.orig 2023-11-29 21:40:44 UTC
++++ ui/events/gesture_detection/motion_event_generic.h
+@@ -7,6 +7,7 @@
+
+ #include <stddef.h>
+ #include <stdint.h>
++#include <vector>
+
+ #include <memory>
+ #include <vector>
diff --git a/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.cc b/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.cc
new file mode 100644
index 000000000000..100a496153ef
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.cc
@@ -0,0 +1,38 @@
+--- ui/events/keycodes/dom/keycode_converter.cc.orig 2022-07-22 17:30:31 UTC
++++ ui/events/keycodes/dom/keycode_converter.cc
+@@ -11,7 +11,7 @@
+ #include "ui/events/keycodes/dom/dom_code.h"
+ #include "ui/events/keycodes/dom/dom_key.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FREEBSD)
+ #include <linux/input.h>
+ #endif
+
+@@ -24,7 +24,7 @@ namespace {
+ #if BUILDFLAG(IS_WIN)
+ #define DOM_CODE(usb, evdev, xkb, win, mac, code, id) \
+ { usb, win, code }
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #define DOM_CODE(usb, evdev, xkb, win, mac, code, id) \
+ { usb, xkb, code }
+ #elif BUILDFLAG(IS_APPLE)
+@@ -58,7 +58,7 @@ struct DomKeyMapEntry {
+ #undef DOM_KEY_MAP
+ #undef DOM_KEY_UNI
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FREEBSD)
+
+ // The offset between XKB Keycode and evdev code.
+ constexpr int kXkbKeycodeOffset = 8;
+@@ -139,7 +139,7 @@ int KeycodeConverter::DomCodeToNativeKeycode(DomCode c
+ return UsbKeycodeToNativeKeycode(static_cast<uint32_t>(code));
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FREEBSD)
+ // static
+ DomCode KeycodeConverter::XkbKeycodeToDomCode(uint32_t xkb_keycode) {
+ // Currently XKB keycode is the native keycode.
diff --git a/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.h b/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.h
new file mode 100644
index 000000000000..ad4c6ff88f32
--- /dev/null
+++ b/devel/electron28/files/patch-ui_events_keycodes_dom_keycode__converter.h
@@ -0,0 +1,11 @@
+--- ui/events/keycodes/dom/keycode_converter.h.orig 2022-07-22 17:30:31 UTC
++++ ui/events/keycodes/dom/keycode_converter.h
+@@ -64,7 +64,7 @@ class KeycodeConverter {
+ // Convert a DomCode into a native keycode.
+ static int DomCodeToNativeKeycode(DomCode code);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FREEBSD)
+ // Convert a XKB keycode into a DomCode.
+ static DomCode XkbKeycodeToDomCode(uint32_t xkb_keycode);
+
diff --git a/devel/electron28/files/patch-ui_gfx_BUILD.gn b/devel/electron28/files/patch-ui_gfx_BUILD.gn
new file mode 100644
index 000000000000..b5da08899058
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_BUILD.gn
@@ -0,0 +1,11 @@
+--- ui/gfx/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ ui/gfx/BUILD.gn
+@@ -665,7 +665,7 @@ source_set("memory_buffer_sources") {
+ deps += [ "//build/config/linux/libdrm" ]
+ }
+
+- if (is_linux || is_chromeos || is_android) {
++ if ((is_linux || is_chromeos || is_android) && !is_bsd) {
+ deps += [ "//third_party/libsync" ]
+ }
+
diff --git a/devel/electron28/files/patch-ui_gfx_canvas__skia.cc b/devel/electron28/files/patch-ui_gfx_canvas__skia.cc
new file mode 100644
index 000000000000..29424708d54c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_canvas__skia.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/canvas_skia.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/gfx/canvas_skia.cc
+@@ -212,7 +212,7 @@ void Canvas::DrawStringRectWithFlags(const std::u16str
+ Range range = StripAcceleratorChars(flags, &adjusted_text);
+ bool elide_text = ((flags & NO_ELLIPSIS) == 0);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On Linux, eliding really means fading the end of the string. But only
+ // for LTR text. RTL text is still elided (on the left) with "...".
+ if (elide_text) {
diff --git a/devel/electron28/files/patch-ui_gfx_codec_png__codec.cc b/devel/electron28/files/patch-ui_gfx_codec_png__codec.cc
new file mode 100644
index 000000000000..28e79dbbbc04
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_codec_png__codec.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/codec/png_codec.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/gfx/codec/png_codec.cc
+@@ -12,7 +12,7 @@
+ #include "base/metrics/histogram_macros.h"
+ #include "base/notreached.h"
+ #include "base/strings/string_util.h"
+-#include "third_party/libpng/png.h"
++#include <png.h>
+ #include "third_party/skia/include/core/SkBitmap.h"
+ #include "third_party/skia/include/core/SkColorPriv.h"
+ #include "third_party/skia/include/core/SkUnPreMultiply.h"
diff --git a/devel/electron28/files/patch-ui_gfx_font__fallback__linux.cc b/devel/electron28/files/patch-ui_gfx_font__fallback__linux.cc
new file mode 100644
index 000000000000..4a89e4d97c8c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_font__fallback__linux.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/font_fallback_linux.cc.orig 2022-08-31 12:19:35 UTC
++++ ui/gfx/font_fallback_linux.cc
+@@ -26,6 +26,8 @@
+ #include "ui/gfx/linux/fontconfig_util.h"
+ #include "ui/gfx/platform_font.h"
+
++#include <unistd.h>
++
+ namespace gfx {
+
+ namespace {
diff --git a/devel/electron28/files/patch-ui_gfx_font__render__params.h b/devel/electron28/files/patch-ui_gfx_font__render__params.h
new file mode 100644
index 000000000000..7ec38845feee
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_font__render__params.h
@@ -0,0 +1,20 @@
+--- ui/gfx/font_render_params.h.orig 2022-02-28 16:54:41 UTC
++++ ui/gfx/font_render_params.h
+@@ -109,7 +109,7 @@ GFX_EXPORT FontRenderParams GetFontRenderParams(
+ const FontRenderParamsQuery& query,
+ std::string* family_out);
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Clears GetFontRenderParams()'s cache. Intended to be called by tests that are
+ // changing Fontconfig's configuration.
+ GFX_EXPORT void ClearFontRenderParamsCacheForTest();
+@@ -119,7 +119,7 @@ GFX_EXPORT void ClearFontRenderParamsCacheForTest();
+ GFX_EXPORT float GetFontRenderParamsDeviceScaleFactor();
+
+ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
+- BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
++ BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ // Sets the device scale factor for FontRenderParams to decide
+ // if it should enable subpixel positioning.
+ GFX_EXPORT void SetFontRenderParamsDeviceScaleFactor(
diff --git a/devel/electron28/files/patch-ui_gfx_font__render__params__linux.cc b/devel/electron28/files/patch-ui_gfx_font__render__params__linux.cc
new file mode 100644
index 000000000000..0872a6a03fcf
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_font__render__params__linux.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/font_render_params_linux.cc.orig 2022-08-31 12:19:35 UTC
++++ ui/gfx/font_render_params_linux.cc
+@@ -25,7 +25,7 @@
+ #include "ui/gfx/linux/fontconfig_util.h"
+ #include "ui/gfx/switches.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -212,7 +212,7 @@ FontRenderParams GetFontRenderParams(const FontRenderP
+
+ // Start with the delegate's settings, but let Fontconfig have the final say.
+ FontRenderParams params;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (const auto* linux_ui = ui::LinuxUi::instance())
+ params = linux_ui->GetDefaultFontRenderParams();
+ #endif
diff --git a/devel/electron28/files/patch-ui_gfx_font__util.cc b/devel/electron28/files/patch-ui_gfx_font__util.cc
new file mode 100644
index 000000000000..8727d4724110
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_font__util.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/font_util.cc.orig 2022-02-28 16:54:41 UTC
++++ ui/gfx/font_util.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <fontconfig/fontconfig.h>
+ #include "ui/gfx/linux/fontconfig_util.h"
+ #endif
+@@ -24,7 +24,7 @@ void InitializeFonts() {
+ // background (resources have not yet been granted to cast) since it prevents
+ // the long delay the user would have seen on first rendering.
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Ensures the config is created on this thread.
+ FcConfig* config = GetGlobalFontConfig();
+ DCHECK(config);
diff --git a/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.cc b/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.cc
new file mode 100644
index 000000000000..eb4ab5a413cd
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/gpu_memory_buffer.cc.orig 2023-03-30 00:34:18 UTC
++++ ui/gfx/gpu_memory_buffer.cc
+@@ -54,7 +54,7 @@ GpuMemoryBufferHandle GpuMemoryBufferHandle::Clone() c
+ handle.region = region.Duplicate();
+ handle.offset = offset;
+ handle.stride = stride;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ handle.native_pixmap_handle = CloneHandleForIPC(native_pixmap_handle);
+ #elif BUILDFLAG(IS_APPLE)
+ handle.io_surface = io_surface;
diff --git a/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.h b/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.h
new file mode 100644
index 000000000000..5da432b2f2c4
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_gpu__memory__buffer.h
@@ -0,0 +1,20 @@
+--- ui/gfx/gpu_memory_buffer.h.orig 2023-03-30 00:34:18 UTC
++++ ui/gfx/gpu_memory_buffer.h
+@@ -15,7 +15,7 @@
+ #include "ui/gfx/geometry/rect.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #elif BUILDFLAG(IS_APPLE)
+ #include "ui/gfx/mac/io_surface.h"
+@@ -75,7 +75,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
+ base::UnsafeSharedMemoryRegion region;
+ uint32_t offset = 0;
+ uint32_t stride = 0;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ NativePixmapHandle native_pixmap_handle;
+ #elif BUILDFLAG(IS_APPLE)
+ ScopedIOSurface io_surface;
diff --git a/devel/electron28/files/patch-ui_gfx_linux_dmabuf__uapi.h b/devel/electron28/files/patch-ui_gfx_linux_dmabuf__uapi.h
new file mode 100644
index 000000000000..e532335d2914
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_linux_dmabuf__uapi.h
@@ -0,0 +1,36 @@
+--- ui/gfx/linux/dmabuf_uapi.h.orig 2023-10-19 19:59:21 UTC
++++ ui/gfx/linux/dmabuf_uapi.h
+@@ -5,12 +5,11 @@
+ #ifndef UI_GFX_LINUX_DMABUF_UAPI_H_
+ #define UI_GFX_LINUX_DMABUF_UAPI_H_
+
+-#include <linux/version.h>
++#include <sys/types.h>
+
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+-#include <linux/dma-buf.h>
+-#else
+-#include <linux/types.h>
++typedef int32_t __s32;
++typedef uint32_t __u32;
++typedef uint64_t __u64;
+
+ struct dma_buf_sync {
+ __u64 flags;
+@@ -26,9 +25,7 @@ constexpr __u64 DMA_BUF_SYNC_END = 1 << 2;
+ constexpr char DMA_BUF_BASE = 'b';
+ constexpr unsigned long DMA_BUF_IOCTL_SYNC =
+ _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync);
+-#endif
+
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0)
+ struct dma_buf_export_sync_file {
+ __u32 flags;
+ __s32 fd;
+@@ -43,6 +40,5 @@ constexpr unsigned long DMA_BUF_IOCTL_EXPORT_SYNC_FILE
+ _IOWR(DMA_BUF_BASE, 2, struct dma_buf_export_sync_file);
+ constexpr unsigned long DMA_BUF_IOCTL_IMPORT_SYNC_FILE =
+ _IOW(DMA_BUF_BASE, 3, struct dma_buf_import_sync_file);
+-#endif
+
+ #endif // UI_GFX_LINUX_DMABUF_UAPI_H_
diff --git a/devel/electron28/files/patch-ui_gfx_linux_gbm__wrapper.cc b/devel/electron28/files/patch-ui_gfx_linux_gbm__wrapper.cc
new file mode 100644
index 000000000000..a9db418e017c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_linux_gbm__wrapper.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/linux/gbm_wrapper.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gfx/linux/gbm_wrapper.cc
+@@ -316,7 +316,7 @@ class Device final : public ui::GbmDevice {
+ // of 1x1 BOs which are destroyed before creating the final BO creation used
+ // to instantiate the returned GbmBuffer.
+ gfx::Size size =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ gfx::Size(1, 1);
+ #else
+ requested_size;
diff --git a/devel/electron28/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc b/devel/electron28/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc
new file mode 100644
index 000000000000..358546dbfc32
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/mojom/buffer_types_mojom_traits.cc.orig 2023-02-01 18:43:52 UTC
++++ ui/gfx/mojom/buffer_types_mojom_traits.cc
+@@ -33,7 +33,7 @@ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTra
+ return gfx::mojom::GpuMemoryBufferPlatformHandle::NewSharedMemoryHandle(
+ std::move(handle.region));
+ case gfx::NATIVE_PIXMAP:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ return gfx::mojom::GpuMemoryBufferPlatformHandle::NewNativePixmapHandle(
+ std::move(handle.native_pixmap_handle));
+ #else
+@@ -115,7 +115,7 @@ bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDat
+ out->type = gfx::SHARED_MEMORY_BUFFER;
+ out->region = std::move(platform_handle->get_shared_memory_handle());
+ return true;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ case gfx::mojom::GpuMemoryBufferPlatformHandleDataView::Tag::
+ kNativePixmapHandle:
+ out->type = gfx::NATIVE_PIXMAP;
diff --git a/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.cc b/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.cc
new file mode 100644
index 000000000000..727ef6cd5c14
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.cc
@@ -0,0 +1,34 @@
+--- ui/gfx/mojom/native_handle_types_mojom_traits.cc.orig 2023-02-01 18:43:52 UTC
++++ ui/gfx/mojom/native_handle_types_mojom_traits.cc
+@@ -8,11 +8,11 @@
+
+ namespace mojo {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ mojo::PlatformHandle StructTraits<
+ gfx::mojom::NativePixmapPlaneDataView,
+ gfx::NativePixmapPlane>::buffer_handle(gfx::NativePixmapPlane& plane) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return mojo::PlatformHandle(std::move(plane.fd));
+ #elif BUILDFLAG(IS_FUCHSIA)
+ return mojo::PlatformHandle(std::move(plane.vmo));
+@@ -28,7 +28,7 @@ bool StructTraits<
+ out->size = data.size();
+
+ mojo::PlatformHandle handle = data.TakeBufferHandle();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ if (!handle.is_fd())
+ return false;
+ out->fd = handle.TakeFD();
+@@ -54,7 +54,7 @@ bool StructTraits<
+ gfx::mojom::NativePixmapHandleDataView,
+ gfx::NativePixmapHandle>::Read(gfx::mojom::NativePixmapHandleDataView data,
+ gfx::NativePixmapHandle* out) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ out->modifier = data.modifier();
+ out->supports_zero_copy_webgpu_import =
+ data.supports_zero_copy_webgpu_import();
diff --git a/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.h b/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.h
new file mode 100644
index 000000000000..aeb84fdb3695
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_mojom_native__handle__types__mojom__traits.h
@@ -0,0 +1,36 @@
+--- ui/gfx/mojom/native_handle_types_mojom_traits.h.orig 2023-02-01 18:43:52 UTC
++++ ui/gfx/mojom/native_handle_types_mojom_traits.h
+@@ -15,7 +15,7 @@
+ #include "third_party/abseil-cpp/absl/types/optional.h"
+ #include "ui/gfx/mojom/native_handle_types.mojom-shared.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #endif
+
+@@ -25,7 +25,7 @@
+
+ namespace mojo {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_BSD)
+ template <>
+ struct COMPONENT_EXPORT(GFX_NATIVE_HANDLE_TYPES_SHARED_MOJOM_TRAITS)
+ StructTraits<gfx::mojom::NativePixmapPlaneDataView,
+@@ -53,13 +53,13 @@ struct COMPONENT_EXPORT(GFX_NATIVE_HANDLE_TYPES_SHARED
+ return pixmap_handle.planes;
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static uint64_t modifier(const gfx::NativePixmapHandle& pixmap_handle) {
+ return pixmap_handle.modifier;
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static bool supports_zero_copy_webgpu_import(
+ const gfx::NativePixmapHandle& pixmap_handle) {
+ return pixmap_handle.supports_zero_copy_webgpu_import;
diff --git a/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.cc b/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.cc
new file mode 100644
index 000000000000..e223aa32f5ad
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.cc
@@ -0,0 +1,62 @@
+--- ui/gfx/native_pixmap_handle.cc.orig 2022-11-30 08:12:58 UTC
++++ ui/gfx/native_pixmap_handle.cc
+@@ -11,7 +11,7 @@
+ #include "ui/gfx/buffer_format_util.h"
+ #include "ui/gfx/geometry/size.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <drm_fourcc.h>
+ #include <unistd.h>
+
+@@ -23,9 +23,13 @@
+ #include "base/fuchsia/fuchsia_logging.h"
+ #endif
+
++#if BUILDFLAG(IS_BSD)
++#include <unistd.h>
++#endif
++
+ namespace gfx {
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ static_assert(NativePixmapHandle::kNoModifier == DRM_FORMAT_MOD_INVALID,
+ "gfx::NativePixmapHandle::kNoModifier should be an alias for"
+ "DRM_FORMAT_MOD_INVALID");
+@@ -36,7 +40,7 @@ NativePixmapPlane::NativePixmapPlane() : stride(0), of
+ NativePixmapPlane::NativePixmapPlane(int stride,
+ int offset,
+ uint64_t size
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ base::ScopedFD fd
+ #elif BUILDFLAG(IS_FUCHSIA)
+@@ -47,7 +51,7 @@ NativePixmapPlane::NativePixmapPlane(int stride,
+ : stride(stride),
+ offset(offset),
+ size(size)
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ fd(std::move(fd))
+ #elif BUILDFLAG(IS_FUCHSIA)
+@@ -75,7 +79,7 @@ NativePixmapHandle& NativePixmapHandle::operator=(Nati
+ NativePixmapHandle CloneHandleForIPC(const NativePixmapHandle& handle) {
+ NativePixmapHandle clone;
+ for (auto& plane : handle.planes) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ DCHECK(plane.fd.is_valid());
+ // Combining the HANDLE_EINTR and ScopedFD's constructor causes the compiler
+ // to emit some very strange assembly that tends to cause FD ownership
+@@ -113,7 +117,7 @@ NativePixmapHandle CloneHandleForIPC(const NativePixma
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ clone.modifier = handle.modifier;
+ clone.supports_zero_copy_webgpu_import =
+ handle.supports_zero_copy_webgpu_import;
diff --git a/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.h b/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.h
new file mode 100644
index 000000000000..ac1a9db55c5a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_native__pixmap__handle.h
@@ -0,0 +1,38 @@
+--- ui/gfx/native_pixmap_handle.h.orig 2023-02-01 18:43:52 UTC
++++ ui/gfx/native_pixmap_handle.h
+@@ -14,7 +14,7 @@
+ #include "ui/gfx/buffer_types.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "base/files/scoped_file.h"
+ #endif
+
+@@ -34,7 +34,7 @@ struct GFX_EXPORT NativePixmapPlane {
+ NativePixmapPlane(int stride,
+ int offset,
+ uint64_t size
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ ,
+ base::ScopedFD fd
+ #elif BUILDFLAG(IS_FUCHSIA)
+@@ -55,7 +55,7 @@ struct GFX_EXPORT NativePixmapPlane {
+ // This is necessary to map the buffers.
+ uint64_t size;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // File descriptor for the underlying memory object (usually dmabuf).
+ base::ScopedFD fd;
+ #elif BUILDFLAG(IS_FUCHSIA)
+@@ -78,7 +78,7 @@ struct GFX_EXPORT NativePixmapHandle {
+
+ std::vector<NativePixmapPlane> planes;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The modifier is retrieved from GBM library and passed to EGL driver.
+ // Generally it's platform specific, and we don't need to modify it in
+ // Chromium code. Also one per plane per entry.
diff --git a/devel/electron28/files/patch-ui_gfx_native__widget__types.h b/devel/electron28/files/patch-ui_gfx_native__widget__types.h
new file mode 100644
index 000000000000..9ca60677c19c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_native__widget__types.h
@@ -0,0 +1,20 @@
+--- ui/gfx/native_widget_types.h.orig 2023-10-19 19:59:21 UTC
++++ ui/gfx/native_widget_types.h
+@@ -103,7 +103,7 @@ class SkBitmap;
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ extern "C" {
+ struct _AtkObject;
+ using AtkObject = struct _AtkObject;
+@@ -221,7 +221,7 @@ using NativeViewAccessible = struct objc_object*;
+ #endif
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Linux doesn't have a native font type.
+ using NativeViewAccessible = AtkObject*;
+ #else
diff --git a/devel/electron28/files/patch-ui_gfx_platform__font__skia.cc b/devel/electron28/files/patch-ui_gfx_platform__font__skia.cc
new file mode 100644
index 000000000000..e3bf6aef9f86
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_platform__font__skia.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/platform_font_skia.cc.orig 2022-08-31 12:19:35 UTC
++++ ui/gfx/platform_font_skia.cc
+@@ -28,7 +28,7 @@
+ #include "ui/gfx/system_fonts_win.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -166,7 +166,7 @@ void PlatformFontSkia::EnsuresDefaultFontIsInitialized
+ weight = system_font.GetWeight();
+ #endif // BUILDFLAG(IS_WIN)
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // On Linux, LinuxUi is used to query the native toolkit (e.g.
+ // GTK) for the default UI font.
+ if (const auto* linux_ui = ui::LinuxUi::instance()) {
diff --git a/devel/electron28/files/patch-ui_gfx_render__text__api__fuzzer.cc b/devel/electron28/files/patch-ui_gfx_render__text__api__fuzzer.cc
new file mode 100644
index 000000000000..ae9ccd8bf707
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_render__text__api__fuzzer.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/render_text_api_fuzzer.cc.orig 2022-08-31 12:19:35 UTC
++++ ui/gfx/render_text_api_fuzzer.cc
+@@ -20,7 +20,7 @@
+ #include "ui/gfx/font_util.h"
+ #include "ui/gfx/render_text.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
+ #endif
+
+@@ -47,7 +47,7 @@ struct Environment {
+
+ CHECK(base::i18n::InitializeICU());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ test_fonts::SetUpFontconfig();
+ #endif
+ gfx::InitializeFonts();
diff --git a/devel/electron28/files/patch-ui_gfx_render__text__fuzzer.cc b/devel/electron28/files/patch-ui_gfx_render__text__fuzzer.cc
new file mode 100644
index 000000000000..ca6343b440e5
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_render__text__fuzzer.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/render_text_fuzzer.cc.orig 2022-08-31 12:19:35 UTC
++++ ui/gfx/render_text_fuzzer.cc
+@@ -14,7 +14,7 @@
+ #include "ui/gfx/font_util.h"
+ #include "ui/gfx/render_text.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
+ #endif
+
+@@ -37,7 +37,7 @@ struct Environment {
+
+ CHECK(base::i18n::InitializeICU());
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ test_fonts::SetUpFontconfig();
+ #endif
+ gfx::InitializeFonts();
diff --git a/devel/electron28/files/patch-ui_gfx_switches.cc b/devel/electron28/files/patch-ui_gfx_switches.cc
new file mode 100644
index 000000000000..15eb9f06f54e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_switches.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/switches.cc.orig 2023-08-20 00:00:06 UTC
++++ ui/gfx/switches.cc
+@@ -30,7 +30,7 @@ const char kForcePrefersReducedMotion[] = "force-prefe
+ // Run in headless mode, i.e., without a UI or display server dependencies.
+ const char kHeadless[] = "headless";
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Which X11 display to connect to. Emulates the GTK+ "--display=" command line
+ // argument. In use only with Ozone/X11.
+ const char kX11Display[] = "display";
diff --git a/devel/electron28/files/patch-ui_gfx_switches.h b/devel/electron28/files/patch-ui_gfx_switches.h
new file mode 100644
index 000000000000..1dbaa0258c88
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_switches.h
@@ -0,0 +1,11 @@
+--- ui/gfx/switches.h.orig 2023-08-20 00:00:06 UTC
++++ ui/gfx/switches.h
+@@ -19,7 +19,7 @@ GFX_SWITCHES_EXPORT extern const char kEnableNativeGpu
+ GFX_SWITCHES_EXPORT extern const char kForcePrefersReducedMotion[];
+ GFX_SWITCHES_EXPORT extern const char kHeadless[];
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ GFX_SWITCHES_EXPORT extern const char kX11Display[];
+ GFX_SWITCHES_EXPORT extern const char kNoXshm[];
+ #endif
diff --git a/devel/electron28/files/patch-ui_gfx_x_generated__protos_dri3.cc b/devel/electron28/files/patch-ui_gfx_x_generated__protos_dri3.cc
new file mode 100644
index 000000000000..da723062c0a7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_x_generated__protos_dri3.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/x/generated_protos/dri3.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gfx/x/generated_protos/dri3.cc
+@@ -27,6 +27,8 @@
+ #include <xcb/xcb.h>
+ #include <xcb/xcbext.h>
+
++#include <unistd.h>
++
+ #include "base/logging.h"
+ #include "base/posix/eintr_wrapper.h"
+ #include "ui/gfx/x/xproto_internal.h"
diff --git a/devel/electron28/files/patch-ui_gfx_x_generated__protos_shm.cc b/devel/electron28/files/patch-ui_gfx_x_generated__protos_shm.cc
new file mode 100644
index 000000000000..ce0898cca757
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_x_generated__protos_shm.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/x/generated_protos/shm.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gfx/x/generated_protos/shm.cc
+@@ -27,6 +27,8 @@
+ #include <xcb/xcb.h>
+ #include <xcb/xcbext.h>
+
++#include <unistd.h>
++
+ #include "base/logging.h"
+ #include "base/posix/eintr_wrapper.h"
+ #include "ui/gfx/x/xproto_internal.h"
diff --git a/devel/electron28/files/patch-ui_gfx_x_xlib__support.cc b/devel/electron28/files/patch-ui_gfx_x_xlib__support.cc
new file mode 100644
index 000000000000..099a6bb293a7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gfx_x_xlib__support.cc
@@ -0,0 +1,21 @@
+--- ui/gfx/x/xlib_support.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gfx/x/xlib_support.cc
+@@ -39,10 +39,18 @@ void InitXlib() {
+ return;
+ }
+
++#if BUILDFLAG(IS_BSD)
++ DUMP_WILL_BE_CHECK(xlib_loader->Load("libX11.so"));
++#else
+ DUMP_WILL_BE_CHECK(xlib_loader->Load("libX11.so.6"));
++#endif
+
+ auto* xlib_xcb_loader = GetXlibXcbLoader();
++#if BUILDFLAG(IS_BSD)
++ DUMP_WILL_BE_CHECK(xlib_xcb_loader->Load("libX11-xcb.so"));
++#else
+ DUMP_WILL_BE_CHECK(xlib_xcb_loader->Load("libX11-xcb.so.1"));
++#endif
+
+ DUMP_WILL_BE_CHECK(xlib_loader->XInitThreads());
+
diff --git a/devel/electron28/files/patch-ui_gl_BUILD.gn b/devel/electron28/files/patch-ui_gl_BUILD.gn
new file mode 100644
index 000000000000..b779789d5c0f
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_BUILD.gn
@@ -0,0 +1,35 @@
+--- ui/gl/BUILD.gn.orig 2023-11-29 21:40:44 UTC
++++ ui/gl/BUILD.gn
+@@ -151,8 +151,6 @@ component("gl") {
+ defines += [ "GPU_ENABLE_SERVICE_LOGGING" ]
+ }
+
+- include_dirs = [ "//third_party/mesa_headers" ]
+-
+ all_dependent_configs = [ ":gl_config" ]
+
+ public_configs = [ "//third_party/khronos:khronos_headers" ]
+@@ -169,7 +167,6 @@ component("gl") {
+ ]
+ public_deps = [
+ "//base",
+- "//third_party/mesa_headers",
+ "//ui/events/platform",
+ "//ui/gfx",
+ "//ui/gfx/geometry",
+@@ -377,7 +374,6 @@ component("gl") {
+ data_deps += [
+ "//third_party/angle:libEGL",
+ "//third_party/angle:libGLESv2",
+- "//third_party/mesa_headers",
+ ]
+ if (enable_swiftshader) {
+ data_deps += [
+@@ -582,7 +578,6 @@ test("gl_unittests") {
+
+ data_deps = [
+ "//testing/buildbot/filters:gl_unittests_filters",
+- "//third_party/mesa_headers",
+ ]
+
+ if (is_win) {
diff --git a/devel/electron28/files/patch-ui_gl_gl__bindings.h b/devel/electron28/files/patch-ui_gl_gl__bindings.h
new file mode 100644
index 000000000000..5856d06c16c9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_gl__bindings.h
@@ -0,0 +1,11 @@
+--- ui/gl/gl_bindings.h.orig 2023-05-25 00:42:54 UTC
++++ ui/gl/gl_bindings.h
+@@ -36,7 +36,7 @@
+ #include <GL/wglext.h>
+ #elif BUILDFLAG(IS_MAC)
+ #include <OpenGL/OpenGL.h>
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ using Display = struct _XDisplay;
+ using Bool = int;
+ using Status = int;
diff --git a/devel/electron28/files/patch-ui_gl_gl__context.cc b/devel/electron28/files/patch-ui_gl_gl__context.cc
new file mode 100644
index 000000000000..1c744502c139
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_gl__context.cc
@@ -0,0 +1,11 @@
+--- ui/gl/gl_context.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gl/gl_context.cc
+@@ -486,7 +486,7 @@ bool GLContext::MakeVirtuallyCurrent(
+ DCHECK(virtual_context->IsCurrent(surface));
+
+ if (switched_real_contexts || virtual_context != current_virtual_context_) {
+-#if DCHECK_IS_ON()
++#if DCHECK_IS_ON() && !BUILDFLAG(IS_BSD)
+ GLenum error = glGetError();
+ // Accepting a context loss error here enables using debug mode to work on
+ // context loss handling in virtual context mode.
diff --git a/devel/electron28/files/patch-ui_gl_gl__fence.cc b/devel/electron28/files/patch-ui_gl_gl__fence.cc
new file mode 100644
index 000000000000..a71e5af85334
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_gl__fence.cc
@@ -0,0 +1,11 @@
+--- ui/gl/gl_fence.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/gl/gl_fence.cc
+@@ -20,7 +20,7 @@
+ #endif
+
+ #if defined(USE_EGL)
+-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC
+ #include "ui/gl/gl_fence_android_native_fence_sync.h"
+ #endif
diff --git a/devel/electron28/files/patch-ui_gl_gl__implementation.cc b/devel/electron28/files/patch-ui_gl_gl__implementation.cc
new file mode 100644
index 000000000000..8975ee88a9ec
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_gl__implementation.cc
@@ -0,0 +1,11 @@
+--- ui/gl/gl_implementation.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/gl/gl_implementation.cc
+@@ -276,7 +276,7 @@ GetRequestedGLImplementationFromCommandLine(
+ *fallback_to_software_gl = false;
+ bool overrideUseSoftwareGL =
+ command_line->HasSwitch(switches::kOverrideUseSoftwareGLForTests);
+-#if BUILDFLAG(IS_LINUX) || \
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || \
+ (BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_CHROMEOS_DEVICE))
+ if (std::getenv("RUNNING_UNDER_RR")) {
+ // https://rr-project.org/ is a Linux-only record-and-replay debugger that
diff --git a/devel/electron28/files/patch-ui_gl_gl__switches.cc b/devel/electron28/files/patch-ui_gl_gl__switches.cc
new file mode 100644
index 000000000000..30416e98a29f
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_gl__switches.cc
@@ -0,0 +1,20 @@
+--- ui/gl/gl_switches.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/gl/gl_switches.cc
+@@ -11,7 +11,7 @@
+ #include "base/android/build_info.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <vulkan/vulkan_core.h>
+ #include "third_party/angle/src/gpu_info_util/SystemInfo.h" // nogncheck
+ #endif
+@@ -294,7 +294,7 @@ bool IsDefaultANGLEVulkan() {
+ base::android::SDK_VERSION_Q)
+ return false;
+ #endif // BUILDFLAG(IS_ANDROID)
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ angle::SystemInfo system_info;
+ if (!angle::GetSystemInfoVulkan(&system_info))
+ return false;
diff --git a/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.cc b/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.cc
new file mode 100644
index 000000000000..539e7fbe08d7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.cc
@@ -0,0 +1,38 @@
+--- ui/gl/sync_control_vsync_provider.cc.orig 2022-02-28 16:54:41 UTC
++++ ui/gl/sync_control_vsync_provider.cc
+@@ -11,7 +11,7 @@
+ #include "base/trace_event/trace_event.h"
+ #include "build/build_config.h"
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // These constants define a reasonable range for a calculated refresh interval.
+ // Calculating refreshes out of this range will be considered a fatal error.
+ const int64_t kMinVsyncIntervalUs = base::Time::kMicrosecondsPerSecond / 400;
+@@ -26,7 +26,7 @@ const double kRelativeIntervalDifferenceThreshold = 0.
+ namespace gl {
+
+ SyncControlVSyncProvider::SyncControlVSyncProvider() : gfx::VSyncProvider() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // On platforms where we can't get an accurate reading on the refresh
+ // rate we fall back to the assumption that we're displaying 60 frames
+ // per second.
+@@ -48,7 +48,7 @@ bool SyncControlVSyncProvider::GetVSyncParametersIfAva
+ base::TimeTicks* timebase_out,
+ base::TimeDelta* interval_out) {
+ TRACE_EVENT0("gpu", "SyncControlVSyncProvider::GetVSyncParameters");
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // The actual clock used for the system time returned by glXGetSyncValuesOML
+ // is unspecified. In practice, the clock used is likely to be either
+ // CLOCK_REALTIME or CLOCK_MONOTONIC, so we compare the returned time to the
+@@ -159,7 +159,7 @@ bool SyncControlVSyncProvider::GetVSyncParametersIfAva
+ }
+
+ bool SyncControlVSyncProvider::SupportGetVSyncParametersIfAvailable() const {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.h b/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.h
new file mode 100644
index 000000000000..376bf86f0f64
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gl_sync__control__vsync__provider.h
@@ -0,0 +1,20 @@
+--- ui/gl/sync_control_vsync_provider.h.orig 2022-05-19 14:06:27 UTC
++++ ui/gl/sync_control_vsync_provider.h
+@@ -31,7 +31,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ bool SupportGetVSyncParametersIfAvailable() const override;
+
+ static constexpr bool IsSupported() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return true;
+ #else
+ return false;
+@@ -46,7 +46,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ virtual bool GetMscRate(int32_t* numerator, int32_t* denominator) = 0;
+
+ private:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ base::TimeTicks last_timebase_;
+ uint64_t last_media_stream_counter_ = 0;
+ base::TimeDelta last_good_interval_;
diff --git a/devel/electron28/files/patch-ui_gtk_gtk__compat.cc b/devel/electron28/files/patch-ui_gtk_gtk__compat.cc
new file mode 100644
index 000000000000..17397a1ce5bd
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gtk_gtk__compat.cc
@@ -0,0 +1,53 @@
+--- ui/gtk/gtk_compat.cc.orig 2023-10-25 09:13:45 UTC
++++ ui/gtk/gtk_compat.cc
+@@ -62,22 +62,38 @@ auto DlCast(void* symbol) {
+ }
+
+ void* GetLibGio() {
++#if BUILDFLAG(IS_BSD)
++ static void* libgio = DlOpen("libgio-2.0.so");
++#else
+ static void* libgio = DlOpen("libgio-2.0.so.0");
++#endif
+ return libgio;
+ }
+
+ void* GetLibGdk3() {
++#if BUILDFLAG(IS_BSD)
++ static void* libgdk3 = DlOpen("libgdk-3.so");
++#else
+ static void* libgdk3 = DlOpen("libgdk-3.so.0");
++#endif
+ return libgdk3;
+ }
+
+ void* GetLibGtk3(bool check = true) {
++#if BUILDFLAG(IS_BSD)
++ static void* libgtk3 = DlOpen("libgtk-3.so", check);
++#else
+ static void* libgtk3 = DlOpen("libgtk-3.so.0", check);
++#endif
+ return libgtk3;
+ }
+
+ void* GetLibGtk4(bool check = true) {
++#if BUILDFLAG(IS_BSD)
++ static void* libgtk4 = DlOpen("libgtk-4.so", check);
++#else
+ static void* libgtk4 = DlOpen("libgtk-4.so.1", check);
++#endif
+ return libgtk4;
+ }
+
+@@ -124,7 +140,11 @@ gfx::Insets InsetsFromGtkBorder(const GtkBorder& borde
+ } // namespace
+
+ void* GetLibGdkPixbuf() {
++#if BUILDFLAG(IS_BSD)
++ static void* libgdk_pixbuf = DlOpen("libgdk_pixbuf-2.0.so");
++#else
+ static void* libgdk_pixbuf = DlOpen("libgdk_pixbuf-2.0.so.0");
++#endif
+ return libgdk_pixbuf;
+ }
+
diff --git a/devel/electron28/files/patch-ui_gtk_gtk__ui.cc b/devel/electron28/files/patch-ui_gtk_gtk__ui.cc
new file mode 100644
index 000000000000..6d136e06d472
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gtk_gtk__ui.cc
@@ -0,0 +1,22 @@
+--- ui/gtk/gtk_ui.cc.orig 2023-12-20 07:12:20 UTC
++++ ui/gtk/gtk_ui.cc
+@@ -1014,11 +1014,19 @@ ui::DisplayConfig GtkUi::GetDisplayConfig() const {
+ GdkRectangle geometry;
+ gdk_monitor_get_geometry(monitor, &geometry);
+ int monitor_scale = std::max(1, gdk_monitor_get_scale_factor(monitor));
++#if defined(__clang__) && (__clang_major__ >= 16)
+ config.display_geometries.emplace_back(
+ gfx::Rect(monitor_scale * geometry.x, monitor_scale * geometry.y,
+ monitor_scale * geometry.width,
+ monitor_scale * geometry.height),
+ monitor_scale * font_scale);
++#else
++ config.display_geometries.emplace_back() = {
++ gfx::Rect(monitor_scale * geometry.x, monitor_scale * geometry.y,
++ monitor_scale * geometry.width,
++ monitor_scale * geometry.height),
++ static_cast<float>(monitor_scale * font_scale)};
++#endif
+ }
+ return config;
+ }
diff --git a/devel/electron28/files/patch-ui_gtk_printing_print__dialog__gtk.cc b/devel/electron28/files/patch-ui_gtk_printing_print__dialog__gtk.cc
new file mode 100644
index 000000000000..d0dc52b14045
--- /dev/null
+++ b/devel/electron28/files/patch-ui_gtk_printing_print__dialog__gtk.cc
@@ -0,0 +1,11 @@
+--- ui/gtk/printing/print_dialog_gtk.cc.orig 2023-12-20 07:12:20 UTC
++++ ui/gtk/printing/print_dialog_gtk.cc
+@@ -451,7 +451,7 @@ void PrintDialogGtk::ShowDialog(
+ GtkPrintCapabilities cap = static_cast<GtkPrintCapabilities>(
+ GTK_PRINT_CAPABILITY_GENERATE_PDF | GTK_PRINT_CAPABILITY_PAGE_SET |
+ GTK_PRINT_CAPABILITY_COPIES | GTK_PRINT_CAPABILITY_COLLATE |
+- GTK_PRINT_CAPABILITY_REVERSE);
++ GTK_PRINT_CAPABILITY_REVERSE | GTK_PRINT_CAPABILITY_GENERATE_PS);
+ gtk_print_unix_dialog_set_manual_capabilities(GTK_PRINT_UNIX_DIALOG(dialog_),
+ cap);
+ gtk_print_unix_dialog_set_embed_page_setup(GTK_PRINT_UNIX_DIALOG(dialog_),
diff --git a/devel/electron28/files/patch-ui_message__center_views_message__popup__view.cc b/devel/electron28/files/patch-ui_message__center_views_message__popup__view.cc
new file mode 100644
index 000000000000..c89516636f78
--- /dev/null
+++ b/devel/electron28/files/patch-ui_message__center_views_message__popup__view.cc
@@ -0,0 +1,11 @@
+--- ui/message_center/views/message_popup_view.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/message_center/views/message_popup_view.cc
+@@ -135,7 +135,7 @@ void MessagePopupView::Show() {
+ params.z_order = ui::ZOrderLevel::kFloatingWindow;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Make the widget explicitly activatable as TYPE_POPUP is not activatable by
+ // default but we need focus for the inline reply textarea.
+ params.activatable = views::Widget::InitParams::Activatable::kYes;
diff --git a/devel/electron28/files/patch-ui_native__theme_native__theme.h b/devel/electron28/files/patch-ui_native__theme_native__theme.h
new file mode 100644
index 000000000000..f23399fa28c5
--- /dev/null
+++ b/devel/electron28/files/patch-ui_native__theme_native__theme.h
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme.h.orig 2023-10-25 09:13:44 UTC
++++ ui/native_theme/native_theme.h
+@@ -62,7 +62,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
+ kCheckbox,
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ kFrameTopArea,
+ #endif
+ kInnerSpinButton,
diff --git a/devel/electron28/files/patch-ui_native__theme_native__theme__base.cc b/devel/electron28/files/patch-ui_native__theme_native__theme__base.cc
new file mode 100644
index 000000000000..aeb380a04928
--- /dev/null
+++ b/devel/electron28/files/patch-ui_native__theme_native__theme__base.cc
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme_base.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/native_theme/native_theme_base.cc
+@@ -235,7 +235,7 @@ void NativeThemeBase::Paint(cc::PaintCanvas* canvas,
+ break;
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ case kFrameTopArea:
+ PaintFrameTopArea(canvas, state, rect,
+ absl::get<FrameTopAreaExtraParams>(extra),
diff --git a/devel/electron28/files/patch-ui_ozone_common_egl__util.cc b/devel/electron28/files/patch-ui_ozone_common_egl__util.cc
new file mode 100644
index 000000000000..d12b1989b22a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_common_egl__util.cc
@@ -0,0 +1,14 @@
+--- ui/ozone/common/egl_util.cc.orig 2022-07-22 17:30:31 UTC
++++ ui/ozone/common/egl_util.cc
+@@ -26,9 +26,9 @@ const base::FilePath::CharType kDefaultGlesSoname[] =
+ FILE_PATH_LITERAL("libGLESv2.so");
+ #else // BUILDFLAG(IS_FUCHSIA)
+ const base::FilePath::CharType kDefaultEglSoname[] =
+- FILE_PATH_LITERAL("libEGL.so.1");
++ FILE_PATH_LITERAL("libEGL.so");
+ const base::FilePath::CharType kDefaultGlesSoname[] =
+- FILE_PATH_LITERAL("libGLESv2.so.2");
++ FILE_PATH_LITERAL("libGLESv2.so");
+ #endif
+ const base::FilePath::CharType kAngleEglSoname[] =
+ FILE_PATH_LITERAL("libEGL.so");
diff --git a/devel/electron28/files/patch-ui_ozone_common_features.cc b/devel/electron28/files/patch-ui_ozone_common_features.cc
new file mode 100644
index 000000000000..cb4c3fa0c46f
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_common_features.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/common/features.cc.orig 2023-05-25 00:42:54 UTC
++++ ui/ozone/common/features.cc
+@@ -30,7 +30,7 @@ BASE_FEATURE(kWaylandSurfaceSubmissionInPixelCoordinat
+ // enabled.
+ BASE_FEATURE(kWaylandFractionalScaleV1,
+ "WaylandFractionalScaleV1",
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/devel/electron28/files/patch-ui_ozone_platform_headless_headless__surface__factory.cc b/devel/electron28/files/patch-ui_ozone_platform_headless_headless__surface__factory.cc
new file mode 100644
index 000000000000..4535eea84eb9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_headless_headless__surface__factory.cc
@@ -0,0 +1,20 @@
+--- ui/ozone/platform/headless/headless_surface_factory.cc.orig 2023-03-30 00:34:19 UTC
++++ ui/ozone/platform/headless/headless_surface_factory.cc
+@@ -34,7 +34,7 @@
+ #include "ui/ozone/platform/headless/headless_window_manager.h"
+ #include "ui/ozone/public/surface_ozone_canvas.h"
+
+-#if BUILDFLAG(ENABLE_VULKAN) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA))
++#if BUILDFLAG(ENABLE_VULKAN) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD))
+ #include "ui/ozone/platform/headless/vulkan_implementation_headless.h"
+ #endif
+
+@@ -281,7 +281,7 @@ std::unique_ptr<gpu::VulkanImplementation>
+ HeadlessSurfaceFactory::CreateVulkanImplementation(
+ bool use_swiftshader,
+ bool allow_protected_memory) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD)
+ return std::make_unique<VulkanImplementationHeadless>(use_swiftshader);
+ #else
+ return nullptr;
diff --git a/devel/electron28/files/patch-ui_ozone_platform_headless_ozone__platform__headless.cc b/devel/electron28/files/patch-ui_ozone_platform_headless_ozone__platform__headless.cc
new file mode 100644
index 000000000000..b156fd3a5f5b
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_headless_ozone__platform__headless.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/headless/ozone_platform_headless.cc.orig 2022-07-22 17:30:31 UTC
++++ ui/ozone/platform/headless/ozone_platform_headless.cc
+@@ -102,7 +102,7 @@ class OzonePlatformHeadless : public OzonePlatform {
+ }
+
+ // Desktop Linux, not CastOS.
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS)
+ const PlatformProperties& GetPlatformProperties() override {
+ static base::NoDestructor<OzonePlatform::PlatformProperties> properties;
+ static bool initialized = false;
diff --git a/devel/electron28/files/patch-ui_ozone_platform_headless_vulkan__implementation__headless.cc b/devel/electron28/files/patch-ui_ozone_platform_headless_vulkan__implementation__headless.cc
new file mode 100644
index 000000000000..570d3e1466f6
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_headless_vulkan__implementation__headless.cc
@@ -0,0 +1,29 @@
+--- ui/ozone/platform/headless/vulkan_implementation_headless.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/ozone/platform/headless/vulkan_implementation_headless.cc
+@@ -117,7 +117,7 @@ VulkanImplementationHeadless::ExportVkFenceToGpuFence(
+
+ VkExternalSemaphoreHandleTypeFlagBits
+ VulkanImplementationHeadless::GetExternalSemaphoreHandleType() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+ #else
+ return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
+@@ -127,7 +127,7 @@ VulkanImplementationHeadless::GetExternalSemaphoreHand
+ bool VulkanImplementationHeadless::CanImportGpuMemoryBuffer(
+ gpu::VulkanDeviceQueue* device_queue,
+ gfx::GpuMemoryBufferType memory_buffer_type) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ const auto& enabled_extensions = device_queue->enabled_extensions();
+ return gfx::HasExtension(enabled_extensions,
+ VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME) &&
+@@ -150,7 +150,7 @@ VulkanImplementationHeadless::CreateImageFromGpuMemory
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ auto tiling = VK_IMAGE_TILING_OPTIMAL;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (gmb_handle.native_pixmap_handle.modifier !=
+ gfx::NativePixmapHandle::kNoModifier) {
+ tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.cc
new file mode 100644
index 000000000000..a0c5d40538ce
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc
+@@ -230,7 +230,7 @@ void WaylandInputEmulate::EmulateTouch(int action,
+ wayland_proxy->FlushForTesting();
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void WaylandInputEmulate::ForceUseScreenCoordinatesOnce() {
+ force_use_screen_coordinates_once_ = true;
+ }
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.h b/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.h
new file mode 100644
index 000000000000..ad5adc33588a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_emulate_wayland__input__emulate.h
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/wayland/emulate/wayland_input_emulate.h.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/emulate/wayland_input_emulate.h
+@@ -61,7 +61,7 @@ class WaylandInputEmulate : public wl::WaylandProxy::D
+ int touch_id,
+ uint32_t request_id);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void ForceUseScreenCoordinatesOnce();
+ #endif
+
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_gpu_vulkan__implementation__wayland.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_gpu_vulkan__implementation__wayland.cc
new file mode 100644
index 000000000000..b238570624d8
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_gpu_vulkan__implementation__wayland.cc
@@ -0,0 +1,14 @@
+--- ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc.orig 2022-03-25 21:59:56 UTC
++++ ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc
+@@ -38,7 +38,11 @@ bool VulkanImplementationWayland::InitializeVulkanInst
+
+ path = path.Append("libvk_swiftshader.so");
+ } else {
++#if BUILDFLAG(IS_BSD)
++ path = base::FilePath("libvulkan.so");
++#else
+ path = base::FilePath("libvulkan.so.1");
++#endif
+ }
+
+ return vulkan_instance_.Initialize(path, required_extensions, {});
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.cc
new file mode 100644
index 000000000000..1d84c12619a1
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/wayland/host/wayland_toplevel_window.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+@@ -570,7 +570,7 @@ void WaylandToplevelWindow::HandleAuraToplevelConfigur
+ const bool did_active_change = is_active_ != window_states.is_activated;
+ is_active_ = window_states.is_activated;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // The tiled state affects the window geometry, so apply it here.
+ if (window_states.tiled_edges != tiled_state_) {
+ // This configure changes the decoration insets. We should adjust the
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.h b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.h
new file mode 100644
index 000000000000..afe029cf166a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__toplevel__window.h
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/wayland/host/wayland_toplevel_window.h.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/host/wayland_toplevel_window.h
+@@ -256,7 +256,7 @@ class WaylandToplevelWindow : public WaylandWindow,
+ // The display ID to switch to in case the state is `kFullscreen`.
+ int64_t fullscreen_display_id_ = display::kInvalidDisplayId;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Contains the current state of the tiled edges.
+ WindowTiledEdges tiled_state_;
+ #endif
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.cc
new file mode 100644
index 000000000000..4f4daed6eba8
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.cc
@@ -0,0 +1,44 @@
+--- ui/ozone/platform/wayland/host/wayland_window.cc.orig 2023-10-19 19:59:21 UTC
++++ ui/ozone/platform/wayland/host/wayland_window.cc
+@@ -233,7 +233,7 @@ void WaylandWindow::OnPointerFocusChanged(bool focused
+ // Whenever the window gets the pointer focus back, the cursor shape must be
+ // updated. Otherwise, it is invalidated upon wl_pointer::leave and is not
+ // restored by the Wayland compositor.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (focused && async_cursor_) {
+ async_cursor_->AddCursorLoadedCallback(
+ base::BindOnce(&WaylandWindow::OnCursorLoaded,
+@@ -490,7 +490,7 @@ bool WaylandWindow::ShouldUseNativeFrame() const {
+ void WaylandWindow::SetCursor(scoped_refptr<PlatformCursor> platform_cursor) {
+ DCHECK(platform_cursor);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto async_cursor = WaylandAsyncCursor::FromPlatformCursor(platform_cursor);
+
+ if (async_cursor_ == async_cursor) {
+@@ -661,7 +661,7 @@ std::string WaylandWindow::WindowStates::ToString() co
+ } else {
+ base::TrimString(states, " ", &states);
+ }
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ states += "; tiled_edges: ";
+ std::string tiled = "";
+ if (tiled_edges.left) {
+@@ -1111,12 +1111,12 @@ void WaylandWindow::UpdateCursorShape(scoped_refptr<Bi
+ cursor->bitmaps(), hotspot_in_dips,
+ std::ceil(cursor->cursor_image_scale_factor()));
+ }
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ cursor_ = cursor;
+ #endif
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void WaylandWindow::OnCursorLoaded(scoped_refptr<WaylandAsyncCursor> cursor,
+ scoped_refptr<BitmapCursor> bitmap_cursor) {
+ if (HasPointerFocus() && async_cursor_ == cursor && bitmap_cursor) {
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.h b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.h
new file mode 100644
index 000000000000..97ac4439dcb2
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_wayland__window.h
@@ -0,0 +1,38 @@
+--- ui/ozone/platform/wayland/host/wayland_window.h.orig 2023-10-19 19:59:21 UTC
++++ ui/ozone/platform/wayland/host/wayland_window.h
+@@ -39,7 +39,7 @@
+ #include "ui/platform_window/platform_window_init_properties.h"
+ #include "ui/platform_window/wm/wm_drag_handler.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/ozone/platform/wayland/host/wayland_async_cursor.h"
+ #endif
+
+@@ -241,7 +241,7 @@ class WaylandWindow : public PlatformWindow,
+ bool is_snapped_primary = false;
+ bool is_snapped_secondary = false;
+ bool is_floated = false;
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ WindowTiledEdges tiled_edges;
+ #endif
+
+@@ -492,7 +492,7 @@ class WaylandWindow : public PlatformWindow,
+
+ void UpdateCursorShape(scoped_refptr<BitmapCursor> cursor);
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void OnCursorLoaded(scoped_refptr<WaylandAsyncCursor> cursor,
+ scoped_refptr<BitmapCursor> bitmap_cursor);
+ #endif
+@@ -551,7 +551,7 @@ class WaylandWindow : public PlatformWindow,
+
+ wl::Object<zaura_surface> aura_surface_;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The current asynchronously loaded cursor (Linux specific).
+ scoped_refptr<WaylandAsyncCursor> async_cursor_;
+ #else
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_host_xdg__toplevel__wrapper__impl.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_xdg__toplevel__wrapper__impl.cc
new file mode 100644
index 000000000000..828547b82ef8
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_host_xdg__toplevel__wrapper__impl.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
+@@ -310,7 +310,7 @@ void XDGToplevelWrapperImpl::OnToplevelConfigure(void*
+ CheckIfWlArrayHasValue(states, XDG_TOPLEVEL_STATE_ACTIVATED),
+ };
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ if (xdg_toplevel_get_version(toplevel) >=
+ XDG_TOPLEVEL_STATE_TILED_LEFT_SINCE_VERSION) {
+ // All four tiled states have the same since version, so it is enough to
diff --git a/devel/electron28/files/patch-ui_ozone_platform_wayland_ozone__platform__wayland.cc b/devel/electron28/files/patch-ui_ozone_platform_wayland_ozone__platform__wayland.cc
new file mode 100644
index 000000000000..fb02c2fb031c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_wayland_ozone__platform__wayland.cc
@@ -0,0 +1,45 @@
+--- ui/ozone/platform/wayland/ozone_platform_wayland.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/wayland/ozone_platform_wayland.cc
+@@ -66,13 +66,13 @@
+ #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/ozone/platform/wayland/host/wayland_cursor_factory.h"
+ #else
+ #include "ui/ozone/common/bitmap_cursor_factory.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h"
+ #endif
+
+@@ -262,7 +262,7 @@ class OzonePlatformWayland : public OzonePlatform,
+
+ buffer_manager_connector_ = std::make_unique<WaylandBufferManagerConnector>(
+ connection_->buffer_manager_host());
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ cursor_factory_ = std::make_unique<WaylandCursorFactory>(connection_.get());
+ #else
+ cursor_factory_ = std::make_unique<BitmapCursorFactory>();
+@@ -272,7 +272,7 @@ class OzonePlatformWayland : public OzonePlatform,
+
+ supported_buffer_formats_ =
+ connection_->buffer_manager_host()->GetSupportedBufferFormats();
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ linux_ui_delegate_ =
+ std::make_unique<LinuxUiDelegateWayland>(connection_.get());
+ #endif
+@@ -507,7 +507,7 @@ class OzonePlatformWayland : public OzonePlatform,
+ DrmRenderNodePathFinder path_finder_;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::unique_ptr<LinuxUiDelegateWayland> linux_ui_delegate_;
+ #endif
+ };
diff --git a/devel/electron28/files/patch-ui_ozone_platform_x11_ozone__platform__x11.cc b/devel/electron28/files/patch-ui_ozone_platform_x11_ozone__platform__x11.cc
new file mode 100644
index 000000000000..c465aaa426ee
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_x11_ozone__platform__x11.cc
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/x11/ozone_platform_x11.cc.orig 2023-10-25 09:13:45 UTC
++++ ui/ozone/platform/x11/ozone_platform_x11.cc
+@@ -197,7 +197,7 @@ class OzonePlatformX11 : public OzonePlatform,
+ properties->supports_global_application_menus = true;
+ properties->app_modal_dialogs_use_event_blocker = true;
+ properties->fetch_buffer_formats_for_gmb_on_gpu = true;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ properties->supports_vaapi = true;
+ #endif
+
diff --git a/devel/electron28/files/patch-ui_ozone_platform_x11_vulkan__implementation__x11.cc b/devel/electron28/files/patch-ui_ozone_platform_x11_vulkan__implementation__x11.cc
new file mode 100644
index 000000000000..ab67e875d327
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_x11_vulkan__implementation__x11.cc
@@ -0,0 +1,14 @@
+--- ui/ozone/platform/x11/vulkan_implementation_x11.cc.orig 2022-03-25 21:59:56 UTC
++++ ui/ozone/platform/x11/vulkan_implementation_x11.cc
+@@ -58,7 +58,11 @@ bool VulkanImplementationX11::InitializeVulkanInstance
+
+ path = path.Append("libvk_swiftshader.so");
+ } else {
++#if BUILDFLAG(IS_BSD)
++ path = base::FilePath("libvulkan.so");
++#else
+ path = base::FilePath("libvulkan.so.1");
++#endif
+ }
+
+ return vulkan_instance_.Initialize(path, required_extensions, {});
diff --git a/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.cc b/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.cc
new file mode 100644
index 000000000000..6187193b98bf
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.cc
@@ -0,0 +1,20 @@
+--- ui/ozone/platform/x11/x11_screen_ozone.cc.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/x11/x11_screen_ozone.cc
+@@ -22,7 +22,7 @@
+ #include "ui/ozone/platform/x11/x11_window.h"
+ #include "ui/ozone/platform/x11/x11_window_manager.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -77,7 +77,7 @@ X11ScreenOzone::X11ScreenOzone()
+ window_manager_(X11WindowManager::GetInstance()),
+ x11_display_manager_(std::make_unique<XDisplayManager>(this)) {
+ DCHECK(window_manager_);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (auto* linux_ui = ui::LinuxUi::instance()) {
+ display_scale_factor_observer_.Observe(linux_ui);
+ }
diff --git a/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.h b/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.h
new file mode 100644
index 000000000000..c621eb5e709a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_platform_x11_x11__screen__ozone.h
@@ -0,0 +1,11 @@
+--- ui/ozone/platform/x11/x11_screen_ozone.h.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/platform/x11/x11_screen_ozone.h
+@@ -102,7 +102,7 @@ class X11ScreenOzone : public PlatformScreen,
+ // Indicates that |this| is initialized.
+ bool initialized_ = false;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ base::ScopedObservation<ui::LinuxUi, DeviceScaleFactorObserver>
+ display_scale_factor_observer_{this};
+ #endif
diff --git a/devel/electron28/files/patch-ui_ozone_public_ozone__platform.h b/devel/electron28/files/patch-ui_ozone_public_ozone__platform.h
new file mode 100644
index 000000000000..938346e3394e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_public_ozone__platform.h
@@ -0,0 +1,11 @@
+--- ui/ozone/public/ozone_platform.h.orig 2023-10-25 09:13:45 UTC
++++ ui/ozone/public/ozone_platform.h
+@@ -147,7 +147,7 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
+ // back via gpu extra info.
+ bool fetch_buffer_formats_for_gmb_on_gpu = false;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
+ // Linux. At the moment, VA-API Linux implementation supports only X11
+ // backend. This implementation must be refactored to support Ozone
diff --git a/devel/electron28/files/patch-ui_ozone_public_platform__screen.h b/devel/electron28/files/patch-ui_ozone_public_platform__screen.h
new file mode 100644
index 000000000000..9ea3eaaeb95d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_public_platform__screen.h
@@ -0,0 +1,11 @@
+--- ui/ozone/public/platform_screen.h.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/public/platform_screen.h
+@@ -15,7 +15,7 @@
+ #include "ui/gfx/gpu_extra_info.h"
+ #include "ui/gfx/native_widget_types.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
diff --git a/devel/electron28/files/patch-ui_ozone_test_mock__platform__window__delegate.h b/devel/electron28/files/patch-ui_ozone_test_mock__platform__window__delegate.h
new file mode 100644
index 000000000000..e688d0c00237
--- /dev/null
+++ b/devel/electron28/files/patch-ui_ozone_test_mock__platform__window__delegate.h
@@ -0,0 +1,11 @@
+--- ui/ozone/test/mock_platform_window_delegate.h.orig 2023-11-29 21:40:44 UTC
++++ ui/ozone/test/mock_platform_window_delegate.h
+@@ -32,7 +32,7 @@ class MockPlatformWindowDelegate : public PlatformWind
+ MOCK_METHOD2(OnWindowStateChanged,
+ void(PlatformWindowState old_state,
+ PlatformWindowState new_state));
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ MOCK_METHOD1(OnWindowTiledStateChanged,
+ void(WindowTiledEdges new_tiled_edges));
+ MOCK_METHOD0(OnFullscreenModeChanged, void());
diff --git a/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.cc b/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.cc
new file mode 100644
index 000000000000..6ec40344ea6c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/platform_window/platform_window_delegate.cc.orig 2023-05-25 00:42:54 UTC
++++ ui/platform_window/platform_window_delegate.cc
+@@ -36,7 +36,7 @@ PlatformWindowDelegate::PlatformWindowDelegate() = def
+
+ PlatformWindowDelegate::~PlatformWindowDelegate() = default;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ void PlatformWindowDelegate::OnWindowTiledStateChanged(
+ WindowTiledEdges new_tiled_edges) {}
+ #endif
diff --git a/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.h b/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.h
new file mode 100644
index 000000000000..d240e2b2bb5b
--- /dev/null
+++ b/devel/electron28/files/patch-ui_platform__window_platform__window__delegate.h
@@ -0,0 +1,11 @@
+--- ui/platform_window/platform_window_delegate.h.orig 2023-05-25 00:42:54 UTC
++++ ui/platform_window/platform_window_delegate.h
+@@ -134,7 +134,7 @@ class COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindow
+ virtual void OnWindowStateChanged(PlatformWindowState old_state,
+ PlatformWindowState new_state) = 0;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Notifies the delegate that the tiled state of the window edges has changed.
+ virtual void OnWindowTiledStateChanged(WindowTiledEdges new_tiled_edges);
+ #endif
diff --git a/devel/electron28/files/patch-ui_platform__window_platform__window__init__properties.h b/devel/electron28/files/patch-ui_platform__window_platform__window__init__properties.h
new file mode 100644
index 000000000000..904b8b31c442
--- /dev/null
+++ b/devel/electron28/files/patch-ui_platform__window_platform__window__init__properties.h
@@ -0,0 +1,20 @@
+--- ui/platform_window/platform_window_init_properties.h.orig 2022-09-24 10:57:32 UTC
++++ ui/platform_window/platform_window_init_properties.h
+@@ -56,7 +56,7 @@ class WorkspaceExtensionDelegate;
+ class ScenicWindowDelegate;
+ #endif
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ class X11ExtensionDelegate;
+ #endif
+
+@@ -118,7 +118,7 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindo
+
+ PlatformWindowShadowType shadow_type = PlatformWindowShadowType::kDefault;
+
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool prefer_dark_theme = false;
+ raw_ptr<gfx::ImageSkia> icon = nullptr;
+ absl::optional<SkColor> background_color;
diff --git a/devel/electron28/files/patch-ui_strings_app__locale__settings.grd b/devel/electron28/files/patch-ui_strings_app__locale__settings.grd
new file mode 100644
index 000000000000..3b29ccb6f239
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_app__locale__settings.grd
@@ -0,0 +1,11 @@
+--- ui/strings/app_locale_settings.grd.orig 2022-07-22 17:30:31 UTC
++++ ui/strings/app_locale_settings.grd
+@@ -218,7 +218,7 @@
+ 75%
+ </message>
+ </if>
+- <if expr="is_linux or is_android or is_bsd or is_fuchsia">
++ <if expr="is_posix or is_android or is_bsd or is_fuchsia">
+ <!-- The font used in Web UI (e.g. History). Note that these are only
+ backups. We try to use the system font if possible. -->
+ <message name="IDS_WEB_FONT_FAMILY" use_name_for_id="true">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__bn.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__bn.xtb
new file mode 100644
index 000000000000..1726e72f6580
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__bn.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_bn.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_bn.xtb
+@@ -10,7 +10,7 @@
+ <translation id="IDS_WEB_FONT_FAMILY">Vrinda</translation>
+ <translation id="IDS_WEB_FONT_FAMILY_XP">Vrinda</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Lohit Bengali</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ja.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ja.xtb
new file mode 100644
index 000000000000..36dfea3003d0
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ja.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_ja.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_ja.xtb
+@@ -12,7 +12,7 @@
+ <if expr="is_ios">
+ <translation id="IDS_WEB_FONT_FAMILY">Helvetica,Hiragino Kaku Gothic ProN,sans-serif</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">VL PGothic,Sazanami Gothic,Kochi Gothic,sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ko.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ko.xtb
new file mode 100644
index 000000000000..48faa3043711
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ko.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_ko.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_ko.xtb
+@@ -12,7 +12,7 @@
+ <if expr="is_ios">
+ <translation id="IDS_WEB_FONT_FAMILY">Helvetica,Apple SD Gothic Neo,AppleGothic,sans-serif</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK KR,NanumGothic,UnDotum,Baekmuk Gulim,sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ml.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ml.xtb
new file mode 100644
index 000000000000..00647e1e4e74
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__ml.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_ml.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_ml.xtb
+@@ -9,7 +9,7 @@
+ <translation id="IDS_WEB_FONT_FAMILY">'Segoe UI',Arial,AnjaliOldLipi,Rachana,Kartika</translation>
+ <translation id="IDS_WEB_FONT_FAMILY_XP">Arial,AnjaliOldLipi,Rachana,Kartika</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Arial,AnjaliOldLipi,Rachana,Kartika,sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__th.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__th.xtb
new file mode 100644
index 000000000000..0aed42526f65
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__th.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_th.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_th.xtb
+@@ -6,7 +6,7 @@
+ <translation id="IDS_WEB_FONT_FAMILY">Tahoma,sans-serif</translation>
+ <translation id="IDS_WEB_FONT_FAMILY_XP">Tahoma,sans-serif</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Norasi,Waree,Garuda,Loma,sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-CN.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-CN.xtb
new file mode 100644
index 000000000000..e721fbf1758d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-CN.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_zh-CN.xtb.orig 2022-09-24 10:57:32 UTC
++++ ui/strings/translations/app_locale_settings_zh-CN.xtb
+@@ -12,7 +12,7 @@
+ <if expr="is_ios">
+ <translation id="IDS_WEB_FONT_FAMILY">Helvetica,PingFang SC,STHeiti,sans-serif</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-TW.xtb b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-TW.xtb
new file mode 100644
index 000000000000..f86698d8a9e1
--- /dev/null
+++ b/devel/electron28/files/patch-ui_strings_translations_app__locale__settings__zh-TW.xtb
@@ -0,0 +1,11 @@
+--- ui/strings/translations/app_locale_settings_zh-TW.xtb.orig 2023-02-01 18:43:52 UTC
++++ ui/strings/translations/app_locale_settings_zh-TW.xtb
+@@ -12,7 +12,7 @@
+ <if expr="is_ios">
+ <translation id="IDS_WEB_FONT_FAMILY">Helvetica,PingFang TC,Heiti TC,sans-serif</translation>
+ </if>
+-<if expr="is_linux">
++<if expr="is_posix">
+ <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK TC, WenQuanYi Zen Hei, sans-serif</translation>
+ </if>
+ <if expr="is_chromeos">
diff --git a/devel/electron28/files/patch-ui_views_controls_prefix__selector.cc b/devel/electron28/files/patch-ui_views_controls_prefix__selector.cc
new file mode 100644
index 000000000000..c0d111d1996c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_controls_prefix__selector.cc
@@ -0,0 +1,11 @@
+--- ui/views/controls/prefix_selector.cc.orig 2022-09-24 10:57:32 UTC
++++ ui/views/controls/prefix_selector.cc
+@@ -174,7 +174,7 @@ bool PrefixSelector::ShouldDoLearning() {
+ return false;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool PrefixSelector::SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
diff --git a/devel/electron28/files/patch-ui_views_controls_prefix__selector.h b/devel/electron28/files/patch-ui_views_controls_prefix__selector.h
new file mode 100644
index 000000000000..d272917a0ffd
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_controls_prefix__selector.h
@@ -0,0 +1,11 @@
+--- ui/views/controls/prefix_selector.h.orig 2022-08-31 12:19:35 UTC
++++ ui/views/controls/prefix_selector.h
+@@ -83,7 +83,7 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInp
+ ukm::SourceId GetClientSourceForMetrics() const override;
+ bool ShouldDoLearning() override;
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
diff --git a/devel/electron28/files/patch-ui_views_controls_textfield_textfield.cc b/devel/electron28/files/patch-ui_views_controls_textfield_textfield.cc
new file mode 100644
index 000000000000..5dba6033025b
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_controls_textfield_textfield.cc
@@ -0,0 +1,64 @@
+--- ui/views/controls/textfield/textfield.cc.orig 2024-01-03 23:43:15 UTC
++++ ui/views/controls/textfield/textfield.cc
+@@ -81,7 +81,7 @@
+ #include "base/win/win_util.h"
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/text_input_flags.h"
+ #include "ui/linux/linux_ui.h"
+@@ -176,7 +176,7 @@ bool IsControlKeyModifier(int flags) {
+ // Control-modified key combination, but we cannot extend it to other platforms
+ // as Control has different meanings and behaviors.
+ // https://crrev.com/2580483002/#msg46
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ return flags & ui::EF_CONTROL_DOWN;
+ #else
+ return false;
+@@ -747,7 +747,7 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event
+ if (!textfield)
+ return handled;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ auto* linux_ui = ui::LinuxUi::instance();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
+ if (!handled && linux_ui &&
+@@ -930,7 +930,7 @@ bool Textfield::SkipDefaultKeyEventProcessing(const ui
+ }
+
+ bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Skip any accelerator handling that conflicts with custom keybindings.
+ auto* linux_ui = ui::LinuxUi::instance();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
+@@ -1941,7 +1941,7 @@ bool Textfield::ShouldDoLearning() {
+ return false;
+ }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // TODO(https://crbug.com/952355): Implement this method to support Korean IME
+ // reconversion feature on native text fields (e.g. find bar).
+ bool Textfield::SetCompositionFromExistingText(
+@@ -2437,14 +2437,14 @@ ui::TextEditCommand Textfield::GetCommandForKeyEvent(
+ #endif
+ return ui::TextEditCommand::DELETE_BACKWARD;
+ }
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Only erase by line break on Linux and ChromeOS.
+ if (shift)
+ return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE;
+ #endif
+ return ui::TextEditCommand::DELETE_WORD_BACKWARD;
+ case ui::VKEY_DELETE:
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Only erase by line break on Linux and ChromeOS.
+ if (shift && control)
+ return ui::TextEditCommand::DELETE_TO_END_OF_LINE;
diff --git a/devel/electron28/files/patch-ui_views_controls_textfield_textfield.h b/devel/electron28/files/patch-ui_views_controls_textfield_textfield.h
new file mode 100644
index 000000000000..4b9327a056d7
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_controls_textfield_textfield.h
@@ -0,0 +1,20 @@
+--- ui/views/controls/textfield/textfield.h.orig 2023-10-19 19:59:22 UTC
++++ ui/views/controls/textfield/textfield.h
+@@ -44,7 +44,7 @@
+ #include "ui/views/view.h"
+ #include "ui/views/word_lookup_client.h"
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ #include <vector>
+ #endif
+
+@@ -452,7 +452,7 @@ class VIEWS_EXPORT Textfield : public View,
+ // Set whether the text should be used to improve typing suggestions.
+ void SetShouldDoLearning(bool value) { should_do_learning_ = value; }
+
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ bool SetCompositionFromExistingText(
+ const gfx::Range& range,
+ const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
diff --git a/devel/electron28/files/patch-ui_views_corewm_tooltip__aura.cc b/devel/electron28/files/patch-ui_views_corewm_tooltip__aura.cc
new file mode 100644
index 000000000000..b8dca2affbcd
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_corewm_tooltip__aura.cc
@@ -0,0 +1,11 @@
+--- ui/views/corewm/tooltip_aura.cc.orig 2023-05-25 00:42:54 UTC
++++ ui/views/corewm/tooltip_aura.cc
+@@ -38,7 +38,7 @@ namespace {
+ bool CanUseTranslucentTooltipWidget() {
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_WIN)
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ return false;
+ #else
+ return true;
diff --git a/devel/electron28/files/patch-ui_views_examples_widget__example.cc b/devel/electron28/files/patch-ui_views_examples_widget__example.cc
new file mode 100644
index 000000000000..cfbbc147a7d9
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_examples_widget__example.cc
@@ -0,0 +1,11 @@
+--- ui/views/examples/widget_example.cc.orig 2023-02-01 18:43:52 UTC
++++ ui/views/examples/widget_example.cc
+@@ -49,7 +49,7 @@ void WidgetExample::CreateExampleView(View* container)
+ modal_button->SetCallback(
+ base::BindRepeating(&WidgetExample::CreateDialogWidget,
+ base::Unretained(this), modal_button, true));
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+ // Windows does not support TYPE_CONTROL top-level widgets.
+ LabelButton* control_button = BuildButton(
+ container, GetStringUTF16(IDS_WIDGET_CHILD_WIDGET_BUTTON_LABEL));
diff --git a/devel/electron28/files/patch-ui_views_focus_focus__manager.cc b/devel/electron28/files/patch-ui_views_focus_focus__manager.cc
new file mode 100644
index 000000000000..e35105ec800d
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_focus_focus__manager.cc
@@ -0,0 +1,20 @@
+--- ui/views/focus/focus_manager.cc.orig 2023-08-10 01:49:10 UTC
++++ ui/views/focus/focus_manager.cc
+@@ -577,7 +577,7 @@ bool FocusManager::RedirectAcceleratorToBubbleAnchorWi
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Processing an accelerator can delete things. Because we
+ // need these objects afterwards on Linux, save widget_ as weak pointer and
+ // save the close_on_deactivate property value of widget_delegate in a
+@@ -594,7 +594,7 @@ bool FocusManager::RedirectAcceleratorToBubbleAnchorWi
+
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ // Need to manually close the bubble widget on Linux. On Linux when the
+ // bubble is shown, the main widget remains active. Because of that when
+ // focus is set to the main widget to process accelerator, the main widget
diff --git a/devel/electron28/files/patch-ui_views_style_platform__style.cc b/devel/electron28/files/patch-ui_views_style_platform__style.cc
new file mode 100644
index 000000000000..7f3181a4f7ea
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_style_platform__style.cc
@@ -0,0 +1,29 @@
+--- ui/views/style/platform_style.cc.orig 2023-02-01 18:43:52 UTC
++++ ui/views/style/platform_style.cc
+@@ -17,7 +17,7 @@
+ #include "ui/views/controls/focusable_border.h"
+ #include "ui/views/controls/scrollbar/scroll_bar_views.h"
+
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
+ #endif
+
+@@ -50,7 +50,7 @@ const View::FocusBehavior PlatformStyle::kDefaultFocus
+ // Linux clips bubble windows that extend outside their parent window
+ // bounds.
+ const bool PlatformStyle::kAdjustBubbleIfOffscreen =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ false;
+ #else
+ true;
+@@ -58,7 +58,7 @@ const bool PlatformStyle::kAdjustBubbleIfOffscreen =
+
+ // static
+ std::unique_ptr<ScrollBar> PlatformStyle::CreateScrollBar(bool is_horizontal) {
+-#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ return std::make_unique<OverlayScrollBar>(is_horizontal);
+ #else
+ return std::make_unique<ScrollBarViews>(is_horizontal);
diff --git a/devel/electron28/files/patch-ui_views_test_ui__controls__factory__desktop__aura__ozone.cc b/devel/electron28/files/patch-ui_views_test_ui__controls__factory__desktop__aura__ozone.cc
new file mode 100644
index 000000000000..4d06b49b0699
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_test_ui__controls__factory__desktop__aura__ozone.cc
@@ -0,0 +1,11 @@
+--- ui/views/test/ui_controls_factory_desktop_aura_ozone.cc.orig 2023-11-29 21:40:45 UTC
++++ ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
+@@ -284,7 +284,7 @@ bool SendTouchEventsNotifyWhenDone(int action,
+ }
+ #endif
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // static
+ void ForceUseScreenCoordinatesOnce() {
+ g_ozone_ui_controls_test_helper->ForceUseScreenCoordinatesOnce();
diff --git a/devel/electron28/files/patch-ui_views_views__delegate.cc b/devel/electron28/files/patch-ui_views_views__delegate.cc
new file mode 100644
index 000000000000..5a24231acc6f
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_views__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.cc.orig 2022-02-28 16:54:41 UTC
++++ ui/views/views_delegate.cc
+@@ -95,7 +95,7 @@ bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow
+ return false;
+ }
+ #elif BUILDFLAG(ENABLE_DESKTOP_AURA) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return nullptr;
+ }
diff --git a/devel/electron28/files/patch-ui_views_views__delegate.h b/devel/electron28/files/patch-ui_views_views__delegate.h
new file mode 100644
index 000000000000..90d0e4d91a68
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_views__delegate.h
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.h.orig 2022-02-28 16:54:41 UTC
++++ ui/views/views_delegate.h
+@@ -139,7 +139,7 @@ class VIEWS_EXPORT ViewsDelegate {
+ // environment.
+ virtual bool IsWindowInMetro(gfx::NativeWindow window) const;
+ #elif BUILDFLAG(ENABLE_DESKTOP_AURA) && \
+- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
++ (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD))
+ virtual gfx::ImageSkia* GetDefaultWindowIcon() const;
+ #endif
+
diff --git a/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.cc b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.cc
new file mode 100644
index 000000000000..34c95c85c61e
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.cc
@@ -0,0 +1,11 @@
+--- ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc.orig 2023-08-10 01:49:10 UTC
++++ ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
+@@ -194,7 +194,7 @@ DragOperation DesktopDragDropClientOzone::StartDragAnd
+ return drag_operation_;
+ }
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void DesktopDragDropClientOzone::UpdateDragImage(const gfx::ImageSkia& image,
+ const gfx::Vector2d& offset) {
+ DCHECK(drag_handler_);
diff --git a/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.h b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.h
new file mode 100644
index 000000000000..2826c015c9bb
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__drag__drop__client__ozone.h
@@ -0,0 +1,20 @@
+--- ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h.orig 2023-02-01 18:43:52 UTC
++++ ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
+@@ -66,7 +66,7 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
+ // The offset of |drag_widget_| relative to the mouse position.
+ gfx::Vector2d offset;
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The last received drag location. The drag widget is moved asynchronously
+ // so its position is updated when the UI thread has time for that. When
+ // the first change to the location happens, a call to UpdateDragWidget()
+@@ -87,7 +87,7 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
+ const gfx::Point& root_location,
+ int allowed_operations,
+ ui::mojom::DragEventSource source) override;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void UpdateDragImage(const gfx::ImageSkia& image,
+ const gfx::Vector2d& offset) override;
+ #endif
diff --git a/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc
new file mode 100644
index 000000000000..a4ffd9fe212c
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc
@@ -0,0 +1,38 @@
+--- ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc.orig 2023-11-29 21:40:45 UTC
++++ ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+@@ -44,7 +44,7 @@
+ #include "ui/wm/core/window_util.h"
+ #include "ui/wm/public/window_move_client.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_linux.h"
+ #endif
+
+@@ -265,7 +265,7 @@ void DesktopWindowTreeHostPlatform::Init(const Widget:
+ if (params.type == Widget::InitParams::TYPE_WINDOW)
+ GetContentWindow()->SetProperty(aura::client::kAnimationsDisabledKey, true);
+
+-#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ const bool requires_accelerated_widget = params.requires_accelerated_widget;
+ #else
+ const bool requires_accelerated_widget = false;
+@@ -349,7 +349,7 @@ DesktopWindowTreeHostPlatform::CreateDragDropClient()
+ DesktopWindowTreeHostPlatform::CreateDragDropClient() {
+ ui::WmDragHandler* drag_handler = ui::GetWmDragHandler(*(platform_window()));
+ std::unique_ptr<DesktopDragDropClientOzone> drag_drop_client =
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::make_unique<DesktopDragDropClientOzoneLinux>(window(), drag_handler);
+ #else
+ std::make_unique<DesktopDragDropClientOzone>(window(), drag_handler);
+@@ -1084,7 +1084,7 @@ bool DesktopWindowTreeHostPlatform::RotateFocusForWidg
+ // DesktopWindowTreeHost:
+
+ // Linux subclasses this host and adds some Linux specific bits.
+-#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_BSD)
+ // static
+ DesktopWindowTreeHost* DesktopWindowTreeHost::Create(
+ internal::NativeWidgetDelegate* native_widget_delegate,
diff --git a/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform__impl__interactive__uitest.cc b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform__impl__interactive__uitest.cc
new file mode 100644
index 000000000000..384ce5dc215a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform__impl__interactive__uitest.cc
@@ -0,0 +1,11 @@
+--- ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc.orig 2023-03-30 00:34:19 UTC
++++ ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc
+@@ -21,7 +21,7 @@
+ #include "ui/views/widget/widget_delegate.h"
+ #include "ui/views/window/native_frame_view.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
+ #include "ui/views/widget/desktop_aura/window_event_filter_linux.h"
+ using DesktopWindowTreeHostPlatformImpl = views::DesktopWindowTreeHostLinux;
diff --git a/devel/electron28/files/patch-ui_views_widget_widget.cc b/devel/electron28/files/patch-ui_views_widget_widget.cc
new file mode 100644
index 000000000000..36f1c827bbef
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_widget.cc
@@ -0,0 +1,20 @@
+--- ui/views/widget/widget.cc.orig 2023-11-29 21:40:45 UTC
++++ ui/views/widget/widget.cc
+@@ -54,7 +54,7 @@
+ #include "ui/views/window/custom_frame_view.h"
+ #include "ui/views/window/dialog_delegate.h"
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+
+@@ -2068,7 +2068,7 @@ const ui::NativeTheme* Widget::GetNativeTheme() const
+ if (parent_)
+ return parent_->GetNativeTheme();
+
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ if (auto* linux_ui_theme = ui::LinuxUiTheme::GetForWindow(GetNativeWindow()))
+ return linux_ui_theme->GetNativeTheme();
+ #endif
diff --git a/devel/electron28/files/patch-ui_views_widget_widget.h b/devel/electron28/files/patch-ui_views_widget_widget.h
new file mode 100644
index 000000000000..14c84d352712
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_widget_widget.h
@@ -0,0 +1,11 @@
+--- ui/views/widget/widget.h.orig 2023-11-29 21:40:45 UTC
++++ ui/views/widget/widget.h
+@@ -417,7 +417,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWid
+ // If set, the widget was created in headless mode.
+ bool headless_mode = false;
+
+-#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
++#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD))
+ // Indicates whether the desktop native widget is required for the widget.
+ // This may enforce changing the type of the underlying platform window.
+ // See crbug.com/1280332
diff --git a/devel/electron28/files/patch-ui_views_window_custom__frame__view.cc b/devel/electron28/files/patch-ui_views_window_custom__frame__view.cc
new file mode 100644
index 000000000000..afa50f7176c3
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_window_custom__frame__view.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/custom_frame_view.cc.orig 2022-10-24 13:33:33 UTC
++++ ui/views/window/custom_frame_view.cc
+@@ -266,7 +266,7 @@ int CustomFrameView::CaptionButtonY() const {
+ // drawn flush with the screen edge, they still obey Fitts' Law.
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_BSD)
+ return FrameBorderThickness();
+ #else
+ return frame_->IsMaximized() ? FrameBorderThickness() : kFrameShadowThickness;
diff --git a/devel/electron28/files/patch-ui_views_window_dialog__delegate.cc b/devel/electron28/files/patch-ui_views_window_dialog__delegate.cc
new file mode 100644
index 000000000000..00b080ca1e6a
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_window_dialog__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/dialog_delegate.cc.orig 2023-11-29 21:40:45 UTC
++++ ui/views/window/dialog_delegate.cc
+@@ -79,7 +79,7 @@ bool DialogDelegate::CanSupportCustomFrame(gfx::Native
+
+ // static
+ bool DialogDelegate::CanSupportCustomFrame(gfx::NativeView parent) {
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ BUILDFLAG(ENABLE_DESKTOP_AURA)
+ // The new style doesn't support unparented dialogs on Linux desktop.
+ return parent != nullptr;
diff --git a/devel/electron28/files/patch-ui_views_window_frame__background.cc b/devel/electron28/files/patch-ui_views_window_frame__background.cc
new file mode 100644
index 000000000000..9766c76c32d0
--- /dev/null
+++ b/devel/electron28/files/patch-ui_views_window_frame__background.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/frame_background.cc.orig 2023-10-19 19:59:22 UTC
++++ ui/views/window/frame_background.cc
+@@ -110,7 +110,7 @@ void FrameBackground::PaintMaximized(gfx::Canvas* canv
+ int width) const {
+ // Fill the top with the frame color first so we have a constant background
+ // for areas not covered by the theme image.
+-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
++#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)) && \
+ BUILDFLAG(ENABLE_DESKTOP_AURA)
+ ui::NativeTheme::FrameTopAreaExtraParams frame_top_area;
+ frame_top_area.use_custom_frame = use_custom_frame_;
diff --git a/devel/electron28/files/patch-v8_BUILD.gn b/devel/electron28/files/patch-v8_BUILD.gn
new file mode 100644
index 000000000000..d622fe14ca87
--- /dev/null
+++ b/devel/electron28/files/patch-v8_BUILD.gn
@@ -0,0 +1,58 @@
+--- v8/BUILD.gn.orig 2023-12-20 07:12:20 UTC
++++ v8/BUILD.gn
+@@ -1429,6 +1429,14 @@ config("toolchain") {
+ } else if (target_os == "chromeos") {
+ defines += [ "V8_HAVE_TARGET_OS" ]
+ defines += [ "V8_TARGET_OS_CHROMEOS" ]
++ } else if (target_os == "openbsd") {
++ defines += [ "V8_HAVE_TARGET_OS" ]
++ defines += [ "V8_TARGET_OS_OPENBSD" ]
++ defines += [ "V8_TARGET_OS_BSD" ]
++ } else if (target_os == "freebsd") {
++ defines += [ "V8_HAVE_TARGET_OS" ]
++ defines += [ "V8_TARGET_OS_FREEBSD" ]
++ defines += [ "V8_TARGET_OS_BSD" ]
+ }
+
+ # TODO(infra): Support v8_enable_prof on Windows.
+@@ -2392,6 +2400,12 @@ template("run_mksnapshot") {
+ if (!v8_enable_builtins_profiling && v8_enable_builtins_reordering) {
+ args += [ "--reorder-builtins" ]
+ }
++
++ if (v8_current_cpu == "x86") {
++ args -= [
++ "--abort-on-bad-builtin-profile-data",
++ ]
++ }
+ }
+
+ # This is needed to distinguish between generating code for the simulator
+@@ -6252,7 +6266,7 @@ v8_component("v8_libbase") {
+ }
+ }
+
+- if (is_linux || is_chromeos) {
++ if ((is_linux || is_chromeos) && !is_bsd) {
+ sources += [
+ "src/base/debug/stack_trace_posix.cc",
+ "src/base/platform/platform-linux.cc",
+@@ -6263,6 +6277,18 @@ v8_component("v8_libbase") {
+ "dl",
+ "rt",
+ ]
++ } else if (is_openbsd) {
++ sources += [
++ "src/base/debug/stack_trace_posix.cc",
++ "src/base/platform/platform-openbsd.cc",
++ ]
++ libs = [ "execinfo" ]
++ } else if (is_freebsd) {
++ sources += [
++ "src/base/debug/stack_trace_posix.cc",
++ "src/base/platform/platform-freebsd.cc",
++ ]
++ libs = [ "execinfo" ]
+ } else if (current_os == "aix") {
+ sources += [
+ "src/base/debug/stack_trace_posix.cc",
diff --git a/devel/electron28/files/patch-v8_include_v8-internal.h b/devel/electron28/files/patch-v8_include_v8-internal.h
new file mode 100644
index 000000000000..baa7b67befed
--- /dev/null
+++ b/devel/electron28/files/patch-v8_include_v8-internal.h
@@ -0,0 +1,11 @@
+--- v8/include/v8-internal.h.orig 2023-11-29 21:41:53 UTC
++++ v8/include/v8-internal.h
+@@ -175,7 +175,7 @@ using SandboxedPointer_t = Address;
+ #ifdef V8_ENABLE_SANDBOX
+
+ // Size of the sandbox, excluding the guard regions surrounding it.
+-#ifdef V8_TARGET_OS_ANDROID
++#if defined(V8_TARGET_OS_ANDROID) || defined(V8_TARGET_OS_OPENBSD)
+ // On Android, most 64-bit devices seem to be configured with only 39 bits of
+ // virtual address space for userspace. As such, limit the sandbox to 128GB (a
+ // quarter of the total available address space).
diff --git a/devel/electron28/files/patch-v8_include_v8config.h b/devel/electron28/files/patch-v8_include_v8config.h
new file mode 100644
index 000000000000..36d687eccd74
--- /dev/null
+++ b/devel/electron28/files/patch-v8_include_v8config.h
@@ -0,0 +1,37 @@
+--- v8/include/v8config.h.orig 2023-04-10 14:01:56 UTC
++++ v8/include/v8config.h
+@@ -184,6 +184,8 @@ path. Add it with -I<path> to the command line
+ && !defined(V8_TARGET_OS_FUCHSIA) \
+ && !defined(V8_TARGET_OS_IOS) \
+ && !defined(V8_TARGET_OS_LINUX) \
++ && !defined(V8_TARGET_OS_OPENBSD) \
++ && !defined(V8_TARGET_OS_FREEBSD) \
+ && !defined(V8_TARGET_OS_MACOS) \
+ && !defined(V8_TARGET_OS_WIN) \
+ && !defined(V8_TARGET_OS_CHROMEOS)
+@@ -196,6 +198,8 @@ path. Add it with -I<path> to the command line
+ || defined(V8_TARGET_OS_FUCHSIA) \
+ || defined(V8_TARGET_OS_IOS) \
+ || defined(V8_TARGET_OS_LINUX) \
++ || defined(V8_TARGET_OS_OPENBSD) \
++ || defined(V8_TARGET_OS_FREEBSD) \
+ || defined(V8_TARGET_OS_MACOS) \
+ || defined(V8_TARGET_OS_WIN) \
+ || defined(V8_TARGET_OS_CHROMEOS)
+@@ -217,6 +221,16 @@ path. Add it with -I<path> to the command line
+
+ #ifdef V8_OS_LINUX
+ # define V8_TARGET_OS_LINUX
++#endif
++
++#ifdef V8_OS_OPENBSD
++# define V8_TARGET_OS_OPENBSD
++# define V8_TARGET_OS_BSD
++#endif
++
++#ifdef V8_OS_FREEBSD
++# define V8_TARGET_OS_OPENBSD
++# define V8_TARGET_OS_BSD
+ #endif
+
+ #ifdef V8_OS_MACOS
diff --git a/devel/electron28/files/patch-v8_src_api_api.cc b/devel/electron28/files/patch-v8_src_api_api.cc
new file mode 100644
index 000000000000..b5283cbf386e
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_api_api.cc
@@ -0,0 +1,20 @@
+--- v8/src/api/api.cc.orig 2023-11-29 21:41:53 UTC
++++ v8/src/api/api.cc
+@@ -141,7 +141,7 @@
+ #include "src/wasm/wasm-serialization.h"
+ #endif // V8_ENABLE_WEBASSEMBLY
+
+-#if V8_OS_LINUX || V8_OS_DARWIN || V8_OS_FREEBSD
++#if V8_OS_LINUX || V8_OS_DARWIN || V8_OS_FREEBSD || V8_OS_OPENBSD
+ #include <signal.h>
+ #include <unistd.h>
+
+@@ -6356,7 +6356,7 @@ bool v8::V8::Initialize(const int build_config) {
+ return true;
+ }
+
+-#if V8_OS_LINUX || V8_OS_DARWIN
++#if V8_OS_LINUX || V8_OS_DARWIN || V8_OS_FREEBSD || V8_OS_OPENBSD
+ bool TryHandleWebAssemblyTrapPosix(int sig_code, siginfo_t* info,
+ void* context) {
+ #if V8_ENABLE_WEBASSEMBLY && V8_TRAP_HANDLER_SUPPORTED
diff --git a/devel/electron28/files/patch-v8_src_base_atomicops.h b/devel/electron28/files/patch-v8_src_base_atomicops.h
new file mode 100644
index 000000000000..09d81e53e794
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_atomicops.h
@@ -0,0 +1,24 @@
+--- v8/src/base/atomicops.h.orig 2023-10-19 20:00:30 UTC
++++ v8/src/base/atomicops.h
+@@ -57,10 +57,10 @@ using Atomic64 = SbAtomic64;
+ using Atomic8 = char;
+ using Atomic16 = int16_t;
+ using Atomic32 = int32_t;
+-#if defined(V8_HOST_ARCH_64_BIT)
++#if defined(V8_HOST_ARCH_64_BIT) || defined(V8_OS_OPENBSD)
+ // We need to be able to go between Atomic64 and AtomicWord implicitly. This
+ // means Atomic64 and AtomicWord should be the same type on 64-bit.
+-#if defined(__ILP32__)
++#if defined(__ILP32__) && !defined(V8_OS_OPENBSD)
+ using Atomic64 = int64_t;
+ #else
+ using Atomic64 = intptr_t;
+@@ -266,7 +266,7 @@ inline Atomic32 SeqCst_Load(volatile const Atomic32* p
+ std::memory_order_seq_cst);
+ }
+
+-#if defined(V8_HOST_ARCH_64_BIT)
++#if defined(V8_HOST_ARCH_64_BIT) || defined(V8_OS_OPENBSD)
+
+ inline Atomic64 Relaxed_CompareAndSwap(volatile Atomic64* ptr,
+ Atomic64 old_value, Atomic64 new_value) {
diff --git a/devel/electron28/files/patch-v8_src_base_platform_memory.h b/devel/electron28/files/patch-v8_src_base_platform_memory.h
new file mode 100644
index 000000000000..cc4eb7963942
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_platform_memory.h
@@ -0,0 +1,16 @@
+--- v8/src/base/platform/memory.h.orig 2023-02-01 18:45:24 UTC
++++ v8/src/base/platform/memory.h
+@@ -19,11 +19,11 @@
+
+ #if V8_OS_DARWIN
+ #include <malloc/malloc.h>
+-#else // !V8_OS_DARWIN
++#elif !V8_OS_BSD
+ #include <malloc.h>
+ #endif // !V8_OS_DARWIN
+
+-#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS) || V8_OS_WIN
++#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS && !V8_OS_BSD) || V8_OS_WIN
+ #define V8_HAS_MALLOC_USABLE_SIZE 1
+ #endif // (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS) || V8_OS_WIN
+
diff --git a/devel/electron28/files/patch-v8_src_base_platform_platform-freebsd.cc b/devel/electron28/files/patch-v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 000000000000..5f462761158a
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,32 @@
+--- v8/src/base/platform/platform-freebsd.cc.orig 2022-02-07 13:39:41 UTC
++++ v8/src/base/platform/platform-freebsd.cc
+@@ -43,14 +43,10 @@ TimezoneCache* OS::CreateTimezoneCache() {
+ return new PosixDefaultTimezoneCache();
+ }
+
+-static unsigned StringToLong(char* buffer) {
+- return static_cast<unsigned>(strtol(buffer, nullptr, 16));
+-}
+-
+ std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() {
+ std::vector<SharedLibraryAddress> result;
+ int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()};
+- size_t miblen = sizeof(mib) / sizeof(mib[0]);
++ unsigned int miblen = sizeof(mib) / sizeof(mib[0]);
+ size_t buffer_size;
+ if (sysctl(mib, miblen, nullptr, &buffer_size, nullptr, 0) == 0) {
+ // Overallocate the buffer by 1/3 to account for concurrent
+@@ -82,8 +78,13 @@ std::vector<OS::SharedLibraryAddress> OS::GetSharedLib
+ lib_name = std::string(path);
+ }
+ result.push_back(SharedLibraryAddress(
++#if defined(__i386__) || defined(OS_FREEBSD)
++ lib_name, static_cast<uintptr_t>(map->kve_start),
++ static_cast<uintptr_t>(map->kve_end)));
++#else
+ lib_name, reinterpret_cast<uintptr_t>(map->kve_start),
+ reinterpret_cast<uintptr_t>(map->kve_end)));
++#endif
+ }
+
+ start += ssize;
diff --git a/devel/electron28/files/patch-v8_src_base_platform_platform-openbsd.cc b/devel/electron28/files/patch-v8_src_base_platform_platform-openbsd.cc
new file mode 100644
index 000000000000..bf7a645d772e
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_platform_platform-openbsd.cc
@@ -0,0 +1,28 @@
+--- v8/src/base/platform/platform-openbsd.cc.orig 2023-05-25 00:46:26 UTC
++++ v8/src/base/platform/platform-openbsd.cc
+@@ -6,6 +6,7 @@
+ // POSIX-compatible parts, the implementation is in platform-posix.cc.
+
+ #include <pthread.h>
++#include <pthread_np.h>
+ #include <semaphore.h>
+ #include <signal.h>
+ #include <stdlib.h>
+@@ -121,6 +122,17 @@ void OS::SignalCodeMovingGC() {
+ }
+
+ void OS::AdjustSchedulingParams() {}
++
++// static
++Stack::StackSlot Stack::ObtainCurrentThreadStackStart() {
++ stack_t ss;
++ void *base;
++ if (pthread_stackseg_np(pthread_self(), &ss) != 0)
++ return nullptr;
++
++ base = (void*)((size_t) ss.ss_sp - ss.ss_size);
++ return reinterpret_cast<uint8_t*>(base) + ss.ss_size;
++}
+
+ std::vector<OS::MemoryRange> OS::GetFreeMemoryRangesWithin(
+ OS::Address boundary_start, OS::Address boundary_end, size_t minimum_size,
diff --git a/devel/electron28/files/patch-v8_src_base_platform_platform-posix.cc b/devel/electron28/files/patch-v8_src_base_platform_platform-posix.cc
new file mode 100644
index 000000000000..854df8aed6ed
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_platform_platform-posix.cc
@@ -0,0 +1,62 @@
+--- v8/src/base/platform/platform-posix.cc.orig 2023-11-29 21:41:53 UTC
++++ v8/src/base/platform/platform-posix.cc
+@@ -54,7 +54,7 @@
+ #if V8_OS_DARWIN
+ #include <mach/mach.h>
+ #include <malloc/malloc.h>
+-#else
++#elif !V8_OS_BSD
+ #include <malloc.h>
+ #endif
+
+@@ -72,7 +72,7 @@
+ #include <sys/syscall.h>
+ #endif
+
+-#if V8_OS_FREEBSD || V8_OS_DARWIN || V8_OS_OPENBSD || V8_OS_SOLARIS
++#if V8_OS_FREEBSD || V8_OS_DARWIN || V8_OS_BSD || V8_OS_SOLARIS
+ #define MAP_ANONYMOUS MAP_ANON
+ #endif
+
+@@ -303,8 +303,15 @@ void OS::SetRandomMmapSeed(int64_t seed) {
+ }
+ }
+
++#if V8_OS_OPENBSD
++// Allow OpenBSD's mmap to select a random address on OpenBSD
+ // static
+ void* OS::GetRandomMmapAddr() {
++ return nullptr;
++}
++#else
++// static
++void* OS::GetRandomMmapAddr() {
+ uintptr_t raw_addr;
+ {
+ MutexGuard guard(rng_mutex.Pointer());
+@@ -399,6 +406,7 @@ void* OS::GetRandomMmapAddr() {
+ #endif
+ return reinterpret_cast<void*>(raw_addr);
+ }
++#endif
+
+ // TODO(bbudge) Move Cygwin and Fuchsia stuff into platform-specific files.
+ #if !V8_OS_CYGWIN && !V8_OS_FUCHSIA
+@@ -672,7 +680,7 @@ bool OS::HasLazyCommits() {
+
+ // static
+ bool OS::HasLazyCommits() {
+-#if V8_OS_AIX || V8_OS_LINUX || V8_OS_DARWIN
++#if V8_OS_AIX || V8_OS_LINUX || V8_OS_DARWIN || V8_OS_BSD
+ return true;
+ #else
+ // TODO(bbudge) Return true for all POSIX platforms.
+@@ -1303,7 +1311,7 @@ void Thread::SetThreadLocal(LocalStorageKey key, void*
+ // keep this version in POSIX as most Linux-compatible derivatives will
+ // support it. MacOS and FreeBSD are different here.
+ #if !defined(V8_OS_FREEBSD) && !defined(V8_OS_DARWIN) && !defined(_AIX) && \
+- !defined(V8_OS_SOLARIS)
++ !defined(V8_OS_SOLARIS) && !defined(V8_OS_OPENBSD)
+
+ namespace {
+ #if DEBUG
diff --git a/devel/electron28/files/patch-v8_src_base_small-vector.h b/devel/electron28/files/patch-v8_src_base_small-vector.h
new file mode 100644
index 000000000000..4472541804e6
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_small-vector.h
@@ -0,0 +1,11 @@
+--- v8/src/base/small-vector.h.orig 2022-10-25 08:25:05 UTC
++++ v8/src/base/small-vector.h
+@@ -22,7 +22,7 @@ template <typename T, size_t kSize, typename Allocator
+ class SmallVector {
+ // Currently only support trivially copyable and trivially destructible data
+ // types, as it uses memcpy to copy elements and never calls destructors.
+- ASSERT_TRIVIALLY_COPYABLE(T);
++ // XXX FREEBSD ASSERT_TRIVIALLY_COPYABLE(T);
+ static_assert(std::is_trivially_destructible<T>::value);
+
+ public:
diff --git a/devel/electron28/files/patch-v8_src_base_sys-info.cc b/devel/electron28/files/patch-v8_src_base_sys-info.cc
new file mode 100644
index 000000000000..d3c532c9289f
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_base_sys-info.cc
@@ -0,0 +1,11 @@
+--- v8/src/base/sys-info.cc.orig 2022-02-07 13:39:41 UTC
++++ v8/src/base/sys-info.cc
+@@ -38,7 +38,7 @@ namespace base {
+ // static
+ int SysInfo::NumberOfProcessors() {
+ #if V8_OS_OPENBSD
+- int mib[2] = {CTL_HW, HW_NCPU};
++ int mib[2] = {CTL_HW, HW_NCPUONLINE};
+ int ncpu = 0;
+ size_t len = sizeof(ncpu);
+ if (sysctl(mib, arraysize(mib), &ncpu, &len, nullptr, 0) != 0) {
diff --git a/devel/electron28/files/patch-v8_src_baseline_x64_baseline-assembler-x64-inl.h b/devel/electron28/files/patch-v8_src_baseline_x64_baseline-assembler-x64-inl.h
new file mode 100644
index 000000000000..329568f5dc34
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_baseline_x64_baseline-assembler-x64-inl.h
@@ -0,0 +1,13 @@
+--- v8/src/baseline/x64/baseline-assembler-x64-inl.h.orig 2023-11-29 21:41:53 UTC
++++ v8/src/baseline/x64/baseline-assembler-x64-inl.h
+@@ -76,9 +76,7 @@ void BaselineAssembler::Bind(Label* label) { __ bind(l
+
+ void BaselineAssembler::Bind(Label* label) { __ bind(label); }
+
+-void BaselineAssembler::JumpTarget() {
+- // NOP on x64.
+-}
++void BaselineAssembler::JumpTarget() { __ endbr64(); }
+
+ void BaselineAssembler::Jump(Label* target, Label::Distance distance) {
+ __ jmp(target, distance);
diff --git a/devel/electron28/files/patch-v8_src_builtins_x64_builtins-x64.cc b/devel/electron28/files/patch-v8_src_builtins_x64_builtins-x64.cc
new file mode 100644
index 000000000000..bc3103af5450
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_builtins_x64_builtins-x64.cc
@@ -0,0 +1,46 @@
+--- v8/src/builtins/x64/builtins-x64.cc.orig 2023-11-29 21:41:53 UTC
++++ v8/src/builtins/x64/builtins-x64.cc
+@@ -44,6 +44,8 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm,
+ #define __ ACCESS_MASM(masm)
+
+ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
++ __ CodeEntry();
++
+ __ LoadAddress(kJavaScriptCallExtraArg1Register,
+ ExternalReference::Create(address));
+ __ Jump(BUILTIN_CODE(masm->isolate(), AdaptorWithBuiltinExitFrame),
+@@ -430,7 +432,7 @@ void Generate_JSEntryVariant(MacroAssembler* masm, Sta
+ // Jump to a faked try block that does the invoke, with a faked catch
+ // block that sets the pending exception.
+ __ jmp(&invoke);
+- __ bind(&handler_entry);
++ __ BindExceptionHandler(&handler_entry);
+
+ // Store the current pc as the handler offset. It's used later to create the
+ // handler table.
+@@ -3339,6 +3341,9 @@ void GenerateExceptionHandlingLandingPad(MacroAssemble
+ void GenerateExceptionHandlingLandingPad(MacroAssembler* masm,
+ Label* return_promise) {
+ int catch_handler = __ pc_offset();
++
++ __ endbr64();
++
+ // Restore rsp to free the reserved stack slots for the sections.
+ __ leaq(rsp, MemOperand(rbp, StackSwitchFrameConstants::kLastSpillOffset));
+
+@@ -3696,6 +3701,7 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* ma
+ LoadJumpBuffer(masm, jmpbuf, true);
+ __ Trap();
+ __ bind(&resume);
++ __ endbr64();
+ __ LeaveFrame(StackFrame::STACK_SWITCH);
+ __ ret(0);
+ }
+@@ -3828,6 +3834,7 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, w
+ }
+ __ Trap();
+ __ bind(&suspend);
++ __ endbr64();
+ __ LeaveFrame(StackFrame::STACK_SWITCH);
+ // Pop receiver + parameter.
+ __ ret(2 * kSystemPointerSize);
diff --git a/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.cc b/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.cc
new file mode 100644
index 000000000000..4a629329ef89
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.cc
@@ -0,0 +1,42 @@
+--- v8/src/codegen/x64/assembler-x64.cc.orig 2023-10-19 20:00:34 UTC
++++ v8/src/codegen/x64/assembler-x64.cc
+@@ -1316,6 +1316,14 @@ void Assembler::hlt() {
+ emit(0xF4);
+ }
+
++void Assembler::endbr64() {
++ EnsureSpace ensure_space(this);
++ emit(0xF3);
++ emit(0x0f);
++ emit(0x1e);
++ emit(0xfa);
++}
++
+ void Assembler::emit_idiv(Register src, int size) {
+ EnsureSpace ensure_space(this);
+ emit_rex(src, size);
+@@ -1583,16 +1591,22 @@ void Assembler::jmp(Handle<Code> target, RelocInfo::Mo
+ emitl(code_target_index);
+ }
+
+-void Assembler::jmp(Register target) {
++void Assembler::jmp(Register target, bool notrack) {
+ EnsureSpace ensure_space(this);
++ if (notrack) {
++ emit(0x3e);
++ }
+ // Opcode FF/4 r64.
+ emit_optional_rex_32(target);
+ emit(0xFF);
+ emit_modrm(0x4, target);
+ }
+
+-void Assembler::jmp(Operand src) {
++void Assembler::jmp(Operand src, bool notrack) {
+ EnsureSpace ensure_space(this);
++ if (notrack) {
++ emit(0x3e);
++ }
+ // Opcode FF/4 m64.
+ emit_optional_rex_32(src);
+ emit(0xFF);
diff --git a/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.h b/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.h
new file mode 100644
index 000000000000..8673a760ec90
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_codegen_x64_assembler-x64.h
@@ -0,0 +1,21 @@
+--- v8/src/codegen/x64/assembler-x64.h.orig 2023-11-29 21:41:53 UTC
++++ v8/src/codegen/x64/assembler-x64.h
+@@ -860,6 +860,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBa
+ void ret(int imm16);
+ void ud2();
+ void setcc(Condition cc, Register reg);
++ void endbr64();
+
+ void pblendw(XMMRegister dst, Operand src, uint8_t mask);
+ void pblendw(XMMRegister dst, XMMRegister src, uint8_t mask);
+@@ -918,8 +919,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBa
+ void jmp(Handle<Code> target, RelocInfo::Mode rmode);
+
+ // Jump near absolute indirect (r64)
+- void jmp(Register adr);
+- void jmp(Operand src);
++ void jmp(Register adr, bool notrack = false);
++ void jmp(Operand src, bool notrack = false);
+
+ // Unconditional jump relative to the current address. Low-level routine,
+ // use with caution!
diff --git a/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.cc b/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.cc
new file mode 100644
index 000000000000..29ff917a7082
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.cc
@@ -0,0 +1,20 @@
+--- v8/src/codegen/x64/macro-assembler-x64.cc.orig 2023-11-29 21:41:53 UTC
++++ v8/src/codegen/x64/macro-assembler-x64.cc
+@@ -51,6 +51,8 @@ Operand StackArgumentsAccessor::GetArgumentOperand(int
+ return Operand(rsp, kPCOnStackSize + index * kSystemPointerSize);
+ }
+
++void MacroAssembler::CodeEntry() { endbr64(); }
++
+ void MacroAssembler::Load(Register destination, ExternalReference source) {
+ if (root_array_available_ && options().enable_root_relative_access) {
+ intptr_t delta = RootRegisterOffsetForExternalReference(isolate(), source);
+@@ -2144,7 +2146,7 @@ void MacroAssembler::Switch(Register scratch, Register
+ cmpq(reg, Immediate(num_labels));
+ j(above_equal, &fallthrough);
+ leaq(table, MemOperand(&jump_table));
+- jmp(MemOperand(table, reg, times_8, 0));
++ jmp(MemOperand(table, reg, times_8, 0), /*notrack=*/true);
+ // Emit the jump table inline, under the assumption that it's not too big.
+ Align(kSystemPointerSize);
+ bind(&jump_table);
diff --git a/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.h b/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.h
new file mode 100644
index 000000000000..27874ce8f757
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_codegen_x64_macro-assembler-x64.h
@@ -0,0 +1,20 @@
+--- v8/src/codegen/x64/macro-assembler-x64.h.orig 2023-11-29 21:41:53 UTC
++++ v8/src/codegen/x64/macro-assembler-x64.h
+@@ -655,11 +655,14 @@ class V8_EXPORT_PRIVATE MacroAssembler
+
+ // Define a function entrypoint. This doesn't emit any code for this
+ // architecture, as control-flow integrity is not supported for it.
+- void CodeEntry() {}
++ void CodeEntry();
+ // Define an exception handler.
+- void ExceptionHandler() {}
++ void ExceptionHandler() { CodeEntry(); }
+ // Define an exception handler and bind a label.
+- void BindExceptionHandler(Label* label) { bind(label); }
++ void BindExceptionHandler(Label* label) {
++ bind(label);
++ CodeEntry();
++ }
+
+ // ---------------------------------------------------------------------------
+ // Pointer compression support
diff --git a/devel/electron28/files/patch-v8_src_compiler_backend_x64_code-generator-x64.cc b/devel/electron28/files/patch-v8_src_compiler_backend_x64_code-generator-x64.cc
new file mode 100644
index 000000000000..307ae8190515
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_compiler_backend_x64_code-generator-x64.cc
@@ -0,0 +1,16 @@
+--- v8/src/compiler/backend/x64/code-generator-x64.cc.orig 2023-11-29 21:41:53 UTC
++++ v8/src/compiler/backend/x64/code-generator-x64.cc
+@@ -6850,11 +6850,11 @@ void CodeGenerator::AssembleArchTableSwitch(Instructio
+ // target = table + (target - table)
+ __ addq(input, kScratchRegister);
+ // Jump to the target.
+- __ jmp(input);
++ __ jmp(input, /*notrack=*/true);
+ } else {
+ // For non builtins, the value in the table is 'target_address' (8 bytes)
+ // jmp [table + index*8]
+- __ jmp(Operand(kScratchRegister, input, times_8, 0));
++ __ jmp(Operand(kScratchRegister, input, times_8, 0), /*notrack=*/true);
+ }
+ }
+
diff --git a/devel/electron28/files/patch-v8_src_deoptimizer_x64_deoptimizer-x64.cc b/devel/electron28/files/patch-v8_src_deoptimizer_x64_deoptimizer-x64.cc
new file mode 100644
index 000000000000..7ad925f22815
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_deoptimizer_x64_deoptimizer-x64.cc
@@ -0,0 +1,11 @@
+--- v8/src/deoptimizer/x64/deoptimizer-x64.cc.orig 2023-08-10 01:51:22 UTC
++++ v8/src/deoptimizer/x64/deoptimizer-x64.cc
+@@ -21,7 +21,7 @@ ASSERT_OFFSET(Builtin::kDeoptimizationEntry_Lazy);
+ #undef ASSERT_OFFSET
+
+ const int Deoptimizer::kEagerDeoptExitSize = 4;
+-const int Deoptimizer::kLazyDeoptExitSize = 4;
++const int Deoptimizer::kLazyDeoptExitSize = 8;
+
+ Float32 RegisterValues::GetFloatRegister(unsigned n) const {
+ return Float32::FromBits(
diff --git a/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.cc b/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.cc
new file mode 100644
index 000000000000..8ff9f89da4d4
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.cc
@@ -0,0 +1,11 @@
+--- v8/src/diagnostics/perf-jit.cc.orig 2023-10-19 20:00:39 UTC
++++ v8/src/diagnostics/perf-jit.cc
+@@ -31,7 +31,7 @@
+ #include "src/flags/flags.h"
+
+ // Only compile the {LinuxPerfJitLogger} on Linux.
+-#if V8_OS_LINUX
++#if defined(V8_OS_LINUX) || defined(V8_OS_BSD)
+
+ #include <fcntl.h>
+ #include <sys/mman.h>
diff --git a/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.h b/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.h
new file mode 100644
index 000000000000..b5c06ad88b32
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_diagnostics_perf-jit.h
@@ -0,0 +1,11 @@
+--- v8/src/diagnostics/perf-jit.h.orig 2022-06-17 14:20:10 UTC
++++ v8/src/diagnostics/perf-jit.h
+@@ -31,7 +31,7 @@
+ #include "include/v8config.h"
+
+ // {LinuxPerfJitLogger} is only implemented on Linux.
+-#if V8_OS_LINUX
++#if defined(V8_OS_LINUX) || defined(V8_OS_BSD)
+
+ #include "src/logging/log.h"
+
diff --git a/devel/electron28/files/patch-v8_src_execution_isolate.cc b/devel/electron28/files/patch-v8_src_execution_isolate.cc
new file mode 100644
index 000000000000..ca4701e3e6a7
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_execution_isolate.cc
@@ -0,0 +1,25 @@
+--- v8/src/execution/isolate.cc.orig 2023-12-13 00:29:09 UTC
++++ v8/src/execution/isolate.cc
+@@ -147,6 +147,10 @@
+ #include "src/execution/simulator-base.h"
+ #endif
+
++#if defined(V8_OS_OPENBSD)
++#include <sys/mman.h>
++#endif
++
+ extern "C" const uint8_t v8_Default_embedded_blob_code_[];
+ extern "C" uint32_t v8_Default_embedded_blob_code_size_;
+ extern "C" const uint8_t v8_Default_embedded_blob_data_[];
+@@ -4190,6 +4194,11 @@ void Isolate::InitializeDefaultEmbeddedBlob() {
+ uint32_t code_size = DefaultEmbeddedBlobCodeSize();
+ const uint8_t* data = DefaultEmbeddedBlobData();
+ uint32_t data_size = DefaultEmbeddedBlobDataSize();
++
++#if defined(V8_OS_OPENBSD) && !defined(V8_TARGET_ARCH_IA32)
++ mprotect(reinterpret_cast<void *>(const_cast<uint8_t *>(code)),
++ code_size, PROT_READ | PROT_EXEC);
++#endif
+
+ if (StickyEmbeddedBlobCode() != nullptr) {
+ base::MutexGuard guard(current_embedded_blob_refcount_mutex_.Pointer());
diff --git a/devel/electron28/files/patch-v8_src_flags_flags.cc b/devel/electron28/files/patch-v8_src_flags_flags.cc
new file mode 100644
index 000000000000..298931e49dbb
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_flags_flags.cc
@@ -0,0 +1,36 @@
+--- v8/src/flags/flags.cc.orig 2023-11-29 21:41:54 UTC
++++ v8/src/flags/flags.cc
+@@ -13,6 +13,10 @@
+ #include <set>
+ #include <sstream>
+
++#if V8_OS_OPENBSD
++#include <sys/mman.h>
++#endif
++
+ #include "src/base/functional.h"
+ #include "src/base/logging.h"
+ #include "src/base/platform/platform.h"
+@@ -32,7 +36,11 @@ namespace v8::internal {
+ namespace v8::internal {
+
+ // Define {v8_flags}, declared in flags.h.
++#if V8_OS_OPENBSD
++FlagValues v8_flags __attribute__((section(".openbsd.mutable")));
++#else
+ FlagValues v8_flags;
++#endif
+
+ // {v8_flags} needs to be aligned to a memory page, and the size needs to be a
+ // multiple of a page size. This is required for memory-protection of the memory
+@@ -905,6 +913,10 @@ void FlagList::FreezeFlags() {
+ // Note that for string flags we only protect the pointer itself, but not the
+ // string storage. TODO(12887): Fix this.
+ base::OS::SetDataReadOnly(&v8_flags, sizeof(v8_flags));
++#if V8_OS_OPENBSD
++ if (mimmutable(&v8_flags, sizeof(v8_flags)) == -1)
++ FATAL("unable to set immutability of v8_flags");
++#endif
+ }
+
+ // static
diff --git a/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64-inl.h b/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64-inl.h
new file mode 100644
index 000000000000..5529956d34f8
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64-inl.h
@@ -0,0 +1,14 @@
+--- v8/src/maglev/x64/maglev-assembler-x64-inl.h.orig 2023-11-29 21:41:54 UTC
++++ v8/src/maglev/x64/maglev-assembler-x64-inl.h
+@@ -232,7 +232,10 @@ void MaglevAssembler::PushReverse(T... vals) {
+ detail::PushAllHelper<T...>::PushReverse(this, vals...);
+ }
+
+-inline void MaglevAssembler::BindJumpTarget(Label* label) { bind(label); }
++inline void MaglevAssembler::BindJumpTarget(Label* label) {
++ bind(label);
++ endbr64();
++}
+
+ inline void MaglevAssembler::BindBlock(BasicBlock* block) {
+ bind(block->label());
diff --git a/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64.cc b/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64.cc
new file mode 100644
index 000000000000..dfc797771396
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_maglev_x64_maglev-assembler-x64.cc
@@ -0,0 +1,16 @@
+--- v8/src/maglev/x64/maglev-assembler-x64.cc.orig 2023-10-19 20:00:42 UTC
++++ v8/src/maglev/x64/maglev-assembler-x64.cc
+@@ -433,10 +433,12 @@ void MaglevAssembler::OSRPrologue(Graph* graph) {
+ void MaglevAssembler::Prologue(Graph* graph) {
+ DCHECK(!graph->is_osr());
+
++ CodeEntry();
++
+ BailoutIfDeoptimized(rbx);
+
+ if (graph->has_recursive_calls()) {
+- bind(code_gen_state()->entry_label());
++ BindJumpTarget(code_gen_state()->entry_label());
+ }
+
+ // Tiering support.
diff --git a/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.cc b/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.cc
new file mode 100644
index 000000000000..557f0a3d3e62
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.cc
@@ -0,0 +1,22 @@
+--- v8/src/regexp/x64/regexp-macro-assembler-x64.cc.orig 2023-08-10 01:51:23 UTC
++++ v8/src/regexp/x64/regexp-macro-assembler-x64.cc
+@@ -110,6 +110,7 @@ RegExpMacroAssemblerX64::RegExpMacroAssemblerX64(Isola
+ backtrack_label_(),
+ exit_label_() {
+ DCHECK_EQ(0, registers_to_save % 2);
++ __ CodeEntry();
+ __ jmp(&entry_label_); // We'll write the entry code when we know more.
+ __ bind(&start_label_); // And then continue from here.
+ }
+@@ -714,6 +715,11 @@ bool RegExpMacroAssemblerX64::CheckSpecialClassRanges(
+ // Match any character.
+ return true;
+ }
++}
++
++void RegExpMacroAssemblerX64::BindJumpTarget(Label* label) {
++ Bind(label);
++ __ CodeEntry();
+ }
+
+ void RegExpMacroAssemblerX64::Fail() {
diff --git a/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.h b/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.h
new file mode 100644
index 000000000000..81f0522ddb09
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_regexp_x64_regexp-macro-assembler-x64.h
@@ -0,0 +1,12 @@
+--- v8/src/regexp/x64/regexp-macro-assembler-x64.h.orig 2023-08-10 01:51:23 UTC
++++ v8/src/regexp/x64/regexp-macro-assembler-x64.h
+@@ -59,6 +59,9 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerX64
+ void CheckPosition(int cp_offset, Label* on_outside_input) override;
+ bool CheckSpecialClassRanges(StandardCharacterSet type,
+ Label* on_no_match) override;
++
++ void BindJumpTarget(Label* label) override;
++
+ void Fail() override;
+ Handle<HeapObject> GetCode(Handle<String> source) override;
+ void GoTo(Label* label) override;
diff --git a/devel/electron28/files/patch-v8_src_sandbox_sandbox.cc b/devel/electron28/files/patch-v8_src_sandbox_sandbox.cc
new file mode 100644
index 000000000000..45980aaf237b
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_sandbox_sandbox.cc
@@ -0,0 +1,11 @@
+--- v8/src/sandbox/sandbox.cc.orig 2023-02-01 18:45:24 UTC
++++ v8/src/sandbox/sandbox.cc
+@@ -46,7 +46,7 @@ static Address DetermineAddressSpaceLimit() {
+ }
+ #endif // V8_TARGET_ARCH_X64
+
+-#if defined(V8_TARGET_ARCH_ARM64) && defined(V8_TARGET_OS_ANDROID)
++#if defined(V8_TARGET_ARCH_ARM64) && (defined(V8_TARGET_OS_ANDROID) || defined(V8_TARGET_OS_OPENBSD))
+ // On Arm64 Android assume a 40-bit virtual address space (39 bits for
+ // userspace and kernel each) as that appears to be the most common
+ // configuration and there seems to be no easy way to retrieve the actual
diff --git a/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.cc b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.cc
new file mode 100644
index 000000000000..efea4ad76b8c
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.cc
@@ -0,0 +1,11 @@
+--- v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc.orig 2023-11-29 21:41:54 UTC
++++ v8/src/snapshot/embedded/platform-embedded-file-writer-base.cc
+@@ -143,6 +143,8 @@ EmbeddedTargetOs ToEmbeddedTargetOs(const char* s) {
+ return EmbeddedTargetOs::kWin;
+ } else if (string == "starboard") {
+ return EmbeddedTargetOs::kStarboard;
++ } else if (string == "openbsd") {
++ return EmbeddedTargetOs::kOpenBSD;
+ } else {
+ return EmbeddedTargetOs::kGeneric;
+ }
diff --git a/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.h b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.h
new file mode 100644
index 000000000000..3e5f35a4a61d
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.h
@@ -0,0 +1,10 @@
+--- v8/src/snapshot/embedded/platform-embedded-file-writer-base.h.orig 2023-02-01 18:45:24 UTC
++++ v8/src/snapshot/embedded/platform-embedded-file-writer-base.h
+@@ -31,6 +31,7 @@ enum class EmbeddedTargetOs {
+ kMac,
+ kWin,
+ kStarboard,
++ kOpenBSD,
+ kGeneric, // Everything not covered above falls in here.
+ };
+
diff --git a/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-generic.cc b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-generic.cc
new file mode 100644
index 000000000000..a00ffd2f1359
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_snapshot_embedded_platform-embedded-file-writer-generic.cc
@@ -0,0 +1,42 @@
+--- v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc.orig 2023-08-10 01:51:23 UTC
++++ v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc
+@@ -9,6 +9,10 @@
+
+ #include "src/objects/instruction-stream.h"
+
++#if V8_OS_OPENBSD
++#include <sys/param.h>
++#endif
++
+ namespace v8 {
+ namespace internal {
+
+@@ -35,6 +39,10 @@ const char* DirectiveAsString(DataDirective directive)
+ void PlatformEmbeddedFileWriterGeneric::SectionText() {
+ if (target_os_ == EmbeddedTargetOs::kChromeOS) {
+ fprintf(fp_, ".section .text.hot.embedded\n");
++#if !defined(V8_TARGET_ARCH_IA32)
++ } else if (target_os_ == EmbeddedTargetOs::kOpenBSD) {
++ fprintf(fp_, ".section .openbsd.mutable,\"a\"\n");
++#endif
+ } else {
+ fprintf(fp_, ".section .text\n");
+ }
+@@ -66,6 +74,8 @@ void PlatformEmbeddedFileWriterGeneric::AlignToCodeAli
+ // On these architectures and platforms, we remap the builtins, so need these
+ // to be aligned on a page boundary.
+ fprintf(fp_, ".balign 4096\n");
++#elif defined(V8_OS_OPENBSD) && !defined(V8_TARGET_ARCH_IA32)
++ fprintf(fp_, ".balign %d\n", PAGE_SIZE);
+ #elif V8_TARGET_ARCH_X64
+ // On x64 use 64-bytes code alignment to allow 64-bytes loop header alignment.
+ static_assert(64 >= kCodeAlignment);
+@@ -86,6 +96,8 @@ void PlatformEmbeddedFileWriterGeneric::AlignToPageSiz
+ (V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64)
+ // Since the builtins are remapped, need to pad until the next page boundary.
+ fprintf(fp_, ".balign 4096\n");
++#elif defined(V8_OS_OPENBSD) && !defined(V8_TARGET_ARCH_IA32)
++ fprintf(fp_, ".balign %d\n", PAGE_SIZE);
+ #endif
+ }
+
diff --git a/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.cc b/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.cc
new file mode 100644
index 000000000000..e3b4fe96a404
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.cc
@@ -0,0 +1,26 @@
+--- v8/src/trap-handler/handler-inside-posix.cc.orig 2023-11-29 21:41:54 UTC
++++ v8/src/trap-handler/handler-inside-posix.cc
+@@ -61,6 +61,8 @@ namespace trap_handler {
+ #define CONTEXT_REG(reg, REG) &uc->uc_mcontext->__ss.__##reg
+ #elif V8_OS_FREEBSD
+ #define CONTEXT_REG(reg, REG) &uc->uc_mcontext.mc_##reg
++#elif V8_OS_OPENBSD
++#define CONTEXT_REG(reg, REG) &uc->sc_##reg
+ #else
+ #error "Unsupported platform."
+ #endif
+@@ -78,8 +80,12 @@ bool IsKernelGeneratedSignal(siginfo_t* info) {
+ // si_code at its default of 0 for signals that don’t originate in hardware.
+ // The other conditions are only relevant for Linux.
+ return info->si_code > 0 && info->si_code != SI_USER &&
+- info->si_code != SI_QUEUE && info->si_code != SI_TIMER &&
+- info->si_code != SI_ASYNCIO && info->si_code != SI_MESGQ;
++ info->si_code != SI_QUEUE && info->si_code != SI_TIMER
++#ifdef V8_OS_OPENBSD
++ ;
++#else
++ && info->si_code != SI_ASYNCIO && info->si_code != SI_MESGQ;
++#endif
+ }
+
+ class UnmaskOobSignalScope {
diff --git a/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.h b/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.h
new file mode 100644
index 000000000000..df777a8a205b
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_trap-handler_handler-inside-posix.h
@@ -0,0 +1,11 @@
+--- v8/src/trap-handler/handler-inside-posix.h.orig 2022-04-21 18:48:31 UTC
++++ v8/src/trap-handler/handler-inside-posix.h
+@@ -13,7 +13,7 @@ namespace v8 {
+ namespace internal {
+ namespace trap_handler {
+
+-#if V8_OS_LINUX || V8_OS_FREEBSD
++#if V8_OS_LINUX || V8_OS_FREEBSD || V8_OS_OPENBSD
+ constexpr int kOobSignal = SIGSEGV;
+ #elif V8_OS_DARWIN
+ constexpr int kOobSignal = SIGBUS;
diff --git a/devel/electron28/files/patch-v8_src_trap-handler_trap-handler.h b/devel/electron28/files/patch-v8_src_trap-handler_trap-handler.h
new file mode 100644
index 000000000000..c2b9847df2a5
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_trap-handler_trap-handler.h
@@ -0,0 +1,11 @@
+--- v8/src/trap-handler/trap-handler.h.orig 2023-05-25 00:46:26 UTC
++++ v8/src/trap-handler/trap-handler.h
+@@ -20,7 +20,7 @@ namespace trap_handler {
+ // X64 on Linux, Windows, MacOS, FreeBSD.
+ #if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \
+ ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN || \
+- V8_OS_FREEBSD)
++ V8_OS_FREEBSD || V8_OS_OPENBSD)
+ #define V8_TRAP_HANDLER_SUPPORTED true
+ // Arm64 (non-simulator) on Mac and Linux.
+ #elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && \
diff --git a/devel/electron28/files/patch-v8_src_wasm_baseline_ia32_liftoff-assembler-ia32-inl.h b/devel/electron28/files/patch-v8_src_wasm_baseline_ia32_liftoff-assembler-ia32-inl.h
new file mode 100644
index 000000000000..37246766fbc0
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_wasm_baseline_ia32_liftoff-assembler-ia32-inl.h
@@ -0,0 +1,128 @@
+--- v8/src/wasm/baseline/ia32/liftoff-assembler-ia32-inl.h.orig 2023-11-29 21:41:54 UTC
++++ v8/src/wasm/baseline/ia32/liftoff-assembler-ia32-inl.h
+@@ -487,7 +487,7 @@ void LiftoffAssembler::Load(LiftoffRegister dst, Regis
+ }
+
+ void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
+- Register offset_reg, uint32_t offset_imm,
++ Register offset_reg, uintptr_t offset_imm,
+ LoadType type, uint32_t* protected_load_pc,
+ bool /* is_load_mem */, bool /* i64_offset */,
+ bool needs_shift) {
+@@ -567,7 +567,7 @@ void LiftoffAssembler::Store(Register dst_addr, Regist
+ }
+
+ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister src,
++ uintptr_t offset_imm, LiftoffRegister src,
+ StoreType type, LiftoffRegList pinned,
+ uint32_t* protected_store_pc,
+ bool /* is_store_mem */, bool /* i64_offset */) {
+@@ -647,7 +647,7 @@ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst,
+ }
+
+ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
+- Register offset_reg, uint32_t offset_imm,
++ Register offset_reg, uintptr_t offset_imm,
+ LoadType type, LiftoffRegList /* pinned */,
+ bool /* i64_offset */) {
+ if (type.value() != LoadType::kI64Load) {
+@@ -667,7 +667,7 @@ void LiftoffAssembler::AtomicStore(Register dst_addr,
+ }
+
+ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister src,
++ uintptr_t offset_imm, LiftoffRegister src,
+ StoreType type, LiftoffRegList pinned,
+ bool /* i64_offset */) {
+ DCHECK_NE(offset_reg, no_reg);
+@@ -737,7 +737,7 @@ inline void AtomicAddOrSubOrExchange32(LiftoffAssemble
+
+ inline void AtomicAddOrSubOrExchange32(LiftoffAssembler* lasm, Binop binop,
+ Register dst_addr, Register offset_reg,
+- uint32_t offset_imm,
++ uintptr_t offset_imm,
+ LiftoffRegister value,
+ LiftoffRegister result, StoreType type) {
+ DCHECK_EQ(value, result);
+@@ -804,7 +804,7 @@ inline void AtomicBinop32(LiftoffAssembler* lasm, Bino
+ }
+
+ inline void AtomicBinop32(LiftoffAssembler* lasm, Binop op, Register dst_addr,
+- Register offset_reg, uint32_t offset_imm,
++ Register offset_reg, uintptr_t offset_imm,
+ LiftoffRegister value, LiftoffRegister result,
+ StoreType type) {
+ DCHECK_EQ(value, result);
+@@ -916,7 +916,7 @@ inline void AtomicBinop64(LiftoffAssembler* lasm, Bino
+ }
+
+ inline void AtomicBinop64(LiftoffAssembler* lasm, Binop op, Register dst_addr,
+- Register offset_reg, uint32_t offset_imm,
++ Register offset_reg, uintptr_t offset_imm,
+ LiftoffRegister value, LiftoffRegister result) {
+ // We need {ebx} here, which is the root register. As the root register it
+ // needs special treatment. As we use {ebx} directly in the code below, we
+@@ -1008,7 +1008,7 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Re
+ } // namespace liftoff
+
+ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister value,
++ uintptr_t offset_imm, LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+ if (type.value() == StoreType::kI64Store) {
+@@ -1022,7 +1022,7 @@ void LiftoffAssembler::AtomicSub(Register dst_addr, Re
+ }
+
+ void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister value,
++ uintptr_t offset_imm, LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+ if (type.value() == StoreType::kI64Store) {
+@@ -1035,7 +1035,7 @@ void LiftoffAssembler::AtomicAnd(Register dst_addr, Re
+ }
+
+ void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister value,
++ uintptr_t offset_imm, LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+ if (type.value() == StoreType::kI64Store) {
+@@ -1049,7 +1049,7 @@ void LiftoffAssembler::AtomicOr(Register dst_addr, Reg
+ }
+
+ void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister value,
++ uintptr_t offset_imm, LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+ if (type.value() == StoreType::kI64Store) {
+@@ -1063,7 +1063,7 @@ void LiftoffAssembler::AtomicXor(Register dst_addr, Re
+ }
+
+ void LiftoffAssembler::AtomicXor(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm, LiftoffRegister value,
++ uintptr_t offset_imm, LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+ if (type.value() == StoreType::kI64Store) {
+@@ -1077,7 +1077,7 @@ void LiftoffAssembler::AtomicExchange(Register dst_add
+ }
+
+ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg,
+- uint32_t offset_imm,
++ uintptr_t offset_imm,
+ LiftoffRegister value,
+ LiftoffRegister result, StoreType type,
+ bool /* i64_offset */) {
+@@ -1092,7 +1092,7 @@ void LiftoffAssembler::AtomicCompareExchange(
+ }
+
+ void LiftoffAssembler::AtomicCompareExchange(
+- Register dst_addr, Register offset_reg, uint32_t offset_imm,
++ Register dst_addr, Register offset_reg, uintptr_t offset_imm,
+ LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
+ StoreType type, bool /* i64_offset */) {
+ // We expect that the offset has already been added to {dst_addr}, and no
diff --git a/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.cc b/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.cc
new file mode 100644
index 000000000000..65048377d383
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.cc
@@ -0,0 +1,51 @@
+--- v8/src/wasm/jump-table-assembler.cc.orig 2023-11-29 21:41:54 UTC
++++ v8/src/wasm/jump-table-assembler.cc
+@@ -74,15 +74,21 @@ void JumpTableAssembler::EmitLazyCompileJumpSlot(uint3
+ #if V8_TARGET_ARCH_X64
+ void JumpTableAssembler::EmitLazyCompileJumpSlot(uint32_t func_index,
+ Address lazy_compile_target) {
++ intptr_t displacement =
++ static_cast<intptr_t>(reinterpret_cast<uint8_t*>(lazy_compile_target) -
++ (pc_ + 9) - kNearJmpInstrSize);
++ if (!is_int32(displacement)) return;
++ CodeEntry(); // 4 bytes
+ // Use a push, because mov to an extended register takes 6 bytes.
+- pushq_imm32(func_index); // 5 bytes
+- EmitJumpSlot(lazy_compile_target); // 5 bytes
++ pushq_imm32(func_index); // 5 bytes
++ near_jmp(displacement, RelocInfo::NO_INFO); // 5 bytes
+ }
+
+ bool JumpTableAssembler::EmitJumpSlot(Address target) {
+ intptr_t displacement = static_cast<intptr_t>(
+- reinterpret_cast<uint8_t*>(target) - pc_ - kNearJmpInstrSize);
++ reinterpret_cast<uint8_t*>(target) - (pc_ + 4) - kNearJmpInstrSize);
+ if (!is_int32(displacement)) return false;
++ CodeEntry(); // 4 bytes
+ near_jmp(displacement, RelocInfo::NO_INFO); // 5 bytes
+ return true;
+ }
+@@ -90,11 +96,12 @@ void JumpTableAssembler::EmitFarJumpSlot(Address targe
+ void JumpTableAssembler::EmitFarJumpSlot(Address target) {
+ Label data;
+ int start_offset = pc_offset();
++ CodeEntry(); // 4 bytes
+ jmp(Operand(&data)); // 6 bytes
+- Nop(2); // 2 bytes
++ Nop(6); // 6 bytes
+ // The data must be properly aligned, so it can be patched atomically (see
+ // {PatchFarJumpSlot}).
+- DCHECK_EQ(start_offset + kSystemPointerSize, pc_offset());
++ DCHECK_EQ(start_offset + kFarJumpTableSlotOffset, pc_offset());
+ USE(start_offset);
+ bind(&data);
+ dq(target); // 8 bytes
+@@ -105,7 +112,7 @@ void JumpTableAssembler::PatchFarJumpSlot(Address slot
+ // The slot needs to be pointer-size aligned so we can atomically update it.
+ DCHECK(IsAligned(slot, kSystemPointerSize));
+ // Offset of the target is at 8 bytes, see {EmitFarJumpSlot}.
+- reinterpret_cast<std::atomic<Address>*>(slot + kSystemPointerSize)
++ reinterpret_cast<std::atomic<Address>*>(slot + kFarJumpTableSlotOffset)
+ ->store(target, std::memory_order_relaxed);
+ // The update is atomic because the address is properly aligned.
+ // Because of cache coherence, the data update will eventually be seen by all
diff --git a/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.h b/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.h
new file mode 100644
index 000000000000..5c3e5122b3ef
--- /dev/null
+++ b/devel/electron28/files/patch-v8_src_wasm_jump-table-assembler.h
@@ -0,0 +1,16 @@
+--- v8/src/wasm/jump-table-assembler.h.orig 2023-11-29 21:41:54 UTC
++++ v8/src/wasm/jump-table-assembler.h
+@@ -174,9 +174,10 @@ class V8_EXPORT_PRIVATE JumpTableAssembler : public Ma
+ // boundaries. The jump table line size has been chosen to satisfy this.
+ #if V8_TARGET_ARCH_X64
+ static constexpr int kJumpTableLineSize = 64;
+- static constexpr int kJumpTableSlotSize = 5;
+- static constexpr int kFarJumpTableSlotSize = 16;
+- static constexpr int kLazyCompileTableSlotSize = 10;
++ static constexpr int kJumpTableSlotSize = 5 + 4;
++ static constexpr int kFarJumpTableSlotOffset = 2 * kSystemPointerSize;
++ static constexpr int kFarJumpTableSlotSize = 16 + 8;
++ static constexpr int kLazyCompileTableSlotSize = 10 + 4;
+ #elif V8_TARGET_ARCH_IA32
+ static constexpr int kJumpTableLineSize = 64;
+ static constexpr int kJumpTableSlotSize = 5;
diff --git a/devel/electron28/files/patch-v8_tools_run.py b/devel/electron28/files/patch-v8_tools_run.py
new file mode 100644
index 000000000000..194cc4ae7c4c
--- /dev/null
+++ b/devel/electron28/files/patch-v8_tools_run.py
@@ -0,0 +1,11 @@
+--- v8/tools/run.py.orig 2022-05-19 14:06:27 UTC
++++ v8/tools/run.py
+@@ -9,7 +9,7 @@ scripts."""
+ import subprocess
+ import sys
+
+-result = subprocess.call(sys.argv[1:])
++sys.exit(subprocess.call(sys.argv[1:], env={"LD_LIBRARY_PATH":"${WRKSRC}/out/Release"}))
+ if result != 0:
+ # Windows error codes such as 0xC0000005 and 0xC0000409 are much easier
+ # to recognize and differentiate in hex.
diff --git a/devel/electron28/files/yarn.lock b/devel/electron28/files/yarn.lock
new file mode 100644
index 000000000000..a8475e651460
--- /dev/null
+++ b/devel/electron28/files/yarn.lock
@@ -0,0 +1,7370 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@azure/abort-controller@^1.0.0":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.0.4.tgz#fd3c4d46c8ed67aace42498c8e2270960250eafd"
+ integrity sha512-lNUmDRVGpanCsiUN3NWxFTdwmdFI53xwhkTFfHDGTYk46ca7Ind3nanJc+U6Zj9Tv+9nTCWRBscWEW1DyKOpTw==
+ dependencies:
+ tslib "^2.0.0"
+
+"@azure/core-asynciterator-polyfill@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.2.tgz#0dd3849fb8d97f062a39db0e5cadc9ffaf861fec"
+ integrity sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==
+
+"@azure/core-auth@^1.3.0":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.3.2.tgz#6a2c248576c26df365f6c7881ca04b7f6d08e3d0"
+ integrity sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==
+ dependencies:
+ "@azure/abort-controller" "^1.0.0"
+ tslib "^2.2.0"
+
+"@azure/core-http@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.1.tgz#2177f3abb64afa8ca101dc34f67cc789888f9f7b"
+ integrity sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==
+ dependencies:
+ "@azure/abort-controller" "^1.0.0"
+ "@azure/core-auth" "^1.3.0"
+ "@azure/core-tracing" "1.0.0-preview.13"
+ "@azure/core-util" "^1.1.1"
+ "@azure/logger" "^1.0.0"
+ "@types/node-fetch" "^2.5.0"
+ "@types/tunnel" "^0.0.3"
+ form-data "^4.0.0"
+ node-fetch "^2.6.7"
+ process "^0.11.10"
+ tslib "^2.2.0"
+ tunnel "^0.0.6"
+ uuid "^8.3.0"
+ xml2js "^0.5.0"
+
+"@azure/core-lro@^2.2.0":
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-2.2.4.tgz#42fbf4ae98093c59005206a4437ddcd057c57ca1"
+ integrity sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==
+ dependencies:
+ "@azure/abort-controller" "^1.0.0"
+ "@azure/core-tracing" "1.0.0-preview.13"
+ "@azure/logger" "^1.0.0"
+ tslib "^2.2.0"
+
+"@azure/core-paging@^1.1.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.2.1.tgz#1b884f563b6e49971e9a922da3c7a20931867b54"
+ integrity sha512-UtH5iMlYsvg+nQYIl4UHlvvSrsBjOlRF4fs0j7mxd3rWdAStrKYrh2durOpHs5C9yZbVhsVDaisoyaf/lL1EVA==
+ dependencies:
+ "@azure/core-asynciterator-polyfill" "^1.0.0"
+ tslib "^2.2.0"
+
+"@azure/core-tracing@1.0.0-preview.13":
+ version "1.0.0-preview.13"
+ resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz#55883d40ae2042f6f1e12b17dd0c0d34c536d644"
+ integrity sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==
+ dependencies:
+ "@opentelemetry/api" "^1.0.1"
+ tslib "^2.2.0"
+
+"@azure/core-util@^1.1.1":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.3.1.tgz#e830b99231e2091a2dc9ed652fff1cda69ba6582"
+ integrity sha512-pjfOUAb+MPLODhGuXot/Hy8wUgPD0UTqYkY3BiYcwEETrLcUCVM1t0roIvlQMgvn1lc48TGy5bsonsFpF862Jw==
+ dependencies:
+ "@azure/abort-controller" "^1.0.0"
+ tslib "^2.2.0"
+
+"@azure/logger@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.0.3.tgz#6e36704aa51be7d4a1bae24731ea580836293c96"
+ integrity sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==
+ dependencies:
+ tslib "^2.2.0"
+
+"@azure/storage-blob@^12.9.0":
+ version "12.14.0"
+ resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.14.0.tgz#32d3e5fa3bb2a12d5d44b186aed11c8e78f00178"
+ integrity sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==
+ dependencies:
+ "@azure/abort-controller" "^1.0.0"
+ "@azure/core-http" "^3.0.0"
+ "@azure/core-lro" "^2.2.0"
+ "@azure/core-paging" "^1.1.1"
+ "@azure/core-tracing" "1.0.0-preview.13"
+ "@azure/logger" "^1.0.0"
+ events "^3.0.0"
+ tslib "^2.2.0"
+
+"@babel/code-frame@^7.0.0":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d"
+ integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==
+ dependencies:
+ "@babel/highlight" "^7.0.0"
+
+"@babel/helper-validator-identifier@^7.19.1":
+ version "7.19.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
+ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+
+"@babel/highlight@^7.0.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540"
+ integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^4.0.0"
+
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@dsanders11/vscode-markdown-languageservice@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@dsanders11/vscode-markdown-languageservice/-/vscode-markdown-languageservice-0.3.0.tgz#18a561711609651371961b66db4cb8473ab25564"
+ integrity sha512-aFNWtK23dNicyLczBwIKkGUSVuMoZMzUovlwqj/hVZ3zRIBlXWYunByDxI67Pf1maA0TbxPjVfRqBQFALWjVHg==
+ dependencies:
+ "@vscode/l10n" "^0.0.10"
+ picomatch "^2.3.1"
+ vscode-languageserver-textdocument "^1.0.5"
+ vscode-languageserver-types "^3.17.1"
+ vscode-uri "^3.0.3"
+
+"@electron/asar@^3.2.1":
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.1.tgz#c4143896f3dd43b59a80a9c9068d76f77efb62ea"
+ integrity sha512-hE2cQMZ5+4o7+6T2lUaVbxIzrOjZZfX7dB02xuapyYFJZEAiWTelq6J3mMoxzd0iONDvYLPVKecB5tyjIoVDVA==
+ dependencies:
+ chromium-pickle-js "^0.2.0"
+ commander "^5.0.0"
+ glob "^7.1.6"
+ minimatch "^3.0.4"
+ optionalDependencies:
+ "@types/glob" "^7.1.1"
+
+"@electron/docs-parser@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@electron/docs-parser/-/docs-parser-1.2.0.tgz#dc3032012dd270c667777e097e185d92e7ff86ef"
+ integrity sha512-Rz/lMLRDSvEshYNmSC30v/3rk7Mj6EL/76wraKvfM5XvYPHsmApo9CedvcJNNMm7+Rc29NOohoqA4B2/XtFm1Q==
+ dependencies:
+ "@types/markdown-it" "^12.0.0"
+ chai "^4.2.0"
+ chalk "^3.0.0"
+ fs-extra "^8.1.0"
+ lodash.camelcase "^4.3.0"
+ markdown-it "^12.0.0"
+ minimist "^1.2.0"
+ ora "^4.0.3"
+ pretty-ms "^5.1.0"
+
+"@electron/fiddle-core@^1.0.4":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@electron/fiddle-core/-/fiddle-core-1.0.4.tgz#d28e330c4d88f3916269558a43d214c4312333af"
+ integrity sha512-gjPz3IAHK+/f0N52cWVeTZpdgENJo3QHBGeGqMDHFUgzSBRTVyAr8z8Lw8wpu6Ocizs154Rtssn4ba1ysABgLA==
+ dependencies:
+ "@electron/get" "^2.0.0"
+ debug "^4.3.3"
+ env-paths "^2.2.1"
+ extract-zip "^2.0.1"
+ fs-extra "^10.0.0"
+ getos "^3.2.1"
+ node-fetch "^2.6.1"
+ semver "^7.3.5"
+ simple-git "^3.5.0"
+
+"@electron/get@^2.0.0":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e"
+ integrity sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==
+ dependencies:
+ debug "^4.1.1"
+ env-paths "^2.2.0"
+ fs-extra "^8.1.0"
+ got "^11.8.5"
+ progress "^2.0.3"
+ semver "^6.2.0"
+ sumchecker "^3.0.1"
+ optionalDependencies:
+ global-agent "^3.0.0"
+
+"@electron/github-app-auth@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@electron/github-app-auth/-/github-app-auth-2.0.0.tgz#346d194b1327589cef3478ba321d092975093af8"
+ integrity sha512-NsJrDjyAEZbuKAkSCkDaz3+Tpn6Sr0li9iC37SLF/E1gg6qI28jtsix7DTzgOY20LstQuzIfh+tZosrgk96AUg==
+ dependencies:
+ "@octokit/auth-app" "^4.0.13"
+ "@octokit/rest" "^19.0.11"
+
+"@electron/lint-roller@^1.9.0":
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/@electron/lint-roller/-/lint-roller-1.10.0.tgz#278dfb285018869faabd5c3f616c64da7f2b26c1"
+ integrity sha512-dDJDy5MANWNIxv7OqQ0NwPzqwMmgTFYtjR/KKeEEdCQj1k21TT61+Zjdsm+IKbA2LSPujpujsyGKUQtb4oLLCA==
+ dependencies:
+ "@dsanders11/vscode-markdown-languageservice" "^0.3.0"
+ balanced-match "^2.0.0"
+ glob "^8.1.0"
+ markdown-it "^13.0.1"
+ markdownlint-cli "^0.33.0"
+ mdast-util-from-markdown "^1.3.0"
+ minimist "^1.2.8"
+ node-fetch "^2.6.9"
+ rimraf "^4.4.1"
+ standard "^17.0.0"
+ unist-util-visit "^4.1.2"
+ vscode-languageserver "^8.1.0"
+ vscode-languageserver-textdocument "^1.0.8"
+ vscode-uri "^3.0.7"
+
+"@electron/typescript-definitions@^8.15.2":
+ version "8.15.3"
+ resolved "https://registry.yarnpkg.com/@electron/typescript-definitions/-/typescript-definitions-8.15.3.tgz#cbdac770b671c841deeb57a9587519d3d7f75d6d"
+ integrity sha512-Cm9LWnEsdOto67zVmGM48lcAbbeUZULElv2Ai5rBBg/M6oJhb03m/ZVImMLuevekQVPGJNLxV6Ygd9o/2arx4Q==
+ dependencies:
+ "@types/node" "^11.13.7"
+ chalk "^2.4.2"
+ colors "^1.1.2"
+ debug "^4.1.1"
+ fs-extra "^7.0.1"
+ lodash "^4.17.11"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ ora "^3.4.0"
+ pretty-ms "^5.0.0"
+
+"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0":
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
+ integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
+
+"@eslint/eslintrc@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331"
+ integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.5.2"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.40.0":
+ version "8.40.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec"
+ integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==
+
+"@eslint/js@8.41.0":
+ version "8.41.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3"
+ integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==
+
+"@humanwhocodes/config-array@^0.11.8":
+ version "0.11.8"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
+ integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@kwsites/file-exists@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99"
+ integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==
+ dependencies:
+ debug "^4.1.1"
+
+"@kwsites/promise-deferred@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919"
+ integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==
+
+"@nodelib/fs.scandir@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+ integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.3"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+ integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.stat@2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+ integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.3"
+ fastq "^1.6.0"
+
+"@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@octokit/auth-app@^4.0.13":
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-4.0.13.tgz#53323bee6bfefbb73ea544dd8e6a0144550e13e3"
+ integrity sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==
+ dependencies:
+ "@octokit/auth-oauth-app" "^5.0.0"
+ "@octokit/auth-oauth-user" "^2.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ deprecation "^2.3.1"
+ lru-cache "^9.0.0"
+ universal-github-app-jwt "^1.1.1"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-app@^5.0.0":
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.5.tgz#be2a93d72835133b4866ac4721aa628849475525"
+ integrity sha512-UPX1su6XpseaeLVCi78s9droxpGtBWIgz9XhXAx9VXabksoF0MyI5vaa1zo1njyYt6VaAjFisC2A2Wchcu2WmQ==
+ dependencies:
+ "@octokit/auth-oauth-device" "^4.0.0"
+ "@octokit/auth-oauth-user" "^2.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/types" "^9.0.0"
+ "@types/btoa-lite" "^1.0.0"
+ btoa-lite "^1.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-device@^4.0.0":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.3.tgz#00ce77233517e0d7d39e42a02652f64337d9df81"
+ integrity sha512-KPTx5nMntKjNZzzltO3X4T68v22rd7Cp/TcLJXQE2U8aXPcZ9LFuww9q9Q5WUNSu3jwi3lRwzfkPguRfz1R8Vg==
+ dependencies:
+ "@octokit/oauth-methods" "^2.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/types" "^8.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-user@^2.0.0":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-2.0.4.tgz#88f060ec678d7d493695af8d827e115dd064e212"
+ integrity sha512-HrbDzTPqz6GcGSOUkR+wSeF3vEqsb9NMsmPja/qqqdiGmlk/Czkxctc3KeWYogHonp62Ml4kjz2VxKawrFsadQ==
+ dependencies:
+ "@octokit/auth-oauth-device" "^4.0.0"
+ "@octokit/oauth-methods" "^2.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/types" "^8.0.0"
+ btoa-lite "^1.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-token@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c"
+ integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+
+"@octokit/core@^4.1.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648"
+ integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==
+ dependencies:
+ "@octokit/auth-token" "^3.0.0"
+ "@octokit/graphql" "^5.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ before-after-hook "^2.2.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/core@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.1.tgz#fee6341ad0ce60c29cc455e056cd5b500410a588"
+ integrity sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==
+ dependencies:
+ "@octokit/auth-token" "^3.0.0"
+ "@octokit/graphql" "^5.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ before-after-hook "^2.2.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/endpoint@^7.0.0":
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.3.tgz#0b96035673a9e3bedf8bab8f7335de424a2147ed"
+ integrity sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==
+ dependencies:
+ "@octokit/types" "^8.0.0"
+ is-plain-object "^5.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/graphql@^5.0.0":
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2"
+ integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==
+ dependencies:
+ "@octokit/request" "^6.0.0"
+ "@octokit/types" "^9.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/oauth-authorization-url@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz#029626ce87f3b31addb98cd0d2355c2381a1c5a1"
+ integrity sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==
+
+"@octokit/oauth-methods@^2.0.0":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-2.0.4.tgz#6abd9593ca7f91fe5068375a363bd70abd5516dc"
+ integrity sha512-RDSa6XL+5waUVrYSmOlYROtPq0+cfwppP4VaQY/iIei3xlFb0expH6YNsxNrZktcLhJWSpm9uzeom+dQrXlS3A==
+ dependencies:
+ "@octokit/oauth-authorization-url" "^5.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^8.0.0"
+ btoa-lite "^1.0.0"
+
+"@octokit/openapi-types@^14.0.0":
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a"
+ integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==
+
+"@octokit/openapi-types@^16.0.0":
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e"
+ integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==
+
+"@octokit/openapi-types@^17.2.0":
+ version "17.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-17.2.0.tgz#f1800b5f9652b8e1b85cc6dfb1e0dc888810bdb5"
+ integrity sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==
+
+"@octokit/plugin-paginate-rest@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz#f34b5a7d9416019126042cd7d7b811e006c0d561"
+ integrity sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+
+"@octokit/plugin-paginate-rest@^6.1.2":
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8"
+ integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==
+ dependencies:
+ "@octokit/tsconfig" "^1.0.2"
+ "@octokit/types" "^9.2.3"
+
+"@octokit/plugin-request-log@^1.0.4":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
+ integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
+
+"@octokit/plugin-rest-endpoint-methods@^7.0.0":
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz#f7ebe18144fd89460f98f35a587b056646e84502"
+ integrity sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+ deprecation "^2.3.1"
+
+"@octokit/plugin-rest-endpoint-methods@^7.1.2":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz#b77a8844601d3a394a02200cddb077f3ab841f38"
+ integrity sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==
+ dependencies:
+ "@octokit/types" "^9.2.3"
+ deprecation "^2.3.1"
+
+"@octokit/request-error@^3.0.0":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.2.tgz#f74c0f163d19463b87528efe877216c41d6deb0a"
+ integrity sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==
+ dependencies:
+ "@octokit/types" "^8.0.0"
+ deprecation "^2.0.0"
+ once "^1.4.0"
+
+"@octokit/request@^6.0.0":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.4.tgz#b00a7185865c72bdd432e63168b1e900953ded0c"
+ integrity sha512-at92SYQstwh7HH6+Kf3bFMnHrle7aIrC0r5rTP+Bb30118B6j1vI2/M4walh6qcQgfuLIKs8NUO5CytHTnUI3A==
+ dependencies:
+ "@octokit/endpoint" "^7.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ is-plain-object "^5.0.0"
+ node-fetch "^2.6.7"
+ universal-user-agent "^6.0.0"
+
+"@octokit/rest@^19.0.11":
+ version "19.0.11"
+ resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c"
+ integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==
+ dependencies:
+ "@octokit/core" "^4.2.1"
+ "@octokit/plugin-paginate-rest" "^6.1.2"
+ "@octokit/plugin-request-log" "^1.0.4"
+ "@octokit/plugin-rest-endpoint-methods" "^7.1.2"
+
+"@octokit/rest@^19.0.7":
+ version "19.0.7"
+ resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.7.tgz#d2e21b4995ab96ae5bfae50b4969da7e04e0bb70"
+ integrity sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==
+ dependencies:
+ "@octokit/core" "^4.1.0"
+ "@octokit/plugin-paginate-rest" "^6.0.0"
+ "@octokit/plugin-request-log" "^1.0.4"
+ "@octokit/plugin-rest-endpoint-methods" "^7.0.0"
+
+"@octokit/tsconfig@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7"
+ integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==
+
+"@octokit/types@^8.0.0":
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.0.0.tgz#93f0b865786c4153f0f6924da067fe0bb7426a9f"
+ integrity sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==
+ dependencies:
+ "@octokit/openapi-types" "^14.0.0"
+
+"@octokit/types@^9.0.0":
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635"
+ integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==
+ dependencies:
+ "@octokit/openapi-types" "^16.0.0"
+
+"@octokit/types@^9.2.3":
+ version "9.2.3"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.2.3.tgz#d0af522f394d74b585cefb7efd6197ca44d183a9"
+ integrity sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==
+ dependencies:
+ "@octokit/openapi-types" "^17.2.0"
+
+"@opentelemetry/api@^1.0.1":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.4.tgz#a167e46c10d05a07ab299fc518793b0cff8f6924"
+ integrity sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==
+
+"@primer/octicons@^10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@primer/octicons/-/octicons-10.0.0.tgz#81e94ed32545dfd3472c8625a5b345f3ea4c153d"
+ integrity sha512-iuQubq62zXZjPmaqrsfsCZUqIJgZhmA6W0tKzIKGRbkoLnff4TFFCL87hfIRATZ5qZPM4m8ioT8/bXI7WVa9WQ==
+ dependencies:
+ object-assign "^4.1.1"
+
+"@sindresorhus/is@^4.0.0":
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
+ integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+
+"@szmarczak/http-timer@^4.0.5":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+ integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+ dependencies:
+ defer-to-connect "^2.0.0"
+
+"@types/basic-auth@^1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@types/basic-auth/-/basic-auth-1.1.3.tgz#a787ede8310804174fbbf3d6c623ab1ccedb02cd"
+ integrity sha512-W3rv6J0IGlxqgE2eQ2pTb0gBjaGtejQpJ6uaCjz3UQ65+TFTPC5/lAE+POfx1YLdjtxvejJzsIAfd3MxWiVmfg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/body-parser@*":
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
+ integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/btoa-lite@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.0.tgz#e190a5a548e0b348adb0df9ac7fa5f1151c7cca4"
+ integrity sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==
+
+"@types/busboy@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@types/busboy/-/busboy-1.5.0.tgz#62681556cbbd2afc8d2efa6bafaa15602f0838b9"
+ integrity sha512-ncOOhwmyFDW76c/Tuvv9MA9VGYUCn8blzyWmzYELcNGDb0WXWLSmFi7hJq25YdRBYJrmMBB5jZZwUjlJe9HCjQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/cacheable-request@^6.0.1":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
+ integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
+ dependencies:
+ "@types/http-cache-semantics" "*"
+ "@types/keyv" "*"
+ "@types/node" "*"
+ "@types/responselike" "*"
+
+"@types/chai-as-promised@*":
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.1.tgz#004c27a4ac640e9590e25d8b0980cb0a6609bfd8"
+ integrity sha512-dberBxQW/XWv6BMj0su1lV9/C9AUx5Hqu2pisuS6S4YK/Qt6vurcj/BmcbEsobIWWCQzhesNY8k73kIxx4X7Mg==
+ dependencies:
+ "@types/chai" "*"
+
+"@types/chai-as-promised@^7.1.3":
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd"
+ integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==
+ dependencies:
+ "@types/chai" "*"
+
+"@types/chai@*":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
+ integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
+
+"@types/chai@^4.2.12":
+ version "4.2.12"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.12.tgz#6160ae454cd89dae05adc3bb97997f488b608201"
+ integrity sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ==
+
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/concat-stream@^1.0.0":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74"
+ integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/connect@*":
+ version "3.4.33"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546"
+ integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/debug@^4.0.0":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
+ integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/dirty-chai@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@types/dirty-chai/-/dirty-chai-2.0.2.tgz#eeac4802329a41ed7815ac0c1a6360335bf77d0c"
+ integrity sha512-BruwIN/UQEU0ePghxEX+OyjngpOfOUKJQh3cmfeq2h2Su/g001iljVi3+Y2y2EFp3IPgjf4sMrRU33Hxv1FUqw==
+ dependencies:
+ "@types/chai" "*"
+ "@types/chai-as-promised" "*"
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.4"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
+ integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.5"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4"
+ integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
+ integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
+
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/events@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
+ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
+
+"@types/express-serve-static-core@^4.17.18":
+ version "4.17.28"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8"
+ integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@^4.17.13":
+ version "4.17.13"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+ integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/fs-extra@^9.0.1":
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918"
+ integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/glob@^7.1.1":
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
+ integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
+ dependencies:
+ "@types/events" "*"
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/http-cache-semantics@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
+ integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+
+"@types/is-empty@^1.0.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/is-empty/-/is-empty-1.2.0.tgz#16bc578060c9b0b6953339eea906c255a375bf86"
+ integrity sha512-brJKf2boFhUxTDxlpI7cstwiUtA2ovm38UzFTi9aZI6//ARncaV+Q5ALjCaJqXaMtdZk/oPTJnSutugsZR6h8A==
+
+"@types/js-yaml@^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.2.tgz#4117a7a378593a218e9d6f0ef44ce6d5d9edf7fa"
+ integrity sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==
+
+"@types/json-buffer@~3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
+ integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/json-schema@^7.0.4":
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
+ integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+
+"@types/json-schema@^7.0.9":
+ version "7.0.12"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/jsonwebtoken@^9.0.0":
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#29b1369c4774200d6d6f63135bf3d1ba3ef997a4"
+ integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/keyv@*":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/klaw@^3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/klaw/-/klaw-3.0.1.tgz#29f90021c0234976aa4eb97efced9cb6db9fa8b3"
+ integrity sha512-acnF3n9mYOr1aFJKFyvfNX0am9EtPUsYPq22QUCGdJE+MVt6UyAN1jwo+PmOPqXD4K7ZS9MtxDEp/un0lxFccA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/linkify-it@*":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-2.1.0.tgz#ea3dd64c4805597311790b61e872cbd1ed2cd806"
+ integrity sha512-Q7DYAOi9O/+cLLhdaSvKdaumWyHbm7HAk/bFwwyTuU0arR5yyCeW5GOoqt4tJTpDRxhpx9Q8kQL6vMpuw9hDSw==
+
+"@types/markdown-it@^12.0.0":
+ version "12.2.3"
+ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51"
+ integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==
+ dependencies:
+ "@types/linkify-it" "*"
+ "@types/mdurl" "*"
+
+"@types/mdast@^3.0.0":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.7.tgz#cba63d0cc11eb1605cea5c0ad76e02684394166b"
+ integrity sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==
+ dependencies:
+ "@types/unist" "*"
+
+"@types/mdurl@*":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
+ integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
+
+"@types/mime@*":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
+ integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
+
+"@types/mime@^1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/minimatch@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/minimist@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
+ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+
+"@types/mocha@^7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce"
+ integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==
+
+"@types/ms@*":
+ version "0.7.31"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
+ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+
+"@types/node-fetch@^2.5.0":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
+ integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "12.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.1.tgz#d5544f6de0aae03eefbb63d5120f6c8be0691946"
+ integrity sha512-rp7La3m845mSESCgsJePNL/JQyhkOJA6G4vcwvVgkDAwHhGdq5GCumxmPjEk1MZf+8p5ZQAUE7tqgQRQTXN7uQ==
+
+"@types/node@^11.13.7":
+ version "11.13.22"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b"
+ integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg==
+
+"@types/node@^16.0.0":
+ version "16.4.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.13.tgz#7dfd9c14661edc65cccd43a29eb454174642370d"
+ integrity sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==
+
+"@types/node@^18.11.18":
+ version "18.11.18"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
+ integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
+ integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/qs@*":
+ version "6.9.3"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03"
+ integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==
+
+"@types/range-parser@*":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
+ integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
+
+"@types/repeat-string@^1.0.0":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@types/repeat-string/-/repeat-string-1.6.1.tgz#8bb5686e662ce1d962271b0b043623bf51404cdc"
+ integrity sha512-vdna8kjLGljgtPnYN6MBD2UwX62QE0EFLj9QlLXvg6dEu66NksXB900BNguBCMZZY2D9SSqncUskM23vT3uvWQ==
+
+"@types/responselike@*", "@types/responselike@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
+ integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/semver@^7.3.12":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
+ integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
+
+"@types/semver@^7.3.3":
+ version "7.3.3"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.3.tgz#3ad6ed949e7487e7bda6f886b4a2434a2c3d7b1a"
+ integrity sha512-jQxClWFzv9IXdLdhSaTf16XI3NYe6zrEbckSpb5xhKfPbWgIyAY0AFyWWWfaiDcBuj3UHmMkCIwSRqpKMTZL2Q==
+
+"@types/send@^0.14.5":
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/@types/send/-/send-0.14.5.tgz#653f7d25b93c3f7f51a8994addaf8a229de022a7"
+ integrity sha512-0mwoiK3DXXBu0GIfo+jBv4Wo5s1AcsxdpdwNUtflKm99VEMvmBPJ+/NBNRZy2R5JEYfWL/u4nAHuTUTA3wFecQ==
+ dependencies:
+ "@types/mime" "*"
+ "@types/node" "*"
+
+"@types/serve-static@*":
+ version "1.13.10"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+ integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+ dependencies:
+ "@types/mime" "^1"
+ "@types/node" "*"
+
+"@types/split@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/split/-/split-1.0.0.tgz#24f7c35707450b002f203383228f5a2bc1e6c228"
+ integrity sha512-pm9S1mkr+av0j7D6pFyqhBxXDbnbO9gqj4nb8DtGtCewvj0XhIv089SSwXrjrIizT1UquO8/h83hCut0pa3u8A==
+ dependencies:
+ "@types/node" "*"
+ "@types/through" "*"
+
+"@types/stream-chain@*":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/stream-chain/-/stream-chain-2.0.0.tgz#aed7fc21ac3686bc721aebbbd971f5a857e567e4"
+ integrity sha512-O3IRJcZi4YddlS8jgasH87l+rdNmad9uPAMmMZCfRVhumbWMX6lkBWnIqr9kokO5sx8LHp8peQ1ELhMZHbR0Gg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/stream-json@^1.5.1":
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/@types/stream-json/-/stream-json-1.5.1.tgz#ae8d1133f9f920e18c6e94b233cb57d014a47b8d"
+ integrity sha512-Blg6GJbKVEB1J/y/2Tv+WrYiMzPTIqyuZ+zWDJtAF8Mo8A2XQh/lkSX4EYiM+qtS+GY8ThdGi6gGA9h4sjvL+g==
+ dependencies:
+ "@types/node" "*"
+ "@types/stream-chain" "*"
+
+"@types/supports-color@^8.0.0":
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-8.1.1.tgz#1b44b1b096479273adf7f93c75fc4ecc40a61ee4"
+ integrity sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw==
+
+"@types/temp@^0.8.34":
+ version "0.8.34"
+ resolved "https://registry.yarnpkg.com/@types/temp/-/temp-0.8.34.tgz#03e4b3cb67cbb48c425bbf54b12230fef85540ac"
+ integrity sha512-oLa9c5LHXgS6UimpEVp08De7QvZ+Dfu5bMQuWyMhf92Z26Q10ubEMOWy9OEfUdzW7Y/sDWVHmUaLFtmnX/2j0w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/text-table@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@types/text-table/-/text-table-0.2.2.tgz#774c90cfcfbc8b4b0ebb00fecbe861dc8b1e8e26"
+ integrity sha512-dGoI5Af7To0R2XE8wJuc6vwlavWARsCh3UKJPjWs1YEqGUqfgBI/j/4GX0yf19/DsDPPf0YAXWAp8psNeIehLg==
+
+"@types/through@*":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93"
+ integrity sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/tunnel@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.3.tgz#f109e730b072b3136347561fc558c9358bb8c6e9"
+ integrity sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/unist@*", "@types/unist@^2.0.0":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
+ integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
+
+"@types/unist@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+ integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
+
+"@types/uuid@^3.4.6":
+ version "3.4.6"
+ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.6.tgz#d2c4c48eb85a757bf2927f75f939942d521e3016"
+ integrity sha512-cCdlC/1kGEZdEglzOieLDYBxHsvEOIg7kp/2FYyVR9Pxakq+Qf/inL3RKQ+PA8gOlI/NnL+fXmQH12nwcGzsHw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/w3c-web-serial@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/w3c-web-serial/-/w3c-web-serial-1.0.3.tgz#9fd5e8542f74e464bb1715b384b5c0dcbf2fb2c3"
+ integrity sha512-R4J/OjqKAUFQoXVIkaUTfzb/sl6hLh/ZhDTfowJTRMa7LhgEmI/jXV4zsL1u8HpNa853BxwNmDIr0pauizzwSQ==
+
+"@types/webpack-env@^1.17.0":
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.17.0.tgz#f99ce359f1bfd87da90cc4a57cab0a18f34a48d0"
+ integrity sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw==
+
+"@types/webpack@^5.28.0":
+ version "5.28.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03"
+ integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==
+ dependencies:
+ "@types/node" "*"
+ tapable "^2.2.0"
+ webpack "^5"
+
+"@types/yauzl@^2.9.1":
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599"
+ integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==
+ dependencies:
+ "@types/node" "*"
+
+"@typescript-eslint/eslint-plugin@^5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz#e470af414f05ecfdc05a23e9ce6ec8f91db56fe2"
+ integrity sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==
+ dependencies:
+ "@eslint-community/regexpp" "^4.4.0"
+ "@typescript-eslint/scope-manager" "5.59.7"
+ "@typescript-eslint/type-utils" "5.59.7"
+ "@typescript-eslint/utils" "5.59.7"
+ debug "^4.3.4"
+ grapheme-splitter "^1.0.4"
+ ignore "^5.2.0"
+ natural-compare-lite "^1.4.0"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.7.tgz#02682554d7c1028b89aa44a48bf598db33048caa"
+ integrity sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.59.7"
+ "@typescript-eslint/types" "5.59.7"
+ "@typescript-eslint/typescript-estree" "5.59.7"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz#0243f41f9066f3339d2f06d7f72d6c16a16769e2"
+ integrity sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==
+ dependencies:
+ "@typescript-eslint/types" "5.59.7"
+ "@typescript-eslint/visitor-keys" "5.59.7"
+
+"@typescript-eslint/type-utils@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz#89c97291371b59eb18a68039857c829776f1426d"
+ integrity sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "5.59.7"
+ "@typescript-eslint/utils" "5.59.7"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.7.tgz#6f4857203fceee91d0034ccc30512d2939000742"
+ integrity sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==
+
+"@typescript-eslint/typescript-estree@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz#b887acbd4b58e654829c94860dbff4ac55c5cff8"
+ integrity sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==
+ dependencies:
+ "@typescript-eslint/types" "5.59.7"
+ "@typescript-eslint/visitor-keys" "5.59.7"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.7.tgz#7adf068b136deae54abd9a66ba5a8780d2d0f898"
+ integrity sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@types/json-schema" "^7.0.9"
+ "@types/semver" "^7.3.12"
+ "@typescript-eslint/scope-manager" "5.59.7"
+ "@typescript-eslint/types" "5.59.7"
+ "@typescript-eslint/typescript-estree" "5.59.7"
+ eslint-scope "^5.1.1"
+ semver "^7.3.7"
+
+"@typescript-eslint/visitor-keys@5.59.7":
+ version "5.59.7"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz#09c36eaf268086b4fbb5eb9dc5199391b6485fc5"
+ integrity sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==
+ dependencies:
+ "@typescript-eslint/types" "5.59.7"
+ eslint-visitor-keys "^3.3.0"
+
+"@vscode/l10n@^0.0.10":
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/@vscode/l10n/-/l10n-0.0.10.tgz#9c513107c690c0dd16e3ec61e453743de15ebdb0"
+ integrity sha512-E1OCmDcDWa0Ya7vtSjp/XfHFGqYJfh+YPC1RkATU71fTac+j1JjCcB3qwSzmlKAighx2WxhLlfhS0RwAN++PFQ==
+
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
+ integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
+
+"@webpack-cli/info@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
+ integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
+ dependencies:
+ envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
+ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0:
+ version "8.8.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
+ integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
+
+aggregate-error@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
+ integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv-keywords@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
+ integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
+ integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
+ dependencies:
+ type-fest "^0.11.0"
+
+ansi-regex@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.0, ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
+anymatch@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.3.tgz#2fb624fe0e84bccab00afee3d0006ed310f22f09"
+ integrity sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-includes@^3.1.5, array-includes@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
+ integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+array.prototype.flat@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2"
+ integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183"
+ integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.tosorted@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
+ integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+ get-intrinsic "^1.1.3"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async@^3.2.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
+ integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+bail@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.1.tgz#d676736373a374058a935aec81b94c12ba815771"
+ integrity sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+balanced-match@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
+ integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+before-after-hook@^2.2.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c"
+ integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+ integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
+
+body-parser@1.20.1:
+ version "1.20.1"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
+ integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+boolean@^3.0.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
+ integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.1, braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.14.5:
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf"
+ integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==
+ dependencies:
+ caniuse-lite "^1.0.30001366"
+ electron-to-chromium "^1.4.188"
+ node-releases "^2.0.6"
+ update-browserslist-db "^1.0.4"
+
+btoa-lite@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
+ integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-equal-constant-time@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-from@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+builtin-modules@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+ integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
+
+builtins@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/builtins/-/builtins-4.0.0.tgz#a8345420de82068fdc4d6559d0456403a8fb1905"
+ integrity sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw==
+ dependencies:
+ semver "^7.0.0"
+
+builtins@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9"
+ integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==
+ dependencies:
+ semver "^7.0.0"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacheable-lookup@^5.0.3:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
+ integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+
+cacheable-request@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
+ integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^4.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^6.0.1"
+ responselike "^2.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30001366:
+ version "1.0.30001367"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a"
+ integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==
+
+chai@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
+ integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.0"
+ type-detect "^4.0.5"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+character-entities-legacy@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz#57f4d00974c696e8f74e9f493e7fcb75b44d7ee7"
+ integrity sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==
+
+character-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.0.tgz#508355fcc8c73893e0909efc1a44d28da2b6fdf3"
+ integrity sha512-oHqMj3eAuJ77/P5PaIRcqk+C3hdfNwyCD2DAUcD5gyXkegAuF2USC40CEqPscDk4I8FRGMTojGJQkXDsN5QlJA==
+
+character-reference-invalid@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.0.tgz#a0bdeb89c051fe7ed5d3158b2f06af06984f2813"
+ integrity sha512-pE3Z15lLRxDzWJy7bBHBopRwfI20sbrMVLQTC7xsPglCHf4Wv1e167OgYAFP78co2XlhojDyAqA+IAJse27//g==
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+check-for-leaks@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/check-for-leaks/-/check-for-leaks-1.2.1.tgz#4ac108ee3f8e6b99f5ad36f6b98cba1d7f4816d0"
+ integrity sha512-9OdOSRZY6N0w5JCdJpqsC5MkD6EPGYpHmhtf4l5nl3DRETDZshP6C1EGN/vVhHDTY6AsOK3NhdFfrMe3NWZl7g==
+ dependencies:
+ anymatch "^3.0.2"
+ minimist "^1.2.0"
+ parse-gitignore "^0.4.0"
+ walk-sync "^0.3.2"
+
+chokidar@^3.0.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+ integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
+ dependencies:
+ tslib "^1.9.0"
+
+chromium-pickle-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+ integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
+
+ci-info@^3.6.1:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
+ integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+
+clean-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
+ integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.0.0, cli-spinners@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77"
+ integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==
+
+cli-truncate@2.1.0, cli-truncate@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+ integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+ dependencies:
+ slice-ansi "^3.0.0"
+ string-width "^4.2.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+co@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78"
+ integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^2.0.14:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
+colors@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+colors@^1.1.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
+ integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.20.0, commander@^2.9.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^5.0.0, commander@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
+commander@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commander@~9.4.1:
+ version "9.4.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
+ integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==
+
+compress-brotli@^1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
+ integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
+ dependencies:
+ "@types/json-buffer" "~3.0.0"
+ json-buffer "~3.0.1"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1"
+ integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.0.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.0.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
+ dependencies:
+ ms "2.1.2"
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+decode-named-character-reference@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e"
+ integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==
+ dependencies:
+ character-entities "^2.0.0"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+defer-to-connect@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
+ integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
+
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
+ integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+deprecation@^2.0.0, deprecation@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
+ integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
+
+dequal@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+diff@^3.1.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40"
+ integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dotenv-safe@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/dotenv-safe/-/dotenv-safe-4.0.4.tgz#8b0e7ced8e70b1d3c5d874ef9420e406f39425b3"
+ integrity sha1-iw587Y5wsdPF2HTvlCDkBvOUJbM=
+ dependencies:
+ dotenv "^4.0.0"
+
+dotenv@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
+ integrity sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=
+
+dugite@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.3.0.tgz#ff6fdb4c899f84ed6695c9e01eaf4364a6211f13"
+ integrity sha512-78zuD3p5lx2IS8DilVvHbXQXRo+hGIb3EAshTEC3ZyBLyArKegA8R/6c4Ne1aUlx6JRf3wmKNgYkdJOYMyj9aA==
+ dependencies:
+ progress "^2.0.3"
+ tar "^6.1.11"
+
+duplexer@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+ integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
+
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.4.188:
+ version "1.4.195"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz#139b2d95a42a3f17df217589723a1deac71d1473"
+ integrity sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+enhanced-resolve@^5.10.0:
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
+ integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+enquirer@^2.3.5:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+ensure-posix-path@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce"
+ integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==
+
+entities@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
+ integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
+
+entities@~3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
+ integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
+
+env-paths@^2.2.0, env-paths@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+envinfo@^7.7.3:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
+
+errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.19.0, es-abstract@^1.20.4:
+ version "1.21.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
+ integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.2.0"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.10"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.7"
+ string.prototype.trimend "^1.0.6"
+ string.prototype.trimstart "^1.0.6"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.9"
+
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
+ integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ dependencies:
+ get-intrinsic "^1.1.3"
+ has "^1.0.3"
+ has-tostringtag "^1.0.0"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
+ integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ dependencies:
+ has "^1.0.3"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es6-error@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
+es6-object-assign@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
+ integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-standard-jsx@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239"
+ integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==
+
+eslint-config-standard@17.0.0:
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf"
+ integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==
+
+eslint-config-standard@^14.1.1:
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea"
+ integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==
+
+eslint-import-resolver-node@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7"
+ integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.11.0"
+ resolve "^1.22.1"
+
+eslint-module-utils@^2.7.4:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49"
+ integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-es@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
+ integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
+ dependencies:
+ eslint-utils "^2.0.0"
+ regexpp "^3.0.0"
+
+eslint-plugin-es@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9"
+ integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==
+ dependencies:
+ eslint-utils "^2.0.0"
+ regexpp "^3.0.0"
+
+eslint-plugin-import@^2.26.0:
+ version "2.27.5"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65"
+ integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ array.prototype.flatmap "^1.3.1"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.7"
+ eslint-module-utils "^2.7.4"
+ has "^1.0.3"
+ is-core-module "^2.11.0"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.values "^1.1.6"
+ resolve "^1.22.1"
+ semver "^6.3.0"
+ tsconfig-paths "^3.14.1"
+
+eslint-plugin-mocha@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz#b2e9e8ebef7836f999a83f8bab25d0e0c05f0d28"
+ integrity sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==
+ dependencies:
+ eslint-utils "^2.0.0"
+ ramda "^0.27.0"
+
+eslint-plugin-n@^15.1.0:
+ version "15.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90"
+ integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==
+ dependencies:
+ builtins "^5.0.1"
+ eslint-plugin-es "^4.1.0"
+ eslint-utils "^3.0.0"
+ ignore "^5.1.1"
+ is-core-module "^2.11.0"
+ minimatch "^3.1.2"
+ resolve "^1.22.1"
+ semver "^7.3.8"
+
+eslint-plugin-node@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
+ integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
+ dependencies:
+ eslint-plugin-es "^3.0.0"
+ eslint-utils "^2.0.0"
+ ignore "^5.1.1"
+ minimatch "^3.0.4"
+ resolve "^1.10.1"
+ semver "^6.1.0"
+
+eslint-plugin-promise@^4.2.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45"
+ integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==
+
+eslint-plugin-promise@^6.0.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
+ integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
+
+eslint-plugin-react@^7.28.0:
+ version "7.32.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10"
+ integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flatmap "^1.3.1"
+ array.prototype.tosorted "^1.1.1"
+ doctrine "^2.1.0"
+ estraverse "^5.3.0"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
+ minimatch "^3.1.2"
+ object.entries "^1.1.6"
+ object.fromentries "^2.0.6"
+ object.hasown "^1.1.2"
+ object.values "^1.1.6"
+ prop-types "^15.8.1"
+ resolve "^2.0.0-next.4"
+ semver "^6.3.0"
+ string.prototype.matchall "^4.0.8"
+
+eslint-plugin-standard@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
+ integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
+
+eslint-plugin-unicorn@^46.0.1:
+ version "46.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-46.0.1.tgz#222ff65b30b2d9ed6f90de908ceb6a05dd0514d9"
+ integrity sha512-setGhMTiLAddg1asdwjZ3hekIN5zLznNa5zll7pBPwFOka6greCKDQydfqy4fqyUhndi74wpDzClSQMEcmOaew==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.19.1"
+ "@eslint-community/eslint-utils" "^4.1.2"
+ ci-info "^3.6.1"
+ clean-regexp "^1.0.0"
+ esquery "^1.4.0"
+ indent-string "^4.0.0"
+ is-builtin-module "^3.2.0"
+ jsesc "^3.0.2"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ read-pkg-up "^7.0.1"
+ regexp-tree "^0.1.24"
+ regjsparser "^0.9.1"
+ safe-regex "^2.1.1"
+ semver "^7.3.8"
+ strip-indent "^3.0.0"
+
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b"
+ integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+ integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
+
+eslint-visitor-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+ integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
+ integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
+
+eslint@^8.13.0:
+ version "8.40.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4"
+ integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.4.0"
+ "@eslint/eslintrc" "^2.0.3"
+ "@eslint/js" "8.40.0"
+ "@humanwhocodes/config-array" "^0.11.8"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.0"
+ eslint-visitor-keys "^3.4.1"
+ espree "^9.5.2"
+ esquery "^1.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ grapheme-splitter "^1.0.4"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ js-sdsl "^4.1.4"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+
+eslint@^8.41.0:
+ version "8.41.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c"
+ integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.4.0"
+ "@eslint/eslintrc" "^2.0.3"
+ "@eslint/js" "8.41.0"
+ "@humanwhocodes/config-array" "^0.11.8"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.0"
+ eslint-visitor-keys "^3.4.1"
+ espree "^9.5.2"
+ esquery "^1.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+
+espree@^9.5.2:
+ version "9.5.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b"
+ integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==
+ dependencies:
+ acorn "^8.8.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0, esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+ integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
+estraverse@^5.2.0, estraverse@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+events-to-array@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6"
+ integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=
+
+events@^3.0.0, events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
+ integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==
+ dependencies:
+ cross-spawn "^7.0.0"
+ get-stream "^5.0.0"
+ human-signals "^1.1.1"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.0"
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+ strip-final-newline "^2.0.0"
+
+express@^4.16.4:
+ version "4.18.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
+ integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.1"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.5.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.11.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+extend@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extract-zip@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
+ integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
+ dependencies:
+ debug "^4.1.1"
+ get-stream "^5.1.0"
+ yauzl "^2.10.0"
+ optionalDependencies:
+ "@types/yauzl" "^2.9.1"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9:
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
+ integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.14"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859"
+ integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==
+
+fastq@^1.6.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+ integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+ dependencies:
+ reusify "^1.0.4"
+
+fault@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.0.tgz#ad2198a6e28e344dcda76a7b32406b1039f0b707"
+ integrity sha512-JsDj9LFcoC+4ChII1QpXPA7YIaY8zmqPYw7h9j5n7St7a0BBKfNnwEBAUQRBx70o2q4rs+BeSNHk8Exm6xE7fQ==
+ dependencies:
+ format "^0.2.0"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
+figgy-pudding@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+ integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+figures@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
+ integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+
+folder-hash@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/folder-hash/-/folder-hash-2.1.2.tgz#7109f9cd0cbca271936d1b5544b156d6571e6cfd"
+ integrity sha512-PmMwEZyNN96EMshf7sek4OIB7ADNsHOJ7VIw7pO0PBI0BNfEsi7U8U56TBjjqqwQ0WuBv8se0HEfmbw5b/Rk+w==
+ dependencies:
+ debug "^3.1.0"
+ graceful-fs "~4.1.11"
+ minimatch "~3.0.4"
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+format@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
+ integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
+ integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^1.0.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+ integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
+
+functions-have-names@^1.2.2, functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-func-name@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+
+get-own-enumerable-property-symbols@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
+ integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==
+
+get-stdin@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+
+get-stdin@~9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
+ integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
+
+get-stream@^5.0.0, get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+getos@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5"
+ integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==
+ dependencies:
+ async "^3.2.0"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^7.0.0, glob@^7.1.3, glob@^7.1.6:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+glob@^9.2.0:
+ version "9.3.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21"
+ integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ minimatch "^8.0.2"
+ minipass "^4.2.4"
+ path-scurry "^1.6.1"
+
+glob@~8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
+ integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+global-agent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
+ integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
+ dependencies:
+ boolean "^3.0.1"
+ es6-error "^4.1.1"
+ matcher "^3.0.0"
+ roarr "^2.15.3"
+ semver "^7.3.2"
+ serialize-error "^7.0.1"
+
+globals@^13.19.0:
+ version "13.20.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
+ integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.1, globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+got@^11.8.5:
+ version "11.8.5"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
+ integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
+ dependencies:
+ "@sindresorhus/is" "^4.0.0"
+ "@szmarczak/http-timer" "^4.0.5"
+ "@types/cacheable-request" "^6.0.1"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^5.0.3"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ http2-wrapper "^1.0.0-beta.5.2"
+ lowercase-keys "^2.0.0"
+ p-cancelable "^2.0.0"
+ responselike "^2.0.0"
+
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+graceful-fs@~4.1.11:
+ version "4.1.15"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+ integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
+
+grapheme-splitter@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
+ integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-flag@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-5.0.1.tgz#5483db2ae02a472d1d0691462fc587d1843cd940"
+ integrity sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http2-wrapper@^1.0.0-beta.5.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
+ integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.0.0"
+
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+husky@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9"
+ integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.0.0, ignore@^5.1.1:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+ignore@^5.2.0, ignore@~5.2.4:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+
+import-fresh@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
+ integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-fresh@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+ integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+import-meta-resolve@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz#244fd542fd1fae73550d4f8b3cde3bba1d7b2b18"
+ integrity sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==
+ dependencies:
+ builtins "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.5:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
+ integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
+
+ini@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d"
+ integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==
+
+internal-slot@^1.0.3, internal-slot@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
+ integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+ dependencies:
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-alphabetical@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.0.tgz#ef6e2caea57c63450fffc7abb6cbdafc5eb96e96"
+ integrity sha512-5OV8Toyq3oh4eq6sbWTYzlGdnMT/DPI5I0zxUBxjiigQsZycpkKF3kskkao3JyYGuYDHvhgJF+DrjMQp9SX86w==
+
+is-alphanumerical@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.0.tgz#0fbfeb6a72d21d91143b3d182bf6cf5909ee66f6"
+ integrity sha512-t+2GlJ+hO9yagJ+jU3+HSh80VKvz/3cG2cxbGGm4S0hjKuhWQXgPVUVOZz3tqZzMjhmphZ+1TIJTlRZRoe6GCQ==
+ dependencies:
+ is-alphabetical "^2.0.0"
+ is-decimal "^2.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-builtin-module@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
+ integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
+ dependencies:
+ builtin-modules "^3.3.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.11.0:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
+ integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
+ dependencies:
+ has "^1.0.3"
+
+is-core-module@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+ dependencies:
+ has "^1.0.3"
+
+is-core-module@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-decimal@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.0.tgz#db1140337809fd043a056ae40a9bd1cdc563034c"
+ integrity sha512-QfrfjQV0LjoWQ1K1XSoEZkTAzSa14RKVMa5zg3SdAfzEmQzRM4+tbSFWb78creCeA9rNBzaZal92opi1TwPWZw==
+
+is-empty@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-empty/-/is-empty-1.2.0.tgz#de9bb5b278738a05a0b09a57e1fb4d4a341a9f6b"
+ integrity sha1-3pu1snhzigWgsJpX4ftNSjQan2s=
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-fullwidth-code-point@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
+ integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hexadecimal@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.0.tgz#8e1ec9f48fe3eabd90161109856a23e0907a65d5"
+ integrity sha512-vGOtYkiaxwIiR0+Ng/zNId+ZZehGfINwTzdrDqc6iubbnQWhnPuYymOzOKUDqa2cSl59yHnEh2h6MvRLQsyNug==
+
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+ integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-obj@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22"
+ integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+ integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+ integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+js-sdsl@^4.1.4:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
+ integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.2.7:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^4.0.0, js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-buffer@3.0.1, json-buffer@~3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-better-errors@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stringify-safe@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^1.0.1, json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.0.0, json5@^2.1.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonc-parser@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
+ integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
+ integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
+ dependencies:
+ universalify "^1.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonwebtoken@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d"
+ integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==
+ dependencies:
+ jws "^3.2.2"
+ lodash "^4.17.21"
+ ms "^2.1.1"
+ semver "^7.3.8"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea"
+ integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==
+ dependencies:
+ array-includes "^3.1.5"
+ object.assign "^4.1.3"
+
+jwa@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
+ integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
+ dependencies:
+ buffer-equal-constant-time "1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
+ integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
+ dependencies:
+ jwa "^1.4.1"
+ safe-buffer "^5.0.1"
+
+keyv@^4.0.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.1.tgz#7970672f137d987945821b1a07b524ce5a4edd27"
+ integrity sha512-nwP7AQOxFzELXsNq3zCx/oh81zu4DHWwCE6W9RaeHb7OHO0JpmKS8n801ovVQC7PTsZDWtPA5j1QY+/WWtARYg==
+ dependencies:
+ compress-brotli "^1.3.8"
+ json-buffer "3.0.1"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
+ integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
+ dependencies:
+ graceful-fs "^4.1.9"
+
+kleur@^4.0.3:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780"
+ integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+libnpmconfig@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
+ integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
+ dependencies:
+ figgy-pudding "^3.5.1"
+ find-up "^3.0.0"
+ ini "^1.3.5"
+
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+linkify-it@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
+ integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
+ dependencies:
+ uc.micro "^1.0.1"
+
+linkify-it@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec"
+ integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==
+ dependencies:
+ uc.micro "^1.0.1"
+
+lint-staged@^10.2.11:
+ version "10.2.11"
+ resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.11.tgz#713c80877f2dc8b609b05bc59020234e766c9720"
+ integrity sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==
+ dependencies:
+ chalk "^4.0.0"
+ cli-truncate "2.1.0"
+ commander "^5.1.0"
+ cosmiconfig "^6.0.0"
+ debug "^4.1.1"
+ dedent "^0.7.0"
+ enquirer "^2.3.5"
+ execa "^4.0.1"
+ listr2 "^2.1.0"
+ log-symbols "^4.0.0"
+ micromatch "^4.0.2"
+ normalize-path "^3.0.0"
+ please-upgrade-node "^3.2.0"
+ string-argv "0.3.1"
+ stringify-object "^3.3.0"
+
+lint@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/lint/-/lint-1.1.2.tgz#35ed064f322547c331358d899868664968ba371f"
+ integrity sha1-Ne0GTzIlR8MxNY2JmGhmSWi6Nx8=
+
+listr2@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.2.0.tgz#cb88631258abc578c7fb64e590fe5742f28e4aac"
+ integrity sha512-Q8qbd7rgmEwDo1nSyHaWQeztfGsdL6rb4uh7BA+Q80AZiDET5rVntiU1+13mu2ZTDVaBVbvAD1Db11rnu3l9sg==
+ dependencies:
+ chalk "^4.0.0"
+ cli-truncate "^2.1.0"
+ figures "^3.2.0"
+ indent-string "^4.0.0"
+ log-update "^4.0.0"
+ p-map "^4.0.0"
+ rxjs "^6.5.5"
+ through "^2.3.8"
+
+load-json-file@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3"
+ integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==
+ dependencies:
+ graceful-fs "^4.1.15"
+ parse-json "^4.0.0"
+ pify "^4.0.1"
+ strip-bom "^3.0.0"
+ type-fest "^0.3.0"
+
+load-plugin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/load-plugin/-/load-plugin-4.0.1.tgz#9a239b0337064c9b8aac82b0c9f89b067db487c5"
+ integrity sha512-4kMi+mOSn/TR51pDo4tgxROHfBHXsrcyEYSGHcJ1o6TtRaP2PsRM5EwmYbj1uiLDvbfA/ohwuSWZJzqGiai8Dw==
+ dependencies:
+ import-meta-resolve "^1.0.0"
+ libnpmconfig "^1.0.0"
+
+loader-runner@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
+
+loader-utils@^1.0.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3"
+ integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
+ integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
+log-symbols@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-symbols@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+log-update@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
+ integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
+ dependencies:
+ ansi-escapes "^4.3.0"
+ cli-cursor "^3.1.0"
+ slice-ansi "^4.0.0"
+ wrap-ansi "^6.2.0"
+
+longest-streak@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.0.tgz#f127e2bded83caa6a35ac5f7a2f2b2f94b36f3dc"
+ integrity sha512-XhUjWR5CFaQ03JOP+iSDS9koy8T5jfoImCZ4XprElw3BXsSk4MpVYOLw/6LTDKZhO13PlAXnB5gS4MHQTpkSOw==
+
+loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lru-cache@^9.0.0, lru-cache@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1"
+ integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==
+
+make-error@^1.1.1:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
+ integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
+
+markdown-it@13.0.1, markdown-it@^13.0.1:
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430"
+ integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==
+ dependencies:
+ argparse "^2.0.1"
+ entities "~3.0.1"
+ linkify-it "^4.0.1"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
+markdown-it@^12.0.0:
+ version "12.3.2"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
+ integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
+ dependencies:
+ argparse "^2.0.1"
+ entities "~2.1.0"
+ linkify-it "^3.0.1"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
+markdownlint-cli@^0.33.0:
+ version "0.33.0"
+ resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.33.0.tgz#703af1234c32c309ab52fcd0e8bc797a34e2b096"
+ integrity sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ==
+ dependencies:
+ commander "~9.4.1"
+ get-stdin "~9.0.0"
+ glob "~8.0.3"
+ ignore "~5.2.4"
+ js-yaml "^4.1.0"
+ jsonc-parser "~3.2.0"
+ markdownlint "~0.27.0"
+ minimatch "~5.1.2"
+ run-con "~1.2.11"
+
+markdownlint@~0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.27.0.tgz#9dabf7710a4999e2835e3c68317f1acd0bc89049"
+ integrity sha512-HtfVr/hzJJmE0C198F99JLaeada+646B5SaG2pVoEakLFI6iRGsvMqrnnrflq8hm1zQgwskEgqSnhDW11JBp0w==
+ dependencies:
+ markdown-it "13.0.1"
+
+matcher-collection@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838"
+ integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==
+ dependencies:
+ minimatch "^3.0.2"
+
+matcher@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
+ integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+
+mdast-comment-marker@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/mdast-comment-marker/-/mdast-comment-marker-1.1.1.tgz#9c9c18e1ed57feafc1965d92b028f37c3c8da70d"
+ integrity sha512-TWZDaUtPLwKX1pzDIY48MkSUQRDwX/HqbTB4m3iYdL/zosi/Z6Xqfdv0C0hNVKvzrPjZENrpWDt4p4odeVO0Iw==
+
+mdast-util-from-markdown@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.0.tgz#c517313cd999ec2b8f6d447b438c5a9d500b89c9"
+ integrity sha512-uj2G60sb7z1PNOeElFwCC9b/Se/lFXuLhVKFOAY2EHz/VvgbupTQRNXPoZl7rGpXYL6BNZgcgaybrlSWbo7n/g==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ mdast-util-to-string "^3.0.0"
+ micromark "^3.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ parse-entities "^3.0.0"
+ unist-util-stringify-position "^3.0.0"
+
+mdast-util-from-markdown@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894"
+ integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ decode-named-character-reference "^1.0.0"
+ mdast-util-to-string "^3.1.0"
+ micromark "^3.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-decode-string "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ unist-util-stringify-position "^3.0.0"
+ uvu "^0.5.0"
+
+mdast-util-heading-style@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/mdast-util-heading-style/-/mdast-util-heading-style-1.0.5.tgz#81b2e60d76754198687db0e8f044e42376db0426"
+ integrity sha512-8zQkb3IUwiwOdUw6jIhnwM6DPyib+mgzQuHAe7j2Hy1rIarU4VUxe472bp9oktqULW3xqZE+Kz6OD4Gi7IA3vw==
+
+mdast-util-to-markdown@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.1.1.tgz#545ccc4dcc6672614b84fd1064482320dd689b12"
+ integrity sha512-4puev/CxuxVdlsx5lVmuzgdqfjkkJJLS1Zm/MnejQ8I7BLeeBlbkwp6WOGJypEcN8g56LbVbhNmn84MvvcAvSQ==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ longest-streak "^3.0.0"
+ mdast-util-to-string "^3.0.0"
+ parse-entities "^3.0.0"
+ zwitch "^2.0.0"
+
+mdast-util-to-string@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.0.6.tgz#7d85421021343b33de1552fc71cb8e5b4ae7536d"
+ integrity sha512-868pp48gUPmZIhfKrLbaDneuzGiw3OTDjHc5M1kAepR2CWBJ+HpEsm252K4aXdiP5coVZaJPOqGtVU6Po8xnXg==
+
+mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9"
+ integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==
+
+mdurl@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
+ integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memory-fs@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromark-core-commonmark@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.0.tgz#b767fa7687c205c224175bf067796360a3830350"
+ integrity sha512-y9g7zymcKRBHM/aNBekstvs/Grpf+y4OEBULUTYvGZcusnp+JeOxmilJY4GMpo2/xY7iHQL9fjz5pD9pSAud9A==
+ dependencies:
+ micromark-factory-destination "^1.0.0"
+ micromark-factory-label "^1.0.0"
+ micromark-factory-space "^1.0.0"
+ micromark-factory-title "^1.0.0"
+ micromark-factory-whitespace "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-classify-character "^1.0.0"
+ micromark-util-html-tag-name "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ parse-entities "^3.0.0"
+
+micromark-factory-destination@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e"
+ integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-label@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.0.tgz#b316ec479b474232973ff13b49b576f84a6f2cbb"
+ integrity sha512-XWEucVZb+qBCe2jmlOnWr6sWSY6NHx+wtpgYFsm4G+dufOf6tTQRRo0bdO7XSlGPu5fyjpJenth6Ksnc5Mwfww==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-space@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633"
+ integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-title@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.0.tgz#708f7a8044f34a898c0efdb4f55e4da66b537273"
+ integrity sha512-flvC7Gx0dWVWorXuBl09Cr3wB5FTuYec8pMGVySIp2ZlqTcIjN/lFohZcP0EG//krTptm34kozHk7aK/CleCfA==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-whitespace@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c"
+ integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-character@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86"
+ integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-chunked@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06"
+ integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-classify-character@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20"
+ integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-combine-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5"
+ integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-decode-numeric-character-reference@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946"
+ integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-decode-string@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02"
+ integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==
+ dependencies:
+ decode-named-character-reference "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-encode@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz#c409ecf751a28aa9564b599db35640fccec4c068"
+ integrity sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==
+
+micromark-util-html-tag-name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed"
+ integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==
+
+micromark-util-normalize-identifier@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828"
+ integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-resolve-all@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88"
+ integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==
+ dependencies:
+ micromark-util-types "^1.0.0"
+
+micromark-util-sanitize-uri@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2"
+ integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-subtokenize@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.0.tgz#6f006fa719af92776c75a264daaede0fb3943c6a"
+ integrity sha512-EsnG2qscmcN5XhkqQBZni/4oQbLFjz9yk3ZM/P8a3YUjwV6+6On2wehr1ALx0MxK3+XXXLTzuBKHDFeDFYRdgQ==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-symbol@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz#91cdbcc9b2a827c0129a177d36241bcd3ccaa34d"
+ integrity sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==
+
+micromark-util-types@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.0.tgz#0ebdfaea3fa7c15fc82b1e06ea1ef0152d0fb2f0"
+ integrity sha512-psf1WAaP1B77WpW4mBGDkTr+3RsPuDAgsvlP47GJzbH1jmjH8xjOx7Z6kp84L8oqHmy5pYO3Ev46odosZV+3AA==
+
+micromark@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.3.tgz#4c9f76fce8ba68eddf8730bb4fee2041d699d5b7"
+ integrity sha512-fWuHx+JKV4zA8WfCFor2DWP9XmsZkIiyWRGofr7P7IGfpRIlb7/C5wwusGsNyr1D8HI5arghZDG1Ikc0FBwS5Q==
+ dependencies:
+ "@types/debug" "^4.0.0"
+ debug "^4.0.0"
+ micromark-core-commonmark "^1.0.0"
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-combine-extensions "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-sanitize-uri "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ parse-entities "^3.0.0"
+
+micromatch@^4.0.0, micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.4:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
+ integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.5, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022"
+ integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^8.0.2:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229"
+ integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff"
+ integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.0.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+minimist@^1.2.0, minimist@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^3.0.0:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.1.tgz#2b9408c6e81bb8b338d600fb3685e375a370a057"
+ integrity sha512-V9esFpNbK0arbN3fm2sxDKqMYgIp7XtVdE4Esj+PE4Qaaxdg1wIw48ITQIOn1sc8xXSmUviVL3cyjMqPlrVkiA==
+
+minipass@^4.2.4:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a"
+ integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
+
+"minipass@^5.0.0 || ^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81"
+ integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mri@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
+ integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+nan@nodejs/nan#e14bdcd1f72d62bca1d541b66da43130384ec213:
+ version "2.18.0"
+ resolved "https://codeload.github.com/nodejs/nan/tar.gz/e14bdcd1f72d62bca1d541b66da43130384ec213"
+
+natural-compare-lite@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
+ integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+node-fetch@^2.6.1:
+ version "2.6.8"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e"
+ integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-fetch@^2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-fetch@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
+ integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-releases@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
+ integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
+
+normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+null-loader@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.0.tgz#8e491b253cd87341d82c0e84b66980d806dfbd04"
+ integrity sha512-vSoBF6M08/RHwc6r0gvB/xBJBtmbvvEkf6+IiadUCoNYchjxE8lwzCGFg0Qp2D25xPiJxUBh2iNWzlzGMILp7Q==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^2.6.5"
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-inspect@^1.12.3, object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.3, object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23"
+ integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.fromentries@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73"
+ integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.hasown@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92"
+ integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==
+ dependencies:
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.values@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d"
+ integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
+ dependencies:
+ mimic-fn "^1.0.0"
+
+onetime@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+ integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
+ora@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
+ integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
+ dependencies:
+ chalk "^2.4.2"
+ cli-cursor "^2.1.0"
+ cli-spinners "^2.0.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^5.2.0"
+ wcwidth "^1.0.1"
+
+ora@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05"
+ integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==
+ dependencies:
+ chalk "^3.0.0"
+ cli-cursor "^3.1.0"
+ cli-spinners "^2.2.0"
+ is-interactive "^1.0.0"
+ log-symbols "^3.0.0"
+ mute-stream "0.0.8"
+ strip-ansi "^6.0.0"
+ wcwidth "^1.0.1"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+ integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
+
+p-limit@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
+ integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-entities@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-3.0.0.tgz#9ed6d6569b6cfc95ade058d683ddef239dad60dc"
+ integrity sha512-AJlcIFDNPEP33KyJLguv0xJc83BNvjxwpuUIcetyXUsLpVXAUCePJ5kIoYtEN2R1ac0cYaRu/vk9dVFkewHQhQ==
+ dependencies:
+ character-entities "^2.0.0"
+ character-entities-legacy "^2.0.0"
+ character-reference-invalid "^2.0.0"
+ is-alphanumerical "^2.0.0"
+ is-decimal "^2.0.0"
+ is-hexadecimal "^2.0.0"
+
+parse-gitignore@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/parse-gitignore/-/parse-gitignore-0.4.0.tgz#abf702e4b900524fff7902b683862857b63f93fe"
+ integrity sha1-q/cC5LkAUk//eQK2g4YoV7Y/k/4=
+ dependencies:
+ array-unique "^0.3.2"
+ is-glob "^3.1.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
+ integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+ lines-and-columns "^1.1.6"
+
+parse-ms@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d"
+ integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6, path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^1.6.1:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63"
+ integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==
+ dependencies:
+ lru-cache "^9.1.1"
+ minipass "^5.0.0 || ^6.0.2"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pathval@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
+ integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
+
+picomatch@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pkg-conf@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae"
+ integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==
+ dependencies:
+ find-up "^3.0.0"
+ load-json-file "^5.2.0"
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+please-upgrade-node@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
+ integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==
+ dependencies:
+ semver-compare "^1.0.0"
+
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+pre-flight@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pre-flight/-/pre-flight-1.1.1.tgz#482fb1649fb400616a86b2706b11591f5cc8402d"
+ integrity sha512-glqyc2Hh3K+sYeSsVs+HhjyUVf8j6xwuFej0yjYjRYfSnOK8P3Na9GznkoPn48fR+9kTOfkocYIWrtWktp4AqA==
+ dependencies:
+ colors "^1.1.2"
+ commander "^2.9.0"
+ semver "^5.1.0"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+pretty-ms@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.0.0.tgz#6133a8f55804b208e4728f6aa7bf01085e951e24"
+ integrity sha512-94VRYjL9k33RzfKiGokPBPpsmloBYSf5Ri+Pq19zlsEcUKFob+admeXr5eFDRuPjFmEOcjJvPGdillYOJyvZ7Q==
+ dependencies:
+ parse-ms "^2.1.0"
+
+pretty-ms@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.1.0.tgz#b906bdd1ec9e9799995c372e2b1c34f073f95384"
+ integrity sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==
+ dependencies:
+ parse-ms "^2.1.0"
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10, process@~0.11.0:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+ dependencies:
+ side-channel "^1.0.4"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==
+
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+ramda@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43"
+ integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+react-is@^16.13.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
+readable-stream@^2, readable-stream@^2.0.1, readable-stream@~2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.0.2:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+ dependencies:
+ resolve "^1.1.6"
+
+rechoir@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
+ integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+ dependencies:
+ resolve "^1.9.0"
+
+regexp-tree@^0.1.24, regexp-tree@~0.1.1:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd"
+ integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
+ integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ functions-have-names "^1.2.3"
+
+regexpp@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
+ integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
+
+regjsparser@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
+ integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+remark-cli@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/remark-cli/-/remark-cli-10.0.0.tgz#3b0e20f2ad3909f35c7a6fb3f721c82f6ff5beac"
+ integrity sha512-Yc5kLsJ5vgiQJl6xMLLJHqPac6OSAC5DOqKQrtmzJxSdJby2Jgr+OpIAkWQYwvbNHEspNagyoQnuwK2UCWg73g==
+ dependencies:
+ remark "^14.0.0"
+ unified-args "^9.0.0"
+
+remark-lint-blockquote-indentation@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-2.0.1.tgz#27347959acf42a6c3e401488d8210e973576b254"
+ integrity sha512-uJ9az/Ms9AapnkWpLSCJfawBfnBI2Tn1yUsPNqIFv6YM98ymetItUMyP6ng9NFPqDvTQBbiarulkgoEo0wcafQ==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ pluralize "^8.0.0"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-code-block-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-code-block-style/-/remark-lint-code-block-style-2.0.1.tgz#448b0f2660acfcdfff2138d125ff5b1c1279c0cb"
+ integrity sha512-eRhmnColmSxJhO61GHZkvO67SpHDshVxs2j3+Zoc5Y1a4zQT2133ZAij04XKaBFfsVLjhbY/+YOWxgvtjx2nmA==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-definition-case@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-definition-case/-/remark-lint-definition-case-2.0.1.tgz#10340eb2f87acff41140d52ad7e5b40b47e6690a"
+ integrity sha512-M+XlThtQwEJLQnQb5Gi6xZdkw92rGp7m2ux58WMw/Qlcg02WgHR/O0OcHPe5VO5hMJrtI+cGG5T0svsCgRZd3w==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-definition-spacing@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-definition-spacing/-/remark-lint-definition-spacing-2.0.1.tgz#97f01bf9bf77a7bdf8013b124b7157dd90b07c64"
+ integrity sha512-xK9DOQO5MudITD189VyUiMHBIKltW1oc55L7Fti3i9DedXoBG7Phm+V9Mm7IdWzCVkquZVgVk63xQdqzSQRrSQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-emphasis-marker@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-2.0.1.tgz#1d5ca2070d4798d16c23120726158157796dc317"
+ integrity sha512-7mpbAUrSnHiWRyGkbXRL5kfSKY9Cs8cdob7Fw+Z02/pufXMF4yRWaegJ5NTUu1RE+SKlF44wtWWjvcIoyY6/aw==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-fenced-code-flag@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-2.0.1.tgz#2cb3ddb1157082c45760c7d01ca08e13376aaf62"
+ integrity sha512-+COnWHlS/h02FMxoZWxNlZW3Y8M0cQQpmx3aNCbG7xkyMyCKsMLg9EmRvYHHIbxQCuF3JT0WWx5AySqlc7d+NA==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-fenced-code-marker@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-2.0.1.tgz#7bbeb0fb45b0818a3c8a2d232cf0c723ade58ecf"
+ integrity sha512-lujpjm04enn3ma6lITlttadld6eQ1OWAEcT3qZzvFHp+zPraC0yr0eXlvtDN/0UH8mrln/QmGiZp3i8IdbucZg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-file-extension@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-file-extension/-/remark-lint-file-extension-1.0.3.tgz#a7fc78fbf041e513c618b2cca0f2160ee37daa13"
+ integrity sha512-P5gzsxKmuAVPN7Kq1W0f8Ss0cFKfu+OlezYJWXf+5qOa+9Y5GqHEUOobPnsmNFZrVMiM7JoqJN2C9ZjrUx3N6Q==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-final-definition@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-final-definition/-/remark-lint-final-definition-2.1.0.tgz#b6e654c01ebcb1afc936d7b9cd74db8ec273e0bb"
+ integrity sha512-83K7n2icOHPfBzbR5Mr1o7cu8gOjD8FwJkFx/ly+rW+8SHfjCj4D3WOFGQ1xVdmHjfomBDXXDSNo2oiacADVXQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-hard-break-spaces@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-2.0.1.tgz#2149b55cda17604562d040c525a2a0d26aeb0f0f"
+ integrity sha512-Qfn/BMQFamHhtbfLrL8Co/dbYJFLRL4PGVXZ5wumkUO5f9FkZC2RsV+MD9lisvGTkJK0ZEJrVVeaPbUIFM0OAw==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-heading-increment@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-heading-increment/-/remark-lint-heading-increment-2.0.1.tgz#b578f251508a05d79bc2d1ae941e0620e23bf1d3"
+ integrity sha512-bYDRmv/lk3nuWXs2VSD1B4FneGT6v7a74FuVmb305hyEMmFSnneJvVgnOJxyKlbNlz12pq1IQ6MhlJBda/SFtQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-heading-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-heading-style/-/remark-lint-heading-style-2.0.1.tgz#8216fca67d97bbbeec8a19b6c71bfefc16549f72"
+ integrity sha512-IrFLNs0M5Vbn9qg51AYhGUfzgLAcDOjh2hFGMz3mx664dV6zLcNZOPSdJBBJq3JQR4gKpoXcNwN1+FFaIATj+A==
+ dependencies:
+ mdast-util-heading-style "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-link-title-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-link-title-style/-/remark-lint-link-title-style-2.0.1.tgz#51a595c69fcfa73a245a030dfaa3504938a1173a"
+ integrity sha512-+Q7Ew8qpOQzjqbDF6sUHmn9mKgje+m2Ho8Xz7cEnGIRaKJgtJzkn/dZqQM/az0gn3zaN6rOuwTwqw4EsT5EsIg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+ vfile-location "^3.0.0"
+
+remark-lint-list-item-content-indent@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-2.0.1.tgz#96387459440dcd61e522ab02bff138b32bfaa63a"
+ integrity sha512-OzUMqavxyptAdG7vWvBSMc9mLW9ZlTjbW4XGayzczd3KIr6Uwp3NEFXKx6MLtYIM/vwBqMrPQUrObOC7A2uBpQ==
+ dependencies:
+ pluralize "^8.0.0"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-list-item-indent@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-list-item-indent/-/remark-lint-list-item-indent-2.0.1.tgz#c6472514e17bc02136ca87936260407ada90bf8d"
+ integrity sha512-4IKbA9GA14Q9PzKSQI6KEHU/UGO36CSQEjaDIhmb9UOhyhuzz4vWhnSIsxyI73n9nl9GGRAMNUSGzr4pQUFwTA==
+ dependencies:
+ pluralize "^8.0.0"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-list-item-spacing@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-list-item-spacing/-/remark-lint-list-item-spacing-3.0.0.tgz#14c18fe8c0f19231edb5cf94abda748bb773110b"
+ integrity sha512-SRUVonwdN3GOSFb6oIYs4IfJxIVR+rD0nynkX66qEO49/qDDT1PPvkndis6Nyew5+t+2V/Db9vqllL6SWbnEtw==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-maximum-heading-length@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-maximum-heading-length/-/remark-lint-maximum-heading-length-2.0.1.tgz#56f240707a75b59bce3384ccc9da94548affa98f"
+ integrity sha512-1CjJ71YDqEpoOjUnc4wrwZV8ZGXWUIYRYeGoarAy3QKHepJL9M+zkdbOxZDfhc3tjVoDW/LWcgsW+DEpczgiMA==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-maximum-line-length@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-maximum-line-length/-/remark-lint-maximum-line-length-2.0.3.tgz#d0d15410637d61b031a83d7c78022ec46d6c858a"
+ integrity sha512-zyWHBFh1oPAy+gkaVFXiTHYP2WwriIeBtaarDqkweytw0+qmuikjVMJTWbQ3+XfYBreD7KKDM9SI79nkp0/IZQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-auto-link-without-protocol@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-auto-link-without-protocol/-/remark-lint-no-auto-link-without-protocol-2.0.1.tgz#f75e5c24adb42385593e0d75ca39987edb70b6c4"
+ integrity sha512-TFcXxzucsfBb/5uMqGF1rQA+WJJqm1ZlYQXyvJEXigEZ8EAxsxZGPb/gOQARHl/y0vymAuYxMTaChavPKaBqpQ==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-blockquote-without-marker@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-4.0.0.tgz#856fb64dd038fa8fc27928163caa24a30ff4d790"
+ integrity sha512-Y59fMqdygRVFLk1gpx2Qhhaw5IKOR9T38Wf7pjR07bEFBGUNfcoNVIFMd1TCJfCPQxUyJzzSqfZz/KT7KdUuiQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.0.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+ vfile-location "^3.0.0"
+
+remark-lint-no-consecutive-blank-lines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-3.0.0.tgz#c8fe11095b8f031a1406da273722bd4a9174bf41"
+ integrity sha512-kmzLlOLrapBKEngwYFTdCZDmeOaze6adFPB7G0EdymD9V1mpAlnneINuOshRLEDKK5fAhXKiZXxdGIaMPkiXrA==
+ dependencies:
+ pluralize "^8.0.0"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-duplicate-headings@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-duplicate-headings/-/remark-lint-no-duplicate-headings-2.0.1.tgz#4a4b70e029155ebcfc03d8b2358c427b69a87576"
+ integrity sha512-F6AP0FJcHIlkmq0pHX0J5EGvLA9LfhuYTvnNO8y3kvflHeRjFkDyt2foz/taXR8OcLQR51n/jIJiwrrSMbiauw==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-stringify-position "^2.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-emphasis-as-heading@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-emphasis-as-heading/-/remark-lint-no-emphasis-as-heading-2.0.1.tgz#fcc064133fe00745943c334080fed822f72711ea"
+ integrity sha512-z86+yWtVivtuGIxIC4g9RuATbgZgOgyLcnaleonJ7/HdGTYssjJNyqCJweaWSLoaI0akBQdDwmtJahW5iuX3/g==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-file-name-articles@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-1.0.3.tgz#c712d06a24e24b0c4c3666cf3084a0052a2c2c17"
+ integrity sha512-YZDJDKUWZEmhrO6tHB0u0K0K2qJKxyg/kryr14OaRMvWLS62RgMn97sXPZ38XOSN7mOcCnl0k7/bClghJXx0sg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-no-file-name-consecutive-dashes@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-1.0.3.tgz#6a96ddf60e18dcdb004533733f3ccbfd8ab076ae"
+ integrity sha512-7f4vyXn/ca5lAguWWC3eu5hi8oZ7etX7aQlnTSgQZeslnJCbVJm6V6prFJKAzrqbBzMicUXr5pZLBDoXyTvHHw==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-no-file-name-irregular-characters@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-irregular-characters/-/remark-lint-no-file-name-irregular-characters-1.0.3.tgz#6dcd8b51e00e10094585918cb8e7fc999df776c3"
+ integrity sha512-b4xIy1Yi8qZpM2vnMN+6gEujagPGxUBAs1judv6xJQngkl5d5zT8VQZsYsTGHku4NWHjjh3b7vK5mr0/yp4JSg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-no-file-name-mixed-case@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-mixed-case/-/remark-lint-no-file-name-mixed-case-1.0.3.tgz#0ebe5eedd0191507d27ad6ac5eed1778cb33c2de"
+ integrity sha512-d7rJ4c8CzDbEbGafw2lllOY8k7pvnsO77t8cV4PHFylwQ3hmCdTHLuDvK87G3DaWCeKclp0PMyamfOgJWKMkPA==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-no-file-name-outer-dashes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-1.0.4.tgz#c6e22a5cc64df4e12fc31712a927e8039854a666"
+ integrity sha512-+bZvvme2Bm3Vp5L2iKuvGHYVmHKrTkkRt8JqJPGepuhvBvT4Q7+CgfKyMtC/hIjyl+IcuJQ2H0qPRzdicjy1wQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+
+remark-lint-no-heading-punctuation@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-heading-punctuation/-/remark-lint-no-heading-punctuation-2.0.1.tgz#face59f9a95c8aa278a8ee0c728bc44cd53ea9ed"
+ integrity sha512-lY/eF6GbMeGu4cSuxfGHyvaQQBIq/6T/o+HvAR5UfxSTxmxZFwbZneAI2lbeR1zPcqOU87NsZ5ZZzWVwdLpPBw==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-inline-padding@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-3.0.0.tgz#14c2722bcddc648297a54298107a922171faf6eb"
+ integrity sha512-3s9uW3Yux9RFC0xV81MQX3bsYs+UY7nPnRuMxeIxgcVwxQ4E/mTJd9QjXUwBhU9kdPtJ5AalngdmOW2Tgar8Cg==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-literal-urls@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-2.0.1.tgz#731908f9866c1880e6024dcee1269fb0f40335d6"
+ integrity sha512-IDdKtWOMuKVQIlb1CnsgBoyoTcXU3LppelDFAIZePbRPySVHklTtuK57kacgU5grc7gPM04bZV96eliGrRU7Iw==
+ dependencies:
+ mdast-util-to-string "^1.0.2"
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-multiple-toplevel-headings@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-2.0.1.tgz#3ff2b505adf720f4ff2ad2b1021f8cfd50ad8635"
+ integrity sha512-VKSItR6c+u3OsE5pUiSmNusERNyQS9Nnji26ezoQ1uvy06k3RypIjmzQqJ/hCkSiF+hoyC3ibtrrGT8gorzCmQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-stringify-position "^2.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-shell-dollars@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-2.0.2.tgz#b2c6c3ed95e5615f8e5f031c7d271a18dc17618e"
+ integrity sha512-zhkHZOuyaD3r/TUUkkVqW0OxsR9fnSrAnHIF63nfJoAAUezPOu8D1NBsni6rX8H2DqGbPYkoeWrNsTwiKP0yow==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-shortcut-reference-image@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-2.0.1.tgz#d174d12a57e8307caf6232f61a795bc1d64afeaa"
+ integrity sha512-2jcZBdnN6ecP7u87gkOVFrvICLXIU5OsdWbo160FvS/2v3qqqwF2e/n/e7D9Jd+KTq1mR1gEVVuTqkWWuh3cig==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-shortcut-reference-link@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-2.0.1.tgz#8f963f81036e45cfb7061b3639e9c6952308bc94"
+ integrity sha512-pTZbslG412rrwwGQkIboA8wpBvcjmGFmvugIA+UQR+GfFysKtJ5OZMPGJ98/9CYWjw9Z5m0/EktplZ5TjFjqwA==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-no-table-indentation@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-3.0.0.tgz#f3c3fc24375069ec8e510f43050600fb22436731"
+ integrity sha512-+l7GovI6T+3LhnTtz/SmSRyOb6Fxy6tmaObKHrwb/GAebI/4MhFS1LVo3vbiP/RpPYtyQoFbbuXI55hqBG4ibQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+ vfile-location "^3.0.0"
+
+remark-lint-ordered-list-marker-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-2.0.1.tgz#183c31967e6f2ae8ef00effad03633f7fd00ffaa"
+ integrity sha512-Cnpw1Dn9CHn+wBjlyf4qhPciiJroFOEGmyfX008sQ8uGoPZsoBVIJx76usnHklojSONbpjEDcJCjnOvfAcWW1A==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-ordered-list-marker-value@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-2.0.1.tgz#0de343de2efb41f01eae9f0f7e7d30fe43db5595"
+ integrity sha512-blt9rS7OKxZ2NW8tqojELeyNEwPhhTJGVa+YpUkdEH+KnrdcD7Nzhnj6zfLWOx6jFNZk3jpq5nvLFAPteHaNKg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-rule-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-rule-style/-/remark-lint-rule-style-2.0.1.tgz#f59bd82e75d3eaabd0eee1c8c0f5513372eb553c"
+ integrity sha512-hz4Ff9UdlYmtO6Czz99WJavCjqCer7Cav4VopXt+yVIikObw96G5bAuLYcVS7hvMUGqC9ZuM02/Y/iq9n8pkAg==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-strong-marker@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-strong-marker/-/remark-lint-strong-marker-2.0.1.tgz#1ad8f190c6ac0f8138b638965ccf3bcd18f6d4e4"
+ integrity sha512-8X2IsW1jZ5FmW9PLfQjkL0OVy/J3xdXLcZrG1GTeQKQ91BrPFyEZqUM2oM6Y4S6LGtxWer+neZkPZNroZoRPBQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-table-cell-padding@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-3.0.0.tgz#a769ba1999984ff5f90294fb6ccb8aead7e8a12f"
+ integrity sha512-sEKrbyFZPZpxI39R8/r+CwUrin9YtyRwVn0SQkNQEZWZcIpylK+bvoKIldvLIXQPob+ZxklL0GPVRzotQMwuWQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-table-pipe-alignment@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-table-pipe-alignment/-/remark-lint-table-pipe-alignment-2.0.1.tgz#12b7e4c54473d69c9866cb33439c718d09cffcc5"
+ integrity sha512-O89U7bp0ja6uQkT2uQrNB76GaPvFabrHiUGhqEUnld21yEdyj7rgS57kn84lZNSuuvN1Oor6bDyCwWQGzzpoOQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-table-pipes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint-table-pipes/-/remark-lint-table-pipes-3.0.0.tgz#b30b055d594cae782667eec91c6c5b35928ab259"
+ integrity sha512-QPokSazEdl0Y8ayUV9UB0Ggn3Jos/RAQwIo0z1KDGnJlGDiF80Jc6iU9RgDNUOjlpQffSLIfSVxH5VVYF/K3uQ==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint-unordered-list-marker-style@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-2.0.1.tgz#e64692aa9594dbe7e945ae76ab2218949cd92477"
+ integrity sha512-8KIDJNDtgbymEvl3LkrXgdxPMTOndcux3BHhNGB2lU4UnxSpYeHsxcDgirbgU6dqCAfQfvMjPvfYk19QTF9WZA==
+ dependencies:
+ unified-lint-rule "^1.0.0"
+ unist-util-generated "^1.1.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-lint@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/remark-lint/-/remark-lint-8.0.0.tgz#6e40894f4a39eaea31fc4dd45abfaba948bf9a09"
+ integrity sha512-ESI8qJQ/TIRjABDnqoFsTiZntu+FRifZ5fJ77yX63eIDijl/arvmDvT+tAf75/Nm5BFL4R2JFUtkHRGVjzYUsg==
+ dependencies:
+ remark-message-control "^6.0.0"
+
+remark-message-control@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/remark-message-control/-/remark-message-control-6.0.0.tgz#955b054b38c197c9f2e35b1d88a4912949db7fc5"
+ integrity sha512-k9bt7BYc3G7YBdmeAhvd3VavrPa/XlKWR3CyHjr4sLO9xJyly8WHHT3Sp+8HPR8lEUv+/sZaffL7IjMLV0f6BA==
+ dependencies:
+ mdast-comment-marker "^1.0.0"
+ unified-message-control "^3.0.0"
+
+remark-parse@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.0.tgz#65e2b2b34d8581d36b97f12a2926bb2126961cb4"
+ integrity sha512-07ei47p2Xl7Bqbn9H2VYQYirnAFJPwdMuypdozWsSbnmrkgA2e2sZLZdnDNrrsxR4onmIzH/J6KXqKxCuqHtPQ==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ mdast-util-from-markdown "^1.0.0"
+ unified "^10.0.0"
+
+remark-preset-lint-markdown-style-guide@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/remark-preset-lint-markdown-style-guide/-/remark-preset-lint-markdown-style-guide-4.0.0.tgz#976b6ffd7f37aa90868e081a69241fcde3a297d4"
+ integrity sha512-gczDlfZ28Fz0IN/oddy0AH4CiTu9S8d3pJWUsrnwFiafjhJjPGobGE1OD3bksi53md1Bp4K0fzo99YYfvB4Sjw==
+ dependencies:
+ remark-lint "^8.0.0"
+ remark-lint-blockquote-indentation "^2.0.0"
+ remark-lint-code-block-style "^2.0.0"
+ remark-lint-definition-case "^2.0.0"
+ remark-lint-definition-spacing "^2.0.0"
+ remark-lint-emphasis-marker "^2.0.0"
+ remark-lint-fenced-code-flag "^2.0.0"
+ remark-lint-fenced-code-marker "^2.0.0"
+ remark-lint-file-extension "^1.0.0"
+ remark-lint-final-definition "^2.0.0"
+ remark-lint-hard-break-spaces "^2.0.0"
+ remark-lint-heading-increment "^2.0.0"
+ remark-lint-heading-style "^2.0.0"
+ remark-lint-link-title-style "^2.0.0"
+ remark-lint-list-item-content-indent "^2.0.0"
+ remark-lint-list-item-indent "^2.0.0"
+ remark-lint-list-item-spacing "^3.0.0"
+ remark-lint-maximum-heading-length "^2.0.0"
+ remark-lint-maximum-line-length "^2.0.0"
+ remark-lint-no-auto-link-without-protocol "^2.0.0"
+ remark-lint-no-blockquote-without-marker "^4.0.0"
+ remark-lint-no-consecutive-blank-lines "^3.0.0"
+ remark-lint-no-duplicate-headings "^2.0.0"
+ remark-lint-no-emphasis-as-heading "^2.0.0"
+ remark-lint-no-file-name-articles "^1.0.0"
+ remark-lint-no-file-name-consecutive-dashes "^1.0.0"
+ remark-lint-no-file-name-irregular-characters "^1.0.0"
+ remark-lint-no-file-name-mixed-case "^1.0.0"
+ remark-lint-no-file-name-outer-dashes "^1.0.0"
+ remark-lint-no-heading-punctuation "^2.0.0"
+ remark-lint-no-inline-padding "^3.0.0"
+ remark-lint-no-literal-urls "^2.0.0"
+ remark-lint-no-multiple-toplevel-headings "^2.0.0"
+ remark-lint-no-shell-dollars "^2.0.0"
+ remark-lint-no-shortcut-reference-image "^2.0.0"
+ remark-lint-no-shortcut-reference-link "^2.0.0"
+ remark-lint-no-table-indentation "^3.0.0"
+ remark-lint-ordered-list-marker-style "^2.0.0"
+ remark-lint-ordered-list-marker-value "^2.0.0"
+ remark-lint-rule-style "^2.0.0"
+ remark-lint-strong-marker "^2.0.0"
+ remark-lint-table-cell-padding "^3.0.0"
+ remark-lint-table-pipe-alignment "^2.0.0"
+ remark-lint-table-pipes "^3.0.0"
+ remark-lint-unordered-list-marker-style "^2.0.0"
+
+remark-stringify@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.0.tgz#7f23659d92b2d5da489e3c858656d7bbe045f161"
+ integrity sha512-3LAQqJ/qiUxkWc7fUcVuB7RtIT38rvmxfmJG8z1TiE/D8zi3JGQ2tTcTJu9Tptdpb7gFwU0whRi5q1FbFOb9yA==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ mdast-util-to-markdown "^1.0.0"
+ unified "^10.0.0"
+
+remark@^14.0.0:
+ version "14.0.1"
+ resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.1.tgz#a97280d4f2a3010a7d81e6c292a310dcd5554d80"
+ integrity sha512-7zLG3u8EUjOGuaAS9gUNJPD2j+SqDqAFHv2g6WMpE5CU9rZ6e3IKDM12KHZ3x+YNje+NMAuN55yx8S5msGSx7Q==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ remark-parse "^10.0.0"
+ remark-stringify "^10.0.0"
+ unified "^10.0.0"
+
+repeat-string@^1.0.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+resolve-alpn@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
+ integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve@^1.1.6:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f"
+ integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==
+ dependencies:
+ is-core-module "^2.8.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^1.10.0, resolve@^1.22.1:
+ version "1.22.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
+ integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
+ dependencies:
+ is-core-module "^2.11.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^1.10.1:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.9.0:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^2.0.0-next.4:
+ version "2.0.0-next.4"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
+ integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
+ integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755"
+ integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==
+ dependencies:
+ glob "^9.2.0"
+
+rimraf@~2.2.6:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+ integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=
+
+roarr@^2.15.3:
+ version "2.15.4"
+ resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
+ integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
+ dependencies:
+ boolean "^3.0.1"
+ detect-node "^2.0.4"
+ globalthis "^1.0.1"
+ json-stringify-safe "^5.0.1"
+ semver-compare "^1.0.0"
+ sprintf-js "^1.1.2"
+
+run-con@~1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/run-con/-/run-con-1.2.11.tgz#0014ed430bad034a60568dfe7de2235f32e3f3c4"
+ integrity sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~3.0.0"
+ minimist "^1.2.6"
+ strip-json-comments "~3.1.1"
+
+run-parallel@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+ integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
+rxjs@^6.5.5:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84"
+ integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==
+ dependencies:
+ tslib "^1.9.0"
+
+sade@^1.7.3:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701"
+ integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==
+ dependencies:
+ mri "^1.1.0"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+safe-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
+ integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
+ dependencies:
+ regexp-tree "~0.1.1"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@>=0.6.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+schema-utils@^2.6.5:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+ dependencies:
+ "@types/json-schema" "^7.0.4"
+ ajv "^6.12.2"
+ ajv-keywords "^3.4.1"
+
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+
+"semver@2 || 3 || 4 || 5", semver@^5.1.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb"
+ integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shelljs@^0.8.1:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
+ integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+shx@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.2.tgz#40501ce14eb5e0cbcac7ddbd4b325563aad8c123"
+ integrity sha512-aS0mWtW3T2sHAenrSrip2XGv39O9dXIFUqxAEWHEOS1ePtGIBavdPJY1kE2IHl14V/4iCbUiNDPGdyYTtmhSoA==
+ dependencies:
+ es6-object-assign "^1.0.3"
+ minimist "^1.2.0"
+ shelljs "^0.8.1"
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-git@^3.5.0:
+ version "3.16.0"
+ resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.16.0.tgz#421773e24680f5716999cc4a1d60127b4b6a9dec"
+ integrity sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==
+ dependencies:
+ "@kwsites/file-exists" "^1.1.1"
+ "@kwsites/promise-deferred" "^1.1.1"
+ debug "^4.3.4"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+ integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+sliced@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
+ integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
+
+source-map-support@^0.5.6:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.13"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5"
+ integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==
+
+sprintf-js@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+standard-engine@^15.0.0:
+ version "15.0.0"
+ resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.0.0.tgz#e37ca2e1a589ef85431043a3e87cb9ce95a4ca4e"
+ integrity sha512-4xwUhJNo1g/L2cleysUqUv7/btn7GEbYJvmgKrQ2vd/8pkTmN8cpqAZg+BT8Z1hNeEH787iWUdOpL8fmApLtxA==
+ dependencies:
+ get-stdin "^8.0.0"
+ minimist "^1.2.6"
+ pkg-conf "^3.1.0"
+ xdg-basedir "^4.0.0"
+
+standard@^17.0.0:
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/standard/-/standard-17.0.0.tgz#85718ecd04dc4133908434660788708cca855aa1"
+ integrity sha512-GlCM9nzbLUkr+TYR5I2WQoIah4wHA2lMauqbyPLV/oI5gJxqhHzhjl9EG2N0lr/nRqI3KCbCvm/W3smxvLaChA==
+ dependencies:
+ eslint "^8.13.0"
+ eslint-config-standard "17.0.0"
+ eslint-config-standard-jsx "^11.0.0"
+ eslint-plugin-import "^2.26.0"
+ eslint-plugin-n "^15.1.0"
+ eslint-plugin-promise "^6.0.0"
+ eslint-plugin-react "^7.28.0"
+ standard-engine "^15.0.0"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+stream-chain@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.3.tgz#44cfa21ab673e53a3f1691b3d1665c3aceb1983b"
+ integrity sha512-w+WgmCZ6BItPAD3/4HD1eDiDHRLhjSSyIV+F0kcmmRyz8Uv9hvQF22KyaiAUmOlmX3pJ6F95h+C191UbS8Oe/g==
+
+stream-json@^1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.7.1.tgz#ec7e414c2eba456c89a4b4e5223794eabc3860c4"
+ integrity sha512-I7g0IDqvdJXbJ279/D3ZoTx0VMhmKnEF7u38CffeWdF8bfpMPsLo+5fWnkNjO2GU/JjWaRjdH+zmH03q+XGXFw==
+ dependencies:
+ stream-chain "^2.2.3"
+
+string-argv@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+ integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string-width@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.0.0.tgz#19191f152f937b96f4ec54ba0986a5656660c5a2"
+ integrity sha512-zwXcRmLUdiWhMPrHz6EXITuyTgcEnUqDzspTkCLhQovxywWz6NP9VHgqfVg20V/1mUg0B95AKbXxNT+ALRmqCw==
+ dependencies:
+ emoji-regex "^9.2.2"
+ is-fullwidth-code-point "^4.0.0"
+ strip-ansi "^7.0.0"
+
+string.prototype.matchall@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
+ integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+
+string.prototype.trim@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
+ integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimend@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
+ integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimstart@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
+ integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-object@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
+ integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
+ dependencies:
+ get-own-enumerable-property-symbols "^3.0.0"
+ is-obj "^1.0.1"
+ is-regexp "^1.0.0"
+
+strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.0.tgz#1dc49b980c3a4100366617adac59327eefdefcb0"
+ integrity sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==
+ dependencies:
+ ansi-regex "^6.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+strip-json-comments@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
+ integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
+
+strip-json-comments@^3.1.1, strip-json-comments@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+sumchecker@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
+ integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
+ dependencies:
+ debug "^4.1.0"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.0.2.tgz#50f082888e4b0a4e2ccd2d0b4f9ef4efcd332485"
+ integrity sha512-ii6tc8ImGFrgMPYq7RVAMKkhPo9vk8uA+D3oKbJq/3Pk2YSMv1+9dUAesa9UxMbxBTvxwKTQffBahNVNxEvM8Q==
+ dependencies:
+ has-flag "^5.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+tap-parser@~1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-1.2.2.tgz#5e2f6970611f079c7cf857de1dc7aa1b480de7a5"
+ integrity sha1-Xi9pcGEfB5x8+FfeHceqG0gN56U=
+ dependencies:
+ events-to-array "^1.0.1"
+ inherits "~2.0.1"
+ js-yaml "^3.2.7"
+ optionalDependencies:
+ readable-stream "^2"
+
+tap-xunit@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/tap-xunit/-/tap-xunit-2.4.1.tgz#9823797b676ae5017f4e380bd70abb893b8e120e"
+ integrity sha512-qcZStDtjjYjMKAo7QNiCtOW256g3tuSyCSe5kNJniG1Q2oeOExJq4vm8CwboHZURpkXAHvtqMl4TVL7mcbMVVA==
+ dependencies:
+ duplexer "~0.1.1"
+ minimist "~1.2.0"
+ tap-parser "~1.2.2"
+ through2 "~2.0.0"
+ xmlbuilder "~4.2.0"
+ xtend "~4.0.0"
+
+tapable@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tapable@^2.1.1, tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^6.1.11:
+ version "6.1.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
+ integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^4.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+temp@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+ integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=
+ dependencies:
+ os-tmpdir "^1.0.0"
+ rimraf "~2.2.6"
+
+terser-webpack-plugin@^5.1.3:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90"
+ integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.7"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ terser "^5.7.2"
+
+terser@^5.7.2:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+through2@~2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@^2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timers-browserify@1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+ integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=
+ dependencies:
+ process "~0.11.0"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-vfile@^7.0.0:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-7.2.1.tgz#fe42892024f724177ba81076f98ee74b0888c293"
+ integrity sha512-biljADNq2n+AZn/zX+/87zStnIqctKr/q5OaOD8+qSKINokUGPbWBShvxa1iLUgHz6dGGjVnQPNoFRtVBzMkVg==
+ dependencies:
+ is-buffer "^2.0.0"
+ vfile "^5.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+trough@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96"
+ integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==
+
+ts-loader@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.2.tgz#ee73ca9350f745799396fff8578ba29b1e95616b"
+ integrity sha512-oYT7wOTUawYXQ8XIDsRhziyW0KUEV38jISYlE+9adP6tDtG+O5GkRe4QKQXrHVH4mJJ88DysvEtvGP65wMLlhg==
+ dependencies:
+ chalk "^2.3.0"
+ enhanced-resolve "^4.0.0"
+ loader-utils "^1.0.2"
+ micromatch "^4.0.0"
+ semver "^6.0.0"
+
+ts-node@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.2.0.tgz#65a0ae2acce319ea4fd7ac8d7c9f1f90c5da6baf"
+ integrity sha512-ZNT+OEGfUNVMGkpIaDJJ44Zq3Yr0bkU/ugN1PHbU+/01Z7UV1fsELRiTx1KuQNvQ1A3pGh3y25iYF6jXgxV21A==
+ dependencies:
+ arrify "^1.0.0"
+ buffer-from "^1.1.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.6"
+ yn "^2.0.0"
+
+tsconfig-paths@^3.14.1:
+ version "3.14.2"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088"
+ integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^1.8.1, tslib@^1.9.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
+ integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+
+tslib@^2.0.0, tslib@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+tunnel@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+ integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
+ integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@^5.1.2:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826"
+ integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==
+
+uc.micro@^1.0.1, uc.micro@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+unified-args@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/unified-args/-/unified-args-9.0.2.tgz#0c14f555e73ee29c23f9a567942e29069f56e5a2"
+ integrity sha512-qSqryjoqfJSII4E4Z2Jx7MhXX2MuUIn6DsrlmL8UnWFdGtrWvEtvm7Rx5fKT5TPUz7q/Fb4oxwIHLCttvAuRLQ==
+ dependencies:
+ "@types/text-table" "^0.2.0"
+ camelcase "^6.0.0"
+ chalk "^4.0.0"
+ chokidar "^3.0.0"
+ fault "^2.0.0"
+ json5 "^2.0.0"
+ minimist "^1.0.0"
+ text-table "^0.2.0"
+ unified-engine "^9.0.0"
+
+unified-engine@^9.0.0:
+ version "9.0.3"
+ resolved "https://registry.yarnpkg.com/unified-engine/-/unified-engine-9.0.3.tgz#c1d57e67d94f234296cbfa9364f43e0696dae016"
+ integrity sha512-SgzREcCM2IpUy3JMFUcPRZQ2Py6IwvJ2KIrg2AiI7LnGge6E6OPFWpcabHrEXG0IvO2OI3afiD9DOcQvvZfXDQ==
+ dependencies:
+ "@types/concat-stream" "^1.0.0"
+ "@types/debug" "^4.0.0"
+ "@types/is-empty" "^1.0.0"
+ "@types/js-yaml" "^4.0.0"
+ "@types/node" "^16.0.0"
+ "@types/unist" "^2.0.0"
+ concat-stream "^2.0.0"
+ debug "^4.0.0"
+ fault "^2.0.0"
+ glob "^7.0.0"
+ ignore "^5.0.0"
+ is-buffer "^2.0.0"
+ is-empty "^1.0.0"
+ is-plain-obj "^4.0.0"
+ js-yaml "^4.0.0"
+ load-plugin "^4.0.0"
+ parse-json "^5.0.0"
+ to-vfile "^7.0.0"
+ trough "^2.0.0"
+ unist-util-inspect "^7.0.0"
+ vfile-message "^3.0.0"
+ vfile-reporter "^7.0.0"
+ vfile-statistics "^2.0.0"
+
+unified-lint-rule@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unified-lint-rule/-/unified-lint-rule-1.0.4.tgz#be432d316db7ad801166041727b023ba18963e24"
+ integrity sha512-q9wY6S+d38xRAuWQVOMjBQYi7zGyKkY23ciNafB8JFVmDroyKjtytXHCg94JnhBCXrNqpfojo3+8D+gmF4zxJQ==
+ dependencies:
+ wrapped "^1.0.1"
+
+unified-message-control@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/unified-message-control/-/unified-message-control-3.0.3.tgz#d08c4564092a507668de71451a33c0d80e734bbd"
+ integrity sha512-oY5z2n8ugjpNHXOmcgrw0pQeJzavHS0VjPBP21tOcm7rc2C+5Q+kW9j5+gqtf8vfW/8sabbsK5+P+9QPwwEHDA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+ vfile-location "^3.0.0"
+
+unified@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.0.tgz#4e65eb38fc2448b1c5ee573a472340f52b9346fe"
+ integrity sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ bail "^2.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^4.0.0"
+ trough "^2.0.0"
+ vfile "^5.0.0"
+
+unist-util-generated@^1.0.0:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b"
+ integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==
+
+unist-util-generated@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.4.tgz#2261c033d9fc23fae41872cdb7663746e972c1a7"
+ integrity sha512-SA7Sys3h3X4AlVnxHdvN/qYdr4R38HzihoEVY2Q2BZu8NHWDnw5OGcC/tXWjQfd4iG+M6qRFNIRGqJmp2ez4Ww==
+
+unist-util-inspect@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/unist-util-inspect/-/unist-util-inspect-7.0.0.tgz#98426f0219e24d011a27e32539be0693d9eb973e"
+ integrity sha512-2Utgv78I7PUu461Y9cdo+IUiiKSKpDV5CE/XD6vTj849a3xlpDAScvSJ6cQmtFBGgAmCn2wR7jLuXhpg1XLlJw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+unist-util-is@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797"
+ integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==
+
+unist-util-is@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236"
+ integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==
+
+unist-util-position@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.0.3.tgz#fff942b879538b242096c148153826664b1ca373"
+ integrity sha512-28EpCBYFvnMeq9y/4w6pbnFmCUfzlsc41NJui5c51hOFjBA1fejcwc+5W4z2+0ECVbScG3dURS3JTVqwenzqZw==
+
+unist-util-stringify-position@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz#de2a2bc8d3febfa606652673a91455b6a36fb9f3"
+ integrity sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA==
+ dependencies:
+ "@types/unist" "^2.0.2"
+
+unist-util-stringify-position@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9"
+ integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+unist-util-visit-parents@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
+ integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+
+unist-util-visit-parents@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb"
+ integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+
+unist-util-visit@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
+ integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+ unist-util-visit-parents "^3.0.0"
+
+unist-util-visit@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2"
+ integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+ unist-util-visit-parents "^5.1.1"
+
+universal-github-app-jwt@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.1.1.tgz#d57cee49020662a95ca750a057e758a1a7190e6e"
+ integrity sha512-G33RTLrIBMFmlDV4u4CBF7dh71eWwykck4XgaxaIVeZKOYZRAAxvcGMRFTUclVY6xoUPQvO4Ne5wKGxYm/Yy9w==
+ dependencies:
+ "@types/jsonwebtoken" "^9.0.0"
+ jsonwebtoken "^9.0.0"
+
+universal-user-agent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
+ integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
+ integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+update-browserslist-db@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
+ integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@^8.3.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+uvu@^0.5.0:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df"
+ integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==
+ dependencies:
+ dequal "^2.0.0"
+ diff "^5.0.0"
+ kleur "^4.0.3"
+ sade "^1.7.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vfile-location@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c"
+ integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==
+
+vfile-message@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.1.tgz#b9bcf87cb5525e61777e0c6df07e816a577588a3"
+ integrity sha512-gYmSHcZZUEtYpTmaWaFJwsuUD70/rTY4v09COp8TGtOkix6gGxb/a8iTQByIY9ciTk9GwAwIXd/J9OPfM4Bvaw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^3.0.0"
+
+vfile-reporter@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-7.0.1.tgz#759bfebb995f3dc8c644284cb88ac4b310ebd168"
+ integrity sha512-pof+cQSJCUNmHG6zoBOJfErb6syIWHWM14CwKjsugCixxl4CZdrgzgxwLBW8lIB6czkzX0Agnnhj33YpKyLvmA==
+ dependencies:
+ "@types/repeat-string" "^1.0.0"
+ "@types/supports-color" "^8.0.0"
+ repeat-string "^1.0.0"
+ string-width "^5.0.0"
+ supports-color "^9.0.0"
+ unist-util-stringify-position "^3.0.0"
+ vfile-sort "^3.0.0"
+ vfile-statistics "^2.0.0"
+
+vfile-sort@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/vfile-sort/-/vfile-sort-3.0.0.tgz#ee13d3eaac0446200a2047a3b45d78fad6b106e6"
+ integrity sha512-fJNctnuMi3l4ikTVcKpxTbzHeCgvDhnI44amA3NVDvA6rTC6oKCFpCVyT5n2fFMr3ebfr+WVQZedOCd73rzSxg==
+ dependencies:
+ vfile-message "^3.0.0"
+
+vfile-statistics@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-2.0.0.tgz#f04ee3e3c666809a3c10c06021becd41ea9c8037"
+ integrity sha512-foOWtcnJhKN9M2+20AOTlWi2dxNfAoeNIoxD5GXcO182UJyId4QrXa41fWrgcfV3FWTjdEDy3I4cpLVcQscIMA==
+ dependencies:
+ vfile-message "^3.0.0"
+
+vfile@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.0.2.tgz#57773d1d91478b027632c23afab58ec3590344f0"
+ integrity sha512-5cV+K7tX83MT3bievROc+7AvHv0GXDB0zqbrTjbOe+HRbkzvY4EP+wS3IR77kUBCoWFMdG9py18t0sesPtQ1Rw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ unist-util-stringify-position "^3.0.0"
+ vfile-message "^3.0.0"
+
+vscode-jsonrpc@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz#cb9989c65e219e18533cc38e767611272d274c94"
+ integrity sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==
+
+vscode-languageserver-protocol@3.17.3:
+ version "3.17.3"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz#6d0d54da093f0c0ee3060b81612cce0f11060d57"
+ integrity sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==
+ dependencies:
+ vscode-jsonrpc "8.1.0"
+ vscode-languageserver-types "3.17.3"
+
+vscode-languageserver-textdocument@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz#16df468d5c2606103c90554ae05f9f3d335b771b"
+ integrity sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==
+
+vscode-languageserver-textdocument@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0"
+ integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==
+
+vscode-languageserver-types@3.17.3:
+ version "3.17.3"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64"
+ integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==
+
+vscode-languageserver-types@^3.17.1:
+ version "3.17.2"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz#b2c2e7de405ad3d73a883e91989b850170ffc4f2"
+ integrity sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==
+
+vscode-languageserver@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz#5024253718915d84576ce6662dd46a791498d827"
+ integrity sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==
+ dependencies:
+ vscode-languageserver-protocol "3.17.3"
+
+vscode-uri@^3.0.3:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.6.tgz#5e6e2e1a4170543af30151b561a41f71db1d6f91"
+ integrity sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==
+
+vscode-uri@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.7.tgz#6d19fef387ee6b46c479e5fb00870e15e58c1eb8"
+ integrity sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==
+
+walk-sync@^0.3.2:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4"
+ integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==
+ dependencies:
+ ensure-posix-path "^1.0.0"
+ matcher-collection "^1.0.0"
+
+watchpack@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
+ integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+webpack-cli@^4.10.0:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
+ integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
+ dependencies:
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^1.2.0"
+ "@webpack-cli/info" "^1.5.0"
+ "@webpack-cli/serve" "^1.7.0"
+ colorette "^2.0.14"
+ commander "^7.0.0"
+ cross-spawn "^7.0.3"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^2.2.0"
+ rechoir "^0.7.0"
+ webpack-merge "^5.7.3"
+
+webpack-merge@^5.7.3:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+ dependencies:
+ clone-deep "^4.0.1"
+ wildcard "^2.0.0"
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5, webpack@^5.76.0:
+ version "5.76.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c"
+ integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.7.1"
+ acorn-import-assertions "^1.7.6"
+ browserslist "^4.14.5"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.10.0"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.1.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.4.0"
+ webpack-sources "^3.2.3"
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wildcard@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
+word-wrap@^1.2.3:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
+ integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrapped@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wrapped/-/wrapped-1.0.1.tgz#c783d9d807b273e9b01e851680a938c87c907242"
+ integrity sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI=
+ dependencies:
+ co "3.1.0"
+ sliced "^1.0.1"
+
+wrapper-webpack-plugin@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/wrapper-webpack-plugin/-/wrapper-webpack-plugin-2.2.2.tgz#a950b7fbc39ca103e468a7c06c225cb1e337ad3b"
+ integrity sha512-twLGZw0b2AEnz3LmsM/uCFRzGxE+XUlUPlJkCuHY3sI+uGO4dTJsgYee3ufWJaynAZYkpgQSKMSr49n9Yxalzg==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xdg-basedir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
+ integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+
+xml2js@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7"
+ integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xmlbuilder@~4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5"
+ integrity sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=
+ dependencies:
+ lodash "^4.0.0"
+
+xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.7.2:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+
+yauzl@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+ integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zwitch@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1"
+ integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==