aboutsummaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
authorAntoine Brodin <antoine@FreeBSD.org>2021-01-01 10:11:34 +0000
committerAntoine Brodin <antoine@FreeBSD.org>2021-01-01 10:11:34 +0000
commit26b4c8f71f91d22e081b27814782686edde0c90a (patch)
tree1c321c39372c25d8634e75b5c8e08edc676b296d /www
parent548f16bd1a2915f08878b716eed92ff3267e6de2 (diff)
Notes
Diffstat (limited to 'www')
-rw-r--r--www/Makefile53
-rw-r--r--www/cliqz/Makefile191
-rw-r--r--www/cliqz/Makefile.options24
-rw-r--r--www/cliqz/distinfo13
-rw-r--r--www/cliqz/files/patch-addon-search56
-rw-r--r--www/cliqz/files/patch-bug128858739
-rw-r--r--www/cliqz/files/patch-bug155089189
-rw-r--r--www/cliqz/files/patch-bug161891443
-rw-r--r--www/cliqz/files/patch-bug162856734
-rw-r--r--www/cliqz/files/patch-bug164098217
-rw-r--r--www/cliqz/files/patch-bug166371531087
-rw-r--r--www/cliqz/files/patch-bug1667736106
-rw-r--r--www/cliqz/files/patch-cliqz__env.sh27
-rw-r--r--www/cliqz/files/patch-mozilla-release_config_rules.mk34
-rw-r--r--www/cliqz/files/patch-mozilla-release_gfx_skia_skia_src_core_SkCpu.cpp32
-rw-r--r--www/cliqz/pkg-descr5
-rw-r--r--www/cliqz/pkg-plist45
-rw-r--r--www/iridium/Makefile270
-rw-r--r--www/iridium/distinfo3
-rw-r--r--www/iridium/files/audio_manager_openbsd.cc177
-rw-r--r--www/iridium/files/audio_manager_openbsd.h65
-rw-r--r--www/iridium/files/extra-patch-clang40
-rw-r--r--www/iridium/files/iridium-browser.desktop.in11
-rw-r--r--www/iridium/files/iridium.in19
-rw-r--r--www/iridium/files/patch-3p-pdfium_3p_base_allocator_partition__allocator_page__allocator__internals__posix.h11
-rw-r--r--www/iridium/files/patch-BUILD.gn95
-rw-r--r--www/iridium/files/patch-apps_app__restore__service__browsertest.cc11
-rw-r--r--www/iridium/files/patch-apps_ui_views_app__window__frame__view.cc11
-rw-r--r--www/iridium/files/patch-ash_display_mirror__window__controller.cc14
-rw-r--r--www/iridium/files/patch-base_BUILD.gn98
-rw-r--r--www/iridium/files/patch-base_allocator_allocator__shim.cc11
-rw-r--r--www/iridium/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc76
-rw-r--r--www/iridium/files/patch-base_allocator_allocator__shim__override__libc__symbols.h11
-rw-r--r--www/iridium/files/patch-base_allocator_allocator__shim__unittest.cc45
-rw-r--r--www/iridium/files/patch-base_allocator_partition__allocator_page__allocator__internals__posix.h11
-rw-r--r--www/iridium/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc17
-rw-r--r--www/iridium/files/patch-base_base__switches.cc20
-rw-r--r--www/iridium/files/patch-base_base__switches.h20
-rw-r--r--www/iridium/files/patch-base_cpu.cc38
-rw-r--r--www/iridium/files/patch-base_debug_debugger__posix.cc56
-rw-r--r--www/iridium/files/patch-base_debug_elf__reader.cc28
-rw-r--r--www/iridium/files/patch-base_debug_proc__maps__linux.cc141
-rw-r--r--www/iridium/files/patch-base_debug_stack__trace.cc11
-rw-r--r--www/iridium/files/patch-base_debug_stack__trace.h10
-rw-r--r--www/iridium/files/patch-base_debug_stack__trace__posix.cc23
-rw-r--r--www/iridium/files/patch-base_debug_stack__trace__unittest.cc31
-rw-r--r--www/iridium/files/patch-base_files_file__path__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_files_file__path__watcher.cc15
-rw-r--r--www/iridium/files/patch-base_files_file__path__watcher__kqueue.h13
-rw-r--r--www/iridium/files/patch-base_files_file__path__watcher__stub.cc53
-rw-r--r--www/iridium/files/patch-base_files_file__path__watcher__unittest.cc41
-rw-r--r--www/iridium/files/patch-base_files_file__util.h11
-rw-r--r--www/iridium/files/patch-base_files_file__util__posix.cc11
-rw-r--r--www/iridium/files/patch-base_files_file__util__unittest.cc20
-rw-r--r--www/iridium/files/patch-base_files_scoped__file.cc11
-rw-r--r--www/iridium/files/patch-base_i18n_icu__util.cc20
-rw-r--r--www/iridium/files/patch-base_linux__util.cc20
-rw-r--r--www/iridium/files/patch-base_logging__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_memory_discardable__memory.cc63
-rw-r--r--www/iridium/files/patch-base_memory_discardable__memory__internal.h19
-rw-r--r--www/iridium/files/patch-base_memory_madv__free__discardable__memory__posix.cc11
-rw-r--r--www/iridium/files/patch-base_memory_platform__shared__memory__region.h29
-rw-r--r--www/iridium/files/patch-base_memory_platform__shared__memory__region__posix.cc38
-rw-r--r--www/iridium/files/patch-base_memory_shared__memory__region__unittest.cc16
-rw-r--r--www/iridium/files/patch-base_native__library__posix.cc11
-rw-r--r--www/iridium/files/patch-base_native__library__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_numerics_safe__math__shared__impl.h12
-rw-r--r--www/iridium/files/patch-base_path__service__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_posix_can__lower__nice__to.cc20
-rw-r--r--www/iridium/files/patch-base_posix_unix__domain__socket.cc49
-rw-r--r--www/iridium/files/patch-base_posix_unix__domain__socket__unittest.cc12
-rw-r--r--www/iridium/files/patch-base_process_internal__linux.cc97
-rw-r--r--www/iridium/files/patch-base_process_internal__linux.h34
-rw-r--r--www/iridium/files/patch-base_process_kill.h16
-rw-r--r--www/iridium/files/patch-base_process_kill__posix.cc20
-rw-r--r--www/iridium/files/patch-base_process_launch.cc11
-rw-r--r--www/iridium/files/patch-base_process_launch.h20
-rw-r--r--www/iridium/files/patch-base_process_launch__posix.cc10
-rw-r--r--www/iridium/files/patch-base_process_memory.cc20
-rw-r--r--www/iridium/files/patch-base_process_memory.h11
-rw-r--r--www/iridium/files/patch-base_process_memory__unittest.cc18
-rw-r--r--www/iridium/files/patch-base_process_process__handle.cc11
-rw-r--r--www/iridium/files/patch-base_process_process__handle.h11
-rw-r--r--www/iridium/files/patch-base_process_process__handle__freebsd.cc17
-rw-r--r--www/iridium/files/patch-base_process_process__iterator__freebsd.cc44
-rw-r--r--www/iridium/files/patch-base_process_process__linux.cc31
-rw-r--r--www/iridium/files/patch-base_process_process__metrics.cc38
-rw-r--r--www/iridium/files/patch-base_process_process__metrics.h131
-rw-r--r--www/iridium/files/patch-base_process_process__metrics__freebsd.cc259
-rw-r--r--www/iridium/files/patch-base_process_process__metrics__posix.cc20
-rw-r--r--www/iridium/files/patch-base_process_process__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_process_process__util__unittest.cc16
-rw-r--r--www/iridium/files/patch-base_profiler_register__context.h60
-rw-r--r--www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.cc11
-rw-r--r--www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.h20
-rw-r--r--www/iridium/files/patch-base_profiler_stack__copier__signal.cc63
-rw-r--r--www/iridium/files/patch-base_profiler_stack__sampling__profiler__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_profiler_thread__delegate__posix.cc50
-rw-r--r--www/iridium/files/patch-base_sampling__heap__profiler_sampling__heap__profiler.cc24
-rw-r--r--www/iridium/files/patch-base_security__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_synchronization_lock__impl.h16
-rw-r--r--www/iridium/files/patch-base_syslog__logging.cc20
-rw-r--r--www/iridium/files/patch-base_system_sys__info.h20
-rw-r--r--www/iridium/files/patch-base_system_sys__info__freebsd.cc67
-rw-r--r--www/iridium/files/patch-base_system_sys__info__posix.cc11
-rw-r--r--www/iridium/files/patch-base_task_thread__pool_environment__config__unittest.cc11
-rw-r--r--www/iridium/files/patch-base_test_fontconfig__util__linux.cc406
-rw-r--r--www/iridium/files/patch-base_test_generate__fontconfig__caches.cc17
-rw-r--r--www/iridium/files/patch-base_test_launcher_test__launcher.cc19
-rw-r--r--www/iridium/files/patch-base_test_test__file__util__posix.cc11
-rw-r--r--www/iridium/files/patch-base_test_test__suite.cc37
-rw-r--r--www/iridium/files/patch-base_third__party_libevent_BUILD.gn24
-rw-r--r--www/iridium/files/patch-base_threading_platform__thread.h11
-rw-r--r--www/iridium/files/patch-base_threading_platform__thread__linux.cc30
-rw-r--r--www/iridium/files/patch-base_threading_platform__thread__posix.cc11
-rw-r--r--www/iridium/files/patch-base_threading_platform__thread__unittest.cc20
-rw-r--r--www/iridium/files/patch-base_threading_thread__task__runner__handle.cc26
-rw-r--r--www/iridium/files/patch-base_trace__event_malloc__dump__provider.cc21
-rw-r--r--www/iridium/files/patch-base_trace__event_process__memory__dump.cc11
-rw-r--r--www/iridium/files/patch-base_trace__event_process__memory__dump.h11
-rw-r--r--www/iridium/files/patch-build_config_BUILD.gn30
-rw-r--r--www/iridium/files/patch-build_config_BUILDCONFIG.gn48
-rw-r--r--www/iridium/files/patch-build_config_compiler_BUILD.gn92
-rw-r--r--www/iridium/files/patch-build_config_compiler_compiler.gni20
-rw-r--r--www/iridium/files/patch-build_config_features.gni11
-rw-r--r--www/iridium/files/patch-build_config_freetype_freetype.gni9
-rw-r--r--www/iridium/files/patch-build_config_linux_BUILD.gn11
-rw-r--r--www/iridium/files/patch-build_config_linux_pkg-config.py26
-rw-r--r--www/iridium/files/patch-build_config_sysroot.gni15
-rw-r--r--www/iridium/files/patch-build_detect__host__arch.py11
-rw-r--r--www/iridium/files/patch-build_gn__run__binary.py11
-rw-r--r--www/iridium/files/patch-build_linux_chrome.map29
-rw-r--r--www/iridium/files/patch-build_linux_libpci_BUILD.gn53
-rw-r--r--www/iridium/files/patch-build_linux_unbundle_libusb.gn27
-rw-r--r--www/iridium/files/patch-build_linux_unbundle_replace__gn__files.py10
-rw-r--r--www/iridium/files/patch-build_toolchain_gcc__toolchain.gni45
-rw-r--r--www/iridium/files/patch-build_toolchain_get__concurrent__links.py17
-rw-r--r--www/iridium/files/patch-build_toolchain_linux_BUILD.gn10
-rw-r--r--www/iridium/files/patch-cc_BUILD.gn19
-rw-r--r--www/iridium/files/patch-cc_layers_scrollbar__layer__impl__base.cc13
-rw-r--r--www/iridium/files/patch-cc_trees_property__tree.cc20
-rw-r--r--www/iridium/files/patch-chrome_app_chrome__command__ids.h11
-rw-r--r--www/iridium/files/patch-chrome_app_chrome__main.cc16
-rw-r--r--www/iridium/files/patch-chrome_app_chrome__main__delegate.cc159
-rw-r--r--www/iridium/files/patch-chrome_app_chromium__strings.grd29
-rw-r--r--www/iridium/files/patch-chrome_app_generated__resources.grd29
-rw-r--r--www/iridium/files/patch-chrome_app_google__chrome__strings.grd29
-rw-r--r--www/iridium/files/patch-chrome_app_settings__strings.grdp20
-rw-r--r--www/iridium/files/patch-chrome_app_shutdown__signal__handlers__posix.cc21
-rw-r--r--www/iridium/files/patch-chrome_app_theme_chrome__unscaled__resources.grd11
-rw-r--r--www/iridium/files/patch-chrome_app_theme_theme__resources.grd11
-rw-r--r--www/iridium/files/patch-chrome_browser_about__flags.cc205
-rw-r--r--www/iridium/files/patch-chrome_browser_after__startup__task__utils.cc38
-rw-r--r--www/iridium/files/patch-chrome_browser_apps_platform__apps_api_music__manager__private_device__id__linux.cc70
-rw-r--r--www/iridium/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc17
-rw-r--r--www/iridium/files/patch-chrome_browser_background_background__mode__manager.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_background_background__mode__optimizer.cc15
-rw-r--r--www/iridium/files/patch-chrome_browser_browser__resources.grd11
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__browser__interface__binders.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__browser__main.cc66
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__browser__main__linux.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__browser__main__posix.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__content__browser__client.cc115
-rw-r--r--www/iridium/files/patch-chrome_browser_chrome__content__browser__client.h17
-rw-r--r--www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list__crashpad.cc31
-rw-r--r--www/iridium/files/patch-chrome_browser_custom__handlers_protocol__handler__registry.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_defaults.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_dev__ui__browser__resources.grd11
-rw-r--r--www/iridium/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_diagnostics_diagnostics__writer.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__commands.cc35
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__commands.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__item__model.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__prefs.cc65
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__prefs.h20
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__query.cc14
-rw-r--r--www/iridium/files/patch-chrome_browser_download_download__shelf__context__menu.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_BUILD.gn15
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_activity__log_activity__log.cc14
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher__linux.cc40
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_erp_chrome_desktop_report_request_helper.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc43
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_external__provider__impl.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_extensions_install__signer.cc18
-rw-r--r--www/iridium/files/patch-chrome_browser_first__run_first__run__dialog.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_first__run_first__run__internal.h18
-rw-r--r--www/iridium/files/patch-chrome_browser_first__run_first__run__internal__posix.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_flag__descriptions.cc65
-rw-r--r--www/iridium/files/patch-chrome_browser_flag__descriptions.h72
-rw-r--r--www/iridium/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc15
-rw-r--r--www/iridium/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc14
-rw-r--r--www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc28
-rw-r--r--www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc27
-rw-r--r--www/iridium/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc23
-rw-r--r--www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc33
-rw-r--r--www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h36
-rw-r--r--www/iridium/files/patch-chrome_browser_memory__details.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_memory__details__linux.cc13
-rw-r--r--www/iridium/files/patch-chrome_browser_metrics_bluetooth__available__utility.cc13
-rw-r--r--www/iridium/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc21
-rw-r--r--www/iridium/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc25
-rw-r--r--www/iridium/files/patch-chrome_browser_metrics_process__memory__metrics__emitter.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_native__file__system_chrome__native__file__system__permission__context.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_net_system__network__context__manager.cc64
-rw-r--r--www/iridium/files/patch-chrome_browser_notifications_notification__display__service__impl.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc14
-rw-r--r--www/iridium/files/patch-chrome_browser_password__manager_password__store__factory.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.cc38
-rw-r--r--www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_plugins_plugin__info__host__impl.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_plugins_plugins__resource__service.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc43
-rw-r--r--www/iridium/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_prefs_browser__prefs.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_prefs_pref__service__incognito__whitelist.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_process__singleton__posix.cc34
-rw-r--r--www/iridium/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_profiles_profile__attributes__entry.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_renderer__preferences__util.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py19
-rw-r--r--www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js20
-rw-r--r--www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html29
-rw-r--r--www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js33
-rw-r--r--www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc15
-rw-r--r--www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_search_search__suggest_search__suggest__service.cc14
-rw-r--r--www/iridium/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.cc17
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.h19
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_sharing__device__registration.cc24
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc32
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_sharing__service.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.cc17
-rw-r--r--www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.h19
-rw-r--r--www/iridium/files/patch-chrome_browser_signin_signin__util.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_sync_chrome__sync__client.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.cc56
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.h48
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc72
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h50
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc16
-rw-r--r--www/iridium/files/patch-chrome_browser_task__manager_task__manager__observer.h16
-rw-r--r--www/iridium/files/patch-chrome_browser_themes_theme__service__factory.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_tracing_crash__service__uploader.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_browser__command__controller.cc38
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_browser__view__prefs.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_gtk_print__dialog__gtk.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_sad__tab.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc31
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_tab__helpers.cc25
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc15
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc50
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_accelerator__table.cc46
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc38
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_chrome__views__delegate.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_download_download__item__view.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_first__run__dialog.cc13
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_browser__frame.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_browser__view.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_hung__renderer__view.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_tabs_tab.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc29
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_webui_about__ui.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc55
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h11
-rw-r--r--www/iridium/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc20
-rw-r--r--www/iridium/files/patch-chrome_browser_web__applications_components_web__app__file__handler__registration.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_web__applications_components_web__app__shortcut.cc11
-rw-r--r--www/iridium/files/patch-chrome_browser_web__applications_extensions_bookmark__app__finalizer__utils.cc11
-rw-r--r--www/iridium/files/patch-chrome_common_BUILD.gn13
-rw-r--r--www/iridium/files/patch-chrome_common_channel__info.h11
-rw-r--r--www/iridium/files/patch-chrome_common_channel__info__posix.cc20
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__features.cc18
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__features.h15
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__paths.cc111
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__paths.h42
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__paths__internal.h11
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__switches.cc11
-rw-r--r--www/iridium/files/patch-chrome_common_chrome__switches.h11
-rw-r--r--www/iridium/files/patch-chrome_common_extensions_api_api__sources.gni11
-rw-r--r--www/iridium/files/patch-chrome_common_extensions_command.cc11
-rw-r--r--www/iridium/files/patch-chrome_common_features.gni14
-rw-r--r--www/iridium/files/patch-chrome_common_media_cdm__host__file__path.cc11
-rw-r--r--www/iridium/files/patch-chrome_common_pref__names.cc44
-rw-r--r--www/iridium/files/patch-chrome_common_pref__names.h41
-rw-r--r--www/iridium/files/patch-chrome_common_webui__url__constants.cc48
-rw-r--r--www/iridium/files/patch-chrome_common_webui__url__constants.h32
-rw-r--r--www/iridium/files/patch-chrome_renderer_chrome__content__renderer__client.cc11
-rw-r--r--www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc29
-rw-r--r--www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h20
-rw-r--r--www/iridium/files/patch-chrome_service_cloud__print_print__system.cc11
-rw-r--r--www/iridium/files/patch-chrome_test_BUILD.gn11
-rw-r--r--www/iridium/files/patch-chrome_test_base_chrome__test__launcher.cc20
-rw-r--r--www/iridium/files/patch-chrome_test_base_in__process__browser__test.cc40
-rw-r--r--www/iridium/files/patch-chrome_test_base_interactive__ui__tests__main.cc25
-rw-r--r--www/iridium/files/patch-chrome_test_base_test__browser__window.h11
-rw-r--r--www/iridium/files/patch-chrome_test_base_testing__browser__process.h13
-rw-r--r--www/iridium/files/patch-chrome_test_chromedriver_chrome__launcher.cc13
-rw-r--r--www/iridium/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc20
-rw-r--r--www/iridium/files/patch-chrome_test_chromedriver_key__converter__unittest.cc38
-rw-r--r--www/iridium/files/patch-chromecast_browser_cast__browser__main__parts.cc56
-rw-r--r--www/iridium/files/patch-chromecast_browser_cast__content__browser__client.cc11
-rw-r--r--www/iridium/files/patch-chromecast_browser_metrics_BUILD.gn11
-rw-r--r--www/iridium/files/patch-chromecast_browser_tts_tts__controller__impl.cc14
-rw-r--r--www/iridium/files/patch-chromecast_external__mojo_public_cpp_external__mojo__broker.cc20
-rw-r--r--www/iridium/files/patch-chromecast_media_base_monotonic__clock.cc23
-rw-r--r--www/iridium/files/patch-chromecast_renderer_cast__content__renderer__client.cc11
-rw-r--r--www/iridium/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc14
-rw-r--r--www/iridium/files/patch-components_autofill_core_browser_autofill__experiments.cc11
-rw-r--r--www/iridium/files/patch-components_autofill_core_browser_autofill__external__delegate.cc11
-rw-r--r--www/iridium/files/patch-components_autofill_core_browser_personal__data__manager.cc15
-rw-r--r--www/iridium/files/patch-components_autofill_core_common_autofill__payments__features.cc11
-rw-r--r--www/iridium/files/patch-components_autofill_core_common_autofill__util.cc11
-rw-r--r--www/iridium/files/patch-components_content__settings_core_browser_website__settings__registry.cc11
-rw-r--r--www/iridium/files/patch-components_cookie__config_cookie__store__util.cc24
-rw-r--r--www/iridium/files/patch-components_crash_content_app_BUILD.gn52
-rw-r--r--www/iridium/files/patch-components_crash_content_app_crashpad.cc43
-rw-r--r--www/iridium/files/patch-components_crash_content_app_crashpad.h66
-rw-r--r--www/iridium/files/patch-components_crash_content_app_crashpad__linux.cc24
-rw-r--r--www/iridium/files/patch-components_crash_content_browser_BUILD.gn27
-rw-r--r--www/iridium/files/patch-components_crash_core_common_BUILD.gn31
-rw-r--r--www/iridium/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc20
-rw-r--r--www/iridium/files/patch-components_download_internal_common_base__file.cc20
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_event__constants.cc27
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_event__constants.h30
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_feature__constants.cc20
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_feature__constants.h20
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_feature__list.cc20
-rw-r--r--www/iridium/files/patch-components_feature__engagement_public_feature__list.h38
-rw-r--r--www/iridium/files/patch-components_feedback_anonymizer__tool.cc14
-rw-r--r--www/iridium/files/patch-components_flags__ui_flags__state.cc11
-rw-r--r--www/iridium/files/patch-components_gcm__driver_gcm__client.h10
-rw-r--r--www/iridium/files/patch-components_gcm__driver_gcm__client__impl.cc12
-rw-r--r--www/iridium/files/patch-components_keyed__service_core_dependency__graph__unittest.cc14
-rw-r--r--www/iridium/files/patch-components_metrics_BUILD.gn14
-rw-r--r--www/iridium/files/patch-components_metrics_drive__metrics__provider__linux.cc16
-rw-r--r--www/iridium/files/patch-components_metrics_metrics__log.cc11
-rw-r--r--www/iridium/files/patch-components_metrics_system__memory__stats__recorder__linux.cc18
-rw-r--r--www/iridium/files/patch-components_neterror_resources_neterror.js11
-rw-r--r--www/iridium/files/patch-components_network__session__configurator_browser_network__session__configurator.cc11
-rw-r--r--www/iridium/files/patch-components_new__or__sad__tab__strings.grdp47
-rw-r--r--www/iridium/files/patch-components_os__crypt_os__crypt.h48
-rw-r--r--www/iridium/files/patch-components_os__crypt_os__crypt__unittest.cc11
-rw-r--r--www/iridium/files/patch-components_plugins_renderer_plugin__placeholder.cc14
-rw-r--r--www/iridium/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc73
-rw-r--r--www/iridium/files/patch-components_policy_core_common_schema.cc14
-rw-r--r--www/iridium/files/patch-components_policy_resources_policy__templates.json83
-rw-r--r--www/iridium/files/patch-components_policy_tools_generate__policy__source.py19
-rw-r--r--www/iridium/files/patch-components_previews_core_previews__features.cc18
-rw-r--r--www/iridium/files/patch-components_security__interstitials_content_captive__portal__blocking__page.cc11
-rw-r--r--www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc29
-rw-r--r--www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.h20
-rw-r--r--www/iridium/files/patch-components_storage__monitor_BUILD.gn16
-rw-r--r--www/iridium/files/patch-components_storage__monitor_removable__device__constants.cc11
-rw-r--r--www/iridium/files/patch-components_storage__monitor_removable__device__constants.h11
-rw-r--r--www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.cc57
-rw-r--r--www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.h48
-rw-r--r--www/iridium/files/patch-components_sync__device__info_device__info__sync__bridge.cc16
-rw-r--r--www/iridium/files/patch-components_sync__device__info_local__device__info__util.cc11
-rw-r--r--www/iridium/files/patch-components_sync__device__info_local__device__info__util__linux.cc14
-rw-r--r--www/iridium/files/patch-components_update__client_update__query__params.cc11
-rw-r--r--www/iridium/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc11
-rw-r--r--www/iridium/files/patch-components_url__matcher_regex__set__matcher.cc16
-rw-r--r--www/iridium/files/patch-components_url__matcher_url__matcher__factory.cc14
-rw-r--r--www/iridium/files/patch-components_viz_common_features.cc20
-rw-r--r--www/iridium/files/patch-components_viz_common_gpu_dawn__context__provider.cc11
-rw-r--r--www/iridium/files/patch-components_viz_host_host__display__client.cc11
-rw-r--r--www/iridium/files/patch-components_viz_host_host__display__client.h11
-rw-r--r--www/iridium/files/patch-components_viz_service_display__embedder_skia__output__device__dawn.cc11
-rw-r--r--www/iridium/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc11
-rw-r--r--www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.cc20
-rw-r--r--www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.h20
-rw-r--r--www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.cc20
-rw-r--r--www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.h11
-rw-r--r--www/iridium/files/patch-components_viz_test_fake__output__surface.cc11
-rw-r--r--www/iridium/files/patch-components_viz_test_fake__output__surface.h11
-rw-r--r--www/iridium/files/patch-components_viz_test_mock__display__client.h11
-rw-r--r--www/iridium/files/patch-components_webcrypto_algorithms_test__helpers.cc14
-rw-r--r--www/iridium/files/patch-content_app_content__main__runner__impl.cc73
-rw-r--r--www/iridium/files/patch-content_browser_browser__main__loop.cc46
-rw-r--r--www/iridium/files/patch-content_browser_child__process__launcher__helper__linux.cc76
-rw-r--r--www/iridium/files/patch-content_browser_devtools_protocol_system__info__handler.cc11
-rw-r--r--www/iridium/files/patch-content_browser_gpu_gpu__process__host.cc11
-rw-r--r--www/iridium/files/patch-content_browser_media_media__internals.cc11
-rw-r--r--www/iridium/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc27
-rw-r--r--www/iridium/files/patch-content_browser_ppapi__plugin__process__host.cc11
-rw-r--r--www/iridium/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc20
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc29
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc20
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__message__filter.cc29
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__message__filter.h19
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.cc47
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.h15
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__view__host__impl.cc11
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc29
-rw-r--r--www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc11
-rw-r--r--www/iridium/files/patch-content_browser_scheduler_responsiveness_jank__monitor.cc11
-rw-r--r--www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc29
-rw-r--r--www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h47
-rw-r--r--www/iridium/files/patch-content_browser_scheduler_responsiveness_watcher.cc20
-rw-r--r--www/iridium/files/patch-content_browser_utility__process__host.cc11
-rw-r--r--www/iridium/files/patch-content_browser_utility__process__host__receiver__bindings.cc20
-rw-r--r--www/iridium/files/patch-content_browser_v8__snapshot__files.cc11
-rw-r--r--www/iridium/files/patch-content_browser_webui_shared__resources__data__source.cc17
-rw-r--r--www/iridium/files/patch-content_common_BUILD.gn15
-rw-r--r--www/iridium/files/patch-content_common_common__sandbox__support__linux.cc10
-rw-r--r--www/iridium/files/patch-content_common_user__agent.cc17
-rw-r--r--www/iridium/files/patch-content_gpu_BUILD.gn11
-rw-r--r--www/iridium/files/patch-content_gpu_gpu__main.cc56
-rw-r--r--www/iridium/files/patch-content_gpu_gpu__sandbox__hook__linux.cc58
-rw-r--r--www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc29
-rw-r--r--www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h25
-rw-r--r--www/iridium/files/patch-content_public_app_content__main__delegate.cc18
-rw-r--r--www/iridium/files/patch-content_public_app_content__main__delegate.h20
-rw-r--r--www/iridium/files/patch-content_public_common_child__process__host.h11
-rw-r--r--www/iridium/files/patch-content_public_common_common__param__traits__macros.h11
-rw-r--r--www/iridium/files/patch-content_public_common_content__features.cc29
-rw-r--r--www/iridium/files/patch-content_public_common_content__switches.cc11
-rw-r--r--www/iridium/files/patch-content_public_common_content__switches.h11
-rw-r--r--www/iridium/files/patch-content_public_common_use__zoom__for__dsf__policy.cc11
-rw-r--r--www/iridium/files/patch-content_public_test_browser__test__base.cc31
-rw-r--r--www/iridium/files/patch-content_public_test_content__browser__test.cc29
-rw-r--r--www/iridium/files/patch-content_public_test_mock__render__thread.cc11
-rw-r--r--www/iridium/files/patch-content_renderer_media_audio_audio__device__factory.cc11
-rw-r--r--www/iridium/files/patch-content_renderer_render__process__impl.cc20
-rw-r--r--www/iridium/files/patch-content_renderer_render__thread__impl.cc51
-rw-r--r--www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.cc47
-rw-r--r--www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.h29
-rw-r--r--www/iridium/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc19
-rw-r--r--www/iridium/files/patch-content_shell_BUILD.gn11
-rw-r--r--www/iridium/files/patch-content_shell_app_shell__main__delegate.cc20
-rw-r--r--www/iridium/files/patch-content_shell_browser_shell__browser__context.cc20
-rw-r--r--www/iridium/files/patch-content_shell_browser_shell__browser__main__parts.cc20
-rw-r--r--www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__context.cc11
-rw-r--r--www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__main__parts.cc11
-rw-r--r--www/iridium/files/patch-content_shell_test__runner_test__runner.cc29
-rw-r--r--www/iridium/files/patch-content_test_content__test__suite.cc18
-rw-r--r--www/iridium/files/patch-content_utility_BUILD.gn11
-rw-r--r--www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc29
-rw-r--r--www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h24
-rw-r--r--www/iridium/files/patch-device_bluetooth_BUILD.gn11
-rw-r--r--www/iridium/files/patch-device_gamepad_gamepad__provider.cc11
-rw-r--r--www/iridium/files/patch-device_gamepad_hid__writer__linux.cc11
-rw-r--r--www/iridium/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc14
-rw-r--r--www/iridium/files/patch-extensions_browser_api_messaging_message__service.cc34
-rw-r--r--www/iridium/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc20
-rw-r--r--www/iridium/files/patch-extensions_browser_api_web__request_form__data__parser.cc14
-rw-r--r--www/iridium/files/patch-extensions_browser_browser__context__keyed__service__factories.cc11
-rw-r--r--www/iridium/files/patch-extensions_common_api___permission__features.json29
-rw-r--r--www/iridium/files/patch-extensions_common_api_runtime.json11
-rw-r--r--www/iridium/files/patch-extensions_common_feature__switch.cc16
-rw-r--r--www/iridium/files/patch-extensions_common_features_feature.cc11
-rw-r--r--www/iridium/files/patch-extensions_common_image__util.cc14
-rw-r--r--www/iridium/files/patch-extensions_common_stack__frame.cc14
-rw-r--r--www/iridium/files/patch-extensions_renderer_bindings_api__binding__util.cc11
-rw-r--r--www/iridium/files/patch-extensions_shell_app_shell__main__delegate.cc20
-rw-r--r--www/iridium/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc11
-rw-r--r--www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.cc20
-rw-r--r--www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.h19
-rw-r--r--www/iridium/files/patch-google__apis_gcm_engine_heartbeat__manager.cc53
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc20
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.cc100
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.h11
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__gl__representation.cc20
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_service_program__manager.cc14
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_tests_gl__copy__texture__CHROMIUM__unittest.cc11
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.cc20
-rw-r--r--www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.h11
-rw-r--r--www/iridium/files/patch-gpu_config_gpu__control__list.cc32
-rw-r--r--www/iridium/files/patch-gpu_config_gpu__test__config.cc11
-rw-r--r--www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc47
-rw-r--r--www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h29
-rw-r--r--www/iridium/files/patch-gpu_ipc_service_gpu__init.cc136
-rw-r--r--www/iridium/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc20
-rw-r--r--www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.cc56
-rw-r--r--www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.h20
-rw-r--r--www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.cc32
-rw-r--r--www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.h45
-rw-r--r--www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.cc29
-rw-r--r--www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.h11
-rw-r--r--www/iridium/files/patch-headless_lib_browser_headless__request__context__manager.cc29
-rw-r--r--www/iridium/files/patch-headless_lib_headless__content__main__delegate.cc20
-rw-r--r--www/iridium/files/patch-headless_lib_headless__content__main__delegate.h11
-rw-r--r--www/iridium/files/patch-headless_lib_headless__macros.h13
-rw-r--r--www/iridium/files/patch-ipc_ipc__channel.h11
-rw-r--r--www/iridium/files/patch-ipc_ipc__channel__common.cc20
-rw-r--r--www/iridium/files/patch-ipc_ipc__channel__mojo.cc15
-rw-r--r--www/iridium/files/patch-ipc_ipc__message__utils.cc11
-rw-r--r--www/iridium/files/patch-ipc_ipc__message__utils.h11
-rw-r--r--www/iridium/files/patch-media_BUILD.gn12
-rw-r--r--www/iridium/files/patch-media_audio_BUILD.gn22
-rw-r--r--www/iridium/files/patch-media_audio_alsa_audio__manager__alsa.cc54
-rw-r--r--www/iridium/files/patch-media_audio_audio__input__device.cc11
-rw-r--r--www/iridium/files/patch-media_audio_audio__manager.cc29
-rw-r--r--www/iridium/files/patch-media_audio_audio__manager.h11
-rw-r--r--www/iridium/files/patch-media_base_audio__latency.cc11
-rw-r--r--www/iridium/files/patch-media_base_media__switches.cc11
-rw-r--r--www/iridium/files/patch-media_base_scopedfd__helper.h23
-rw-r--r--www/iridium/files/patch-media_base_video__frame.cc74
-rw-r--r--www/iridium/files/patch-media_base_video__frame.h50
-rw-r--r--www/iridium/files/patch-media_capture_video_create__video__capture__device__factory.cc20
-rw-r--r--www/iridium/files/patch-media_capture_video_fake__video__capture__device__factory.cc11
-rw-r--r--www/iridium/files/patch-media_capture_video_file__video__capture__device__factory.cc11
-rw-r--r--www/iridium/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc26
-rw-r--r--www/iridium/files/patch-media_capture_video_video__capture__buffer__pool__impl.cc11
-rw-r--r--www/iridium/files/patch-media_capture_video_video__capture__device__client.cc11
-rw-r--r--www/iridium/files/patch-media_filters_vp9__parser.h10
-rw-r--r--www/iridium/files/patch-media_formats_common_offset__byte__queue.cc20
-rw-r--r--www/iridium/files/patch-media_formats_common_offset__byte__queue.h22
-rw-r--r--www/iridium/files/patch-media_formats_mp2t_es__parser__adts.cc26
-rw-r--r--www/iridium/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc26
-rw-r--r--www/iridium/files/patch-media_gpu_buffer__validation.cc48
-rw-r--r--www/iridium/files/patch-media_media__options.gni12
-rw-r--r--www/iridium/files/patch-media_mojo_clients_mojo__video__encode__accelerator.cc11
-rw-r--r--www/iridium/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc32
-rw-r--r--www/iridium/files/patch-media_mojo_services_gpu__mojo__media__client.cc20
-rw-r--r--www/iridium/files/patch-media_video_fake__gpu__memory__buffer.cc47
-rw-r--r--www/iridium/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc11
-rw-r--r--www/iridium/files/patch-media_webrtc_webrtc__switches.cc11
-rw-r--r--www/iridium/files/patch-mojo_public_c_system_thunks.cc49
-rw-r--r--www/iridium/files/patch-mojo_public_js_mojo__bindings__resources.grd11
-rw-r--r--www/iridium/files/patch-net_BUILD.gn46
-rw-r--r--www/iridium/files/patch-net_base_address__tracker__linux.cc88
-rw-r--r--www/iridium/files/patch-net_base_address__tracker__linux.h12
-rw-r--r--www/iridium/files/patch-net_base_address__tracker__linux__unittest.cc14
-rw-r--r--www/iridium/files/patch-net_base_features.cc11
-rw-r--r--www/iridium/files/patch-net_base_network__change__notifier.cc28
-rw-r--r--www/iridium/files/patch-net_base_network__interfaces__posix.h11
-rw-r--r--www/iridium/files/patch-net_disk__cache_blockfile_disk__format.h12
-rw-r--r--www/iridium/files/patch-net_dns_address__sorter__posix.cc12
-rw-r--r--www/iridium/files/patch-net_dns_dns__config__service__posix__unittest.cc47
-rw-r--r--www/iridium/files/patch-net_dns_dns__reloader.cc13
-rw-r--r--www/iridium/files/patch-net_dns_dns__util.cc11
-rw-r--r--www/iridium/files/patch-net_dns_host__resolver__proc.cc11
-rw-r--r--www/iridium/files/patch-net_features.gni11
-rw-r--r--www/iridium/files/patch-net_http_http__auth__gssapi__posix.cc14
-rw-r--r--www/iridium/files/patch-net_http_http__auth__gssapi__posix.h12
-rw-r--r--www/iridium/files/patch-net_nqe_network__quality__estimator.cc11
-rw-r--r--www/iridium/files/patch-net_nqe_network__quality__estimator__unittest.cc11
-rw-r--r--www/iridium/files/patch-net_proxy__resolution_proxy__config__service__linux.cc39
-rw-r--r--www/iridium/files/patch-net_proxy__resolution_proxy__resolution__service.cc29
-rw-r--r--www/iridium/files/patch-net_socket_socket__posix.cc11
-rw-r--r--www/iridium/files/patch-net_socket_socks5__client__socket.cc13
-rw-r--r--www/iridium/files/patch-net_socket_tcp__socket__posix.cc20
-rw-r--r--www/iridium/files/patch-net_socket_udp__socket__posix.cc108
-rw-r--r--www/iridium/files/patch-net_socket_udp__socket__posix.h11
-rw-r--r--www/iridium/files/patch-net_socket_unix__domain__client__socket__posix.cc11
-rw-r--r--www/iridium/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc20
-rw-r--r--www/iridium/files/patch-net_tools_quic_quic__http__proxy__backend.cc11
-rw-r--r--www/iridium/files/patch-net_traffic__annotation_network__traffic__annotation.h20
-rw-r--r--www/iridium/files/patch-net_url__request_url__fetcher.cc11
-rw-r--r--www/iridium/files/patch-net_url__request_url__fetcher.h11
-rw-r--r--www/iridium/files/patch-net_url__request_url__request__context.cc11
-rw-r--r--www/iridium/files/patch-net_url__request_url__request__context.h11
-rw-r--r--www/iridium/files/patch-net_url__request_url__request__context__builder.cc20
-rw-r--r--www/iridium/files/patch-pdf_pdfium_pdfium__engine.cc56
-rw-r--r--www/iridium/files/patch-ppapi_proxy_file__io__resource.cc48
-rw-r--r--www/iridium/files/patch-ppapi_proxy_flash__resource.cc11
-rw-r--r--www/iridium/files/patch-printing_cups__config__helper.py11
-rw-r--r--www/iridium/files/patch-remoting_base_chromoting__event.cc11
-rw-r--r--www/iridium/files/patch-remoting_client_display_sys__opengl.h11
-rw-r--r--www/iridium/files/patch-remoting_host_evaluate__capability.cc11
-rw-r--r--www/iridium/files/patch-remoting_host_host__attributes.cc11
-rw-r--r--www/iridium/files/patch-remoting_host_host__details.cc11
-rw-r--r--www/iridium/files/patch-remoting_host_host__main.cc27
-rw-r--r--www/iridium/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc35
-rw-r--r--www/iridium/files/patch-remoting_host_me2me__desktop__environment.cc11
-rw-r--r--www/iridium/files/patch-remoting_host_remoting__me2me__host.cc108
-rw-r--r--www/iridium/files/patch-remoting_host_switches.cc14
-rw-r--r--www/iridium/files/patch-remoting_host_switches.h14
-rw-r--r--www/iridium/files/patch-remoting_resources_remoting__strings.grd20
-rw-r--r--www/iridium/files/patch-sandbox_features.gni11
-rw-r--r--www/iridium/files/patch-sandbox_linux_BUILD.gn47
-rw-r--r--www/iridium/files/patch-sandbox_linux_services_init__process__reaper.cc15
-rw-r--r--www/iridium/files/patch-sandbox_linux_services_libc__interceptor.cc21
-rw-r--r--www/iridium/files/patch-services_audio_BUILD.gn11
-rw-r--r--www/iridium/files/patch-services_device_geolocation_location__arbitrator.cc11
-rw-r--r--www/iridium/files/patch-services_device_hid_BUILD.gn22
-rw-r--r--www/iridium/files/patch-services_device_hid_hid__connection__freebsd.cc243
-rw-r--r--www/iridium/files/patch-services_device_hid_hid__connection__freebsd.h71
-rw-r--r--www/iridium/files/patch-services_device_hid_hid__service.cc20
-rw-r--r--www/iridium/files/patch-services_device_hid_hid__service__freebsd.cc386
-rw-r--r--www/iridium/files/patch-services_device_hid_hid__service__freebsd.h50
-rw-r--r--www/iridium/files/patch-services_device_serial_BUILD.gn11
-rw-r--r--www/iridium/files/patch-services_device_serial_serial__io__handler__posix.cc11
-rw-r--r--www/iridium/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc14
-rw-r--r--www/iridium/files/patch-services_device_usb_BUILD.gn11
-rw-r--r--www/iridium/files/patch-services_network_BUILD.gn10
-rw-r--r--www/iridium/files/patch-services_network_network__context.cc11
-rw-r--r--www/iridium/files/patch-services_network_network__sandbox__hook__linux.cc18
-rw-r--r--www/iridium/files/patch-services_network_network__service.cc20
-rw-r--r--www/iridium/files/patch-services_network_network__service.h11
-rw-r--r--www/iridium/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc20
-rw-r--r--www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h32
-rw-r--r--www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc103
-rw-r--r--www/iridium/files/patch-services_service__manager_embedder_main.cc11
-rw-r--r--www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.cc19
-rw-r--r--www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.h20
-rw-r--r--www/iridium/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn14
-rw-r--r--www/iridium/files/patch-services_service__manager_sandbox_BUILD.gn11
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_common_zygote__features.gni8
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc40
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h13
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_zygote__host__linux.h16
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_zygote__linux.cc15
-rw-r--r--www/iridium/files/patch-services_service__manager_zygote_zygote__main__linux.cc48
-rw-r--r--www/iridium/files/patch-services_tracing_public_cpp_perfetto_trace__time.cc23
-rw-r--r--www/iridium/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc11
-rw-r--r--www/iridium/files/patch-services_video__capture_broadcasting__receiver.cc20
-rw-r--r--www/iridium/files/patch-skia_ext_SkMemory__new__handler.cpp20
-rw-r--r--www/iridium/files/patch-third__party_angle_BUILD.gn10
-rw-r--r--www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h16
-rw-r--r--www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp90
-rw-r--r--www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp21
-rw-r--r--www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp55
-rw-r--r--www/iridium/files/patch-third__party_angle_src_libANGLE_Display.cpp11
-rw-r--r--www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_driver__utils.h11
-rw-r--r--www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h15
-rw-r--r--www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c11
-rw-r--r--www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h11
-rw-r--r--www/iridium/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_BUILD.gn13
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_controller_blink__initializer.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h47
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_layout_layout__view.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_modules_mediastream_processed__local__audio__source.cc11
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_BUILD.gn10
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h58
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc29
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc20
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc38
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h27
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc14
-rw-r--r--www/iridium/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc22
-rw-r--r--www/iridium/files/patch-third__party_boringssl_BUILD.gn36
-rw-r--r--www/iridium/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c73
-rw-r--r--www/iridium/files/patch-third__party_boringssl_src_crypto_ex__data.c13
-rw-r--r--www/iridium/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h11
-rw-r--r--www/iridium/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h11
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni11
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_client_BUILD.gn15
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc41
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h20
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h20
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc11
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc11
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc29
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc11
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc40
-rw-r--r--www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc20
-rw-r--r--www/iridium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h57
-rw-r--r--www/iridium/files/patch-third__party_ffmpeg_libavutil_mem.c12
-rw-r--r--www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc43
-rw-r--r--www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest.cc10
-rw-r--r--www/iridium/files/patch-third__party_harfbuzz-ng_harfbuzz.gni20
-rw-r--r--www/iridium/files/patch-third__party_leveldatabase_env__chromium.cc14
-rw-r--r--www/iridium/files/patch-third__party_libXNVCtrl_NVCtrl.c25
-rw-r--r--www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h11
-rw-r--r--www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h11
-rw-r--r--www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h19
-rw-r--r--www/iridium/files/patch-third__party_libpng_pnglibconf.h14
-rw-r--r--www/iridium/files/patch-third__party_libyuv_include_libyuv_row.h37
-rw-r--r--www/iridium/files/patch-third__party_nasm_config_config-linux.h29
-rw-r--r--www/iridium/files/patch-third__party_node_node.py10
-rw-r--r--www/iridium/files/patch-third__party_pdfium_core_fxcrt_cfx__datetime.cpp11
-rw-r--r--www/iridium/files/patch-third__party_pdfium_core_fxcrt_fx__system.h11
-rw-r--r--www/iridium/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp14
-rw-r--r--www/iridium/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp106
-rw-r--r--www/iridium/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp22
-rw-r--r--www/iridium/files/patch-third__party_pdfium_xfa_fgas_font_cfx__fontsourceenum__file.cpp14
-rw-r--r--www/iridium/files/patch-third__party_perfetto_include_perfetto_base_build__config.h70
-rw-r--r--www/iridium/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h24
-rw-r--r--www/iridium/files/patch-third__party_perfetto_include_perfetto_base_time.h20
-rw-r--r--www/iridium/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h13
-rw-r--r--www/iridium/files/patch-third__party_perfetto_src_base_thread__task__runner.cc20
-rw-r--r--www/iridium/files/patch-third__party_perfetto_src_base_unix__socket.cc20
-rw-r--r--www/iridium/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc10
-rw-r--r--www/iridium/files/patch-third__party_perfetto_src_tracing_core_virtual__destructors.cc28
-rw-r--r--www/iridium/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h11
-rw-r--r--www/iridium/files/patch-third__party_skia_src_core_SkCpu.cpp19
-rw-r--r--www/iridium/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h11
-rw-r--r--www/iridium/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp41
-rw-r--r--www/iridium/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp11
-rw-r--r--www/iridium/files/patch-third__party_skia_src_sksl_SkSLString.h11
-rw-r--r--www/iridium/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h11
-rw-r--r--www/iridium/files/patch-third__party_sqlite_BUILD.gn11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_BUILD.gn24
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_Common_Configurator.cpp12
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp14
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Display.cpp20
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Surface.cpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp29
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_src_Vulkan_VkDebug.cpp53
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_config.h152
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_llvm-config.h20
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h29
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp11
-rw-r--r--www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp22
-rw-r--r--www/iridium/files/patch-third__party_usrsctp_BUILD.gn20
-rw-r--r--www/iridium/files/patch-third__party_webrtc_BUILD.gn12
-rw-r--r--www/iridium/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn11
-rw-r--r--www/iridium/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc10
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_byte__order.h11
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h11
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.cc12
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.h13
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_network.cc29
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_network.h13
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc47
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h11
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc39
-rw-r--r--www/iridium/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h19
-rw-r--r--www/iridium/files/patch-third__party_webrtc_system__wrappers_BUILD.gn11
-rw-r--r--www/iridium/files/patch-third__party_yasm_yasm__assemble.gni157
-rw-r--r--www/iridium/files/patch-tools_gn_build_gen.py24
-rw-r--r--www/iridium/files/patch-tools_gn_src_base_files_file__posix.cc11
-rw-r--r--www/iridium/files/patch-tools_gn_src_base_files_file__util.h11
-rw-r--r--www/iridium/files/patch-tools_gn_src_base_files_file__util__posix.cc11
-rw-r--r--www/iridium/files/patch-tools_gn_src_base_files_scoped__file.cc11
-rw-r--r--www/iridium/files/patch-tools_gn_src_gn_exec__process.cc13
-rw-r--r--www/iridium/files/patch-tools_gn_src_util_sys__info.cc11
-rw-r--r--www/iridium/files/patch-tools_json__schema__compiler_feature__compiler.py10
-rw-r--r--www/iridium/files/patch-tools_json__schema__compiler_model.py11
-rw-r--r--www/iridium/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn11
-rw-r--r--www/iridium/files/patch-tools_variations_fieldtrial__to__struct.py10
-rw-r--r--www/iridium/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc20
-rw-r--r--www/iridium/files/patch-ui_base_ime_init_input__method__initializer.cc38
-rw-r--r--www/iridium/files/patch-ui_base_resource_resource__bundle.cc20
-rw-r--r--www/iridium/files/patch-ui_base_resource_resource__bundle__freebsd.cc24
-rw-r--r--www/iridium/files/patch-ui_base_ui__base__features.cc20
-rw-r--r--www/iridium/files/patch-ui_base_ui__base__features.h15
-rw-r--r--www/iridium/files/patch-ui_base_webui_web__ui__util.cc11
-rw-r--r--www/iridium/files/patch-ui_base_x_x11__shm__image__pool__base.cc43
-rw-r--r--www/iridium/files/patch-ui_compositor_compositor.cc11
-rw-r--r--www/iridium/files/patch-ui_compositor_compositor.h11
-rw-r--r--www/iridium/files/patch-ui_compositor_compositor__observer.h16
-rw-r--r--www/iridium/files/patch-ui_compositor_host_host__context__factory__private.cc11
-rw-r--r--www/iridium/files/patch-ui_events_devices_x11_device__data__manager__x11.cc19
-rw-r--r--www/iridium/files/patch-ui_events_event__switches.cc11
-rw-r--r--www/iridium/files/patch-ui_events_event__switches.h11
-rw-r--r--www/iridium/files/patch-ui_events_keycodes_dom_keycode__converter.cc11
-rw-r--r--www/iridium/files/patch-ui_gfx_BUILD.gn11
-rw-r--r--www/iridium/files/patch-ui_gfx_canvas__skia.cc11
-rw-r--r--www/iridium/files/patch-ui_gfx_codec_jpeg__codec.cc20
-rw-r--r--www/iridium/files/patch-ui_gfx_font__fallback__linux.cc13
-rw-r--r--www/iridium/files/patch-ui_gfx_font__list.cc11
-rw-r--r--www/iridium/files/patch-ui_gfx_font__names__testing.cc29
-rw-r--r--www/iridium/files/patch-ui_gfx_font__render__params.h18
-rw-r--r--www/iridium/files/patch-ui_gfx_font__util.cc25
-rw-r--r--www/iridium/files/patch-ui_gfx_gpu__memory__buffer.cc11
-rw-r--r--www/iridium/files/patch-ui_gfx_gpu__memory__buffer.h20
-rw-r--r--www/iridium/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h44
-rw-r--r--www/iridium/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc25
-rw-r--r--www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc75
-rw-r--r--www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.h29
-rw-r--r--www/iridium/files/patch-ui_gfx_native__pixmap__handle.cc64
-rw-r--r--www/iridium/files/patch-ui_gfx_native__pixmap__handle.h38
-rw-r--r--www/iridium/files/patch-ui_gfx_render__text.cc46
-rw-r--r--www/iridium/files/patch-ui_gl_BUILD.gn11
-rw-r--r--www/iridium/files/patch-ui_gl_generate__bindings.py12
-rw-r--r--www/iridium/files/patch-ui_gl_gl__bindings__api__autogen__glx.h10
-rw-r--r--www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.cc61
-rw-r--r--www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.h43
-rw-r--r--www/iridium/files/patch-ui_gl_gl__fence.cc11
-rw-r--r--www/iridium/files/patch-ui_gl_sync__control__vsync__provider.cc43
-rw-r--r--www/iridium/files/patch-ui_gl_sync__control__vsync__provider.h34
-rw-r--r--www/iridium/files/patch-ui_message__center_public_cpp_message__center__constants.h11
-rw-r--r--www/iridium/files/patch-ui_message__center_views_message__popup__view.cc11
-rw-r--r--www/iridium/files/patch-ui_native__theme_native__theme.h11
-rw-r--r--www/iridium/files/patch-ui_native__theme_native__theme__base.cc11
-rw-r--r--www/iridium/files/patch-ui_platform__window_platform__window__init__properties.h20
-rw-r--r--www/iridium/files/patch-ui_strings_app__locale__settings.grd11
-rw-r--r--www/iridium/files/patch-ui_views_bubble_bubble__dialog__delegate__view.cc11
-rw-r--r--www/iridium/files/patch-ui_views_controls_label.cc20
-rw-r--r--www/iridium/files/patch-ui_views_controls_textfield_textfield.cc73
-rw-r--r--www/iridium/files/patch-ui_views_corewm_tooltip__aura.cc11
-rw-r--r--www/iridium/files/patch-ui_views_examples_widget__example.cc11
-rw-r--r--www/iridium/files/patch-ui_views_selection__controller.cc11
-rw-r--r--www/iridium/files/patch-ui_views_style_platform__style.cc11
-rw-r--r--www/iridium/files/patch-ui_views_views__delegate.cc11
-rw-r--r--www/iridium/files/patch-ui_views_views__delegate.h11
-rw-r--r--www/iridium/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc11
-rw-r--r--www/iridium/files/patch-ui_views_widget_native__widget__aura.cc27
-rw-r--r--www/iridium/files/patch-ui_views_window_custom__frame__view.cc11
-rw-r--r--www/iridium/files/patch-ui_views_window_dialog__delegate.cc11
-rw-r--r--www/iridium/files/patch-ui_views_window_frame__background.cc11
-rw-r--r--www/iridium/files/patch-ui_webui_resources_js_cr.js14
-rw-r--r--www/iridium/files/patch-ui_webui_resources_js_icon.js11
-rw-r--r--www/iridium/files/patch-v8_BUILD.gn32
-rw-r--r--www/iridium/files/patch-v8_include_v8config.h21
-rw-r--r--www/iridium/files/patch-v8_src_api_api.cc11
-rw-r--r--www/iridium/files/patch-v8_src_base_cpu.cc18
-rw-r--r--www/iridium/files/patch-v8_src_base_platform_platform-freebsd.cc13
-rw-r--r--www/iridium/files/patch-v8_src_base_platform_platform-posix.cc24
-rw-r--r--www/iridium/files/patch-weblayer_app_content__main__delegate__impl.cc11
-rw-r--r--www/iridium/files/patch-weblayer_browser_browser__main__parts__impl.cc20
-rw-r--r--www/iridium/files/patch-weblayer_browser_content__browser__client__impl.cc38
-rw-r--r--www/iridium/files/patch-weblayer_browser_content__browser__client__impl.h17
-rw-r--r--www/iridium/files/patch-weblayer_browser_system__network__context__manager.cc11
-rw-r--r--www/iridium/files/patch-weblayer_common_weblayer__paths.cc20
-rw-r--r--www/iridium/files/sndio_input.cc201
-rw-r--r--www/iridium/files/sndio_input.h91
-rw-r--r--www/iridium/files/sndio_output.cc183
-rw-r--r--www/iridium/files/sndio_output.h86
-rw-r--r--www/iridium/pkg-descr7
-rw-r--r--www/iridium/pkg-plist1101
-rw-r--r--www/moinmoin/Makefile91
-rw-r--r--www/moinmoin/distinfo3
-rw-r--r--www/moinmoin/files/extra-patch-recaptchav2299
-rw-r--r--www/moinmoin/files/extra-patch-verifyemail232
-rw-r--r--www/moinmoin/files/patch-setup.cfg10
-rw-r--r--www/moinmoin/files/patch-setup.py10
-rw-r--r--www/moinmoin/files/pkg-install.in148
-rw-r--r--www/moinmoin/pkg-descr5
-rw-r--r--www/moinmoin/pkg-plist3555
-rw-r--r--www/node10/Makefile108
-rw-r--r--www/node10/distinfo3
-rw-r--r--www/node10/files/extra-patch-common.gypi13
-rw-r--r--www/node10/files/patch-common.gypi18
-rw-r--r--www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl-cl.gypi17
-rw-r--r--www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl.gypi17
-rw-r--r--www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi17
-rw-r--r--www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi17
-rw-r--r--www/node10/files/patch-deps_openssl_config_bn__conf__asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_config_bn__conf__no-asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_config_dso__conf__asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_config_dso__conf__no-asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_config_opensslconf__asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_config_opensslconf__no-asm.h13
-rw-r--r--www/node10/files/patch-deps_openssl_openssl-cl__no__asm.gypi17
-rw-r--r--www/node10/files/patch-deps_openssl_openssl__no__asm.gypi11
-rw-r--r--www/node10/files/patch-deps_v8_src_arm_cpu-arm.cc22
-rw-r--r--www/node10/files/patch-deps_v8_src_base_platform_platform-freebsd.cc50
-rw-r--r--www/node10/files/patch-deps_v8_src_libsampler_sampler.cc19
-rw-r--r--www/node10/files/patch-icu68109
-rw-r--r--www/node10/files/patch-node.gypi12
-rw-r--r--www/node10/pkg-descr6
-rw-r--r--www/node10/pkg-message7
-rw-r--r--www/node10/pkg-plist431
-rw-r--r--www/node12/Makefile111
-rw-r--r--www/node12/distinfo3
-rw-r--r--www/node12/files/extra-patch-common.gypi13
-rw-r--r--www/node12/files/extra-patch-tools_v8__gypfiles_v8.gyp11
-rw-r--r--www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi11
-rw-r--r--www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi11
-rw-r--r--www/node12/files/patch-deps_openssl_openssl-cl__no__asm.gypi17
-rw-r--r--www/node12/files/patch-deps_openssl_openssl__no__asm.gypi11
-rw-r--r--www/node12/files/patch-deps_v8_src_base_platform_platform-freebsd.cc62
-rw-r--r--www/node12/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc22
-rw-r--r--www/node12/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h20
-rw-r--r--www/node12/files/patch-deps_v8_src_compiler_backend_instruction-selector.cc11
-rw-r--r--www/node12/files/patch-deps_v8_src_compiler_backend_ppc_code-generator-ppc.cc11
-rw-r--r--www/node12/files/patch-deps_v8_src_execution_simulator.h11
-rw-r--r--www/node12/files/patch-deps_v8_src_libsampler_sampler.cc19
-rw-r--r--www/node12/files/patch-node.gypi12
-rw-r--r--www/node12/pkg-descr6
-rw-r--r--www/node12/pkg-message7
-rw-r--r--www/node12/pkg-plist478
-rw-r--r--www/trac-OhlohWidgetsMacro/Makefile23
-rw-r--r--www/trac-OhlohWidgetsMacro/distinfo2
-rw-r--r--www/trac-OhlohWidgetsMacro/files/patch-ohloh_widgets__macro.py20
-rw-r--r--www/trac-OhlohWidgetsMacro/pkg-descr3
-rw-r--r--www/trac-TracGoogleAnalytics/Makefile25
-rw-r--r--www/trac-TracGoogleAnalytics/distinfo2
-rw-r--r--www/trac-TracGoogleAnalytics/pkg-descr8
-rw-r--r--www/trac-accountmanager/Makefile37
-rw-r--r--www/trac-accountmanager/distinfo3
-rw-r--r--www/trac-accountmanager/pkg-descr4
-rw-r--r--www/trac-advancedticketworkflow/Makefile22
-rw-r--r--www/trac-advancedticketworkflow/distinfo2
-rw-r--r--www/trac-advancedticketworkflow/pkg-descr5
-rw-r--r--www/trac-autocomplete/Makefile23
-rw-r--r--www/trac-autocomplete/distinfo2
-rw-r--r--www/trac-autocomplete/pkg-descr4
-rw-r--r--www/trac-ccselector/Makefile23
-rw-r--r--www/trac-ccselector/distinfo2
-rw-r--r--www/trac-ccselector/pkg-descr13
-rw-r--r--www/trac-ccselector/pkg-message13
-rw-r--r--www/trac-customfieldadmin/Makefile30
-rw-r--r--www/trac-customfieldadmin/distinfo2
-rw-r--r--www/trac-customfieldadmin/pkg-descr8
-rw-r--r--www/trac-customfieldadmin/pkg-message13
-rw-r--r--www/trac-datefield/Makefile23
-rw-r--r--www/trac-datefield/distinfo2
-rw-r--r--www/trac-datefield/pkg-descr4
-rw-r--r--www/trac-defaultcc/Makefile27
-rw-r--r--www/trac-defaultcc/distinfo2
-rw-r--r--www/trac-defaultcc/pkg-descr4
-rw-r--r--www/trac-devel/Makefile61
-rw-r--r--www/trac-devel/distinfo3
-rw-r--r--www/trac-devel/files/tracd.in61
-rw-r--r--www/trac-devel/pkg-descr21
-rw-r--r--www/trac-devel/pkg-message17
-rw-r--r--www/trac-discussion/Makefile33
-rw-r--r--www/trac-discussion/distinfo2
-rw-r--r--www/trac-discussion/pkg-descr9
-rw-r--r--www/trac-downloads/Makefile34
-rw-r--r--www/trac-downloads/distinfo2
-rw-r--r--www/trac-downloads/files/patch-tracdownloads_consoleadmin.py12
-rw-r--r--www/trac-downloads/files/patch-tracdownloads_tags.py14
-rw-r--r--www/trac-downloads/pkg-descr11
-rw-r--r--www/trac-email2trac-postfix/Makefile11
-rw-r--r--www/trac-email2trac/Makefile53
-rw-r--r--www/trac-email2trac/distinfo3
-rw-r--r--www/trac-email2trac/pkg-descr12
-rw-r--r--www/trac-email2trac/pkg-plist4
-rw-r--r--www/trac-estimator/Makefile24
-rw-r--r--www/trac-estimator/distinfo2
-rw-r--r--www/trac-estimator/pkg-descr5
-rw-r--r--www/trac-estimator/pkg-message21
-rw-r--r--www/trac-fivestarvote/Makefile34
-rw-r--r--www/trac-fivestarvote/distinfo2
-rw-r--r--www/trac-fivestarvote/pkg-descr6
-rw-r--r--www/trac-fullblog/Makefile33
-rw-r--r--www/trac-fullblog/distinfo2
-rw-r--r--www/trac-fullblog/pkg-descr5
-rw-r--r--www/trac-fullblognotification/Makefile31
-rw-r--r--www/trac-fullblognotification/distinfo2
-rw-r--r--www/trac-fullblognotification/pkg-descr18
-rw-r--r--www/trac-graphviz/Makefile33
-rw-r--r--www/trac-graphviz/distinfo2
-rw-r--r--www/trac-graphviz/files/patch-graphviz_graphviz.py36
-rw-r--r--www/trac-graphviz/pkg-descr4
-rw-r--r--www/trac-iniadmin/Makefile24
-rw-r--r--www/trac-iniadmin/distinfo2
-rw-r--r--www/trac-iniadmin/pkg-descr3
-rw-r--r--www/trac-keywords/Makefile31
-rw-r--r--www/trac-keywords/distinfo2
-rw-r--r--www/trac-keywords/files/patch-fix-javascript22
-rw-r--r--www/trac-keywords/files/patch-trackeywords_web__ui.py12
-rw-r--r--www/trac-keywords/pkg-descr4
-rw-r--r--www/trac-keywordsecretticket/Makefile26
-rw-r--r--www/trac-keywordsecretticket/distinfo3
-rw-r--r--www/trac-keywordsecretticket/pkg-descr3
-rw-r--r--www/trac-ldap/Makefile42
-rw-r--r--www/trac-ldap/distinfo2
-rw-r--r--www/trac-ldap/pkg-descr9
-rw-r--r--www/trac-ldapauthstore/Makefile44
-rw-r--r--www/trac-ldapauthstore/distinfo2
-rw-r--r--www/trac-ldapauthstore/pkg-descr9
-rw-r--r--www/trac-math/Makefile35
-rw-r--r--www/trac-math/distinfo2
-rw-r--r--www/trac-math/files/patch-tracmath_tracmath.py21
-rw-r--r--www/trac-math/files/pkg-message.in17
-rw-r--r--www/trac-math/pkg-descr4
-rw-r--r--www/trac-mercurial/Makefile25
-rw-r--r--www/trac-mercurial/distinfo2
-rw-r--r--www/trac-mercurial/pkg-descr4
-rw-r--r--www/trac-navadd/Makefile23
-rw-r--r--www/trac-navadd/distinfo2
-rw-r--r--www/trac-navadd/pkg-descr9
-rw-r--r--www/trac-permredirect/Makefile27
-rw-r--r--www/trac-permredirect/distinfo2
-rw-r--r--www/trac-permredirect/pkg-descr3
-rw-r--r--www/trac-privatetickets/Makefile22
-rw-r--r--www/trac-privatetickets/distinfo3
-rw-r--r--www/trac-privatetickets/pkg-descr12
-rw-r--r--www/trac-pydotorgtheme/Makefile23
-rw-r--r--www/trac-pydotorgtheme/distinfo2
-rw-r--r--www/trac-pydotorgtheme/pkg-descr3
-rw-r--r--www/trac-scrumburndown/Makefile25
-rw-r--r--www/trac-scrumburndown/distinfo2
-rw-r--r--www/trac-scrumburndown/pkg-descr4
-rw-r--r--www/trac-scrumburndown/pkg-message22
-rw-r--r--www/trac-spam-filter/Makefile23
-rw-r--r--www/trac-spam-filter/distinfo2
-rw-r--r--www/trac-spam-filter/pkg-descr4
-rw-r--r--www/trac-subtickets/Makefile28
-rw-r--r--www/trac-subtickets/distinfo3
-rw-r--r--www/trac-subtickets/files/patch-setup.cfg10
-rw-r--r--www/trac-subtickets/files/patch-tracsubtickets_api.py20
-rw-r--r--www/trac-subtickets/pkg-descr3
-rw-r--r--www/trac-tags/Makefile46
-rw-r--r--www/trac-tags/Makefile.svn_rev1
-rw-r--r--www/trac-tags/distinfo2
-rw-r--r--www/trac-tags/files/patch-tractags_model.py21
-rw-r--r--www/trac-tags/pkg-descr6
-rw-r--r--www/trac-themeengine/Makefile23
-rw-r--r--www/trac-themeengine/distinfo2
-rw-r--r--www/trac-themeengine/pkg-descr4
-rw-r--r--www/trac-ticketimport/Makefile35
-rw-r--r--www/trac-ticketimport/distinfo2
-rw-r--r--www/trac-ticketimport/pkg-descr15
-rw-r--r--www/trac-tickettemplate/Makefile24
-rw-r--r--www/trac-tickettemplate/distinfo2
-rw-r--r--www/trac-tickettemplate/pkg-descr4
-rw-r--r--www/trac-timingandestimation/Makefile23
-rw-r--r--www/trac-timingandestimation/distinfo2
-rw-r--r--www/trac-timingandestimation/pkg-descr6
-rw-r--r--www/trac-timingandestimation/pkg-message21
-rw-r--r--www/trac-tocmacro/Makefile21
-rw-r--r--www/trac-tocmacro/distinfo2
-rw-r--r--www/trac-tocmacro/pkg-descr4
-rw-r--r--www/trac-tweakui/Makefile35
-rw-r--r--www/trac-tweakui/distinfo2
-rw-r--r--www/trac-tweakui/files/pkg-message.in28
-rw-r--r--www/trac-tweakui/pkg-descr9
-rw-r--r--www/trac-vote/Makefile32
-rw-r--r--www/trac-vote/distinfo2
-rw-r--r--www/trac-vote/pkg-descr7
-rw-r--r--www/trac-wikigoodies/Makefile26
-rw-r--r--www/trac-wikigoodies/distinfo2
-rw-r--r--www/trac-wikigoodies/pkg-descr14
-rw-r--r--www/trac-wikinotification/Makefile24
-rw-r--r--www/trac-wikinotification/distinfo2
-rw-r--r--www/trac-wikinotification/files/patch-WikiNotification__notification.py79
-rw-r--r--www/trac-wikinotification/files/patch-WikiNotification__templates__wiki_notification_email_template.txt59
-rw-r--r--www/trac-wikinotification/pkg-descr5
-rw-r--r--www/trac-wikinotification/pkg-message17
-rw-r--r--www/trac-wikitemplates/Makefile27
-rw-r--r--www/trac-wikitemplates/distinfo2
-rw-r--r--www/trac-wikitemplates/pkg-descr4
-rw-r--r--www/trac-wikitopdf/Makefile22
-rw-r--r--www/trac-wikitopdf/distinfo2
-rw-r--r--www/trac-wikitopdf/pkg-descr15
-rw-r--r--www/trac-wysiwyg/Makefile43
-rw-r--r--www/trac-wysiwyg/Makefile.svn_rev1
-rw-r--r--www/trac-wysiwyg/distinfo2
-rw-r--r--www/trac-wysiwyg/pkg-descr5
-rw-r--r--www/trac-wysiwyg/pkg-message12
-rw-r--r--www/trac-xmlrpc/Makefile28
-rw-r--r--www/trac-xmlrpc/distinfo2
-rw-r--r--www/trac-xmlrpc/pkg-descr7
-rw-r--r--www/trac/Makefile61
-rw-r--r--www/trac/distinfo3
-rw-r--r--www/trac/files/tracd.in61
-rw-r--r--www/trac/pkg-descr21
-rw-r--r--www/trac/pkg-message17
1067 files changed, 63348 insertions, 0 deletions
diff --git a/www/Makefile b/www/Makefile
index 3a55e026f09f..6ac8964d3e26 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -81,6 +81,7 @@
SUBDIR += cl-lml
SUBDIR += cl-lml-sbcl
SUBDIR += clearsilver
+ SUBDIR += cliqz
SUBDIR += closure-compiler
SUBDIR += cntlm
SUBDIR += codeigniter
@@ -264,6 +265,7 @@
SUBDIR += ilias
SUBDIR += ilias6
SUBDIR += interchange
+ SUBDIR += iridium
SUBDIR += itop
SUBDIR += jericho-html
SUBDIR += jesred
@@ -409,6 +411,7 @@
SUBDIR += mod_xmlns
SUBDIR += mod_xsendfile
SUBDIR += mohawk
+ SUBDIR += moinmoin
SUBDIR += moinmoincli
SUBDIR += mongoose
SUBDIR += mongrel2
@@ -454,6 +457,8 @@
SUBDIR += nibbleblog
SUBDIR += nift
SUBDIR += node
+ SUBDIR += node10
+ SUBDIR += node12
SUBDIR += node14
SUBDIR += nostromo
SUBDIR += novnc
@@ -2179,6 +2184,54 @@
SUBDIR += tomcat85
SUBDIR += tomcat9
SUBDIR += tomee
+ SUBDIR += trac
+ SUBDIR += trac-OhlohWidgetsMacro
+ SUBDIR += trac-TracGoogleAnalytics
+ SUBDIR += trac-accountmanager
+ SUBDIR += trac-advancedticketworkflow
+ SUBDIR += trac-autocomplete
+ SUBDIR += trac-ccselector
+ SUBDIR += trac-customfieldadmin
+ SUBDIR += trac-datefield
+ SUBDIR += trac-defaultcc
+ SUBDIR += trac-devel
+ SUBDIR += trac-discussion
+ SUBDIR += trac-downloads
+ SUBDIR += trac-email2trac
+ SUBDIR += trac-email2trac-postfix
+ SUBDIR += trac-estimator
+ SUBDIR += trac-fivestarvote
+ SUBDIR += trac-fullblog
+ SUBDIR += trac-fullblognotification
+ SUBDIR += trac-graphviz
+ SUBDIR += trac-iniadmin
+ SUBDIR += trac-keywords
+ SUBDIR += trac-keywordsecretticket
+ SUBDIR += trac-ldap
+ SUBDIR += trac-ldapauthstore
+ SUBDIR += trac-math
+ SUBDIR += trac-mercurial
+ SUBDIR += trac-navadd
+ SUBDIR += trac-permredirect
+ SUBDIR += trac-privatetickets
+ SUBDIR += trac-pydotorgtheme
+ SUBDIR += trac-scrumburndown
+ SUBDIR += trac-spam-filter
+ SUBDIR += trac-subtickets
+ SUBDIR += trac-tags
+ SUBDIR += trac-themeengine
+ SUBDIR += trac-ticketimport
+ SUBDIR += trac-tickettemplate
+ SUBDIR += trac-timingandestimation
+ SUBDIR += trac-tocmacro
+ SUBDIR += trac-tweakui
+ SUBDIR += trac-vote
+ SUBDIR += trac-wikigoodies
+ SUBDIR += trac-wikinotification
+ SUBDIR += trac-wikitemplates
+ SUBDIR += trac-wikitopdf
+ SUBDIR += trac-wysiwyg
+ SUBDIR += trac-xmlrpc
SUBDIR += trafficserver
SUBDIR += transmission-web
SUBDIR += transproxy
diff --git a/www/cliqz/Makefile b/www/cliqz/Makefile
new file mode 100644
index 000000000000..817d72ec5df2
--- /dev/null
+++ b/www/cliqz/Makefile
@@ -0,0 +1,191 @@
+# $FreeBSD$
+
+PORTNAME= cliqz
+DISTVERSION= 1.38.0
+PORTREVISION= 6
+CATEGORIES= www
+MASTER_SITES= https://s3.amazonaws.com/cdn.cliqz.com/browser-f/APT/:amazon \
+ http://repository.cliqz.com/dist/${CLIQZ_CHANNEL}/${DISTVERSION}/${CLIQZ_LAST_BUILD_ID}/:cliqz
+DISTFILES= adult-domains.bin:amazon \
+ cliqz@cliqz.com.xpi:cliqz \
+ dat@cliqz.com.xpi:cliqz \
+ gdprtool@cliqz.com.xpi:cliqz \
+ https-everywhere@cliqz.com.xpi:cliqz
+DIST_SUBDIR= ${PORTNAME}
+EXTRACT_ONLY= ${DISTNAME}${_GITHUB_EXTRACT_SUFX}
+
+MAINTAINER= fox@FreeBSD.org
+COMMENT= Secure browser (Mozilla based) with built-in quick search
+
+LICENSE= MPL20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+DEPRECATED= Uses deprecated version of python
+EXPIRATION_DATE= 2020-12-31
+
+FETCH_DEPENDS= ca_root_nss>=0:security/ca_root_nss
+LIB_DEPENDS= libdbus-1.so:devel/dbus \
+ libdbus-glib-1.so:devel/dbus-glib \
+ libfontconfig.so:x11-fonts/fontconfig \
+ libfreetype.so:print/freetype2 \
+ libgraphite2.so:graphics/graphite2 \
+ libharfbuzz.so:print/harfbuzz \
+ libnspr4.so:devel/nspr \
+ libnssutil3.so:security/nss \
+ libplc4.so:devel/nspr \
+ libplds4.so:devel/nspr \
+ libvpx.so:multimedia/libvpx
+
+BUILD_DEPENDS= ${LOCALBASE}/libdata/pkgconfig/xt.pc:x11-toolkits/libXt \
+ ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \
+ py${PYTHON3_DEFAULT:S/.//}-sqlite3>0:databases/py-sqlite3@py${PYTHON3_DEFAULT:S/.//} \
+ ${RUST_DEFAULT}>=1.41:lang/${RUST_DEFAULT} \
+ autoconf-2.13:devel/autoconf213 \
+ bash:shells/bash \
+ graphite2>=1.3.14:graphics/graphite2 \
+ harfbuzz>=2.6.8:print/harfbuzz \
+ icu>=67.1,1:devel/icu \
+ libevent>=2.1.8:devel/libevent \
+ libvorbis>=1.3.6,3:audio/libvorbis \
+ libvpx>=1.8.2:multimedia/libvpx \
+ ${LOCALBASE}/bin/python${PYTHON3_DEFAULT}:lang/python${PYTHON3_DEFAULT:S/.//g} \
+ llvm${LLVM_DEFAULT}>=0:devel/llvm${LLVM_DEFAULT} \
+ nasm:devel/nasm \
+ node:www/node \
+ nspr>=4.25:devel/nspr \
+ nss>=3.54:security/nss \
+ png>=1.6.35:graphics/png \
+ rust-cbindgen>=0.14.1:devel/rust-cbindgen \
+ sqlite3>=3.30.1:databases/sqlite3 \
+ v4l_compat>0:multimedia/v4l_compat \
+ yasm:devel/yasm \
+ zip:archivers/zip
+
+USES= compiler:c++17-lang desktop-file-utils gmake gnome pkgconfig \
+ python:2.7,build shebangfix tar:xz xorg
+
+USE_GNOME= cairo gdkpixbuf2 gtk20 gtk30
+
+USE_XORG= x11 xcb xcomposite xcursor xdamage xext xfixes xi xrender xt
+
+USE_GITHUB= yes
+GH_ACCOUNT= cliqz-oss
+GH_PROJECT= browser-f
+
+USE_LDCONFIG= yes
+
+bash_OLD_CMD= "/bin/bash"
+bash_CMD= ${LOCALBASE}/bin/bash
+SHEBANG_FILES= magic_build_and_package.sh
+
+CLIQZ_CHANNEL= release
+# If the DISTVERSION is updated, make sure to update the last build id from
+# fetch -qo - https://repository.cliqz.com/dist/${CLIQZ_CHANNEL}/${DISTVERSION}/lastbuildid
+CLIQZ_LAST_BUILD_ID= 20200721193739
+CLIQZ_ICON= ${PORTNAME}.png
+CLIQZ_ICON_SRC= ${WRKSRC}/mozilla-release/browser/branding/${PORTNAME}/default48.png
+MOZ_DESKTOP= ${WRKSRC}/mozilla-release/toolkit/mozapps/installer/linux/rpm/mozilla.desktop
+CLIQZ_DESKTOP= ${WRKSRC}/mozilla-release/toolkit/mozapps/installer/linux/rpm/cliqz.desktop
+
+MAKE_ENV+= CQZ_BUILD_ID=${CLIQZ_LAST_BUILD_ID} \
+ CQZ_RELEASE_CHANNEL=${CLIQZ_CHANNEL} \
+ LLVM_CONFIG=llvm-config${LLVM_DEFAULT} \
+ LLVM_OBJDUMP=${LOCALBASE}/llvm${LLVM_DEFAULT}/bin/llvm-objdump \
+ PYTHON3="${LOCALBASE}/bin/python${PYTHON3_DEFAULT}" \
+ RUSTFLAGS=${RUSTFLAGS} \
+ MOZBUILD_STATE_PATH=${WRKDIR}
+BINARY_ALIAS+= python3=python${PYTHON3_DEFAULT}
+
+# Configure args passed into mach build system
+MOZ_CONFIGURE_ARGS+= "--disable-crashreporter" \
+ "--disable-debug" \
+ "--disable-debug-symbols" \
+ "--disable-tests" \
+ "--disable-updater" \
+ "--with-system-libvpx" \
+ "--libclang-path=${LOCALBASE}/llvm${LLVM_DEFAULT}/lib"
+
+.include "${.CURDIR}/Makefile.options"
+
+.include <bsd.port.pre.mk>
+
+# Adjust -C target-cpu if -march/-mcpu is set by bsd.cpu.mk
+.if ${ARCH} == amd64 || ${ARCH} == i386
+RUSTFLAGS+= ${CFLAGS:M-march=*:S/-march=/-C target-cpu=/}
+.else
+RUSTFLAGS+= ${CFLAGS:M-mcpu=*:S/-mcpu=/-C target-cpu=/}
+.endif
+
+.if ${ARCH:Maarch64} || ${MACHINE_CPU:Msse2}
+MOZ_CONFIGURE_ARGS+= "--enable-rust-simd"
+.else
+MOZ_CONFIGURE_ARGS+= "--disable-rust-simd"
+.endif
+
+# Require newer Clang than what's in base system unless user opted out
+.if ${CC} == cc && ${CXX} == c++ && exists(/usr/lib/libc++.so)
+CPP= ${LOCALBASE}/bin/clang-cpp${LLVM_DEFAULT}
+CC= ${LOCALBASE}/bin/clang${LLVM_DEFAULT}
+CXX= ${LOCALBASE}/bin/clang++${LLVM_DEFAULT}
+# XXX avoid warnings
+USES:= ${USES:Ncompiler\:*}
+.endif
+
+post-extract:
+ ${CP} ${DISTDIR}/${DIST_SUBDIR}/adult-domains.bin \
+ ${WRKSRC}/mozilla-release/browser/adult-domains.bin
+ ${MKDIR} ${WRKSRC}/obj/dist/bin/browser/features
+ ${CP} ${DISTDIR}/${DIST_SUBDIR}/cliqz@cliqz.com.xpi \
+ ${DISTDIR}/${DIST_SUBDIR}/https-everywhere@cliqz.com.xpi \
+ ${DISTDIR}/${DIST_SUBDIR}/gdprtool@cliqz.com.xpi \
+ ${WRKSRC}/obj/dist/bin/browser/features
+
+post-patch:
+ @${CP} ${MOZ_DESKTOP} ${CLIQZ_DESKTOP}
+ @${REINPLACE_CMD} -e 's/@MOZ_APP_DISPLAYNAME@/Cliqz Internet/g' \
+ -e 's/@MOZ_APP_NAME@/${PORTNAME}/g' \
+ -e '/Icon=${PORTNAME}/ s/${PORTNAME}/${CLIQZ_ICON}/' \
+ -e '/StartupWMClass/d' \
+ ${CLIQZ_DESKTOP}
+.for MOZ_CONFIGURE_ARG in ${MOZ_CONFIGURE_ARGS}
+ @${ECHO_CMD} "ac_add_options" ${MOZ_CONFIGURE_ARG} >> \
+ ${WRKSRC}/mozilla-release/browser/config/cliqz.mozconfig;
+.endfor
+# This prevents linker exhausting memory in i386 builds
+.if ${ARCH} == "i386"
+ @${ECHO_CMD} 'export LDFLAGS="-Wl,--no-keep-memory -Wl,--as-needed"' >> \
+ ${WRKSRC}/mozilla-release/browser/config/cliqz.mozconfig
+.endif
+# Disable vendor checksums like lang/rust
+ @${REINPLACE_CMD} 's,"files":{[^}]*},"files":{},' \
+ ${WRKSRC}/mozilla-release/third_party/rust/*/.cargo-checksum.json
+
+pre-configure-script:
+ # Check that the running kernel has COMPAT_FREEBSD11 required by lang/rust post-ino64
+ @${SETENV} CC="${CC}" OPSYS="${OPSYS}" OSVERSION="${OSVERSION}" WRKDIR="${WRKDIR}" \
+ ${SH} ${SCRIPTSDIR}/rust-compat11-canary.sh
+
+do-build:
+ (cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ./magic_build_and_package.sh)
+
+do-install:
+ ${MKDIR} ${STAGEDIR}${PREFIX}/lib/${PORTNAME}
+ (cd ${WRKSRC}/obj/dist/${PORTNAME} && \
+ ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/lib/${PORTNAME})
+ # Check if the wayland lib was generated, this happens if
+ # x11-toolkits/gtk30 has WAYLAND option enabled.
+ @if [ -f ${STAGEDIR}${PREFIX}/lib/${PORTNAME}/libmozwayland.so ]; then \
+ ${REINPLACE_CMD} -e 's|%%WAYLAND%%||' ${TMPPLIST}; \
+ else \
+ ${REINPLACE_CMD} -e 's|%%WAYLAND%%|@comment |' ${TMPPLIST}; \
+ fi
+ @${CHMOD} 755 ${STAGEDIR}${PREFIX}/lib/${PORTNAME}/${PORTNAME}-bin
+ @${CHMOD} 755 ${STAGEDIR}${PREFIX}/lib/${PORTNAME}/${PORTNAME}
+
+post-install:
+ ${RLN} ${STAGEDIR}${PREFIX}/lib/${PORTNAME}/${PORTNAME}-bin ${STAGEDIR}${PREFIX}/bin/${PORTNAME}
+ ${INSTALL_DATA} ${CLIQZ_DESKTOP} ${STAGEDIR}${PREFIX}/share/applications/
+ ${MKDIR} ${STAGEDIR}${PREFIX}/share/pixmaps
+ @${CP} ${CLIQZ_ICON_SRC} ${STAGEDIR}${PREFIX}/share/pixmaps/${CLIQZ_ICON}
+
+.include <bsd.port.post.mk>
diff --git a/www/cliqz/Makefile.options b/www/cliqz/Makefile.options
new file mode 100644
index 000000000000..1cebd99df62f
--- /dev/null
+++ b/www/cliqz/Makefile.options
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+# Audio server options
+OPTIONS_MULTI= AUDIO
+OPTIONS_MULTI_AUDIO= JACK PULSEAUDIO SNDIO
+OPTIONS_DEFAULT= JACK PULSEAUDIO SNDIO
+AUDIO_DESC= Choose your audio options
+
+JACK_BUILD_DEPENDS= ${LOCALBASE}/include/jack/jack.h:audio/jack
+JACK_VARS= MOZ_CONFIGURE_ARGS+="--enable-jack"
+
+PULSEAUDIO_BUILD_DEPENDS= ${LOCALBASE}/include/pulse/pulseaudio.h:audio/pulseaudio
+PULSEAUDIO_VARS= MOZ_CONFIGURE_ARGS+="--enable-pulseaudio"
+PULSEAUDIO_VARS_OFF= MOZ_CONFIGURE_ARGS+="--disable-pulseaudio"
+
+SNDIO_BUILD_DEPENDS+= ${LOCALBASE}/include/sndio.h:audio/sndio
+SNDIO_LIB_DEPENDS+= libsndio.so:audio/sndio
+
+post-patch-SNDIO-on:
+ @${REINPLACE_CMD} -e 's|OpenBSD|${OPSYS}|g' \
+ ${WRKSRC}/mozilla-release/media/libcubeb/src/moz.build \
+ ${WRKSRC}/mozilla-release/toolkit/library/moz.build
+ @${REINPLACE_CMD} -e 's|OpenBSD|${OPSYS}|g' \
+ ${WRKSRC}/mozilla-release/media/libcubeb/gtest/moz.build
diff --git a/www/cliqz/distinfo b/www/cliqz/distinfo
new file mode 100644
index 000000000000..3a97ea070851
--- /dev/null
+++ b/www/cliqz/distinfo
@@ -0,0 +1,13 @@
+TIMESTAMP = 1595505538
+SHA256 (cliqz/adult-domains.bin) = f726171965328f60e2cc2a50311883e76c21b3359f2596d10be76cc33abdda88
+SIZE (cliqz/adult-domains.bin) = 528392
+SHA256 (cliqz/cliqz@cliqz.com.xpi) = 3f8a580169881c090813b2cc5cac35c7e9fdcbc1af42b576851e617b5eedbb18
+SIZE (cliqz/cliqz@cliqz.com.xpi) = 4107644
+SHA256 (cliqz/dat@cliqz.com.xpi) = 83dac73bd4ab16271330eb87ed5e3b088ddd69707ceb121d8ee730d07ddc9d87
+SIZE (cliqz/dat@cliqz.com.xpi) = 988736
+SHA256 (cliqz/gdprtool@cliqz.com.xpi) = 7d59af6529b0756e5a89cf150f781a81a1cc1284eab2de00a6a89432f65a711d
+SIZE (cliqz/gdprtool@cliqz.com.xpi) = 219684
+SHA256 (cliqz/https-everywhere@cliqz.com.xpi) = d1b7590c9541741aa0d1fada383fece7b48348f477a3f7b606e043021a42bdbb
+SIZE (cliqz/https-everywhere@cliqz.com.xpi) = 2058305
+SHA256 (cliqz/cliqz-oss-browser-f-1.38.0_GH0.tar.gz) = d9e8ecaa99f753828ae63ab83b27a3b3cb4e6d6d51ca0a9f6ed246d2391f23bd
+SIZE (cliqz/cliqz-oss-browser-f-1.38.0_GH0.tar.gz) = 519049842
diff --git a/www/cliqz/files/patch-addon-search b/www/cliqz/files/patch-addon-search
new file mode 100644
index 000000000000..928c52c0aad8
--- /dev/null
+++ b/www/cliqz/files/patch-addon-search
@@ -0,0 +1,56 @@
+https://github.com/mozilla/addons/issues/708
+https://github.com/mozilla/addons-frontend/issues/4610
+
+Taken from www/firefox
+
+diff --git browser/app/profile/firefox.js browser/app/profile/firefox.js
+index 75c2c5e435e35..4d8c09c02759b 100644
+--- mozilla-release/browser/app/profile/firefox.js.orig 2020-07-17 14:00:07 UTC
++++ mozilla-release/browser/app/profile/firefox.js
+@@ -37,7 +37,7 @@ pref("extensions.webextOptionalPermissionPrompts", tru
+ // Preferences for AMO integration
+ pref("extensions.getAddons.cache.enabled", true);
+ pref("extensions.getAddons.get.url", "https://services.addons.mozilla.org/api/v3/addons/search/?guid=%IDS%&lang=%LOCALE%");
+-pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/firefox/search?q=%TERMS%&platform=%OS%&appver=%VERSION%");
++pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/firefox/search?q=%TERMS%&platform=Linux&appver=%VERSION%");
+ pref("extensions.getAddons.link.url", "https://addons.mozilla.org/%LOCALE%/firefox/");
+ pref("extensions.getAddons.langpacks.url", "https://services.addons.mozilla.org/api/v3/addons/language-tools/?app=firefox&type=language&appversion=%VERSION%");
+ pref("extensions.getAddons.discovery.api_url", "https://services.addons.mozilla.org/api/v4/discovery/?lang=%LOCALE%&edition=%DISTRIBUTION%");
+@@ -172,8 +172,8 @@ pref("app.update.staging.enabled", true);
+ // .. etc ..
+ //
+ pref("extensions.update.enabled", true);
+-pref("extensions.update.url", "https://versioncheck.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
+-pref("extensions.update.background.url", "https://versioncheck-bg.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
++pref("extensions.update.url", "https://versioncheck.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=Linux&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
++pref("extensions.update.background.url", "https://versioncheck-bg.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=Linux&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
+ #if MOZ_UPDATE_CHANNEL == beta
+ // CLIQZ-SPECIAL: force addons update in every 30 min on beta
+ pref("extensions.update.interval", 1800);
+
+diff --git toolkit/mozapps/extensions/internal/AddonRepository.jsm toolkit/mozapps/extensions/internal/AddonRepository.jsm
+index f70fd8d7e3bd8..81e8cd7764fdf 100644
+--- mozilla-release/toolkit/mozapps/extensions/internal/AddonRepository.jsm
++++ mozilla-release/toolkit/mozapps/extensions/internal/AddonRepository.jsm
+@@ -602,7 +602,7 @@ var AddonRepository = {
+ addon.version = String(aEntry.current_version.version);
+ if (Array.isArray(aEntry.current_version.files)) {
+ for (let file of aEntry.current_version.files) {
+- if (file.platform == "all" || file.platform == PLATFORM) {
++ if (file.platform == "all" || file.platform == "linux" || file.platform == PLATFORM) {
+ if (file.url) {
+ addon.sourceURI = NetUtil.newURI(file.url);
+ }
+diff --git toolkit/mozapps/extensions/internal/XPIDatabase.jsm toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+index f70fd8d7e3bd8..81e8cd7764fdf 100644
+--- mozilla-release/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ mozilla-release/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -355,7 +355,7 @@ class AddonInternal {
+ // Something is causing errors in here
+ try {
+ for (let platform of this.targetPlatforms) {
+- if (platform.os == Services.appinfo.OS) {
++ if (platform.os == "Linux" || platform.os == Services.appinfo.OS) {
+ if (platform.abi) {
+ needsABI = true;
+ if (platform.abi === abi)
diff --git a/www/cliqz/files/patch-bug1288587 b/www/cliqz/files/patch-bug1288587
new file mode 100644
index 000000000000..941946bc8899
--- /dev/null
+++ b/www/cliqz/files/patch-bug1288587
@@ -0,0 +1,39 @@
+Taken from www/firefox
+
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+index 855214a..1e91d51 100644
+--- mozilla-release/build/moz.configure/init.configure
++++ mozilla-release/build/moz.configure/init.configure
+@@ -251,6 +251,7 @@ option(env='PYTHON3', nargs=1, help='Python 3 interpre
+ @imports(_from='mozbuild.pythonutil', _import='find_python3_executable')
+ @imports(_from='mozbuild.pythonutil', _import='python_executable_version')
+ @imports(_from='six', _import='ensure_text')
++@imports(_from='__builtin__', _import='KeyError')
+ def virtualenv_python3(env_python, build_env, mozconfig, help):
+ # Avoid re-executing python when running configure --help.
+ if help:
+@@ -283,6 +284,12 @@ def virtualenv_python3(env_python, build_env, mozconfi
+ python = mozconfig['vars']['added']['PYTHON3']
+ elif 'PYTHON3' in mozconfig['vars']['modified']:
+ python = mozconfig['vars']['modified']['PYTHON3'][1]
++ for i in ('env', 'vars'):
++ for j in ('added', 'modified'):
++ try:
++ del mozconfig[i][j]['PYTHON3']
++ except KeyError:
++ pass
+
+ log.debug("python3: executable from configuration: %r" % python)
+
+@@ -365,7 +372,10 @@ def virtualenv_python3(env_python, build_env, mozconfi
+ sys.executable, manager.python_path))
+ log.info('Re-executing in the virtualenv')
+ if env_python:
+- del os.environ['PYTHON3']
++ try:
++ del os.environ['PYTHON3']
++ except KeyError:
++ pass
+ # Homebrew on macOS will change Python's sys.executable to a custom
+ # value which messes with mach's virtualenv handling code. Override
+ # Homebrew's changes with the correct sys.executable value.
diff --git a/www/cliqz/files/patch-bug1550891 b/www/cliqz/files/patch-bug1550891
new file mode 100644
index 000000000000..7a5b0741ced2
--- /dev/null
+++ b/www/cliqz/files/patch-bug1550891
@@ -0,0 +1,89 @@
+commit 965eb33c5e86
+Author: Greg V <greg@unrelenting.technology>
+Date: Wed Jan 8 15:06:00 2020 -0800
+
+ Bug 1550891 - re-add SHM_ANON support in IPC shared memory, freezing via capabilities
+---
+ config/system-headers.mozbuild | 1 +
+ ipc/chromium/src/base/shared_memory_posix.cc | 20 +++++++++++++++++---
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+diff --git config/system-headers.mozbuild config/system-headers.mozbuild
+index 88afca1070f86..beff3e2542c9f 100644
+--- mozilla-release/config/system-headers.mozbuild
++++ mozilla-release/config/system-headers.mozbuild
+@@ -816,6 +816,7 @@ system_headers = [
+ 'sys/bitypes.h',
+ 'sys/byteorder.h',
+ 'syscall.h',
++ 'sys/capsicum.h',
+ 'sys/cdefs.h',
+ 'sys/cfgodm.h',
+ 'sys/elf.h',
+diff --git ipc/chromium/src/base/shared_memory_posix.cc ipc/chromium/src/base/shared_memory_posix.cc
+index 0be9cce0b4bed..89e67483e4c16 100644
+--- mozilla-release/ipc/chromium/src/base/shared_memory_posix.cc
++++ mozilla-release/ipc/chromium/src/base/shared_memory_posix.cc
+@@ -16,6 +16,10 @@
+ # include <linux/ashmem.h>
+ #endif
+
++#ifdef __FreeBSD__
++# include <sys/capsicum.h>
++#endif
++
+ #include "base/eintr_wrapper.h"
+ #include "base/logging.h"
+ #include "base/string_util.h"
+@@ -148,7 +152,7 @@ static int SafeShmUnlink(bool freezeable, const char* name) {
+ }
+ }
+
+-#elif !defined(ANDROID)
++#elif !defined(ANDROID) && !defined(__FreeBSD__)
+ static int SafeShmOpen(bool freezeable, const char* name, int oflag, int mode) {
+ return shm_open(name, oflag, mode);
+ }
+@@ -160,7 +164,7 @@ static int SafeShmUnlink(bool freezeable, const char* name) {
+
+ // static
+ bool SharedMemory::AppendPosixShmPrefix(std::string* str, pid_t pid) {
+-#if defined(ANDROID)
++#if defined(ANDROID) || defined(__FreeBSD__)
+ return false;
+ #else
+ *str += '/';
+@@ -186,7 +190,7 @@ bool SharedMemory::AppendPosixShmPrefix(std::string* str, pid_t pid) {
+ // enough for this.
+ StringAppendF(str, "org.mozilla.ipc.%d.", static_cast<int>(pid));
+ return true;
+-#endif // !ANDROID
++#endif // !ANDROID && !__FreeBSD__
+ }
+
+ bool SharedMemory::CreateInternal(size_t size, bool freezeable) {
+@@ -212,6 +216,9 @@ bool SharedMemory::CreateInternal(size_t size, bool freezeable) {
+ return false;
+ }
+ needs_truncate = false;
++#elif defined(__FreeBSD__)
++ // FreeBSD supports anonymous shm_open
++ fd.reset(shm_open(SHM_ANON, O_RDWR, 0600));
+ #else
+ // Generic Unix: shm_open + shm_unlink
+ do {
+@@ -277,6 +284,14 @@ bool SharedMemory::ReadOnlyCopy(SharedMemory* ro_out) {
+ return false;
+ }
+ ro_file = mapped_file_;
++#elif defined(__FreeBSD__)
++ cap_rights_t rights;
++ cap_rights_init(&rights, CAP_MMAP_R);
++ if (cap_rights_limit(mapped_file_, &rights) != 0) {
++ CHROMIUM_LOG(WARNING) << "failed to freeze shm: " << strerror(errno);
++ return false;
++ }
++ ro_file = mapped_file_;
+ #else
+ DCHECK(frozen_file_ >= 0);
+ DCHECK(mapped_file_ >= 0);
diff --git a/www/cliqz/files/patch-bug1618914 b/www/cliqz/files/patch-bug1618914
new file mode 100644
index 000000000000..42f909514118
--- /dev/null
+++ b/www/cliqz/files/patch-bug1618914
@@ -0,0 +1,43 @@
+[Wayland] Fall back to ftruncate if posix_fallocate isn't supported by filesystem.
+
+Taken from www/firefox
+
+diff --git widget/gtk/WindowSurfaceWayland.cpp widget/gtk/WindowSurfaceWayland.cpp
+index 9a73326399bd5..9e42a7f1c5d18 100644
+--- mozilla-release/widget/gtk/WindowSurfaceWayland.cpp
++++ mozilla-release/widget/gtk/WindowSurfaceWayland.cpp
+@@ -222,20 +222,21 @@ static int WaylandAllocateShmMemory(int aSize) {
+ #ifdef HAVE_POSIX_FALLOCATE
+ do {
+ ret = posix_fallocate(fd, 0, aSize);
+ } while (ret == EINTR);
+- if (ret != 0) {
++ if (ret == 0) {
++ return fd;
++ } else if (ret != ENODEV && ret != EINVAL && ret != EOPNOTSUPP) {
+ close(fd);
+ MOZ_CRASH("posix_fallocate() fails to allocate shm memory");
+ }
+-#else
++#endif
+ do {
+ ret = ftruncate(fd, aSize);
+ } while (ret < 0 && errno == EINTR);
+ if (ret < 0) {
+ close(fd);
+ MOZ_CRASH("ftruncate() fails to allocate shm memory");
+ }
+-#endif
+
+ return fd;
+ }
+@@ -265,8 +266,8 @@ bool WaylandShmPool::Resize(int aSize) {
+ #ifdef HAVE_POSIX_FALLOCATE
+ do {
+ errno = posix_fallocate(mShmPoolFd, 0, aSize);
+ } while (errno == EINTR);
+- if (errno != 0) return false;
++ if (errno != 0 && errno != ENODEV && errno != EINVAL && errno != EOPNOTSUPP) return false;
+ #endif
+
+ wl_shm_pool_resize(mShmPool, aSize);
diff --git a/www/cliqz/files/patch-bug1628567 b/www/cliqz/files/patch-bug1628567
new file mode 100644
index 000000000000..3c83b73aefa3
--- /dev/null
+++ b/www/cliqz/files/patch-bug1628567
@@ -0,0 +1,34 @@
+Don't pass --target when CC/CXX contains clang
+
+--- mozilla-release/third_party/rust/cc/src/lib.rs.orig 2020-04-10 00:57:23 UTC
++++ mozilla-release/third_party/rust/cc/src/lib.rs
+@@ -2344,28 +2344,7 @@ impl Tool {
+ }
+
+ fn with_features(path: PathBuf, clang_driver: Option<&str>, cuda: bool) -> Self {
+- // Try to detect family of the tool from its name, falling back to Gnu.
+- let family = if let Some(fname) = path.file_name().and_then(|p| p.to_str()) {
+- if fname.contains("clang-cl") {
+- ToolFamily::Msvc { clang_cl: true }
+- } else if fname.contains("cl")
+- && !fname.contains("cloudabi")
+- && !fname.contains("uclibc")
+- && !fname.contains("clang")
+- {
+- ToolFamily::Msvc { clang_cl: false }
+- } else if fname.contains("clang") {
+- match clang_driver {
+- Some("cl") => ToolFamily::Msvc { clang_cl: true },
+- _ => ToolFamily::Clang,
+- }
+- } else {
+- ToolFamily::Gnu
+- }
+- } else {
+- ToolFamily::Gnu
+- };
+-
++ let family = ToolFamily::Gnu;
+ Tool {
+ path: path,
+ cc_wrapper_path: None,
diff --git a/www/cliqz/files/patch-bug1640982 b/www/cliqz/files/patch-bug1640982
new file mode 100644
index 000000000000..9a8d8e6e5700
--- /dev/null
+++ b/www/cliqz/files/patch-bug1640982
@@ -0,0 +1,17 @@
+Unbreak build with Rust 1.45.0
+
+error: options `-C embed-bitcode=no` and `-C lto` are incompatible
+
+Taken from www/firefox
+
+--- mozilla-release/config/makefiles/rust.mk.orig 2020-05-12 09:36:22 UTC
++++ mozilla-release/config/makefiles/rust.mk
+@@ -61,7 +61,7 @@ ifndef MOZ_DEBUG_RUST
+ # Enable link-time optimization for release builds, but not when linking
+ # gkrust_gtest.
+ ifeq (,$(findstring gkrust_gtest,$(RUST_LIBRARY_FILE)))
+-cargo_rustc_flags += -Clto
++cargo_rustc_flags +=
+ endif
+ endif
+ endif
diff --git a/www/cliqz/files/patch-bug1663715 b/www/cliqz/files/patch-bug1663715
new file mode 100644
index 000000000000..2b61a3f3682a
--- /dev/null
+++ b/www/cliqz/files/patch-bug1663715
@@ -0,0 +1,31087 @@
+From 63678ae69e03325d65255d29f1af4a6ea3dd354a Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Sat, 10 Oct 2020 16:07:49 +0200
+Subject: [PATCH 36/38] bmo#1643201: Cherry-pick some servo changes to
+ derive_common
+
+Link: https://bugzilla.mozilla.org/show_bug.cgi?id=1663715#c7
+Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
+---
+ servo/components/derive_common/cg.rs | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/servo/components/derive_common/cg.rs b/servo/components/derive_common/cg.rs
+index 55a75398c7..c51c0d7750 100644
+--- mozilla-release/servo/components/derive_common/cg.rs
++++ mozilla-release/servo/components/derive_common/cg.rs
+@@ -7,7 +7,7 @@ use proc_macro2::{Span, TokenStream};
+ use quote::TokenStreamExt;
+ use syn::{self, AngleBracketedGenericArguments, Binding, DeriveInput, Field};
+ use syn::{GenericArgument, GenericParam, Ident, Path};
+-use syn::{PathArguments, PathSegment, QSelf, Type, TypeArray};
++use syn::{PathArguments, PathSegment, QSelf, Type, TypeArray, TypeGroup};
+ use syn::{TypeParam, TypeParen, TypePath, TypeSlice, TypeTuple};
+ use syn::{Variant, WherePredicate};
+ use synstructure::{self, BindStyle, BindingInfo, VariantAst, VariantInfo};
+@@ -208,6 +208,10 @@ where
+ elem: Box::new(map_type_params(&inner.elem, params, f)),
+ ..inner.clone()
+ }),
++ Type::Group(ref inner) => Type::from(TypeGroup {
++ elem: Box::new(map_type_params(&inner.elem, params, f)),
++ ..inner.clone()
++ }),
+ ref ty => panic!("type {:?} cannot be mapped yet", ty),
+ }
+ }
+--
+2.28.0
+
+From 23f22e9de6cc2236d58cc03997a1040e62c532e1 Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Sat, 10 Oct 2020 16:09:04 +0200
+Subject: [PATCH 37/38] bmo#1653339: Teach style_derive's map_type_params about
+ mapping self correctly
+
+Link: https://bugzilla.mozilla.org/show_bug.cgi?id=1663715#c7
+Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
+---
+ servo/components/derive_common/cg.rs | 30 +++++++++++--------
+ .../style_derive/to_computed_value.rs | 4 ++-
+ 2 files changed, 21 insertions(+), 13 deletions(-)
+
+diff --git a/servo/components/derive_common/cg.rs b/servo/components/derive_common/cg.rs
+index c51c0d7750..8abfd87149 100644
+--- mozilla-release/servo/components/derive_common/cg.rs
++++ mozilla-release/servo/components/derive_common/cg.rs
+@@ -154,19 +154,19 @@ pub fn fmap_trait_output(input: &DeriveInput, trait_path: &Path, trait_output: &
+ segment.into()
+ }
+
+-pub fn map_type_params<F>(ty: &Type, params: &[&TypeParam], f: &mut F) -> Type
++pub fn map_type_params<F>(ty: &Type, params: &[&TypeParam], self_type: &Path, f: &mut F) -> Type
+ where
+ F: FnMut(&Ident) -> Type,
+ {
+ match *ty {
+ Type::Slice(ref inner) => Type::from(TypeSlice {
+- elem: Box::new(map_type_params(&inner.elem, params, f)),
++ elem: Box::new(map_type_params(&inner.elem, params, self_type, f)),
+ ..inner.clone()
+ }),
+ Type::Array(ref inner) => {
+ //ref ty, ref expr) => {
+ Type::from(TypeArray {
+- elem: Box::new(map_type_params(&inner.elem, params, f)),
++ elem: Box::new(map_type_params(&inner.elem, params, self_type, f)),
+ ..inner.clone()
+ })
+ },
+@@ -175,7 +175,7 @@ where
+ elems: inner
+ .elems
+ .iter()
+- .map(|ty| map_type_params(&ty, params, f))
++ .map(|ty| map_type_params(&ty, params, self_type, f))
+ .collect(),
+ ..inner.clone()
+ }),
+@@ -187,10 +187,16 @@ where
+ if params.iter().any(|ref param| &param.ident == ident) {
+ return f(ident);
+ }
++ if ident == "Self" {
++ return Type::from(TypePath {
++ qself: None,
++ path: self_type.clone(),
++ });
++ }
+ }
+ Type::from(TypePath {
+ qself: None,
+- path: map_type_params_in_path(path, params, f),
++ path: map_type_params_in_path(path, params, self_type, f),
+ })
+ },
+ Type::Path(TypePath {
+@@ -198,25 +204,25 @@ where
+ ref path,
+ }) => Type::from(TypePath {
+ qself: qself.as_ref().map(|qself| QSelf {
+- ty: Box::new(map_type_params(&qself.ty, params, f)),
++ ty: Box::new(map_type_params(&qself.ty, params, self_type, f)),
+ position: qself.position,
+ ..qself.clone()
+ }),
+- path: map_type_params_in_path(path, params, f),
++ path: map_type_params_in_path(path, params, self_type, f),
+ }),
+ Type::Paren(ref inner) => Type::from(TypeParen {
+- elem: Box::new(map_type_params(&inner.elem, params, f)),
++ elem: Box::new(map_type_params(&inner.elem, params, self_type, f)),
+ ..inner.clone()
+ }),
+ Type::Group(ref inner) => Type::from(TypeGroup {
+- elem: Box::new(map_type_params(&inner.elem, params, f)),
++ elem: Box::new(map_type_params(&inner.elem, params, self_type, f)),
+ ..inner.clone()
+ }),
+ ref ty => panic!("type {:?} cannot be mapped yet", ty),
+ }
+ }
+
+-fn map_type_params_in_path<F>(path: &Path, params: &[&TypeParam], f: &mut F) -> Path
++fn map_type_params_in_path<F>(path: &Path, params: &[&TypeParam], self_type: &Path, f: &mut F) -> Path
+ where
+ F: FnMut(&Ident) -> Type,
+ {
+@@ -236,11 +242,11 @@ where
+ .map(|arg| match arg {
+ ty @ &GenericArgument::Lifetime(_) => ty.clone(),
+ &GenericArgument::Type(ref data) => {
+- GenericArgument::Type(map_type_params(data, params, f))
++ GenericArgument::Type(map_type_params(data, params, self_type, f))
+ },
+ &GenericArgument::Binding(ref data) => {
+ GenericArgument::Binding(Binding {
+- ty: map_type_params(&data.ty, params, f),
++ ty: map_type_params(&data.ty, params, self_type, f),
+ ..data.clone()
+ })
+ },
+diff --git a/servo/components/style_derive/to_computed_value.rs b/servo/components/style_derive/to_computed_value.rs
+index fe6bddb7ed..1dc422e2dd 100644
+--- mozilla-release/servo/components/style_derive/to_computed_value.rs
++++ mozilla-release/servo/components/style_derive/to_computed_value.rs
+@@ -47,12 +47,15 @@ pub fn derive_to_value(
+ cg::add_predicate(&mut where_clause, parse_quote!(#param: #trait_path));
+ }
+
++ let computed_value_type = cg::fmap_trait_output(&input, &trait_path, &output_type_name);
++
+ let mut add_field_bound = |binding: &BindingInfo| {
+ let ty = &binding.ast().ty;
+
+ let output_type = cg::map_type_params(
+ ty,
+ &params,
++ &computed_value_type,
+ &mut |ident| parse_quote!(<#ident as #trait_path>::#output_type_name),
+ );
+
+@@ -142,7 +145,6 @@ pub fn derive_to_value(
+
+ input.generics.where_clause = where_clause;
+ let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
+- let computed_value_type = cg::fmap_trait_output(&input, &trait_path, &output_type_name);
+
+ let impl_ = trait_impl(from_body, to_body);
+
+--
+2.28.0
+
+From 300e01e71c9dc536d499d80563968c5fc7f7e34a Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Sat, 10 Oct 2020 16:10:20 +0200
+Subject: [PATCH 38/38] bmo#1663715: Update syn and proc-macro2 so that Firefox
+ can build on Rust nightly again
+
+Link: https://bugzilla.mozilla.org/show_bug.cgi?id=1663715#c7
+Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
+---
+ Cargo.lock | 8 +-
+ .../rust/lucet-wasi/.cargo-checksum.json | 2 +-
+ .../rust/packed_simd/.cargo-checksum.json | 2 +-
+ .../rust/proc-macro2/.cargo-checksum.json | 2 +-
+ third_party/rust/proc-macro2/Cargo.toml | 15 +-
+ third_party/rust/proc-macro2/README.md | 2 +-
+ third_party/rust/proc-macro2/build.rs | 20 +
+ third_party/rust/proc-macro2/src/detection.rs | 67 +
+ third_party/rust/proc-macro2/src/fallback.rs | 1010 ++----
+ third_party/rust/proc-macro2/src/lib.rs | 225 +-
+ third_party/rust/proc-macro2/src/marker.rs | 18 +
+ third_party/rust/proc-macro2/src/parse.rs | 849 +++++
+ third_party/rust/proc-macro2/src/strnom.rs | 391 ---
+ third_party/rust/proc-macro2/src/wrapper.rs | 258 +-
+ .../rust/proc-macro2/tests/comments.rs | 103 +
+ third_party/rust/proc-macro2/tests/marker.rs | 33 +
+ third_party/rust/proc-macro2/tests/test.rs | 240 +-
+ .../rust/proc-macro2/tests/test_fmt.rs | 26 +
+ .../spirv-cross-internal/.cargo-checksum.json | 2 +-
+ third_party/rust/syn/.cargo-checksum.json | 2 +-
+ third_party/rust/syn/Cargo.toml | 35 +-
+ third_party/rust/syn/README.md | 16 +-
+ third_party/rust/syn/benches/file.rs | 7 +
+ third_party/rust/syn/benches/rust.rs | 45 +-
+ third_party/rust/syn/build.rs | 38 +-
+ third_party/rust/syn/src/attr.rs | 126 +-
+ third_party/rust/syn/src/buffer.rs | 56 +-
+ third_party/rust/syn/src/custom_keyword.rs | 12 +-
+ .../rust/syn/src/custom_punctuation.rs | 50 +-
+ third_party/rust/syn/src/data.rs | 96 +-
+ third_party/rust/syn/src/derive.rs | 10 +-
+ third_party/rust/syn/src/discouraged.rs | 27 +-
+ third_party/rust/syn/src/error.rs | 33 +-
+ third_party/rust/syn/src/expr.rs | 826 +++--
+ third_party/rust/syn/src/ext.rs | 12 +-
+ third_party/rust/syn/src/file.rs | 4 +-
+ third_party/rust/syn/src/gen/clone.rs | 2051 ++++++++++++
+ third_party/rust/syn/src/gen/debug.rs | 2857 +++++++++++++++++
+ third_party/rust/syn/src/gen/eq.rs | 1930 +++++++++++
+ third_party/rust/syn/src/gen/fold.rs | 287 +-
+ third_party/rust/syn/src/gen/hash.rs | 2691 ++++++++++++++++
+ third_party/rust/syn/src/gen/visit.rs | 19 +-
+ third_party/rust/syn/src/gen/visit_mut.rs | 19 +-
+ third_party/rust/syn/src/generics.rs | 255 +-
+ third_party/rust/syn/src/item.rs | 1515 +++++----
+ third_party/rust/syn/src/keyword.rs | 0
+ third_party/rust/syn/src/lib.rs | 109 +-
+ third_party/rust/syn/src/lifetime.rs | 13 +-
+ third_party/rust/syn/src/lit.rs | 581 ++--
+ third_party/rust/syn/src/mac.rs | 55 +-
+ third_party/rust/syn/src/macros.rs | 61 +-
+ third_party/rust/syn/src/op.rs | 6 +-
+ third_party/rust/syn/src/parse.rs | 211 +-
+ third_party/rust/syn/src/parse_macro_input.rs | 32 +-
+ third_party/rust/syn/src/parse_quote.rs | 15 +-
+ third_party/rust/syn/src/pat.rs | 313 +-
+ third_party/rust/syn/src/path.rs | 33 +-
+ third_party/rust/syn/src/punctuated.rs | 123 +-
+ third_party/rust/syn/src/reserved.rs | 42 +
+ third_party/rust/syn/src/spanned.rs | 4 +-
+ third_party/rust/syn/src/stmt.rs | 141 +-
+ third_party/rust/syn/src/token.rs | 99 +-
+ third_party/rust/syn/src/tt.rs | 6 +-
+ third_party/rust/syn/src/ty.rs | 364 ++-
+ third_party/rust/syn/src/verbatim.rs | 15 +
+ third_party/rust/syn/src/whitespace.rs | 65 +
+ third_party/rust/syn/tests/clone.sh | 16 -
+ third_party/rust/syn/tests/common/eq.rs | 247 +-
+ third_party/rust/syn/tests/common/mod.rs | 13 +
+ third_party/rust/syn/tests/common/parse.rs | 24 +-
+ third_party/rust/syn/tests/debug/gen.rs | 50 +-
+ third_party/rust/syn/tests/debug/mod.rs | 17 +-
+ third_party/rust/syn/tests/features/error.rs | 1 -
+ third_party/rust/syn/tests/features/mod.rs | 22 -
+ third_party/rust/syn/tests/macros/mod.rs | 8 +-
+ third_party/rust/syn/tests/repo/mod.rs | 137 +-
+ third_party/rust/syn/tests/repo/progress.rs | 37 +
+ third_party/rust/syn/tests/test_asyncness.rs | 38 +-
+ third_party/rust/syn/tests/test_attribute.rs | 452 +--
+ .../rust/syn/tests/test_derive_input.rs | 1321 ++++----
+ third_party/rust/syn/tests/test_expr.rs | 314 +-
+ third_party/rust/syn/tests/test_generics.rs | 371 ++-
+ third_party/rust/syn/tests/test_grouping.rs | 53 +-
+ third_party/rust/syn/tests/test_ident.rs | 5 -
+ third_party/rust/syn/tests/test_item.rs | 45 +
+ third_party/rust/syn/tests/test_iterators.rs | 7 +-
+ third_party/rust/syn/tests/test_lit.rs | 75 +-
+ third_party/rust/syn/tests/test_meta.rs | 498 ++-
+ .../rust/syn/tests/test_parse_buffer.rs | 41 +-
+ .../rust/syn/tests/test_parse_stream.rs | 12 +
+ third_party/rust/syn/tests/test_pat.rs | 27 +-
+ third_party/rust/syn/tests/test_path.rs | 52 +
+ third_party/rust/syn/tests/test_precedence.rs | 196 +-
+ third_party/rust/syn/tests/test_receiver.rs | 127 +
+ third_party/rust/syn/tests/test_round_trip.rs | 41 +-
+ third_party/rust/syn/tests/test_shebang.rs | 59 +
+ .../rust/syn/tests/test_should_parse.rs | 4 -
+ third_party/rust/syn/tests/test_size.rs | 2 -
+ third_party/rust/syn/tests/test_stmt.rs | 44 +
+ .../rust/syn/tests/test_token_trees.rs | 12 +-
+ third_party/rust/syn/tests/test_ty.rs | 53 +
+ third_party/rust/syn/tests/test_visibility.rs | 145 +
+ third_party/rust/syn/tests/zzz_stable.rs | 4 +-
+ 103 files changed, 17319 insertions(+), 5831 deletions(-)
+ create mode 100644 third_party/rust/proc-macro2/src/detection.rs
+ create mode 100644 third_party/rust/proc-macro2/src/marker.rs
+ create mode 100644 third_party/rust/proc-macro2/src/parse.rs
+ delete mode 100644 third_party/rust/proc-macro2/src/strnom.rs
+ create mode 100644 third_party/rust/proc-macro2/tests/comments.rs
+ create mode 100644 third_party/rust/proc-macro2/tests/test_fmt.rs
+ create mode 100644 third_party/rust/syn/src/gen/clone.rs
+ create mode 100644 third_party/rust/syn/src/gen/debug.rs
+ create mode 100644 third_party/rust/syn/src/gen/eq.rs
+ create mode 100644 third_party/rust/syn/src/gen/hash.rs
+ delete mode 100644 third_party/rust/syn/src/keyword.rs
+ create mode 100644 third_party/rust/syn/src/reserved.rs
+ create mode 100644 third_party/rust/syn/src/verbatim.rs
+ create mode 100644 third_party/rust/syn/src/whitespace.rs
+ delete mode 100755 third_party/rust/syn/tests/clone.sh
+ delete mode 100644 third_party/rust/syn/tests/features/error.rs
+ delete mode 100644 third_party/rust/syn/tests/features/mod.rs
+ create mode 100644 third_party/rust/syn/tests/repo/progress.rs
+ create mode 100644 third_party/rust/syn/tests/test_item.rs
+ create mode 100644 third_party/rust/syn/tests/test_parse_stream.rs
+ create mode 100644 third_party/rust/syn/tests/test_path.rs
+ create mode 100644 third_party/rust/syn/tests/test_receiver.rs
+ create mode 100644 third_party/rust/syn/tests/test_shebang.rs
+ create mode 100644 third_party/rust/syn/tests/test_stmt.rs
+ create mode 100644 third_party/rust/syn/tests/test_ty.rs
+ create mode 100644 third_party/rust/syn/tests/test_visibility.rs
+
+diff --git a/Cargo.lock b/Cargo.lock
+index 19117e8368..d5fe0f6457 100644
+--- mozilla-release/Cargo.lock
++++ mozilla-release/Cargo.lock
+@@ -3717,9 +3717,9 @@ dependencies = [
+
+ [[package]]
+ name = "proc-macro2"
+-version = "1.0.5"
++version = "1.0.24"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
++checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+ dependencies = [
+ "unicode-xid",
+ ]
+@@ -4647,9 +4647,9 @@ dependencies = [
+
+ [[package]]
+ name = "syn"
+-version = "1.0.5"
++version = "1.0.40"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
++checksum = "963f7d3cc59b59b9325165add223142bbf1df27655d07789f109896d353d8350"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+diff --git a/third_party/rust/lucet-wasi/.cargo-checksum.json b/third_party/rust/lucet-wasi/.cargo-checksum.json
+index 229fc9978c..2c8c0a3c22 100644
+--- mozilla-release/third_party/rust/lucet-wasi/.cargo-checksum.json
++++ mozilla-release/third_party/rust/lucet-wasi/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{"Cargo.toml":"fea1408a1c1b1e84b06044a0b12cb26c8fd3253ca124debb6cd3e4faab48fcbd","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE.cloudabi-utils":"86a34251f0aab76b7dc3daf8d252afbdf481ea94aa5b46d020205178b7e2eac1","LICENSE.wasmtime":"a6c48161a09acc75a0e25503bab66a731eb5fba5392ed4bb4743e4ba5085327a","bindings.json":"fad8362f845e6f7a2af1d7547cee5730894e7b96804f338181fc070ffdcfae1e","build.rs":"593173ad03963afcbef43f1843be6f04cde1df3eae0298ca20bf881019dd350a","examples/.gitignore":"44575cf5b28512d75644bf54a517dcef304ff809fd511747621b4d64f19aac66","examples/Makefile":"d2d2ceeb1bc4435189ea9a2710b6f5f5331ce6aa73ae8a4f4edcca215058a9b4","examples/README.md":"f2a5be6cc88d511c9f4d3bfefdd42dcb2ace813bc23f6a4430b6b543f7373341","examples/hello.c":"9cbc0d3173e02309e15372835fa849d196b2a202d81806fea60378e1878d0c53","examples/pseudoquine.c":"8fd696f8e1b8fb86188564a05f4776875ead31d785a12e3aa4af9d9c1b46d5b5","include/lucet_wasi.h":"497f712c64f753ebdf73ab05b0b340d50094f9c59bb8637ccbf99d895cd20966","src/bindings.rs":"edbeb51d1a93fd31039ee1f1dc7c1b6c0bded2cf5dad10039e8b7da81a4d4a12","src/c_api.rs":"a9c73070a88a461882a28e3e2adfd773f569b964c7ffabde39a3cef907782f71","src/ctx.rs":"578f87c35cce12eaebec95d03e31954c3e6cd0afa214a0fec068f03814eb0cc7","src/fdentry.rs":"94a8480fa587e5586327dfd6b66d8a6a3ef1f8091ba8deb335bf45642f4f98e6","src/host.rs":"6f05f8fea2afed827abfc3c008a5854a8023d91d066580ecfb49e5c8036ef3a3","src/hostcalls/fs.rs":"4726e6f695f7d1d4e371ec52c57f4e36b0ba0d2302fc008b21a301f5fd7a5c97","src/hostcalls/fs_helpers.rs":"474bce0a1f15fa23b0b0b8aa83143d993dd2cbd7cdfc38c118d452d04e80caea","src/hostcalls/misc.rs":"83d087891d92af08cfa2d2e0c5f41cc47cb8219460f6dbcc8666b418dfef206e","src/hostcalls/mod.rs":"4c5d3f65c69503e11e647770879026c37c0e5e01a99b7116c8fb9411b4797187","src/hostcalls/timers.rs":"e65d6a491256b5d6051b6816f6c5049ba3cdc6142651bac81f34d659c1c2a104","src/lib.rs":"5554e1a3f0cd3756173ece6435a0d01b2f520b3401cd5fc33180a04fb9f69bbe","src/memory.rs":"0a09026b15d27f99d74e560cd94795f645cba414a8491bc961987fab9d9da69b","src/wasi_host.rs":"cacbdac28304a837b11e5ad400ae9de3ee79c0284be335e64606ecdfe426ad6e","src/wasm32.rs":"13a5dc6e59784662f1e55eccb457cbbae241a96f70cfa72c41d55858ca05b980","tests/guests/cant_dotdot.c":"609b8cece9443e375a0b38a7e43651b179f66ee9c686edba6696fe1bcd45b111","tests/guests/clock_getres.c":"f5e41c0a2b05a8d7cdb5b4da6c8b6778b858004c1e9d115503c45a1d976be33b","tests/guests/duplicate_import.wat":"4bd8d7a5c1d1597dbe7648300e94e3fab84d7ab068d56cfb656aa1a208026cee","tests/guests/exitcode.c":"b7c5cec3ead0ed82326c568287a1f3398e71ae7e447ce49a3c4c7114c82495af","tests/guests/follow_symlink.c":"de3143ad2bbbfe834c0c32b54c9fcf144ca4eba5cdcf7588929e5f47225ab616","tests/guests/fs.c":"0dca5232ff5da1b7745e3b44bca39333c01a20ba4eae1a6a0a1c492c71ca1efa","tests/guests/getentropy.c":"5d80bcc68dcf3ba91576969055099d61635ae713c057b3cb36afb122a5f26347","tests/guests/getrusage.c":"8114c103b85eb564d9ab43684958bc1939de3794d314b7c121762f3a2f0434a6","tests/guests/gettimeofday.c":"4a57f376b06f4228017b82695448a0bd213fb91455f5301d689cd87fcff01f06","tests/guests/notdir.c":"bd8f8b24360b7cf8d5dced9d9ba4c15843fcbbae89fecc13e3a457c33a275e28","tests/guests/poll.c":"aefaa9b58ce9906dc379e0bd25fa68dfbf8cdffb48cd5ecde1d67708b83b366d","tests/guests/preopen_populates.c":"f186e4eb4aab6a1d9ec7bc5c49eaea6d9d162e0159dfe8f953bb48ade9b58d43","tests/guests/read_file.c":"1aab9393f005f05b69592826d7c4d384a115d5bca42c66f10a901811b4b1dcac","tests/guests/read_file_twice.c":"04a3dad7a43b93e36efd4e2c822c11b3f129429ec799af304d82b358686c578a","tests/guests/stat.c":"02756933ea7d4337b4fa04344b32968851b02f9d0bd5ea1cb0e2f022e8c65ab0","tests/guests/stdin.c":"66efc4b54f68d1138046f1afefae15f7d4555b2904b4a988818e61e67fe8fefb","tests/guests/symlink_escape.c":"686e047b5c986e29c854bcd93996d027dcdc8721219fa9fa532efc98d2798f5c","tests/guests/symlink_loop.c":"2bbddf3a5edfc6e5f3c0fa82cee4ac92b18804810509e263abd17f5240cd37e5","tests/guests/write_file.c":"9e9b14552c2445cfa6d0aa26b334081a59e6e3428dbb17ceca005a9ba59d3220","tests/test_helpers/mod.rs":"bc18194317611fe1be5c439a7a9e0de75399555c3b6de4275af149fb180456c8","tests/tests.rs":"173a7e0f086f6ed46474686cc3413ee68bbd2ff67004f7790e963a1392c7c46e"},"package":null}
+\ No newline at end of file
++{"files":{"Cargo.toml":"fea1408a1c1b1e84b06044a0b12cb26c8fd3253ca124debb6cd3e4faab48fcbd","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE.cloudabi-utils":"86a34251f0aab76b7dc3daf8d252afbdf481ea94aa5b46d020205178b7e2eac1","LICENSE.wasmtime":"a6c48161a09acc75a0e25503bab66a731eb5fba5392ed4bb4743e4ba5085327a","bindings.json":"fad8362f845e6f7a2af1d7547cee5730894e7b96804f338181fc070ffdcfae1e","build.rs":"593173ad03963afcbef43f1843be6f04cde1df3eae0298ca20bf881019dd350a","examples/Makefile":"d2d2ceeb1bc4435189ea9a2710b6f5f5331ce6aa73ae8a4f4edcca215058a9b4","examples/README.md":"f2a5be6cc88d511c9f4d3bfefdd42dcb2ace813bc23f6a4430b6b543f7373341","examples/hello.c":"9cbc0d3173e02309e15372835fa849d196b2a202d81806fea60378e1878d0c53","examples/pseudoquine.c":"8fd696f8e1b8fb86188564a05f4776875ead31d785a12e3aa4af9d9c1b46d5b5","include/lucet_wasi.h":"497f712c64f753ebdf73ab05b0b340d50094f9c59bb8637ccbf99d895cd20966","src/bindings.rs":"edbeb51d1a93fd31039ee1f1dc7c1b6c0bded2cf5dad10039e8b7da81a4d4a12","src/c_api.rs":"a9c73070a88a461882a28e3e2adfd773f569b964c7ffabde39a3cef907782f71","src/ctx.rs":"578f87c35cce12eaebec95d03e31954c3e6cd0afa214a0fec068f03814eb0cc7","src/fdentry.rs":"94a8480fa587e5586327dfd6b66d8a6a3ef1f8091ba8deb335bf45642f4f98e6","src/host.rs":"6f05f8fea2afed827abfc3c008a5854a8023d91d066580ecfb49e5c8036ef3a3","src/hostcalls/fs.rs":"4726e6f695f7d1d4e371ec52c57f4e36b0ba0d2302fc008b21a301f5fd7a5c97","src/hostcalls/fs_helpers.rs":"474bce0a1f15fa23b0b0b8aa83143d993dd2cbd7cdfc38c118d452d04e80caea","src/hostcalls/misc.rs":"83d087891d92af08cfa2d2e0c5f41cc47cb8219460f6dbcc8666b418dfef206e","src/hostcalls/mod.rs":"4c5d3f65c69503e11e647770879026c37c0e5e01a99b7116c8fb9411b4797187","src/hostcalls/timers.rs":"e65d6a491256b5d6051b6816f6c5049ba3cdc6142651bac81f34d659c1c2a104","src/lib.rs":"5554e1a3f0cd3756173ece6435a0d01b2f520b3401cd5fc33180a04fb9f69bbe","src/memory.rs":"0a09026b15d27f99d74e560cd94795f645cba414a8491bc961987fab9d9da69b","src/wasi_host.rs":"cacbdac28304a837b11e5ad400ae9de3ee79c0284be335e64606ecdfe426ad6e","src/wasm32.rs":"13a5dc6e59784662f1e55eccb457cbbae241a96f70cfa72c41d55858ca05b980","tests/guests/cant_dotdot.c":"609b8cece9443e375a0b38a7e43651b179f66ee9c686edba6696fe1bcd45b111","tests/guests/clock_getres.c":"f5e41c0a2b05a8d7cdb5b4da6c8b6778b858004c1e9d115503c45a1d976be33b","tests/guests/duplicate_import.wat":"4bd8d7a5c1d1597dbe7648300e94e3fab84d7ab068d56cfb656aa1a208026cee","tests/guests/exitcode.c":"b7c5cec3ead0ed82326c568287a1f3398e71ae7e447ce49a3c4c7114c82495af","tests/guests/follow_symlink.c":"de3143ad2bbbfe834c0c32b54c9fcf144ca4eba5cdcf7588929e5f47225ab616","tests/guests/fs.c":"0dca5232ff5da1b7745e3b44bca39333c01a20ba4eae1a6a0a1c492c71ca1efa","tests/guests/getentropy.c":"5d80bcc68dcf3ba91576969055099d61635ae713c057b3cb36afb122a5f26347","tests/guests/getrusage.c":"8114c103b85eb564d9ab43684958bc1939de3794d314b7c121762f3a2f0434a6","tests/guests/gettimeofday.c":"4a57f376b06f4228017b82695448a0bd213fb91455f5301d689cd87fcff01f06","tests/guests/notdir.c":"bd8f8b24360b7cf8d5dced9d9ba4c15843fcbbae89fecc13e3a457c33a275e28","tests/guests/poll.c":"aefaa9b58ce9906dc379e0bd25fa68dfbf8cdffb48cd5ecde1d67708b83b366d","tests/guests/preopen_populates.c":"f186e4eb4aab6a1d9ec7bc5c49eaea6d9d162e0159dfe8f953bb48ade9b58d43","tests/guests/read_file.c":"1aab9393f005f05b69592826d7c4d384a115d5bca42c66f10a901811b4b1dcac","tests/guests/read_file_twice.c":"04a3dad7a43b93e36efd4e2c822c11b3f129429ec799af304d82b358686c578a","tests/guests/stat.c":"02756933ea7d4337b4fa04344b32968851b02f9d0bd5ea1cb0e2f022e8c65ab0","tests/guests/stdin.c":"66efc4b54f68d1138046f1afefae15f7d4555b2904b4a988818e61e67fe8fefb","tests/guests/symlink_escape.c":"686e047b5c986e29c854bcd93996d027dcdc8721219fa9fa532efc98d2798f5c","tests/guests/symlink_loop.c":"2bbddf3a5edfc6e5f3c0fa82cee4ac92b18804810509e263abd17f5240cd37e5","tests/guests/write_file.c":"9e9b14552c2445cfa6d0aa26b334081a59e6e3428dbb17ceca005a9ba59d3220","tests/test_helpers/mod.rs":"bc18194317611fe1be5c439a7a9e0de75399555c3b6de4275af149fb180456c8","tests/tests.rs":"173a7e0f086f6ed46474686cc3413ee68bbd2ff67004f7790e963a1392c7c46e"},"package":null}
+\ No newline at end of file
+diff --git a/third_party/rust/packed_simd/.cargo-checksum.json b/third_party/rust/packed_simd/.cargo-checksum.json
+index 01afcc1efd..c727a10006 100644
+--- mozilla-release/third_party/rust/packed_simd/.cargo-checksum.json
++++ mozilla-release/third_party/rust/packed_simd/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"e9258d9a54fdaf4cbc12405fe5993ac4497eb2b29021691dbc91b19cb9b52227","Cargo.toml":"089941ba3c89ea111cbea3cc3abdcdcf2b9d0ae0db268d7269ee38226db950e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"f3baefc5e5bb9b250e762a1466371b922fd7ee4243c217b2d014307603c2f57a","ci/all.sh":"a23d14e10cb26a0eb719e389c30eb955fa53cddcd436890646df09af640bd2eb","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"1ecdac757101d951794fb2ab0deaa278199cf25f2e08a15c7d40ff31a8556184","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"e25d88f6c0c94aada3d2e3f08243f755feb7e869dc5dc505b3799719cb1af591","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"f126f4c7bae8c11ab8b16df06ad997863f0838825a9c08c9899a3eedb6d570bd","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"b647545c158ee480a4c581dbdc1f57833aef056c8d498acc04b573e842bf803c","ci/docker/i586-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/i686-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/mips-unknown-linux-gnu/Dockerfile":"323776469bb7b160385f3621d66e3ee14c75242f8180f916e65af048a29d4ea0","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"c647f6948a9a43b0be695cbed4eac752120d0faf28e5e69c718cb10406921dab","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"77bfd00cc8639509be381b394f077e39b45a00158ad61b4e1656714c714665d1","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"ec5bea6c98a3b626731fdb95f9ff2d1182639c76e8fb16d3271d0fc884901524","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"4f2b662de66e83d1354f650b7077692309637f786c2ea5516c31b5c2ee10af2d","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"a9595402b772bc365982e22a0096a8988825d90b09b5faa97ab192e76072f71d","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"df3c381c157439695ae8cd10ab71664702c061e3b4ab22906a5ad6c2680acfed","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"75c0c56161c7382b439de74c00de1c0e3dc9d59560cd6720976a751034b78714","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"d253c86803b22da428fa9cc671a05f18d3318eca7733b8dccb4f7be1ddf524c5","ci/dox.sh":"5b61711be47a4e3dde0ddd15ba73d256ea95fd75af3897732c24db1dc7e66366","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"63259e22a96ba539f53c06b1b39f53e3a78a71171652e7afc170836110ccd913","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"73fb981a8fdb1dcd54409d3c0fbbfb8f77a3ceabf8626a6b9bf9d21d6bc8ce72","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","readme.md":"585a8f0e16877fb9abb00cd17a175fcb9d7857840c6c61209f1827ffab095070","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"331a3a4abb19cee2df5f2df4ad7c3e88b45e62cf23fdacfc9bbaa633dc5cf788","src/api/bit_manip.rs":"e68290ee679cc5abc9c73afbe635c1035f8cbfe849e5c751a1680e459244c39e","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"63e28c6a3edf1a7a635f51b8d3c6adbb1d46f884d92a196b3d4a6e743d809416","src/api/cast/v16.rs":"2a584eeb57fd47baad6f3533764301b04aaaac23702b7a8db12598ac02899262","src/api/cast/v256.rs":"b91c15ed8d1536ecd97b4eb79ff9d5aba0552cd9b6f0ea6435b05f2273e23b3a","src/api/cast/v32.rs":"62ec89fcce7fa7f28497ee5770adc8f81d2d3a6b2925b02f7dc06504c40e8f38","src/api/cast/v512.rs":"d855cb943ae7106e9599ef38e30a3afb1c6bd5433178baca54cb128fd9a7d143","src/api/cast/v64.rs":"fe0f7dfaf4fc0c0c1a78c96fcfcdfdc2a1e2845843b11aa797a0c6fb52a8f774","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"b61f92fc0e33a2633b3375eb405beba480da071cde03df4d437d8a6058afcd97","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"4151593c7bba7455821fffa5b59867005a77c95d32f1f0cc3fd87294000157d9","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"562cfa3f1d8eb9a733c035a3665a599c2f1e341ee820d8fbdd102a4398a441bc","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"1f925390b0ce7132587d95f2419c6e2ad3e1a9d17eb1d9c120a1c1c4bdf4277e","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"ecdc5893664c71d7ab1ff3697c3fbe490d20d8748b9b76881d05e7625e40d74c","src/api/into_bits/v16.rs":"5459ec7dad1ad7bd30dc7e48374580b993abf23701d9c3cb22203fa0a9aabb6d","src/api/into_bits/v256.rs":"90ea351da0380ead1bf0f63b620afd40d01d638d09f7e7be31840bd2c1d9c663","src/api/into_bits/v32.rs":"ee1dc5a430050e16f51154b5fe85b1536f5feddf2ea23dd1d3859b67c4afc6fc","src/api/into_bits/v512.rs":"f72098ed1c9a23944f3d01abaf5e0f2d0e81d35a06fdadd2183e896d41b59867","src/api/into_bits/v64.rs":"6394462facdfe7827349c742b7801f1291e75a720dfb8c0b52100df46f371c98","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"c501a6696950cf5e521765f178de548af64fdfb6e10d026616d09fab93ca2d17","src/api/minimal/mask.rs":"42e415f536c5193d0218f5a754b34b87fd7c971bff068009f958712166ff056d","src/api/minimal/ptr.rs":"a9ee482d1dd1c956fb8f3f179e6e620b1de4e9d713961461d4c6923a4ef2e67c","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"f5155dce75219f4ba11275b1f295d2fdcddd49d174a6f1fb2ace7ea42813ce41","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"9ddd960365e050674b25b2fd3116e24d94669b4375d74e71c03e3f1469576066","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"e58c8c87806a95df2b2b5b48ac5991036df024096d9d7c171a480fe9282896a4","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"f27be3aa28e1c1f46de7890198db6e12f00c207085e89ef2de7e57ee443cdb98","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"4d4fe8a329c885fcb4fbcbedf99efb15a95296fe6b3f595056cc37037450d5ac","src/api/slice/write_to_slice.rs":"f5b23b2c4b91cfb26b713a9013a6c0da7f45eaefb79ba06dcbc27f3f23bda679","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"c6eebc3d3665420aa6a2f317977e3c41a4f43e0550ac630cdbe8e4bbed5e2031","src/codegen/bit_manip.rs":"5559e095105a80003e0de35af1d19b0c65c9ab04eb743c7e01c5442d882eb34e","src/codegen/llvm.rs":"d1299c189abb17a6133f047574cffc7a6db4c1be37cb7d4785491cb5e8f8cf54","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"14bd2c482071f2355beebcf7b7ecf950ff2dfcdb08c3ca50993092434a9de717","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"226610b4ff88c676d5187114dd57b4a8800de6ce40884675e9198445b1ed0306","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"0abca97e92cdce49a58a39cc447eb09dc7d7715ef256c8dbd2181a186e61bb64","src/codegen/shuffle1_dyn.rs":"04523e9338133bdedb012dd076c2c564b79ce5593b0fc56d0fb6910e04190a81","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"96d609a9eece4dcbbcc01ba0b8744d7f5958be12774176a2945bc676f4e6b5cb","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"1b5d419ff05ee0370d671810423ccc254708cc8d415c1dbac2a7a36be4bf63a8","src/masks.rs":"870f429967b2d7d5133f4d28d6c753fc5cef0570b27b29d4e966a066d22d2d0e","src/sealed.rs":"ff7f0324276408ae8249941cfa32c90b8835a54d750896b683efea857af19db2","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"d6fd5a5017f1f85d9d99585754f8f6ad06fc3d683b34083543e67a7cc6c1772c","src/v128.rs":"18fe263c4aa28cd06461c7070b0269f69f4a2e75749b8f142a83dfdfe4d22bf5","src/v16.rs":"e5c663c9fb3547eaeac78a5f7db9969f4d8b5ec96112bf2954602fff11f0aebd","src/v256.rs":"68732cd688ad12a56d8b4f8ddf279f77bdfe1be2943c7dc0c1b4f1a76798aa0f","src/v32.rs":"785b22a1ccb4a41bb53dfeb0670f624c0ce42e6cdf62d1747e3283777a1c70bd","src/v512.rs":"d1337bfe07f06a8f37f8e8fa7d4315b9307476ee435ad80dd5269eaed564fbfa","src/v64.rs":"3077468d65125b8f085e9454c8b2463a4d5225697464ba6a1300f8799528fd4b","src/vPtr.rs":"c9a53f41f466e17b6648a4ce390fd8f4d3a848d440eb8a9a803a11608d76eb05","src/vSize.rs":"5c46d3e8c3ee5863d9b6e37e681f871386e0efc254d6d84ba711edb529ce7b3c","tests/endianness.rs":"541a144be017e3dd7da7c8ea49d907dc02538245e8c5f3deb5bd43da92c929e1"},"package":null}
+\ No newline at end of file
++{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"e9258d9a54fdaf4cbc12405fe5993ac4497eb2b29021691dbc91b19cb9b52227","Cargo.toml":"089941ba3c89ea111cbea3cc3abdcdcf2b9d0ae0db268d7269ee38226db950e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"f3baefc5e5bb9b250e762a1466371b922fd7ee4243c217b2d014307603c2f57a","ci/all.sh":"a23d14e10cb26a0eb719e389c30eb955fa53cddcd436890646df09af640bd2eb","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"1ecdac757101d951794fb2ab0deaa278199cf25f2e08a15c7d40ff31a8556184","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"e25d88f6c0c94aada3d2e3f08243f755feb7e869dc5dc505b3799719cb1af591","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"f126f4c7bae8c11ab8b16df06ad997863f0838825a9c08c9899a3eedb6d570bd","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"b647545c158ee480a4c581dbdc1f57833aef056c8d498acc04b573e842bf803c","ci/docker/i586-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/i686-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/mips-unknown-linux-gnu/Dockerfile":"323776469bb7b160385f3621d66e3ee14c75242f8180f916e65af048a29d4ea0","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"c647f6948a9a43b0be695cbed4eac752120d0faf28e5e69c718cb10406921dab","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"77bfd00cc8639509be381b394f077e39b45a00158ad61b4e1656714c714665d1","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"ec5bea6c98a3b626731fdb95f9ff2d1182639c76e8fb16d3271d0fc884901524","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"4f2b662de66e83d1354f650b7077692309637f786c2ea5516c31b5c2ee10af2d","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"a9595402b772bc365982e22a0096a8988825d90b09b5faa97ab192e76072f71d","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"df3c381c157439695ae8cd10ab71664702c061e3b4ab22906a5ad6c2680acfed","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"75c0c56161c7382b439de74c00de1c0e3dc9d59560cd6720976a751034b78714","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"d253c86803b22da428fa9cc671a05f18d3318eca7733b8dccb4f7be1ddf524c5","ci/dox.sh":"5b61711be47a4e3dde0ddd15ba73d256ea95fd75af3897732c24db1dc7e66366","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"63259e22a96ba539f53c06b1b39f53e3a78a71171652e7afc170836110ccd913","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"73fb981a8fdb1dcd54409d3c0fbbfb8f77a3ceabf8626a6b9bf9d21d6bc8ce72","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","readme.md":"585a8f0e16877fb9abb00cd17a175fcb9d7857840c6c61209f1827ffab095070","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"331a3a4abb19cee2df5f2df4ad7c3e88b45e62cf23fdacfc9bbaa633dc5cf788","src/api/bit_manip.rs":"e68290ee679cc5abc9c73afbe635c1035f8cbfe849e5c751a1680e459244c39e","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"63e28c6a3edf1a7a635f51b8d3c6adbb1d46f884d92a196b3d4a6e743d809416","src/api/cast/v16.rs":"2a584eeb57fd47baad6f3533764301b04aaaac23702b7a8db12598ac02899262","src/api/cast/v256.rs":"b91c15ed8d1536ecd97b4eb79ff9d5aba0552cd9b6f0ea6435b05f2273e23b3a","src/api/cast/v32.rs":"62ec89fcce7fa7f28497ee5770adc8f81d2d3a6b2925b02f7dc06504c40e8f38","src/api/cast/v512.rs":"d855cb943ae7106e9599ef38e30a3afb1c6bd5433178baca54cb128fd9a7d143","src/api/cast/v64.rs":"fe0f7dfaf4fc0c0c1a78c96fcfcdfdc2a1e2845843b11aa797a0c6fb52a8f774","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"b61f92fc0e33a2633b3375eb405beba480da071cde03df4d437d8a6058afcd97","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"4151593c7bba7455821fffa5b59867005a77c95d32f1f0cc3fd87294000157d9","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"562cfa3f1d8eb9a733c035a3665a599c2f1e341ee820d8fbdd102a4398a441bc","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"1f925390b0ce7132587d95f2419c6e2ad3e1a9d17eb1d9c120a1c1c4bdf4277e","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"ecdc5893664c71d7ab1ff3697c3fbe490d20d8748b9b76881d05e7625e40d74c","src/api/into_bits/v16.rs":"5459ec7dad1ad7bd30dc7e48374580b993abf23701d9c3cb22203fa0a9aabb6d","src/api/into_bits/v256.rs":"90ea351da0380ead1bf0f63b620afd40d01d638d09f7e7be31840bd2c1d9c663","src/api/into_bits/v32.rs":"ee1dc5a430050e16f51154b5fe85b1536f5feddf2ea23dd1d3859b67c4afc6fc","src/api/into_bits/v512.rs":"f72098ed1c9a23944f3d01abaf5e0f2d0e81d35a06fdadd2183e896d41b59867","src/api/into_bits/v64.rs":"6394462facdfe7827349c742b7801f1291e75a720dfb8c0b52100df46f371c98","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"c501a6696950cf5e521765f178de548af64fdfb6e10d026616d09fab93ca2d17","src/api/minimal/mask.rs":"42e415f536c5193d0218f5a754b34b87fd7c971bff068009f958712166ff056d","src/api/minimal/ptr.rs":"a9ee482d1dd1c956fb8f3f179e6e620b1de4e9d713961461d4c6923a4ef2e67c","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"f5155dce75219f4ba11275b1f295d2fdcddd49d174a6f1fb2ace7ea42813ce41","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"9ddd960365e050674b25b2fd3116e24d94669b4375d74e71c03e3f1469576066","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"e58c8c87806a95df2b2b5b48ac5991036df024096d9d7c171a480fe9282896a4","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"f27be3aa28e1c1f46de7890198db6e12f00c207085e89ef2de7e57ee443cdb98","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"4d4fe8a329c885fcb4fbcbedf99efb15a95296fe6b3f595056cc37037450d5ac","src/api/slice/write_to_slice.rs":"f5b23b2c4b91cfb26b713a9013a6c0da7f45eaefb79ba06dcbc27f3f23bda679","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"c6eebc3d3665420aa6a2f317977e3c41a4f43e0550ac630cdbe8e4bbed5e2031","src/codegen/bit_manip.rs":"5559e095105a80003e0de35af1d19b0c65c9ab04eb743c7e01c5442d882eb34e","src/codegen/llvm.rs":"d1299c189abb17a6133f047574cffc7a6db4c1be37cb7d4785491cb5e8f8cf54","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"14bd2c482071f2355beebcf7b7ecf950ff2dfcdb08c3ca50993092434a9de717","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"226610b4ff88c676d5187114dd57b4a8800de6ce40884675e9198445b1ed0306","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"0abca97e92cdce49a58a39cc447eb09dc7d7715ef256c8dbd2181a186e61bb64","src/codegen/shuffle1_dyn.rs":"04523e9338133bdedb012dd076c2c564b79ce5593b0fc56d0fb6910e04190a81","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"96d609a9eece4dcbbcc01ba0b8744d7f5958be12774176a2945bc676f4e6b5cb","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"1b5d419ff05ee0370d671810423ccc254708cc8d415c1dbac2a7a36be4bf63a8","src/masks.rs":"870f429967b2d7d5133f4d28d6c753fc5cef0570b27b29d4e966a066d22d2d0e","src/sealed.rs":"ff7f0324276408ae8249941cfa32c90b8835a54d750896b683efea857af19db2","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"d6fd5a5017f1f85d9d99585754f8f6ad06fc3d683b34083543e67a7cc6c1772c","src/v128.rs":"18fe263c4aa28cd06461c7070b0269f69f4a2e75749b8f142a83dfdfe4d22bf5","src/v16.rs":"e5c663c9fb3547eaeac78a5f7db9969f4d8b5ec96112bf2954602fff11f0aebd","src/v256.rs":"68732cd688ad12a56d8b4f8ddf279f77bdfe1be2943c7dc0c1b4f1a76798aa0f","src/v32.rs":"785b22a1ccb4a41bb53dfeb0670f624c0ce42e6cdf62d1747e3283777a1c70bd","src/v512.rs":"d1337bfe07f06a8f37f8e8fa7d4315b9307476ee435ad80dd5269eaed564fbfa","src/v64.rs":"3077468d65125b8f085e9454c8b2463a4d5225697464ba6a1300f8799528fd4b","src/vPtr.rs":"c9a53f41f466e17b6648a4ce390fd8f4d3a848d440eb8a9a803a11608d76eb05","src/vSize.rs":"5c46d3e8c3ee5863d9b6e37e681f871386e0efc254d6d84ba711edb529ce7b3c","tests/endianness.rs":"541a144be017e3dd7da7c8ea49d907dc02538245e8c5f3deb5bd43da92c929e1"},"package":null}
+\ No newline at end of file
+diff --git a/third_party/rust/proc-macro2/.cargo-checksum.json b/third_party/rust/proc-macro2/.cargo-checksum.json
+index eeef4120af..e7849f2896 100644
+--- mozilla-release/third_party/rust/proc-macro2/.cargo-checksum.json
++++ mozilla-release/third_party/rust/proc-macro2/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{"Cargo.toml":"e2c1fc6ed317eeef8462fcd192f6b6389e1d84f0d7afeac78f12c23903deddf8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"362a2156f7645528061b6e8487a2eb0f32f1693012ed82ee57afa05c039bba0d","build.rs":"0cc6e2cb919ddbff59cf1d810283939f97a59f0037540c0f2ee3453237635ff8","src/fallback.rs":"5c6379a90735e27abcc40253b223158c6b1e5784f3850bc423335363e87ef038","src/lib.rs":"ae5251296ad3fcd8b600919a993fec0afd8b56da3e11fef6bc7265b273129936","src/strnom.rs":"37f7791f73f123817ad5403af1d4e2a0714be27401729a2d451bc80b1f26bac9","src/wrapper.rs":"81372e910604217a625aa71c47d43e65f4e008456eae93ac39325c9abf10701a","tests/features.rs":"a86deb8644992a4eb64d9fd493eff16f9cf9c5cb6ade3a634ce0c990cf87d559","tests/marker.rs":"c2652e3ae1dfcb94d2e6313b29712c5dcbd0fe62026913e67bb7cebd7560aade","tests/test.rs":"8c427be9cba1fa8d4a16647e53e3545e5863e29e2c0b311c93c9dd1399abf6a1"},"package":"90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"302d447d62c8d091d6241cf62bdad607c0d4ed8ff9f43d9b254c9d99c253ee8e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"e1f9d4fc22cff2c049f166a403b41458632a94357890d31cf0e3ad83807fb430","build.rs":"a71283fbc495095eebbbf46753df3fe2c19505c745b508dea157f65796b64dd7","src/detection.rs":"9d25d896889e65330858f2d6f6223c1b98cd1dad189813ad4161ff189fbda2b8","src/fallback.rs":"b114e013695260f6066395c8712cea112ec2a386010397a80f15a60f8b986444","src/lib.rs":"7f528764a958587f007f0c2a330a6a414bae2c8e73d5ed9fb64ff1b42b1805b1","src/marker.rs":"87fce2d0357f5b7998b6d9dfb064f4a0cbc9dabb19e33d4b514a446243ebe2e8","src/parse.rs":"1d2253eacbd40eb3a2a933be2adcee356af922bdb48cc89ff266252a41fd98a1","src/wrapper.rs":"f52646ce1705c1f6265516f30d4c43297b5f529dd31fb91f4c806be89d5a4122","tests/comments.rs":"ea6cbe6f4c8852e6a0612893c7d4f2c144a2e6a134a6c3db641a320cbfc3c800","tests/features.rs":"a86deb8644992a4eb64d9fd493eff16f9cf9c5cb6ade3a634ce0c990cf87d559","tests/marker.rs":"652db9f25c69ffc65baa60cdca8f195aa2e254d4de0a9ddc85de4dc2470544b6","tests/test.rs":"5f30a704eeb2b9198b57f416d622da72d25cb9bf8d8b12e6d0e90aa2cb0e43fc","tests/test_fmt.rs":"745dfdc41d09c5308c221395eb43f2041f0a1413d2927a813bc2ad4554438fe2"},"package":"1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"}
+\ No newline at end of file
+diff --git a/third_party/rust/proc-macro2/Cargo.toml b/third_party/rust/proc-macro2/Cargo.toml
+index 95d653633d..22150c516a 100644
+--- mozilla-release/third_party/rust/proc-macro2/Cargo.toml
++++ mozilla-release/third_party/rust/proc-macro2/Cargo.toml
+@@ -13,21 +13,22 @@
+ [package]
+ edition = "2018"
+ name = "proc-macro2"
+-version = "1.0.5"
+-authors = ["Alex Crichton <alex@alexcrichton.com>"]
+-description = "A stable implementation of the upcoming new `proc_macro` API. Comes with an\noption, off by default, to also reimplement itself in terms of the upstream\nunstable API.\n"
+-homepage = "https://github.com/alexcrichton/proc-macro2"
++version = "1.0.24"
++authors = ["Alex Crichton <alex@alexcrichton.com>", "David Tolnay <dtolnay@gmail.com>"]
++description = "A substitute implementation of the compiler's `proc_macro` API to decouple\ntoken-based libraries from the procedural macro use case.\n"
+ documentation = "https://docs.rs/proc-macro2"
+ readme = "README.md"
+ keywords = ["macros"]
++categories = ["development-tools::procedural-macro-helpers"]
+ license = "MIT OR Apache-2.0"
+ repository = "https://github.com/alexcrichton/proc-macro2"
+ [package.metadata.docs.rs]
+ rustc-args = ["--cfg", "procmacro2_semver_exempt"]
+ rustdoc-args = ["--cfg", "procmacro2_semver_exempt"]
++targets = ["x86_64-unknown-linux-gnu"]
+
+-[lib]
+-name = "proc_macro2"
++[package.metadata.playground]
++features = ["span-locations"]
+ [dependencies.unicode-xid]
+ version = "0.2"
+ [dev-dependencies.quote]
+@@ -39,5 +40,3 @@ default = ["proc-macro"]
+ nightly = []
+ proc-macro = []
+ span-locations = []
+-[badges.travis-ci]
+-repository = "alexcrichton/proc-macro2"
+diff --git a/third_party/rust/proc-macro2/README.md b/third_party/rust/proc-macro2/README.md
+index 19b0c3b5f8..3d05e871a7 100644
+--- mozilla-release/third_party/rust/proc-macro2/README.md
++++ mozilla-release/third_party/rust/proc-macro2/README.md
+@@ -1,6 +1,6 @@
+ # proc-macro2
+
+-[![Build Status](https://api.travis-ci.com/alexcrichton/proc-macro2.svg?branch=master)](https://travis-ci.com/alexcrichton/proc-macro2)
++[![Build Status](https://img.shields.io/github/workflow/status/alexcrichton/proc-macro2/build%20and%20test)](https://github.com/alexcrichton/proc-macro2/actions)
+ [![Latest Version](https://img.shields.io/crates/v/proc-macro2.svg)](https://crates.io/crates/proc-macro2)
+ [![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/proc-macro2)
+
+diff --git a/third_party/rust/proc-macro2/build.rs b/third_party/rust/proc-macro2/build.rs
+index deb9b92719..b247d874f6 100644
+--- mozilla-release/third_party/rust/proc-macro2/build.rs
++++ mozilla-release/third_party/rust/proc-macro2/build.rs
+@@ -14,6 +14,10 @@
+ // procmacro2_semver_exempt surface area is implemented by using the
+ // nightly-only proc_macro API.
+ //
++// "hygiene"
++// Enable Span::mixed_site() and non-dummy behavior of Span::resolved_at
++// and Span::located_at. Enabled on Rust 1.45+.
++//
+ // "proc_macro_span"
+ // Enable non-dummy behavior of Span::start and Span::end methods which
+ // requires an unstable compiler feature. Enabled when building with
+@@ -57,6 +61,22 @@ fn main() {
+ println!("cargo:rustc-cfg=span_locations");
+ }
+
++ if version.minor < 32 {
++ println!("cargo:rustc-cfg=no_libprocmacro_unwind_safe");
++ }
++
++ if version.minor < 39 {
++ println!("cargo:rustc-cfg=no_bind_by_move_pattern_guard");
++ }
++
++ if version.minor >= 44 {
++ println!("cargo:rustc-cfg=lexerror_display");
++ }
++
++ if version.minor >= 45 {
++ println!("cargo:rustc-cfg=hygiene");
++ }
++
+ let target = env::var("TARGET").unwrap();
+ if !enable_use_proc_macro(&target) {
+ return;
+diff --git a/third_party/rust/proc-macro2/src/detection.rs b/third_party/rust/proc-macro2/src/detection.rs
+new file mode 100644
+index 0000000000..c597bc99c6
+--- /dev/null
++++ mozilla-release/third_party/rust/proc-macro2/src/detection.rs
+@@ -0,0 +1,67 @@
++use std::panic::{self, PanicInfo};
++use std::sync::atomic::*;
++use std::sync::Once;
++
++static WORKS: AtomicUsize = AtomicUsize::new(0);
++static INIT: Once = Once::new();
++
++pub(crate) fn inside_proc_macro() -> bool {
++ match WORKS.load(Ordering::SeqCst) {
++ 1 => return false,
++ 2 => return true,
++ _ => {}
++ }
++
++ INIT.call_once(initialize);
++ inside_proc_macro()
++}
++
++pub(crate) fn force_fallback() {
++ WORKS.store(1, Ordering::SeqCst);
++}
++
++pub(crate) fn unforce_fallback() {
++ initialize();
++}
++
++// Swap in a null panic hook to avoid printing "thread panicked" to stderr,
++// then use catch_unwind to determine whether the compiler's proc_macro is
++// working. When proc-macro2 is used from outside of a procedural macro all
++// of the proc_macro crate's APIs currently panic.
++//
++// The Once is to prevent the possibility of this ordering:
++//
++// thread 1 calls take_hook, gets the user's original hook
++// thread 1 calls set_hook with the null hook
++// thread 2 calls take_hook, thinks null hook is the original hook
++// thread 2 calls set_hook with the null hook
++// thread 1 calls set_hook with the actual original hook
++// thread 2 calls set_hook with what it thinks is the original hook
++//
++// in which the user's hook has been lost.
++//
++// There is still a race condition where a panic in a different thread can
++// happen during the interval that the user's original panic hook is
++// unregistered such that their hook is incorrectly not called. This is
++// sufficiently unlikely and less bad than printing panic messages to stderr
++// on correct use of this crate. Maybe there is a libstd feature request
++// here. For now, if a user needs to guarantee that this failure mode does
++// not occur, they need to call e.g. `proc_macro2::Span::call_site()` from
++// the main thread before launching any other threads.
++fn initialize() {
++ type PanicHook = dyn Fn(&PanicInfo) + Sync + Send + 'static;
++
++ let null_hook: Box<PanicHook> = Box::new(|_panic_info| { /* ignore */ });
++ let sanity_check = &*null_hook as *const PanicHook;
++ let original_hook = panic::take_hook();
++ panic::set_hook(null_hook);
++
++ let works = panic::catch_unwind(proc_macro::Span::call_site).is_ok();
++ WORKS.store(works as usize + 1, Ordering::SeqCst);
++
++ let hopefully_null_hook = panic::take_hook();
++ panic::set_hook(original_hook);
++ if sanity_check != &*hopefully_null_hook {
++ panic!("observed race condition in proc_macro2::inside_proc_macro");
++ }
++}
+diff --git a/third_party/rust/proc-macro2/src/fallback.rs b/third_party/rust/proc-macro2/src/fallback.rs
+index fe582b3b5f..8900c5ff0f 100644
+--- mozilla-release/third_party/rust/proc-macro2/src/fallback.rs
++++ mozilla-release/third_party/rust/proc-macro2/src/fallback.rs
+@@ -1,27 +1,41 @@
++use crate::parse::{token_stream, Cursor};
++use crate::{Delimiter, Spacing, TokenTree};
+ #[cfg(span_locations)]
+ use std::cell::RefCell;
+ #[cfg(span_locations)]
+ use std::cmp;
+-use std::fmt;
+-use std::iter;
++use std::fmt::{self, Debug, Display};
++use std::iter::FromIterator;
++use std::mem;
+ use std::ops::RangeBounds;
+ #[cfg(procmacro2_semver_exempt)]
+ use std::path::Path;
+ use std::path::PathBuf;
+ use std::str::FromStr;
+ use std::vec;
+-
+-use crate::strnom::{block_comment, skip_whitespace, whitespace, word_break, Cursor, PResult};
+-use crate::{Delimiter, Punct, Spacing, TokenTree};
+ use unicode_xid::UnicodeXID;
+
++/// Force use of proc-macro2's fallback implementation of the API for now, even
++/// if the compiler's implementation is available.
++pub fn force() {
++ #[cfg(wrap_proc_macro)]
++ crate::detection::force_fallback();
++}
++
++/// Resume using the compiler's implementation of the proc macro API if it is
++/// available.
++pub fn unforce() {
++ #[cfg(wrap_proc_macro)]
++ crate::detection::unforce_fallback();
++}
++
+ #[derive(Clone)]
+-pub struct TokenStream {
+- inner: Vec<TokenTree>,
++pub(crate) struct TokenStream {
++ pub(crate) inner: Vec<TokenTree>,
+ }
+
+ #[derive(Debug)]
+-pub struct LexError;
++pub(crate) struct LexError;
+
+ impl TokenStream {
+ pub fn new() -> TokenStream {
+@@ -31,6 +45,72 @@ impl TokenStream {
+ pub fn is_empty(&self) -> bool {
+ self.inner.len() == 0
+ }
++
++ fn take_inner(&mut self) -> Vec<TokenTree> {
++ mem::replace(&mut self.inner, Vec::new())
++ }
++
++ fn push_token(&mut self, token: TokenTree) {
++ // https://github.com/alexcrichton/proc-macro2/issues/235
++ match token {
++ #[cfg(not(no_bind_by_move_pattern_guard))]
++ TokenTree::Literal(crate::Literal {
++ #[cfg(wrap_proc_macro)]
++ inner: crate::imp::Literal::Fallback(literal),
++ #[cfg(not(wrap_proc_macro))]
++ inner: literal,
++ ..
++ }) if literal.text.starts_with('-') => {
++ push_negative_literal(self, literal);
++ }
++ #[cfg(no_bind_by_move_pattern_guard)]
++ TokenTree::Literal(crate::Literal {
++ #[cfg(wrap_proc_macro)]
++ inner: crate::imp::Literal::Fallback(literal),
++ #[cfg(not(wrap_proc_macro))]
++ inner: literal,
++ ..
++ }) => {
++ if literal.text.starts_with('-') {
++ push_negative_literal(self, literal);
++ } else {
++ self.inner
++ .push(TokenTree::Literal(crate::Literal::_new_stable(literal)));
++ }
++ }
++ _ => self.inner.push(token),
++ }
++
++ #[cold]
++ fn push_negative_literal(stream: &mut TokenStream, mut literal: Literal) {
++ literal.text.remove(0);
++ let mut punct = crate::Punct::new('-', Spacing::Alone);
++ punct.set_span(crate::Span::_new_stable(literal.span));
++ stream.inner.push(TokenTree::Punct(punct));
++ stream
++ .inner
++ .push(TokenTree::Literal(crate::Literal::_new_stable(literal)));
++ }
++ }
++}
++
++// Nonrecursive to prevent stack overflow.
++impl Drop for TokenStream {
++ fn drop(&mut self) {
++ while let Some(token) = self.inner.pop() {
++ let group = match token {
++ TokenTree::Group(group) => group.inner,
++ _ => continue,
++ };
++ #[cfg(wrap_proc_macro)]
++ let group = match group {
++ crate::imp::Group::Fallback(group) => group,
++ _ => continue,
++ };
++ let mut group = group;
++ self.inner.extend(group.stream.take_inner());
++ }
++ }
+ }
+
+ #[cfg(span_locations)]
+@@ -59,20 +139,22 @@ impl FromStr for TokenStream {
+ // Create a dummy file & add it to the source map
+ let cursor = get_cursor(src);
+
+- match token_stream(cursor) {
+- Ok((input, output)) => {
+- if skip_whitespace(input).len() != 0 {
+- Err(LexError)
+- } else {
+- Ok(output)
+- }
+- }
+- Err(LexError) => Err(LexError),
++ let (rest, tokens) = token_stream(cursor)?;
++ if rest.is_empty() {
++ Ok(tokens)
++ } else {
++ Err(LexError)
+ }
+ }
+ }
+
+-impl fmt::Display for TokenStream {
++impl Display for LexError {
++ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++ f.write_str("cannot parse string into token stream")
++ }
++}
++
++impl Display for TokenStream {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let mut joint = false;
+ for (i, tt) in self.inner.iter().enumerate() {
+@@ -80,37 +162,22 @@ impl fmt::Display for TokenStream {
+ write!(f, " ")?;
+ }
+ joint = false;
+- match *tt {
+- TokenTree::Group(ref tt) => {
+- let (start, end) = match tt.delimiter() {
+- Delimiter::Parenthesis => ("(", ")"),
+- Delimiter::Brace => ("{", "}"),
+- Delimiter::Bracket => ("[", "]"),
+- Delimiter::None => ("", ""),
+- };
+- if tt.stream().into_iter().next().is_none() {
+- write!(f, "{} {}", start, end)?
+- } else {
+- write!(f, "{} {} {}", start, tt.stream(), end)?
+- }
+- }
+- TokenTree::Ident(ref tt) => write!(f, "{}", tt)?,
+- TokenTree::Punct(ref tt) => {
+- write!(f, "{}", tt.as_char())?;
+- match tt.spacing() {
+- Spacing::Alone => {}
+- Spacing::Joint => joint = true,
+- }
++ match tt {
++ TokenTree::Group(tt) => Display::fmt(tt, f),
++ TokenTree::Ident(tt) => Display::fmt(tt, f),
++ TokenTree::Punct(tt) => {
++ joint = tt.spacing() == Spacing::Joint;
++ Display::fmt(tt, f)
+ }
+- TokenTree::Literal(ref tt) => write!(f, "{}", tt)?,
+- }
++ TokenTree::Literal(tt) => Display::fmt(tt, f),
++ }?
+ }
+
+ Ok(())
+ }
+ }
+
+-impl fmt::Debug for TokenStream {
++impl Debug for TokenStream {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.write_str("TokenStream ")?;
+ f.debug_list().entries(self.clone()).finish()
+@@ -139,28 +206,26 @@ impl From<TokenStream> for proc_macro::TokenStream {
+
+ impl From<TokenTree> for TokenStream {
+ fn from(tree: TokenTree) -> TokenStream {
+- TokenStream { inner: vec![tree] }
++ let mut stream = TokenStream::new();
++ stream.push_token(tree);
++ stream
+ }
+ }
+
+-impl iter::FromIterator<TokenTree> for TokenStream {
+- fn from_iter<I: IntoIterator<Item = TokenTree>>(streams: I) -> Self {
+- let mut v = Vec::new();
+-
+- for token in streams.into_iter() {
+- v.push(token);
+- }
+-
+- TokenStream { inner: v }
++impl FromIterator<TokenTree> for TokenStream {
++ fn from_iter<I: IntoIterator<Item = TokenTree>>(tokens: I) -> Self {
++ let mut stream = TokenStream::new();
++ stream.extend(tokens);
++ stream
+ }
+ }
+
+-impl iter::FromIterator<TokenStream> for TokenStream {
++impl FromIterator<TokenStream> for TokenStream {
+ fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
+ let mut v = Vec::new();
+
+- for stream in streams.into_iter() {
+- v.extend(stream.inner);
++ for mut stream in streams {
++ v.extend(stream.take_inner());
+ }
+
+ TokenStream { inner: v }
+@@ -168,31 +233,30 @@ impl iter::FromIterator<TokenStream> for TokenStream {
+ }
+
+ impl Extend<TokenTree> for TokenStream {
+- fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
+- self.inner.extend(streams);
++ fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, tokens: I) {
++ tokens.into_iter().for_each(|token| self.push_token(token));
+ }
+ }
+
+ impl Extend<TokenStream> for TokenStream {
+ fn extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I) {
+- self.inner
+- .extend(streams.into_iter().flat_map(|stream| stream));
++ self.inner.extend(streams.into_iter().flatten());
+ }
+ }
+
+-pub type TokenTreeIter = vec::IntoIter<TokenTree>;
++pub(crate) type TokenTreeIter = vec::IntoIter<TokenTree>;
+
+ impl IntoIterator for TokenStream {
+ type Item = TokenTree;
+ type IntoIter = TokenTreeIter;
+
+- fn into_iter(self) -> TokenTreeIter {
+- self.inner.into_iter()
++ fn into_iter(mut self) -> TokenTreeIter {
++ self.take_inner().into_iter()
+ }
+ }
+
+ #[derive(Clone, PartialEq, Eq)]
+-pub struct SourceFile {
++pub(crate) struct SourceFile {
+ path: PathBuf,
+ }
+
+@@ -208,7 +272,7 @@ impl SourceFile {
+ }
+ }
+
+-impl fmt::Debug for SourceFile {
++impl Debug for SourceFile {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.debug_struct("SourceFile")
+ .field("path", &self.path())
+@@ -218,7 +282,7 @@ impl fmt::Debug for SourceFile {
+ }
+
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
+-pub struct LineColumn {
++pub(crate) struct LineColumn {
+ pub line: usize,
+ pub column: usize,
+ }
+@@ -228,23 +292,11 @@ thread_local! {
+ static SOURCE_MAP: RefCell<SourceMap> = RefCell::new(SourceMap {
+ // NOTE: We start with a single dummy file which all call_site() and
+ // def_site() spans reference.
+- files: vec![{
++ files: vec![FileInfo {
+ #[cfg(procmacro2_semver_exempt)]
+- {
+- FileInfo {
+- name: "<unspecified>".to_owned(),
+- span: Span { lo: 0, hi: 0 },
+- lines: vec![0],
+- }
+- }
+-
+- #[cfg(not(procmacro2_semver_exempt))]
+- {
+- FileInfo {
+- span: Span { lo: 0, hi: 0 },
+- lines: vec![0],
+- }
+- }
++ name: "<unspecified>".to_owned(),
++ span: Span { lo: 0, hi: 0 },
++ lines: vec![0],
+ }],
+ });
+ }
+@@ -282,16 +334,21 @@ impl FileInfo {
+ }
+ }
+
+-/// Computesthe offsets of each line in the given source string.
++/// Computes the offsets of each line in the given source string
++/// and the total number of characters
+ #[cfg(span_locations)]
+-fn lines_offsets(s: &str) -> Vec<usize> {
++fn lines_offsets(s: &str) -> (usize, Vec<usize>) {
+ let mut lines = vec![0];
+- let mut prev = 0;
+- while let Some(len) = s[prev..].find('\n') {
+- prev += len + 1;
+- lines.push(prev);
++ let mut total = 0;
++
++ for ch in s.chars() {
++ total += 1;
++ if ch == '\n' {
++ lines.push(total);
++ }
+ }
+- lines
++
++ (total, lines)
+ }
+
+ #[cfg(span_locations)]
+@@ -310,23 +367,22 @@ impl SourceMap {
+ }
+
+ fn add_file(&mut self, name: &str, src: &str) -> Span {
+- let lines = lines_offsets(src);
++ let (len, lines) = lines_offsets(src);
+ let lo = self.next_start_pos();
+ // XXX(nika): Shouild we bother doing a checked cast or checked add here?
+ let span = Span {
+ lo,
+- hi: lo + (src.len() as u32),
++ hi: lo + (len as u32),
+ };
+
+- #[cfg(procmacro2_semver_exempt)]
+ self.files.push(FileInfo {
++ #[cfg(procmacro2_semver_exempt)]
+ name: name.to_owned(),
+ span,
+ lines,
+ });
+
+ #[cfg(not(procmacro2_semver_exempt))]
+- self.files.push(FileInfo { span, lines });
+ let _ = name;
+
+ span
+@@ -343,11 +399,11 @@ impl SourceMap {
+ }
+
+ #[derive(Clone, Copy, PartialEq, Eq)]
+-pub struct Span {
++pub(crate) struct Span {
+ #[cfg(span_locations)]
+- lo: u32,
++ pub(crate) lo: u32,
+ #[cfg(span_locations)]
+- hi: u32,
++ pub(crate) hi: u32,
+ }
+
+ impl Span {
+@@ -361,12 +417,16 @@ impl Span {
+ Span { lo: 0, hi: 0 }
+ }
+
++ #[cfg(hygiene)]
++ pub fn mixed_site() -> Span {
++ Span::call_site()
++ }
++
+ #[cfg(procmacro2_semver_exempt)]
+ pub fn def_site() -> Span {
+ Span::call_site()
+ }
+
+- #[cfg(procmacro2_semver_exempt)]
+ pub fn resolved_at(&self, _other: Span) -> Span {
+ // Stable spans consist only of line/column information, so
+ // `resolved_at` and `located_at` only select which span the
+@@ -374,7 +434,6 @@ impl Span {
+ *self
+ }
+
+- #[cfg(procmacro2_semver_exempt)]
+ pub fn located_at(&self, other: Span) -> Span {
+ other
+ }
+@@ -427,26 +486,59 @@ impl Span {
+ })
+ })
+ }
++
++ #[cfg(not(span_locations))]
++ fn first_byte(self) -> Self {
++ self
++ }
++
++ #[cfg(span_locations)]
++ fn first_byte(self) -> Self {
++ Span {
++ lo: self.lo,
++ hi: cmp::min(self.lo.saturating_add(1), self.hi),
++ }
++ }
++
++ #[cfg(not(span_locations))]
++ fn last_byte(self) -> Self {
++ self
++ }
++
++ #[cfg(span_locations)]
++ fn last_byte(self) -> Self {
++ Span {
++ lo: cmp::max(self.hi.saturating_sub(1), self.lo),
++ hi: self.hi,
++ }
++ }
+ }
+
+-impl fmt::Debug for Span {
++impl Debug for Span {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- #[cfg(procmacro2_semver_exempt)]
++ #[cfg(span_locations)]
+ return write!(f, "bytes({}..{})", self.lo, self.hi);
+
+- #[cfg(not(procmacro2_semver_exempt))]
++ #[cfg(not(span_locations))]
+ write!(f, "Span")
+ }
+ }
+
+-pub fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span) {
+- if cfg!(procmacro2_semver_exempt) {
++pub(crate) fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span) {
++ #[cfg(span_locations)]
++ {
++ if span.lo == 0 && span.hi == 0 {
++ return;
++ }
++ }
++
++ if cfg!(span_locations) {
+ debug.field("span", &span);
+ }
+ }
+
+ #[derive(Clone)]
+-pub struct Group {
++pub(crate) struct Group {
+ delimiter: Delimiter,
+ stream: TokenStream,
+ span: Span,
+@@ -474,11 +566,11 @@ impl Group {
+ }
+
+ pub fn span_open(&self) -> Span {
+- self.span
++ self.span.first_byte()
+ }
+
+ pub fn span_close(&self) -> Span {
+- self.span
++ self.span.last_byte()
+ }
+
+ pub fn set_span(&mut self, span: Span) {
+@@ -486,36 +578,45 @@ impl Group {
+ }
+ }
+
+-impl fmt::Display for Group {
++impl Display for Group {
++ // We attempt to match libproc_macro's formatting.
++ // Empty parens: ()
++ // Nonempty parens: (...)
++ // Empty brackets: []
++ // Nonempty brackets: [...]
++ // Empty braces: { }
++ // Nonempty braces: { ... }
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- let (left, right) = match self.delimiter {
++ let (open, close) = match self.delimiter {
+ Delimiter::Parenthesis => ("(", ")"),
+- Delimiter::Brace => ("{", "}"),
++ Delimiter::Brace => ("{ ", "}"),
+ Delimiter::Bracket => ("[", "]"),
+ Delimiter::None => ("", ""),
+ };
+
+- f.write_str(left)?;
+- self.stream.fmt(f)?;
+- f.write_str(right)?;
++ f.write_str(open)?;
++ Display::fmt(&self.stream, f)?;
++ if self.delimiter == Delimiter::Brace && !self.stream.inner.is_empty() {
++ f.write_str(" ")?;
++ }
++ f.write_str(close)?;
+
+ Ok(())
+ }
+ }
+
+-impl fmt::Debug for Group {
++impl Debug for Group {
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+ let mut debug = fmt.debug_struct("Group");
+ debug.field("delimiter", &self.delimiter);
+ debug.field("stream", &self.stream);
+- #[cfg(procmacro2_semver_exempt)]
+- debug.field("span", &self.span);
++ debug_span_field_if_nontrivial(&mut debug, self.span);
+ debug.finish()
+ }
+ }
+
+ #[derive(Clone)]
+-pub struct Ident {
++pub(crate) struct Ident {
+ sym: String,
+ span: Span,
+ raw: bool,
+@@ -549,16 +650,14 @@ impl Ident {
+ }
+ }
+
+-#[inline]
+-fn is_ident_start(c: char) -> bool {
++pub(crate) fn is_ident_start(c: char) -> bool {
+ ('a' <= c && c <= 'z')
+ || ('A' <= c && c <= 'Z')
+ || c == '_'
+ || (c > '\x7f' && UnicodeXID::is_xid_start(c))
+ }
+
+-#[inline]
+-fn is_ident_continue(c: char) -> bool {
++pub(crate) fn is_ident_continue(c: char) -> bool {
+ ('a' <= c && c <= 'z')
+ || ('A' <= c && c <= 'Z')
+ || c == '_'
+@@ -615,18 +714,18 @@ where
+ }
+ }
+
+-impl fmt::Display for Ident {
++impl Display for Ident {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ if self.raw {
+- "r#".fmt(f)?;
++ f.write_str("r#")?;
+ }
+- self.sym.fmt(f)
++ Display::fmt(&self.sym, f)
+ }
+ }
+
+-impl fmt::Debug for Ident {
++impl Debug for Ident {
+ // Ident(proc_macro), Ident(r#union)
+- #[cfg(not(procmacro2_semver_exempt))]
++ #[cfg(not(span_locations))]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let mut debug = f.debug_tuple("Ident");
+ debug.field(&format_args!("{}", self));
+@@ -637,17 +736,17 @@ impl fmt::Debug for Ident {
+ // sym: proc_macro,
+ // span: bytes(128..138)
+ // }
+- #[cfg(procmacro2_semver_exempt)]
++ #[cfg(span_locations)]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let mut debug = f.debug_struct("Ident");
+ debug.field("sym", &format_args!("{}", self));
+- debug.field("span", &self.span);
++ debug_span_field_if_nontrivial(&mut debug, self.span);
+ debug.finish()
+ }
+ }
+
+ #[derive(Clone)]
+-pub struct Literal {
++pub(crate) struct Literal {
+ text: String,
+ span: Span,
+ }
+@@ -669,7 +768,7 @@ macro_rules! unsuffixed_numbers {
+ }
+
+ impl Literal {
+- fn _new(text: String) -> Literal {
++ pub(crate) fn _new(text: String) -> Literal {
+ Literal {
+ text,
+ span: Span::call_site(),
+@@ -711,7 +810,7 @@ impl Literal {
+
+ pub fn f32_unsuffixed(f: f32) -> Literal {
+ let mut s = f.to_string();
+- if !s.contains(".") {
++ if !s.contains('.') {
+ s.push_str(".0");
+ }
+ Literal::_new(s)
+@@ -719,7 +818,7 @@ impl Literal {
+
+ pub fn f64_unsuffixed(f: f64) -> Literal {
+ let mut s = f.to_string();
+- if !s.contains(".") {
++ if !s.contains('.') {
+ s.push_str(".0");
+ }
+ Literal::_new(s)
+@@ -730,10 +829,10 @@ impl Literal {
+ text.push('"');
+ for c in t.chars() {
+ if c == '\'' {
+- // escape_default turns this into "\'" which is unnecessary.
++ // escape_debug turns this into "\'" which is unnecessary.
+ text.push(c);
+ } else {
+- text.extend(c.escape_default());
++ text.extend(c.escape_debug());
+ }
+ }
+ text.push('"');
+@@ -744,10 +843,10 @@ impl Literal {
+ let mut text = String::new();
+ text.push('\'');
+ if t == '"' {
+- // escape_default turns this into '\"' which is unnecessary.
++ // escape_debug turns this into '\"' which is unnecessary.
+ text.push(t);
+ } else {
+- text.extend(t.escape_default());
++ text.extend(t.escape_debug());
+ }
+ text.push('\'');
+ Literal::_new(text)
+@@ -756,6 +855,7 @@ impl Literal {
+ pub fn byte_string(bytes: &[u8]) -> Literal {
+ let mut escaped = "b\"".to_string();
+ for b in bytes {
++ #[allow(clippy::match_overlapping_arm)]
+ match *b {
+ b'\0' => escaped.push_str(r"\0"),
+ b'\t' => escaped.push_str(r"\t"),
+@@ -784,651 +884,17 @@ impl Literal {
+ }
+ }
+
+-impl fmt::Display for Literal {
++impl Display for Literal {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.text.fmt(f)
++ Display::fmt(&self.text, f)
+ }
+ }
+
+-impl fmt::Debug for Literal {
++impl Debug for Literal {
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+ let mut debug = fmt.debug_struct("Literal");
+ debug.field("lit", &format_args!("{}", self.text));
+- #[cfg(procmacro2_semver_exempt)]
+- debug.field("span", &self.span);
++ debug_span_field_if_nontrivial(&mut debug, self.span);
+ debug.finish()
+ }
+ }
+-
+-fn token_stream(mut input: Cursor) -> PResult<TokenStream> {
+- let mut trees = Vec::new();
+- loop {
+- let input_no_ws = skip_whitespace(input);
+- if input_no_ws.rest.len() == 0 {
+- break;
+- }
+- if let Ok((a, tokens)) = doc_comment(input_no_ws) {
+- input = a;
+- trees.extend(tokens);
+- continue;
+- }
+-
+- let (a, tt) = match token_tree(input_no_ws) {
+- Ok(p) => p,
+- Err(_) => break,
+- };
+- trees.push(tt);
+- input = a;
+- }
+- Ok((input, TokenStream { inner: trees }))
+-}
+-
+-#[cfg(not(span_locations))]
+-fn spanned<'a, T>(
+- input: Cursor<'a>,
+- f: fn(Cursor<'a>) -> PResult<'a, T>,
+-) -> PResult<'a, (T, crate::Span)> {
+- let (a, b) = f(skip_whitespace(input))?;
+- Ok((a, ((b, crate::Span::_new_stable(Span::call_site())))))
+-}
+-
+-#[cfg(span_locations)]
+-fn spanned<'a, T>(
+- input: Cursor<'a>,
+- f: fn(Cursor<'a>) -> PResult<'a, T>,
+-) -> PResult<'a, (T, crate::Span)> {
+- let input = skip_whitespace(input);
+- let lo = input.off;
+- let (a, b) = f(input)?;
+- let hi = a.off;
+- let span = crate::Span::_new_stable(Span { lo, hi });
+- Ok((a, (b, span)))
+-}
+-
+-fn token_tree(input: Cursor) -> PResult<TokenTree> {
+- let (rest, (mut tt, span)) = spanned(input, token_kind)?;
+- tt.set_span(span);
+- Ok((rest, tt))
+-}
+-
+-named!(token_kind -> TokenTree, alt!(
+- map!(group, |g| TokenTree::Group(crate::Group::_new_stable(g)))
+- |
+- map!(literal, |l| TokenTree::Literal(crate::Literal::_new_stable(l))) // must be before symbol
+- |
+- map!(op, TokenTree::Punct)
+- |
+- symbol_leading_ws
+-));
+-
+-named!(group -> Group, alt!(
+- delimited!(
+- punct!("("),
+- token_stream,
+- punct!(")")
+- ) => { |ts| Group::new(Delimiter::Parenthesis, ts) }
+- |
+- delimited!(
+- punct!("["),
+- token_stream,
+- punct!("]")
+- ) => { |ts| Group::new(Delimiter::Bracket, ts) }
+- |
+- delimited!(
+- punct!("{"),
+- token_stream,
+- punct!("}")
+- ) => { |ts| Group::new(Delimiter::Brace, ts) }
+-));
+-
+-fn symbol_leading_ws(input: Cursor) -> PResult<TokenTree> {
+- symbol(skip_whitespace(input))
+-}
+-
+-fn symbol(input: Cursor) -> PResult<TokenTree> {
+- let raw = input.starts_with("r#");
+- let rest = input.advance((raw as usize) << 1);
+-
+- let (rest, sym) = symbol_not_raw(rest)?;
+-
+- if !raw {
+- let ident = crate::Ident::new(sym, crate::Span::call_site());
+- return Ok((rest, ident.into()));
+- }
+-
+- if sym == "_" {
+- return Err(LexError);
+- }
+-
+- let ident = crate::Ident::_new_raw(sym, crate::Span::call_site());
+- Ok((rest, ident.into()))
+-}
+-
+-fn symbol_not_raw(input: Cursor) -> PResult<&str> {
+- let mut chars = input.char_indices();
+-
+- match chars.next() {
+- Some((_, ch)) if is_ident_start(ch) => {}
+- _ => return Err(LexError),
+- }
+-
+- let mut end = input.len();
+- for (i, ch) in chars {
+- if !is_ident_continue(ch) {
+- end = i;
+- break;
+- }
+- }
+-
+- Ok((input.advance(end), &input.rest[..end]))
+-}
+-
+-fn literal(input: Cursor) -> PResult<Literal> {
+- let input_no_ws = skip_whitespace(input);
+-
+- match literal_nocapture(input_no_ws) {
+- Ok((a, ())) => {
+- let start = input.len() - input_no_ws.len();
+- let len = input_no_ws.len() - a.len();
+- let end = start + len;
+- Ok((a, Literal::_new(input.rest[start..end].to_string())))
+- }
+- Err(LexError) => Err(LexError),
+- }
+-}
+-
+-named!(literal_nocapture -> (), alt!(
+- string
+- |
+- byte_string
+- |
+- byte
+- |
+- character
+- |
+- float
+- |
+- int
+-));
+-
+-named!(string -> (), alt!(
+- quoted_string
+- |
+- preceded!(
+- punct!("r"),
+- raw_string
+- ) => { |_| () }
+-));
+-
+-named!(quoted_string -> (), do_parse!(
+- punct!("\"") >>
+- cooked_string >>
+- tag!("\"") >>
+- option!(symbol_not_raw) >>
+- (())
+-));
+-
+-fn cooked_string(input: Cursor) -> PResult<()> {
+- let mut chars = input.char_indices().peekable();
+- while let Some((byte_offset, ch)) = chars.next() {
+- match ch {
+- '"' => {
+- return Ok((input.advance(byte_offset), ()));
+- }
+- '\r' => {
+- if let Some((_, '\n')) = chars.next() {
+- // ...
+- } else {
+- break;
+- }
+- }
+- '\\' => match chars.next() {
+- Some((_, 'x')) => {
+- if !backslash_x_char(&mut chars) {
+- break;
+- }
+- }
+- Some((_, 'n')) | Some((_, 'r')) | Some((_, 't')) | Some((_, '\\'))
+- | Some((_, '\'')) | Some((_, '"')) | Some((_, '0')) => {}
+- Some((_, 'u')) => {
+- if !backslash_u(&mut chars) {
+- break;
+- }
+- }
+- Some((_, '\n')) | Some((_, '\r')) => {
+- while let Some(&(_, ch)) = chars.peek() {
+- if ch.is_whitespace() {
+- chars.next();
+- } else {
+- break;
+- }
+- }
+- }
+- _ => break,
+- },
+- _ch => {}
+- }
+- }
+- Err(LexError)
+-}
+-
+-named!(byte_string -> (), alt!(
+- delimited!(
+- punct!("b\""),
+- cooked_byte_string,
+- tag!("\"")
+- ) => { |_| () }
+- |
+- preceded!(
+- punct!("br"),
+- raw_string
+- ) => { |_| () }
+-));
+-
+-fn cooked_byte_string(mut input: Cursor) -> PResult<()> {
+- let mut bytes = input.bytes().enumerate();
+- 'outer: while let Some((offset, b)) = bytes.next() {
+- match b {
+- b'"' => {
+- return Ok((input.advance(offset), ()));
+- }
+- b'\r' => {
+- if let Some((_, b'\n')) = bytes.next() {
+- // ...
+- } else {
+- break;
+- }
+- }
+- b'\\' => match bytes.next() {
+- Some((_, b'x')) => {
+- if !backslash_x_byte(&mut bytes) {
+- break;
+- }
+- }
+- Some((_, b'n')) | Some((_, b'r')) | Some((_, b't')) | Some((_, b'\\'))
+- | Some((_, b'0')) | Some((_, b'\'')) | Some((_, b'"')) => {}
+- Some((newline, b'\n')) | Some((newline, b'\r')) => {
+- let rest = input.advance(newline + 1);
+- for (offset, ch) in rest.char_indices() {
+- if !ch.is_whitespace() {
+- input = rest.advance(offset);
+- bytes = input.bytes().enumerate();
+- continue 'outer;
+- }
+- }
+- break;
+- }
+- _ => break,
+- },
+- b if b < 0x80 => {}
+- _ => break,
+- }
+- }
+- Err(LexError)
+-}
+-
+-fn raw_string(input: Cursor) -> PResult<()> {
+- let mut chars = input.char_indices();
+- let mut n = 0;
+- while let Some((byte_offset, ch)) = chars.next() {
+- match ch {
+- '"' => {
+- n = byte_offset;
+- break;
+- }
+- '#' => {}
+- _ => return Err(LexError),
+- }
+- }
+- for (byte_offset, ch) in chars {
+- match ch {
+- '"' if input.advance(byte_offset + 1).starts_with(&input.rest[..n]) => {
+- let rest = input.advance(byte_offset + 1 + n);
+- return Ok((rest, ()));
+- }
+- '\r' => {}
+- _ => {}
+- }
+- }
+- Err(LexError)
+-}
+-
+-named!(byte -> (), do_parse!(
+- punct!("b") >>
+- tag!("'") >>
+- cooked_byte >>
+- tag!("'") >>
+- (())
+-));
+-
+-fn cooked_byte(input: Cursor) -> PResult<()> {
+- let mut bytes = input.bytes().enumerate();
+- let ok = match bytes.next().map(|(_, b)| b) {
+- Some(b'\\') => match bytes.next().map(|(_, b)| b) {
+- Some(b'x') => backslash_x_byte(&mut bytes),
+- Some(b'n') | Some(b'r') | Some(b't') | Some(b'\\') | Some(b'0') | Some(b'\'')
+- | Some(b'"') => true,
+- _ => false,
+- },
+- b => b.is_some(),
+- };
+- if ok {
+- match bytes.next() {
+- Some((offset, _)) => {
+- if input.chars().as_str().is_char_boundary(offset) {
+- Ok((input.advance(offset), ()))
+- } else {
+- Err(LexError)
+- }
+- }
+- None => Ok((input.advance(input.len()), ())),
+- }
+- } else {
+- Err(LexError)
+- }
+-}
+-
+-named!(character -> (), do_parse!(
+- punct!("'") >>
+- cooked_char >>
+- tag!("'") >>
+- (())
+-));
+-
+-fn cooked_char(input: Cursor) -> PResult<()> {
+- let mut chars = input.char_indices();
+- let ok = match chars.next().map(|(_, ch)| ch) {
+- Some('\\') => match chars.next().map(|(_, ch)| ch) {
+- Some('x') => backslash_x_char(&mut chars),
+- Some('u') => backslash_u(&mut chars),
+- Some('n') | Some('r') | Some('t') | Some('\\') | Some('0') | Some('\'') | Some('"') => {
+- true
+- }
+- _ => false,
+- },
+- ch => ch.is_some(),
+- };
+- if ok {
+- match chars.next() {
+- Some((idx, _)) => Ok((input.advance(idx), ())),
+- None => Ok((input.advance(input.len()), ())),
+- }
+- } else {
+- Err(LexError)
+- }
+-}
+-
+-macro_rules! next_ch {
+- ($chars:ident @ $pat:pat $(| $rest:pat)*) => {
+- match $chars.next() {
+- Some((_, ch)) => match ch {
+- $pat $(| $rest)* => ch,
+- _ => return false,
+- },
+- None => return false
+- }
+- };
+-}
+-
+-fn backslash_x_char<I>(chars: &mut I) -> bool
+-where
+- I: Iterator<Item = (usize, char)>,
+-{
+- next_ch!(chars @ '0'..='7');
+- next_ch!(chars @ '0'..='9' | 'a'..='f' | 'A'..='F');
+- true
+-}
+-
+-fn backslash_x_byte<I>(chars: &mut I) -> bool
+-where
+- I: Iterator<Item = (usize, u8)>,
+-{
+- next_ch!(chars @ b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F');
+- next_ch!(chars @ b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F');
+- true
+-}
+-
+-fn backslash_u<I>(chars: &mut I) -> bool
+-where
+- I: Iterator<Item = (usize, char)>,
+-{
+- next_ch!(chars @ '{');
+- next_ch!(chars @ '0'..='9' | 'a'..='f' | 'A'..='F');
+- loop {
+- let c = next_ch!(chars @ '0'..='9' | 'a'..='f' | 'A'..='F' | '_' | '}');
+- if c == '}' {
+- return true;
+- }
+- }
+-}
+-
+-fn float(input: Cursor) -> PResult<()> {
+- let (mut rest, ()) = float_digits(input)?;
+- if let Some(ch) = rest.chars().next() {
+- if is_ident_start(ch) {
+- rest = symbol_not_raw(rest)?.0;
+- }
+- }
+- word_break(rest)
+-}
+-
+-fn float_digits(input: Cursor) -> PResult<()> {
+- let mut chars = input.chars().peekable();
+- match chars.next() {
+- Some(ch) if ch >= '0' && ch <= '9' => {}
+- _ => return Err(LexError),
+- }
+-
+- let mut len = 1;
+- let mut has_dot = false;
+- let mut has_exp = false;
+- while let Some(&ch) = chars.peek() {
+- match ch {
+- '0'..='9' | '_' => {
+- chars.next();
+- len += 1;
+- }
+- '.' => {
+- if has_dot {
+- break;
+- }
+- chars.next();
+- if chars
+- .peek()
+- .map(|&ch| ch == '.' || is_ident_start(ch))
+- .unwrap_or(false)
+- {
+- return Err(LexError);
+- }
+- len += 1;
+- has_dot = true;
+- }
+- 'e' | 'E' => {
+- chars.next();
+- len += 1;
+- has_exp = true;
+- break;
+- }
+- _ => break,
+- }
+- }
+-
+- let rest = input.advance(len);
+- if !(has_dot || has_exp || rest.starts_with("f32") || rest.starts_with("f64")) {
+- return Err(LexError);
+- }
+-
+- if has_exp {
+- let mut has_exp_value = false;
+- while let Some(&ch) = chars.peek() {
+- match ch {
+- '+' | '-' => {
+- if has_exp_value {
+- break;
+- }
+- chars.next();
+- len += 1;
+- }
+- '0'..='9' => {
+- chars.next();
+- len += 1;
+- has_exp_value = true;
+- }
+- '_' => {
+- chars.next();
+- len += 1;
+- }
+- _ => break,
+- }
+- }
+- if !has_exp_value {
+- return Err(LexError);
+- }
+- }
+-
+- Ok((input.advance(len), ()))
+-}
+-
+-fn int(input: Cursor) -> PResult<()> {
+- let (mut rest, ()) = digits(input)?;
+- if let Some(ch) = rest.chars().next() {
+- if is_ident_start(ch) {
+- rest = symbol_not_raw(rest)?.0;
+- }
+- }
+- word_break(rest)
+-}
+-
+-fn digits(mut input: Cursor) -> PResult<()> {
+- let base = if input.starts_with("0x") {
+- input = input.advance(2);
+- 16
+- } else if input.starts_with("0o") {
+- input = input.advance(2);
+- 8
+- } else if input.starts_with("0b") {
+- input = input.advance(2);
+- 2
+- } else {
+- 10
+- };
+-
+- let mut len = 0;
+- let mut empty = true;
+- for b in input.bytes() {
+- let digit = match b {
+- b'0'..=b'9' => (b - b'0') as u64,
+- b'a'..=b'f' => 10 + (b - b'a') as u64,
+- b'A'..=b'F' => 10 + (b - b'A') as u64,
+- b'_' => {
+- if empty && base == 10 {
+- return Err(LexError);
+- }
+- len += 1;
+- continue;
+- }
+- _ => break,
+- };
+- if digit >= base {
+- return Err(LexError);
+- }
+- len += 1;
+- empty = false;
+- }
+- if empty {
+- Err(LexError)
+- } else {
+- Ok((input.advance(len), ()))
+- }
+-}
+-
+-fn op(input: Cursor) -> PResult<Punct> {
+- let input = skip_whitespace(input);
+- match op_char(input) {
+- Ok((rest, '\'')) => {
+- symbol(rest)?;
+- Ok((rest, Punct::new('\'', Spacing::Joint)))
+- }
+- Ok((rest, ch)) => {
+- let kind = match op_char(rest) {
+- Ok(_) => Spacing::Joint,
+- Err(LexError) => Spacing::Alone,
+- };
+- Ok((rest, Punct::new(ch, kind)))
+- }
+- Err(LexError) => Err(LexError),
+- }
+-}
+-
+-fn op_char(input: Cursor) -> PResult<char> {
+- if input.starts_with("//") || input.starts_with("/*") {
+- // Do not accept `/` of a comment as an op.
+- return Err(LexError);
+- }
+-
+- let mut chars = input.chars();
+- let first = match chars.next() {
+- Some(ch) => ch,
+- None => {
+- return Err(LexError);
+- }
+- };
+- let recognized = "~!@#$%^&*-=+|;:,<.>/?'";
+- if recognized.contains(first) {
+- Ok((input.advance(first.len_utf8()), first))
+- } else {
+- Err(LexError)
+- }
+-}
+-
+-fn doc_comment(input: Cursor) -> PResult<Vec<TokenTree>> {
+- let mut trees = Vec::new();
+- let (rest, ((comment, inner), span)) = spanned(input, doc_comment_contents)?;
+- trees.push(TokenTree::Punct(Punct::new('#', Spacing::Alone)));
+- if inner {
+- trees.push(Punct::new('!', Spacing::Alone).into());
+- }
+- let mut stream = vec![
+- TokenTree::Ident(crate::Ident::new("doc", span)),
+- TokenTree::Punct(Punct::new('=', Spacing::Alone)),
+- TokenTree::Literal(crate::Literal::string(comment)),
+- ];
+- for tt in stream.iter_mut() {
+- tt.set_span(span);
+- }
+- let group = Group::new(Delimiter::Bracket, stream.into_iter().collect());
+- trees.push(crate::Group::_new_stable(group).into());
+- for tt in trees.iter_mut() {
+- tt.set_span(span);
+- }
+- Ok((rest, trees))
+-}
+-
+-named!(doc_comment_contents -> (&str, bool), alt!(
+- do_parse!(
+- punct!("//!") >>
+- s: take_until_newline_or_eof!() >>
+- ((s, true))
+- )
+- |
+- do_parse!(
+- option!(whitespace) >>
+- peek!(tag!("/*!")) >>
+- s: block_comment >>
+- ((s, true))
+- )
+- |
+- do_parse!(
+- punct!("///") >>
+- not!(tag!("/")) >>
+- s: take_until_newline_or_eof!() >>
+- ((s, false))
+- )
+- |
+- do_parse!(
+- option!(whitespace) >>
+- peek!(tuple!(tag!("/**"), not!(tag!("*")))) >>
+- s: block_comment >>
+- ((s, false))
+- )
+-));
+diff --git a/third_party/rust/proc-macro2/src/lib.rs b/third_party/rust/proc-macro2/src/lib.rs
+index a08be3e815..c20fb50d4a 100644
+--- mozilla-release/third_party/rust/proc-macro2/src/lib.rs
++++ mozilla-release/third_party/rust/proc-macro2/src/lib.rs
+@@ -78,27 +78,24 @@
+ //! a different thread.
+
+ // Proc-macro2 types in rustdoc of other crates get linked to here.
+-#![doc(html_root_url = "https://docs.rs/proc-macro2/1.0.5")]
++#![doc(html_root_url = "https://docs.rs/proc-macro2/1.0.24")]
+ #![cfg_attr(any(proc_macro_span, super_unstable), feature(proc_macro_span))]
+ #![cfg_attr(super_unstable, feature(proc_macro_raw_ident, proc_macro_def_site))]
++#![allow(clippy::needless_doctest_main)]
+
+ #[cfg(use_proc_macro)]
+ extern crate proc_macro;
+
+-use std::cmp::Ordering;
+-use std::fmt;
+-use std::hash::{Hash, Hasher};
+-use std::iter::FromIterator;
+-use std::marker;
+-use std::ops::RangeBounds;
+-#[cfg(procmacro2_semver_exempt)]
+-use std::path::PathBuf;
+-use std::rc::Rc;
+-use std::str::FromStr;
++mod marker;
++mod parse;
++
++#[cfg(wrap_proc_macro)]
++mod detection;
+
+-#[macro_use]
+-mod strnom;
+-mod fallback;
++// Public for proc_macro2::fallback::force() and unforce(), but those are quite
++// a niche use case so we omit it from rustdoc.
++#[doc(hidden)]
++pub mod fallback;
+
+ #[cfg(not(wrap_proc_macro))]
+ use crate::fallback as imp;
+@@ -106,6 +103,17 @@ use crate::fallback as imp;
+ #[cfg(wrap_proc_macro)]
+ mod imp;
+
++use crate::marker::Marker;
++use std::cmp::Ordering;
++use std::error::Error;
++use std::fmt::{self, Debug, Display};
++use std::hash::{Hash, Hasher};
++use std::iter::FromIterator;
++use std::ops::RangeBounds;
++#[cfg(procmacro2_semver_exempt)]
++use std::path::PathBuf;
++use std::str::FromStr;
++
+ /// An abstract stream of tokens, or more concretely a sequence of token trees.
+ ///
+ /// This type provides interfaces for iterating over token trees and for
+@@ -116,27 +124,27 @@ mod imp;
+ #[derive(Clone)]
+ pub struct TokenStream {
+ inner: imp::TokenStream,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ /// Error returned from `TokenStream::from_str`.
+ pub struct LexError {
+ inner: imp::LexError,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ impl TokenStream {
+ fn _new(inner: imp::TokenStream) -> TokenStream {
+ TokenStream {
+ inner,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+ fn _new_stable(inner: fallback::TokenStream) -> TokenStream {
+ TokenStream {
+ inner: inner.into(),
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+@@ -173,7 +181,7 @@ impl FromStr for TokenStream {
+ fn from_str(src: &str) -> Result<TokenStream, LexError> {
+ let e = src.parse().map_err(|e| LexError {
+ inner: e,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ })?;
+ Ok(TokenStream::_new(e))
+ }
+@@ -228,25 +236,33 @@ impl FromIterator<TokenStream> for TokenStream {
+ /// convertible back into the same token stream (modulo spans), except for
+ /// possibly `TokenTree::Group`s with `Delimiter::None` delimiters and negative
+ /// numeric literals.
+-impl fmt::Display for TokenStream {
++impl Display for TokenStream {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Display::fmt(&self.inner, f)
+ }
+ }
+
+ /// Prints token in a form convenient for debugging.
+-impl fmt::Debug for TokenStream {
++impl Debug for TokenStream {
++ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++ Debug::fmt(&self.inner, f)
++ }
++}
++
++impl Debug for LexError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+-impl fmt::Debug for LexError {
++impl Display for LexError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Display::fmt(&self.inner, f)
+ }
+ }
+
++impl Error for LexError {}
++
+ /// The source file of a given `Span`.
+ ///
+ /// This type is semver exempt and not exposed by default.
+@@ -254,7 +270,7 @@ impl fmt::Debug for LexError {
+ #[derive(Clone, PartialEq, Eq)]
+ pub struct SourceFile {
+ inner: imp::SourceFile,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ #[cfg(procmacro2_semver_exempt)]
+@@ -262,7 +278,7 @@ impl SourceFile {
+ fn _new(inner: imp::SourceFile) -> Self {
+ SourceFile {
+ inner,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+@@ -291,9 +307,9 @@ impl SourceFile {
+ }
+
+ #[cfg(procmacro2_semver_exempt)]
+-impl fmt::Debug for SourceFile {
++impl Debug for SourceFile {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+@@ -311,25 +327,41 @@ pub struct LineColumn {
+ pub column: usize,
+ }
+
++#[cfg(span_locations)]
++impl Ord for LineColumn {
++ fn cmp(&self, other: &Self) -> Ordering {
++ self.line
++ .cmp(&other.line)
++ .then(self.column.cmp(&other.column))
++ }
++}
++
++#[cfg(span_locations)]
++impl PartialOrd for LineColumn {
++ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
++ Some(self.cmp(other))
++ }
++}
++
+ /// A region of source code, along with macro expansion information.
+ #[derive(Copy, Clone)]
+ pub struct Span {
+ inner: imp::Span,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ impl Span {
+ fn _new(inner: imp::Span) -> Span {
+ Span {
+ inner,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+ fn _new_stable(inner: fallback::Span) -> Span {
+ Span {
+ inner: inner.into(),
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+@@ -342,6 +374,16 @@ impl Span {
+ Span::_new(imp::Span::call_site())
+ }
+
++ /// The span located at the invocation of the procedural macro, but with
++ /// local variables, labels, and `$crate` resolved at the definition site
++ /// of the macro. This is the same hygiene behavior as `macro_rules`.
++ ///
++ /// This function requires Rust 1.45 or later.
++ #[cfg(hygiene)]
++ pub fn mixed_site() -> Span {
++ Span::_new(imp::Span::mixed_site())
++ }
++
+ /// A span that resolves at the macro definition site.
+ ///
+ /// This method is semver exempt and not exposed by default.
+@@ -352,18 +394,12 @@ impl Span {
+
+ /// Creates a new span with the same line/column information as `self` but
+ /// that resolves symbols as though it were at `other`.
+- ///
+- /// This method is semver exempt and not exposed by default.
+- #[cfg(procmacro2_semver_exempt)]
+ pub fn resolved_at(&self, other: Span) -> Span {
+ Span::_new(self.inner.resolved_at(other.inner))
+ }
+
+ /// Creates a new span with the same name resolution behavior as `self` but
+ /// with the line/column information of `other`.
+- ///
+- /// This method is semver exempt and not exposed by default.
+- #[cfg(procmacro2_semver_exempt)]
+ pub fn located_at(&self, other: Span) -> Span {
+ Span::_new(self.inner.located_at(other.inner))
+ }
+@@ -439,9 +475,9 @@ impl Span {
+ }
+
+ /// Prints a span in a form convenient for debugging.
+-impl fmt::Debug for Span {
++impl Debug for Span {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+@@ -462,11 +498,11 @@ impl TokenTree {
+ /// Returns the span of this tree, delegating to the `span` method of
+ /// the contained token or a delimited stream.
+ pub fn span(&self) -> Span {
+- match *self {
+- TokenTree::Group(ref t) => t.span(),
+- TokenTree::Ident(ref t) => t.span(),
+- TokenTree::Punct(ref t) => t.span(),
+- TokenTree::Literal(ref t) => t.span(),
++ match self {
++ TokenTree::Group(t) => t.span(),
++ TokenTree::Ident(t) => t.span(),
++ TokenTree::Punct(t) => t.span(),
++ TokenTree::Literal(t) => t.span(),
+ }
+ }
+
+@@ -476,11 +512,11 @@ impl TokenTree {
+ /// the span of each of the internal tokens, this will simply delegate to
+ /// the `set_span` method of each variant.
+ pub fn set_span(&mut self, span: Span) {
+- match *self {
+- TokenTree::Group(ref mut t) => t.set_span(span),
+- TokenTree::Ident(ref mut t) => t.set_span(span),
+- TokenTree::Punct(ref mut t) => t.set_span(span),
+- TokenTree::Literal(ref mut t) => t.set_span(span),
++ match self {
++ TokenTree::Group(t) => t.set_span(span),
++ TokenTree::Ident(t) => t.set_span(span),
++ TokenTree::Punct(t) => t.set_span(span),
++ TokenTree::Literal(t) => t.set_span(span),
+ }
+ }
+ }
+@@ -513,32 +549,32 @@ impl From<Literal> for TokenTree {
+ /// convertible back into the same token tree (modulo spans), except for
+ /// possibly `TokenTree::Group`s with `Delimiter::None` delimiters and negative
+ /// numeric literals.
+-impl fmt::Display for TokenTree {
++impl Display for TokenTree {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- match *self {
+- TokenTree::Group(ref t) => t.fmt(f),
+- TokenTree::Ident(ref t) => t.fmt(f),
+- TokenTree::Punct(ref t) => t.fmt(f),
+- TokenTree::Literal(ref t) => t.fmt(f),
++ match self {
++ TokenTree::Group(t) => Display::fmt(t, f),
++ TokenTree::Ident(t) => Display::fmt(t, f),
++ TokenTree::Punct(t) => Display::fmt(t, f),
++ TokenTree::Literal(t) => Display::fmt(t, f),
+ }
+ }
+ }
+
+ /// Prints token tree in a form convenient for debugging.
+-impl fmt::Debug for TokenTree {
++impl Debug for TokenTree {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // Each of these has the name in the struct type in the derived debug,
+ // so don't bother with an extra layer of indirection
+- match *self {
+- TokenTree::Group(ref t) => t.fmt(f),
+- TokenTree::Ident(ref t) => {
++ match self {
++ TokenTree::Group(t) => Debug::fmt(t, f),
++ TokenTree::Ident(t) => {
+ let mut debug = f.debug_struct("Ident");
+ debug.field("sym", &format_args!("{}", t));
+ imp::debug_span_field_if_nontrivial(&mut debug, t.span().inner);
+ debug.finish()
+ }
+- TokenTree::Punct(ref t) => t.fmt(f),
+- TokenTree::Literal(ref t) => t.fmt(f),
++ TokenTree::Punct(t) => Debug::fmt(t, f),
++ TokenTree::Literal(t) => Debug::fmt(t, f),
+ }
+ }
+ }
+@@ -651,15 +687,15 @@ impl Group {
+ /// Prints the group as a string that should be losslessly convertible back
+ /// into the same group (modulo spans), except for possibly `TokenTree::Group`s
+ /// with `Delimiter::None` delimiters.
+-impl fmt::Display for Group {
++impl Display for Group {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+- fmt::Display::fmt(&self.inner, formatter)
++ Display::fmt(&self.inner, formatter)
+ }
+ }
+
+-impl fmt::Debug for Group {
++impl Debug for Group {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+- fmt::Debug::fmt(&self.inner, formatter)
++ Debug::fmt(&self.inner, formatter)
+ }
+ }
+
+@@ -669,7 +705,7 @@ impl fmt::Debug for Group {
+ /// `Punct` with different forms of `Spacing` returned.
+ #[derive(Clone)]
+ pub struct Punct {
+- op: char,
++ ch: char,
+ spacing: Spacing,
+ span: Span,
+ }
+@@ -695,9 +731,9 @@ impl Punct {
+ ///
+ /// The returned `Punct` will have the default span of `Span::call_site()`
+ /// which can be further configured with the `set_span` method below.
+- pub fn new(op: char, spacing: Spacing) -> Punct {
++ pub fn new(ch: char, spacing: Spacing) -> Punct {
+ Punct {
+- op,
++ ch,
+ spacing,
+ span: Span::call_site(),
+ }
+@@ -705,7 +741,7 @@ impl Punct {
+
+ /// Returns the value of this punctuation character as `char`.
+ pub fn as_char(&self) -> char {
+- self.op
++ self.ch
+ }
+
+ /// Returns the spacing of this punctuation character, indicating whether
+@@ -730,16 +766,16 @@ impl Punct {
+
+ /// Prints the punctuation character as a string that should be losslessly
+ /// convertible back into the same character.
+-impl fmt::Display for Punct {
++impl Display for Punct {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.op.fmt(f)
++ Display::fmt(&self.ch, f)
+ }
+ }
+
+-impl fmt::Debug for Punct {
++impl Debug for Punct {
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+ let mut debug = fmt.debug_struct("Punct");
+- debug.field("op", &self.op);
++ debug.field("char", &self.ch);
+ debug.field("spacing", &self.spacing);
+ imp::debug_span_field_if_nontrivial(&mut debug, self.span.inner);
+ debug.finish()
+@@ -813,14 +849,14 @@ impl fmt::Debug for Punct {
+ #[derive(Clone)]
+ pub struct Ident {
+ inner: imp::Ident,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ impl Ident {
+ fn _new(inner: imp::Ident) -> Ident {
+ Ident {
+ inner,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+@@ -920,15 +956,15 @@ impl Hash for Ident {
+
+ /// Prints the identifier as a string that should be losslessly convertible back
+ /// into the same identifier.
+-impl fmt::Display for Ident {
++impl Display for Ident {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Display::fmt(&self.inner, f)
+ }
+ }
+
+-impl fmt::Debug for Ident {
++impl Debug for Ident {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+@@ -941,7 +977,7 @@ impl fmt::Debug for Ident {
+ #[derive(Clone)]
+ pub struct Literal {
+ inner: imp::Literal,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ macro_rules! suffixed_int_literals {
+@@ -988,14 +1024,14 @@ impl Literal {
+ fn _new(inner: imp::Literal) -> Literal {
+ Literal {
+ inner,
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+ fn _new_stable(inner: fallback::Literal) -> Literal {
+ Literal {
+ inner: inner.into(),
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+
+@@ -1140,26 +1176,25 @@ impl Literal {
+ }
+ }
+
+-impl fmt::Debug for Literal {
++impl Debug for Literal {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+-impl fmt::Display for Literal {
++impl Display for Literal {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Display::fmt(&self.inner, f)
+ }
+ }
+
+ /// Public implementation details for the `TokenStream` type, such as iterators.
+ pub mod token_stream {
+- use std::fmt;
+- use std::marker;
+- use std::rc::Rc;
++ use crate::marker::Marker;
++ use crate::{imp, TokenTree};
++ use std::fmt::{self, Debug};
+
+ pub use crate::TokenStream;
+- use crate::{imp, TokenTree};
+
+ /// An iterator over `TokenStream`'s `TokenTree`s.
+ ///
+@@ -1168,7 +1203,7 @@ pub mod token_stream {
+ #[derive(Clone)]
+ pub struct IntoIter {
+ inner: imp::TokenTreeIter,
+- _marker: marker::PhantomData<Rc<()>>,
++ _marker: Marker,
+ }
+
+ impl Iterator for IntoIter {
+@@ -1179,9 +1214,9 @@ pub mod token_stream {
+ }
+ }
+
+- impl fmt::Debug for IntoIter {
++ impl Debug for IntoIter {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+- self.inner.fmt(f)
++ Debug::fmt(&self.inner, f)
+ }
+ }
+
+@@ -1192,7 +1227,7 @@ pub mod token_stream {
+ fn into_iter(self) -> IntoIter {
+ IntoIter {
+ inner: self.inner.into_iter(),
+- _marker: marker::PhantomData,
++ _marker: Marker,
+ }
+ }
+ }
+diff --git a/third_party/rust/proc-macro2/src/marker.rs b/third_party/rust/proc-macro2/src/marker.rs
+new file mode 100644
+index 0000000000..58729baf4a
+--- /dev/null
++++ mozilla-release/third_party/rust/proc-macro2/src/marker.rs
+@@ -0,0 +1,18 @@
++use std::marker::PhantomData;
++use std::panic::{RefUnwindSafe, UnwindSafe};
++use std::rc::Rc;
++
++// Zero sized marker with the correct set of autotrait impls we want all proc
++// macro types to have.
++pub(crate) type Marker = PhantomData<ProcMacroAutoTraits>;
++
++pub(crate) use self::value::*;
++
++mod value {
++ pub(crate) use std::marker::PhantomData as Marker;
++}
++
++pub(crate) struct ProcMacroAutoTraits(Rc<()>);
++
++impl UnwindSafe for ProcMacroAutoTraits {}
++impl RefUnwindSafe for ProcMacroAutoTraits {}
+diff --git a/third_party/rust/proc-macro2/src/parse.rs b/third_party/rust/proc-macro2/src/parse.rs
+new file mode 100644
+index 0000000000..365fe0484d
+--- /dev/null
++++ mozilla-release/third_party/rust/proc-macro2/src/parse.rs
+@@ -0,0 +1,849 @@
++use crate::fallback::{
++ is_ident_continue, is_ident_start, Group, LexError, Literal, Span, TokenStream,
++};
++use crate::{Delimiter, Punct, Spacing, TokenTree};
++use std::char;
++use std::str::{Bytes, CharIndices, Chars};
++
++#[derive(Copy, Clone, Eq, PartialEq)]
++pub(crate) struct Cursor<'a> {
++ pub rest: &'a str,
++ #[cfg(span_locations)]
++ pub off: u32,
++}
++
++impl<'a> Cursor<'a> {
++ fn advance(&self, bytes: usize) -> Cursor<'a> {
++ let (_front, rest) = self.rest.split_at(bytes);
++ Cursor {
++ rest,
++ #[cfg(span_locations)]
++ off: self.off + _front.chars().count() as u32,
++ }
++ }
++
++ fn starts_with(&self, s: &str) -> bool {
++ self.rest.starts_with(s)
++ }
++
++ pub(crate) fn is_empty(&self) -> bool {
++ self.rest.is_empty()
++ }
++
++ fn len(&self) -> usize {
++ self.rest.len()
++ }
++
++ fn as_bytes(&self) -> &'a [u8] {
++ self.rest.as_bytes()
++ }
++
++ fn bytes(&self) -> Bytes<'a> {
++ self.rest.bytes()
++ }
++
++ fn chars(&self) -> Chars<'a> {
++ self.rest.chars()
++ }
++
++ fn char_indices(&self) -> CharIndices<'a> {
++ self.rest.char_indices()
++ }
++
++ fn parse(&self, tag: &str) -> Result<Cursor<'a>, LexError> {
++ if self.starts_with(tag) {
++ Ok(self.advance(tag.len()))
++ } else {
++ Err(LexError)
++ }
++ }
++}
++
++type PResult<'a, O> = Result<(Cursor<'a>, O), LexError>;
++
++fn skip_whitespace(input: Cursor) -> Cursor {
++ let mut s = input;
++
++ while !s.is_empty() {
++ let byte = s.as_bytes()[0];
++ if byte == b'/' {
++ if s.starts_with("//")
++ && (!s.starts_with("///") || s.starts_with("////"))
++ && !s.starts_with("//!")
++ {
++ let (cursor, _) = take_until_newline_or_eof(s);
++ s = cursor;
++ continue;
++ } else if s.starts_with("/**/") {
++ s = s.advance(4);
++ continue;
++ } else if s.starts_with("/*")
++ && (!s.starts_with("/**") || s.starts_with("/***"))
++ && !s.starts_with("/*!")
++ {
++ match block_comment(s) {
++ Ok((rest, _)) => {
++ s = rest;
++ continue;
++ }
++ Err(LexError) => return s,
++ }
++ }
++ }
++ match byte {
++ b' ' | 0x09..=0x0d => {
++ s = s.advance(1);
++ continue;
++ }
++ b if b <= 0x7f => {}
++ _ => {
++ let ch = s.chars().next().unwrap();
++ if is_whitespace(ch) {
++ s = s.advance(ch.len_utf8());
++ continue;
++ }
++ }
++ }
++ return s;
++ }
++ s
++}
++
++fn block_comment(input: Cursor) -> PResult<&str> {
++ if !input.starts_with("/*") {
++ return Err(LexError);
++ }
++
++ let mut depth = 0;
++ let bytes = input.as_bytes();
++ let mut i = 0;
++ let upper = bytes.len() - 1;
++
++ while i < upper {
++ if bytes[i] == b'/' && bytes[i + 1] == b'*' {
++ depth += 1;
++ i += 1; // eat '*'
++ } else if bytes[i] == b'*' && bytes[i + 1] == b'/' {
++ depth -= 1;
++ if depth == 0 {
++ return Ok((input.advance(i + 2), &input.rest[..i + 2]));
++ }
++ i += 1; // eat '/'
++ }
++ i += 1;
++ }
++
++ Err(LexError)
++}
++
++fn is_whitespace(ch: char) -> bool {
++ // Rust treats left-to-right mark and right-to-left mark as whitespace
++ ch.is_whitespace() || ch == '\u{200e}' || ch == '\u{200f}'
++}
++
++fn word_break(input: Cursor) -> Result<Cursor, LexError> {
++ match input.chars().next() {
++ Some(ch) if is_ident_continue(ch) => Err(LexError),
++ Some(_) | None => Ok(input),
++ }
++}
++
++pub(crate) fn token_stream(mut input: Cursor) -> PResult<TokenStream> {
++ let mut trees = Vec::new();
++ let mut stack = Vec::new();
++
++ loop {
++ input = skip_whitespace(input);
++
++ if let Ok((rest, tt)) = doc_comment(input) {
++ trees.extend(tt);
++ input = rest;
++ continue;
++ }
++
++ #[cfg(span_locations)]
++ let lo = input.off;
++
++ let first = match input.bytes().next() {
++ Some(first) => first,
++ None => break,
++ };
++
++ if let Some(open_delimiter) = match first {
++ b'(' => Some(Delimiter::Parenthesis),
++ b'[' => Some(Delimiter::Bracket),
++ b'{' => Some(Delimiter::Brace),
++ _ => None,
++ } {
++ input = input.advance(1);
++ let frame = (open_delimiter, trees);
++ #[cfg(span_locations)]
++ let frame = (lo, frame);
++ stack.push(frame);
++ trees = Vec::new();
++ } else if let Some(close_delimiter) = match first {
++ b')' => Some(Delimiter::Parenthesis),
++ b']' => Some(Delimiter::Bracket),
++ b'}' => Some(Delimiter::Brace),
++ _ => None,
++ } {
++ input = input.advance(1);
++ let frame = stack.pop().ok_or(LexError)?;
++ #[cfg(span_locations)]
++ let (lo, frame) = frame;
++ let (open_delimiter, outer) = frame;
++ if open_delimiter != close_delimiter {
++ return Err(LexError);
++ }
++ let mut g = Group::new(open_delimiter, TokenStream { inner: trees });
++ g.set_span(Span {
++ #[cfg(span_locations)]
++ lo,
++ #[cfg(span_locations)]
++ hi: input.off,
++ });
++ trees = outer;
++ trees.push(TokenTree::Group(crate::Group::_new_stable(g)));
++ } else {
++ let (rest, mut tt) = leaf_token(input)?;
++ tt.set_span(crate::Span::_new_stable(Span {
++ #[cfg(span_locations)]
++ lo,
++ #[cfg(span_locations)]
++ hi: rest.off,
++ }));
++ trees.push(tt);
++ input = rest;
++ }
++ }
++
++ if stack.is_empty() {
++ Ok((input, TokenStream { inner: trees }))
++ } else {
++ Err(LexError)
++ }
++}
++
++fn leaf_token(input: Cursor) -> PResult<TokenTree> {
++ if let Ok((input, l)) = literal(input) {
++ // must be parsed before ident
++ Ok((input, TokenTree::Literal(crate::Literal::_new_stable(l))))
++ } else if let Ok((input, p)) = punct(input) {
++ Ok((input, TokenTree::Punct(p)))
++ } else if let Ok((input, i)) = ident(input) {
++ Ok((input, TokenTree::Ident(i)))
++ } else {
++ Err(LexError)
++ }
++}
++
++fn ident(input: Cursor) -> PResult<crate::Ident> {
++ if ["r\"", "r#\"", "r##", "b\"", "b\'", "br\"", "br#"]
++ .iter()
++ .any(|prefix| input.starts_with(prefix))
++ {
++ Err(LexError)
++ } else {
++ ident_any(input)
++ }
++}
++
++fn ident_any(input: Cursor) -> PResult<crate::Ident> {
++ let raw = input.starts_with("r#");
++ let rest = input.advance((raw as usize) << 1);
++
++ let (rest, sym) = ident_not_raw(rest)?;
++
++ if !raw {
++ let ident = crate::Ident::new(sym, crate::Span::call_site());
++ return Ok((rest, ident));
++ }
++
++ if sym == "_" {
++ return Err(LexError);
++ }
++
++ let ident = crate::Ident::_new_raw(sym, crate::Span::call_site());
++ Ok((rest, ident))
++}
++
++fn ident_not_raw(input: Cursor) -> PResult<&str> {
++ let mut chars = input.char_indices();
++
++ match chars.next() {
++ Some((_, ch)) if is_ident_start(ch) => {}
++ _ => return Err(LexError),
++ }
++
++ let mut end = input.len();
++ for (i, ch) in chars {
++ if !is_ident_continue(ch) {
++ end = i;
++ break;
++ }
++ }
++
++ Ok((input.advance(end), &input.rest[..end]))
++}
++
++fn literal(input: Cursor) -> PResult<Literal> {
++ match literal_nocapture(input) {
++ Ok(a) => {
++ let end = input.len() - a.len();
++ Ok((a, Literal::_new(input.rest[..end].to_string())))
++ }
++ Err(LexError) => Err(LexError),
++ }
++}
++
++fn literal_nocapture(input: Cursor) -> Result<Cursor, LexError> {
++ if let Ok(ok) = string(input) {
++ Ok(ok)
++ } else if let Ok(ok) = byte_string(input) {
++ Ok(ok)
++ } else if let Ok(ok) = byte(input) {
++ Ok(ok)
++ } else if let Ok(ok) = character(input) {
++ Ok(ok)
++ } else if let Ok(ok) = float(input) {
++ Ok(ok)
++ } else if let Ok(ok) = int(input) {
++ Ok(ok)
++ } else {
++ Err(LexError)
++ }
++}
++
++fn literal_suffix(input: Cursor) -> Cursor {
++ match ident_not_raw(input) {
++ Ok((input, _)) => input,
++ Err(LexError) => input,
++ }
++}
++
++fn string(input: Cursor) -> Result<Cursor, LexError> {
++ if let Ok(input) = input.parse("\"") {
++ cooked_string(input)
++ } else if let Ok(input) = input.parse("r") {
++ raw_string(input)
++ } else {
++ Err(LexError)
++ }
++}
++
++fn cooked_string(input: Cursor) -> Result<Cursor, LexError> {
++ let mut chars = input.char_indices().peekable();
++
++ while let Some((i, ch)) = chars.next() {
++ match ch {
++ '"' => {
++ let input = input.advance(i + 1);
++ return Ok(literal_suffix(input));
++ }
++ '\r' => match chars.next() {
++ Some((_, '\n')) => {}
++ _ => break,
++ },
++ '\\' => match chars.next() {
++ Some((_, 'x')) => {
++ if !backslash_x_char(&mut chars) {
++ break;
++ }
++ }
++ Some((_, 'n')) | Some((_, 'r')) | Some((_, 't')) | Some((_, '\\'))
++ | Some((_, '\'')) | Some((_, '"')) | Some((_, '0')) => {}
++ Some((_, 'u')) => {
++ if !backslash_u(&mut chars) {
++ break;
++ }
++ }
++ Some((_, ch @ '\n')) | Some((_, ch @ '\r')) => {
++ let mut last = ch;
++ loop {
++ if last == '\r' && chars.next().map_or(true, |(_, ch)| ch != '\n') {
++ return Err(LexError);
++ }
++ match chars.peek() {
++ Some((_, ch)) if ch.is_whitespace() => {
++ last = *ch;
++ chars.next();
++ }
++ _ => break,
++ }
++ }
++ }
++ _ => break,
++ },
++ _ch => {}
++ }
++ }
++ Err(LexError)
++}
++
++fn byte_string(input: Cursor) -> Result<Cursor, LexError> {
++ if let Ok(input) = input.parse("b\"") {
++ cooked_byte_string(input)
++ } else if let Ok(input) = input.parse("br") {
++ raw_string(input)
++ } else {
++ Err(LexError)
++ }
++}
++
++fn cooked_byte_string(mut input: Cursor) -> Result<Cursor, LexError> {
++ let mut bytes = input.bytes().enumerate();
++ while let Some((offset, b)) = bytes.next() {
++ match b {
++ b'"' => {
++ let input = input.advance(offset + 1);
++ return Ok(literal_suffix(input));
++ }
++ b'\r' => match bytes.next() {
++ Some((_, b'\n')) => {}
++ _ => break,
++ },
++ b'\\' => match bytes.next() {
++ Some((_, b'x')) => {
++ if !backslash_x_byte(&mut bytes) {
++ break;
++ }
++ }
++ Some((_, b'n')) | Some((_, b'r')) | Some((_, b't')) | Some((_, b'\\'))
++ | Some((_, b'0')) | Some((_, b'\'')) | Some((_, b'"')) => {}
++ Some((newline, b @ b'\n')) | Some((newline, b @ b'\r')) => {
++ let mut last = b as char;
++ let rest = input.advance(newline + 1);
++ let mut chars = rest.char_indices();
++ loop {
++ if last == '\r' && chars.next().map_or(true, |(_, ch)| ch != '\n') {
++ return Err(LexError);
++ }
++ match chars.next() {
++ Some((_, ch)) if ch.is_whitespace() => last = ch,
++ Some((offset, _)) => {
++ input = rest.advance(offset);
++ bytes = input.bytes().enumerate();
++ break;
++ }
++ None => return Err(LexError),
++ }
++ }
++ }
++ _ => break,
++ },
++ b if b < 0x80 => {}
++ _ => break,
++ }
++ }
++ Err(LexError)
++}
++
++fn raw_string(input: Cursor) -> Result<Cursor, LexError> {
++ let mut chars = input.char_indices();
++ let mut n = 0;
++ while let Some((i, ch)) = chars.next() {
++ match ch {
++ '"' => {
++ n = i;
++ break;
++ }
++ '#' => {}
++ _ => return Err(LexError),
++ }
++ }
++ while let Some((i, ch)) = chars.next() {
++ match ch {
++ '"' if input.rest[i + 1..].starts_with(&input.rest[..n]) => {
++ let rest = input.advance(i + 1 + n);
++ return Ok(literal_suffix(rest));
++ }
++ '\r' => match chars.next() {
++ Some((_, '\n')) => {}
++ _ => break,
++ },
++ _ => {}
++ }
++ }
++ Err(LexError)
++}
++
++fn byte(input: Cursor) -> Result<Cursor, LexError> {
++ let input = input.parse("b'")?;
++ let mut bytes = input.bytes().enumerate();
++ let ok = match bytes.next().map(|(_, b)| b) {
++ Some(b'\\') => match bytes.next().map(|(_, b)| b) {
++ Some(b'x') => backslash_x_byte(&mut bytes),
++ Some(b'n') | Some(b'r') | Some(b't') | Some(b'\\') | Some(b'0') | Some(b'\'')
++ | Some(b'"') => true,
++ _ => false,
++ },
++ b => b.is_some(),
++ };
++ if !ok {
++ return Err(LexError);
++ }
++ let (offset, _) = bytes.next().ok_or(LexError)?;
++ if !input.chars().as_str().is_char_boundary(offset) {
++ return Err(LexError);
++ }
++ let input = input.advance(offset).parse("'")?;
++ Ok(literal_suffix(input))
++}
++
++fn character(input: Cursor) -> Result<Cursor, LexError> {
++ let input = input.parse("'")?;
++ let mut chars = input.char_indices();
++ let ok = match chars.next().map(|(_, ch)| ch) {
++ Some('\\') => match chars.next().map(|(_, ch)| ch) {
++ Some('x') => backslash_x_char(&mut chars),
++ Some('u') => backslash_u(&mut chars),
++ Some('n') | Some('r') | Some('t') | Some('\\') | Some('0') | Some('\'') | Some('"') => {
++ true
++ }
++ _ => false,
++ },
++ ch => ch.is_some(),
++ };
++ if !ok {
++ return Err(LexError);
++ }
++ let (idx, _) = chars.next().ok_or(LexError)?;
++ let input = input.advance(idx).parse("'")?;
++ Ok(literal_suffix(input))
++}
++
++macro_rules! next_ch {
++ ($chars:ident @ $pat:pat $(| $rest:pat)*) => {
++ match $chars.next() {
++ Some((_, ch)) => match ch {
++ $pat $(| $rest)* => ch,
++ _ => return false,
++ },
++ None => return false,
++ }
++ };
++}
++
++fn backslash_x_char<I>(chars: &mut I) -> bool
++where
++ I: Iterator<Item = (usize, char)>,
++{
++ next_ch!(chars @ '0'..='7');
++ next_ch!(chars @ '0'..='9' | 'a'..='f' | 'A'..='F');
++ true
++}
++
++fn backslash_x_byte<I>(chars: &mut I) -> bool
++where
++ I: Iterator<Item = (usize, u8)>,
++{
++ next_ch!(chars @ b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F');
++ next_ch!(chars @ b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F');
++ true
++}
++
++fn backslash_u<I>(chars: &mut I) -> bool
++where
++ I: Iterator<Item = (usize, char)>,
++{
++ next_ch!(chars @ '{');
++ let mut value = 0;
++ let mut len = 0;
++ while let Some((_, ch)) = chars.next() {
++ let digit = match ch {
++ '0'..='9' => ch as u8 - b'0',
++ 'a'..='f' => 10 + ch as u8 - b'a',
++ 'A'..='F' => 10 + ch as u8 - b'A',
++ '_' if len > 0 => continue,
++ '}' if len > 0 => return char::from_u32(value).is_some(),
++ _ => return false,
++ };
++ if len == 6 {
++ return false;
++ }
++ value *= 0x10;
++ value += u32::from(digit);
++ len += 1;
++ }
++ false
++}
++
++fn float(input: Cursor) -> Result<Cursor, LexError> {
++ let mut rest = float_digits(input)?;
++ if let Some(ch) = rest.chars().next() {
++ if is_ident_start(ch) {
++ rest = ident_not_raw(rest)?.0;
++ }
++ }
++ word_break(rest)
++}
++
++fn float_digits(input: Cursor) -> Result<Cursor, LexError> {
++ let mut chars = input.chars().peekable();
++ match chars.next() {
++ Some(ch) if ch >= '0' && ch <= '9' => {}
++ _ => return Err(LexError),
++ }
++
++ let mut len = 1;
++ let mut has_dot = false;
++ let mut has_exp = false;
++ while let Some(&ch) = chars.peek() {
++ match ch {
++ '0'..='9' | '_' => {
++ chars.next();
++ len += 1;
++ }
++ '.' => {
++ if has_dot {
++ break;
++ }
++ chars.next();
++ if chars
++ .peek()
++ .map(|&ch| ch == '.' || is_ident_start(ch))
++ .unwrap_or(false)
++ {
++ return Err(LexError);
++ }
++ len += 1;
++ has_dot = true;
++ }
++ 'e' | 'E' => {
++ chars.next();
++ len += 1;
++ has_exp = true;
++ break;
++ }
++ _ => break,
++ }
++ }
++
++ if !(has_dot || has_exp) {
++ return Err(LexError);
++ }
++
++ if has_exp {
++ let token_before_exp = if has_dot {
++ Ok(input.advance(len - 1))
++ } else {
++ Err(LexError)
++ };
++ let mut has_sign = false;
++ let mut has_exp_value = false;
++ while let Some(&ch) = chars.peek() {
++ match ch {
++ '+' | '-' => {
++ if has_exp_value {
++ break;
++ }
++ if has_sign {
++ return token_before_exp;
++ }
++ chars.next();
++ len += 1;
++ has_sign = true;
++ }
++ '0'..='9' => {
++ chars.next();
++ len += 1;
++ has_exp_value = true;
++ }
++ '_' => {
++ chars.next();
++ len += 1;
++ }
++ _ => break,
++ }
++ }
++ if !has_exp_value {
++ return token_before_exp;
++ }
++ }
++
++ Ok(input.advance(len))
++}
++
++fn int(input: Cursor) -> Result<Cursor, LexError> {
++ let mut rest = digits(input)?;
++ if let Some(ch) = rest.chars().next() {
++ if is_ident_start(ch) {
++ rest = ident_not_raw(rest)?.0;
++ }
++ }
++ word_break(rest)
++}
++
++fn digits(mut input: Cursor) -> Result<Cursor, LexError> {
++ let base = if input.starts_with("0x") {
++ input = input.advance(2);
++ 16
++ } else if input.starts_with("0o") {
++ input = input.advance(2);
++ 8
++ } else if input.starts_with("0b") {
++ input = input.advance(2);
++ 2
++ } else {
++ 10
++ };
++
++ let mut len = 0;
++ let mut empty = true;
++ for b in input.bytes() {
++ match b {
++ b'0'..=b'9' => {
++ let digit = (b - b'0') as u64;
++ if digit >= base {
++ return Err(LexError);
++ }
++ }
++ b'a'..=b'f' => {
++ let digit = 10 + (b - b'a') as u64;
++ if digit >= base {
++ break;
++ }
++ }
++ b'A'..=b'F' => {
++ let digit = 10 + (b - b'A') as u64;
++ if digit >= base {
++ break;
++ }
++ }
++ b'_' => {
++ if empty && base == 10 {
++ return Err(LexError);
++ }
++ len += 1;
++ continue;
++ }
++ _ => break,
++ };
++ len += 1;
++ empty = false;
++ }
++ if empty {
++ Err(LexError)
++ } else {
++ Ok(input.advance(len))
++ }
++}
++
++fn punct(input: Cursor) -> PResult<Punct> {
++ match punct_char(input) {
++ Ok((rest, '\'')) => {
++ if ident_any(rest)?.0.starts_with("'") {
++ Err(LexError)
++ } else {
++ Ok((rest, Punct::new('\'', Spacing::Joint)))
++ }
++ }
++ Ok((rest, ch)) => {
++ let kind = match punct_char(rest) {
++ Ok(_) => Spacing::Joint,
++ Err(LexError) => Spacing::Alone,
++ };
++ Ok((rest, Punct::new(ch, kind)))
++ }
++ Err(LexError) => Err(LexError),
++ }
++}
++
++fn punct_char(input: Cursor) -> PResult<char> {
++ if input.starts_with("//") || input.starts_with("/*") {
++ // Do not accept `/` of a comment as a punct.
++ return Err(LexError);
++ }
++
++ let mut chars = input.chars();
++ let first = match chars.next() {
++ Some(ch) => ch,
++ None => {
++ return Err(LexError);
++ }
++ };
++ let recognized = "~!@#$%^&*-=+|;:,<.>/?'";
++ if recognized.contains(first) {
++ Ok((input.advance(first.len_utf8()), first))
++ } else {
++ Err(LexError)
++ }
++}
++
++fn doc_comment(input: Cursor) -> PResult<Vec<TokenTree>> {
++ #[cfg(span_locations)]
++ let lo = input.off;
++ let (rest, (comment, inner)) = doc_comment_contents(input)?;
++ let span = crate::Span::_new_stable(Span {
++ #[cfg(span_locations)]
++ lo,
++ #[cfg(span_locations)]
++ hi: rest.off,
++ });
++
++ let mut scan_for_bare_cr = comment;
++ while let Some(cr) = scan_for_bare_cr.find('\r') {
++ let rest = &scan_for_bare_cr[cr + 1..];
++ if !rest.starts_with('\n') {
++ return Err(LexError);
++ }
++ scan_for_bare_cr = rest;
++ }
++
++ let mut trees = Vec::new();
++ trees.push(TokenTree::Punct(Punct::new('#', Spacing::Alone)));
++ if inner {
++ trees.push(Punct::new('!', Spacing::Alone).into());
++ }
++ let mut stream = vec![
++ TokenTree::Ident(crate::Ident::new("doc", span)),
++ TokenTree::Punct(Punct::new('=', Spacing::Alone)),
++ TokenTree::Literal(crate::Literal::string(comment)),
++ ];
++ for tt in stream.iter_mut() {
++ tt.set_span(span);
++ }
++ let group = Group::new(Delimiter::Bracket, stream.into_iter().collect());
++ trees.push(crate::Group::_new_stable(group).into());
++ for tt in trees.iter_mut() {
++ tt.set_span(span);
++ }
++ Ok((rest, trees))
++}
++
++fn doc_comment_contents(input: Cursor) -> PResult<(&str, bool)> {
++ if input.starts_with("//!") {
++ let input = input.advance(3);
++ let (input, s) = take_until_newline_or_eof(input);
++ Ok((input, (s, true)))
++ } else if input.starts_with("/*!") {
++ let (input, s) = block_comment(input)?;
++ Ok((input, (&s[3..s.len() - 2], true)))
++ } else if input.starts_with("///") {
++ let input = input.advance(3);
++ if input.starts_with("/") {
++ return Err(LexError);
++ }
++ let (input, s) = take_until_newline_or_eof(input);
++ Ok((input, (s, false)))
++ } else if input.starts_with("/**") && !input.rest[3..].starts_with('*') {
++ let (input, s) = block_comment(input)?;
++ Ok((input, (&s[3..s.len() - 2], false)))
++ } else {
++ Err(LexError)
++ }
++}
++
++fn take_until_newline_or_eof(input: Cursor) -> (Cursor, &str) {
++ let chars = input.char_indices();
++
++ for (i, ch) in chars {
++ if ch == '\n' {
++ return (input.advance(i), &input.rest[..i]);
++ } else if ch == '\r' && input.rest[i + 1..].starts_with('\n') {
++ return (input.advance(i + 1), &input.rest[..i]);
++ }
++ }
++
++ (input.advance(input.len()), input.rest)
++}
+diff --git a/third_party/rust/proc-macro2/src/strnom.rs b/third_party/rust/proc-macro2/src/strnom.rs
+deleted file mode 100644
+index eb7d0b8a8e..0000000000
+--- mozilla-release/third_party/rust/proc-macro2/src/strnom.rs
++++ mozilla-release//dev/null
+@@ -1,391 +0,0 @@
+-//! Adapted from [`nom`](https://github.com/Geal/nom).
+-
+-use crate::fallback::LexError;
+-use std::str::{Bytes, CharIndices, Chars};
+-use unicode_xid::UnicodeXID;
+-
+-#[derive(Copy, Clone, Eq, PartialEq)]
+-pub struct Cursor<'a> {
+- pub rest: &'a str,
+- #[cfg(span_locations)]
+- pub off: u32,
+-}
+-
+-impl<'a> Cursor<'a> {
+- #[cfg(not(span_locations))]
+- pub fn advance(&self, amt: usize) -> Cursor<'a> {
+- Cursor {
+- rest: &self.rest[amt..],
+- }
+- }
+- #[cfg(span_locations)]
+- pub fn advance(&self, amt: usize) -> Cursor<'a> {
+- Cursor {
+- rest: &self.rest[amt..],
+- off: self.off + (amt as u32),
+- }
+- }
+-
+- pub fn find(&self, p: char) -> Option<usize> {
+- self.rest.find(p)
+- }
+-
+- pub fn starts_with(&self, s: &str) -> bool {
+- self.rest.starts_with(s)
+- }
+-
+- pub fn is_empty(&self) -> bool {
+- self.rest.is_empty()
+- }
+-
+- pub fn len(&self) -> usize {
+- self.rest.len()
+- }
+-
+- pub fn as_bytes(&self) -> &'a [u8] {
+- self.rest.as_bytes()
+- }
+-
+- pub fn bytes(&self) -> Bytes<'a> {
+- self.rest.bytes()
+- }
+-
+- pub fn chars(&self) -> Chars<'a> {
+- self.rest.chars()
+- }
+-
+- pub fn char_indices(&self) -> CharIndices<'a> {
+- self.rest.char_indices()
+- }
+-}
+-
+-pub type PResult<'a, O> = Result<(Cursor<'a>, O), LexError>;
+-
+-pub fn whitespace(input: Cursor) -> PResult<()> {
+- if input.is_empty() {
+- return Err(LexError);
+- }
+-
+- let bytes = input.as_bytes();
+- let mut i = 0;
+- while i < bytes.len() {
+- let s = input.advance(i);
+- if bytes[i] == b'/' {
+- if s.starts_with("//")
+- && (!s.starts_with("///") || s.starts_with("////"))
+- && !s.starts_with("//!")
+- {
+- if let Some(len) = s.find('\n') {
+- i += len + 1;
+- continue;
+- }
+- break;
+- } else if s.starts_with("/**/") {
+- i += 4;
+- continue;
+- } else if s.starts_with("/*")
+- && (!s.starts_with("/**") || s.starts_with("/***"))
+- && !s.starts_with("/*!")
+- {
+- let (_, com) = block_comment(s)?;
+- i += com.len();
+- continue;
+- }
+- }
+- match bytes[i] {
+- b' ' | 0x09..=0x0d => {
+- i += 1;
+- continue;
+- }
+- b if b <= 0x7f => {}
+- _ => {
+- let ch = s.chars().next().unwrap();
+- if is_whitespace(ch) {
+- i += ch.len_utf8();
+- continue;
+- }
+- }
+- }
+- return if i > 0 { Ok((s, ())) } else { Err(LexError) };
+- }
+- Ok((input.advance(input.len()), ()))
+-}
+-
+-pub fn block_comment(input: Cursor) -> PResult<&str> {
+- if !input.starts_with("/*") {
+- return Err(LexError);
+- }
+-
+- let mut depth = 0;
+- let bytes = input.as_bytes();
+- let mut i = 0;
+- let upper = bytes.len() - 1;
+- while i < upper {
+- if bytes[i] == b'/' && bytes[i + 1] == b'*' {
+- depth += 1;
+- i += 1; // eat '*'
+- } else if bytes[i] == b'*' && bytes[i + 1] == b'/' {
+- depth -= 1;
+- if depth == 0 {
+- return Ok((input.advance(i + 2), &input.rest[..i + 2]));
+- }
+- i += 1; // eat '/'
+- }
+- i += 1;
+- }
+- Err(LexError)
+-}
+-
+-pub fn skip_whitespace(input: Cursor) -> Cursor {
+- match whitespace(input) {
+- Ok((rest, _)) => rest,
+- Err(LexError) => input,
+- }
+-}
+-
+-fn is_whitespace(ch: char) -> bool {
+- // Rust treats left-to-right mark and right-to-left mark as whitespace
+- ch.is_whitespace() || ch == '\u{200e}' || ch == '\u{200f}'
+-}
+-
+-pub fn word_break(input: Cursor) -> PResult<()> {
+- match input.chars().next() {
+- Some(ch) if UnicodeXID::is_xid_continue(ch) => Err(LexError),
+- Some(_) | None => Ok((input, ())),
+- }
+-}
+-
+-macro_rules! named {
+- ($name:ident -> $o:ty, $submac:ident!( $($args:tt)* )) => {
+- fn $name<'a>(i: Cursor<'a>) -> $crate::strnom::PResult<'a, $o> {
+- $submac!(i, $($args)*)
+- }
+- };
+-}
+-
+-macro_rules! alt {
+- ($i:expr, $e:ident | $($rest:tt)*) => {
+- alt!($i, call!($e) | $($rest)*)
+- };
+-
+- ($i:expr, $subrule:ident!( $($args:tt)*) | $($rest:tt)*) => {
+- match $subrule!($i, $($args)*) {
+- res @ Ok(_) => res,
+- _ => alt!($i, $($rest)*)
+- }
+- };
+-
+- ($i:expr, $subrule:ident!( $($args:tt)* ) => { $gen:expr } | $($rest:tt)+) => {
+- match $subrule!($i, $($args)*) {
+- Ok((i, o)) => Ok((i, $gen(o))),
+- Err(LexError) => alt!($i, $($rest)*)
+- }
+- };
+-
+- ($i:expr, $e:ident => { $gen:expr } | $($rest:tt)*) => {
+- alt!($i, call!($e) => { $gen } | $($rest)*)
+- };
+-
+- ($i:expr, $e:ident => { $gen:expr }) => {
+- alt!($i, call!($e) => { $gen })
+- };
+-
+- ($i:expr, $subrule:ident!( $($args:tt)* ) => { $gen:expr }) => {
+- match $subrule!($i, $($args)*) {
+- Ok((i, o)) => Ok((i, $gen(o))),
+- Err(LexError) => Err(LexError),
+- }
+- };
+-
+- ($i:expr, $e:ident) => {
+- alt!($i, call!($e))
+- };
+-
+- ($i:expr, $subrule:ident!( $($args:tt)*)) => {
+- $subrule!($i, $($args)*)
+- };
+-}
+-
+-macro_rules! do_parse {
+- ($i:expr, ( $($rest:expr),* )) => {
+- Ok(($i, ( $($rest),* )))
+- };
+-
+- ($i:expr, $e:ident >> $($rest:tt)*) => {
+- do_parse!($i, call!($e) >> $($rest)*)
+- };
+-
+- ($i:expr, $submac:ident!( $($args:tt)* ) >> $($rest:tt)*) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, _)) => do_parse!(i, $($rest)*),
+- }
+- };
+-
+- ($i:expr, $field:ident : $e:ident >> $($rest:tt)*) => {
+- do_parse!($i, $field: call!($e) >> $($rest)*)
+- };
+-
+- ($i:expr, $field:ident : $submac:ident!( $($args:tt)* ) >> $($rest:tt)*) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, o)) => {
+- let $field = o;
+- do_parse!(i, $($rest)*)
+- },
+- }
+- };
+-}
+-
+-macro_rules! peek {
+- ($i:expr, $submac:ident!( $($args:tt)* )) => {
+- match $submac!($i, $($args)*) {
+- Ok((_, o)) => Ok(($i, o)),
+- Err(LexError) => Err(LexError),
+- }
+- };
+-}
+-
+-macro_rules! call {
+- ($i:expr, $fun:expr $(, $args:expr)*) => {
+- $fun($i $(, $args)*)
+- };
+-}
+-
+-macro_rules! option {
+- ($i:expr, $f:expr) => {
+- match $f($i) {
+- Ok((i, o)) => Ok((i, Some(o))),
+- Err(LexError) => Ok(($i, None)),
+- }
+- };
+-}
+-
+-macro_rules! take_until_newline_or_eof {
+- ($i:expr,) => {{
+- if $i.len() == 0 {
+- Ok(($i, ""))
+- } else {
+- match $i.find('\n') {
+- Some(i) => Ok(($i.advance(i), &$i.rest[..i])),
+- None => Ok(($i.advance($i.len()), &$i.rest[..$i.len()])),
+- }
+- }
+- }};
+-}
+-
+-macro_rules! tuple {
+- ($i:expr, $($rest:tt)*) => {
+- tuple_parser!($i, (), $($rest)*)
+- };
+-}
+-
+-/// Do not use directly. Use `tuple!`.
+-macro_rules! tuple_parser {
+- ($i:expr, ($($parsed:tt),*), $e:ident, $($rest:tt)*) => {
+- tuple_parser!($i, ($($parsed),*), call!($e), $($rest)*)
+- };
+-
+- ($i:expr, (), $submac:ident!( $($args:tt)* ), $($rest:tt)*) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, o)) => tuple_parser!(i, (o), $($rest)*),
+- }
+- };
+-
+- ($i:expr, ($($parsed:tt)*), $submac:ident!( $($args:tt)* ), $($rest:tt)*) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, o)) => tuple_parser!(i, ($($parsed)* , o), $($rest)*),
+- }
+- };
+-
+- ($i:expr, ($($parsed:tt),*), $e:ident) => {
+- tuple_parser!($i, ($($parsed),*), call!($e))
+- };
+-
+- ($i:expr, (), $submac:ident!( $($args:tt)* )) => {
+- $submac!($i, $($args)*)
+- };
+-
+- ($i:expr, ($($parsed:expr),*), $submac:ident!( $($args:tt)* )) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, o)) => Ok((i, ($($parsed),*, o)))
+- }
+- };
+-
+- ($i:expr, ($($parsed:expr),*)) => {
+- Ok(($i, ($($parsed),*)))
+- };
+-}
+-
+-macro_rules! not {
+- ($i:expr, $submac:ident!( $($args:tt)* )) => {
+- match $submac!($i, $($args)*) {
+- Ok((_, _)) => Err(LexError),
+- Err(LexError) => Ok(($i, ())),
+- }
+- };
+-}
+-
+-macro_rules! tag {
+- ($i:expr, $tag:expr) => {
+- if $i.starts_with($tag) {
+- Ok(($i.advance($tag.len()), &$i.rest[..$tag.len()]))
+- } else {
+- Err(LexError)
+- }
+- };
+-}
+-
+-macro_rules! punct {
+- ($i:expr, $punct:expr) => {
+- $crate::strnom::punct($i, $punct)
+- };
+-}
+-
+-/// Do not use directly. Use `punct!`.
+-pub fn punct<'a>(input: Cursor<'a>, token: &'static str) -> PResult<'a, &'a str> {
+- let input = skip_whitespace(input);
+- if input.starts_with(token) {
+- Ok((input.advance(token.len()), token))
+- } else {
+- Err(LexError)
+- }
+-}
+-
+-macro_rules! preceded {
+- ($i:expr, $submac:ident!( $($args:tt)* ), $submac2:ident!( $($args2:tt)* )) => {
+- match tuple!($i, $submac!($($args)*), $submac2!($($args2)*)) {
+- Ok((remaining, (_, o))) => Ok((remaining, o)),
+- Err(LexError) => Err(LexError),
+- }
+- };
+-
+- ($i:expr, $submac:ident!( $($args:tt)* ), $g:expr) => {
+- preceded!($i, $submac!($($args)*), call!($g))
+- };
+-}
+-
+-macro_rules! delimited {
+- ($i:expr, $submac:ident!( $($args:tt)* ), $($rest:tt)+) => {
+- match tuple_parser!($i, (), $submac!($($args)*), $($rest)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i1, (_, o, _))) => Ok((i1, o))
+- }
+- };
+-}
+-
+-macro_rules! map {
+- ($i:expr, $submac:ident!( $($args:tt)* ), $g:expr) => {
+- match $submac!($i, $($args)*) {
+- Err(LexError) => Err(LexError),
+- Ok((i, o)) => Ok((i, call!(o, $g)))
+- }
+- };
+-
+- ($i:expr, $f:expr, $g:expr) => {
+- map!($i, call!($f), $g)
+- };
+-}
+diff --git a/third_party/rust/proc-macro2/src/wrapper.rs b/third_party/rust/proc-macro2/src/wrapper.rs
+index 552b9381cf..3df044af17 100644
+--- mozilla-release/third_party/rust/proc-macro2/src/wrapper.rs
++++ mozilla-release/third_party/rust/proc-macro2/src/wrapper.rs
+@@ -1,15 +1,15 @@
+-use std::fmt;
+-use std::iter;
++use crate::detection::inside_proc_macro;
++use crate::{fallback, Delimiter, Punct, Spacing, TokenTree};
++use std::fmt::{self, Debug, Display};
++use std::iter::FromIterator;
+ use std::ops::RangeBounds;
+-use std::panic::{self, PanicInfo};
++use std::panic;
+ #[cfg(super_unstable)]
+ use std::path::PathBuf;
+ use std::str::FromStr;
+
+-use crate::{fallback, Delimiter, Punct, Spacing, TokenTree};
+-
+ #[derive(Clone)]
+-pub enum TokenStream {
++pub(crate) enum TokenStream {
+ Compiler(DeferredTokenStream),
+ Fallback(fallback::TokenStream),
+ }
+@@ -19,73 +19,16 @@ pub enum TokenStream {
+ // we hold on to the appended tokens and do proc_macro::TokenStream::extend as
+ // late as possible to batch together consecutive uses of the Extend impl.
+ #[derive(Clone)]
+-pub struct DeferredTokenStream {
++pub(crate) struct DeferredTokenStream {
+ stream: proc_macro::TokenStream,
+ extra: Vec<proc_macro::TokenTree>,
+ }
+
+-pub enum LexError {
++pub(crate) enum LexError {
+ Compiler(proc_macro::LexError),
+ Fallback(fallback::LexError),
+ }
+
+-fn nightly_works() -> bool {
+- use std::sync::atomic::*;
+- use std::sync::Once;
+-
+- static WORKS: AtomicUsize = AtomicUsize::new(0);
+- static INIT: Once = Once::new();
+-
+- match WORKS.load(Ordering::SeqCst) {
+- 1 => return false,
+- 2 => return true,
+- _ => {}
+- }
+-
+- // Swap in a null panic hook to avoid printing "thread panicked" to stderr,
+- // then use catch_unwind to determine whether the compiler's proc_macro is
+- // working. When proc-macro2 is used from outside of a procedural macro all
+- // of the proc_macro crate's APIs currently panic.
+- //
+- // The Once is to prevent the possibility of this ordering:
+- //
+- // thread 1 calls take_hook, gets the user's original hook
+- // thread 1 calls set_hook with the null hook
+- // thread 2 calls take_hook, thinks null hook is the original hook
+- // thread 2 calls set_hook with the null hook
+- // thread 1 calls set_hook with the actual original hook
+- // thread 2 calls set_hook with what it thinks is the original hook
+- //
+- // in which the user's hook has been lost.
+- //
+- // There is still a race condition where a panic in a different thread can
+- // happen during the interval that the user's original panic hook is
+- // unregistered such that their hook is incorrectly not called. This is
+- // sufficiently unlikely and less bad than printing panic messages to stderr
+- // on correct use of this crate. Maybe there is a libstd feature request
+- // here. For now, if a user needs to guarantee that this failure mode does
+- // not occur, they need to call e.g. `proc_macro2::Span::call_site()` from
+- // the main thread before launching any other threads.
+- INIT.call_once(|| {
+- type PanicHook = dyn Fn(&PanicInfo) + Sync + Send + 'static;
+-
+- let null_hook: Box<PanicHook> = Box::new(|_panic_info| { /* ignore */ });
+- let sanity_check = &*null_hook as *const PanicHook;
+- let original_hook = panic::take_hook();
+- panic::set_hook(null_hook);
+-
+- let works = panic::catch_unwind(|| proc_macro::Span::call_site()).is_ok();
+- WORKS.store(works as usize + 1, Ordering::SeqCst);
+-
+- let hopefully_null_hook = panic::take_hook();
+- panic::set_hook(original_hook);
+- if sanity_check != &*hopefully_null_hook {
+- panic!("observed race condition in proc_macro2::nightly_works");
+- }
+- });
+- nightly_works()
+-}
+-
+ fn mismatch() -> ! {
+ panic!("stable/nightly mismatch")
+ }
+@@ -103,7 +46,12 @@ impl DeferredTokenStream {
+ }
+
+ fn evaluate_now(&mut self) {
+- self.stream.extend(self.extra.drain(..));
++ // If-check provides a fast short circuit for the common case of `extra`
++ // being empty, which saves a round trip over the proc macro bridge.
++ // Improves macro expansion time in winrt by 6% in debug mode.
++ if !self.extra.is_empty() {
++ self.stream.extend(self.extra.drain(..));
++ }
+ }
+
+ fn into_token_stream(mut self) -> proc_macro::TokenStream {
+@@ -114,7 +62,7 @@ impl DeferredTokenStream {
+
+ impl TokenStream {
+ pub fn new() -> TokenStream {
+- if nightly_works() {
++ if inside_proc_macro() {
+ TokenStream::Compiler(DeferredTokenStream::new(proc_macro::TokenStream::new()))
+ } else {
+ TokenStream::Fallback(fallback::TokenStream::new())
+@@ -147,9 +95,9 @@ impl FromStr for TokenStream {
+ type Err = LexError;
+
+ fn from_str(src: &str) -> Result<TokenStream, LexError> {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Ok(TokenStream::Compiler(DeferredTokenStream::new(
+- src.parse()?,
++ proc_macro_parse(src)?,
+ )))
+ } else {
+ Ok(TokenStream::Fallback(src.parse()?))
+@@ -157,11 +105,17 @@ impl FromStr for TokenStream {
+ }
+ }
+
+-impl fmt::Display for TokenStream {
++// Work around https://github.com/rust-lang/rust/issues/58736.
++fn proc_macro_parse(src: &str) -> Result<proc_macro::TokenStream, LexError> {
++ panic::catch_unwind(|| src.parse().map_err(LexError::Compiler))
++ .unwrap_or(Err(LexError::Fallback(fallback::LexError)))
++}
++
++impl Display for TokenStream {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- TokenStream::Compiler(tts) => tts.clone().into_token_stream().fmt(f),
+- TokenStream::Fallback(tts) => tts.fmt(f),
++ TokenStream::Compiler(tts) => Display::fmt(&tts.clone().into_token_stream(), f),
++ TokenStream::Fallback(tts) => Display::fmt(tts, f),
+ }
+ }
+ }
+@@ -187,7 +141,7 @@ impl From<fallback::TokenStream> for TokenStream {
+ }
+ }
+
+-// Assumes nightly_works().
++// Assumes inside_proc_macro().
+ fn into_compiler_token(token: TokenTree) -> proc_macro::TokenTree {
+ match token {
+ TokenTree::Group(tt) => tt.inner.unwrap_nightly().into(),
+@@ -196,9 +150,9 @@ fn into_compiler_token(token: TokenTree) -> proc_macro::TokenTree {
+ Spacing::Joint => proc_macro::Spacing::Joint,
+ Spacing::Alone => proc_macro::Spacing::Alone,
+ };
+- let mut op = proc_macro::Punct::new(tt.as_char(), spacing);
+- op.set_span(tt.span().inner.unwrap_nightly());
+- op.into()
++ let mut punct = proc_macro::Punct::new(tt.as_char(), spacing);
++ punct.set_span(tt.span().inner.unwrap_nightly());
++ punct.into()
+ }
+ TokenTree::Ident(tt) => tt.inner.unwrap_nightly().into(),
+ TokenTree::Literal(tt) => tt.inner.unwrap_nightly().into(),
+@@ -207,7 +161,7 @@ fn into_compiler_token(token: TokenTree) -> proc_macro::TokenTree {
+
+ impl From<TokenTree> for TokenStream {
+ fn from(token: TokenTree) -> TokenStream {
+- if nightly_works() {
++ if inside_proc_macro() {
+ TokenStream::Compiler(DeferredTokenStream::new(into_compiler_token(token).into()))
+ } else {
+ TokenStream::Fallback(token.into())
+@@ -215,9 +169,9 @@ impl From<TokenTree> for TokenStream {
+ }
+ }
+
+-impl iter::FromIterator<TokenTree> for TokenStream {
++impl FromIterator<TokenTree> for TokenStream {
+ fn from_iter<I: IntoIterator<Item = TokenTree>>(trees: I) -> Self {
+- if nightly_works() {
++ if inside_proc_macro() {
+ TokenStream::Compiler(DeferredTokenStream::new(
+ trees.into_iter().map(into_compiler_token).collect(),
+ ))
+@@ -227,7 +181,7 @@ impl iter::FromIterator<TokenTree> for TokenStream {
+ }
+ }
+
+-impl iter::FromIterator<TokenStream> for TokenStream {
++impl FromIterator<TokenStream> for TokenStream {
+ fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
+ let mut streams = streams.into_iter();
+ match streams.next() {
+@@ -252,14 +206,15 @@ impl iter::FromIterator<TokenStream> for TokenStream {
+ }
+
+ impl Extend<TokenTree> for TokenStream {
+- fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
++ fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, stream: I) {
+ match self {
+ TokenStream::Compiler(tts) => {
+ // Here is the reason for DeferredTokenStream.
+- tts.extra
+- .extend(streams.into_iter().map(into_compiler_token));
++ for token in stream {
++ tts.extra.push(into_compiler_token(token));
++ }
+ }
+- TokenStream::Fallback(tts) => tts.extend(streams),
++ TokenStream::Fallback(tts) => tts.extend(stream),
+ }
+ }
+ }
+@@ -270,20 +225,20 @@ impl Extend<TokenStream> for TokenStream {
+ TokenStream::Compiler(tts) => {
+ tts.evaluate_now();
+ tts.stream
+- .extend(streams.into_iter().map(|stream| stream.unwrap_nightly()));
++ .extend(streams.into_iter().map(TokenStream::unwrap_nightly));
+ }
+ TokenStream::Fallback(tts) => {
+- tts.extend(streams.into_iter().map(|stream| stream.unwrap_stable()));
++ tts.extend(streams.into_iter().map(TokenStream::unwrap_stable));
+ }
+ }
+ }
+ }
+
+-impl fmt::Debug for TokenStream {
++impl Debug for TokenStream {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- TokenStream::Compiler(tts) => tts.clone().into_token_stream().fmt(f),
+- TokenStream::Fallback(tts) => tts.fmt(f),
++ TokenStream::Compiler(tts) => Debug::fmt(&tts.clone().into_token_stream(), f),
++ TokenStream::Fallback(tts) => Debug::fmt(tts, f),
+ }
+ }
+ }
+@@ -300,17 +255,29 @@ impl From<fallback::LexError> for LexError {
+ }
+ }
+
+-impl fmt::Debug for LexError {
++impl Debug for LexError {
++ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ LexError::Compiler(e) => Debug::fmt(e, f),
++ LexError::Fallback(e) => Debug::fmt(e, f),
++ }
++ }
++}
++
++impl Display for LexError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- LexError::Compiler(e) => e.fmt(f),
+- LexError::Fallback(e) => e.fmt(f),
++ #[cfg(lexerror_display)]
++ LexError::Compiler(e) => Display::fmt(e, f),
++ #[cfg(not(lexerror_display))]
++ LexError::Compiler(_e) => Display::fmt(&fallback::LexError, f),
++ LexError::Fallback(e) => Display::fmt(e, f),
+ }
+ }
+ }
+
+ #[derive(Clone)]
+-pub enum TokenTreeIter {
++pub(crate) enum TokenTreeIter {
+ Compiler(proc_macro::token_stream::IntoIter),
+ Fallback(fallback::TokenTreeIter),
+ }
+@@ -361,7 +328,7 @@ impl Iterator for TokenTreeIter {
+ }
+ }
+
+-impl fmt::Debug for TokenTreeIter {
++impl Debug for TokenTreeIter {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.debug_struct("TokenTreeIter").finish()
+ }
+@@ -369,7 +336,7 @@ impl fmt::Debug for TokenTreeIter {
+
+ #[derive(Clone, PartialEq, Eq)]
+ #[cfg(super_unstable)]
+-pub enum SourceFile {
++pub(crate) enum SourceFile {
+ Compiler(proc_macro::SourceFile),
+ Fallback(fallback::SourceFile),
+ }
+@@ -397,58 +364,77 @@ impl SourceFile {
+ }
+
+ #[cfg(super_unstable)]
+-impl fmt::Debug for SourceFile {
++impl Debug for SourceFile {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- SourceFile::Compiler(a) => a.fmt(f),
+- SourceFile::Fallback(a) => a.fmt(f),
++ SourceFile::Compiler(a) => Debug::fmt(a, f),
++ SourceFile::Fallback(a) => Debug::fmt(a, f),
+ }
+ }
+ }
+
+ #[cfg(any(super_unstable, feature = "span-locations"))]
+-pub struct LineColumn {
++pub(crate) struct LineColumn {
+ pub line: usize,
+ pub column: usize,
+ }
+
+ #[derive(Copy, Clone)]
+-pub enum Span {
++pub(crate) enum Span {
+ Compiler(proc_macro::Span),
+ Fallback(fallback::Span),
+ }
+
+ impl Span {
+ pub fn call_site() -> Span {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Span::Compiler(proc_macro::Span::call_site())
+ } else {
+ Span::Fallback(fallback::Span::call_site())
+ }
+ }
+
++ #[cfg(hygiene)]
++ pub fn mixed_site() -> Span {
++ if inside_proc_macro() {
++ Span::Compiler(proc_macro::Span::mixed_site())
++ } else {
++ Span::Fallback(fallback::Span::mixed_site())
++ }
++ }
++
+ #[cfg(super_unstable)]
+ pub fn def_site() -> Span {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Span::Compiler(proc_macro::Span::def_site())
+ } else {
+ Span::Fallback(fallback::Span::def_site())
+ }
+ }
+
+- #[cfg(super_unstable)]
+ pub fn resolved_at(&self, other: Span) -> Span {
+ match (self, other) {
++ #[cfg(hygiene)]
+ (Span::Compiler(a), Span::Compiler(b)) => Span::Compiler(a.resolved_at(b)),
++
++ // Name resolution affects semantics, but location is only cosmetic
++ #[cfg(not(hygiene))]
++ (Span::Compiler(_), Span::Compiler(_)) => other,
++
+ (Span::Fallback(a), Span::Fallback(b)) => Span::Fallback(a.resolved_at(b)),
+ _ => mismatch(),
+ }
+ }
+
+- #[cfg(super_unstable)]
+ pub fn located_at(&self, other: Span) -> Span {
+ match (self, other) {
++ #[cfg(hygiene)]
+ (Span::Compiler(a), Span::Compiler(b)) => Span::Compiler(a.located_at(b)),
++
++ // Name resolution affects semantics, but location is only cosmetic
++ #[cfg(not(hygiene))]
++ (Span::Compiler(_), Span::Compiler(_)) => *self,
++
+ (Span::Fallback(a), Span::Fallback(b)) => Span::Fallback(a.located_at(b)),
+ _ => mismatch(),
+ }
+@@ -542,16 +528,16 @@ impl From<fallback::Span> for Span {
+ }
+ }
+
+-impl fmt::Debug for Span {
++impl Debug for Span {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Span::Compiler(s) => s.fmt(f),
+- Span::Fallback(s) => s.fmt(f),
++ Span::Compiler(s) => Debug::fmt(s, f),
++ Span::Fallback(s) => Debug::fmt(s, f),
+ }
+ }
+ }
+
+-pub fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span) {
++pub(crate) fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span) {
+ match span {
+ Span::Compiler(s) => {
+ debug.field("span", &s);
+@@ -561,7 +547,7 @@ pub fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span)
+ }
+
+ #[derive(Clone)]
+-pub enum Group {
++pub(crate) enum Group {
+ Compiler(proc_macro::Group),
+ Fallback(fallback::Group),
+ }
+@@ -652,26 +638,26 @@ impl From<fallback::Group> for Group {
+ }
+ }
+
+-impl fmt::Display for Group {
++impl Display for Group {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Group::Compiler(group) => group.fmt(formatter),
+- Group::Fallback(group) => group.fmt(formatter),
++ Group::Compiler(group) => Display::fmt(group, formatter),
++ Group::Fallback(group) => Display::fmt(group, formatter),
+ }
+ }
+ }
+
+-impl fmt::Debug for Group {
++impl Debug for Group {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Group::Compiler(group) => group.fmt(formatter),
+- Group::Fallback(group) => group.fmt(formatter),
++ Group::Compiler(group) => Debug::fmt(group, formatter),
++ Group::Fallback(group) => Debug::fmt(group, formatter),
+ }
+ }
+ }
+
+ #[derive(Clone)]
+-pub enum Ident {
++pub(crate) enum Ident {
+ Compiler(proc_macro::Ident),
+ Fallback(fallback::Ident),
+ }
+@@ -747,26 +733,26 @@ where
+ }
+ }
+
+-impl fmt::Display for Ident {
++impl Display for Ident {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Ident::Compiler(t) => t.fmt(f),
+- Ident::Fallback(t) => t.fmt(f),
++ Ident::Compiler(t) => Display::fmt(t, f),
++ Ident::Fallback(t) => Display::fmt(t, f),
+ }
+ }
+ }
+
+-impl fmt::Debug for Ident {
++impl Debug for Ident {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Ident::Compiler(t) => t.fmt(f),
+- Ident::Fallback(t) => t.fmt(f),
++ Ident::Compiler(t) => Debug::fmt(t, f),
++ Ident::Fallback(t) => Debug::fmt(t, f),
+ }
+ }
+ }
+
+ #[derive(Clone)]
+-pub enum Literal {
++pub(crate) enum Literal {
+ Compiler(proc_macro::Literal),
+ Fallback(fallback::Literal),
+ }
+@@ -774,7 +760,7 @@ pub enum Literal {
+ macro_rules! suffixed_numbers {
+ ($($name:ident => $kind:ident,)*) => ($(
+ pub fn $name(n: $kind) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::$name(n))
+ } else {
+ Literal::Fallback(fallback::Literal::$name(n))
+@@ -786,7 +772,7 @@ macro_rules! suffixed_numbers {
+ macro_rules! unsuffixed_integers {
+ ($($name:ident => $kind:ident,)*) => ($(
+ pub fn $name(n: $kind) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::$name(n))
+ } else {
+ Literal::Fallback(fallback::Literal::$name(n))
+@@ -830,7 +816,7 @@ impl Literal {
+ }
+
+ pub fn f32_unsuffixed(f: f32) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::f32_unsuffixed(f))
+ } else {
+ Literal::Fallback(fallback::Literal::f32_unsuffixed(f))
+@@ -838,7 +824,7 @@ impl Literal {
+ }
+
+ pub fn f64_unsuffixed(f: f64) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::f64_unsuffixed(f))
+ } else {
+ Literal::Fallback(fallback::Literal::f64_unsuffixed(f))
+@@ -846,7 +832,7 @@ impl Literal {
+ }
+
+ pub fn string(t: &str) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::string(t))
+ } else {
+ Literal::Fallback(fallback::Literal::string(t))
+@@ -854,7 +840,7 @@ impl Literal {
+ }
+
+ pub fn character(t: char) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::character(t))
+ } else {
+ Literal::Fallback(fallback::Literal::character(t))
+@@ -862,7 +848,7 @@ impl Literal {
+ }
+
+ pub fn byte_string(bytes: &[u8]) -> Literal {
+- if nightly_works() {
++ if inside_proc_macro() {
+ Literal::Compiler(proc_macro::Literal::byte_string(bytes))
+ } else {
+ Literal::Fallback(fallback::Literal::byte_string(bytes))
+@@ -908,20 +894,20 @@ impl From<fallback::Literal> for Literal {
+ }
+ }
+
+-impl fmt::Display for Literal {
++impl Display for Literal {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Literal::Compiler(t) => t.fmt(f),
+- Literal::Fallback(t) => t.fmt(f),
++ Literal::Compiler(t) => Display::fmt(t, f),
++ Literal::Fallback(t) => Display::fmt(t, f),
+ }
+ }
+ }
+
+-impl fmt::Debug for Literal {
++impl Debug for Literal {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+- Literal::Compiler(t) => t.fmt(f),
+- Literal::Fallback(t) => t.fmt(f),
++ Literal::Compiler(t) => Debug::fmt(t, f),
++ Literal::Fallback(t) => Debug::fmt(t, f),
+ }
+ }
+ }
+diff --git a/third_party/rust/proc-macro2/tests/comments.rs b/third_party/rust/proc-macro2/tests/comments.rs
+new file mode 100644
+index 0000000000..708cccb880
+--- /dev/null
++++ mozilla-release/third_party/rust/proc-macro2/tests/comments.rs
+@@ -0,0 +1,103 @@
++use proc_macro2::{Delimiter, Literal, Spacing, TokenStream, TokenTree};
++
++// #[doc = "..."] -> "..."
++fn lit_of_outer_doc_comment(tokens: TokenStream) -> Literal {
++ lit_of_doc_comment(tokens, false)
++}
++
++// #![doc = "..."] -> "..."
++fn lit_of_inner_doc_comment(tokens: TokenStream) -> Literal {
++ lit_of_doc_comment(tokens, true)
++}
++
++fn lit_of_doc_comment(tokens: TokenStream, inner: bool) -> Literal {
++ let mut iter = tokens.clone().into_iter();
++ match iter.next().unwrap() {
++ TokenTree::Punct(punct) => {
++ assert_eq!(punct.as_char(), '#');
++ assert_eq!(punct.spacing(), Spacing::Alone);
++ }
++ _ => panic!("wrong token {:?}", tokens),
++ }
++ if inner {
++ match iter.next().unwrap() {
++ TokenTree::Punct(punct) => {
++ assert_eq!(punct.as_char(), '!');
++ assert_eq!(punct.spacing(), Spacing::Alone);
++ }
++ _ => panic!("wrong token {:?}", tokens),
++ }
++ }
++ iter = match iter.next().unwrap() {
++ TokenTree::Group(group) => {
++ assert_eq!(group.delimiter(), Delimiter::Bracket);
++ assert!(iter.next().is_none(), "unexpected token {:?}", tokens);
++ group.stream().into_iter()
++ }
++ _ => panic!("wrong token {:?}", tokens),
++ };
++ match iter.next().unwrap() {
++ TokenTree::Ident(ident) => assert_eq!(ident.to_string(), "doc"),
++ _ => panic!("wrong token {:?}", tokens),
++ }
++ match iter.next().unwrap() {
++ TokenTree::Punct(punct) => {
++ assert_eq!(punct.as_char(), '=');
++ assert_eq!(punct.spacing(), Spacing::Alone);
++ }
++ _ => panic!("wrong token {:?}", tokens),
++ }
++ match iter.next().unwrap() {
++ TokenTree::Literal(literal) => {
++ assert!(iter.next().is_none(), "unexpected token {:?}", tokens);
++ literal
++ }
++ _ => panic!("wrong token {:?}", tokens),
++ }
++}
++
++#[test]
++fn closed_immediately() {
++ let stream = "/**/".parse::<TokenStream>().unwrap();
++ let tokens = stream.into_iter().collect::<Vec<_>>();
++ assert!(tokens.is_empty(), "not empty -- {:?}", tokens);
++}
++
++#[test]
++fn incomplete() {
++ assert!("/*/".parse::<TokenStream>().is_err());
++}
++
++#[test]
++fn lit() {
++ let stream = "/// doc".parse::<TokenStream>().unwrap();
++ let lit = lit_of_outer_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\" doc\"");
++
++ let stream = "//! doc".parse::<TokenStream>().unwrap();
++ let lit = lit_of_inner_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\" doc\"");
++
++ let stream = "/** doc */".parse::<TokenStream>().unwrap();
++ let lit = lit_of_outer_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\" doc \"");
++
++ let stream = "/*! doc */".parse::<TokenStream>().unwrap();
++ let lit = lit_of_inner_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\" doc \"");
++}
++
++#[test]
++fn carriage_return() {
++ let stream = "///\r\n".parse::<TokenStream>().unwrap();
++ let lit = lit_of_outer_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\"\"");
++
++ let stream = "/**\r\n*/".parse::<TokenStream>().unwrap();
++ let lit = lit_of_outer_doc_comment(stream);
++ assert_eq!(lit.to_string(), "\"\\r\\n\"");
++
++ "///\r".parse::<TokenStream>().unwrap_err();
++ "///\r \n".parse::<TokenStream>().unwrap_err();
++ "/**\r \n*/".parse::<TokenStream>().unwrap_err();
++}
+diff --git a/third_party/rust/proc-macro2/tests/marker.rs b/third_party/rust/proc-macro2/tests/marker.rs
+index 7af2539c1a..70e57677cd 100644
+--- mozilla-release/third_party/rust/proc-macro2/tests/marker.rs
++++ mozilla-release/third_party/rust/proc-macro2/tests/marker.rs
+@@ -57,3 +57,36 @@ mod semver_exempt {
+
+ assert_impl!(SourceFile is not Send or Sync);
+ }
++
++#[cfg(not(no_libprocmacro_unwind_safe))]
++mod unwind_safe {
++ use super::*;
++ use std::panic::{RefUnwindSafe, UnwindSafe};
++
++ macro_rules! assert_unwind_safe {
++ ($($types:ident)*) => {
++ $(
++ assert_impl!($types is UnwindSafe and RefUnwindSafe);
++ )*
++ };
++ }
++
++ assert_unwind_safe! {
++ Delimiter
++ Group
++ Ident
++ LexError
++ Literal
++ Punct
++ Spacing
++ Span
++ TokenStream
++ TokenTree
++ }
++
++ #[cfg(procmacro2_semver_exempt)]
++ assert_unwind_safe! {
++ LineColumn
++ SourceFile
++ }
++}
+diff --git a/third_party/rust/proc-macro2/tests/test.rs b/third_party/rust/proc-macro2/tests/test.rs
+index 7528388138..1e9f633944 100644
+--- mozilla-release/third_party/rust/proc-macro2/tests/test.rs
++++ mozilla-release/third_party/rust/proc-macro2/tests/test.rs
+@@ -1,7 +1,6 @@
++use proc_macro2::{Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
+ use std::str::{self, FromStr};
+
+-use proc_macro2::{Ident, Literal, Spacing, Span, TokenStream, TokenTree};
+-
+ #[test]
+ fn idents() {
+ assert_eq!(
+@@ -84,6 +83,11 @@ fn literal_string() {
+ assert_eq!(Literal::string("didn't").to_string(), "\"didn't\"");
+ }
+
++#[test]
++fn literal_raw_string() {
++ "r\"\r\n\"".parse::<TokenStream>().unwrap();
++}
++
+ #[test]
+ fn literal_character() {
+ assert_eq!(Literal::character('x').to_string(), "'x'");
+@@ -110,6 +114,37 @@ fn literal_suffix() {
+ assert_eq!(token_count("1._0"), 3);
+ assert_eq!(token_count("1._m"), 3);
+ assert_eq!(token_count("\"\"s"), 1);
++ assert_eq!(token_count("r\"\"r"), 1);
++ assert_eq!(token_count("b\"\"b"), 1);
++ assert_eq!(token_count("br\"\"br"), 1);
++ assert_eq!(token_count("r#\"\"#r"), 1);
++ assert_eq!(token_count("'c'c"), 1);
++ assert_eq!(token_count("b'b'b"), 1);
++ assert_eq!(token_count("0E"), 1);
++ assert_eq!(token_count("0o0A"), 1);
++ assert_eq!(token_count("0E--0"), 4);
++ assert_eq!(token_count("0.0ECMA"), 1);
++}
++
++#[test]
++fn literal_iter_negative() {
++ let negative_literal = Literal::i32_suffixed(-3);
++ let tokens = TokenStream::from(TokenTree::Literal(negative_literal));
++ let mut iter = tokens.into_iter();
++ match iter.next().unwrap() {
++ TokenTree::Punct(punct) => {
++ assert_eq!(punct.as_char(), '-');
++ assert_eq!(punct.spacing(), Spacing::Alone);
++ }
++ unexpected => panic!("unexpected token {:?}", unexpected),
++ }
++ match iter.next().unwrap() {
++ TokenTree::Literal(literal) => {
++ assert_eq!(literal.to_string(), "3i32");
++ }
++ unexpected => panic!("unexpected token {:?}", unexpected),
++ }
++ assert!(iter.next().is_none());
+ }
+
+ #[test]
+@@ -161,41 +196,21 @@ fn fail() {
+ fail("' static");
+ fail("r#1");
+ fail("r#_");
++ fail("\"\\u{0000000}\""); // overlong unicode escape (rust allows at most 6 hex digits)
++ fail("\"\\u{999999}\""); // outside of valid range of char
++ fail("\"\\u{_0}\""); // leading underscore
++ fail("\"\\u{}\""); // empty
++ fail("b\"\r\""); // bare carriage return in byte string
++ fail("r\"\r\""); // bare carriage return in raw string
++ fail("\"\\\r \""); // backslash carriage return
++ fail("'aa'aa");
++ fail("br##\"\"#");
++ fail("\"\\\n\u{85}\r\"");
+ }
+
+ #[cfg(span_locations)]
+ #[test]
+ fn span_test() {
+- use proc_macro2::TokenTree;
+-
+- fn check_spans(p: &str, mut lines: &[(usize, usize, usize, usize)]) {
+- let ts = p.parse::<TokenStream>().unwrap();
+- check_spans_internal(ts, &mut lines);
+- }
+-
+- fn check_spans_internal(ts: TokenStream, lines: &mut &[(usize, usize, usize, usize)]) {
+- for i in ts {
+- if let Some((&(sline, scol, eline, ecol), rest)) = lines.split_first() {
+- *lines = rest;
+-
+- let start = i.span().start();
+- assert_eq!(start.line, sline, "sline did not match for {}", i);
+- assert_eq!(start.column, scol, "scol did not match for {}", i);
+-
+- let end = i.span().end();
+- assert_eq!(end.line, eline, "eline did not match for {}", i);
+- assert_eq!(end.column, ecol, "ecol did not match for {}", i);
+-
+- match i {
+- TokenTree::Group(ref g) => {
+- check_spans_internal(g.stream().clone(), lines);
+- }
+- _ => {}
+- }
+- }
+- }
+- }
+-
+ check_spans(
+ "\
+ /// This is a document comment
+@@ -274,53 +289,11 @@ fn span_join() {
+ #[test]
+ fn no_panic() {
+ let s = str::from_utf8(b"b\'\xc2\x86 \x00\x00\x00^\"").unwrap();
+- assert!(s.parse::<proc_macro2::TokenStream>().is_err());
++ assert!(s.parse::<TokenStream>().is_err());
+ }
+
+ #[test]
+-fn tricky_doc_comment() {
+- let stream = "/**/".parse::<proc_macro2::TokenStream>().unwrap();
+- let tokens = stream.into_iter().collect::<Vec<_>>();
+- assert!(tokens.is_empty(), "not empty -- {:?}", tokens);
+-
+- let stream = "/// doc".parse::<proc_macro2::TokenStream>().unwrap();
+- let tokens = stream.into_iter().collect::<Vec<_>>();
+- assert!(tokens.len() == 2, "not length 2 -- {:?}", tokens);
+- match tokens[0] {
+- proc_macro2::TokenTree::Punct(ref tt) => assert_eq!(tt.as_char(), '#'),
+- _ => panic!("wrong token {:?}", tokens[0]),
+- }
+- let mut tokens = match tokens[1] {
+- proc_macro2::TokenTree::Group(ref tt) => {
+- assert_eq!(tt.delimiter(), proc_macro2::Delimiter::Bracket);
+- tt.stream().into_iter()
+- }
+- _ => panic!("wrong token {:?}", tokens[0]),
+- };
+-
+- match tokens.next().unwrap() {
+- proc_macro2::TokenTree::Ident(ref tt) => assert_eq!(tt.to_string(), "doc"),
+- t => panic!("wrong token {:?}", t),
+- }
+- match tokens.next().unwrap() {
+- proc_macro2::TokenTree::Punct(ref tt) => assert_eq!(tt.as_char(), '='),
+- t => panic!("wrong token {:?}", t),
+- }
+- match tokens.next().unwrap() {
+- proc_macro2::TokenTree::Literal(ref tt) => {
+- assert_eq!(tt.to_string(), "\" doc\"");
+- }
+- t => panic!("wrong token {:?}", t),
+- }
+- assert!(tokens.next().is_none());
+-
+- let stream = "//! doc".parse::<proc_macro2::TokenStream>().unwrap();
+- let tokens = stream.into_iter().collect::<Vec<_>>();
+- assert!(tokens.len() == 3, "not length 3 -- {:?}", tokens);
+-}
+-
+-#[test]
+-fn op_before_comment() {
++fn punct_before_comment() {
+ let mut tts = TokenStream::from_str("~// comment").unwrap().into_iter();
+ match tts.next().unwrap() {
+ TokenTree::Punct(tt) => {
+@@ -331,6 +304,22 @@ fn op_before_comment() {
+ }
+ }
+
++#[test]
++fn joint_last_token() {
++ // This test verifies that we match the behavior of libproc_macro *not* in
++ // the range nightly-2020-09-06 through nightly-2020-09-10, in which this
++ // behavior was temporarily broken.
++ // See https://github.com/rust-lang/rust/issues/76399
++
++ let joint_punct = Punct::new(':', Spacing::Joint);
++ let stream = TokenStream::from(TokenTree::Punct(joint_punct));
++ let punct = match stream.into_iter().next().unwrap() {
++ TokenTree::Punct(punct) => punct,
++ _ => unreachable!(),
++ };
++ assert_eq!(punct.spacing(), Spacing::Joint);
++}
++
+ #[test]
+ fn raw_identifier() {
+ let mut tts = TokenStream::from_str("r#dyn").unwrap().into_iter();
+@@ -345,11 +334,11 @@ fn raw_identifier() {
+ fn test_debug_ident() {
+ let ident = Ident::new("proc_macro", Span::call_site());
+
+- #[cfg(not(procmacro2_semver_exempt))]
++ #[cfg(not(span_locations))]
+ let expected = "Ident(proc_macro)";
+
+- #[cfg(procmacro2_semver_exempt)]
+- let expected = "Ident { sym: proc_macro, span: bytes(0..0) }";
++ #[cfg(span_locations)]
++ let expected = "Ident { sym: proc_macro }";
+
+ assert_eq!(expected, format!("{:?}", ident));
+ }
+@@ -358,7 +347,7 @@ fn test_debug_ident() {
+ fn test_debug_tokenstream() {
+ let tts = TokenStream::from_str("[a + 1]").unwrap();
+
+- #[cfg(not(procmacro2_semver_exempt))]
++ #[cfg(not(span_locations))]
+ let expected = "\
+ TokenStream [
+ Group {
+@@ -368,7 +357,7 @@ TokenStream [
+ sym: a,
+ },
+ Punct {
+- op: '+',
++ char: '+',
+ spacing: Alone,
+ },
+ Literal {
+@@ -379,7 +368,7 @@ TokenStream [
+ ]\
+ ";
+
+- #[cfg(not(procmacro2_semver_exempt))]
++ #[cfg(not(span_locations))]
+ let expected_before_trailing_commas = "\
+ TokenStream [
+ Group {
+@@ -389,7 +378,7 @@ TokenStream [
+ sym: a
+ },
+ Punct {
+- op: '+',
++ char: '+',
+ spacing: Alone
+ },
+ Literal {
+@@ -400,7 +389,7 @@ TokenStream [
+ ]\
+ ";
+
+- #[cfg(procmacro2_semver_exempt)]
++ #[cfg(span_locations)]
+ let expected = "\
+ TokenStream [
+ Group {
+@@ -411,7 +400,7 @@ TokenStream [
+ span: bytes(2..3),
+ },
+ Punct {
+- op: '+',
++ char: '+',
+ spacing: Alone,
+ span: bytes(4..5),
+ },
+@@ -425,7 +414,7 @@ TokenStream [
+ ]\
+ ";
+
+- #[cfg(procmacro2_semver_exempt)]
++ #[cfg(span_locations)]
+ let expected_before_trailing_commas = "\
+ TokenStream [
+ Group {
+@@ -436,7 +425,7 @@ TokenStream [
+ span: bytes(2..3)
+ },
+ Punct {
+- op: '+',
++ char: '+',
+ spacing: Alone,
+ span: bytes(4..5)
+ },
+@@ -464,3 +453,80 @@ fn default_tokenstream_is_empty() {
+
+ assert!(default_token_stream.is_empty());
+ }
++
++#[test]
++fn tuple_indexing() {
++ // This behavior may change depending on https://github.com/rust-lang/rust/pull/71322
++ let mut tokens = "tuple.0.0".parse::<TokenStream>().unwrap().into_iter();
++ assert_eq!("tuple", tokens.next().unwrap().to_string());
++ assert_eq!(".", tokens.next().unwrap().to_string());
++ assert_eq!("0.0", tokens.next().unwrap().to_string());
++ assert!(tokens.next().is_none());
++}
++
++#[cfg(span_locations)]
++#[test]
++fn non_ascii_tokens() {
++ check_spans("// abc", &[]);
++ check_spans("// ábc", &[]);
++ check_spans("// abc x", &[]);
++ check_spans("// ábc x", &[]);
++ check_spans("/* abc */ x", &[(1, 10, 1, 11)]);
++ check_spans("/* ábc */ x", &[(1, 10, 1, 11)]);
++ check_spans("/* ab\nc */ x", &[(2, 5, 2, 6)]);
++ check_spans("/* áb\nc */ x", &[(2, 5, 2, 6)]);
++ check_spans("/*** abc */ x", &[(1, 12, 1, 13)]);
++ check_spans("/*** ábc */ x", &[(1, 12, 1, 13)]);
++ check_spans(r#""abc""#, &[(1, 0, 1, 5)]);
++ check_spans(r#""ábc""#, &[(1, 0, 1, 5)]);
++ check_spans(r###"r#"abc"#"###, &[(1, 0, 1, 8)]);
++ check_spans(r###"r#"ábc"#"###, &[(1, 0, 1, 8)]);
++ check_spans("r#\"a\nc\"#", &[(1, 0, 2, 3)]);
++ check_spans("r#\"á\nc\"#", &[(1, 0, 2, 3)]);
++ check_spans("'a'", &[(1, 0, 1, 3)]);
++ check_spans("'á'", &[(1, 0, 1, 3)]);
++ check_spans("//! abc", &[(1, 0, 1, 7), (1, 0, 1, 7), (1, 0, 1, 7)]);
++ check_spans("//! ábc", &[(1, 0, 1, 7), (1, 0, 1, 7), (1, 0, 1, 7)]);
++ check_spans("//! abc\n", &[(1, 0, 1, 7), (1, 0, 1, 7), (1, 0, 1, 7)]);
++ check_spans("//! ábc\n", &[(1, 0, 1, 7), (1, 0, 1, 7), (1, 0, 1, 7)]);
++ check_spans("/*! abc */", &[(1, 0, 1, 10), (1, 0, 1, 10), (1, 0, 1, 10)]);
++ check_spans("/*! ábc */", &[(1, 0, 1, 10), (1, 0, 1, 10), (1, 0, 1, 10)]);
++ check_spans("/*! a\nc */", &[(1, 0, 2, 4), (1, 0, 2, 4), (1, 0, 2, 4)]);
++ check_spans("/*! á\nc */", &[(1, 0, 2, 4), (1, 0, 2, 4), (1, 0, 2, 4)]);
++ check_spans("abc", &[(1, 0, 1, 3)]);
++ check_spans("ábc", &[(1, 0, 1, 3)]);
++ check_spans("ábć", &[(1, 0, 1, 3)]);
++ check_spans("abc// foo", &[(1, 0, 1, 3)]);
++ check_spans("ábc// foo", &[(1, 0, 1, 3)]);
++ check_spans("ábć// foo", &[(1, 0, 1, 3)]);
++ check_spans("b\"a\\\n c\"", &[(1, 0, 2, 3)]);
++ check_spans("b\"a\\\n\u{00a0}c\"", &[(1, 0, 2, 3)]);
++}
++
++#[cfg(span_locations)]
++fn check_spans(p: &str, mut lines: &[(usize, usize, usize, usize)]) {
++ let ts = p.parse::<TokenStream>().unwrap();
++ check_spans_internal(ts, &mut lines);
++ assert!(lines.is_empty(), "leftover ranges: {:?}", lines);
++}
++
++#[cfg(span_locations)]
++fn check_spans_internal(ts: TokenStream, lines: &mut &[(usize, usize, usize, usize)]) {
++ for i in ts {
++ if let Some((&(sline, scol, eline, ecol), rest)) = lines.split_first() {
++ *lines = rest;
++
++ let start = i.span().start();
++ assert_eq!(start.line, sline, "sline did not match for {}", i);
++ assert_eq!(start.column, scol, "scol did not match for {}", i);
++
++ let end = i.span().end();
++ assert_eq!(end.line, eline, "eline did not match for {}", i);
++ assert_eq!(end.column, ecol, "ecol did not match for {}", i);
++
++ if let TokenTree::Group(g) = i {
++ check_spans_internal(g.stream().clone(), lines);
++ }
++ }
++ }
++}
+diff --git a/third_party/rust/proc-macro2/tests/test_fmt.rs b/third_party/rust/proc-macro2/tests/test_fmt.rs
+new file mode 100644
+index 0000000000..99a0aee5c8
+--- /dev/null
++++ mozilla-release/third_party/rust/proc-macro2/tests/test_fmt.rs
+@@ -0,0 +1,26 @@
++use proc_macro2::{Delimiter, Group, Ident, Span, TokenStream, TokenTree};
++use std::iter::{self, FromIterator};
++
++#[test]
++fn test_fmt_group() {
++ let ident = Ident::new("x", Span::call_site());
++ let inner = TokenStream::from_iter(iter::once(TokenTree::Ident(ident)));
++ let parens_empty = Group::new(Delimiter::Parenthesis, TokenStream::new());
++ let parens_nonempty = Group::new(Delimiter::Parenthesis, inner.clone());
++ let brackets_empty = Group::new(Delimiter::Bracket, TokenStream::new());
++ let brackets_nonempty = Group::new(Delimiter::Bracket, inner.clone());
++ let braces_empty = Group::new(Delimiter::Brace, TokenStream::new());
++ let braces_nonempty = Group::new(Delimiter::Brace, inner.clone());
++ let none_empty = Group::new(Delimiter::None, TokenStream::new());
++ let none_nonempty = Group::new(Delimiter::None, inner.clone());
++
++ // Matches libproc_macro.
++ assert_eq!("()", parens_empty.to_string());
++ assert_eq!("(x)", parens_nonempty.to_string());
++ assert_eq!("[]", brackets_empty.to_string());
++ assert_eq!("[x]", brackets_nonempty.to_string());
++ assert_eq!("{ }", braces_empty.to_string());
++ assert_eq!("{ x }", braces_nonempty.to_string());
++ assert_eq!("", none_empty.to_string());
++ assert_eq!("x", none_nonempty.to_string());
++}
+diff --git a/third_party/rust/spirv-cross-internal/.cargo-checksum.json b/third_party/rust/spirv-cross-internal/.cargo-checksum.json
+index 3c732d6d0e..014aa640e1 100644
+--- mozilla-release/third_party/rust/spirv-cross-internal/.cargo-checksum.json
++++ mozilla-release/third_party/rust/spirv-cross-internal/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{"Cargo.toml":"32644850d6dd8a8496fcf2dd0327dfc18a41f87bbd5f0922e174a905babde20d","build.rs":"68d1e7d99b4d890e21606aa7e7904d4f9b8caed6c0951bb8f5028745a7103d1e","src/bindings_native.rs":"6aa4e3a3bd73a638b3282405c0eaf2565ff8f364919c509f94f79e326679b03e","src/bindings_wasm.rs":"331d19691566beb163fc459d630e9830167cc86ec8cacde6be53fb0a7ca2b1be","src/bindings_wasm_functions.rs":"2515dd91e98e769fe282e7dc4f60820f4be7365c784a9f3bd17310d18a136da8","src/compiler.rs":"a53c7e0136ea3deddbfaf158295daca36623a0e244426b7c04d2856922d91c73","src/emscripten.rs":"3169890001970610013026468739910afca0d85e00d7e34beadfdd31bbcbeeb7","src/glsl.rs":"7ca1f6a11db8e7926a813fb91298dac1c0e2f90fe5426cc985cde7d8f36c05c9","src/hlsl.rs":"3734ad89a4f51647ebeb761753cb324a48ebca724970201e7598a3763d094d73","src/lib.rs":"cc41cbbe48f3e96791ba5338c66fa1fe0e533eaed6bbdced3f008d5e9fe6c6ce","src/msl.rs":"5505d1d626d8e7903ffa9d137e7392a1670fa7b574eacc4bbd33673937b36ea7","src/ptr_util.rs":"280404beede469b2c9ae40536323515a9213dac5d30014fac870a23b37672442","src/spirv.rs":"8a2cbe6b554bb6312f2aede0469338ace21e79720b5128c653e7a68c0e161277","src/vendor/SPIRV-Cross/.clang-format":"9ec4314e20afecad827a2dbd4832256be8464e88aab4a53fab45173ed129b2ed","src/vendor/SPIRV-Cross/.gitignore":"7f23cc92ddb5e1f584447e98d3e8ab6543fc182f1543f0f6ec29856f9250cdd6","src/vendor/SPIRV-Cross/.travis.yml":"abcc1b2f622b65feafd3e37a2b5e867fce3cf7211cae9fb2bf92a6de79100be4","src/vendor/SPIRV-Cross/CMakeLists.txt":"0972ab271e1eecdfe41ae0a85bf14ce7fe142b7609f8d2965b2c94f92c63b6aa","src/vendor/SPIRV-Cross/CODE_OF_CONDUCT.md":"a25e58cd66a9543e1500db9a5c3c027e874893ad1a264530bf26eb10918b5d80","src/vendor/SPIRV-Cross/GLSL.std.450.h":"20f32378793c5f416bc0704f44345c2a14c99cba3f411e3beaf1bcea372d58ba","src/vendor/SPIRV-Cross/LICENSE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","src/vendor/SPIRV-Cross/Makefile":"e2255d32e47d447b100ce3cd0753d0758dc26460e0440d14cc157d4caf9b62f1","src/vendor/SPIRV-Cross/README.md":"b944fc5b1de709089fc3cae0dba09186ce2e43b64de6dcae1423ba1c139ee395","src/vendor/SPIRV-Cross/appveyor.yml":"0f18b8ae5fadc027a20f69307fc32e56a97edfbdcb55ac392852308f88545a04","src/vendor/SPIRV-Cross/include/spirv_cross/barrier.hpp":"bb796625e89f75e239e92f9a61597d421ffe5fb1902d200691ebe95cf856a1f8","src/vendor/SPIRV-Cross/include/spirv_cross/external_interface.h":"cdceda962d87133e44989510edc944e99052d713869b406a8b6b2d54e3d02dd7","src/vendor/SPIRV-Cross/include/spirv_cross/image.hpp":"681d0964b144c5009424196a8bc832cb81cfe5df5b91c2f3e1bfb625765a0c50","src/vendor/SPIRV-Cross/include/spirv_cross/internal_interface.hpp":"ab8851e5708b944a9bf340ce17297d94bef4876d30c833ea83d44b16f60726f6","src/vendor/SPIRV-Cross/include/spirv_cross/sampler.hpp":"b0b1bd4796b4315e826985c224ea5fa7d5bc823fcd6091f7527a5e18d9ae42fb","src/vendor/SPIRV-Cross/include/spirv_cross/thread_group.hpp":"70d9e0400f62de71d3775972eadc196ddb218254fa8155e8e33daf8d99957cc0","src/vendor/SPIRV-Cross/main.cpp":"ab2835f6dff9299f562a89755893f98a4bd946d4460abca885ba2172ebce851c","src/vendor/SPIRV-Cross/pkg-config/spirv-cross-c-shared.pc.in":"75a27e069ee07362bc6b7412b2c4e1270778dd639a8b96b8afbb113d21de79e7","src/vendor/SPIRV-Cross/spirv.h":"2c19cd1d262a3757e92276fbaa8e1a706b2328a92f47bda88f849b5cebebb630","src/vendor/SPIRV-Cross/spirv.hpp":"eb7c39a017f0a33e9d9bae7556c678c2840af4cc0beb98b2aeff9d651e370128","src/vendor/SPIRV-Cross/spirv_cfg.cpp":"09b756068d95a87a65a186831484fe21a973d3eb19675225b23864b9d37fe3d0","src/vendor/SPIRV-Cross/spirv_cfg.hpp":"ad98c4e82d6da3ed450dfc7939814115ae6b29ba2a25b0148cfc8c88774055b5","src/vendor/SPIRV-Cross/spirv_common.hpp":"5d0658a6fe9ac2f628754d2439b4d26ec8df7e50e4b196567cd4c7e7b8ce7574","src/vendor/SPIRV-Cross/spirv_cpp.cpp":"d067269ec6fc56860b4ed39edddf0a127f5e2d091512a85a79f02d5f3beccd19","src/vendor/SPIRV-Cross/spirv_cpp.hpp":"751ce82c70a399781f18aca54ea7fbb98083b98706f2a6be1cd1aa90627ef597","src/vendor/SPIRV-Cross/spirv_cross.cpp":"225b4cf4c7f8868019680d0a75a3da7983db428783ee1a3dcbb8c2765a71e79a","src/vendor/SPIRV-Cross/spirv_cross.hpp":"7eab2d7ae4b25a3c4fe85631e664727e036ae23a776aeb8c17db23f08020258a","src/vendor/SPIRV-Cross/spirv_cross_c.cpp":"80f438f4700f0b0b02547771f82be0610ba5e24ba3edb56d4331d59a206a4c2e","src/vendor/SPIRV-Cross/spirv_cross_c.h":"8b0ad63ed9fe52bc62f305afa27b5e33d9bd689a8b3f9935353742faf88a1e91","src/vendor/SPIRV-Cross/spirv_cross_containers.hpp":"409f60a5cb1dba1d0c96ef61761d8643402fc5ab67cecce12f6af3d135cfa338","src/vendor/SPIRV-Cross/spirv_cross_error_handling.hpp":"45868796346eef895cc05825582e60d26c34ec35d1a2b97f5e172f05fc565b19","src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.cpp":"7c7e08db4dfc1084fd9cd266a6f829d35a6b2856198b16307a44f4d1c0743106","src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.hpp":"d15446565eaa430bf2b14b596b3e579a72095a386b1eb256afc977cdf42ec5b9","src/vendor/SPIRV-Cross/spirv_cross_util.cpp":"f2426dccad2fff44053f6b1b9558719471a1ba0445c317f2c0311bc0d8b4636d","src/vendor/SPIRV-Cross/spirv_cross_util.hpp":"63ca5b2d6c80b5ad39473d6841676e48d5db3d2cbcb252fe6a6db0ef2077f0f5","src/vendor/SPIRV-Cross/spirv_glsl.cpp":"c1704189895442d593819472d3f852979107ac1798375d5a44d8f97be17fa3b5","src/vendor/SPIRV-Cross/spirv_glsl.hpp":"fb5e00ff589e3c5a25c5a15e78cf4809b753ebe04c84a008dc977330b8cbbc27","src/vendor/SPIRV-Cross/spirv_hlsl.cpp":"549ff42d0773a3f9e555d1aebd4c0084709e11528082f47c5f2b8b07de029f7c","src/vendor/SPIRV-Cross/spirv_hlsl.hpp":"18f303e7a384acf0e14677b579b100aee838813f54735330f0d1387f2493b363","src/vendor/SPIRV-Cross/spirv_msl.cpp":"7266afeb827e50782cb35362788d27fa9bd641992380008604ea1a4e48ec9c37","src/vendor/SPIRV-Cross/spirv_msl.hpp":"76b609e0b8d2f421c51e98d6357fcf44666b0d510935e083e4e02f20a80051e1","src/vendor/SPIRV-Cross/spirv_parser.cpp":"4def4db8c77967dcd2d6d93330343dc6ebb309e8cd696f52ee568a7c3ee97036","src/vendor/SPIRV-Cross/spirv_parser.hpp":"fc5f92184d1b4986f78088bee8ed7ddb9b342a34f9a3e55a4a594187292b66b8","src/vendor/SPIRV-Cross/spirv_reflect.cpp":"995a4e4315f67d4a2084e2b5d982de9baf72c7e265dde71d03ae0b8a29a24b92","src/vendor/SPIRV-Cross/spirv_reflect.hpp":"a874b40be0b210c69718e87a90e9add24653957656a995d83656f0918cfd10e4","src/wrapper.cpp":"7800cec5564dc1c7c13059cb1b1cac8d9be9248bbc887d5176600980c0d18142","src/wrapper.hpp":"b9a4f846bf57ee7a10fbb81f8f49df96ad11b1e5749c3c510925bb9b029ac08a","tests/common/mod.rs":"2843bf104c7938d93065f7b5688c9f063ad9e5720c407c737aedc5f2dee5a80f","tests/glsl_tests.rs":"ddd85107370dbfcde9d004d6717e229a7278d29ecba375828d8cb79e86625f66","tests/hlsl_tests.rs":"2058cb590c5ab85a636c93c18d0f2a79eb5ea5e647b7f10a2c83fbf394964dd6","tests/msl_tests.rs":"211d3b9cb43455a4c55bd619c05acdd21953358580c50ae75cac3f06eb26c5dd","tests/shaders/array.vert":"d0dab7ddea131e069961054f40a164602448aa78720b7ff480e141d1f7b0b2d6","tests/shaders/array.vert.spv":"8e44421590ade1716be66ad39f60fb1ce58eedeab8f0806335a7369687b308b1","tests/shaders/multiple_entry_points.cl":"2abbe57f2387f07f7f5f4cd375e47900be9c13bdc79aa0ed98a43a798cb0df81","tests/shaders/multiple_entry_points.cl.spv":"bdd34ce6765dbeab637631c3cbdf251532870d9fd6cd6c54883c0c872058ab3b","tests/shaders/rasterize_disabled.vert":"da6de172549830216933c44edf18b13113d7ca87462e3d09ad50dfc9c9836821","tests/shaders/rasterize_disabled.vert.spv":"2ba809eb500ed6e5a067389ccc056551e796e7019517593d110fb62c9dca2056","tests/shaders/sampler.frag":"4c568e65176afe596dd8ef279485e992607e94d612786214ae1c6702d0322e1f","tests/shaders/sampler.frag.spv":"bd7bd1973a82dcfdf5755361fa4dd420fdf1c32c5de0a6f0896a8d5971f98684","tests/shaders/simple.vert":"ea143c97dff5ef03728b96b2dd893bdc59d56651581ecf9fe50f10807b0efdd0","tests/shaders/simple.vert.spv":"a2b5094ffd76288e0d08c37ce0351e28f20bb6d80ddd73fc44a71c1c7cbbf7db","tests/shaders/specialization.comp":"ce32fa1615737209f2e465ea347d79030ddcb33a88c38447e7cde7dffc920163","tests/shaders/specialization.comp.spv":"848604e37b870b8999692b266677be2ce0df6ce38093a0d81e6bc43d0bdf8a3f","tests/shaders/struct.frag":"d8840bb1961d6f14609b00ee54406c1e3ea31cecd8231b77cfb73d28b71910c0","tests/shaders/struct.frag.spv":"774aa886374eb95abf9bb7d0045ee77d97e26529e9ec96b90991a515fdbca4be","tests/shaders/struct.vert":"9299cda83ddb5b5c3d95ab0d057e4df2af137dfd92d6c4d3e96295b7d42e29a1","tests/shaders/struct.vert.spv":"4a82bdee72616ac058bc60d4255efa3e78199a2b8597570c013bebbee7107fb7","tests/shaders/two_ubo.vert":"be109b2c65e5e9e1bb0dab968d7f651232f6b1c46935a3928f980bf7a40f2d62","tests/shaders/two_ubo.vert.spv":"efd14e2d0a782d61dd944711f30b9e7fcb14af17593c1fe4e11cf2b7e232bcc2","tests/shaders/workgroup.comp":"478044b5392e0d1fb042253d71ea6bf7b8a014af4a6ee35d8db4c5343ac69739","tests/shaders/workgroup.comp.spv":"72f636fe3d1d6d0c5963f71bf4349c7e40d544331b33b6b64fb5b65784e6abee","tests/spirv_tests.rs":"6de5c893f631d550fc86853537bddb824ffb534a0a7f130406be3b9ed166f198"},"package":null}
+\ No newline at end of file
++{"files":{"Cargo.toml":"32644850d6dd8a8496fcf2dd0327dfc18a41f87bbd5f0922e174a905babde20d","build.rs":"68d1e7d99b4d890e21606aa7e7904d4f9b8caed6c0951bb8f5028745a7103d1e","src/bindings_native.rs":"6aa4e3a3bd73a638b3282405c0eaf2565ff8f364919c509f94f79e326679b03e","src/bindings_wasm.rs":"331d19691566beb163fc459d630e9830167cc86ec8cacde6be53fb0a7ca2b1be","src/bindings_wasm_functions.rs":"2515dd91e98e769fe282e7dc4f60820f4be7365c784a9f3bd17310d18a136da8","src/compiler.rs":"a53c7e0136ea3deddbfaf158295daca36623a0e244426b7c04d2856922d91c73","src/emscripten.rs":"3169890001970610013026468739910afca0d85e00d7e34beadfdd31bbcbeeb7","src/glsl.rs":"7ca1f6a11db8e7926a813fb91298dac1c0e2f90fe5426cc985cde7d8f36c05c9","src/hlsl.rs":"3734ad89a4f51647ebeb761753cb324a48ebca724970201e7598a3763d094d73","src/lib.rs":"cc41cbbe48f3e96791ba5338c66fa1fe0e533eaed6bbdced3f008d5e9fe6c6ce","src/msl.rs":"5505d1d626d8e7903ffa9d137e7392a1670fa7b574eacc4bbd33673937b36ea7","src/ptr_util.rs":"280404beede469b2c9ae40536323515a9213dac5d30014fac870a23b37672442","src/spirv.rs":"8a2cbe6b554bb6312f2aede0469338ace21e79720b5128c653e7a68c0e161277","src/vendor/SPIRV-Cross/.clang-format":"9ec4314e20afecad827a2dbd4832256be8464e88aab4a53fab45173ed129b2ed","src/vendor/SPIRV-Cross/.travis.yml":"abcc1b2f622b65feafd3e37a2b5e867fce3cf7211cae9fb2bf92a6de79100be4","src/vendor/SPIRV-Cross/CMakeLists.txt":"0972ab271e1eecdfe41ae0a85bf14ce7fe142b7609f8d2965b2c94f92c63b6aa","src/vendor/SPIRV-Cross/CODE_OF_CONDUCT.md":"a25e58cd66a9543e1500db9a5c3c027e874893ad1a264530bf26eb10918b5d80","src/vendor/SPIRV-Cross/GLSL.std.450.h":"20f32378793c5f416bc0704f44345c2a14c99cba3f411e3beaf1bcea372d58ba","src/vendor/SPIRV-Cross/LICENSE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","src/vendor/SPIRV-Cross/Makefile":"e2255d32e47d447b100ce3cd0753d0758dc26460e0440d14cc157d4caf9b62f1","src/vendor/SPIRV-Cross/README.md":"b944fc5b1de709089fc3cae0dba09186ce2e43b64de6dcae1423ba1c139ee395","src/vendor/SPIRV-Cross/appveyor.yml":"0f18b8ae5fadc027a20f69307fc32e56a97edfbdcb55ac392852308f88545a04","src/vendor/SPIRV-Cross/include/spirv_cross/barrier.hpp":"bb796625e89f75e239e92f9a61597d421ffe5fb1902d200691ebe95cf856a1f8","src/vendor/SPIRV-Cross/include/spirv_cross/external_interface.h":"cdceda962d87133e44989510edc944e99052d713869b406a8b6b2d54e3d02dd7","src/vendor/SPIRV-Cross/include/spirv_cross/image.hpp":"681d0964b144c5009424196a8bc832cb81cfe5df5b91c2f3e1bfb625765a0c50","src/vendor/SPIRV-Cross/include/spirv_cross/internal_interface.hpp":"ab8851e5708b944a9bf340ce17297d94bef4876d30c833ea83d44b16f60726f6","src/vendor/SPIRV-Cross/include/spirv_cross/sampler.hpp":"b0b1bd4796b4315e826985c224ea5fa7d5bc823fcd6091f7527a5e18d9ae42fb","src/vendor/SPIRV-Cross/include/spirv_cross/thread_group.hpp":"70d9e0400f62de71d3775972eadc196ddb218254fa8155e8e33daf8d99957cc0","src/vendor/SPIRV-Cross/main.cpp":"ab2835f6dff9299f562a89755893f98a4bd946d4460abca885ba2172ebce851c","src/vendor/SPIRV-Cross/pkg-config/spirv-cross-c-shared.pc.in":"75a27e069ee07362bc6b7412b2c4e1270778dd639a8b96b8afbb113d21de79e7","src/vendor/SPIRV-Cross/spirv.h":"2c19cd1d262a3757e92276fbaa8e1a706b2328a92f47bda88f849b5cebebb630","src/vendor/SPIRV-Cross/spirv.hpp":"eb7c39a017f0a33e9d9bae7556c678c2840af4cc0beb98b2aeff9d651e370128","src/vendor/SPIRV-Cross/spirv_cfg.cpp":"09b756068d95a87a65a186831484fe21a973d3eb19675225b23864b9d37fe3d0","src/vendor/SPIRV-Cross/spirv_cfg.hpp":"ad98c4e82d6da3ed450dfc7939814115ae6b29ba2a25b0148cfc8c88774055b5","src/vendor/SPIRV-Cross/spirv_common.hpp":"5d0658a6fe9ac2f628754d2439b4d26ec8df7e50e4b196567cd4c7e7b8ce7574","src/vendor/SPIRV-Cross/spirv_cpp.cpp":"d067269ec6fc56860b4ed39edddf0a127f5e2d091512a85a79f02d5f3beccd19","src/vendor/SPIRV-Cross/spirv_cpp.hpp":"751ce82c70a399781f18aca54ea7fbb98083b98706f2a6be1cd1aa90627ef597","src/vendor/SPIRV-Cross/spirv_cross.cpp":"225b4cf4c7f8868019680d0a75a3da7983db428783ee1a3dcbb8c2765a71e79a","src/vendor/SPIRV-Cross/spirv_cross.hpp":"7eab2d7ae4b25a3c4fe85631e664727e036ae23a776aeb8c17db23f08020258a","src/vendor/SPIRV-Cross/spirv_cross_c.cpp":"80f438f4700f0b0b02547771f82be0610ba5e24ba3edb56d4331d59a206a4c2e","src/vendor/SPIRV-Cross/spirv_cross_c.h":"8b0ad63ed9fe52bc62f305afa27b5e33d9bd689a8b3f9935353742faf88a1e91","src/vendor/SPIRV-Cross/spirv_cross_containers.hpp":"409f60a5cb1dba1d0c96ef61761d8643402fc5ab67cecce12f6af3d135cfa338","src/vendor/SPIRV-Cross/spirv_cross_error_handling.hpp":"45868796346eef895cc05825582e60d26c34ec35d1a2b97f5e172f05fc565b19","src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.cpp":"7c7e08db4dfc1084fd9cd266a6f829d35a6b2856198b16307a44f4d1c0743106","src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.hpp":"d15446565eaa430bf2b14b596b3e579a72095a386b1eb256afc977cdf42ec5b9","src/vendor/SPIRV-Cross/spirv_cross_util.cpp":"f2426dccad2fff44053f6b1b9558719471a1ba0445c317f2c0311bc0d8b4636d","src/vendor/SPIRV-Cross/spirv_cross_util.hpp":"63ca5b2d6c80b5ad39473d6841676e48d5db3d2cbcb252fe6a6db0ef2077f0f5","src/vendor/SPIRV-Cross/spirv_glsl.cpp":"c1704189895442d593819472d3f852979107ac1798375d5a44d8f97be17fa3b5","src/vendor/SPIRV-Cross/spirv_glsl.hpp":"fb5e00ff589e3c5a25c5a15e78cf4809b753ebe04c84a008dc977330b8cbbc27","src/vendor/SPIRV-Cross/spirv_hlsl.cpp":"549ff42d0773a3f9e555d1aebd4c0084709e11528082f47c5f2b8b07de029f7c","src/vendor/SPIRV-Cross/spirv_hlsl.hpp":"18f303e7a384acf0e14677b579b100aee838813f54735330f0d1387f2493b363","src/vendor/SPIRV-Cross/spirv_msl.cpp":"7266afeb827e50782cb35362788d27fa9bd641992380008604ea1a4e48ec9c37","src/vendor/SPIRV-Cross/spirv_msl.hpp":"76b609e0b8d2f421c51e98d6357fcf44666b0d510935e083e4e02f20a80051e1","src/vendor/SPIRV-Cross/spirv_parser.cpp":"4def4db8c77967dcd2d6d93330343dc6ebb309e8cd696f52ee568a7c3ee97036","src/vendor/SPIRV-Cross/spirv_parser.hpp":"fc5f92184d1b4986f78088bee8ed7ddb9b342a34f9a3e55a4a594187292b66b8","src/vendor/SPIRV-Cross/spirv_reflect.cpp":"995a4e4315f67d4a2084e2b5d982de9baf72c7e265dde71d03ae0b8a29a24b92","src/vendor/SPIRV-Cross/spirv_reflect.hpp":"a874b40be0b210c69718e87a90e9add24653957656a995d83656f0918cfd10e4","src/wrapper.cpp":"7800cec5564dc1c7c13059cb1b1cac8d9be9248bbc887d5176600980c0d18142","src/wrapper.hpp":"b9a4f846bf57ee7a10fbb81f8f49df96ad11b1e5749c3c510925bb9b029ac08a","tests/common/mod.rs":"2843bf104c7938d93065f7b5688c9f063ad9e5720c407c737aedc5f2dee5a80f","tests/glsl_tests.rs":"ddd85107370dbfcde9d004d6717e229a7278d29ecba375828d8cb79e86625f66","tests/hlsl_tests.rs":"2058cb590c5ab85a636c93c18d0f2a79eb5ea5e647b7f10a2c83fbf394964dd6","tests/msl_tests.rs":"211d3b9cb43455a4c55bd619c05acdd21953358580c50ae75cac3f06eb26c5dd","tests/shaders/array.vert":"d0dab7ddea131e069961054f40a164602448aa78720b7ff480e141d1f7b0b2d6","tests/shaders/array.vert.spv":"8e44421590ade1716be66ad39f60fb1ce58eedeab8f0806335a7369687b308b1","tests/shaders/multiple_entry_points.cl":"2abbe57f2387f07f7f5f4cd375e47900be9c13bdc79aa0ed98a43a798cb0df81","tests/shaders/multiple_entry_points.cl.spv":"bdd34ce6765dbeab637631c3cbdf251532870d9fd6cd6c54883c0c872058ab3b","tests/shaders/rasterize_disabled.vert":"da6de172549830216933c44edf18b13113d7ca87462e3d09ad50dfc9c9836821","tests/shaders/rasterize_disabled.vert.spv":"2ba809eb500ed6e5a067389ccc056551e796e7019517593d110fb62c9dca2056","tests/shaders/sampler.frag":"4c568e65176afe596dd8ef279485e992607e94d612786214ae1c6702d0322e1f","tests/shaders/sampler.frag.spv":"bd7bd1973a82dcfdf5755361fa4dd420fdf1c32c5de0a6f0896a8d5971f98684","tests/shaders/simple.vert":"ea143c97dff5ef03728b96b2dd893bdc59d56651581ecf9fe50f10807b0efdd0","tests/shaders/simple.vert.spv":"a2b5094ffd76288e0d08c37ce0351e28f20bb6d80ddd73fc44a71c1c7cbbf7db","tests/shaders/specialization.comp":"ce32fa1615737209f2e465ea347d79030ddcb33a88c38447e7cde7dffc920163","tests/shaders/specialization.comp.spv":"848604e37b870b8999692b266677be2ce0df6ce38093a0d81e6bc43d0bdf8a3f","tests/shaders/struct.frag":"d8840bb1961d6f14609b00ee54406c1e3ea31cecd8231b77cfb73d28b71910c0","tests/shaders/struct.frag.spv":"774aa886374eb95abf9bb7d0045ee77d97e26529e9ec96b90991a515fdbca4be","tests/shaders/struct.vert":"9299cda83ddb5b5c3d95ab0d057e4df2af137dfd92d6c4d3e96295b7d42e29a1","tests/shaders/struct.vert.spv":"4a82bdee72616ac058bc60d4255efa3e78199a2b8597570c013bebbee7107fb7","tests/shaders/two_ubo.vert":"be109b2c65e5e9e1bb0dab968d7f651232f6b1c46935a3928f980bf7a40f2d62","tests/shaders/two_ubo.vert.spv":"efd14e2d0a782d61dd944711f30b9e7fcb14af17593c1fe4e11cf2b7e232bcc2","tests/shaders/workgroup.comp":"478044b5392e0d1fb042253d71ea6bf7b8a014af4a6ee35d8db4c5343ac69739","tests/shaders/workgroup.comp.spv":"72f636fe3d1d6d0c5963f71bf4349c7e40d544331b33b6b64fb5b65784e6abee","tests/spirv_tests.rs":"6de5c893f631d550fc86853537bddb824ffb534a0a7f130406be3b9ed166f198"},"package":null}
+\ No newline at end of file
+diff --git a/third_party/rust/syn/.cargo-checksum.json b/third_party/rust/syn/.cargo-checksum.json
+index 77939d8fc6..704f2ed200 100644
+--- mozilla-release/third_party/rust/syn/.cargo-checksum.json
++++ mozilla-release/third_party/rust/syn/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{"Cargo.toml":"484d29864d333a361652fa4e24e1dcfab9efa47705ffd8c106d802eb03b78da7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"ca605417b6db8c995458f8407afaad6c177aedcc2274004283600f5638fa1b0c","benches/file.rs":"b45211cc4a0296a77aac2b4de16dbc6b5cb66adfb5afac00a77bccea87f43968","benches/rust.rs":"9cc0f62e944f1583d05c43a395a1556731501cf5976ef67a081f4f6387f883ba","build.rs":"7423ab199728d55c7d64c44b7c6729cfd93bd8273366a77707353003e27565d7","src/attr.rs":"cf81add298f0e75c35a9980a59bc3c2fd3fe933635830d1591374eeb2487c225","src/await.rs":"18f0b2ecb319991f891e300011424985e3cf33d166ea9f29f22d575fc8c83a76","src/bigint.rs":"efc7f64959980653d73fe4f8bc2a3a2904dc05f45b02c6dc15cd316fa3d7c338","src/buffer.rs":"2a432c11a3da67a21d46c2272bf9ce60a0bb20893b5750027bbd8ca3e843ab35","src/custom_keyword.rs":"589e46ec1be9a04d6de12c0b8cadf87cc1c05606ed46ddea62e9869cbca4a191","src/custom_punctuation.rs":"2ba2e294e15a0fce7ede3686c42b2891797079a724dd1193b66e7d305624c891","src/data.rs":"cc9b250d084e444782d3ff5e63c1ba387cbde8f7f2e977eab9846d920b4b8c3f","src/derive.rs":"c18878f14be5d5ab11fd7dda2d2ff1ff75c9662daf11eed033de62e4d0670a89","src/discouraged.rs":"50e10915695c4d14f64a78e20ecbef90a2cd53a7c26ee3426a2524a8ee5c9cbf","src/error.rs":"2c17a402f83ed5ae4ad96e753216771bef620235c2ff1ccc23f4bbafc7266fe1","src/export.rs":"dcae67456278c0339acfbcbb4737b8d37cfba5a150ae789f31f4be79abf7e726","src/expr.rs":"871d8eeb43cef02ef88de3bea7477b79b4eabc096a0899dde0e5750edf482f49","src/ext.rs":"b97ed549490b9248b5b5df31b3d5b08ba8791e23e6c5d3a1157a0363eb683ff3","src/file.rs":"3cc2bf5c709238d515a557f721f231c8c725b196400de051f945b549299d38a7","src/gen/fold.rs":"10b3ae33d0ce410d6bbe8b93be9d5f9e856c7dc8212133cc46b703f97d548190","src/gen/visit.rs":"e0f5798552d186024696b7bfc7219d4ff53b0e45f735a83e77cbb6b6578c5fa4","src/gen/visit_mut.rs":"9f7dda83907969971dba84d545aaa563b0728e54db97ffab5050fdf43a79c731","src/gen_helper.rs":"ea6c66388365971db6a2fc86cbb208f7eacde77e245bc8623f27a3642a3d7741","src/generics.rs":"d845d7a828863123a5187fd0fe59c9dae3636f63bad302bd035792eed3dcb1ba","src/group.rs":"119b62d8481b4b1c327639bed40e114bf1969765250b68186628247fd4144b3b","src/ident.rs":"503156ce51a7ef0420892e8dbf2ecf8fe51f42a84d52cc2c05654e1a83020cbf","src/item.rs":"213f2f58c65ee1aa222f111bc9b1be681f8fb069caed04ca56586839979318d0","src/keyword.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/lib.rs":"24778e9f15e8025e75aca114c712716ada586b471adb3b3b69278f4d39b8a21b","src/lifetime.rs":"905359708f772ec858954badde69ee016d29e6eeba1dd205b268445b1aff6f3a","src/lit.rs":"5bb0bddb94cbd256e50e92dc091a0baa09f1be40a77058b897507f3b17191e5d","src/lookahead.rs":"5cce8b4cb345a85c24a452ea6d78eadb76f01ca0a789cbf5ce35108334904173","src/mac.rs":"6b468244cc07e3f2f10419f833d9e2ed23edbcd6dc34cf21c5947633699db964","src/macros.rs":"0d8c3bab47539aa2d00bec64e92c901ea2c9c0af74c868051c0905b82650f970","src/op.rs":"93cd44770bb110deadf807a01d9a666efe644b6e3010f4b51cae77ee7438cfbb","src/parse.rs":"5017123c249ebc65866af113a0ad671814b9873f47568180e6539a305eb0317d","src/parse_macro_input.rs":"f799aadb7216c2d333b579f48ed2fedfe07b5e96f004b25b569649ffbaa958d2","src/parse_quote.rs":"81575bf60b18b0d8624d7025a5bcc8dcd6633ad70c454dee2a06e4c391700b6c","src/pat.rs":"db0f2263b9813de1f4e3e3e0396fe0080b1e11c8090c6b4fb6fca3cfbe22bc96","src/path.rs":"32e685ac7fd2d4b9989802de8f326a8d47fa710f86ec3e45fd9d3ff8fdfe97ef","src/print.rs":"da6529c1d9d21aaf6c835f66b4e67eacb7cf91a10eb5e9a2143b49bf99b3b5e1","src/punctuated.rs":"384e7b317b26f24118eb4b0c39e949ee9f4f3e700a4c80e462342c83b2cc3282","src/sealed.rs":"896a495a5340eec898527f18bd4ddca408ea03ea0ee3af30074ff48deace778d","src/span.rs":"748c51c6feb223c26d3b1701f5bb98aee823666c775c98106cfa24fe29d8cec1","src/spanned.rs":"adddb6acae14a0fa340df302b932c31e34b259706ce56fd82ab597ec424500e1","src/stmt.rs":"fbccf2b4da7980fe6ea8d99457d291577c0f225b370c1dd97da41abf2a18fcf7","src/thread.rs":"815eca6bd64f4eef7c447f0809e84108f5428ff50225224b373efd8fbb696874","src/token.rs":"761d8d1793560eb2b631c36ddfdbb14ac65178405f095453aa0e75e8816bdbb9","src/tt.rs":"1e32ae216d14d895ff621bf32bc611f138aa00108b0090be2cbaa0affebe8e2a","src/ty.rs":"ce052e0079b65b66bea4e9502d2ff2c90ad4b867904bf7eb892eb60aa3ef219a","tests/clone.sh":"961243d42540d9992090efbbd5478b7aa395671db64a6c28cdadb6edc610ebdf","tests/common/eq.rs":"a42d339808fd32dd4bfd440c254add8c56d5e2cde3a6bf0c88621b618ce5eaa7","tests/common/mod.rs":"20a3300016351fa210a193fbb0db059ef5125fa7909585ded64790004d4977ed","tests/common/parse.rs":"17ba6d1e74aaa3f8096c6d379d803221f12d95cca69927be047d6ddf8367647f","tests/debug/gen.rs":"57bd5cf585e0b86ad00f29f09ff3db3390c4a756d503514a9b28407500dcea3c","tests/debug/mod.rs":"462d6fe34ee75c3ca1207d4db2ff3bdee5b430b9f9ca632e5671d1588d3f76b3","tests/features/error.rs":"e0581a2869cbd237c2bc18a0a85272296e1577bb5f7317a67fa85e28e04eea6f","tests/features/mod.rs":"66a2605ec54ede29208da350f2bed536dfa763b58408d64d3fca3b13de64b64f","tests/macros/mod.rs":"3f2d758c0ba76b93f54b0c1fc22ad50edff8ef42629ba4d47ac7d7f823da8359","tests/repo/mod.rs":"e851a68972c9194a9a8d7b68538b16ed79ae81cba55e1a2ce210d1b759fb1a21","tests/test_asyncness.rs":"b6c46118b036e6807d24eb0e1779244b4fca23dac0d8031e9843b3edec484ce8","tests/test_attribute.rs":"2d8f18a98c989d3f7adaaeb1aeebd4f8413365ace63feecb37cb3f9db9db4d8f","tests/test_derive_input.rs":"477d80f914c54b526f8ff229788dc0e7798d118f6dcfa348f4c99755edb347b9","tests/test_expr.rs":"f35ca80566849a36e6ba6403d9663519eff37e4224360c468fedff8b561a643e","tests/test_generics.rs":"83a5dc07f5c5701c12625399262f7120b66f01a742523f3eda28da2cf2c87eb3","tests/test_grouping.rs":"aadd75215addd9e5a8fa2f9472117d4cb80f1e8b84e07f4c0845675c9014164f","tests/test_ident.rs":"236c239dd66f543f084f44ff747d7bc3962cf11a019a279777fe972f6e17aa4c","tests/test_iterators.rs":"718938da14778dcba06324d36a99d9317c9d45d81a34c6a44c47e1fa38085e9f","tests/test_lit.rs":"7dff2661a5ac586d6ed2fe27501cb8ff62f4cf3f6c91f596bff6057c67ad7857","tests/test_meta.rs":"8444dee084882243b107dfc8a6aac27f9382f9774162d1ac8ed8ec30d60c048e","tests/test_parse_buffer.rs":"b244bb4bc41ff06d21f239e60a3d663fdec5aa4af33f2a354afef36d34f0aefc","tests/test_pat.rs":"41776b878efae9b8e340f21ffe6296e921cf309f618482efd98609c33e32c28b","tests/test_precedence.rs":"71f3ea52cda8b40166bb7416fb98774e6a653542497b521f8e183e283dcf579d","tests/test_round_trip.rs":"e0de37f45fa223b488d25a41beab185eb92abb7bf765a9f13fe5d870ff31f5f1","tests/test_should_parse.rs":"4da4e25ee2baa7e75135c375042a7f958de136c5698dab03f99ff7a774dcd463","tests/test_size.rs":"970150b9d49ef91ab4c8f8c6a59b83f9a68a02acb779f0280733a5efaec6487a","tests/test_token_trees.rs":"a07ea657bf03b9c667c821b2db2af49b176ca737e3e01217a73cca78b7f11380","tests/zzz_stable.rs":"961d4940a926db4ca523d834b060c62de988e6a8e01c9f5efaa7bb4c86745b47"},"package":"66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"28ddb678a5ccac4423435384c8b7116f804e896eabc5aae9d5c2bc666aaebbb4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"03f3b53cf858536a0883aa5b5882ee61dcd0f1e71c0930c9106fcfa1d6aad2df","benches/file.rs":"b4724fc7c0f48b8f488e2632a1064f6c0bf16ded3969680fc3f4a2369536269b","benches/rust.rs":"ea6291ef2d2a83d94a3312fe179d48259f8ec0b04c961993ddd181d0a4ab740e","build.rs":"aeca2312f05aec658eaa66980a0ef3d578837db107a55702b39419ea0422eb4a","src/attr.rs":"7d79482634d6544eb4a4825405407b53660d0f5f8b929f7e1671e005b9d92038","src/await.rs":"18f0b2ecb319991f891e300011424985e3cf33d166ea9f29f22d575fc8c83a76","src/bigint.rs":"efc7f64959980653d73fe4f8bc2a3a2904dc05f45b02c6dc15cd316fa3d7c338","src/buffer.rs":"cf2a4b3bdc247b80c85ff5625a1dfb7a5f517fd835f6e1518a7b924990e4c293","src/custom_keyword.rs":"9627467063e41776315a6a14b2aaea3875592d8e0ebd2dc6df1fc2f12c06f146","src/custom_punctuation.rs":"b00e7bee96eb473507527e39db65e74e71592dc06421d2cfe45ed899c17d4847","src/data.rs":"7aec9a745cd53ec95688afa353f6efb9576e7fc0143757b51d28bc3d900b1d2a","src/derive.rs":"fa71866df6e383673dd3329f455a9f953585b83f9739050be3bf1f8c6d526b96","src/discouraged.rs":"a1f3d85e20dedf50b1b7b4571d970a3a6e9b2de4afde7dd0c986fe240df2ba46","src/error.rs":"c3005b50e3132026250c5356d0d391bf96db8087f0f5f744de98e360d8a20a3e","src/export.rs":"dcae67456278c0339acfbcbb4737b8d37cfba5a150ae789f31f4be79abf7e726","src/expr.rs":"54455fd20041996653ca5379b03cdf3c2fc1b3dd2e1149b5bc6b1dd492545d55","src/ext.rs":"870086d9021e6a6fcefa2f00cd91b55c4b74dcee8f0f6a07e76d96fb44707d61","src/file.rs":"75167ebc77e7870122078eabde1b872c337142d4b0962c20cedffcaaa2a5b7c6","src/gen/clone.rs":"0845c1bf8624c3f235cd247b4eb748e7e16b4c240097cb0ff16751f688c079ae","src/gen/debug.rs":"d24fe37f4ce1dd74f2dc54136e893782d3c4d0908323c036c97599551a56960c","src/gen/eq.rs":"1e6ef09b17ca7f36861ef23ce2a6991b231ed5f087f046469b5f23da40f5b419","src/gen/fold.rs":"3f59e59ed8ad2ab5dd347bfbe41bbc785c2aabd8ae902087a584a6daed597182","src/gen/hash.rs":"e5b2a52587173076777233a9e57e2b3c8e0dd6d6f41d16fa7c9fde68b05c2bfc","src/gen/visit.rs":"23008c170d4dd3975232876a0a654921d9b6af57372cb9fcc133ca740588d666","src/gen/visit_mut.rs":"42886c3ee02ded72d9c3eec006e20431eaee0c6b90ddefc1a36ec7bf50c6a24a","src/gen_helper.rs":"ea6c66388365971db6a2fc86cbb208f7eacde77e245bc8623f27a3642a3d7741","src/generics.rs":"d1c175284ca21e777ef0414c28383929b170ccb00aaf7a929eb18d3b05e18da8","src/group.rs":"119b62d8481b4b1c327639bed40e114bf1969765250b68186628247fd4144b3b","src/ident.rs":"503156ce51a7ef0420892e8dbf2ecf8fe51f42a84d52cc2c05654e1a83020cbf","src/item.rs":"c9ad9881e8cda8ee3f157f0c7602fc53d08a7e3288b9afc388c393689eac5aea","src/lib.rs":"558ad13779233b27bebc4b2fc8025eb1c7e57b32130dc1dd911391e27b427500","src/lifetime.rs":"f390fe06692fc51fbf3eb490bb9f795da70e4452f51c5b0df3bbaa899084ddf1","src/lit.rs":"9fab84e38756b092fbb055dcdf01e31d42d916c49e3eaae8c9019043b0ee4301","src/lookahead.rs":"5cce8b4cb345a85c24a452ea6d78eadb76f01ca0a789cbf5ce35108334904173","src/mac.rs":"e5cecea397fd01a44958162781d8d94343fe2a1b9b9754a5666c3d2ab4d7ef64","src/macros.rs":"2ce05b553f14da4ee550bb681cb0733b7186ad94719cd36f96d53e15fd02cf2b","src/op.rs":"449514e146deab0ab020bc6f764544c294dbc780941c9802bf60cf1b2839d550","src/parse.rs":"bde888c98ee259f2a73489a693515ed4875432b0d79486ac83aea19f441992a3","src/parse_macro_input.rs":"653a020f023cac0eccbc1fcc34aa7bf80567b43e5475deab4ad3e487a5363201","src/parse_quote.rs":"642f21e5fa54df4b7c373fb158289ee1005d49e1a49b1d194df5438faee71c46","src/pat.rs":"1473b258162cc822f1ee0c0869f521053ed345a140c39ed83b9b4dfb6f9f2aca","src/path.rs":"f119f0c2af12fabd360eac9a2312e0f6e6c28c633c9671bde6ef0bece7c5ba3c","src/print.rs":"da6529c1d9d21aaf6c835f66b4e67eacb7cf91a10eb5e9a2143b49bf99b3b5e1","src/punctuated.rs":"212f5a601d6c2eb8b8fa679be1167b455b595bee964d2775b0101ebb16c3eaa5","src/reserved.rs":"3625eb2a64589a4992ab79a1674e9679f465bea613ab139a671df5337e88cee6","src/sealed.rs":"896a495a5340eec898527f18bd4ddca408ea03ea0ee3af30074ff48deace778d","src/span.rs":"748c51c6feb223c26d3b1701f5bb98aee823666c775c98106cfa24fe29d8cec1","src/spanned.rs":"7d77714d585e6f42397091ffb3a799fd7b20c05c5442c737683c429ea7d409a5","src/stmt.rs":"3917fbc897f80efe838267833c55650ff8d636cb49a6d1084e28eff65d0e3ccd","src/thread.rs":"815eca6bd64f4eef7c447f0809e84108f5428ff50225224b373efd8fbb696874","src/token.rs":"a1ca6298bf6592cb80cbab1db4eac2fa4e3fa56729bb807bfb0f08ab0f229ca5","src/tt.rs":"1cc9e200624288322f800f32e3d6e2e53da946467bb312dd40a52c02cdcc4730","src/ty.rs":"cb167cbb16240c59a31b44adec175172caaf75ffef9a0bb168584b51bf105795","src/verbatim.rs":"802a97df997432f18cac6e6200ff6ea29fb2474986005e0fcdbc2b65197f87f7","src/whitespace.rs":"e63dd0aa3d34029f17766a8b09c1a6e4479e36c552c8b7023d710a399333aace","tests/common/eq.rs":"4b190a3833bdfd20a4cb1e3dff25a698751dec71d6f30249cf09426e061a4fb1","tests/common/mod.rs":"25ef6d7daa09bad3198a0e9e91b2812425f92db7c585c1e34a03a84d7362ccd8","tests/common/parse.rs":"8b7ba32f4988c30758c108536c4877dc5a039a237bf9b0687220ef2295797bbd","tests/debug/gen.rs":"d6e2abf2a7bb58a7895a60c2f094a98a4f85c9189d02011d0dcef6ef053f26e3","tests/debug/mod.rs":"868763d0ef1609a3ad5e05e9f1bfa0f813e91e7e9a36653414a188bb2fdaa425","tests/macros/mod.rs":"c0eafa4e3845fc08f6efe6021bac37822c0ac325eb7b51194a5f35236f648d92","tests/repo/mod.rs":"9e316b88d57ae213e81950c35e45443078ec90e702798353bc3528cb8a2810b6","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"cff01db49d28ab23b0b258bc6c0a5cc4071be4fe7248eef344a5d79d2fb649b7","tests/test_attribute.rs":"0ffd99384e1a52ae17d9fed5c4053e411e8f9018decef07ffa621d1faa7329d8","tests/test_derive_input.rs":"610444351e3bf99366976bbf1da109c334a70ac9500caef366bcf9b68819829f","tests/test_expr.rs":"0ee83f6f6de950018c043efcc3e85776b4227dae3068309998a8d9709f2fc66c","tests/test_generics.rs":"9d713f90a79d6145efc89fb6f946029ca03486c632219950889da39940152ba0","tests/test_grouping.rs":"46c27baec4daaaf1e891892f0b0515ea8a44619071c7d0cc9192580916f1569f","tests/test_ident.rs":"9eb53d1e21edf23e7c9e14dc74dcc2b2538e9221e19dbcc0a44e3acc2e90f3f6","tests/test_item.rs":"461ed0c8648afffcea3217f52c9a88298182b4d39d73a11803b1281d99c98c25","tests/test_iterators.rs":"53ed6078d37550bd6765d2411e3660be401aef8a31a407350cc064a7d08c7c33","tests/test_lit.rs":"2a46c5f2f2ad1dcbb7e9b0cd11b55861c5ff818c2c4c51351d07e2daa7c74674","tests/test_meta.rs":"1fc98af3279cadc3d8db3c7e8d4d7f9e9dbd4d17548cf6a2f6f4536ed65367f6","tests/test_parse_buffer.rs":"8bbe2d24ca8a3788f72c6908fc96c26d546f11c69687bf8d72727f851d5e2d27","tests/test_parse_stream.rs":"2f449a2c41a3dee6fd14bee24e1666a453cb808eda17332fd91afd127fcdd2a6","tests/test_pat.rs":"2cb331fe404496d51e7cc7e283ae13c519a2265ca82e1c88e113296f860c2cba","tests/test_path.rs":"fcd5591e639fc787acc9763d828a811c8114525c9341282eefda8f331e082a51","tests/test_precedence.rs":"8d03656741b01e577d7501ce24332d1a4febec3e31a043e47c61062b8c527ed2","tests/test_receiver.rs":"084eca59984b9a18651da52f2c4407355da3de1335916a12477652999e2d01cc","tests/test_round_trip.rs":"ba01bf4ec04cd2d6f9e4800c343563925ae960c5f16752dc0797fda4451b6cc2","tests/test_shebang.rs":"f5772cadad5b56e3112cb16308b779f92bce1c3a48091fc9933deb2276a69331","tests/test_should_parse.rs":"1d3535698a446e2755bfc360676bdb161841a1f454cdef6e7556c6d06a95c89d","tests/test_size.rs":"5fae772bab66809d6708232f35cfb4a287882486763b0f763feec2ad79fbb68b","tests/test_stmt.rs":"17e4355843ee2982b51faba2721a18966f8c2b9422e16b052a123b8ee8b80752","tests/test_token_trees.rs":"43e56a701817e3c3bfd0cae54a457dd7a38ccb3ca19da41e2b995fdf20e6ed18","tests/test_ty.rs":"5b7c0bfc4963d41920dd0b39fdea419e34f00409ba86ad4211d6c3c7e8bbe1c0","tests/test_visibility.rs":"3f958e2b3b5908005e756a80eea326a91eac97cc4ab60599bebde8d4b942d65c","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"963f7d3cc59b59b9325165add223142bbf1df27655d07789f109896d353d8350"}
+\ No newline at end of file
+diff --git a/third_party/rust/syn/Cargo.toml b/third_party/rust/syn/Cargo.toml
+index 7a5c962f06..20277fc461 100644
+--- mozilla-release/third_party/rust/syn/Cargo.toml
++++ mozilla-release/third_party/rust/syn/Cargo.toml
+@@ -13,7 +13,7 @@
+ [package]
+ edition = "2018"
+ name = "syn"
+-version = "1.0.5"
++version = "1.0.40"
+ authors = ["David Tolnay <dtolnay@gmail.com>"]
+ include = ["/benches/**", "/build.rs", "/Cargo.toml", "/LICENSE-APACHE", "/LICENSE-MIT", "/README.md", "/src/**", "/tests/**"]
+ description = "Parser for Rust source code"
+@@ -24,25 +24,21 @@ license = "MIT OR Apache-2.0"
+ repository = "https://github.com/dtolnay/syn"
+ [package.metadata.docs.rs]
+ all-features = true
++targets = ["x86_64-unknown-linux-gnu"]
+
+ [package.metadata.playground]
+-all-features = true
+-
+-[lib]
+-name = "syn"
++features = ["full", "visit", "visit-mut", "fold", "extra-traits"]
+
+ [[bench]]
+ name = "rust"
+ harness = false
+ required-features = ["full", "parsing"]
+-edition = "2018"
+
+ [[bench]]
+ name = "file"
+ required-features = ["full", "parsing"]
+-edition = "2018"
+ [dependencies.proc-macro2]
+-version = "1.0"
++version = "1.0.13"
+ default-features = false
+
+ [dependencies.quote]
+@@ -52,18 +48,34 @@ default-features = false
+
+ [dependencies.unicode-xid]
+ version = "0.2"
++[dev-dependencies.anyhow]
++version = "1.0"
++
++[dev-dependencies.flate2]
++version = "1.0"
++
+ [dev-dependencies.insta]
+-version = "0.9"
++version = "0.16"
+
+ [dev-dependencies.rayon]
+ version = "1.0"
+
+ [dev-dependencies.ref-cast]
+-version = "0.2"
++version = "1.0"
+
+ [dev-dependencies.regex]
+ version = "1.0"
+
++[dev-dependencies.reqwest]
++version = "0.10"
++features = ["blocking"]
++
++[dev-dependencies.syn-test-suite]
++version = "0"
++
++[dev-dependencies.tar]
++version = "0.4"
++
+ [dev-dependencies.termcolor]
+ version = "1.0"
+
+@@ -80,7 +92,6 @@ full = []
+ parsing = []
+ printing = ["quote"]
+ proc-macro = ["proc-macro2/proc-macro", "quote/proc-macro"]
++test = ["syn-test-suite/all-features"]
+ visit = []
+ visit-mut = []
+-[badges.travis-ci]
+-repository = "dtolnay/syn"
+diff --git a/third_party/rust/syn/README.md b/third_party/rust/syn/README.md
+index 29a7f32a46..12b5f45b3d 100644
+--- mozilla-release/third_party/rust/syn/README.md
++++ mozilla-release/third_party/rust/syn/README.md
+@@ -1,10 +1,10 @@
+ Parser for Rust source code
+ ===========================
+
+-[![Build Status](https://api.travis-ci.org/dtolnay/syn.svg?branch=master)](https://travis-ci.org/dtolnay/syn)
+-[![Latest Version](https://img.shields.io/crates/v/syn.svg)](https://crates.io/crates/syn)
+-[![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/syn/1.0/syn/)
+-[![Rustc Version 1.31+](https://img.shields.io/badge/rustc-1.31+-lightgray.svg)](https://blog.rust-lang.org/2018/12/06/Rust-1.31-and-rust-2018.html)
++[<img alt="github" src="https://img.shields.io/badge/github-dtolnay/syn-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/syn)
++[<img alt="crates.io" src="https://img.shields.io/crates/v/syn.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/syn)
++[<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-syn-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K" height="20">](https://docs.rs/syn)
++[<img alt="build status" src="https://img.shields.io/github/workflow/status/dtolnay/syn/CI/master?style=for-the-badge" height="20">](https://github.com/dtolnay/syn/actions?query=branch%3Amaster)
+
+ Syn is a parsing library for parsing a stream of Rust tokens into a syntax tree
+ of Rust source code.
+@@ -46,10 +46,6 @@ contains some APIs that may be useful more generally.
+ [`syn::DeriveInput`]: https://docs.rs/syn/1.0/syn/struct.DeriveInput.html
+ [parser functions]: https://docs.rs/syn/1.0/syn/parse/index.html
+
+-If you get stuck with anything involving procedural macros in Rust I am happy to
+-provide help even if the issue is not related to Syn. Please file a ticket in
+-this repo.
+-
+ *Version requirement: Syn supports rustc 1.31 and up.*
+
+ [*Release notes*](https://github.com/dtolnay/syn/releases)
+@@ -88,8 +84,6 @@ proc-macro = true
+ ```
+
+ ```rust
+-extern crate proc_macro;
+-
+ use proc_macro::TokenStream;
+ use quote::quote;
+ use syn::{parse_macro_input, DeriveInput};
+@@ -271,7 +265,7 @@ points, which are required by the language to use `proc_macro::TokenStream`.
+ The proc-macro2 crate will automatically detect and use the compiler's data
+ structures when a procedural macro is active.
+
+-[proc-macro2]: https://docs.rs/proc-macro2/1.0.0/proc_macro2/
++[proc-macro2]: https://docs.rs/proc-macro2/1.0/proc_macro2/
+
+ <br>
+
+diff --git a/third_party/rust/syn/benches/file.rs b/third_party/rust/syn/benches/file.rs
+index 08ecd90960..58ab8df297 100644
+--- mozilla-release/third_party/rust/syn/benches/file.rs
++++ mozilla-release/third_party/rust/syn/benches/file.rs
+@@ -1,9 +1,16 @@
+ // $ cargo bench --features full --bench file
+
+ #![feature(rustc_private, test)]
++#![recursion_limit = "1024"]
+
+ extern crate test;
+
++#[macro_use]
++#[path = "../tests/macros/mod.rs"]
++mod macros;
++
++#[path = "../tests/common/mod.rs"]
++mod common;
+ #[path = "../tests/repo/mod.rs"]
+ pub mod repo;
+
+diff --git a/third_party/rust/syn/benches/rust.rs b/third_party/rust/syn/benches/rust.rs
+index e3d9cd29ba..50e1a7f601 100644
+--- mozilla-release/third_party/rust/syn/benches/rust.rs
++++ mozilla-release/third_party/rust/syn/benches/rust.rs
+@@ -4,7 +4,14 @@
+ // $ RUSTFLAGS='--cfg syn_only' cargo build --release --features full --bench rust
+
+ #![cfg_attr(not(syn_only), feature(rustc_private))]
++#![recursion_limit = "1024"]
+
++#[macro_use]
++#[path = "../tests/macros/mod.rs"]
++mod macros;
++
++#[path = "../tests/common/mod.rs"]
++mod common;
+ #[path = "../tests/repo/mod.rs"]
+ mod repo;
+
+@@ -28,31 +35,35 @@ mod syn_parse {
+ }
+
+ #[cfg(not(syn_only))]
+-mod libsyntax_parse {
++mod librustc_parse {
+ extern crate rustc_data_structures;
+- extern crate syntax;
+- extern crate syntax_pos;
++ extern crate rustc_errors;
++ extern crate rustc_parse;
++ extern crate rustc_session;
++ extern crate rustc_span;
+
+ use rustc_data_structures::sync::Lrc;
+- use syntax::edition::Edition;
+- use syntax::errors::{emitter::Emitter, DiagnosticBuilder, Handler};
+- use syntax::parse::ParseSess;
+- use syntax::source_map::{FilePathMapping, SourceMap};
+- use syntax_pos::FileName;
++ use rustc_errors::{emitter::Emitter, Diagnostic, Handler};
++ use rustc_session::parse::ParseSess;
++ use rustc_span::source_map::{FilePathMapping, SourceMap};
++ use rustc_span::{edition::Edition, FileName};
+
+ pub fn bench(content: &str) -> Result<(), ()> {
+ struct SilentEmitter;
+
+ impl Emitter for SilentEmitter {
+- fn emit_diagnostic(&mut self, _db: &DiagnosticBuilder) {}
++ fn emit_diagnostic(&mut self, _diag: &Diagnostic) {}
++ fn source_map(&self) -> Option<&Lrc<SourceMap>> {
++ None
++ }
+ }
+
+- syntax::with_globals(Edition::Edition2018, || {
++ rustc_span::with_session_globals(Edition::Edition2018, || {
+ let cm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
+ let emitter = Box::new(SilentEmitter);
+ let handler = Handler::with_emitter(false, None, emitter);
+ let sess = ParseSess::with_span_handler(handler, cm);
+- if let Err(mut diagnostic) = syntax::parse::parse_crate_from_source_str(
++ if let Err(mut diagnostic) = rustc_parse::parse_crate_from_source_str(
+ FileName::Custom("bench".to_owned()),
+ content.to_owned(),
+ &sess,
+@@ -104,11 +115,11 @@ fn main() {
+ repo::clone_rust();
+
+ macro_rules! testcases {
+- ($($(#[$cfg:meta])* $name:path,)*) => {
++ ($($(#[$cfg:meta])* $name:ident,)*) => {
+ vec![
+ $(
+ $(#[$cfg])*
+- (stringify!($name), $name as fn(&str) -> Result<(), ()>),
++ (stringify!($name), $name::bench as fn(&str) -> Result<(), ()>),
+ )*
+ ]
+ };
+@@ -128,12 +139,12 @@ fn main() {
+
+ for (name, f) in testcases!(
+ #[cfg(not(syn_only))]
+- read_from_disk::bench,
++ read_from_disk,
+ #[cfg(not(syn_only))]
+- tokenstream_parse::bench,
+- syn_parse::bench,
++ tokenstream_parse,
++ syn_parse,
+ #[cfg(not(syn_only))]
+- libsyntax_parse::bench,
++ librustc_parse,
+ ) {
+ eprint!("{:20}", format!("{}:", name));
+ let elapsed = exec(f);
+diff --git a/third_party/rust/syn/build.rs b/third_party/rust/syn/build.rs
+index c0f9ed3406..cf7681c3f9 100644
+--- mozilla-release/third_party/rust/syn/build.rs
++++ mozilla-release/third_party/rust/syn/build.rs
+@@ -1,6 +1,6 @@
+ use std::env;
+ use std::process::Command;
+-use std::str::{self, FromStr};
++use std::str;
+
+ // The rustc-cfg strings below are *not* public API. Please let us know by
+ // opening a GitHub issue if your build environment requires some way to enable
+@@ -26,38 +26,14 @@ struct Compiler {
+ }
+
+ fn rustc_version() -> Option<Compiler> {
+- let rustc = match env::var_os("RUSTC") {
+- Some(rustc) => rustc,
+- None => return None,
+- };
+-
+- let output = match Command::new(rustc).arg("--version").output() {
+- Ok(output) => output,
+- Err(_) => return None,
+- };
+-
+- let version = match str::from_utf8(&output.stdout) {
+- Ok(version) => version,
+- Err(_) => return None,
+- };
+-
++ let rustc = env::var_os("RUSTC")?;
++ let output = Command::new(rustc).arg("--version").output().ok()?;
++ let version = str::from_utf8(&output.stdout).ok()?;
+ let mut pieces = version.split('.');
+ if pieces.next() != Some("rustc 1") {
+ return None;
+ }
+-
+- let next = match pieces.next() {
+- Some(next) => next,
+- None => return None,
+- };
+-
+- let minor = match u32::from_str(next) {
+- Ok(minor) => minor,
+- Err(_) => return None,
+- };
+-
+- Some(Compiler {
+- minor: minor,
+- nightly: version.contains("nightly"),
+- })
++ let minor = pieces.next()?.parse().ok()?;
++ let nightly = version.contains("nightly");
++ Some(Compiler { minor, nightly })
+ }
+diff --git a/third_party/rust/syn/src/attr.rs b/third_party/rust/syn/src/attr.rs
+index 34009deabc..fa4f1cb2a3 100644
+--- mozilla-release/third_party/rust/syn/src/attr.rs
++++ mozilla-release/third_party/rust/syn/src/attr.rs
+@@ -9,15 +9,11 @@ use proc_macro2::TokenStream;
+ use crate::parse::{Parse, ParseBuffer, ParseStream, Parser, Result};
+ #[cfg(feature = "parsing")]
+ use crate::punctuated::Pair;
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
+-#[cfg(feature = "extra-traits")]
+-use std::hash::{Hash, Hasher};
+
+ ast_struct! {
+ /// An attribute like `#[repr(transparent)]`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// <br>
+@@ -111,7 +107,46 @@ ast_struct! {
+ ///
+ /// [`parse_meta()`]: Attribute::parse_meta
+ /// [`parse_args()`]: Attribute::parse_args
+- pub struct Attribute #manual_extra_traits {
++ ///
++ /// <p><br></p>
++ ///
++ /// # Doc comments
++ ///
++ /// The compiler transforms doc comments, such as `/// comment` and `/*!
++ /// comment */`, into attributes before macros are expanded. Each comment is
++ /// expanded into an attribute of the form `#[doc = r"comment"]`.
++ ///
++ /// As an example, the following `mod` items are expanded identically:
++ ///
++ /// ```
++ /// # use syn::{ItemMod, parse_quote};
++ /// let doc: ItemMod = parse_quote! {
++ /// /// Single line doc comments
++ /// /// We write so many!
++ /// /**
++ /// * Multi-line comments...
++ /// * May span many lines
++ /// */
++ /// mod example {
++ /// //! Of course, they can be inner too
++ /// /*! And fit in a single line */
++ /// }
++ /// };
++ /// let attr: ItemMod = parse_quote! {
++ /// #[doc = r" Single line doc comments"]
++ /// #[doc = r" We write so many!"]
++ /// #[doc = r"
++ /// * Multi-line comments...
++ /// * May span many lines
++ /// "]
++ /// mod example {
++ /// #![doc = r" Of course, they can be inner too"]
++ /// #![doc = r" And fit in a single line "]
++ /// }
++ /// };
++ /// assert_eq!(doc, attr);
++ /// ```
++ pub struct Attribute {
+ pub pound_token: Token![#],
+ pub style: AttrStyle,
+ pub bracket_token: token::Bracket,
+@@ -120,39 +155,11 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Attribute {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Attribute {
+- fn eq(&self, other: &Self) -> bool {
+- self.style == other.style
+- && self.pound_token == other.pound_token
+- && self.bracket_token == other.bracket_token
+- && self.path == other.path
+- && TokenStreamHelper(&self.tokens) == TokenStreamHelper(&other.tokens)
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Attribute {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- self.style.hash(state);
+- self.pound_token.hash(state);
+- self.bracket_token.hash(state);
+- self.path.hash(state);
+- TokenStreamHelper(&self.tokens).hash(state);
+- }
+-}
+-
+ impl Attribute {
+ /// Parses the content of the attribute, consisting of the path and tokens,
+ /// as a [`Meta`] if possible.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_meta(&self) -> Result<Meta> {
+@@ -199,7 +206,7 @@ impl Attribute {
+ /// ^^^^^^^^^ what gets parsed
+ /// ```
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_args<T: Parse>(&self) -> Result<T> {
+@@ -208,7 +215,7 @@ impl Attribute {
+
+ /// Parse the arguments to the attribute using the given parser.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_args_with<F: Parser>(&self, parser: F) -> Result<F::Output> {
+@@ -221,7 +228,7 @@ impl Attribute {
+
+ /// Parses zero or more outer attributes from the stream.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_outer(input: ParseStream) -> Result<Vec<Self>> {
+@@ -234,7 +241,7 @@ impl Attribute {
+
+ /// Parses zero or more inner attributes from the stream.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_inner(input: ParseStream) -> Result<Vec<Self>> {
+@@ -247,7 +254,7 @@ impl Attribute {
+ }
+
+ #[cfg(feature = "parsing")]
+-fn error_expected_args(attr: &Attribute) -> Error {
++fn expected_parentheses(attr: &Attribute) -> String {
+ let style = match attr.style {
+ AttrStyle::Outer => "#",
+ AttrStyle::Inner(_) => "#!",
+@@ -261,19 +268,23 @@ fn error_expected_args(attr: &Attribute) -> Error {
+ path += &segment.ident.to_string();
+ }
+
+- let msg = format!("expected attribute arguments: {}[{}(...)]", style, path);
+-
+- #[cfg(feature = "printing")]
+- return Error::new_spanned(attr, msg);
+-
+- #[cfg(not(feature = "printing"))]
+- return Error::new(attr.bracket_token.span, msg);
++ format!("{}[{}(...)]", style, path)
+ }
+
+ #[cfg(feature = "parsing")]
+ fn enter_args<'a>(attr: &Attribute, input: ParseStream<'a>) -> Result<ParseBuffer<'a>> {
+ if input.is_empty() {
+- return Err(error_expected_args(attr));
++ let expected = expected_parentheses(attr);
++ let msg = format!("expected attribute arguments in parentheses: {}", expected);
++ return Err(crate::error::new2(
++ attr.pound_token.span,
++ attr.bracket_token.span,
++ msg,
++ ));
++ } else if input.peek(Token![=]) {
++ let expected = expected_parentheses(attr);
++ let msg = format!("expected parentheses: {}", expected);
++ return Err(input.error(msg));
+ };
+
+ let content;
+@@ -298,7 +309,7 @@ ast_enum! {
+ /// Distinguishes between attributes that decorate an item and attributes
+ /// that are contained within an item.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Outer attributes
+@@ -312,7 +323,6 @@ ast_enum! {
+ /// - `#![feature(proc_macro)]`
+ /// - `//! # Example`
+ /// - `/*! Please file an issue */`
+- #[cfg_attr(feature = "clone-impls", derive(Copy))]
+ pub enum AttrStyle {
+ Outer,
+ Inner(Token![!]),
+@@ -322,7 +332,7 @@ ast_enum! {
+ ast_enum_of_structs! {
+ /// Content of a compile-time structured attribute.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// ## Path
+@@ -360,7 +370,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A structured list within an attribute, like `derive(Copy, Clone)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct MetaList {
+ pub path: Path,
+@@ -372,7 +382,7 @@ ast_struct! {
+ ast_struct! {
+ /// A name-value pair within an attribute, like `feature = "nightly"`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct MetaNameValue {
+ pub path: Path,
+@@ -398,7 +408,7 @@ impl Meta {
+ ast_enum_of_structs! {
+ /// Element of a compile-time attribute list.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum NestedMeta {
+ /// A structured meta item, like the `Copy` in `#[derive(Copy)]` which
+@@ -429,8 +439,8 @@ ast_enum_of_structs! {
+ /// as type `AttributeArgs`.
+ ///
+ /// ```
+-/// extern crate proc_macro;
+-///
++/// # extern crate proc_macro;
++/// #
+ /// use proc_macro::TokenStream;
+ /// use syn::{parse_macro_input, AttributeArgs, ItemFn};
+ ///
+@@ -464,7 +474,7 @@ where
+ fn is_outer(attr: &&Attribute) -> bool {
+ match attr.style {
+ AttrStyle::Outer => true,
+- _ => false,
++ AttrStyle::Inner(_) => false,
+ }
+ }
+ self.into_iter().filter(is_outer)
+@@ -474,7 +484,7 @@ where
+ fn is_inner(attr: &&Attribute) -> bool {
+ match attr.style {
+ AttrStyle::Inner(_) => true,
+- _ => false,
++ AttrStyle::Outer => false,
+ }
+ }
+ self.into_iter().filter(is_inner)
+diff --git a/third_party/rust/syn/src/buffer.rs b/third_party/rust/syn/src/buffer.rs
+index 551a5ac816..a461cc49ea 100644
+--- mozilla-release/third_party/rust/syn/src/buffer.rs
++++ mozilla-release/third_party/rust/syn/src/buffer.rs
+@@ -1,7 +1,7 @@
+ //! A stably addressed token buffer supporting efficient traversal based on a
+ //! cheaply copyable cursor.
+ //!
+-//! *This module is available if Syn is built with the `"parsing"` feature.*
++//! *This module is available only if Syn is built with the `"parsing"` feature.*
+
+ // This module is heavily commented as it contains most of the unsafe code in
+ // Syn, and caution should be used when editing it. The public-facing interface
+@@ -36,7 +36,7 @@ enum Entry {
+ /// `TokenStream` which requires a deep copy in order to traverse more than
+ /// once.
+ ///
+-/// *This type is available if Syn is built with the `"parsing"` feature.*
++/// *This type is available only if Syn is built with the `"parsing"` feature.*
+ pub struct TokenBuffer {
+ // NOTE: Do not derive clone on this - there are raw pointers inside which
+ // will be messed up. Moving the `TokenBuffer` itself is safe as the actual
+@@ -98,7 +98,7 @@ impl TokenBuffer {
+ /// Creates a `TokenBuffer` containing all the tokens from the input
+ /// `TokenStream`.
+ ///
+- /// *This method is available if Syn is built with both the `"parsing"` and
++ /// *This method is available only if Syn is built with both the `"parsing"` and
+ /// `"proc-macro"` features.*
+ #[cfg(all(
+ not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "wasi"))),
+@@ -133,8 +133,7 @@ impl TokenBuffer {
+ /// Two cursors are equal if they have the same location in the same input
+ /// stream, and have the same scope.
+ ///
+-/// *This type is available if Syn is built with the `"parsing"` feature.*
+-#[derive(Copy, Clone, Eq, PartialEq)]
++/// *This type is available only if Syn is built with the `"parsing"` feature.*
+ pub struct Cursor<'a> {
+ // The current entry which the `Cursor` is pointing at.
+ ptr: *const Entry,
+@@ -201,13 +200,13 @@ impl<'a> Cursor<'a> {
+ Cursor::create(self.ptr.offset(1), self.scope)
+ }
+
+- /// If the cursor is looking at a `None`-delimited group, move it to look at
+- /// the first token inside instead. If the group is empty, this will move
++ /// While the cursor is looking at a `None`-delimited group, move it to look
++ /// at the first token inside instead. If the group is empty, this will move
+ /// the cursor past the `None`-delimited group.
+ ///
+ /// WARNING: This mutates its argument.
+ fn ignore_none(&mut self) {
+- if let Entry::Group(group, buf) = self.entry() {
++ while let Entry::Group(group, buf) = self.entry() {
+ if group.delimiter() == Delimiter::None {
+ // NOTE: We call `Cursor::create` here to make sure that
+ // situations where we should immediately exit the span after
+@@ -215,13 +214,14 @@ impl<'a> Cursor<'a> {
+ unsafe {
+ *self = Cursor::create(&buf.data[0], self.scope);
+ }
++ } else {
++ break;
+ }
+ }
+ }
+
+ /// Checks whether the cursor is currently pointing at the end of its valid
+ /// scope.
+- #[inline]
+ pub fn eof(self) -> bool {
+ // We're at eof if we're at the end of our scope.
+ self.ptr == self.scope
+@@ -342,6 +342,44 @@ impl<'a> Cursor<'a> {
+ Entry::End(..) => Span::call_site(),
+ }
+ }
++
++ /// Skip over the next token without cloning it. Returns `None` if this
++ /// cursor points to eof.
++ ///
++ /// This method treats `'lifetimes` as a single token.
++ pub(crate) fn skip(self) -> Option<Cursor<'a>> {
++ match self.entry() {
++ Entry::End(..) => None,
++
++ // Treat lifetimes as a single tt for the purposes of 'skip'.
++ Entry::Punct(op) if op.as_char() == '\'' && op.spacing() == Spacing::Joint => {
++ let next = unsafe { self.bump() };
++ match next.entry() {
++ Entry::Ident(_) => Some(unsafe { next.bump() }),
++ _ => Some(next),
++ }
++ }
++ _ => Some(unsafe { self.bump() }),
++ }
++ }
++}
++
++impl<'a> Copy for Cursor<'a> {}
++
++impl<'a> Clone for Cursor<'a> {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++
++impl<'a> Eq for Cursor<'a> {}
++
++impl<'a> PartialEq for Cursor<'a> {
++ fn eq(&self, other: &Self) -> bool {
++ let Cursor { ptr, scope, marker } = self;
++ let _ = marker;
++ *ptr == other.ptr && *scope == other.scope
++ }
+ }
+
+ pub(crate) fn same_scope(a: Cursor, b: Cursor) -> bool {
+diff --git a/third_party/rust/syn/src/custom_keyword.rs b/third_party/rust/syn/src/custom_keyword.rs
+index 200e8478ef..a33044a564 100644
+--- mozilla-release/third_party/rust/syn/src/custom_keyword.rs
++++ mozilla-release/third_party/rust/syn/src/custom_keyword.rs
+@@ -86,7 +86,7 @@
+ /// }
+ /// }
+ /// ```
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! custom_keyword {
+ ($ident:ident) => {
+ #[allow(non_camel_case_types)]
+@@ -95,7 +95,7 @@ macro_rules! custom_keyword {
+ }
+
+ #[doc(hidden)]
+- #[allow(non_snake_case)]
++ #[allow(dead_code, non_snake_case)]
+ pub fn $ident<__S: $crate::export::IntoSpans<[$crate::export::Span; 1]>>(
+ span: __S,
+ ) -> $ident {
+@@ -112,10 +112,10 @@ macro_rules! custom_keyword {
+ }
+ }
+
+- impl_parse_for_custom_keyword!($ident);
+- impl_to_tokens_for_custom_keyword!($ident);
+- impl_clone_for_custom_keyword!($ident);
+- impl_extra_traits_for_custom_keyword!($ident);
++ $crate::impl_parse_for_custom_keyword!($ident);
++ $crate::impl_to_tokens_for_custom_keyword!($ident);
++ $crate::impl_clone_for_custom_keyword!($ident);
++ $crate::impl_extra_traits_for_custom_keyword!($ident);
+ };
+ }
+
+diff --git a/third_party/rust/syn/src/custom_punctuation.rs b/third_party/rust/syn/src/custom_punctuation.rs
+index 29fa448bd8..70dff42851 100644
+--- mozilla-release/third_party/rust/syn/src/custom_punctuation.rs
++++ mozilla-release/third_party/rust/syn/src/custom_punctuation.rs
+@@ -74,19 +74,19 @@
+ /// let _: PathSegments = syn::parse_str(input).unwrap();
+ /// }
+ /// ```
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! custom_punctuation {
+ ($ident:ident, $($tt:tt)+) => {
+ pub struct $ident {
+- pub spans: custom_punctuation_repr!($($tt)+),
++ pub spans: $crate::custom_punctuation_repr!($($tt)+),
+ }
+
+ #[doc(hidden)]
+- #[allow(non_snake_case)]
+- pub fn $ident<__S: $crate::export::IntoSpans<custom_punctuation_repr!($($tt)+)>>(
++ #[allow(dead_code, non_snake_case)]
++ pub fn $ident<__S: $crate::export::IntoSpans<$crate::custom_punctuation_repr!($($tt)+)>>(
+ spans: __S,
+ ) -> $ident {
+- let _validate_len = 0 $(+ custom_punctuation_len!(strict, $tt))*;
++ let _validate_len = 0 $(+ $crate::custom_punctuation_len!(strict, $tt))*;
+ $ident {
+ spans: $crate::export::IntoSpans::into_spans(spans)
+ }
+@@ -98,33 +98,33 @@ macro_rules! custom_punctuation {
+ }
+ }
+
+- impl_parse_for_custom_punctuation!($ident, $($tt)+);
+- impl_to_tokens_for_custom_punctuation!($ident, $($tt)+);
+- impl_clone_for_custom_punctuation!($ident, $($tt)+);
+- impl_extra_traits_for_custom_punctuation!($ident, $($tt)+);
++ $crate::impl_parse_for_custom_punctuation!($ident, $($tt)+);
++ $crate::impl_to_tokens_for_custom_punctuation!($ident, $($tt)+);
++ $crate::impl_clone_for_custom_punctuation!($ident, $($tt)+);
++ $crate::impl_extra_traits_for_custom_punctuation!($ident, $($tt)+);
+ };
+ }
+
+ // Not public API.
+ #[cfg(feature = "parsing")]
+ #[doc(hidden)]
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! impl_parse_for_custom_punctuation {
+ ($ident:ident, $($tt:tt)+) => {
+ impl $crate::token::CustomToken for $ident {
+ fn peek(cursor: $crate::buffer::Cursor) -> bool {
+- $crate::token::parsing::peek_punct(cursor, stringify_punct!($($tt)+))
++ $crate::token::parsing::peek_punct(cursor, $crate::stringify_punct!($($tt)+))
+ }
+
+ fn display() -> &'static $crate::export::str {
+- custom_punctuation_concat!("`", stringify_punct!($($tt)+), "`")
++ concat!("`", $crate::stringify_punct!($($tt)+), "`")
+ }
+ }
+
+ impl $crate::parse::Parse for $ident {
+ fn parse(input: $crate::parse::ParseStream) -> $crate::parse::Result<$ident> {
+- let spans: custom_punctuation_repr!($($tt)+) =
+- $crate::token::parsing::punct(input, stringify_punct!($($tt)+))?;
++ let spans: $crate::custom_punctuation_repr!($($tt)+) =
++ $crate::token::parsing::punct(input, $crate::stringify_punct!($($tt)+))?;
+ Ok($ident(spans))
+ }
+ }
+@@ -142,12 +142,12 @@ macro_rules! impl_parse_for_custom_punctuation {
+ // Not public API.
+ #[cfg(feature = "printing")]
+ #[doc(hidden)]
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! impl_to_tokens_for_custom_punctuation {
+ ($ident:ident, $($tt:tt)+) => {
+ impl $crate::export::ToTokens for $ident {
+ fn to_tokens(&self, tokens: &mut $crate::export::TokenStream2) {
+- $crate::token::printing::punct(stringify_punct!($($tt)+), &self.spans, tokens)
++ $crate::token::printing::punct($crate::stringify_punct!($($tt)+), &self.spans, tokens)
+ }
+ }
+ };
+@@ -221,16 +221,16 @@ macro_rules! impl_extra_traits_for_custom_punctuation {
+
+ // Not public API.
+ #[doc(hidden)]
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! custom_punctuation_repr {
+ ($($tt:tt)+) => {
+- [$crate::export::Span; 0 $(+ custom_punctuation_len!(lenient, $tt))+]
++ [$crate::export::Span; 0 $(+ $crate::custom_punctuation_len!(lenient, $tt))+]
+ };
+ }
+
+ // Not public API.
+ #[doc(hidden)]
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ #[rustfmt::skip]
+ macro_rules! custom_punctuation_len {
+ ($mode:ident, +) => { 1 };
+@@ -279,7 +279,7 @@ macro_rules! custom_punctuation_len {
+ ($mode:ident, -=) => { 2 };
+ ($mode:ident, ~) => { 1 };
+ (lenient, $tt:tt) => { 0 };
+- (strict, $tt:tt) => {{ custom_punctuation_unexpected!($tt); 0 }};
++ (strict, $tt:tt) => {{ $crate::custom_punctuation_unexpected!($tt); 0 }};
+ }
+
+ // Not public API.
+@@ -297,13 +297,3 @@ macro_rules! stringify_punct {
+ concat!($(stringify!($tt)),+)
+ };
+ }
+-
+-// Not public API.
+-// Without this, local_inner_macros breaks when looking for concat!
+-#[doc(hidden)]
+-#[macro_export]
+-macro_rules! custom_punctuation_concat {
+- ($($tt:tt)*) => {
+- concat!($($tt)*)
+- };
+-}
+diff --git a/third_party/rust/syn/src/data.rs b/third_party/rust/syn/src/data.rs
+index be43679874..b217b8ca6f 100644
+--- mozilla-release/third_party/rust/syn/src/data.rs
++++ mozilla-release/third_party/rust/syn/src/data.rs
+@@ -4,7 +4,7 @@ use crate::punctuated::Punctuated;
+ ast_struct! {
+ /// An enum variant.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Variant {
+ /// Attributes tagged on the variant.
+@@ -24,7 +24,7 @@ ast_struct! {
+ ast_enum_of_structs! {
+ /// Data stored within an enum variant or struct.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Syntax tree enum
+@@ -52,7 +52,7 @@ ast_struct! {
+ /// Named fields of a struct or struct variant such as `Point { x: f64,
+ /// y: f64 }`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct FieldsNamed {
+ pub brace_token: token::Brace,
+@@ -63,7 +63,7 @@ ast_struct! {
+ ast_struct! {
+ /// Unnamed fields of a tuple struct or tuple variant such as `Some(T)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct FieldsUnnamed {
+ pub paren_token: token::Paren,
+@@ -93,6 +93,24 @@ impl Fields {
+ Fields::Unnamed(f) => f.unnamed.iter_mut(),
+ }
+ }
++
++ /// Returns the number of fields.
++ pub fn len(&self) -> usize {
++ match self {
++ Fields::Unit => 0,
++ Fields::Named(f) => f.named.len(),
++ Fields::Unnamed(f) => f.unnamed.len(),
++ }
++ }
++
++ /// Returns `true` if there are zero fields.
++ pub fn is_empty(&self) -> bool {
++ match self {
++ Fields::Unit => true,
++ Fields::Named(f) => f.named.is_empty(),
++ Fields::Unnamed(f) => f.unnamed.is_empty(),
++ }
++ }
+ }
+
+ impl IntoIterator for Fields {
+@@ -129,7 +147,7 @@ impl<'a> IntoIterator for &'a mut Fields {
+ ast_struct! {
+ /// A field of a struct or enum variant.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Field {
+ /// Attributes tagged on the field.
+@@ -154,7 +172,7 @@ ast_enum_of_structs! {
+ /// The visibility level of an item: inherited or `pub` or
+ /// `pub(restricted)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Syntax tree enum
+@@ -184,7 +202,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A public visibility level: `pub`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct VisPublic {
+ pub pub_token: Token![pub],
+@@ -194,7 +212,7 @@ ast_struct! {
+ ast_struct! {
+ /// A crate-level visibility: `crate`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct VisCrate {
+ pub crate_token: Token![crate],
+@@ -205,7 +223,7 @@ ast_struct! {
+ /// A visibility level restricted to some path: `pub(self)` or
+ /// `pub(super)` or `pub(crate)` or `pub(in some::module)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct VisRestricted {
+ pub pub_token: Token![pub],
+@@ -220,12 +238,15 @@ pub mod parsing {
+ use super::*;
+
+ use crate::ext::IdentExt;
++ use crate::parse::discouraged::Speculative;
+ use crate::parse::{Parse, ParseStream, Result};
+
+ impl Parse for Variant {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let attrs = input.call(Attribute::parse_outer)?;
++ let _visibility: Visibility = input.parse()?;
+ Ok(Variant {
+- attrs: input.call(Attribute::parse_outer)?,
++ attrs,
+ ident: input.parse()?,
+ fields: {
+ if input.peek(token::Brace) {
+@@ -295,6 +316,17 @@ pub mod parsing {
+
+ impl Parse for Visibility {
+ fn parse(input: ParseStream) -> Result<Self> {
++ // Recognize an empty None-delimited group, as produced by a $:vis
++ // matcher that matched no tokens.
++ if input.peek(token::Group) {
++ let ahead = input.fork();
++ let group = crate::group::parse_group(&ahead)?;
++ if group.content.is_empty() {
++ input.advance_to(&ahead);
++ return Ok(Visibility::Inherited);
++ }
++ }
++
+ if input.peek(Token![pub]) {
+ Self::parse_pub(input)
+ } else if input.peek(Token![crate]) {
+@@ -310,27 +342,39 @@ pub mod parsing {
+ let pub_token = input.parse::<Token![pub]>()?;
+
+ if input.peek(token::Paren) {
+- // TODO: optimize using advance_to
+ let ahead = input.fork();
+- let mut content;
+- parenthesized!(content in ahead);
+
++ let content;
++ let paren_token = parenthesized!(content in ahead);
+ if content.peek(Token![crate])
+ || content.peek(Token![self])
+ || content.peek(Token![super])
+ {
+- return Ok(Visibility::Restricted(VisRestricted {
+- pub_token,
+- paren_token: parenthesized!(content in input),
+- in_token: None,
+- path: Box::new(Path::from(content.call(Ident::parse_any)?)),
+- }));
++ let path = content.call(Ident::parse_any)?;
++
++ // Ensure there are no additional tokens within `content`.
++ // Without explicitly checking, we may misinterpret a tuple
++ // field as a restricted visibility, causing a parse error.
++ // e.g. `pub (crate::A, crate::B)` (Issue #720).
++ if content.is_empty() {
++ input.advance_to(&ahead);
++ return Ok(Visibility::Restricted(VisRestricted {
++ pub_token,
++ paren_token,
++ in_token: None,
++ path: Box::new(Path::from(path)),
++ }));
++ }
+ } else if content.peek(Token![in]) {
++ let in_token: Token![in] = content.parse()?;
++ let path = content.call(Path::parse_mod_style)?;
++
++ input.advance_to(&ahead);
+ return Ok(Visibility::Restricted(VisRestricted {
+ pub_token,
+- paren_token: parenthesized!(content in input),
+- in_token: Some(content.parse()?),
+- path: Box::new(content.call(Path::parse_mod_style)?),
++ paren_token,
++ in_token: Some(in_token),
++ path: Box::new(path),
+ }));
+ }
+ }
+@@ -347,6 +391,14 @@ pub mod parsing {
+ }))
+ }
+ }
++
++ #[cfg(feature = "full")]
++ pub(crate) fn is_some(&self) -> bool {
++ match self {
++ Visibility::Inherited => false,
++ _ => true,
++ }
++ }
+ }
+ }
+
+diff --git a/third_party/rust/syn/src/derive.rs b/third_party/rust/syn/src/derive.rs
+index 8cb9cf7b6d..3fa9d89a93 100644
+--- mozilla-release/third_party/rust/syn/src/derive.rs
++++ mozilla-release/third_party/rust/syn/src/derive.rs
+@@ -4,7 +4,7 @@ use crate::punctuated::Punctuated;
+ ast_struct! {
+ /// Data structure sent to a `proc_macro_derive` macro.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` feature.*
++ /// *This type is available only if Syn is built with the `"derive"` feature.*
+ pub struct DeriveInput {
+ /// Attributes tagged on the whole struct or enum.
+ pub attrs: Vec<Attribute>,
+@@ -26,7 +26,7 @@ ast_struct! {
+ ast_enum_of_structs! {
+ /// The storage of a struct, enum or union data structure.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` feature.*
++ /// *This type is available only if Syn is built with the `"derive"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -53,7 +53,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A struct input to a `proc_macro_derive` macro.
+ ///
+- /// *This type is available if Syn is built with the `"derive"`
++ /// *This type is available only if Syn is built with the `"derive"`
+ /// feature.*
+ pub struct DataStruct {
+ pub struct_token: Token![struct],
+@@ -65,7 +65,7 @@ ast_struct! {
+ ast_struct! {
+ /// An enum input to a `proc_macro_derive` macro.
+ ///
+- /// *This type is available if Syn is built with the `"derive"`
++ /// *This type is available only if Syn is built with the `"derive"`
+ /// feature.*
+ pub struct DataEnum {
+ pub enum_token: Token![enum],
+@@ -77,7 +77,7 @@ ast_struct! {
+ ast_struct! {
+ /// An untagged union input to a `proc_macro_derive` macro.
+ ///
+- /// *This type is available if Syn is built with the `"derive"`
++ /// *This type is available only if Syn is built with the `"derive"`
+ /// feature.*
+ pub struct DataUnion {
+ pub union_token: Token![union],
+diff --git a/third_party/rust/syn/src/discouraged.rs b/third_party/rust/syn/src/discouraged.rs
+index 4d9ff93728..76c9fce6f8 100644
+--- mozilla-release/third_party/rust/syn/src/discouraged.rs
++++ mozilla-release/third_party/rust/syn/src/discouraged.rs
+@@ -16,7 +16,7 @@ pub trait Speculative {
+ /// syntax of the form `A* B*` for arbitrary syntax `A` and `B`. The problem
+ /// is that when the fork fails to parse an `A`, it's impossible to tell
+ /// whether that was because of a syntax error and the user meant to provide
+- /// an `A`, or that the `A`s are finished and its time to start parsing
++ /// an `A`, or that the `A`s are finished and it's time to start parsing
+ /// `B`s. Use with care.
+ ///
+ /// Also note that if `A` is a subset of `B`, `A* B*` can be parsed by
+@@ -72,7 +72,6 @@ pub trait Speculative {
+ /// || input.peek(Token![self])
+ /// || input.peek(Token![Self])
+ /// || input.peek(Token![crate])
+- /// || input.peek(Token![extern])
+ /// {
+ /// let ident = input.call(Ident::parse_any)?;
+ /// return Ok(PathSegment::from(ident));
+@@ -164,6 +163,30 @@ impl<'a> Speculative for ParseBuffer<'a> {
+ panic!("Fork was not derived from the advancing parse stream");
+ }
+
++ let (self_unexp, self_sp) = inner_unexpected(self);
++ let (fork_unexp, fork_sp) = inner_unexpected(fork);
++ if !Rc::ptr_eq(&self_unexp, &fork_unexp) {
++ match (fork_sp, self_sp) {
++ // Unexpected set on the fork, but not on `self`, copy it over.
++ (Some(span), None) => {
++ self_unexp.set(Unexpected::Some(span));
++ }
++ // Unexpected unset. Use chain to propagate errors from fork.
++ (None, None) => {
++ fork_unexp.set(Unexpected::Chain(self_unexp));
++
++ // Ensure toplevel 'unexpected' tokens from the fork don't
++ // bubble up the chain by replacing the root `unexpected`
++ // pointer, only 'unexpected' tokens from existing group
++ // parsers should bubble.
++ fork.unexpected
++ .set(Some(Rc::new(Cell::new(Unexpected::None))));
++ }
++ // Unexpected has been set on `self`. No changes needed.
++ (_, Some(_)) => {}
++ }
++ }
++
+ // See comment on `cell` in the struct definition.
+ self.cell
+ .set(unsafe { mem::transmute::<Cursor, Cursor<'static>>(fork.cursor()) })
+diff --git a/third_party/rust/syn/src/error.rs b/third_party/rust/syn/src/error.rs
+index 146d652299..dba34f9254 100644
+--- mozilla-release/third_party/rust/syn/src/error.rs
++++ mozilla-release/third_party/rust/syn/src/error.rs
+@@ -1,4 +1,3 @@
+-use std;
+ use std::fmt::{self, Debug, Display};
+ use std::iter::FromIterator;
+ use std::slice;
+@@ -32,8 +31,8 @@ pub type Result<T> = std::result::Result<T, Error>;
+ /// conversion to `compile_error!` automatically.
+ ///
+ /// ```
+-/// extern crate proc_macro;
+-///
++/// # extern crate proc_macro;
++/// #
+ /// use proc_macro::TokenStream;
+ /// use syn::{parse_macro_input, AttributeArgs, ItemFn};
+ ///
+@@ -82,7 +81,6 @@ pub type Result<T> = std::result::Result<T, Error>;
+ /// # }
+ /// # }
+ /// ```
+-#[derive(Clone)]
+ pub struct Error {
+ messages: Vec<ErrorMessage>,
+ }
+@@ -250,6 +248,17 @@ pub fn new_at<T: Display>(scope: Span, cursor: Cursor, message: T) -> Error {
+ }
+ }
+
++#[cfg(all(feature = "parsing", any(feature = "full", feature = "derive")))]
++pub fn new2<T: Display>(start: Span, end: Span, message: T) -> Error {
++ Error {
++ messages: vec![ErrorMessage {
++ start_span: ThreadBound::new(start),
++ end_span: ThreadBound::new(end),
++ message: message.to_string(),
++ }],
++ }
++}
++
+ impl Debug for Error {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ if self.messages.len() == 1 {
+@@ -278,6 +287,14 @@ impl Display for Error {
+ }
+ }
+
++impl Clone for Error {
++ fn clone(&self) -> Self {
++ Error {
++ messages: self.messages.clone(),
++ }
++ }
++}
++
+ impl Clone for ErrorMessage {
+ fn clone(&self) -> Self {
+ let start = self
+@@ -355,3 +372,11 @@ impl<'a> Iterator for Iter<'a> {
+ })
+ }
+ }
++
++impl Extend<Error> for Error {
++ fn extend<T: IntoIterator<Item = Error>>(&mut self, iter: T) {
++ for err in iter {
++ self.combine(err);
++ }
++ }
++}
+diff --git a/third_party/rust/syn/src/expr.rs b/third_party/rust/syn/src/expr.rs
+index 2874a463aa..2fe0e0b5d8 100644
+--- mozilla-release/third_party/rust/syn/src/expr.rs
++++ mozilla-release/third_party/rust/syn/src/expr.rs
+@@ -1,18 +1,21 @@
+ use super::*;
+ use crate::punctuated::Punctuated;
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
++#[cfg(feature = "full")]
++use crate::reserved::Reserved;
+ use proc_macro2::{Span, TokenStream};
+-#[cfg(feature = "extra-traits")]
++#[cfg(feature = "printing")]
++use quote::IdentFragment;
++#[cfg(feature = "printing")]
++use std::fmt::{self, Display};
+ use std::hash::{Hash, Hasher};
+-#[cfg(all(feature = "parsing", feature = "full"))]
++#[cfg(feature = "parsing")]
+ use std::mem;
+
+ ast_enum_of_structs! {
+ /// A Rust expression.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
+- /// feature.*
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
++ /// feature, but most of the variants are not available unless "full" is enabled.*
+ ///
+ /// # Syntax tree enums
+ ///
+@@ -83,7 +86,7 @@ ast_enum_of_structs! {
+ /// A sign that you may not be choosing the right variable names is if you
+ /// see names getting repeated in your code, like accessing
+ /// `receiver.receiver` or `pat.pat` or `cond.cond`.
+- pub enum Expr #manual_extra_traits {
++ pub enum Expr {
+ /// A slice literal expression: `[a, b, c, d]`.
+ Array(ExprArray),
+
+@@ -228,7 +231,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A slice literal expression: `[a, b, c, d]`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprArray #full {
+ pub attrs: Vec<Attribute>,
+ pub bracket_token: token::Bracket,
+@@ -239,7 +242,7 @@ ast_struct! {
+ ast_struct! {
+ /// An assignment expression: `a = compute()`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprAssign #full {
+ pub attrs: Vec<Attribute>,
+ pub left: Box<Expr>,
+@@ -251,7 +254,7 @@ ast_struct! {
+ ast_struct! {
+ /// A compound assignment expression: `counter += 1`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprAssignOp #full {
+ pub attrs: Vec<Attribute>,
+ pub left: Box<Expr>,
+@@ -263,7 +266,7 @@ ast_struct! {
+ ast_struct! {
+ /// An async block: `async { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprAsync #full {
+ pub attrs: Vec<Attribute>,
+ pub async_token: Token![async],
+@@ -275,7 +278,7 @@ ast_struct! {
+ ast_struct! {
+ /// An await expression: `fut.await`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprAwait #full {
+ pub attrs: Vec<Attribute>,
+ pub base: Box<Expr>,
+@@ -287,7 +290,7 @@ ast_struct! {
+ ast_struct! {
+ /// A binary operation: `a + b`, `a * b`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprBinary {
+ pub attrs: Vec<Attribute>,
+@@ -300,7 +303,7 @@ ast_struct! {
+ ast_struct! {
+ /// A blocked scope: `{ ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprBlock #full {
+ pub attrs: Vec<Attribute>,
+ pub label: Option<Label>,
+@@ -311,7 +314,7 @@ ast_struct! {
+ ast_struct! {
+ /// A box expression: `box f`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprBox #full {
+ pub attrs: Vec<Attribute>,
+ pub box_token: Token![box],
+@@ -323,7 +326,7 @@ ast_struct! {
+ /// A `break`, with an optional label to break and an optional
+ /// expression.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprBreak #full {
+ pub attrs: Vec<Attribute>,
+ pub break_token: Token![break],
+@@ -335,7 +338,7 @@ ast_struct! {
+ ast_struct! {
+ /// A function call expression: `invoke(a, b)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprCall {
+ pub attrs: Vec<Attribute>,
+@@ -348,7 +351,7 @@ ast_struct! {
+ ast_struct! {
+ /// A cast expression: `foo as f64`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprCast {
+ pub attrs: Vec<Attribute>,
+@@ -361,7 +364,7 @@ ast_struct! {
+ ast_struct! {
+ /// A closure expression: `|a, b| a + b`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprClosure #full {
+ pub attrs: Vec<Attribute>,
+ pub asyncness: Option<Token![async]>,
+@@ -378,7 +381,7 @@ ast_struct! {
+ ast_struct! {
+ /// A `continue`, with an optional label.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprContinue #full {
+ pub attrs: Vec<Attribute>,
+ pub continue_token: Token![continue],
+@@ -390,7 +393,7 @@ ast_struct! {
+ /// Access of a named struct field (`obj.k`) or unnamed tuple struct
+ /// field (`obj.0`).
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprField {
+ pub attrs: Vec<Attribute>,
+ pub base: Box<Expr>,
+@@ -402,7 +405,7 @@ ast_struct! {
+ ast_struct! {
+ /// A for loop: `for pat in expr { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprForLoop #full {
+ pub attrs: Vec<Attribute>,
+ pub label: Option<Label>,
+@@ -421,7 +424,7 @@ ast_struct! {
+ /// of expressions and is related to `None`-delimited spans in a
+ /// `TokenStream`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprGroup #full {
+ pub attrs: Vec<Attribute>,
+ pub group_token: token::Group,
+@@ -436,7 +439,7 @@ ast_struct! {
+ /// The `else` branch expression may only be an `If` or `Block`
+ /// expression, not any of the other types of expression.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprIf #full {
+ pub attrs: Vec<Attribute>,
+ pub if_token: Token![if],
+@@ -449,7 +452,7 @@ ast_struct! {
+ ast_struct! {
+ /// A square bracketed indexing expression: `vector[2]`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprIndex {
+ pub attrs: Vec<Attribute>,
+@@ -462,7 +465,7 @@ ast_struct! {
+ ast_struct! {
+ /// A `let` guard: `let Some(x) = opt`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprLet #full {
+ pub attrs: Vec<Attribute>,
+ pub let_token: Token![let],
+@@ -475,7 +478,7 @@ ast_struct! {
+ ast_struct! {
+ /// A literal in place of an expression: `1`, `"foo"`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprLit {
+ pub attrs: Vec<Attribute>,
+@@ -486,7 +489,7 @@ ast_struct! {
+ ast_struct! {
+ /// Conditionless loop: `loop { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprLoop #full {
+ pub attrs: Vec<Attribute>,
+ pub label: Option<Label>,
+@@ -498,7 +501,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro invocation expression: `format!("{}", q)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprMacro #full {
+ pub attrs: Vec<Attribute>,
+ pub mac: Macro,
+@@ -508,7 +511,7 @@ ast_struct! {
+ ast_struct! {
+ /// A `match` expression: `match n { Some(n) => {}, None => {} }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprMatch #full {
+ pub attrs: Vec<Attribute>,
+ pub match_token: Token![match],
+@@ -521,7 +524,7 @@ ast_struct! {
+ ast_struct! {
+ /// A method call expression: `x.foo::<T>(a, b)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprMethodCall #full {
+ pub attrs: Vec<Attribute>,
+ pub receiver: Box<Expr>,
+@@ -536,7 +539,7 @@ ast_struct! {
+ ast_struct! {
+ /// A parenthesized expression: `(a + b)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprParen {
+ pub attrs: Vec<Attribute>,
+ pub paren_token: token::Paren,
+@@ -550,7 +553,7 @@ ast_struct! {
+ ///
+ /// A plain identifier like `x` is a path of length 1.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprPath {
+ pub attrs: Vec<Attribute>,
+@@ -562,7 +565,7 @@ ast_struct! {
+ ast_struct! {
+ /// A range expression: `1..2`, `1..`, `..2`, `1..=2`, `..=2`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprRange #full {
+ pub attrs: Vec<Attribute>,
+ pub from: Option<Box<Expr>>,
+@@ -574,7 +577,7 @@ ast_struct! {
+ ast_struct! {
+ /// A referencing operation: `&a` or `&mut a`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprReference #full {
+ pub attrs: Vec<Attribute>,
+ pub and_token: Token![&],
+@@ -587,7 +590,7 @@ ast_struct! {
+ ast_struct! {
+ /// An array literal constructed from one repeated element: `[0u8; N]`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprRepeat #full {
+ pub attrs: Vec<Attribute>,
+ pub bracket_token: token::Bracket,
+@@ -600,7 +603,7 @@ ast_struct! {
+ ast_struct! {
+ /// A `return`, with an optional value to be returned.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprReturn #full {
+ pub attrs: Vec<Attribute>,
+ pub return_token: Token![return],
+@@ -614,7 +617,7 @@ ast_struct! {
+ /// The `rest` provides the value of the remaining fields as in `S { a:
+ /// 1, b: 1, ..rest }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprStruct #full {
+ pub attrs: Vec<Attribute>,
+ pub path: Path,
+@@ -628,7 +631,7 @@ ast_struct! {
+ ast_struct! {
+ /// A try-expression: `expr?`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprTry #full {
+ pub attrs: Vec<Attribute>,
+ pub expr: Box<Expr>,
+@@ -639,7 +642,7 @@ ast_struct! {
+ ast_struct! {
+ /// A try block: `try { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprTryBlock #full {
+ pub attrs: Vec<Attribute>,
+ pub try_token: Token![try],
+@@ -650,7 +653,7 @@ ast_struct! {
+ ast_struct! {
+ /// A tuple expression: `(a, b, c, d)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprTuple #full {
+ pub attrs: Vec<Attribute>,
+ pub paren_token: token::Paren,
+@@ -661,7 +664,7 @@ ast_struct! {
+ ast_struct! {
+ /// A type ascription expression: `foo: f64`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprType #full {
+ pub attrs: Vec<Attribute>,
+ pub expr: Box<Expr>,
+@@ -673,7 +676,7 @@ ast_struct! {
+ ast_struct! {
+ /// A unary operation: `!x`, `*x`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ExprUnary {
+ pub attrs: Vec<Attribute>,
+@@ -685,7 +688,7 @@ ast_struct! {
+ ast_struct! {
+ /// An unsafe block: `unsafe { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprUnsafe #full {
+ pub attrs: Vec<Attribute>,
+ pub unsafe_token: Token![unsafe],
+@@ -696,7 +699,7 @@ ast_struct! {
+ ast_struct! {
+ /// A while loop: `while expr { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprWhile #full {
+ pub attrs: Vec<Attribute>,
+ pub label: Option<Label>,
+@@ -709,7 +712,7 @@ ast_struct! {
+ ast_struct! {
+ /// A yield expression: `yield expr`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ExprYield #full {
+ pub attrs: Vec<Attribute>,
+ pub yield_token: Token![yield],
+@@ -717,232 +720,6 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Expr {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Expr {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (Expr::Array(this), Expr::Array(other)) => this == other,
+- (Expr::Assign(this), Expr::Assign(other)) => this == other,
+- (Expr::AssignOp(this), Expr::AssignOp(other)) => this == other,
+- (Expr::Async(this), Expr::Async(other)) => this == other,
+- (Expr::Await(this), Expr::Await(other)) => this == other,
+- (Expr::Binary(this), Expr::Binary(other)) => this == other,
+- (Expr::Block(this), Expr::Block(other)) => this == other,
+- (Expr::Box(this), Expr::Box(other)) => this == other,
+- (Expr::Break(this), Expr::Break(other)) => this == other,
+- (Expr::Call(this), Expr::Call(other)) => this == other,
+- (Expr::Cast(this), Expr::Cast(other)) => this == other,
+- (Expr::Closure(this), Expr::Closure(other)) => this == other,
+- (Expr::Continue(this), Expr::Continue(other)) => this == other,
+- (Expr::Field(this), Expr::Field(other)) => this == other,
+- (Expr::ForLoop(this), Expr::ForLoop(other)) => this == other,
+- (Expr::Group(this), Expr::Group(other)) => this == other,
+- (Expr::If(this), Expr::If(other)) => this == other,
+- (Expr::Index(this), Expr::Index(other)) => this == other,
+- (Expr::Let(this), Expr::Let(other)) => this == other,
+- (Expr::Lit(this), Expr::Lit(other)) => this == other,
+- (Expr::Loop(this), Expr::Loop(other)) => this == other,
+- (Expr::Macro(this), Expr::Macro(other)) => this == other,
+- (Expr::Match(this), Expr::Match(other)) => this == other,
+- (Expr::MethodCall(this), Expr::MethodCall(other)) => this == other,
+- (Expr::Paren(this), Expr::Paren(other)) => this == other,
+- (Expr::Path(this), Expr::Path(other)) => this == other,
+- (Expr::Range(this), Expr::Range(other)) => this == other,
+- (Expr::Reference(this), Expr::Reference(other)) => this == other,
+- (Expr::Repeat(this), Expr::Repeat(other)) => this == other,
+- (Expr::Return(this), Expr::Return(other)) => this == other,
+- (Expr::Struct(this), Expr::Struct(other)) => this == other,
+- (Expr::Try(this), Expr::Try(other)) => this == other,
+- (Expr::TryBlock(this), Expr::TryBlock(other)) => this == other,
+- (Expr::Tuple(this), Expr::Tuple(other)) => this == other,
+- (Expr::Type(this), Expr::Type(other)) => this == other,
+- (Expr::Unary(this), Expr::Unary(other)) => this == other,
+- (Expr::Unsafe(this), Expr::Unsafe(other)) => this == other,
+- (Expr::Verbatim(this), Expr::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- (Expr::While(this), Expr::While(other)) => this == other,
+- (Expr::Yield(this), Expr::Yield(other)) => this == other,
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Expr {
+- fn hash<H>(&self, hash: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- Expr::Array(expr) => {
+- hash.write_u8(0);
+- expr.hash(hash);
+- }
+- Expr::Assign(expr) => {
+- hash.write_u8(1);
+- expr.hash(hash);
+- }
+- Expr::AssignOp(expr) => {
+- hash.write_u8(2);
+- expr.hash(hash);
+- }
+- Expr::Async(expr) => {
+- hash.write_u8(3);
+- expr.hash(hash);
+- }
+- Expr::Await(expr) => {
+- hash.write_u8(4);
+- expr.hash(hash);
+- }
+- Expr::Binary(expr) => {
+- hash.write_u8(5);
+- expr.hash(hash);
+- }
+- Expr::Block(expr) => {
+- hash.write_u8(6);
+- expr.hash(hash);
+- }
+- Expr::Box(expr) => {
+- hash.write_u8(7);
+- expr.hash(hash);
+- }
+- Expr::Break(expr) => {
+- hash.write_u8(8);
+- expr.hash(hash);
+- }
+- Expr::Call(expr) => {
+- hash.write_u8(9);
+- expr.hash(hash);
+- }
+- Expr::Cast(expr) => {
+- hash.write_u8(10);
+- expr.hash(hash);
+- }
+- Expr::Closure(expr) => {
+- hash.write_u8(11);
+- expr.hash(hash);
+- }
+- Expr::Continue(expr) => {
+- hash.write_u8(12);
+- expr.hash(hash);
+- }
+- Expr::Field(expr) => {
+- hash.write_u8(13);
+- expr.hash(hash);
+- }
+- Expr::ForLoop(expr) => {
+- hash.write_u8(14);
+- expr.hash(hash);
+- }
+- Expr::Group(expr) => {
+- hash.write_u8(15);
+- expr.hash(hash);
+- }
+- Expr::If(expr) => {
+- hash.write_u8(16);
+- expr.hash(hash);
+- }
+- Expr::Index(expr) => {
+- hash.write_u8(17);
+- expr.hash(hash);
+- }
+- Expr::Let(expr) => {
+- hash.write_u8(18);
+- expr.hash(hash);
+- }
+- Expr::Lit(expr) => {
+- hash.write_u8(19);
+- expr.hash(hash);
+- }
+- Expr::Loop(expr) => {
+- hash.write_u8(20);
+- expr.hash(hash);
+- }
+- Expr::Macro(expr) => {
+- hash.write_u8(21);
+- expr.hash(hash);
+- }
+- Expr::Match(expr) => {
+- hash.write_u8(22);
+- expr.hash(hash);
+- }
+- Expr::MethodCall(expr) => {
+- hash.write_u8(23);
+- expr.hash(hash);
+- }
+- Expr::Paren(expr) => {
+- hash.write_u8(24);
+- expr.hash(hash);
+- }
+- Expr::Path(expr) => {
+- hash.write_u8(25);
+- expr.hash(hash);
+- }
+- Expr::Range(expr) => {
+- hash.write_u8(26);
+- expr.hash(hash);
+- }
+- Expr::Reference(expr) => {
+- hash.write_u8(27);
+- expr.hash(hash);
+- }
+- Expr::Repeat(expr) => {
+- hash.write_u8(28);
+- expr.hash(hash);
+- }
+- Expr::Return(expr) => {
+- hash.write_u8(29);
+- expr.hash(hash);
+- }
+- Expr::Struct(expr) => {
+- hash.write_u8(30);
+- expr.hash(hash);
+- }
+- Expr::Try(expr) => {
+- hash.write_u8(31);
+- expr.hash(hash);
+- }
+- Expr::TryBlock(expr) => {
+- hash.write_u8(32);
+- expr.hash(hash);
+- }
+- Expr::Tuple(expr) => {
+- hash.write_u8(33);
+- expr.hash(hash);
+- }
+- Expr::Type(expr) => {
+- hash.write_u8(34);
+- expr.hash(hash);
+- }
+- Expr::Unary(expr) => {
+- hash.write_u8(35);
+- expr.hash(hash);
+- }
+- Expr::Unsafe(expr) => {
+- hash.write_u8(36);
+- expr.hash(hash);
+- }
+- Expr::Verbatim(expr) => {
+- hash.write_u8(37);
+- TokenStreamHelper(expr).hash(hash);
+- }
+- Expr::While(expr) => {
+- hash.write_u8(38);
+- expr.hash(hash);
+- }
+- Expr::Yield(expr) => {
+- hash.write_u8(39);
+- expr.hash(hash);
+- }
+- Expr::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ impl Expr {
+ #[cfg(all(feature = "parsing", feature = "full"))]
+ pub(crate) fn replace_attrs(&mut self, new: Vec<Attribute>) -> Vec<Attribute> {
+@@ -996,7 +773,7 @@ ast_enum! {
+ /// A struct or tuple struct field accessed in a struct literal or field
+ /// expression.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum Member {
+ /// A named field like `self.x`.
+@@ -1006,12 +783,50 @@ ast_enum! {
+ }
+ }
+
++impl Eq for Member {}
++
++impl PartialEq for Member {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Member::Named(this), Member::Named(other)) => this == other,
++ (Member::Unnamed(this), Member::Unnamed(other)) => this == other,
++ _ => false,
++ }
++ }
++}
++
++impl Hash for Member {
++ fn hash<H: Hasher>(&self, state: &mut H) {
++ match self {
++ Member::Named(m) => m.hash(state),
++ Member::Unnamed(m) => m.hash(state),
++ }
++ }
++}
++
++#[cfg(feature = "printing")]
++impl IdentFragment for Member {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Member::Named(m) => Display::fmt(m, formatter),
++ Member::Unnamed(m) => Display::fmt(&m.index, formatter),
++ }
++ }
++
++ fn span(&self) -> Option<Span> {
++ match self {
++ Member::Named(m) => Some(m.span()),
++ Member::Unnamed(m) => Some(m.span),
++ }
++ }
++}
++
+ ast_struct! {
+ /// The index of an unnamed tuple struct field.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- pub struct Index #manual_extra_traits {
++ pub struct Index {
+ pub index: u32,
+ pub span: Span,
+ }
+@@ -1027,28 +842,28 @@ impl From<usize> for Index {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+ impl Eq for Index {}
+
+-#[cfg(feature = "extra-traits")]
+ impl PartialEq for Index {
+ fn eq(&self, other: &Self) -> bool {
+ self.index == other.index
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+ impl Hash for Index {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.index.hash(state);
+ }
+ }
+
+-#[cfg(feature = "full")]
+-ast_struct! {
+- #[derive(Default)]
+- pub struct Reserved {
+- private: (),
++#[cfg(feature = "printing")]
++impl IdentFragment for Index {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ Display::fmt(&self.index, formatter)
++ }
++
++ fn span(&self) -> Option<Span> {
++ Some(self.span)
+ }
+ }
+
+@@ -1057,7 +872,7 @@ ast_struct! {
+ /// The `::<>` explicit type parameters passed to a method call:
+ /// `parse::<u64>()`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct MethodTurbofish {
+ pub colon2_token: Token![::],
+ pub lt_token: Token![<],
+@@ -1070,7 +885,7 @@ ast_struct! {
+ ast_enum! {
+ /// An individual generic argument to a method, like `T`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub enum GenericMethodArgument {
+ /// A type argument.
+ Type(Type),
+@@ -1086,7 +901,7 @@ ast_enum! {
+ ast_struct! {
+ /// A field-value pair in a struct literal.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct FieldValue {
+ /// Attributes tagged on the field.
+ pub attrs: Vec<Attribute>,
+@@ -1107,7 +922,7 @@ ast_struct! {
+ ast_struct! {
+ /// A lifetime labeling a `for`, `while`, or `loop`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Label {
+ pub name: Lifetime,
+ pub colon_token: Token![:],
+@@ -1134,7 +949,7 @@ ast_struct! {
+ /// # }
+ /// ```
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Arm {
+ pub attrs: Vec<Attribute>,
+ pub pat: Pat,
+@@ -1149,8 +964,7 @@ ast_struct! {
+ ast_enum! {
+ /// Limit types of a range, inclusive or exclusive.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
+- #[cfg_attr(feature = "clone-impls", derive(Copy))]
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub enum RangeLimits {
+ /// Inclusive at the beginning, exclusive at the end.
+ HalfOpen(Token![..]),
+@@ -1162,7 +976,7 @@ ast_enum! {
+ #[cfg(any(feature = "parsing", feature = "printing"))]
+ #[cfg(feature = "full")]
+ pub(crate) fn requires_terminator(expr: &Expr) -> bool {
+- // see https://github.com/rust-lang/rust/blob/eb8f2586e/src/libsyntax/parse/classify.rs#L17-L37
++ // see https://github.com/rust-lang/rust/blob/2679c38fc/src/librustc_ast/util/classify.rs#L7-L25
+ match *expr {
+ Expr::Unsafe(..)
+ | Expr::Block(..)
+@@ -1183,16 +997,17 @@ pub(crate) mod parsing {
+
+ use crate::parse::{Parse, ParseStream, Result};
+ use crate::path;
++ use std::cmp::Ordering;
++
++ crate::custom_keyword!(raw);
+
+ // When we're parsing expressions which occur before blocks, like in an if
+ // statement's condition, we cannot parse a struct literal.
+ //
+ // Struct literals are ambiguous in certain positions
+ // https://github.com/rust-lang/rfcs/pull/92
+- #[derive(Copy, Clone)]
+ pub struct AllowStruct(bool);
+
+- #[derive(Copy, Clone, PartialEq, PartialOrd)]
+ enum Precedence {
+ Any,
+ Assign,
+@@ -1246,9 +1061,121 @@ pub(crate) mod parsing {
+ }
+ }
+
+- #[cfg(feature = "full")]
+- fn expr_no_struct(input: ParseStream) -> Result<Expr> {
+- ambiguous_expr(input, AllowStruct(false))
++ impl Expr {
++ /// An alternative to the primary `Expr::parse` parser (from the
++ /// [`Parse`] trait) for ambiguous syntactic positions in which a
++ /// trailing brace should not be taken as part of the expression.
++ ///
++ /// Rust grammar has an ambiguity where braces sometimes turn a path
++ /// expression into a struct initialization and sometimes do not. In the
++ /// following code, the expression `S {}` is one expression. Presumably
++ /// there is an empty struct `struct S {}` defined somewhere which it is
++ /// instantiating.
++ ///
++ /// ```
++ /// # struct S;
++ /// # impl std::ops::Deref for S {
++ /// # type Target = bool;
++ /// # fn deref(&self) -> &Self::Target {
++ /// # &true
++ /// # }
++ /// # }
++ /// let _ = *S {};
++ ///
++ /// // parsed by rustc as: `*(S {})`
++ /// ```
++ ///
++ /// We would want to parse the above using `Expr::parse` after the `=`
++ /// token.
++ ///
++ /// But in the following, `S {}` is *not* a struct init expression.
++ ///
++ /// ```
++ /// # const S: &bool = &true;
++ /// if *S {} {}
++ ///
++ /// // parsed by rustc as:
++ /// //
++ /// // if (*S) {
++ /// // /* empty block */
++ /// // }
++ /// // {
++ /// // /* another empty block */
++ /// // }
++ /// ```
++ ///
++ /// For that reason we would want to parse if-conditions using
++ /// `Expr::parse_without_eager_brace` after the `if` token. Same for
++ /// similar syntactic positions such as the condition expr after a
++ /// `while` token or the expr at the top of a `match`.
++ ///
++ /// The Rust grammar's choices around which way this ambiguity is
++ /// resolved at various syntactic positions is fairly arbitrary. Really
++ /// either parse behavior could work in most positions, and language
++ /// designers just decide each case based on which is more likely to be
++ /// what the programmer had in mind most of the time.
++ ///
++ /// ```
++ /// # struct S;
++ /// # fn doc() -> S {
++ /// if return S {} {}
++ /// # unreachable!()
++ /// # }
++ ///
++ /// // parsed by rustc as:
++ /// //
++ /// // if (return (S {})) {
++ /// // }
++ /// //
++ /// // but could equally well have been this other arbitrary choice:
++ /// //
++ /// // if (return S) {
++ /// // }
++ /// // {}
++ /// ```
++ ///
++ /// Note the grammar ambiguity on trailing braces is distinct from
++ /// precedence and is not captured by assigning a precedence level to
++ /// the braced struct init expr in relation to other operators. This can
++ /// be illustrated by `return 0..S {}` vs `match 0..S {}`. The former
++ /// parses as `return (0..(S {}))` implying tighter precedence for
++ /// struct init than `..`, while the latter parses as `match (0..S) {}`
++ /// implying tighter precedence for `..` than struct init, a
++ /// contradiction.
++ #[cfg(feature = "full")]
++ pub fn parse_without_eager_brace(input: ParseStream) -> Result<Expr> {
++ ambiguous_expr(input, AllowStruct(false))
++ }
++ }
++
++ impl Copy for AllowStruct {}
++
++ impl Clone for AllowStruct {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
++
++ impl Copy for Precedence {}
++
++ impl Clone for Precedence {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
++
++ impl PartialEq for Precedence {
++ fn eq(&self, other: &Self) -> bool {
++ *self as u8 == *other as u8
++ }
++ }
++
++ impl PartialOrd for Precedence {
++ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
++ let this = *self as u8;
++ let other = *other as u8;
++ Some(this.cmp(&other))
++ }
+ }
+
+ #[cfg(feature = "full")]
+@@ -1430,56 +1357,84 @@ pub(crate) mod parsing {
+ parse_expr(input, lhs, allow_struct, Precedence::Any)
+ }
+
++ #[cfg(feature = "full")]
++ fn expr_attrs(input: ParseStream) -> Result<Vec<Attribute>> {
++ let mut attrs = Vec::new();
++ loop {
++ if input.peek(token::Group) {
++ let ahead = input.fork();
++ let group = crate::group::parse_group(&ahead)?;
++ if !group.content.peek(Token![#]) || group.content.peek2(Token![!]) {
++ break;
++ }
++ let attr = group.content.call(attr::parsing::single_parse_outer)?;
++ if !group.content.is_empty() {
++ break;
++ }
++ attrs.push(attr);
++ } else if input.peek(Token![#]) {
++ attrs.push(input.call(attr::parsing::single_parse_outer)?);
++ } else {
++ break;
++ }
++ }
++ Ok(attrs)
++ }
++
+ // <UnOp> <trailer>
+ // & <trailer>
+ // &mut <trailer>
+ // box <trailer>
+ #[cfg(feature = "full")]
+ fn unary_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
+- // TODO: optimize using advance_to
+- let ahead = input.fork();
+- ahead.call(Attribute::parse_outer)?;
+- if ahead.peek(Token![&])
+- || ahead.peek(Token![box])
+- || ahead.peek(Token![*])
+- || ahead.peek(Token![!])
+- || ahead.peek(Token![-])
+- {
+- let attrs = input.call(Attribute::parse_outer)?;
+- if input.peek(Token![&]) {
++ let begin = input.fork();
++ let attrs = input.call(expr_attrs)?;
++ if input.peek(Token![&]) {
++ let and_token: Token![&] = input.parse()?;
++ let raw: Option<raw> =
++ if input.peek(raw) && (input.peek2(Token![mut]) || input.peek2(Token![const])) {
++ Some(input.parse()?)
++ } else {
++ None
++ };
++ let mutability: Option<Token![mut]> = input.parse()?;
++ if raw.is_some() && mutability.is_none() {
++ input.parse::<Token![const]>()?;
++ }
++ let expr = Box::new(unary_expr(input, allow_struct)?);
++ if raw.is_some() {
++ Ok(Expr::Verbatim(verbatim::between(begin, input)))
++ } else {
+ Ok(Expr::Reference(ExprReference {
+ attrs,
+- and_token: input.parse()?,
++ and_token,
+ raw: Reserved::default(),
+- mutability: input.parse()?,
+- expr: Box::new(unary_expr(input, allow_struct)?),
+- }))
+- } else if input.peek(Token![box]) {
+- Ok(Expr::Box(ExprBox {
+- attrs,
+- box_token: input.parse()?,
+- expr: Box::new(unary_expr(input, allow_struct)?),
+- }))
+- } else {
+- Ok(Expr::Unary(ExprUnary {
+- attrs,
+- op: input.parse()?,
+- expr: Box::new(unary_expr(input, allow_struct)?),
++ mutability,
++ expr,
+ }))
+ }
++ } else if input.peek(Token![box]) {
++ Ok(Expr::Box(ExprBox {
++ attrs,
++ box_token: input.parse()?,
++ expr: Box::new(unary_expr(input, allow_struct)?),
++ }))
++ } else if input.peek(Token![*]) || input.peek(Token![!]) || input.peek(Token![-]) {
++ Ok(Expr::Unary(ExprUnary {
++ attrs,
++ op: input.parse()?,
++ expr: Box::new(unary_expr(input, allow_struct)?),
++ }))
+ } else {
+- trailer_expr(input, allow_struct)
++ trailer_expr(attrs, input, allow_struct)
+ }
+ }
+
+ #[cfg(not(feature = "full"))]
+ fn unary_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
+- // TODO: optimize using advance_to
+- let ahead = input.fork();
+- ahead.call(Attribute::parse_outer)?;
+- if ahead.peek(Token![*]) || ahead.peek(Token![!]) || ahead.peek(Token![-]) {
++ if input.peek(Token![*]) || input.peek(Token![!]) || input.peek(Token![-]) {
+ Ok(Expr::Unary(ExprUnary {
+- attrs: input.call(Attribute::parse_outer)?,
++ attrs: Vec::new(),
+ op: input.parse()?,
+ expr: Box::new(unary_expr(input, allow_struct)?),
+ }))
+@@ -1495,13 +1450,11 @@ pub(crate) mod parsing {
+ // <atom> [ <expr> ] ...
+ // <atom> ? ...
+ #[cfg(feature = "full")]
+- fn trailer_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
+- if input.peek(token::Group) {
+- return input.call(expr_group).map(Expr::Group);
+- }
+-
+- let outer_attrs = input.call(Attribute::parse_outer)?;
+-
++ fn trailer_expr(
++ outer_attrs: Vec<Attribute>,
++ input: ParseStream,
++ allow_struct: AllowStruct,
++ ) -> Result<Expr> {
+ let atom = atom_expr(input, allow_struct)?;
+ let mut e = trailer_helper(input, atom)?;
+
+@@ -1523,18 +1476,26 @@ pub(crate) mod parsing {
+ args: content.parse_terminated(Expr::parse)?,
+ });
+ } else if input.peek(Token![.]) && !input.peek(Token![..]) {
+- let dot_token: Token![.] = input.parse()?;
++ let mut dot_token: Token![.] = input.parse()?;
+
+- if input.peek(token::Await) {
++ let await_token: Option<token::Await> = input.parse()?;
++ if let Some(await_token) = await_token {
+ e = Expr::Await(ExprAwait {
+ attrs: Vec::new(),
+ base: Box::new(e),
+ dot_token,
+- await_token: input.parse()?,
++ await_token,
+ });
+ continue;
+ }
+
++ let float_token: Option<LitFloat> = input.parse()?;
++ if let Some(float_token) = float_token {
++ if multi_index(&mut e, &mut dot_token, float_token)? {
++ continue;
++ }
++ }
++
+ let member: Member = input.parse()?;
+ let turbofish = if member.is_named() && input.peek(Token![::]) {
+ Some(MethodTurbofish {
+@@ -1620,10 +1581,17 @@ pub(crate) mod parsing {
+ });
+ } else if input.peek(Token![.]) && !input.peek(Token![..]) && !input.peek2(token::Await)
+ {
++ let mut dot_token: Token![.] = input.parse()?;
++ let float_token: Option<LitFloat> = input.parse()?;
++ if let Some(float_token) = float_token {
++ if multi_index(&mut e, &mut dot_token, float_token)? {
++ continue;
++ }
++ }
+ e = Expr::Field(ExprField {
+ attrs: Vec::new(),
+ base: Box::new(e),
+- dot_token: input.parse()?,
++ dot_token,
+ member: input.parse()?,
+ });
+ } else if input.peek(token::Bracket) {
+@@ -1646,7 +1614,11 @@ pub(crate) mod parsing {
+ // interactions, as they are fully contained.
+ #[cfg(feature = "full")]
+ fn atom_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
+- if input.peek(token::Group) {
++ if input.peek(token::Group)
++ && !input.peek2(Token![::])
++ && !input.peek2(Token![!])
++ && !input.peek2(token::Brace)
++ {
+ input.call(expr_group).map(Expr::Group)
+ } else if input.peek(Lit) {
+ input.parse().map(Expr::Lit)
+@@ -1668,7 +1640,6 @@ pub(crate) mod parsing {
+ || input.peek(Token![self])
+ || input.peek(Token![Self])
+ || input.peek(Token![super])
+- || input.peek(Token![extern])
+ || input.peek(Token![crate])
+ {
+ path_or_macro_or_struct(input, allow_struct)
+@@ -1740,7 +1711,6 @@ pub(crate) mod parsing {
+ || input.peek(Token![self])
+ || input.peek(Token![Self])
+ || input.peek(Token![super])
+- || input.peek(Token![extern])
+ || input.peek(Token![crate])
+ {
+ input.parse().map(Expr::Path)
+@@ -1878,7 +1848,7 @@ pub(crate) mod parsing {
+
+ #[cfg(feature = "full")]
+ pub(crate) fn expr_early(input: ParseStream) -> Result<Expr> {
+- let mut attrs = input.call(Attribute::parse_outer)?;
++ let mut attrs = input.call(expr_attrs)?;
+ let mut expr = if input.peek(Token![if]) {
+ Expr::If(input.parse()?)
+ } else if input.peek(Token![while]) {
+@@ -1905,7 +1875,7 @@ pub(crate) mod parsing {
+ return parse_expr(input, expr, allow_struct, Precedence::Any);
+ };
+
+- if input.peek(Token![.]) || input.peek(Token![?]) {
++ if input.peek(Token![.]) && !input.peek(Token![..]) || input.peek(Token![?]) {
+ expr = trailer_helper(input, expr)?;
+
+ attrs.extend(expr.replace_attrs(Vec::new()));
+@@ -1951,7 +1921,16 @@ pub(crate) mod parsing {
+
+ #[cfg(feature = "full")]
+ fn generic_method_argument(input: ParseStream) -> Result<GenericMethodArgument> {
+- // TODO parse const generics as well
++ if input.peek(Lit) {
++ let lit = input.parse()?;
++ return Ok(GenericMethodArgument::Const(Expr::Lit(lit)));
++ }
++
++ if input.peek(token::Brace) {
++ let block = input.call(expr::parsing::expr_block)?;
++ return Ok(GenericMethodArgument::Const(Expr::Block(block)));
++ }
++
+ input.parse().map(GenericMethodArgument::Type)
+ }
+
+@@ -1960,44 +1939,20 @@ pub(crate) mod parsing {
+ Ok(ExprLet {
+ attrs: Vec::new(),
+ let_token: input.parse()?,
+- pat: {
+- let leading_vert: Option<Token![|]> = input.parse()?;
+- let pat: Pat = input.parse()?;
+- if leading_vert.is_some()
+- || input.peek(Token![|]) && !input.peek(Token![||]) && !input.peek(Token![|=])
+- {
+- let mut cases = Punctuated::new();
+- cases.push_value(pat);
+- while input.peek(Token![|])
+- && !input.peek(Token![||])
+- && !input.peek(Token![|=])
+- {
+- let punct = input.parse()?;
+- cases.push_punct(punct);
+- let pat: Pat = input.parse()?;
+- cases.push_value(pat);
+- }
+- Pat::Or(PatOr {
+- attrs: Vec::new(),
+- leading_vert,
+- cases,
+- })
+- } else {
+- pat
+- }
+- },
++ pat: pat::parsing::multi_pat_with_leading_vert(input)?,
+ eq_token: input.parse()?,
+- expr: Box::new(input.call(expr_no_struct)?),
++ expr: Box::new(input.call(Expr::parse_without_eager_brace)?),
+ })
+ }
+
+ #[cfg(feature = "full")]
+ impl Parse for ExprIf {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let attrs = input.call(Attribute::parse_outer)?;
+ Ok(ExprIf {
+- attrs: Vec::new(),
++ attrs,
+ if_token: input.parse()?,
+- cond: Box::new(input.call(expr_no_struct)?),
++ cond: Box::new(input.call(Expr::parse_without_eager_brace)?),
+ then_branch: input.parse()?,
+ else_branch: {
+ if input.peek(Token![else]) {
+@@ -2033,29 +1988,14 @@ pub(crate) mod parsing {
+ #[cfg(feature = "full")]
+ impl Parse for ExprForLoop {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
+ let label: Option<Label> = input.parse()?;
+ let for_token: Token![for] = input.parse()?;
+
+- let leading_vert: Option<Token![|]> = input.parse()?;
+- let mut pat: Pat = input.parse()?;
+- if leading_vert.is_some() || input.peek(Token![|]) {
+- let mut cases = Punctuated::new();
+- cases.push_value(pat);
+- while input.peek(Token![|]) {
+- let punct = input.parse()?;
+- cases.push_punct(punct);
+- let pat: Pat = input.parse()?;
+- cases.push_value(pat);
+- }
+- pat = Pat::Or(PatOr {
+- attrs: Vec::new(),
+- leading_vert,
+- cases,
+- });
+- }
++ let pat = pat::parsing::multi_pat_with_leading_vert(input)?;
+
+ let in_token: Token![in] = input.parse()?;
+- let expr: Expr = input.call(expr_no_struct)?;
++ let expr: Expr = input.call(Expr::parse_without_eager_brace)?;
+
+ let content;
+ let brace_token = braced!(content in input);
+@@ -2063,7 +2003,7 @@ pub(crate) mod parsing {
+ let stmts = content.call(Block::parse_within)?;
+
+ Ok(ExprForLoop {
+- attrs: inner_attrs,
++ attrs: private::attrs(outer_attrs, inner_attrs),
+ label,
+ for_token,
+ pat,
+@@ -2077,6 +2017,7 @@ pub(crate) mod parsing {
+ #[cfg(feature = "full")]
+ impl Parse for ExprLoop {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
+ let label: Option<Label> = input.parse()?;
+ let loop_token: Token![loop] = input.parse()?;
+
+@@ -2086,7 +2027,7 @@ pub(crate) mod parsing {
+ let stmts = content.call(Block::parse_within)?;
+
+ Ok(ExprLoop {
+- attrs: inner_attrs,
++ attrs: private::attrs(outer_attrs, inner_attrs),
+ label,
+ loop_token,
+ body: Block { brace_token, stmts },
+@@ -2097,8 +2038,9 @@ pub(crate) mod parsing {
+ #[cfg(feature = "full")]
+ impl Parse for ExprMatch {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
+ let match_token: Token![match] = input.parse()?;
+- let expr = expr_no_struct(input)?;
++ let expr = Expr::parse_without_eager_brace(input)?;
+
+ let content;
+ let brace_token = braced!(content in input);
+@@ -2110,7 +2052,7 @@ pub(crate) mod parsing {
+ }
+
+ Ok(ExprMatch {
+- attrs: inner_attrs,
++ attrs: private::attrs(outer_attrs, inner_attrs),
+ match_token,
+ expr: Box::new(expr),
+ brace_token,
+@@ -2305,9 +2247,10 @@ pub(crate) mod parsing {
+ #[cfg(feature = "full")]
+ impl Parse for ExprWhile {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
+ let label: Option<Label> = input.parse()?;
+ let while_token: Token![while] = input.parse()?;
+- let cond = expr_no_struct(input)?;
++ let cond = Expr::parse_without_eager_brace(input)?;
+
+ let content;
+ let brace_token = braced!(content in input);
+@@ -2315,7 +2258,7 @@ pub(crate) mod parsing {
+ let stmts = content.call(Block::parse_within)?;
+
+ Ok(ExprWhile {
+- attrs: inner_attrs,
++ attrs: private::attrs(outer_attrs, inner_attrs),
+ label,
+ while_token,
+ cond: Box::new(cond),
+@@ -2399,6 +2342,7 @@ pub(crate) mod parsing {
+ #[cfg(feature = "full")]
+ impl Parse for FieldValue {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let attrs = input.call(Attribute::parse_outer)?;
+ let member: Member = input.parse()?;
+ let (colon_token, value) = if input.peek(Token![:]) || !member.is_named() {
+ let colon_token: Token![:] = input.parse()?;
+@@ -2416,7 +2360,7 @@ pub(crate) mod parsing {
+ };
+
+ Ok(FieldValue {
+- attrs: Vec::new(),
++ attrs,
+ member,
+ colon_token,
+ expr: value,
+@@ -2433,46 +2377,36 @@ pub(crate) mod parsing {
+ let content;
+ let brace_token = braced!(content in input);
+ let inner_attrs = content.call(Attribute::parse_inner)?;
++ let attrs = private::attrs(outer_attrs, inner_attrs);
+
+ let mut fields = Punctuated::new();
+- loop {
+- let attrs = content.call(Attribute::parse_outer)?;
+- // TODO: optimize using advance_to
+- if content.fork().parse::<Member>().is_err() {
+- if attrs.is_empty() {
+- break;
+- } else {
+- return Err(content.error("expected struct field"));
+- }
++ while !content.is_empty() {
++ if content.peek(Token![..]) {
++ return Ok(ExprStruct {
++ attrs,
++ brace_token,
++ path,
++ fields,
++ dot2_token: Some(content.parse()?),
++ rest: Some(Box::new(content.parse()?)),
++ });
+ }
+
+- fields.push(FieldValue {
+- attrs,
+- ..content.parse()?
+- });
+-
+- if !content.peek(Token![,]) {
++ fields.push(content.parse()?);
++ if content.is_empty() {
+ break;
+ }
+ let punct: Token![,] = content.parse()?;
+ fields.push_punct(punct);
+ }
+
+- let (dot2_token, rest) = if fields.empty_or_trailing() && content.peek(Token![..]) {
+- let dot2_token: Token![..] = content.parse()?;
+- let rest: Expr = content.parse()?;
+- (Some(dot2_token), Some(Box::new(rest)))
+- } else {
+- (None, None)
+- };
+-
+ Ok(ExprStruct {
+- attrs: private::attrs(outer_attrs, inner_attrs),
++ attrs,
+ brace_token,
+ path,
+ fields,
+- dot2_token,
+- rest,
++ dot2_token: None,
++ rest: None,
+ })
+ }
+
+@@ -2577,27 +2511,7 @@ pub(crate) mod parsing {
+ let requires_comma;
+ Ok(Arm {
+ attrs: input.call(Attribute::parse_outer)?,
+- pat: {
+- let leading_vert: Option<Token![|]> = input.parse()?;
+- let pat: Pat = input.parse()?;
+- if leading_vert.is_some() || input.peek(Token![|]) {
+- let mut cases = Punctuated::new();
+- cases.push_value(pat);
+- while input.peek(Token![|]) {
+- let punct = input.parse()?;
+- cases.push_punct(punct);
+- let pat: Pat = input.parse()?;
+- cases.push_value(pat);
+- }
+- Pat::Or(PatOr {
+- attrs: Vec::new(),
+- leading_vert,
+- cases,
+- })
+- } else {
+- pat
+- }
+- },
++ pat: pat::parsing::multi_pat_with_leading_vert(input)?,
+ guard: {
+ if input.peek(Token![if]) {
+ let if_token: Token![if] = input.parse()?;
+@@ -2641,6 +2555,26 @@ pub(crate) mod parsing {
+ }
+ }
+
++ fn multi_index(e: &mut Expr, dot_token: &mut Token![.], float: LitFloat) -> Result<bool> {
++ let mut float_repr = float.to_string();
++ let trailing_dot = float_repr.ends_with('.');
++ if trailing_dot {
++ float_repr.truncate(float_repr.len() - 1);
++ }
++ for part in float_repr.split('.') {
++ let index = crate::parse_str(part).map_err(|err| Error::new(float.span(), err))?;
++ let base = mem::replace(e, Expr::__Nonexhaustive);
++ *e = Expr::Field(ExprField {
++ attrs: Vec::new(),
++ base: Box::new(base),
++ dot_token: Token![.](dot_token.span),
++ member: Member::Unnamed(index),
++ });
++ *dot_token = Token![.](float.span());
++ }
++ Ok(!trailing_dot)
++ }
++
+ #[cfg(feature = "full")]
+ impl Member {
+ fn is_named(&self) -> bool {
+diff --git a/third_party/rust/syn/src/ext.rs b/third_party/rust/syn/src/ext.rs
+index d09577a27a..4f9bc145d9 100644
+--- mozilla-release/third_party/rust/syn/src/ext.rs
++++ mozilla-release/third_party/rust/syn/src/ext.rs
+@@ -1,6 +1,6 @@
+ //! Extension traits to provide parsing methods on foreign types.
+ //!
+-//! *This module is available if Syn is built with the `"parsing"` feature.*
++//! *This module is available only if Syn is built with the `"parsing"` feature.*
+
+ use proc_macro2::Ident;
+
+@@ -16,7 +16,7 @@ use crate::token::CustomToken;
+ /// This trait is sealed and cannot be implemented for types outside of Syn. It
+ /// is implemented only for `proc_macro2::Ident`.
+ ///
+-/// *This trait is available if Syn is built with the `"parsing"` feature.*
++/// *This trait is available only if Syn is built with the `"parsing"` feature.*
+ pub trait IdentExt: Sized + private::Sealed {
+ /// Parses any identifier including keywords.
+ ///
+@@ -129,7 +129,13 @@ mod private {
+
+ impl Sealed for Ident {}
+
+- #[derive(Copy, Clone)]
+ pub struct PeekFn;
+ pub struct IdentAny;
++
++ impl Copy for PeekFn {}
++ impl Clone for PeekFn {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
+ }
+diff --git a/third_party/rust/syn/src/file.rs b/third_party/rust/syn/src/file.rs
+index 88c02fe832..c8fab63cd9 100644
+--- mozilla-release/third_party/rust/syn/src/file.rs
++++ mozilla-release/third_party/rust/syn/src/file.rs
+@@ -3,7 +3,7 @@ use super::*;
+ ast_struct! {
+ /// A complete file of Rust source code.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Example
+ ///
+@@ -37,6 +37,8 @@ ast_struct! {
+ /// file.read_to_string(&mut src).expect("Unable to read file");
+ ///
+ /// let syntax = syn::parse_file(&src).expect("Unable to parse file");
++ ///
++ /// // Debug impl is available if Syn is built with "extra-traits" feature.
+ /// println!("{:#?}", syntax);
+ /// }
+ /// ```
+diff --git a/third_party/rust/syn/src/gen/clone.rs b/third_party/rust/syn/src/gen/clone.rs
+new file mode 100644
+index 0000000000..bea3887013
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/gen/clone.rs
+@@ -0,0 +1,2051 @@
++// This file is @generated by syn-internal-codegen.
++// It is not intended for manual editing.
++
++#![allow(clippy::clone_on_copy, clippy::expl_impl_clone_on_copy)]
++use crate::*;
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Abi {
++ fn clone(&self) -> Self {
++ Abi {
++ extern_token: self.extern_token.clone(),
++ name: self.name.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for AngleBracketedGenericArguments {
++ fn clone(&self) -> Self {
++ AngleBracketedGenericArguments {
++ colon2_token: self.colon2_token.clone(),
++ lt_token: self.lt_token.clone(),
++ args: self.args.clone(),
++ gt_token: self.gt_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Arm {
++ fn clone(&self) -> Self {
++ Arm {
++ attrs: self.attrs.clone(),
++ pat: self.pat.clone(),
++ guard: self.guard.clone(),
++ fat_arrow_token: self.fat_arrow_token.clone(),
++ body: self.body.clone(),
++ comma: self.comma.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Copy for AttrStyle {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for AttrStyle {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Attribute {
++ fn clone(&self) -> Self {
++ Attribute {
++ pound_token: self.pound_token.clone(),
++ style: self.style.clone(),
++ bracket_token: self.bracket_token.clone(),
++ path: self.path.clone(),
++ tokens: self.tokens.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for BareFnArg {
++ fn clone(&self) -> Self {
++ BareFnArg {
++ attrs: self.attrs.clone(),
++ name: self.name.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Copy for BinOp {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for BinOp {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Binding {
++ fn clone(&self) -> Self {
++ Binding {
++ ident: self.ident.clone(),
++ eq_token: self.eq_token.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Block {
++ fn clone(&self) -> Self {
++ Block {
++ brace_token: self.brace_token.clone(),
++ stmts: self.stmts.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for BoundLifetimes {
++ fn clone(&self) -> Self {
++ BoundLifetimes {
++ for_token: self.for_token.clone(),
++ lt_token: self.lt_token.clone(),
++ lifetimes: self.lifetimes.clone(),
++ gt_token: self.gt_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ConstParam {
++ fn clone(&self) -> Self {
++ ConstParam {
++ attrs: self.attrs.clone(),
++ const_token: self.const_token.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ eq_token: self.eq_token.clone(),
++ default: self.default.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Constraint {
++ fn clone(&self) -> Self {
++ Constraint {
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Clone for Data {
++ fn clone(&self) -> Self {
++ match self {
++ Data::Struct(v0) => Data::Struct(v0.clone()),
++ Data::Enum(v0) => Data::Enum(v0.clone()),
++ Data::Union(v0) => Data::Union(v0.clone()),
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Clone for DataEnum {
++ fn clone(&self) -> Self {
++ DataEnum {
++ enum_token: self.enum_token.clone(),
++ brace_token: self.brace_token.clone(),
++ variants: self.variants.clone(),
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Clone for DataStruct {
++ fn clone(&self) -> Self {
++ DataStruct {
++ struct_token: self.struct_token.clone(),
++ fields: self.fields.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Clone for DataUnion {
++ fn clone(&self) -> Self {
++ DataUnion {
++ union_token: self.union_token.clone(),
++ fields: self.fields.clone(),
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Clone for DeriveInput {
++ fn clone(&self) -> Self {
++ DeriveInput {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ data: self.data.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Expr {
++ fn clone(&self) -> Self {
++ match self {
++ #[cfg(feature = "full")]
++ Expr::Array(v0) => Expr::Array(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Assign(v0) => Expr::Assign(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::AssignOp(v0) => Expr::AssignOp(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Async(v0) => Expr::Async(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Await(v0) => Expr::Await(v0.clone()),
++ Expr::Binary(v0) => Expr::Binary(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Block(v0) => Expr::Block(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Box(v0) => Expr::Box(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Break(v0) => Expr::Break(v0.clone()),
++ Expr::Call(v0) => Expr::Call(v0.clone()),
++ Expr::Cast(v0) => Expr::Cast(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Closure(v0) => Expr::Closure(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Continue(v0) => Expr::Continue(v0.clone()),
++ Expr::Field(v0) => Expr::Field(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::ForLoop(v0) => Expr::ForLoop(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Group(v0) => Expr::Group(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::If(v0) => Expr::If(v0.clone()),
++ Expr::Index(v0) => Expr::Index(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Let(v0) => Expr::Let(v0.clone()),
++ Expr::Lit(v0) => Expr::Lit(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Loop(v0) => Expr::Loop(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Macro(v0) => Expr::Macro(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Match(v0) => Expr::Match(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::MethodCall(v0) => Expr::MethodCall(v0.clone()),
++ Expr::Paren(v0) => Expr::Paren(v0.clone()),
++ Expr::Path(v0) => Expr::Path(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Range(v0) => Expr::Range(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Reference(v0) => Expr::Reference(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Repeat(v0) => Expr::Repeat(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Return(v0) => Expr::Return(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Struct(v0) => Expr::Struct(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Try(v0) => Expr::Try(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::TryBlock(v0) => Expr::TryBlock(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Tuple(v0) => Expr::Tuple(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Type(v0) => Expr::Type(v0.clone()),
++ Expr::Unary(v0) => Expr::Unary(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Unsafe(v0) => Expr::Unsafe(v0.clone()),
++ Expr::Verbatim(v0) => Expr::Verbatim(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::While(v0) => Expr::While(v0.clone()),
++ #[cfg(feature = "full")]
++ Expr::Yield(v0) => Expr::Yield(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprArray {
++ fn clone(&self) -> Self {
++ ExprArray {
++ attrs: self.attrs.clone(),
++ bracket_token: self.bracket_token.clone(),
++ elems: self.elems.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprAssign {
++ fn clone(&self) -> Self {
++ ExprAssign {
++ attrs: self.attrs.clone(),
++ left: self.left.clone(),
++ eq_token: self.eq_token.clone(),
++ right: self.right.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprAssignOp {
++ fn clone(&self) -> Self {
++ ExprAssignOp {
++ attrs: self.attrs.clone(),
++ left: self.left.clone(),
++ op: self.op.clone(),
++ right: self.right.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprAsync {
++ fn clone(&self) -> Self {
++ ExprAsync {
++ attrs: self.attrs.clone(),
++ async_token: self.async_token.clone(),
++ capture: self.capture.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprAwait {
++ fn clone(&self) -> Self {
++ ExprAwait {
++ attrs: self.attrs.clone(),
++ base: self.base.clone(),
++ dot_token: self.dot_token.clone(),
++ await_token: self.await_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprBinary {
++ fn clone(&self) -> Self {
++ ExprBinary {
++ attrs: self.attrs.clone(),
++ left: self.left.clone(),
++ op: self.op.clone(),
++ right: self.right.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprBlock {
++ fn clone(&self) -> Self {
++ ExprBlock {
++ attrs: self.attrs.clone(),
++ label: self.label.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprBox {
++ fn clone(&self) -> Self {
++ ExprBox {
++ attrs: self.attrs.clone(),
++ box_token: self.box_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprBreak {
++ fn clone(&self) -> Self {
++ ExprBreak {
++ attrs: self.attrs.clone(),
++ break_token: self.break_token.clone(),
++ label: self.label.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprCall {
++ fn clone(&self) -> Self {
++ ExprCall {
++ attrs: self.attrs.clone(),
++ func: self.func.clone(),
++ paren_token: self.paren_token.clone(),
++ args: self.args.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprCast {
++ fn clone(&self) -> Self {
++ ExprCast {
++ attrs: self.attrs.clone(),
++ expr: self.expr.clone(),
++ as_token: self.as_token.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprClosure {
++ fn clone(&self) -> Self {
++ ExprClosure {
++ attrs: self.attrs.clone(),
++ asyncness: self.asyncness.clone(),
++ movability: self.movability.clone(),
++ capture: self.capture.clone(),
++ or1_token: self.or1_token.clone(),
++ inputs: self.inputs.clone(),
++ or2_token: self.or2_token.clone(),
++ output: self.output.clone(),
++ body: self.body.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprContinue {
++ fn clone(&self) -> Self {
++ ExprContinue {
++ attrs: self.attrs.clone(),
++ continue_token: self.continue_token.clone(),
++ label: self.label.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprField {
++ fn clone(&self) -> Self {
++ ExprField {
++ attrs: self.attrs.clone(),
++ base: self.base.clone(),
++ dot_token: self.dot_token.clone(),
++ member: self.member.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprForLoop {
++ fn clone(&self) -> Self {
++ ExprForLoop {
++ attrs: self.attrs.clone(),
++ label: self.label.clone(),
++ for_token: self.for_token.clone(),
++ pat: self.pat.clone(),
++ in_token: self.in_token.clone(),
++ expr: self.expr.clone(),
++ body: self.body.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprGroup {
++ fn clone(&self) -> Self {
++ ExprGroup {
++ attrs: self.attrs.clone(),
++ group_token: self.group_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprIf {
++ fn clone(&self) -> Self {
++ ExprIf {
++ attrs: self.attrs.clone(),
++ if_token: self.if_token.clone(),
++ cond: self.cond.clone(),
++ then_branch: self.then_branch.clone(),
++ else_branch: self.else_branch.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprIndex {
++ fn clone(&self) -> Self {
++ ExprIndex {
++ attrs: self.attrs.clone(),
++ expr: self.expr.clone(),
++ bracket_token: self.bracket_token.clone(),
++ index: self.index.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprLet {
++ fn clone(&self) -> Self {
++ ExprLet {
++ attrs: self.attrs.clone(),
++ let_token: self.let_token.clone(),
++ pat: self.pat.clone(),
++ eq_token: self.eq_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprLit {
++ fn clone(&self) -> Self {
++ ExprLit {
++ attrs: self.attrs.clone(),
++ lit: self.lit.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprLoop {
++ fn clone(&self) -> Self {
++ ExprLoop {
++ attrs: self.attrs.clone(),
++ label: self.label.clone(),
++ loop_token: self.loop_token.clone(),
++ body: self.body.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprMacro {
++ fn clone(&self) -> Self {
++ ExprMacro {
++ attrs: self.attrs.clone(),
++ mac: self.mac.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprMatch {
++ fn clone(&self) -> Self {
++ ExprMatch {
++ attrs: self.attrs.clone(),
++ match_token: self.match_token.clone(),
++ expr: self.expr.clone(),
++ brace_token: self.brace_token.clone(),
++ arms: self.arms.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprMethodCall {
++ fn clone(&self) -> Self {
++ ExprMethodCall {
++ attrs: self.attrs.clone(),
++ receiver: self.receiver.clone(),
++ dot_token: self.dot_token.clone(),
++ method: self.method.clone(),
++ turbofish: self.turbofish.clone(),
++ paren_token: self.paren_token.clone(),
++ args: self.args.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprParen {
++ fn clone(&self) -> Self {
++ ExprParen {
++ attrs: self.attrs.clone(),
++ paren_token: self.paren_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprPath {
++ fn clone(&self) -> Self {
++ ExprPath {
++ attrs: self.attrs.clone(),
++ qself: self.qself.clone(),
++ path: self.path.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprRange {
++ fn clone(&self) -> Self {
++ ExprRange {
++ attrs: self.attrs.clone(),
++ from: self.from.clone(),
++ limits: self.limits.clone(),
++ to: self.to.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprReference {
++ fn clone(&self) -> Self {
++ ExprReference {
++ attrs: self.attrs.clone(),
++ and_token: self.and_token.clone(),
++ raw: self.raw.clone(),
++ mutability: self.mutability.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprRepeat {
++ fn clone(&self) -> Self {
++ ExprRepeat {
++ attrs: self.attrs.clone(),
++ bracket_token: self.bracket_token.clone(),
++ expr: self.expr.clone(),
++ semi_token: self.semi_token.clone(),
++ len: self.len.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprReturn {
++ fn clone(&self) -> Self {
++ ExprReturn {
++ attrs: self.attrs.clone(),
++ return_token: self.return_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprStruct {
++ fn clone(&self) -> Self {
++ ExprStruct {
++ attrs: self.attrs.clone(),
++ path: self.path.clone(),
++ brace_token: self.brace_token.clone(),
++ fields: self.fields.clone(),
++ dot2_token: self.dot2_token.clone(),
++ rest: self.rest.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprTry {
++ fn clone(&self) -> Self {
++ ExprTry {
++ attrs: self.attrs.clone(),
++ expr: self.expr.clone(),
++ question_token: self.question_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprTryBlock {
++ fn clone(&self) -> Self {
++ ExprTryBlock {
++ attrs: self.attrs.clone(),
++ try_token: self.try_token.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprTuple {
++ fn clone(&self) -> Self {
++ ExprTuple {
++ attrs: self.attrs.clone(),
++ paren_token: self.paren_token.clone(),
++ elems: self.elems.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprType {
++ fn clone(&self) -> Self {
++ ExprType {
++ attrs: self.attrs.clone(),
++ expr: self.expr.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ExprUnary {
++ fn clone(&self) -> Self {
++ ExprUnary {
++ attrs: self.attrs.clone(),
++ op: self.op.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprUnsafe {
++ fn clone(&self) -> Self {
++ ExprUnsafe {
++ attrs: self.attrs.clone(),
++ unsafe_token: self.unsafe_token.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprWhile {
++ fn clone(&self) -> Self {
++ ExprWhile {
++ attrs: self.attrs.clone(),
++ label: self.label.clone(),
++ while_token: self.while_token.clone(),
++ cond: self.cond.clone(),
++ body: self.body.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ExprYield {
++ fn clone(&self) -> Self {
++ ExprYield {
++ attrs: self.attrs.clone(),
++ yield_token: self.yield_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Field {
++ fn clone(&self) -> Self {
++ Field {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for FieldPat {
++ fn clone(&self) -> Self {
++ FieldPat {
++ attrs: self.attrs.clone(),
++ member: self.member.clone(),
++ colon_token: self.colon_token.clone(),
++ pat: self.pat.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for FieldValue {
++ fn clone(&self) -> Self {
++ FieldValue {
++ attrs: self.attrs.clone(),
++ member: self.member.clone(),
++ colon_token: self.colon_token.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Fields {
++ fn clone(&self) -> Self {
++ match self {
++ Fields::Named(v0) => Fields::Named(v0.clone()),
++ Fields::Unnamed(v0) => Fields::Unnamed(v0.clone()),
++ Fields::Unit => Fields::Unit,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for FieldsNamed {
++ fn clone(&self) -> Self {
++ FieldsNamed {
++ brace_token: self.brace_token.clone(),
++ named: self.named.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for FieldsUnnamed {
++ fn clone(&self) -> Self {
++ FieldsUnnamed {
++ paren_token: self.paren_token.clone(),
++ unnamed: self.unnamed.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for File {
++ fn clone(&self) -> Self {
++ File {
++ shebang: self.shebang.clone(),
++ attrs: self.attrs.clone(),
++ items: self.items.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for FnArg {
++ fn clone(&self) -> Self {
++ match self {
++ FnArg::Receiver(v0) => FnArg::Receiver(v0.clone()),
++ FnArg::Typed(v0) => FnArg::Typed(v0.clone()),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ForeignItem {
++ fn clone(&self) -> Self {
++ match self {
++ ForeignItem::Fn(v0) => ForeignItem::Fn(v0.clone()),
++ ForeignItem::Static(v0) => ForeignItem::Static(v0.clone()),
++ ForeignItem::Type(v0) => ForeignItem::Type(v0.clone()),
++ ForeignItem::Macro(v0) => ForeignItem::Macro(v0.clone()),
++ ForeignItem::Verbatim(v0) => ForeignItem::Verbatim(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ForeignItemFn {
++ fn clone(&self) -> Self {
++ ForeignItemFn {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ sig: self.sig.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ForeignItemMacro {
++ fn clone(&self) -> Self {
++ ForeignItemMacro {
++ attrs: self.attrs.clone(),
++ mac: self.mac.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ForeignItemStatic {
++ fn clone(&self) -> Self {
++ ForeignItemStatic {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ static_token: self.static_token.clone(),
++ mutability: self.mutability.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ForeignItemType {
++ fn clone(&self) -> Self {
++ ForeignItemType {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ type_token: self.type_token.clone(),
++ ident: self.ident.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for GenericArgument {
++ fn clone(&self) -> Self {
++ match self {
++ GenericArgument::Lifetime(v0) => GenericArgument::Lifetime(v0.clone()),
++ GenericArgument::Type(v0) => GenericArgument::Type(v0.clone()),
++ GenericArgument::Binding(v0) => GenericArgument::Binding(v0.clone()),
++ GenericArgument::Constraint(v0) => GenericArgument::Constraint(v0.clone()),
++ GenericArgument::Const(v0) => GenericArgument::Const(v0.clone()),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for GenericMethodArgument {
++ fn clone(&self) -> Self {
++ match self {
++ GenericMethodArgument::Type(v0) => GenericMethodArgument::Type(v0.clone()),
++ GenericMethodArgument::Const(v0) => GenericMethodArgument::Const(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for GenericParam {
++ fn clone(&self) -> Self {
++ match self {
++ GenericParam::Type(v0) => GenericParam::Type(v0.clone()),
++ GenericParam::Lifetime(v0) => GenericParam::Lifetime(v0.clone()),
++ GenericParam::Const(v0) => GenericParam::Const(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Generics {
++ fn clone(&self) -> Self {
++ Generics {
++ lt_token: self.lt_token.clone(),
++ params: self.params.clone(),
++ gt_token: self.gt_token.clone(),
++ where_clause: self.where_clause.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ImplItem {
++ fn clone(&self) -> Self {
++ match self {
++ ImplItem::Const(v0) => ImplItem::Const(v0.clone()),
++ ImplItem::Method(v0) => ImplItem::Method(v0.clone()),
++ ImplItem::Type(v0) => ImplItem::Type(v0.clone()),
++ ImplItem::Macro(v0) => ImplItem::Macro(v0.clone()),
++ ImplItem::Verbatim(v0) => ImplItem::Verbatim(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ImplItemConst {
++ fn clone(&self) -> Self {
++ ImplItemConst {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ defaultness: self.defaultness.clone(),
++ const_token: self.const_token.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ eq_token: self.eq_token.clone(),
++ expr: self.expr.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ImplItemMacro {
++ fn clone(&self) -> Self {
++ ImplItemMacro {
++ attrs: self.attrs.clone(),
++ mac: self.mac.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ImplItemMethod {
++ fn clone(&self) -> Self {
++ ImplItemMethod {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ defaultness: self.defaultness.clone(),
++ sig: self.sig.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ImplItemType {
++ fn clone(&self) -> Self {
++ ImplItemType {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ defaultness: self.defaultness.clone(),
++ type_token: self.type_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ eq_token: self.eq_token.clone(),
++ ty: self.ty.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Index {
++ fn clone(&self) -> Self {
++ Index {
++ index: self.index.clone(),
++ span: self.span.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Item {
++ fn clone(&self) -> Self {
++ match self {
++ Item::Const(v0) => Item::Const(v0.clone()),
++ Item::Enum(v0) => Item::Enum(v0.clone()),
++ Item::ExternCrate(v0) => Item::ExternCrate(v0.clone()),
++ Item::Fn(v0) => Item::Fn(v0.clone()),
++ Item::ForeignMod(v0) => Item::ForeignMod(v0.clone()),
++ Item::Impl(v0) => Item::Impl(v0.clone()),
++ Item::Macro(v0) => Item::Macro(v0.clone()),
++ Item::Macro2(v0) => Item::Macro2(v0.clone()),
++ Item::Mod(v0) => Item::Mod(v0.clone()),
++ Item::Static(v0) => Item::Static(v0.clone()),
++ Item::Struct(v0) => Item::Struct(v0.clone()),
++ Item::Trait(v0) => Item::Trait(v0.clone()),
++ Item::TraitAlias(v0) => Item::TraitAlias(v0.clone()),
++ Item::Type(v0) => Item::Type(v0.clone()),
++ Item::Union(v0) => Item::Union(v0.clone()),
++ Item::Use(v0) => Item::Use(v0.clone()),
++ Item::Verbatim(v0) => Item::Verbatim(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemConst {
++ fn clone(&self) -> Self {
++ ItemConst {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ const_token: self.const_token.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ eq_token: self.eq_token.clone(),
++ expr: self.expr.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemEnum {
++ fn clone(&self) -> Self {
++ ItemEnum {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ enum_token: self.enum_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ brace_token: self.brace_token.clone(),
++ variants: self.variants.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemExternCrate {
++ fn clone(&self) -> Self {
++ ItemExternCrate {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ extern_token: self.extern_token.clone(),
++ crate_token: self.crate_token.clone(),
++ ident: self.ident.clone(),
++ rename: self.rename.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemFn {
++ fn clone(&self) -> Self {
++ ItemFn {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ sig: self.sig.clone(),
++ block: self.block.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemForeignMod {
++ fn clone(&self) -> Self {
++ ItemForeignMod {
++ attrs: self.attrs.clone(),
++ abi: self.abi.clone(),
++ brace_token: self.brace_token.clone(),
++ items: self.items.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemImpl {
++ fn clone(&self) -> Self {
++ ItemImpl {
++ attrs: self.attrs.clone(),
++ defaultness: self.defaultness.clone(),
++ unsafety: self.unsafety.clone(),
++ impl_token: self.impl_token.clone(),
++ generics: self.generics.clone(),
++ trait_: self.trait_.clone(),
++ self_ty: self.self_ty.clone(),
++ brace_token: self.brace_token.clone(),
++ items: self.items.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemMacro {
++ fn clone(&self) -> Self {
++ ItemMacro {
++ attrs: self.attrs.clone(),
++ ident: self.ident.clone(),
++ mac: self.mac.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemMacro2 {
++ fn clone(&self) -> Self {
++ ItemMacro2 {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ macro_token: self.macro_token.clone(),
++ ident: self.ident.clone(),
++ rules: self.rules.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemMod {
++ fn clone(&self) -> Self {
++ ItemMod {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ mod_token: self.mod_token.clone(),
++ ident: self.ident.clone(),
++ content: self.content.clone(),
++ semi: self.semi.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemStatic {
++ fn clone(&self) -> Self {
++ ItemStatic {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ static_token: self.static_token.clone(),
++ mutability: self.mutability.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ eq_token: self.eq_token.clone(),
++ expr: self.expr.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemStruct {
++ fn clone(&self) -> Self {
++ ItemStruct {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ struct_token: self.struct_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ fields: self.fields.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemTrait {
++ fn clone(&self) -> Self {
++ ItemTrait {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ unsafety: self.unsafety.clone(),
++ auto_token: self.auto_token.clone(),
++ trait_token: self.trait_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ colon_token: self.colon_token.clone(),
++ supertraits: self.supertraits.clone(),
++ brace_token: self.brace_token.clone(),
++ items: self.items.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemTraitAlias {
++ fn clone(&self) -> Self {
++ ItemTraitAlias {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ trait_token: self.trait_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ eq_token: self.eq_token.clone(),
++ bounds: self.bounds.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemType {
++ fn clone(&self) -> Self {
++ ItemType {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ type_token: self.type_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ eq_token: self.eq_token.clone(),
++ ty: self.ty.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemUnion {
++ fn clone(&self) -> Self {
++ ItemUnion {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ union_token: self.union_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ fields: self.fields.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for ItemUse {
++ fn clone(&self) -> Self {
++ ItemUse {
++ attrs: self.attrs.clone(),
++ vis: self.vis.clone(),
++ use_token: self.use_token.clone(),
++ leading_colon: self.leading_colon.clone(),
++ tree: self.tree.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Label {
++ fn clone(&self) -> Self {
++ Label {
++ name: self.name.clone(),
++ colon_token: self.colon_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for LifetimeDef {
++ fn clone(&self) -> Self {
++ LifetimeDef {
++ attrs: self.attrs.clone(),
++ lifetime: self.lifetime.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++impl Clone for Lit {
++ fn clone(&self) -> Self {
++ match self {
++ Lit::Str(v0) => Lit::Str(v0.clone()),
++ Lit::ByteStr(v0) => Lit::ByteStr(v0.clone()),
++ Lit::Byte(v0) => Lit::Byte(v0.clone()),
++ Lit::Char(v0) => Lit::Char(v0.clone()),
++ Lit::Int(v0) => Lit::Int(v0.clone()),
++ Lit::Float(v0) => Lit::Float(v0.clone()),
++ Lit::Bool(v0) => Lit::Bool(v0.clone()),
++ Lit::Verbatim(v0) => Lit::Verbatim(v0.clone()),
++ }
++ }
++}
++impl Clone for LitBool {
++ fn clone(&self) -> Self {
++ LitBool {
++ value: self.value.clone(),
++ span: self.span.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Local {
++ fn clone(&self) -> Self {
++ Local {
++ attrs: self.attrs.clone(),
++ let_token: self.let_token.clone(),
++ pat: self.pat.clone(),
++ init: self.init.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Macro {
++ fn clone(&self) -> Self {
++ Macro {
++ path: self.path.clone(),
++ bang_token: self.bang_token.clone(),
++ delimiter: self.delimiter.clone(),
++ tokens: self.tokens.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for MacroDelimiter {
++ fn clone(&self) -> Self {
++ match self {
++ MacroDelimiter::Paren(v0) => MacroDelimiter::Paren(v0.clone()),
++ MacroDelimiter::Brace(v0) => MacroDelimiter::Brace(v0.clone()),
++ MacroDelimiter::Bracket(v0) => MacroDelimiter::Bracket(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Member {
++ fn clone(&self) -> Self {
++ match self {
++ Member::Named(v0) => Member::Named(v0.clone()),
++ Member::Unnamed(v0) => Member::Unnamed(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Meta {
++ fn clone(&self) -> Self {
++ match self {
++ Meta::Path(v0) => Meta::Path(v0.clone()),
++ Meta::List(v0) => Meta::List(v0.clone()),
++ Meta::NameValue(v0) => Meta::NameValue(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for MetaList {
++ fn clone(&self) -> Self {
++ MetaList {
++ path: self.path.clone(),
++ paren_token: self.paren_token.clone(),
++ nested: self.nested.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for MetaNameValue {
++ fn clone(&self) -> Self {
++ MetaNameValue {
++ path: self.path.clone(),
++ eq_token: self.eq_token.clone(),
++ lit: self.lit.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for MethodTurbofish {
++ fn clone(&self) -> Self {
++ MethodTurbofish {
++ colon2_token: self.colon2_token.clone(),
++ lt_token: self.lt_token.clone(),
++ args: self.args.clone(),
++ gt_token: self.gt_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for NestedMeta {
++ fn clone(&self) -> Self {
++ match self {
++ NestedMeta::Meta(v0) => NestedMeta::Meta(v0.clone()),
++ NestedMeta::Lit(v0) => NestedMeta::Lit(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ParenthesizedGenericArguments {
++ fn clone(&self) -> Self {
++ ParenthesizedGenericArguments {
++ paren_token: self.paren_token.clone(),
++ inputs: self.inputs.clone(),
++ output: self.output.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Pat {
++ fn clone(&self) -> Self {
++ match self {
++ Pat::Box(v0) => Pat::Box(v0.clone()),
++ Pat::Ident(v0) => Pat::Ident(v0.clone()),
++ Pat::Lit(v0) => Pat::Lit(v0.clone()),
++ Pat::Macro(v0) => Pat::Macro(v0.clone()),
++ Pat::Or(v0) => Pat::Or(v0.clone()),
++ Pat::Path(v0) => Pat::Path(v0.clone()),
++ Pat::Range(v0) => Pat::Range(v0.clone()),
++ Pat::Reference(v0) => Pat::Reference(v0.clone()),
++ Pat::Rest(v0) => Pat::Rest(v0.clone()),
++ Pat::Slice(v0) => Pat::Slice(v0.clone()),
++ Pat::Struct(v0) => Pat::Struct(v0.clone()),
++ Pat::Tuple(v0) => Pat::Tuple(v0.clone()),
++ Pat::TupleStruct(v0) => Pat::TupleStruct(v0.clone()),
++ Pat::Type(v0) => Pat::Type(v0.clone()),
++ Pat::Verbatim(v0) => Pat::Verbatim(v0.clone()),
++ Pat::Wild(v0) => Pat::Wild(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatBox {
++ fn clone(&self) -> Self {
++ PatBox {
++ attrs: self.attrs.clone(),
++ box_token: self.box_token.clone(),
++ pat: self.pat.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatIdent {
++ fn clone(&self) -> Self {
++ PatIdent {
++ attrs: self.attrs.clone(),
++ by_ref: self.by_ref.clone(),
++ mutability: self.mutability.clone(),
++ ident: self.ident.clone(),
++ subpat: self.subpat.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatLit {
++ fn clone(&self) -> Self {
++ PatLit {
++ attrs: self.attrs.clone(),
++ expr: self.expr.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatMacro {
++ fn clone(&self) -> Self {
++ PatMacro {
++ attrs: self.attrs.clone(),
++ mac: self.mac.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatOr {
++ fn clone(&self) -> Self {
++ PatOr {
++ attrs: self.attrs.clone(),
++ leading_vert: self.leading_vert.clone(),
++ cases: self.cases.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatPath {
++ fn clone(&self) -> Self {
++ PatPath {
++ attrs: self.attrs.clone(),
++ qself: self.qself.clone(),
++ path: self.path.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatRange {
++ fn clone(&self) -> Self {
++ PatRange {
++ attrs: self.attrs.clone(),
++ lo: self.lo.clone(),
++ limits: self.limits.clone(),
++ hi: self.hi.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatReference {
++ fn clone(&self) -> Self {
++ PatReference {
++ attrs: self.attrs.clone(),
++ and_token: self.and_token.clone(),
++ mutability: self.mutability.clone(),
++ pat: self.pat.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatRest {
++ fn clone(&self) -> Self {
++ PatRest {
++ attrs: self.attrs.clone(),
++ dot2_token: self.dot2_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatSlice {
++ fn clone(&self) -> Self {
++ PatSlice {
++ attrs: self.attrs.clone(),
++ bracket_token: self.bracket_token.clone(),
++ elems: self.elems.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatStruct {
++ fn clone(&self) -> Self {
++ PatStruct {
++ attrs: self.attrs.clone(),
++ path: self.path.clone(),
++ brace_token: self.brace_token.clone(),
++ fields: self.fields.clone(),
++ dot2_token: self.dot2_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatTuple {
++ fn clone(&self) -> Self {
++ PatTuple {
++ attrs: self.attrs.clone(),
++ paren_token: self.paren_token.clone(),
++ elems: self.elems.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatTupleStruct {
++ fn clone(&self) -> Self {
++ PatTupleStruct {
++ attrs: self.attrs.clone(),
++ path: self.path.clone(),
++ pat: self.pat.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatType {
++ fn clone(&self) -> Self {
++ PatType {
++ attrs: self.attrs.clone(),
++ pat: self.pat.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for PatWild {
++ fn clone(&self) -> Self {
++ PatWild {
++ attrs: self.attrs.clone(),
++ underscore_token: self.underscore_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Path {
++ fn clone(&self) -> Self {
++ Path {
++ leading_colon: self.leading_colon.clone(),
++ segments: self.segments.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for PathArguments {
++ fn clone(&self) -> Self {
++ match self {
++ PathArguments::None => PathArguments::None,
++ PathArguments::AngleBracketed(v0) => PathArguments::AngleBracketed(v0.clone()),
++ PathArguments::Parenthesized(v0) => PathArguments::Parenthesized(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for PathSegment {
++ fn clone(&self) -> Self {
++ PathSegment {
++ ident: self.ident.clone(),
++ arguments: self.arguments.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for PredicateEq {
++ fn clone(&self) -> Self {
++ PredicateEq {
++ lhs_ty: self.lhs_ty.clone(),
++ eq_token: self.eq_token.clone(),
++ rhs_ty: self.rhs_ty.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for PredicateLifetime {
++ fn clone(&self) -> Self {
++ PredicateLifetime {
++ lifetime: self.lifetime.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for PredicateType {
++ fn clone(&self) -> Self {
++ PredicateType {
++ lifetimes: self.lifetimes.clone(),
++ bounded_ty: self.bounded_ty.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for QSelf {
++ fn clone(&self) -> Self {
++ QSelf {
++ lt_token: self.lt_token.clone(),
++ ty: self.ty.clone(),
++ position: self.position.clone(),
++ as_token: self.as_token.clone(),
++ gt_token: self.gt_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Copy for RangeLimits {}
++#[cfg(feature = "full")]
++impl Clone for RangeLimits {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Receiver {
++ fn clone(&self) -> Self {
++ Receiver {
++ attrs: self.attrs.clone(),
++ reference: self.reference.clone(),
++ mutability: self.mutability.clone(),
++ self_token: self.self_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for ReturnType {
++ fn clone(&self) -> Self {
++ match self {
++ ReturnType::Default => ReturnType::Default,
++ ReturnType::Type(v0, v1) => ReturnType::Type(v0.clone(), v1.clone()),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Signature {
++ fn clone(&self) -> Self {
++ Signature {
++ constness: self.constness.clone(),
++ asyncness: self.asyncness.clone(),
++ unsafety: self.unsafety.clone(),
++ abi: self.abi.clone(),
++ fn_token: self.fn_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ paren_token: self.paren_token.clone(),
++ inputs: self.inputs.clone(),
++ variadic: self.variadic.clone(),
++ output: self.output.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for Stmt {
++ fn clone(&self) -> Self {
++ match self {
++ Stmt::Local(v0) => Stmt::Local(v0.clone()),
++ Stmt::Item(v0) => Stmt::Item(v0.clone()),
++ Stmt::Expr(v0) => Stmt::Expr(v0.clone()),
++ Stmt::Semi(v0, v1) => Stmt::Semi(v0.clone(), v1.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TraitBound {
++ fn clone(&self) -> Self {
++ TraitBound {
++ paren_token: self.paren_token.clone(),
++ modifier: self.modifier.clone(),
++ lifetimes: self.lifetimes.clone(),
++ path: self.path.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Copy for TraitBoundModifier {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TraitBoundModifier {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for TraitItem {
++ fn clone(&self) -> Self {
++ match self {
++ TraitItem::Const(v0) => TraitItem::Const(v0.clone()),
++ TraitItem::Method(v0) => TraitItem::Method(v0.clone()),
++ TraitItem::Type(v0) => TraitItem::Type(v0.clone()),
++ TraitItem::Macro(v0) => TraitItem::Macro(v0.clone()),
++ TraitItem::Verbatim(v0) => TraitItem::Verbatim(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for TraitItemConst {
++ fn clone(&self) -> Self {
++ TraitItemConst {
++ attrs: self.attrs.clone(),
++ const_token: self.const_token.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ ty: self.ty.clone(),
++ default: self.default.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for TraitItemMacro {
++ fn clone(&self) -> Self {
++ TraitItemMacro {
++ attrs: self.attrs.clone(),
++ mac: self.mac.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for TraitItemMethod {
++ fn clone(&self) -> Self {
++ TraitItemMethod {
++ attrs: self.attrs.clone(),
++ sig: self.sig.clone(),
++ default: self.default.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for TraitItemType {
++ fn clone(&self) -> Self {
++ TraitItemType {
++ attrs: self.attrs.clone(),
++ type_token: self.type_token.clone(),
++ ident: self.ident.clone(),
++ generics: self.generics.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ default: self.default.clone(),
++ semi_token: self.semi_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Type {
++ fn clone(&self) -> Self {
++ match self {
++ Type::Array(v0) => Type::Array(v0.clone()),
++ Type::BareFn(v0) => Type::BareFn(v0.clone()),
++ Type::Group(v0) => Type::Group(v0.clone()),
++ Type::ImplTrait(v0) => Type::ImplTrait(v0.clone()),
++ Type::Infer(v0) => Type::Infer(v0.clone()),
++ Type::Macro(v0) => Type::Macro(v0.clone()),
++ Type::Never(v0) => Type::Never(v0.clone()),
++ Type::Paren(v0) => Type::Paren(v0.clone()),
++ Type::Path(v0) => Type::Path(v0.clone()),
++ Type::Ptr(v0) => Type::Ptr(v0.clone()),
++ Type::Reference(v0) => Type::Reference(v0.clone()),
++ Type::Slice(v0) => Type::Slice(v0.clone()),
++ Type::TraitObject(v0) => Type::TraitObject(v0.clone()),
++ Type::Tuple(v0) => Type::Tuple(v0.clone()),
++ Type::Verbatim(v0) => Type::Verbatim(v0.clone()),
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeArray {
++ fn clone(&self) -> Self {
++ TypeArray {
++ bracket_token: self.bracket_token.clone(),
++ elem: self.elem.clone(),
++ semi_token: self.semi_token.clone(),
++ len: self.len.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeBareFn {
++ fn clone(&self) -> Self {
++ TypeBareFn {
++ lifetimes: self.lifetimes.clone(),
++ unsafety: self.unsafety.clone(),
++ abi: self.abi.clone(),
++ fn_token: self.fn_token.clone(),
++ paren_token: self.paren_token.clone(),
++ inputs: self.inputs.clone(),
++ variadic: self.variadic.clone(),
++ output: self.output.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeGroup {
++ fn clone(&self) -> Self {
++ TypeGroup {
++ group_token: self.group_token.clone(),
++ elem: self.elem.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeImplTrait {
++ fn clone(&self) -> Self {
++ TypeImplTrait {
++ impl_token: self.impl_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeInfer {
++ fn clone(&self) -> Self {
++ TypeInfer {
++ underscore_token: self.underscore_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeMacro {
++ fn clone(&self) -> Self {
++ TypeMacro {
++ mac: self.mac.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeNever {
++ fn clone(&self) -> Self {
++ TypeNever {
++ bang_token: self.bang_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeParam {
++ fn clone(&self) -> Self {
++ TypeParam {
++ attrs: self.attrs.clone(),
++ ident: self.ident.clone(),
++ colon_token: self.colon_token.clone(),
++ bounds: self.bounds.clone(),
++ eq_token: self.eq_token.clone(),
++ default: self.default.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeParamBound {
++ fn clone(&self) -> Self {
++ match self {
++ TypeParamBound::Trait(v0) => TypeParamBound::Trait(v0.clone()),
++ TypeParamBound::Lifetime(v0) => TypeParamBound::Lifetime(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeParen {
++ fn clone(&self) -> Self {
++ TypeParen {
++ paren_token: self.paren_token.clone(),
++ elem: self.elem.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypePath {
++ fn clone(&self) -> Self {
++ TypePath {
++ qself: self.qself.clone(),
++ path: self.path.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypePtr {
++ fn clone(&self) -> Self {
++ TypePtr {
++ star_token: self.star_token.clone(),
++ const_token: self.const_token.clone(),
++ mutability: self.mutability.clone(),
++ elem: self.elem.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeReference {
++ fn clone(&self) -> Self {
++ TypeReference {
++ and_token: self.and_token.clone(),
++ lifetime: self.lifetime.clone(),
++ mutability: self.mutability.clone(),
++ elem: self.elem.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeSlice {
++ fn clone(&self) -> Self {
++ TypeSlice {
++ bracket_token: self.bracket_token.clone(),
++ elem: self.elem.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeTraitObject {
++ fn clone(&self) -> Self {
++ TypeTraitObject {
++ dyn_token: self.dyn_token.clone(),
++ bounds: self.bounds.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for TypeTuple {
++ fn clone(&self) -> Self {
++ TypeTuple {
++ paren_token: self.paren_token.clone(),
++ elems: self.elems.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Copy for UnOp {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for UnOp {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UseGlob {
++ fn clone(&self) -> Self {
++ UseGlob {
++ star_token: self.star_token.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UseGroup {
++ fn clone(&self) -> Self {
++ UseGroup {
++ brace_token: self.brace_token.clone(),
++ items: self.items.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UseName {
++ fn clone(&self) -> Self {
++ UseName {
++ ident: self.ident.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UsePath {
++ fn clone(&self) -> Self {
++ UsePath {
++ ident: self.ident.clone(),
++ colon2_token: self.colon2_token.clone(),
++ tree: self.tree.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UseRename {
++ fn clone(&self) -> Self {
++ UseRename {
++ ident: self.ident.clone(),
++ as_token: self.as_token.clone(),
++ rename: self.rename.clone(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Clone for UseTree {
++ fn clone(&self) -> Self {
++ match self {
++ UseTree::Path(v0) => UseTree::Path(v0.clone()),
++ UseTree::Name(v0) => UseTree::Name(v0.clone()),
++ UseTree::Rename(v0) => UseTree::Rename(v0.clone()),
++ UseTree::Glob(v0) => UseTree::Glob(v0.clone()),
++ UseTree::Group(v0) => UseTree::Group(v0.clone()),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Variadic {
++ fn clone(&self) -> Self {
++ Variadic {
++ attrs: self.attrs.clone(),
++ dots: self.dots.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Variant {
++ fn clone(&self) -> Self {
++ Variant {
++ attrs: self.attrs.clone(),
++ ident: self.ident.clone(),
++ fields: self.fields.clone(),
++ discriminant: self.discriminant.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for VisCrate {
++ fn clone(&self) -> Self {
++ VisCrate {
++ crate_token: self.crate_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for VisPublic {
++ fn clone(&self) -> Self {
++ VisPublic {
++ pub_token: self.pub_token.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for VisRestricted {
++ fn clone(&self) -> Self {
++ VisRestricted {
++ pub_token: self.pub_token.clone(),
++ paren_token: self.paren_token.clone(),
++ in_token: self.in_token.clone(),
++ path: self.path.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for Visibility {
++ fn clone(&self) -> Self {
++ match self {
++ Visibility::Public(v0) => Visibility::Public(v0.clone()),
++ Visibility::Crate(v0) => Visibility::Crate(v0.clone()),
++ Visibility::Restricted(v0) => Visibility::Restricted(v0.clone()),
++ Visibility::Inherited => Visibility::Inherited,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for WhereClause {
++ fn clone(&self) -> Self {
++ WhereClause {
++ where_token: self.where_token.clone(),
++ predicates: self.predicates.clone(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Clone for WherePredicate {
++ fn clone(&self) -> Self {
++ match self {
++ WherePredicate::Type(v0) => WherePredicate::Type(v0.clone()),
++ WherePredicate::Lifetime(v0) => WherePredicate::Lifetime(v0.clone()),
++ WherePredicate::Eq(v0) => WherePredicate::Eq(v0.clone()),
++ }
++ }
++}
+diff --git a/third_party/rust/syn/src/gen/debug.rs b/third_party/rust/syn/src/gen/debug.rs
+new file mode 100644
+index 0000000000..72baab05f4
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/gen/debug.rs
+@@ -0,0 +1,2857 @@
++// This file is @generated by syn-internal-codegen.
++// It is not intended for manual editing.
++
++use crate::*;
++use std::fmt::{self, Debug};
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Abi {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Abi");
++ formatter.field("extern_token", &self.extern_token);
++ formatter.field("name", &self.name);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for AngleBracketedGenericArguments {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("AngleBracketedGenericArguments");
++ formatter.field("colon2_token", &self.colon2_token);
++ formatter.field("lt_token", &self.lt_token);
++ formatter.field("args", &self.args);
++ formatter.field("gt_token", &self.gt_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Arm {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Arm");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("pat", &self.pat);
++ formatter.field("guard", &self.guard);
++ formatter.field("fat_arrow_token", &self.fat_arrow_token);
++ formatter.field("body", &self.body);
++ formatter.field("comma", &self.comma);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for AttrStyle {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ AttrStyle::Outer => formatter.write_str("Outer"),
++ AttrStyle::Inner(v0) => {
++ let mut formatter = formatter.debug_tuple("Inner");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Attribute {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Attribute");
++ formatter.field("pound_token", &self.pound_token);
++ formatter.field("style", &self.style);
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("path", &self.path);
++ formatter.field("tokens", &self.tokens);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for BareFnArg {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("BareFnArg");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("name", &self.name);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for BinOp {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ BinOp::Add(v0) => {
++ let mut formatter = formatter.debug_tuple("Add");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Sub(v0) => {
++ let mut formatter = formatter.debug_tuple("Sub");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Mul(v0) => {
++ let mut formatter = formatter.debug_tuple("Mul");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Div(v0) => {
++ let mut formatter = formatter.debug_tuple("Div");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Rem(v0) => {
++ let mut formatter = formatter.debug_tuple("Rem");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::And(v0) => {
++ let mut formatter = formatter.debug_tuple("And");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Or(v0) => {
++ let mut formatter = formatter.debug_tuple("Or");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitXor(v0) => {
++ let mut formatter = formatter.debug_tuple("BitXor");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitAnd(v0) => {
++ let mut formatter = formatter.debug_tuple("BitAnd");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitOr(v0) => {
++ let mut formatter = formatter.debug_tuple("BitOr");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Shl(v0) => {
++ let mut formatter = formatter.debug_tuple("Shl");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Shr(v0) => {
++ let mut formatter = formatter.debug_tuple("Shr");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Eq(v0) => {
++ let mut formatter = formatter.debug_tuple("Eq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Lt(v0) => {
++ let mut formatter = formatter.debug_tuple("Lt");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Le(v0) => {
++ let mut formatter = formatter.debug_tuple("Le");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Ne(v0) => {
++ let mut formatter = formatter.debug_tuple("Ne");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Ge(v0) => {
++ let mut formatter = formatter.debug_tuple("Ge");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::Gt(v0) => {
++ let mut formatter = formatter.debug_tuple("Gt");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::AddEq(v0) => {
++ let mut formatter = formatter.debug_tuple("AddEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::SubEq(v0) => {
++ let mut formatter = formatter.debug_tuple("SubEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::MulEq(v0) => {
++ let mut formatter = formatter.debug_tuple("MulEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::DivEq(v0) => {
++ let mut formatter = formatter.debug_tuple("DivEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::RemEq(v0) => {
++ let mut formatter = formatter.debug_tuple("RemEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitXorEq(v0) => {
++ let mut formatter = formatter.debug_tuple("BitXorEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitAndEq(v0) => {
++ let mut formatter = formatter.debug_tuple("BitAndEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::BitOrEq(v0) => {
++ let mut formatter = formatter.debug_tuple("BitOrEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::ShlEq(v0) => {
++ let mut formatter = formatter.debug_tuple("ShlEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ BinOp::ShrEq(v0) => {
++ let mut formatter = formatter.debug_tuple("ShrEq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Binding {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Binding");
++ formatter.field("ident", &self.ident);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Block {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Block");
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("stmts", &self.stmts);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for BoundLifetimes {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("BoundLifetimes");
++ formatter.field("for_token", &self.for_token);
++ formatter.field("lt_token", &self.lt_token);
++ formatter.field("lifetimes", &self.lifetimes);
++ formatter.field("gt_token", &self.gt_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ConstParam {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ConstParam");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("const_token", &self.const_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("default", &self.default);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Constraint {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Constraint");
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "derive")]
++impl Debug for Data {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Data::Struct(v0) => {
++ let mut formatter = formatter.debug_tuple("Struct");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Data::Enum(v0) => {
++ let mut formatter = formatter.debug_tuple("Enum");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Data::Union(v0) => {
++ let mut formatter = formatter.debug_tuple("Union");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Debug for DataEnum {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("DataEnum");
++ formatter.field("enum_token", &self.enum_token);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("variants", &self.variants);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "derive")]
++impl Debug for DataStruct {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("DataStruct");
++ formatter.field("struct_token", &self.struct_token);
++ formatter.field("fields", &self.fields);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "derive")]
++impl Debug for DataUnion {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("DataUnion");
++ formatter.field("union_token", &self.union_token);
++ formatter.field("fields", &self.fields);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "derive")]
++impl Debug for DeriveInput {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("DeriveInput");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("data", &self.data);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Expr {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ #[cfg(feature = "full")]
++ Expr::Array(v0) => {
++ let mut formatter = formatter.debug_tuple("Array");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Assign(v0) => {
++ let mut formatter = formatter.debug_tuple("Assign");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::AssignOp(v0) => {
++ let mut formatter = formatter.debug_tuple("AssignOp");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Async(v0) => {
++ let mut formatter = formatter.debug_tuple("Async");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Await(v0) => {
++ let mut formatter = formatter.debug_tuple("Await");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Binary(v0) => {
++ let mut formatter = formatter.debug_tuple("Binary");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Block(v0) => {
++ let mut formatter = formatter.debug_tuple("Block");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Box(v0) => {
++ let mut formatter = formatter.debug_tuple("Box");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Break(v0) => {
++ let mut formatter = formatter.debug_tuple("Break");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Call(v0) => {
++ let mut formatter = formatter.debug_tuple("Call");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Cast(v0) => {
++ let mut formatter = formatter.debug_tuple("Cast");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Closure(v0) => {
++ let mut formatter = formatter.debug_tuple("Closure");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Continue(v0) => {
++ let mut formatter = formatter.debug_tuple("Continue");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Field(v0) => {
++ let mut formatter = formatter.debug_tuple("Field");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::ForLoop(v0) => {
++ let mut formatter = formatter.debug_tuple("ForLoop");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Group(v0) => {
++ let mut formatter = formatter.debug_tuple("Group");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::If(v0) => {
++ let mut formatter = formatter.debug_tuple("If");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Index(v0) => {
++ let mut formatter = formatter.debug_tuple("Index");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Let(v0) => {
++ let mut formatter = formatter.debug_tuple("Let");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Lit(v0) => {
++ let mut formatter = formatter.debug_tuple("Lit");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Loop(v0) => {
++ let mut formatter = formatter.debug_tuple("Loop");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Match(v0) => {
++ let mut formatter = formatter.debug_tuple("Match");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::MethodCall(v0) => {
++ let mut formatter = formatter.debug_tuple("MethodCall");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Paren(v0) => {
++ let mut formatter = formatter.debug_tuple("Paren");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Path(v0) => {
++ let mut formatter = formatter.debug_tuple("Path");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Range(v0) => {
++ let mut formatter = formatter.debug_tuple("Range");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Reference(v0) => {
++ let mut formatter = formatter.debug_tuple("Reference");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Repeat(v0) => {
++ let mut formatter = formatter.debug_tuple("Repeat");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Return(v0) => {
++ let mut formatter = formatter.debug_tuple("Return");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Struct(v0) => {
++ let mut formatter = formatter.debug_tuple("Struct");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Try(v0) => {
++ let mut formatter = formatter.debug_tuple("Try");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::TryBlock(v0) => {
++ let mut formatter = formatter.debug_tuple("TryBlock");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Tuple(v0) => {
++ let mut formatter = formatter.debug_tuple("Tuple");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Unary(v0) => {
++ let mut formatter = formatter.debug_tuple("Unary");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Unsafe(v0) => {
++ let mut formatter = formatter.debug_tuple("Unsafe");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Expr::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::While(v0) => {
++ let mut formatter = formatter.debug_tuple("While");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ #[cfg(feature = "full")]
++ Expr::Yield(v0) => {
++ let mut formatter = formatter.debug_tuple("Yield");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprArray {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprArray");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("elems", &self.elems);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprAssign {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprAssign");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("left", &self.left);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("right", &self.right);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprAssignOp {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprAssignOp");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("left", &self.left);
++ formatter.field("op", &self.op);
++ formatter.field("right", &self.right);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprAsync {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprAsync");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("async_token", &self.async_token);
++ formatter.field("capture", &self.capture);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprAwait {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprAwait");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("base", &self.base);
++ formatter.field("dot_token", &self.dot_token);
++ formatter.field("await_token", &self.await_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprBinary {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprBinary");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("left", &self.left);
++ formatter.field("op", &self.op);
++ formatter.field("right", &self.right);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprBlock {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprBlock");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("label", &self.label);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprBox {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprBox");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("box_token", &self.box_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprBreak {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprBreak");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("break_token", &self.break_token);
++ formatter.field("label", &self.label);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprCall {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprCall");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("func", &self.func);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("args", &self.args);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprCast {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprCast");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("expr", &self.expr);
++ formatter.field("as_token", &self.as_token);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprClosure {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprClosure");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("asyncness", &self.asyncness);
++ formatter.field("movability", &self.movability);
++ formatter.field("capture", &self.capture);
++ formatter.field("or1_token", &self.or1_token);
++ formatter.field("inputs", &self.inputs);
++ formatter.field("or2_token", &self.or2_token);
++ formatter.field("output", &self.output);
++ formatter.field("body", &self.body);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprContinue {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprContinue");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("continue_token", &self.continue_token);
++ formatter.field("label", &self.label);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprField {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprField");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("base", &self.base);
++ formatter.field("dot_token", &self.dot_token);
++ formatter.field("member", &self.member);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprForLoop {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprForLoop");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("label", &self.label);
++ formatter.field("for_token", &self.for_token);
++ formatter.field("pat", &self.pat);
++ formatter.field("in_token", &self.in_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("body", &self.body);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprGroup {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprGroup");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("group_token", &self.group_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprIf {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprIf");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("if_token", &self.if_token);
++ formatter.field("cond", &self.cond);
++ formatter.field("then_branch", &self.then_branch);
++ formatter.field("else_branch", &self.else_branch);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprIndex {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprIndex");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("expr", &self.expr);
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("index", &self.index);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprLet {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprLet");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("let_token", &self.let_token);
++ formatter.field("pat", &self.pat);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprLit {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprLit");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("lit", &self.lit);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprLoop {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprLoop");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("label", &self.label);
++ formatter.field("loop_token", &self.loop_token);
++ formatter.field("body", &self.body);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("mac", &self.mac);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprMatch {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprMatch");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("match_token", &self.match_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("arms", &self.arms);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprMethodCall {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprMethodCall");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("receiver", &self.receiver);
++ formatter.field("dot_token", &self.dot_token);
++ formatter.field("method", &self.method);
++ formatter.field("turbofish", &self.turbofish);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("args", &self.args);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprParen {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprParen");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprPath {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprPath");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("qself", &self.qself);
++ formatter.field("path", &self.path);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprRange {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprRange");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("from", &self.from);
++ formatter.field("limits", &self.limits);
++ formatter.field("to", &self.to);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprReference {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprReference");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("and_token", &self.and_token);
++ formatter.field("raw", &self.raw);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprRepeat {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprRepeat");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.field("len", &self.len);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprReturn {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprReturn");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("return_token", &self.return_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprStruct {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprStruct");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("path", &self.path);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("fields", &self.fields);
++ formatter.field("dot2_token", &self.dot2_token);
++ formatter.field("rest", &self.rest);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprTry {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprTry");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("expr", &self.expr);
++ formatter.field("question_token", &self.question_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprTryBlock {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprTryBlock");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("try_token", &self.try_token);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprTuple {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprTuple");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("elems", &self.elems);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("expr", &self.expr);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ExprUnary {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprUnary");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("op", &self.op);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprUnsafe {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprUnsafe");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("unsafe_token", &self.unsafe_token);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprWhile {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprWhile");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("label", &self.label);
++ formatter.field("while_token", &self.while_token);
++ formatter.field("cond", &self.cond);
++ formatter.field("body", &self.body);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ExprYield {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ExprYield");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("yield_token", &self.yield_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Field {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Field");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for FieldPat {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("FieldPat");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("member", &self.member);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("pat", &self.pat);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for FieldValue {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("FieldValue");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("member", &self.member);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Fields {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Fields::Named(v0) => {
++ let mut formatter = formatter.debug_tuple("Named");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Fields::Unnamed(v0) => {
++ let mut formatter = formatter.debug_tuple("Unnamed");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Fields::Unit => formatter.write_str("Unit"),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for FieldsNamed {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("FieldsNamed");
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("named", &self.named);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for FieldsUnnamed {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("FieldsUnnamed");
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("unnamed", &self.unnamed);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for File {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("File");
++ formatter.field("shebang", &self.shebang);
++ formatter.field("attrs", &self.attrs);
++ formatter.field("items", &self.items);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for FnArg {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ FnArg::Receiver(v0) => {
++ let mut formatter = formatter.debug_tuple("Receiver");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ FnArg::Typed(v0) => {
++ let mut formatter = formatter.debug_tuple("Typed");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ForeignItem {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ ForeignItem::Fn(v0) => {
++ let mut formatter = formatter.debug_tuple("Fn");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ForeignItem::Static(v0) => {
++ let mut formatter = formatter.debug_tuple("Static");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ForeignItem::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ForeignItem::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ForeignItem::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ForeignItemFn {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ForeignItemFn");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("sig", &self.sig);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ForeignItemMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ForeignItemMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("mac", &self.mac);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ForeignItemStatic {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ForeignItemStatic");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("static_token", &self.static_token);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ForeignItemType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ForeignItemType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("type_token", &self.type_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for GenericArgument {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ GenericArgument::Lifetime(v0) => {
++ let mut formatter = formatter.debug_tuple("Lifetime");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericArgument::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericArgument::Binding(v0) => {
++ let mut formatter = formatter.debug_tuple("Binding");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericArgument::Constraint(v0) => {
++ let mut formatter = formatter.debug_tuple("Constraint");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericArgument::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for GenericMethodArgument {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ GenericMethodArgument::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericMethodArgument::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for GenericParam {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ GenericParam::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericParam::Lifetime(v0) => {
++ let mut formatter = formatter.debug_tuple("Lifetime");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ GenericParam::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Generics {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Generics");
++ formatter.field("lt_token", &self.lt_token);
++ formatter.field("params", &self.params);
++ formatter.field("gt_token", &self.gt_token);
++ formatter.field("where_clause", &self.where_clause);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ImplItem {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ ImplItem::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ImplItem::Method(v0) => {
++ let mut formatter = formatter.debug_tuple("Method");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ImplItem::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ImplItem::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ ImplItem::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ImplItemConst {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ImplItemConst");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("defaultness", &self.defaultness);
++ formatter.field("const_token", &self.const_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ImplItemMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ImplItemMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("mac", &self.mac);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ImplItemMethod {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ImplItemMethod");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("defaultness", &self.defaultness);
++ formatter.field("sig", &self.sig);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ImplItemType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ImplItemType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("defaultness", &self.defaultness);
++ formatter.field("type_token", &self.type_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Index {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Index");
++ formatter.field("index", &self.index);
++ formatter.field("span", &self.span);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Item {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Item::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Enum(v0) => {
++ let mut formatter = formatter.debug_tuple("Enum");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::ExternCrate(v0) => {
++ let mut formatter = formatter.debug_tuple("ExternCrate");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Fn(v0) => {
++ let mut formatter = formatter.debug_tuple("Fn");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::ForeignMod(v0) => {
++ let mut formatter = formatter.debug_tuple("ForeignMod");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Impl(v0) => {
++ let mut formatter = formatter.debug_tuple("Impl");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Macro2(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro2");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Mod(v0) => {
++ let mut formatter = formatter.debug_tuple("Mod");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Static(v0) => {
++ let mut formatter = formatter.debug_tuple("Static");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Struct(v0) => {
++ let mut formatter = formatter.debug_tuple("Struct");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Trait(v0) => {
++ let mut formatter = formatter.debug_tuple("Trait");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::TraitAlias(v0) => {
++ let mut formatter = formatter.debug_tuple("TraitAlias");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Union(v0) => {
++ let mut formatter = formatter.debug_tuple("Union");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Use(v0) => {
++ let mut formatter = formatter.debug_tuple("Use");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Item::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemConst {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemConst");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("const_token", &self.const_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemEnum {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemEnum");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("enum_token", &self.enum_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("variants", &self.variants);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemExternCrate {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemExternCrate");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("extern_token", &self.extern_token);
++ formatter.field("crate_token", &self.crate_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("rename", &self.rename);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemFn {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemFn");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("sig", &self.sig);
++ formatter.field("block", &self.block);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemForeignMod {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemForeignMod");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("abi", &self.abi);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("items", &self.items);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemImpl {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemImpl");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("defaultness", &self.defaultness);
++ formatter.field("unsafety", &self.unsafety);
++ formatter.field("impl_token", &self.impl_token);
++ formatter.field("generics", &self.generics);
++ formatter.field("trait_", &self.trait_);
++ formatter.field("self_ty", &self.self_ty);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("items", &self.items);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("ident", &self.ident);
++ formatter.field("mac", &self.mac);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemMacro2 {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemMacro2");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("macro_token", &self.macro_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("rules", &self.rules);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemMod {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemMod");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("mod_token", &self.mod_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("content", &self.content);
++ formatter.field("semi", &self.semi);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemStatic {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemStatic");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("static_token", &self.static_token);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("expr", &self.expr);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemStruct {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemStruct");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("struct_token", &self.struct_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("fields", &self.fields);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemTrait {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemTrait");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("unsafety", &self.unsafety);
++ formatter.field("auto_token", &self.auto_token);
++ formatter.field("trait_token", &self.trait_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("supertraits", &self.supertraits);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("items", &self.items);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemTraitAlias {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemTraitAlias");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("trait_token", &self.trait_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("type_token", &self.type_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemUnion {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemUnion");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("union_token", &self.union_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("fields", &self.fields);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for ItemUse {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ItemUse");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("vis", &self.vis);
++ formatter.field("use_token", &self.use_token);
++ formatter.field("leading_colon", &self.leading_colon);
++ formatter.field("tree", &self.tree);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Label {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Label");
++ formatter.field("name", &self.name);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.finish()
++ }
++}
++impl Debug for Lifetime {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Lifetime");
++ formatter.field("apostrophe", &self.apostrophe);
++ formatter.field("ident", &self.ident);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for LifetimeDef {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("LifetimeDef");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("lifetime", &self.lifetime);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++impl Debug for Lit {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Lit::Str(v0) => {
++ let mut formatter = formatter.debug_tuple("Str");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::ByteStr(v0) => {
++ let mut formatter = formatter.debug_tuple("ByteStr");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Byte(v0) => {
++ let mut formatter = formatter.debug_tuple("Byte");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Char(v0) => {
++ let mut formatter = formatter.debug_tuple("Char");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Int(v0) => {
++ let mut formatter = formatter.debug_tuple("Int");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Float(v0) => {
++ let mut formatter = formatter.debug_tuple("Float");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Bool(v0) => {
++ let mut formatter = formatter.debug_tuple("Bool");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Lit::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Local {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Local");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("let_token", &self.let_token);
++ formatter.field("pat", &self.pat);
++ formatter.field("init", &self.init);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Macro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Macro");
++ formatter.field("path", &self.path);
++ formatter.field("bang_token", &self.bang_token);
++ formatter.field("delimiter", &self.delimiter);
++ formatter.field("tokens", &self.tokens);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for MacroDelimiter {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ MacroDelimiter::Paren(v0) => {
++ let mut formatter = formatter.debug_tuple("Paren");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ MacroDelimiter::Brace(v0) => {
++ let mut formatter = formatter.debug_tuple("Brace");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ MacroDelimiter::Bracket(v0) => {
++ let mut formatter = formatter.debug_tuple("Bracket");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Member {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Member::Named(v0) => {
++ let mut formatter = formatter.debug_tuple("Named");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Member::Unnamed(v0) => {
++ let mut formatter = formatter.debug_tuple("Unnamed");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Meta {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Meta::Path(v0) => {
++ let mut formatter = formatter.debug_tuple("Path");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Meta::List(v0) => {
++ let mut formatter = formatter.debug_tuple("List");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Meta::NameValue(v0) => {
++ let mut formatter = formatter.debug_tuple("NameValue");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for MetaList {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("MetaList");
++ formatter.field("path", &self.path);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("nested", &self.nested);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for MetaNameValue {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("MetaNameValue");
++ formatter.field("path", &self.path);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("lit", &self.lit);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for MethodTurbofish {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("MethodTurbofish");
++ formatter.field("colon2_token", &self.colon2_token);
++ formatter.field("lt_token", &self.lt_token);
++ formatter.field("args", &self.args);
++ formatter.field("gt_token", &self.gt_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for NestedMeta {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ NestedMeta::Meta(v0) => {
++ let mut formatter = formatter.debug_tuple("Meta");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ NestedMeta::Lit(v0) => {
++ let mut formatter = formatter.debug_tuple("Lit");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ParenthesizedGenericArguments {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("ParenthesizedGenericArguments");
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("inputs", &self.inputs);
++ formatter.field("output", &self.output);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Pat {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Pat::Box(v0) => {
++ let mut formatter = formatter.debug_tuple("Box");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Ident(v0) => {
++ let mut formatter = formatter.debug_tuple("Ident");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Lit(v0) => {
++ let mut formatter = formatter.debug_tuple("Lit");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Or(v0) => {
++ let mut formatter = formatter.debug_tuple("Or");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Path(v0) => {
++ let mut formatter = formatter.debug_tuple("Path");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Range(v0) => {
++ let mut formatter = formatter.debug_tuple("Range");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Reference(v0) => {
++ let mut formatter = formatter.debug_tuple("Reference");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Rest(v0) => {
++ let mut formatter = formatter.debug_tuple("Rest");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Slice(v0) => {
++ let mut formatter = formatter.debug_tuple("Slice");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Struct(v0) => {
++ let mut formatter = formatter.debug_tuple("Struct");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Tuple(v0) => {
++ let mut formatter = formatter.debug_tuple("Tuple");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::TupleStruct(v0) => {
++ let mut formatter = formatter.debug_tuple("TupleStruct");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Pat::Wild(v0) => {
++ let mut formatter = formatter.debug_tuple("Wild");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatBox {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatBox");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("box_token", &self.box_token);
++ formatter.field("pat", &self.pat);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatIdent {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatIdent");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("by_ref", &self.by_ref);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("ident", &self.ident);
++ formatter.field("subpat", &self.subpat);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatLit {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatLit");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("expr", &self.expr);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("mac", &self.mac);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatOr {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatOr");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("leading_vert", &self.leading_vert);
++ formatter.field("cases", &self.cases);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatPath {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatPath");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("qself", &self.qself);
++ formatter.field("path", &self.path);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatRange {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatRange");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("lo", &self.lo);
++ formatter.field("limits", &self.limits);
++ formatter.field("hi", &self.hi);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatReference {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatReference");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("and_token", &self.and_token);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("pat", &self.pat);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatRest {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatRest");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("dot2_token", &self.dot2_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatSlice {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatSlice");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("elems", &self.elems);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatStruct {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatStruct");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("path", &self.path);
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("fields", &self.fields);
++ formatter.field("dot2_token", &self.dot2_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatTuple {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatTuple");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("elems", &self.elems);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatTupleStruct {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatTupleStruct");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("path", &self.path);
++ formatter.field("pat", &self.pat);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("pat", &self.pat);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for PatWild {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PatWild");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("underscore_token", &self.underscore_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Path {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Path");
++ formatter.field("leading_colon", &self.leading_colon);
++ formatter.field("segments", &self.segments);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for PathArguments {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ PathArguments::None => formatter.write_str("None"),
++ PathArguments::AngleBracketed(v0) => {
++ let mut formatter = formatter.debug_tuple("AngleBracketed");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ PathArguments::Parenthesized(v0) => {
++ let mut formatter = formatter.debug_tuple("Parenthesized");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for PathSegment {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PathSegment");
++ formatter.field("ident", &self.ident);
++ formatter.field("arguments", &self.arguments);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for PredicateEq {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PredicateEq");
++ formatter.field("lhs_ty", &self.lhs_ty);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("rhs_ty", &self.rhs_ty);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for PredicateLifetime {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PredicateLifetime");
++ formatter.field("lifetime", &self.lifetime);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for PredicateType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("PredicateType");
++ formatter.field("lifetimes", &self.lifetimes);
++ formatter.field("bounded_ty", &self.bounded_ty);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for QSelf {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("QSelf");
++ formatter.field("lt_token", &self.lt_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("position", &self.position);
++ formatter.field("as_token", &self.as_token);
++ formatter.field("gt_token", &self.gt_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for RangeLimits {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ RangeLimits::HalfOpen(v0) => {
++ let mut formatter = formatter.debug_tuple("HalfOpen");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ RangeLimits::Closed(v0) => {
++ let mut formatter = formatter.debug_tuple("Closed");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Receiver {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Receiver");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("reference", &self.reference);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("self_token", &self.self_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for ReturnType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ ReturnType::Default => formatter.write_str("Default"),
++ ReturnType::Type(v0, v1) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.field(v1);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Signature {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Signature");
++ formatter.field("constness", &self.constness);
++ formatter.field("asyncness", &self.asyncness);
++ formatter.field("unsafety", &self.unsafety);
++ formatter.field("abi", &self.abi);
++ formatter.field("fn_token", &self.fn_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("inputs", &self.inputs);
++ formatter.field("variadic", &self.variadic);
++ formatter.field("output", &self.output);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for Stmt {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Stmt::Local(v0) => {
++ let mut formatter = formatter.debug_tuple("Local");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Stmt::Item(v0) => {
++ let mut formatter = formatter.debug_tuple("Item");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Stmt::Expr(v0) => {
++ let mut formatter = formatter.debug_tuple("Expr");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Stmt::Semi(v0, v1) => {
++ let mut formatter = formatter.debug_tuple("Semi");
++ formatter.field(v0);
++ formatter.field(v1);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TraitBound {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TraitBound");
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("modifier", &self.modifier);
++ formatter.field("lifetimes", &self.lifetimes);
++ formatter.field("path", &self.path);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TraitBoundModifier {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ TraitBoundModifier::None => formatter.write_str("None"),
++ TraitBoundModifier::Maybe(v0) => {
++ let mut formatter = formatter.debug_tuple("Maybe");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for TraitItem {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ TraitItem::Const(v0) => {
++ let mut formatter = formatter.debug_tuple("Const");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ TraitItem::Method(v0) => {
++ let mut formatter = formatter.debug_tuple("Method");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ TraitItem::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ TraitItem::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ TraitItem::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for TraitItemConst {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TraitItemConst");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("const_token", &self.const_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("ty", &self.ty);
++ formatter.field("default", &self.default);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for TraitItemMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TraitItemMacro");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("mac", &self.mac);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for TraitItemMethod {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TraitItemMethod");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("sig", &self.sig);
++ formatter.field("default", &self.default);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for TraitItemType {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TraitItemType");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("type_token", &self.type_token);
++ formatter.field("ident", &self.ident);
++ formatter.field("generics", &self.generics);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.field("default", &self.default);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Type {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Type::Array(v0) => {
++ let mut formatter = formatter.debug_tuple("Array");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::BareFn(v0) => {
++ let mut formatter = formatter.debug_tuple("BareFn");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Group(v0) => {
++ let mut formatter = formatter.debug_tuple("Group");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::ImplTrait(v0) => {
++ let mut formatter = formatter.debug_tuple("ImplTrait");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Infer(v0) => {
++ let mut formatter = formatter.debug_tuple("Infer");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Macro(v0) => {
++ let mut formatter = formatter.debug_tuple("Macro");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Never(v0) => {
++ let mut formatter = formatter.debug_tuple("Never");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Paren(v0) => {
++ let mut formatter = formatter.debug_tuple("Paren");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Path(v0) => {
++ let mut formatter = formatter.debug_tuple("Path");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Ptr(v0) => {
++ let mut formatter = formatter.debug_tuple("Ptr");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Reference(v0) => {
++ let mut formatter = formatter.debug_tuple("Reference");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Slice(v0) => {
++ let mut formatter = formatter.debug_tuple("Slice");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::TraitObject(v0) => {
++ let mut formatter = formatter.debug_tuple("TraitObject");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Tuple(v0) => {
++ let mut formatter = formatter.debug_tuple("Tuple");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Type::Verbatim(v0) => {
++ let mut formatter = formatter.debug_tuple("Verbatim");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeArray {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeArray");
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("elem", &self.elem);
++ formatter.field("semi_token", &self.semi_token);
++ formatter.field("len", &self.len);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeBareFn {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeBareFn");
++ formatter.field("lifetimes", &self.lifetimes);
++ formatter.field("unsafety", &self.unsafety);
++ formatter.field("abi", &self.abi);
++ formatter.field("fn_token", &self.fn_token);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("inputs", &self.inputs);
++ formatter.field("variadic", &self.variadic);
++ formatter.field("output", &self.output);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeGroup {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeGroup");
++ formatter.field("group_token", &self.group_token);
++ formatter.field("elem", &self.elem);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeImplTrait {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeImplTrait");
++ formatter.field("impl_token", &self.impl_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeInfer {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeInfer");
++ formatter.field("underscore_token", &self.underscore_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeMacro {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeMacro");
++ formatter.field("mac", &self.mac);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeNever {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeNever");
++ formatter.field("bang_token", &self.bang_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeParam {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeParam");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("ident", &self.ident);
++ formatter.field("colon_token", &self.colon_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.field("eq_token", &self.eq_token);
++ formatter.field("default", &self.default);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeParamBound {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ TypeParamBound::Trait(v0) => {
++ let mut formatter = formatter.debug_tuple("Trait");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ TypeParamBound::Lifetime(v0) => {
++ let mut formatter = formatter.debug_tuple("Lifetime");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeParen {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeParen");
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("elem", &self.elem);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypePath {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypePath");
++ formatter.field("qself", &self.qself);
++ formatter.field("path", &self.path);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypePtr {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypePtr");
++ formatter.field("star_token", &self.star_token);
++ formatter.field("const_token", &self.const_token);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("elem", &self.elem);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeReference {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeReference");
++ formatter.field("and_token", &self.and_token);
++ formatter.field("lifetime", &self.lifetime);
++ formatter.field("mutability", &self.mutability);
++ formatter.field("elem", &self.elem);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeSlice {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeSlice");
++ formatter.field("bracket_token", &self.bracket_token);
++ formatter.field("elem", &self.elem);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeTraitObject {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeTraitObject");
++ formatter.field("dyn_token", &self.dyn_token);
++ formatter.field("bounds", &self.bounds);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for TypeTuple {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("TypeTuple");
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("elems", &self.elems);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for UnOp {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ UnOp::Deref(v0) => {
++ let mut formatter = formatter.debug_tuple("Deref");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UnOp::Not(v0) => {
++ let mut formatter = formatter.debug_tuple("Not");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UnOp::Neg(v0) => {
++ let mut formatter = formatter.debug_tuple("Neg");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UseGlob {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("UseGlob");
++ formatter.field("star_token", &self.star_token);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UseGroup {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("UseGroup");
++ formatter.field("brace_token", &self.brace_token);
++ formatter.field("items", &self.items);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UseName {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("UseName");
++ formatter.field("ident", &self.ident);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UsePath {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("UsePath");
++ formatter.field("ident", &self.ident);
++ formatter.field("colon2_token", &self.colon2_token);
++ formatter.field("tree", &self.tree);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UseRename {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("UseRename");
++ formatter.field("ident", &self.ident);
++ formatter.field("as_token", &self.as_token);
++ formatter.field("rename", &self.rename);
++ formatter.finish()
++ }
++}
++#[cfg(feature = "full")]
++impl Debug for UseTree {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ UseTree::Path(v0) => {
++ let mut formatter = formatter.debug_tuple("Path");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UseTree::Name(v0) => {
++ let mut formatter = formatter.debug_tuple("Name");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UseTree::Rename(v0) => {
++ let mut formatter = formatter.debug_tuple("Rename");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UseTree::Glob(v0) => {
++ let mut formatter = formatter.debug_tuple("Glob");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ UseTree::Group(v0) => {
++ let mut formatter = formatter.debug_tuple("Group");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Variadic {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Variadic");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("dots", &self.dots);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Variant {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("Variant");
++ formatter.field("attrs", &self.attrs);
++ formatter.field("ident", &self.ident);
++ formatter.field("fields", &self.fields);
++ formatter.field("discriminant", &self.discriminant);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for VisCrate {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("VisCrate");
++ formatter.field("crate_token", &self.crate_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for VisPublic {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("VisPublic");
++ formatter.field("pub_token", &self.pub_token);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for VisRestricted {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("VisRestricted");
++ formatter.field("pub_token", &self.pub_token);
++ formatter.field("paren_token", &self.paren_token);
++ formatter.field("in_token", &self.in_token);
++ formatter.field("path", &self.path);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for Visibility {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ Visibility::Public(v0) => {
++ let mut formatter = formatter.debug_tuple("Public");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Visibility::Crate(v0) => {
++ let mut formatter = formatter.debug_tuple("Crate");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Visibility::Restricted(v0) => {
++ let mut formatter = formatter.debug_tuple("Restricted");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ Visibility::Inherited => formatter.write_str("Inherited"),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for WhereClause {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ let mut formatter = formatter.debug_struct("WhereClause");
++ formatter.field("where_token", &self.where_token);
++ formatter.field("predicates", &self.predicates);
++ formatter.finish()
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Debug for WherePredicate {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ match self {
++ WherePredicate::Type(v0) => {
++ let mut formatter = formatter.debug_tuple("Type");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ WherePredicate::Lifetime(v0) => {
++ let mut formatter = formatter.debug_tuple("Lifetime");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ WherePredicate::Eq(v0) => {
++ let mut formatter = formatter.debug_tuple("Eq");
++ formatter.field(v0);
++ formatter.finish()
++ }
++ }
++ }
++}
+diff --git a/third_party/rust/syn/src/gen/eq.rs b/third_party/rust/syn/src/gen/eq.rs
+new file mode 100644
+index 0000000000..15b2bcbbde
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/gen/eq.rs
+@@ -0,0 +1,1930 @@
++// This file is @generated by syn-internal-codegen.
++// It is not intended for manual editing.
++
++#[cfg(any(feature = "derive", feature = "full"))]
++use crate::tt::TokenStreamHelper;
++use crate::*;
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Abi {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Abi {
++ fn eq(&self, other: &Self) -> bool {
++ self.name == other.name
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for AngleBracketedGenericArguments {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for AngleBracketedGenericArguments {
++ fn eq(&self, other: &Self) -> bool {
++ self.colon2_token == other.colon2_token && self.args == other.args
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Arm {}
++#[cfg(feature = "full")]
++impl PartialEq for Arm {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.pat == other.pat
++ && self.guard == other.guard
++ && self.body == other.body
++ && self.comma == other.comma
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for AttrStyle {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for AttrStyle {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (AttrStyle::Outer, AttrStyle::Outer) => true,
++ (AttrStyle::Inner(_), AttrStyle::Inner(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Attribute {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Attribute {
++ fn eq(&self, other: &Self) -> bool {
++ self.style == other.style
++ && self.path == other.path
++ && TokenStreamHelper(&self.tokens) == TokenStreamHelper(&other.tokens)
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for BareFnArg {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for BareFnArg {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.name == other.name && self.ty == other.ty
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for BinOp {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for BinOp {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (BinOp::Add(_), BinOp::Add(_)) => true,
++ (BinOp::Sub(_), BinOp::Sub(_)) => true,
++ (BinOp::Mul(_), BinOp::Mul(_)) => true,
++ (BinOp::Div(_), BinOp::Div(_)) => true,
++ (BinOp::Rem(_), BinOp::Rem(_)) => true,
++ (BinOp::And(_), BinOp::And(_)) => true,
++ (BinOp::Or(_), BinOp::Or(_)) => true,
++ (BinOp::BitXor(_), BinOp::BitXor(_)) => true,
++ (BinOp::BitAnd(_), BinOp::BitAnd(_)) => true,
++ (BinOp::BitOr(_), BinOp::BitOr(_)) => true,
++ (BinOp::Shl(_), BinOp::Shl(_)) => true,
++ (BinOp::Shr(_), BinOp::Shr(_)) => true,
++ (BinOp::Eq(_), BinOp::Eq(_)) => true,
++ (BinOp::Lt(_), BinOp::Lt(_)) => true,
++ (BinOp::Le(_), BinOp::Le(_)) => true,
++ (BinOp::Ne(_), BinOp::Ne(_)) => true,
++ (BinOp::Ge(_), BinOp::Ge(_)) => true,
++ (BinOp::Gt(_), BinOp::Gt(_)) => true,
++ (BinOp::AddEq(_), BinOp::AddEq(_)) => true,
++ (BinOp::SubEq(_), BinOp::SubEq(_)) => true,
++ (BinOp::MulEq(_), BinOp::MulEq(_)) => true,
++ (BinOp::DivEq(_), BinOp::DivEq(_)) => true,
++ (BinOp::RemEq(_), BinOp::RemEq(_)) => true,
++ (BinOp::BitXorEq(_), BinOp::BitXorEq(_)) => true,
++ (BinOp::BitAndEq(_), BinOp::BitAndEq(_)) => true,
++ (BinOp::BitOrEq(_), BinOp::BitOrEq(_)) => true,
++ (BinOp::ShlEq(_), BinOp::ShlEq(_)) => true,
++ (BinOp::ShrEq(_), BinOp::ShrEq(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Binding {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Binding {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Block {}
++#[cfg(feature = "full")]
++impl PartialEq for Block {
++ fn eq(&self, other: &Self) -> bool {
++ self.stmts == other.stmts
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for BoundLifetimes {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for BoundLifetimes {
++ fn eq(&self, other: &Self) -> bool {
++ self.lifetimes == other.lifetimes
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ConstParam {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ConstParam {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.ty == other.ty
++ && self.eq_token == other.eq_token
++ && self.default == other.default
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Constraint {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Constraint {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident && self.bounds == other.bounds
++ }
++}
++#[cfg(feature = "derive")]
++impl Eq for Data {}
++#[cfg(feature = "derive")]
++impl PartialEq for Data {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Data::Struct(self0), Data::Struct(other0)) => self0 == other0,
++ (Data::Enum(self0), Data::Enum(other0)) => self0 == other0,
++ (Data::Union(self0), Data::Union(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Eq for DataEnum {}
++#[cfg(feature = "derive")]
++impl PartialEq for DataEnum {
++ fn eq(&self, other: &Self) -> bool {
++ self.variants == other.variants
++ }
++}
++#[cfg(feature = "derive")]
++impl Eq for DataStruct {}
++#[cfg(feature = "derive")]
++impl PartialEq for DataStruct {
++ fn eq(&self, other: &Self) -> bool {
++ self.fields == other.fields && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "derive")]
++impl Eq for DataUnion {}
++#[cfg(feature = "derive")]
++impl PartialEq for DataUnion {
++ fn eq(&self, other: &Self) -> bool {
++ self.fields == other.fields
++ }
++}
++#[cfg(feature = "derive")]
++impl Eq for DeriveInput {}
++#[cfg(feature = "derive")]
++impl PartialEq for DeriveInput {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.data == other.data
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Expr {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Expr {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ #[cfg(feature = "full")]
++ (Expr::Array(self0), Expr::Array(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Assign(self0), Expr::Assign(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::AssignOp(self0), Expr::AssignOp(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Async(self0), Expr::Async(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Await(self0), Expr::Await(other0)) => self0 == other0,
++ (Expr::Binary(self0), Expr::Binary(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Block(self0), Expr::Block(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Box(self0), Expr::Box(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Break(self0), Expr::Break(other0)) => self0 == other0,
++ (Expr::Call(self0), Expr::Call(other0)) => self0 == other0,
++ (Expr::Cast(self0), Expr::Cast(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Closure(self0), Expr::Closure(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Continue(self0), Expr::Continue(other0)) => self0 == other0,
++ (Expr::Field(self0), Expr::Field(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::ForLoop(self0), Expr::ForLoop(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Group(self0), Expr::Group(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::If(self0), Expr::If(other0)) => self0 == other0,
++ (Expr::Index(self0), Expr::Index(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Let(self0), Expr::Let(other0)) => self0 == other0,
++ (Expr::Lit(self0), Expr::Lit(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Loop(self0), Expr::Loop(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Macro(self0), Expr::Macro(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Match(self0), Expr::Match(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::MethodCall(self0), Expr::MethodCall(other0)) => self0 == other0,
++ (Expr::Paren(self0), Expr::Paren(other0)) => self0 == other0,
++ (Expr::Path(self0), Expr::Path(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Range(self0), Expr::Range(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Reference(self0), Expr::Reference(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Repeat(self0), Expr::Repeat(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Return(self0), Expr::Return(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Struct(self0), Expr::Struct(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Try(self0), Expr::Try(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::TryBlock(self0), Expr::TryBlock(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Tuple(self0), Expr::Tuple(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Type(self0), Expr::Type(other0)) => self0 == other0,
++ (Expr::Unary(self0), Expr::Unary(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Unsafe(self0), Expr::Unsafe(other0)) => self0 == other0,
++ (Expr::Verbatim(self0), Expr::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ #[cfg(feature = "full")]
++ (Expr::While(self0), Expr::While(other0)) => self0 == other0,
++ #[cfg(feature = "full")]
++ (Expr::Yield(self0), Expr::Yield(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprArray {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprArray {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.elems == other.elems
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprAssign {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprAssign {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.left == other.left && self.right == other.right
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprAssignOp {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprAssignOp {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.left == other.left
++ && self.op == other.op
++ && self.right == other.right
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprAsync {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprAsync {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.capture == other.capture && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprAwait {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprAwait {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.base == other.base
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprBinary {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprBinary {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.left == other.left
++ && self.op == other.op
++ && self.right == other.right
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprBlock {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprBlock {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.label == other.label && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprBox {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprBox {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprBreak {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprBreak {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.label == other.label && self.expr == other.expr
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprCall {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprCall {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.func == other.func && self.args == other.args
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprCast {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprCast {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprClosure {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprClosure {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.asyncness == other.asyncness
++ && self.movability == other.movability
++ && self.capture == other.capture
++ && self.inputs == other.inputs
++ && self.output == other.output
++ && self.body == other.body
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprContinue {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprContinue {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.label == other.label
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprField {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprField {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.base == other.base && self.member == other.member
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprForLoop {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprForLoop {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.label == other.label
++ && self.pat == other.pat
++ && self.expr == other.expr
++ && self.body == other.body
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprGroup {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprGroup {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprIf {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprIf {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.cond == other.cond
++ && self.then_branch == other.then_branch
++ && self.else_branch == other.else_branch
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprIndex {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprIndex {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr && self.index == other.index
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprLet {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprLet {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.pat == other.pat && self.expr == other.expr
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprLit {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprLit {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.lit == other.lit
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprLoop {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprLoop {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.label == other.label && self.body == other.body
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mac == other.mac
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprMatch {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprMatch {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr && self.arms == other.arms
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprMethodCall {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprMethodCall {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.receiver == other.receiver
++ && self.method == other.method
++ && self.turbofish == other.turbofish
++ && self.args == other.args
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprParen {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprParen {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprPath {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprPath {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.qself == other.qself && self.path == other.path
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprRange {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprRange {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.from == other.from
++ && self.limits == other.limits
++ && self.to == other.to
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprReference {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprReference {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mutability == other.mutability && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprRepeat {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprRepeat {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr && self.len == other.len
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprReturn {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprReturn {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprStruct {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprStruct {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.path == other.path
++ && self.fields == other.fields
++ && self.dot2_token == other.dot2_token
++ && self.rest == other.rest
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprTry {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprTry {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprTryBlock {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprTryBlock {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprTuple {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprTuple {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.elems == other.elems
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprType {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr && self.ty == other.ty
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ExprUnary {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ExprUnary {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.op == other.op && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprUnsafe {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprUnsafe {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprWhile {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprWhile {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.label == other.label
++ && self.cond == other.cond
++ && self.body == other.body
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ExprYield {}
++#[cfg(feature = "full")]
++impl PartialEq for ExprYield {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Field {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Field {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.colon_token == other.colon_token
++ && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for FieldPat {}
++#[cfg(feature = "full")]
++impl PartialEq for FieldPat {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.member == other.member
++ && self.colon_token == other.colon_token
++ && self.pat == other.pat
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for FieldValue {}
++#[cfg(feature = "full")]
++impl PartialEq for FieldValue {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.member == other.member
++ && self.colon_token == other.colon_token
++ && self.expr == other.expr
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Fields {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Fields {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Fields::Named(self0), Fields::Named(other0)) => self0 == other0,
++ (Fields::Unnamed(self0), Fields::Unnamed(other0)) => self0 == other0,
++ (Fields::Unit, Fields::Unit) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for FieldsNamed {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for FieldsNamed {
++ fn eq(&self, other: &Self) -> bool {
++ self.named == other.named
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for FieldsUnnamed {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for FieldsUnnamed {
++ fn eq(&self, other: &Self) -> bool {
++ self.unnamed == other.unnamed
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for File {}
++#[cfg(feature = "full")]
++impl PartialEq for File {
++ fn eq(&self, other: &Self) -> bool {
++ self.shebang == other.shebang && self.attrs == other.attrs && self.items == other.items
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for FnArg {}
++#[cfg(feature = "full")]
++impl PartialEq for FnArg {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (FnArg::Receiver(self0), FnArg::Receiver(other0)) => self0 == other0,
++ (FnArg::Typed(self0), FnArg::Typed(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ForeignItem {}
++#[cfg(feature = "full")]
++impl PartialEq for ForeignItem {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (ForeignItem::Fn(self0), ForeignItem::Fn(other0)) => self0 == other0,
++ (ForeignItem::Static(self0), ForeignItem::Static(other0)) => self0 == other0,
++ (ForeignItem::Type(self0), ForeignItem::Type(other0)) => self0 == other0,
++ (ForeignItem::Macro(self0), ForeignItem::Macro(other0)) => self0 == other0,
++ (ForeignItem::Verbatim(self0), ForeignItem::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ForeignItemFn {}
++#[cfg(feature = "full")]
++impl PartialEq for ForeignItemFn {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.vis == other.vis && self.sig == other.sig
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ForeignItemMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for ForeignItemMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mac == other.mac && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ForeignItemStatic {}
++#[cfg(feature = "full")]
++impl PartialEq for ForeignItemStatic {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.mutability == other.mutability
++ && self.ident == other.ident
++ && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ForeignItemType {}
++#[cfg(feature = "full")]
++impl PartialEq for ForeignItemType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.vis == other.vis && self.ident == other.ident
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for GenericArgument {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for GenericArgument {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (GenericArgument::Lifetime(self0), GenericArgument::Lifetime(other0)) => {
++ self0 == other0
++ }
++ (GenericArgument::Type(self0), GenericArgument::Type(other0)) => self0 == other0,
++ (GenericArgument::Binding(self0), GenericArgument::Binding(other0)) => self0 == other0,
++ (GenericArgument::Constraint(self0), GenericArgument::Constraint(other0)) => {
++ self0 == other0
++ }
++ (GenericArgument::Const(self0), GenericArgument::Const(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for GenericMethodArgument {}
++#[cfg(feature = "full")]
++impl PartialEq for GenericMethodArgument {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (GenericMethodArgument::Type(self0), GenericMethodArgument::Type(other0)) => {
++ self0 == other0
++ }
++ (GenericMethodArgument::Const(self0), GenericMethodArgument::Const(other0)) => {
++ self0 == other0
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for GenericParam {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for GenericParam {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (GenericParam::Type(self0), GenericParam::Type(other0)) => self0 == other0,
++ (GenericParam::Lifetime(self0), GenericParam::Lifetime(other0)) => self0 == other0,
++ (GenericParam::Const(self0), GenericParam::Const(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Generics {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Generics {
++ fn eq(&self, other: &Self) -> bool {
++ self.lt_token == other.lt_token
++ && self.params == other.params
++ && self.gt_token == other.gt_token
++ && self.where_clause == other.where_clause
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ImplItem {}
++#[cfg(feature = "full")]
++impl PartialEq for ImplItem {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (ImplItem::Const(self0), ImplItem::Const(other0)) => self0 == other0,
++ (ImplItem::Method(self0), ImplItem::Method(other0)) => self0 == other0,
++ (ImplItem::Type(self0), ImplItem::Type(other0)) => self0 == other0,
++ (ImplItem::Macro(self0), ImplItem::Macro(other0)) => self0 == other0,
++ (ImplItem::Verbatim(self0), ImplItem::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ImplItemConst {}
++#[cfg(feature = "full")]
++impl PartialEq for ImplItemConst {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.defaultness == other.defaultness
++ && self.ident == other.ident
++ && self.ty == other.ty
++ && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ImplItemMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for ImplItemMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mac == other.mac && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ImplItemMethod {}
++#[cfg(feature = "full")]
++impl PartialEq for ImplItemMethod {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.defaultness == other.defaultness
++ && self.sig == other.sig
++ && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ImplItemType {}
++#[cfg(feature = "full")]
++impl PartialEq for ImplItemType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.defaultness == other.defaultness
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Item {}
++#[cfg(feature = "full")]
++impl PartialEq for Item {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Item::Const(self0), Item::Const(other0)) => self0 == other0,
++ (Item::Enum(self0), Item::Enum(other0)) => self0 == other0,
++ (Item::ExternCrate(self0), Item::ExternCrate(other0)) => self0 == other0,
++ (Item::Fn(self0), Item::Fn(other0)) => self0 == other0,
++ (Item::ForeignMod(self0), Item::ForeignMod(other0)) => self0 == other0,
++ (Item::Impl(self0), Item::Impl(other0)) => self0 == other0,
++ (Item::Macro(self0), Item::Macro(other0)) => self0 == other0,
++ (Item::Macro2(self0), Item::Macro2(other0)) => self0 == other0,
++ (Item::Mod(self0), Item::Mod(other0)) => self0 == other0,
++ (Item::Static(self0), Item::Static(other0)) => self0 == other0,
++ (Item::Struct(self0), Item::Struct(other0)) => self0 == other0,
++ (Item::Trait(self0), Item::Trait(other0)) => self0 == other0,
++ (Item::TraitAlias(self0), Item::TraitAlias(other0)) => self0 == other0,
++ (Item::Type(self0), Item::Type(other0)) => self0 == other0,
++ (Item::Union(self0), Item::Union(other0)) => self0 == other0,
++ (Item::Use(self0), Item::Use(other0)) => self0 == other0,
++ (Item::Verbatim(self0), Item::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemConst {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemConst {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.ty == other.ty
++ && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemEnum {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemEnum {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.variants == other.variants
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemExternCrate {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemExternCrate {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.rename == other.rename
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemFn {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemFn {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.sig == other.sig
++ && self.block == other.block
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemForeignMod {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemForeignMod {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.abi == other.abi && self.items == other.items
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemImpl {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemImpl {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.defaultness == other.defaultness
++ && self.unsafety == other.unsafety
++ && self.generics == other.generics
++ && self.trait_ == other.trait_
++ && self.self_ty == other.self_ty
++ && self.items == other.items
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.mac == other.mac
++ && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemMacro2 {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemMacro2 {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && TokenStreamHelper(&self.rules) == TokenStreamHelper(&other.rules)
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemMod {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemMod {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.content == other.content
++ && self.semi == other.semi
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemStatic {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemStatic {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.mutability == other.mutability
++ && self.ident == other.ident
++ && self.ty == other.ty
++ && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemStruct {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemStruct {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.fields == other.fields
++ && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemTrait {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemTrait {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.unsafety == other.unsafety
++ && self.auto_token == other.auto_token
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.colon_token == other.colon_token
++ && self.supertraits == other.supertraits
++ && self.items == other.items
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemTraitAlias {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemTraitAlias {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.bounds == other.bounds
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemType {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemUnion {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemUnion {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.fields == other.fields
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for ItemUse {}
++#[cfg(feature = "full")]
++impl PartialEq for ItemUse {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.vis == other.vis
++ && self.leading_colon == other.leading_colon
++ && self.tree == other.tree
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Label {}
++#[cfg(feature = "full")]
++impl PartialEq for Label {
++ fn eq(&self, other: &Self) -> bool {
++ self.name == other.name
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for LifetimeDef {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for LifetimeDef {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.lifetime == other.lifetime
++ && self.colon_token == other.colon_token
++ && self.bounds == other.bounds
++ }
++}
++impl Eq for Lit {}
++impl PartialEq for Lit {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Lit::Str(self0), Lit::Str(other0)) => self0 == other0,
++ (Lit::ByteStr(self0), Lit::ByteStr(other0)) => self0 == other0,
++ (Lit::Byte(self0), Lit::Byte(other0)) => self0 == other0,
++ (Lit::Char(self0), Lit::Char(other0)) => self0 == other0,
++ (Lit::Int(self0), Lit::Int(other0)) => self0 == other0,
++ (Lit::Float(self0), Lit::Float(other0)) => self0 == other0,
++ (Lit::Bool(self0), Lit::Bool(other0)) => self0 == other0,
++ (Lit::Verbatim(self0), Lit::Verbatim(other0)) => {
++ self0.to_string() == other0.to_string()
++ }
++ _ => false,
++ }
++ }
++}
++impl Eq for LitBool {}
++impl PartialEq for LitBool {
++ fn eq(&self, other: &Self) -> bool {
++ self.value == other.value
++ }
++}
++impl Eq for LitByte {}
++impl Eq for LitByteStr {}
++impl Eq for LitChar {}
++impl Eq for LitFloat {}
++impl Eq for LitInt {}
++impl Eq for LitStr {}
++#[cfg(feature = "full")]
++impl Eq for Local {}
++#[cfg(feature = "full")]
++impl PartialEq for Local {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.pat == other.pat && self.init == other.init
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Macro {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Macro {
++ fn eq(&self, other: &Self) -> bool {
++ self.path == other.path
++ && self.delimiter == other.delimiter
++ && TokenStreamHelper(&self.tokens) == TokenStreamHelper(&other.tokens)
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for MacroDelimiter {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for MacroDelimiter {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (MacroDelimiter::Paren(_), MacroDelimiter::Paren(_)) => true,
++ (MacroDelimiter::Brace(_), MacroDelimiter::Brace(_)) => true,
++ (MacroDelimiter::Bracket(_), MacroDelimiter::Bracket(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Meta {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Meta {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Meta::Path(self0), Meta::Path(other0)) => self0 == other0,
++ (Meta::List(self0), Meta::List(other0)) => self0 == other0,
++ (Meta::NameValue(self0), Meta::NameValue(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for MetaList {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for MetaList {
++ fn eq(&self, other: &Self) -> bool {
++ self.path == other.path && self.nested == other.nested
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for MetaNameValue {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for MetaNameValue {
++ fn eq(&self, other: &Self) -> bool {
++ self.path == other.path && self.lit == other.lit
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for MethodTurbofish {}
++#[cfg(feature = "full")]
++impl PartialEq for MethodTurbofish {
++ fn eq(&self, other: &Self) -> bool {
++ self.args == other.args
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for NestedMeta {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for NestedMeta {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (NestedMeta::Meta(self0), NestedMeta::Meta(other0)) => self0 == other0,
++ (NestedMeta::Lit(self0), NestedMeta::Lit(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ParenthesizedGenericArguments {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ParenthesizedGenericArguments {
++ fn eq(&self, other: &Self) -> bool {
++ self.inputs == other.inputs && self.output == other.output
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Pat {}
++#[cfg(feature = "full")]
++impl PartialEq for Pat {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Pat::Box(self0), Pat::Box(other0)) => self0 == other0,
++ (Pat::Ident(self0), Pat::Ident(other0)) => self0 == other0,
++ (Pat::Lit(self0), Pat::Lit(other0)) => self0 == other0,
++ (Pat::Macro(self0), Pat::Macro(other0)) => self0 == other0,
++ (Pat::Or(self0), Pat::Or(other0)) => self0 == other0,
++ (Pat::Path(self0), Pat::Path(other0)) => self0 == other0,
++ (Pat::Range(self0), Pat::Range(other0)) => self0 == other0,
++ (Pat::Reference(self0), Pat::Reference(other0)) => self0 == other0,
++ (Pat::Rest(self0), Pat::Rest(other0)) => self0 == other0,
++ (Pat::Slice(self0), Pat::Slice(other0)) => self0 == other0,
++ (Pat::Struct(self0), Pat::Struct(other0)) => self0 == other0,
++ (Pat::Tuple(self0), Pat::Tuple(other0)) => self0 == other0,
++ (Pat::TupleStruct(self0), Pat::TupleStruct(other0)) => self0 == other0,
++ (Pat::Type(self0), Pat::Type(other0)) => self0 == other0,
++ (Pat::Verbatim(self0), Pat::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ (Pat::Wild(self0), Pat::Wild(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatBox {}
++#[cfg(feature = "full")]
++impl PartialEq for PatBox {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.pat == other.pat
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatIdent {}
++#[cfg(feature = "full")]
++impl PartialEq for PatIdent {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.by_ref == other.by_ref
++ && self.mutability == other.mutability
++ && self.ident == other.ident
++ && self.subpat == other.subpat
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatLit {}
++#[cfg(feature = "full")]
++impl PartialEq for PatLit {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.expr == other.expr
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for PatMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mac == other.mac
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatOr {}
++#[cfg(feature = "full")]
++impl PartialEq for PatOr {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.leading_vert == other.leading_vert
++ && self.cases == other.cases
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatPath {}
++#[cfg(feature = "full")]
++impl PartialEq for PatPath {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.qself == other.qself && self.path == other.path
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatRange {}
++#[cfg(feature = "full")]
++impl PartialEq for PatRange {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.lo == other.lo
++ && self.limits == other.limits
++ && self.hi == other.hi
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatReference {}
++#[cfg(feature = "full")]
++impl PartialEq for PatReference {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mutability == other.mutability && self.pat == other.pat
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatRest {}
++#[cfg(feature = "full")]
++impl PartialEq for PatRest {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatSlice {}
++#[cfg(feature = "full")]
++impl PartialEq for PatSlice {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.elems == other.elems
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatStruct {}
++#[cfg(feature = "full")]
++impl PartialEq for PatStruct {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.path == other.path
++ && self.fields == other.fields
++ && self.dot2_token == other.dot2_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatTuple {}
++#[cfg(feature = "full")]
++impl PartialEq for PatTuple {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.elems == other.elems
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatTupleStruct {}
++#[cfg(feature = "full")]
++impl PartialEq for PatTupleStruct {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.path == other.path && self.pat == other.pat
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatType {}
++#[cfg(feature = "full")]
++impl PartialEq for PatType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.pat == other.pat && self.ty == other.ty
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for PatWild {}
++#[cfg(feature = "full")]
++impl PartialEq for PatWild {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Path {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Path {
++ fn eq(&self, other: &Self) -> bool {
++ self.leading_colon == other.leading_colon && self.segments == other.segments
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for PathArguments {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for PathArguments {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (PathArguments::None, PathArguments::None) => true,
++ (PathArguments::AngleBracketed(self0), PathArguments::AngleBracketed(other0)) => {
++ self0 == other0
++ }
++ (PathArguments::Parenthesized(self0), PathArguments::Parenthesized(other0)) => {
++ self0 == other0
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for PathSegment {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for PathSegment {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident && self.arguments == other.arguments
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for PredicateEq {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for PredicateEq {
++ fn eq(&self, other: &Self) -> bool {
++ self.lhs_ty == other.lhs_ty && self.rhs_ty == other.rhs_ty
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for PredicateLifetime {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for PredicateLifetime {
++ fn eq(&self, other: &Self) -> bool {
++ self.lifetime == other.lifetime && self.bounds == other.bounds
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for PredicateType {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for PredicateType {
++ fn eq(&self, other: &Self) -> bool {
++ self.lifetimes == other.lifetimes
++ && self.bounded_ty == other.bounded_ty
++ && self.bounds == other.bounds
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for QSelf {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for QSelf {
++ fn eq(&self, other: &Self) -> bool {
++ self.ty == other.ty && self.position == other.position && self.as_token == other.as_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for RangeLimits {}
++#[cfg(feature = "full")]
++impl PartialEq for RangeLimits {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (RangeLimits::HalfOpen(_), RangeLimits::HalfOpen(_)) => true,
++ (RangeLimits::Closed(_), RangeLimits::Closed(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Receiver {}
++#[cfg(feature = "full")]
++impl PartialEq for Receiver {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.reference == other.reference
++ && self.mutability == other.mutability
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for ReturnType {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for ReturnType {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (ReturnType::Default, ReturnType::Default) => true,
++ (ReturnType::Type(_, self1), ReturnType::Type(_, other1)) => self1 == other1,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Signature {}
++#[cfg(feature = "full")]
++impl PartialEq for Signature {
++ fn eq(&self, other: &Self) -> bool {
++ self.constness == other.constness
++ && self.asyncness == other.asyncness
++ && self.unsafety == other.unsafety
++ && self.abi == other.abi
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.inputs == other.inputs
++ && self.variadic == other.variadic
++ && self.output == other.output
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for Stmt {}
++#[cfg(feature = "full")]
++impl PartialEq for Stmt {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Stmt::Local(self0), Stmt::Local(other0)) => self0 == other0,
++ (Stmt::Item(self0), Stmt::Item(other0)) => self0 == other0,
++ (Stmt::Expr(self0), Stmt::Expr(other0)) => self0 == other0,
++ (Stmt::Semi(self0, _), Stmt::Semi(other0, _)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TraitBound {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TraitBound {
++ fn eq(&self, other: &Self) -> bool {
++ self.paren_token == other.paren_token
++ && self.modifier == other.modifier
++ && self.lifetimes == other.lifetimes
++ && self.path == other.path
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TraitBoundModifier {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TraitBoundModifier {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (TraitBoundModifier::None, TraitBoundModifier::None) => true,
++ (TraitBoundModifier::Maybe(_), TraitBoundModifier::Maybe(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for TraitItem {}
++#[cfg(feature = "full")]
++impl PartialEq for TraitItem {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (TraitItem::Const(self0), TraitItem::Const(other0)) => self0 == other0,
++ (TraitItem::Method(self0), TraitItem::Method(other0)) => self0 == other0,
++ (TraitItem::Type(self0), TraitItem::Type(other0)) => self0 == other0,
++ (TraitItem::Macro(self0), TraitItem::Macro(other0)) => self0 == other0,
++ (TraitItem::Verbatim(self0), TraitItem::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for TraitItemConst {}
++#[cfg(feature = "full")]
++impl PartialEq for TraitItemConst {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.ty == other.ty
++ && self.default == other.default
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for TraitItemMacro {}
++#[cfg(feature = "full")]
++impl PartialEq for TraitItemMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs && self.mac == other.mac && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for TraitItemMethod {}
++#[cfg(feature = "full")]
++impl PartialEq for TraitItemMethod {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.sig == other.sig
++ && self.default == other.default
++ && self.semi_token == other.semi_token
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for TraitItemType {}
++#[cfg(feature = "full")]
++impl PartialEq for TraitItemType {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.generics == other.generics
++ && self.colon_token == other.colon_token
++ && self.bounds == other.bounds
++ && self.default == other.default
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Type {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Type {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Type::Array(self0), Type::Array(other0)) => self0 == other0,
++ (Type::BareFn(self0), Type::BareFn(other0)) => self0 == other0,
++ (Type::Group(self0), Type::Group(other0)) => self0 == other0,
++ (Type::ImplTrait(self0), Type::ImplTrait(other0)) => self0 == other0,
++ (Type::Infer(self0), Type::Infer(other0)) => self0 == other0,
++ (Type::Macro(self0), Type::Macro(other0)) => self0 == other0,
++ (Type::Never(self0), Type::Never(other0)) => self0 == other0,
++ (Type::Paren(self0), Type::Paren(other0)) => self0 == other0,
++ (Type::Path(self0), Type::Path(other0)) => self0 == other0,
++ (Type::Ptr(self0), Type::Ptr(other0)) => self0 == other0,
++ (Type::Reference(self0), Type::Reference(other0)) => self0 == other0,
++ (Type::Slice(self0), Type::Slice(other0)) => self0 == other0,
++ (Type::TraitObject(self0), Type::TraitObject(other0)) => self0 == other0,
++ (Type::Tuple(self0), Type::Tuple(other0)) => self0 == other0,
++ (Type::Verbatim(self0), Type::Verbatim(other0)) => {
++ TokenStreamHelper(self0) == TokenStreamHelper(other0)
++ }
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeArray {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeArray {
++ fn eq(&self, other: &Self) -> bool {
++ self.elem == other.elem && self.len == other.len
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeBareFn {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeBareFn {
++ fn eq(&self, other: &Self) -> bool {
++ self.lifetimes == other.lifetimes
++ && self.unsafety == other.unsafety
++ && self.abi == other.abi
++ && self.inputs == other.inputs
++ && self.variadic == other.variadic
++ && self.output == other.output
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeGroup {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeGroup {
++ fn eq(&self, other: &Self) -> bool {
++ self.elem == other.elem
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeImplTrait {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeImplTrait {
++ fn eq(&self, other: &Self) -> bool {
++ self.bounds == other.bounds
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeInfer {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeInfer {
++ fn eq(&self, _other: &Self) -> bool {
++ true
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeMacro {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeMacro {
++ fn eq(&self, other: &Self) -> bool {
++ self.mac == other.mac
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeNever {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeNever {
++ fn eq(&self, _other: &Self) -> bool {
++ true
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeParam {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeParam {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.colon_token == other.colon_token
++ && self.bounds == other.bounds
++ && self.eq_token == other.eq_token
++ && self.default == other.default
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeParamBound {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeParamBound {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (TypeParamBound::Trait(self0), TypeParamBound::Trait(other0)) => self0 == other0,
++ (TypeParamBound::Lifetime(self0), TypeParamBound::Lifetime(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeParen {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeParen {
++ fn eq(&self, other: &Self) -> bool {
++ self.elem == other.elem
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypePath {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypePath {
++ fn eq(&self, other: &Self) -> bool {
++ self.qself == other.qself && self.path == other.path
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypePtr {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypePtr {
++ fn eq(&self, other: &Self) -> bool {
++ self.const_token == other.const_token
++ && self.mutability == other.mutability
++ && self.elem == other.elem
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeReference {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeReference {
++ fn eq(&self, other: &Self) -> bool {
++ self.lifetime == other.lifetime
++ && self.mutability == other.mutability
++ && self.elem == other.elem
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeSlice {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeSlice {
++ fn eq(&self, other: &Self) -> bool {
++ self.elem == other.elem
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeTraitObject {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeTraitObject {
++ fn eq(&self, other: &Self) -> bool {
++ self.dyn_token == other.dyn_token && self.bounds == other.bounds
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for TypeTuple {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for TypeTuple {
++ fn eq(&self, other: &Self) -> bool {
++ self.elems == other.elems
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for UnOp {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for UnOp {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (UnOp::Deref(_), UnOp::Deref(_)) => true,
++ (UnOp::Not(_), UnOp::Not(_)) => true,
++ (UnOp::Neg(_), UnOp::Neg(_)) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UseGlob {}
++#[cfg(feature = "full")]
++impl PartialEq for UseGlob {
++ fn eq(&self, _other: &Self) -> bool {
++ true
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UseGroup {}
++#[cfg(feature = "full")]
++impl PartialEq for UseGroup {
++ fn eq(&self, other: &Self) -> bool {
++ self.items == other.items
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UseName {}
++#[cfg(feature = "full")]
++impl PartialEq for UseName {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UsePath {}
++#[cfg(feature = "full")]
++impl PartialEq for UsePath {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident && self.tree == other.tree
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UseRename {}
++#[cfg(feature = "full")]
++impl PartialEq for UseRename {
++ fn eq(&self, other: &Self) -> bool {
++ self.ident == other.ident && self.rename == other.rename
++ }
++}
++#[cfg(feature = "full")]
++impl Eq for UseTree {}
++#[cfg(feature = "full")]
++impl PartialEq for UseTree {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (UseTree::Path(self0), UseTree::Path(other0)) => self0 == other0,
++ (UseTree::Name(self0), UseTree::Name(other0)) => self0 == other0,
++ (UseTree::Rename(self0), UseTree::Rename(other0)) => self0 == other0,
++ (UseTree::Glob(self0), UseTree::Glob(other0)) => self0 == other0,
++ (UseTree::Group(self0), UseTree::Group(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Variadic {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Variadic {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Variant {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Variant {
++ fn eq(&self, other: &Self) -> bool {
++ self.attrs == other.attrs
++ && self.ident == other.ident
++ && self.fields == other.fields
++ && self.discriminant == other.discriminant
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for VisCrate {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for VisCrate {
++ fn eq(&self, _other: &Self) -> bool {
++ true
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for VisPublic {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for VisPublic {
++ fn eq(&self, _other: &Self) -> bool {
++ true
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for VisRestricted {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for VisRestricted {
++ fn eq(&self, other: &Self) -> bool {
++ self.in_token == other.in_token && self.path == other.path
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for Visibility {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for Visibility {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (Visibility::Public(self0), Visibility::Public(other0)) => self0 == other0,
++ (Visibility::Crate(self0), Visibility::Crate(other0)) => self0 == other0,
++ (Visibility::Restricted(self0), Visibility::Restricted(other0)) => self0 == other0,
++ (Visibility::Inherited, Visibility::Inherited) => true,
++ _ => false,
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for WhereClause {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for WhereClause {
++ fn eq(&self, other: &Self) -> bool {
++ self.predicates == other.predicates
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Eq for WherePredicate {}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl PartialEq for WherePredicate {
++ fn eq(&self, other: &Self) -> bool {
++ match (self, other) {
++ (WherePredicate::Type(self0), WherePredicate::Type(other0)) => self0 == other0,
++ (WherePredicate::Lifetime(self0), WherePredicate::Lifetime(other0)) => self0 == other0,
++ (WherePredicate::Eq(self0), WherePredicate::Eq(other0)) => self0 == other0,
++ _ => false,
++ }
++ }
++}
+diff --git a/third_party/rust/syn/src/gen/fold.rs b/third_party/rust/syn/src/gen/fold.rs
+index f51218b78c..d9dd32a420 100644
+--- mozilla-release/third_party/rust/syn/src/gen/fold.rs
++++ mozilla-release/third_party/rust/syn/src/gen/fold.rs
+@@ -2,6 +2,7 @@
+ // It is not intended for manual editing.
+
+ #![allow(unreachable_code, unused_variables)]
++#![allow(clippy::match_wildcard_for_single_variants)]
+ #[cfg(any(feature = "full", feature = "derive"))]
+ use crate::gen::helper::fold::*;
+ #[cfg(any(feature = "full", feature = "derive"))]
+@@ -26,7 +27,7 @@ macro_rules! full {
+ ///
+ /// [module documentation]: self
+ ///
+-/// *This trait is available if Syn is built with the `"fold"` feature.*
++/// *This trait is available only if Syn is built with the `"fold"` feature.*
+ pub trait Fold {
+ #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_abi(&mut self, i: Abi) -> Abi {
+@@ -433,35 +434,27 @@ pub trait Fold {
+ fn fold_lifetime_def(&mut self, i: LifetimeDef) -> LifetimeDef {
+ fold_lifetime_def(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit(&mut self, i: Lit) -> Lit {
+ fold_lit(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_bool(&mut self, i: LitBool) -> LitBool {
+ fold_lit_bool(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_byte(&mut self, i: LitByte) -> LitByte {
+ fold_lit_byte(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_byte_str(&mut self, i: LitByteStr) -> LitByteStr {
+ fold_lit_byte_str(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_char(&mut self, i: LitChar) -> LitChar {
+ fold_lit_char(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_float(&mut self, i: LitFloat) -> LitFloat {
+ fold_lit_float(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_int(&mut self, i: LitInt) -> LitInt {
+ fold_lit_int(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn fold_lit_str(&mut self, i: LitStr) -> LitStr {
+ fold_lit_str(self, i)
+ }
+@@ -799,10 +792,10 @@ where
+ F: Fold + ?Sized,
+ {
+ AngleBracketedGenericArguments {
+- colon2_token: (node.colon2_token).map(|it| Token ! [ :: ](tokens_helper(f, &it.spans))),
+- lt_token: Token ! [ < ](tokens_helper(f, &node.lt_token.spans)),
++ colon2_token: (node.colon2_token).map(|it| Token ! [::](tokens_helper(f, &it.spans))),
++ lt_token: Token ! [<](tokens_helper(f, &node.lt_token.spans)),
+ args: FoldHelper::lift(node.args, |it| f.fold_generic_argument(it)),
+- gt_token: Token ! [ > ](tokens_helper(f, &node.gt_token.spans)),
++ gt_token: Token ! [>](tokens_helper(f, &node.gt_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -819,9 +812,9 @@ where
+ Box::new(f.fold_expr(*(it).1)),
+ )
+ }),
+- fat_arrow_token: Token ! [ => ](tokens_helper(f, &node.fat_arrow_token.spans)),
++ fat_arrow_token: Token ! [=>](tokens_helper(f, &node.fat_arrow_token.spans)),
+ body: Box::new(f.fold_expr(*node.body)),
+- comma: (node.comma).map(|it| Token ! [ , ](tokens_helper(f, &it.spans))),
++ comma: (node.comma).map(|it| Token ! [,](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -842,7 +835,7 @@ where
+ F: Fold + ?Sized,
+ {
+ Attribute {
+- pound_token: Token ! [ # ](tokens_helper(f, &node.pound_token.spans)),
++ pound_token: Token ! [#](tokens_helper(f, &node.pound_token.spans)),
+ style: f.fold_attr_style(node.style),
+ bracket_token: Bracket(tokens_helper(f, &node.bracket_token.span)),
+ path: f.fold_path(node.path),
+@@ -859,7 +852,7 @@ where
+ name: (node.name).map(|it| {
+ (
+ f.fold_ident((it).0),
+- Token ! [ : ](tokens_helper(f, &(it).1.spans)),
++ Token ! [:](tokens_helper(f, &(it).1.spans)),
+ )
+ }),
+ ty: f.fold_type(node.ty),
+@@ -871,59 +864,47 @@ where
+ F: Fold + ?Sized,
+ {
+ match node {
+- BinOp::Add(_binding_0) => BinOp::Add(Token ! [ + ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Sub(_binding_0) => BinOp::Sub(Token ! [ - ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Mul(_binding_0) => BinOp::Mul(Token ! [ * ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Div(_binding_0) => BinOp::Div(Token ! [ / ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Rem(_binding_0) => BinOp::Rem(Token ! [ % ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::And(_binding_0) => BinOp::And(Token ! [ && ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Or(_binding_0) => BinOp::Or(Token ! [ || ](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Add(_binding_0) => BinOp::Add(Token ! [+](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Sub(_binding_0) => BinOp::Sub(Token ! [-](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Mul(_binding_0) => BinOp::Mul(Token ! [*](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Div(_binding_0) => BinOp::Div(Token ! [/](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Rem(_binding_0) => BinOp::Rem(Token ! [%](tokens_helper(f, &_binding_0.spans))),
++ BinOp::And(_binding_0) => BinOp::And(Token ! [&&](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Or(_binding_0) => BinOp::Or(Token ! [||](tokens_helper(f, &_binding_0.spans))),
+ BinOp::BitXor(_binding_0) => {
+- BinOp::BitXor(Token ! [ ^ ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::BitXor(Token ! [^](tokens_helper(f, &_binding_0.spans)))
+ }
+ BinOp::BitAnd(_binding_0) => {
+- BinOp::BitAnd(Token ! [ & ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::BitOr(_binding_0) => {
+- BinOp::BitOr(Token ! [ | ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::Shl(_binding_0) => BinOp::Shl(Token ! [ << ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Shr(_binding_0) => BinOp::Shr(Token ! [ >> ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Eq(_binding_0) => BinOp::Eq(Token ! [ == ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Lt(_binding_0) => BinOp::Lt(Token ! [ < ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Le(_binding_0) => BinOp::Le(Token ! [ <= ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Ne(_binding_0) => BinOp::Ne(Token ! [ != ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Ge(_binding_0) => BinOp::Ge(Token ! [ >= ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::Gt(_binding_0) => BinOp::Gt(Token ! [ > ](tokens_helper(f, &_binding_0.spans))),
+- BinOp::AddEq(_binding_0) => {
+- BinOp::AddEq(Token ! [ += ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::SubEq(_binding_0) => {
+- BinOp::SubEq(Token ! [ -= ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::MulEq(_binding_0) => {
+- BinOp::MulEq(Token ! [ *= ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::DivEq(_binding_0) => {
+- BinOp::DivEq(Token ! [ /= ](tokens_helper(f, &_binding_0.spans)))
+- }
+- BinOp::RemEq(_binding_0) => {
+- BinOp::RemEq(Token ! [ %= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::BitAnd(Token ! [&](tokens_helper(f, &_binding_0.spans)))
+ }
++ BinOp::BitOr(_binding_0) => BinOp::BitOr(Token ! [|](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Shl(_binding_0) => BinOp::Shl(Token ! [<<](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Shr(_binding_0) => BinOp::Shr(Token ! [>>](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Eq(_binding_0) => BinOp::Eq(Token ! [==](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Lt(_binding_0) => BinOp::Lt(Token ! [<](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Le(_binding_0) => BinOp::Le(Token ! [<=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Ne(_binding_0) => BinOp::Ne(Token ! [!=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Ge(_binding_0) => BinOp::Ge(Token ! [>=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::Gt(_binding_0) => BinOp::Gt(Token ! [>](tokens_helper(f, &_binding_0.spans))),
++ BinOp::AddEq(_binding_0) => BinOp::AddEq(Token ! [+=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::SubEq(_binding_0) => BinOp::SubEq(Token ! [-=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::MulEq(_binding_0) => BinOp::MulEq(Token ! [*=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::DivEq(_binding_0) => BinOp::DivEq(Token ! [/=](tokens_helper(f, &_binding_0.spans))),
++ BinOp::RemEq(_binding_0) => BinOp::RemEq(Token ! [%=](tokens_helper(f, &_binding_0.spans))),
+ BinOp::BitXorEq(_binding_0) => {
+- BinOp::BitXorEq(Token ! [ ^= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::BitXorEq(Token ! [^=](tokens_helper(f, &_binding_0.spans)))
+ }
+ BinOp::BitAndEq(_binding_0) => {
+- BinOp::BitAndEq(Token ! [ &= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::BitAndEq(Token ! [&=](tokens_helper(f, &_binding_0.spans)))
+ }
+ BinOp::BitOrEq(_binding_0) => {
+- BinOp::BitOrEq(Token ! [ |= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::BitOrEq(Token ! [|=](tokens_helper(f, &_binding_0.spans)))
+ }
+ BinOp::ShlEq(_binding_0) => {
+- BinOp::ShlEq(Token ! [ <<= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::ShlEq(Token ! [<<=](tokens_helper(f, &_binding_0.spans)))
+ }
+ BinOp::ShrEq(_binding_0) => {
+- BinOp::ShrEq(Token ! [ >>= ](tokens_helper(f, &_binding_0.spans)))
++ BinOp::ShrEq(Token ! [>>=](tokens_helper(f, &_binding_0.spans)))
+ }
+ }
+ }
+@@ -934,7 +915,7 @@ where
+ {
+ Binding {
+ ident: f.fold_ident(node.ident),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ ty: f.fold_type(node.ty),
+ }
+ }
+@@ -955,9 +936,9 @@ where
+ {
+ BoundLifetimes {
+ for_token: Token![for](tokens_helper(f, &node.for_token.span)),
+- lt_token: Token ! [ < ](tokens_helper(f, &node.lt_token.spans)),
++ lt_token: Token ! [<](tokens_helper(f, &node.lt_token.spans)),
+ lifetimes: FoldHelper::lift(node.lifetimes, |it| f.fold_lifetime_def(it)),
+- gt_token: Token ! [ > ](tokens_helper(f, &node.gt_token.spans)),
++ gt_token: Token ! [>](tokens_helper(f, &node.gt_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -969,9 +950,9 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ const_token: Token![const](tokens_helper(f, &node.const_token.span)),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: f.fold_type(node.ty),
+- eq_token: (node.eq_token).map(|it| Token ! [ = ](tokens_helper(f, &it.spans))),
++ eq_token: (node.eq_token).map(|it| Token ! [=](tokens_helper(f, &it.spans))),
+ default: (node.default).map(|it| f.fold_expr(it)),
+ }
+ }
+@@ -982,7 +963,7 @@ where
+ {
+ Constraint {
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_type_param_bound(it)),
+ }
+ }
+@@ -1016,7 +997,7 @@ where
+ DataStruct {
+ struct_token: Token![struct](tokens_helper(f, &node.struct_token.span)),
+ fields: f.fold_fields(node.fields),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "derive")]
+@@ -1112,7 +1093,7 @@ where
+ ExprAssign {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ left: Box::new(f.fold_expr(*node.left)),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ right: Box::new(f.fold_expr(*node.right)),
+ }
+ }
+@@ -1148,7 +1129,7 @@ where
+ ExprAwait {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ base: Box::new(f.fold_expr(*node.base)),
+- dot_token: Token ! [ . ](tokens_helper(f, &node.dot_token.spans)),
++ dot_token: Token ! [.](tokens_helper(f, &node.dot_token.spans)),
+ await_token: crate::token::Await(tokens_helper(f, &node.await_token.span)),
+ }
+ }
+@@ -1232,9 +1213,9 @@ where
+ asyncness: (node.asyncness).map(|it| Token![async](tokens_helper(f, &it.span))),
+ movability: (node.movability).map(|it| Token![static](tokens_helper(f, &it.span))),
+ capture: (node.capture).map(|it| Token![move](tokens_helper(f, &it.span))),
+- or1_token: Token ! [ | ](tokens_helper(f, &node.or1_token.spans)),
++ or1_token: Token ! [|](tokens_helper(f, &node.or1_token.spans)),
+ inputs: FoldHelper::lift(node.inputs, |it| f.fold_pat(it)),
+- or2_token: Token ! [ | ](tokens_helper(f, &node.or2_token.spans)),
++ or2_token: Token ! [|](tokens_helper(f, &node.or2_token.spans)),
+ output: f.fold_return_type(node.output),
+ body: Box::new(f.fold_expr(*node.body)),
+ }
+@@ -1258,7 +1239,7 @@ where
+ ExprField {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ base: Box::new(f.fold_expr(*node.base)),
+- dot_token: Token ! [ . ](tokens_helper(f, &node.dot_token.spans)),
++ dot_token: Token ! [.](tokens_helper(f, &node.dot_token.spans)),
+ member: f.fold_member(node.member),
+ }
+ }
+@@ -1327,7 +1308,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ let_token: Token![let](tokens_helper(f, &node.let_token.span)),
+ pat: f.fold_pat(node.pat),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+ }
+ }
+@@ -1384,7 +1365,7 @@ where
+ ExprMethodCall {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ receiver: Box::new(f.fold_expr(*node.receiver)),
+- dot_token: Token ! [ . ](tokens_helper(f, &node.dot_token.spans)),
++ dot_token: Token ! [.](tokens_helper(f, &node.dot_token.spans)),
+ method: f.fold_ident(node.method),
+ turbofish: (node.turbofish).map(|it| f.fold_method_turbofish(it)),
+ paren_token: Paren(tokens_helper(f, &node.paren_token.span)),
+@@ -1432,7 +1413,7 @@ where
+ {
+ ExprReference {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+- and_token: Token ! [ & ](tokens_helper(f, &node.and_token.spans)),
++ and_token: Token ! [&](tokens_helper(f, &node.and_token.spans)),
+ raw: node.raw,
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ expr: Box::new(f.fold_expr(*node.expr)),
+@@ -1447,7 +1428,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ bracket_token: Bracket(tokens_helper(f, &node.bracket_token.span)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ len: Box::new(f.fold_expr(*node.len)),
+ }
+ }
+@@ -1484,7 +1465,7 @@ where
+ ExprTry {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+- question_token: Token ! [ ? ](tokens_helper(f, &node.question_token.spans)),
++ question_token: Token ! [?](tokens_helper(f, &node.question_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1517,7 +1498,7 @@ where
+ ExprType {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+ }
+ }
+@@ -1576,7 +1557,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ vis: f.fold_visibility(node.vis),
+ ident: (node.ident).map(|it| f.fold_ident(it)),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ ty: f.fold_type(node.ty),
+ }
+ }
+@@ -1588,7 +1569,7 @@ where
+ FieldPat {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ member: f.fold_member(node.member),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ pat: Box::new(f.fold_pat(*node.pat)),
+ }
+ }
+@@ -1600,7 +1581,7 @@ where
+ FieldValue {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ member: f.fold_member(node.member),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ expr: f.fold_expr(node.expr),
+ }
+ }
+@@ -1681,7 +1662,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ vis: f.fold_visibility(node.vis),
+ sig: f.fold_signature(node.sig),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1692,7 +1673,7 @@ where
+ ForeignItemMacro {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ mac: f.fold_macro(node.mac),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1706,9 +1687,9 @@ where
+ static_token: Token![static](tokens_helper(f, &node.static_token.span)),
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1721,7 +1702,7 @@ where
+ vis: f.fold_visibility(node.vis),
+ type_token: Token![type](tokens_helper(f, &node.type_token.span)),
+ ident: f.fold_ident(node.ident),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -1779,9 +1760,9 @@ where
+ F: Fold + ?Sized,
+ {
+ Generics {
+- lt_token: (node.lt_token).map(|it| Token ! [ < ](tokens_helper(f, &it.spans))),
++ lt_token: (node.lt_token).map(|it| Token ! [<](tokens_helper(f, &it.spans))),
+ params: FoldHelper::lift(node.params, |it| f.fold_generic_param(it)),
+- gt_token: (node.gt_token).map(|it| Token ! [ > ](tokens_helper(f, &it.spans))),
++ gt_token: (node.gt_token).map(|it| Token ! [>](tokens_helper(f, &it.spans))),
+ where_clause: (node.where_clause).map(|it| f.fold_where_clause(it)),
+ }
+ }
+@@ -1819,11 +1800,11 @@ where
+ defaultness: (node.defaultness).map(|it| Token![default](tokens_helper(f, &it.span))),
+ const_token: Token![const](tokens_helper(f, &node.const_token.span)),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: f.fold_type(node.ty),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ expr: f.fold_expr(node.expr),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1834,7 +1815,7 @@ where
+ ImplItemMacro {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ mac: f.fold_macro(node.mac),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1862,9 +1843,9 @@ where
+ type_token: Token![type](tokens_helper(f, &node.type_token.span)),
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ ty: f.fold_type(node.ty),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -1913,11 +1894,11 @@ where
+ vis: f.fold_visibility(node.vis),
+ const_token: Token![const](tokens_helper(f, &node.const_token.span)),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -1952,7 +1933,7 @@ where
+ f.fold_ident((it).1),
+ )
+ }),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2011,7 +1992,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ ident: (node.ident).map(|it| f.fold_ident(it)),
+ mac: f.fold_macro(node.mac),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2043,7 +2024,7 @@ where
+ FoldHelper::lift((it).1, |it| f.fold_item(it)),
+ )
+ }),
+- semi: (node.semi).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi: (node.semi).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2057,11 +2038,11 @@ where
+ static_token: Token![static](tokens_helper(f, &node.static_token.span)),
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ expr: Box::new(f.fold_expr(*node.expr)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2076,7 +2057,7 @@ where
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+ fields: f.fold_fields(node.fields),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2092,7 +2073,7 @@ where
+ trait_token: Token![trait](tokens_helper(f, &node.trait_token.span)),
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ supertraits: FoldHelper::lift(node.supertraits, |it| f.fold_type_param_bound(it)),
+ brace_token: Brace(tokens_helper(f, &node.brace_token.span)),
+ items: FoldHelper::lift(node.items, |it| f.fold_trait_item(it)),
+@@ -2109,9 +2090,9 @@ where
+ trait_token: Token![trait](tokens_helper(f, &node.trait_token.span)),
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_type_param_bound(it)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2125,9 +2106,9 @@ where
+ type_token: Token![type](tokens_helper(f, &node.type_token.span)),
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2153,9 +2134,9 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ vis: f.fold_visibility(node.vis),
+ use_token: Token![use](tokens_helper(f, &node.use_token.span)),
+- leading_colon: (node.leading_colon).map(|it| Token ! [ :: ](tokens_helper(f, &it.spans))),
++ leading_colon: (node.leading_colon).map(|it| Token ! [::](tokens_helper(f, &it.spans))),
+ tree: f.fold_use_tree(node.tree),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2165,7 +2146,7 @@ where
+ {
+ Label {
+ name: f.fold_lifetime(node.name),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ }
+ }
+ pub fn fold_lifetime<F>(f: &mut F, node: Lifetime) -> Lifetime
+@@ -2185,11 +2166,10 @@ where
+ LifetimeDef {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ lifetime: f.fold_lifetime(node.lifetime),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_lifetime(it)),
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit<F>(f: &mut F, node: Lit) -> Lit
+ where
+ F: Fold + ?Sized,
+@@ -2205,7 +2185,6 @@ where
+ Lit::Verbatim(_binding_0) => Lit::Verbatim(_binding_0),
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_bool<F>(f: &mut F, node: LitBool) -> LitBool
+ where
+ F: Fold + ?Sized,
+@@ -2215,7 +2194,6 @@ where
+ span: f.fold_span(node.span),
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_byte<F>(f: &mut F, node: LitByte) -> LitByte
+ where
+ F: Fold + ?Sized,
+@@ -2225,7 +2203,6 @@ where
+ node.set_span(span);
+ node
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_byte_str<F>(f: &mut F, node: LitByteStr) -> LitByteStr
+ where
+ F: Fold + ?Sized,
+@@ -2235,7 +2212,6 @@ where
+ node.set_span(span);
+ node
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_char<F>(f: &mut F, node: LitChar) -> LitChar
+ where
+ F: Fold + ?Sized,
+@@ -2245,7 +2221,6 @@ where
+ node.set_span(span);
+ node
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_float<F>(f: &mut F, node: LitFloat) -> LitFloat
+ where
+ F: Fold + ?Sized,
+@@ -2255,7 +2230,6 @@ where
+ node.set_span(span);
+ node
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_int<F>(f: &mut F, node: LitInt) -> LitInt
+ where
+ F: Fold + ?Sized,
+@@ -2265,7 +2239,6 @@ where
+ node.set_span(span);
+ node
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn fold_lit_str<F>(f: &mut F, node: LitStr) -> LitStr
+ where
+ F: Fold + ?Sized,
+@@ -2286,11 +2259,11 @@ where
+ pat: f.fold_pat(node.pat),
+ init: (node.init).map(|it| {
+ (
+- Token ! [ = ](tokens_helper(f, &(it).0.spans)),
++ Token ! [=](tokens_helper(f, &(it).0.spans)),
+ Box::new(f.fold_expr(*(it).1)),
+ )
+ }),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -2361,7 +2334,7 @@ where
+ {
+ MetaNameValue {
+ path: f.fold_path(node.path),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ lit: f.fold_lit(node.lit),
+ }
+ }
+@@ -2371,10 +2344,10 @@ where
+ F: Fold + ?Sized,
+ {
+ MethodTurbofish {
+- colon2_token: Token ! [ :: ](tokens_helper(f, &node.colon2_token.spans)),
+- lt_token: Token ! [ < ](tokens_helper(f, &node.lt_token.spans)),
++ colon2_token: Token ! [::](tokens_helper(f, &node.colon2_token.spans)),
++ lt_token: Token ! [<](tokens_helper(f, &node.lt_token.spans)),
+ args: FoldHelper::lift(node.args, |it| f.fold_generic_method_argument(it)),
+- gt_token: Token ! [ > ](tokens_helper(f, &node.gt_token.spans)),
++ gt_token: Token ! [>](tokens_helper(f, &node.gt_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -2449,7 +2422,7 @@ where
+ ident: f.fold_ident(node.ident),
+ subpat: (node.subpat).map(|it| {
+ (
+- Token ! [ @ ](tokens_helper(f, &(it).0.spans)),
++ Token ! [@](tokens_helper(f, &(it).0.spans)),
+ Box::new(f.fold_pat(*(it).1)),
+ )
+ }),
+@@ -2482,7 +2455,7 @@ where
+ {
+ PatOr {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+- leading_vert: (node.leading_vert).map(|it| Token ! [ | ](tokens_helper(f, &it.spans))),
++ leading_vert: (node.leading_vert).map(|it| Token ! [|](tokens_helper(f, &it.spans))),
+ cases: FoldHelper::lift(node.cases, |it| f.fold_pat(it)),
+ }
+ }
+@@ -2516,7 +2489,7 @@ where
+ {
+ PatReference {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+- and_token: Token ! [ & ](tokens_helper(f, &node.and_token.spans)),
++ and_token: Token ! [&](tokens_helper(f, &node.and_token.spans)),
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ pat: Box::new(f.fold_pat(*node.pat)),
+ }
+@@ -2585,7 +2558,7 @@ where
+ PatType {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ pat: Box::new(f.fold_pat(*node.pat)),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+ }
+ }
+@@ -2605,7 +2578,7 @@ where
+ F: Fold + ?Sized,
+ {
+ Path {
+- leading_colon: (node.leading_colon).map(|it| Token ! [ :: ](tokens_helper(f, &it.spans))),
++ leading_colon: (node.leading_colon).map(|it| Token ! [::](tokens_helper(f, &it.spans))),
+ segments: FoldHelper::lift(node.segments, |it| f.fold_path_segment(it)),
+ }
+ }
+@@ -2641,7 +2614,7 @@ where
+ {
+ PredicateEq {
+ lhs_ty: f.fold_type(node.lhs_ty),
+- eq_token: Token ! [ = ](tokens_helper(f, &node.eq_token.spans)),
++ eq_token: Token ! [=](tokens_helper(f, &node.eq_token.spans)),
+ rhs_ty: f.fold_type(node.rhs_ty),
+ }
+ }
+@@ -2652,7 +2625,7 @@ where
+ {
+ PredicateLifetime {
+ lifetime: f.fold_lifetime(node.lifetime),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_lifetime(it)),
+ }
+ }
+@@ -2664,7 +2637,7 @@ where
+ PredicateType {
+ lifetimes: (node.lifetimes).map(|it| f.fold_bound_lifetimes(it)),
+ bounded_ty: f.fold_type(node.bounded_ty),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_type_param_bound(it)),
+ }
+ }
+@@ -2674,11 +2647,11 @@ where
+ F: Fold + ?Sized,
+ {
+ QSelf {
+- lt_token: Token ! [ < ](tokens_helper(f, &node.lt_token.spans)),
++ lt_token: Token ! [<](tokens_helper(f, &node.lt_token.spans)),
+ ty: Box::new(f.fold_type(*node.ty)),
+ position: node.position,
+ as_token: (node.as_token).map(|it| Token![as](tokens_helper(f, &it.span))),
+- gt_token: Token ! [ > ](tokens_helper(f, &node.gt_token.spans)),
++ gt_token: Token ! [>](tokens_helper(f, &node.gt_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2691,7 +2664,7 @@ where
+ RangeLimits::HalfOpen(Token![..](tokens_helper(f, &_binding_0.spans)))
+ }
+ RangeLimits::Closed(_binding_0) => {
+- RangeLimits::Closed(Token ! [ ..= ](tokens_helper(f, &_binding_0.spans)))
++ RangeLimits::Closed(Token ! [..=](tokens_helper(f, &_binding_0.spans)))
+ }
+ }
+ }
+@@ -2704,7 +2677,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ reference: (node.reference).map(|it| {
+ (
+- Token ! [ & ](tokens_helper(f, &(it).0.spans)),
++ Token ! [&](tokens_helper(f, &(it).0.spans)),
+ ((it).1).map(|it| f.fold_lifetime(it)),
+ )
+ }),
+@@ -2720,7 +2693,7 @@ where
+ match node {
+ ReturnType::Default => ReturnType::Default,
+ ReturnType::Type(_binding_0, _binding_1) => ReturnType::Type(
+- Token ! [ -> ](tokens_helper(f, &_binding_0.spans)),
++ Token ! [->](tokens_helper(f, &_binding_0.spans)),
+ Box::new(f.fold_type(*_binding_1)),
+ ),
+ }
+@@ -2761,7 +2734,7 @@ where
+ Stmt::Expr(_binding_0) => Stmt::Expr(f.fold_expr(_binding_0)),
+ Stmt::Semi(_binding_0, _binding_1) => Stmt::Semi(
+ f.fold_expr(_binding_0),
+- Token ! [ ; ](tokens_helper(f, &_binding_1.spans)),
++ Token ! [;](tokens_helper(f, &_binding_1.spans)),
+ ),
+ }
+ }
+@@ -2785,7 +2758,7 @@ where
+ match node {
+ TraitBoundModifier::None => TraitBoundModifier::None,
+ TraitBoundModifier::Maybe(_binding_0) => {
+- TraitBoundModifier::Maybe(Token ! [ ? ](tokens_helper(f, &_binding_0.spans)))
++ TraitBoundModifier::Maybe(Token ! [?](tokens_helper(f, &_binding_0.spans)))
+ }
+ }
+ }
+@@ -2812,15 +2785,15 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ const_token: Token![const](tokens_helper(f, &node.const_token.span)),
+ ident: f.fold_ident(node.ident),
+- colon_token: Token ! [ : ](tokens_helper(f, &node.colon_token.spans)),
++ colon_token: Token ! [:](tokens_helper(f, &node.colon_token.spans)),
+ ty: f.fold_type(node.ty),
+ default: (node.default).map(|it| {
+ (
+- Token ! [ = ](tokens_helper(f, &(it).0.spans)),
++ Token ! [=](tokens_helper(f, &(it).0.spans)),
+ f.fold_expr((it).1),
+ )
+ }),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2831,7 +2804,7 @@ where
+ TraitItemMacro {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ mac: f.fold_macro(node.mac),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2843,7 +2816,7 @@ where
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ sig: f.fold_signature(node.sig),
+ default: (node.default).map(|it| f.fold_block(it)),
+- semi_token: (node.semi_token).map(|it| Token ! [ ; ](tokens_helper(f, &it.spans))),
++ semi_token: (node.semi_token).map(|it| Token ! [;](tokens_helper(f, &it.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -2856,15 +2829,15 @@ where
+ type_token: Token![type](tokens_helper(f, &node.type_token.span)),
+ ident: f.fold_ident(node.ident),
+ generics: f.fold_generics(node.generics),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_type_param_bound(it)),
+ default: (node.default).map(|it| {
+ (
+- Token ! [ = ](tokens_helper(f, &(it).0.spans)),
++ Token ! [=](tokens_helper(f, &(it).0.spans)),
+ f.fold_type((it).1),
+ )
+ }),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -2899,7 +2872,7 @@ where
+ TypeArray {
+ bracket_token: Bracket(tokens_helper(f, &node.bracket_token.span)),
+ elem: Box::new(f.fold_type(*node.elem)),
+- semi_token: Token ! [ ; ](tokens_helper(f, &node.semi_token.spans)),
++ semi_token: Token ! [;](tokens_helper(f, &node.semi_token.spans)),
+ len: f.fold_expr(node.len),
+ }
+ }
+@@ -2974,9 +2947,9 @@ where
+ TypeParam {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+ ident: f.fold_ident(node.ident),
+- colon_token: (node.colon_token).map(|it| Token ! [ : ](tokens_helper(f, &it.spans))),
++ colon_token: (node.colon_token).map(|it| Token ! [:](tokens_helper(f, &it.spans))),
+ bounds: FoldHelper::lift(node.bounds, |it| f.fold_type_param_bound(it)),
+- eq_token: (node.eq_token).map(|it| Token ! [ = ](tokens_helper(f, &it.spans))),
++ eq_token: (node.eq_token).map(|it| Token ! [=](tokens_helper(f, &it.spans))),
+ default: (node.default).map(|it| f.fold_type(it)),
+ }
+ }
+@@ -3018,7 +2991,7 @@ where
+ F: Fold + ?Sized,
+ {
+ TypePtr {
+- star_token: Token ! [ * ](tokens_helper(f, &node.star_token.spans)),
++ star_token: Token ! [*](tokens_helper(f, &node.star_token.spans)),
+ const_token: (node.const_token).map(|it| Token![const](tokens_helper(f, &it.span))),
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ elem: Box::new(f.fold_type(*node.elem)),
+@@ -3030,7 +3003,7 @@ where
+ F: Fold + ?Sized,
+ {
+ TypeReference {
+- and_token: Token ! [ & ](tokens_helper(f, &node.and_token.spans)),
++ and_token: Token ! [&](tokens_helper(f, &node.and_token.spans)),
+ lifetime: (node.lifetime).map(|it| f.fold_lifetime(it)),
+ mutability: (node.mutability).map(|it| Token![mut](tokens_helper(f, &it.span))),
+ elem: Box::new(f.fold_type(*node.elem)),
+@@ -3072,9 +3045,9 @@ where
+ F: Fold + ?Sized,
+ {
+ match node {
+- UnOp::Deref(_binding_0) => UnOp::Deref(Token ! [ * ](tokens_helper(f, &_binding_0.spans))),
++ UnOp::Deref(_binding_0) => UnOp::Deref(Token ! [*](tokens_helper(f, &_binding_0.spans))),
+ UnOp::Not(_binding_0) => UnOp::Not(Token![!](tokens_helper(f, &_binding_0.spans))),
+- UnOp::Neg(_binding_0) => UnOp::Neg(Token ! [ - ](tokens_helper(f, &_binding_0.spans))),
++ UnOp::Neg(_binding_0) => UnOp::Neg(Token ! [-](tokens_helper(f, &_binding_0.spans))),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -3083,7 +3056,7 @@ where
+ F: Fold + ?Sized,
+ {
+ UseGlob {
+- star_token: Token ! [ * ](tokens_helper(f, &node.star_token.spans)),
++ star_token: Token ! [*](tokens_helper(f, &node.star_token.spans)),
+ }
+ }
+ #[cfg(feature = "full")]
+@@ -3112,7 +3085,7 @@ where
+ {
+ UsePath {
+ ident: f.fold_ident(node.ident),
+- colon2_token: Token ! [ :: ](tokens_helper(f, &node.colon2_token.spans)),
++ colon2_token: Token ! [::](tokens_helper(f, &node.colon2_token.spans)),
+ tree: Box::new(f.fold_use_tree(*node.tree)),
+ }
+ }
+@@ -3147,7 +3120,7 @@ where
+ {
+ Variadic {
+ attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
+- dots: Token ! [ ... ](tokens_helper(f, &node.dots.spans)),
++ dots: Token ! [...](tokens_helper(f, &node.dots.spans)),
+ }
+ }
+ #[cfg(any(feature = "derive", feature = "full"))]
+@@ -3161,7 +3134,7 @@ where
+ fields: f.fold_fields(node.fields),
+ discriminant: (node.discriminant).map(|it| {
+ (
+- Token ! [ = ](tokens_helper(f, &(it).0.spans)),
++ Token ! [=](tokens_helper(f, &(it).0.spans)),
+ f.fold_expr((it).1),
+ )
+ }),
+diff --git a/third_party/rust/syn/src/gen/hash.rs b/third_party/rust/syn/src/gen/hash.rs
+new file mode 100644
+index 0000000000..9e9e84a7af
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/gen/hash.rs
+@@ -0,0 +1,2691 @@
++// This file is @generated by syn-internal-codegen.
++// It is not intended for manual editing.
++
++#[cfg(any(feature = "derive", feature = "full"))]
++use crate::tt::TokenStreamHelper;
++use crate::*;
++use std::hash::{Hash, Hasher};
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Abi {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.name.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for AngleBracketedGenericArguments {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.colon2_token.hash(state);
++ self.args.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Arm {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.pat.hash(state);
++ self.guard.hash(state);
++ self.body.hash(state);
++ self.comma.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for AttrStyle {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ AttrStyle::Outer => {
++ state.write_u8(0u8);
++ }
++ AttrStyle::Inner(_) => {
++ state.write_u8(1u8);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Attribute {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.style.hash(state);
++ self.path.hash(state);
++ TokenStreamHelper(&self.tokens).hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for BareFnArg {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.name.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for BinOp {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ BinOp::Add(_) => {
++ state.write_u8(0u8);
++ }
++ BinOp::Sub(_) => {
++ state.write_u8(1u8);
++ }
++ BinOp::Mul(_) => {
++ state.write_u8(2u8);
++ }
++ BinOp::Div(_) => {
++ state.write_u8(3u8);
++ }
++ BinOp::Rem(_) => {
++ state.write_u8(4u8);
++ }
++ BinOp::And(_) => {
++ state.write_u8(5u8);
++ }
++ BinOp::Or(_) => {
++ state.write_u8(6u8);
++ }
++ BinOp::BitXor(_) => {
++ state.write_u8(7u8);
++ }
++ BinOp::BitAnd(_) => {
++ state.write_u8(8u8);
++ }
++ BinOp::BitOr(_) => {
++ state.write_u8(9u8);
++ }
++ BinOp::Shl(_) => {
++ state.write_u8(10u8);
++ }
++ BinOp::Shr(_) => {
++ state.write_u8(11u8);
++ }
++ BinOp::Eq(_) => {
++ state.write_u8(12u8);
++ }
++ BinOp::Lt(_) => {
++ state.write_u8(13u8);
++ }
++ BinOp::Le(_) => {
++ state.write_u8(14u8);
++ }
++ BinOp::Ne(_) => {
++ state.write_u8(15u8);
++ }
++ BinOp::Ge(_) => {
++ state.write_u8(16u8);
++ }
++ BinOp::Gt(_) => {
++ state.write_u8(17u8);
++ }
++ BinOp::AddEq(_) => {
++ state.write_u8(18u8);
++ }
++ BinOp::SubEq(_) => {
++ state.write_u8(19u8);
++ }
++ BinOp::MulEq(_) => {
++ state.write_u8(20u8);
++ }
++ BinOp::DivEq(_) => {
++ state.write_u8(21u8);
++ }
++ BinOp::RemEq(_) => {
++ state.write_u8(22u8);
++ }
++ BinOp::BitXorEq(_) => {
++ state.write_u8(23u8);
++ }
++ BinOp::BitAndEq(_) => {
++ state.write_u8(24u8);
++ }
++ BinOp::BitOrEq(_) => {
++ state.write_u8(25u8);
++ }
++ BinOp::ShlEq(_) => {
++ state.write_u8(26u8);
++ }
++ BinOp::ShrEq(_) => {
++ state.write_u8(27u8);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Binding {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Block {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.stmts.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for BoundLifetimes {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lifetimes.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ConstParam {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ self.eq_token.hash(state);
++ self.default.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Constraint {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ self.bounds.hash(state);
++ }
++}
++#[cfg(feature = "derive")]
++impl Hash for Data {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Data::Struct(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Data::Enum(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Data::Union(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(feature = "derive")]
++impl Hash for DataEnum {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.variants.hash(state);
++ }
++}
++#[cfg(feature = "derive")]
++impl Hash for DataStruct {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.fields.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "derive")]
++impl Hash for DataUnion {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.fields.hash(state);
++ }
++}
++#[cfg(feature = "derive")]
++impl Hash for DeriveInput {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.data.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Expr {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ #[cfg(feature = "full")]
++ Expr::Array(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Assign(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::AssignOp(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Async(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Await(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ Expr::Binary(v0) => {
++ state.write_u8(5u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Block(v0) => {
++ state.write_u8(6u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Box(v0) => {
++ state.write_u8(7u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Break(v0) => {
++ state.write_u8(8u8);
++ v0.hash(state);
++ }
++ Expr::Call(v0) => {
++ state.write_u8(9u8);
++ v0.hash(state);
++ }
++ Expr::Cast(v0) => {
++ state.write_u8(10u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Closure(v0) => {
++ state.write_u8(11u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Continue(v0) => {
++ state.write_u8(12u8);
++ v0.hash(state);
++ }
++ Expr::Field(v0) => {
++ state.write_u8(13u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::ForLoop(v0) => {
++ state.write_u8(14u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Group(v0) => {
++ state.write_u8(15u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::If(v0) => {
++ state.write_u8(16u8);
++ v0.hash(state);
++ }
++ Expr::Index(v0) => {
++ state.write_u8(17u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Let(v0) => {
++ state.write_u8(18u8);
++ v0.hash(state);
++ }
++ Expr::Lit(v0) => {
++ state.write_u8(19u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Loop(v0) => {
++ state.write_u8(20u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Macro(v0) => {
++ state.write_u8(21u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Match(v0) => {
++ state.write_u8(22u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::MethodCall(v0) => {
++ state.write_u8(23u8);
++ v0.hash(state);
++ }
++ Expr::Paren(v0) => {
++ state.write_u8(24u8);
++ v0.hash(state);
++ }
++ Expr::Path(v0) => {
++ state.write_u8(25u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Range(v0) => {
++ state.write_u8(26u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Reference(v0) => {
++ state.write_u8(27u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Repeat(v0) => {
++ state.write_u8(28u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Return(v0) => {
++ state.write_u8(29u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Struct(v0) => {
++ state.write_u8(30u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Try(v0) => {
++ state.write_u8(31u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::TryBlock(v0) => {
++ state.write_u8(32u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Tuple(v0) => {
++ state.write_u8(33u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Type(v0) => {
++ state.write_u8(34u8);
++ v0.hash(state);
++ }
++ Expr::Unary(v0) => {
++ state.write_u8(35u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Unsafe(v0) => {
++ state.write_u8(36u8);
++ v0.hash(state);
++ }
++ Expr::Verbatim(v0) => {
++ state.write_u8(37u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::While(v0) => {
++ state.write_u8(38u8);
++ v0.hash(state);
++ }
++ #[cfg(feature = "full")]
++ Expr::Yield(v0) => {
++ state.write_u8(39u8);
++ v0.hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprArray {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.elems.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprAssign {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.left.hash(state);
++ self.right.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprAssignOp {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.left.hash(state);
++ self.op.hash(state);
++ self.right.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprAsync {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.capture.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprAwait {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.base.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprBinary {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.left.hash(state);
++ self.op.hash(state);
++ self.right.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprBlock {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprBox {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprBreak {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprCall {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.func.hash(state);
++ self.args.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprCast {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprClosure {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.asyncness.hash(state);
++ self.movability.hash(state);
++ self.capture.hash(state);
++ self.inputs.hash(state);
++ self.output.hash(state);
++ self.body.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprContinue {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprField {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.base.hash(state);
++ self.member.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprForLoop {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ self.pat.hash(state);
++ self.expr.hash(state);
++ self.body.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprGroup {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprIf {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.cond.hash(state);
++ self.then_branch.hash(state);
++ self.else_branch.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprIndex {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ self.index.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprLet {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.pat.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprLit {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.lit.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprLoop {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ self.body.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mac.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprMatch {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ self.arms.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprMethodCall {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.receiver.hash(state);
++ self.method.hash(state);
++ self.turbofish.hash(state);
++ self.args.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprParen {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprPath {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.qself.hash(state);
++ self.path.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprRange {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.from.hash(state);
++ self.limits.hash(state);
++ self.to.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprReference {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mutability.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprRepeat {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ self.len.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprReturn {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprStruct {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.path.hash(state);
++ self.fields.hash(state);
++ self.dot2_token.hash(state);
++ self.rest.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprTry {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprTryBlock {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprTuple {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.elems.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ExprUnary {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.op.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprUnsafe {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprWhile {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.label.hash(state);
++ self.cond.hash(state);
++ self.body.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ExprYield {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Field {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.colon_token.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for FieldPat {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.member.hash(state);
++ self.colon_token.hash(state);
++ self.pat.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for FieldValue {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.member.hash(state);
++ self.colon_token.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Fields {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Fields::Named(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Fields::Unnamed(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Fields::Unit => {
++ state.write_u8(2u8);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for FieldsNamed {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.named.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for FieldsUnnamed {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.unnamed.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for File {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.shebang.hash(state);
++ self.attrs.hash(state);
++ self.items.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for FnArg {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ FnArg::Receiver(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ FnArg::Typed(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ForeignItem {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ ForeignItem::Fn(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ ForeignItem::Static(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ ForeignItem::Type(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ ForeignItem::Macro(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ ForeignItem::Verbatim(v0) => {
++ state.write_u8(4u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ForeignItemFn {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.sig.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ForeignItemMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mac.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ForeignItemStatic {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.mutability.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ForeignItemType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for GenericArgument {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ GenericArgument::Lifetime(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ GenericArgument::Type(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ GenericArgument::Binding(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ GenericArgument::Constraint(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ GenericArgument::Const(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for GenericMethodArgument {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ GenericMethodArgument::Type(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ GenericMethodArgument::Const(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for GenericParam {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ GenericParam::Type(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ GenericParam::Lifetime(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ GenericParam::Const(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Generics {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lt_token.hash(state);
++ self.params.hash(state);
++ self.gt_token.hash(state);
++ self.where_clause.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ImplItem {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ ImplItem::Const(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ ImplItem::Method(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ ImplItem::Type(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ ImplItem::Macro(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ ImplItem::Verbatim(v0) => {
++ state.write_u8(4u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ImplItemConst {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.defaultness.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ImplItemMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mac.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ImplItemMethod {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.defaultness.hash(state);
++ self.sig.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ImplItemType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.defaultness.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Item {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Item::Const(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Item::Enum(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Item::ExternCrate(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Item::Fn(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ Item::ForeignMod(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ Item::Impl(v0) => {
++ state.write_u8(5u8);
++ v0.hash(state);
++ }
++ Item::Macro(v0) => {
++ state.write_u8(6u8);
++ v0.hash(state);
++ }
++ Item::Macro2(v0) => {
++ state.write_u8(7u8);
++ v0.hash(state);
++ }
++ Item::Mod(v0) => {
++ state.write_u8(8u8);
++ v0.hash(state);
++ }
++ Item::Static(v0) => {
++ state.write_u8(9u8);
++ v0.hash(state);
++ }
++ Item::Struct(v0) => {
++ state.write_u8(10u8);
++ v0.hash(state);
++ }
++ Item::Trait(v0) => {
++ state.write_u8(11u8);
++ v0.hash(state);
++ }
++ Item::TraitAlias(v0) => {
++ state.write_u8(12u8);
++ v0.hash(state);
++ }
++ Item::Type(v0) => {
++ state.write_u8(13u8);
++ v0.hash(state);
++ }
++ Item::Union(v0) => {
++ state.write_u8(14u8);
++ v0.hash(state);
++ }
++ Item::Use(v0) => {
++ state.write_u8(15u8);
++ v0.hash(state);
++ }
++ Item::Verbatim(v0) => {
++ state.write_u8(16u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemConst {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemEnum {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.variants.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemExternCrate {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.rename.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemFn {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.sig.hash(state);
++ self.block.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemForeignMod {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.abi.hash(state);
++ self.items.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemImpl {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.defaultness.hash(state);
++ self.unsafety.hash(state);
++ self.generics.hash(state);
++ self.trait_.hash(state);
++ self.self_ty.hash(state);
++ self.items.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.mac.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemMacro2 {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ TokenStreamHelper(&self.rules).hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemMod {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.content.hash(state);
++ self.semi.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemStatic {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.mutability.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemStruct {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.fields.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemTrait {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.unsafety.hash(state);
++ self.auto_token.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.colon_token.hash(state);
++ self.supertraits.hash(state);
++ self.items.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemTraitAlias {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.bounds.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemUnion {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.fields.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for ItemUse {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.vis.hash(state);
++ self.leading_colon.hash(state);
++ self.tree.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Label {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.name.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for LifetimeDef {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.lifetime.hash(state);
++ self.colon_token.hash(state);
++ self.bounds.hash(state);
++ }
++}
++impl Hash for Lit {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Lit::Str(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Lit::ByteStr(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Lit::Byte(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Lit::Char(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ Lit::Int(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ Lit::Float(v0) => {
++ state.write_u8(5u8);
++ v0.hash(state);
++ }
++ Lit::Bool(v0) => {
++ state.write_u8(6u8);
++ v0.hash(state);
++ }
++ Lit::Verbatim(v0) => {
++ state.write_u8(7u8);
++ v0.to_string().hash(state);
++ }
++ }
++ }
++}
++impl Hash for LitBool {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.value.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Local {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.pat.hash(state);
++ self.init.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Macro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.path.hash(state);
++ self.delimiter.hash(state);
++ TokenStreamHelper(&self.tokens).hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for MacroDelimiter {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ MacroDelimiter::Paren(_) => {
++ state.write_u8(0u8);
++ }
++ MacroDelimiter::Brace(_) => {
++ state.write_u8(1u8);
++ }
++ MacroDelimiter::Bracket(_) => {
++ state.write_u8(2u8);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Meta {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Meta::Path(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Meta::List(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Meta::NameValue(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for MetaList {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.path.hash(state);
++ self.nested.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for MetaNameValue {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.path.hash(state);
++ self.lit.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for MethodTurbofish {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.args.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for NestedMeta {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ NestedMeta::Meta(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ NestedMeta::Lit(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ParenthesizedGenericArguments {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.inputs.hash(state);
++ self.output.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Pat {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Pat::Box(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Pat::Ident(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Pat::Lit(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Pat::Macro(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ Pat::Or(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ Pat::Path(v0) => {
++ state.write_u8(5u8);
++ v0.hash(state);
++ }
++ Pat::Range(v0) => {
++ state.write_u8(6u8);
++ v0.hash(state);
++ }
++ Pat::Reference(v0) => {
++ state.write_u8(7u8);
++ v0.hash(state);
++ }
++ Pat::Rest(v0) => {
++ state.write_u8(8u8);
++ v0.hash(state);
++ }
++ Pat::Slice(v0) => {
++ state.write_u8(9u8);
++ v0.hash(state);
++ }
++ Pat::Struct(v0) => {
++ state.write_u8(10u8);
++ v0.hash(state);
++ }
++ Pat::Tuple(v0) => {
++ state.write_u8(11u8);
++ v0.hash(state);
++ }
++ Pat::TupleStruct(v0) => {
++ state.write_u8(12u8);
++ v0.hash(state);
++ }
++ Pat::Type(v0) => {
++ state.write_u8(13u8);
++ v0.hash(state);
++ }
++ Pat::Verbatim(v0) => {
++ state.write_u8(14u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ Pat::Wild(v0) => {
++ state.write_u8(15u8);
++ v0.hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatBox {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.pat.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatIdent {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.by_ref.hash(state);
++ self.mutability.hash(state);
++ self.ident.hash(state);
++ self.subpat.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatLit {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.expr.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mac.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatOr {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.leading_vert.hash(state);
++ self.cases.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatPath {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.qself.hash(state);
++ self.path.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatRange {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.lo.hash(state);
++ self.limits.hash(state);
++ self.hi.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatReference {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mutability.hash(state);
++ self.pat.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatRest {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatSlice {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.elems.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatStruct {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.path.hash(state);
++ self.fields.hash(state);
++ self.dot2_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatTuple {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.elems.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatTupleStruct {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.path.hash(state);
++ self.pat.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.pat.hash(state);
++ self.ty.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for PatWild {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Path {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.leading_colon.hash(state);
++ self.segments.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for PathArguments {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ PathArguments::None => {
++ state.write_u8(0u8);
++ }
++ PathArguments::AngleBracketed(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ PathArguments::Parenthesized(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for PathSegment {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ self.arguments.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for PredicateEq {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lhs_ty.hash(state);
++ self.rhs_ty.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for PredicateLifetime {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lifetime.hash(state);
++ self.bounds.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for PredicateType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lifetimes.hash(state);
++ self.bounded_ty.hash(state);
++ self.bounds.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for QSelf {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ty.hash(state);
++ self.position.hash(state);
++ self.as_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for RangeLimits {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ RangeLimits::HalfOpen(_) => {
++ state.write_u8(0u8);
++ }
++ RangeLimits::Closed(_) => {
++ state.write_u8(1u8);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Receiver {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.reference.hash(state);
++ self.mutability.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for ReturnType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ ReturnType::Default => {
++ state.write_u8(0u8);
++ }
++ ReturnType::Type(_, v1) => {
++ state.write_u8(1u8);
++ v1.hash(state);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Signature {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.constness.hash(state);
++ self.asyncness.hash(state);
++ self.unsafety.hash(state);
++ self.abi.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.inputs.hash(state);
++ self.variadic.hash(state);
++ self.output.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for Stmt {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Stmt::Local(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Stmt::Item(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Stmt::Expr(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Stmt::Semi(v0, _) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TraitBound {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.paren_token.hash(state);
++ self.modifier.hash(state);
++ self.lifetimes.hash(state);
++ self.path.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TraitBoundModifier {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ TraitBoundModifier::None => {
++ state.write_u8(0u8);
++ }
++ TraitBoundModifier::Maybe(_) => {
++ state.write_u8(1u8);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for TraitItem {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ TraitItem::Const(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ TraitItem::Method(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ TraitItem::Type(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ TraitItem::Macro(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ TraitItem::Verbatim(v0) => {
++ state.write_u8(4u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for TraitItemConst {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.ty.hash(state);
++ self.default.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for TraitItemMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.mac.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for TraitItemMethod {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.sig.hash(state);
++ self.default.hash(state);
++ self.semi_token.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for TraitItemType {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.generics.hash(state);
++ self.colon_token.hash(state);
++ self.bounds.hash(state);
++ self.default.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Type {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Type::Array(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Type::BareFn(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Type::Group(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Type::ImplTrait(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ Type::Infer(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ Type::Macro(v0) => {
++ state.write_u8(5u8);
++ v0.hash(state);
++ }
++ Type::Never(v0) => {
++ state.write_u8(6u8);
++ v0.hash(state);
++ }
++ Type::Paren(v0) => {
++ state.write_u8(7u8);
++ v0.hash(state);
++ }
++ Type::Path(v0) => {
++ state.write_u8(8u8);
++ v0.hash(state);
++ }
++ Type::Ptr(v0) => {
++ state.write_u8(9u8);
++ v0.hash(state);
++ }
++ Type::Reference(v0) => {
++ state.write_u8(10u8);
++ v0.hash(state);
++ }
++ Type::Slice(v0) => {
++ state.write_u8(11u8);
++ v0.hash(state);
++ }
++ Type::TraitObject(v0) => {
++ state.write_u8(12u8);
++ v0.hash(state);
++ }
++ Type::Tuple(v0) => {
++ state.write_u8(13u8);
++ v0.hash(state);
++ }
++ Type::Verbatim(v0) => {
++ state.write_u8(14u8);
++ TokenStreamHelper(v0).hash(state);
++ }
++ _ => unreachable!(),
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeArray {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.elem.hash(state);
++ self.len.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeBareFn {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lifetimes.hash(state);
++ self.unsafety.hash(state);
++ self.abi.hash(state);
++ self.inputs.hash(state);
++ self.variadic.hash(state);
++ self.output.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeGroup {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.elem.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeImplTrait {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.bounds.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeInfer {
++ fn hash<H>(&self, _state: &mut H)
++ where
++ H: Hasher,
++ {
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeMacro {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.mac.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeNever {
++ fn hash<H>(&self, _state: &mut H)
++ where
++ H: Hasher,
++ {
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeParam {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.colon_token.hash(state);
++ self.bounds.hash(state);
++ self.eq_token.hash(state);
++ self.default.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeParamBound {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ TypeParamBound::Trait(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ TypeParamBound::Lifetime(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeParen {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.elem.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypePath {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.qself.hash(state);
++ self.path.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypePtr {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.const_token.hash(state);
++ self.mutability.hash(state);
++ self.elem.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeReference {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.lifetime.hash(state);
++ self.mutability.hash(state);
++ self.elem.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeSlice {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.elem.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeTraitObject {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.dyn_token.hash(state);
++ self.bounds.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for TypeTuple {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.elems.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for UnOp {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ UnOp::Deref(_) => {
++ state.write_u8(0u8);
++ }
++ UnOp::Not(_) => {
++ state.write_u8(1u8);
++ }
++ UnOp::Neg(_) => {
++ state.write_u8(2u8);
++ }
++ }
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UseGlob {
++ fn hash<H>(&self, _state: &mut H)
++ where
++ H: Hasher,
++ {
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UseGroup {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.items.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UseName {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UsePath {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ self.tree.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UseRename {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.ident.hash(state);
++ self.rename.hash(state);
++ }
++}
++#[cfg(feature = "full")]
++impl Hash for UseTree {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ UseTree::Path(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ UseTree::Name(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ UseTree::Rename(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ UseTree::Glob(v0) => {
++ state.write_u8(3u8);
++ v0.hash(state);
++ }
++ UseTree::Group(v0) => {
++ state.write_u8(4u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Variadic {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Variant {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.attrs.hash(state);
++ self.ident.hash(state);
++ self.fields.hash(state);
++ self.discriminant.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for VisCrate {
++ fn hash<H>(&self, _state: &mut H)
++ where
++ H: Hasher,
++ {
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for VisPublic {
++ fn hash<H>(&self, _state: &mut H)
++ where
++ H: Hasher,
++ {
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for VisRestricted {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.in_token.hash(state);
++ self.path.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for Visibility {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ Visibility::Public(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ Visibility::Crate(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ Visibility::Restricted(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ Visibility::Inherited => {
++ state.write_u8(3u8);
++ }
++ }
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for WhereClause {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ self.predicates.hash(state);
++ }
++}
++#[cfg(any(feature = "derive", feature = "full"))]
++impl Hash for WherePredicate {
++ fn hash<H>(&self, state: &mut H)
++ where
++ H: Hasher,
++ {
++ match self {
++ WherePredicate::Type(v0) => {
++ state.write_u8(0u8);
++ v0.hash(state);
++ }
++ WherePredicate::Lifetime(v0) => {
++ state.write_u8(1u8);
++ v0.hash(state);
++ }
++ WherePredicate::Eq(v0) => {
++ state.write_u8(2u8);
++ v0.hash(state);
++ }
++ }
++ }
++}
+diff --git a/third_party/rust/syn/src/gen/visit.rs b/third_party/rust/syn/src/gen/visit.rs
+index b667f530c3..24d34b7480 100644
+--- mozilla-release/third_party/rust/syn/src/gen/visit.rs
++++ mozilla-release/third_party/rust/syn/src/gen/visit.rs
+@@ -20,7 +20,6 @@ macro_rules! full {
+ unreachable!()
+ };
+ }
+-#[cfg(any(feature = "full", feature = "derive"))]
+ macro_rules! skip {
+ ($($tt:tt)*) => {};
+ }
+@@ -30,7 +29,7 @@ macro_rules! skip {
+ ///
+ /// [module documentation]: self
+ ///
+-/// *This trait is available if Syn is built with the `"visit"` feature.*
++/// *This trait is available only if Syn is built with the `"visit"` feature.*
+ pub trait Visit<'ast> {
+ #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_abi(&mut self, i: &'ast Abi) {
+@@ -434,35 +433,27 @@ pub trait Visit<'ast> {
+ fn visit_lifetime_def(&mut self, i: &'ast LifetimeDef) {
+ visit_lifetime_def(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit(&mut self, i: &'ast Lit) {
+ visit_lit(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_bool(&mut self, i: &'ast LitBool) {
+ visit_lit_bool(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_byte(&mut self, i: &'ast LitByte) {
+ visit_lit_byte(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_byte_str(&mut self, i: &'ast LitByteStr) {
+ visit_lit_byte_str(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_char(&mut self, i: &'ast LitChar) {
+ visit_lit_char(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_float(&mut self, i: &'ast LitFloat) {
+ visit_lit_float(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_int(&mut self, i: &'ast LitInt) {
+ visit_lit_int(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_str(&mut self, i: &'ast LitStr) {
+ visit_lit_str(self, i)
+ }
+@@ -2537,7 +2528,6 @@ where
+ }
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit<'ast, V>(v: &mut V, node: &'ast Lit)
+ where
+ V: Visit<'ast> + ?Sized,
+@@ -2569,7 +2559,6 @@ where
+ }
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_bool<'ast, V>(v: &mut V, node: &'ast LitBool)
+ where
+ V: Visit<'ast> + ?Sized,
+@@ -2577,37 +2566,31 @@ where
+ skip!(node.value);
+ v.visit_span(&node.span);
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_byte<'ast, V>(v: &mut V, node: &'ast LitByte)
+ where
+ V: Visit<'ast> + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_byte_str<'ast, V>(v: &mut V, node: &'ast LitByteStr)
+ where
+ V: Visit<'ast> + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_char<'ast, V>(v: &mut V, node: &'ast LitChar)
+ where
+ V: Visit<'ast> + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_float<'ast, V>(v: &mut V, node: &'ast LitFloat)
+ where
+ V: Visit<'ast> + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_int<'ast, V>(v: &mut V, node: &'ast LitInt)
+ where
+ V: Visit<'ast> + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_str<'ast, V>(v: &mut V, node: &'ast LitStr)
+ where
+ V: Visit<'ast> + ?Sized,
+diff --git a/third_party/rust/syn/src/gen/visit_mut.rs b/third_party/rust/syn/src/gen/visit_mut.rs
+index 5cddb827c6..5ce11f0b2e 100644
+--- mozilla-release/third_party/rust/syn/src/gen/visit_mut.rs
++++ mozilla-release/third_party/rust/syn/src/gen/visit_mut.rs
+@@ -20,7 +20,6 @@ macro_rules! full {
+ unreachable!()
+ };
+ }
+-#[cfg(any(feature = "full", feature = "derive"))]
+ macro_rules! skip {
+ ($($tt:tt)*) => {};
+ }
+@@ -31,7 +30,7 @@ macro_rules! skip {
+ ///
+ /// [module documentation]: self
+ ///
+-/// *This trait is available if Syn is built with the `"visit-mut"` feature.*
++/// *This trait is available only if Syn is built with the `"visit-mut"` feature.*
+ pub trait VisitMut {
+ #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_abi_mut(&mut self, i: &mut Abi) {
+@@ -438,35 +437,27 @@ pub trait VisitMut {
+ fn visit_lifetime_def_mut(&mut self, i: &mut LifetimeDef) {
+ visit_lifetime_def_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_mut(&mut self, i: &mut Lit) {
+ visit_lit_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_bool_mut(&mut self, i: &mut LitBool) {
+ visit_lit_bool_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_byte_mut(&mut self, i: &mut LitByte) {
+ visit_lit_byte_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_byte_str_mut(&mut self, i: &mut LitByteStr) {
+ visit_lit_byte_str_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_char_mut(&mut self, i: &mut LitChar) {
+ visit_lit_char_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_float_mut(&mut self, i: &mut LitFloat) {
+ visit_lit_float_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_int_mut(&mut self, i: &mut LitInt) {
+ visit_lit_int_mut(self, i)
+ }
+- #[cfg(any(feature = "derive", feature = "full"))]
+ fn visit_lit_str_mut(&mut self, i: &mut LitStr) {
+ visit_lit_str_mut(self, i)
+ }
+@@ -2543,7 +2534,6 @@ where
+ }
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_mut<V>(v: &mut V, node: &mut Lit)
+ where
+ V: VisitMut + ?Sized,
+@@ -2575,7 +2565,6 @@ where
+ }
+ }
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_bool_mut<V>(v: &mut V, node: &mut LitBool)
+ where
+ V: VisitMut + ?Sized,
+@@ -2583,37 +2572,31 @@ where
+ skip!(node.value);
+ v.visit_span_mut(&mut node.span);
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_byte_mut<V>(v: &mut V, node: &mut LitByte)
+ where
+ V: VisitMut + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_byte_str_mut<V>(v: &mut V, node: &mut LitByteStr)
+ where
+ V: VisitMut + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_char_mut<V>(v: &mut V, node: &mut LitChar)
+ where
+ V: VisitMut + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_float_mut<V>(v: &mut V, node: &mut LitFloat)
+ where
+ V: VisitMut + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_int_mut<V>(v: &mut V, node: &mut LitInt)
+ where
+ V: VisitMut + ?Sized,
+ {
+ }
+-#[cfg(any(feature = "derive", feature = "full"))]
+ pub fn visit_lit_str_mut<V>(v: &mut V, node: &mut LitStr)
+ where
+ V: VisitMut + ?Sized,
+diff --git a/third_party/rust/syn/src/generics.rs b/third_party/rust/syn/src/generics.rs
+index 95ab2e404a..05e8ef5cdf 100644
+--- mozilla-release/third_party/rust/syn/src/generics.rs
++++ mozilla-release/third_party/rust/syn/src/generics.rs
+@@ -1,13 +1,16 @@
+ use super::*;
+ use crate::punctuated::{Iter, IterMut, Punctuated};
++#[cfg(all(feature = "printing", feature = "extra-traits"))]
++use std::fmt::{self, Debug};
++#[cfg(all(feature = "printing", feature = "extra-traits"))]
++use std::hash::{Hash, Hasher};
+
+ ast_struct! {
+ /// Lifetimes and type parameters attached to a declaration of a function,
+ /// enum, trait, etc.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- #[derive(Default)]
+ pub struct Generics {
+ pub lt_token: Option<Token![<]>,
+ pub params: Punctuated<GenericParam, Token![,]>,
+@@ -20,7 +23,7 @@ ast_enum_of_structs! {
+ /// A generic type parameter, lifetime, or const generic: `T: Into<String>`,
+ /// `'a: 'b`, `const LEN: usize`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Syntax tree enum
+@@ -28,9 +31,6 @@ ast_enum_of_structs! {
+ /// This type is a [syntax tree enum].
+ ///
+ /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
+- //
+- // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+- // blocked on https://github.com/rust-lang/rust/issues/62833
+ pub enum GenericParam {
+ /// A generic type parameter: `T: Into<String>`.
+ Type(TypeParam),
+@@ -46,7 +46,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A generic type parameter: `T: Into<String>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeParam {
+ pub attrs: Vec<Attribute>,
+@@ -61,7 +61,7 @@ ast_struct! {
+ ast_struct! {
+ /// A lifetime definition: `'a: 'b + 'c + 'd`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct LifetimeDef {
+ pub attrs: Vec<Attribute>,
+@@ -74,7 +74,7 @@ ast_struct! {
+ ast_struct! {
+ /// A const generic parameter: `const LENGTH: usize`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct ConstParam {
+ pub attrs: Vec<Attribute>,
+@@ -87,6 +87,17 @@ ast_struct! {
+ }
+ }
+
++impl Default for Generics {
++ fn default() -> Self {
++ Generics {
++ lt_token: None,
++ params: Punctuated::new(),
++ gt_token: None,
++ where_clause: None,
++ }
++ }
++}
++
+ impl Generics {
+ /// Returns an
+ /// <code
+@@ -280,29 +291,23 @@ impl<'a> Iterator for ConstParamsMut<'a> {
+
+ /// Returned by `Generics::split_for_impl`.
+ ///
+-/// *This type is available if Syn is built with the `"derive"` or `"full"`
++/// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature and the `"printing"` feature.*
+ #[cfg(feature = "printing")]
+-#[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct ImplGenerics<'a>(&'a Generics);
+
+ /// Returned by `Generics::split_for_impl`.
+ ///
+-/// *This type is available if Syn is built with the `"derive"` or `"full"`
++/// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature and the `"printing"` feature.*
+ #[cfg(feature = "printing")]
+-#[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct TypeGenerics<'a>(&'a Generics);
+
+ /// Returned by `TypeGenerics::as_turbofish`.
+ ///
+-/// *This type is available if Syn is built with the `"derive"` or `"full"`
++/// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature and the `"printing"` feature.*
+ #[cfg(feature = "printing")]
+-#[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct Turbofish<'a>(&'a Generics);
+
+ #[cfg(feature = "printing")]
+@@ -314,9 +319,8 @@ impl Generics {
+ /// # use proc_macro2::{Span, Ident};
+ /// # use quote::quote;
+ /// #
+- /// # fn main() {
+- /// # let generics: syn::Generics = Default::default();
+- /// # let name = Ident::new("MyType", Span::call_site());
++ /// # let generics: syn::Generics = Default::default();
++ /// # let name = Ident::new("MyType", Span::call_site());
+ /// #
+ /// let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
+ /// quote! {
+@@ -324,11 +328,10 @@ impl Generics {
+ /// // ...
+ /// }
+ /// }
+- /// # ;
+- /// # }
++ /// # ;
+ /// ```
+ ///
+- /// *This method is available if Syn is built with the `"derive"` or
++ /// *This method is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature and the `"printing"` feature.*
+ pub fn split_for_impl(&self) -> (ImplGenerics, TypeGenerics, Option<&WhereClause>) {
+ (
+@@ -339,11 +342,57 @@ impl Generics {
+ }
+ }
+
++#[cfg(feature = "printing")]
++macro_rules! generics_wrapper_impls {
++ ($ty:ident) => {
++ #[cfg(feature = "clone-impls")]
++ impl<'a> Clone for $ty<'a> {
++ fn clone(&self) -> Self {
++ $ty(self.0)
++ }
++ }
++
++ #[cfg(feature = "extra-traits")]
++ impl<'a> Debug for $ty<'a> {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ formatter
++ .debug_tuple(stringify!($ty))
++ .field(self.0)
++ .finish()
++ }
++ }
++
++ #[cfg(feature = "extra-traits")]
++ impl<'a> Eq for $ty<'a> {}
++
++ #[cfg(feature = "extra-traits")]
++ impl<'a> PartialEq for $ty<'a> {
++ fn eq(&self, other: &Self) -> bool {
++ self.0 == other.0
++ }
++ }
++
++ #[cfg(feature = "extra-traits")]
++ impl<'a> Hash for $ty<'a> {
++ fn hash<H: Hasher>(&self, state: &mut H) {
++ self.0.hash(state);
++ }
++ }
++ };
++}
++
++#[cfg(feature = "printing")]
++generics_wrapper_impls!(ImplGenerics);
++#[cfg(feature = "printing")]
++generics_wrapper_impls!(TypeGenerics);
++#[cfg(feature = "printing")]
++generics_wrapper_impls!(Turbofish);
++
+ #[cfg(feature = "printing")]
+ impl<'a> TypeGenerics<'a> {
+ /// Turn a type's generics like `<X, Y>` into a turbofish like `::<X, Y>`.
+ ///
+- /// *This method is available if Syn is built with the `"derive"` or
++ /// *This method is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature and the `"printing"` feature.*
+ pub fn as_turbofish(&self) -> Turbofish {
+ Turbofish(self.0)
+@@ -353,9 +402,8 @@ impl<'a> TypeGenerics<'a> {
+ ast_struct! {
+ /// A set of bound lifetimes: `for<'a, 'b, 'c>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- #[derive(Default)]
+ pub struct BoundLifetimes {
+ pub for_token: Token![for],
+ pub lt_token: Token![<],
+@@ -364,6 +412,17 @@ ast_struct! {
+ }
+ }
+
++impl Default for BoundLifetimes {
++ fn default() -> Self {
++ BoundLifetimes {
++ for_token: Default::default(),
++ lt_token: Default::default(),
++ lifetimes: Punctuated::new(),
++ gt_token: Default::default(),
++ }
++ }
++}
++
+ impl LifetimeDef {
+ pub fn new(lifetime: Lifetime) -> Self {
+ LifetimeDef {
+@@ -391,7 +450,7 @@ impl From<Ident> for TypeParam {
+ ast_enum_of_structs! {
+ /// A trait or lifetime used as a bound on a type parameter.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum TypeParamBound {
+ Trait(TraitBound),
+@@ -402,7 +461,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A trait used as a bound on a type parameter.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct TraitBound {
+ pub paren_token: Option<token::Paren>,
+@@ -418,9 +477,8 @@ ast_enum! {
+ /// A modifier on a trait bound, currently only used for the `?` in
+ /// `?Sized`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- #[cfg_attr(feature = "clone-impls", derive(Copy))]
+ pub enum TraitBoundModifier {
+ None,
+ Maybe(Token![?]),
+@@ -431,7 +489,7 @@ ast_struct! {
+ /// A `where` clause in a definition: `where T: Deserialize<'de>, D:
+ /// 'static`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct WhereClause {
+ pub where_token: Token![where],
+@@ -442,7 +500,7 @@ ast_struct! {
+ ast_enum_of_structs! {
+ /// A single predicate in a `where` clause: `T: Deserialize<'de>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Syntax tree enum
+@@ -450,9 +508,6 @@ ast_enum_of_structs! {
+ /// This type is a [syntax tree enum].
+ ///
+ /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
+- //
+- // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+- // blocked on https://github.com/rust-lang/rust/issues/62833
+ pub enum WherePredicate {
+ /// A type predicate in a `where` clause: `for<'c> Foo<'c>: Trait<'c>`.
+ Type(PredicateType),
+@@ -468,7 +523,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A type predicate in a `where` clause: `for<'c> Foo<'c>: Trait<'c>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct PredicateType {
+ /// Any lifetimes from a `for` binding
+@@ -484,7 +539,7 @@ ast_struct! {
+ ast_struct! {
+ /// A lifetime predicate in a `where` clause: `'a: 'b + 'c`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct PredicateLifetime {
+ pub lifetime: Lifetime,
+@@ -496,7 +551,7 @@ ast_struct! {
+ ast_struct! {
+ /// An equality predicate in a `where` clause (unsupported).
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct PredicateEq {
+ pub lhs_ty: Type,
+@@ -521,7 +576,6 @@ pub mod parsing {
+
+ let mut params = Punctuated::new();
+ let mut allow_lifetime_param = true;
+- let mut allow_type_param = true;
+ loop {
+ if input.peek(Token![>]) {
+ break;
+@@ -534,7 +588,7 @@ pub mod parsing {
+ attrs,
+ ..input.parse()?
+ }));
+- } else if allow_type_param && lookahead.peek(Ident) {
++ } else if lookahead.peek(Ident) {
+ allow_lifetime_param = false;
+ params.push_value(GenericParam::Type(TypeParam {
+ attrs,
+@@ -542,7 +596,6 @@ pub mod parsing {
+ }));
+ } else if lookahead.peek(Token![const]) {
+ allow_lifetime_param = false;
+- allow_type_param = false;
+ params.push_value(GenericParam::Const(ConstParam {
+ attrs,
+ ..input.parse()?
+@@ -665,57 +718,53 @@ pub mod parsing {
+
+ impl Parse for TypeParam {
+ fn parse(input: ParseStream) -> Result<Self> {
+- let has_colon;
+- let has_default;
+- Ok(TypeParam {
+- attrs: input.call(Attribute::parse_outer)?,
+- ident: input.parse()?,
+- colon_token: {
+- if input.peek(Token![:]) {
+- has_colon = true;
+- Some(input.parse()?)
+- } else {
+- has_colon = false;
+- None
+- }
+- },
+- bounds: {
+- let mut bounds = Punctuated::new();
+- if has_colon {
+- loop {
+- if input.peek(Token![,])
+- || input.peek(Token![>])
+- || input.peek(Token![=])
+- {
+- break;
+- }
+- let value = input.parse()?;
+- bounds.push_value(value);
+- if !input.peek(Token![+]) {
+- break;
+- }
+- let punct = input.parse()?;
+- bounds.push_punct(punct);
+- }
++ let attrs = input.call(Attribute::parse_outer)?;
++ let ident: Ident = input.parse()?;
++ let colon_token: Option<Token![:]> = input.parse()?;
++
++ let begin_bound = input.fork();
++ let mut is_maybe_const = false;
++ let mut bounds = Punctuated::new();
++ if colon_token.is_some() {
++ loop {
++ if input.peek(Token![,]) || input.peek(Token![>]) || input.peek(Token![=]) {
++ break;
+ }
+- bounds
+- },
+- eq_token: {
+- if input.peek(Token![=]) {
+- has_default = true;
+- Some(input.parse()?)
+- } else {
+- has_default = false;
+- None
++ if input.peek(Token![?]) && input.peek2(Token![const]) {
++ input.parse::<Token![?]>()?;
++ input.parse::<Token![const]>()?;
++ is_maybe_const = true;
+ }
+- },
+- default: {
+- if has_default {
+- Some(input.parse()?)
+- } else {
+- None
++ let value: TypeParamBound = input.parse()?;
++ bounds.push_value(value);
++ if !input.peek(Token![+]) {
++ break;
+ }
+- },
++ let punct: Token![+] = input.parse()?;
++ bounds.push_punct(punct);
++ }
++ }
++
++ let mut eq_token: Option<Token![=]> = input.parse()?;
++ let mut default = if eq_token.is_some() {
++ Some(input.parse::<Type>()?)
++ } else {
++ None
++ };
++
++ if is_maybe_const {
++ bounds.clear();
++ eq_token = None;
++ default = Some(Type::Verbatim(verbatim::between(begin_bound, input)));
++ }
++
++ Ok(TypeParam {
++ attrs,
++ ident,
++ colon_token,
++ bounds,
++ eq_token,
++ default,
+ })
+ }
+ }
+@@ -898,6 +947,8 @@ mod printing {
+ use super::*;
+
+ use proc_macro2::TokenStream;
++ #[cfg(feature = "full")]
++ use proc_macro2::TokenTree;
+ use quote::{ToTokens, TokenStreamExt};
+
+ use crate::attr::FilterAttrs;
+@@ -1080,9 +1131,25 @@ mod printing {
+ TokensOrDefault(&self.colon_token).to_tokens(tokens);
+ self.bounds.to_tokens(tokens);
+ }
+- if self.default.is_some() {
++ if let Some(default) = &self.default {
++ #[cfg(feature = "full")]
++ {
++ if self.eq_token.is_none() {
++ if let Type::Verbatim(default) = default {
++ let mut iter = default.clone().into_iter();
++ match (iter.next(), iter.next()) {
++ (Some(TokenTree::Punct(ref q)), Some(TokenTree::Ident(ref c)))
++ if q.as_char() == '?' && c == "const" =>
++ {
++ return default.to_tokens(tokens);
++ }
++ _ => {}
++ }
++ }
++ }
++ }
+ TokensOrDefault(&self.eq_token).to_tokens(tokens);
+- self.default.to_tokens(tokens);
++ default.to_tokens(tokens);
+ }
+ }
+ }
+@@ -1117,9 +1184,9 @@ mod printing {
+ self.ident.to_tokens(tokens);
+ self.colon_token.to_tokens(tokens);
+ self.ty.to_tokens(tokens);
+- if self.default.is_some() {
++ if let Some(default) = &self.default {
+ TokensOrDefault(&self.eq_token).to_tokens(tokens);
+- self.default.to_tokens(tokens);
++ default.to_tokens(tokens);
+ }
+ }
+ }
+diff --git a/third_party/rust/syn/src/item.rs b/third_party/rust/syn/src/item.rs
+index ff4485ace9..0d8f7d3ddc 100644
+--- mozilla-release/third_party/rust/syn/src/item.rs
++++ mozilla-release/third_party/rust/syn/src/item.rs
+@@ -1,17 +1,15 @@
+ use super::*;
+-use crate::derive::{Data, DeriveInput};
++use crate::derive::{Data, DataEnum, DataStruct, DataUnion, DeriveInput};
+ use crate::punctuated::Punctuated;
+ use proc_macro2::TokenStream;
+
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
+-#[cfg(feature = "extra-traits")]
+-use std::hash::{Hash, Hasher};
++#[cfg(feature = "parsing")]
++use std::mem;
+
+ ast_enum_of_structs! {
+ /// Things that can appear directly inside of a module or scope.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -21,7 +19,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum Item #manual_extra_traits {
++ pub enum Item {
+ /// A constant item: `const MAX: u16 = 65535`.
+ Const(ItemConst),
+
+@@ -83,7 +81,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A constant item: `const MAX: u16 = 65535`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemConst {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -100,7 +98,7 @@ ast_struct! {
+ ast_struct! {
+ /// An enum definition: `enum Foo<A, B> { A(A), B(B) }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemEnum {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -115,7 +113,7 @@ ast_struct! {
+ ast_struct! {
+ /// An `extern crate` item: `extern crate serde`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemExternCrate {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -131,7 +129,7 @@ ast_struct! {
+ /// A free-standing function: `fn process(n: usize) -> Result<()> { ...
+ /// }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemFn {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -143,7 +141,7 @@ ast_struct! {
+ ast_struct! {
+ /// A block of foreign items: `extern "C" { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemForeignMod {
+ pub attrs: Vec<Attribute>,
+ pub abi: Abi,
+@@ -156,7 +154,7 @@ ast_struct! {
+ /// An impl block providing trait or associated items: `impl<A> Trait
+ /// for Data<A> { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemImpl {
+ pub attrs: Vec<Attribute>,
+ pub defaultness: Option<Token![default]>,
+@@ -175,7 +173,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro invocation, which includes `macro_rules!` definitions.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemMacro {
+ pub attrs: Vec<Attribute>,
+ /// The `example` in `macro_rules! example { ... }`.
+@@ -188,8 +186,8 @@ ast_struct! {
+ ast_struct! {
+ /// A 2.0-style declarative macro introduced by the `macro` keyword.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
+- pub struct ItemMacro2 #manual_extra_traits {
++ /// *This type is available only if Syn is built with the `"full"` feature.*
++ pub struct ItemMacro2 {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+ pub macro_token: Token![macro],
+@@ -201,7 +199,7 @@ ast_struct! {
+ ast_struct! {
+ /// A module or module declaration: `mod m` or `mod m { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemMod {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -215,7 +213,7 @@ ast_struct! {
+ ast_struct! {
+ /// A static item: `static BIKE: Shed = Shed(42)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemStatic {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -233,7 +231,7 @@ ast_struct! {
+ ast_struct! {
+ /// A struct definition: `struct Foo<A> { x: A }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemStruct {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -248,7 +246,7 @@ ast_struct! {
+ ast_struct! {
+ /// A trait definition: `pub trait Iterator { ... }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemTrait {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -267,7 +265,7 @@ ast_struct! {
+ ast_struct! {
+ /// A trait alias: `pub trait SharableIterator = Iterator + Sync`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemTraitAlias {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -283,7 +281,7 @@ ast_struct! {
+ ast_struct! {
+ /// A type alias: `type Result<T> = std::result::Result<T, MyError>`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemType {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -299,7 +297,7 @@ ast_struct! {
+ ast_struct! {
+ /// A union definition: `union Foo<A, B> { x: A, y: B }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemUnion {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -313,7 +311,7 @@ ast_struct! {
+ ast_struct! {
+ /// A use declaration: `use std::collections::HashMap`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ItemUse {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -324,145 +322,32 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Item {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Item {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (Item::Const(this), Item::Const(other)) => this == other,
+- (Item::Enum(this), Item::Enum(other)) => this == other,
+- (Item::ExternCrate(this), Item::ExternCrate(other)) => this == other,
+- (Item::Fn(this), Item::Fn(other)) => this == other,
+- (Item::ForeignMod(this), Item::ForeignMod(other)) => this == other,
+- (Item::Impl(this), Item::Impl(other)) => this == other,
+- (Item::Macro(this), Item::Macro(other)) => this == other,
+- (Item::Macro2(this), Item::Macro2(other)) => this == other,
+- (Item::Mod(this), Item::Mod(other)) => this == other,
+- (Item::Static(this), Item::Static(other)) => this == other,
+- (Item::Struct(this), Item::Struct(other)) => this == other,
+- (Item::Trait(this), Item::Trait(other)) => this == other,
+- (Item::TraitAlias(this), Item::TraitAlias(other)) => this == other,
+- (Item::Type(this), Item::Type(other)) => this == other,
+- (Item::Union(this), Item::Union(other)) => this == other,
+- (Item::Use(this), Item::Use(other)) => this == other,
+- (Item::Verbatim(this), Item::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Item {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
++impl Item {
++ #[cfg(feature = "parsing")]
++ pub(crate) fn replace_attrs(&mut self, new: Vec<Attribute>) -> Vec<Attribute> {
+ match self {
+- Item::Const(item) => {
+- state.write_u8(0);
+- item.hash(state);
+- }
+- Item::Enum(item) => {
+- state.write_u8(1);
+- item.hash(state);
+- }
+- Item::ExternCrate(item) => {
+- state.write_u8(2);
+- item.hash(state);
+- }
+- Item::Fn(item) => {
+- state.write_u8(3);
+- item.hash(state);
+- }
+- Item::ForeignMod(item) => {
+- state.write_u8(4);
+- item.hash(state);
+- }
+- Item::Impl(item) => {
+- state.write_u8(5);
+- item.hash(state);
+- }
+- Item::Macro(item) => {
+- state.write_u8(6);
+- item.hash(state);
+- }
+- Item::Macro2(item) => {
+- state.write_u8(7);
+- item.hash(state);
+- }
+- Item::Mod(item) => {
+- state.write_u8(8);
+- item.hash(state);
+- }
+- Item::Static(item) => {
+- state.write_u8(9);
+- item.hash(state);
+- }
+- Item::Struct(item) => {
+- state.write_u8(10);
+- item.hash(state);
+- }
+- Item::Trait(item) => {
+- state.write_u8(11);
+- item.hash(state);
+- }
+- Item::TraitAlias(item) => {
+- state.write_u8(12);
+- item.hash(state);
+- }
+- Item::Type(item) => {
+- state.write_u8(13);
+- item.hash(state);
+- }
+- Item::Union(item) => {
+- state.write_u8(14);
+- item.hash(state);
+- }
+- Item::Use(item) => {
+- state.write_u8(15);
+- item.hash(state);
+- }
+- Item::Verbatim(item) => {
+- state.write_u8(16);
+- TokenStreamHelper(item).hash(state);
+- }
++ Item::ExternCrate(ItemExternCrate { attrs, .. })
++ | Item::Use(ItemUse { attrs, .. })
++ | Item::Static(ItemStatic { attrs, .. })
++ | Item::Const(ItemConst { attrs, .. })
++ | Item::Fn(ItemFn { attrs, .. })
++ | Item::Mod(ItemMod { attrs, .. })
++ | Item::ForeignMod(ItemForeignMod { attrs, .. })
++ | Item::Type(ItemType { attrs, .. })
++ | Item::Struct(ItemStruct { attrs, .. })
++ | Item::Enum(ItemEnum { attrs, .. })
++ | Item::Union(ItemUnion { attrs, .. })
++ | Item::Trait(ItemTrait { attrs, .. })
++ | Item::TraitAlias(ItemTraitAlias { attrs, .. })
++ | Item::Impl(ItemImpl { attrs, .. })
++ | Item::Macro(ItemMacro { attrs, .. })
++ | Item::Macro2(ItemMacro2 { attrs, .. }) => mem::replace(attrs, new),
++ Item::Verbatim(_) => Vec::new(),
+ Item::__Nonexhaustive => unreachable!(),
+ }
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for ItemMacro2 {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for ItemMacro2 {
+- fn eq(&self, other: &Self) -> bool {
+- self.attrs == other.attrs
+- && self.vis == other.vis
+- && self.macro_token == other.macro_token
+- && self.ident == other.ident
+- && TokenStreamHelper(&self.rules) == TokenStreamHelper(&other.rules)
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for ItemMacro2 {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- self.attrs.hash(state);
+- self.vis.hash(state);
+- self.macro_token.hash(state);
+- self.ident.hash(state);
+- TokenStreamHelper(&self.rules).hash(state);
+- }
+-}
+-
+ impl From<DeriveInput> for Item {
+ fn from(input: DeriveInput) -> Item {
+ match input.data {
+@@ -496,10 +381,57 @@ impl From<DeriveInput> for Item {
+ }
+ }
+
++impl From<ItemStruct> for DeriveInput {
++ fn from(input: ItemStruct) -> DeriveInput {
++ DeriveInput {
++ attrs: input.attrs,
++ vis: input.vis,
++ ident: input.ident,
++ generics: input.generics,
++ data: Data::Struct(DataStruct {
++ struct_token: input.struct_token,
++ fields: input.fields,
++ semi_token: input.semi_token,
++ }),
++ }
++ }
++}
++
++impl From<ItemEnum> for DeriveInput {
++ fn from(input: ItemEnum) -> DeriveInput {
++ DeriveInput {
++ attrs: input.attrs,
++ vis: input.vis,
++ ident: input.ident,
++ generics: input.generics,
++ data: Data::Enum(DataEnum {
++ enum_token: input.enum_token,
++ brace_token: input.brace_token,
++ variants: input.variants,
++ }),
++ }
++ }
++}
++
++impl From<ItemUnion> for DeriveInput {
++ fn from(input: ItemUnion) -> DeriveInput {
++ DeriveInput {
++ attrs: input.attrs,
++ vis: input.vis,
++ ident: input.ident,
++ generics: input.generics,
++ data: Data::Union(DataUnion {
++ union_token: input.union_token,
++ fields: input.fields,
++ }),
++ }
++ }
++}
++
+ ast_enum_of_structs! {
+ /// A suffix of an import tree in a `use` item: `Type as Renamed` or `*`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -530,7 +462,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A path prefix of imports in a `use` item: `std::...`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct UsePath {
+ pub ident: Ident,
+ pub colon2_token: Token![::],
+@@ -541,7 +473,7 @@ ast_struct! {
+ ast_struct! {
+ /// An identifier imported by a `use` item: `HashMap`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct UseName {
+ pub ident: Ident,
+ }
+@@ -550,7 +482,7 @@ ast_struct! {
+ ast_struct! {
+ /// An renamed identifier imported by a `use` item: `HashMap as Map`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct UseRename {
+ pub ident: Ident,
+ pub as_token: Token![as],
+@@ -561,7 +493,7 @@ ast_struct! {
+ ast_struct! {
+ /// A glob import in a `use` item: `*`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct UseGlob {
+ pub star_token: Token![*],
+ }
+@@ -570,7 +502,7 @@ ast_struct! {
+ ast_struct! {
+ /// A braced group of imports in a `use` item: `{A, B, C}`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct UseGroup {
+ pub brace_token: token::Brace,
+ pub items: Punctuated<UseTree, Token![,]>,
+@@ -580,7 +512,7 @@ ast_struct! {
+ ast_enum_of_structs! {
+ /// An item within an `extern` block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -590,7 +522,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum ForeignItem #manual_extra_traits {
++ pub enum ForeignItem {
+ /// A foreign function in an `extern` block.
+ Fn(ForeignItemFn),
+
+@@ -614,7 +546,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A foreign function in an `extern` block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ForeignItemFn {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -626,7 +558,7 @@ ast_struct! {
+ ast_struct! {
+ /// A foreign static item in an `extern` block: `static ext: u8`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ForeignItemStatic {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -642,7 +574,7 @@ ast_struct! {
+ ast_struct! {
+ /// A foreign type in an `extern` block: `type void`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ForeignItemType {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -655,7 +587,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro invocation within an extern block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ForeignItemMacro {
+ pub attrs: Vec<Attribute>,
+ pub mac: Macro,
+@@ -663,61 +595,10 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for ForeignItem {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for ForeignItem {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (ForeignItem::Fn(this), ForeignItem::Fn(other)) => this == other,
+- (ForeignItem::Static(this), ForeignItem::Static(other)) => this == other,
+- (ForeignItem::Type(this), ForeignItem::Type(other)) => this == other,
+- (ForeignItem::Macro(this), ForeignItem::Macro(other)) => this == other,
+- (ForeignItem::Verbatim(this), ForeignItem::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for ForeignItem {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- ForeignItem::Fn(item) => {
+- state.write_u8(0);
+- item.hash(state);
+- }
+- ForeignItem::Static(item) => {
+- state.write_u8(1);
+- item.hash(state);
+- }
+- ForeignItem::Type(item) => {
+- state.write_u8(2);
+- item.hash(state);
+- }
+- ForeignItem::Macro(item) => {
+- state.write_u8(3);
+- item.hash(state);
+- }
+- ForeignItem::Verbatim(item) => {
+- state.write_u8(4);
+- TokenStreamHelper(item).hash(state);
+- }
+- ForeignItem::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ ast_enum_of_structs! {
+ /// An item declaration within the definition of a trait.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -727,7 +608,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum TraitItem #manual_extra_traits {
++ pub enum TraitItem {
+ /// An associated constant within the definition of a trait.
+ Const(TraitItemConst),
+
+@@ -751,7 +632,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// An associated constant within the definition of a trait.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct TraitItemConst {
+ pub attrs: Vec<Attribute>,
+ pub const_token: Token![const],
+@@ -766,7 +647,7 @@ ast_struct! {
+ ast_struct! {
+ /// A trait method within the definition of a trait.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct TraitItemMethod {
+ pub attrs: Vec<Attribute>,
+ pub sig: Signature,
+@@ -778,7 +659,7 @@ ast_struct! {
+ ast_struct! {
+ /// An associated type within the definition of a trait.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct TraitItemType {
+ pub attrs: Vec<Attribute>,
+ pub type_token: Token![type],
+@@ -794,7 +675,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro invocation within the definition of a trait.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct TraitItemMacro {
+ pub attrs: Vec<Attribute>,
+ pub mac: Macro,
+@@ -802,61 +683,10 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for TraitItem {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for TraitItem {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (TraitItem::Const(this), TraitItem::Const(other)) => this == other,
+- (TraitItem::Method(this), TraitItem::Method(other)) => this == other,
+- (TraitItem::Type(this), TraitItem::Type(other)) => this == other,
+- (TraitItem::Macro(this), TraitItem::Macro(other)) => this == other,
+- (TraitItem::Verbatim(this), TraitItem::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for TraitItem {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- TraitItem::Const(item) => {
+- state.write_u8(0);
+- item.hash(state);
+- }
+- TraitItem::Method(item) => {
+- state.write_u8(1);
+- item.hash(state);
+- }
+- TraitItem::Type(item) => {
+- state.write_u8(2);
+- item.hash(state);
+- }
+- TraitItem::Macro(item) => {
+- state.write_u8(3);
+- item.hash(state);
+- }
+- TraitItem::Verbatim(item) => {
+- state.write_u8(4);
+- TokenStreamHelper(item).hash(state);
+- }
+- TraitItem::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ ast_enum_of_structs! {
+ /// An item within an impl block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -866,7 +696,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum ImplItem #manual_extra_traits {
++ pub enum ImplItem {
+ /// An associated constant within an impl block.
+ Const(ImplItemConst),
+
+@@ -890,7 +720,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// An associated constant within an impl block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ImplItemConst {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -908,7 +738,7 @@ ast_struct! {
+ ast_struct! {
+ /// A method within an impl block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ImplItemMethod {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -921,7 +751,7 @@ ast_struct! {
+ ast_struct! {
+ /// An associated type within an impl block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ImplItemType {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+@@ -938,7 +768,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro invocation within an impl block.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct ImplItemMacro {
+ pub attrs: Vec<Attribute>,
+ pub mac: Macro,
+@@ -946,62 +776,11 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for ImplItem {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for ImplItem {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (ImplItem::Const(this), ImplItem::Const(other)) => this == other,
+- (ImplItem::Method(this), ImplItem::Method(other)) => this == other,
+- (ImplItem::Type(this), ImplItem::Type(other)) => this == other,
+- (ImplItem::Macro(this), ImplItem::Macro(other)) => this == other,
+- (ImplItem::Verbatim(this), ImplItem::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for ImplItem {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- ImplItem::Const(item) => {
+- state.write_u8(0);
+- item.hash(state);
+- }
+- ImplItem::Method(item) => {
+- state.write_u8(1);
+- item.hash(state);
+- }
+- ImplItem::Type(item) => {
+- state.write_u8(2);
+- item.hash(state);
+- }
+- ImplItem::Macro(item) => {
+- state.write_u8(3);
+- item.hash(state);
+- }
+- ImplItem::Verbatim(item) => {
+- state.write_u8(4);
+- TokenStreamHelper(item).hash(state);
+- }
+- ImplItem::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ ast_struct! {
+ /// A function signature in a trait or implementation: `unsafe fn
+ /// initialize(&self)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Signature {
+ pub constness: Option<Token![const]>,
+ pub asyncness: Option<Token![async]>,
+@@ -1017,13 +796,34 @@ ast_struct! {
+ }
+ }
+
++impl Signature {
++ /// A method's `self` receiver, such as `&self` or `self: Box<Self>`.
++ pub fn receiver(&self) -> Option<&FnArg> {
++ let arg = self.inputs.first()?;
++ match arg {
++ FnArg::Receiver(_) => Some(arg),
++ FnArg::Typed(PatType { pat, .. }) => {
++ if let Pat::Ident(PatIdent { ident, .. }) = &**pat {
++ if ident == "self" {
++ return Some(arg);
++ }
++ }
++ None
++ }
++ }
++ }
++}
++
+ ast_enum_of_structs! {
+ /// An argument in a function signature: the `n: usize` in `fn f(n: usize)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub enum FnArg {
+ /// The `self` argument of an associated method, whether taken by value
+ /// or by reference.
++ ///
++ /// Note that `self` receivers with a specified type, such as `self:
++ /// Box<Self>`, are parsed as a `FnArg::Typed`.
+ Receiver(Receiver),
+
+ /// A function argument accepted by pattern and type.
+@@ -1035,7 +835,10 @@ ast_struct! {
+ /// The `self` argument of an associated method, whether taken by value
+ /// or by reference.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// Note that `self` receivers with a specified type, such as `self:
++ /// Box<Self>`, are parsed as a `FnArg::Typed`.
++ ///
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Receiver {
+ pub attrs: Vec<Attribute>,
+ pub reference: Option<(Token![&], Option<Lifetime>)>,
+@@ -1056,7 +859,8 @@ pub mod parsing {
+
+ use crate::ext::IdentExt;
+ use crate::parse::discouraged::Speculative;
+- use crate::parse::{Parse, ParseStream, Result};
++ use crate::parse::{Parse, ParseBuffer, ParseStream, Result};
++ use crate::token::Brace;
+ use proc_macro2::{Delimiter, Group, Punct, Spacing, TokenTree};
+ use std::iter::{self, FromIterator};
+
+@@ -1064,18 +868,26 @@ pub mod parsing {
+
+ impl Parse for Item {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let begin = input.fork();
+ let mut attrs = input.call(Attribute::parse_outer)?;
+ let ahead = input.fork();
+ let vis: Visibility = ahead.parse()?;
+
+ let lookahead = ahead.lookahead1();
+- let mut item = if lookahead.peek(Token![extern]) {
++ let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) {
++ let vis: Visibility = input.parse()?;
++ let sig = parse_signature(input)?;
++ if input.peek(Token![;]) {
++ input.parse::<Token![;]>()?;
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ } else {
++ parse_rest_of_fn(input, Vec::new(), vis, sig).map(Item::Fn)
++ }
++ } else if lookahead.peek(Token![extern]) {
+ ahead.parse::<Token![extern]>()?;
+ let lookahead = ahead.lookahead1();
+ if lookahead.peek(Token![crate]) {
+ input.parse().map(Item::ExternCrate)
+- } else if lookahead.peek(Token![fn]) {
+- input.parse().map(Item::Fn)
+ } else if lookahead.peek(token::Brace) {
+ input.parse().map(Item::ForeignMod)
+ } else if lookahead.peek(LitStr) {
+@@ -1083,8 +895,6 @@ pub mod parsing {
+ let lookahead = ahead.lookahead1();
+ if lookahead.peek(token::Brace) {
+ input.parse().map(Item::ForeignMod)
+- } else if lookahead.peek(Token![fn]) {
+- input.parse().map(Item::Fn)
+ } else {
+ Err(lookahead.error())
+ }
+@@ -1094,18 +904,61 @@ pub mod parsing {
+ } else if lookahead.peek(Token![use]) {
+ input.parse().map(Item::Use)
+ } else if lookahead.peek(Token![static]) {
+- input.parse().map(Item::Static)
++ let vis = input.parse()?;
++ let static_token = input.parse()?;
++ let mutability = input.parse()?;
++ let ident = input.parse()?;
++ let colon_token = input.parse()?;
++ let ty = input.parse()?;
++ if input.peek(Token![;]) {
++ input.parse::<Token![;]>()?;
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(Item::Static(ItemStatic {
++ attrs: Vec::new(),
++ vis,
++ static_token,
++ mutability,
++ ident,
++ colon_token,
++ ty,
++ eq_token: input.parse()?,
++ expr: input.parse()?,
++ semi_token: input.parse()?,
++ }))
++ }
+ } else if lookahead.peek(Token![const]) {
+ ahead.parse::<Token![const]>()?;
+ let lookahead = ahead.lookahead1();
+ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
+- input.parse().map(Item::Const)
+- } else if lookahead.peek(Token![unsafe])
+- || lookahead.peek(Token![async])
+- || lookahead.peek(Token![extern])
+- || lookahead.peek(Token![fn])
+- {
+- input.parse().map(Item::Fn)
++ let vis = input.parse()?;
++ let const_token = input.parse()?;
++ let ident = {
++ let lookahead = input.lookahead1();
++ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
++ input.call(Ident::parse_any)?
++ } else {
++ return Err(lookahead.error());
++ }
++ };
++ let colon_token = input.parse()?;
++ let ty = input.parse()?;
++ if input.peek(Token![;]) {
++ input.parse::<Token![;]>()?;
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(Item::Const(ItemConst {
++ attrs: Vec::new(),
++ vis,
++ const_token,
++ ident,
++ colon_token,
++ ty,
++ eq_token: input.parse()?,
++ expr: input.parse()?,
++ semi_token: input.parse()?,
++ }))
++ }
+ } else {
+ Err(lookahead.error())
+ }
+@@ -1117,21 +970,19 @@ pub mod parsing {
+ {
+ input.parse().map(Item::Trait)
+ } else if lookahead.peek(Token![impl]) {
+- input.parse().map(Item::Impl)
+- } else if lookahead.peek(Token![async])
+- || lookahead.peek(Token![extern])
+- || lookahead.peek(Token![fn])
+- {
+- input.parse().map(Item::Fn)
++ let allow_const_impl = true;
++ if let Some(item) = parse_impl(input, allow_const_impl)? {
++ Ok(Item::Impl(item))
++ } else {
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ }
+ } else {
+ Err(lookahead.error())
+ }
+- } else if lookahead.peek(Token![async]) || lookahead.peek(Token![fn]) {
+- input.parse().map(Item::Fn)
+ } else if lookahead.peek(Token![mod]) {
+ input.parse().map(Item::Mod)
+ } else if lookahead.peek(Token![type]) {
+- input.parse().map(Item::Type)
++ parse_item_type(begin, input)
+ } else if lookahead.peek(existential) {
+ input.call(item_existential).map(Item::Verbatim)
+ } else if lookahead.peek(Token![struct]) {
+@@ -1147,14 +998,18 @@ pub mod parsing {
+ } else if lookahead.peek(Token![impl])
+ || lookahead.peek(Token![default]) && !ahead.peek2(Token![!])
+ {
+- input.parse().map(Item::Impl)
++ let allow_const_impl = true;
++ if let Some(item) = parse_impl(input, allow_const_impl)? {
++ Ok(Item::Impl(item))
++ } else {
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ }
+ } else if lookahead.peek(Token![macro]) {
+ input.parse().map(Item::Macro2)
+ } else if vis.is_inherited()
+ && (lookahead.peek(Ident)
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![super])
+- || lookahead.peek(Token![extern])
+ || lookahead.peek(Token![crate])
+ || lookahead.peek(Token![::]))
+ {
+@@ -1163,32 +1018,64 @@ pub mod parsing {
+ Err(lookahead.error())
+ }?;
+
+- {
+- let item_attrs = match &mut item {
+- Item::ExternCrate(item) => &mut item.attrs,
+- Item::Use(item) => &mut item.attrs,
+- Item::Static(item) => &mut item.attrs,
+- Item::Const(item) => &mut item.attrs,
+- Item::Fn(item) => &mut item.attrs,
+- Item::Mod(item) => &mut item.attrs,
+- Item::ForeignMod(item) => &mut item.attrs,
+- Item::Type(item) => &mut item.attrs,
+- Item::Struct(item) => &mut item.attrs,
+- Item::Enum(item) => &mut item.attrs,
+- Item::Union(item) => &mut item.attrs,
+- Item::Trait(item) => &mut item.attrs,
+- Item::TraitAlias(item) => &mut item.attrs,
+- Item::Impl(item) => &mut item.attrs,
+- Item::Macro(item) => &mut item.attrs,
+- Item::Macro2(item) => &mut item.attrs,
+- Item::Verbatim(_) => return Ok(item),
+- Item::__Nonexhaustive => unreachable!(),
+- };
+- attrs.extend(item_attrs.drain(..));
+- *item_attrs = attrs;
++ attrs.extend(item.replace_attrs(Vec::new()));
++ item.replace_attrs(attrs);
++ Ok(item)
++ }
++ }
++
++ struct FlexibleItemType {
++ vis: Visibility,
++ defaultness: Option<Token![default]>,
++ type_token: Token![type],
++ ident: Ident,
++ generics: Generics,
++ colon_token: Option<Token![:]>,
++ bounds: Punctuated<TypeParamBound, Token![+]>,
++ ty: Option<(Token![=], Type)>,
++ semi_token: Token![;],
++ }
++
++ impl Parse for FlexibleItemType {
++ fn parse(input: ParseStream) -> Result<Self> {
++ let vis: Visibility = input.parse()?;
++ let defaultness: Option<Token![default]> = input.parse()?;
++ let type_token: Token![type] = input.parse()?;
++ let ident: Ident = input.parse()?;
++ let mut generics: Generics = input.parse()?;
++ let colon_token: Option<Token![:]> = input.parse()?;
++ let mut bounds = Punctuated::new();
++ if colon_token.is_some() {
++ loop {
++ bounds.push_value(input.parse::<TypeParamBound>()?);
++ if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
++ break;
++ }
++ bounds.push_punct(input.parse::<Token![+]>()?);
++ if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
++ break;
++ }
++ }
+ }
++ generics.where_clause = input.parse()?;
++ let ty = if let Some(eq_token) = input.parse()? {
++ Some((eq_token, input.parse::<Type>()?))
++ } else {
++ None
++ };
++ let semi_token: Token![;] = input.parse()?;
+
+- Ok(item)
++ Ok(FlexibleItemType {
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds,
++ ty,
++ semi_token,
++ })
+ }
+ }
+
+@@ -1310,7 +1197,6 @@ pub mod parsing {
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![super])
+ || lookahead.peek(Token![crate])
+- || lookahead.peek(Token![extern])
+ {
+ let ident = input.call(Ident::parse_any)?;
+ if input.peek(Token![::]) {
+@@ -1392,69 +1278,126 @@ pub mod parsing {
+ }
+ }
+
+- impl Parse for ItemFn {
+- fn parse(input: ParseStream) -> Result<Self> {
+- let outer_attrs = input.call(Attribute::parse_outer)?;
+- let vis: Visibility = input.parse()?;
+- let constness: Option<Token![const]> = input.parse()?;
+- let asyncness: Option<Token![async]> = input.parse()?;
+- let unsafety: Option<Token![unsafe]> = input.parse()?;
+- let abi: Option<Abi> = input.parse()?;
+- let fn_token: Token![fn] = input.parse()?;
+- let ident: Ident = input.parse()?;
+- let generics: Generics = input.parse()?;
++ fn pop_variadic(args: &mut Punctuated<FnArg, Token![,]>) -> Option<Variadic> {
++ let trailing_punct = args.trailing_punct();
+
+- let content;
+- let paren_token = parenthesized!(content in input);
+- let inputs = content.parse_terminated(FnArg::parse)?;
+- let variadic = inputs.last().as_ref().and_then(get_variadic);
+-
+- fn get_variadic(input: &&FnArg) -> Option<Variadic> {
+- if let FnArg::Typed(PatType { ty, .. }) = input {
+- if let Type::Verbatim(tokens) = &**ty {
+- if let Ok(dots) = parse2(tokens.clone()) {
+- return Some(Variadic {
+- attrs: Vec::new(),
+- dots,
+- });
+- }
+- }
+- }
+- None
++ let last = match args.last_mut()? {
++ FnArg::Typed(last) => last,
++ _ => return None,
++ };
++
++ let ty = match last.ty.as_ref() {
++ Type::Verbatim(ty) => ty,
++ _ => return None,
++ };
++
++ let mut variadic = Variadic {
++ attrs: Vec::new(),
++ dots: parse2(ty.clone()).ok()?,
++ };
++
++ if let Pat::Verbatim(pat) = last.pat.as_ref() {
++ if pat.to_string() == "..." && !trailing_punct {
++ variadic.attrs = mem::replace(&mut last.attrs, Vec::new());
++ args.pop();
+ }
++ }
+
+- let output: ReturnType = input.parse()?;
+- let where_clause: Option<WhereClause> = input.parse()?;
++ Some(variadic)
++ }
+
+- let content;
+- let brace_token = braced!(content in input);
+- let inner_attrs = content.call(Attribute::parse_inner)?;
+- let stmts = content.call(Block::parse_within)?;
++ fn variadic_to_tokens(dots: &Token![...]) -> TokenStream {
++ TokenStream::from_iter(vec![
++ TokenTree::Punct({
++ let mut dot = Punct::new('.', Spacing::Joint);
++ dot.set_span(dots.spans[0]);
++ dot
++ }),
++ TokenTree::Punct({
++ let mut dot = Punct::new('.', Spacing::Joint);
++ dot.set_span(dots.spans[1]);
++ dot
++ }),
++ TokenTree::Punct({
++ let mut dot = Punct::new('.', Spacing::Alone);
++ dot.set_span(dots.spans[2]);
++ dot
++ }),
++ ])
++ }
+
+- Ok(ItemFn {
+- attrs: private::attrs(outer_attrs, inner_attrs),
+- vis,
+- sig: Signature {
+- constness,
+- asyncness,
+- unsafety,
+- abi,
+- fn_token,
+- ident,
+- paren_token,
+- inputs,
+- output,
+- variadic,
+- generics: Generics {
+- where_clause,
+- ..generics
+- },
+- },
+- block: Box::new(Block { brace_token, stmts }),
+- })
++ fn peek_signature(input: ParseStream) -> bool {
++ let fork = input.fork();
++ fork.parse::<Option<Token![const]>>().is_ok()
++ && fork.parse::<Option<Token![async]>>().is_ok()
++ && fork.parse::<Option<Token![unsafe]>>().is_ok()
++ && fork.parse::<Option<Abi>>().is_ok()
++ && fork.peek(Token![fn])
++ }
++
++ fn parse_signature(input: ParseStream) -> Result<Signature> {
++ let constness: Option<Token![const]> = input.parse()?;
++ let asyncness: Option<Token![async]> = input.parse()?;
++ let unsafety: Option<Token![unsafe]> = input.parse()?;
++ let abi: Option<Abi> = input.parse()?;
++ let fn_token: Token![fn] = input.parse()?;
++ let ident: Ident = input.parse()?;
++ let generics: Generics = input.parse()?;
++
++ let content;
++ let paren_token = parenthesized!(content in input);
++ let mut inputs = parse_fn_args(&content)?;
++ let variadic = pop_variadic(&mut inputs);
++
++ let output: ReturnType = input.parse()?;
++ let where_clause: Option<WhereClause> = input.parse()?;
++
++ Ok(Signature {
++ constness,
++ asyncness,
++ unsafety,
++ abi,
++ fn_token,
++ ident,
++ paren_token,
++ inputs,
++ output,
++ variadic,
++ generics: Generics {
++ where_clause,
++ ..generics
++ },
++ })
++ }
++
++ impl Parse for ItemFn {
++ fn parse(input: ParseStream) -> Result<Self> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
++ let vis: Visibility = input.parse()?;
++ let sig = parse_signature(input)?;
++ parse_rest_of_fn(input, outer_attrs, vis, sig)
+ }
+ }
+
++ fn parse_rest_of_fn(
++ input: ParseStream,
++ outer_attrs: Vec<Attribute>,
++ vis: Visibility,
++ sig: Signature,
++ ) -> Result<ItemFn> {
++ let content;
++ let brace_token = braced!(content in input);
++ let inner_attrs = content.call(Attribute::parse_inner)?;
++ let stmts = content.call(Block::parse_within)?;
++
++ Ok(ItemFn {
++ attrs: private::attrs(outer_attrs, inner_attrs),
++ vis,
++ sig,
++ block: Box::new(Block { brace_token, stmts }),
++ })
++ }
++
+ impl Parse for FnArg {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+@@ -1491,26 +1434,79 @@ pub mod parsing {
+ }
+ }
+
++ fn parse_fn_args(input: ParseStream) -> Result<Punctuated<FnArg, Token![,]>> {
++ let mut args = Punctuated::new();
++ let mut has_receiver = false;
++
++ while !input.is_empty() {
++ let attrs = input.call(Attribute::parse_outer)?;
++
++ let arg = if let Some(dots) = input.parse::<Option<Token![...]>>()? {
++ FnArg::Typed(PatType {
++ attrs,
++ pat: Box::new(Pat::Verbatim(variadic_to_tokens(&dots))),
++ colon_token: Token![:](dots.spans[0]),
++ ty: Box::new(Type::Verbatim(variadic_to_tokens(&dots))),
++ })
++ } else {
++ let mut arg: FnArg = input.parse()?;
++ match &mut arg {
++ FnArg::Receiver(receiver) if has_receiver => {
++ return Err(Error::new(
++ receiver.self_token.span,
++ "unexpected second method receiver",
++ ));
++ }
++ FnArg::Receiver(receiver) if !args.is_empty() => {
++ return Err(Error::new(
++ receiver.self_token.span,
++ "unexpected method receiver",
++ ));
++ }
++ FnArg::Receiver(receiver) => {
++ has_receiver = true;
++ receiver.attrs = attrs;
++ }
++ FnArg::Typed(arg) => arg.attrs = attrs,
++ }
++ arg
++ };
++ args.push_value(arg);
++
++ if input.is_empty() {
++ break;
++ }
++
++ let comma: Token![,] = input.parse()?;
++ args.push_punct(comma);
++ }
++
++ Ok(args)
++ }
++
+ fn fn_arg_typed(input: ParseStream) -> Result<PatType> {
++ // Hack to parse pre-2018 syntax in
++ // test/ui/rfc-2565-param-attrs/param-attrs-pretty.rs
++ // because the rest of the test case is valuable.
++ if input.peek(Ident) && input.peek2(Token![<]) {
++ let span = input.fork().parse::<Ident>()?.span();
++ return Ok(PatType {
++ attrs: Vec::new(),
++ pat: Box::new(Pat::Wild(PatWild {
++ attrs: Vec::new(),
++ underscore_token: Token![_](span),
++ })),
++ colon_token: Token![:](span),
++ ty: input.parse()?,
++ });
++ }
++
+ Ok(PatType {
+ attrs: Vec::new(),
+- pat: input.parse()?,
++ pat: Box::new(pat::parsing::multi_pat(input)?),
+ colon_token: input.parse()?,
+ ty: Box::new(match input.parse::<Option<Token![...]>>()? {
+- Some(dot3) => {
+- let args = vec![
+- TokenTree::Punct(Punct::new('.', Spacing::Joint)),
+- TokenTree::Punct(Punct::new('.', Spacing::Joint)),
+- TokenTree::Punct(Punct::new('.', Spacing::Alone)),
+- ];
+- let tokens = TokenStream::from_iter(args.into_iter().zip(&dot3.spans).map(
+- |(mut arg, span)| {
+- arg.set_span(*span);
+- arg
+- },
+- ));
+- Type::Verbatim(tokens)
+- }
++ Some(dot3) => Type::Verbatim(variadic_to_tokens(&dot3)),
+ None => input.parse()?,
+ }),
+ })
+@@ -1581,22 +1577,60 @@ pub mod parsing {
+
+ impl Parse for ForeignItem {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let begin = input.fork();
+ let mut attrs = input.call(Attribute::parse_outer)?;
+ let ahead = input.fork();
+ let vis: Visibility = ahead.parse()?;
+
+ let lookahead = ahead.lookahead1();
+- let mut item = if lookahead.peek(Token![fn]) {
+- input.parse().map(ForeignItem::Fn)
++ let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) {
++ let vis: Visibility = input.parse()?;
++ let sig = parse_signature(input)?;
++ if input.peek(token::Brace) {
++ let content;
++ braced!(content in input);
++ content.call(Attribute::parse_inner)?;
++ content.call(Block::parse_within)?;
++
++ Ok(ForeignItem::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(ForeignItem::Fn(ForeignItemFn {
++ attrs: Vec::new(),
++ vis,
++ sig,
++ semi_token: input.parse()?,
++ }))
++ }
+ } else if lookahead.peek(Token![static]) {
+- input.parse().map(ForeignItem::Static)
++ let vis = input.parse()?;
++ let static_token = input.parse()?;
++ let mutability = input.parse()?;
++ let ident = input.parse()?;
++ let colon_token = input.parse()?;
++ let ty = input.parse()?;
++ if input.peek(Token![=]) {
++ input.parse::<Token![=]>()?;
++ input.parse::<Expr>()?;
++ input.parse::<Token![;]>()?;
++ Ok(ForeignItem::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(ForeignItem::Static(ForeignItemStatic {
++ attrs: Vec::new(),
++ vis,
++ static_token,
++ mutability,
++ ident,
++ colon_token,
++ ty,
++ semi_token: input.parse()?,
++ }))
++ }
+ } else if lookahead.peek(Token![type]) {
+- input.parse().map(ForeignItem::Type)
++ parse_foreign_item_type(begin, input)
+ } else if vis.is_inherited()
+ && (lookahead.peek(Ident)
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![super])
+- || lookahead.peek(Token![extern])
+ || lookahead.peek(Token![crate])
+ || lookahead.peek(Token![::]))
+ {
+@@ -1605,17 +1639,16 @@ pub mod parsing {
+ Err(lookahead.error())
+ }?;
+
+- {
+- let item_attrs = match &mut item {
+- ForeignItem::Fn(item) => &mut item.attrs,
+- ForeignItem::Static(item) => &mut item.attrs,
+- ForeignItem::Type(item) => &mut item.attrs,
+- ForeignItem::Macro(item) => &mut item.attrs,
+- ForeignItem::Verbatim(_) | ForeignItem::__Nonexhaustive => unreachable!(),
+- };
+- attrs.extend(item_attrs.drain(..));
+- *item_attrs = attrs;
+- }
++ let item_attrs = match &mut item {
++ ForeignItem::Fn(item) => &mut item.attrs,
++ ForeignItem::Static(item) => &mut item.attrs,
++ ForeignItem::Type(item) => &mut item.attrs,
++ ForeignItem::Macro(item) => &mut item.attrs,
++ ForeignItem::Verbatim(_) => return Ok(item),
++ ForeignItem::__Nonexhaustive => unreachable!(),
++ };
++ attrs.extend(item_attrs.drain(..));
++ *item_attrs = attrs;
+
+ Ok(item)
+ }
+@@ -1625,55 +1658,12 @@ pub mod parsing {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+ let vis: Visibility = input.parse()?;
+- let fn_token: Token![fn] = input.parse()?;
+- let ident: Ident = input.parse()?;
+- let generics: Generics = input.parse()?;
+-
+- let content;
+- let paren_token = parenthesized!(content in input);
+- let mut inputs = Punctuated::new();
+- let mut variadic = None;
+- while !content.is_empty() {
+- let attrs = content.call(Attribute::parse_outer)?;
+-
+- if let Some(dots) = content.parse()? {
+- variadic = Some(Variadic { attrs, dots });
+- break;
+- }
+-
+- let mut arg = content.call(fn_arg_typed)?;
+- arg.attrs = attrs;
+- inputs.push_value(FnArg::Typed(arg));
+- if content.is_empty() {
+- break;
+- }
+-
+- inputs.push_punct(content.parse()?);
+- }
+-
+- let output: ReturnType = input.parse()?;
+- let where_clause: Option<WhereClause> = input.parse()?;
++ let sig = parse_signature(input)?;
+ let semi_token: Token![;] = input.parse()?;
+-
+ Ok(ForeignItemFn {
+ attrs,
+ vis,
+- sig: Signature {
+- constness: None,
+- asyncness: None,
+- unsafety: None,
+- abi: None,
+- fn_token,
+- ident,
+- paren_token,
+- inputs,
+- output,
+- variadic,
+- generics: Generics {
+- where_clause,
+- ..generics
+- },
+- },
++ sig,
+ semi_token,
+ })
+ }
+@@ -1706,6 +1696,37 @@ pub mod parsing {
+ }
+ }
+
++ fn parse_foreign_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ForeignItem> {
++ let FlexibleItemType {
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds: _,
++ ty,
++ semi_token,
++ } = input.parse()?;
++
++ if defaultness.is_some()
++ || generics.lt_token.is_some()
++ || generics.where_clause.is_some()
++ || colon_token.is_some()
++ || ty.is_some()
++ {
++ Ok(ForeignItem::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(ForeignItem::Type(ForeignItemType {
++ attrs: Vec::new(),
++ vis,
++ type_token,
++ ident,
++ semi_token,
++ }))
++ }
++ }
++
+ impl Parse for ForeignItemMacro {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+@@ -1742,6 +1763,36 @@ pub mod parsing {
+ }
+ }
+
++ fn parse_item_type(begin: ParseBuffer, input: ParseStream) -> Result<Item> {
++ let FlexibleItemType {
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds: _,
++ ty,
++ semi_token,
++ } = input.parse()?;
++
++ if defaultness.is_some() || colon_token.is_some() || ty.is_none() {
++ Ok(Item::Verbatim(verbatim::between(begin, input)))
++ } else {
++ let (eq_token, ty) = ty.unwrap();
++ Ok(Item::Type(ItemType {
++ attrs: Vec::new(),
++ vis,
++ type_token,
++ ident,
++ generics,
++ eq_token,
++ ty: Box::new(ty),
++ semi_token,
++ }))
++ }
++ }
++
+ #[cfg(not(feature = "printing"))]
+ fn item_existential(input: ParseStream) -> Result<TokenStream> {
+ Err(input.error("existential type is not supported"))
+@@ -1887,7 +1938,7 @@ pub mod parsing {
+
+ impl Parse for ItemTrait {
+ fn parse(input: ParseStream) -> Result<Self> {
+- let attrs = input.call(Attribute::parse_outer)?;
++ let outer_attrs = input.call(Attribute::parse_outer)?;
+ let vis: Visibility = input.parse()?;
+ let unsafety: Option<Token![unsafe]> = input.parse()?;
+ let auto_token: Option<Token![auto]> = input.parse()?;
+@@ -1896,7 +1947,7 @@ pub mod parsing {
+ let generics: Generics = input.parse()?;
+ parse_rest_of_trait(
+ input,
+- attrs,
++ outer_attrs,
+ vis,
+ unsafety,
+ auto_token,
+@@ -1909,7 +1960,7 @@ pub mod parsing {
+
+ fn parse_rest_of_trait(
+ input: ParseStream,
+- attrs: Vec<Attribute>,
++ outer_attrs: Vec<Attribute>,
+ vis: Visibility,
+ unsafety: Option<Token![unsafe]>,
+ auto_token: Option<Token![auto]>,
+@@ -1937,13 +1988,14 @@ pub mod parsing {
+
+ let content;
+ let brace_token = braced!(content in input);
++ let inner_attrs = content.call(Attribute::parse_inner)?;
+ let mut items = Vec::new();
+ while !content.is_empty() {
+ items.push(content.parse()?);
+ }
+
+ Ok(ItemTrait {
+- attrs,
++ attrs: private::attrs(outer_attrs, inner_attrs),
+ vis,
+ unsafety,
+ auto_token,
+@@ -2014,14 +2066,19 @@ pub mod parsing {
+
+ impl Parse for TraitItem {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let begin = input.fork();
+ let mut attrs = input.call(Attribute::parse_outer)?;
++ let vis: Visibility = input.parse()?;
++ let defaultness: Option<Token![default]> = input.parse()?;
+ let ahead = input.fork();
+
+ let lookahead = ahead.lookahead1();
+- let mut item = if lookahead.peek(Token![const]) {
++ let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) {
++ input.parse().map(TraitItem::Method)
++ } else if lookahead.peek(Token![const]) {
+ ahead.parse::<Token![const]>()?;
+ let lookahead = ahead.lookahead1();
+- if lookahead.peek(Ident) {
++ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
+ input.parse().map(TraitItem::Const)
+ } else if lookahead.peek(Token![async])
+ || lookahead.peek(Token![unsafe])
+@@ -2032,18 +2089,11 @@ pub mod parsing {
+ } else {
+ Err(lookahead.error())
+ }
+- } else if lookahead.peek(Token![async])
+- || lookahead.peek(Token![unsafe])
+- || lookahead.peek(Token![extern])
+- || lookahead.peek(Token![fn])
+- {
+- input.parse().map(TraitItem::Method)
+ } else if lookahead.peek(Token![type]) {
+- input.parse().map(TraitItem::Type)
++ parse_trait_item_type(begin.fork(), input)
+ } else if lookahead.peek(Ident)
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![super])
+- || lookahead.peek(Token![extern])
+ || lookahead.peek(Token![crate])
+ || lookahead.peek(Token![::])
+ {
+@@ -2052,18 +2102,20 @@ pub mod parsing {
+ Err(lookahead.error())
+ }?;
+
+- {
+- let item_attrs = match &mut item {
+- TraitItem::Const(item) => &mut item.attrs,
+- TraitItem::Method(item) => &mut item.attrs,
+- TraitItem::Type(item) => &mut item.attrs,
+- TraitItem::Macro(item) => &mut item.attrs,
+- TraitItem::Verbatim(_) | TraitItem::__Nonexhaustive => unreachable!(),
+- };
+- attrs.extend(item_attrs.drain(..));
+- *item_attrs = attrs;
++ match (vis, defaultness) {
++ (Visibility::Inherited, None) => {}
++ _ => return Ok(TraitItem::Verbatim(verbatim::between(begin, input))),
+ }
+
++ let item_attrs = match &mut item {
++ TraitItem::Const(item) => &mut item.attrs,
++ TraitItem::Method(item) => &mut item.attrs,
++ TraitItem::Type(item) => &mut item.attrs,
++ TraitItem::Macro(item) => &mut item.attrs,
++ TraitItem::Verbatim(_) | TraitItem::__Nonexhaustive => unreachable!(),
++ };
++ attrs.extend(item_attrs.drain(..));
++ *item_attrs = attrs;
+ Ok(item)
+ }
+ }
+@@ -2073,7 +2125,14 @@ pub mod parsing {
+ Ok(TraitItemConst {
+ attrs: input.call(Attribute::parse_outer)?,
+ const_token: input.parse()?,
+- ident: input.parse()?,
++ ident: {
++ let lookahead = input.lookahead1();
++ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
++ input.call(Ident::parse_any)?
++ } else {
++ return Err(lookahead.error());
++ }
++ },
+ colon_token: input.parse()?,
+ ty: input.parse()?,
+ default: {
+@@ -2093,20 +2152,7 @@ pub mod parsing {
+ impl Parse for TraitItemMethod {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let outer_attrs = input.call(Attribute::parse_outer)?;
+- let constness: Option<Token![const]> = input.parse()?;
+- let asyncness: Option<Token![async]> = input.parse()?;
+- let unsafety: Option<Token![unsafe]> = input.parse()?;
+- let abi: Option<Abi> = input.parse()?;
+- let fn_token: Token![fn] = input.parse()?;
+- let ident: Ident = input.parse()?;
+- let generics: Generics = input.parse()?;
+-
+- let content;
+- let paren_token = parenthesized!(content in input);
+- let inputs = content.parse_terminated(FnArg::parse)?;
+-
+- let output: ReturnType = input.parse()?;
+- let where_clause: Option<WhereClause> = input.parse()?;
++ let sig = parse_signature(input)?;
+
+ let lookahead = input.lookahead1();
+ let (brace_token, inner_attrs, stmts, semi_token) = if lookahead.peek(token::Brace) {
+@@ -2124,22 +2170,7 @@ pub mod parsing {
+
+ Ok(TraitItemMethod {
+ attrs: private::attrs(outer_attrs, inner_attrs),
+- sig: Signature {
+- constness,
+- asyncness,
+- unsafety,
+- abi,
+- fn_token,
+- ident,
+- paren_token,
+- inputs,
+- output,
+- variadic: None,
+- generics: Generics {
+- where_clause,
+- ..generics
+- },
+- },
++ sig,
+ default: brace_token.map(|brace_token| Block { brace_token, stmts }),
+ semi_token,
+ })
+@@ -2188,6 +2219,35 @@ pub mod parsing {
+ }
+ }
+
++ fn parse_trait_item_type(begin: ParseBuffer, input: ParseStream) -> Result<TraitItem> {
++ let FlexibleItemType {
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds,
++ ty,
++ semi_token,
++ } = input.parse()?;
++
++ if defaultness.is_some() || vis.is_some() {
++ Ok(TraitItem::Verbatim(verbatim::between(begin, input)))
++ } else {
++ Ok(TraitItem::Type(TraitItemType {
++ attrs: Vec::new(),
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds,
++ default: ty,
++ semi_token,
++ }))
++ }
++ }
++
+ impl Parse for TraitItemMacro {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+@@ -2207,52 +2267,67 @@ pub mod parsing {
+
+ impl Parse for ItemImpl {
+ fn parse(input: ParseStream) -> Result<Self> {
+- let outer_attrs = input.call(Attribute::parse_outer)?;
+- let defaultness: Option<Token![default]> = input.parse()?;
+- let unsafety: Option<Token![unsafe]> = input.parse()?;
+- let impl_token: Token![impl] = input.parse()?;
+-
+- let has_generics = input.peek(Token![<])
+- && (input.peek2(Token![>])
+- || input.peek2(Token![#])
+- || (input.peek2(Ident) || input.peek2(Lifetime))
+- && (input.peek3(Token![:])
+- || input.peek3(Token![,])
+- || input.peek3(Token![>])));
+- let generics: Generics = if has_generics {
+- input.parse()?
+- } else {
+- Generics::default()
+- };
+-
+- let trait_ = {
+- // TODO: optimize using advance_to
+- let ahead = input.fork();
+- if ahead.parse::<Option<Token![!]>>().is_ok()
+- && ahead.parse::<Path>().is_ok()
+- && ahead.parse::<Token![for]>().is_ok()
+- {
+- let polarity: Option<Token![!]> = input.parse()?;
+- let path: Path = input.parse()?;
+- let for_token: Token![for] = input.parse()?;
+- Some((polarity, path, for_token))
+- } else {
+- None
+- }
+- };
+- let self_ty: Type = input.parse()?;
+- let where_clause: Option<WhereClause> = input.parse()?;
++ let allow_const_impl = false;
++ parse_impl(input, allow_const_impl).map(Option::unwrap)
++ }
++ }
++
++ fn parse_impl(input: ParseStream, allow_const_impl: bool) -> Result<Option<ItemImpl>> {
++ let outer_attrs = input.call(Attribute::parse_outer)?;
++ let defaultness: Option<Token![default]> = input.parse()?;
++ let unsafety: Option<Token![unsafe]> = input.parse()?;
++ let impl_token: Token![impl] = input.parse()?;
++
++ let has_generics = input.peek(Token![<])
++ && (input.peek2(Token![>])
++ || input.peek2(Token![#])
++ || (input.peek2(Ident) || input.peek2(Lifetime))
++ && (input.peek3(Token![:])
++ || input.peek3(Token![,])
++ || input.peek3(Token![>]))
++ || input.peek2(Token![const]));
++ let generics: Generics = if has_generics {
++ input.parse()?
++ } else {
++ Generics::default()
++ };
+
+- let content;
+- let brace_token = braced!(content in input);
+- let inner_attrs = content.call(Attribute::parse_inner)?;
++ let is_const_impl = allow_const_impl
++ && (input.peek(Token![const]) || input.peek(Token![?]) && input.peek2(Token![const]));
++ if is_const_impl {
++ input.parse::<Option<Token![?]>>()?;
++ input.parse::<Token![const]>()?;
++ }
+
+- let mut items = Vec::new();
+- while !content.is_empty() {
+- items.push(content.parse()?);
++ let trait_ = (|| -> Option<_> {
++ let ahead = input.fork();
++ let polarity: Option<Token![!]> = ahead.parse().ok()?;
++ let mut path: Path = ahead.parse().ok()?;
++ if path.segments.last().unwrap().arguments.is_empty() && ahead.peek(token::Paren) {
++ let parenthesized = PathArguments::Parenthesized(ahead.parse().ok()?);
++ path.segments.last_mut().unwrap().arguments = parenthesized;
+ }
++ let for_token: Token![for] = ahead.parse().ok()?;
++ input.advance_to(&ahead);
++ Some((polarity, path, for_token))
++ })();
++
++ let self_ty: Type = input.parse()?;
++ let where_clause: Option<WhereClause> = input.parse()?;
++
++ let content;
++ let brace_token = braced!(content in input);
++ let inner_attrs = content.call(Attribute::parse_inner)?;
++
++ let mut items = Vec::new();
++ while !content.is_empty() {
++ items.push(content.parse()?);
++ }
+
+- Ok(ItemImpl {
++ if is_const_impl {
++ Ok(None)
++ } else {
++ Ok(Some(ItemImpl {
+ attrs: private::attrs(outer_attrs, inner_attrs),
+ defaultness,
+ unsafety,
+@@ -2265,12 +2340,13 @@ pub mod parsing {
+ self_ty: Box::new(self_ty),
+ brace_token,
+ items,
+- })
++ }))
+ }
+ }
+
+ impl Parse for ImplItem {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let begin = input.fork();
+ let mut attrs = input.call(Attribute::parse_outer)?;
+ let ahead = input.fork();
+ let vis: Visibility = ahead.parse()?;
+@@ -2284,28 +2360,38 @@ pub mod parsing {
+ None
+ };
+
+- let mut item = if lookahead.peek(Token![const]) {
+- ahead.parse::<Token![const]>()?;
++ let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) {
++ input.parse().map(ImplItem::Method)
++ } else if lookahead.peek(Token![const]) {
++ let const_token: Token![const] = ahead.parse()?;
+ let lookahead = ahead.lookahead1();
+- if lookahead.peek(Ident) {
+- input.parse().map(ImplItem::Const)
+- } else if lookahead.peek(Token![unsafe])
+- || lookahead.peek(Token![async])
+- || lookahead.peek(Token![extern])
+- || lookahead.peek(Token![fn])
+- {
+- input.parse().map(ImplItem::Method)
++ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
++ input.advance_to(&ahead);
++ let ident: Ident = input.call(Ident::parse_any)?;
++ let colon_token: Token![:] = input.parse()?;
++ let ty: Type = input.parse()?;
++ if let Some(eq_token) = input.parse()? {
++ return Ok(ImplItem::Const(ImplItemConst {
++ attrs,
++ vis,
++ defaultness,
++ const_token,
++ ident,
++ colon_token,
++ ty,
++ eq_token,
++ expr: input.parse()?,
++ semi_token: input.parse()?,
++ }));
++ } else {
++ input.parse::<Token![;]>()?;
++ return Ok(ImplItem::Verbatim(verbatim::between(begin, input)));
++ }
+ } else {
+ Err(lookahead.error())
+ }
+- } else if lookahead.peek(Token![unsafe])
+- || lookahead.peek(Token![async])
+- || lookahead.peek(Token![extern])
+- || lookahead.peek(Token![fn])
+- {
+- input.parse().map(ImplItem::Method)
+ } else if lookahead.peek(Token![type]) {
+- input.parse().map(ImplItem::Type)
++ parse_impl_item_type(begin, input)
+ } else if vis.is_inherited() && defaultness.is_none() && lookahead.peek(existential) {
+ input.call(item_existential).map(ImplItem::Verbatim)
+ } else if vis.is_inherited()
+@@ -2313,7 +2399,6 @@ pub mod parsing {
+ && (lookahead.peek(Ident)
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![super])
+- || lookahead.peek(Token![extern])
+ || lookahead.peek(Token![crate])
+ || lookahead.peek(Token![::]))
+ {
+@@ -2346,7 +2431,14 @@ pub mod parsing {
+ vis: input.parse()?,
+ defaultness: input.parse()?,
+ const_token: input.parse()?,
+- ident: input.parse()?,
++ ident: {
++ let lookahead = input.lookahead1();
++ if lookahead.peek(Ident) || lookahead.peek(Token![_]) {
++ input.call(Ident::parse_any)?
++ } else {
++ return Err(lookahead.error());
++ }
++ },
+ colon_token: input.parse()?,
+ ty: input.parse()?,
+ eq_token: input.parse()?,
+@@ -2358,50 +2450,39 @@ pub mod parsing {
+
+ impl Parse for ImplItemMethod {
+ fn parse(input: ParseStream) -> Result<Self> {
+- let outer_attrs = input.call(Attribute::parse_outer)?;
++ let mut attrs = input.call(Attribute::parse_outer)?;
+ let vis: Visibility = input.parse()?;
+ let defaultness: Option<Token![default]> = input.parse()?;
+- let constness: Option<Token![const]> = input.parse()?;
+- let asyncness: Option<Token![async]> = input.parse()?;
+- let unsafety: Option<Token![unsafe]> = input.parse()?;
+- let abi: Option<Abi> = input.parse()?;
+- let fn_token: Token![fn] = input.parse()?;
+- let ident: Ident = input.parse()?;
+- let generics: Generics = input.parse()?;
+-
+- let content;
+- let paren_token = parenthesized!(content in input);
+- let inputs = content.parse_terminated(FnArg::parse)?;
+-
+- let output: ReturnType = input.parse()?;
+- let where_clause: Option<WhereClause> = input.parse()?;
+-
+- let content;
+- let brace_token = braced!(content in input);
+- let inner_attrs = content.call(Attribute::parse_inner)?;
+- let stmts = content.call(Block::parse_within)?;
++ let sig = parse_signature(input)?;
++
++ let block = if let Some(semi) = input.parse::<Option<Token![;]>>()? {
++ // Accept methods without a body in an impl block because
++ // rustc's *parser* does not reject them (the compilation error
++ // is emitted later than parsing) and it can be useful for macro
++ // DSLs.
++ let mut punct = Punct::new(';', Spacing::Alone);
++ punct.set_span(semi.span);
++ let tokens = TokenStream::from_iter(vec![TokenTree::Punct(punct)]);
++ Block {
++ brace_token: Brace::default(),
++ stmts: vec![Stmt::Item(Item::Verbatim(tokens))],
++ }
++ } else {
++ let content;
++ let brace_token = braced!(content in input);
++ attrs.extend(content.call(Attribute::parse_inner)?);
++ Block {
++ brace_token,
++ stmts: content.call(Block::parse_within)?,
++ }
++ };
+
+ Ok(ImplItemMethod {
+- attrs: private::attrs(outer_attrs, inner_attrs),
++ attrs,
+ vis,
+ defaultness,
+- sig: Signature {
+- constness,
+- asyncness,
+- unsafety,
+- abi,
+- fn_token,
+- ident,
+- paren_token,
+- inputs,
+- output,
+- variadic: None,
+- generics: Generics {
+- where_clause,
+- ..generics
+- },
+- },
+- block: Block { brace_token, stmts },
++ sig,
++ block,
+ })
+ }
+ }
+@@ -2426,6 +2507,37 @@ pub mod parsing {
+ }
+ }
+
++ fn parse_impl_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ImplItem> {
++ let FlexibleItemType {
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ colon_token,
++ bounds: _,
++ ty,
++ semi_token,
++ } = input.parse()?;
++
++ if colon_token.is_some() || ty.is_none() {
++ Ok(ImplItem::Verbatim(verbatim::between(begin, input)))
++ } else {
++ let (eq_token, ty) = ty.unwrap();
++ Ok(ImplItem::Type(ImplItemType {
++ attrs: Vec::new(),
++ vis,
++ defaultness,
++ type_token,
++ ident,
++ generics,
++ eq_token,
++ ty,
++ semi_token,
++ }))
++ }
++ }
++
+ impl Parse for ImplItemMacro {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+@@ -2471,6 +2583,7 @@ mod printing {
+
+ use crate::attr::FilterAttrs;
+ use crate::print::TokensOrDefault;
++ use crate::punctuated::Pair;
+
+ impl ToTokens for ItemExternCrate {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+@@ -2835,6 +2948,14 @@ mod printing {
+ self.vis.to_tokens(tokens);
+ self.defaultness.to_tokens(tokens);
+ self.sig.to_tokens(tokens);
++ if self.block.stmts.len() == 1 {
++ if let Stmt::Item(Item::Verbatim(verbatim)) = &self.block.stmts[0] {
++ if verbatim.to_string() == ";" {
++ verbatim.to_tokens(tokens);
++ return;
++ }
++ }
++ }
+ self.block.brace_token.surround(tokens, |tokens| {
+ tokens.append_all(self.attrs.inner());
+ tokens.append_all(&self.block.stmts);
+@@ -2905,6 +3026,33 @@ mod printing {
+ }
+ }
+
++ fn maybe_variadic_to_tokens(arg: &FnArg, tokens: &mut TokenStream) -> bool {
++ let arg = match arg {
++ FnArg::Typed(arg) => arg,
++ FnArg::Receiver(receiver) => {
++ receiver.to_tokens(tokens);
++ return false;
++ }
++ };
++
++ match arg.ty.as_ref() {
++ Type::Verbatim(ty) if ty.to_string() == "..." => {
++ match arg.pat.as_ref() {
++ Pat::Verbatim(pat) if pat.to_string() == "..." => {
++ tokens.append_all(arg.attrs.outer());
++ pat.to_tokens(tokens);
++ }
++ _ => arg.to_tokens(tokens),
++ }
++ true
++ }
++ _ => {
++ arg.to_tokens(tokens);
++ false
++ }
++ }
++ }
++
+ impl ToTokens for Signature {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ self.constness.to_tokens(tokens);
+@@ -2915,11 +3063,24 @@ mod printing {
+ self.ident.to_tokens(tokens);
+ self.generics.to_tokens(tokens);
+ self.paren_token.surround(tokens, |tokens| {
+- self.inputs.to_tokens(tokens);
+- if self.variadic.is_some() && !self.inputs.empty_or_trailing() {
+- <Token![,]>::default().to_tokens(tokens);
++ let mut last_is_variadic = false;
++ for input in self.inputs.pairs() {
++ match input {
++ Pair::Punctuated(input, comma) => {
++ maybe_variadic_to_tokens(input, tokens);
++ comma.to_tokens(tokens);
++ }
++ Pair::End(input) => {
++ last_is_variadic = maybe_variadic_to_tokens(input, tokens);
++ }
++ }
++ }
++ if self.variadic.is_some() && !last_is_variadic {
++ if !self.inputs.empty_or_trailing() {
++ <Token![,]>::default().to_tokens(tokens);
++ }
++ self.variadic.to_tokens(tokens);
+ }
+- self.variadic.to_tokens(tokens);
+ });
+ self.output.to_tokens(tokens);
+ self.generics.where_clause.to_tokens(tokens);
+diff --git a/third_party/rust/syn/src/keyword.rs b/third_party/rust/syn/src/keyword.rs
+deleted file mode 100644
+index e69de29bb2..0000000000
+diff --git a/third_party/rust/syn/src/lib.rs b/third_party/rust/syn/src/lib.rs
+index c8ada7e638..3da506731e 100644
+--- mozilla-release/third_party/rust/syn/src/lib.rs
++++ mozilla-release/third_party/rust/syn/src/lib.rs
+@@ -1,3 +1,11 @@
++//! [![github]](https://github.com/dtolnay/syn)&ensp;[![crates-io]](https://crates.io/crates/syn)&ensp;[![docs-rs]](https://docs.rs/syn)
++//!
++//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
++//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust
++//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K
++//!
++//! <br>
++//!
+ //! Syn is a parsing library for parsing a stream of Rust tokens into a syntax
+ //! tree of Rust source code.
+ //!
+@@ -62,8 +70,8 @@
+ //! ```
+ //!
+ //! ```
+-//! extern crate proc_macro;
+-//!
++//! # extern crate proc_macro;
++//! #
+ //! use proc_macro::TokenStream;
+ //! use quote::quote;
+ //! use syn::{parse_macro_input, DeriveInput};
+@@ -242,35 +250,48 @@
+ //! dynamic library libproc_macro from rustc toolchain.
+
+ // Syn types in rustdoc of other crates get linked to here.
+-#![doc(html_root_url = "https://docs.rs/syn/1.0.5")]
++#![doc(html_root_url = "https://docs.rs/syn/1.0.40")]
+ #![deny(clippy::all, clippy::pedantic)]
+ // Ignored clippy lints.
+ #![allow(
+- clippy::block_in_if_condition_stmt,
++ clippy::blocks_in_if_conditions,
+ clippy::cognitive_complexity,
+ clippy::doc_markdown,
+ clippy::eval_order_dependence,
+ clippy::inherent_to_string,
+ clippy::large_enum_variant,
++ clippy::manual_non_exhaustive,
++ clippy::match_like_matches_macro,
++ clippy::match_on_vec_items,
++ clippy::needless_doctest_main,
+ clippy::needless_pass_by_value,
+ clippy::never_loop,
+ clippy::suspicious_op_assign_impl,
+ clippy::too_many_arguments,
+- clippy::trivially_copy_pass_by_ref
++ clippy::trivially_copy_pass_by_ref,
++ clippy::unnecessary_unwrap
+ )]
+ // Ignored clippy_pedantic lints.
+ #![allow(
+ clippy::cast_possible_truncation,
++ clippy::default_trait_access,
+ clippy::empty_enum,
++ clippy::expl_impl_clone_on_copy,
+ clippy::if_not_else,
+ clippy::items_after_statements,
++ clippy::match_same_arms,
++ clippy::missing_errors_doc,
+ clippy::module_name_repetitions,
++ clippy::must_use_candidate,
++ clippy::option_if_let_else,
+ clippy::shadow_unrelated,
+ clippy::similar_names,
+ clippy::single_match_else,
++ clippy::too_many_lines,
+ clippy::unseparated_literal_suffix,
+ clippy::use_self,
+- clippy::used_underscore_binding
++ clippy::used_underscore_binding,
++ clippy::wildcard_imports
+ )]
+
+ #[cfg(all(
+@@ -284,7 +305,6 @@ extern crate unicode_xid;
+ #[cfg(feature = "printing")]
+ extern crate quote;
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+ #[macro_use]
+ mod macros;
+
+@@ -307,7 +327,6 @@ pub use crate::attr::{
+ AttrStyle, Attribute, AttributeArgs, Meta, MetaList, MetaNameValue, NestedMeta,
+ };
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+ mod bigint;
+
+ #[cfg(any(feature = "full", feature = "derive"))]
+@@ -364,9 +383,7 @@ pub use crate::file::File;
+ mod lifetime;
+ pub use crate::lifetime::Lifetime;
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+ mod lit;
+-#[cfg(any(feature = "full", feature = "derive"))]
+ pub use crate::lit::{
+ Lit, LitBool, LitByte, LitByteStr, LitChar, LitFloat, LitInt, LitStr, StrStyle,
+ };
+@@ -441,6 +458,9 @@ pub mod parse_macro_input;
+ #[cfg(all(feature = "parsing", feature = "printing"))]
+ pub mod spanned;
+
++#[cfg(all(feature = "parsing", feature = "full"))]
++mod whitespace;
++
+ mod gen {
+ /// Syntax tree traversal to walk a shared borrow of a syntax tree.
+ ///
+@@ -482,7 +502,7 @@ mod gen {
+ /// /* ... */
+ /// ```
+ ///
+- /// *This module is available if Syn is built with the `"visit"` feature.*
++ /// *This module is available only if Syn is built with the `"visit"` feature.*
+ ///
+ /// <br>
+ ///
+@@ -603,7 +623,7 @@ mod gen {
+ /// /* ... */
+ /// ```
+ ///
+- /// *This module is available if Syn is built with the `"visit-mut"`
++ /// *This module is available only if Syn is built with the `"visit-mut"`
+ /// feature.*
+ ///
+ /// <br>
+@@ -702,7 +722,7 @@ mod gen {
+ /// /* ... */
+ /// ```
+ ///
+- /// *This module is available if Syn is built with the `"fold"` feature.*
++ /// *This module is available only if Syn is built with the `"fold"` feature.*
+ ///
+ /// <br>
+ ///
+@@ -744,6 +764,22 @@ mod gen {
+ #[rustfmt::skip]
+ pub mod fold;
+
++ #[cfg(feature = "clone-impls")]
++ #[rustfmt::skip]
++ mod clone;
++
++ #[cfg(feature = "extra-traits")]
++ #[rustfmt::skip]
++ mod eq;
++
++ #[cfg(feature = "extra-traits")]
++ #[rustfmt::skip]
++ mod hash;
++
++ #[cfg(feature = "extra-traits")]
++ #[rustfmt::skip]
++ mod debug;
++
+ #[cfg(any(feature = "full", feature = "derive"))]
+ #[path = "../gen_helper.rs"]
+ mod helper;
+@@ -757,6 +793,8 @@ pub mod export;
+ mod custom_keyword;
+ mod custom_punctuation;
+ mod sealed;
++mod span;
++mod thread;
+
+ #[cfg(feature = "parsing")]
+ mod lookahead;
+@@ -764,13 +802,15 @@ mod lookahead;
+ #[cfg(feature = "parsing")]
+ pub mod parse;
+
+-mod span;
++#[cfg(feature = "full")]
++mod reserved;
++
++#[cfg(all(any(feature = "full", feature = "derive"), feature = "parsing"))]
++mod verbatim;
+
+ #[cfg(all(any(feature = "full", feature = "derive"), feature = "printing"))]
+ mod print;
+
+-mod thread;
+-
+ ////////////////////////////////////////////////////////////////////////////////
+
+ #[allow(dead_code, non_camel_case_types)]
+@@ -800,14 +840,14 @@ pub use crate::error::{Error, Result};
+ ///
+ /// [`syn::parse2`]: parse2
+ ///
+-/// *This function is available if Syn is built with both the `"parsing"` and
++/// *This function is available only if Syn is built with both the `"parsing"` and
+ /// `"proc-macro"` features.*
+ ///
+ /// # Examples
+ ///
+ /// ```
+-/// extern crate proc_macro;
+-///
++/// # extern crate proc_macro;
++/// #
+ /// use proc_macro::TokenStream;
+ /// use quote::quote;
+ /// use syn::DeriveInput;
+@@ -847,7 +887,7 @@ pub fn parse<T: parse::Parse>(tokens: proc_macro::TokenStream) -> Result<T> {
+ ///
+ /// [`syn::parse`]: parse()
+ ///
+-/// *This function is available if Syn is built with the `"parsing"` feature.*
++/// *This function is available only if Syn is built with the `"parsing"` feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse2<T: parse::Parse>(tokens: proc_macro2::TokenStream) -> Result<T> {
+ parse::Parser::parse2(T::parse, tokens)
+@@ -855,7 +895,7 @@ pub fn parse2<T: parse::Parse>(tokens: proc_macro2::TokenStream) -> Result<T> {
+
+ /// Parse a string of Rust code into the chosen syntax tree node.
+ ///
+-/// *This function is available if Syn is built with the `"parsing"` feature.*
++/// *This function is available only if Syn is built with the `"parsing"` feature.*
+ ///
+ /// # Hygiene
+ ///
+@@ -874,9 +914,7 @@ pub fn parse2<T: parse::Parse>(tokens: proc_macro2::TokenStream) -> Result<T> {
+ /// Ok(())
+ /// }
+ /// #
+-/// # fn main() {
+-/// # run().unwrap();
+-/// # }
++/// # run().unwrap();
+ /// ```
+ #[cfg(feature = "parsing")]
+ pub fn parse_str<T: parse::Parse>(s: &str) -> Result<T> {
+@@ -894,7 +932,7 @@ pub fn parse_str<T: parse::Parse>(s: &str) -> Result<T> {
+ ///
+ /// If present, either of these would be an error using `from_str`.
+ ///
+-/// *This function is available if Syn is built with the `"parsing"` and
++/// *This function is available only if Syn is built with the `"parsing"` and
+ /// `"full"` features.*
+ ///
+ /// # Examples
+@@ -918,9 +956,7 @@ pub fn parse_str<T: parse::Parse>(s: &str) -> Result<T> {
+ /// Ok(())
+ /// }
+ /// #
+-/// # fn main() {
+-/// # run().unwrap();
+-/// # }
++/// # run().unwrap();
+ /// ```
+ #[cfg(all(feature = "parsing", feature = "full"))]
+ pub fn parse_file(mut content: &str) -> Result<File> {
+@@ -931,13 +967,16 @@ pub fn parse_file(mut content: &str) -> Result<File> {
+ }
+
+ let mut shebang = None;
+- if content.starts_with("#!") && !content.starts_with("#![") {
+- if let Some(idx) = content.find('\n') {
+- shebang = Some(content[..idx].to_string());
+- content = &content[idx..];
+- } else {
+- shebang = Some(content.to_string());
+- content = "";
++ if content.starts_with("#!") {
++ let rest = whitespace::skip(&content[2..]);
++ if !rest.starts_with('[') {
++ if let Some(idx) = content.find('\n') {
++ shebang = Some(content[..idx].to_string());
++ content = &content[idx..];
++ } else {
++ shebang = Some(content.to_string());
++ content = "";
++ }
+ }
+ }
+
+diff --git a/third_party/rust/syn/src/lifetime.rs b/third_party/rust/syn/src/lifetime.rs
+index d51c48e827..959cc5f9c6 100644
+--- mozilla-release/third_party/rust/syn/src/lifetime.rs
++++ mozilla-release/third_party/rust/syn/src/lifetime.rs
+@@ -18,10 +18,8 @@ use crate::lookahead;
+ /// - All following characters must be Unicode code points with the XID_Continue
+ /// property.
+ ///
+-/// *This type is available if Syn is built with the `"derive"` or `"full"`
++/// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+-#[cfg_attr(feature = "extra-traits", derive(Debug))]
+-#[derive(Clone)]
+ pub struct Lifetime {
+ pub apostrophe: Span,
+ pub ident: Ident,
+@@ -72,6 +70,15 @@ impl Display for Lifetime {
+ }
+ }
+
++impl Clone for Lifetime {
++ fn clone(&self) -> Self {
++ Lifetime {
++ apostrophe: self.apostrophe,
++ ident: self.ident.clone(),
++ }
++ }
++}
++
+ impl PartialEq for Lifetime {
+ fn eq(&self, other: &Lifetime) -> bool {
+ self.ident.eq(&other.ident)
+diff --git a/third_party/rust/syn/src/lit.rs b/third_party/rust/syn/src/lit.rs
+index f2209a2980..ee77e75bec 100644
+--- mozilla-release/third_party/rust/syn/src/lit.rs
++++ mozilla-release/third_party/rust/syn/src/lit.rs
+@@ -22,9 +22,6 @@ use crate::{Error, Result};
+ ast_enum_of_structs! {
+ /// A Rust literal such as a string or integer or boolean.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
+- /// feature.*
+- ///
+ /// # Syntax tree enum
+ ///
+ /// This type is a [syntax tree enum].
+@@ -33,7 +30,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum Lit #manual_extra_traits {
++ pub enum Lit {
+ /// A UTF-8 string literal: `"foo"`.
+ Str(LitStr),
+
+@@ -64,61 +61,44 @@ ast_enum_of_structs! {
+
+ ast_struct! {
+ /// A UTF-8 string literal: `"foo"`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitStr #manual_extra_traits_debug {
+- repr: Box<LitStrRepr>,
++ pub struct LitStr {
++ repr: Box<LitRepr>,
+ }
+ }
+
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+-struct LitStrRepr {
+- token: Literal,
+- suffix: Box<str>,
+-}
+-
+ ast_struct! {
+ /// A byte string literal: `b"foo"`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitByteStr #manual_extra_traits_debug {
+- token: Literal,
++ pub struct LitByteStr {
++ repr: Box<LitRepr>,
+ }
+ }
+
+ ast_struct! {
+ /// A byte literal: `b'f'`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitByte #manual_extra_traits_debug {
+- token: Literal,
++ pub struct LitByte {
++ repr: Box<LitRepr>,
+ }
+ }
+
+ ast_struct! {
+ /// A character literal: `'a'`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitChar #manual_extra_traits_debug {
+- token: Literal,
++ pub struct LitChar {
++ repr: Box<LitRepr>,
+ }
+ }
+
++struct LitRepr {
++ token: Literal,
++ suffix: Box<str>,
++}
++
+ ast_struct! {
+ /// An integer literal: `1` or `1u16`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitInt #manual_extra_traits_debug {
++ pub struct LitInt {
+ repr: Box<LitIntRepr>,
+ }
+ }
+
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ struct LitIntRepr {
+ token: Literal,
+ digits: Box<str>,
+@@ -129,15 +109,11 @@ ast_struct! {
+ /// A floating point literal: `1f64` or `1.0e10f64`.
+ ///
+ /// Must be finite. May not be infinte or NaN.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitFloat #manual_extra_traits_debug {
++ pub struct LitFloat {
+ repr: Box<LitFloatRepr>,
+ }
+ }
+
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ struct LitFloatRepr {
+ token: Literal,
+ digits: Box<str>,
+@@ -146,92 +122,27 @@ struct LitFloatRepr {
+
+ ast_struct! {
+ /// A boolean literal: `true` or `false`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or
+- /// `"full"` feature.*
+- pub struct LitBool #manual_extra_traits_debug {
++ pub struct LitBool {
+ pub value: bool,
+ pub span: Span,
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Lit {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Lit {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (Lit::Str(this), Lit::Str(other)) => this == other,
+- (Lit::ByteStr(this), Lit::ByteStr(other)) => this == other,
+- (Lit::Byte(this), Lit::Byte(other)) => this == other,
+- (Lit::Char(this), Lit::Char(other)) => this == other,
+- (Lit::Int(this), Lit::Int(other)) => this == other,
+- (Lit::Float(this), Lit::Float(other)) => this == other,
+- (Lit::Bool(this), Lit::Bool(other)) => this == other,
+- (Lit::Verbatim(this), Lit::Verbatim(other)) => this.to_string() == other.to_string(),
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Lit {
+- fn hash<H>(&self, hash: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- Lit::Str(lit) => {
+- hash.write_u8(0);
+- lit.hash(hash);
+- }
+- Lit::ByteStr(lit) => {
+- hash.write_u8(1);
+- lit.hash(hash);
+- }
+- Lit::Byte(lit) => {
+- hash.write_u8(2);
+- lit.hash(hash);
+- }
+- Lit::Char(lit) => {
+- hash.write_u8(3);
+- lit.hash(hash);
+- }
+- Lit::Int(lit) => {
+- hash.write_u8(4);
+- lit.hash(hash);
+- }
+- Lit::Float(lit) => {
+- hash.write_u8(5);
+- lit.hash(hash);
+- }
+- Lit::Bool(lit) => {
+- hash.write_u8(6);
+- lit.hash(hash);
+- }
+- Lit::Verbatim(lit) => {
+- hash.write_u8(7);
+- lit.to_string().hash(hash);
+- }
+- }
+- }
+-}
+-
+ impl LitStr {
+ pub fn new(value: &str, span: Span) -> Self {
+- let mut lit = Literal::string(value);
+- lit.set_span(span);
++ let mut token = Literal::string(value);
++ token.set_span(span);
+ LitStr {
+- repr: Box::new(LitStrRepr {
+- token: lit,
++ repr: Box::new(LitRepr {
++ token,
+ suffix: Box::<str>::default(),
+ }),
+ }
+ }
+
+ pub fn value(&self) -> String {
+- let (value, _) = value::parse_lit_str(&self.repr.token.to_string());
++ let repr = self.repr.token.to_string();
++ let (value, _suffix) = value::parse_lit_str(&repr);
+ String::from(value)
+ }
+
+@@ -311,7 +222,7 @@ impl LitStr {
+ fn respan_token_tree(mut token: TokenTree, span: Span) -> TokenTree {
+ match &mut token {
+ TokenTree::Group(g) => {
+- let stream = respan_token_stream(g.stream().clone(), span);
++ let stream = respan_token_stream(g.stream(), span);
+ *g = Group::new(g.delimiter(), stream);
+ g.set_span(span);
+ }
+@@ -345,19 +256,30 @@ impl LitByteStr {
+ pub fn new(value: &[u8], span: Span) -> Self {
+ let mut token = Literal::byte_string(value);
+ token.set_span(span);
+- LitByteStr { token }
++ LitByteStr {
++ repr: Box::new(LitRepr {
++ token,
++ suffix: Box::<str>::default(),
++ }),
++ }
+ }
+
+ pub fn value(&self) -> Vec<u8> {
+- value::parse_lit_byte_str(&self.token.to_string())
++ let repr = self.repr.token.to_string();
++ let (value, _suffix) = value::parse_lit_byte_str(&repr);
++ value
+ }
+
+ pub fn span(&self) -> Span {
+- self.token.span()
++ self.repr.token.span()
+ }
+
+ pub fn set_span(&mut self, span: Span) {
+- self.token.set_span(span)
++ self.repr.token.set_span(span)
++ }
++
++ pub fn suffix(&self) -> &str {
++ &self.repr.suffix
+ }
+ }
+
+@@ -365,19 +287,30 @@ impl LitByte {
+ pub fn new(value: u8, span: Span) -> Self {
+ let mut token = Literal::u8_suffixed(value);
+ token.set_span(span);
+- LitByte { token }
++ LitByte {
++ repr: Box::new(LitRepr {
++ token,
++ suffix: Box::<str>::default(),
++ }),
++ }
+ }
+
+ pub fn value(&self) -> u8 {
+- value::parse_lit_byte(&self.token.to_string())
++ let repr = self.repr.token.to_string();
++ let (value, _suffix) = value::parse_lit_byte(&repr);
++ value
+ }
+
+ pub fn span(&self) -> Span {
+- self.token.span()
++ self.repr.token.span()
+ }
+
+ pub fn set_span(&mut self, span: Span) {
+- self.token.set_span(span)
++ self.repr.token.set_span(span)
++ }
++
++ pub fn suffix(&self) -> &str {
++ &self.repr.suffix
+ }
+ }
+
+@@ -385,36 +318,52 @@ impl LitChar {
+ pub fn new(value: char, span: Span) -> Self {
+ let mut token = Literal::character(value);
+ token.set_span(span);
+- LitChar { token }
++ LitChar {
++ repr: Box::new(LitRepr {
++ token,
++ suffix: Box::<str>::default(),
++ }),
++ }
+ }
+
+ pub fn value(&self) -> char {
+- value::parse_lit_char(&self.token.to_string())
++ let repr = self.repr.token.to_string();
++ let (value, _suffix) = value::parse_lit_char(&repr);
++ value
+ }
+
+ pub fn span(&self) -> Span {
+- self.token.span()
++ self.repr.token.span()
+ }
+
+ pub fn set_span(&mut self, span: Span) {
+- self.token.set_span(span)
++ self.repr.token.set_span(span)
++ }
++
++ pub fn suffix(&self) -> &str {
++ &self.repr.suffix
+ }
+ }
+
+ impl LitInt {
+ pub fn new(repr: &str, span: Span) -> Self {
+- if let Some((digits, suffix)) = value::parse_lit_int(repr) {
+- let mut token = value::to_literal(repr);
+- token.set_span(span);
+- LitInt {
+- repr: Box::new(LitIntRepr {
+- token,
+- digits,
+- suffix,
+- }),
+- }
+- } else {
+- panic!("Not an integer literal: `{}`", repr);
++ let (digits, suffix) = match value::parse_lit_int(repr) {
++ Some(parse) => parse,
++ None => panic!("Not an integer literal: `{}`", repr),
++ };
++
++ let mut token = match value::to_literal(repr, &digits, &suffix) {
++ Some(token) => token,
++ None => panic!("Unsupported integer literal: `{}`", repr),
++ };
++
++ token.set_span(span);
++ LitInt {
++ repr: Box::new(LitIntRepr {
++ token,
++ digits,
++ suffix,
++ }),
+ }
+ }
+
+@@ -492,18 +441,23 @@ impl Display for LitInt {
+
+ impl LitFloat {
+ pub fn new(repr: &str, span: Span) -> Self {
+- if let Some((digits, suffix)) = value::parse_lit_float(repr) {
+- let mut token = value::to_literal(repr);
+- token.set_span(span);
+- LitFloat {
+- repr: Box::new(LitFloatRepr {
+- token,
+- digits,
+- suffix,
+- }),
+- }
+- } else {
+- panic!("Not a float literal: `{}`", repr);
++ let (digits, suffix) = match value::parse_lit_float(repr) {
++ Some(parse) => parse,
++ None => panic!("Not a float literal: `{}`", repr),
++ };
++
++ let mut token = match value::to_literal(repr, &digits, &suffix) {
++ Some(token) => token,
++ None => panic!("Unsupported float literal: `{}`", repr),
++ };
++
++ token.set_span(span);
++ LitFloat {
++ repr: Box::new(LitFloatRepr {
++ token,
++ digits,
++ suffix,
++ }),
+ }
+ }
+
+@@ -575,7 +529,7 @@ mod debug_impls {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter
+ .debug_struct("LitByteStr")
+- .field("token", &format_args!("{}", self.token))
++ .field("token", &format_args!("{}", self.repr.token))
+ .finish()
+ }
+ }
+@@ -584,7 +538,7 @@ mod debug_impls {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter
+ .debug_struct("LitByte")
+- .field("token", &format_args!("{}", self.token))
++ .field("token", &format_args!("{}", self.repr.token))
+ .finish()
+ }
+ }
+@@ -593,7 +547,7 @@ mod debug_impls {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter
+ .debug_struct("LitChar")
+- .field("token", &format_args!("{}", self.token))
++ .field("token", &format_args!("{}", self.repr.token))
+ .finish()
+ }
+ }
+@@ -626,15 +580,53 @@ mod debug_impls {
+ }
+ }
+
++#[cfg(feature = "clone-impls")]
++impl Clone for LitRepr {
++ fn clone(&self) -> Self {
++ LitRepr {
++ token: self.token.clone(),
++ suffix: self.suffix.clone(),
++ }
++ }
++}
++
++#[cfg(feature = "clone-impls")]
++impl Clone for LitIntRepr {
++ fn clone(&self) -> Self {
++ LitIntRepr {
++ token: self.token.clone(),
++ digits: self.digits.clone(),
++ suffix: self.suffix.clone(),
++ }
++ }
++}
++
++#[cfg(feature = "clone-impls")]
++impl Clone for LitFloatRepr {
++ fn clone(&self) -> Self {
++ LitFloatRepr {
++ token: self.token.clone(),
++ digits: self.digits.clone(),
++ suffix: self.suffix.clone(),
++ }
++ }
++}
++
+ macro_rules! lit_extra_traits {
+- ($ty:ident, $($field:ident).+) => {
+- #[cfg(feature = "extra-traits")]
+- impl Eq for $ty {}
++ ($ty:ident) => {
++ #[cfg(feature = "clone-impls")]
++ impl Clone for $ty {
++ fn clone(&self) -> Self {
++ $ty {
++ repr: self.repr.clone(),
++ }
++ }
++ }
+
+ #[cfg(feature = "extra-traits")]
+ impl PartialEq for $ty {
+ fn eq(&self, other: &Self) -> bool {
+- self.$($field).+.to_string() == other.$($field).+.to_string()
++ self.repr.token.to_string() == other.repr.token.to_string()
+ }
+ }
+
+@@ -644,7 +636,7 @@ macro_rules! lit_extra_traits {
+ where
+ H: Hasher,
+ {
+- self.$($field).+.to_string().hash(state);
++ self.repr.token.to_string().hash(state);
+ }
+ }
+
+@@ -657,20 +649,23 @@ macro_rules! lit_extra_traits {
+ };
+ }
+
+-lit_extra_traits!(LitStr, repr.token);
+-lit_extra_traits!(LitByteStr, token);
+-lit_extra_traits!(LitByte, token);
+-lit_extra_traits!(LitChar, token);
+-lit_extra_traits!(LitInt, repr.token);
+-lit_extra_traits!(LitFloat, repr.token);
+-lit_extra_traits!(LitBool, value);
++lit_extra_traits!(LitStr);
++lit_extra_traits!(LitByteStr);
++lit_extra_traits!(LitByte);
++lit_extra_traits!(LitChar);
++lit_extra_traits!(LitInt);
++lit_extra_traits!(LitFloat);
++
++#[cfg(feature = "parsing")]
++#[doc(hidden)]
++#[allow(non_snake_case)]
++pub fn LitBool(marker: lookahead::TokenMarker) -> LitBool {
++ match marker {}
++}
+
+ ast_enum! {
+ /// The style of a string literal, either plain quoted or a raw string like
+ /// `r##"data"##`.
+- ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
+- /// feature.*
+ pub enum StrStyle #no_visit {
+ /// An ordinary string like `"data"`.
+ Cooked,
+@@ -691,7 +686,9 @@ pub fn Lit(marker: lookahead::TokenMarker) -> Lit {
+ #[cfg(feature = "parsing")]
+ pub mod parsing {
+ use super::*;
++ use crate::buffer::Cursor;
+ use crate::parse::{Parse, ParseStream, Result};
++ use proc_macro2::Punct;
+
+ impl Parse for Lit {
+ fn parse(input: ParseStream) -> Result<Self> {
+@@ -699,25 +696,73 @@ pub mod parsing {
+ if let Some((lit, rest)) = cursor.literal() {
+ return Ok((Lit::new(lit), rest));
+ }
+- while let Some((ident, rest)) = cursor.ident() {
+- let value = if ident == "true" {
+- true
+- } else if ident == "false" {
+- false
+- } else {
+- break;
+- };
+- let lit_bool = LitBool {
+- value,
+- span: ident.span(),
+- };
+- return Ok((Lit::Bool(lit_bool), rest));
++
++ if let Some((ident, rest)) = cursor.ident() {
++ let value = ident == "true";
++ if value || ident == "false" {
++ let lit_bool = LitBool {
++ value,
++ span: ident.span(),
++ };
++ return Ok((Lit::Bool(lit_bool), rest));
++ }
+ }
++
++ if let Some((punct, rest)) = cursor.punct() {
++ if punct.as_char() == '-' {
++ if let Some((lit, rest)) = parse_negative_lit(punct, rest) {
++ return Ok((lit, rest));
++ }
++ }
++ }
++
+ Err(cursor.error("expected literal"))
+ })
+ }
+ }
+
++ fn parse_negative_lit(neg: Punct, cursor: Cursor) -> Option<(Lit, Cursor)> {
++ let (lit, rest) = cursor.literal()?;
++
++ let mut span = neg.span();
++ span = span.join(lit.span()).unwrap_or(span);
++
++ let mut repr = lit.to_string();
++ repr.insert(0, '-');
++
++ if !(repr.ends_with("f32") || repr.ends_with("f64")) {
++ if let Some((digits, suffix)) = value::parse_lit_int(&repr) {
++ if let Some(mut token) = value::to_literal(&repr, &digits, &suffix) {
++ token.set_span(span);
++ return Some((
++ Lit::Int(LitInt {
++ repr: Box::new(LitIntRepr {
++ token,
++ digits,
++ suffix,
++ }),
++ }),
++ rest,
++ ));
++ }
++ }
++ }
++
++ let (digits, suffix) = value::parse_lit_float(&repr)?;
++ let mut token = value::to_literal(&repr, &digits, &suffix)?;
++ token.set_span(span);
++ Some((
++ Lit::Float(LitFloat {
++ repr: Box::new(LitFloatRepr {
++ token,
++ digits,
++ suffix,
++ }),
++ }),
++ rest,
++ ))
++ }
++
+ impl Parse for LitStr {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let head = input.fork();
+@@ -803,19 +848,19 @@ mod printing {
+
+ impl ToTokens for LitByteStr {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+- self.token.to_tokens(tokens);
++ self.repr.token.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for LitByte {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+- self.token.to_tokens(tokens);
++ self.repr.token.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for LitChar {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+- self.token.to_tokens(tokens);
++ self.repr.token.to_tokens(tokens);
+ }
+ }
+
+@@ -855,20 +900,29 @@ mod value {
+ b'"' | b'r' => {
+ let (_, suffix) = parse_lit_str(&repr);
+ return Lit::Str(LitStr {
+- repr: Box::new(LitStrRepr { token, suffix }),
++ repr: Box::new(LitRepr { token, suffix }),
+ });
+ }
+ b'b' => match byte(&repr, 1) {
+ b'"' | b'r' => {
+- return Lit::ByteStr(LitByteStr { token });
++ let (_, suffix) = parse_lit_byte_str(&repr);
++ return Lit::ByteStr(LitByteStr {
++ repr: Box::new(LitRepr { token, suffix }),
++ });
+ }
+ b'\'' => {
+- return Lit::Byte(LitByte { token });
++ let (_, suffix) = parse_lit_byte(&repr);
++ return Lit::Byte(LitByte {
++ repr: Box::new(LitRepr { token, suffix }),
++ });
+ }
+ _ => {}
+ },
+ b'\'' => {
+- return Lit::Char(LitChar { token });
++ let (_, suffix) = parse_lit_char(&repr);
++ return Lit::Char(LitChar {
++ repr: Box::new(LitRepr { token, suffix }),
++ });
+ }
+ b'0'..=b'9' | b'-' => {
+ if !(repr.ends_with("f32") || repr.ends_with("f64")) {
+@@ -905,6 +959,44 @@ mod value {
+
+ panic!("Unrecognized literal: `{}`", repr);
+ }
++
++ pub fn suffix(&self) -> &str {
++ match self {
++ Lit::Str(lit) => lit.suffix(),
++ Lit::ByteStr(lit) => lit.suffix(),
++ Lit::Byte(lit) => lit.suffix(),
++ Lit::Char(lit) => lit.suffix(),
++ Lit::Int(lit) => lit.suffix(),
++ Lit::Float(lit) => lit.suffix(),
++ Lit::Bool(_) | Lit::Verbatim(_) => "",
++ }
++ }
++
++ pub fn span(&self) -> Span {
++ match self {
++ Lit::Str(lit) => lit.span(),
++ Lit::ByteStr(lit) => lit.span(),
++ Lit::Byte(lit) => lit.span(),
++ Lit::Char(lit) => lit.span(),
++ Lit::Int(lit) => lit.span(),
++ Lit::Float(lit) => lit.span(),
++ Lit::Bool(lit) => lit.span,
++ Lit::Verbatim(lit) => lit.span(),
++ }
++ }
++
++ pub fn set_span(&mut self, span: Span) {
++ match self {
++ Lit::Str(lit) => lit.set_span(span),
++ Lit::ByteStr(lit) => lit.set_span(span),
++ Lit::Byte(lit) => lit.set_span(span),
++ Lit::Char(lit) => lit.set_span(span),
++ Lit::Int(lit) => lit.set_span(span),
++ Lit::Float(lit) => lit.set_span(span),
++ Lit::Bool(lit) => lit.span = span,
++ Lit::Verbatim(lit) => lit.set_span(span),
++ }
++ }
+ }
+
+ /// Get the byte at offset idx, or a default of `b'\0'` if we're looking
+@@ -1004,19 +1096,18 @@ mod value {
+ pounds += 1;
+ }
+ assert_eq!(byte(s, pounds), b'"');
+- assert_eq!(byte(s, s.len() - pounds - 1), b'"');
+- for end in s[s.len() - pounds..].bytes() {
++ let close = s.rfind('"').unwrap();
++ for end in s[close + 1..close + 1 + pounds].bytes() {
+ assert_eq!(end, b'#');
+ }
+
+- let content = s[pounds + 1..s.len() - pounds - 1]
+- .to_owned()
+- .into_boxed_str();
+- let suffix = Box::<str>::default(); // todo
++ let content = s[pounds + 1..close].to_owned().into_boxed_str();
++ let suffix = s[close + 1 + pounds..].to_owned().into_boxed_str();
+ (content, suffix)
+ }
+
+- pub fn parse_lit_byte_str(s: &str) -> Vec<u8> {
++ // Returns (content, suffix).
++ pub fn parse_lit_byte_str(s: &str) -> (Vec<u8>, Box<str>) {
+ assert_eq!(byte(s, 0), b'b');
+ match byte(s, 1) {
+ b'"' => parse_lit_byte_str_cooked(s),
+@@ -1028,25 +1119,25 @@ mod value {
+ // Clippy false positive
+ // https://github.com/rust-lang-nursery/rust-clippy/issues/2329
+ #[allow(clippy::needless_continue)]
+- fn parse_lit_byte_str_cooked(mut s: &str) -> Vec<u8> {
++ fn parse_lit_byte_str_cooked(mut s: &str) -> (Vec<u8>, Box<str>) {
+ assert_eq!(byte(s, 0), b'b');
+ assert_eq!(byte(s, 1), b'"');
+ s = &s[2..];
+
+ // We're going to want to have slices which don't respect codepoint boundaries.
+- let mut s = s.as_bytes();
++ let mut v = s.as_bytes();
+
+ let mut out = Vec::new();
+ 'outer: loop {
+- let byte = match byte(s, 0) {
++ let byte = match byte(v, 0) {
+ b'"' => break,
+ b'\\' => {
+- let b = byte(s, 1);
+- s = &s[2..];
++ let b = byte(v, 1);
++ v = &v[2..];
+ match b {
+ b'x' => {
+- let (b, rest) = backslash_x(s);
+- s = rest;
++ let (b, rest) = backslash_x(v);
++ v = rest;
+ b
+ }
+ b'n' => b'\n',
+@@ -1057,10 +1148,10 @@ mod value {
+ b'\'' => b'\'',
+ b'"' => b'"',
+ b'\r' | b'\n' => loop {
+- let byte = byte(s, 0);
++ let byte = byte(v, 0);
+ let ch = char::from_u32(u32::from(byte)).unwrap();
+ if ch.is_whitespace() {
+- s = &s[1..];
++ v = &v[1..];
+ } else {
+ continue 'outer;
+ }
+@@ -1069,42 +1160,45 @@ mod value {
+ }
+ }
+ b'\r' => {
+- assert_eq!(byte(s, 1), b'\n', "Bare CR not allowed in string");
+- s = &s[2..];
++ assert_eq!(byte(v, 1), b'\n', "Bare CR not allowed in string");
++ v = &v[2..];
+ b'\n'
+ }
+ b => {
+- s = &s[1..];
++ v = &v[1..];
+ b
+ }
+ };
+ out.push(byte);
+ }
+
+- assert_eq!(s, b"\"");
+- out
++ assert_eq!(byte(v, 0), b'"');
++ let suffix = s[s.len() - v.len() + 1..].to_owned().into_boxed_str();
++ (out, suffix)
+ }
+
+- fn parse_lit_byte_str_raw(s: &str) -> Vec<u8> {
++ fn parse_lit_byte_str_raw(s: &str) -> (Vec<u8>, Box<str>) {
+ assert_eq!(byte(s, 0), b'b');
+- String::from(parse_lit_str_raw(&s[1..]).0).into_bytes()
++ let (value, suffix) = parse_lit_str_raw(&s[1..]);
++ (String::from(value).into_bytes(), suffix)
+ }
+
+- pub fn parse_lit_byte(s: &str) -> u8 {
++ // Returns (value, suffix).
++ pub fn parse_lit_byte(s: &str) -> (u8, Box<str>) {
+ assert_eq!(byte(s, 0), b'b');
+ assert_eq!(byte(s, 1), b'\'');
+
+ // We're going to want to have slices which don't respect codepoint boundaries.
+- let mut s = s[2..].as_bytes();
++ let mut v = s[2..].as_bytes();
+
+- let b = match byte(s, 0) {
++ let b = match byte(v, 0) {
+ b'\\' => {
+- let b = byte(s, 1);
+- s = &s[2..];
++ let b = byte(v, 1);
++ v = &v[2..];
+ match b {
+ b'x' => {
+- let (b, rest) = backslash_x(s);
+- s = rest;
++ let (b, rest) = backslash_x(v);
++ v = rest;
+ b
+ }
+ b'n' => b'\n',
+@@ -1118,16 +1212,18 @@ mod value {
+ }
+ }
+ b => {
+- s = &s[1..];
++ v = &v[1..];
+ b
+ }
+ };
+
+- assert_eq!(byte(s, 0), b'\'');
+- b
++ assert_eq!(byte(v, 0), b'\'');
++ let suffix = s[s.len() - v.len() + 1..].to_owned().into_boxed_str();
++ (b, suffix)
+ }
+
+- pub fn parse_lit_char(mut s: &str) -> char {
++ // Returns (value, suffix).
++ pub fn parse_lit_char(mut s: &str) -> (char, Box<str>) {
+ assert_eq!(byte(s, 0), b'\'');
+ s = &s[1..];
+
+@@ -1163,8 +1259,9 @@ mod value {
+ ch
+ }
+ };
+- assert_eq!(s, "\'", "Expected end of char literal");
+- ch
++ assert_eq!(byte(s, 0), b'\'');
++ let suffix = s[1..].to_owned().into_boxed_str();
++ (ch, suffix)
+ }
+
+ fn backslash_x<S>(s: &S) -> (u8, &S)
+@@ -1334,7 +1431,11 @@ mod value {
+ }
+ b'e' | b'E' => {
+ if has_e {
+- return None;
++ if has_exponent {
++ break;
++ } else {
++ return None;
++ }
+ }
+ has_e = true;
+ bytes[write] = b'e';
+@@ -1372,11 +1473,33 @@ mod value {
+ }
+ }
+
+- pub fn to_literal(s: &str) -> Literal {
+- let stream = s.parse::<TokenStream>().unwrap();
+- match stream.into_iter().next().unwrap() {
+- TokenTree::Literal(l) => l,
+- _ => unreachable!(),
++ pub fn to_literal(repr: &str, digits: &str, suffix: &str) -> Option<Literal> {
++ if repr.starts_with('-') {
++ if suffix == "f64" {
++ digits.parse().ok().map(Literal::f64_suffixed)
++ } else if suffix == "f32" {
++ digits.parse().ok().map(Literal::f32_suffixed)
++ } else if suffix == "i64" {
++ digits.parse().ok().map(Literal::i64_suffixed)
++ } else if suffix == "i32" {
++ digits.parse().ok().map(Literal::i32_suffixed)
++ } else if suffix == "i16" {
++ digits.parse().ok().map(Literal::i16_suffixed)
++ } else if suffix == "i8" {
++ digits.parse().ok().map(Literal::i8_suffixed)
++ } else if !suffix.is_empty() {
++ None
++ } else if digits.contains('.') {
++ digits.parse().ok().map(Literal::f64_unsuffixed)
++ } else {
++ digits.parse().ok().map(Literal::i64_unsuffixed)
++ }
++ } else {
++ let stream = repr.parse::<TokenStream>().unwrap();
++ match stream.into_iter().next().unwrap() {
++ TokenTree::Literal(l) => Some(l),
++ _ => unreachable!(),
++ }
+ }
+ }
+ }
+diff --git a/third_party/rust/syn/src/mac.rs b/third_party/rust/syn/src/mac.rs
+index 6c3dcae92a..de288a34e1 100644
+--- mozilla-release/third_party/rust/syn/src/mac.rs
++++ mozilla-release/third_party/rust/syn/src/mac.rs
+@@ -2,21 +2,17 @@ use super::*;
+ use crate::token::{Brace, Bracket, Paren};
+ use proc_macro2::TokenStream;
+ #[cfg(feature = "parsing")]
+-use proc_macro2::{Delimiter, Span, TokenTree};
++use proc_macro2::{Delimiter, Group, Span, TokenTree};
+
+ #[cfg(feature = "parsing")]
+ use crate::parse::{Parse, ParseStream, Parser, Result};
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
+-#[cfg(feature = "extra-traits")]
+-use std::hash::{Hash, Hasher};
+
+ ast_struct! {
+ /// A macro invocation: `println!("{}", mac)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- pub struct Macro #manual_extra_traits {
++ pub struct Macro {
+ pub path: Path,
+ pub bang_token: Token![!],
+ pub delimiter: MacroDelimiter,
+@@ -27,7 +23,7 @@ ast_struct! {
+ ast_enum! {
+ /// A grouping token that surrounds a macro body: `m!(...)` or `m!{...}` or `m![...]`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum MacroDelimiter {
+ Paren(Paren),
+@@ -36,39 +32,20 @@ ast_enum! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Macro {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Macro {
+- fn eq(&self, other: &Self) -> bool {
+- self.path == other.path
+- && self.bang_token == other.bang_token
+- && self.delimiter == other.delimiter
+- && TokenStreamHelper(&self.tokens) == TokenStreamHelper(&other.tokens)
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Macro {
+- fn hash<H>(&self, state: &mut H)
+- where
+- H: Hasher,
+- {
+- self.path.hash(state);
+- self.bang_token.hash(state);
+- self.delimiter.hash(state);
+- TokenStreamHelper(&self.tokens).hash(state);
+- }
+-}
+-
+ #[cfg(feature = "parsing")]
+-fn delimiter_span(delimiter: &MacroDelimiter) -> Span {
+- match delimiter {
++fn delimiter_span_close(macro_delimiter: &MacroDelimiter) -> Span {
++ let delimiter = match macro_delimiter {
++ MacroDelimiter::Paren(_) => Delimiter::Parenthesis,
++ MacroDelimiter::Brace(_) => Delimiter::Brace,
++ MacroDelimiter::Bracket(_) => Delimiter::Bracket,
++ };
++ let mut group = Group::new(delimiter, TokenStream::new());
++ group.set_span(match macro_delimiter {
+ MacroDelimiter::Paren(token) => token.span,
+ MacroDelimiter::Brace(token) => token.span,
+ MacroDelimiter::Bracket(token) => token.span,
+- }
++ });
++ group.span_close()
+ }
+
+ impl Macro {
+@@ -163,9 +140,7 @@ impl Macro {
+ /// given parser.
+ #[cfg(feature = "parsing")]
+ pub fn parse_body_with<F: Parser>(&self, parser: F) -> Result<F::Output> {
+- // TODO: see if we can get a group.span_close() span in here as the
+- // scope, rather than the span of the whole group.
+- let scope = delimiter_span(&self.delimiter);
++ let scope = delimiter_span_close(&self.delimiter);
+ crate::parse::parse_scoped(parser, scope, self.tokens.clone())
+ }
+ }
+diff --git a/third_party/rust/syn/src/macros.rs b/third_party/rust/syn/src/macros.rs
+index 9cac5c15df..8060224381 100644
+--- mozilla-release/third_party/rust/syn/src/macros.rs
++++ mozilla-release/third_party/rust/syn/src/macros.rs
+@@ -4,15 +4,11 @@ macro_rules! ast_struct {
+ struct $name:ident #full $($rest:tt)*
+ ) => {
+ #[cfg(feature = "full")]
+- #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ $($attrs_pub)* struct $name $($rest)*
+
+ #[cfg(not(feature = "full"))]
+- #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ $($attrs_pub)* struct $name {
+- _noconstruct: (),
++ _noconstruct: ::std::marker::PhantomData<::proc_macro2::Span>,
+ }
+
+ #[cfg(all(not(feature = "full"), feature = "printing"))]
+@@ -23,29 +19,10 @@ macro_rules! ast_struct {
+ }
+ };
+
+- (
+- [$($attrs_pub:tt)*]
+- struct $name:ident #manual_extra_traits $($rest:tt)*
+- ) => {
+- #[cfg_attr(feature = "extra-traits", derive(Debug))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+- $($attrs_pub)* struct $name $($rest)*
+- };
+-
+- (
+- [$($attrs_pub:tt)*]
+- struct $name:ident #manual_extra_traits_debug $($rest:tt)*
+- ) => {
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+- $($attrs_pub)* struct $name $($rest)*
+- };
+-
+ (
+ [$($attrs_pub:tt)*]
+ struct $name:ident $($rest:tt)*
+ ) => {
+- #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ $($attrs_pub)* struct $name $($rest)*
+ };
+
+@@ -63,21 +40,10 @@ macro_rules! ast_enum {
+ ast_enum!([$($attrs_pub)*] enum $name $($rest)*);
+ );
+
+- (
+- [$($attrs_pub:tt)*]
+- enum $name:ident #manual_extra_traits $($rest:tt)*
+- ) => (
+- #[cfg_attr(feature = "extra-traits", derive(Debug))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+- $($attrs_pub)* enum $name $($rest)*
+- );
+-
+ (
+ [$($attrs_pub:tt)*]
+ enum $name:ident $($rest:tt)*
+ ) => (
+- #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+- #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ $($attrs_pub)* enum $name $($rest)*
+ );
+
+@@ -120,15 +86,9 @@ macro_rules! ast_enum_of_structs_impl {
+ check_keyword_matches!(pub $pub);
+ check_keyword_matches!(enum $enum);
+
+- $(
+- $(
+- impl From<$member> for $name {
+- fn from(e: $member) -> $name {
+- $name::$variant(e)
+- }
+- }
+- )*
+- )*
++ $($(
++ ast_enum_from_struct!($name::$variant, $member);
++ )*)*
+
+ #[cfg(feature = "printing")]
+ generate_to_tokens! {
+@@ -140,6 +100,19 @@ macro_rules! ast_enum_of_structs_impl {
+ };
+ }
+
++macro_rules! ast_enum_from_struct {
++ // No From<TokenStream> for verbatim variants.
++ ($name:ident::Verbatim, $member:ident) => {};
++
++ ($name:ident::$variant:ident, $member:ident) => {
++ impl From<$member> for $name {
++ fn from(e: $member) -> $name {
++ $name::$variant(e)
++ }
++ }
++ };
++}
++
+ #[cfg(feature = "printing")]
+ macro_rules! generate_to_tokens {
+ (do_not_generate_to_tokens $($foo:tt)*) => ();
+diff --git a/third_party/rust/syn/src/op.rs b/third_party/rust/syn/src/op.rs
+index 49fb853c79..d254673b40 100644
+--- mozilla-release/third_party/rust/syn/src/op.rs
++++ mozilla-release/third_party/rust/syn/src/op.rs
+@@ -1,9 +1,8 @@
+ ast_enum! {
+ /// A binary operator: `+`, `+=`, `&`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- #[cfg_attr(feature = "clone-impls", derive(Copy))]
+ pub enum BinOp {
+ /// The `+` operator (addition)
+ Add(Token![+]),
+@@ -67,9 +66,8 @@ ast_enum! {
+ ast_enum! {
+ /// A unary operator: `*`, `!`, `-`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+- #[cfg_attr(feature = "clone-impls", derive(Copy))]
+ pub enum UnOp {
+ /// The `*` operator for dereferencing
+ Deref(Token![*]),
+diff --git a/third_party/rust/syn/src/parse.rs b/third_party/rust/syn/src/parse.rs
+index 7c7b194308..abb4c4c14f 100644
+--- mozilla-release/third_party/rust/syn/src/parse.rs
++++ mozilla-release/third_party/rust/syn/src/parse.rs
+@@ -26,8 +26,8 @@
+ //! [`parse_macro_input!`]: ../macro.parse_macro_input.html
+ //!
+ //! ```
+-//! extern crate proc_macro;
+-//!
++//! # extern crate proc_macro;
++//! #
+ //! use proc_macro::TokenStream;
+ //! use syn::{braced, parse_macro_input, token, Field, Ident, Result, Token};
+ //! use syn::parse::{Parse, ParseStream};
+@@ -109,9 +109,7 @@
+ //! # Ok(())
+ //! # }
+ //! #
+-//! # fn main() {
+-//! # run_parser().unwrap();
+-//! # }
++//! # run_parser().unwrap();
+ //! ```
+ //!
+ //! The [`parse_quote!`] macro also uses this approach.
+@@ -155,8 +153,8 @@
+ //! [`Parser`]: trait.Parser.html
+ //!
+ //! ```
+-//! extern crate proc_macro;
+-//!
++//! # extern crate proc_macro;
++//! #
+ //! use proc_macro::TokenStream;
+ //! use syn::parse::Parser;
+ //! use syn::punctuated::Punctuated;
+@@ -186,7 +184,7 @@
+ //!
+ //! ---
+ //!
+-//! *This module is available if Syn is built with the `"parsing"` feature.*
++//! *This module is available only if Syn is built with the `"parsing"` feature.*
+
+ #[path = "discouraged.rs"]
+ pub mod discouraged;
+@@ -217,6 +215,11 @@ pub use crate::lookahead::{Lookahead1, Peek};
+
+ /// Parsing interface implemented by all types that can be parsed in a default
+ /// way from a token stream.
++///
++/// Refer to the [module documentation] for details about implementing and using
++/// the `Parse` trait.
++///
++/// [module documentation]: self
+ pub trait Parse: Sized {
+ fn parse(input: ParseStream) -> Result<Self>;
+ }
+@@ -263,13 +266,16 @@ pub struct ParseBuffer<'a> {
+ // the cell.
+ cell: Cell<Cursor<'static>>,
+ marker: PhantomData<Cursor<'a>>,
+- unexpected: Rc<Cell<Option<Span>>>,
++ unexpected: Cell<Option<Rc<Cell<Unexpected>>>>,
+ }
+
+ impl<'a> Drop for ParseBuffer<'a> {
+ fn drop(&mut self) {
+- if !self.is_empty() && self.unexpected.get().is_none() {
+- self.unexpected.set(Some(self.cursor().span()));
++ if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(self.cursor()) {
++ let (inner, old_span) = inner_unexpected(self);
++ if old_span.is_none() {
++ inner.set(Unexpected::Some(unexpected_span));
++ }
+ }
+ }
+ }
+@@ -324,15 +330,12 @@ impl<'a> Debug for ParseBuffer<'a> {
+ /// # input.parse()
+ /// # }
+ /// #
+-/// # fn main() {
+-/// # use syn::parse::Parser;
+-/// # let remainder = remainder_after_skipping_past_next_at
+-/// # .parse_str("a @ b c")
+-/// # .unwrap();
+-/// # assert_eq!(remainder.to_string(), "b c");
+-/// # }
++/// # use syn::parse::Parser;
++/// # let remainder = remainder_after_skipping_past_next_at
++/// # .parse_str("a @ b c")
++/// # .unwrap();
++/// # assert_eq!(remainder.to_string(), "b c");
+ /// ```
+-#[derive(Copy, Clone)]
+ pub struct StepCursor<'c, 'a> {
+ scope: Span,
+ // This field is covariant in 'c.
+@@ -356,6 +359,14 @@ impl<'c, 'a> Deref for StepCursor<'c, 'a> {
+ }
+ }
+
++impl<'c, 'a> Copy for StepCursor<'c, 'a> {}
++
++impl<'c, 'a> Clone for StepCursor<'c, 'a> {
++ fn clone(&self) -> Self {
++ *self
++ }
++}
++
+ impl<'c, 'a> StepCursor<'c, 'a> {
+ /// Triggers an error at the current position of the parse stream.
+ ///
+@@ -375,36 +386,81 @@ pub(crate) fn advance_step_cursor<'c, 'a>(proof: StepCursor<'c, 'a>, to: Cursor<
+ unsafe { mem::transmute::<Cursor<'c>, Cursor<'a>>(to) }
+ }
+
+-fn skip(input: ParseStream) -> bool {
+- input
+- .step(|cursor| {
+- if let Some((_lifetime, rest)) = cursor.lifetime() {
+- Ok((true, rest))
+- } else if let Some((_token, rest)) = cursor.token_tree() {
+- Ok((true, rest))
+- } else {
+- Ok((false, *cursor))
+- }
+- })
+- .unwrap()
+-}
+-
+ pub(crate) fn new_parse_buffer(
+ scope: Span,
+ cursor: Cursor,
+- unexpected: Rc<Cell<Option<Span>>>,
++ unexpected: Rc<Cell<Unexpected>>,
+ ) -> ParseBuffer {
+ ParseBuffer {
+ scope,
+ // See comment on `cell` in the struct definition.
+ cell: Cell::new(unsafe { mem::transmute::<Cursor, Cursor<'static>>(cursor) }),
+ marker: PhantomData,
+- unexpected,
++ unexpected: Cell::new(Some(unexpected)),
++ }
++}
++
++pub(crate) enum Unexpected {
++ None,
++ Some(Span),
++ Chain(Rc<Cell<Unexpected>>),
++}
++
++impl Default for Unexpected {
++ fn default() -> Self {
++ Unexpected::None
+ }
+ }
+
+-pub(crate) fn get_unexpected(buffer: &ParseBuffer) -> Rc<Cell<Option<Span>>> {
+- buffer.unexpected.clone()
++impl Clone for Unexpected {
++ fn clone(&self) -> Self {
++ match self {
++ Unexpected::None => Unexpected::None,
++ Unexpected::Some(span) => Unexpected::Some(*span),
++ Unexpected::Chain(next) => Unexpected::Chain(next.clone()),
++ }
++ }
++}
++
++// We call this on Cell<Unexpected> and Cell<Option<T>> where temporarily
++// swapping in a None is cheap.
++fn cell_clone<T: Default + Clone>(cell: &Cell<T>) -> T {
++ let prev = cell.take();
++ let ret = prev.clone();
++ cell.set(prev);
++ ret
++}
++
++fn inner_unexpected(buffer: &ParseBuffer) -> (Rc<Cell<Unexpected>>, Option<Span>) {
++ let mut unexpected = get_unexpected(buffer);
++ loop {
++ match cell_clone(&unexpected) {
++ Unexpected::None => return (unexpected, None),
++ Unexpected::Some(span) => return (unexpected, Some(span)),
++ Unexpected::Chain(next) => unexpected = next,
++ }
++ }
++}
++
++pub(crate) fn get_unexpected(buffer: &ParseBuffer) -> Rc<Cell<Unexpected>> {
++ cell_clone(&buffer.unexpected).unwrap()
++}
++
++fn span_of_unexpected_ignoring_nones(mut cursor: Cursor) -> Option<Span> {
++ if cursor.eof() {
++ return None;
++ }
++ while let Some((inner, _span, rest)) = cursor.group(Delimiter::None) {
++ if let Some(unexpected) = span_of_unexpected_ignoring_nones(inner) {
++ return Some(unexpected);
++ }
++ cursor = rest;
++ }
++ if cursor.eof() {
++ None
++ } else {
++ Some(cursor.span())
++ }
+ }
+
+ impl<'a> ParseBuffer<'a> {
+@@ -566,14 +622,17 @@ impl<'a> ParseBuffer<'a> {
+ /// }
+ /// ```
+ pub fn peek2<T: Peek>(&self, token: T) -> bool {
+- let ahead = self.fork();
+- skip(&ahead) && ahead.peek(token)
++ let _ = token;
++ self.cursor().skip().map_or(false, T::Token::peek)
+ }
+
+ /// Looks at the third-next token in the parse stream.
+ pub fn peek3<T: Peek>(&self, token: T) -> bool {
+- let ahead = self.fork();
+- skip(&ahead) && skip(&ahead) && ahead.peek(token)
++ let _ = token;
++ self.cursor()
++ .skip()
++ .and_then(Cursor::skip)
++ .map_or(false, T::Token::peek)
+ }
+
+ /// Parses zero or more occurrences of `T` separated by punctuation of type
+@@ -615,12 +674,10 @@ impl<'a> ParseBuffer<'a> {
+ /// }
+ /// }
+ /// #
+- /// # fn main() {
+- /// # let input = quote! {
+- /// # struct S(A, B);
+- /// # };
+- /// # syn::parse2::<TupleStruct>(input).unwrap();
+- /// # }
++ /// # let input = quote! {
++ /// # struct S(A, B);
++ /// # };
++ /// # syn::parse2::<TupleStruct>(input).unwrap();
+ /// ```
+ pub fn parse_terminated<T, P: Parse>(
+ &self,
+@@ -847,8 +904,8 @@ impl<'a> ParseBuffer<'a> {
+ cell: self.cell.clone(),
+ marker: PhantomData,
+ // Not the parent's unexpected. Nothing cares whether the clone
+- // parses all the way.
+- unexpected: Rc::new(Cell::new(None)),
++ // parses all the way unless we `advance_to`.
++ unexpected: Cell::new(Some(Rc::new(Cell::new(Unexpected::None)))),
+ }
+ }
+
+@@ -923,13 +980,11 @@ impl<'a> ParseBuffer<'a> {
+ /// # input.parse()
+ /// # }
+ /// #
+- /// # fn main() {
+- /// # use syn::parse::Parser;
+- /// # let remainder = remainder_after_skipping_past_next_at
+- /// # .parse_str("a @ b c")
+- /// # .unwrap();
+- /// # assert_eq!(remainder.to_string(), "b c");
+- /// # }
++ /// # use syn::parse::Parser;
++ /// # let remainder = remainder_after_skipping_past_next_at
++ /// # .parse_str("a @ b c")
++ /// # .unwrap();
++ /// # assert_eq!(remainder.to_string(), "b c");
+ /// ```
+ pub fn step<F, R>(&self, function: F) -> Result<R>
+ where
+@@ -961,6 +1016,18 @@ impl<'a> ParseBuffer<'a> {
+ Ok(node)
+ }
+
++ /// Returns the `Span` of the next token in the parse stream, or
++ /// `Span::call_site()` if this parse stream has completely exhausted its
++ /// input `TokenStream`.
++ pub fn span(&self) -> Span {
++ let cursor = self.cursor();
++ if cursor.eof() {
++ self.scope
++ } else {
++ crate::buffer::open_span_of_group(cursor)
++ }
++ }
++
+ /// Provides low-level access to the token representation underlying this
+ /// parse stream.
+ ///
+@@ -971,7 +1038,7 @@ impl<'a> ParseBuffer<'a> {
+ }
+
+ fn check_unexpected(&self) -> Result<()> {
+- match self.unexpected.get() {
++ match inner_unexpected(self).1 {
+ Some(span) => Err(Error::new(span, "unexpected token")),
+ None => Ok(()),
+ }
+@@ -1048,7 +1115,7 @@ impl Parse for Literal {
+ ///
+ /// [module documentation]: self
+ ///
+-/// *This trait is available if Syn is built with the `"parsing"` feature.*
++/// *This trait is available only if Syn is built with the `"parsing"` feature.*
+ pub trait Parser: Sized {
+ type Output;
+
+@@ -1063,7 +1130,7 @@ pub trait Parser: Sized {
+ /// This function will check that the input is fully parsed. If there are
+ /// any unparsed tokens at the end of the stream, an error is returned.
+ ///
+- /// *This method is available if Syn is built with both the `"parsing"` and
++ /// *This method is available only if Syn is built with both the `"parsing"` and
+ /// `"proc-macro"` features.*
+ #[cfg(all(
+ not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "wasi"))),
+@@ -1088,6 +1155,7 @@ pub trait Parser: Sized {
+
+ // Not public API.
+ #[doc(hidden)]
++ #[cfg(any(feature = "full", feature = "derive"))]
+ fn __parse_scoped(self, scope: Span, tokens: TokenStream) -> Result<Self::Output> {
+ let _ = scope;
+ self.parse2(tokens)
+@@ -1095,6 +1163,7 @@ pub trait Parser: Sized {
+
+ // Not public API.
+ #[doc(hidden)]
++ #[cfg(any(feature = "full", feature = "derive"))]
+ fn __parse_stream(self, input: ParseStream) -> Result<Self::Output> {
+ input.parse().and_then(|tokens| self.parse2(tokens))
+ }
+@@ -1103,7 +1172,7 @@ pub trait Parser: Sized {
+ fn tokens_to_parse_buffer(tokens: &TokenBuffer) -> ParseBuffer {
+ let scope = Span::call_site();
+ let cursor = tokens.begin();
+- let unexpected = Rc::new(Cell::new(None));
++ let unexpected = Rc::new(Cell::new(Unexpected::None));
+ new_parse_buffer(scope, cursor, unexpected)
+ }
+
+@@ -1118,38 +1187,42 @@ where
+ let state = tokens_to_parse_buffer(&buf);
+ let node = self(&state)?;
+ state.check_unexpected()?;
+- if state.is_empty() {
+- Ok(node)
++ if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(state.cursor()) {
++ Err(Error::new(unexpected_span, "unexpected token"))
+ } else {
+- Err(state.error("unexpected token"))
++ Ok(node)
+ }
+ }
+
+ #[doc(hidden)]
++ #[cfg(any(feature = "full", feature = "derive"))]
+ fn __parse_scoped(self, scope: Span, tokens: TokenStream) -> Result<Self::Output> {
+ let buf = TokenBuffer::new2(tokens);
+ let cursor = buf.begin();
+- let unexpected = Rc::new(Cell::new(None));
++ let unexpected = Rc::new(Cell::new(Unexpected::None));
+ let state = new_parse_buffer(scope, cursor, unexpected);
+ let node = self(&state)?;
+ state.check_unexpected()?;
+- if state.is_empty() {
+- Ok(node)
++ if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(state.cursor()) {
++ Err(Error::new(unexpected_span, "unexpected token"))
+ } else {
+- Err(state.error("unexpected token"))
++ Ok(node)
+ }
+ }
+
+ #[doc(hidden)]
++ #[cfg(any(feature = "full", feature = "derive"))]
+ fn __parse_stream(self, input: ParseStream) -> Result<Self::Output> {
+ self(input)
+ }
+ }
+
++#[cfg(any(feature = "full", feature = "derive"))]
+ pub(crate) fn parse_scoped<F: Parser>(f: F, scope: Span, tokens: TokenStream) -> Result<F::Output> {
+ f.__parse_scoped(scope, tokens)
+ }
+
++#[cfg(any(feature = "full", feature = "derive"))]
+ pub(crate) fn parse_stream<F: Parser>(f: F, input: ParseStream) -> Result<F::Output> {
+ f.__parse_stream(input)
+ }
+@@ -1160,8 +1233,8 @@ pub(crate) fn parse_stream<F: Parser>(f: F, input: ParseStream) -> Result<F::Out
+ /// provided any attribute args.
+ ///
+ /// ```
+-/// extern crate proc_macro;
+-///
++/// # extern crate proc_macro;
++/// #
+ /// use proc_macro::TokenStream;
+ /// use syn::parse_macro_input;
+ /// use syn::parse::Nothing;
+diff --git a/third_party/rust/syn/src/parse_macro_input.rs b/third_party/rust/syn/src/parse_macro_input.rs
+index d6e0725c17..c8fc1cea37 100644
+--- mozilla-release/third_party/rust/syn/src/parse_macro_input.rs
++++ mozilla-release/third_party/rust/syn/src/parse_macro_input.rs
+@@ -16,8 +16,8 @@
+ /// #\[proc_macro_attribute\] attribute.
+ ///
+ /// ```
+-/// extern crate proc_macro;
+-///
++/// # extern crate proc_macro;
++/// #
+ /// use proc_macro::TokenStream;
+ /// use syn::{parse_macro_input, Result};
+ /// use syn::parse::{Parse, ParseStream};
+@@ -43,7 +43,31 @@
+ /// # "".parse().unwrap()
+ /// }
+ /// ```
+-#[macro_export(local_inner_macros)]
++///
++/// <br>
++///
++/// # Expansion
++///
++/// `parse_macro_input!($variable as $Type)` expands to something like:
++///
++/// ```no_run
++/// # extern crate proc_macro;
++/// #
++/// # macro_rules! doc_test {
++/// # ($variable:ident as $Type:ty) => {
++/// match syn::parse::<$Type>($variable) {
++/// Ok(syntax_tree) => syntax_tree,
++/// Err(err) => return proc_macro::TokenStream::from(err.to_compile_error()),
++/// }
++/// # };
++/// # }
++/// #
++/// # fn test(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
++/// # let _ = doc_test!(input as syn::Ident);
++/// # proc_macro::TokenStream::new()
++/// # }
++/// ```
++#[macro_export]
+ macro_rules! parse_macro_input {
+ ($tokenstream:ident as $ty:ty) => {
+ match $crate::parse_macro_input::parse::<$ty>($tokenstream) {
+@@ -54,7 +78,7 @@ macro_rules! parse_macro_input {
+ }
+ };
+ ($tokenstream:ident) => {
+- parse_macro_input!($tokenstream as _)
++ $crate::parse_macro_input!($tokenstream as _)
+ };
+ }
+
+diff --git a/third_party/rust/syn/src/parse_quote.rs b/third_party/rust/syn/src/parse_quote.rs
+index 18a47b95c7..66aa818cd0 100644
+--- mozilla-release/third_party/rust/syn/src/parse_quote.rs
++++ mozilla-release/third_party/rust/syn/src/parse_quote.rs
+@@ -24,7 +24,7 @@
+ /// }
+ /// ```
+ ///
+-/// *This macro is available if Syn is built with the `"parsing"` feature,
++/// *This macro is available only if Syn is built with the `"parsing"` feature,
+ /// although interpolation of syntax tree nodes into the quoted tokens is only
+ /// supported if Syn is built with the `"printing"` feature as well.*
+ ///
+@@ -56,8 +56,10 @@
+ /// or inner like `#![...]`
+ /// - [`Punctuated<T, P>`] — parses zero or more `T` separated by punctuation
+ /// `P` with optional trailing punctuation
++/// - [`Vec<Stmt>`] — parses the same as `Block::parse_within`
+ ///
+ /// [`Punctuated<T, P>`]: punctuated::Punctuated
++/// [`Vec<Stmt>`]: Block::parse_within
+ ///
+ /// # Panics
+ ///
+@@ -67,7 +69,7 @@
+ //
+ // TODO: allow Punctuated to be inferred as intra doc link, currently blocked on
+ // https://github.com/rust-lang/rust/issues/62834
+-#[macro_export(local_inner_macros)]
++#[macro_export]
+ macro_rules! parse_quote {
+ ($($tt:tt)*) => {
+ $crate::parse_quote::parse(
+@@ -112,6 +114,8 @@ impl<T: Parse> ParseQuote for T {
+ use crate::punctuated::Punctuated;
+ #[cfg(any(feature = "full", feature = "derive"))]
+ use crate::{attr, Attribute};
++#[cfg(feature = "full")]
++use crate::{Block, Stmt};
+
+ #[cfg(any(feature = "full", feature = "derive"))]
+ impl ParseQuote for Attribute {
+@@ -129,3 +133,10 @@ impl<T: Parse, P: Parse> ParseQuote for Punctuated<T, P> {
+ Self::parse_terminated(input)
+ }
+ }
++
++#[cfg(feature = "full")]
++impl ParseQuote for Vec<Stmt> {
++ fn parse(input: ParseStream) -> Result<Self> {
++ Block::parse_within(input)
++ }
++}
+diff --git a/third_party/rust/syn/src/pat.rs b/third_party/rust/syn/src/pat.rs
+index 9371e05493..e9576a2361 100644
+--- mozilla-release/third_party/rust/syn/src/pat.rs
++++ mozilla-release/third_party/rust/syn/src/pat.rs
+@@ -1,16 +1,12 @@
+ use super::*;
+ use crate::punctuated::Punctuated;
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
+ use proc_macro2::TokenStream;
+-#[cfg(feature = "extra-traits")]
+-use std::hash::{Hash, Hasher};
+
+ ast_enum_of_structs! {
+ /// A pattern in a local binding, function signature, match expression, or
+ /// various other places.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ ///
+ /// # Syntax tree enum
+ ///
+@@ -20,7 +16,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum Pat #manual_extra_traits {
++ pub enum Pat {
+ /// A box pattern: `box v`.
+ Box(PatBox),
+
+@@ -86,7 +82,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A box pattern: `box v`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatBox {
+ pub attrs: Vec<Attribute>,
+ pub box_token: Token![box],
+@@ -97,7 +93,10 @@ ast_struct! {
+ ast_struct! {
+ /// A pattern that binds a new variable: `ref mut binding @ SUBPATTERN`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// It may also be a unit struct or struct variant (e.g. `None`), or a
++ /// constant; these cannot be distinguished syntactically.
++ ///
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatIdent {
+ pub attrs: Vec<Attribute>,
+ pub by_ref: Option<Token![ref]>,
+@@ -113,7 +112,7 @@ ast_struct! {
+ /// This holds an `Expr` rather than a `Lit` because negative numbers
+ /// are represented as an `Expr::Unary`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatLit {
+ pub attrs: Vec<Attribute>,
+ pub expr: Box<Expr>,
+@@ -123,7 +122,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro in pattern position.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatMacro {
+ pub attrs: Vec<Attribute>,
+ pub mac: Macro,
+@@ -133,7 +132,7 @@ ast_struct! {
+ ast_struct! {
+ /// A pattern that matches any one of a set of cases.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatOr {
+ pub attrs: Vec<Attribute>,
+ pub leading_vert: Option<Token![|]>,
+@@ -150,7 +149,7 @@ ast_struct! {
+ /// `<A>::B::C` and `<A as Trait>::B::C` can only legally refer to
+ /// associated constants.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatPath {
+ pub attrs: Vec<Attribute>,
+ pub qself: Option<QSelf>,
+@@ -161,7 +160,7 @@ ast_struct! {
+ ast_struct! {
+ /// A range pattern: `1..=2`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatRange {
+ pub attrs: Vec<Attribute>,
+ pub lo: Box<Expr>,
+@@ -173,7 +172,7 @@ ast_struct! {
+ ast_struct! {
+ /// A reference pattern: `&mut var`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatReference {
+ pub attrs: Vec<Attribute>,
+ pub and_token: Token![&],
+@@ -185,7 +184,7 @@ ast_struct! {
+ ast_struct! {
+ /// The dots in a tuple or slice pattern: `[0, 1, ..]`
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatRest {
+ pub attrs: Vec<Attribute>,
+ pub dot2_token: Token![..],
+@@ -195,7 +194,7 @@ ast_struct! {
+ ast_struct! {
+ /// A dynamically sized slice pattern: `[a, b, ref i @ .., y, z]`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatSlice {
+ pub attrs: Vec<Attribute>,
+ pub bracket_token: token::Bracket,
+@@ -206,7 +205,7 @@ ast_struct! {
+ ast_struct! {
+ /// A struct or struct variant pattern: `Variant { x, y, .. }`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatStruct {
+ pub attrs: Vec<Attribute>,
+ pub path: Path,
+@@ -219,7 +218,7 @@ ast_struct! {
+ ast_struct! {
+ /// A tuple pattern: `(a, b)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatTuple {
+ pub attrs: Vec<Attribute>,
+ pub paren_token: token::Paren,
+@@ -230,7 +229,7 @@ ast_struct! {
+ ast_struct! {
+ /// A tuple struct or tuple variant pattern: `Variant(x, y, .., z)`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatTupleStruct {
+ pub attrs: Vec<Attribute>,
+ pub path: Path,
+@@ -241,7 +240,7 @@ ast_struct! {
+ ast_struct! {
+ /// A type ascription pattern: `foo: f64`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatType {
+ pub attrs: Vec<Attribute>,
+ pub pat: Box<Pat>,
+@@ -253,7 +252,7 @@ ast_struct! {
+ ast_struct! {
+ /// A pattern that matches any value: `_`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct PatWild {
+ pub attrs: Vec<Attribute>,
+ pub underscore_token: Token![_],
+@@ -266,7 +265,7 @@ ast_struct! {
+ /// Patterns like the fields of Foo `{ x, ref y, ref mut z }` are treated
+ /// the same as `x: x, y: ref y, z: ref mut z` but there is no colon token.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct FieldPat {
+ pub attrs: Vec<Attribute>,
+ pub member: Member,
+@@ -275,122 +274,17 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Pat {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Pat {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (Pat::Box(this), Pat::Box(other)) => this == other,
+- (Pat::Ident(this), Pat::Ident(other)) => this == other,
+- (Pat::Lit(this), Pat::Lit(other)) => this == other,
+- (Pat::Macro(this), Pat::Macro(other)) => this == other,
+- (Pat::Or(this), Pat::Or(other)) => this == other,
+- (Pat::Path(this), Pat::Path(other)) => this == other,
+- (Pat::Range(this), Pat::Range(other)) => this == other,
+- (Pat::Reference(this), Pat::Reference(other)) => this == other,
+- (Pat::Rest(this), Pat::Rest(other)) => this == other,
+- (Pat::Slice(this), Pat::Slice(other)) => this == other,
+- (Pat::Struct(this), Pat::Struct(other)) => this == other,
+- (Pat::Tuple(this), Pat::Tuple(other)) => this == other,
+- (Pat::TupleStruct(this), Pat::TupleStruct(other)) => this == other,
+- (Pat::Type(this), Pat::Type(other)) => this == other,
+- (Pat::Verbatim(this), Pat::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- (Pat::Wild(this), Pat::Wild(other)) => this == other,
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Pat {
+- fn hash<H>(&self, hash: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- Pat::Box(pat) => {
+- hash.write_u8(0);
+- pat.hash(hash);
+- }
+- Pat::Ident(pat) => {
+- hash.write_u8(1);
+- pat.hash(hash);
+- }
+- Pat::Lit(pat) => {
+- hash.write_u8(2);
+- pat.hash(hash);
+- }
+- Pat::Macro(pat) => {
+- hash.write_u8(3);
+- pat.hash(hash);
+- }
+- Pat::Or(pat) => {
+- hash.write_u8(4);
+- pat.hash(hash);
+- }
+- Pat::Path(pat) => {
+- hash.write_u8(5);
+- pat.hash(hash);
+- }
+- Pat::Range(pat) => {
+- hash.write_u8(6);
+- pat.hash(hash);
+- }
+- Pat::Reference(pat) => {
+- hash.write_u8(7);
+- pat.hash(hash);
+- }
+- Pat::Rest(pat) => {
+- hash.write_u8(8);
+- pat.hash(hash);
+- }
+- Pat::Slice(pat) => {
+- hash.write_u8(9);
+- pat.hash(hash);
+- }
+- Pat::Struct(pat) => {
+- hash.write_u8(10);
+- pat.hash(hash);
+- }
+- Pat::Tuple(pat) => {
+- hash.write_u8(11);
+- pat.hash(hash);
+- }
+- Pat::TupleStruct(pat) => {
+- hash.write_u8(12);
+- pat.hash(hash);
+- }
+- Pat::Type(pat) => {
+- hash.write_u8(13);
+- pat.hash(hash);
+- }
+- Pat::Verbatim(pat) => {
+- hash.write_u8(14);
+- TokenStreamHelper(pat).hash(hash);
+- }
+- Pat::Wild(pat) => {
+- hash.write_u8(15);
+- pat.hash(hash);
+- }
+- Pat::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ #[cfg(feature = "parsing")]
+-mod parsing {
++pub mod parsing {
+ use super::*;
+
+ use crate::ext::IdentExt;
+- use crate::parse::{Parse, ParseStream, Result};
++ use crate::parse::{Parse, ParseBuffer, ParseStream, Result};
+ use crate::path;
+
+ impl Parse for Pat {
+ fn parse(input: ParseStream) -> Result<Self> {
++ let begin = input.fork();
+ let lookahead = input.lookahead1();
+ if lookahead.peek(Ident)
+ && ({
+@@ -411,7 +305,6 @@ mod parsing {
+ || lookahead.peek(Token![<])
+ || input.peek(Token![Self])
+ || input.peek(Token![super])
+- || input.peek(Token![extern])
+ || input.peek(Token![crate])
+ {
+ pat_path_or_macro_or_struct_or_range(input)
+@@ -434,7 +327,7 @@ mod parsing {
+ } else if lookahead.peek(token::Bracket) {
+ input.call(pat_slice).map(Pat::Slice)
+ } else if lookahead.peek(Token![..]) && !input.peek(Token![...]) {
+- input.call(pat_rest).map(Pat::Rest)
++ pat_range_half_open(input, begin)
+ } else {
+ Err(lookahead.error())
+ }
+@@ -442,10 +335,11 @@ mod parsing {
+ }
+
+ fn pat_path_or_macro_or_struct_or_range(input: ParseStream) -> Result<Pat> {
++ let begin = input.fork();
+ let (qself, path) = path::parsing::qpath(input, true)?;
+
+ if input.peek(Token![..]) {
+- return pat_range(input, qself, path).map(Pat::Range);
++ return pat_range(input, begin, qself, path);
+ }
+
+ if qself.is_some() {
+@@ -487,7 +381,7 @@ mod parsing {
+ } else if input.peek(token::Paren) {
+ pat_tuple_struct(input, path).map(Pat::TupleStruct)
+ } else if input.peek(Token![..]) {
+- pat_range(input, qself, path).map(Pat::Range)
++ pat_range(input, begin, qself, path)
+ } else {
+ Ok(Pat::Path(PatPath {
+ attrs: Vec::new(),
+@@ -546,7 +440,7 @@ mod parsing {
+ while !content.is_empty() && !content.peek(Token![..]) {
+ let value = content.call(field_pat)?;
+ fields.push_value(value);
+- if !content.peek(Token![,]) {
++ if content.is_empty() {
+ break;
+ }
+ let punct: Token![,] = content.parse()?;
+@@ -578,6 +472,7 @@ mod parsing {
+ }
+
+ fn field_pat(input: ParseStream) -> Result<FieldPat> {
++ let attrs = input.call(Attribute::parse_outer)?;
+ let boxed: Option<Token![box]> = input.parse()?;
+ let by_ref: Option<Token![ref]> = input.parse()?;
+ let mutability: Option<Token![mut]> = input.parse()?;
+@@ -587,10 +482,10 @@ mod parsing {
+ || member.is_unnamed()
+ {
+ return Ok(FieldPat {
+- attrs: Vec::new(),
++ attrs,
+ member,
+ colon_token: input.parse()?,
+- pat: input.parse()?,
++ pat: Box::new(multi_pat(input)?),
+ });
+ }
+
+@@ -610,30 +505,57 @@ mod parsing {
+ if let Some(boxed) = boxed {
+ pat = Pat::Box(PatBox {
+ attrs: Vec::new(),
+- pat: Box::new(pat),
+ box_token: boxed,
++ pat: Box::new(pat),
+ });
+ }
+
+ Ok(FieldPat {
++ attrs,
+ member: Member::Named(ident),
+- pat: Box::new(pat),
+- attrs: Vec::new(),
+ colon_token: None,
++ pat: Box::new(pat),
+ })
+ }
+
+- fn pat_range(input: ParseStream, qself: Option<QSelf>, path: Path) -> Result<PatRange> {
+- Ok(PatRange {
+- attrs: Vec::new(),
+- lo: Box::new(Expr::Path(ExprPath {
++ fn pat_range(
++ input: ParseStream,
++ begin: ParseBuffer,
++ qself: Option<QSelf>,
++ path: Path,
++ ) -> Result<Pat> {
++ let limits: RangeLimits = input.parse()?;
++ let hi = input.call(pat_lit_expr)?;
++ if let Some(hi) = hi {
++ Ok(Pat::Range(PatRange {
+ attrs: Vec::new(),
+- qself,
+- path,
+- })),
+- limits: input.parse()?,
+- hi: input.call(pat_lit_expr)?,
+- })
++ lo: Box::new(Expr::Path(ExprPath {
++ attrs: Vec::new(),
++ qself,
++ path,
++ })),
++ limits,
++ hi,
++ }))
++ } else {
++ Ok(Pat::Verbatim(verbatim::between(begin, input)))
++ }
++ }
++
++ fn pat_range_half_open(input: ParseStream, begin: ParseBuffer) -> Result<Pat> {
++ let limits: RangeLimits = input.parse()?;
++ let hi = input.call(pat_lit_expr)?;
++ if hi.is_some() {
++ Ok(Pat::Verbatim(verbatim::between(begin, input)))
++ } else {
++ match limits {
++ RangeLimits::HalfOpen(dot2_token) => Ok(Pat::Rest(PatRest {
++ attrs: Vec::new(),
++ dot2_token,
++ })),
++ RangeLimits::Closed(_) => Err(input.error("expected range upper bound")),
++ }
++ }
+ }
+
+ fn pat_tuple(input: ParseStream) -> Result<PatTuple> {
+@@ -642,7 +564,7 @@ mod parsing {
+
+ let mut elems = Punctuated::new();
+ while !content.is_empty() {
+- let value: Pat = content.parse()?;
++ let value = multi_pat(&content)?;
+ elems.push_value(value);
+ if content.is_empty() {
+ break;
+@@ -668,14 +590,21 @@ mod parsing {
+ }
+
+ fn pat_lit_or_range(input: ParseStream) -> Result<Pat> {
+- let lo = input.call(pat_lit_expr)?;
++ let begin = input.fork();
++ let lo = input.call(pat_lit_expr)?.unwrap();
+ if input.peek(Token![..]) {
+- Ok(Pat::Range(PatRange {
+- attrs: Vec::new(),
+- lo,
+- limits: input.parse()?,
+- hi: input.call(pat_lit_expr)?,
+- }))
++ let limits: RangeLimits = input.parse()?;
++ let hi = input.call(pat_lit_expr)?;
++ if let Some(hi) = hi {
++ Ok(Pat::Range(PatRange {
++ attrs: Vec::new(),
++ lo,
++ limits,
++ hi,
++ }))
++ } else {
++ Ok(Pat::Verbatim(verbatim::between(begin, input)))
++ }
+ } else {
+ Ok(Pat::Lit(PatLit {
+ attrs: Vec::new(),
+@@ -684,7 +613,17 @@ mod parsing {
+ }
+ }
+
+- fn pat_lit_expr(input: ParseStream) -> Result<Box<Expr>> {
++ fn pat_lit_expr(input: ParseStream) -> Result<Option<Box<Expr>>> {
++ if input.is_empty()
++ || input.peek(Token![|])
++ || input.peek(Token![=>])
++ || input.peek(Token![:]) && !input.peek(Token![::])
++ || input.peek(Token![,])
++ || input.peek(Token![;])
++ {
++ return Ok(None);
++ }
++
+ let neg: Option<Token![-]> = input.parse()?;
+
+ let lookahead = input.lookahead1();
+@@ -696,7 +635,6 @@ mod parsing {
+ || lookahead.peek(Token![self])
+ || lookahead.peek(Token![Self])
+ || lookahead.peek(Token![super])
+- || lookahead.peek(Token![extern])
+ || lookahead.peek(Token![crate])
+ {
+ Expr::Path(input.parse()?)
+@@ -704,7 +642,7 @@ mod parsing {
+ return Err(lookahead.error());
+ };
+
+- Ok(Box::new(if let Some(neg) = neg {
++ Ok(Some(Box::new(if let Some(neg) = neg {
+ Expr::Unary(ExprUnary {
+ attrs: Vec::new(),
+ op: UnOp::Neg(neg),
+@@ -712,7 +650,7 @@ mod parsing {
+ })
+ } else {
+ expr
+- }))
++ })))
+ }
+
+ fn pat_slice(input: ParseStream) -> Result<PatSlice> {
+@@ -721,7 +659,7 @@ mod parsing {
+
+ let mut elems = Punctuated::new();
+ while !content.is_empty() {
+- let value: Pat = content.parse()?;
++ let value = multi_pat(&content)?;
+ elems.push_value(value);
+ if content.is_empty() {
+ break;
+@@ -737,11 +675,35 @@ mod parsing {
+ })
+ }
+
+- fn pat_rest(input: ParseStream) -> Result<PatRest> {
+- Ok(PatRest {
+- attrs: Vec::new(),
+- dot2_token: input.parse()?,
+- })
++ pub fn multi_pat(input: ParseStream) -> Result<Pat> {
++ multi_pat_impl(input, None)
++ }
++
++ pub fn multi_pat_with_leading_vert(input: ParseStream) -> Result<Pat> {
++ let leading_vert: Option<Token![|]> = input.parse()?;
++ multi_pat_impl(input, leading_vert)
++ }
++
++ fn multi_pat_impl(input: ParseStream, leading_vert: Option<Token![|]>) -> Result<Pat> {
++ let mut pat: Pat = input.parse()?;
++ if leading_vert.is_some()
++ || input.peek(Token![|]) && !input.peek(Token![||]) && !input.peek(Token![|=])
++ {
++ let mut cases = Punctuated::new();
++ cases.push_value(pat);
++ while input.peek(Token![|]) && !input.peek(Token![||]) && !input.peek(Token![|=]) {
++ let punct = input.parse()?;
++ cases.push_punct(punct);
++ let pat: Pat = input.parse()?;
++ cases.push_value(pat);
++ }
++ pat = Pat::Or(PatOr {
++ attrs: Vec::new(),
++ leading_vert,
++ cases,
++ });
++ }
++ Ok(pat)
+ }
+ }
+
+@@ -756,12 +718,14 @@ mod printing {
+
+ impl ToTokens for PatWild {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.underscore_token.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for PatIdent {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.by_ref.to_tokens(tokens);
+ self.mutability.to_tokens(tokens);
+ self.ident.to_tokens(tokens);
+@@ -774,6 +738,7 @@ mod printing {
+
+ impl ToTokens for PatStruct {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.path.to_tokens(tokens);
+ self.brace_token.surround(tokens, |tokens| {
+ self.fields.to_tokens(tokens);
+@@ -788,6 +753,7 @@ mod printing {
+
+ impl ToTokens for PatTupleStruct {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.path.to_tokens(tokens);
+ self.pat.to_tokens(tokens);
+ }
+@@ -804,12 +770,14 @@ mod printing {
+
+ impl ToTokens for PatPath {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ private::print_path(tokens, &self.qself, &self.path);
+ }
+ }
+
+ impl ToTokens for PatTuple {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.paren_token.surround(tokens, |tokens| {
+ self.elems.to_tokens(tokens);
+ });
+@@ -818,6 +786,7 @@ mod printing {
+
+ impl ToTokens for PatBox {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.box_token.to_tokens(tokens);
+ self.pat.to_tokens(tokens);
+ }
+@@ -825,6 +794,7 @@ mod printing {
+
+ impl ToTokens for PatReference {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.and_token.to_tokens(tokens);
+ self.mutability.to_tokens(tokens);
+ self.pat.to_tokens(tokens);
+@@ -833,18 +803,21 @@ mod printing {
+
+ impl ToTokens for PatRest {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.dot2_token.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for PatLit {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.expr.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for PatRange {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.lo.to_tokens(tokens);
+ match &self.limits {
+ RangeLimits::HalfOpen(t) => t.to_tokens(tokens),
+@@ -856,6 +829,7 @@ mod printing {
+
+ impl ToTokens for PatSlice {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.bracket_token.surround(tokens, |tokens| {
+ self.elems.to_tokens(tokens);
+ });
+@@ -864,12 +838,14 @@ mod printing {
+
+ impl ToTokens for PatMacro {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.mac.to_tokens(tokens);
+ }
+ }
+
+ impl ToTokens for PatOr {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ self.leading_vert.to_tokens(tokens);
+ self.cases.to_tokens(tokens);
+ }
+@@ -877,6 +853,7 @@ mod printing {
+
+ impl ToTokens for FieldPat {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
++ tokens.append_all(self.attrs.outer());
+ if let Some(colon_token) = &self.colon_token {
+ self.member.to_tokens(tokens);
+ colon_token.to_tokens(tokens);
+diff --git a/third_party/rust/syn/src/path.rs b/third_party/rust/syn/src/path.rs
+index 8dda43ee67..15c0fcc664 100644
+--- mozilla-release/third_party/rust/syn/src/path.rs
++++ mozilla-release/third_party/rust/syn/src/path.rs
+@@ -2,9 +2,9 @@ use super::*;
+ use crate::punctuated::Punctuated;
+
+ ast_struct! {
+- /// A path at which a named item is exported: `std::collections::HashMap`.
++ /// A path at which a named item is exported (e.g. `std::collections::HashMap`).
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Path {
+ pub leading_colon: Option<Token![::]>,
+@@ -29,7 +29,7 @@ where
+ ast_struct! {
+ /// A segment of a path together with any path arguments on that segment.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct PathSegment {
+ pub ident: Ident,
+@@ -52,7 +52,7 @@ where
+ ast_enum! {
+ /// Angle bracketed or parenthesized arguments of a path segment.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// ## Angle bracketed
+@@ -98,7 +98,7 @@ impl PathArguments {
+ ast_enum! {
+ /// An individual generic argument, like `'a`, `T`, or `Item = T`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum GenericArgument {
+ /// A lifetime argument.
+@@ -122,7 +122,7 @@ ast_struct! {
+ /// Angle bracketed arguments of a path segment: the `<K, V>` in `HashMap<K,
+ /// V>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct AngleBracketedGenericArguments {
+ pub colon2_token: Option<Token![::]>,
+@@ -135,7 +135,7 @@ ast_struct! {
+ ast_struct! {
+ /// A binding (equality constraint) on an associated type: `Item = u8`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Binding {
+ pub ident: Ident,
+@@ -147,7 +147,7 @@ ast_struct! {
+ ast_struct! {
+ /// An associated type bound: `Iterator<Item: Display>`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Constraint {
+ pub ident: Ident,
+@@ -160,7 +160,7 @@ ast_struct! {
+ /// Arguments of a function path segment: the `(A, B) -> C` in `Fn(A,B) ->
+ /// C`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct ParenthesizedGenericArguments {
+ pub paren_token: token::Paren,
+@@ -189,7 +189,7 @@ ast_struct! {
+ /// ty position = 0
+ /// ```
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct QSelf {
+ pub lt_token: Token![<],
+@@ -291,11 +291,7 @@ pub mod parsing {
+
+ impl PathSegment {
+ fn parse_helper(input: ParseStream, expr_style: bool) -> Result<Self> {
+- if input.peek(Token![super])
+- || input.peek(Token![self])
+- || input.peek(Token![crate])
+- || input.peek(Token![extern])
+- {
++ if input.peek(Token![super]) || input.peek(Token![self]) || input.peek(Token![crate]) {
+ let ident = input.call(Ident::parse_any)?;
+ return Ok(PathSegment::from(ident));
+ }
+@@ -358,7 +354,7 @@ pub mod parsing {
+ impl Path {
+ /// Parse a `Path` containing no path arguments on any of its segments.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ ///
+ /// # Example
+@@ -400,7 +396,6 @@ pub mod parsing {
+ && !input.peek(Token![self])
+ && !input.peek(Token![Self])
+ && !input.peek(Token![crate])
+- && !input.peek(Token![extern])
+ {
+ break;
+ }
+@@ -433,7 +428,7 @@ pub mod parsing {
+ /// path arguments, and
+ /// - the ident of the first path segment is equal to the given one.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ ///
+ /// # Example
+@@ -472,7 +467,7 @@ pub mod parsing {
+ /// - the first path segment has no angle bracketed or parenthesized
+ /// path arguments.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ pub fn get_ident(&self) -> Option<&Ident> {
+ if self.leading_colon.is_none()
+diff --git a/third_party/rust/syn/src/punctuated.rs b/third_party/rust/syn/src/punctuated.rs
+index 38c7bf4e82..46c82a65b1 100644
+--- mozilla-release/third_party/rust/syn/src/punctuated.rs
++++ mozilla-release/third_party/rust/syn/src/punctuated.rs
+@@ -22,6 +22,8 @@
+
+ #[cfg(feature = "extra-traits")]
+ use std::fmt::{self, Debug};
++#[cfg(feature = "extra-traits")]
++use std::hash::{Hash, Hasher};
+ #[cfg(any(feature = "full", feature = "derive"))]
+ use std::iter;
+ use std::iter::FromIterator;
+@@ -41,8 +43,6 @@ use crate::token::Token;
+ /// Refer to the [module documentation] for details about punctuated sequences.
+ ///
+ /// [module documentation]: self
+-#[cfg_attr(feature = "extra-traits", derive(Eq, PartialEq, Hash))]
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct Punctuated<T, P> {
+ inner: Vec<(T, P)>,
+ last: Option<Box<T>>,
+@@ -76,22 +76,19 @@ impl<T, P> Punctuated<T, P> {
+ self.iter().next()
+ }
+
++ /// Mutably borrows the first element in this sequence.
++ pub fn first_mut(&mut self) -> Option<&mut T> {
++ self.iter_mut().next()
++ }
++
+ /// Borrows the last element in this sequence.
+ pub fn last(&self) -> Option<&T> {
+- if self.last.is_some() {
+- self.last.as_ref().map(Box::as_ref)
+- } else {
+- self.inner.last().map(|pair| &pair.0)
+- }
++ self.iter().next_back()
+ }
+
+ /// Mutably borrows the last element in this sequence.
+ pub fn last_mut(&mut self) -> Option<&mut T> {
+- if self.last.is_some() {
+- self.last.as_mut().map(Box::as_mut)
+- } else {
+- self.inner.last_mut().map(|pair| &mut pair.0)
+- }
++ self.iter_mut().next_back()
+ }
+
+ /// Returns an iterator over borrowed syntax tree nodes of type `&T`.
+@@ -230,13 +227,19 @@ impl<T, P> Punctuated<T, P> {
+ }
+ }
+
++ /// Clears the sequence of all values and punctuation, making it empty.
++ pub fn clear(&mut self) {
++ self.inner.clear();
++ self.last = None;
++ }
++
+ /// Parses zero or more occurrences of `T` separated by punctuation of type
+ /// `P`, with optional trailing punctuation.
+ ///
+ /// Parsing continues until the end of this parse stream. The entire content
+ /// of this parse stream must consist of `T` and `P`.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_terminated(input: ParseStream) -> Result<Self>
+@@ -256,7 +259,7 @@ impl<T, P> Punctuated<T, P> {
+ ///
+ /// [`parse_terminated`]: Punctuated::parse_terminated
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_terminated_with(
+@@ -292,7 +295,7 @@ impl<T, P> Punctuated<T, P> {
+ /// is not followed by a `P`, even if there are remaining tokens in the
+ /// stream.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_separated_nonempty(input: ParseStream) -> Result<Self>
+@@ -312,7 +315,7 @@ impl<T, P> Punctuated<T, P> {
+ ///
+ /// [`parse_separated_nonempty`]: Punctuated::parse_separated_nonempty
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ #[cfg(feature = "parsing")]
+ pub fn parse_separated_nonempty_with(
+@@ -338,6 +341,53 @@ impl<T, P> Punctuated<T, P> {
+ }
+ }
+
++#[cfg(feature = "clone-impls")]
++impl<T, P> Clone for Punctuated<T, P>
++where
++ T: Clone,
++ P: Clone,
++{
++ fn clone(&self) -> Self {
++ Punctuated {
++ inner: self.inner.clone(),
++ last: self.last.clone(),
++ }
++ }
++}
++
++#[cfg(feature = "extra-traits")]
++impl<T, P> Eq for Punctuated<T, P>
++where
++ T: Eq,
++ P: Eq,
++{
++}
++
++#[cfg(feature = "extra-traits")]
++impl<T, P> PartialEq for Punctuated<T, P>
++where
++ T: PartialEq,
++ P: PartialEq,
++{
++ fn eq(&self, other: &Self) -> bool {
++ let Punctuated { inner, last } = self;
++ *inner == other.inner && *last == other.last
++ }
++}
++
++#[cfg(feature = "extra-traits")]
++impl<T, P> Hash for Punctuated<T, P>
++where
++ T: Hash,
++ P: Hash,
++{
++ fn hash<H: Hasher>(&self, state: &mut H) {
++ let Punctuated { inner, last } = self;
++ inner.hash(state);
++ last.hash(state);
++ }
++}
++
+ #[cfg(feature = "extra-traits")]
+ impl<T: Debug, P: Debug> Debug for Punctuated<T, P> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+@@ -536,7 +586,6 @@ impl<'a, T, P> ExactSizeIterator for PairsMut<'a, T, P> {
+ /// Refer to the [module documentation] for details about punctuated sequences.
+ ///
+ /// [module documentation]: self
+-#[derive(Clone)]
+ pub struct IntoPairs<T, P> {
+ inner: vec::IntoIter<(T, P)>,
+ last: option::IntoIter<T>,
+@@ -572,12 +621,24 @@ impl<T, P> ExactSizeIterator for IntoPairs<T, P> {
+ }
+ }
+
++impl<T, P> Clone for IntoPairs<T, P>
++where
++ T: Clone,
++ P: Clone,
++{
++ fn clone(&self) -> Self {
++ IntoPairs {
++ inner: self.inner.clone(),
++ last: self.last.clone(),
++ }
++ }
++}
++
+ /// An iterator over owned values of type `T`.
+ ///
+ /// Refer to the [module documentation] for details about punctuated sequences.
+ ///
+ /// [module documentation]: self
+-#[derive(Clone)]
+ pub struct IntoIter<T> {
+ inner: vec::IntoIter<T>,
+ }
+@@ -606,6 +667,17 @@ impl<T> ExactSizeIterator for IntoIter<T> {
+ }
+ }
+
++impl<T> Clone for IntoIter<T>
++where
++ T: Clone,
++{
++ fn clone(&self) -> Self {
++ IntoIter {
++ inner: self.inner.clone(),
++ }
++ }
++}
++
+ /// An iterator over borrowed values of type `&T`.
+ ///
+ /// Refer to the [module documentation] for details about punctuated sequences.
+@@ -799,7 +871,6 @@ impl<'a, T: 'a, I: 'a> IterMutTrait<'a, T> for I where
+ /// Refer to the [module documentation] for details about punctuated sequences.
+ ///
+ /// [module documentation]: self
+-#[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub enum Pair<T, P> {
+ Punctuated(T, P),
+ End(T),
+@@ -856,6 +927,20 @@ impl<T, P> Pair<T, P> {
+ }
+ }
+
++#[cfg(feature = "clone-impls")]
++impl<T, P> Clone for Pair<T, P>
++where
++ T: Clone,
++ P: Clone,
++{
++ fn clone(&self) -> Self {
++ match self {
++ Pair::Punctuated(t, p) => Pair::Punctuated(t.clone(), p.clone()),
++ Pair::End(t) => Pair::End(t.clone()),
++ }
++ }
++}
++
+ impl<T, P> Index<usize> for Punctuated<T, P> {
+ type Output = T;
+
+diff --git a/third_party/rust/syn/src/reserved.rs b/third_party/rust/syn/src/reserved.rs
+new file mode 100644
+index 0000000000..ccfb8b5ad0
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/reserved.rs
+@@ -0,0 +1,42 @@
++// Type for a syntax tree node that is reserved for future use.
++//
++// For example ExprReference contains a field `raw` of type Reserved. If `&raw
++// place` syntax becomes a thing as per https://github.com/rust-lang/rfcs/pull/2582,
++// we can backward compatibly change `raw`'s type to Option<Token![raw]> without
++// the possibility of breaking any code.
++
++use proc_macro2::Span;
++use std::marker::PhantomData;
++
++#[cfg(feature = "extra-traits")]
++use std::fmt::{self, Debug};
++
++ast_struct! {
++ pub struct Reserved {
++ _private: PhantomData<Span>,
++ }
++}
++
++impl Default for Reserved {
++ fn default() -> Self {
++ Reserved {
++ _private: PhantomData,
++ }
++ }
++}
++
++#[cfg(feature = "clone-impls")]
++impl Clone for Reserved {
++ fn clone(&self) -> Self {
++ Reserved {
++ _private: self._private,
++ }
++ }
++}
++
++#[cfg(feature = "extra-traits")]
++impl Debug for Reserved {
++ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
++ formatter.debug_struct("Reserved").finish()
++ }
++}
+diff --git a/third_party/rust/syn/src/spanned.rs b/third_party/rust/syn/src/spanned.rs
+index 71ffe26b81..01591cedcb 100644
+--- mozilla-release/third_party/rust/syn/src/spanned.rs
++++ mozilla-release/third_party/rust/syn/src/spanned.rs
+@@ -1,7 +1,7 @@
+ //! A trait that can provide the `Span` of the complete contents of a syntax
+ //! tree node.
+ //!
+-//! *This module is available if Syn is built with both the `"parsing"` and
++//! *This module is available only if Syn is built with both the `"parsing"` and
+ //! `"printing"` features.*
+ //!
+ //! <br>
+@@ -97,7 +97,7 @@ use quote::spanned::Spanned as ToTokens;
+ ///
+ /// [module documentation]: self
+ ///
+-/// *This trait is available if Syn is built with both the `"parsing"` and
++/// *This trait is available only if Syn is built with both the `"parsing"` and
+ /// `"printing"` features.*
+ pub trait Spanned {
+ /// Returns a `Span` covering the complete contents of this syntax tree
+diff --git a/third_party/rust/syn/src/stmt.rs b/third_party/rust/syn/src/stmt.rs
+index e4277fdbaa..b06e843d75 100644
+--- mozilla-release/third_party/rust/syn/src/stmt.rs
++++ mozilla-release/third_party/rust/syn/src/stmt.rs
+@@ -3,7 +3,7 @@ use super::*;
+ ast_struct! {
+ /// A braced block containing Rust statements.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Block {
+ pub brace_token: token::Brace,
+ /// Statements in a block
+@@ -14,7 +14,7 @@ ast_struct! {
+ ast_enum! {
+ /// A statement, usually ending in a semicolon.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub enum Stmt {
+ /// A local (let) binding.
+ Local(Local),
+@@ -33,7 +33,7 @@ ast_enum! {
+ ast_struct! {
+ /// A local `let` binding: `let x: u64 = s.parse()?`.
+ ///
+- /// *This type is available if Syn is built with the `"full"` feature.*
++ /// *This type is available only if Syn is built with the `"full"` feature.*
+ pub struct Local {
+ pub attrs: Vec<Attribute>,
+ pub let_token: Token![let],
+@@ -47,14 +47,15 @@ ast_struct! {
+ pub mod parsing {
+ use super::*;
+
++ use crate::parse::discouraged::Speculative;
+ use crate::parse::{Parse, ParseStream, Result};
+- use crate::punctuated::Punctuated;
++ use proc_macro2::TokenStream;
+
+ impl Block {
+ /// Parse the body of a block as zero or more statements, possibly
+ /// including one trailing expression.
+ ///
+- /// *This function is available if Syn is built with the `"parsing"`
++ /// *This function is available only if Syn is built with the `"parsing"`
+ /// feature.*
+ ///
+ /// # Example
+@@ -106,8 +107,8 @@ pub mod parsing {
+ pub fn parse_within(input: ParseStream) -> Result<Vec<Stmt>> {
+ let mut stmts = Vec::new();
+ loop {
+- while input.peek(Token![;]) {
+- input.parse::<Token![;]>()?;
++ while let Some(semi) = input.parse::<Option<Token![;]>>()? {
++ stmts.push(Stmt::Semi(Expr::Verbatim(TokenStream::new()), semi));
+ }
+ if input.is_empty() {
+ break;
+@@ -146,55 +147,55 @@ pub mod parsing {
+ }
+
+ fn parse_stmt(input: ParseStream, allow_nosemi: bool) -> Result<Stmt> {
+- // TODO: optimize using advance_to
++ let mut attrs = input.call(Attribute::parse_outer)?;
++
++ // brace-style macros; paren and bracket macros get parsed as
++ // expression statements.
+ let ahead = input.fork();
+- ahead.call(Attribute::parse_outer)?;
++ if let Ok(path) = ahead.call(Path::parse_mod_style) {
++ if ahead.peek(Token![!]) && (ahead.peek2(token::Brace) || ahead.peek2(Ident)) {
++ input.advance_to(&ahead);
++ return stmt_mac(input, attrs, path);
++ }
++ }
+
+- if {
+- let ahead = ahead.fork();
+- // Only parse braces here; paren and bracket will get parsed as
+- // expression statements
+- ahead.call(Path::parse_mod_style).is_ok()
+- && ahead.parse::<Token![!]>().is_ok()
+- && (ahead.peek(token::Brace) || ahead.peek(Ident))
+- } {
+- stmt_mac(input)
+- } else if ahead.peek(Token![let]) {
+- stmt_local(input).map(Stmt::Local)
+- } else if ahead.peek(Token![pub])
+- || ahead.peek(Token![crate]) && !ahead.peek2(Token![::])
+- || ahead.peek(Token![extern]) && !ahead.peek2(Token![::])
+- || ahead.peek(Token![use])
+- || ahead.peek(Token![static]) && (ahead.peek2(Token![mut]) || ahead.peek2(Ident))
+- || ahead.peek(Token![const])
+- || ahead.peek(Token![unsafe]) && !ahead.peek2(token::Brace)
+- || ahead.peek(Token![async])
+- && (ahead.peek2(Token![unsafe])
+- || ahead.peek2(Token![extern])
+- || ahead.peek2(Token![fn]))
+- || ahead.peek(Token![fn])
+- || ahead.peek(Token![mod])
+- || ahead.peek(Token![type])
+- || ahead.peek(item::parsing::existential) && ahead.peek2(Token![type])
+- || ahead.peek(Token![struct])
+- || ahead.peek(Token![enum])
+- || ahead.peek(Token![union]) && ahead.peek2(Ident)
+- || ahead.peek(Token![auto]) && ahead.peek2(Token![trait])
+- || ahead.peek(Token![trait])
+- || ahead.peek(Token![default])
+- && (ahead.peek2(Token![unsafe]) || ahead.peek2(Token![impl]))
+- || ahead.peek(Token![impl])
+- || ahead.peek(Token![macro])
++ if input.peek(Token![let]) {
++ stmt_local(input, attrs).map(Stmt::Local)
++ } else if input.peek(Token![pub])
++ || input.peek(Token![crate]) && !input.peek2(Token![::])
++ || input.peek(Token![extern])
++ || input.peek(Token![use])
++ || input.peek(Token![static]) && (input.peek2(Token![mut]) || input.peek2(Ident))
++ || input.peek(Token![const])
++ || input.peek(Token![unsafe]) && !input.peek2(token::Brace)
++ || input.peek(Token![async])
++ && (input.peek2(Token![unsafe])
++ || input.peek2(Token![extern])
++ || input.peek2(Token![fn]))
++ || input.peek(Token![fn])
++ || input.peek(Token![mod])
++ || input.peek(Token![type])
++ || input.peek(item::parsing::existential) && input.peek2(Token![type])
++ || input.peek(Token![struct])
++ || input.peek(Token![enum])
++ || input.peek(Token![union]) && input.peek2(Ident)
++ || input.peek(Token![auto]) && input.peek2(Token![trait])
++ || input.peek(Token![trait])
++ || input.peek(Token![default])
++ && (input.peek2(Token![unsafe]) || input.peek2(Token![impl]))
++ || input.peek(Token![impl])
++ || input.peek(Token![macro])
+ {
+- input.parse().map(Stmt::Item)
++ let mut item: Item = input.parse()?;
++ attrs.extend(item.replace_attrs(Vec::new()));
++ item.replace_attrs(attrs);
++ Ok(Stmt::Item(item))
+ } else {
+- stmt_expr(input, allow_nosemi)
++ stmt_expr(input, allow_nosemi, attrs)
+ }
+ }
+
+- fn stmt_mac(input: ParseStream) -> Result<Stmt> {
+- let attrs = input.call(Attribute::parse_outer)?;
+- let path = input.call(Path::parse_mod_style)?;
++ fn stmt_mac(input: ParseStream, attrs: Vec<Attribute>, path: Path) -> Result<Stmt> {
+ let bang_token: Token![!] = input.parse()?;
+ let ident: Option<Ident> = input.parse()?;
+ let (delimiter, tokens) = mac::parse_delimiter(input)?;
+@@ -213,33 +214,12 @@ pub mod parsing {
+ })))
+ }
+
+- fn stmt_local(input: ParseStream) -> Result<Local> {
++ fn stmt_local(input: ParseStream, attrs: Vec<Attribute>) -> Result<Local> {
+ Ok(Local {
+- attrs: input.call(Attribute::parse_outer)?,
++ attrs,
+ let_token: input.parse()?,
+ pat: {
+- let leading_vert: Option<Token![|]> = input.parse()?;
+- let mut pat: Pat = input.parse()?;
+- if leading_vert.is_some()
+- || input.peek(Token![|]) && !input.peek(Token![||]) && !input.peek(Token![|=])
+- {
+- let mut cases = Punctuated::new();
+- cases.push_value(pat);
+- while input.peek(Token![|])
+- && !input.peek(Token![||])
+- && !input.peek(Token![|=])
+- {
+- let punct = input.parse()?;
+- cases.push_punct(punct);
+- let pat: Pat = input.parse()?;
+- cases.push_value(pat);
+- }
+- pat = Pat::Or(PatOr {
+- attrs: Vec::new(),
+- leading_vert,
+- cases,
+- });
+- }
++ let mut pat: Pat = pat::parsing::multi_pat_with_leading_vert(input)?;
+ if input.peek(Token![:]) {
+ let colon_token: Token![:] = input.parse()?;
+ let ty: Type = input.parse()?;
+@@ -265,12 +245,19 @@ pub mod parsing {
+ })
+ }
+
+- fn stmt_expr(input: ParseStream, allow_nosemi: bool) -> Result<Stmt> {
+- let mut attrs = input.call(Attribute::parse_outer)?;
++ fn stmt_expr(
++ input: ParseStream,
++ allow_nosemi: bool,
++ mut attrs: Vec<Attribute>,
++ ) -> Result<Stmt> {
+ let mut e = expr::parsing::expr_early(input)?;
+
+- attrs.extend(e.replace_attrs(Vec::new()));
+- e.replace_attrs(attrs);
++ let mut attr_target = &mut e;
++ while let Expr::Binary(e) = attr_target {
++ attr_target = &mut e.left;
++ }
++ attrs.extend(attr_target.replace_attrs(Vec::new()));
++ attr_target.replace_attrs(attrs);
+
+ if input.peek(Token![;]) {
+ return Ok(Stmt::Semi(e, input.parse()?));
+diff --git a/third_party/rust/syn/src/token.rs b/third_party/rust/syn/src/token.rs
+index 0b8c18192f..8539378c5e 100644
+--- mozilla-release/third_party/rust/syn/src/token.rs
++++ mozilla-release/third_party/rust/syn/src/token.rs
+@@ -88,7 +88,6 @@
+ //! [Printing]: https://docs.rs/quote/1.0/quote/trait.ToTokens.html
+ //! [`Span`]: https://docs.rs/proc-macro2/1.0/proc_macro2/struct.Span.html
+
+-use std;
+ #[cfg(feature = "extra-traits")]
+ use std::cmp;
+ #[cfg(feature = "extra-traits")]
+@@ -97,13 +96,13 @@ use std::fmt::{self, Debug};
+ use std::hash::{Hash, Hasher};
+ use std::ops::{Deref, DerefMut};
+
+-#[cfg(feature = "parsing")]
+-use proc_macro2::Delimiter;
+ #[cfg(any(feature = "parsing", feature = "printing"))]
+ use proc_macro2::Ident;
+ use proc_macro2::Span;
+ #[cfg(feature = "printing")]
+ use proc_macro2::TokenStream;
++#[cfg(feature = "parsing")]
++use proc_macro2::{Delimiter, Literal, Punct, TokenTree};
+ #[cfg(feature = "printing")]
+ use quote::{ToTokens, TokenStreamExt};
+
+@@ -112,10 +111,8 @@ use self::private::WithSpan;
+ use crate::buffer::Cursor;
+ #[cfg(feature = "parsing")]
+ use crate::error::Result;
+-#[cfg(any(feature = "full", feature = "derive"))]
+ #[cfg(feature = "parsing")]
+ use crate::lifetime::Lifetime;
+-#[cfg(any(feature = "full", feature = "derive"))]
+ #[cfg(feature = "parsing")]
+ use crate::lit::{Lit, LitBool, LitByte, LitByteStr, LitChar, LitFloat, LitInt, LitStr};
+ #[cfg(feature = "parsing")]
+@@ -155,21 +152,20 @@ mod private {
+ #[cfg(feature = "parsing")]
+ impl private::Sealed for Ident {}
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+ #[cfg(feature = "parsing")]
+ fn peek_impl(cursor: Cursor, peek: fn(ParseStream) -> bool) -> bool {
++ use crate::parse::Unexpected;
+ use std::cell::Cell;
+ use std::rc::Rc;
+
+ let scope = Span::call_site();
+- let unexpected = Rc::new(Cell::new(None));
++ let unexpected = Rc::new(Cell::new(Unexpected::None));
+ let buffer = crate::parse::new_parse_buffer(scope, cursor, unexpected);
+ peek(&buffer)
+ }
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+ macro_rules! impl_token {
+- ($name:ident $display:expr) => {
++ ($display:tt $name:ty) => {
+ #[cfg(feature = "parsing")]
+ impl Token for $name {
+ fn peek(cursor: Cursor) -> bool {
+@@ -189,24 +185,38 @@ macro_rules! impl_token {
+ };
+ }
+
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(Lifetime "lifetime");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(Lit "literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitStr "string literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitByteStr "byte string literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitByte "byte literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitChar "character literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitInt "integer literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitFloat "floating point literal");
+-#[cfg(any(feature = "full", feature = "derive"))]
+-impl_token!(LitBool "boolean literal");
++impl_token!("lifetime" Lifetime);
++impl_token!("literal" Lit);
++impl_token!("string literal" LitStr);
++impl_token!("byte string literal" LitByteStr);
++impl_token!("byte literal" LitByte);
++impl_token!("character literal" LitChar);
++impl_token!("integer literal" LitInt);
++impl_token!("floating point literal" LitFloat);
++impl_token!("boolean literal" LitBool);
++impl_token!("group token" proc_macro2::Group);
++
++macro_rules! impl_low_level_token {
++ ($display:tt $ty:ident $get:ident) => {
++ #[cfg(feature = "parsing")]
++ impl Token for $ty {
++ fn peek(cursor: Cursor) -> bool {
++ cursor.$get().is_some()
++ }
++
++ fn display() -> &'static str {
++ $display
++ }
++ }
++
++ #[cfg(feature = "parsing")]
++ impl private::Sealed for $ty {}
++ };
++}
++
++impl_low_level_token!("punctuation token" Punct punct);
++impl_low_level_token!("literal" Literal literal);
++impl_low_level_token!("token" TokenTree token_tree);
+
+ // Not public API.
+ #[doc(hidden)]
+@@ -233,7 +243,6 @@ impl<T: CustomToken> Token for T {
+ macro_rules! define_keywords {
+ ($($token:tt pub struct $name:ident #[$doc:meta])*) => {
+ $(
+- #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
+ #[$doc]
+ ///
+ /// Don't try to remember the name of this type &mdash; use the
+@@ -260,6 +269,16 @@ macro_rules! define_keywords {
+ }
+ }
+
++ #[cfg(feature = "clone-impls")]
++ impl Copy for $name {}
++
++ #[cfg(feature = "clone-impls")]
++ impl Clone for $name {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
++
+ #[cfg(feature = "extra-traits")]
+ impl Debug for $name {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+@@ -338,7 +357,6 @@ macro_rules! impl_deref_if_len_is_1 {
+ macro_rules! define_punctuation_structs {
+ ($($token:tt pub struct $name:ident/$len:tt #[$doc:meta])*) => {
+ $(
+- #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
+ #[repr(C)]
+ #[$doc]
+ ///
+@@ -366,6 +384,16 @@ macro_rules! define_punctuation_structs {
+ }
+ }
+
++ #[cfg(feature = "clone-impls")]
++ impl Copy for $name {}
++
++ #[cfg(feature = "clone-impls")]
++ impl Clone for $name {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
++
+ #[cfg(feature = "extra-traits")]
+ impl Debug for $name {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+@@ -436,7 +464,6 @@ macro_rules! define_punctuation {
+ macro_rules! define_delimiters {
+ ($($token:tt pub struct $name:ident #[$doc:meta])*) => {
+ $(
+- #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
+ #[$doc]
+ pub struct $name {
+ pub span: Span,
+@@ -458,6 +485,16 @@ macro_rules! define_delimiters {
+ }
+ }
+
++ #[cfg(feature = "clone-impls")]
++ impl Copy for $name {}
++
++ #[cfg(feature = "clone-impls")]
++ impl Clone for $name {
++ fn clone(&self) -> Self {
++ *self
++ }
++ }
++
+ #[cfg(feature = "extra-traits")]
+ impl Debug for $name {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+@@ -855,7 +892,7 @@ pub mod parsing {
+ }
+
+ pub fn punct<S: FromSpans>(input: ParseStream, token: &str) -> Result<S> {
+- let mut spans = [input.cursor().span(); 3];
++ let mut spans = [input.span(); 3];
+ punct_helper(input, token, &mut spans)?;
+ Ok(S::from_spans(&spans))
+ }
+diff --git a/third_party/rust/syn/src/tt.rs b/third_party/rust/syn/src/tt.rs
+index f860eebb4f..8dba0627cd 100644
+--- mozilla-release/third_party/rust/syn/src/tt.rs
++++ mozilla-release/third_party/rust/syn/src/tt.rs
+@@ -18,8 +18,8 @@ impl<'a> PartialEq for TokenTreeHelper<'a> {
+ _ => return false,
+ }
+
+- let s1 = g1.stream().clone().into_iter();
+- let mut s2 = g2.stream().clone().into_iter();
++ let s1 = g1.stream().into_iter();
++ let mut s2 = g2.stream().into_iter();
+
+ for item1 in s1 {
+ let item2 = match s2.next() {
+@@ -60,7 +60,7 @@ impl<'a> Hash for TokenTreeHelper<'a> {
+ Delimiter::None => 3u8.hash(h),
+ }
+
+- for item in g.stream().clone() {
++ for item in g.stream() {
+ TokenTreeHelper(&item).hash(h);
+ }
+ 0xffu8.hash(h); // terminator w/ a variant we don't normally hash
+diff --git a/third_party/rust/syn/src/ty.rs b/third_party/rust/syn/src/ty.rs
+index 4ee59bda2a..fd7c97eab7 100644
+--- mozilla-release/third_party/rust/syn/src/ty.rs
++++ mozilla-release/third_party/rust/syn/src/ty.rs
+@@ -1,15 +1,11 @@
+ use super::*;
+ use crate::punctuated::Punctuated;
+-#[cfg(feature = "extra-traits")]
+-use crate::tt::TokenStreamHelper;
+ use proc_macro2::TokenStream;
+-#[cfg(feature = "extra-traits")]
+-use std::hash::{Hash, Hasher};
+
+ ast_enum_of_structs! {
+ /// The possible types that a Rust value could have.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ ///
+ /// # Syntax tree enum
+@@ -20,7 +16,7 @@ ast_enum_of_structs! {
+ //
+ // TODO: change syntax-tree-enum link to an intra rustdoc link, currently
+ // blocked on https://github.com/rust-lang/rust/issues/62833
+- pub enum Type #manual_extra_traits {
++ pub enum Type {
+ /// A fixed size array type: `[T; n]`.
+ Array(TypeArray),
+
+@@ -77,7 +73,7 @@ ast_enum_of_structs! {
+ ast_struct! {
+ /// A fixed size array type: `[T; n]`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeArray {
+ pub bracket_token: token::Bracket,
+@@ -90,7 +86,7 @@ ast_struct! {
+ ast_struct! {
+ /// A bare function type: `fn(usize) -> bool`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeBareFn {
+ pub lifetimes: Option<BoundLifetimes>,
+@@ -107,7 +103,7 @@ ast_struct! {
+ ast_struct! {
+ /// A type contained within invisible delimiters.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeGroup {
+ pub group_token: token::Group,
+@@ -119,7 +115,7 @@ ast_struct! {
+ /// An `impl Bound1 + Bound2 + Bound3` type where `Bound` is a trait or
+ /// a lifetime.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeImplTrait {
+ pub impl_token: Token![impl],
+@@ -130,7 +126,7 @@ ast_struct! {
+ ast_struct! {
+ /// Indication that a type should be inferred by the compiler: `_`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeInfer {
+ pub underscore_token: Token![_],
+@@ -140,7 +136,7 @@ ast_struct! {
+ ast_struct! {
+ /// A macro in the type position.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeMacro {
+ pub mac: Macro,
+@@ -150,7 +146,7 @@ ast_struct! {
+ ast_struct! {
+ /// The never type: `!`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeNever {
+ pub bang_token: Token![!],
+@@ -160,7 +156,7 @@ ast_struct! {
+ ast_struct! {
+ /// A parenthesized type equivalent to the inner type.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeParen {
+ pub paren_token: token::Paren,
+@@ -172,7 +168,7 @@ ast_struct! {
+ /// A path like `std::slice::Iter`, optionally qualified with a
+ /// self-type as in `<Vec<T> as SomeTrait>::Associated`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypePath {
+ pub qself: Option<QSelf>,
+@@ -183,7 +179,7 @@ ast_struct! {
+ ast_struct! {
+ /// A raw pointer type: `*const T` or `*mut T`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypePtr {
+ pub star_token: Token![*],
+@@ -196,7 +192,7 @@ ast_struct! {
+ ast_struct! {
+ /// A reference type: `&'a T` or `&'a mut T`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeReference {
+ pub and_token: Token![&],
+@@ -209,7 +205,7 @@ ast_struct! {
+ ast_struct! {
+ /// A dynamically sized slice type: `[T]`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeSlice {
+ pub bracket_token: token::Bracket,
+@@ -221,7 +217,7 @@ ast_struct! {
+ /// A trait object type `Bound1 + Bound2 + Bound3` where `Bound` is a
+ /// trait or a lifetime.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeTraitObject {
+ pub dyn_token: Option<Token![dyn]>,
+@@ -232,7 +228,7 @@ ast_struct! {
+ ast_struct! {
+ /// A tuple type: `(A, B, C, String)`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or
++ /// *This type is available only if Syn is built with the `"derive"` or
+ /// `"full"` feature.*
+ pub struct TypeTuple {
+ pub paren_token: token::Paren,
+@@ -240,111 +236,10 @@ ast_struct! {
+ }
+ }
+
+-#[cfg(feature = "extra-traits")]
+-impl Eq for Type {}
+-
+-#[cfg(feature = "extra-traits")]
+-impl PartialEq for Type {
+- fn eq(&self, other: &Self) -> bool {
+- match (self, other) {
+- (Type::Array(this), Type::Array(other)) => this == other,
+- (Type::BareFn(this), Type::BareFn(other)) => this == other,
+- (Type::Group(this), Type::Group(other)) => this == other,
+- (Type::ImplTrait(this), Type::ImplTrait(other)) => this == other,
+- (Type::Infer(this), Type::Infer(other)) => this == other,
+- (Type::Macro(this), Type::Macro(other)) => this == other,
+- (Type::Never(this), Type::Never(other)) => this == other,
+- (Type::Paren(this), Type::Paren(other)) => this == other,
+- (Type::Path(this), Type::Path(other)) => this == other,
+- (Type::Ptr(this), Type::Ptr(other)) => this == other,
+- (Type::Reference(this), Type::Reference(other)) => this == other,
+- (Type::Slice(this), Type::Slice(other)) => this == other,
+- (Type::TraitObject(this), Type::TraitObject(other)) => this == other,
+- (Type::Tuple(this), Type::Tuple(other)) => this == other,
+- (Type::Verbatim(this), Type::Verbatim(other)) => {
+- TokenStreamHelper(this) == TokenStreamHelper(other)
+- }
+- _ => false,
+- }
+- }
+-}
+-
+-#[cfg(feature = "extra-traits")]
+-impl Hash for Type {
+- fn hash<H>(&self, hash: &mut H)
+- where
+- H: Hasher,
+- {
+- match self {
+- Type::Array(ty) => {
+- hash.write_u8(0);
+- ty.hash(hash);
+- }
+- Type::BareFn(ty) => {
+- hash.write_u8(1);
+- ty.hash(hash);
+- }
+- Type::Group(ty) => {
+- hash.write_u8(2);
+- ty.hash(hash);
+- }
+- Type::ImplTrait(ty) => {
+- hash.write_u8(3);
+- ty.hash(hash);
+- }
+- Type::Infer(ty) => {
+- hash.write_u8(4);
+- ty.hash(hash);
+- }
+- Type::Macro(ty) => {
+- hash.write_u8(5);
+- ty.hash(hash);
+- }
+- Type::Never(ty) => {
+- hash.write_u8(6);
+- ty.hash(hash);
+- }
+- Type::Paren(ty) => {
+- hash.write_u8(7);
+- ty.hash(hash);
+- }
+- Type::Path(ty) => {
+- hash.write_u8(8);
+- ty.hash(hash);
+- }
+- Type::Ptr(ty) => {
+- hash.write_u8(9);
+- ty.hash(hash);
+- }
+- Type::Reference(ty) => {
+- hash.write_u8(10);
+- ty.hash(hash);
+- }
+- Type::Slice(ty) => {
+- hash.write_u8(11);
+- ty.hash(hash);
+- }
+- Type::TraitObject(ty) => {
+- hash.write_u8(12);
+- ty.hash(hash);
+- }
+- Type::Tuple(ty) => {
+- hash.write_u8(13);
+- ty.hash(hash);
+- }
+- Type::Verbatim(ty) => {
+- hash.write_u8(14);
+- TokenStreamHelper(ty).hash(hash);
+- }
+- Type::__Nonexhaustive => unreachable!(),
+- }
+- }
+-}
+-
+ ast_struct! {
+ /// The binary interface of a function: `extern "C"`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Abi {
+ pub extern_token: Token![extern],
+@@ -355,7 +250,7 @@ ast_struct! {
+ ast_struct! {
+ /// An argument in a function type: the `usize` in `fn(usize) -> bool`.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct BareFnArg {
+ pub attrs: Vec<Attribute>,
+@@ -377,7 +272,7 @@ ast_struct! {
+ /// }
+ /// ```
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub struct Variadic {
+ pub attrs: Vec<Attribute>,
+@@ -388,7 +283,7 @@ ast_struct! {
+ ast_enum! {
+ /// Return type of a function signature.
+ ///
+- /// *This type is available if Syn is built with the `"derive"` or `"full"`
++ /// *This type is available only if Syn is built with the `"derive"` or `"full"`
+ /// feature.*
+ pub enum ReturnType {
+ /// Return type is not specified.
+@@ -407,10 +302,13 @@ pub mod parsing {
+ use crate::ext::IdentExt;
+ use crate::parse::{Parse, ParseStream, Result};
+ use crate::path;
++ use proc_macro2::{Punct, Spacing, TokenTree};
++ use std::iter::FromIterator;
+
+ impl Parse for Type {
+ fn parse(input: ParseStream) -> Result<Self> {
+- ambig_ty(input, true)
++ let allow_plus = true;
++ ambig_ty(input, allow_plus)
+ }
+ }
+
+@@ -421,15 +319,17 @@ pub mod parsing {
+ ///
+ /// This parser does not allow a `+`, while the default parser does.
+ pub fn without_plus(input: ParseStream) -> Result<Self> {
+- ambig_ty(input, false)
++ let allow_plus = false;
++ ambig_ty(input, allow_plus)
+ }
+ }
+
+ fn ambig_ty(input: ParseStream, allow_plus: bool) -> Result<Type> {
+- if input.peek(token::Group) {
++ if input.peek(token::Group) && !input.peek2(Token![::]) && !input.peek2(Token![<]) {
+ return input.parse().map(Type::Group);
+ }
+
++ let begin = input.fork();
+ let mut lifetimes = None::<BoundLifetimes>;
+ let mut lookahead = input.lookahead1();
+ if lookahead.peek(Token![for]) {
+@@ -524,7 +424,7 @@ pub mod parsing {
+ ..trait_bound
+ })
+ }
+- other => other,
++ other @ TypeParamBound::Lifetime(_) => other,
+ }
+ }
+ _ => break,
+@@ -549,17 +449,20 @@ pub mod parsing {
+ }))
+ } else if lookahead.peek(Token![fn])
+ || lookahead.peek(Token![unsafe])
+- || lookahead.peek(Token![extern]) && !input.peek2(Token![::])
++ || lookahead.peek(Token![extern])
+ {
+- let mut bare_fn: TypeBareFn = input.parse()?;
+- bare_fn.lifetimes = lifetimes;
+- Ok(Type::BareFn(bare_fn))
++ let allow_mut_self = true;
++ if let Some(mut bare_fn) = parse_bare_fn(input, allow_mut_self)? {
++ bare_fn.lifetimes = lifetimes;
++ Ok(Type::BareFn(bare_fn))
++ } else {
++ Ok(Type::Verbatim(verbatim::between(begin, input)))
++ }
+ } else if lookahead.peek(Ident)
+ || input.peek(Token![super])
+ || input.peek(Token![self])
+ || input.peek(Token![Self])
+ || input.peek(Token![crate])
+- || input.peek(Token![extern])
+ || lookahead.peek(Token![::])
+ || lookahead.peek(Token![<])
+ {
+@@ -722,38 +625,58 @@ pub mod parsing {
+
+ impl Parse for TypeBareFn {
+ fn parse(input: ParseStream) -> Result<Self> {
+- let args;
+- let allow_variadic;
+- Ok(TypeBareFn {
+- lifetimes: input.parse()?,
+- unsafety: input.parse()?,
+- abi: input.parse()?,
+- fn_token: input.parse()?,
+- paren_token: parenthesized!(args in input),
+- inputs: {
+- let mut inputs = Punctuated::new();
+- while !args.is_empty() && !args.peek(Token![...]) {
+- inputs.push_value(args.parse()?);
+- if args.is_empty() {
+- break;
+- }
+- inputs.push_punct(args.parse()?);
+- }
+- allow_variadic = inputs.empty_or_trailing();
+- inputs
+- },
+- variadic: {
+- if allow_variadic && args.peek(Token![...]) {
+- Some(Variadic {
+- attrs: Vec::new(),
++ let allow_mut_self = false;
++ parse_bare_fn(input, allow_mut_self).map(Option::unwrap)
++ }
++ }
++
++ fn parse_bare_fn(input: ParseStream, allow_mut_self: bool) -> Result<Option<TypeBareFn>> {
++ let args;
++ let mut variadic = None;
++ let mut has_mut_self = false;
++
++ let bare_fn = TypeBareFn {
++ lifetimes: input.parse()?,
++ unsafety: input.parse()?,
++ abi: input.parse()?,
++ fn_token: input.parse()?,
++ paren_token: parenthesized!(args in input),
++ inputs: {
++ let mut inputs = Punctuated::new();
++
++ while !args.is_empty() {
++ let attrs = args.call(Attribute::parse_outer)?;
++
++ if inputs.empty_or_trailing() && args.peek(Token![...]) {
++ variadic = Some(Variadic {
++ attrs,
+ dots: args.parse()?,
+- })
++ });
++ break;
++ }
++
++ if let Some(arg) = parse_bare_fn_arg(&args, allow_mut_self)? {
++ inputs.push_value(BareFnArg { attrs, ..arg });
+ } else {
+- None
++ has_mut_self = true;
+ }
+- },
+- output: input.call(ReturnType::without_plus)?,
+- })
++ if args.is_empty() {
++ break;
++ }
++
++ inputs.push_punct(args.parse()?);
++ }
++
++ inputs
++ },
++ variadic,
++ output: input.call(ReturnType::without_plus)?,
++ };
++
++ if has_mut_self {
++ Ok(None)
++ } else {
++ Ok(Some(bare_fn))
+ }
+ }
+
+@@ -776,9 +699,27 @@ pub mod parsing {
+ impl Parse for TypeTuple {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let content;
++ let paren_token = parenthesized!(content in input);
++
++ if content.is_empty() {
++ return Ok(TypeTuple {
++ paren_token,
++ elems: Punctuated::new(),
++ });
++ }
++
++ let first: Type = content.parse()?;
+ Ok(TypeTuple {
+- paren_token: parenthesized!(content in input),
+- elems: content.parse_terminated(Type::parse)?,
++ paren_token,
++ elems: {
++ let mut elems = Punctuated::new();
++ elems.push_value(first);
++ elems.push_punct(content.parse()?);
++ let rest: Punctuated<Type, Token![,]> =
++ content.parse_terminated(Parse::parse)?;
++ elems.extend(rest);
++ elems
++ },
+ })
+ }
+ }
+@@ -807,9 +748,11 @@ pub mod parsing {
+
+ impl ReturnType {
+ pub fn without_plus(input: ParseStream) -> Result<Self> {
+- Self::parse(input, false)
++ let allow_plus = false;
++ Self::parse(input, allow_plus)
+ }
+
++ #[doc(hidden)]
+ pub fn parse(input: ParseStream, allow_plus: bool) -> Result<Self> {
+ if input.peek(Token![->]) {
+ let arrow = input.parse()?;
+@@ -844,10 +787,12 @@ pub mod parsing {
+
+ impl TypeTraitObject {
+ pub fn without_plus(input: ParseStream) -> Result<Self> {
+- Self::parse(input, false)
++ let allow_plus = false;
++ Self::parse(input, allow_plus)
+ }
+
+ // Only allow multiple trait references if allow_plus is true.
++ #[doc(hidden)]
+ pub fn parse(input: ParseStream, allow_plus: bool) -> Result<Self> {
+ Ok(TypeTraitObject {
+ dyn_token: input.parse()?,
+@@ -910,7 +855,8 @@ pub mod parsing {
+
+ impl Parse for TypeParen {
+ fn parse(input: ParseStream) -> Result<Self> {
+- Self::parse(input, false)
++ let allow_plus = false;
++ Self::parse(input, allow_plus)
+ }
+ }
+
+@@ -926,22 +872,72 @@ pub mod parsing {
+
+ impl Parse for BareFnArg {
+ fn parse(input: ParseStream) -> Result<Self> {
+- Ok(BareFnArg {
+- attrs: input.call(Attribute::parse_outer)?,
+- name: {
+- if (input.peek(Ident) || input.peek(Token![_]))
+- && input.peek2(Token![:])
+- && !input.peek2(Token![::])
+- {
+- let name = input.call(Ident::parse_any)?;
+- let colon: Token![:] = input.parse()?;
+- Some((name, colon))
+- } else {
+- None
+- }
+- },
+- ty: input.parse()?,
+- })
++ let allow_mut_self = false;
++ parse_bare_fn_arg(input, allow_mut_self).map(Option::unwrap)
++ }
++ }
++
++ fn parse_bare_fn_arg(
++ input: ParseStream,
++ mut allow_mut_self: bool,
++ ) -> Result<Option<BareFnArg>> {
++ let mut has_mut_self = false;
++ let arg = BareFnArg {
++ attrs: input.call(Attribute::parse_outer)?,
++ name: {
++ if (input.peek(Ident) || input.peek(Token![_]) || input.peek(Token![self]))
++ && input.peek2(Token![:])
++ && !input.peek2(Token![::])
++ {
++ let name = input.call(Ident::parse_any)?;
++ let colon: Token![:] = input.parse()?;
++ Some((name, colon))
++ } else if allow_mut_self
++ && input.peek(Token![mut])
++ && input.peek2(Token![self])
++ && input.peek3(Token![:])
++ && !input.peek3(Token![::])
++ {
++ has_mut_self = true;
++ allow_mut_self = false;
++ input.parse::<Token![mut]>()?;
++ input.parse::<Token![self]>()?;
++ input.parse::<Token![:]>()?;
++ None
++ } else {
++ None
++ }
++ },
++ ty: if !has_mut_self && input.peek(Token![...]) {
++ let dot3 = input.parse::<Token![...]>()?;
++ let args = vec![
++ TokenTree::Punct(Punct::new('.', Spacing::Joint)),
++ TokenTree::Punct(Punct::new('.', Spacing::Joint)),
++ TokenTree::Punct(Punct::new('.', Spacing::Alone)),
++ ];
++ let tokens = TokenStream::from_iter(args.into_iter().zip(&dot3.spans).map(
++ |(mut arg, span)| {
++ arg.set_span(*span);
++ arg
++ },
++ ));
++ Type::Verbatim(tokens)
++ } else if allow_mut_self && input.peek(Token![mut]) && input.peek2(Token![self]) {
++ has_mut_self = true;
++ input.parse::<Token![mut]>()?;
++ Type::Path(TypePath {
++ qself: None,
++ path: input.parse::<Token![self]>()?.into(),
++ })
++ } else {
++ input.parse()?
++ },
++ };
++
++ if has_mut_self {
++ Ok(None)
++ } else {
++ Ok(Some(arg))
+ }
+ }
+
+diff --git a/third_party/rust/syn/src/verbatim.rs b/third_party/rust/syn/src/verbatim.rs
+new file mode 100644
+index 0000000000..0686352f7a
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/verbatim.rs
+@@ -0,0 +1,15 @@
++use crate::parse::{ParseBuffer, ParseStream};
++use proc_macro2::TokenStream;
++use std::iter;
++
++pub fn between<'a>(begin: ParseBuffer<'a>, end: ParseStream<'a>) -> TokenStream {
++ let end = end.cursor();
++ let mut cursor = begin.cursor();
++ let mut tokens = TokenStream::new();
++ while cursor != end {
++ let (tt, next) = cursor.token_tree().unwrap();
++ tokens.extend(iter::once(tt));
++ cursor = next;
++ }
++ tokens
++}
+diff --git a/third_party/rust/syn/src/whitespace.rs b/third_party/rust/syn/src/whitespace.rs
+new file mode 100644
+index 0000000000..7be082e1a2
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/src/whitespace.rs
+@@ -0,0 +1,65 @@
++pub fn skip(mut s: &str) -> &str {
++ 'skip: while !s.is_empty() {
++ let byte = s.as_bytes()[0];
++ if byte == b'/' {
++ if s.starts_with("//")
++ && (!s.starts_with("///") || s.starts_with("////"))
++ && !s.starts_with("//!")
++ {
++ if let Some(i) = s.find('\n') {
++ s = &s[i + 1..];
++ continue;
++ } else {
++ return "";
++ }
++ } else if s.starts_with("/**/") {
++ s = &s[4..];
++ continue;
++ } else if s.starts_with("/*")
++ && (!s.starts_with("/**") || s.starts_with("/***"))
++ && !s.starts_with("/*!")
++ {
++ let mut depth = 0;
++ let bytes = s.as_bytes();
++ let mut i = 0;
++ let upper = bytes.len() - 1;
++ while i < upper {
++ if bytes[i] == b'/' && bytes[i + 1] == b'*' {
++ depth += 1;
++ i += 1; // eat '*'
++ } else if bytes[i] == b'*' && bytes[i + 1] == b'/' {
++ depth -= 1;
++ if depth == 0 {
++ s = &s[i + 2..];
++ continue 'skip;
++ }
++ i += 1; // eat '/'
++ }
++ i += 1;
++ }
++ return s;
++ }
++ }
++ match byte {
++ b' ' | 0x09..=0x0d => {
++ s = &s[1..];
++ continue;
++ }
++ b if b <= 0x7f => {}
++ _ => {
++ let ch = s.chars().next().unwrap();
++ if is_whitespace(ch) {
++ s = &s[ch.len_utf8()..];
++ continue;
++ }
++ }
++ }
++ return s;
++ }
++ s
++}
++
++fn is_whitespace(ch: char) -> bool {
++ // Rust treats left-to-right mark and right-to-left mark as whitespace
++ ch.is_whitespace() || ch == '\u{200e}' || ch == '\u{200f}'
++}
+diff --git a/third_party/rust/syn/tests/clone.sh b/third_party/rust/syn/tests/clone.sh
+deleted file mode 100755
+index 8e0863cba6..0000000000
+--- mozilla-release/third_party/rust/syn/tests/clone.sh
++++ mozilla-release//dev/null
+@@ -1,16 +0,0 @@
+-#!/bin/bash
+-
+-REV=4560cb830fce63fcffdc4558f4281aaac6a3a1ba
+-
+-set -euo pipefail
+-cd "$(dirname "${BASH_SOURCE[0]}")"
+-mkdir -p rust
+-touch rust/COMMIT
+-
+-if [ "$(cat rust/COMMIT)" != "$REV" ]; then
+- rm -rf rust
+- mkdir rust
+- curl -L "https://github.com/rust-lang/rust/archive/${REV}.tar.gz" \
+- | tar xz --directory rust --strip-components 1
+- echo "$REV" > rust/COMMIT
+-fi
+diff --git a/third_party/rust/syn/tests/common/eq.rs b/third_party/rust/syn/tests/common/eq.rs
+index 13a6c36ae5..7589a07573 100644
+--- mozilla-release/third_party/rust/syn/tests/common/eq.rs
++++ mozilla-release/third_party/rust/syn/tests/common/eq.rs
+@@ -1,36 +1,35 @@
++extern crate rustc_ast;
+ extern crate rustc_data_structures;
++extern crate rustc_span;
+ extern crate rustc_target;
+-extern crate syntax;
+-extern crate syntax_pos;
+
+ use std::mem;
+
+-use self::rustc_data_structures::sync::Lrc;
+-use self::rustc_data_structures::thin_vec::ThinVec;
+-use self::rustc_target::abi::FloatTy;
+-use self::rustc_target::spec::abi::Abi;
+-use self::syntax::ast::{
+- AngleBracketedArgs, AnonConst, Arg, Arm, AsmDialect, AssocTyConstraint, AssocTyConstraintKind,
+- AttrId, AttrStyle, Attribute, BareFnTy, BinOpKind, BindingMode, Block, BlockCheckMode,
+- CaptureBy, Constness, Crate, CrateSugar, Defaultness, EnumDef, Expr, ExprKind, Field, FieldPat,
+- FnDecl, FnHeader, ForeignItem, ForeignItemKind, ForeignMod, FunctionRetTy, GenericArg,
+- GenericArgs, GenericBound, GenericParam, GenericParamKind, Generics, GlobalAsm, Ident,
+- ImplItem, ImplItemKind, ImplPolarity, InlineAsm, InlineAsmOutput, IntTy, IsAsync, IsAuto, Item,
+- ItemKind, Label, Lifetime, Lit, LitIntType, LitKind, Local, Mac, MacDelimiter, MacStmtStyle,
+- MacroDef, MethodSig, Mod, Movability, MutTy, Mutability, NodeId, ParenthesizedArgs, Pat,
+- PatKind, Path, PathSegment, PolyTraitRef, QSelf, RangeEnd, RangeLimits, RangeSyntax, Stmt,
+- StmtKind, StrStyle, StructField, TraitBoundModifier, TraitItem, TraitItemKind,
+- TraitObjectSyntax, TraitRef, Ty, TyKind, UintTy, UnOp, UnsafeSource, Unsafety, UseTree,
+- UseTreeKind, Variant, VariantData, VisibilityKind, WhereBoundPredicate, WhereClause,
+- WhereEqPredicate, WherePredicate, WhereRegionPredicate,
++use rustc_ast::ast::{
++ AngleBracketedArg, AngleBracketedArgs, AnonConst, Arm, AssocItemKind, AssocTyConstraint,
++ AssocTyConstraintKind, Async, AttrId, AttrItem, AttrKind, AttrStyle, Attribute, BareFnTy,
++ BinOpKind, BindingMode, Block, BlockCheckMode, BorrowKind, CaptureBy, Const, Crate, CrateSugar,
++ Defaultness, EnumDef, Expr, ExprKind, Extern, Field, FieldPat, FloatTy, FnDecl, FnHeader,
++ FnRetTy, FnSig, ForeignItemKind, ForeignMod, GenericArg, GenericArgs, GenericBound,
++ GenericParam, GenericParamKind, Generics, GlobalAsm, ImplPolarity, InlineAsm, InlineAsmOperand,
++ InlineAsmOptions, InlineAsmRegOrRegClass, InlineAsmTemplatePiece, IntTy, IsAuto, Item,
++ ItemKind, Label, Lifetime, Lit, LitFloatType, LitIntType, LitKind, LlvmAsmDialect,
++ LlvmInlineAsm, LlvmInlineAsmOutput, Local, MacArgs, MacCall, MacCallStmt, MacDelimiter,
++ MacStmtStyle, MacroDef, Mod, Movability, MutTy, Mutability, NodeId, Param, ParenthesizedArgs,
++ Pat, PatKind, Path, PathSegment, PolyTraitRef, QSelf, RangeEnd, RangeLimits, RangeSyntax, Stmt,
++ StmtKind, StrLit, StrStyle, StructField, TraitBoundModifier, TraitObjectSyntax, TraitRef, Ty,
++ TyKind, UintTy, UnOp, Unsafe, UnsafeSource, UseTree, UseTreeKind, Variant, VariantData,
++ VisibilityKind, WhereBoundPredicate, WhereClause, WhereEqPredicate, WherePredicate,
++ WhereRegionPredicate,
+ };
+-use self::syntax::parse::lexer::comments;
+-use self::syntax::parse::token::{self, DelimToken, Token, TokenKind};
+-use self::syntax::ptr::P;
+-use self::syntax::source_map::Spanned;
+-use self::syntax::symbol::{sym, Symbol};
+-use self::syntax::tokenstream::{DelimSpan, TokenStream, TokenTree};
+-use self::syntax_pos::{Span, SyntaxContext, DUMMY_SP};
++use rustc_ast::ptr::P;
++use rustc_ast::token::{self, CommentKind, DelimToken, Token, TokenKind};
++use rustc_ast::tokenstream::{DelimSpan, TokenStream, TokenTree};
++use rustc_data_structures::sync::Lrc;
++use rustc_data_structures::thin_vec::ThinVec;
++use rustc_span::source_map::Spanned;
++use rustc_span::symbol::Ident;
++use rustc_span::{Span, Symbol, SyntaxContext};
+
+ pub trait SpanlessEq {
+ fn eq(&self, other: &Self) -> bool;
+@@ -86,14 +85,6 @@ impl<A: SpanlessEq, B: SpanlessEq> SpanlessEq for (A, B) {
+ }
+ }
+
+-impl<A: SpanlessEq, B: SpanlessEq, C: SpanlessEq> SpanlessEq for (A, B, C) {
+- fn eq(&self, other: &Self) -> bool {
+- SpanlessEq::eq(&self.0, &other.0)
+- && SpanlessEq::eq(&self.1, &other.1)
+- && SpanlessEq::eq(&self.2, &other.2)
+- }
+-}
+-
+ macro_rules! spanless_eq_true {
+ ($name:ident) => {
+ impl SpanlessEq for $name {
+@@ -126,17 +117,19 @@ spanless_eq_partial_eq!(u16);
+ spanless_eq_partial_eq!(u128);
+ spanless_eq_partial_eq!(usize);
+ spanless_eq_partial_eq!(char);
++spanless_eq_partial_eq!(String);
+ spanless_eq_partial_eq!(Symbol);
+-spanless_eq_partial_eq!(Abi);
++spanless_eq_partial_eq!(CommentKind);
+ spanless_eq_partial_eq!(DelimToken);
++spanless_eq_partial_eq!(InlineAsmOptions);
+
+ macro_rules! spanless_eq_struct {
+ {
+- $name:ident;
++ $name:ident $(<$param:ident>)?;
+ $([$field:ident $other:ident])*
+ $(![$ignore:ident])*
+ } => {
+- impl SpanlessEq for $name {
++ impl $(<$param: SpanlessEq>)* SpanlessEq for $name $(<$param>)* {
+ fn eq(&self, other: &Self) -> bool {
+ let $name { $($field,)* $($ignore: _,)* } = self;
+ let $name { $($field: $other,)* $($ignore: _,)* } = other;
+@@ -146,14 +139,14 @@ macro_rules! spanless_eq_struct {
+ };
+
+ {
+- $name:ident;
++ $name:ident $(<$param:ident>)?;
+ $([$field:ident $other:ident])*
+ $next:ident
+ $($rest:ident)*
+ $(!$ignore:ident)*
+ } => {
+ spanless_eq_struct! {
+- $name;
++ $name $(<$param>)*;
+ $([$field $other])*
+ [$next other]
+ $($rest)*
+@@ -162,14 +155,14 @@ macro_rules! spanless_eq_struct {
+ };
+
+ {
+- $name:ident;
++ $name:ident $(<$param:ident>)?;
+ $([$field:ident $other:ident])*
+ $(![$ignore:ident])*
+ !$next:ident
+ $(!$rest:ident)*
+ } => {
+ spanless_eq_struct! {
+- $name;
++ $name $(<$param>)*;
+ $([$field $other])*
+ $(![$ignore])*
+ ![$next]
+@@ -263,119 +256,131 @@ macro_rules! spanless_eq_enum {
+ };
+ }
+
+-spanless_eq_struct!(AngleBracketedArgs; span args constraints);
++spanless_eq_struct!(AngleBracketedArgs; span args);
+ spanless_eq_struct!(AnonConst; id value);
+-spanless_eq_struct!(Arg; attrs ty pat id span);
+-spanless_eq_struct!(Arm; attrs pats guard body span id);
++spanless_eq_struct!(Arm; attrs pat guard body span id is_placeholder);
+ spanless_eq_struct!(AssocTyConstraint; id ident kind span);
+-spanless_eq_struct!(Attribute; id style path tokens span !is_sugared_doc);
+-spanless_eq_struct!(BareFnTy; unsafety abi generic_params decl);
++spanless_eq_struct!(AttrItem; path args);
++spanless_eq_struct!(Attribute; kind id style span);
++spanless_eq_struct!(BareFnTy; unsafety ext generic_params decl);
+ spanless_eq_struct!(Block; stmts id rules span);
+-spanless_eq_struct!(Crate; module attrs span);
++spanless_eq_struct!(Crate; module attrs span proc_macros);
+ spanless_eq_struct!(EnumDef; variants);
+-spanless_eq_struct!(Expr; id node span attrs);
+-spanless_eq_struct!(Field; ident expr span is_shorthand attrs id);
+-spanless_eq_struct!(FieldPat; ident pat is_shorthand attrs id span);
+-spanless_eq_struct!(FnDecl; inputs output c_variadic);
+-spanless_eq_struct!(FnHeader; constness asyncness unsafety abi);
+-spanless_eq_struct!(ForeignItem; ident attrs node id span vis);
++spanless_eq_struct!(Expr; id kind span attrs !tokens);
++spanless_eq_struct!(Field; attrs id span ident expr is_shorthand is_placeholder);
++spanless_eq_struct!(FieldPat; ident pat is_shorthand attrs id span is_placeholder);
++spanless_eq_struct!(FnDecl; inputs output);
++spanless_eq_struct!(FnHeader; constness asyncness unsafety ext);
++spanless_eq_struct!(FnSig; header decl span);
+ spanless_eq_struct!(ForeignMod; abi items);
+-spanless_eq_struct!(GenericParam; id ident attrs bounds kind);
++spanless_eq_struct!(GenericParam; id ident attrs bounds is_placeholder kind);
+ spanless_eq_struct!(Generics; params where_clause span);
+ spanless_eq_struct!(GlobalAsm; asm);
+-spanless_eq_struct!(ImplItem; id ident vis defaultness attrs generics node span !tokens);
+-spanless_eq_struct!(InlineAsm; asm asm_str_style outputs inputs clobbers volatile alignstack dialect);
+-spanless_eq_struct!(InlineAsmOutput; constraint expr is_rw is_indirect);
+-spanless_eq_struct!(Item; ident attrs id node vis span !tokens);
++spanless_eq_struct!(InlineAsm; template operands options line_spans);
++spanless_eq_struct!(Item<K>; attrs id span vis ident kind !tokens);
+ spanless_eq_struct!(Label; ident);
+ spanless_eq_struct!(Lifetime; id ident);
+-spanless_eq_struct!(Lit; token node span);
++spanless_eq_struct!(Lit; token kind span);
++spanless_eq_struct!(LlvmInlineAsm; asm asm_str_style outputs inputs clobbers volatile alignstack dialect);
++spanless_eq_struct!(LlvmInlineAsmOutput; constraint expr is_rw is_indirect);
+ spanless_eq_struct!(Local; pat ty init id span attrs);
+-spanless_eq_struct!(Mac; path delim tts span prior_type_ascription);
+-spanless_eq_struct!(MacroDef; tokens legacy);
+-spanless_eq_struct!(MethodSig; header decl);
++spanless_eq_struct!(MacCall; path args prior_type_ascription);
++spanless_eq_struct!(MacCallStmt; mac style attrs);
++spanless_eq_struct!(MacroDef; body macro_rules);
+ spanless_eq_struct!(Mod; inner items inline);
+ spanless_eq_struct!(MutTy; ty mutbl);
++spanless_eq_struct!(Param; attrs ty pat id span is_placeholder);
+ spanless_eq_struct!(ParenthesizedArgs; span inputs output);
+-spanless_eq_struct!(Pat; id node span);
++spanless_eq_struct!(Pat; id kind span tokens);
+ spanless_eq_struct!(Path; span segments);
+ spanless_eq_struct!(PathSegment; ident id args);
+ spanless_eq_struct!(PolyTraitRef; bound_generic_params trait_ref span);
+ spanless_eq_struct!(QSelf; ty path_span position);
+-spanless_eq_struct!(Stmt; id node span);
+-spanless_eq_struct!(StructField; span ident vis id ty attrs);
++spanless_eq_struct!(Stmt; id kind span);
++spanless_eq_struct!(StrLit; style symbol suffix span symbol_unescaped);
++spanless_eq_struct!(StructField; attrs id span vis ident ty is_placeholder);
+ spanless_eq_struct!(Token; kind span);
+-spanless_eq_struct!(TraitItem; id ident attrs generics node span !tokens);
+ spanless_eq_struct!(TraitRef; path ref_id);
+-spanless_eq_struct!(Ty; id node span);
++spanless_eq_struct!(Ty; id kind span);
+ spanless_eq_struct!(UseTree; prefix kind span);
+-spanless_eq_struct!(Variant; ident attrs id data disr_expr span);
++spanless_eq_struct!(Variant; attrs id span vis ident data disr_expr is_placeholder);
+ spanless_eq_struct!(WhereBoundPredicate; span bound_generic_params bounded_ty bounds);
+-spanless_eq_struct!(WhereClause; predicates span);
++spanless_eq_struct!(WhereClause; has_where_token predicates span);
+ spanless_eq_struct!(WhereEqPredicate; id span lhs_ty rhs_ty);
+ spanless_eq_struct!(WhereRegionPredicate; span lifetime bounds);
+-spanless_eq_enum!(AsmDialect; Att Intel);
++spanless_eq_enum!(AngleBracketedArg; Arg(0) Constraint(0));
++spanless_eq_enum!(AssocItemKind; Const(0 1 2) Fn(0 1 2 3) TyAlias(0 1 2 3) MacCall(0));
+ spanless_eq_enum!(AssocTyConstraintKind; Equality(ty) Bound(bounds));
++spanless_eq_enum!(Async; Yes(span closure_id return_impl_trait_id) No);
++spanless_eq_enum!(AttrKind; Normal(0) DocComment(0 1));
+ spanless_eq_enum!(AttrStyle; Outer Inner);
+ spanless_eq_enum!(BinOpKind; Add Sub Mul Div Rem And Or BitXor BitAnd BitOr Shl Shr Eq Lt Le Ne Ge Gt);
+ spanless_eq_enum!(BindingMode; ByRef(0) ByValue(0));
+ spanless_eq_enum!(BlockCheckMode; Default Unsafe(0));
++spanless_eq_enum!(BorrowKind; Ref Raw);
+ spanless_eq_enum!(CaptureBy; Value Ref);
+-spanless_eq_enum!(Constness; Const NotConst);
++spanless_eq_enum!(Const; Yes(0) No);
+ spanless_eq_enum!(CrateSugar; PubCrate JustCrate);
+-spanless_eq_enum!(Defaultness; Default Final);
++spanless_eq_enum!(Defaultness; Default(0) Final);
++spanless_eq_enum!(Extern; None Implicit Explicit(0));
+ spanless_eq_enum!(FloatTy; F32 F64);
+-spanless_eq_enum!(ForeignItemKind; Fn(0 1) Static(0 1) Ty Macro(0));
+-spanless_eq_enum!(FunctionRetTy; Default(0) Ty(0));
++spanless_eq_enum!(FnRetTy; Default(0) Ty(0));
++spanless_eq_enum!(ForeignItemKind; Static(0 1 2) Fn(0 1 2 3) TyAlias(0 1 2 3) MacCall(0));
+ spanless_eq_enum!(GenericArg; Lifetime(0) Type(0) Const(0));
+ spanless_eq_enum!(GenericArgs; AngleBracketed(0) Parenthesized(0));
+ spanless_eq_enum!(GenericBound; Trait(0 1) Outlives(0));
+-spanless_eq_enum!(GenericParamKind; Lifetime Type(default) Const(ty));
+-spanless_eq_enum!(ImplItemKind; Const(0 1) Method(0 1) TyAlias(0) OpaqueTy(0) Macro(0));
+-spanless_eq_enum!(ImplPolarity; Positive Negative);
++spanless_eq_enum!(GenericParamKind; Lifetime Type(default) Const(ty kw_span));
++spanless_eq_enum!(ImplPolarity; Positive Negative(0));
++spanless_eq_enum!(InlineAsmRegOrRegClass; Reg(0) RegClass(0));
++spanless_eq_enum!(InlineAsmTemplatePiece; String(0) Placeholder(operand_idx modifier span));
+ spanless_eq_enum!(IntTy; Isize I8 I16 I32 I64 I128);
+-spanless_eq_enum!(IsAsync; Async(closure_id return_impl_trait_id) NotAsync);
+ spanless_eq_enum!(IsAuto; Yes No);
++spanless_eq_enum!(LitFloatType; Suffixed(0) Unsuffixed);
+ spanless_eq_enum!(LitIntType; Signed(0) Unsigned(0) Unsuffixed);
++spanless_eq_enum!(LlvmAsmDialect; Att Intel);
++spanless_eq_enum!(MacArgs; Empty Delimited(0 1 2) Eq(0 1));
+ spanless_eq_enum!(MacDelimiter; Parenthesis Bracket Brace);
+ spanless_eq_enum!(MacStmtStyle; Semicolon Braces NoBraces);
+ spanless_eq_enum!(Movability; Static Movable);
+-spanless_eq_enum!(Mutability; Mutable Immutable);
++spanless_eq_enum!(Mutability; Mut Not);
+ spanless_eq_enum!(RangeEnd; Included(0) Excluded);
+ spanless_eq_enum!(RangeLimits; HalfOpen Closed);
+-spanless_eq_enum!(StmtKind; Local(0) Item(0) Expr(0) Semi(0) Mac(0));
++spanless_eq_enum!(StmtKind; Local(0) Item(0) Expr(0) Semi(0) Empty MacCall(0));
+ spanless_eq_enum!(StrStyle; Cooked Raw(0));
+ spanless_eq_enum!(TokenTree; Token(0) Delimited(0 1 2));
+-spanless_eq_enum!(TraitBoundModifier; None Maybe);
+-spanless_eq_enum!(TraitItemKind; Const(0 1) Method(0 1) Type(0 1) Macro(0));
++spanless_eq_enum!(TraitBoundModifier; None Maybe MaybeConst MaybeConstMaybe);
+ spanless_eq_enum!(TraitObjectSyntax; Dyn None);
+ spanless_eq_enum!(UintTy; Usize U8 U16 U32 U64 U128);
+ spanless_eq_enum!(UnOp; Deref Not Neg);
++spanless_eq_enum!(Unsafe; Yes(0) No);
+ spanless_eq_enum!(UnsafeSource; CompilerGenerated UserProvided);
+-spanless_eq_enum!(Unsafety; Unsafe Normal);
+ spanless_eq_enum!(UseTreeKind; Simple(0 1 2) Nested(0) Glob);
+ spanless_eq_enum!(VariantData; Struct(0 1) Tuple(0 1) Unit(0));
+ spanless_eq_enum!(VisibilityKind; Public Crate(0) Restricted(path id) Inherited);
+ spanless_eq_enum!(WherePredicate; BoundPredicate(0) RegionPredicate(0) EqPredicate(0));
+-spanless_eq_enum!(ExprKind; Box(0) Array(0) Call(0 1) MethodCall(0 1) Tup(0)
++spanless_eq_enum!(ExprKind; Box(0) Array(0) Call(0 1) MethodCall(0 1 2) Tup(0)
+ Binary(0 1 2) Unary(0 1) Lit(0) Cast(0 1) Type(0 1) Let(0 1) If(0 1 2)
+ While(0 1 2) ForLoop(0 1 2 3) Loop(0 1) Match(0 1) Closure(0 1 2 3 4 5)
+- Block(0 1) Async(0 1 2) Await(0) TryBlock(0) Assign(0 1) AssignOp(0 1 2)
+- Field(0 1) Index(0 1) Range(0 1 2) Path(0 1) AddrOf(0 1) Break(0 1)
+- Continue(0) Ret(0) InlineAsm(0) Mac(0) Struct(0 1 2) Repeat(0 1) Paren(0)
+- Try(0) Yield(0) Err);
+-spanless_eq_enum!(ItemKind; ExternCrate(0) Use(0) Static(0 1 2) Const(0 1)
+- Fn(0 1 2 3) Mod(0) ForeignMod(0) GlobalAsm(0) TyAlias(0 1) OpaqueTy(0 1)
+- Enum(0 1) Struct(0 1) Union(0 1) Trait(0 1 2 3 4) TraitAlias(0 1)
+- Impl(0 1 2 3 4 5 6) Mac(0) MacroDef(0));
++ Block(0 1) Async(0 1 2) Await(0) TryBlock(0) Assign(0 1 2) AssignOp(0 1 2)
++ Field(0 1) Index(0 1) Range(0 1 2) Path(0 1) AddrOf(0 1 2) Break(0 1)
++ Continue(0) Ret(0) InlineAsm(0) LlvmInlineAsm(0) MacCall(0) Struct(0 1 2)
++ Repeat(0 1) Paren(0) Try(0) Yield(0) Err);
++spanless_eq_enum!(InlineAsmOperand; In(reg expr) Out(reg late expr)
++ InOut(reg late expr) SplitInOut(reg late in_expr out_expr) Const(expr)
++ Sym(expr));
++spanless_eq_enum!(ItemKind; ExternCrate(0) Use(0) Static(0 1 2) Const(0 1 2)
++ Fn(0 1 2 3) Mod(0) ForeignMod(0) GlobalAsm(0) TyAlias(0 1 2 3) Enum(0 1)
++ Struct(0 1) Union(0 1) Trait(0 1 2 3 4) TraitAlias(0 1)
++ Impl(unsafety polarity defaultness constness generics of_trait self_ty items)
++ MacCall(0) MacroDef(0));
+ spanless_eq_enum!(LitKind; Str(0 1) ByteStr(0) Byte(0) Char(0) Int(0 1)
+- Float(0 1) FloatUnsuffixed(0) Bool(0) Err(0));
++ Float(0 1) Bool(0) Err(0));
+ spanless_eq_enum!(PatKind; Wild Ident(0 1 2) Struct(0 1 2) TupleStruct(0 1)
+ Or(0) Path(0 1) Tuple(0) Box(0) Ref(0 1) Lit(0) Range(0 1 2) Slice(0) Rest
+- Paren(0) Mac(0));
++ Paren(0) MacCall(0));
+ spanless_eq_enum!(TyKind; Slice(0) Array(0 1) Ptr(0) Rptr(0 1) BareFn(0) Never
+ Tup(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) Paren(0) Typeof(0) Infer
+- ImplicitSelf Mac(0) Err CVarArgs);
++ ImplicitSelf MacCall(0) Err CVarArgs);
+
+ impl SpanlessEq for Ident {
+ fn eq(&self, other: &Self) -> bool {
+@@ -414,44 +419,20 @@ impl SpanlessEq for TokenKind {
+
+ impl SpanlessEq for TokenStream {
+ fn eq(&self, other: &Self) -> bool {
+- SpanlessEq::eq(&expand_tts(self), &expand_tts(other))
+- }
+-}
+-
+-fn expand_tts(tts: &TokenStream) -> Vec<TokenTree> {
+- let mut tokens = Vec::new();
+- for tt in tts.clone().into_trees() {
+- let c = match tt {
+- TokenTree::Token(Token {
+- kind: TokenKind::DocComment(c),
+- ..
+- }) => c,
+- _ => {
+- tokens.push(tt);
+- continue;
++ let mut this = self.clone().into_trees();
++ let mut other = other.clone().into_trees();
++ loop {
++ let this = match this.next() {
++ None => return other.next().is_none(),
++ Some(val) => val,
++ };
++ let other = match other.next() {
++ None => return false,
++ Some(val) => val,
++ };
++ if !SpanlessEq::eq(&this, &other) {
++ return false;
+ }
+- };
+- let contents = comments::strip_doc_comment_decoration(&c.as_str());
+- let style = comments::doc_comment_style(&c.as_str());
+- tokens.push(TokenTree::token(TokenKind::Pound, DUMMY_SP));
+- if style == AttrStyle::Inner {
+- tokens.push(TokenTree::token(TokenKind::Not, DUMMY_SP));
+ }
+- let lit = token::Lit {
+- kind: token::LitKind::Str,
+- symbol: Symbol::intern(&contents),
+- suffix: None,
+- };
+- let tts = vec![
+- TokenTree::token(TokenKind::Ident(sym::doc, false), DUMMY_SP),
+- TokenTree::token(TokenKind::Eq, DUMMY_SP),
+- TokenTree::token(TokenKind::Literal(lit), DUMMY_SP),
+- ];
+- tokens.push(TokenTree::Delimited(
+- DelimSpan::dummy(),
+- DelimToken::Bracket,
+- tts.into_iter().collect::<TokenStream>().into(),
+- ));
+ }
+- tokens
+ }
+diff --git a/third_party/rust/syn/tests/common/mod.rs b/third_party/rust/syn/tests/common/mod.rs
+index 8b784beed7..a1cc80a16f 100644
+--- mozilla-release/third_party/rust/syn/tests/common/mod.rs
++++ mozilla-release/third_party/rust/syn/tests/common/mod.rs
+@@ -1,5 +1,6 @@
+ #![allow(dead_code)]
+
++use rayon::ThreadPoolBuilder;
+ use std::env;
+
+ pub mod eq;
+@@ -12,3 +13,15 @@ pub fn abort_after() -> usize {
+ Err(_) => usize::max_value(),
+ }
+ }
++
++/// Configure Rayon threadpool.
++pub fn rayon_init() {
++ let stack_size = match env::var("RUST_MIN_STACK") {
++ Ok(s) => s.parse().expect("failed to parse RUST_MIN_STACK"),
++ Err(_) => 20 * 1024 * 1024,
++ };
++ ThreadPoolBuilder::new()
++ .stack_size(stack_size)
++ .build_global()
++ .unwrap();
++}
+diff --git a/third_party/rust/syn/tests/common/parse.rs b/third_party/rust/syn/tests/common/parse.rs
+index 41d192f6fb..192828fedd 100644
+--- mozilla-release/third_party/rust/syn/tests/common/parse.rs
++++ mozilla-release/third_party/rust/syn/tests/common/parse.rs
+@@ -1,20 +1,20 @@
+-extern crate proc_macro2;
+-extern crate syn;
+-extern crate syntax;
+-extern crate syntax_pos;
++extern crate rustc_ast;
++extern crate rustc_expand;
++extern crate rustc_parse as parse;
++extern crate rustc_session;
++extern crate rustc_span;
+
+-use self::syntax::ast;
+-use self::syntax::parse::{self, ParseSess};
+-use self::syntax::ptr::P;
+-use self::syntax::source_map::FilePathMapping;
+-use self::syntax_pos::FileName;
++use rustc_ast::ast;
++use rustc_ast::ptr::P;
++use rustc_session::parse::ParseSess;
++use rustc_span::source_map::FilePathMapping;
++use rustc_span::FileName;
+
+ use std::panic;
+
+-pub fn libsyntax_expr(input: &str) -> Option<P<ast::Expr>> {
++pub fn librustc_expr(input: &str) -> Option<P<ast::Expr>> {
+ match panic::catch_unwind(|| {
+ let sess = ParseSess::new(FilePathMapping::empty());
+- sess.span_diagnostic.set_continue_after_error(false);
+ let e = parse::new_parser_from_source_str(
+ &sess,
+ FileName::Custom("test_precedence".to_string()),
+@@ -32,7 +32,7 @@ pub fn libsyntax_expr(input: &str) -> Option<P<ast::Expr>> {
+ Ok(Some(e)) => Some(e),
+ Ok(None) => None,
+ Err(_) => {
+- errorf!("libsyntax panicked\n");
++ errorf!("librustc panicked\n");
+ None
+ }
+ }
+diff --git a/third_party/rust/syn/tests/debug/gen.rs b/third_party/rust/syn/tests/debug/gen.rs
+index 8450c09ecf..85a1a39079 100644
+--- mozilla-release/third_party/rust/syn/tests/debug/gen.rs
++++ mozilla-release/third_party/rust/syn/tests/debug/gen.rs
+@@ -2,7 +2,7 @@
+ // It is not intended for manual editing.
+
+ use super::{Lite, RefCast};
+-use std::fmt::{self, Debug};
++use std::fmt::{self, Debug, Display};
+ impl Debug for Lite<syn::Abi> {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ let _val = &self.value;
+@@ -1039,9 +1039,9 @@ impl Debug for Lite<syn::Expr> {
+ }
+ syn::Expr::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ syn::Expr::While(_val) => {
+@@ -2116,9 +2116,9 @@ impl Debug for Lite<syn::ForeignItem> {
+ }
+ syn::ForeignItem::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ _ => unreachable!(),
+@@ -2432,9 +2432,9 @@ impl Debug for Lite<syn::ImplItem> {
+ }
+ syn::ImplItem::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ _ => unreachable!(),
+@@ -2940,9 +2940,9 @@ impl Debug for Lite<syn::Item> {
+ }
+ syn::Item::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ _ => unreachable!(),
+@@ -3437,9 +3437,9 @@ impl Debug for Lite<syn::Lit> {
+ }
+ syn::Lit::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ }
+@@ -3878,9 +3878,9 @@ impl Debug for Lite<syn::Pat> {
+ }
+ syn::Pat::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ syn::Pat::Wild(_val) => {
+@@ -4674,9 +4674,9 @@ impl Debug for Lite<syn::TraitItem> {
+ }
+ syn::TraitItem::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ _ => unreachable!(),
+@@ -5040,9 +5040,9 @@ impl Debug for Lite<syn::Type> {
+ }
+ syn::Type::Verbatim(_val) => {
+ formatter.write_str("Verbatim")?;
+- formatter.write_str("(")?;
+- Debug::fmt(Lite(_val), formatter)?;
+- formatter.write_str(")")?;
++ formatter.write_str("(`")?;
++ Display::fmt(_val, formatter)?;
++ formatter.write_str("`)")?;
+ Ok(())
+ }
+ _ => unreachable!(),
+diff --git a/third_party/rust/syn/tests/debug/mod.rs b/third_party/rust/syn/tests/debug/mod.rs
+index c1180532ec..cefebacef7 100644
+--- mozilla-release/third_party/rust/syn/tests/debug/mod.rs
++++ mozilla-release/third_party/rust/syn/tests/debug/mod.rs
+@@ -1,10 +1,7 @@
+-extern crate proc_macro2;
+-extern crate ref_cast;
+-
+ mod gen;
+
+-use self::proc_macro2::{Ident, Literal, TokenStream};
+-use self::ref_cast::RefCast;
++use proc_macro2::{Ident, Literal, TokenStream};
++use ref_cast::RefCast;
+ use std::fmt::{self, Debug};
+ use std::ops::Deref;
+ use syn::punctuated::Punctuated;
+@@ -66,7 +63,15 @@ impl Debug for Lite<Literal> {
+
+ impl Debug for Lite<TokenStream> {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+- write!(formatter, "`{}`", self.value)
++ let string = self.value.to_string();
++ if string.len() <= 80 {
++ write!(formatter, "TokenStream(`{}`)", self.value)
++ } else {
++ formatter
++ .debug_tuple("TokenStream")
++ .field(&format_args!("`{}`", string))
++ .finish()
++ }
+ }
+ }
+
+diff --git a/third_party/rust/syn/tests/features/error.rs b/third_party/rust/syn/tests/features/error.rs
+deleted file mode 100644
+index 10ac88965d..0000000000
+--- mozilla-release/third_party/rust/syn/tests/features/error.rs
++++ mozilla-release//dev/null
+@@ -1 +0,0 @@
+-"Hello! You want: cargo test --release --all-features"
+diff --git a/third_party/rust/syn/tests/features/mod.rs b/third_party/rust/syn/tests/features/mod.rs
+deleted file mode 100644
+index 83fbe13e7e..0000000000
+--- mozilla-release/third_party/rust/syn/tests/features/mod.rs
++++ mozilla-release//dev/null
+@@ -1,22 +0,0 @@
+-#[allow(unused_macros)]
+-macro_rules! hide_from_rustfmt {
+- ($mod:item) => {
+- $mod
+- };
+-}
+-
+-#[cfg(not(all(
+- feature = "derive",
+- feature = "full",
+- feature = "parsing",
+- feature = "printing",
+- feature = "visit",
+- feature = "visit-mut",
+- feature = "fold",
+- feature = "clone-impls",
+- feature = "extra-traits",
+- feature = "proc-macro",
+-)))]
+-hide_from_rustfmt! {
+- mod error;
+-}
+diff --git a/third_party/rust/syn/tests/macros/mod.rs b/third_party/rust/syn/tests/macros/mod.rs
+index c72fd01058..3994615fc4 100644
+--- mozilla-release/third_party/rust/syn/tests/macros/mod.rs
++++ mozilla-release/third_party/rust/syn/tests/macros/mod.rs
+@@ -1,5 +1,3 @@
+-extern crate proc_macro2;
+-
+ #[path = "../debug/mod.rs"]
+ pub mod debug;
+
+@@ -42,18 +40,18 @@ macro_rules! snapshot_impl {
+ (($expr:ident) as $t:ty, @$snapshot:literal) => {
+ let $expr = crate::macros::Tokens::parse::<$t>($expr).unwrap();
+ let debug = crate::macros::debug::Lite(&$expr);
+- insta::assert_debug_snapshot_matches!(debug, @$snapshot);
++ insta::assert_debug_snapshot!(debug, @$snapshot);
+ };
+ (($($expr:tt)*) as $t:ty, @$snapshot:literal) => {{
+ let syntax_tree = crate::macros::Tokens::parse::<$t>($($expr)*).unwrap();
+ let debug = crate::macros::debug::Lite(&syntax_tree);
+- insta::assert_debug_snapshot_matches!(debug, @$snapshot);
++ insta::assert_debug_snapshot!(debug, @$snapshot);
+ syntax_tree
+ }};
+ (($($expr:tt)*) , @$snapshot:literal) => {{
+ let syntax_tree = $($expr)*;
+ let debug = crate::macros::debug::Lite(&syntax_tree);
+- insta::assert_debug_snapshot_matches!(debug, @$snapshot);
++ insta::assert_debug_snapshot!(debug, @$snapshot);
+ syntax_tree
+ }};
+ (($($expr:tt)*) $next:tt $($rest:tt)*) => {
+diff --git a/third_party/rust/syn/tests/repo/mod.rs b/third_party/rust/syn/tests/repo/mod.rs
+index c22cb03758..1d3e1f0e74 100644
+--- mozilla-release/third_party/rust/syn/tests/repo/mod.rs
++++ mozilla-release/third_party/rust/syn/tests/repo/mod.rs
+@@ -1,8 +1,37 @@
+-extern crate walkdir;
++mod progress;
+
+-use std::process::Command;
++use self::progress::Progress;
++use anyhow::Result;
++use flate2::read::GzDecoder;
++use std::fs;
++use std::path::Path;
++use tar::Archive;
++use walkdir::DirEntry;
+
+-use self::walkdir::DirEntry;
++const REVISION: &str = "792c645ca7d11a8d254df307d019c5bf01445c37";
++
++#[rustfmt::skip]
++static EXCLUDE: &[&str] = &[
++ // Compile-fail expr parameter in const generic position: f::<1 + 2>()
++ "test/ui/const-generics/const-expression-parameter.rs",
++
++ // Deprecated anonymous parameter syntax in traits
++ "test/ui/issues/issue-13105.rs",
++ "test/ui/issues/issue-13775.rs",
++ "test/ui/issues/issue-34074.rs",
++ "test/ui/proc-macro/trait-fn-args-2015.rs",
++
++ // Not actually test cases
++ "test/rustdoc-ui/test-compile-fail2.rs",
++ "test/rustdoc-ui/test-compile-fail3.rs",
++ "test/ui/include-single-expr-helper.rs",
++ "test/ui/include-single-expr-helper-1.rs",
++ "test/ui/issues/auxiliary/issue-21146-inc.rs",
++ "test/ui/json-bom-plus-crlf-multifile-aux.rs",
++ "test/ui/lint/expansion-time-include.rs",
++ "test/ui/macros/auxiliary/macro-comma-support.rs",
++ "test/ui/macros/auxiliary/macro-include-items-expr.rs",
++];
+
+ pub fn base_dir_filter(entry: &DirEntry) -> bool {
+ let path = entry.path();
+@@ -12,49 +41,95 @@ pub fn base_dir_filter(entry: &DirEntry) -> bool {
+ if path.extension().map(|e| e != "rs").unwrap_or(true) {
+ return false;
+ }
+- let path_string = path.to_string_lossy();
+- let path_string = if cfg!(windows) {
+- path_string.replace('\\', "/").into()
++
++ let mut path_string = path.to_string_lossy();
++ if cfg!(windows) {
++ path_string = path_string.replace('\\', "/").into();
++ }
++ let path = if let Some(path) = path_string.strip_prefix("tests/rust/src/") {
++ path
++ } else if let Some(path) = path_string.strip_prefix("tests/rust/library/") {
++ path
+ } else {
+- path_string
++ panic!("unexpected path in Rust dist: {}", path_string);
+ };
++
+ // TODO assert that parsing fails on the parse-fail cases
+- if path_string.starts_with("tests/rust/src/test/parse-fail")
+- || path_string.starts_with("tests/rust/src/test/compile-fail")
+- || path_string.starts_with("tests/rust/src/test/rustfix")
++ if path.starts_with("test/parse-fail")
++ || path.starts_with("test/compile-fail")
++ || path.starts_with("test/rustfix")
+ {
+ return false;
+ }
+
+- if path_string.starts_with("tests/rust/src/test/ui") {
+- let stderr_path = path.with_extension("stderr");
++ if path.starts_with("test/ui") {
++ let stderr_path = entry.path().with_extension("stderr");
+ if stderr_path.exists() {
+ // Expected to fail in some way
+ return false;
+ }
+ }
+
+- match path_string.as_ref() {
+- // Deprecated placement syntax
+- "tests/rust/src/test/ui/obsolete-in-place/bad.rs" |
+- // Deprecated anonymous parameter syntax in traits
+- "tests/rust/src/test/ui/error-codes/e0119/auxiliary/issue-23563-a.rs" |
+- "tests/rust/src/test/ui/issues/issue-13105.rs" |
+- "tests/rust/src/test/ui/issues/issue-13775.rs" |
+- "tests/rust/src/test/ui/issues/issue-34074.rs" |
+- // Deprecated await macro syntax
+- "tests/rust/src/test/ui/async-await/await-macro.rs" |
+- // 2015-style dyn that libsyntax rejects
+- "tests/rust/src/test/ui/dyn-keyword/dyn-2015-no-warnings-without-lints.rs" |
+- // not actually test cases
+- "tests/rust/src/test/ui/macros/auxiliary/macro-comma-support.rs" |
+- "tests/rust/src/test/ui/macros/auxiliary/macro-include-items-expr.rs" |
+- "tests/rust/src/test/ui/issues/auxiliary/issue-21146-inc.rs" => false,
+- _ => true,
++ !EXCLUDE.contains(&path)
++}
++
++#[allow(dead_code)]
++pub fn edition(path: &Path) -> &'static str {
++ if path.ends_with("dyn-2015-no-warnings-without-lints.rs") {
++ "2015"
++ } else {
++ "2018"
+ }
+ }
+
+ pub fn clone_rust() {
+- let result = Command::new("tests/clone.sh").status().unwrap();
+- assert!(result.success());
++ let needs_clone = match fs::read_to_string("tests/rust/COMMIT") {
++ Err(_) => true,
++ Ok(contents) => contents.trim() != REVISION,
++ };
++ if needs_clone {
++ download_and_unpack().unwrap();
++ }
++ let mut missing = String::new();
++ let test_src = Path::new("tests/rust/src");
++ for exclude in EXCLUDE {
++ if !test_src.join(exclude).exists() {
++ missing += "\ntests/rust/src/";
++ missing += exclude;
++ }
++ }
++ if !missing.is_empty() {
++ panic!("excluded test file does not exist:{}\n", missing);
++ }
++}
++
++fn download_and_unpack() -> Result<()> {
++ let url = format!(
++ "https://github.com/rust-lang/rust/archive/{}.tar.gz",
++ REVISION
++ );
++ let response = reqwest::blocking::get(&url)?.error_for_status()?;
++ let progress = Progress::new(response);
++ let decoder = GzDecoder::new(progress);
++ let mut archive = Archive::new(decoder);
++ let prefix = format!("rust-{}", REVISION);
++
++ let tests_rust = Path::new("tests/rust");
++ if tests_rust.exists() {
++ fs::remove_dir_all(tests_rust)?;
++ }
++
++ for entry in archive.entries()? {
++ let mut entry = entry?;
++ let path = entry.path()?;
++ if path == Path::new("pax_global_header") {
++ continue;
++ }
++ let relative = path.strip_prefix(&prefix)?;
++ let out = tests_rust.join(relative);
++ entry.unpack(&out)?;
++ }
++
++ fs::write("tests/rust/COMMIT", REVISION)?;
++ Ok(())
+ }
+diff --git a/third_party/rust/syn/tests/repo/progress.rs b/third_party/rust/syn/tests/repo/progress.rs
+new file mode 100644
+index 0000000000..28c8a44b12
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/repo/progress.rs
+@@ -0,0 +1,37 @@
++use std::io::{Read, Result};
++use std::time::{Duration, Instant};
++
++pub struct Progress<R> {
++ bytes: usize,
++ tick: Instant,
++ stream: R,
++}
++
++impl<R> Progress<R> {
++ pub fn new(stream: R) -> Self {
++ Progress {
++ bytes: 0,
++ tick: Instant::now() + Duration::from_millis(2000),
++ stream,
++ }
++ }
++}
++
++impl<R: Read> Read for Progress<R> {
++ fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
++ let num = self.stream.read(buf)?;
++ self.bytes += num;
++ let now = Instant::now();
++ if now > self.tick {
++ self.tick = now + Duration::from_millis(500);
++ errorf!("downloading... {} bytes\n", self.bytes);
++ }
++ Ok(num)
++ }
++}
++
++impl<R> Drop for Progress<R> {
++ fn drop(&mut self) {
++ errorf!("done ({} bytes)\n", self.bytes);
++ }
++}
+diff --git a/third_party/rust/syn/tests/test_asyncness.rs b/third_party/rust/syn/tests/test_asyncness.rs
+index f868fbcc20..0efef5976f 100644
+--- mozilla-release/third_party/rust/syn/tests/test_asyncness.rs
++++ mozilla-release/third_party/rust/syn/tests/test_asyncness.rs
+@@ -1,7 +1,3 @@
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -12,16 +8,16 @@ fn test_async_fn() {
+ let input = "async fn process() {}";
+
+ snapshot!(input as Item, @r###"
+- â‹®Item::Fn {
+- â‹® vis: Inherited,
+- â‹® sig: Signature {
+- â‹® asyncness: Some,
+- â‹® ident: "process",
+- â‹® generics: Generics,
+- â‹® output: Default,
+- â‹® },
+- â‹® block: Block,
+- â‹®}
++ Item::Fn {
++ vis: Inherited,
++ sig: Signature {
++ asyncness: Some,
++ ident: "process",
++ generics: Generics,
++ output: Default,
++ },
++ block: Block,
++ }
+ "###);
+ }
+
+@@ -30,12 +26,12 @@ fn test_async_closure() {
+ let input = "async || {}";
+
+ snapshot!(input as Expr, @r###"
+- â‹®Expr::Closure {
+- â‹® asyncness: Some,
+- â‹® output: Default,
+- â‹® body: Expr::Block {
+- â‹® block: Block,
+- â‹® },
+- â‹®}
++ Expr::Closure {
++ asyncness: Some,
++ output: Default,
++ body: Expr::Block {
++ block: Block,
++ },
++ }
+ "###);
+ }
+diff --git a/third_party/rust/syn/tests/test_attribute.rs b/third_party/rust/syn/tests/test_attribute.rs
+index aff6294fc3..c26bd090ec 100644
+--- mozilla-release/third_party/rust/syn/tests/test_attribute.rs
++++ mozilla-release/third_party/rust/syn/tests/test_attribute.rs
+@@ -1,7 +1,3 @@
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -13,14 +9,14 @@ fn test_meta_item_word() {
+ let meta = test("#[foo]");
+
+ snapshot!(meta, @r###"
+- â‹®Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹®})
++ Path(Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ })
+ "###);
+ }
+
+@@ -29,17 +25,17 @@ fn test_meta_item_name_value() {
+ let meta = test("#[foo = 5]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+ }
+
+@@ -48,37 +44,37 @@ fn test_meta_item_bool_value() {
+ let meta = test("#[foo = true]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: Lit::Bool {
+- â‹® value: true,
+- â‹® },
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ lit: Lit::Bool {
++ value: true,
++ },
++ }
+ "###);
+
+ let meta = test("#[foo = false]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: Lit::Bool {
+- â‹® value: false,
+- â‹® },
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ lit: Lit::Bool {
++ value: false,
++ },
++ }
+ "###);
+ }
+
+@@ -87,19 +83,19 @@ fn test_meta_item_list_lit() {
+ let meta = test("#[foo(5)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Lit(5),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Lit(5),
++ ],
++ }
+ "###);
+ }
+
+@@ -108,26 +104,26 @@ fn test_meta_item_list_word() {
+ let meta = test("#[foo(bar)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "bar",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "bar",
++ arguments: None,
++ },
++ ],
++ })),
++ ],
++ }
+ "###);
+ }
+
+@@ -136,29 +132,29 @@ fn test_meta_item_list_name_value() {
+ let meta = test("#[foo(bar = 5)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "bar",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹® }),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "bar",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }),
++ ],
++ }
+ "###);
+ }
+
+@@ -167,31 +163,31 @@ fn test_meta_item_list_bool_value() {
+ let meta = test("#[foo(bar = true)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "bar",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: Lit::Bool {
+- â‹® value: true,
+- â‹® },
+- â‹® }),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "bar",
++ arguments: None,
++ },
++ ],
++ },
++ lit: Lit::Bool {
++ value: true,
++ },
++ }),
++ ],
++ }
+ "###);
+ }
+
+@@ -200,68 +196,68 @@ fn test_meta_item_multiple() {
+ let meta = test("#[foo(word, name = 5, list(name2 = 6), word2)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹® }),
+- â‹® Meta(Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "list",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 6,
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word",
++ arguments: None,
++ },
++ ],
++ })),
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }),
++ Meta(Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "list",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name2",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 6,
++ }),
++ ],
++ }),
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word2",
++ arguments: None,
++ },
++ ],
++ })),
++ ],
++ }
+ "###);
+ }
+
+@@ -270,21 +266,63 @@ fn test_bool_lit() {
+ let meta = test("#[foo(true)]");
+
+ snapshot!(meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Lit(Lit::Bool {
+- â‹® value: true,
+- â‹® }),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Lit(Lit::Bool {
++ value: true,
++ }),
++ ],
++ }
++ "###);
++}
++
++#[test]
++fn test_negative_lit() {
++ let meta = test("#[form(min = -1, max = 200)]");
++
++ snapshot!(meta, @r###"
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "form",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "min",
++ arguments: None,
++ },
++ ],
++ },
++ lit: -1,
++ }),
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "max",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 200,
++ }),
++ ],
++ }
+ "###);
+ }
+
+diff --git a/third_party/rust/syn/tests/test_derive_input.rs b/third_party/rust/syn/tests/test_derive_input.rs
+index de68240166..bf1ebdb67d 100644
+--- mozilla-release/third_party/rust/syn/tests/test_derive_input.rs
++++ mozilla-release/third_party/rust/syn/tests/test_derive_input.rs
+@@ -1,8 +1,3 @@
+-extern crate quote;
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -16,15 +11,15 @@ fn test_unit() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "Unit",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "Unit",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -39,105 +34,105 @@ fn test_struct() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "derive",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: `( Debug , Clone )`,
+- â‹® },
+- â‹® ],
+- â‹® vis: Visibility::Public,
+- â‹® ident: "Item",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Fields::Named {
+- â‹® named: [
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ident: Some("ident"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Ident",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ident: Some("attrs"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Vec",
+- â‹® arguments: PathArguments::AngleBracketed {
+- â‹® args: [
+- â‹® Type(Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Attribute",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® }),
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹®}
++ DeriveInput {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "derive",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(`(Debug , Clone)`),
++ },
++ ],
++ vis: Visibility::Public,
++ ident: "Item",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Named {
++ named: [
++ Field {
++ vis: Visibility::Public,
++ ident: Some("ident"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Ident",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ Field {
++ vis: Visibility::Public,
++ ident: Some("attrs"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Vec",
++ arguments: PathArguments::AngleBracketed {
++ args: [
++ Type(Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Attribute",
++ arguments: None,
++ },
++ ],
++ },
++ }),
++ ],
++ },
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ },
++ }
+ "###);
+
+ snapshot!(input.attrs[0].parse_meta().unwrap(), @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "derive",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Debug",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Clone",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "derive",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "Debug",
++ arguments: None,
++ },
++ ],
++ })),
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "Clone",
++ arguments: None,
++ },
++ ],
++ })),
++ ],
++ }
+ "###);
+ }
+
+@@ -151,46 +146,46 @@ fn test_union() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "MaybeUninit",
+- â‹® generics: Generics {
+- â‹® lt_token: Some,
+- â‹® params: [
+- â‹® Type(TypeParam {
+- â‹® ident: "T",
+- â‹® }),
+- â‹® ],
+- â‹® gt_token: Some,
+- â‹® },
+- â‹® data: Data::Union {
+- â‹® fields: FieldsNamed {
+- â‹® named: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ident: Some("uninit"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Tuple,
+- â‹® },
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ident: Some("value"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "T",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "MaybeUninit",
++ generics: Generics {
++ lt_token: Some,
++ params: [
++ Type(TypeParam {
++ ident: "T",
++ }),
++ ],
++ gt_token: Some,
++ },
++ data: Data::Union {
++ fields: FieldsNamed {
++ named: [
++ Field {
++ vis: Inherited,
++ ident: Some("uninit"),
++ colon_token: Some,
++ ty: Type::Tuple,
++ },
++ Field {
++ vis: Inherited,
++ ident: Some("value"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "T",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ },
++ }
+ "###);
+ }
+
+@@ -212,118 +207,118 @@ fn test_enum() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "doc",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: `= r" See the std::result module documentation for details."`,
+- â‹® },
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "must_use",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: ``,
+- â‹® },
+- â‹® ],
+- â‹® vis: Visibility::Public,
+- â‹® ident: "Result",
+- â‹® generics: Generics {
+- â‹® lt_token: Some,
+- â‹® params: [
+- â‹® Type(TypeParam {
+- â‹® ident: "T",
+- â‹® }),
+- â‹® Type(TypeParam {
+- â‹® ident: "E",
+- â‹® }),
+- â‹® ],
+- â‹® gt_token: Some,
+- â‹® },
+- â‹® data: Data::Enum {
+- â‹® variants: [
+- â‹® Variant {
+- â‹® ident: "Ok",
+- â‹® fields: Fields::Unnamed {
+- â‹® unnamed: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "T",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® Variant {
+- â‹® ident: "Err",
+- â‹® fields: Fields::Unnamed {
+- â‹® unnamed: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "E",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® Variant {
+- â‹® ident: "Surprise",
+- â‹® fields: Unit,
+- â‹® discriminant: Some(Expr::Lit {
+- â‹® lit: 0isize,
+- â‹® }),
+- â‹® },
+- â‹® Variant {
+- â‹® ident: "ProcMacroHack",
+- â‹® fields: Unit,
+- â‹® discriminant: Some(Expr::Field {
+- â‹® base: Expr::Tuple {
+- â‹® elems: [
+- â‹® Expr::Lit {
+- â‹® lit: 0,
+- â‹® },
+- â‹® Expr::Lit {
+- â‹® lit: "data",
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® member: Unnamed(Index {
+- â‹® index: 0,
+- â‹® }),
+- â‹® }),
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹®}
++ DeriveInput {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "doc",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(`= r" See the std::result module documentation for details."`),
++ },
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "must_use",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ vis: Visibility::Public,
++ ident: "Result",
++ generics: Generics {
++ lt_token: Some,
++ params: [
++ Type(TypeParam {
++ ident: "T",
++ }),
++ Type(TypeParam {
++ ident: "E",
++ }),
++ ],
++ gt_token: Some,
++ },
++ data: Data::Enum {
++ variants: [
++ Variant {
++ ident: "Ok",
++ fields: Fields::Unnamed {
++ unnamed: [
++ Field {
++ vis: Inherited,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "T",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ },
++ Variant {
++ ident: "Err",
++ fields: Fields::Unnamed {
++ unnamed: [
++ Field {
++ vis: Inherited,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "E",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ },
++ Variant {
++ ident: "Surprise",
++ fields: Unit,
++ discriminant: Some(Expr::Lit {
++ lit: 0isize,
++ }),
++ },
++ Variant {
++ ident: "ProcMacroHack",
++ fields: Unit,
++ discriminant: Some(Expr::Field {
++ base: Expr::Tuple {
++ elems: [
++ Expr::Lit {
++ lit: 0,
++ },
++ Expr::Lit {
++ lit: "data",
++ },
++ ],
++ },
++ member: Unnamed(Index {
++ index: 0,
++ }),
++ }),
++ },
++ ],
++ },
++ }
+ "###);
+
+ let meta_items: Vec<_> = input
+@@ -333,27 +328,27 @@ fn test_enum() {
+ .collect();
+
+ snapshot!(meta_items, @r###"
+- â‹®[
+- â‹® Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "doc",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: " See the std::result module documentation for details.",
+- â‹® },
+- â‹® Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "must_use",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® }),
+- â‹®]
++ [
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "doc",
++ arguments: None,
++ },
++ ],
++ },
++ lit: " See the std::result module documentation for details.",
++ },
++ Path(Path {
++ segments: [
++ PathSegment {
++ ident: "must_use",
++ arguments: None,
++ },
++ ],
++ }),
++ ]
+ "###);
+ }
+
+@@ -366,34 +361,34 @@ fn test_attr_with_path() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® leading_colon: Some,
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "attr_args",
+- â‹® arguments: None,
+- â‹® },
+- â‹® PathSegment {
+- â‹® ident: "identity",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: `fn main ( ) { assert_eq ! ( foo ( ) , "Hello, world!" ) ; }`,
+- â‹® },
+- â‹® ],
+- â‹® vis: Inherited,
+- â‹® ident: "Dummy",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ leading_colon: Some,
++ segments: [
++ PathSegment {
++ ident: "attr_args",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "identity",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(`fn main () { assert_eq ! (foo () , "Hello, world!") ; }`),
++ },
++ ],
++ vis: Inherited,
++ ident: "Dummy",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ assert!(input.attrs[0].parse_meta().is_err());
+@@ -407,29 +402,29 @@ fn test_attr_with_non_mod_style_path() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "inert",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: `< T >`,
+- â‹® },
+- â‹® ],
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "inert",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(`< T >`),
++ },
++ ],
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ assert!(input.attrs[0].parse_meta().is_err());
+@@ -443,48 +438,48 @@ fn test_attr_with_mod_style_path_with_self() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® PathSegment {
+- â‹® ident: "self",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: ``,
+- â‹® },
+- â‹® ],
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "self",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ snapshot!(input.attrs[0].parse_meta().unwrap(), @r###"
+- â‹®Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® PathSegment {
+- â‹® ident: "self",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹®})
++ Path(Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "self",
++ arguments: None,
++ },
++ ],
++ })
+ "###);
+ }
+
+@@ -496,55 +491,55 @@ fn test_pub_restricted() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Visibility::Restricted {
+- â‹® in_token: Some,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "m",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ident: "Z",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Fields::Unnamed {
+- â‹® unnamed: [
+- â‹® Field {
+- â‹® vis: Visibility::Restricted {
+- â‹® in_token: Some,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "m",
+- â‹® arguments: None,
+- â‹® },
+- â‹® PathSegment {
+- â‹® ident: "n",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "u8",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Visibility::Restricted {
++ in_token: Some,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "m",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ident: "Z",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Unnamed {
++ unnamed: [
++ Field {
++ vis: Visibility::Restricted {
++ in_token: Some,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "m",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "n",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "u8",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -555,15 +550,15 @@ fn test_vis_crate() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Visibility::Crate,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Visibility::Crate,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -574,24 +569,24 @@ fn test_pub_restricted_crate() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Visibility::Restricted {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "crate",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Visibility::Restricted {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "crate",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -602,24 +597,24 @@ fn test_pub_restricted_super() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Visibility::Restricted {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "super",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Visibility::Restricted {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "super",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -630,25 +625,25 @@ fn test_pub_restricted_in_super() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Visibility::Restricted {
+- â‹® in_token: Some,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "super",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Visibility::Restricted {
++ in_token: Some,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "super",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+
+@@ -659,15 +654,15 @@ fn test_fields_on_unit_struct() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ let data = match input.data {
+@@ -688,47 +683,47 @@ fn test_fields_on_named_struct() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Fields::Named {
+- â‹® named: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ident: Some("foo"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "i32",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ident: Some("bar"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "String",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Named {
++ named: [
++ Field {
++ vis: Inherited,
++ ident: Some("foo"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "i32",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ Field {
++ vis: Visibility::Public,
++ ident: Some("bar"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "String",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ },
++ }
+ "###);
+
+ let data = match input.data {
+@@ -737,38 +732,38 @@ fn test_fields_on_named_struct() {
+ };
+
+ snapshot!(data.fields.into_iter().collect::<Vec<_>>(), @r###"
+- â‹®[
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ident: Some("foo"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "i32",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ident: Some("bar"),
+- â‹® colon_token: Some,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "String",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹®]
++ [
++ Field {
++ vis: Inherited,
++ ident: Some("foo"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "i32",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ Field {
++ vis: Visibility::Public,
++ ident: Some("bar"),
++ colon_token: Some,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "String",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ]
+ "###);
+ }
+
+@@ -779,44 +774,44 @@ fn test_fields_on_tuple_struct() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Fields::Unnamed {
+- â‹® unnamed: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "i32",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "String",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Unnamed {
++ unnamed: [
++ Field {
++ vis: Inherited,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "i32",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ Field {
++ vis: Visibility::Public,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "String",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ let data = match input.data {
+@@ -825,34 +820,34 @@ fn test_fields_on_tuple_struct() {
+ };
+
+ snapshot!(data.fields.iter().collect::<Vec<_>>(), @r###"
+- â‹®[
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "i32",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® Field {
+- â‹® vis: Visibility::Public,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "String",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹®]
++ [
++ Field {
++ vis: Inherited,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "i32",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ Field {
++ vis: Visibility::Public,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "String",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ]
+ "###);
+ }
+
+@@ -864,34 +859,34 @@ fn test_ambiguous_crate() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics,
+- â‹® data: Data::Struct {
+- â‹® fields: Fields::Unnamed {
+- â‹® unnamed: [
+- â‹® Field {
+- â‹® vis: Inherited,
+- â‹® ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "crate",
+- â‹® arguments: None,
+- â‹® },
+- â‹® PathSegment {
+- â‹® ident: "X",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Unnamed {
++ unnamed: [
++ Field {
++ vis: Inherited,
++ ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "crate",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "X",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ ],
++ },
++ semi_token: Some,
++ },
++ }
+ "###);
+ }
+diff --git a/third_party/rust/syn/tests/test_expr.rs b/third_party/rust/syn/tests/test_expr.rs
+index c8a11cec2c..b2b65a254f 100644
+--- mozilla-release/third_party/rust/syn/tests/test_expr.rs
++++ mozilla-release/third_party/rust/syn/tests/test_expr.rs
+@@ -1,40 +1,302 @@
+-extern crate proc_macro2;
+-extern crate syn;
+-
+ #[macro_use]
+ mod macros;
+
+-use std::str::FromStr;
+-
+-use proc_macro2::TokenStream;
++use proc_macro2::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
++use quote::quote;
++use std::iter::FromIterator;
+ use syn::{Expr, ExprRange};
+
+ #[test]
+ fn test_expr_parse() {
+- let code = "..100u32";
+- let tt = TokenStream::from_str(code).unwrap();
+- let expr: Expr = syn::parse2(tt.clone()).unwrap();
+- let expr_range: ExprRange = syn::parse2(tt).unwrap();
+- assert_eq!(expr, Expr::Range(expr_range));
++ let tokens = quote!(..100u32);
++ snapshot!(tokens as Expr, @r###"
++ Expr::Range {
++ limits: HalfOpen,
++ to: Some(Expr::Lit {
++ lit: 100u32,
++ }),
++ }
++ "###);
++
++ let tokens = quote!(..100u32);
++ snapshot!(tokens as ExprRange, @r###"
++ ExprRange {
++ limits: HalfOpen,
++ to: Some(Expr::Lit {
++ lit: 100u32,
++ }),
++ }
++ "###);
+ }
+
+ #[test]
+ fn test_await() {
+ // Must not parse as Expr::Field.
+- let expr = syn::parse_str::<Expr>("fut.await").unwrap();
+-
+- snapshot!(expr, @r###"
+- â‹®Expr::Await {
+- â‹® base: Expr::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "fut",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹®}
++ let tokens = quote!(fut.await);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Await {
++ base: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "fut",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ }
++ "###);
++}
++
++#[rustfmt::skip]
++#[test]
++fn test_tuple_multi_index() {
++ for &input in &[
++ "tuple.0.0",
++ "tuple .0.0",
++ "tuple. 0.0",
++ "tuple.0 .0",
++ "tuple.0. 0",
++ "tuple . 0 . 0",
++ ] {
++ snapshot!(input as Expr, @r###"
++ Expr::Field {
++ base: Expr::Field {
++ base: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "tuple",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ member: Unnamed(Index {
++ index: 0,
++ }),
++ },
++ member: Unnamed(Index {
++ index: 0,
++ }),
++ }
++ "###);
++ }
++
++ for tokens in vec![
++ quote!(tuple.0.0),
++ quote!(tuple .0.0),
++ quote!(tuple. 0.0),
++ quote!(tuple.0 .0),
++ quote!(tuple.0. 0),
++ quote!(tuple . 0 . 0),
++ ] {
++ snapshot!(tokens as Expr, @r###"
++ Expr::Field {
++ base: Expr::Field {
++ base: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "tuple",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ member: Unnamed(Index {
++ index: 0,
++ }),
++ },
++ member: Unnamed(Index {
++ index: 0,
++ }),
++ }
++ "###);
++ }
++}
++
++#[test]
++fn test_macro_variable_func() {
++ // mimics the token stream corresponding to `$fn()`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { f })),
++ TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
++ ]);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Call {
++ func: Expr::Group {
++ expr: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "f",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ }
++ "###);
++
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Punct(Punct::new('#', Spacing::Alone)),
++ TokenTree::Group(Group::new(Delimiter::Bracket, quote! { outside })),
++ TokenTree::Group(Group::new(Delimiter::None, quote! { #[inside] f })),
++ TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
++ ]);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Call {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "outside",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ func: Expr::Group {
++ expr: Expr::Path {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "inside",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "f",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ },
++ }
++ "###);
++}
++
++#[test]
++fn test_macro_variable_macro() {
++ // mimics the token stream corresponding to `$macro!()`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { m })),
++ TokenTree::Punct(Punct::new('!', Spacing::Alone)),
++ TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
++ ]);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Macro {
++ mac: Macro {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "m",
++ arguments: None,
++ },
++ ],
++ },
++ delimiter: Paren,
++ tokens: TokenStream(``),
++ },
++ }
++ "###);
++}
++
++#[test]
++fn test_macro_variable_struct() {
++ // mimics the token stream corresponding to `$struct {}`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { S })),
++ TokenTree::Group(Group::new(Delimiter::Brace, TokenStream::new())),
++ ]);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Struct {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "S",
++ arguments: None,
++ },
++ ],
++ },
++ }
++ "###);
++}
++
++#[test]
++fn test_macro_variable_match_arm() {
++ // mimics the token stream corresponding to `match v { _ => $expr }`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Ident(Ident::new("match", Span::call_site())),
++ TokenTree::Ident(Ident::new("v", Span::call_site())),
++ TokenTree::Group(Group::new(
++ Delimiter::Brace,
++ TokenStream::from_iter(vec![
++ TokenTree::Punct(Punct::new('_', Spacing::Alone)),
++ TokenTree::Punct(Punct::new('=', Spacing::Joint)),
++ TokenTree::Punct(Punct::new('>', Spacing::Alone)),
++ TokenTree::Group(Group::new(Delimiter::None, quote! { #[a] () })),
++ ]),
++ )),
++ ]);
++
++ snapshot!(tokens as Expr, @r###"
++ Expr::Match {
++ expr: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "v",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ arms: [
++ Arm {
++ pat: Pat::Wild,
++ body: Expr::Group {
++ expr: Expr::Tuple {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "a",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ },
++ },
++ },
++ ],
++ }
+ "###);
+ }
+diff --git a/third_party/rust/syn/tests/test_generics.rs b/third_party/rust/syn/tests/test_generics.rs
+index 55c79e066b..b29434a147 100644
+--- mozilla-release/third_party/rust/syn/tests/test_generics.rs
++++ mozilla-release/third_party/rust/syn/tests/test_generics.rs
+@@ -1,8 +1,3 @@
+-extern crate quote;
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -16,90 +11,90 @@ fn test_split_for_impl() {
+ };
+
+ snapshot!(input as DeriveInput, @r###"
+- â‹®DeriveInput {
+- â‹® vis: Inherited,
+- â‹® ident: "S",
+- â‹® generics: Generics {
+- â‹® lt_token: Some,
+- â‹® params: [
+- â‹® Lifetime(LifetimeDef {
+- â‹® lifetime: Lifetime {
+- â‹® ident: "a",
+- â‹® },
+- â‹® }),
+- â‹® Lifetime(LifetimeDef {
+- â‹® lifetime: Lifetime {
+- â‹® ident: "b",
+- â‹® },
+- â‹® colon_token: Some,
+- â‹® bounds: [
+- â‹® Lifetime {
+- â‹® ident: "a",
+- â‹® },
+- â‹® ],
+- â‹® }),
+- â‹® Type(TypeParam {
+- â‹® attrs: [
+- â‹® Attribute {
+- â‹® style: Outer,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "may_dangle",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® tokens: ``,
+- â‹® },
+- â‹® ],
+- â‹® ident: "T",
+- â‹® colon_token: Some,
+- â‹® bounds: [
+- â‹® Lifetime(Lifetime {
+- â‹® ident: "a",
+- â‹® }),
+- â‹® ],
+- â‹® eq_token: Some,
+- â‹® default: Some(Type::Tuple),
+- â‹® }),
+- â‹® ],
+- â‹® gt_token: Some,
+- â‹® where_clause: Some(WhereClause {
+- â‹® predicates: [
+- â‹® Type(PredicateType {
+- â‹® bounded_ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "T",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® bounds: [
+- â‹® Trait(TraitBound {
+- â‹® modifier: None,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Debug",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® },
+- â‹® data: Data::Struct {
+- â‹® fields: Unit,
+- â‹® semi_token: Some,
+- â‹® },
+- â‹®}
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics {
++ lt_token: Some,
++ params: [
++ Lifetime(LifetimeDef {
++ lifetime: Lifetime {
++ ident: "a",
++ },
++ }),
++ Lifetime(LifetimeDef {
++ lifetime: Lifetime {
++ ident: "b",
++ },
++ colon_token: Some,
++ bounds: [
++ Lifetime {
++ ident: "a",
++ },
++ ],
++ }),
++ Type(TypeParam {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "may_dangle",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ ident: "T",
++ colon_token: Some,
++ bounds: [
++ Lifetime(Lifetime {
++ ident: "a",
++ }),
++ ],
++ eq_token: Some,
++ default: Some(Type::Tuple),
++ }),
++ ],
++ gt_token: Some,
++ where_clause: Some(WhereClause {
++ predicates: [
++ Type(PredicateType {
++ bounded_ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "T",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ bounds: [
++ Trait(TraitBound {
++ modifier: None,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Debug",
++ arguments: None,
++ },
++ ],
++ },
++ }),
++ ],
++ }),
++ ],
++ }),
++ },
++ data: Data::Struct {
++ fields: Unit,
++ semi_token: Some,
++ },
++ }
+ "###);
+
+ let generics = input.generics;
+@@ -131,46 +126,46 @@ fn test_split_for_impl() {
+ fn test_ty_param_bound() {
+ let tokens = quote!('a);
+ snapshot!(tokens as TypeParamBound, @r###"
+- â‹®Lifetime(Lifetime {
+- â‹® ident: "a",
+- â‹®})
++ Lifetime(Lifetime {
++ ident: "a",
++ })
+ "###);
+
+ let tokens = quote!('_);
+ snapshot!(tokens as TypeParamBound, @r###"
+- â‹®Lifetime(Lifetime {
+- â‹® ident: "_",
+- â‹®})
++ Lifetime(Lifetime {
++ ident: "_",
++ })
+ "###);
+
+ let tokens = quote!(Debug);
+ snapshot!(tokens as TypeParamBound, @r###"
+- â‹®Trait(TraitBound {
+- â‹® modifier: None,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Debug",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹®})
++ Trait(TraitBound {
++ modifier: None,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Debug",
++ arguments: None,
++ },
++ ],
++ },
++ })
+ "###);
+
+ let tokens = quote!(?Sized);
+ snapshot!(tokens as TypeParamBound, @r###"
+- â‹®Trait(TraitBound {
+- â‹® modifier: Maybe,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Sized",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹®})
++ Trait(TraitBound {
++ modifier: Maybe,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Sized",
++ arguments: None,
++ },
++ ],
++ },
++ })
+ "###);
+ }
+
+@@ -187,76 +182,76 @@ fn test_fn_precedence_in_where_clause() {
+ };
+
+ snapshot!(input as ItemFn, @r###"
+- â‹®ItemFn {
+- â‹® vis: Inherited,
+- â‹® sig: Signature {
+- â‹® ident: "f",
+- â‹® generics: Generics {
+- â‹® lt_token: Some,
+- â‹® params: [
+- â‹® Type(TypeParam {
+- â‹® ident: "G",
+- â‹® }),
+- â‹® ],
+- â‹® gt_token: Some,
+- â‹® where_clause: Some(WhereClause {
+- â‹® predicates: [
+- â‹® Type(PredicateType {
+- â‹® bounded_ty: Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "G",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® bounds: [
+- â‹® Trait(TraitBound {
+- â‹® modifier: None,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "FnOnce",
+- â‹® arguments: PathArguments::Parenthesized {
+- â‹® output: Type(
+- â‹® Type::Path {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "i32",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® },
+- â‹® ),
+- â‹® },
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® }),
+- â‹® Trait(TraitBound {
+- â‹® modifier: None,
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "Send",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® },
+- â‹® output: Default,
+- â‹® },
+- â‹® block: Block,
+- â‹®}
++ ItemFn {
++ vis: Inherited,
++ sig: Signature {
++ ident: "f",
++ generics: Generics {
++ lt_token: Some,
++ params: [
++ Type(TypeParam {
++ ident: "G",
++ }),
++ ],
++ gt_token: Some,
++ where_clause: Some(WhereClause {
++ predicates: [
++ Type(PredicateType {
++ bounded_ty: Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "G",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ bounds: [
++ Trait(TraitBound {
++ modifier: None,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "FnOnce",
++ arguments: PathArguments::Parenthesized {
++ output: Type(
++ Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "i32",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ ),
++ },
++ },
++ ],
++ },
++ }),
++ Trait(TraitBound {
++ modifier: None,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "Send",
++ arguments: None,
++ },
++ ],
++ },
++ }),
++ ],
++ }),
++ ],
++ }),
++ },
++ output: Default,
++ },
++ block: Block,
++ }
+ "###);
+
+ let where_clause = input.sig.generics.where_clause.as_ref().unwrap();
+@@ -270,7 +265,7 @@ fn test_fn_precedence_in_where_clause() {
+ assert_eq!(predicate.bounds.len(), 2, "{:#?}", predicate.bounds);
+
+ let first_bound = &predicate.bounds[0];
+- assert_eq!(quote!(#first_bound).to_string(), "FnOnce ( ) -> i32");
++ assert_eq!(quote!(#first_bound).to_string(), "FnOnce () -> i32");
+
+ let second_bound = &predicate.bounds[1];
+ assert_eq!(quote!(#second_bound).to_string(), "Send");
+diff --git a/third_party/rust/syn/tests/test_grouping.rs b/third_party/rust/syn/tests/test_grouping.rs
+index 1558a47b4b..a0fe716390 100644
+--- mozilla-release/third_party/rust/syn/tests/test_grouping.rs
++++ mozilla-release/third_party/rust/syn/tests/test_grouping.rs
+@@ -1,8 +1,3 @@
+-extern crate proc_macro2;
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -28,31 +23,31 @@ fn test_grouping() {
+ TokenTree::Literal(Literal::i32_suffixed(4)),
+ ]);
+
+- assert_eq!(tokens.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
++ assert_eq!(tokens.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
+
+ snapshot!(tokens as Expr, @r###"
+- â‹®Expr::Binary {
+- â‹® left: Expr::Lit {
+- â‹® lit: 1i32,
+- â‹® },
+- â‹® op: Add,
+- â‹® right: Expr::Binary {
+- â‹® left: Expr::Group {
+- â‹® expr: Expr::Binary {
+- â‹® left: Expr::Lit {
+- â‹® lit: 2i32,
+- â‹® },
+- â‹® op: Add,
+- â‹® right: Expr::Lit {
+- â‹® lit: 3i32,
+- â‹® },
+- â‹® },
+- â‹® },
+- â‹® op: Mul,
+- â‹® right: Expr::Lit {
+- â‹® lit: 4i32,
+- â‹® },
+- â‹® },
+- â‹®}
++ Expr::Binary {
++ left: Expr::Lit {
++ lit: 1i32,
++ },
++ op: Add,
++ right: Expr::Binary {
++ left: Expr::Group {
++ expr: Expr::Binary {
++ left: Expr::Lit {
++ lit: 2i32,
++ },
++ op: Add,
++ right: Expr::Lit {
++ lit: 3i32,
++ },
++ },
++ },
++ op: Mul,
++ right: Expr::Lit {
++ lit: 4i32,
++ },
++ },
++ }
+ "###);
+ }
+diff --git a/third_party/rust/syn/tests/test_ident.rs b/third_party/rust/syn/tests/test_ident.rs
+index bec00a70c9..ee01bfcc9f 100644
+--- mozilla-release/third_party/rust/syn/tests/test_ident.rs
++++ mozilla-release/third_party/rust/syn/tests/test_ident.rs
+@@ -1,8 +1,3 @@
+-extern crate proc_macro2;
+-extern crate syn;
+-
+-mod features;
+-
+ use proc_macro2::{Ident, Span, TokenStream};
+ use std::str::FromStr;
+ use syn::Result;
+diff --git a/third_party/rust/syn/tests/test_item.rs b/third_party/rust/syn/tests/test_item.rs
+new file mode 100644
+index 0000000000..74ac4baec6
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_item.rs
+@@ -0,0 +1,45 @@
++#[macro_use]
++mod macros;
++
++use proc_macro2::{Delimiter, Group, Ident, Span, TokenStream, TokenTree};
++use quote::quote;
++use std::iter::FromIterator;
++use syn::Item;
++
++#[test]
++fn test_macro_variable_attr() {
++ // mimics the token stream corresponding to `$attr fn f() {}`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { #[test] })),
++ TokenTree::Ident(Ident::new("fn", Span::call_site())),
++ TokenTree::Ident(Ident::new("f", Span::call_site())),
++ TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
++ TokenTree::Group(Group::new(Delimiter::Brace, TokenStream::new())),
++ ]);
++
++ snapshot!(tokens as Item, @r###"
++ Item::Fn {
++ attrs: [
++ Attribute {
++ style: Outer,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "test",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(``),
++ },
++ ],
++ vis: Inherited,
++ sig: Signature {
++ ident: "f",
++ generics: Generics,
++ output: Default,
++ },
++ block: Block,
++ }
++ "###);
++}
+diff --git a/third_party/rust/syn/tests/test_iterators.rs b/third_party/rust/syn/tests/test_iterators.rs
+index 1cf7157e6f..2c8359c157 100644
+--- mozilla-release/third_party/rust/syn/tests/test_iterators.rs
++++ mozilla-release/third_party/rust/syn/tests/test_iterators.rs
+@@ -1,10 +1,5 @@
+ use syn::punctuated::{Pair, Punctuated};
+-
+-extern crate quote;
+-#[macro_use]
+-extern crate syn;
+-
+-mod features;
++use syn::Token;
+
+ #[macro_use]
+ mod macros;
+diff --git a/third_party/rust/syn/tests/test_lit.rs b/third_party/rust/syn/tests/test_lit.rs
+index 1e8f49d19b..e995f2287f 100644
+--- mozilla-release/third_party/rust/syn/tests/test_lit.rs
++++ mozilla-release/third_party/rust/syn/tests/test_lit.rs
+@@ -1,13 +1,11 @@
+-extern crate proc_macro2;
+-extern crate quote;
+-extern crate syn;
++#[macro_use]
++mod macros;
+
+-mod features;
+-
+-use proc_macro2::{TokenStream, TokenTree};
++use proc_macro2::{Delimiter, Group, Literal, Span, TokenStream, TokenTree};
+ use quote::ToTokens;
++use std::iter::FromIterator;
+ use std::str::FromStr;
+-use syn::Lit;
++use syn::{Lit, LitFloat, LitInt};
+
+ fn lit(s: &str) -> Lit {
+ match TokenStream::from_str(s)
+@@ -50,6 +48,9 @@ fn strings() {
+ "contains\nnewlinesescaped newlines",
+ );
+ test_string("r\"raw\nstring\\\nhere\"", "raw\nstring\\\nhere");
++ test_string("\"...\"q", "...");
++ test_string("r\"...\"q", "...");
++ test_string("r##\"...\"##q", "...");
+ }
+
+ #[test]
+@@ -79,6 +80,9 @@ fn byte_strings() {
+ b"contains\nnewlinesescaped newlines",
+ );
+ test_byte_string("br\"raw\nstring\\\nhere\"", b"raw\nstring\\\nhere");
++ test_byte_string("b\"...\"q", b"...");
++ test_byte_string("br\"...\"q", b"...");
++ test_byte_string("br##\"...\"##q", b"...");
+ }
+
+ #[test]
+@@ -100,6 +104,7 @@ fn bytes() {
+ test_byte("b'\\t'", b'\t');
+ test_byte("b'\\''", b'\'');
+ test_byte("b'\"'", b'"');
++ test_byte("b'a'q", b'a');
+ }
+
+ #[test]
+@@ -125,6 +130,7 @@ fn chars() {
+ test_char("'\\''", '\'');
+ test_char("'\"'", '"');
+ test_char("'\\u{1F415}'", '\u{1F415}');
++ test_char("'a'q", 'a');
+ }
+
+ #[test]
+@@ -185,4 +191,59 @@ fn floats() {
+ test_float("5.5e12", 5.5e12, "");
+ test_float("1.0__3e-12", 1.03e-12, "");
+ test_float("1.03e+12", 1.03e12, "");
++ test_float("9e99e99", 9e99, "e99");
++}
++
++#[test]
++fn negative() {
++ let span = Span::call_site();
++ assert_eq!("-1", LitInt::new("-1", span).to_string());
++ assert_eq!("-1i8", LitInt::new("-1i8", span).to_string());
++ assert_eq!("-1i16", LitInt::new("-1i16", span).to_string());
++ assert_eq!("-1i32", LitInt::new("-1i32", span).to_string());
++ assert_eq!("-1i64", LitInt::new("-1i64", span).to_string());
++ assert_eq!("-1.5", LitFloat::new("-1.5", span).to_string());
++ assert_eq!("-1.5f32", LitFloat::new("-1.5f32", span).to_string());
++ assert_eq!("-1.5f64", LitFloat::new("-1.5f64", span).to_string());
++}
++
++#[test]
++fn suffix() {
++ fn get_suffix(token: &str) -> String {
++ let lit = syn::parse_str::<Lit>(token).unwrap();
++ match lit {
++ Lit::Str(lit) => lit.suffix().to_owned(),
++ Lit::ByteStr(lit) => lit.suffix().to_owned(),
++ Lit::Byte(lit) => lit.suffix().to_owned(),
++ Lit::Char(lit) => lit.suffix().to_owned(),
++ Lit::Int(lit) => lit.suffix().to_owned(),
++ Lit::Float(lit) => lit.suffix().to_owned(),
++ _ => unimplemented!(),
++ }
++ }
++
++ assert_eq!(get_suffix("\"\"s"), "s");
++ assert_eq!(get_suffix("r\"\"r"), "r");
++ assert_eq!(get_suffix("b\"\"b"), "b");
++ assert_eq!(get_suffix("br\"\"br"), "br");
++ assert_eq!(get_suffix("r#\"\"#r"), "r");
++ assert_eq!(get_suffix("'c'c"), "c");
++ assert_eq!(get_suffix("b'b'b"), "b");
++ assert_eq!(get_suffix("1i32"), "i32");
++ assert_eq!(get_suffix("1_i32"), "i32");
++ assert_eq!(get_suffix("1.0f32"), "f32");
++ assert_eq!(get_suffix("1.0_f32"), "f32");
++}
++
++#[test]
++fn test_deep_group_empty() {
++ let tokens = TokenStream::from_iter(vec![TokenTree::Group(Group::new(
++ Delimiter::None,
++ TokenStream::from_iter(vec![TokenTree::Group(Group::new(
++ Delimiter::None,
++ TokenStream::from_iter(vec![TokenTree::Literal(Literal::string("hi"))]),
++ ))]),
++ ))]);
++
++ snapshot!(tokens as Lit, @r#""hi""# );
+ }
+diff --git a/third_party/rust/syn/tests/test_meta.rs b/third_party/rust/syn/tests/test_meta.rs
+index 547472d6f4..d37dda948a 100644
+--- mozilla-release/third_party/rust/syn/tests/test_meta.rs
++++ mozilla-release/third_party/rust/syn/tests/test_meta.rs
+@@ -1,7 +1,3 @@
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -12,14 +8,14 @@ fn test_parse_meta_item_word() {
+ let input = "hello";
+
+ snapshot!(input as Meta, @r###"
+- â‹®Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "hello",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹®})
++ Path(Path {
++ segments: [
++ PathSegment {
++ ident: "hello",
++ arguments: None,
++ },
++ ],
++ })
+ "###);
+ }
+
+@@ -29,31 +25,31 @@ fn test_parse_meta_name_value() {
+ let (inner, meta) = (input, input);
+
+ snapshot!(inner as MetaNameValue, @r###"
+- â‹®MetaNameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ MetaNameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ snapshot!(meta as Meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ assert_eq!(meta, inner.into());
+@@ -65,31 +61,31 @@ fn test_parse_meta_name_value_with_keyword() {
+ let (inner, meta) = (input, input);
+
+ snapshot!(inner as MetaNameValue, @r###"
+- â‹®MetaNameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "static",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ MetaNameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "static",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ snapshot!(meta as Meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "static",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "static",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ assert_eq!(meta, inner.into());
+@@ -101,31 +97,31 @@ fn test_parse_meta_name_value_with_bool() {
+ let (inner, meta) = (input, input);
+
+ snapshot!(inner as MetaNameValue, @r###"
+- â‹®MetaNameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "true",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ MetaNameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "true",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ snapshot!(meta as Meta, @r###"
+- â‹®Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "true",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹®}
++ Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "true",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }
+ "###);
+
+ assert_eq!(meta, inner.into());
+@@ -137,35 +133,35 @@ fn test_parse_meta_item_list_lit() {
+ let (inner, meta) = (input, input);
+
+ snapshot!(inner as MetaList, @r###"
+- â‹®MetaList {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Lit(5),
+- â‹® ],
+- â‹®}
++ MetaList {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Lit(5),
++ ],
++ }
+ "###);
+
+ snapshot!(meta as Meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Lit(5),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Lit(5),
++ ],
++ }
+ "###);
+
+ assert_eq!(meta, inner.into());
+@@ -177,133 +173,133 @@ fn test_parse_meta_item_multiple() {
+ let (inner, meta) = (input, input);
+
+ snapshot!(inner as MetaList, @r###"
+- â‹®MetaList {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹® }),
+- â‹® Meta(Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "list",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 6,
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® ],
+- â‹®}
++ MetaList {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word",
++ arguments: None,
++ },
++ ],
++ })),
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }),
++ Meta(Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "list",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name2",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 6,
++ }),
++ ],
++ }),
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word2",
++ arguments: None,
++ },
++ ],
++ })),
++ ],
++ }
+ "###);
+
+ snapshot!(meta as Meta, @r###"
+- â‹®Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "foo",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 5,
+- â‹® }),
+- â‹® Meta(Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "list",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 6,
+- â‹® }),
+- â‹® ],
+- â‹® }),
+- â‹® Meta(Path(Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "word2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® })),
+- â‹® ],
+- â‹®}
++ Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "foo",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word",
++ arguments: None,
++ },
++ ],
++ })),
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 5,
++ }),
++ Meta(Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "list",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name2",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 6,
++ }),
++ ],
++ }),
++ Meta(Path(Path {
++ segments: [
++ PathSegment {
++ ident: "word2",
++ arguments: None,
++ },
++ ],
++ })),
++ ],
++ }
+ "###);
+
+ assert_eq!(meta, inner.into());
+@@ -316,28 +312,28 @@ fn test_parse_nested_meta() {
+
+ let input = "list(name2 = 6)";
+ snapshot!(input as NestedMeta, @r###"
+- â‹®Meta(Meta::List {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "list",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® nested: [
+- â‹® Meta(Meta::NameValue {
+- â‹® path: Path {
+- â‹® segments: [
+- â‹® PathSegment {
+- â‹® ident: "name2",
+- â‹® arguments: None,
+- â‹® },
+- â‹® ],
+- â‹® },
+- â‹® lit: 6,
+- â‹® }),
+- â‹® ],
+- â‹®})
++ Meta(Meta::List {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "list",
++ arguments: None,
++ },
++ ],
++ },
++ nested: [
++ Meta(Meta::NameValue {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "name2",
++ arguments: None,
++ },
++ ],
++ },
++ lit: 6,
++ }),
++ ],
++ })
+ "###);
+ }
+diff --git a/third_party/rust/syn/tests/test_parse_buffer.rs b/third_party/rust/syn/tests/test_parse_buffer.rs
+index f09495187f..57a3c7c38c 100644
+--- mozilla-release/third_party/rust/syn/tests/test_parse_buffer.rs
++++ mozilla-release/third_party/rust/syn/tests/test_parse_buffer.rs
+@@ -1,7 +1,7 @@
+-#[macro_use]
+-extern crate syn;
+-
++use proc_macro2::{Delimiter, Group, Punct, Spacing, TokenStream, TokenTree};
++use std::iter::FromIterator;
+ use syn::parse::{discouraged::Speculative, Parse, ParseStream, Parser, Result};
++use syn::{parenthesized, Token};
+
+ #[test]
+ #[should_panic(expected = "Fork was not derived from the advancing parse stream")]
+@@ -53,3 +53,38 @@ fn smuggled_speculative_cursor_into_brackets() {
+
+ syn::parse_str::<BreakRules>("()").unwrap();
+ }
++
++#[test]
++fn trailing_empty_none_group() {
++ fn parse(input: ParseStream) -> Result<()> {
++ input.parse::<Token![+]>()?;
++
++ let content;
++ parenthesized!(content in input);
++ content.parse::<Token![+]>()?;
++
++ Ok(())
++ }
++
++ // `+ ( + <Ø Ø> ) <Ø <Ø Ø> Ø>`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Punct(Punct::new('+', Spacing::Alone)),
++ TokenTree::Group(Group::new(
++ Delimiter::Parenthesis,
++ TokenStream::from_iter(vec![
++ TokenTree::Punct(Punct::new('+', Spacing::Alone)),
++ TokenTree::Group(Group::new(Delimiter::None, TokenStream::new())),
++ ]),
++ )),
++ TokenTree::Group(Group::new(Delimiter::None, TokenStream::new())),
++ TokenTree::Group(Group::new(
++ Delimiter::None,
++ TokenStream::from_iter(vec![TokenTree::Group(Group::new(
++ Delimiter::None,
++ TokenStream::new(),
++ ))]),
++ )),
++ ]);
++
++ parse.parse2(tokens).unwrap();
++}
+diff --git a/third_party/rust/syn/tests/test_parse_stream.rs b/third_party/rust/syn/tests/test_parse_stream.rs
+new file mode 100644
+index 0000000000..76bd065777
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_parse_stream.rs
+@@ -0,0 +1,12 @@
++use syn::ext::IdentExt;
++use syn::parse::ParseStream;
++use syn::{Ident, Token};
++
++#[test]
++fn test_peek() {
++ let _ = |input: ParseStream| {
++ let _ = input.peek(Ident);
++ let _ = input.peek(Ident::peek_any);
++ let _ = input.peek(Token![::]);
++ };
++}
+diff --git a/third_party/rust/syn/tests/test_pat.rs b/third_party/rust/syn/tests/test_pat.rs
+index 1343aa646f..73388dd79d 100644
+--- mozilla-release/third_party/rust/syn/tests/test_pat.rs
++++ mozilla-release/third_party/rust/syn/tests/test_pat.rs
+@@ -1,10 +1,5 @@
+-extern crate quote;
+-extern crate syn;
+-
+-mod features;
+-
+ use quote::quote;
+-use syn::Pat;
++use syn::{Item, Pat, Stmt};
+
+ #[test]
+ fn test_pat_ident() {
+@@ -21,3 +16,23 @@ fn test_pat_path() {
+ value => panic!("expected PatPath, got {:?}", value),
+ }
+ }
++
++#[test]
++fn test_leading_vert() {
++ // https://github.com/rust-lang/rust/blob/1.43.0/src/test/ui/or-patterns/remove-leading-vert.rs
++
++ syn::parse_str::<Item>("fn f() {}").unwrap();
++ syn::parse_str::<Item>("fn fun1(| A: E) {}").unwrap_err();
++ syn::parse_str::<Item>("fn fun2(|| A: E) {}").unwrap_err();
++
++ syn::parse_str::<Stmt>("let | () = ();").unwrap();
++ syn::parse_str::<Stmt>("let (| A): E;").unwrap_err();
++ syn::parse_str::<Stmt>("let (|| A): (E);").unwrap_err();
++ syn::parse_str::<Stmt>("let (| A,): (E,);").unwrap_err();
++ syn::parse_str::<Stmt>("let [| A]: [E; 1];").unwrap_err();
++ syn::parse_str::<Stmt>("let [|| A]: [E; 1];").unwrap_err();
++ syn::parse_str::<Stmt>("let TS(| A): TS;").unwrap_err();
++ syn::parse_str::<Stmt>("let TS(|| A): TS;").unwrap_err();
++ syn::parse_str::<Stmt>("let NS { f: | A }: NS;").unwrap_err();
++ syn::parse_str::<Stmt>("let NS { f: || A }: NS;").unwrap_err();
++}
+diff --git a/third_party/rust/syn/tests/test_path.rs b/third_party/rust/syn/tests/test_path.rs
+new file mode 100644
+index 0000000000..2ce12066f5
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_path.rs
+@@ -0,0 +1,52 @@
++#[macro_use]
++mod macros;
++
++use proc_macro2::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
++use quote::quote;
++use std::iter::FromIterator;
++use syn::{Expr, Type};
++
++#[test]
++fn parse_interpolated_leading_component() {
++ // mimics the token stream corresponding to `$mod::rest`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { first })),
++ TokenTree::Punct(Punct::new(':', Spacing::Joint)),
++ TokenTree::Punct(Punct::new(':', Spacing::Alone)),
++ TokenTree::Ident(Ident::new("rest", Span::call_site())),
++ ]);
++
++ snapshot!(tokens.clone() as Expr, @r###"
++ Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "first",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "rest",
++ arguments: None,
++ },
++ ],
++ },
++ }
++ "###);
++
++ snapshot!(tokens as Type, @r###"
++ Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "first",
++ arguments: None,
++ },
++ PathSegment {
++ ident: "rest",
++ arguments: None,
++ },
++ ],
++ },
++ }
++ "###);
++}
+diff --git a/third_party/rust/syn/tests/test_precedence.rs b/third_party/rust/syn/tests/test_precedence.rs
+index 53ee66e372..a586b3fe48 100644
+--- mozilla-release/third_party/rust/syn/tests/test_precedence.rs
++++ mozilla-release/third_party/rust/syn/tests/test_precedence.rs
+@@ -4,35 +4,26 @@
+
+ //! The tests in this module do the following:
+ //!
+-//! 1. Parse a given expression in both `syn` and `libsyntax`.
++//! 1. Parse a given expression in both `syn` and `librustc`.
+ //! 2. Fold over the expression adding brackets around each subexpression (with
+-//! some complications - see the `syn_brackets` and `libsyntax_brackets`
++//! some complications - see the `syn_brackets` and `librustc_brackets`
+ //! methods).
+ //! 3. Serialize the `syn` expression back into a string, and re-parse it with
+-//! `libsyntax`.
++//! `librustc`.
+ //! 4. Respan all of the expressions, replacing the spans with the default
+ //! spans.
+ //! 5. Compare the expressions with one another, if they are not equal fail.
+
+-extern crate quote;
+-extern crate rayon;
+-extern crate regex;
++extern crate rustc_ast;
+ extern crate rustc_data_structures;
+-extern crate smallvec;
+-extern crate syn;
+-extern crate syntax;
+-extern crate syntax_pos;
+-extern crate walkdir;
+-
+-mod features;
++extern crate rustc_span;
+
+ use quote::quote;
+ use rayon::iter::{IntoParallelIterator, ParallelIterator};
+ use regex::Regex;
+-use smallvec::smallvec;
+-use syntax::ast;
+-use syntax::ptr::P;
+-use syntax_pos::edition::Edition;
++use rustc_ast::ast;
++use rustc_ast::ptr::P;
++use rustc_span::edition::Edition;
+ use walkdir::{DirEntry, WalkDir};
+
+ use std::fs::File;
+@@ -73,7 +64,7 @@ fn test_simple_precedence() {
+ continue;
+ };
+
+- let pf = match test_expressions(vec![expr]) {
++ let pf = match test_expressions(Edition::Edition2018, vec![expr]) {
+ (1, 0) => "passed",
+ (0, 1) => {
+ failed += 1;
+@@ -91,8 +82,8 @@ fn test_simple_precedence() {
+
+ /// Test expressions from rustc, like in `test_round_trip`.
+ #[test]
+-#[cfg_attr(target_os = "windows", ignore = "requires nix .sh")]
+ fn test_rustc_precedence() {
++ common::rayon_init();
+ repo::clone_rust();
+ let abort_after = common::abort_after();
+ if abort_after == 0 {
+@@ -118,15 +109,6 @@ fn test_rustc_precedence() {
+ return;
+ }
+
+- // Our version of `libsyntax` can't parse this tests
+- if path
+- .to_str()
+- .unwrap()
+- .ends_with("optional_comma_in_match_arm.rs")
+- {
+- return;
+- }
+-
+ let mut file = File::open(path).unwrap();
+ let mut content = String::new();
+ file.read_to_string(&mut content).unwrap();
+@@ -134,8 +116,9 @@ fn test_rustc_precedence() {
+
+ let (l_passed, l_failed) = match syn::parse_file(&content) {
+ Ok(file) => {
++ let edition = repo::edition(path).parse().unwrap();
+ let exprs = collect_exprs(file);
+- test_expressions(exprs)
++ test_expressions(edition, exprs)
+ }
+ Err(msg) => {
+ errorf!("syn failed to parse\n{:?}\n", msg);
+@@ -169,36 +152,36 @@ fn test_rustc_precedence() {
+ }
+ }
+
+-fn test_expressions(exprs: Vec<syn::Expr>) -> (usize, usize) {
++fn test_expressions(edition: Edition, exprs: Vec<syn::Expr>) -> (usize, usize) {
+ let mut passed = 0;
+ let mut failed = 0;
+
+- syntax::with_globals(Edition::Edition2018, || {
++ rustc_span::with_session_globals(edition, || {
+ for expr in exprs {
+ let raw = quote!(#expr).to_string();
+
+- let libsyntax_ast = if let Some(e) = libsyntax_parse_and_rewrite(&raw) {
++ let librustc_ast = if let Some(e) = librustc_parse_and_rewrite(&raw) {
+ e
+ } else {
+ failed += 1;
+- errorf!("\nFAIL - libsyntax failed to parse raw\n");
++ errorf!("\nFAIL - librustc failed to parse raw\n");
+ continue;
+ };
+
+ let syn_expr = syn_brackets(expr);
+- let syn_ast = if let Some(e) = parse::libsyntax_expr(&quote!(#syn_expr).to_string()) {
++ let syn_ast = if let Some(e) = parse::librustc_expr(&quote!(#syn_expr).to_string()) {
+ e
+ } else {
+ failed += 1;
+- errorf!("\nFAIL - libsyntax failed to parse bracketed\n");
++ errorf!("\nFAIL - librustc failed to parse bracketed\n");
+ continue;
+ };
+
+- if SpanlessEq::eq(&syn_ast, &libsyntax_ast) {
++ if SpanlessEq::eq(&syn_ast, &librustc_ast) {
+ passed += 1;
+ } else {
+ failed += 1;
+- errorf!("\nFAIL\n{:?}\n!=\n{:?}\n", syn_ast, libsyntax_ast);
++ errorf!("\nFAIL\n{:?}\n!=\n{:?}\n", syn_ast, librustc_ast);
+ }
+ }
+ });
+@@ -206,54 +189,106 @@ fn test_expressions(exprs: Vec<syn::Expr>) -> (usize, usize) {
+ (passed, failed)
+ }
+
+-fn libsyntax_parse_and_rewrite(input: &str) -> Option<P<ast::Expr>> {
+- parse::libsyntax_expr(input).and_then(libsyntax_brackets)
++fn librustc_parse_and_rewrite(input: &str) -> Option<P<ast::Expr>> {
++ parse::librustc_expr(input).and_then(librustc_brackets)
+ }
+
+ /// Wrap every expression which is not already wrapped in parens with parens, to
+ /// reveal the precidence of the parsed expressions, and produce a stringified
+ /// form of the resulting expression.
+ ///
+-/// This method operates on libsyntax objects.
+-fn libsyntax_brackets(mut libsyntax_expr: P<ast::Expr>) -> Option<P<ast::Expr>> {
++/// This method operates on librustc objects.
++fn librustc_brackets(mut librustc_expr: P<ast::Expr>) -> Option<P<ast::Expr>> {
++ use rustc_ast::ast::{
++ Block, BorrowKind, Expr, ExprKind, Field, GenericArg, MacCall, Pat, Stmt, StmtKind, Ty,
++ };
++ use rustc_ast::mut_visit::{noop_visit_generic_arg, MutVisitor};
++ use rustc_data_structures::map_in_place::MapInPlace;
+ use rustc_data_structures::thin_vec::ThinVec;
+- use smallvec::SmallVec;
++ use rustc_span::DUMMY_SP;
+ use std::mem;
+- use syntax::ast::{Expr, ExprKind, Field, Mac, Pat, Stmt, StmtKind, Ty};
+- use syntax::mut_visit::{noop_visit_expr, MutVisitor};
+- use syntax_pos::DUMMY_SP;
+
+ struct BracketsVisitor {
+ failed: bool,
+ };
+
++ fn flat_map_field<T: MutVisitor>(mut f: Field, vis: &mut T) -> Vec<Field> {
++ if f.is_shorthand {
++ noop_visit_expr(&mut f.expr, vis);
++ } else {
++ vis.visit_expr(&mut f.expr);
++ }
++ vec![f]
++ }
++
++ fn flat_map_stmt<T: MutVisitor>(stmt: Stmt, vis: &mut T) -> Vec<Stmt> {
++ let kind = match stmt.kind {
++ // Don't wrap toplevel expressions in statements.
++ StmtKind::Expr(mut e) => {
++ noop_visit_expr(&mut e, vis);
++ StmtKind::Expr(e)
++ }
++ StmtKind::Semi(mut e) => {
++ noop_visit_expr(&mut e, vis);
++ StmtKind::Semi(e)
++ }
++ s => s,
++ };
++
++ vec![Stmt { kind, ..stmt }]
++ }
++
++ fn noop_visit_expr<T: MutVisitor>(e: &mut Expr, vis: &mut T) {
++ use rustc_ast::mut_visit::{noop_visit_expr, visit_opt, visit_thin_attrs};
++ match &mut e.kind {
++ ExprKind::AddrOf(BorrowKind::Raw, ..) => {}
++ ExprKind::Struct(path, fields, expr) => {
++ vis.visit_path(path);
++ fields.flat_map_in_place(|field| flat_map_field(field, vis));
++ visit_opt(expr, |expr| vis.visit_expr(expr));
++ vis.visit_id(&mut e.id);
++ vis.visit_span(&mut e.span);
++ visit_thin_attrs(&mut e.attrs, vis);
++ }
++ _ => noop_visit_expr(e, vis),
++ }
++ }
++
+ impl MutVisitor for BracketsVisitor {
+ fn visit_expr(&mut self, e: &mut P<Expr>) {
+ noop_visit_expr(e, self);
+- match e.node {
++ match e.kind {
+ ExprKind::If(..) | ExprKind::Block(..) | ExprKind::Let(..) => {}
+ _ => {
+ let inner = mem::replace(
+ e,
+ P(Expr {
+ id: ast::DUMMY_NODE_ID,
+- node: ExprKind::Err,
++ kind: ExprKind::Err,
+ span: DUMMY_SP,
+ attrs: ThinVec::new(),
++ tokens: None,
+ }),
+ );
+- e.node = ExprKind::Paren(inner);
++ e.kind = ExprKind::Paren(inner);
+ }
+ }
+ }
+
+- fn flat_map_field(&mut self, mut f: Field) -> SmallVec<[Field; 1]> {
+- if f.is_shorthand {
+- noop_visit_expr(&mut f.expr, self);
+- } else {
+- self.visit_expr(&mut f.expr);
++ fn visit_generic_arg(&mut self, arg: &mut GenericArg) {
++ match arg {
++ // Don't wrap const generic arg as that's invalid syntax.
++ GenericArg::Const(arg) => noop_visit_expr(&mut arg.value, self),
++ _ => noop_visit_generic_arg(arg, self),
+ }
+- SmallVec::from([f])
++ }
++
++ fn visit_block(&mut self, block: &mut P<Block>) {
++ self.visit_id(&mut block.id);
++ block
++ .stmts
++ .flat_map_in_place(|stmt| flat_map_stmt(stmt, self));
++ self.visit_span(&mut block.span);
+ }
+
+ // We don't want to look at expressions that might appear in patterns or
+@@ -267,25 +302,8 @@ fn libsyntax_brackets(mut libsyntax_expr: P<ast::Expr>) -> Option<P<ast::Expr>>
+ let _ = ty;
+ }
+
+- fn flat_map_stmt(&mut self, stmt: Stmt) -> SmallVec<[Stmt; 1]> {
+- let node = match stmt.node {
+- // Don't wrap toplevel expressions in statements.
+- StmtKind::Expr(mut e) => {
+- noop_visit_expr(&mut e, self);
+- StmtKind::Expr(e)
+- }
+- StmtKind::Semi(mut e) => {
+- noop_visit_expr(&mut e, self);
+- StmtKind::Semi(e)
+- }
+- s => s,
+- };
+-
+- smallvec![Stmt { node, ..stmt }]
+- }
+-
+- fn visit_mac(&mut self, mac: &mut Mac) {
+- // By default when folding over macros, libsyntax panics. This is
++ fn visit_mac(&mut self, mac: &mut MacCall) {
++ // By default when folding over macros, librustc panics. This is
+ // because it's usually not what you want, you want to run after
+ // macro expansion. We do want to do that (syn doesn't do macro
+ // expansion), so we implement visit_mac to just return the macro
+@@ -295,11 +313,11 @@ fn libsyntax_brackets(mut libsyntax_expr: P<ast::Expr>) -> Option<P<ast::Expr>>
+ }
+
+ let mut folder = BracketsVisitor { failed: false };
+- folder.visit_expr(&mut libsyntax_expr);
++ folder.visit_expr(&mut librustc_expr);
+ if folder.failed {
+ None
+ } else {
+- Some(libsyntax_expr)
++ Some(librustc_expr)
+ }
+ }
+
+@@ -318,14 +336,33 @@ fn syn_brackets(syn_expr: syn::Expr) -> syn::Expr {
+ Expr::If(..) | Expr::Unsafe(..) | Expr::Block(..) | Expr::Let(..) => {
+ fold_expr(self, expr)
+ }
+- node => Expr::Paren(ExprParen {
++ _ => Expr::Paren(ExprParen {
+ attrs: Vec::new(),
+- expr: Box::new(fold_expr(self, node)),
++ expr: Box::new(fold_expr(self, expr)),
+ paren_token: token::Paren::default(),
+ }),
+ }
+ }
+
++ fn fold_generic_argument(&mut self, arg: GenericArgument) -> GenericArgument {
++ match arg {
++ // Don't wrap const generic arg as that's invalid syntax.
++ GenericArgument::Const(a) => GenericArgument::Const(fold_expr(self, a)),
++ _ => fold_generic_argument(self, arg),
++ }
++ }
++
++ fn fold_generic_method_argument(
++ &mut self,
++ arg: GenericMethodArgument,
++ ) -> GenericMethodArgument {
++ match arg {
++ // Don't wrap const generic arg as that's invalid syntax.
++ GenericMethodArgument::Const(a) => GenericMethodArgument::Const(fold_expr(self, a)),
++ _ => fold_generic_method_argument(self, arg),
++ }
++ }
++
+ fn fold_stmt(&mut self, stmt: Stmt) -> Stmt {
+ match stmt {
+ // Don't wrap toplevel expressions in statements.
+@@ -360,7 +397,10 @@ fn collect_exprs(file: syn::File) -> Vec<syn::Expr> {
+ struct CollectExprs(Vec<Expr>);
+ impl Fold for CollectExprs {
+ fn fold_expr(&mut self, expr: Expr) -> Expr {
+- self.0.push(expr);
++ match expr {
++ Expr::Verbatim(tokens) if tokens.is_empty() => {}
++ _ => self.0.push(expr),
++ }
+
+ Expr::Tuple(ExprTuple {
+ attrs: vec![],
+diff --git a/third_party/rust/syn/tests/test_receiver.rs b/third_party/rust/syn/tests/test_receiver.rs
+new file mode 100644
+index 0000000000..923df96ba9
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_receiver.rs
+@@ -0,0 +1,127 @@
++use syn::{parse_quote, FnArg, Receiver, TraitItemMethod};
++
++#[test]
++fn test_by_value() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn by_value(self: Self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_by_mut_value() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn by_mut(mut self: Self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_by_ref() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn by_ref(self: &Self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_by_box() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn by_box(self: Box<Self>);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_by_pin() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn by_pin(self: Pin<Self>);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_explicit_type() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn explicit_type(self: Pin<MyType>);
++ };
++ match sig.receiver() {
++ Some(FnArg::Typed(_)) => (),
++ value => panic!("expected FnArg::Typed, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_value_shorthand() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn value_shorthand(self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Receiver(Receiver {
++ reference: None,
++ mutability: None,
++ ..
++ })) => (),
++ value => panic!("expected FnArg::Receiver without ref/mut, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_mut_value_shorthand() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn mut_value_shorthand(mut self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Receiver(Receiver {
++ reference: None,
++ mutability: Some(_),
++ ..
++ })) => (),
++ value => panic!("expected FnArg::Receiver with mut, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_ref_shorthand() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn ref_shorthand(&self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Receiver(Receiver {
++ reference: Some(_),
++ mutability: None,
++ ..
++ })) => (),
++ value => panic!("expected FnArg::Receiver with ref, got {:?}", value),
++ }
++}
++
++#[test]
++fn test_ref_mut_shorthand() {
++ let TraitItemMethod { sig, .. } = parse_quote! {
++ fn ref_mut_shorthand(&mut self);
++ };
++ match sig.receiver() {
++ Some(FnArg::Receiver(Receiver {
++ reference: Some(_),
++ mutability: Some(_),
++ ..
++ })) => (),
++ value => panic!("expected FnArg::Receiver with ref+mut, got {:?}", value),
++ }
++}
+diff --git a/third_party/rust/syn/tests/test_round_trip.rs b/third_party/rust/syn/tests/test_round_trip.rs
+index 2fc9cecd86..260dd0c3d9 100644
+--- mozilla-release/third_party/rust/syn/tests/test_round_trip.rs
++++ mozilla-release/third_party/rust/syn/tests/test_round_trip.rs
+@@ -2,22 +2,20 @@
+ #![recursion_limit = "1024"]
+ #![feature(rustc_private)]
+
+-extern crate quote;
+-extern crate rayon;
+-extern crate syn;
+-extern crate syntax;
+-extern crate syntax_pos;
+-extern crate walkdir;
+-
+-mod features;
++extern crate rustc_ast;
++extern crate rustc_errors;
++extern crate rustc_expand;
++extern crate rustc_parse as parse;
++extern crate rustc_session;
++extern crate rustc_span;
+
+ use quote::quote;
+ use rayon::iter::{IntoParallelIterator, ParallelIterator};
+-use syntax::ast;
+-use syntax::parse::{self, PResult, ParseSess};
+-use syntax::source_map::FilePathMapping;
+-use syntax_pos::edition::Edition;
+-use syntax_pos::FileName;
++use rustc_ast::ast;
++use rustc_errors::PResult;
++use rustc_session::parse::ParseSess;
++use rustc_span::source_map::FilePathMapping;
++use rustc_span::FileName;
+ use walkdir::{DirEntry, WalkDir};
+
+ use std::fs::File;
+@@ -38,8 +36,8 @@ mod repo;
+ use common::eq::SpanlessEq;
+
+ #[test]
+-#[cfg_attr(target_os = "windows", ignore = "requires nix .sh")]
+ fn test_round_trip() {
++ common::rayon_init();
+ repo::clone_rust();
+ let abort_after = common::abort_after();
+ if abort_after == 0 {
+@@ -78,11 +76,12 @@ fn test_round_trip() {
+ }
+ };
+ let back = quote!(#krate).to_string();
++ let edition = repo::edition(path).parse().unwrap();
+
+ let equal = panic::catch_unwind(|| {
+- syntax::with_globals(Edition::Edition2018, || {
++ rustc_span::with_session_globals(edition, || {
+ let sess = ParseSess::new(FilePathMapping::empty());
+- let before = match libsyntax_parse(content, &sess) {
++ let before = match librustc_parse(content, &sess) {
+ Ok(before) => before,
+ Err(mut diagnostic) => {
+ diagnostic.cancel();
+@@ -93,7 +92,7 @@ fn test_round_trip() {
+ errorf!("=== {}: ignore\n", path.display());
+ } else {
+ errorf!(
+- "=== {}: ignore - libsyntax failed to parse original content: {}\n",
++ "=== {}: ignore - librustc failed to parse original content: {}\n",
+ path.display(),
+ diagnostic.message()
+ );
+@@ -101,10 +100,10 @@ fn test_round_trip() {
+ return true;
+ }
+ };
+- let after = match libsyntax_parse(back, &sess) {
++ let after = match librustc_parse(back, &sess) {
+ Ok(after) => after,
+ Err(mut diagnostic) => {
+- errorf!("=== {}: libsyntax failed to parse", path.display());
++ errorf!("=== {}: librustc failed to parse", path.display());
+ diagnostic.emit();
+ return false;
+ }
+@@ -130,7 +129,7 @@ fn test_round_trip() {
+ })
+ });
+ match equal {
+- Err(_) => errorf!("=== {}: ignoring libsyntax panic\n", path.display()),
++ Err(_) => errorf!("=== {}: ignoring librustc panic\n", path.display()),
+ Ok(true) => {}
+ Ok(false) => {
+ let prev_failed = failed.fetch_add(1, Ordering::SeqCst);
+@@ -147,7 +146,7 @@ fn test_round_trip() {
+ }
+ }
+
+-fn libsyntax_parse(content: String, sess: &ParseSess) -> PResult<ast::Crate> {
++fn librustc_parse(content: String, sess: &ParseSess) -> PResult<ast::Crate> {
+ let name = FileName::Custom("test_round_trip".to_string());
+ parse::parse_crate_from_source_str(name, content, sess)
+ }
+diff --git a/third_party/rust/syn/tests/test_shebang.rs b/third_party/rust/syn/tests/test_shebang.rs
+new file mode 100644
+index 0000000000..dc26b9aab3
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_shebang.rs
+@@ -0,0 +1,59 @@
++#[macro_use]
++mod macros;
++
++#[test]
++fn test_basic() {
++ let content = "#!/usr/bin/env rustx\nfn main() {}";
++ let file = syn::parse_file(content).unwrap();
++ snapshot!(file, @r###"
++ File {
++ shebang: Some("#!/usr/bin/env rustx"),
++ items: [
++ Item::Fn {
++ vis: Inherited,
++ sig: Signature {
++ ident: "main",
++ generics: Generics,
++ output: Default,
++ },
++ block: Block,
++ },
++ ],
++ }
++ "###);
++}
++
++#[test]
++fn test_comment() {
++ let content = "#!//am/i/a/comment\n[allow(dead_code)] fn main() {}";
++ let file = syn::parse_file(content).unwrap();
++ snapshot!(file, @r###"
++ File {
++ attrs: [
++ Attribute {
++ style: Inner,
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "allow",
++ arguments: None,
++ },
++ ],
++ },
++ tokens: TokenStream(`(dead_code)`),
++ },
++ ],
++ items: [
++ Item::Fn {
++ vis: Inherited,
++ sig: Signature {
++ ident: "main",
++ generics: Generics,
++ output: Default,
++ },
++ block: Block,
++ },
++ ],
++ }
++ "###);
++}
+diff --git a/third_party/rust/syn/tests/test_should_parse.rs b/third_party/rust/syn/tests/test_should_parse.rs
+index aadf42e3af..180d859916 100644
+--- mozilla-release/third_party/rust/syn/tests/test_should_parse.rs
++++ mozilla-release/third_party/rust/syn/tests/test_should_parse.rs
+@@ -1,7 +1,3 @@
+-extern crate syn;
+-
+-mod features;
+-
+ macro_rules! should_parse {
+ ($name:ident, { $($in:tt)* }) => {
+ #[test]
+diff --git a/third_party/rust/syn/tests/test_size.rs b/third_party/rust/syn/tests/test_size.rs
+index 386d4df889..01e8401158 100644
+--- mozilla-release/third_party/rust/syn/tests/test_size.rs
++++ mozilla-release/third_party/rust/syn/tests/test_size.rs
+@@ -1,7 +1,5 @@
+ #![cfg(target_pointer_width = "64")]
+
+-mod features;
+-
+ use std::mem;
+ use syn::*;
+
+diff --git a/third_party/rust/syn/tests/test_stmt.rs b/third_party/rust/syn/tests/test_stmt.rs
+new file mode 100644
+index 0000000000..d68b47fd2f
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_stmt.rs
+@@ -0,0 +1,44 @@
++#[macro_use]
++mod macros;
++
++use syn::Stmt;
++
++#[test]
++fn test_raw_operator() {
++ let stmt = syn::parse_str::<Stmt>("let _ = &raw const x;").unwrap();
++
++ snapshot!(stmt, @r###"
++ Local(Local {
++ pat: Pat::Wild,
++ init: Some(Verbatim(`& raw const x`)),
++ })
++ "###);
++}
++
++#[test]
++fn test_raw_variable() {
++ let stmt = syn::parse_str::<Stmt>("let _ = &raw;").unwrap();
++
++ snapshot!(stmt, @r###"
++ Local(Local {
++ pat: Pat::Wild,
++ init: Some(Expr::Reference {
++ expr: Expr::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "raw",
++ arguments: None,
++ },
++ ],
++ },
++ },
++ }),
++ })
++ "###);
++}
++
++#[test]
++fn test_raw_invalid() {
++ assert!(syn::parse_str::<Stmt>("let _ = &raw x;").is_err());
++}
+diff --git a/third_party/rust/syn/tests/test_token_trees.rs b/third_party/rust/syn/tests/test_token_trees.rs
+index 70a9a72aab..5b00448af8 100644
+--- mozilla-release/third_party/rust/syn/tests/test_token_trees.rs
++++ mozilla-release/third_party/rust/syn/tests/test_token_trees.rs
+@@ -1,9 +1,3 @@
+-extern crate proc_macro2;
+-extern crate quote;
+-extern crate syn;
+-
+-mod features;
+-
+ #[macro_use]
+ mod macros;
+
+@@ -21,7 +15,11 @@ fn test_struct() {
+ }
+ ";
+
+- snapshot!(input as TokenStream, @"`# [ derive ( Debug , Clone ) ] pub struct Item { pub ident : Ident , pub attrs : Vec < Attribute >, }`");
++ snapshot!(input as TokenStream, @r###"
++ TokenStream(
++ `# [derive (Debug , Clone)] pub struct Item { pub ident : Ident , pub attrs : Vec < Attribute >, }`,
++ )
++ "###);
+ }
+
+ #[test]
+diff --git a/third_party/rust/syn/tests/test_ty.rs b/third_party/rust/syn/tests/test_ty.rs
+new file mode 100644
+index 0000000000..9cbdcd6b99
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_ty.rs
+@@ -0,0 +1,53 @@
++#[macro_use]
++mod macros;
++
++use proc_macro2::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
++use quote::quote;
++use std::iter::FromIterator;
++use syn::Type;
++
++#[test]
++fn test_mut_self() {
++ syn::parse_str::<Type>("fn(mut self)").unwrap();
++ syn::parse_str::<Type>("fn(mut self: ())").unwrap();
++ syn::parse_str::<Type>("fn(mut self: ...)").unwrap_err();
++ syn::parse_str::<Type>("fn(mut self: mut self)").unwrap_err();
++ syn::parse_str::<Type>("fn(mut self::T)").unwrap_err();
++}
++
++#[test]
++fn test_macro_variable_type() {
++ // mimics the token stream corresponding to `$ty<T>`
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, quote! { ty })),
++ TokenTree::Punct(Punct::new('<', Spacing::Alone)),
++ TokenTree::Ident(Ident::new("T", Span::call_site())),
++ TokenTree::Punct(Punct::new('>', Spacing::Alone)),
++ ]);
++
++ snapshot!(tokens as Type, @r###"
++ Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "ty",
++ arguments: PathArguments::AngleBracketed {
++ args: [
++ Type(Type::Path {
++ path: Path {
++ segments: [
++ PathSegment {
++ ident: "T",
++ arguments: None,
++ },
++ ],
++ },
++ }),
++ ],
++ },
++ },
++ ],
++ },
++ }
++ "###);
++}
+diff --git a/third_party/rust/syn/tests/test_visibility.rs b/third_party/rust/syn/tests/test_visibility.rs
+new file mode 100644
+index 0000000000..c3d0ac7a5b
+--- /dev/null
++++ mozilla-release/third_party/rust/syn/tests/test_visibility.rs
+@@ -0,0 +1,145 @@
++#[macro_use]
++mod macros;
++
++use proc_macro2::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
++use std::iter::FromIterator;
++use syn::parse::{Parse, ParseStream};
++use syn::{DeriveInput, Result, Visibility};
++
++#[derive(Debug)]
++struct VisRest {
++ vis: Visibility,
++ rest: TokenStream,
++}
++
++impl Parse for VisRest {
++ fn parse(input: ParseStream) -> Result<Self> {
++ Ok(VisRest {
++ vis: input.parse()?,
++ rest: input.parse()?,
++ })
++ }
++}
++
++macro_rules! assert_vis_parse {
++ ($input:expr, Ok($p:pat)) => {
++ assert_vis_parse!($input, Ok($p) + "");
++ };
++
++ ($input:expr, Ok($p:pat) + $rest:expr) => {
++ let expected = $rest.parse::<TokenStream>().unwrap();
++ let parse: VisRest = syn::parse_str($input).unwrap();
++
++ match parse.vis {
++ $p => {}
++ _ => panic!("Expected {}, got {:?}", stringify!($p), parse.vis),
++ }
++
++ // NOTE: Round-trips through `to_string` to avoid potential whitespace
++ // diffs.
++ assert_eq!(parse.rest.to_string(), expected.to_string());
++ };
++
++ ($input:expr, Err) => {
++ syn::parse2::<VisRest>($input.parse().unwrap()).unwrap_err();
++ };
++}
++
++#[test]
++fn test_pub() {
++ assert_vis_parse!("pub", Ok(Visibility::Public(_)));
++}
++
++#[test]
++fn test_crate() {
++ assert_vis_parse!("crate", Ok(Visibility::Crate(_)));
++}
++
++#[test]
++fn test_inherited() {
++ assert_vis_parse!("", Ok(Visibility::Inherited));
++}
++
++#[test]
++fn test_in() {
++ assert_vis_parse!("pub(in foo::bar)", Ok(Visibility::Restricted(_)));
++}
++
++#[test]
++fn test_pub_crate() {
++ assert_vis_parse!("pub(crate)", Ok(Visibility::Restricted(_)));
++}
++
++#[test]
++fn test_pub_self() {
++ assert_vis_parse!("pub(self)", Ok(Visibility::Restricted(_)));
++}
++
++#[test]
++fn test_pub_super() {
++ assert_vis_parse!("pub(super)", Ok(Visibility::Restricted(_)));
++}
++
++#[test]
++fn test_missing_in() {
++ assert_vis_parse!("pub(foo::bar)", Ok(Visibility::Public(_)) + "(foo::bar)");
++}
++
++#[test]
++fn test_missing_in_path() {
++ assert_vis_parse!("pub(in)", Err);
++}
++
++#[test]
++fn test_crate_path() {
++ assert_vis_parse!("pub(crate::A, crate::B)", Ok(Visibility::Public(_)) + "(crate::A, crate::B)");
++}
++
++#[test]
++fn test_junk_after_in() {
++ assert_vis_parse!("pub(in some::path @@garbage)", Err);
++}
++
++#[test]
++fn test_empty_group_vis() {
++ // mimics `struct S { $vis $field: () }` where $vis is empty
++ let tokens = TokenStream::from_iter(vec![
++ TokenTree::Ident(Ident::new("struct", Span::call_site())),
++ TokenTree::Ident(Ident::new("S", Span::call_site())),
++ TokenTree::Group(Group::new(
++ Delimiter::Brace,
++ TokenStream::from_iter(vec![
++ TokenTree::Group(Group::new(Delimiter::None, TokenStream::new())),
++ TokenTree::Group(Group::new(
++ Delimiter::None,
++ TokenStream::from_iter(vec![TokenTree::Ident(Ident::new(
++ "f",
++ Span::call_site(),
++ ))]),
++ )),
++ TokenTree::Punct(Punct::new(':', Spacing::Alone)),
++ TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
++ ]),
++ )),
++ ]);
++
++ snapshot!(tokens as DeriveInput, @r###"
++ DeriveInput {
++ vis: Inherited,
++ ident: "S",
++ generics: Generics,
++ data: Data::Struct {
++ fields: Fields::Named {
++ named: [
++ Field {
++ vis: Inherited,
++ ident: Some("f"),
++ colon_token: Some,
++ ty: Type::Tuple,
++ },
++ ],
++ },
++ },
++ }
++ "###);
++}
+diff --git a/third_party/rust/syn/tests/zzz_stable.rs b/third_party/rust/syn/tests/zzz_stable.rs
+index a81b3df4d0..a1a670d9ed 100644
+--- mozilla-release/third_party/rust/syn/tests/zzz_stable.rs
++++ mozilla-release/third_party/rust/syn/tests/zzz_stable.rs
+@@ -1,7 +1,5 @@
+ #![cfg(syn_disable_nightly_tests)]
+
+-extern crate termcolor;
+-
+ use std::io::{self, Write};
+ use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor};
+
+@@ -10,7 +8,7 @@ const MSG: &str = "\
+ ‖ WARNING:
+ ‖ This is not a nightly compiler so not all tests were able to
+ ‖ run. Syn includes tests that compare Syn's parser against the
+-‖ compiler's parser, which requires access to unstable libsyntax
++‖ compiler's parser, which requires access to unstable librustc
+ ‖ data structures and a nightly compiler.
+ ‖
+ ";
+--
+2.28.0
+
diff --git a/www/cliqz/files/patch-bug1667736 b/www/cliqz/files/patch-bug1667736
new file mode 100644
index 000000000000..c620b437c0ad
--- /dev/null
+++ b/www/cliqz/files/patch-bug1667736
@@ -0,0 +1,106 @@
+2 errors:
+error[E0432]: unresolved import `crate::arch::x86_64::_mm_movemask_pi8`
+https://github.com/rust-lang/packed_simd/pull/290
+
+unresolved import `crate::arch::x86_64::__m64`
+https://github.com/rust-lang/packed_simd/pull/292/commits/57d96e45916066fa9b5cdf2bc695e190207e78af
+
+From 950903a66950eaff745b0a029f2051d305df1c22 Mon Sep 17 00:00:00 2001
+From: Justus K <justus.k@protonmail.com>
+Date: Tue, 22 Sep 2020 15:36:03 +0200
+Subject: [PATCH] Remove `x86_m8x8_sse_impl` macro
+
+---
+ src/codegen/reductions/mask/x86/sse.rs | 32 --------------------------
+ 1 file changed, 32 deletions(-)
+
+diff --git a/src/codegen/reductions/mask/x86/sse.rs b/src/codegen/reductions/mask/x86/sse.rs
+index 7482f943..eb1ef7fa 100644
+--- mozilla-release/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs
++++ mozilla-release/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs
+@@ -34,35 +34,3 @@ macro_rules! x86_m32x4_sse_impl {
+ }
+ };
+ }
+-
+-macro_rules! x86_m8x8_sse_impl {
+- ($id:ident) => {
+- impl All for $id {
+- #[inline]
+- #[target_feature(enable = "sse")]
+- unsafe fn all(self) -> bool {
+- #[cfg(target_arch = "x86")]
+- use crate::arch::x86::_mm_movemask_pi8;
+- #[cfg(target_arch = "x86_64")]
+- use crate::arch::x86_64::_mm_movemask_pi8;
+- // _mm_movemask_pi8(a) creates an 8bit mask containing the most
+- // significant bit of each byte of `a`. If all bits are set,
+- // then all 8 lanes of the mask are true.
+- _mm_movemask_pi8(crate::mem::transmute(self))
+- == u8::max_value() as i32
+- }
+- }
+- impl Any for $id {
+- #[inline]
+- #[target_feature(enable = "sse")]
+- unsafe fn any(self) -> bool {
+- #[cfg(target_arch = "x86")]
+- use crate::arch::x86::_mm_movemask_pi8;
+- #[cfg(target_arch = "x86_64")]
+- use crate::arch::x86_64::_mm_movemask_pi8;
+-
+- _mm_movemask_pi8(crate::mem::transmute(self)) != 0
+- }
+- }
+- };
+-}
+--- mozilla-release/third_party/rust/packed_simd/src/lib.rs.orig 2019-02-05 21:18:53.000000000 +0100
++++ mozilla-release/third_party/rust/packed_simd/src/lib.rs 2020-11-18 15:06:43.736722000 +0100
+@@ -210,7 +210,6 @@
+ core_intrinsics,
+ stmt_expr_attributes,
+ align_offset,
+- mmx_target_feature,
+ crate_visibility_modifier,
+ custom_inner_attributes
+ )]
+diff --git a/src/codegen/reductions/mask/x86.rs b/src/codegen/reductions/mask/x86.rs
+index 2ae4ed81..bcfb1a6e 100644
+--- mozilla-release/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs
++++ mozilla-release/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs
+@@ -19,13 +19,7 @@ mod avx2;
+ /// x86 64-bit m8x8 implementation
+ macro_rules! x86_m8x8_impl {
+ ($id:ident) => {
+- cfg_if! {
+- if #[cfg(all(target_arch = "x86_64", target_feature = "sse"))] {
+- x86_m8x8_sse_impl!($id);
+- } else {
+- fallback_impl!($id);
+- }
+- }
++ fallback_impl!($id);
+ };
+ }
+
+From 57d96e45916066fa9b5cdf2bc695e190207e78af Mon Sep 17 00:00:00 2001
+From: Jubilee Young <workingjubilee@gmail.com>
+Date: Wed, 23 Sep 2020 12:23:29 -0700
+Subject: [PATCH] Remove __m64 type
+
+---
+ src/api/into_bits/arch_specific.rs | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/src/api/into_bits/arch_specific.rs b/src/api/into_bits/arch_specific.rs
+index 6cc2fa37..7b560107 100644
+--- mozilla-release/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs
++++ mozilla-release/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs
+@@ -84,7 +84,6 @@ macro_rules! impl_arch {
+ // FIXME: 64-bit single element types
+ // FIXME: arm/aarch float16x4_t missing
+ impl_arch!(
+- [x86["x86"]: __m64], [x86_64["x86_64"]: __m64],
+ [arm["arm"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t,
+ poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t,
+ uint64x1_t],
diff --git a/www/cliqz/files/patch-cliqz__env.sh b/www/cliqz/files/patch-cliqz__env.sh
new file mode 100644
index 000000000000..7b3c4f2c6d8c
--- /dev/null
+++ b/www/cliqz/files/patch-cliqz__env.sh
@@ -0,0 +1,27 @@
+Commented out the various wget(1) to prevent http traffic during build
+phase.
+
+--- cliqz_env.sh.orig 2020-07-17 14:00:07 UTC
++++ cliqz_env.sh
+@@ -109,9 +109,9 @@ export S3_BUCKET=repository.cliqz.com
+ export S3_BUCKET_SERVICE=cliqz-browser-data
+
+ # check CQZ_BUILD_ID and try to obtain, if not specified
+-if [ -z $CQZ_BUILD_ID ]; then
+- export CQZ_BUILD_ID="`wget -qO- https://$S3_BUCKET/dist/$CQZ_RELEASE_CHANNEL/$CQZ_VERSION/lastbuildid`"
+-fi
++#if [ -z $CQZ_BUILD_ID ]; then
++# export CQZ_BUILD_ID="`wget -qO- https://$S3_BUCKET/dist/$CQZ_RELEASE_CHANNEL/$CQZ_VERSION/lastbuildid`"
++#fi
+
+ if [ -z $CQZ_BUILD_ID ]; then
+ echo "CQZ_BUILD_ID not specified and can not be obtain from "$S3_BUCKET
+@@ -134,7 +134,7 @@ OBJ_DIR=$MOZ_OBJDIR
+ SRC_BASE=mozilla-release
+
+ # automatic forget tab - start
+-wget -O mozilla-release/browser/adult-domains.bin https://s3.amazonaws.com/cdn.cliqz.com/browser-f/APT/adult-domains.bin
++#wget -O mozilla-release/browser/adult-domains.bin https://s3.amazonaws.com/cdn.cliqz.com/browser-f/APT/adult-domains.bin
+ export CQZ_ADULT_DOMAINS_BF="adult-domains.bin"
+ # automatic forget tab - end
+
diff --git a/www/cliqz/files/patch-mozilla-release_config_rules.mk b/www/cliqz/files/patch-mozilla-release_config_rules.mk
new file mode 100644
index 000000000000..834205ca5b53
--- /dev/null
+++ b/www/cliqz/files/patch-mozilla-release_config_rules.mk
@@ -0,0 +1,34 @@
+--- mozilla-release/config/rules.mk.orig 2020-02-19 14:20:43 UTC
++++ mozilla-release/config/rules.mk
+@@ -914,27 +914,27 @@ $(EXTENSIONS_PATH):
+ CLIQZ_XPI_PATH = $(EXTENSIONS_PATH)/cliqz@cliqz.com.xpi
+ $(CLIQZ_XPI_PATH): $(EXTENSIONS_PATH)
+ echo CLIQZ_XPI_PATH in `pwd`
+- wget --output-document $(CLIQZ_XPI_PATH) $(CLIQZ_EXT_URL)
++# wget --output-document $(CLIQZ_XPI_PATH) $(CLIQZ_EXT_URL)
+
+ HTTPSE_XPI_PATH = $(EXTENSIONS_PATH)/https-everywhere@cliqz.com.xpi
+ $(HTTPSE_XPI_PATH): $(EXTENSIONS_PATH)
+ ifdef HTTPSE_EXT_URL
+ echo HTTPSE_XPI_PATH in `pwd`
+- wget --output-document $(HTTPSE_XPI_PATH) $(HTTPSE_EXT_URL)
++# wget --output-document $(HTTPSE_XPI_PATH) $(HTTPSE_EXT_URL)
+ endif
+
+ CONSENTRICK_XPI_PATH = $(EXTENSIONS_PATH)/gdprtool@cliqz.com.xpi
+ $(CONSENTRICK_XPI_PATH): $(EXTENSIONS_PATH)
+ ifdef CONSENTRICK_EXT_URL
+ echo CONSENTRICK_XPI_PATH in `pwd`
+- wget --output-document $(CONSENTRICK_XPI_PATH) $(CONSENTRICK_EXT_URL)
++# wget --output-document $(CONSENTRICK_XPI_PATH) $(CONSENTRICK_EXT_URL)
+ endif
+
+ DAT_XPI_PATH = $(EXTENSIONS_PATH)/dat@cliqz.com.xpi
+ $(DAT_XPI_PATH): $(EXTENSIONS_PATH)
+ ifdef DAT_EXT_URL
+ echo DAT_XPI_PATH in `pwd`
+- wget --output-document $(DAT_XPI_PATH) $(DAT_EXT_URL)
++# wget --output-document $(DAT_XPI_PATH) $(DAT_EXT_URL)
+ endif
+
+ CLIQZ_CFG = $(DIST_RESPATH)/cliqz.cfg
diff --git a/www/cliqz/files/patch-mozilla-release_gfx_skia_skia_src_core_SkCpu.cpp b/www/cliqz/files/patch-mozilla-release_gfx_skia_skia_src_core_SkCpu.cpp
new file mode 100644
index 000000000000..fc34ba26ca59
--- /dev/null
+++ b/www/cliqz/files/patch-mozilla-release_gfx_skia_skia_src_core_SkCpu.cpp
@@ -0,0 +1,32 @@
+Regressed by https://svnweb.freebsd.org/changeset/base/324815
+
+gfx/skia/skia/src/core/SkCpu.cpp:81:27: error: use of undeclared identifier 'getauxval'
+ uint32_t hwcaps = getauxval(AT_HWCAP);
+ ^
+
+--- mozilla-release/gfx/skia/skia/src/core/SkCpu.cpp.orig 2020-01-21 09:54:20 UTC
++++ mozilla-release/gfx/skia/skia/src/core/SkCpu.cpp
+@@ -72,6 +72,23 @@
+ return features;
+ }
+
++#elif defined(SK_CPU_ARM64) && defined(__FreeBSD__)
++ #include <machine/armreg.h>
++ #ifndef ID_AA64ISAR0_CRC32_VAL
++ #define ID_AA64ISAR0_CRC32_VAL ID_AA64ISAR0_CRC32
++ #endif
++
++ static uint32_t read_cpu_features() {
++ uint32_t features = 0;
++ uint64_t id_aa64isar0;
++
++ id_aa64isar0 = READ_SPECIALREG(id_aa64isar0_el1);
++ if (ID_AA64ISAR0_CRC32_VAL(id_aa64isar0) == ID_AA64ISAR0_CRC32_BASE) {
++ features |= SkCpu::CRC32;
++ }
++ return features;
++ }
++
+ #elif defined(SK_CPU_ARM64) && __has_include(<sys/auxv.h>)
+ #include <sys/auxv.h>
+
diff --git a/www/cliqz/pkg-descr b/www/cliqz/pkg-descr
new file mode 100644
index 000000000000..154c3bc0c55c
--- /dev/null
+++ b/www/cliqz/pkg-descr
@@ -0,0 +1,5 @@
+Cliqz develops novel Internet browsers that incorporate proprietary
+features such as search and anti-tracking. Cliqz desktop browser is
+based on Mozilla Firefox.
+
+WWW: https://cliqz.com/en/desktop
diff --git a/www/cliqz/pkg-plist b/www/cliqz/pkg-plist
new file mode 100644
index 000000000000..d52351180cdb
--- /dev/null
+++ b/www/cliqz/pkg-plist
@@ -0,0 +1,45 @@
+bin/cliqz
+lib/cliqz/application.ini
+lib/cliqz/browser/adult-domains.bin
+lib/cliqz/browser/chrome/icons/default/default128.png
+lib/cliqz/browser/chrome/icons/default/default16.png
+lib/cliqz/browser/chrome/icons/default/default32.png
+lib/cliqz/browser/chrome/icons/default/default48.png
+lib/cliqz/browser/chrome/icons/default/default64.png
+lib/cliqz/browser/features/cliqz@cliqz.com.xpi
+lib/cliqz/browser/features/gdprtool@cliqz.com.xpi
+lib/cliqz/browser/features/https-everywhere@cliqz.com.xpi
+lib/cliqz/browser/omni.ja
+lib/cliqz/cliqz
+lib/cliqz/cliqz-bin
+lib/cliqz/defaults/pref/channel-prefs.js
+lib/cliqz/dependentlibs.list
+lib/cliqz/fonts/TwemojiMozilla.ttf
+lib/cliqz/gmp-clearkey/0.1/libclearkey.so
+lib/cliqz/gmp-clearkey/0.1/manifest.json
+lib/cliqz/gtk2/libmozgtk.so
+lib/cliqz/libfreebl3.so
+lib/cliqz/liblgpllibs.so
+lib/cliqz/libmozavcodec.so
+lib/cliqz/libmozavutil.so
+lib/cliqz/libmozgtk.so
+lib/cliqz/libmozsqlite3.so
+%%WAYLAND%%lib/cliqz/libmozwayland.so
+lib/cliqz/libnspr4.so
+lib/cliqz/libnss3.so
+lib/cliqz/libnssckbi.so
+lib/cliqz/libnssutil3.so
+lib/cliqz/libplc4.so
+lib/cliqz/libplds4.so
+lib/cliqz/libsmime3.so
+lib/cliqz/libsoftokn3.so
+lib/cliqz/libssl3.so
+lib/cliqz/libxul.so
+lib/cliqz/omni.ja
+lib/cliqz/pingsender
+lib/cliqz/platform.ini
+lib/cliqz/plugin-container
+lib/cliqz/precomplete
+lib/cliqz/removed-files
+share/applications/cliqz.desktop
+share/pixmaps/cliqz.png
diff --git a/www/iridium/Makefile b/www/iridium/Makefile
new file mode 100644
index 000000000000..1de2a2d34b49
--- /dev/null
+++ b/www/iridium/Makefile
@@ -0,0 +1,270 @@
+# Created by: Carlos J. Puga Medina <cpm@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= iridium
+PORTVERSION= 2020.04.81
+PORTREVISION= 1
+CATEGORIES= www
+MASTER_SITES= https://downloads.iridiumbrowser.de/source/
+PKGNAMESUFFIX= -browser
+DISTNAME= ${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}
+
+MAINTAINER= chromium@FreeBSD.org
+COMMENT= Iridium browser
+
+LICENSE= BSD3CLAUSE LGPL21 MPL11
+LICENSE_COMB= multi
+
+BUILD_DEPENDS= gperf:devel/gperf \
+ yasm:devel/yasm \
+ ffmpeg>=3.2.2,1:multimedia/ffmpeg \
+ bash:shells/bash \
+ flock:sysutils/flock \
+ node:www/node \
+ ${LOCALBASE}/bin/ar:devel/binutils \
+ ${LOCALBASE}/include/linux/videodev2.h:multimedia/v4l_compat \
+ ${LOCALBASE}/share/usbids/usb.ids:misc/usbids \
+ ${PYTHON_PKGNAMEPREFIX}Jinja2>0:devel/py-Jinja2@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}ply>0:devel/py-ply@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}html5lib>0:www/py-html5lib@${PY_FLAVOR}
+
+LIB_DEPENDS= libatk-bridge-2.0.so:accessibility/at-spi2-atk \
+ libatspi.so:accessibility/at-spi2-core \
+ libspeechd.so:accessibility/speech-dispatcher \
+ libsnappy.so:archivers/snappy \
+ libFLAC.so:audio/flac \
+ libopus.so:audio/opus \
+ libspeex.so:audio/speex \
+ libdbus-1.so:devel/dbus \
+ libdbus-glib-1.so:devel/dbus-glib \
+ libicuuc.so:devel/icu \
+ libjsoncpp.so:devel/jsoncpp \
+ libpci.so:devel/libpci \
+ libnspr4.so:devel/nspr \
+ libre2.so:devel/re2 \
+ libcairo.so:graphics/cairo \
+ libdrm.so:graphics/libdrm \
+ libexif.so:graphics/libexif \
+ libpng.so:graphics/png \
+ libwebp.so:graphics/webp \
+ libavcodec.so:multimedia/ffmpeg \
+ libopenh264.so:multimedia/openh264 \
+ libfreetype.so:print/freetype2 \
+ libharfbuzz.so:print/harfbuzz \
+ libharfbuzz-icu.so:print/harfbuzz-icu \
+ libgcrypt.so:security/libgcrypt \
+ libsecret-1.so:security/libsecret \
+ libnss3.so:security/nss \
+ libexpat.so:textproc/expat2 \
+ libfontconfig.so:x11-fonts/fontconfig
+
+RUN_DEPENDS= xdg-open:devel/xdg-utils \
+ noto-basic>0:x11-fonts/noto-basic
+
+ONLY_FOR_ARCHS= amd64 i386
+
+USES= bison cpe desktop-file-utils dos2unix gl gnome jpeg localbase:ldflags \
+ ninja perl5 pkgconfig python:2.7,build shebangfix tar:xz xorg
+USE_GL= gbm gl
+USE_LDCONFIG= ${DATADIR}
+USE_PERL5= build
+USE_XORG= x11 xcb xcomposite xcursor xext xdamage xfixes xi \
+ xorgproto xrandr xrender xscrnsaver xtst
+USE_GNOME= atk dconf glib20 gtk30 libxml2 libxslt
+MAKE_ARGS= -C out/${BUILDTYPE}
+BINARY_ALIAS= python=${PYTHON_CMD}
+DOS2UNIX_FILES= third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h
+ALL_TARGET= chrome
+INSTALLS_ICONS= yes
+
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-clang
+
+# Run "./out/${BUILDTYPE}/gn args out/${BUILDTYPE} --list" for all variables.
+# Some parts don't have use_system_* flag, and can be turned on/off by using
+# replace_gn_files.py script, some parts just turned on/off for target host
+# OS "target_os == is_bsd", like libusb, libpci.
+GN_ARGS+= clang_use_chrome_plugins=false \
+ enable_hangout_services_extension=false \
+ enable_nacl=false \
+ enable_one_click_signin=true \
+ enable_remoting=false \
+ fieldtrial_testing_like_official_build=true \
+ is_clang=true \
+ toolkit_views=true \
+ treat_warnings_as_errors=false \
+ use_allocator="none" \
+ use_allocator_shim=false \
+ use_aura=true \
+ use_custom_libcxx=false \
+ use_gnome_keyring=false \
+ use_lld=true \
+ use_sysroot=false \
+ use_system_freetype=true \
+ use_system_harfbuzz=true \
+ use_system_libjpeg=true \
+ extra_cxxflags="${CXXFLAGS}" \
+ extra_ldflags="${LDFLAGS}"
+# TODO: investigate building with these options:
+# use_system_minigbm
+GN_BOOTSTRAP_FLAGS= --no-clean --no-rebuild --skip-generate-buildfiles
+
+SUB_FILES= iridium-browser.desktop iridium
+SUB_LIST+= COMMENT="${COMMENT}"
+
+OPTIONS_DEFINE= CODECS CUPS DEBUG KERBEROS
+CODECS_DESC= Compile and enable patented codecs like H.264
+OPTIONS_GROUP= AUDIO
+OPTIONS_GROUP_AUDIO= ALSA PULSEAUDIO SNDIO
+
+OPTIONS_DEFAULT= ALSA CODECS CUPS KERBEROS
+OPTIONS_SUB= yes
+
+ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib
+ALSA_RUN_DEPENDS= ${LOCALBASE}/lib/alsa-lib/libasound_module_pcm_oss.so:audio/alsa-plugins \
+ alsa-lib>=1.1.1_1:audio/alsa-lib
+ALSA_VARS= GN_ARGS+=use_alsa=true
+ALSA_VARS_OFF= GN_ARGS+=use_alsa=false
+
+CODECS_VARS= GN_ARGS+=ffmpeg_branding="Chrome" \
+ GN_ARGS+=proprietary_codecs=true
+CODECS_VARS_OFF= GN_ARGS+=ffmpeg_branding="Chromium" \
+ GN_ARGS+=proprietary_codecs=false
+
+CUPS_LIB_DEPENDS= libcups.so:print/cups
+CUPS_VARS= GN_ARGS+=use_cups=true
+CUPS_VARS_OFF= GN_ARGS+=use_cups=false
+
+DEBUG_VARS= BUILDTYPE=Debug \
+ GN_ARGS+=is_debug=true \
+ GN_ARGS+=is_component_build=false \
+ GN_ARGS+=symbol_level=1 \
+ GN_BOOTSTRAP_FLAGS+=--debug \
+ WANTSPACE="lots of free diskspace (~ 13GB)"
+DEBUG_VARS_OFF= BUILDTYPE=Release \
+ GN_ARGS+=blink_symbol_level=0 \
+ GN_ARGS+=is_debug=false \
+ GN_ARGS+=is_official_build=true \
+ GN_ARGS+=symbol_level=0 \
+ WANTSPACE="a fair amount of free diskspace (~ 6.5GB)"
+
+KERBEROS_VARS= GN_ARGS+=use_kerberos=true
+KERBEROS_VARS_OFF= GN_ARGS+=use_kerberos=false
+
+PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio
+PULSEAUDIO_VARS= GN_ARGS+=use_pulseaudio=true
+PULSEAUDIO_VARS_OFF= GN_ARGS+=use_pulseaudio=false
+
+# With SNDIO=on we exclude audio_manager_linux from the build (see
+# media/audio/BUILD.gn) and use audio_manager_openbsd which does not
+# support falling back to ALSA. In theory it supports falling back to
+# PulseAudio, but this is untested.
+SNDIO_PREVENTS= ALSA PULSEAUDIO
+SNDIO_LIB_DEPENDS= libsndio.so:audio/sndio
+SNDIO_VARS= GN_ARGS+=use_sndio=true
+SNDIO_VARS_OFF= GN_ARGS+=use_sndio=false
+
+# Make better javascript with java
+JAVA_BUILD= yes
+JAVA_VERSION= 1.8
+USE_JAVA= yes
+
+# Allow relocations against read-only segments (override lld default)
+LDFLAGS_i386= -Wl,-znotext
+
+# TODO: -isystem, would be just as ugly as this approach, but more reliably
+# build would fail without C_INCLUDE_PATH/CPLUS_INCLUDE_PATH env var set.
+MAKE_ENV+= C_INCLUDE_PATH=${LOCALBASE}/include \
+ CPLUS_INCLUDE_PATH=${LOCALBASE}/include
+
+pre-everything::
+ @${ECHO_MSG}
+ @${ECHO_MSG} "To build Iridium, you should have around 2GB of memory"
+ @${ECHO_MSG} "and ${WANTSPACE}."
+ @${ECHO_MSG}
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|@@PACKAGE@@|iridium|' \
+ -e 's|@@MENUNAME@@|Iridium Web Browser|' \
+ ${WRKSRC}/chrome/app/resources/manpage.1.in
+
+post-patch-SNDIO-on:
+ @${MKDIR} ${WRKSRC}/media/audio/sndio ${WRKSRC}/media/audio/openbsd
+ @${CP} ${FILESDIR}/sndio_output.* ${WRKSRC}/media/audio/sndio
+ @${CP} ${FILESDIR}/sndio_input.* ${WRKSRC}/media/audio/sndio
+ @${CP} ${FILESDIR}/audio_manager_openbsd.* ${WRKSRC}/media/audio/openbsd
+
+pre-configure:
+ # We used to remove bundled libraries to be sure that iridium uses
+ # system libraries and not shippen ones.
+ # cd ${WRKSRC} && ${PYTHON_CMD} \
+ #./build/linux/unbundle/remove_bundled_libraries.py [list of preserved]
+ cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} ${PYTHON_CMD} \
+ ./build/linux/unbundle/replace_gn_files.py --system-libraries \
+ ffmpeg flac fontconfig freetype harfbuzz-ng libdrm libpng libwebp libxml libxslt openh264 opus snappy yasm || ${FALSE}
+
+do-configure:
+ # GN generator bootstrapping and generating ninja files
+ cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} CC=${CC} CXX=${CXX} LD=${CXX} \
+ READELF=${READELF} AR=${AR} NM=${NM} ${PYTHON_CMD} \
+ ./tools/gn/bootstrap/bootstrap.py ${GN_BOOTSTRAP_FLAGS}
+ cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} ./out/${BUILDTYPE}/gn \
+ gen --args='${GN_ARGS}' out/${BUILDTYPE}
+
+ # Setup nodejs dependency
+ @${MKDIR} ${WRKSRC}/third_party/node/freebsd/node-freebsd-x64/bin
+ ${LN} -sf ${LOCALBASE}/bin/node ${WRKSRC}/third_party/node/freebsd/node-freebsd-x64/bin/node
+
+ # Setup java dependency
+ @${MKDIR} ${WRKDIR}/bin
+ ${LN} -sf ${LOCALBASE}/openjdk8/bin/java ${WRKDIR}/bin/java
+
+do-install:
+ @${MKDIR} ${STAGEDIR}${DATADIR}
+ ${INSTALL_MAN} ${WRKSRC}/chrome/app/resources/manpage.1.in \
+ ${STAGEDIR}${MANPREFIX}/man/man1/iridium.1
+ ${CP} ${WRKSRC}/chrome/app/theme/chromium/product_logo_22_mono.png ${WRKSRC}/chrome/app/theme/chromium/product_logo_22.png
+.for s in 22 24 48 64 128 256
+ @${MKDIR} ${STAGEDIR}${PREFIX}/share/icons/hicolor/${s}x${s}/apps
+ ${INSTALL_DATA} ${WRKSRC}/chrome/app/theme/chromium/product_logo_${s}.png \
+ ${STAGEDIR}${PREFIX}/share/icons/hicolor/${s}x${s}/apps/iridium.png
+.endfor
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/*.png ${STAGEDIR}${DATADIR}
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/*.pak ${STAGEDIR}${DATADIR}
+
+.for d in protoc mksnapshot
+ ${INSTALL_PROGRAM} ${WRKSRC}/out/${BUILDTYPE}/${d} ${STAGEDIR}${DATADIR}
+.endfor
+.for d in icudtl.dat snapshot_blob.bin v8_context_snapshot.bin
+ ${INSTALL_DATA} ${WRKSRC}/out/${BUILDTYPE}/${d} ${STAGEDIR}${DATADIR}
+.endfor
+ ${INSTALL_PROGRAM} ${WRKSRC}/out/${BUILDTYPE}/chrome \
+ ${STAGEDIR}${DATADIR}/iridium
+ cd ${WRKSRC}/out/${BUILDTYPE} && \
+ ${COPYTREE_SHARE} "locales resources" ${STAGEDIR}${DATADIR}
+ @${MKDIR} ${STAGEDIR}${DESKTOPDIR}
+ ${INSTALL_DATA} ${WRKDIR}/iridium-browser.desktop \
+ ${STAGEDIR}${DESKTOPDIR}
+ ${INSTALL_SCRIPT} ${WRKDIR}/iridium ${STAGEDIR}${PREFIX}/bin
+
+ # ANGLE, EGL, Vk
+.for f in libEGL.so libGLESv2.so libVkICD_mock_icd.so
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/${f} ${STAGEDIR}${DATADIR}
+.endfor
+
+ # SwiftShader
+ @${MKDIR} ${STAGEDIR}${DATADIR}/swiftshader
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/libvk_swiftshader.so ${STAGEDIR}${DATADIR}
+.for g in libEGL.so libGLESv2.so
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/swiftshader/${g} \
+ ${STAGEDIR}${DATADIR}/swiftshader
+.endfor
+
+post-install-DEBUG-on:
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/libVkLayer_khronos_validation.so \
+ ${STAGEDIR}${DATADIR}
+ ${INSTALL_LIB} ${WRKSRC}/out/${BUILDTYPE}/*.so \
+ ${STAGEDIR}${DATADIR}
+ ${INSTALL_PROGRAM} ${WRKSRC}/out/${BUILDTYPE}/character_data_generator \
+ ${STAGEDIR}${DATADIR}
+
+.include <bsd.port.mk>
diff --git a/www/iridium/distinfo b/www/iridium/distinfo
new file mode 100644
index 000000000000..c3950662e4b2
--- /dev/null
+++ b/www/iridium/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1586612680
+SHA256 (iridium-browser-2020.04.81.tar.xz) = b9283170001db5f93d9edec61d1abfd2ad66918c266b2cf88cb448470811ab91
+SIZE (iridium-browser-2020.04.81.tar.xz) = 854266540
diff --git a/www/iridium/files/audio_manager_openbsd.cc b/www/iridium/files/audio_manager_openbsd.cc
new file mode 100644
index 000000000000..ee293b9d3791
--- /dev/null
+++ b/www/iridium/files/audio_manager_openbsd.cc
@@ -0,0 +1,177 @@
+// 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/metrics/histogram_macros.h"
+#include "base/memory/ptr_util.h"
+
+#include "media/audio/openbsd/audio_manager_openbsd.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"
+#else
+#include "media/audio/fake_audio_manager.h"
+#endif
+#include "media/base/limits.h"
+#include "media/base/media_switches.h"
+
+namespace media {
+
+enum OpenBSDAudioIO {
+ kPulse,
+ kSndio,
+ kAudioIOMax = kSndio
+};
+
+#if defined(USE_SNDIO)
+// Maximum number of output streams that can be open simultaneously.
+static const int kMaxOutputStreams = 4;
+
+// 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 AudioManagerOpenBSD::HasAudioOutputDevices() {
+ return true;
+}
+
+bool AudioManagerOpenBSD::HasAudioInputDevices() {
+ return true;
+}
+
+void AudioManagerOpenBSD::GetAudioInputDeviceNames(
+ AudioDeviceNames* device_names) {
+ DCHECK(device_names->empty());
+ AddDefaultDevice(device_names);
+}
+
+void AudioManagerOpenBSD::GetAudioOutputDeviceNames(
+ AudioDeviceNames* device_names) {
+ AddDefaultDevice(device_names);
+}
+
+#if defined(USE_SNDIO)
+const char* AudioManagerOpenBSD::GetName() {
+ return "SNDIO";
+}
+#endif
+
+AudioParameters AudioManagerOpenBSD::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, CHANNEL_LAYOUT_STEREO,
+ kDefaultSampleRate, buffer_size);
+}
+
+AudioManagerOpenBSD::AudioManagerOpenBSD(std::unique_ptr<AudioThread> audio_thread,
+ AudioLogFactory* audio_log_factory)
+ : AudioManagerBase(std::move(audio_thread),
+ audio_log_factory) {
+ DLOG(WARNING) << "AudioManagerOpenBSD";
+ SetMaxOutputStreamsAllowed(kMaxOutputStreams);
+}
+
+AudioManagerOpenBSD::~AudioManagerOpenBSD() {
+ Shutdown();
+}
+
+AudioOutputStream* AudioManagerOpenBSD::MakeLinearOutputStream(
+ const AudioParameters& params,
+ const LogCallback& log_callback) {
+ DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
+ return MakeOutputStream(params);
+}
+
+AudioOutputStream* AudioManagerOpenBSD::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* AudioManagerOpenBSD::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* AudioManagerOpenBSD::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 AudioManagerOpenBSD::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;
+
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
+ int sample_rate = kDefaultSampleRate;
+ int buffer_size = kDefaultOutputBufferSize;
+ if (input_params.IsValid()) {
+ sample_rate = input_params.sample_rate();
+ channel_layout = input_params.channel_layout();
+ 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,
+ sample_rate, buffer_size);
+}
+
+AudioInputStream* AudioManagerOpenBSD::MakeInputStream(
+ const AudioParameters& params) {
+ DLOG(WARNING) << "MakeInputStream";
+ return new SndioAudioInputStream(this,
+ AudioDeviceDescription::kDefaultDeviceId, params);
+}
+
+AudioOutputStream* AudioManagerOpenBSD::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";
+#if defined(USE_SNDIO)
+ UMA_HISTOGRAM_ENUMERATION("Media.OpenBSDAudioIO", kSndio, kAudioIOMax + 1);
+ return std::make_unique<AudioManagerOpenBSD>(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/www/iridium/files/audio_manager_openbsd.h b/www/iridium/files/audio_manager_openbsd.h
new file mode 100644
index 000000000000..8c99db966d65
--- /dev/null
+++ b/www/iridium/files/audio_manager_openbsd.h
@@ -0,0 +1,65 @@
+// 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_OPENBSD_AUDIO_MANAGER_OPENBSD_H_
+#define MEDIA_AUDIO_OPENBSD_AUDIO_MANAGER_OPENBSD_H_
+
+#include <set>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/threading/thread.h"
+#include "media/audio/audio_manager_base.h"
+
+namespace media {
+
+class MEDIA_EXPORT AudioManagerOpenBSD : public AudioManagerBase {
+ public:
+ AudioManagerOpenBSD(std::unique_ptr<AudioThread> audio_thread,
+ AudioLogFactory* audio_log_factory);
+ ~AudioManagerOpenBSD() 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);
+
+ DISALLOW_COPY_AND_ASSIGN(AudioManagerOpenBSD);
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_OPENBSD_AUDIO_MANAGER_OPENBSD_H_
diff --git a/www/iridium/files/extra-patch-clang b/www/iridium/files/extra-patch-clang
new file mode 100644
index 000000000000..887a416b5f2d
--- /dev/null
+++ b/www/iridium/files/extra-patch-clang
@@ -0,0 +1,40 @@
+--- base/strings/safe_sprintf_unittest.cc.orig 2019-03-11 22:00:51 UTC
++++ base/strings/safe_sprintf_unittest.cc
+@@ -730,6 +730,7 @@ TEST(SafeSPrintfTest, EmbeddedNul) {
+ }
+
+ TEST(SafeSPrintfTest, EmitNULL) {
++/* Avoid compiler error: http://pastebin.com/1edWUE84
+ char buf[40];
+ #if defined(__GNUC__)
+ #pragma GCC diagnostic push
+@@ -741,6 +742,7 @@ TEST(SafeSPrintfTest, EmitNULL) {
+ EXPECT_EQ("0x0", std::string(buf));
+ EXPECT_EQ(6, SafeSPrintf(buf, "%s", NULL));
+ EXPECT_EQ("<NULL>", std::string(buf));
++*/
+ #if defined(__GCC__)
+ #pragma GCC diagnostic pop
+ #endif
+--- base/threading/thread_local_storage_unittest.cc.orig 2019-03-11 22:00:51 UTC
++++ base/threading/thread_local_storage_unittest.cc
+@@ -86,7 +86,7 @@ class ThreadLocalStorageRunner : public DelegateSimple
+ void ThreadLocalStorageCleanup(void *value) {
+ int *ptr = reinterpret_cast<int*>(value);
+ // Destructors should never be called with a NULL.
+- ASSERT_NE(reinterpret_cast<int*>(NULL), ptr);
++ ASSERT_NE(static_cast<int*>(NULL), ptr);
+ if (*ptr == kFinalTlsValue)
+ return; // We've been called enough times.
+ ASSERT_LT(kFinalTlsValue, *ptr);
+--- media/audio/audio_output_proxy_unittest.cc.orig 2019-03-11 22:00:59 UTC
++++ media/audio/audio_output_proxy_unittest.cc
+@@ -410,7 +410,7 @@ class AudioOutputProxyTest : public testing::Test {
+ // |stream| is closed at this point. Start() should reopen it again.
+ EXPECT_CALL(manager(), MakeAudioOutputStream(_, _, _))
+ .Times(2)
+- .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL)));
++ .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
+
+ EXPECT_CALL(callback_, OnError()).Times(2);
+
diff --git a/www/iridium/files/iridium-browser.desktop.in b/www/iridium/files/iridium-browser.desktop.in
new file mode 100644
index 000000000000..cb92990ad825
--- /dev/null
+++ b/www/iridium/files/iridium-browser.desktop.in
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Encoding=UTF-8
+Name=Iridium
+Comment=%%COMMENT%%
+Icon=iridium
+Exec=iridium %U
+Categories=Application;Network;WebBrowser;
+MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
+StartupNotify=true
diff --git a/www/iridium/files/iridium.in b/www/iridium/files/iridium.in
new file mode 100644
index 000000000000..0237611bb622
--- /dev/null
+++ b/www/iridium/files/iridium.in
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+SYSCTL=kern.ipc.shm_allow_removed
+if [ "`/sbin/sysctl -n $SYSCTL`" = 0 ] ; then
+ cat << EOMSG
+For correct operation, shared memory support has to be enabled
+in Iridium by performing the following command as root :
+
+sysctl $SYSCTL=1
+
+To preserve this setting across reboots, append the following
+to /etc/sysctl.conf :
+
+$SYSCTL=1
+EOMSG
+ exit 1
+fi
+ulimit -c 0
+exec %%PREFIX%%/share/iridium/iridium ${1+"$@"}
diff --git a/www/iridium/files/patch-3p-pdfium_3p_base_allocator_partition__allocator_page__allocator__internals__posix.h b/www/iridium/files/patch-3p-pdfium_3p_base_allocator_partition__allocator_page__allocator__internals__posix.h
new file mode 100644
index 000000000000..a3130315b68e
--- /dev/null
+++ b/www/iridium/files/patch-3p-pdfium_3p_base_allocator_partition__allocator_page__allocator__internals__posix.h
@@ -0,0 +1,11 @@
+--- third_party/pdfium/third_party/base/allocator/partition_allocator/page_allocator_internals_posix.h.orig 2020-04-03 04:13:08 UTC
++++ third_party/pdfium/third_party/base/allocator/partition_allocator/page_allocator_internals_posix.h
+@@ -16,7 +16,7 @@
+ #if defined(OS_ANDROID)
+ #include <sys/prctl.h>
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/resource.h>
+
+ #include <algorithm>
diff --git a/www/iridium/files/patch-BUILD.gn b/www/iridium/files/patch-BUILD.gn
new file mode 100644
index 000000000000..0af06e81260e
--- /dev/null
+++ b/www/iridium/files/patch-BUILD.gn
@@ -0,0 +1,95 @@
+--- BUILD.gn.orig 2020-03-16 18:40:27 UTC
++++ BUILD.gn
+@@ -418,7 +418,7 @@ group("gn_all") {
+ ]
+ }
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android) {
+ deps += [
+ "//third_party/breakpad:breakpad_unittests",
+ "//third_party/breakpad:core-2-minidump",
+@@ -459,8 +459,6 @@ group("gn_all") {
+ "//net:disk_cache_memory_test",
+ "//net:quic_client",
+ "//net:quic_server",
+- "//sandbox/linux:chrome_sandbox",
+- "//sandbox/linux:sandbox_linux_unittests",
+ "//testing:empty_main",
+ ]
+
+@@ -515,10 +513,6 @@ group("gn_all") {
+ "//chrome/test:load_library_perf_tests",
+ "//chrome/test:sync_performance_tests",
+ "//chrome/test/chromedriver:chromedriver",
+- "//courgette:courgette",
+- "//courgette:courgette_fuzz",
+- "//courgette:courgette_minimal_tool",
+- "//courgette:courgette_unittests",
+ "//media/cast:generate_barcode_video",
+ "//media/cast:generate_timecode_audio",
+ "//net:crash_cache",
+@@ -575,10 +569,6 @@ group("gn_all") {
+ "//mojo:mojo_perftests",
+ "//services/service_manager/public/cpp",
+ "//testing/gmock:gmock_main",
+- "//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_android) {
+@@ -652,7 +642,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)" ]
+ }
+
+@@ -794,7 +784,6 @@ group("gn_all") {
+ "//chrome/browser/vr:vr_common_perftests",
+ "//chrome/browser/vr:vr_common_unittests",
+ "//chrome/browser/vr:vr_pixeltests",
+- "//tools/perf/contrib/vr_benchmarks:vr_perf_tests",
+ ]
+ if (is_desktop_linux && use_ozone) {
+ deps += [ "//chrome/browser/vr/testapp:vr_testapp" ]
+@@ -934,7 +923,6 @@ if (is_chromeos) {
+ "//ppapi/examples/video_decode",
+ "//sandbox/linux:chrome_sandbox",
+ "//sandbox/linux:sandbox_linux_unittests",
+- "//third_party/breakpad:minidump_stackwalk($host_toolchain)",
+
+ # Blocked on https://github.com/catapult-project/catapult/issues/2297
+ #"//third_party/catapult/telemetry:bitmaptools",
+@@ -1092,7 +1080,7 @@ if (!is_ios) {
+ ]
+ }
+
+- if (!is_win && !is_android) {
++ if (!is_win && !is_android && !is_bsd) {
+ data_deps +=
+ [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
+@@ -1101,7 +1089,7 @@ if (!is_ios) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [ "//third_party/breakpad:dump_syms($host_toolchain)" ]
+ }
+
+@@ -1231,9 +1219,6 @@ group("chromium_builder_perf") {
+
+ if (is_win) {
+ data_deps += [ "//chrome/installer/mini_installer:mini_installer" ]
+- } else {
+- data_deps +=
+- [ "//third_party/breakpad:minidump_stackwalk($host_toolchain)" ]
+ }
+ if (is_win || is_android) {
+ data_deps += [
diff --git a/www/iridium/files/patch-apps_app__restore__service__browsertest.cc b/www/iridium/files/patch-apps_app__restore__service__browsertest.cc
new file mode 100644
index 000000000000..dc9a47b7323a
--- /dev/null
+++ b/www/iridium/files/patch-apps_app__restore__service__browsertest.cc
@@ -0,0 +1,11 @@
+--- apps/app_restore_service_browsertest.cc.orig 2020-03-23 15:18:04 UTC
++++ apps/app_restore_service_browsertest.cc
+@@ -147,7 +147,7 @@ IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, FileAcc
+ }
+
+ // Flaky: crbug.com/269613
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #define MAYBE_FileAccessIsRestored DISABLED_FileAccessIsRestored
+ #else
+ #define MAYBE_FileAccessIsRestored FileAccessIsRestored
diff --git a/www/iridium/files/patch-apps_ui_views_app__window__frame__view.cc b/www/iridium/files/patch-apps_ui_views_app__window__frame__view.cc
new file mode 100644
index 000000000000..8f6bd623a3b3
--- /dev/null
+++ b/www/iridium/files/patch-apps_ui_views_app__window__frame__view.cc
@@ -0,0 +1,11 @@
+--- apps/ui/views/app_window_frame_view.cc.orig 2019-06-04 18:55:14 UTC
++++ apps/ui/views/app_window_frame_view.cc
+@@ -125,7 +125,7 @@ gfx::Rect AppWindowFrameView::GetBoundsForClientView()
+ gfx::Rect AppWindowFrameView::GetWindowBoundsForClientBounds(
+ const gfx::Rect& client_bounds) const {
+ gfx::Rect window_bounds = client_bounds;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // 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/www/iridium/files/patch-ash_display_mirror__window__controller.cc b/www/iridium/files/patch-ash_display_mirror__window__controller.cc
new file mode 100644
index 000000000000..d5bf99f6dba3
--- /dev/null
+++ b/www/iridium/files/patch-ash_display_mirror__window__controller.cc
@@ -0,0 +1,14 @@
+--- ash/display/mirror_window_controller.cc.orig 2020-03-16 18:40:27 UTC
++++ ash/display/mirror_window_controller.cc
+@@ -276,7 +276,11 @@ void MirrorWindowController::UpdateWindow(
+ return info.id() == iter->first;
+ }) == display_info_list.end()) {
+ 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/www/iridium/files/patch-base_BUILD.gn b/www/iridium/files/patch-base_BUILD.gn
new file mode 100644
index 000000000000..30f1110ebaff
--- /dev/null
+++ b/www/iridium/files/patch-base_BUILD.gn
@@ -0,0 +1,98 @@
+--- base/BUILD.gn.orig 2020-03-16 18:40:27 UTC
++++ base/BUILD.gn
+@@ -912,7 +912,7 @@ jumbo_component("base") {
+ "timer/hi_res_timer_manager_posix.cc",
+ ]
+
+- if (!is_nacl && !is_mac && !is_ios) {
++ if (!is_nacl && !is_mac && !is_ios && !is_bsd) {
+ sources += [
+ "profiler/stack_copier_signal.cc",
+ "profiler/stack_copier_signal.h",
+@@ -921,6 +921,12 @@ jumbo_component("base") {
+ "profiler/thread_delegate_posix.h",
+ ]
+ }
++
++ if (is_bsd) {
++ sources += [
++ "profiler/stack_sampler_posix.cc",
++ ]
++ }
+ }
+
+ if (is_win) {
+@@ -1305,7 +1311,7 @@ jumbo_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_linux && !is_chromecast)) &&
++ if (!use_sysroot && (is_android || (is_linux && !is_chromecast) && !is_clang) &&
+ host_toolchain != "//build/toolchain/cros:host") {
+ libs += [ "atomic" ]
+ }
+@@ -1331,7 +1337,7 @@ jumbo_component("base") {
+ "allocator/allocator_shim_override_glibc_weak_symbols.h",
+ ]
+ deps += [ "//base/allocator:tcmalloc" ]
+- } else if (is_linux && use_allocator == "none") {
++ } else if ((is_linux && !is_bsd) && use_allocator == "none") {
+ sources += [ "allocator/allocator_shim_default_dispatch_to_glibc.cc" ]
+ } else if (is_android && use_allocator == "none") {
+ sources += [
+@@ -1930,6 +1936,33 @@ jumbo_component("base") {
+ }
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "files/file_path_watcher_linux.cc",
++ "files/file_util_linux.cc",
++ "process/memory_linux.cc",
++ "process/process_handle_linux.cc",
++ "process/process_iterator_linux.cc",
++ "process/process_metrics_linux.cc",
++ "system/sys_info_linux.cc"
++ ]
++ sources += [
++ "files/file_path_watcher_kqueue.cc",
++ "files/file_path_watcher_kqueue.h",
++ "files/file_path_watcher_stub.cc",
++ "process/memory_stubs.cc",
++ "process/process_handle_freebsd.cc",
++ "process/process_iterator_freebsd.cc",
++ "process/process_metrics_freebsd.cc",
++ "system/sys_info_freebsd.cc",
++ ]
++ libs = [
++ "execinfo", # logging.cc
++ "kvm", # process_metrics_freebsd
++ "util" # process_metrics_freebsd
++ ]
++ }
++
+ # iOS
+ if (is_ios) {
+ sources -= [
+@@ -2880,7 +2913,7 @@ test("base_unittests") {
+ "posix/unix_domain_socket_unittest.cc",
+ "task/thread_pool/task_tracker_posix_unittest.cc",
+ ]
+- if (!is_nacl && !is_mac && !is_ios) {
++ if (!is_nacl && !is_mac && !is_ios && !is_bsd) {
+ sources += [ "profiler/stack_copier_signal_unittest.cc" ]
+ }
+ }
+@@ -3068,6 +3101,12 @@ test("base_unittests") {
+
+ manifest = "//build/config/fuchsia/tests.cmx"
+ }
++
++ if (is_bsd) {
++ sources -= [
++ "debug/proc_maps_linux_unittest.cc",
++ ]
++ }
+
+ if (!is_fuchsia && !is_ios) {
+ sources += [ "files/file_locking_unittest.cc" ]
diff --git a/www/iridium/files/patch-base_allocator_allocator__shim.cc b/www/iridium/files/patch-base_allocator_allocator__shim.cc
new file mode 100644
index 000000000000..208a8d93617a
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_allocator__shim.cc
@@ -0,0 +1,11 @@
+--- base/allocator/allocator_shim.cc.orig 2019-10-21 19:06:18 UTC
++++ base/allocator/allocator_shim.cc
+@@ -71,7 +71,7 @@ inline const base::allocator::AllocatorDispatch* GetCh
+ // Unfortunately due to that bug NoBarrier_Load() is mistakenly fully
+ // barriered on Linux+Clang, and that causes visible perf regressons.
+ return reinterpret_cast<const base::allocator::AllocatorDispatch*>(
+-#if defined(OS_LINUX) && defined(__clang__)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && defined(__clang__)
+ *static_cast<const volatile base::subtle::AtomicWord*>(&g_chain_head)
+ #else
+ base::subtle::NoBarrier_Load(&g_chain_head)
diff --git a/www/iridium/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc b/www/iridium/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc
new file mode 100644
index 000000000000..c7b4ac21c804
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_allocator__shim__default__dispatch__to__glibc.cc
@@ -0,0 +1,76 @@
+--- base/allocator/allocator_shim_default_dispatch_to_glibc.cc.orig 2020-02-03 21:52:37 UTC
++++ base/allocator/allocator_shim_default_dispatch_to_glibc.cc
+@@ -6,18 +6,28 @@
+ #include "base/compiler_specific.h"
+
+ #include <dlfcn.h>
+-#include <malloc.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <malloc_np.h>
+
+ // This translation unit defines a default dispatch for the allocator shim which
+ // routes allocations to libc functions.
+-// The code here is strongly inspired from tcmalloc's libc_override_glibc.h.
++// The code here is strongly inspired from tcmalloc's override_glibc.h.
+
+ extern "C" {
+-void* __libc_malloc(size_t size);
+-void* __libc_calloc(size_t n, size_t size);
+-void* __libc_realloc(void* address, size_t size);
+-void* __libc_memalign(size_t alignment, size_t size);
+-void __libc_free(void* ptr);
++void* __malloc(size_t size);
++void* __calloc(size_t n, size_t size);
++void* __realloc(void* address, size_t len);
++void* __memalign(size_t alignment, size_t size) {
++ void *ret;
++ if (__posix_memalign(&ret, alignment, size) != 0) {
++ return nullptr;
++ } else {
++ return ret;
++ }
++}
++int __posix_memalign(void **ptr, size_t alignment, size_t size);
++void __free(void* ptr);
+ } // extern "C"
+
+ namespace {
+@@ -25,32 +35,32 @@ namespace {
+ using base::allocator::AllocatorDispatch;
+
+ void* GlibcMalloc(const AllocatorDispatch*, size_t size, void* context) {
+- return __libc_malloc(size);
++ return __malloc(size);
+ }
+
+ void* GlibcCalloc(const AllocatorDispatch*,
+ size_t n,
+ size_t size,
+ void* context) {
+- return __libc_calloc(n, size);
++ return __calloc(n, size);
+ }
+
+ void* GlibcRealloc(const AllocatorDispatch*,
+ void* address,
+ size_t size,
+ void* context) {
+- return __libc_realloc(address, size);
++ return __realloc(address, size);
+ }
+
+ void* GlibcMemalign(const AllocatorDispatch*,
+ size_t alignment,
+ size_t size,
+ void* context) {
+- return __libc_memalign(alignment, size);
++ return __memalign(alignment, size);
+ }
+
+ void GlibcFree(const AllocatorDispatch*, void* address, void* context) {
+- __libc_free(address);
++ __free(address);
+ }
+
+ NO_SANITIZE("cfi-icall")
diff --git a/www/iridium/files/patch-base_allocator_allocator__shim__override__libc__symbols.h b/www/iridium/files/patch-base_allocator_allocator__shim__override__libc__symbols.h
new file mode 100644
index 000000000000..fc9a47bd3daf
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_allocator__shim__override__libc__symbols.h
@@ -0,0 +1,11 @@
+--- base/allocator/allocator_shim_override_libc_symbols.h.orig 2019-03-11 22:00:51 UTC
++++ base/allocator/allocator_shim_override_libc_symbols.h
+@@ -10,7 +10,7 @@
+ #endif
+ #define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_
+
+-#include <malloc.h>
++#include <stdlib.h>
+
+ #include "base/allocator/allocator_shim_internals.h"
+
diff --git a/www/iridium/files/patch-base_allocator_allocator__shim__unittest.cc b/www/iridium/files/patch-base_allocator_allocator__shim__unittest.cc
new file mode 100644
index 000000000000..1f7664842a07
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_allocator__shim__unittest.cc
@@ -0,0 +1,45 @@
+--- base/allocator/allocator_shim_unittest.cc.orig 2020-03-16 18:39:41 UTC
++++ base/allocator/allocator_shim_unittest.cc
+@@ -348,7 +348,7 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ ASSERT_GE(aligned_allocs_intercepted_by_size[61], 1u);
+ #endif // !OS_WIN
+
+-#if !defined(OS_WIN) && !defined(OS_MACOSX)
++#if !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void* memalign_ptr = memalign(128, 53);
+ ASSERT_NE(nullptr, memalign_ptr);
+ ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(memalign_ptr) % 128);
+@@ -361,7 +361,7 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u);
+ // pvalloc rounds the size up to the next page.
+ ASSERT_GE(aligned_allocs_intercepted_by_size[kPageSize], 1u);
+-#endif // !OS_WIN && !OS_MACOSX
++#endif // !OS_WIN && !OS_MACOSX && !OS_BSD
+
+ char* realloc_ptr = static_cast<char*>(malloc(10));
+ strcpy(realloc_ptr, "foobar");
+@@ -377,13 +377,13 @@ TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
+ free(zero_alloc_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(zero_alloc_ptr)], 1u);
+
+-#if !defined(OS_WIN) && !defined(OS_MACOSX)
++#if !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ free(memalign_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(memalign_ptr)], 1u);
+
+ free(pvalloc_ptr);
+ ASSERT_GE(frees_intercepted_by_addr[Hash(pvalloc_ptr)], 1u);
+-#endif // !OS_WIN && !OS_MACOSX
++#endif // !OS_WIN && !OS_MACOSX && !OS_BSD
+
+ #if !defined(OS_WIN)
+ free(posix_memalign_ptr);
+@@ -550,7 +550,7 @@ static size_t GetAllocatedSize(void* ptr) {
+ static size_t GetAllocatedSize(void* ptr) {
+ return malloc_size(ptr);
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ static size_t GetAllocatedSize(void* ptr) {
+ return malloc_usable_size(ptr);
+ }
diff --git a/www/iridium/files/patch-base_allocator_partition__allocator_page__allocator__internals__posix.h b/www/iridium/files/patch-base_allocator_partition__allocator_page__allocator__internals__posix.h
new file mode 100644
index 000000000000..fbd28e22abe2
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_partition__allocator_page__allocator__internals__posix.h
@@ -0,0 +1,11 @@
+--- base/allocator/partition_allocator/page_allocator_internals_posix.h.orig 2019-10-21 19:06:18 UTC
++++ base/allocator/partition_allocator/page_allocator_internals_posix.h
+@@ -19,7 +19,7 @@
+ #if defined(OS_ANDROID)
+ #include <sys/prctl.h>
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_BSD) || defined(OS_LINUX)
+ #include <sys/resource.h>
+
+ #include <algorithm>
diff --git a/www/iridium/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc b/www/iridium/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc
new file mode 100644
index 000000000000..12143fe54c50
--- /dev/null
+++ b/www/iridium/files/patch-base_allocator_partition__allocator_partition__alloc__unittest.cc
@@ -0,0 +1,17 @@
+--- base/allocator/partition_allocator/partition_alloc_unittest.cc.orig 2020-03-23 15:20:45 UTC
++++ base/allocator/partition_allocator/partition_alloc_unittest.cc
+@@ -314,9 +314,13 @@ void FreeFullPage(PartitionPage* page) {
+ }
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ bool CheckPageInCore(void* ptr, bool in_core) {
++#if defined(OS_BSD)
++ char ret = 0;
++#else
+ unsigned char ret = 0;
++#endif
+ EXPECT_EQ(0, mincore(ptr, kSystemPageSize, &ret));
+ return in_core == (ret & 1);
+ }
diff --git a/www/iridium/files/patch-base_base__switches.cc b/www/iridium/files/patch-base_base__switches.cc
new file mode 100644
index 000000000000..92ed9217882d
--- /dev/null
+++ b/www/iridium/files/patch-base_base__switches.cc
@@ -0,0 +1,20 @@
+--- base/base_switches.cc.orig 2019-10-21 19:06:18 UTC
++++ base/base_switches.cc
+@@ -117,7 +117,7 @@ const char kDisableHighResTimer[] = "disable-highres-t
+ const char kDisableUsbKeyboardDetect[] = "disable-usb-keyboard-detect";
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // The /dev/shm partition is too small in certain VM environments, causing
+ // Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
+ // work-around this issue (a temporary directory will always be used to create
+@@ -138,7 +138,7 @@ const char kEnableCrashReporterForTesting[] =
+ const char kEnableReachedCodeProfiler[] = "enable-reached-code-profiler";
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Controls whether or not retired instruction counts are surfaced for threads
+ // in trace events on Linux.
+ //
diff --git a/www/iridium/files/patch-base_base__switches.h b/www/iridium/files/patch-base_base__switches.h
new file mode 100644
index 000000000000..f2be6f05c697
--- /dev/null
+++ b/www/iridium/files/patch-base_base__switches.h
@@ -0,0 +1,20 @@
+--- base/base_switches.h.orig 2019-10-21 19:06:18 UTC
++++ base/base_switches.h
+@@ -38,7 +38,7 @@ extern const char kDisableHighResTimer[];
+ extern const char kDisableUsbKeyboardDetect[];
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ extern const char kDisableDevShmUsage[];
+ #endif
+
+@@ -51,7 +51,7 @@ extern const char kEnableReachedCodeProfiler[];
+ extern const char kOrderfileMemoryOptimization[];
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kEnableThreadInstructionCount[];
+ #endif
+
diff --git a/www/iridium/files/patch-base_cpu.cc b/www/iridium/files/patch-base_cpu.cc
new file mode 100644
index 000000000000..231561a3a542
--- /dev/null
+++ b/www/iridium/files/patch-base_cpu.cc
@@ -0,0 +1,38 @@
+--- base/cpu.cc.orig 2019-10-21 19:06:18 UTC
++++ base/cpu.cc
+@@ -14,7 +14,7 @@
+
+ #include "base/stl_util.h"
+
+-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
++#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ #include "base/files/file_util.h"
+ #endif
+
+@@ -135,7 +135,7 @@ uint64_t xgetbv(uint32_t xcr) {
+
+ #endif // ARCH_CPU_X86_FAMILY
+
+-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
++#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ std::string* CpuInfoBrand() {
+ static std::string* brand = []() {
+ // This function finds the value from /proc/cpuinfo under the key "model
+@@ -165,7 +165,7 @@ std::string* CpuInfoBrand() {
+ return brand;
+ }
+ #endif // defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) ||
+- // defined(OS_LINUX))
++ // defined(OS_LINUX) || defined(OS_BSD))
+
+ } // namespace
+
+@@ -287,7 +287,7 @@ void CPU::Initialize() {
+ }
+ }
+ #elif defined(ARCH_CPU_ARM_FAMILY)
+-#if (defined(OS_ANDROID) || defined(OS_LINUX))
++#if (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ cpu_brand_ = *CpuInfoBrand();
+ #elif defined(OS_WIN)
+ // Windows makes high-resolution thread timing information available in
diff --git a/www/iridium/files/patch-base_debug_debugger__posix.cc b/www/iridium/files/patch-base_debug_debugger__posix.cc
new file mode 100644
index 000000000000..62317b93a5a1
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_debugger__posix.cc
@@ -0,0 +1,56 @@
+--- base/debug/debugger_posix.cc.orig 2019-09-09 21:55:05 UTC
++++ base/debug/debugger_posix.cc
+@@ -90,7 +90,7 @@ bool BeingDebugged() {
+ KERN_PROC,
+ KERN_PROC_PID,
+ getpid()
+-#if defined(OS_OPENBSD)
++#if defined(OS_BSD)
+ , sizeof(struct kinfo_proc),
+ 0
+ #endif
+@@ -98,33 +98,35 @@ bool BeingDebugged() {
+
+ // Caution: struct kinfo_proc is marked __APPLE_API_UNSTABLE. The source and
+ // binary interfaces may change.
+- struct kinfo_proc info;
+- size_t info_size = sizeof(info);
++ struct kinfo_proc *info;
++ size_t info_size;
+
+-#if defined(OS_OPENBSD)
+ if (sysctl(mib, base::size(mib), NULL, &info_size, NULL, 0) < 0)
+ return -1;
+
++ info = (struct kinfo_proc *)malloc(info_size);
+ mib[5] = (info_size / sizeof(struct kinfo_proc));
+-#endif
+
+- int sysctl_result = sysctl(mib, base::size(mib), &info, &info_size, NULL, 0);
++ int sysctl_result = sysctl(mib, base::size(mib), info, &info_size, NULL, 0);
+ 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 defined(OS_FREEBSD)
+- being_debugged = (info.ki_flag & P_TRACED) != 0;
++ being_debugged = (info->ki_flag & P_TRACED) != 0;
+ #elif defined(OS_BSD)
+- being_debugged = (info.p_flag & P_TRACED) != 0;
++ being_debugged = (info->p_flag & P_TRACED) != 0;
+ #else
+- being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
++ being_debugged = (info->kp_proc.p_flag & P_TRACED) != 0;
+ #endif
++
++out:
++ free(info);
+ return being_debugged;
+ }
+
diff --git a/www/iridium/files/patch-base_debug_elf__reader.cc b/www/iridium/files/patch-base_debug_elf__reader.cc
new file mode 100644
index 000000000000..8eca61e3c66e
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_elf__reader.cc
@@ -0,0 +1,28 @@
+--- base/debug/elf_reader.cc.orig 2020-02-24 18:39:05 UTC
++++ base/debug/elf_reader.cc
+@@ -35,7 +35,9 @@ using Nhdr = Elf64_Nhdr;
+ using Word = Elf64_Word;
+ #endif
+
++#if !defined(OS_BSD)
+ constexpr char kGnuNoteName[] = "GNU";
++#endif
+
+ // Returns a pointer to the header of the ELF binary mapped into memory,
+ // or a null pointer if the header is invalid.
+@@ -98,6 +100,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 !defined(OS_BSD)
+ if (current_note->n_type == NT_GNU_BUILD_ID) {
+ StringPiece note_name(current_section + sizeof(Nhdr),
+ current_note->n_namesz);
+@@ -107,6 +110,7 @@ size_t ReadElfBuildId(const void* elf_mapped_base,
+ break;
+ }
+ }
++#endif
+
+ size_t section_size = bits::Align(current_note->n_namesz, 4) +
+ bits::Align(current_note->n_descsz, 4) +
diff --git a/www/iridium/files/patch-base_debug_proc__maps__linux.cc b/www/iridium/files/patch-base_debug_proc__maps__linux.cc
new file mode 100644
index 000000000000..21024cb210a8
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_proc__maps__linux.cc
@@ -0,0 +1,141 @@
+--- base/debug/proc_maps_linux.cc.orig 2020-03-16 18:39:41 UTC
++++ base/debug/proc_maps_linux.cc
+@@ -12,7 +12,7 @@
+ #include "base/strings/string_split.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(OS_ANDROID)
+ #include <inttypes.h>
+ #endif
+
+@@ -28,6 +28,11 @@
+ namespace base {
+ namespace debug {
+
++#if defined(OS_BSD)
++const char kProcSelfMapsPath[] = "/proc/curproc/map";
++#else
++const char kProcSelfMapsPath[] = "/proc/self/maps";
++
+ // Scans |proc_maps| starting from |pos| returning true if the gate VMA was
+ // found, otherwise returns false.
+ static bool ContainsGateVMA(std::string* proc_maps, size_t pos) {
+@@ -43,15 +48,16 @@ static bool ContainsGateVMA(std::string* proc_maps, si
+ return false;
+ #endif
+ }
++#endif
+
+ bool ReadProcMaps(std::string* proc_maps) {
+ // seq_file only writes out a page-sized amount on each call. Refer to header
+ // file for details.
+ const long kReadSize = sysconf(_SC_PAGESIZE);
+
+- base::ScopedFD fd(HANDLE_EINTR(open("/proc/self/maps", O_RDONLY)));
++ base::ScopedFD fd(HANDLE_EINTR(open(kProcSelfMapsPath, O_RDONLY)));
+ if (!fd.is_valid()) {
+- DPLOG(ERROR) << "Couldn't open /proc/self/maps";
++ DPLOG(ERROR) << "Couldn't open " << kProcSelfMapsPath;
+ return false;
+ }
+ proc_maps->clear();
+@@ -65,7 +71,7 @@ bool ReadProcMaps(std::string* proc_maps) {
+
+ ssize_t bytes_read = HANDLE_EINTR(read(fd.get(), buffer, kReadSize));
+ if (bytes_read < 0) {
+- DPLOG(ERROR) << "Couldn't read /proc/self/maps";
++ DPLOG(ERROR) << "Couldn't read " << kProcSelfMapsPath;
+ proc_maps->clear();
+ return false;
+ }
+@@ -76,6 +82,7 @@ bool ReadProcMaps(std::string* proc_maps) {
+ if (bytes_read == 0)
+ break;
+
++#if !defined(OS_BSD)
+ // The gate VMA is handled as a special case after seq_file has finished
+ // iterating through all entries in the virtual memory table.
+ //
+@@ -86,6 +93,7 @@ bool ReadProcMaps(std::string* proc_maps) {
+ // Avoid this by searching for the gate VMA and breaking early.
+ if (ContainsGateVMA(proc_maps, pos))
+ break;
++#endif
+ }
+
+ return true;
+@@ -114,10 +122,32 @@ bool ParseProcMaps(const std::string& input,
+ MappedMemoryRegion region;
+ const char* line = lines[i].c_str();
+ char permissions[5] = {'\0'}; // Ensure NUL-terminated string.
++ int path_index = 0;
++
++#if defined(OS_BSD)
++ if (lines[i].empty())
++ continue;
++
++
++ char cow;
++
++ // Format:
++ //
++ // start end resident private_resident obj perms ref_count shadow_count flags cow needs_copy type fullpath cred ruid
++ // 0x200000 0x202000 2 6 0xfffff80005be9000 r-- 3 1 0x1000 COW NC vnode /bin/cat NCH -1
++ //
++ if (sscanf(line, "%" SCNxPTR " %" SCNxPTR " %*ld %*ld %*llx %3c %*d %*d %*x %c%*s %*s %*s %n",
++ &region.start, &region.end, permissions, &cow, &path_index) < 4) {
++ DPLOG(WARNING) << "sscanf failed for line: " << line;
++ return false;
++ }
++
++ const char* fullpath = line + path_index;
++ const char* cred = strchr(fullpath, ' ');
++#else
+ uint8_t dev_major = 0;
+ uint8_t dev_minor = 0;
+ long inode = 0;
+- int path_index = 0;
+
+ // Sample format from man 5 proc:
+ //
+@@ -133,6 +163,7 @@ bool ParseProcMaps(const std::string& input,
+ DPLOG(WARNING) << "sscanf failed for line: " << line;
+ return false;
+ }
++#endif
+
+ region.permissions = 0;
+
+@@ -151,14 +182,31 @@ bool ParseProcMaps(const std::string& input,
+ else if (permissions[2] != '-')
+ return false;
+
++#if defined(OS_BSD)
++ if (cow == 'C') {
++ region.permissions |= MappedMemoryRegion::PRIVATE;
++ } else if (cow != 'N') {
++ DPLOG(WARNING) << "unknown value for COW in line " << line << ": " << cow;
++ return false;
++ }
++#else
+ if (permissions[3] == 'p')
+ region.permissions |= MappedMemoryRegion::PRIVATE;
+ else if (permissions[3] != 's' && permissions[3] != 'S') // Shared memory.
+ return false;
++#endif
+
+ // Pushing then assigning saves us a string copy.
+ regions.push_back(region);
++#if defined(OS_BSD)
++ if (cred != nullptr) {
++ regions.back().path.assign(line + path_index, cred - fullpath);
++ } else {
++ regions.back().path.assign(line + path_index);
++ }
++#else
+ regions.back().path.assign(line + path_index);
++#endif
+ }
+
+ regions_out->swap(regions);
diff --git a/www/iridium/files/patch-base_debug_stack__trace.cc b/www/iridium/files/patch-base_debug_stack__trace.cc
new file mode 100644
index 000000000000..8d2156f365ff
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_stack__trace.cc
@@ -0,0 +1,11 @@
+--- base/debug/stack_trace.cc.orig 2019-03-17 21:37:51 UTC
++++ base/debug/stack_trace.cc
+@@ -14,7 +14,7 @@
+
+ #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include <pthread.h>
+ #include "base/process/process_handle.h"
+ #include "base/threading/platform_thread.h"
diff --git a/www/iridium/files/patch-base_debug_stack__trace.h b/www/iridium/files/patch-base_debug_stack__trace.h
new file mode 100644
index 000000000000..6b4e63dd1e32
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_stack__trace.h
@@ -0,0 +1,10 @@
+--- base/debug/stack_trace.h.orig 2019-09-09 21:55:05 UTC
++++ base/debug/stack_trace.h
+@@ -19,6 +19,7 @@
+ #if !defined(OS_NACL)
+ #include <signal.h>
+ #endif
++#include <sys/stdint.h>
+ #include <unistd.h>
+ #endif
+
diff --git a/www/iridium/files/patch-base_debug_stack__trace__posix.cc b/www/iridium/files/patch-base_debug_stack__trace__posix.cc
new file mode 100644
index 000000000000..f3b967c844e2
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_stack__trace__posix.cc
@@ -0,0 +1,23 @@
+--- base/debug/stack_trace_posix.cc.orig 2020-03-16 18:39:41 UTC
++++ base/debug/stack_trace_posix.cc
+@@ -35,7 +35,7 @@
+ #include <AvailabilityMacros.h>
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/debug/proc_maps_linux.h"
+ #endif
+
+@@ -697,7 +697,11 @@ class SandboxSymbolizeHelper {
+ // Skip regions with empty file names.
+ continue;
+ }
++#if defined(OS_BSD)
++ if (region.path[0] == '-') {
++#else
+ if (region.path[0] == '[') {
++#endif
+ // Skip pseudo-paths, like [stack], [vdso], [heap], etc ...
+ continue;
+ }
diff --git a/www/iridium/files/patch-base_debug_stack__trace__unittest.cc b/www/iridium/files/patch-base_debug_stack__trace__unittest.cc
new file mode 100644
index 000000000000..933a8e8ce401
--- /dev/null
+++ b/www/iridium/files/patch-base_debug_stack__trace__unittest.cc
@@ -0,0 +1,31 @@
+--- base/debug/stack_trace_unittest.cc.orig 2020-03-23 14:01:09 UTC
++++ base/debug/stack_trace_unittest.cc
+@@ -86,6 +86,7 @@ TEST_F(StackTraceTest, OutputToStream) {
+ std::string::npos)
+ << "Unable to resolve symbols.";
+
++#if !defined(OS_BSD)
+ // Expect a demangled symbol.
+ // Note that Windows Release builds omit the function parameters from the
+ // demangled stack output, otherwise this could be "testing::Test::Run()".
+@@ -103,9 +104,10 @@ TEST_F(StackTraceTest, OutputToStream) {
+ EXPECT_TRUE(backtrace_message.find(__func__) != std::string::npos)
+ << "Expected to find " << __func__ << " in backtrace:\n"
+ << backtrace_message;
++#endif
+ }
+
+-#if !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES)
++#if !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES) && !defined(OS_BSD)
+ // Disabled in Official builds, where Link-Time Optimization can result in two
+ // or fewer stack frames being available, causing the test to fail.
+ TEST_F(StackTraceTest, TruncatedTrace) {
+@@ -119,7 +121,7 @@ TEST_F(StackTraceTest, TruncatedTrace) {
+ truncated.Addresses(&count);
+ EXPECT_EQ(2u, count);
+ }
+-#endif // !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES)
++#endif // !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES) && !defined(OS_BSD)
+
+ // The test is used for manual testing, e.g., to see the raw output.
+ TEST_F(StackTraceTest, DebugOutputToStream) {
diff --git a/www/iridium/files/patch-base_files_file__path__unittest.cc b/www/iridium/files/patch-base_files_file__path__unittest.cc
new file mode 100644
index 000000000000..26521d022831
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__path__unittest.cc
@@ -0,0 +1,11 @@
+--- base/files/file_path_unittest.cc.orig 2020-03-16 18:39:41 UTC
++++ base/files/file_path_unittest.cc
+@@ -1149,7 +1149,7 @@ TEST_F(FilePathTest, FromUTF8Unsafe_And_AsUTF8Unsafe)
+ "\xEF\xBC\xA1\xEF\xBC\xA2\xEF\xBC\xA3.txt" },
+ };
+
+-#if !defined(SYSTEM_NATIVE_UTF8) && defined(OS_LINUX)
++#if !defined(SYSTEM_NATIVE_UTF8) && (defined(OS_LINUX) || defined(OS_BSD))
+ ScopedLocale locale("en_US.UTF-8");
+ #endif
+
diff --git a/www/iridium/files/patch-base_files_file__path__watcher.cc b/www/iridium/files/patch-base_files_file__path__watcher.cc
new file mode 100644
index 000000000000..87abcb7fbda1
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__path__watcher.cc
@@ -0,0 +1,15 @@
+--- base/files/file_path_watcher.cc.orig 2020-03-16 18:39:41 UTC
++++ base/files/file_path_watcher.cc
+@@ -20,10 +20,10 @@ FilePathWatcher::~FilePathWatcher() {
+ // static
+ bool FilePathWatcher::RecursiveWatchAvailable() {
+ #if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) || \
+- defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++ (defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_ANDROID) || defined(OS_AIX)
+ return true;
+ #else
+- // FSEvents isn't available on iOS.
++ // FSEvents isn't available on iOS and the kqueue watcher.
+ return false;
+ #endif
+ }
diff --git a/www/iridium/files/patch-base_files_file__path__watcher__kqueue.h b/www/iridium/files/patch-base_files_file__path__watcher__kqueue.h
new file mode 100644
index 000000000000..d5712de7a389
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__path__watcher__kqueue.h
@@ -0,0 +1,13 @@
+--- base/files/file_path_watcher_kqueue.h.orig 2019-03-11 22:00:51 UTC
++++ base/files/file_path_watcher_kqueue.h
+@@ -5,6 +5,10 @@
+ #ifndef BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+ #define BASE_FILES_FILE_PATH_WATCHER_KQUEUE_H_
+
++#ifdef __FreeBSD__
++#include <sys/stdint.h>
++#include <sys/types.h>
++#endif
+ #include <sys/event.h>
+
+ #include <memory>
diff --git a/www/iridium/files/patch-base_files_file__path__watcher__stub.cc b/www/iridium/files/patch-base_files_file__path__watcher__stub.cc
new file mode 100644
index 000000000000..fc76cd1b16b3
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__path__watcher__stub.cc
@@ -0,0 +1,53 @@
+--- base/files/file_path_watcher_stub.cc.orig 2020-03-16 18:39:41 UTC
++++ base/files/file_path_watcher_stub.cc
+@@ -1,14 +1,15 @@
+-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
++// 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.
+
+-// This file exists for Unix systems which don't have the inotify headers, and
+-// thus cannot build file_watcher_inotify.cc
+
+-#include "base/files/file_path_watcher.h"
++#include <memory>
+
++#include "base/files/file_path_watcher.h"
++#include "base/files/file_path_watcher_kqueue.h"
+ #include "base/macros.h"
+ #include "base/memory/ptr_util.h"
++#include "build/build_config.h"
+
+ namespace base {
+
+@@ -22,12 +23,29 @@ class FilePathWatcherImpl : public FilePathWatcher::Pl
+ bool Watch(const FilePath& path,
+ bool recursive,
+ const FilePathWatcher::Callback& callback) override {
++#if defined(OS_BSD)
++ DCHECK(!impl_.get());
++ if (recursive) {
++ return false;
++ } else {
++ impl_ = std::make_unique<FilePathWatcherKQueue>();
++ }
++ DCHECK(impl_.get());
++ return impl_->Watch(path, recursive, callback);
++#else
+ return false;
++#endif
+ }
+
+- void Cancel() override {}
++ void Cancel() override {
++ if (impl_.get())
++ impl_->Cancel();
++ set_cancelled();
++ }
+
+ private:
++ std::unique_ptr<PlatformDelegate> impl_;
++
+ DISALLOW_COPY_AND_ASSIGN(FilePathWatcherImpl);
+ };
+
diff --git a/www/iridium/files/patch-base_files_file__path__watcher__unittest.cc b/www/iridium/files/patch-base_files_file__path__watcher__unittest.cc
new file mode 100644
index 000000000000..5e7e385e5e23
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__path__watcher__unittest.cc
@@ -0,0 +1,41 @@
+--- base/files/file_path_watcher_unittest.cc.orig 2020-03-16 18:39:41 UTC
++++ base/files/file_path_watcher_unittest.cc
+@@ -435,7 +435,7 @@ TEST_F(FilePathWatcherTest, WatchDirectory) {
+ VLOG(1) << "Waiting for file1 creation";
+ ASSERT_TRUE(WaitForEvents());
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Mac implementation does not detect files modified in a directory.
+ ASSERT_TRUE(WriteFile(file1, "content v2"));
+ VLOG(1) << "Waiting for file1 modification";
+@@ -808,7 +808,7 @@ enum Permission {
+ Execute
+ };
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ bool ChangeFilePermissions(const FilePath& path, Permission perm, bool allow) {
+ struct stat stat_buf;
+
+@@ -837,9 +837,9 @@ bool ChangeFilePermissions(const FilePath& path, Permi
+ }
+ return chmod(path.value().c_str(), stat_buf.st_mode) == 0;
+ }
+-#endif // defined(OS_MACOSX)
++#endif // defined(OS_MACOSX) || defined(OS_BSD)
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // Linux implementation of FilePathWatcher doesn't catch attribute changes.
+ // http://crbug.com/78043
+ // Windows implementation of FilePathWatcher catches attribute changes that
+@@ -874,7 +874,7 @@ TEST_F(FilePathWatcherTest, DirAttributesChanged) {
+ ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, true));
+ }
+
+-#endif // OS_MACOSX
++#endif // OS_MACOSX || OS_BSD
+ } // namespace
+
+ } // namespace base
diff --git a/www/iridium/files/patch-base_files_file__util.h b/www/iridium/files/patch-base_files_file__util.h
new file mode 100644
index 000000000000..65171a867e06
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__util.h
@@ -0,0 +1,11 @@
+--- base/files/file_util.h.orig 2020-03-16 18:39:41 UTC
++++ base/files/file_util.h
+@@ -519,7 +519,7 @@ BASE_EXPORT bool VerifyPathControlledByAdmin(const bas
+ // the directory |path|, in the number of FilePath::CharType, or -1 on failure.
+ BASE_EXPORT int GetMaximumPathComponentLength(const base::FilePath& path);
+
+-#if defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ // Broad categories of file systems as returned by statfs() on Linux.
+ enum FileSystemType {
+ FILE_SYSTEM_UNKNOWN, // statfs failed.
diff --git a/www/iridium/files/patch-base_files_file__util__posix.cc b/www/iridium/files/patch-base_files_file__util__posix.cc
new file mode 100644
index 000000000000..4342a618c454
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__util__posix.cc
@@ -0,0 +1,11 @@
+--- base/files/file_util_posix.cc.orig 2020-02-03 21:52:37 UTC
++++ base/files/file_util_posix.cc
+@@ -411,7 +411,7 @@ bool CreatePipe(ScopedFD* read_fd, ScopedFD* write_fd,
+ }
+
+ bool CreateLocalNonBlockingPipe(int fds[2]) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return pipe2(fds, O_CLOEXEC | O_NONBLOCK) == 0;
+ #else
+ int raw_fds[2];
diff --git a/www/iridium/files/patch-base_files_file__util__unittest.cc b/www/iridium/files/patch-base_files_file__util__unittest.cc
new file mode 100644
index 000000000000..5ddff833acb1
--- /dev/null
+++ b/www/iridium/files/patch-base_files_file__util__unittest.cc
@@ -0,0 +1,20 @@
+--- base/files/file_util_unittest.cc.orig 2020-03-23 13:34:59 UTC
++++ base/files/file_util_unittest.cc
+@@ -3434,7 +3434,7 @@ TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
+ }
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ TEST_F(FileUtilTest, ReadFileToStringWithProcFileSystem) {
+ FilePath file_path("/proc/cpuinfo");
+ std::string data = "temp";
+@@ -3452,7 +3452,7 @@ TEST_F(FileUtilTest, ReadFileToStringWithProcFileSyste
+
+ EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 4));
+ }
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ TEST_F(FileUtilTest, ReadFileToStringWithLargeFile) {
+ std::string data(kLargeFileSize, 'c');
diff --git a/www/iridium/files/patch-base_files_scoped__file.cc b/www/iridium/files/patch-base_files_scoped__file.cc
new file mode 100644
index 000000000000..84ba47ff6aeb
--- /dev/null
+++ b/www/iridium/files/patch-base_files_scoped__file.cc
@@ -0,0 +1,11 @@
+--- base/files/scoped_file.cc.orig 2019-07-29 18:17:43 UTC
++++ base/files/scoped_file.cc
+@@ -30,7 +30,7 @@ void ScopedFDCloseTraits::Free(int fd) {
+ // a single open directory would bypass the entire security model.
+ int ret = IGNORE_EINTR(close(fd));
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || \
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || defined(OS_BSD) || \
+ defined(OS_ANDROID)
+ // NB: Some file descriptors can return errors from close() e.g. network
+ // filesystems such as NFS and Linux input devices. On Linux, macOS, and
diff --git a/www/iridium/files/patch-base_i18n_icu__util.cc b/www/iridium/files/patch-base_i18n_icu__util.cc
new file mode 100644
index 000000000000..34f2453a25de
--- /dev/null
+++ b/www/iridium/files/patch-base_i18n_icu__util.cc
@@ -0,0 +1,20 @@
+--- base/i18n/icu_util.cc.orig 2020-03-16 18:40:27 UTC
++++ base/i18n/icu_util.cc
+@@ -46,7 +46,7 @@
+ #endif
+
+ #if defined(OS_ANDROID) || defined(OS_FUCHSIA) || \
+- (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST))
++ (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST)) || defined(OS_BSD)
+ #include "third_party/icu/source/i18n/unicode/timezone.h"
+ #endif
+
+@@ -341,7 +341,7 @@ void InitializeIcuTimeZone() {
+ fuchsia::IntlProfileWatcher::GetPrimaryTimeZoneIdForIcuInitialization();
+ icu::TimeZone::adoptDefault(
+ icu::TimeZone::createTimeZone(icu::UnicodeString::fromUTF8(zone_id)));
+-#elif defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST)
++#elif (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST)) || defined(OS_BSD)
+ // To respond to the timezone change properly, the default timezone
+ // cache in ICU has to be populated on starting up.
+ // See TimeZoneMonitorLinux::NotifyClientsFromImpl().
diff --git a/www/iridium/files/patch-base_linux__util.cc b/www/iridium/files/patch-base_linux__util.cc
new file mode 100644
index 000000000000..216208c37181
--- /dev/null
+++ b/www/iridium/files/patch-base_linux__util.cc
@@ -0,0 +1,20 @@
+--- base/linux_util.cc.orig 2019-12-16 21:50:40 UTC
++++ base/linux_util.cc
+@@ -144,6 +144,8 @@ char g_linux_distro[kDistroSize] =
+ "CrOS";
+ #elif defined(OS_ANDROID)
+ "Android";
++#elif defined(OS_BSD)
++ "BSD";
+ #else // if defined(OS_LINUX)
+ "Unknown";
+ #endif
+@@ -164,7 +166,7 @@ BASE_EXPORT std::string GetKeyValueFromOSReleaseFileFo
+ }
+
+ std::string GetLinuxDistro() {
+-#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
++#if defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_BSD)
+ return g_linux_distro;
+ #elif defined(OS_LINUX)
+ LinuxDistroHelper* distro_state_singleton = LinuxDistroHelper::GetInstance();
diff --git a/www/iridium/files/patch-base_logging__unittest.cc b/www/iridium/files/patch-base_logging__unittest.cc
new file mode 100644
index 000000000000..2e9496b55220
--- /dev/null
+++ b/www/iridium/files/patch-base_logging__unittest.cc
@@ -0,0 +1,11 @@
+--- base/logging_unittest.cc.orig 2019-12-16 21:51:21 UTC
++++ base/logging_unittest.cc
+@@ -591,7 +591,7 @@ 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 defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ crash_addr = reinterpret_cast<uintptr_t>(info->si_addr);
+ #else // OS_POSIX && !OS_MACOSX
+ ucontext_t* context = reinterpret_cast<ucontext_t*>(context_ptr);
diff --git a/www/iridium/files/patch-base_memory_discardable__memory.cc b/www/iridium/files/patch-base_memory_discardable__memory.cc
new file mode 100644
index 000000000000..b50f404a2764
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_discardable__memory.cc
@@ -0,0 +1,63 @@
+--- base/memory/discardable_memory.cc.orig 2020-02-07 10:23:12 UTC
++++ base/memory/discardable_memory.cc
+@@ -23,7 +23,7 @@ const base::Feature kMadvFreeDiscardableMemory{
+ "MadvFreeDiscardableMemory", base::FEATURE_DISABLED_BY_DEFAULT};
+ #endif // defined(OS_POSIX)
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::Feature kDiscardableMemoryBackingTrial{
+ "DiscardableMemoryBackingTrial", base::FEATURE_DISABLED_BY_DEFAULT};
+
+@@ -41,13 +41,13 @@ const base::FeatureParam<DiscardableMemoryTrialGroup>
+ DiscardableMemoryTrialGroup::kEmulatedSharedMemory,
+ &kDiscardableMemoryBackingParamOptions};
+
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ } // namespace features
+
+ namespace {
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ DiscardableMemoryBacking GetBackingForFieldTrial() {
+ DiscardableMemoryTrialGroup trial_group =
+@@ -61,11 +61,11 @@ DiscardableMemoryBacking GetBackingForFieldTrial() {
+ }
+ NOTREACHED();
+ }
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ } // namespace
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Probe capabilities of this device to determine whether we should participate
+ // in the discardable memory backing trial.
+@@ -87,18 +87,18 @@ DiscardableMemoryTrialGroup GetDiscardableMemoryBackin
+ DCHECK(DiscardableMemoryBackingFieldTrialIsEnabled());
+ return features::kDiscardableMemoryBackingParam.Get();
+ }
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ DiscardableMemory::DiscardableMemory() = default;
+
+ DiscardableMemory::~DiscardableMemory() = default;
+
+ DiscardableMemoryBacking GetDiscardableMemoryBacking() {
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ if (DiscardableMemoryBackingFieldTrialIsEnabled()) {
+ return GetBackingForFieldTrial();
+ }
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_ANDROID)
+ if (ashmem_device_is_supported())
diff --git a/www/iridium/files/patch-base_memory_discardable__memory__internal.h b/www/iridium/files/patch-base_memory_discardable__memory__internal.h
new file mode 100644
index 000000000000..c8225e74d049
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_discardable__memory__internal.h
@@ -0,0 +1,19 @@
+--- base/memory/discardable_memory_internal.h.orig 2020-02-07 10:22:39 UTC
++++ base/memory/discardable_memory_internal.h
+@@ -10,7 +10,7 @@
+ #include "base/metrics/field_trial_params.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace base {
+
+@@ -47,6 +47,6 @@ GetDiscardableMemoryBackingFieldTrialGroup();
+
+ } // namespace base
+
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ #endif // BASE_MEMORY_DISCARDABLE_MEMORY_INTERNAL_H_
diff --git a/www/iridium/files/patch-base_memory_madv__free__discardable__memory__posix.cc b/www/iridium/files/patch-base_memory_madv__free__discardable__memory__posix.cc
new file mode 100644
index 000000000000..5368440e775b
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_madv__free__discardable__memory__posix.cc
@@ -0,0 +1,11 @@
+--- base/memory/madv_free_discardable_memory_posix.cc.orig 2020-03-16 18:39:41 UTC
++++ base/memory/madv_free_discardable_memory_posix.cc
+@@ -282,7 +282,7 @@ void MadvFreeDiscardableMemoryPosix::SetKeepMemoryForT
+
+ bool MadvFreeDiscardableMemoryPosix::IsResident() const {
+ DFAKE_SCOPED_RECURSIVE_LOCK(thread_collision_warner_);
+-#ifdef OS_MACOSX
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ std::vector<char> vec(allocated_pages_);
+ #else
+ std::vector<unsigned char> vec(allocated_pages_);
diff --git a/www/iridium/files/patch-base_memory_platform__shared__memory__region.h b/www/iridium/files/patch-base_memory_platform__shared__memory__region.h
new file mode 100644
index 000000000000..477b8029c4a6
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_platform__shared__memory__region.h
@@ -0,0 +1,29 @@
+--- base/memory/platform_shared_memory_region.h.orig 2020-02-03 21:52:37 UTC
++++ base/memory/platform_shared_memory_region.h
+@@ -27,7 +27,7 @@
+ #include "base/files/scoped_file.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ namespace content {
+ class SandboxIPCHandler;
+ }
+@@ -121,7 +121,7 @@ class BASE_EXPORT PlatformSharedMemoryRegion {
+ kMaxValue = GET_SHMEM_TEMP_DIR_FAILURE
+ };
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Structure to limit access to executable region creation.
+ struct ExecutableRegion {
+ private:
+@@ -266,7 +266,7 @@ class BASE_EXPORT PlatformSharedMemoryRegion {
+ CheckPlatformHandlePermissionsCorrespondToMode);
+ static PlatformSharedMemoryRegion Create(Mode mode,
+ size_t size
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ bool executable = false
+ #endif
diff --git a/www/iridium/files/patch-base_memory_platform__shared__memory__region__posix.cc b/www/iridium/files/patch-base_memory_platform__shared__memory__region__posix.cc
new file mode 100644
index 000000000000..c5f57c29c6bc
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_platform__shared__memory__region__posix.cc
@@ -0,0 +1,38 @@
+--- base/memory/platform_shared_memory_region_posix.cc.orig 2020-02-03 21:52:37 UTC
++++ base/memory/platform_shared_memory_region_posix.cc
+@@ -75,7 +75,7 @@ FDPair ScopedFDPair::get() const {
+ return {fd.get(), readonly_fd.get()};
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ ScopedFD PlatformSharedMemoryRegion::ExecutableRegion::CreateFD(size_t size) {
+ PlatformSharedMemoryRegion region =
+@@ -84,7 +84,7 @@ ScopedFD PlatformSharedMemoryRegion::ExecutableRegion:
+ return region.PassPlatformHandle().fd;
+ return ScopedFD();
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // static
+ PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Take(
+@@ -209,7 +209,7 @@ bool PlatformSharedMemoryRegion::MapAtInternal(off_t o
+ // static
+ PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Create(Mode mode,
+ size_t size
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ bool executable
+ #endif
+@@ -240,7 +240,7 @@ PlatformSharedMemoryRegion PlatformSharedMemoryRegion:
+ // flag.
+ FilePath directory;
+ if (!GetShmemTempDir(
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ executable,
+ #else
+ false /* executable */,
diff --git a/www/iridium/files/patch-base_memory_shared__memory__region__unittest.cc b/www/iridium/files/patch-base_memory_shared__memory__region__unittest.cc
new file mode 100644
index 000000000000..b2525b4381ee
--- /dev/null
+++ b/www/iridium/files/patch-base_memory_shared__memory__region__unittest.cc
@@ -0,0 +1,16 @@
+--- base/memory/shared_memory_region_unittest.cc.orig 2020-03-23 16:31:23 UTC
++++ base/memory/shared_memory_region_unittest.cc
+@@ -188,10 +188,13 @@ TYPED_TEST(SharedMemoryRegionTest, MapAtNotAlignedOffs
+ std::tie(region, rw_mapping) = CreateMappedRegion<TypeParam>(kDataSize);
+ ASSERT_TRUE(region.IsValid());
+ ASSERT_TRUE(rw_mapping.IsValid());
++#if !defined(OS_BSD)
++ // On FreeBSD, mmap() does not require an aligned offset
+ off_t offset = kDataSize / 2;
+ typename TypeParam::MappingType mapping =
+ region.MapAt(offset, kDataSize - offset);
+ EXPECT_FALSE(mapping.IsValid());
++#endif
+ }
+
+ TYPED_TEST(SharedMemoryRegionTest, MapZeroBytesFails) {
diff --git a/www/iridium/files/patch-base_native__library__posix.cc b/www/iridium/files/patch-base_native__library__posix.cc
new file mode 100644
index 000000000000..ba6a16756b10
--- /dev/null
+++ b/www/iridium/files/patch-base_native__library__posix.cc
@@ -0,0 +1,11 @@
+--- base/native_library_posix.cc.orig 2019-03-11 22:00:51 UTC
++++ base/native_library_posix.cc
+@@ -29,7 +29,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 defined(OS_ANDROID) || !defined(RTLD_DEEPBIND)
++#if defined(OS_ANDROID) || !defined(RTLD_DEEPBIND) || defined(OS_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/www/iridium/files/patch-base_native__library__unittest.cc b/www/iridium/files/patch-base_native__library__unittest.cc
new file mode 100644
index 000000000000..f76c5f8fd986
--- /dev/null
+++ b/www/iridium/files/patch-base_native__library__unittest.cc
@@ -0,0 +1,11 @@
+--- base/native_library_unittest.cc.orig 2019-03-11 22:00:51 UTC
++++ base/native_library_unittest.cc
+@@ -120,7 +120,7 @@ TEST(NativeLibraryTest, LoadLibrary) {
+ // Android dlopen() requires further investigation, as it might vary across
+ // versions with respect to symbol resolution scope.
+ // TSan and MSan error out on RTLD_DEEPBIND, https://crbug.com/705255
+-#if !defined(OS_ANDROID) && !defined(THREAD_SANITIZER) && \
++#if !defined(OS_ANDROID) && !defined(OS_BSD) && !defined(THREAD_SANITIZER) && \
+ !defined(MEMORY_SANITIZER)
+
+ // Verifies that the |prefer_own_symbols| option satisfies its guarantee that
diff --git a/www/iridium/files/patch-base_numerics_safe__math__shared__impl.h b/www/iridium/files/patch-base_numerics_safe__math__shared__impl.h
new file mode 100644
index 000000000000..c088ad9451d0
--- /dev/null
+++ b/www/iridium/files/patch-base_numerics_safe__math__shared__impl.h
@@ -0,0 +1,12 @@
+--- base/numerics/safe_math_shared_impl.h.orig 2019-09-09 21:55:05 UTC
++++ base/numerics/safe_math_shared_impl.h
+@@ -23,8 +23,7 @@
+ // Where available use builtin math overflow support on Clang and GCC.
+ #elif !defined(__native_client__) && \
+ ((defined(__clang__) && \
+- ((__clang_major__ > 3) || \
+- (__clang_major__ == 3 && __clang_minor__ >= 4))) || \
++ (__clang_major__ > 6)) || \
+ (defined(__GNUC__) && __GNUC__ >= 5))
+ #include "base/numerics/safe_math_clang_gcc_impl.h"
+ #define BASE_HAS_OPTIMIZED_SAFE_MATH (1)
diff --git a/www/iridium/files/patch-base_path__service__unittest.cc b/www/iridium/files/patch-base_path__service__unittest.cc
new file mode 100644
index 000000000000..20ffac278abc
--- /dev/null
+++ b/www/iridium/files/patch-base_path__service__unittest.cc
@@ -0,0 +1,11 @@
+--- base/path_service_unittest.cc.orig 2020-03-23 15:23:42 UTC
++++ base/path_service_unittest.cc
+@@ -36,7 +36,7 @@ bool ReturnsValidPath(int dir_type) {
+ if (dir_type == DIR_CACHE)
+ check_path_exists = false;
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On the linux try-bots: a path is returned (e.g. /home/chrome-bot/Desktop),
+ // but it doesn't exist.
+ if (dir_type == DIR_USER_DESKTOP)
diff --git a/www/iridium/files/patch-base_posix_can__lower__nice__to.cc b/www/iridium/files/patch-base_posix_can__lower__nice__to.cc
new file mode 100644
index 000000000000..3b13c89d4813
--- /dev/null
+++ b/www/iridium/files/patch-base_posix_can__lower__nice__to.cc
@@ -0,0 +1,20 @@
+--- base/posix/can_lower_nice_to.cc.orig 2019-03-11 22:00:51 UTC
++++ base/posix/can_lower_nice_to.cc
+@@ -31,6 +31,9 @@ bool CanLowerNiceTo(int nice_value) {
+ if (geteuid() == 0)
+ return true;
+
++#if defined(OS_BSD)
++ return false;
++#else
+ // 2. Skip checking the CAP_SYS_NICE permission because it would require
+ // libcap.so.
+
+@@ -54,6 +57,7 @@ bool CanLowerNiceTo(int nice_value) {
+ // And lowering niceness to |nice_value| is allowed if it is greater than or
+ // equal to the limit:
+ return nice_value >= lowest_nice_allowed;
++#endif
+ }
+
+ } // namespace internal
diff --git a/www/iridium/files/patch-base_posix_unix__domain__socket.cc b/www/iridium/files/patch-base_posix_unix__domain__socket.cc
new file mode 100644
index 000000000000..8820cb063006
--- /dev/null
+++ b/www/iridium/files/patch-base_posix_unix__domain__socket.cc
@@ -0,0 +1,49 @@
+--- base/posix/unix_domain_socket.cc.orig 2019-03-11 22:00:51 UTC
++++ base/posix/unix_domain_socket.cc
+@@ -5,7 +5,10 @@
+ #include "base/posix/unix_domain_socket.h"
+
+ #include <errno.h>
++#include <sys/param.h>
+ #include <sys/socket.h>
++#include <sys/types.h>
++#include <sys/ucred.h>
+ #if !defined(OS_NACL_NONSFI)
+ #include <sys/un.h>
+ #endif
+@@ -28,6 +31,14 @@ namespace base {
+
+ const size_t UnixDomainSocket::kMaxFileDescriptors = 16;
+
++#ifndef SCM_CREDENTIALS
++# define SCM_CREDENTIALS 0x9001
++#endif
++
++#ifndef SO_PASSCRED
++# define SO_PASSCRED 0x9002
++#endif
++
+ #if !defined(OS_NACL_NONSFI)
+ bool CreateSocketPair(ScopedFD* one, ScopedFD* two) {
+ int raw_socks[2];
+@@ -150,7 +161,7 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ #if !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
+ // The PNaCl toolchain for Non-SFI binary build and macOS do not support
+ // ucred. macOS supports xucred, but this structure is insufficient.
+- + CMSG_SPACE(sizeof(struct ucred))
++ + CMSG_SPACE(sizeof(struct cmsgcred))
+ #endif // OS_NACL_NONSFI or OS_MACOSX
+ ;
+ char control_buffer[kControlBufferSize];
+@@ -180,9 +191,9 @@ ssize_t UnixDomainSocket::RecvMsgWithFlags(int fd,
+ // SCM_CREDENTIALS.
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_CREDENTIALS) {
+- DCHECK_EQ(payload_len, sizeof(struct ucred));
++ DCHECK_EQ(payload_len, sizeof(struct cmsgcred));
+ DCHECK_EQ(pid, -1);
+- pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid;
++ pid = getpid();
+ }
+ #endif // !defined(OS_NACL_NONSFI) && !defined(OS_MACOSX)
+ }
diff --git a/www/iridium/files/patch-base_posix_unix__domain__socket__unittest.cc b/www/iridium/files/patch-base_posix_unix__domain__socket__unittest.cc
new file mode 100644
index 000000000000..0336334a6583
--- /dev/null
+++ b/www/iridium/files/patch-base_posix_unix__domain__socket__unittest.cc
@@ -0,0 +1,12 @@
+--- base/posix/unix_domain_socket_unittest.cc.orig 2019-03-11 22:00:51 UTC
++++ base/posix/unix_domain_socket_unittest.cc
+@@ -8,6 +8,9 @@
+ #include <stdint.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
++#if defined(OS_BSD)
++#include <signal.h>
++#endif
+ #include <unistd.h>
+
+ #include "base/bind.h"
diff --git a/www/iridium/files/patch-base_process_internal__linux.cc b/www/iridium/files/patch-base_process_internal__linux.cc
new file mode 100644
index 000000000000..abfff7cd44ce
--- /dev/null
+++ b/www/iridium/files/patch-base_process_internal__linux.cc
@@ -0,0 +1,97 @@
+--- base/process/internal_linux.cc.orig 2020-03-16 18:39:41 UTC
++++ base/process/internal_linux.cc
+@@ -29,7 +29,11 @@ namespace internal {
+
+ const char kProcDir[] = "/proc";
+
++#if defined(OS_BSD)
++const char kStatFile[] = "status";
++#else
+ const char kStatFile[] = "stat";
++#endif
+
+ FilePath GetProcPidDir(pid_t pid) {
+ return FilePath(kProcDir).Append(NumberToString(pid));
+@@ -64,6 +68,7 @@ bool ReadProcFile(const FilePath& file, std::string* b
+ DLOG(WARNING) << "Failed to read " << file.MaybeAsASCII();
+ return false;
+ }
++
+ return !buffer->empty();
+ }
+
+@@ -79,6 +84,22 @@ bool ParseProcStats(const std::string& stats_data,
+ if (stats_data.empty())
+ return false;
+
++#if defined(OS_BSD)
++ proc_stats->clear();
++
++ std::vector<std::string> other_stats = SplitString(
++ stats_data, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
++
++ for (const auto& i : other_stats) {
++ auto pos = i.find(',');
++
++ if (pos == std::string::npos) {
++ proc_stats->push_back(i);
++ } else {
++ proc_stats->push_back(i.substr(0, pos));
++ }
++ }
++#else
+ // The stat file is formatted as:
+ // pid (process name) data1 data2 .... dataN
+ // Look for the closing paren by scanning backwards, to avoid being fooled by
+@@ -108,6 +129,7 @@ bool ParseProcStats(const std::string& stats_data,
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+ for (const auto& i : other_stats)
+ proc_stats->push_back(i);
++#endif
+ return true;
+ }
+
+@@ -155,7 +177,11 @@ int64_t ReadProcStatsAndGetFieldAsInt64(pid_t pid, Pro
+ }
+
+ int64_t ReadProcSelfStatsAndGetFieldAsInt64(ProcStatsFields field_num) {
++#if defined(OS_BSD)
++ FilePath stat_file = FilePath(kProcDir).Append("curproc").Append(kStatFile);
++#else
+ FilePath stat_file = FilePath(kProcDir).Append("self").Append(kStatFile);
++#endif
+ return ReadStatFileAndGetFieldAsInt64(stat_file, field_num);
+ }
+
+@@ -171,6 +197,9 @@ size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
+ }
+
+ Time GetBootTime() {
++#if defined(OS_BSD)
++ return Time();
++#else
+ FilePath path("/proc/stat");
+ std::string contents;
+ if (!ReadProcFile(path, &contents))
+@@ -184,9 +213,13 @@ Time GetBootTime() {
+ if (!StringToInt(btime_it->second, &btime))
+ return Time();
+ return Time::FromTimeT(btime);
++#endif
+ }
+
+ TimeDelta GetUserCpuTimeSinceBoot() {
++#if defined(OS_BSD)
++ return TimeDelta();
++#else
+ FilePath path("/proc/stat");
+ std::string contents;
+ if (!ReadProcFile(path, &contents))
+@@ -210,6 +243,7 @@ TimeDelta GetUserCpuTimeSinceBoot() {
+ return TimeDelta();
+
+ return ClockTicksToTimeDelta(user + nice);
++#endif
+ }
+
+ TimeDelta ClockTicksToTimeDelta(int clock_ticks) {
diff --git a/www/iridium/files/patch-base_process_internal__linux.h b/www/iridium/files/patch-base_process_internal__linux.h
new file mode 100644
index 000000000000..bfa9c8630afd
--- /dev/null
+++ b/www/iridium/files/patch-base_process_internal__linux.h
@@ -0,0 +1,34 @@
+--- base/process/internal_linux.h.orig 2020-03-16 18:39:41 UTC
++++ base/process/internal_linux.h
+@@ -14,6 +14,8 @@
+
+ #include "base/files/file_path.h"
+
++#include <unistd.h> /* pid_t */
++
+ namespace base {
+
+ class Time;
+@@ -50,6 +52,14 @@ bool ParseProcStats(const std::string& stats_data,
+ // If the ordering ever changes, carefully review functions that use these
+ // values.
+ enum ProcStatsFields {
++#if defined(OS_BSD)
++ VM_COMM = 0, // Command name.
++ VM_PPID = 2, // Parent process id.
++ VM_PGRP = 3, // Process group id.
++ VM_STARTTIME = 7, // The process start time.
++ VM_UTIME = 8, // The user time.
++ VM_STIME = 9, // The system time
++#else
+ VM_COMM = 1, // Filename of executable, without parentheses.
+ VM_STATE = 2, // Letter indicating the state of the process.
+ VM_PPID = 3, // PID of the parent.
+@@ -62,6 +72,7 @@ enum ProcStatsFields {
+ VM_STARTTIME = 21, // The time the process started in clock ticks.
+ VM_VSIZE = 22, // Virtual memory size in bytes.
+ VM_RSS = 23, // Resident Set Size in pages.
++#endif
+ };
+
+ // Reads the |field_num|th field from |proc_stats|. Returns 0 on failure.
diff --git a/www/iridium/files/patch-base_process_kill.h b/www/iridium/files/patch-base_process_kill.h
new file mode 100644
index 000000000000..2e871559c90e
--- /dev/null
+++ b/www/iridium/files/patch-base_process_kill.h
@@ -0,0 +1,16 @@
+--- base/process/kill.h.orig 2019-12-16 21:50:40 UTC
++++ base/process/kill.h
+@@ -118,11 +118,11 @@ BASE_EXPORT TerminationStatus GetTerminationStatus(Pro
+ BASE_EXPORT TerminationStatus GetKnownDeadTerminationStatus(
+ ProcessHandle handle, int* exit_code);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Spawns a thread to wait asynchronously for the child |process| to exit
+ // and then reaps it.
+ BASE_EXPORT void EnsureProcessGetsReaped(Process process);
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ #endif // defined(OS_POSIX)
+
+ // Registers |process| to be asynchronously monitored for termination, forcibly
diff --git a/www/iridium/files/patch-base_process_kill__posix.cc b/www/iridium/files/patch-base_process_kill__posix.cc
new file mode 100644
index 000000000000..69e4dbc6c05e
--- /dev/null
+++ b/www/iridium/files/patch-base_process_kill__posix.cc
@@ -0,0 +1,20 @@
+--- base/process/kill_posix.cc.orig 2019-06-04 18:55:15 UTC
++++ base/process/kill_posix.cc
+@@ -168,7 +168,7 @@ void EnsureProcessTerminated(Process process) {
+ 0, new BackgroundReaper(std::move(process), TimeDelta::FromSeconds(2)));
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void EnsureProcessGetsReaped(Process process) {
+ DCHECK(!process.is_current());
+
+@@ -179,7 +179,7 @@ void EnsureProcessGetsReaped(Process process) {
+ PlatformThread::CreateNonJoinable(
+ 0, new BackgroundReaper(std::move(process), TimeDelta()));
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #endif // !defined(OS_MACOSX)
+ #endif // !defined(OS_NACL_NONSFI)
diff --git a/www/iridium/files/patch-base_process_launch.cc b/www/iridium/files/patch-base_process_launch.cc
new file mode 100644
index 000000000000..bd174cd496bc
--- /dev/null
+++ b/www/iridium/files/patch-base_process_launch.cc
@@ -0,0 +1,11 @@
+--- base/process/launch.cc.orig 2019-03-11 22:00:51 UTC
++++ base/process/launch.cc
+@@ -15,7 +15,7 @@ LaunchOptions::~LaunchOptions() = default;
+
+ LaunchOptions LaunchOptionsForTest() {
+ LaunchOptions options;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // To prevent accidental privilege sharing to an untrusted child, processes
+ // are started with PR_SET_NO_NEW_PRIVS. Do not set that here, since this
+ // new child will be used for testing only.
diff --git a/www/iridium/files/patch-base_process_launch.h b/www/iridium/files/patch-base_process_launch.h
new file mode 100644
index 000000000000..75708ea5561e
--- /dev/null
+++ b/www/iridium/files/patch-base_process_launch.h
@@ -0,0 +1,20 @@
+--- base/process/launch.h.orig 2020-02-03 21:52:37 UTC
++++ base/process/launch.h
+@@ -180,7 +180,7 @@ struct BASE_EXPORT LaunchOptions {
+ bool clear_environment = false;
+ #endif // OS_WIN || OS_POSIX || OS_FUCHSIA
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -193,7 +193,7 @@ struct BASE_EXPORT LaunchOptions {
+
+ // Sets parent process death signal to SIGKILL.
+ bool kill_on_parent_death = false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_MACOSX) && !defined(OS_IOS)
+ // Mach ports that will be accessible to the child process. These are not
diff --git a/www/iridium/files/patch-base_process_launch__posix.cc b/www/iridium/files/patch-base_process_launch__posix.cc
new file mode 100644
index 000000000000..ce6054a8ff79
--- /dev/null
+++ b/www/iridium/files/patch-base_process_launch__posix.cc
@@ -0,0 +1,10 @@
+--- base/process/launch_posix.cc.orig 2019-06-04 18:55:15 UTC
++++ base/process/launch_posix.cc
+@@ -65,6 +65,7 @@
+ #error "macOS should use launch_mac.cc"
+ #endif
+
++#pragma weak environ
+ extern char** environ;
+
+ namespace base {
diff --git a/www/iridium/files/patch-base_process_memory.cc b/www/iridium/files/patch-base_process_memory.cc
new file mode 100644
index 000000000000..ff61c2e5408b
--- /dev/null
+++ b/www/iridium/files/patch-base_process_memory.cc
@@ -0,0 +1,20 @@
+--- base/process/memory.cc.orig 2020-03-16 18:39:41 UTC
++++ base/process/memory.cc
+@@ -42,7 +42,7 @@ void OnNoMemoryInternal(size_t size) {
+ } // namespace internal
+
+ // Defined in memory_win.cc for Windows.
+-#if !defined(OS_WIN)
++#if !defined(OS_WIN) && !defined(OS_BSD)
+
+ namespace {
+
+@@ -61,7 +61,7 @@ void TerminateBecauseOutOfMemory(size_t size) {
+ #endif // !defined(OS_WIN)
+
+ // Defined in memory_mac.mm for Mac.
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ bool UncheckedCalloc(size_t num_items, size_t size, void** result) {
+ const size_t alloc_size = num_items * size;
diff --git a/www/iridium/files/patch-base_process_memory.h b/www/iridium/files/patch-base_process_memory.h
new file mode 100644
index 000000000000..007e8593b35d
--- /dev/null
+++ b/www/iridium/files/patch-base_process_memory.h
@@ -0,0 +1,11 @@
+--- base/process/memory.h.orig 2019-10-21 19:06:18 UTC
++++ base/process/memory.h
+@@ -24,7 +24,7 @@ BASE_EXPORT void EnableTerminationOnOutOfMemory();
+ // Crash reporting classifies such crashes as OOM.
+ BASE_EXPORT void TerminateBecauseOutOfMemory(size_t size);
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_BSD)
+ BASE_EXPORT extern size_t g_oom_size;
+
+ // The maximum allowed value for the OOM score.
diff --git a/www/iridium/files/patch-base_process_memory__unittest.cc b/www/iridium/files/patch-base_process_memory__unittest.cc
new file mode 100644
index 000000000000..82dcfd37c1c7
--- /dev/null
+++ b/www/iridium/files/patch-base_process_memory__unittest.cc
@@ -0,0 +1,18 @@
+--- base/process/memory_unittest.cc.orig 2020-03-16 18:39:41 UTC
++++ base/process/memory_unittest.cc
+@@ -106,7 +106,7 @@ TEST(MemoryTest, AllocatorShimWorking) {
+ // OpenBSD does not support these tests. Don't test these on ASan/TSan/MSan
+ // configurations: only test the real allocator.
+ // Windows only supports these tests with the allocator shim in place.
+-#if !defined(OS_OPENBSD) && BUILDFLAG(USE_ALLOCATOR_SHIM) && \
++#if !defined(OS_BSD) && BUILDFLAG(USE_ALLOCATOR_SHIM) && \
+ !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
+
+ namespace {
+@@ -589,5 +589,5 @@ TEST_F(OutOfMemoryHandledTest, UncheckedCalloc) {
+ EXPECT_FALSE(base::UncheckedCalloc(1, test_size_, &value_));
+ EXPECT_TRUE(value_ == nullptr);
+ }
+-#endif // !defined(OS_OPENBSD) && BUILDFLAG(ENABLE_WIN_ALLOCATOR_SHIM_TESTS) &&
++#endif // !defined(OS_BSD) && BUILDFLAG(ENABLE_WIN_ALLOCATOR_SHIM_TESTS) &&
+ // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/www/iridium/files/patch-base_process_process__handle.cc b/www/iridium/files/patch-base_process_process__handle.cc
new file mode 100644
index 000000000000..13812613f73f
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__handle.cc
@@ -0,0 +1,11 @@
+--- base/process/process_handle.cc.orig 2019-10-21 19:06:18 UTC
++++ base/process/process_handle.cc
+@@ -28,7 +28,7 @@ UniqueProcId GetUniqueIdForProcess() {
+ : UniqueProcId(GetCurrentProcId());
+ }
+
+-#if defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+
+ void InitUniqueIdForProcessInPidNamespace(ProcessId pid_outside_of_namespace) {
+ DCHECK(pid_outside_of_namespace != kNullProcessId);
diff --git a/www/iridium/files/patch-base_process_process__handle.h b/www/iridium/files/patch-base_process_process__handle.h
new file mode 100644
index 000000000000..502beff310e6
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__handle.h
@@ -0,0 +1,11 @@
+--- base/process/process_handle.h.orig 2019-10-21 19:06:18 UTC
++++ base/process/process_handle.h
+@@ -103,7 +103,7 @@ BASE_EXPORT ProcessId GetCurrentProcId();
+ // processes may be reused.
+ BASE_EXPORT UniqueProcId GetUniqueIdForProcess();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-base_process_process__handle__freebsd.cc b/www/iridium/files/patch-base_process_process__handle__freebsd.cc
new file mode 100644
index 000000000000..13a07c3075fd
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__handle__freebsd.cc
@@ -0,0 +1,17 @@
+--- base/process/process_handle_freebsd.cc.orig 2019-03-11 22:00:51 UTC
++++ base/process/process_handle_freebsd.cc
+@@ -16,10 +16,13 @@ namespace base {
+
+ 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, base::size(mib), &info, &length, NULL, 0) < 0)
++ return -1;
++
++ if (length < sizeof(struct kinfo_proc))
+ return -1;
+
+ return info.ki_ppid;
diff --git a/www/iridium/files/patch-base_process_process__iterator__freebsd.cc b/www/iridium/files/patch-base_process_process__iterator__freebsd.cc
new file mode 100644
index 000000000000..a89546ccb49d
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__iterator__freebsd.cc
@@ -0,0 +1,44 @@
+--- base/process/process_iterator_freebsd.cc.orig 2019-03-11 22:00:51 UTC
++++ base/process/process_iterator_freebsd.cc
+@@ -10,6 +10,10 @@
+ #include <sys/sysctl.h>
+ #include <unistd.h>
+
++/* getuid() */
++#include <unistd.h>
++#include <sys/types.h>
++
+ #include "base/logging.h"
+ #include "base/stl_util.h"
+ #include "base/strings/string_split.h"
+@@ -40,7 +44,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, base::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
++ if (sysctl(mib, base::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) {
+@@ -72,18 +76,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, base::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, base::size(mib), &data[0], &length, NULL, 0) < 0) {
+ LOG(ERROR) << "failed to fetch a commandline";
diff --git a/www/iridium/files/patch-base_process_process__linux.cc b/www/iridium/files/patch-base_process_process__linux.cc
new file mode 100644
index 000000000000..2ec55582fbfa
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__linux.cc
@@ -0,0 +1,31 @@
+--- base/process/process_linux.cc.orig 2020-03-16 18:39:41 UTC
++++ base/process/process_linux.cc
+@@ -79,6 +79,9 @@ Time Process::CreationTime() const {
+ internal::VM_STARTTIME)
+ : internal::ReadProcStatsAndGetFieldAsInt64(
+ Pid(), internal::VM_STARTTIME);
++#if defined(OS_BSD)
++ return Time::FromTimeT(start_ticks);
++#else
+ if (!start_ticks)
+ return Time();
+ TimeDelta start_offset = internal::ClockTicksToTimeDelta(start_ticks);
+@@ -86,8 +89,10 @@ Time Process::CreationTime() const {
+ if (boot_time.is_null())
+ return Time();
+ return Time(boot_time + start_offset);
++#endif
+ }
+
++#if !defined(OS_BSD)
+ // static
+ bool Process::CanBackgroundProcesses() {
+ #if defined(OS_CHROMEOS)
+@@ -139,6 +144,7 @@ bool Process::SetProcessBackgrounded(bool background)
+ DPCHECK(result == 0);
+ return result == 0;
+ }
++#endif // !defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ bool IsProcessBackgroundedCGroup(const StringPiece& cgroup_contents) {
diff --git a/www/iridium/files/patch-base_process_process__metrics.cc b/www/iridium/files/patch-base_process_process__metrics.cc
new file mode 100644
index 000000000000..8e47c5106248
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__metrics.cc
@@ -0,0 +1,38 @@
+--- base/process/process_metrics.cc.orig 2019-07-24 18:58:02 UTC
++++ base/process/process_metrics.cc
+@@ -57,7 +57,7 @@ SystemMetrics SystemMetrics::Sample() {
+ SystemMetrics system_metrics;
+
+ system_metrics.committed_memory_ = GetSystemCommitCharge();
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ GetSystemMemoryInfo(&system_metrics.memory_info_);
+ GetVmStatInfo(&system_metrics.vmstat_info_);
+ GetSystemDiskInfo(&system_metrics.disk_info_);
+@@ -75,7 +75,7 @@ std::unique_ptr<Value> SystemMetrics::ToValue() const
+ std::unique_ptr<DictionaryValue> res(new DictionaryValue());
+
+ res->SetIntKey("committed_memory", static_cast<int>(committed_memory_));
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ std::unique_ptr<DictionaryValue> meminfo = memory_info_.ToValue();
+ std::unique_ptr<DictionaryValue> vmstat = vmstat_info_.ToValue();
+ meminfo->MergeDictionary(vmstat.get());
+@@ -126,7 +126,7 @@ double ProcessMetrics::GetPlatformIndependentCPUUsage(
+ }
+ #endif
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ int ProcessMetrics::CalculateIdleWakeupsPerSecond(
+ uint64_t absolute_idle_wakeups) {
+ return CalculateEventsPerSecond(absolute_idle_wakeups,
+@@ -138,7 +138,7 @@ int ProcessMetrics::GetIdleWakeupsPerSecond() {
+ NOTIMPLEMENTED(); // http://crbug.com/120488
+ return 0;
+ }
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+
+ #if defined(OS_MACOSX)
+ int ProcessMetrics::CalculatePackageIdleWakeupsPerSecond(
diff --git a/www/iridium/files/patch-base_process_process__metrics.h b/www/iridium/files/patch-base_process_process__metrics.h
new file mode 100644
index 000000000000..420d563e5b29
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__metrics.h
@@ -0,0 +1,131 @@
+--- base/process/process_metrics.h.orig 2019-10-21 19:06:18 UTC
++++ base/process/process_metrics.h
+@@ -41,7 +41,7 @@ namespace base {
+ // Full declaration is in process_metrics_iocounters.h.
+ struct IoCounters;
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Minor and major page fault counts since the process creation.
+ // Both counts are process-wide, and exclude child processes.
+ //
+@@ -51,7 +51,7 @@ struct PageFaultCounts {
+ int64_t minor;
+ int64_t major;
+ };
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ // Convert a POSIX timeval to microseconds.
+ BASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv);
+@@ -92,7 +92,7 @@ class BASE_EXPORT ProcessMetrics {
+ // convenience wrapper for CreateProcessMetrics().
+ static std::unique_ptr<ProcessMetrics> CreateCurrentProcessMetrics();
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_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;
+@@ -172,14 +172,14 @@ class BASE_EXPORT ProcessMetrics {
+ int GetOpenFdSoftLimit() const;
+ #endif // defined(OS_POSIX)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Bytes of swap as reported by /proc/[pid]/status.
+ uint64_t GetVmSwapBytes() const;
+
+ // Minor and major page fault count as reported by /proc/[pid]/stat.
+ // Returns true for success.
+ bool GetPageFaultCounts(PageFaultCounts* counts) const;
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ // Returns total memory usage of malloc.
+ size_t GetMallocUsage();
+@@ -191,7 +191,7 @@ class BASE_EXPORT ProcessMetrics {
+ ProcessMetrics(ProcessHandle process, PortProvider* port_provider);
+ #endif // !defined(OS_MACOSX) || defined(OS_IOS)
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups);
+ #endif
+ #if defined(OS_MACOSX)
+@@ -220,7 +220,7 @@ class BASE_EXPORT ProcessMetrics {
+ // Number of bytes transferred to/from disk in bytes.
+ uint64_t last_cumulative_disk_usage_ = 0;
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ // Same thing for idle wakeups.
+ TimeTicks last_idle_wakeups_time_;
+ uint64_t last_absolute_idle_wakeups_;
+@@ -271,7 +271,7 @@ BASE_EXPORT size_t GetHandleLimit();
+ BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_descriptors);
+ #endif // defined(OS_POSIX)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA)
+ // Data about system-wide memory consumption. Values are in KB. Available on
+ // Windows, Mac, Linux, Android and Chrome OS.
+@@ -305,7 +305,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ int avail_phys = 0;
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_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
+@@ -319,7 +319,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ int swap_free = 0;
+ #endif
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || \
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD) || \
+ defined(OS_FUCHSIA)
+ int buffers = 0;
+ int cached = 0;
+@@ -329,7 +329,7 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ int inactive_file = 0;
+ int dirty = 0;
+ int reclaimable = 0;
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) ||
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD) ||
+ // defined(OS_FUCHSIA)
+
+ #if defined(OS_CHROMEOS)
+@@ -355,10 +355,10 @@ struct BASE_EXPORT SystemMemoryInfoKB {
+ // Exposed for memory debugging widget.
+ BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo);
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ // defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_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.
+@@ -431,7 +431,7 @@ BASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* dis
+ // Returns the amount of time spent in user space since boot across all CPUs.
+ BASE_EXPORT TimeDelta GetUserCpuTimeSinceBoot();
+
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ // Data from files in directory /sys/block/zram0 about ZRAM usage.
+@@ -526,7 +526,7 @@ class BASE_EXPORT SystemMetrics {
+ FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics);
+
+ size_t committed_memory_;
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ SystemMemoryInfoKB memory_info_;
+ VmStatInfo vmstat_info_;
+ SystemDiskInfo disk_info_;
diff --git a/www/iridium/files/patch-base_process_process__metrics__freebsd.cc b/www/iridium/files/patch-base_process_process__metrics__freebsd.cc
new file mode 100644
index 000000000000..1dc5323f3252
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__metrics__freebsd.cc
@@ -0,0 +1,259 @@
+--- base/process/process_metrics_freebsd.cc.orig 2019-07-24 18:58:02 UTC
++++ base/process/process_metrics_freebsd.cc
+@@ -5,6 +5,7 @@
+ #include "base/process/process_metrics.h"
+
+ #include <stddef.h>
++#include <sys/types.h>
+ #include <sys/sysctl.h>
+ #include <sys/user.h>
+ #include <unistd.h>
+@@ -14,11 +15,29 @@
+ #include "base/process/process_metrics_iocounters.h"
+ #include "base/stl_util.h"
+
++#include <unistd.h> /* getpagesize() */
++#include <fcntl.h> /* O_RDONLY */
++#include <kvm.h>
++#include <libutil.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(
+@@ -69,4 +88,216 @@ size_t GetSystemCommitCharge() {
+ return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize);
+ }
+
++int 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, base::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;
++
++std::unique_ptr<Value> SystemDiskInfo::ToValue() const {
++ auto res = std::make_unique<DictionaryValue>();
++
++ // Write out uint64_t variables as doubles.
++ // Note: this may discard some precision, but for JS there's no other option.
++ res->SetDouble("reads", static_cast<double>(reads));
++ res->SetDouble("reads_merged", static_cast<double>(reads_merged));
++ res->SetDouble("sectors_read", static_cast<double>(sectors_read));
++ res->SetDouble("read_time", static_cast<double>(read_time));
++ res->SetDouble("writes", static_cast<double>(writes));
++ res->SetDouble("writes_merged", static_cast<double>(writes_merged));
++ res->SetDouble("sectors_written", static_cast<double>(sectors_written));
++ res->SetDouble("write_time", static_cast<double>(write_time));
++ res->SetDouble("io", static_cast<double>(io));
++ res->SetDouble("io_time", static_cast<double>(io_time));
++ res->SetDouble("weighted_io_time", static_cast<double>(weighted_io_time));
++
++ return std::move(res);
++}
++
++std::unique_ptr<DictionaryValue> SystemMemoryInfoKB::ToValue() const {
++ auto res = std::make_unique<DictionaryValue>();
++ res->SetIntKey("total", total);
++ res->SetIntKey("free", free);
++ res->SetIntKey("available", available);
++ res->SetIntKey("buffers", buffers);
++ res->SetIntKey("cached", cached);
++ res->SetIntKey("active_anon", active_anon);
++ res->SetIntKey("inactive_anon", inactive_anon);
++ res->SetIntKey("active_file", active_file);
++ res->SetIntKey("inactive_file", inactive_file);
++ res->SetIntKey("swap_total", swap_total);
++ res->SetIntKey("swap_free", swap_free);
++ res->SetIntKey("swap_used", swap_total - swap_free);
++ res->SetIntKey("dirty", dirty);
++ res->SetIntKey("reclaimable", reclaimable);
++
++ return res;
++}
++
++std::unique_ptr<DictionaryValue> VmStatInfo::ToValue() const {
++ auto res = std::make_unique<DictionaryValue>();
++ res->SetIntKey("pswpin", pswpin);
++ res->SetIntKey("pswpout", pswpout);
++ res->SetIntKey("pgmajfault", pgmajfault);
++ return res;
++}
+ } // namespace base
diff --git a/www/iridium/files/patch-base_process_process__metrics__posix.cc b/www/iridium/files/patch-base_process_process__metrics__posix.cc
new file mode 100644
index 000000000000..e909eeec959b
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__metrics__posix.cc
@@ -0,0 +1,20 @@
+--- base/process/process_metrics_posix.cc.orig 2019-10-21 19:06:18 UTC
++++ base/process/process_metrics_posix.cc
+@@ -20,6 +20,8 @@
+
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
++#elif defined(OS_FREEBSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -117,7 +119,7 @@ size_t ProcessMetrics::GetMallocUsage() {
+ #else
+ return minfo.hblkhd + minfo.arena;
+ #endif
+-#elif defined(OS_FUCHSIA)
++#elif defined(OS_FUCHSIA) || defined(OS_BSD)
+ // TODO(fuchsia): Not currently exposed. https://crbug.com/735087.
+ return 0;
+ #endif
diff --git a/www/iridium/files/patch-base_process_process__unittest.cc b/www/iridium/files/patch-base_process_process__unittest.cc
new file mode 100644
index 000000000000..3e5aac5b4da7
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__unittest.cc
@@ -0,0 +1,11 @@
+--- base/process/process_unittest.cc.orig 2019-03-18 19:16:37 UTC
++++ base/process/process_unittest.cc
+@@ -148,7 +148,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-base_process_process__util__unittest.cc b/www/iridium/files/patch-base_process_process__util__unittest.cc
new file mode 100644
index 000000000000..e6378dd51b22
--- /dev/null
+++ b/www/iridium/files/patch-base_process_process__util__unittest.cc
@@ -0,0 +1,16 @@
+--- base/process/process_util_unittest.cc.orig 2020-03-23 15:26:12 UTC
++++ base/process/process_util_unittest.cc
+@@ -1307,11 +1307,11 @@ std::string TestLaunchProcess(const CommandLine& cmdli
+ options.fds_to_remap.emplace_back(fds[1], STDOUT_FILENO);
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ options.clone_flags = clone_flags;
+ #else
+ CHECK_EQ(0, clone_flags);
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ EXPECT_TRUE(LaunchProcess(cmdline, options).IsValid());
+ write_pipe.Close();
diff --git a/www/iridium/files/patch-base_profiler_register__context.h b/www/iridium/files/patch-base_profiler_register__context.h
new file mode 100644
index 000000000000..ea2c126353b4
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_register__context.h
@@ -0,0 +1,60 @@
+--- base/profiler/register_context.h.orig 2020-03-16 18:39:41 UTC
++++ base/profiler/register_context.h
+@@ -17,7 +17,7 @@
+ #include <windows.h>
+ #elif defined(OS_MACOSX)
+ #include <mach/machine/thread_status.h>
+-#elif defined(OS_ANDROID) || defined(OS_LINUX)
++#elif defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/ucontext.h>
+ #endif
+
+@@ -165,6 +165,48 @@ inline uintptr_t& RegisterContextInstructionPointer(mc
+ }
+
+ #endif // #if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
++
++#elif defined(OS_FREEBSD)
++
++using RegisterContext = mcontext_t;
++
++#if defined(ARCH_CPU_X86_64)
++inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_rsp);
++}
++
++inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_rbp);
++}
++
++inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_rip);
++}
++#elif defined(ARCH_CPU_X86)
++inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_esp);
++}
++
++inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_ebp);
++}
++
++inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_eip);
++}
++#elif defined(ARCH_CPU_ARM64)
++inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_gpregs.gp_sp);
++}
++
++inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_gpregs.gp_x[29]);
++}
++
++inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
++ return AsUintPtr(&context->mc_gpregs.gp_elr);
++}
++#endif
+
+ #else // #if defined(OS_WIN)
+
diff --git a/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.cc b/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.cc
new file mode 100644
index 000000000000..96db1204abdd
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.cc
@@ -0,0 +1,11 @@
+--- base/profiler/sampling_profiler_thread_token.cc.orig 2020-02-07 10:24:19 UTC
++++ base/profiler/sampling_profiler_thread_token.cc
+@@ -7,7 +7,7 @@
+ namespace base {
+
+ SamplingProfilerThreadToken GetSamplingProfilerCurrentThreadToken() {
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ return {PlatformThread::CurrentId(), pthread_self()};
+ #else
+ return {PlatformThread::CurrentId()};
diff --git a/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.h b/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.h
new file mode 100644
index 000000000000..589e083be74d
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_sampling__profiler__thread__token.h
@@ -0,0 +1,20 @@
+--- base/profiler/sampling_profiler_thread_token.h.orig 2020-02-07 10:24:33 UTC
++++ base/profiler/sampling_profiler_thread_token.h
+@@ -9,7 +9,7 @@
+ #include "base/threading/platform_thread.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ #include <pthread.h>
+ #endif
+
+@@ -21,7 +21,7 @@ namespace base {
+ // functions used to obtain the stack base address.
+ struct SamplingProfilerThreadToken {
+ PlatformThreadId id;
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ pthread_t pthread_id;
+ #endif
+ };
diff --git a/www/iridium/files/patch-base_profiler_stack__copier__signal.cc b/www/iridium/files/patch-base_profiler_stack__copier__signal.cc
new file mode 100644
index 000000000000..b9e757471f17
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_stack__copier__signal.cc
@@ -0,0 +1,63 @@
+--- base/profiler/stack_copier_signal.cc.orig 2020-04-10 00:33:01 UTC
++++ base/profiler/stack_copier_signal.cc
+@@ -4,7 +4,14 @@
+
+ #include "base/profiler/stack_copier_signal.h"
+
++#if defined(OS_LINUX)
+ #include <linux/futex.h>
++#include <syscall.h>
++#elif defined(OS_FREEBSD)
++#include <sys/types.h>
++#include <sys/thr.h>
++#include <sys/umtx.h>
++#endif
+ #include <signal.h>
+ #include <sys/ucontext.h>
+ #include <syscall.h>
+@@ -35,8 +42,13 @@ class AsyncSafeWaitableEvent {
+ // for a pthread mutex. So, also check the condition.
+ while (true) {
+ int res =
++#if defined(OS_LINUX)
+ syscall(SYS_futex, futex_int_ptr(), FUTEX_WAIT | FUTEX_PRIVATE_FLAG,
+ 0, nullptr, nullptr, 0);
++#elif defined(OS_FREEBSD)
++ _umtx_op(futex_int_ptr(), UMTX_OP_WAIT_UINT_PRIVATE, 0, nullptr,
++ nullptr);
++#endif
+ if (futex_.load(std::memory_order_acquire) != 0)
+ return true;
+ if (res != 0)
+@@ -46,8 +58,12 @@ class AsyncSafeWaitableEvent {
+
+ void Signal() {
+ futex_.store(1, std::memory_order_release);
++#if defined(OS_LINUX)
+ syscall(SYS_futex, futex_int_ptr(), FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1,
+ nullptr, nullptr, 0);
++#elif defined(OS_FREEBSD)
++ _umtx_op(futex_int_ptr(), UMTX_OP_WAKE_PRIVATE, 1, nullptr, nullptr);
++#endif
+ }
+
+ private:
+@@ -214,11 +230,18 @@ bool StackCopierSignal::CopyStack(StackBuffer* stack_b
+ if (!scoped_sigaction.succeeded())
+ return false;
+
++#if defined(OS_LINUX)
+ if (syscall(SYS_tgkill, getpid(), thread_delegate_->GetThreadId(),
+ SIGURG) != 0) {
+ NOTREACHED();
+ return false;
+ }
++#elif defined(OS_FREEBSD)
++ if (thr_kill2(getpid(), thread_delegate_->GetThreadId(), SIGURG) != 0) {
++ NOTREACHED();
++ return false;
++ }
++#endif
+ bool finished_waiting = wait_event.Wait();
+ TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cpu_profiler.debug"),
+ "StackCopierSignal copy stack");
diff --git a/www/iridium/files/patch-base_profiler_stack__sampling__profiler__unittest.cc b/www/iridium/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
new file mode 100644
index 000000000000..686f7e90afb3
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_stack__sampling__profiler__unittest.cc
@@ -0,0 +1,11 @@
+--- base/profiler/stack_sampling_profiler_unittest.cc.orig 2019-07-24 18:58:02 UTC
++++ base/profiler/stack_sampling_profiler_unittest.cc
+@@ -41,7 +41,7 @@
+ #include <intrin.h>
+ #include <malloc.h>
+ #include <windows.h>
+-#else
++#elif !defined(OS_BSD)
+ #include <alloca.h>
+ #endif
+
diff --git a/www/iridium/files/patch-base_profiler_thread__delegate__posix.cc b/www/iridium/files/patch-base_profiler_thread__delegate__posix.cc
new file mode 100644
index 000000000000..a2f162e586fe
--- /dev/null
+++ b/www/iridium/files/patch-base_profiler_thread__delegate__posix.cc
@@ -0,0 +1,50 @@
+--- base/profiler/thread_delegate_posix.cc.orig 2020-04-10 00:37:03 UTC
++++ base/profiler/thread_delegate_posix.cc
+@@ -4,6 +4,10 @@
+
+ #include <pthread.h>
+
++#if defined(OS_FREEBSD)
++#include <pthread_np.h>
++#endif
++
+ #include "base/process/process_handle.h"
+ #include "base/profiler/thread_delegate_posix.h"
+ #include "base/stl_util.h"
+@@ -17,7 +21,12 @@ namespace {
+ uintptr_t GetThreadStackBaseAddressImpl(
+ SamplingProfilerThreadToken thread_token) {
+ pthread_attr_t attr;
++#if defined(OS_FREEBSDD)
++ pthread_attr_init(&attr);
++ pthread_attr_get_np(thread_token.pthread_id, &attr);
++#elif defined(OS_LINUX)
+ pthread_getattr_np(thread_token.pthread_id, &attr);
++#endif
+ // See crbug.com/617730 for limitations of this approach on Linux.
+ void* address;
+ size_t size;
+@@ -103,6 +112,15 @@ std::vector<uintptr_t*> ThreadDelegatePosix::GetRegist
+ return {
+ // Return the set of callee-save registers per the x86-64 System V ABI
+ // section 3.2.1, plus the stack pointer.
++#if defined(OS_FREEBSD)
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_rbp),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_rbx),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_r12),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_r13),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_r14),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_r15),
++ reinterpret_cast<uintptr_t*>(&thread_context->mc_rsp),
++#else
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_RBP]),
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_RBX]),
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_R12]),
+@@ -110,6 +128,7 @@ std::vector<uintptr_t*> ThreadDelegatePosix::GetRegist
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_R14]),
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_R15]),
+ reinterpret_cast<uintptr_t*>(&thread_context->gregs[REG_RSP]),
++#endif
+ };
+ #else // #if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+ // Unimplemented for other architectures.
diff --git a/www/iridium/files/patch-base_sampling__heap__profiler_sampling__heap__profiler.cc b/www/iridium/files/patch-base_sampling__heap__profiler_sampling__heap__profiler.cc
new file mode 100644
index 000000000000..44e3b0aae8ef
--- /dev/null
+++ b/www/iridium/files/patch-base_sampling__heap__profiler_sampling__heap__profiler.cc
@@ -0,0 +1,24 @@
+--- base/sampling_heap_profiler/sampling_heap_profiler.cc.orig 2019-09-09 21:55:05 UTC
++++ base/sampling_heap_profiler/sampling_heap_profiler.cc
+@@ -29,6 +29,10 @@
+ #include <sys/prctl.h>
+ #endif
+
++#if defined(OS_BSD)
++#include <pthread_np.h>
++#endif
++
+ #if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \
+ defined(OFFICIAL_BUILD)
+ #include "base/trace_event/cfi_backtrace_android.h"
+@@ -64,6 +68,10 @@ const char* GetAndLeakThreadName() {
+ #elif defined(OS_MACOSX)
+ int err = pthread_getname_np(pthread_self(), name, kBufferLen);
+ if (err == 0 && *name != '\0')
++ return strdup(name);
++#elif defined(OS_BSD) && __FreeBSD__ >= 12
++ pthread_get_name_np(pthread_self(), name, kBufferLen);
++ if (*name != '\0')
+ return strdup(name);
+ #endif // defined(OS_LINUX) || defined(OS_ANDROID)
+
diff --git a/www/iridium/files/patch-base_security__unittest.cc b/www/iridium/files/patch-base_security__unittest.cc
new file mode 100644
index 000000000000..c46d71f83add
--- /dev/null
+++ b/www/iridium/files/patch-base_security__unittest.cc
@@ -0,0 +1,11 @@
+--- base/security_unittest.cc.orig 2019-04-30 22:22:28 UTC
++++ base/security_unittest.cc
+@@ -60,7 +60,7 @@ NOINLINE Type HideValueFromCompiler(volatile Type valu
+ // FAILS_ is too clunky.
+ void OverflowTestsSoftExpectTrue(bool overflow_detected) {
+ if (!overflow_detected) {
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_NACL)
+ // Sadly, on Linux, Android, and OSX we don't have a good story yet. Don't
+ // fail the test, but report.
+ printf("Platform has overflow: %s\n",
diff --git a/www/iridium/files/patch-base_synchronization_lock__impl.h b/www/iridium/files/patch-base_synchronization_lock__impl.h
new file mode 100644
index 000000000000..fb3737a27ea9
--- /dev/null
+++ b/www/iridium/files/patch-base_synchronization_lock__impl.h
@@ -0,0 +1,16 @@
+--- base/synchronization/lock_impl.h.orig 2020-03-08 08:35:16 UTC
++++ base/synchronization/lock_impl.h
+@@ -67,10 +67,13 @@ void LockImpl::Unlock() {
+ ::ReleaseSRWLockExclusive(reinterpret_cast<PSRWLOCK>(&native_handle_));
+ }
+ #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wthread-safety-analysis"
+ void LockImpl::Unlock() {
+ int rv = pthread_mutex_unlock(&native_handle_);
+ DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ }
++#pragma GCC diagnostic pop
+ #endif
+
+ // This is an implementation used for AutoLock templated on the lock type.
diff --git a/www/iridium/files/patch-base_syslog__logging.cc b/www/iridium/files/patch-base_syslog__logging.cc
new file mode 100644
index 000000000000..d719219ca50b
--- /dev/null
+++ b/www/iridium/files/patch-base_syslog__logging.cc
@@ -0,0 +1,20 @@
+--- base/syslog_logging.cc.orig 2019-10-21 19:06:18 UTC
++++ base/syslog_logging.cc
+@@ -14,7 +14,7 @@
+ #include "base/debug/stack_trace.h"
+ #include "base/strings/string_util.h"
+ #include "base/win/win_util.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ // <syslog.h> defines LOG_INFO, LOG_WARNING macros that could conflict with
+ // base::LOG_INFO, base::LOG_WARNING.
+ #include <syslog.h>
+@@ -113,7 +113,7 @@ EventLogMessage::~EventLogMessage() {
+
+ if (user_sid != nullptr)
+ ::LocalFree(user_sid);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-base_system_sys__info.h b/www/iridium/files/patch-base_system_sys__info.h
new file mode 100644
index 000000000000..2159a51c6b6f
--- /dev/null
+++ b/www/iridium/files/patch-base_system_sys__info.h
@@ -0,0 +1,20 @@
+--- base/system/sys_info.h.orig 2020-03-16 18:39:41 UTC
++++ base/system/sys_info.h
+@@ -194,6 +194,8 @@ class BASE_EXPORT SysInfo {
+ // On Desktop this returns true when memory <= 512MB.
+ static bool IsLowEndDevice();
+
++ static uint64_t MaxSharedMemorySize();
++
+ private:
+ FRIEND_TEST_ALL_PREFIXES(SysInfoTest, AmountOfAvailablePhysicalMemory);
+ FRIEND_TEST_ALL_PREFIXES(debug::SystemMetricsTest, ParseMeminfo);
+@@ -203,7 +205,7 @@ class BASE_EXPORT SysInfo {
+ static bool IsLowEndDeviceImpl();
+ static HardwareInfo GetHardwareInfoSync();
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_BSD)
+ static int64_t AmountOfAvailablePhysicalMemory(
+ const SystemMemoryInfoKB& meminfo);
+ #endif
diff --git a/www/iridium/files/patch-base_system_sys__info__freebsd.cc b/www/iridium/files/patch-base_system_sys__info__freebsd.cc
new file mode 100644
index 000000000000..12994422dc08
--- /dev/null
+++ b/www/iridium/files/patch-base_system_sys__info__freebsd.cc
@@ -0,0 +1,67 @@
+--- base/system/sys_info_freebsd.cc.orig 2019-12-16 21:50:40 UTC
++++ base/system/sys_info_freebsd.cc
+@@ -13,26 +13,59 @@
+ namespace base {
+
+ int64_t SysInfo::AmountOfPhysicalMemoryImpl() {
+- int pages, page_size;
++ 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;
+ }
+
++int64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() {
++ int page_size, r = 0;
++ unsigned 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<int64_t>((pgfree + pginact + pgcache) * page_size);
++}
++
+ // static
++std::string SysInfo::CPUModelName() {
++ int mib[] = { CTL_HW, HW_MODEL };
++ char name[256];
++ size_t size = base::size(name);
++ if (sysctl(mib, base::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);
+ }
+-
+ } // namespace base
diff --git a/www/iridium/files/patch-base_system_sys__info__posix.cc b/www/iridium/files/patch-base_system_sys__info__posix.cc
new file mode 100644
index 000000000000..5b79b03dce8a
--- /dev/null
+++ b/www/iridium/files/patch-base_system_sys__info__posix.cc
@@ -0,0 +1,11 @@
+--- base/system/sys_info_posix.cc.orig 2019-09-09 21:55:05 UTC
++++ base/system/sys_info_posix.cc
+@@ -220,6 +220,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/www/iridium/files/patch-base_task_thread__pool_environment__config__unittest.cc b/www/iridium/files/patch-base_task_thread__pool_environment__config__unittest.cc
new file mode 100644
index 000000000000..92b120193ada
--- /dev/null
+++ b/www/iridium/files/patch-base_task_thread__pool_environment__config__unittest.cc
@@ -0,0 +1,11 @@
+--- base/task/thread_pool/environment_config_unittest.cc.orig 2019-07-29 13:26:54 UTC
++++ base/task/thread_pool/environment_config_unittest.cc
+@@ -14,7 +14,7 @@ namespace internal {
+ TEST(ThreadPoolEnvironmentConfig, CanUseBackgroundPriorityForWorker) {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_IOS)
+ EXPECT_TRUE(CanUseBackgroundPriorityForWorkerThread());
+-#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || \
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS) || defined(OS_NACL)
+ EXPECT_FALSE(CanUseBackgroundPriorityForWorkerThread());
+ #else
diff --git a/www/iridium/files/patch-base_test_fontconfig__util__linux.cc b/www/iridium/files/patch-base_test_fontconfig__util__linux.cc
new file mode 100644
index 000000000000..eb6ff5024c46
--- /dev/null
+++ b/www/iridium/files/patch-base_test_fontconfig__util__linux.cc
@@ -0,0 +1,406 @@
+--- base/test/fontconfig_util_linux.cc.orig 2020-02-03 21:52:37 UTC
++++ base/test/fontconfig_util_linux.cc
+@@ -6,22 +6,397 @@
+
+ #include <fontconfig/fontconfig.h>
+
+-#include <memory>
+-
+ #include "base/base_paths.h"
+ #include "base/environment.h"
+ #include "base/files/file_path.h"
++#include "base/files/file_util.h"
+ #include "base/logging.h"
++#include "base/macros.h"
+ #include "base/path_service.h"
++#include "base/strings/string_util.h"
+
+ namespace base {
+
++namespace {
++
++const char kFontsConfTemplate[] = R"(<?xml version="1.0"?>
++<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
++<fontconfig>
++
++ <!-- Cache location. -->
++ <cachedir>$1</cachedir>
++
++ <!-- GCS-synced fonts. -->
++ <dir>$2</dir>
++
++ <!-- Default properties. -->
++ <match target="font">
++ <edit name="embeddedbitmap" mode="append_last">
++ <bool>false</bool>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Times</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>sans</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>DejaVu Sans</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>sans serif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ </match>
++
++ <!-- Some layout tests specify Helvetica as a family and we need to make sure
++ that we don't fallback to Tinos for them -->
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Helvetica</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>sans-serif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>serif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>mono</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Cousine</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>monospace</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Cousine</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Courier</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Cousine</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>cursive</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Comic Sans MS</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>fantasy</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Impact</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Monaco</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Arial</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Courier New</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Cousine</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Georgia</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Gelasio</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Times New Roman</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test qual="any" name="family">
++ <string>Verdana</string>
++ </test>
++ <!-- NOT metrically compatible! -->
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ </match>
++
++ <!-- TODO(thomasanderson): Move these configs to be test-specific. -->
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>NonAntiAliasedSans</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="antialias" mode="assign">
++ <bool>false</bool>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>SlightHintedGeorgia</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Gelasio</string>
++ </edit>
++ <edit name="hintstyle" mode="assign">
++ <const>hintslight</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>NonHintedSans</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <!-- These deliberately contradict each other. The 'hinting' preference
++ should take priority -->
++ <edit name="hintstyle" mode="assign">
++ <const>hintfull</const>
++ </edit>
++ <edit name="hinting" mode="assign">
++ <bool>false</bool>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>AutohintedSerif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="autohint" mode="assign">
++ <bool>true</bool>
++ </edit>
++ <edit name="hintstyle" mode="assign">
++ <const>hintmedium</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>HintedSerif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="autohint" mode="assign">
++ <bool>false</bool>
++ </edit>
++ <edit name="hintstyle" mode="assign">
++ <const>hintmedium</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>FullAndAutoHintedSerif</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="autohint" mode="assign">
++ <bool>true</bool>
++ </edit>
++ <edit name="hintstyle" mode="assign">
++ <const>hintfull</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>SubpixelEnabledArial</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="rgba" mode="assign">
++ <const>rgb</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>SubpixelDisabledArial</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Arimo</string>
++ </edit>
++ <edit name="rgba" mode="assign">
++ <const>none</const>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <!-- FontConfig doesn't currently provide a well-defined way to turn on
++ subpixel positioning. This is just an arbitrary pattern to use after
++ turning subpixel positioning on globally to ensure that we don't have
++ issues with our style getting cached for other tests. -->
++ <test name="family" compare="eq">
++ <string>SubpixelPositioning</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <!-- See comments above -->
++ <test name="family" compare="eq">
++ <string>SubpixelPositioningAhem</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>ahem</string>
++ </edit>
++ </match>
++
++ <match target="pattern">
++ <test name="family" compare="eq">
++ <string>SlightHintedTimesNewRoman</string>
++ </test>
++ <edit name="family" mode="assign">
++ <string>Tinos</string>
++ </edit>
++ <edit name="hintstyle" mode="assign">
++ <const>hintslight</const>
++ </edit>
++ </match>
++
++ <!-- When we encounter a character that the current font doesn't
++ support, gfx::GetFallbackFontForChar() returns the first font
++ that does have a glyph for the character. The list of fonts is
++ sorted by a pattern that includes the current locale, but doesn't
++ include a font family (which means that the fallback font depends
++ on the locale but not on the current font).
++
++ DejaVu Sans is commonly the only font that supports some
++ characters, such as "⇧", and even when other candidates are
++ available, DejaVu Sans is commonly first among them, because of
++ the way Fontconfig is ordinarily configured. For example, the
++ configuration in the Fonconfig source lists DejaVu Sans under the
++ sans-serif generic family, and appends sans-serif to patterns
++ that don't already include a generic family (such as the pattern
++ in gfx::GetFallbackFontForChar()).
++
++ To get the same fallback font in the layout tests, we could
++ duplicate this configuration here, or more directly, simply
++ append DejaVu Sans to all patterns. -->
++ <match target="pattern">
++ <edit name="family" mode="append_last">
++ <string>DejaVu Sans</string>
++ </edit>
++ </match>
++
++</fontconfig>
++)";
++
++} // namespace
++
+ void SetUpFontconfig() {
+- FilePath dir_module;
+- CHECK(PathService::Get(DIR_MODULE, &dir_module));
++ std::unique_ptr<Environment> env = Environment::Create();
++ if (!env->HasVar("FONTCONFIG_FILE")) {
++ // fonts.conf must be generated on-the-fly since it contains absolute paths
++ // which may be different if
++ // 1. The user moves/renames their build directory (or any parent dirs).
++ // 2. The build directory is mapped on a swarming bot at a location
++ // different from the one the buildbot used.
++ FilePath dir_module;
++ PathService::Get(DIR_MODULE, &dir_module);
++ FilePath font_cache = dir_module.Append("fontconfig_caches");
++ FilePath test_fonts = dir_module.Append("test_fonts");
++ std::string fonts_conf = ReplaceStringPlaceholders(
++ kFontsConfTemplate, {font_cache.value(), test_fonts.value()}, nullptr);
+
+- std::unique_ptr<Environment> env(Environment::Create());
+- CHECK(env->SetVar("FONTCONFIG_SYSROOT", dir_module.value().c_str()));
++ // Write the data to a different file and then atomically rename it to
++ // fonts.conf. This avoids the file being in a bad state when different
++ // parallel tests call this function at the same time.
++ FilePath fonts_conf_file_temp;
++ if(!CreateTemporaryFileInDir(dir_module, &fonts_conf_file_temp))
++ CHECK(CreateTemporaryFile(&fonts_conf_file_temp));
++ CHECK(
++ WriteFile(fonts_conf_file_temp, fonts_conf.c_str(), fonts_conf.size()));
++ FilePath fonts_conf_file = dir_module.Append("fonts.conf");
++ if (ReplaceFile(fonts_conf_file_temp, fonts_conf_file, nullptr))
++ env->SetVar("FONTCONFIG_FILE", fonts_conf_file.value());
++ else
++ env->SetVar("FONTCONFIG_FILE", fonts_conf_file_temp.value());
++ }
+ }
+
+ } // namespace base
diff --git a/www/iridium/files/patch-base_test_generate__fontconfig__caches.cc b/www/iridium/files/patch-base_test_generate__fontconfig__caches.cc
new file mode 100644
index 000000000000..60cb0527b5f4
--- /dev/null
+++ b/www/iridium/files/patch-base_test_generate__fontconfig__caches.cc
@@ -0,0 +1,17 @@
+--- base/test/generate_fontconfig_caches.cc.orig 2019-12-16 21:51:21 UTC
++++ base/test/generate_fontconfig_caches.cc
+@@ -59,7 +59,14 @@ int main() {
+ FcFini();
+
+ // Check existence of intended fontconfig cache file.
++#if defined(OS_BSD)
++ // Our version of fontconfig is too old to respect .uuid files in font directories,
++ // so we check for the CACHEDIR.TAG file instead
+ CHECK(base::PathExists(
++ fontconfig_caches.Append("CACHEDIR.TAG")));
++#else
++ CHECK(base::PathExists(
+ fontconfig_caches.Append(base::StrCat({uuid, "-le64.cache-7"}))));
++#endif
+ return 0;
+ }
diff --git a/www/iridium/files/patch-base_test_launcher_test__launcher.cc b/www/iridium/files/patch-base_test_launcher_test__launcher.cc
new file mode 100644
index 000000000000..4ec5e581d6b6
--- /dev/null
+++ b/www/iridium/files/patch-base_test_launcher_test__launcher.cc
@@ -0,0 +1,19 @@
+--- base/test/launcher/test_launcher.cc.orig 2020-03-16 18:40:27 UTC
++++ base/test/launcher/test_launcher.cc
+@@ -55,6 +55,7 @@
+ #include "testing/gtest/include/gtest/gtest.h"
+
+ #if defined(OS_POSIX)
++#include <signal.h>
+ #include <fcntl.h>
+
+ #include "base/files/file_descriptor_watcher_posix.h"
+@@ -551,7 +552,7 @@ ChildProcessResults DoLaunchChildTestProcess(
+ #if !defined(OS_FUCHSIA)
+ options.new_process_group = true;
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ options.kill_on_parent_death = true;
+ #endif
+
diff --git a/www/iridium/files/patch-base_test_test__file__util__posix.cc b/www/iridium/files/patch-base_test_test__file__util__posix.cc
new file mode 100644
index 000000000000..a65fcc61d56b
--- /dev/null
+++ b/www/iridium/files/patch-base_test_test__file__util__posix.cc
@@ -0,0 +1,11 @@
+--- base/test/test_file_util_posix.cc.orig 2020-02-03 21:52:37 UTC
++++ base/test/test_file_util_posix.cc
+@@ -84,7 +84,7 @@ void SyncPageCacheToDisk() {
+ sync();
+ }
+
+-#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ bool EvictFileFromSystemCache(const FilePath& file) {
+ // There doesn't seem to be a POSIX way to cool the disk cache.
+ NOTIMPLEMENTED();
diff --git a/www/iridium/files/patch-base_test_test__suite.cc b/www/iridium/files/patch-base_test_test__suite.cc
new file mode 100644
index 000000000000..74f7f01726cc
--- /dev/null
+++ b/www/iridium/files/patch-base_test_test__suite.cc
@@ -0,0 +1,37 @@
+--- base/test/test_suite.cc.orig 2020-03-23 15:30:45 UTC
++++ base/test/test_suite.cc
+@@ -68,7 +68,7 @@
+ #include "base/test/test_support_ios.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/test/fontconfig_util_linux.h"
+ #endif
+
+@@ -384,14 +384,14 @@ void TestSuite::PreInitialize() {
+ testing::GTEST_FLAG(catch_exceptions) = false;
+ #endif
+ EnableTerminationOnHeapCorruption();
+-#if defined(OS_LINUX) && defined(USE_AURA)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_AURA)
+ // When calling native char conversion functions (e.g wrctomb) we need to
+ // have the locale set. In the absence of such a call the "C" locale is the
+ // default. In the gtk code (below) gtk_init() implicitly sets a locale.
+ setlocale(LC_ALL, "");
+ // We still need number to string conversions to be locale insensitive.
+ setlocale(LC_NUMERIC, "C");
+-#endif // defined(OS_LINUX) && defined(USE_AURA)
++#endif // (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_AURA)
+
+ // On Android, AtExitManager is created in
+ // testing/android/native_test_wrapper.cc before main() is called.
+@@ -620,7 +620,7 @@ void TestSuite::Initialize() {
+ // TODO(jshin): Should we set the locale via an OS X locale API here?
+ i18n::SetICUDefaultLocale("en_US");
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SetUpFontconfig();
+ #endif
+
diff --git a/www/iridium/files/patch-base_third__party_libevent_BUILD.gn b/www/iridium/files/patch-base_third__party_libevent_BUILD.gn
new file mode 100644
index 000000000000..67042d6ca3e5
--- /dev/null
+++ b/www/iridium/files/patch-base_third__party_libevent_BUILD.gn
@@ -0,0 +1,24 @@
+--- base/third_party/libevent/BUILD.gn.orig 2019-03-11 22:00:51 UTC
++++ base/third_party/libevent/BUILD.gn
+@@ -43,13 +43,20 @@ static_library("libevent") {
+ "mac/event-config.h",
+ ]
+ include_dirs = [ "mac" ]
+- } else if (is_linux) {
++ } else if (is_linux && !is_bsd) {
+ sources += [
+ "epoll.c",
+ "linux/config.h",
+ "linux/event-config.h",
+ ]
+ include_dirs = [ "linux" ]
++ } else if (is_bsd) {
++ sources += [
++ "kqueue.c",
++ "freebsd/config.h",
++ "freebsd/event-config.h",
++ ]
++ include_dirs = [ "freebsd" ]
+ } else if (is_android) {
+ sources += [
+ "android/config.h",
diff --git a/www/iridium/files/patch-base_threading_platform__thread.h b/www/iridium/files/patch-base_threading_platform__thread.h
new file mode 100644
index 000000000000..0ff2fc68f36a
--- /dev/null
+++ b/www/iridium/files/patch-base_threading_platform__thread.h
@@ -0,0 +1,11 @@
+--- base/threading/platform_thread.h.orig 2019-10-21 19:06:18 UTC
++++ base/threading/platform_thread.h
+@@ -221,7 +221,7 @@ class BASE_EXPORT PlatformThread {
+
+ static ThreadPriority GetCurrentThreadPriority();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Toggles a specific thread's priority at runtime. This can be used to
+ // change the priority of a thread in a different process and will fail
+ // if the calling process does not have proper permissions. The
diff --git a/www/iridium/files/patch-base_threading_platform__thread__linux.cc b/www/iridium/files/patch-base_threading_platform__thread__linux.cc
new file mode 100644
index 000000000000..78123188b58a
--- /dev/null
+++ b/www/iridium/files/patch-base_threading_platform__thread__linux.cc
@@ -0,0 +1,30 @@
+--- base/threading/platform_thread_linux.cc.orig 2019-03-11 22:00:51 UTC
++++ base/threading/platform_thread_linux.cc
+@@ -18,7 +18,9 @@
+
+ #if !defined(OS_NACL) && !defined(OS_AIX)
+ #include <pthread.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/resource.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
+@@ -99,7 +101,7 @@ const ThreadPriorityToNiceValuePair kThreadPriorityToN
+
+ Optional<bool> CanIncreaseCurrentThreadPriorityForPlatform(
+ ThreadPriority priority) {
+-#if !defined(OS_NACL)
++#if !defined(OS_NACL) && !defined(OS_BSD)
+ // A non-zero soft-limit on RLIMIT_RTPRIO is required to be allowed to invoke
+ // pthread_setschedparam in SetCurrentThreadPriorityForPlatform().
+ struct rlimit rlim;
+@@ -141,7 +143,7 @@ Optional<ThreadPriority> GetCurrentThreadPriorityForPl
+ void PlatformThread::SetName(const std::string& name) {
+ ThreadIdNameManager::GetInstance()->SetName(name);
+
+-#if !defined(OS_NACL) && !defined(OS_AIX)
++#if !defined(OS_NACL) && !defined(OS_AIX) && !defined(OS_BSD)
+ // On linux we can get the thread names to show up in the debugger by setting
+ // the process name for the LWP. We don't want to do this for the main
+ // thread because that would rename the process, causing tools like killall
diff --git a/www/iridium/files/patch-base_threading_platform__thread__posix.cc b/www/iridium/files/patch-base_threading_platform__thread__posix.cc
new file mode 100644
index 000000000000..e2681e175e63
--- /dev/null
+++ b/www/iridium/files/patch-base_threading_platform__thread__posix.cc
@@ -0,0 +1,11 @@
+--- base/threading/platform_thread_posix.cc.orig 2019-03-11 22:00:51 UTC
++++ base/threading/platform_thread_posix.cc
+@@ -66,7 +66,7 @@ void* ThreadFunc(void* params) {
+ if (!thread_params->joinable)
+ base::ThreadRestrictions::SetSingletonAllowed(false);
+
+-#if !defined(OS_NACL)
++#if !defined(OS_NACL) && !defined(OS_BSD)
+ // Threads on linux/android may inherit their priority from the thread
+ // where they were created. This explicitly sets the priority of all new
+ // threads.
diff --git a/www/iridium/files/patch-base_threading_platform__thread__unittest.cc b/www/iridium/files/patch-base_threading_platform__thread__unittest.cc
new file mode 100644
index 000000000000..b998b2d83f2c
--- /dev/null
+++ b/www/iridium/files/patch-base_threading_platform__thread__unittest.cc
@@ -0,0 +1,20 @@
+--- base/threading/platform_thread_unittest.cc.orig 2020-03-23 15:31:47 UTC
++++ base/threading/platform_thread_unittest.cc
+@@ -302,7 +302,7 @@ TEST(PlatformThreadTest,
+ // and hardcodes what we know. Please inform scheduler-dev@chromium.org if this
+ // proprerty changes for a given platform.
+ TEST(PlatformThreadTest, CanIncreaseThreadPriority) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Ubuntu, RLIMIT_NICE and RLIMIT_RTPRIO are 0 by default, so we won't be
+ // able to increase priority to any level.
+ constexpr bool kCanIncreasePriority = false;
+@@ -398,7 +398,7 @@ TEST(PlatformThreadTest, SetHugeThreadName) {
+ TEST(PlatformThreadTest, GetDefaultThreadStackSize) {
+ size_t stack_size = PlatformThread::GetDefaultThreadStackSize();
+ #if defined(OS_WIN) || defined(OS_IOS) || defined(OS_FUCHSIA) || \
+- (defined(OS_LINUX) && !defined(THREAD_SANITIZER)) || \
++ ((defined(OS_LINUX) || defined(OS_BSD)) && !defined(THREAD_SANITIZER)) || \
+ (defined(OS_ANDROID) && !defined(ADDRESS_SANITIZER))
+ EXPECT_EQ(0u, stack_size);
+ #else
diff --git a/www/iridium/files/patch-base_threading_thread__task__runner__handle.cc b/www/iridium/files/patch-base_threading_thread__task__runner__handle.cc
new file mode 100644
index 000000000000..bdafc95fd2e2
--- /dev/null
+++ b/www/iridium/files/patch-base_threading_thread__task__runner__handle.cc
@@ -0,0 +1,26 @@
+--- base/threading/thread_task_runner_handle.cc.orig 2019-12-16 21:50:40 UTC
++++ base/threading/thread_task_runner_handle.cc
+@@ -8,6 +8,7 @@
+ #include <utility>
+
+ #include "base/bind.h"
++#include "base/callback_helpers.h"
+ #include "base/lazy_instance.h"
+ #include "base/logging.h"
+ #include "base/run_loop.h"
+@@ -38,6 +39,7 @@ bool ThreadTaskRunnerHandle::IsSet() {
+ return !!thread_task_runner_tls.Pointer()->Get();
+ }
+
++#if defined(OS_BSD)
+ // static
+ ScopedClosureRunner ThreadTaskRunnerHandle::OverrideForTesting(
+ scoped_refptr<SingleThreadTaskRunner> overriding_task_runner) {
+@@ -82,6 +84,7 @@ ScopedClosureRunner ThreadTaskRunnerHandle::OverrideFo
+ base::Unretained(ttrh->task_runner_.get()),
+ std::move(no_running_during_override)));
+ }
++#endif
+
+ ThreadTaskRunnerHandle::ThreadTaskRunnerHandle(
+ scoped_refptr<SingleThreadTaskRunner> task_runner)
diff --git a/www/iridium/files/patch-base_trace__event_malloc__dump__provider.cc b/www/iridium/files/patch-base_trace__event_malloc__dump__provider.cc
new file mode 100644
index 000000000000..fef6ba833abf
--- /dev/null
+++ b/www/iridium/files/patch-base_trace__event_malloc__dump__provider.cc
@@ -0,0 +1,21 @@
+--- base/trace_event/malloc_dump_provider.cc.orig 2020-03-16 18:39:41 UTC
++++ base/trace_event/malloc_dump_provider.cc
+@@ -17,6 +17,8 @@
+
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
++#elif defined(OS_BSD)
++#include <stdlib.h>
+ #else
+ #include <malloc.h>
+ #endif
+@@ -132,6 +134,9 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDump
+ }
+ #elif defined(OS_FUCHSIA)
+ // TODO(fuchsia): Port, see https://crbug.com/706592.
++#elif defined(OS_BSD)
++ total_virtual_size = 0;
++ allocated_objects_size = 0;
+ #else
+ struct mallinfo info = mallinfo();
+ // In case of Android's jemalloc |arena| is 0 and the outer pages size is
diff --git a/www/iridium/files/patch-base_trace__event_process__memory__dump.cc b/www/iridium/files/patch-base_trace__event_process__memory__dump.cc
new file mode 100644
index 000000000000..6624e1d04af6
--- /dev/null
+++ b/www/iridium/files/patch-base_trace__event_process__memory__dump.cc
@@ -0,0 +1,11 @@
+--- base/trace_event/process_memory_dump.cc.orig 2019-03-11 22:00:51 UTC
++++ base/trace_event/process_memory_dump.cc
+@@ -94,7 +94,7 @@ size_t ProcessMemoryDump::CountResidentBytes(void* sta
+ #if defined(OS_WIN)
+ std::unique_ptr<PSAPI_WORKING_SET_EX_INFORMATION[]> vec(
+ new PSAPI_WORKING_SET_EX_INFORMATION[max_vec_size]);
+-#elif defined(OS_MACOSX)
++#elif defined(OS_MACOSX) || defined(OS_BSD)
+ std::unique_ptr<char[]> vec(new char[max_vec_size]);
+ #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
+ std::unique_ptr<unsigned char[]> vec(new unsigned char[max_vec_size]);
diff --git a/www/iridium/files/patch-base_trace__event_process__memory__dump.h b/www/iridium/files/patch-base_trace__event_process__memory__dump.h
new file mode 100644
index 000000000000..1ae1b93e6409
--- /dev/null
+++ b/www/iridium/files/patch-base_trace__event_process__memory__dump.h
@@ -0,0 +1,11 @@
+--- base/trace_event/process_memory_dump.h.orig 2019-03-11 22:00:51 UTC
++++ base/trace_event/process_memory_dump.h
+@@ -22,7 +22,7 @@
+
+ // Define COUNT_RESIDENT_BYTES_SUPPORTED if platform supports counting of the
+ // resident memory.
+-#if !defined(OS_NACL)
++#if !defined(OS_NACL) && !defined(OS_BSD)
+ #define COUNT_RESIDENT_BYTES_SUPPORTED
+ #endif
+
diff --git a/www/iridium/files/patch-build_config_BUILD.gn b/www/iridium/files/patch-build_config_BUILD.gn
new file mode 100644
index 000000000000..5eadb70887bf
--- /dev/null
+++ b/www/iridium/files/patch-build_config_BUILD.gn
@@ -0,0 +1,30 @@
+--- build/config/BUILD.gn.orig 2020-03-16 18:40:27 UTC
++++ build/config/BUILD.gn
+@@ -133,7 +133,7 @@ config("debug") {
+ # builds, and we have to tell it to turn it off.
+ defines += [ "_HAS_ITERATOR_DEBUGGING=0" ]
+ }
+- } else if (is_linux && current_cpu == "x64" && enable_iterator_debugging) {
++ } else if ((is_linux || is_bsd) && current_cpu == "x64" && enable_iterator_debugging) {
+ # Enable libstdc++ debugging facilities to help catch problems early, see
+ # http://crbug.com/65151 .
+ # TODO(phajdan.jr): Should we enable this for all of POSIX?
+@@ -231,9 +231,7 @@ config("default_libs") {
+ ]
+ } else if (is_linux) {
+ libs = [
+- "dl",
+ "pthread",
+- "rt",
+ ]
+ }
+ }
+@@ -315,7 +313,7 @@ config("executable_config") {
+ "//build/config/ios:ios_dynamic_flags",
+ "//build/config/ios:ios_executable_flags",
+ ]
+- } else if (is_linux || is_android || current_os == "aix") {
++ } else if (is_linux || is_bsd || is_android || current_os == "aix") {
+ configs += [ "//build/config/gcc:executable_config" ]
+ if (is_chromecast) {
+ configs += [ "//build/config/chromecast:executable_config" ]
diff --git a/www/iridium/files/patch-build_config_BUILDCONFIG.gn b/www/iridium/files/patch-build_config_BUILDCONFIG.gn
new file mode 100644
index 000000000000..7c6d307fbd22
--- /dev/null
+++ b/www/iridium/files/patch-build_config_BUILDCONFIG.gn
@@ -0,0 +1,48 @@
+--- build/config/BUILDCONFIG.gn.orig 2019-06-04 18:55:15 UTC
++++ build/config/BUILDCONFIG.gn
+@@ -131,10 +131,10 @@ declare_args() {
+ is_official_build = false
+
+ # Whether we're a traditional desktop unix.
+- is_desktop_linux = current_os == "linux"
++ is_desktop_linux = current_os == "linux" || current_os == "freebsd"
+
+ # Set to true when compiling with the Clang compiler.
+- is_clang = current_os != "linux" ||
++ is_clang = current_os != "linux" || current_os == "freebsd" ||
+ (current_cpu != "s390x" && current_cpu != "s390" &&
+ current_cpu != "ppc64" && current_cpu != "ppc" &&
+ current_cpu != "mips" && current_cpu != "mips64")
+@@ -186,8 +186,8 @@ if (host_toolchain == "") {
+ # TODO(dpranke): Add some sort of assert here that verifies that
+ # no toolchain omitted host_toolchain from its toolchain_args().
+
+- if (host_os == "linux") {
+- if (target_os != "linux") {
++ if (host_os == "linux" || host_os == "freebsd") {
++ if (target_os != "linux" && target_os != "freebsd") {
+ host_toolchain = "//build/toolchain/linux:clang_$host_cpu"
+ } else if (is_clang) {
+ host_toolchain = "//build/toolchain/linux:clang_$host_cpu"
+@@ -224,7 +224,7 @@ if (target_os == "android") {
+ assert(host_os == "linux" || host_os == "mac",
+ "Android builds are only supported on Linux and Mac hosts.")
+ _default_toolchain = "//build/toolchain/android:android_clang_$target_cpu"
+-} else if (target_os == "chromeos" || target_os == "linux") {
++} else if (target_os == "chromeos" || target_os == "linux" || target_os == "freebsd") {
+ # See comments in build/toolchain/cros/BUILD.gn about board compiles.
+ if (is_clang) {
+ _default_toolchain = "//build/toolchain/linux:clang_$target_cpu"
+@@ -288,10 +288,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 == "chromeos" || current_os == "linux"
++is_linux = current_os == "chromeos" || current_os == "linux" || current_os == "freebsd"
+ is_mac = current_os == "mac"
+ is_nacl = current_os == "nacl"
+ is_win = current_os == "win" || current_os == "winuwp"
++is_bsd = current_os == "freebsd"
+
+ is_posix = !is_win && !is_fuchsia
+
diff --git a/www/iridium/files/patch-build_config_compiler_BUILD.gn b/www/iridium/files/patch-build_config_compiler_BUILD.gn
new file mode 100644
index 000000000000..76e9706a7967
--- /dev/null
+++ b/www/iridium/files/patch-build_config_compiler_BUILD.gn
@@ -0,0 +1,92 @@
+--- build/config/compiler/BUILD.gn.orig 2020-03-16 18:40:27 UTC
++++ build/config/compiler/BUILD.gn
+@@ -137,7 +137,7 @@ declare_args() {
+ # TODO(vitalybuka):
+ # 'is_android' breaks content_shell_test_apk on android-kitkat-arm-rel.
+ # 'use_xcode_clang' may call old clang.
+- init_stack_vars = !is_android && !use_xcode_clang && !is_official_build
++ init_stack_vars = !is_android && !use_xcode_clang && !is_official_build && !is_bsd
+ }
+
+ declare_args() {
+@@ -298,7 +298,7 @@ config("compiler") {
+
+ # Linker warnings.
+ if (fatal_linker_warnings && !(is_chromeos && current_cpu == "arm") &&
+- !is_mac && !is_ios && current_os != "aix") {
++ !is_mac && !is_ios && current_os != "aix" && !is_bsd) {
+ # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580
+ ldflags += [ "-Wl,--fatal-warnings" ]
+ }
+@@ -393,7 +393,7 @@ config("compiler") {
+
+ # Compiler instrumentation can introduce dependencies in DSOs to symbols in
+ # the executable they are loaded into, so they are unresolved at link-time.
+- if (!using_sanitizer) {
++ if (!using_sanitizer && !is_bsd) {
+ ldflags += [
+ "-Wl,-z,defs",
+ "-Wl,--as-needed",
+@@ -486,7 +486,7 @@ config("compiler") {
+ }
+ }
+
+- if (is_clang && !is_nacl && !use_xcode_clang) {
++ if (is_clang && !is_nacl && !use_xcode_clang && !is_bsd) {
+ cflags += [ "-fcrash-diagnostics-dir=" +
+ rebase_path("//tools/clang/crashreports", root_build_dir) ]
+
+@@ -767,7 +767,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) {
+ cflags += [ "--target=aarch64-linux-gnu" ]
+ ldflags += [ "--target=aarch64-linux-gnu" ]
+ }
+@@ -1118,7 +1118,7 @@ config("compiler_deterministic") {
+ "-Xclang",
+ ".",
+ ]
+- if (!is_win) {
++ if (!is_win && !is_bsd) {
+ # We don't use clang -cc1as on Windows (yet? https://crbug.com/762167)
+ asmflags = [ "-Wa,-fdebug-compilation-dir,." ]
+ }
+@@ -1507,7 +1507,7 @@ config("default_warnings") {
+ cflags += [ "-Wno-nonportable-include-path" ]
+ }
+
+- if (current_toolchain == host_toolchain || !use_xcode_clang) {
++ if ((current_toolchain == host_toolchain || !use_xcode_clang) && !is_bsd) {
+ # Flags NaCl (Clang 3.7) and Xcode 9.2 (Clang clang-900.0.39.2) do not
+ # recognize.
+ cflags += [
+@@ -1741,7 +1741,7 @@ config("thin_archive") {
+ # Mac and iOS use the mac-specific "libtool" command, not ar, which doesn't
+ # have a "thin archive" mode (it does accept -T, but it means truncating
+ # archive names to 16 characters, which is not what we want).
+- if ((is_posix && !is_nacl && !is_mac && !is_ios) || is_fuchsia) {
++ if ((is_posix && !is_nacl && !is_mac && !is_ios && !is_bsd) || is_fuchsia) {
+ arflags = [ "-T" ]
+ } else if (is_win && use_lld) {
+ arflags = [ "/llvmlibthin" ]
+@@ -2334,7 +2334,7 @@ config("symbols") {
+ # flag, so we can use use -g1 for pnacl and nacl-clang compiles.
+ # gcc nacl is is_nacl && !is_clang, pnacl and nacl-clang are && is_clang.
+ if (!is_nacl || is_clang) {
+- cflags += [ "-g2" ]
++ cflags += [ "-g0" ]
+ }
+
+ if (use_debug_fission && !is_nacl && !is_android) {
+@@ -2355,7 +2355,7 @@ config("symbols") {
+ # DWARF info may be corrupt; offsets in a range list entry are in different
+ # sections" there. Maybe just a bug in nacl_switch_32.S.
+ if (!is_mac && !is_ios && !is_nacl && current_cpu != "x86" &&
+- (use_gold || use_lld)) {
++ (use_gold || use_lld) && !is_bsd) {
+ if (is_clang) {
+ # This flag enables the GNU-format pubnames and pubtypes sections,
+ # which lld needs in order to generate a correct GDB index.
diff --git a/www/iridium/files/patch-build_config_compiler_compiler.gni b/www/iridium/files/patch-build_config_compiler_compiler.gni
new file mode 100644
index 000000000000..5826499ed89a
--- /dev/null
+++ b/www/iridium/files/patch-build_config_compiler_compiler.gni
@@ -0,0 +1,20 @@
+--- build/config/compiler/compiler.gni.orig 2020-03-16 18:40:27 UTC
++++ build/config/compiler/compiler.gni
+@@ -47,7 +47,7 @@ declare_args() {
+ # only two architectures that are currently checked in). Turn this off when
+ # you are using a custom toolchain and need to control -B in cflags.
+ linux_use_bundled_binutils =
+- linux_use_bundled_binutils_override && is_linux &&
++ linux_use_bundled_binutils_override && (is_linux && !is_bsd) &&
+ (current_cpu == "x64" || current_cpu == "x86")
+ binutils_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin",
+ root_build_dir)
+@@ -200,7 +200,7 @@ declare_args() {
+ declare_args() {
+ # Whether to use the gold linker from binutils instead of lld or bfd.
+ use_gold =
+- !use_lld && !(is_chromecast && is_linux &&
++ !is_bsd && !use_lld && !(is_chromecast && is_linux &&
+ (current_cpu == "arm" || current_cpu == "mipsel")) &&
+ ((is_linux && (current_cpu == "x64" || current_cpu == "x86" ||
+ current_cpu == "arm" || current_cpu == "arm64" ||
diff --git a/www/iridium/files/patch-build_config_features.gni b/www/iridium/files/patch-build_config_features.gni
new file mode 100644
index 000000000000..c98a61186fa9
--- /dev/null
+++ b/www/iridium/files/patch-build_config_features.gni
@@ -0,0 +1,11 @@
+--- build/config/features.gni.orig 2019-10-21 19:06:18 UTC
++++ build/config/features.gni
+@@ -26,7 +26,7 @@ declare_args() {
+ proprietary_codecs = is_chrome_branded || is_chromecast
+
+ # libudev usage. This currently only affects the content layer.
+- use_udev = is_linux && !is_chromecast
++ use_udev = is_linux && !is_chromecast && !is_bsd
+
+ use_dbus = is_linux && !is_chromecast
+
diff --git a/www/iridium/files/patch-build_config_freetype_freetype.gni b/www/iridium/files/patch-build_config_freetype_freetype.gni
new file mode 100644
index 000000000000..17bed01510f8
--- /dev/null
+++ b/www/iridium/files/patch-build_config_freetype_freetype.gni
@@ -0,0 +1,9 @@
+--- build/config/freetype/freetype.gni.orig 2019-03-18 08:59:45 UTC
++++ build/config/freetype/freetype.gni
+@@ -10,5 +10,5 @@ declare_args() {
+ # than version 2.7.1 and have color bitmap support compiled in. WARNING:
+ # System FreeType configurations other than as described WILL INTRODUCE TEXT
+ # RENDERING AND SECURITY REGRESSIONS.
+- use_system_freetype = false
++ use_system_freetype = true
+ }
diff --git a/www/iridium/files/patch-build_config_linux_BUILD.gn b/www/iridium/files/patch-build_config_linux_BUILD.gn
new file mode 100644
index 000000000000..94faef049b08
--- /dev/null
+++ b/www/iridium/files/patch-build_config_linux_BUILD.gn
@@ -0,0 +1,11 @@
+--- build/config/linux/BUILD.gn.orig 2019-03-11 22:00:52 UTC
++++ build/config/linux/BUILD.gn
+@@ -28,7 +28,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/www/iridium/files/patch-build_config_linux_pkg-config.py b/www/iridium/files/patch-build_config_linux_pkg-config.py
new file mode 100644
index 000000000000..8a2865a024c0
--- /dev/null
+++ b/www/iridium/files/patch-build_config_linux_pkg-config.py
@@ -0,0 +1,26 @@
+--- build/config/linux/pkg-config.py.orig 2019-07-24 18:58:02 UTC
++++ build/config/linux/pkg-config.py
+@@ -59,8 +59,12 @@ def SetConfigPath(options):
+ print("You must specify an architecture via -a if using a sysroot.")
+ sys.exit(1)
+
+- libdir = sysroot + '/usr/' + options.system_libdir + '/pkgconfig'
+- libdir += ':' + sysroot + '/usr/share/pkgconfig'
++ if "linux" in sys.platform:
++ libdir = sysroot + '/libdata/' + options.system_libdir + '/pkgconfig'
++ libdir += ':' + sysroot + '/usr/share/pkgconfig'
++ elif "bsd" in sys.platform:
++ libdir = sysroot + '/libdata/pkgconfig'
++ libdir += ':' + '/usr/libdata/pkgconfig'
+ os.environ['PKG_CONFIG_LIBDIR'] = libdir
+ return libdir
+
+@@ -109,7 +113,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 "bsd" not in sys.platform:
+ print("[[],[],[],[],[]]")
+ return 0
+
diff --git a/www/iridium/files/patch-build_config_sysroot.gni b/www/iridium/files/patch-build_config_sysroot.gni
new file mode 100644
index 000000000000..83a58cad544a
--- /dev/null
+++ b/www/iridium/files/patch-build_config_sysroot.gni
@@ -0,0 +1,15 @@
+--- build/config/sysroot.gni.orig 2019-03-11 22:00:52 UTC
++++ build/config/sysroot.gni
+@@ -15,9 +15,10 @@ declare_args() {
+ # The absolute path to directory containing linux sysroot images
+ target_sysroot_dir = "//build/linux"
+
+- use_sysroot = current_cpu == "x86" || current_cpu == "x64" ||
++ use_sysroot = !is_bsd && (
++ current_cpu == "x86" || current_cpu == "x64" ||
+ current_cpu == "arm" || current_cpu == "arm64" ||
+- current_cpu == "mipsel" || current_cpu == "mips64el"
++ current_cpu == "mipsel" || current_cpu == "mips64el")
+ }
+
+ if (current_os == target_os && current_cpu == target_cpu &&
diff --git a/www/iridium/files/patch-build_detect__host__arch.py b/www/iridium/files/patch-build_detect__host__arch.py
new file mode 100644
index 000000000000..588896662607
--- /dev/null
+++ b/www/iridium/files/patch-build_detect__host__arch.py
@@ -0,0 +1,11 @@
+--- build/detect_host_arch.py.orig 2019-07-24 18:58:02 UTC
++++ build/detect_host_arch.py
+@@ -21,6 +21,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/www/iridium/files/patch-build_gn__run__binary.py b/www/iridium/files/patch-build_gn__run__binary.py
new file mode 100644
index 000000000000..d9e733834b4a
--- /dev/null
+++ b/www/iridium/files/patch-build_gn__run__binary.py
@@ -0,0 +1,11 @@
+--- build/gn_run_binary.py.orig 2019-07-24 18:58:02 UTC
++++ build/gn_run_binary.py
+@@ -24,7 +24,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"})
+ if ret != 0:
+ if ret <= -100:
+ # Windows error codes such as 0xC0000005 and 0xC0000409 are much easier to
diff --git a/www/iridium/files/patch-build_linux_chrome.map b/www/iridium/files/patch-build_linux_chrome.map
new file mode 100644
index 000000000000..7465bc9773c5
--- /dev/null
+++ b/www/iridium/files/patch-build_linux_chrome.map
@@ -0,0 +1,29 @@
+--- build/linux/chrome.map.orig 2019-03-11 22:00:52 UTC
++++ build/linux/chrome.map
+@@ -1,4 +1,7 @@
+ {
++local:
++ *;
++
+ global:
+ __bss_start;
+ __data_start;
+@@ -20,6 +23,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.
+ calloc;
+@@ -81,7 +88,4 @@ global:
+ localtime64;
+ localtime64_r;
+ localtime_r;
+-
+-local:
+- *;
+ };
diff --git a/www/iridium/files/patch-build_linux_libpci_BUILD.gn b/www/iridium/files/patch-build_linux_libpci_BUILD.gn
new file mode 100644
index 000000000000..86373b5ebf39
--- /dev/null
+++ b/www/iridium/files/patch-build_linux_libpci_BUILD.gn
@@ -0,0 +1,53 @@
+--- build/linux/libpci/BUILD.gn.orig 2019-03-11 22:00:52 UTC
++++ build/linux/libpci/BUILD.gn
+@@ -3,20 +3,36 @@
+ # found in the LICENSE file.
+
+ import("//tools/generate_library_loader/generate_library_loader.gni")
++import("//build/config/linux/pkg_config.gni")
+
+-# This generates a target named "libpci".
+-generate_library_loader("libpci") {
+- name = "LibPciLoader"
+- output_h = "libpci.h"
+- output_cc = "libpci_loader.cc"
+- header = "<pci/pci.h>"
++declare_args() {
++ use_system_libpci = is_bsd
++}
+
+- functions = [
+- "pci_alloc",
+- "pci_init",
+- "pci_cleanup",
+- "pci_scan_bus",
+- "pci_fill_info",
+- "pci_lookup_name",
+- ]
++if (use_system_libpci) {
++ pkg_config("system_libpci") {
++ packages = [ "libpci" ]
++ }
++
++ source_set("libpci") {
++ public_configs = [ ":system_libpci" ]
++ }
++
++} else {
++ # This generates a target named "libpci".
++ generate_library_loader("libpci") {
++ name = "LibPciLoader"
++ output_h = "libpci.h"
++ output_cc = "libpci_loader.cc"
++ header = "<pci/pci.h>"
++
++ functions = [
++ "pci_alloc",
++ "pci_init",
++ "pci_cleanup",
++ "pci_scan_bus",
++ "pci_fill_info",
++ "pci_lookup_name",
++ ]
++ }
+ }
diff --git a/www/iridium/files/patch-build_linux_unbundle_libusb.gn b/www/iridium/files/patch-build_linux_unbundle_libusb.gn
new file mode 100644
index 000000000000..1cc0b00012c6
--- /dev/null
+++ b/www/iridium/files/patch-build_linux_unbundle_libusb.gn
@@ -0,0 +1,27 @@
+--- build/linux/unbundle/libusb.gn.orig 2019-03-17 01:47:13 UTC
++++ build/linux/unbundle/libusb.gn
+@@ -0,0 +1,24 @@
++# 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" ]
++}
diff --git a/www/iridium/files/patch-build_linux_unbundle_replace__gn__files.py b/www/iridium/files/patch-build_linux_unbundle_replace__gn__files.py
new file mode 100644
index 000000000000..ca2d4fd5e12e
--- /dev/null
+++ b/www/iridium/files/patch-build_linux_unbundle_replace__gn__files.py
@@ -0,0 +1,10 @@
+--- build/linux/unbundle/replace_gn_files.py.orig 2019-03-11 22:00:52 UTC
++++ build/linux/unbundle/replace_gn_files.py
+@@ -27,6 +27,7 @@ REPLACEMENTS = {
+ 'libevent': 'base/third_party/libevent/BUILD.gn',
+ 'libjpeg': 'third_party/libjpeg.gni',
+ 'libpng': 'third_party/libpng/BUILD.gn',
++ 'libusb': 'third_party/libusb/BUILD.gn',
+ 'libvpx': 'third_party/libvpx/BUILD.gn',
+ 'libwebp': 'third_party/libwebp/BUILD.gn',
+ 'libxml': 'third_party/libxml/BUILD.gn',
diff --git a/www/iridium/files/patch-build_toolchain_gcc__toolchain.gni b/www/iridium/files/patch-build_toolchain_gcc__toolchain.gni
new file mode 100644
index 000000000000..4d315485b923
--- /dev/null
+++ b/www/iridium/files/patch-build_toolchain_gcc__toolchain.gni
@@ -0,0 +1,45 @@
+--- build/toolchain/gcc_toolchain.gni.orig 2020-03-16 18:40:27 UTC
++++ build/toolchain/gcc_toolchain.gni
+@@ -36,6 +36,11 @@ if (is_linux && target_os == "android") {
+ enable_resource_whitelist_generation = false
+ }
+
++declare_args() {
++ extra_cxxflags = ""
++ extra_ldflags = ""
++}
++
+ # This template defines a toolchain for something that works like gcc
+ # (including clang).
+ #
+@@ -577,13 +582,23 @@ template("clang_toolchain") {
+ }
+
+ gcc_toolchain(target_name) {
+- prefix = rebase_path("$clang_base_path/bin", root_build_dir)
+- cc = "$prefix/clang"
+- cxx = "$prefix/clang++"
+- ld = cxx
+- readelf = "${toolprefix}readelf"
+- ar = "${prefix}/llvm-ar"
+- nm = "${toolprefix}nm"
++ if (is_bsd) {
++ prefix = "/usr/local/bin"
++ cc = "cc"
++ cxx = "c++"
++ ld = cxx
++ readelf = "readelf"
++ ar = "${prefix}/ar"
++ nm = "${toolprefix}nm"
++ } else {
++ prefix = rebase_path("$clang_base_path/bin", root_build_dir)
++ cc = "$prefix/clang"
++ cxx = "$prefix/clang++"
++ ld = cxx
++ readelf = "${toolprefix}readelf"
++ ar = "${prefix}/llvm-ar"
++ nm = "${toolprefix}nm"
++ }
+
+ forward_variables_from(invoker,
+ [
diff --git a/www/iridium/files/patch-build_toolchain_get__concurrent__links.py b/www/iridium/files/patch-build_toolchain_get__concurrent__links.py
new file mode 100644
index 000000000000..45bc3d0a520e
--- /dev/null
+++ b/www/iridium/files/patch-build_toolchain_get__concurrent__links.py
@@ -0,0 +1,17 @@
+--- build/toolchain/get_concurrent_links.py.orig 2019-06-04 18:55:15 UTC
++++ build/toolchain/get_concurrent_links.py
+@@ -48,6 +48,14 @@ def _GetTotalMemoryInBytes():
+ return int(subprocess.check_output(['sysctl', '-n', 'hw.memsize']))
+ except Exception:
+ return 0
++ elif sys.platform.startswith('freebsd'):
++ try:
++ avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.physmem']))
++ # With -fuse-lld it doesn't take a lot of ram, feel free to change that
++ # 1 * ... to needed amount
++ return max(1, avail_bytes / (1 * (2 ** 30))) # total / 4GB
++ except Exception:
++ return 1
+ # TODO(scottmg): Implement this for other platforms.
+ return 0
+
diff --git a/www/iridium/files/patch-build_toolchain_linux_BUILD.gn b/www/iridium/files/patch-build_toolchain_linux_BUILD.gn
new file mode 100644
index 000000000000..29b9160f7b07
--- /dev/null
+++ b/www/iridium/files/patch-build_toolchain_linux_BUILD.gn
@@ -0,0 +1,10 @@
+--- build/toolchain/linux/BUILD.gn.orig 2019-04-30 22:22:28 UTC
++++ build/toolchain/linux/BUILD.gn
+@@ -22,7 +22,6 @@ clang_toolchain("clang_arm") {
+ }
+
+ clang_toolchain("clang_arm64") {
+- toolprefix = "aarch64-linux-gnu-"
+ toolchain_args = {
+ current_cpu = "arm64"
+ current_os = "linux"
diff --git a/www/iridium/files/patch-cc_BUILD.gn b/www/iridium/files/patch-cc_BUILD.gn
new file mode 100644
index 000000000000..f2e64c64d738
--- /dev/null
+++ b/www/iridium/files/patch-cc_BUILD.gn
@@ -0,0 +1,19 @@
+--- cc/BUILD.gn.orig 2020-03-16 18:40:27 UTC
++++ cc/BUILD.gn
+@@ -582,7 +582,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" ]
+ }
+ }
+@@ -788,7 +788,6 @@ cc_test("cc_unittests") {
+ ]
+ data_deps = [
+ "//testing/buildbot/filters:cc_unittests_filters",
+- "//third_party/mesa_headers",
+ ]
+
+ if (enable_vulkan) {
diff --git a/www/iridium/files/patch-cc_layers_scrollbar__layer__impl__base.cc b/www/iridium/files/patch-cc_layers_scrollbar__layer__impl__base.cc
new file mode 100644
index 000000000000..b412aea9e22b
--- /dev/null
+++ b/www/iridium/files/patch-cc_layers_scrollbar__layer__impl__base.cc
@@ -0,0 +1,13 @@
+--- cc/layers/scrollbar_layer_impl_base.cc.orig 2019-12-16 21:50:40 UTC
++++ cc/layers/scrollbar_layer_impl_base.cc
+@@ -220,8 +220,8 @@ gfx::Rect ScrollbarLayerImplBase::ComputeThumbQuadRect
+ int thumb_offset = TrackStart();
+ if (maximum > 0) {
+ float ratio = clamped_current_pos / maximum;
+- float max_offset = track_length - thumb_length;
+- thumb_offset += static_cast<int>(ratio * max_offset);
++ float _max_offset = track_length - thumb_length;
++ thumb_offset += static_cast<int>(ratio * _max_offset);
+ }
+
+ float thumb_thickness_adjustment =
diff --git a/www/iridium/files/patch-cc_trees_property__tree.cc b/www/iridium/files/patch-cc_trees_property__tree.cc
new file mode 100644
index 000000000000..d8e7bed84ae0
--- /dev/null
+++ b/www/iridium/files/patch-cc_trees_property__tree.cc
@@ -0,0 +1,20 @@
+--- cc/trees/property_tree.cc.orig 2020-03-16 18:40:27 UTC
++++ cc/trees/property_tree.cc
+@@ -1237,13 +1237,13 @@ gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scro
+
+ gfx::Size clip_layer_bounds = container_bounds(scroll_node->id);
+
+- gfx::ScrollOffset max_offset(
++ gfx::ScrollOffset _max_offset(
+ scaled_scroll_bounds.width() - clip_layer_bounds.width(),
+ scaled_scroll_bounds.height() - clip_layer_bounds.height());
+
+- max_offset.Scale(1 / scale_factor);
+- max_offset.SetToMax(gfx::ScrollOffset());
+- return max_offset;
++ _max_offset.Scale(1 / scale_factor);
++ _max_offset.SetToMax(gfx::ScrollOffset());
++ return _max_offset;
+ }
+
+ gfx::SizeF ScrollTree::scroll_bounds(int scroll_node_id) const {
diff --git a/www/iridium/files/patch-chrome_app_chrome__command__ids.h b/www/iridium/files/patch-chrome_app_chrome__command__ids.h
new file mode 100644
index 000000000000..983a9acf8891
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_chrome__command__ids.h
@@ -0,0 +1,11 @@
+--- chrome/app/chrome_command_ids.h.orig 2020-02-03 21:53:28 UTC
++++ chrome/app/chrome_command_ids.h
+@@ -62,7 +62,7 @@
+ #define IDC_VISIT_DESKTOP_OF_LRU_USER_2 34049
+ #define IDC_VISIT_DESKTOP_OF_LRU_USER_3 34050
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #define IDC_USE_SYSTEM_TITLE_BAR 34051
+ #define IDC_RESTORE_WINDOW 34052
+ #endif
diff --git a/www/iridium/files/patch-chrome_app_chrome__main.cc b/www/iridium/files/patch-chrome_app_chrome__main.cc
new file mode 100644
index 000000000000..28a06a8d2f72
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_chrome__main.cc
@@ -0,0 +1,16 @@
+--- chrome/app/chrome_main.cc.orig 2020-04-10 00:39:09 UTC
++++ chrome/app/chrome_main.cc
+@@ -118,11 +118,11 @@ int ChromeMain(int argc, const char** argv) {
+ MainThreadStackSamplingProfiler scoped_sampling_profiler;
+
+ // Chrome-specific process modes.
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ if (command_line->HasSwitch(switches::kHeadless)) {
+ return headless::HeadlessShellMain(params);
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+
+ #if !defined(CHROME_MULTIPLE_DLL_CHILD)
+ net::trace_urlreq_cb = &trace_url_request;
diff --git a/www/iridium/files/patch-chrome_app_chrome__main__delegate.cc b/www/iridium/files/patch-chrome_app_chrome__main__delegate.cc
new file mode 100644
index 000000000000..88a9416974a2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_chrome__main__delegate.cc
@@ -0,0 +1,159 @@
+--- chrome/app/chrome_main_delegate.cc.orig 2020-03-16 18:40:27 UTC
++++ chrome/app/chrome_main_delegate.cc
+@@ -100,7 +100,7 @@
+ #include "chrome/app/shutdown_signal_handlers_posix.h"
+ #endif
+
+-#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX) && !defined(OS_BSD)
+ #include "components/nacl/common/nacl_paths.h"
+ #include "components/nacl/zygote/nacl_fork_delegate_linux.h"
+ #endif
+@@ -142,12 +142,12 @@
+ #include "v8/include/v8.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/environment.h"
+ #endif
+
+ #if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_ANDROID) || \
+- defined(OS_LINUX)
++ defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/policy/policy_path_parser.h"
+ #include "components/crash/content/app/crashpad.h"
+ #endif
+@@ -246,7 +246,7 @@ bool UseHooks() {
+
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ void AdjustLinuxOOMScore(const std::string& process_type) {
+ // Browsers and zygotes should still be killable, but killed last.
+ const int kZygoteScore = 0;
+@@ -305,13 +305,13 @@ void AdjustLinuxOOMScore(const std::string& process_ty
+ if (score > -1)
+ base::AdjustOOMScore(base::GetCurrentProcId(), score);
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) && !defined(OS_BSD)
+
+ // Returns true if this subprocess type needs the ResourceBundle initialized
+ // and resources loaded.
+ bool SubprocessNeedsResourceBundle(const std::string& process_type) {
+ return
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The zygote process opens the resources for the renderers.
+ process_type == service_manager::switches::kZygoteProcess ||
+ #endif
+@@ -350,7 +350,7 @@ bool HandleVersionSwitches(const base::CommandLine& co
+ return false;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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) ||
+@@ -360,7 +360,7 @@ void HandleHelpSwitches(const base::CommandLine& comma
+ PLOG(FATAL) << "execlp failed";
+ }
+ }
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
+ void SIGTERMProfilingShutdown(int signal) {
+@@ -414,7 +414,7 @@ void InitializeUserDataDir(base::CommandLine* command_
+ std::string process_type =
+ command_line->GetSwitchValueASCII(switches::kProcessType);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -426,7 +426,7 @@ void InitializeUserDataDir(base::CommandLine* command_
+ user_data_dir = base::FilePath::FromUTF8Unsafe(user_data_dir_string);
+ }
+ }
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+ #if defined(OS_MACOSX)
+ policy::path_parser::CheckUserDataDirPolicy(&user_data_dir);
+ #endif // OS_MAC
+@@ -483,7 +483,7 @@ void InitLogging(const std::string& process_type) {
+ void RecordMainStartupMetrics(base::TimeTicks exe_entry_point_ticks) {
+ if (!exe_entry_point_ticks.is_null())
+ startup_metric_utils::RecordExeMainEntryPointTicks(exe_entry_point_ticks);
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Record the startup process creation time on supported platforms.
+ startup_metric_utils::RecordStartupProcessCreationTime(
+ base::Process::Current().CreationTime());
+@@ -688,7 +688,7 @@ bool ChromeMainDelegate::BasicStartupComplete(int* exi
+ *exit_code = 0;
+ return true; // Got a --version switch; exit with a success error code.
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // This will directly exit if the user asked for help.
+ HandleHelpSwitches(command_line);
+ #endif
+@@ -712,7 +712,7 @@ bool ChromeMainDelegate::BasicStartupComplete(int* exi
+ #if defined(OS_CHROMEOS)
+ chromeos::RegisterPathProvider();
+ #endif
+-#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_NACL) && defined(OS_LINUX) && !defined(OS_BSD)
+ nacl::RegisterPathProvider();
+ #endif
+
+@@ -904,7 +904,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ #if defined(OS_WIN)
+ child_process_logging::Init();
+ #endif
+-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
++#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ // Create an instance of the CPU class to parse /proc/cpuinfo and cache
+ // cpu_brand info.
+ base::CPU cpu_info;
+@@ -1028,7 +1028,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ InitializePDF();
+ #endif
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Zygote needs to call InitCrashReporter() in RunZygote().
+ if (process_type != service_manager::switches::kZygoteProcess) {
+ #if defined(OS_ANDROID)
+@@ -1049,7 +1049,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ }
+ #endif // defined(OS_ANDROID)
+ }
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ // After all the platform Breakpads have been initialized, store the command
+ // line for crash reporting.
+@@ -1059,7 +1059,7 @@ void ChromeMainDelegate::PreSandboxStartup() {
+ void ChromeMainDelegate::SandboxInitialized(const std::string& process_type) {
+ // Note: If you are adding a new process type below, be sure to adjust the
+ // AdjustLinuxOOMScore function too.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ AdjustLinuxOOMScore(process_type);
+ #endif
+ #if defined(OS_WIN)
+@@ -1105,7 +1105,7 @@ int ChromeMainDelegate::RunProcess(
+ // This entry is not needed on Linux, where the NaCl loader
+ // process is launched via nacl_helper instead.
+ #if BUILDFLAG(ENABLE_NACL) && !defined(CHROME_MULTIPLE_DLL_BROWSER) && \
+- !defined(OS_LINUX)
++ !defined(OS_LINUX) && !defined(OS_BSD)
+ {switches::kNaClLoaderProcess, NaClMain},
+ #else
+ {"<invalid>", NULL}, // To avoid constant array of size 0
diff --git a/www/iridium/files/patch-chrome_app_chromium__strings.grd b/www/iridium/files/patch-chrome_app_chromium__strings.grd
new file mode 100644
index 000000000000..f2fafb3fc1d4
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_chromium__strings.grd
@@ -0,0 +1,29 @@
+--- chrome/app/chromium_strings.grd.orig 2020-04-10 00:39:12 UTC
++++ chrome/app/chromium_strings.grd
+@@ -649,7 +649,7 @@ The browser is unable to recover your settings.
+ </if>
+
+ <!-- about:browser-switch strings -->
+- <if expr="is_win or is_macosx or (is_linux and not chromeos)">
++ <if expr="is_win or is_macosx or (is_posix and not chromeos)">
+ <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
+ Your system administrator has configured the browser to open an alternative browser to access <ph name="TARGET_URL_HOSTNAME">$1<ex>example.com</ex></ph>.
+ </message>
+@@ -750,7 +750,7 @@ The browser is unable to recover your settings.
+ </message>
+
+ <!-- ProcessSingleton -->
+- <if expr="is_linux or is_macosx">
++ <if expr="is_linux or is_macosx or is_posix">
+ <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
+ The profile appears to be in use by another browsr process (<ph name="PROCESS_ID">$1<ex>12345</ex></ph>) on another computer (<ph name="HOST_NAME">$2<ex>example.com</ex></ph>). The browser has locked the profile so that it doesn't get corrupted. If you are sure no other processes are using this profile, you can unlock the profile and relaunch the browser.
+ </message>
+@@ -964,7 +964,7 @@ The browser is unable to recover your settings.
+ </message>
+
+ <!-- Plugin Placeholders -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_PLUGIN_RESTART_REQUIRED" desc="The placeholder text for a plugin that can't be loaded until the browser is restarted.">
+ Restart the browser to enable <ph name="PLUGIN_NAME">$1<ex>Flash</ex></ph>
+ </message>
diff --git a/www/iridium/files/patch-chrome_app_generated__resources.grd b/www/iridium/files/patch-chrome_app_generated__resources.grd
new file mode 100644
index 000000000000..fcae380a37c1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_generated__resources.grd
@@ -0,0 +1,29 @@
+--- chrome/app/generated_resources.grd.orig 2020-03-16 18:40:27 UTC
++++ chrome/app/generated_resources.grd
+@@ -5141,7 +5141,7 @@ Keep your key file in a safe place. You will need it t
+ </if>
+
+ <!-- chrome://browser-switch strings -->
+- <if expr="is_win or is_macosx or (is_linux and not chromeos)">
++ <if expr="is_win or is_macosx or (is_posix and not chromeos)">
+ <message name="IDS_ABOUT_BROWSER_SWITCH_TITLE" desc="about:browser-switch page title">
+ Legacy Browser Support
+ </message>
+@@ -6861,7 +6861,7 @@ the Bookmarks menu.">
+ Google Pay
+ </message>
+
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <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>
+@@ -7822,7 +7822,7 @@ Please help our engineers fix this problem. Tell us wh
+ Set as default
+ </message>
+
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_MINIMIZE_WINDOW_MENU" desc="The Linux browser window menu item text for minimizing the window.">
+ Minimize
+ </message>
diff --git a/www/iridium/files/patch-chrome_app_google__chrome__strings.grd b/www/iridium/files/patch-chrome_app_google__chrome__strings.grd
new file mode 100644
index 000000000000..47ad7a871540
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_google__chrome__strings.grd
@@ -0,0 +1,29 @@
+--- chrome/app/google_chrome_strings.grd.orig 2020-03-16 18:40:27 UTC
++++ chrome/app/google_chrome_strings.grd
+@@ -661,7 +661,7 @@ Google Chrome is unable to recover your settings.
+ </if>
+
+ <!-- about:browser-switch strings -->
+- <if expr="is_win or is_macosx or (is_linux and not chromeos)">
++ <if expr="is_win or is_macosx or (is_posix and not chromeos)">
+ <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
+ Your system administrator has configured Google Chrome to open an alternative browser to access <ph name="TARGET_URL_HOSTNAME">$1<ex>example.com</ex></ph>.
+ </message>
+@@ -762,7 +762,7 @@ Google Chrome is unable to recover your settings.
+ </message>
+
+ <!-- ProcessSingleton -->
+- <if expr="is_linux or is_macosx">
++ <if expr="is_linux or is_macosx or is_posix">
+ <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
+ The profile appears to be in use by another Google Chrome process (<ph name="PROCESS_ID">$1<ex>12345</ex></ph>) on another computer (<ph name="HOST_NAME">$2<ex>example.com</ex></ph>). Chrome has locked the profile so that it doesn't get corrupted. If you are sure no other processes are using this profile, you can unlock the profile and relaunch Chrome.
+ </message>
+@@ -991,7 +991,7 @@ Google Chrome is unable to recover your settings.
+ </message>
+
+ <!-- Plugin Placeholders -->
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <message name="IDS_PLUGIN_RESTART_REQUIRED" desc="The placeholder text for a plugin that can't be loaded until the browser is restarted.">
+ Restart Chrome to enable <ph name="PLUGIN_NAME">$1<ex>Flash</ex></ph>
+ </message>
diff --git a/www/iridium/files/patch-chrome_app_settings__strings.grdp b/www/iridium/files/patch-chrome_app_settings__strings.grdp
new file mode 100644
index 000000000000..18bd3350bdf8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_settings__strings.grdp
@@ -0,0 +1,20 @@
+--- chrome/app/settings_strings.grdp.orig 2020-03-16 18:40:29 UTC
++++ chrome/app/settings_strings.grdp
+@@ -811,7 +811,7 @@
+ Themes
+ </message>
+ </if>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <message name="IDS_SETTINGS_SYSTEM_THEME" desc="Text of the label describing the system (GTK+) browser theme on Linux">
+ GTK+
+ </message>
+@@ -825,7 +825,7 @@
+ Use Classic
+ </message>
+ </if>
+- <if expr="not is_linux or chromeos">
++ <if expr="not is_posix or chromeos">
+ <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/www/iridium/files/patch-chrome_app_shutdown__signal__handlers__posix.cc b/www/iridium/files/patch-chrome_app_shutdown__signal__handlers__posix.cc
new file mode 100644
index 000000000000..3678715840b5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_shutdown__signal__handlers__posix.cc
@@ -0,0 +1,21 @@
+--- chrome/app/shutdown_signal_handlers_posix.cc.orig 2019-04-30 22:22:32 UTC
++++ chrome/app/shutdown_signal_handlers_posix.cc
+@@ -186,12 +186,18 @@ void InstallShutdownSignalHandlers(
+ g_pipe_pid = getpid();
+ g_shutdown_pipe_read_fd = pipefd[0];
+ g_shutdown_pipe_write_fd = pipefd[1];
++#if defined(OS_BSD)
++ // PTHREAD_STACK_MIN causes chromium to crash under FreeBSD,
++ // we request the default pthread stack size by specifying 0 here.
++ 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/www/iridium/files/patch-chrome_app_theme_chrome__unscaled__resources.grd b/www/iridium/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
new file mode 100644
index 000000000000..34bf723d2edc
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_theme_chrome__unscaled__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/app/theme/chrome_unscaled_resources.grd.orig 2020-02-03 21:53:28 UTC
++++ chrome/app/theme/chrome_unscaled_resources.grd
+@@ -18,7 +18,7 @@
+ <include name="IDR_PRODUCT_LOGO_64" file="google_chrome/product_logo_64.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_128" file="google_chrome/product_logo_128.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_256" file="google_chrome/product_logo_256.png" type="BINDATA" />
+- <if expr="is_linux">
++ <if expr="is_posix">
+ <include name="IDR_PRODUCT_LOGO_128_BETA" file="google_chrome/product_logo_128_beta.png" type="BINDATA" />
+ <include name="IDR_PRODUCT_LOGO_128_DEV" file="google_chrome/product_logo_128_dev.png" type="BINDATA" />
+ </if>
diff --git a/www/iridium/files/patch-chrome_app_theme_theme__resources.grd b/www/iridium/files/patch-chrome_app_theme_theme__resources.grd
new file mode 100644
index 000000000000..a6e63ac69942
--- /dev/null
+++ b/www/iridium/files/patch-chrome_app_theme_theme__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/app/theme/theme_resources.grd.orig 2019-10-30 15:46:23 UTC
++++ chrome/app/theme/theme_resources.grd
+@@ -25,7 +25,7 @@
+ <!-- KEEP THESE IN ALPHABETICAL ORDER! DO NOT ADD TO RANDOM PLACES JUST
+ BECAUSE YOUR RESOURCES ARE FUNCTIONALLY RELATED OR FALL UNDER THE
+ SAME CONDITIONALS. -->
+- <if expr="is_linux or is_win or chromeos">
++ <if expr="is_posix or is_win or chromeos">
+ <structure type="chrome_scaled_image" name="IDR_ACCESSIBILITY_CAPTIONS_PREVIEW_BACKGROUND" file="common/captions-preview-bg.png" />
+ </if>
+ <if expr="toolkit_views and not is_macosx">
diff --git a/www/iridium/files/patch-chrome_browser_about__flags.cc b/www/iridium/files/patch-chrome_browser_about__flags.cc
new file mode 100644
index 000000000000..aec113703d20
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_about__flags.cc
@@ -0,0 +1,205 @@
+--- chrome/browser/about_flags.cc.orig 2020-04-03 04:11:28 UTC
++++ chrome/browser/about_flags.cc
+@@ -170,7 +170,7 @@
+ #include "ui/gl/gl_switches.h"
+ #include "ui/native_theme/native_theme_features.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/allocator/buildflags.h"
+ #endif
+
+@@ -834,7 +834,7 @@ const FeatureEntry::Choice kMemlogSamplingRateChoices[
+ heap_profiling::kMemlogSamplingRate5MB},
+ };
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ const FeatureEntry::FeatureParam kOmniboxDocumentProviderServerScoring[] = {
+ {"DocumentUseServerScore", "true"},
+ {"DocumentUseClientScore", "false"},
+@@ -872,7 +872,7 @@ const FeatureEntry::FeatureVariation kOmniboxDocumentP
+ base::size(kOmniboxDocumentProviderClientScoring), nullptr},
+ {"server and client scores", kOmniboxDocumentProviderServerAndClientScoring,
+ base::size(kOmniboxDocumentProviderServerAndClientScoring), nullptr}};
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+
+ const FeatureEntry::FeatureParam kOmniboxOnFocusSuggestionsParamSERP[] = {
+ {"ZeroSuggestVariant:6:*", "RemoteSendUrl"}};
+@@ -994,14 +994,14 @@ const FeatureEntry::FeatureVariation kOmniboxMaxURLMat
+ {"6 matches", kOmniboxMaxURLMatches6, base::size(kOmniboxMaxURLMatches6),
+ nullptr}};
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ const FeatureEntry::FeatureParam kTranslateBubbleUITab[] = {
+ {language::kTranslateUIBubbleKey, language::kTranslateUIBubbleTabValue}};
+
+ const FeatureEntry::FeatureVariation kTranslateBubbleUIVariations[] = {
+ {"Tab", kTranslateBubbleUITab, base::size(kTranslateBubbleUITab), nullptr}};
+-#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS
++#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS || OS_BSD
+
+ const FeatureEntry::FeatureParam kMarkHttpAsDangerous[] = {
+ {security_state::features::kMarkHttpAsFeatureParameterName,
+@@ -2031,13 +2031,13 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kCloudPrintXpsDescription, kOsWin,
+ SINGLE_VALUE_TYPE(switches::kEnableCloudPrintXps)},
+ #endif // OS_WIN
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ {"enable-webgl2-compute-context",
+ flag_descriptions::kWebGL2ComputeContextName,
+ flag_descriptions::kWebGL2ComputeContextDescription,
+ kOsWin | kOsLinux | kOsCrOS,
+ SINGLE_VALUE_TYPE(switches::kEnableWebGL2ComputeContext)},
+-#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ {"enable-webgl-draft-extensions",
+ flag_descriptions::kWebglDraftExtensionsName,
+ flag_descriptions::kWebglDraftExtensionsDescription, kOsAll,
+@@ -2074,14 +2074,14 @@ const FeatureEntry kFeatureEntries[] = {
+ "OverrideTranslateTriggerInIndia")},
+ #endif // OS_ANDROID
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ {"translate-ui-bubble-options", flag_descriptions::kTranslateBubbleUIName,
+ flag_descriptions::kTranslateBubbleUIDescription, kOsDesktop,
+ FEATURE_WITH_PARAMS_VALUE_TYPE(language::kUseButtonTranslateBubbleUi,
+ kTranslateBubbleUIVariations,
+ "UseButtonTranslateBubbleUI")},
+-#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS
++#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS || OS_BSD
+
+ #if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) && !defined(OS_CHROMEOS)
+ {"enable-native-notifications",
+@@ -2159,13 +2159,13 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kTerminalSystemAppSplitsDescription, kOsCrOS,
+ FEATURE_VALUE_TYPE(features::kTerminalSystemAppSplits)},
+ #endif // OS_CHROMEOS
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ #if BUILDFLAG(USE_TCMALLOC)
+ {"dynamic-tcmalloc-tuning", flag_descriptions::kDynamicTcmallocName,
+ flag_descriptions::kDynamicTcmallocDescription, kOsCrOS | kOsLinux,
+ FEATURE_VALUE_TYPE(performance_manager::features::kDynamicTcmallocTuning)},
+ #endif // BUILDFLAG(USE_TCMALLOC)
+-#endif // OS_CHROMEOS || OS_LINUX
++#endif // OS_CHROMEOS || OS_LINUX || defined(OS_BSD)
+ #if defined(OS_ANDROID)
+ {"enable-credit-card-assist", flag_descriptions::kCreditCardAssistName,
+ flag_descriptions::kCreditCardAssistDescription, kOsAndroid,
+@@ -2239,7 +2239,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kEnableLitePageServerPreviewsDescription, kOsAndroid,
+ FEATURE_VALUE_TYPE(previews::features::kLitePageServerPreviews)},
+ #endif // OS_ANDROID
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ {"enable-save-data", flag_descriptions::kEnableSaveDataName,
+ flag_descriptions::kEnableSaveDataDescription, kOsCrOS,
+ SINGLE_VALUE_TYPE(
+@@ -2907,7 +2907,7 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(
+ omnibox::kHistoryQuickProviderAllowMidwordContinuations)},
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ {"omnibox-experimental-keyword-mode",
+ flag_descriptions::kOmniboxExperimentalKeywordModeName,
+ flag_descriptions::kOmniboxExperimentalKeywordModeDescription, kOsDesktop,
+@@ -2956,7 +2956,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kOmniboxAutocompleteTitlesName,
+ flag_descriptions::kOmniboxAutocompleteTitlesDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(omnibox::kAutocompleteTitles)},
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+
+ {"enable-speculative-service-worker-start-on-query-input",
+ flag_descriptions::kSpeculativeServiceWorkerStartOnQueryInputName,
+@@ -3182,13 +3182,13 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kClickToOpenPDFDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kClickToOpenPDFPlaceholder)},
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ {"direct-manipulation-stylus",
+ flag_descriptions::kDirectManipulationStylusName,
+ flag_descriptions::kDirectManipulationStylusDescription,
+ kOsWin | kOsMac | kOsLinux,
+ FEATURE_VALUE_TYPE(features::kDirectManipulationStylus)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if !defined(OS_ANDROID)
+ {"ntp-confirm-suggestion-removals",
+@@ -3850,12 +3850,12 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(kClickToCallDetectionV2)},
+ #endif // BUILDFLAG(ENABLE_CLICK_TO_CALL)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ {"remote-copy-receiver", flag_descriptions::kRemoteCopyReceiverName,
+ flag_descriptions::kRemoteCopyReceiverDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(kRemoteCopyReceiver)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ {"shared-clipboard-receiver",
+@@ -3899,7 +3899,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kSharingUseDeviceInfoDescription, kOsAll,
+ FEATURE_VALUE_TYPE(kSharingUseDeviceInfo)},
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ {"sharing-peer-connection-receiver",
+ flag_descriptions::kSharingPeerConnectionReceiverName,
+@@ -3910,7 +3910,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kSharingPeerConnectionSenderName,
+ flag_descriptions::kSharingPeerConnectionSenderDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(kSharingPeerConnectionSender)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ {"sharing-qr-code-generator",
+@@ -3985,13 +3985,13 @@ const FeatureEntry kFeatureEntries[] = {
+ FEATURE_VALUE_TYPE(printing::features::kEnableCustomMacPaperSizes)},
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ {"enable-reopen-tab-in-product-help",
+ flag_descriptions::kReopenTabInProductHelpName,
+ flag_descriptions::kReopenTabInProductHelpDescription, kOsDesktop,
+ FEATURE_VALUE_TYPE(feature_engagement::kIPHReopenTabFeature)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ {"enable-audio-focus-enforcement",
+@@ -4436,7 +4436,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kEnableSyncUSSNigoriDescription, kOsAll,
+ FEATURE_VALUE_TYPE(switches::kSyncUSSNigori)},
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ {"global-media-controls", flag_descriptions::kGlobalMediaControlsName,
+ flag_descriptions::kGlobalMediaControlsDescription,
+ kOsWin | kOsMac | kOsLinux,
+@@ -4453,7 +4453,7 @@ const FeatureEntry kFeatureEntries[] = {
+ flag_descriptions::kGlobalMediaControlsPictureInPictureDescription,
+ kOsWin | kOsMac | kOsLinux | kOsCrOS,
+ FEATURE_VALUE_TYPE(media::kGlobalMediaControlsPictureInPicture)},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if BUILDFLAG(ENABLE_SPELLCHECK) && defined(OS_WIN)
+ {"win-use-native-spellchecker",
diff --git a/www/iridium/files/patch-chrome_browser_after__startup__task__utils.cc b/www/iridium/files/patch-chrome_browser_after__startup__task__utils.cc
new file mode 100644
index 000000000000..fb5b5d6cd963
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_after__startup__task__utils.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/after_startup_task_utils.cc.orig 2020-03-16 18:39:43 UTC
++++ chrome/browser/after_startup_task_utils.cc
+@@ -33,7 +33,7 @@
+ #include "chrome/browser/ui/tabs/tab_strip_model.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -120,7 +120,7 @@ void QueueTask(std::unique_ptr<AfterStartupTask> queue
+
+ void SetBrowserStartupIsComplete() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Process::Current().CreationTime() is not available on all platforms.
+ const base::Time process_creation_time =
+ base::Process::Current().CreationTime();
+@@ -128,7 +128,7 @@ void SetBrowserStartupIsComplete() {
+ UMA_HISTOGRAM_LONG_TIMES("Startup.AfterStartupTaskDelayedUntilTime",
+ base::Time::Now() - process_creation_time);
+ }
+-#endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ UMA_HISTOGRAM_COUNTS_10000("Startup.AfterStartupTaskCount",
+ g_after_startup_tasks.Get().size());
+ g_startup_complete_flag.Get().Set();
+@@ -137,7 +137,7 @@ void SetBrowserStartupIsComplete() {
+ g_after_startup_tasks.Get().clear();
+ g_after_startup_tasks.Get().shrink_to_fit();
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Make sure we complete the startup notification sequence, or launchers will
+ // get confused by not receiving the expected message from the main process.
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
diff --git a/www/iridium/files/patch-chrome_browser_apps_platform__apps_api_music__manager__private_device__id__linux.cc b/www/iridium/files/patch-chrome_browser_apps_platform__apps_api_music__manager__private_device__id__linux.cc
new file mode 100644
index 000000000000..7482f7147a70
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_apps_platform__apps_api_music__manager__private_device__id__linux.cc
@@ -0,0 +1,70 @@
+--- chrome/browser/apps/platform_apps/api/music_manager_private/device_id_linux.cc.orig 2019-04-30 22:22:32 UTC
++++ chrome/browser/apps/platform_apps/api/music_manager_private/device_id_linux.cc
+@@ -4,6 +4,11 @@
+
+ #include "chrome/browser/apps/platform_apps/api/music_manager_private/device_id.h"
+
++#if defined(OS_FREEBSD)
++#include <sys/types.h>
++#include <net/if_dl.h>
++#endif
++
+ #include <ifaddrs.h>
+ #include <net/if.h>
+ #include <stddef.h>
+@@ -106,9 +111,36 @@ class MacAddressProcessor {
+ const char* const prefixes[],
+ size_t prefixes_count) {
+ const int MAC_LENGTH = 6;
++#if defined(OS_FREEBSD)
++ struct ifaddrs *ifap, *ifinfo;
++#else
+ struct ifreq ifinfo;
++#endif
+
+ memset(&ifinfo, 0, sizeof(ifinfo));
++
++#if defined(OS_FREEBSD)
++ int result = getifaddrs(&ifap);
++
++ if (result != 0)
++ return true;
++
++ result = 1; // no MAC found yet
++
++ for (ifinfo = ifap; ifinfo != NULL; ifinfo = ifinfo->ifa_next) {
++ struct sockaddr* sa = ifinfo->ifa_addr;
++ if (sa->sa_family == AF_LINK &&
++ !strncmp(ifinfo->ifa_name, ifaddr->ifa_name,
++ sizeof(ifinfo->ifa_name) - 1)) {
++ result = 0;
++ break;
++ }
++ }
++
++ char mac_address[6];
++
++ strncpy(mac_address, (const char*)LLADDR((struct sockaddr_dl*)ifinfo->ifa_addr), sizeof(mac_address));
++#else
+ strncpy(ifinfo.ifr_name, ifaddr->ifa_name, sizeof(ifinfo.ifr_name) - 1);
+
+ int sd = socket(AF_INET, SOCK_DGRAM, 0);
+@@ -120,11 +152,18 @@ class MacAddressProcessor {
+
+ const char* mac_address =
+ static_cast<const char*>(ifinfo.ifr_hwaddr.sa_data);
++#endif
++
+ if (!is_valid_mac_address_.Run(mac_address, MAC_LENGTH))
+ return true;
+
++#if defined(OS_FREEBSD)
++ if (!IsValidPrefix(ifinfo->ifa_name, prefixes, prefixes_count))
++ return true;
++#else
+ if (!IsValidPrefix(ifinfo.ifr_name, prefixes, prefixes_count))
+ return true;
++#endif
+
+ // Got one!
+ found_mac_address_ =
diff --git a/www/iridium/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc b/www/iridium/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
new file mode 100644
index 000000000000..6c2491941fb1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_autocomplete_chrome__autocomplete__scheme__classifier.cc
@@ -0,0 +1,17 @@
+--- chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc.orig 2020-04-10 00:39:09 UTC
++++ chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+@@ -60,12 +60,12 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForSch
+ return metrics::OmniboxInputType::QUERY;
+
+ case ExternalProtocolHandler::UNKNOWN: {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Linux impl of GetApplicationNameForProtocol doesn't distinguish
+ // between URL schemes with handers and those without. This will
+ // make the default behaviour be search on Linux.
+ return metrics::OmniboxInputType::EMPTY;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ // If block state is unknown, check if there is an application registered
+ // for the url scheme.
+ GURL url(scheme + "://");
diff --git a/www/iridium/files/patch-chrome_browser_background_background__mode__manager.cc b/www/iridium/files/patch-chrome_browser_background_background__mode__manager.cc
new file mode 100644
index 000000000000..3aa2fe1a3c84
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_background_background__mode__manager.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/background/background_mode_manager.cc.orig 2020-02-03 21:52:39 UTC
++++ chrome/browser/background/background_mode_manager.cc
+@@ -797,7 +797,7 @@ gfx::ImageSkia GetStatusTrayIcon() {
+ return gfx::ImageSkia();
+
+ return family->CreateExact(size).AsImageSkia();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+ IDR_PRODUCT_LOGO_128);
+ #elif defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-chrome_browser_background_background__mode__optimizer.cc b/www/iridium/files/patch-chrome_browser_background_background__mode__optimizer.cc
new file mode 100644
index 000000000000..de595924ceb4
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_background_background__mode__optimizer.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/background/background_mode_optimizer.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/background/background_mode_optimizer.cc
+@@ -30,10 +30,10 @@ std::unique_ptr<BackgroundModeOptimizer> BackgroundMod
+ switches::kKeepAliveForTest))
+ return nullptr;
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(features::kBackgroundModeAllowRestart))
+ return base::WrapUnique(new BackgroundModeOptimizer());
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ return nullptr;
+ }
diff --git a/www/iridium/files/patch-chrome_browser_browser__resources.grd b/www/iridium/files/patch-chrome_browser_browser__resources.grd
new file mode 100644
index 000000000000..021a83b1c450
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_browser__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/browser/browser_resources.grd.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/browser_resources.grd
+@@ -54,7 +54,7 @@
+ <include name="IDR_DISCARDS_MOJO_PUBLIC_BASE_PROCESS_ID_MOJOM_LITE_JS" file="${root_gen_dir}\mojo\public\mojom\base\process_id.mojom-lite.js" compress="gzip" use_base_dir="false" type="BINDATA" />
+ <include name="IDR_DISCARDS_SORTED_TABLE_BEHAVIOR_JS" file="resources\discards\sorted_table_behavior.js" compress="gzip" type="BINDATA" />
+ </if>
+- <if expr="is_win or is_macosx or (is_linux and not chromeos)">
++ <if expr="is_win or is_macosx or (is_posix and not chromeos)">
+ <include name="IDR_BROWSER_SWITCH_APP_JS" file="${root_gen_dir}\chrome\browser\resources\browser_switch\app.js" compress="gzip" use_base_dir="false" type="BINDATA" />
+ <include name="IDR_BROWSER_SWITCH_PROXY_JS" file="resources\browser_switch\browser_switch_proxy.js" compress="gzip" type="BINDATA" />
+ <include name="IDR_BROWSER_SWITCH_HTML" file="resources\browser_switch\browser_switch.html" compress="gzip" allowexternalscript="true" type="BINDATA" />
diff --git a/www/iridium/files/patch-chrome_browser_chrome__browser__interface__binders.cc b/www/iridium/files/patch-chrome_browser_chrome__browser__interface__binders.cc
new file mode 100644
index 000000000000..80a27c8a8950
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__browser__interface__binders.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/chrome_browser_interface_binders.cc.orig 2020-03-17 09:35:03 UTC
++++ chrome/browser/chrome_browser_interface_binders.cc
+@@ -97,7 +97,7 @@
+ #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h"
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ #include "chrome/browser/ui/webui/discards/discards.mojom.h"
+ #include "chrome/browser/ui/webui/discards/discards_ui.h"
+@@ -471,7 +471,7 @@ void PopulateChromeWebUIFrameBinders(
+ map);
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ RegisterWebUIControllerInterfaceBinder<discards::mojom::DetailsProvider,
+ DiscardsUI>(map);
diff --git a/www/iridium/files/patch-chrome_browser_chrome__browser__main.cc b/www/iridium/files/patch-chrome_browser_chrome__browser__main.cc
new file mode 100644
index 000000000000..51bb283f651b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__browser__main.cc
@@ -0,0 +1,66 @@
+--- chrome/browser/chrome_browser_main.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/chrome_browser_main.cc
+@@ -224,9 +224,9 @@
+ #include "components/arc/metrics/stability_metrics_manager.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/browser/first_run/upgrade_util_linux.h"
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+
+ #if defined(OS_LINUX)
+ #include "components/crash/content/app/breakpad_linux.h"
+@@ -265,7 +265,7 @@
+ #endif // defined(OS_WIN)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD))
+ #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+ #include "chrome/browser/profiles/profile_activity_metrics_recorder.h"
+ #endif
+@@ -1068,7 +1068,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ AddFirstRunNewTabs(browser_creator_.get(), master_prefs_->new_tabs);
+ }
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_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 .
+@@ -1077,7 +1077,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ &user_native_messaging_dir));
+ if (!base::PathExists(user_native_messaging_dir))
+ base::CreateDirectory(user_native_messaging_dir);
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ }
+ #endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
+@@ -1116,7 +1116,7 @@ int ChromeBrowserMainParts::PreCreateThreadsImpl() {
+ }
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD))
+ metrics::DesktopSessionDurationTracker::Initialize();
+ ProfileActivityMetricsRecorder::Initialize();
+ #endif
+@@ -1269,6 +1269,7 @@ void ChromeBrowserMainParts::PostBrowserStart() {
+ base::TimeDelta::FromMinutes(1));
+
+ #if !defined(OS_ANDROID)
++#if !defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(features::kWebUsb)) {
+ web_usb_detector_.reset(new WebUsbDetector());
+ base::PostTask(
+@@ -1277,6 +1278,7 @@ void ChromeBrowserMainParts::PostBrowserStart() {
+ base::BindOnce(&WebUsbDetector::Initialize,
+ base::Unretained(web_usb_detector_.get())));
+ }
++#endif
+ if (base::FeatureList::IsEnabled(features::kTabMetricsLogging)) {
+ // Initialize the TabActivityWatcher to begin logging tab activity events.
+ resource_coordinator::TabActivityWatcher::GetInstance();
diff --git a/www/iridium/files/patch-chrome_browser_chrome__browser__main__linux.cc b/www/iridium/files/patch-chrome_browser_chrome__browser__main__linux.cc
new file mode 100644
index 000000000000..f7f343f3e0b5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__browser__main__linux.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/chrome_browser_main_linux.cc.orig 2019-12-16 21:50:42 UTC
++++ chrome/browser/chrome_browser_main_linux.cc
+@@ -81,14 +81,16 @@ void ChromeBrowserMainPartsLinux::PreProfileInit() {
+ void ChromeBrowserMainPartsLinux::PostProfileInit() {
+ ChromeBrowserMainPartsPosix::PostProfileInit();
+
++#if !defined(OS_BSD)
+ bool enabled = (crash_reporter::IsCrashpadEnabled() &&
+ crash_reporter::GetUploadsEnabled()) ||
+ breakpad::IsCrashReporterEnabled();
+ g_browser_process->metrics_service()->RecordBreakpadRegistration(enabled);
++#endif
+ }
+
+ void ChromeBrowserMainPartsLinux::PostMainMessageLoopStart() {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ bluez::BluezDBusManager::Initialize(nullptr /* system_bus */);
+ #endif
+
+@@ -96,7 +98,7 @@ void ChromeBrowserMainPartsLinux::PostMainMessageLoopS
+ }
+
+ void ChromeBrowserMainPartsLinux::PostDestroyThreads() {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ bluez::BluezDBusManager::Shutdown();
+ bluez::BluezDBusThreadManager::Shutdown();
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_chrome__browser__main__posix.cc b/www/iridium/files/patch-chrome_browser_chrome__browser__main__posix.cc
new file mode 100644
index 000000000000..d217745edf63
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__browser__main__posix.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/chrome_browser_main_posix.cc.orig 2019-06-04 18:55:16 UTC
++++ chrome/browser/chrome_browser_main_posix.cc
+@@ -70,7 +70,7 @@ void ExitHandler::ExitWhenPossibleOnUIThread(int signa
+ // ExitHandler takes care of deleting itself.
+ new ExitHandler();
+ } else {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ switch (signal) {
+ case SIGINT:
+ case SIGHUP:
+@@ -166,7 +166,7 @@ void ChromeBrowserMainPartsPosix::PostMainMessageLoopS
+ void ChromeBrowserMainPartsPosix::ShowMissingLocaleMessageBox() {
+ #if defined(OS_CHROMEOS)
+ NOTREACHED(); // Should not ever happen on ChromeOS.
+-#elif defined(OS_MACOSX)
++#elif defined(OS_MACOSX) || defined(OS_BSD)
+ // Not called on Mac because we load the locale files differently.
+ NOTREACHED();
+ #elif defined(USE_AURA)
diff --git a/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.cc b/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.cc
new file mode 100644
index 000000000000..270f07c28cd5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.cc
@@ -0,0 +1,115 @@
+--- chrome/browser/chrome_content_browser_client.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/chrome_content_browser_client.cc
+@@ -390,7 +390,7 @@
+ #include "components/user_manager/user.h"
+ #include "components/user_manager/user_manager.h"
+ #include "services/service_manager/public/mojom/interface_provider_spec.mojom.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/chrome_browser_main_linux.h"
+ #elif defined(OS_ANDROID)
+ #include "base/android/application_status_listener.h"
+@@ -444,7 +444,7 @@
+ #endif // !defined(OS_ANDROID)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/browser/browser_switcher/browser_switcher_navigation_throttle.h"
+ #include "services/service_manager/sandbox/features.h"
+ #endif
+@@ -477,7 +477,7 @@
+ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #if defined(USE_X11)
+ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h"
+ #else
+@@ -820,11 +820,13 @@ breakpad::CrashHandlerHostLinux* CreateCrashHandlerHos
+ }
+
+ int GetCrashSignalFD(const base::CommandLine& command_line) {
++#if !defined(OS_BSD)
+ if (crash_reporter::IsCrashpadEnabled()) {
+ int fd;
+ pid_t pid;
+ return crash_reporter::GetHandlerSocket(&fd, &pid) ? fd : -1;
+ }
++#endif
+
+ // Extensions have the same process type as renderers.
+ if (command_line.HasSwitch(extensions::switches::kExtensionProcess)) {
+@@ -1269,7 +1271,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(
+ #elif defined(OS_CHROMEOS)
+ main_parts = std::make_unique<chromeos::ChromeBrowserMainPartsChromeos>(
+ parameters, startup_data_);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ main_parts =
+ std::make_unique<ChromeBrowserMainPartsLinux>(parameters, startup_data_);
+ #elif defined(OS_ANDROID)
+@@ -1295,7 +1297,7 @@ ChromeContentBrowserClient::CreateBrowserMainParts(
+ // Construct additional browser parts. Stages are called in the order in
+ // which they are added.
+ #if defined(TOOLKIT_VIEWS)
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #if defined(USE_X11)
+ main_parts->AddParts(new ChromeBrowserMainExtraPartsViewsLinuxX11());
+ #else
+@@ -2020,7 +2022,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLin
+ command_line->AppendSwitchASCII(switches::kMetricsClientID,
+ client_info->client_id);
+ }
+-#elif defined(OS_POSIX)
++#elif defined(OS_POSIX) && !defined(OS_BSD)
+ #if defined(OS_ANDROID)
+ bool enable_crash_reporter = true;
+ #else
+@@ -2288,7 +2290,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLin
+ StackSamplingConfiguration::Get()->AppendCommandLineSwitchForChildProcess(
+ process_type, command_line);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Processes may only query perf_event_open with the BPF sandbox disabled.
+ if (browser_command_line.HasSwitch(switches::kEnableThreadInstructionCount) &&
+ command_line->HasSwitch(service_manager::switches::kNoSandbox)) {
+@@ -3564,7 +3566,7 @@ void ChromeContentBrowserClient::GetAdditionalFileSyst
+ }
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -3696,7 +3698,7 @@ void ChromeContentBrowserClient::BindCredentialManager
+ }
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ bool ShouldEnableAudioSandbox(const policy::PolicyMap& policies) {
+ const base::Value* audio_sandbox_enabled_policy_value =
+ policies.GetValue(policy::key::kAudioSandboxEnabled);
+@@ -3714,7 +3716,7 @@ bool ShouldEnableAudioSandbox(const policy::PolicyMap&
+
+ void ChromeContentBrowserClient::WillStartServiceManager() {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (startup_data_) {
+ auto* chrome_feature_list_creator =
+ startup_data_->chrome_feature_list_creator();
+@@ -3999,7 +4001,7 @@ ChromeContentBrowserClient::CreateThrottlesForNavigati
+ }
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ MaybeAddThrottle(&throttles,
+ browser_switcher::BrowserSwitcherNavigationThrottle::
+ MaybeCreateThrottleFor(handle));
diff --git a/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.h b/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.h
new file mode 100644
index 000000000000..c8b5fce3597e
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_chrome__content__browser__client.h
@@ -0,0 +1,17 @@
+--- chrome/browser/chrome_content_browser_client.h.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/chrome_content_browser_client.h
+@@ -364,12 +364,12 @@ class ChromeContentBrowserClient : public content::Con
+ void OverridePageVisibilityState(
+ content::RenderFrameHost* render_frame_host,
+ content::PageVisibilityState* visibility_state) override;
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+ content::PosixFileDescriptorInfo* mappings) override;
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ #if defined(OS_WIN)
+ bool PreSpawnRenderer(sandbox::TargetPolicy* policy,
+ RendererSpawnFlags flags) override;
diff --git a/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list.cc b/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list.cc
new file mode 100644
index 000000000000..740824d61e61
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/crash_upload_list/crash_upload_list.cc.orig 2019-12-31 13:55:02 UTC
++++ chrome/browser/crash_upload_list/crash_upload_list.cc
+@@ -38,7 +38,7 @@ scoped_refptr<UploadList> CreateCrashUploadList() {
+ // ChromeOS uses crash_sender as its uploader even when Crashpad is enabled,
+ // which isn't compatible with CrashUploadListCrashpad. crash_sender continues
+ // to log uploads in CrashUploadList::kReporterLogFilename.
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ if (crash_reporter::IsCrashpadEnabled()) {
+ return new CrashUploadListCrashpad();
+ }
diff --git a/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list__crashpad.cc b/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list__crashpad.cc
new file mode 100644
index 000000000000..0f0d4137c678
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_crash__upload__list_crash__upload__list__crashpad.cc
@@ -0,0 +1,31 @@
+--- chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc.orig 2019-12-31 13:56:21 UTC
++++ chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc
+@@ -42,6 +42,9 @@ CrashUploadListCrashpad::CrashUploadListCrashpad() = d
+ CrashUploadListCrashpad::~CrashUploadListCrashpad() = default;
+
+ std::vector<UploadList::UploadInfo> CrashUploadListCrashpad::LoadUploadList() {
++#if defined(OS_BSD)
++ return std::vector<UploadInfo>();
++#else
+ std::vector<crash_reporter::Report> reports;
+ crash_reporter::GetReports(&reports);
+
+@@ -53,13 +56,18 @@ std::vector<UploadList::UploadInfo> CrashUploadListCra
+ ReportUploadStateToUploadInfoState(report.state)));
+ }
+ return uploads;
++#endif
+ }
+
+ void CrashUploadListCrashpad::ClearUploadList(const base::Time& begin,
+ const base::Time& end) {
++#if !defined(OS_BSD)
+ crash_reporter::ClearReportsBetween(begin, end);
++#endif
+ }
+
+ void CrashUploadListCrashpad::RequestSingleUpload(const std::string& local_id) {
++#if !defined(OS_BSD)
+ crash_reporter::RequestSingleCrashUpload(local_id);
++#endif
+ }
diff --git a/www/iridium/files/patch-chrome_browser_custom__handlers_protocol__handler__registry.cc b/www/iridium/files/patch-chrome_browser_custom__handlers_protocol__handler__registry.cc
new file mode 100644
index 000000000000..b1db05585e76
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_custom__handlers_protocol__handler__registry.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/custom_handlers/protocol_handler_registry.cc.orig 2020-02-03 21:52:39 UTC
++++ chrome/browser/custom_handlers/protocol_handler_registry.cc
+@@ -42,7 +42,7 @@ const ProtocolHandler& LookupHandler(
+ // If true default protocol handlers will be removed if the OS level
+ // registration for a protocol is no longer Chrome.
+ bool ShouldRemoveHandlersNotInOS() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-chrome_browser_defaults.cc b/www/iridium/files/patch-chrome_browser_defaults.cc
new file mode 100644
index 000000000000..4cf8684d29d3
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_defaults.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/defaults.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/defaults.cc
+@@ -43,7 +43,7 @@ const bool kSyncAutoStarts = true;
+ const bool kSyncAutoStarts = false;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ const bool kScrollEventChangesTab = true;
+ #else
+ const bool kScrollEventChangesTab = false;
diff --git a/www/iridium/files/patch-chrome_browser_dev__ui__browser__resources.grd b/www/iridium/files/patch-chrome_browser_dev__ui__browser__resources.grd
new file mode 100644
index 000000000000..3a56c04bdb97
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_dev__ui__browser__resources.grd
@@ -0,0 +1,11 @@
+--- chrome/browser/dev_ui_browser_resources.grd.orig 2020-03-17 09:36:38 UTC
++++ chrome/browser/dev_ui_browser_resources.grd
+@@ -55,7 +55,7 @@ This file specifies browser resources for developer-fa
+ <include name="IDR_PREDICTORS_HTML" file="resources\predictors\predictors.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+ <include name="IDR_PREDICTORS_JS" file="resources\predictors\predictors.js" flattenhtml="true" type="BINDATA" compress="gzip" />
+
+- <if expr="is_android or is_linux">
++ <if expr="is_android or is_posix">
+ <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+ <include name="IDR_SANDBOX_INTERNALS_JS" file="resources\sandbox_internals\sandbox_internals.js" type="BINDATA" compress="gzip" />
+ </if>
diff --git a/www/iridium/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc b/www/iridium/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc
new file mode 100644
index 000000000000..d53ca3e6d56b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_devtools_devtools__eye__dropper.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/devtools/devtools_eye_dropper.cc.orig 2020-02-03 21:53:29 UTC
++++ chrome/browser/devtools/devtools_eye_dropper.cc
+@@ -164,7 +164,7 @@ void DevToolsEyeDropper::UpdateCursor() {
+ // magnified projection only with centered hotspot.
+ // Mac Retina requires cursor to be > 120px in order to render smoothly.
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const float kCursorSize = 63;
+ const float kDiameter = 63;
+ const float kHotspotOffset = 32;
diff --git a/www/iridium/files/patch-chrome_browser_diagnostics_diagnostics__writer.h b/www/iridium/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
new file mode 100644
index 000000000000..e77c2c353dd8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_diagnostics_diagnostics__writer.h
@@ -0,0 +1,11 @@
+--- chrome/browser/diagnostics/diagnostics_writer.h.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/diagnostics/diagnostics_writer.h
+@@ -15,6 +15,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/www/iridium/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc b/www/iridium/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
new file mode 100644
index 000000000000..e44deb129a08
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_chrome__download__manager__delegate.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/chrome_download_manager_delegate.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/download/chrome_download_manager_delegate.cc
+@@ -1249,7 +1249,7 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDe
+ target_info->is_filetype_handled_safely)
+ DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (item->GetOriginalMimeType() == "application/x-x509-user-cert")
+ DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true);
+ #endif
+@@ -1273,7 +1273,7 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDe
+
+ bool ChromeDownloadManagerDelegate::IsOpenInBrowserPreferreredForFile(
+ const base::FilePath& path) {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf"))) {
+ return !download_prefs_->ShouldOpenPdfInSystemReader();
+ }
diff --git a/www/iridium/files/patch-chrome_browser_download_download__commands.cc b/www/iridium/files/patch-chrome_browser_download_download__commands.cc
new file mode 100644
index 000000000000..7de89e40fd17
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__commands.cc
@@ -0,0 +1,35 @@
+--- chrome/browser/download/download_commands.cc.orig 2019-12-16 21:50:42 UTC
++++ chrome/browser/download/download_commands.cc
+@@ -26,7 +26,7 @@
+ #include "net/base/url_util.h"
+ #include "ui/base/clipboard/scoped_clipboard_writer.h"
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #include "chrome/browser/ui/browser.h"
+ #include "chrome/browser/ui/browser_finder.h"
+ #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+@@ -153,7 +153,7 @@ void DownloadCommands::ExecuteCommand(Command command)
+ model_->ExecuteCommand(this, command);
+ }
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ Browser* DownloadCommands::GetBrowser() const {
+ chrome::ScopedTabbedBrowserDisplayer browser_displayer(model_->profile());
+@@ -176,12 +176,12 @@ bool DownloadCommands::CanOpenPdfInSystemViewer() cons
+ return IsDownloadPdf() &&
+ (IsAdobeReaderDefaultPDFViewer() ? is_adobe_pdf_reader_up_to_date
+ : true);
+-#elif defined(OS_MACOSX) || defined(OS_LINUX)
++#elif defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ return IsDownloadPdf();
+ #endif
+ }
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ void DownloadCommands::CopyFileAsImageToClipboard() {
+ if (model_->GetState() != download::DownloadItem::COMPLETE ||
diff --git a/www/iridium/files/patch-chrome_browser_download_download__commands.h b/www/iridium/files/patch-chrome_browser_download_download__commands.h
new file mode 100644
index 000000000000..126f0123875b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__commands.h
@@ -0,0 +1,11 @@
+--- chrome/browser/download/download_commands.h.orig 2020-03-16 18:39:43 UTC
++++ chrome/browser/download/download_commands.h
+@@ -48,7 +48,7 @@ class DownloadCommands {
+ bool IsCommandVisible(Command command) const;
+ void ExecuteCommand(Command command);
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ bool IsDownloadPdf() const;
+ bool CanOpenPdfInSystemViewer() const;
+ Browser* GetBrowser() const;
diff --git a/www/iridium/files/patch-chrome_browser_download_download__item__model.cc b/www/iridium/files/patch-chrome_browser_download_download__item__model.cc
new file mode 100644
index 000000000000..4b367d9bc2e5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__item__model.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_item_model.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/download/download_item_model.cc
+@@ -592,7 +592,7 @@ bool DownloadItemModel::IsCommandChecked(
+ return download_->GetOpenWhenComplete() ||
+ download_crx_util::IsExtensionDownload(*download_);
+ case DownloadCommands::ALWAYS_OPEN_TYPE:
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (download_commands->CanOpenPdfInSystemViewer()) {
+ DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(profile());
+ return prefs->ShouldOpenPdfInSystemReader();
+@@ -632,7 +632,7 @@ void DownloadItemModel::ExecuteCommand(DownloadCommand
+ bool is_checked = IsCommandChecked(download_commands,
+ DownloadCommands::ALWAYS_OPEN_TYPE);
+ DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(profile());
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (download_commands->CanOpenPdfInSystemViewer()) {
+ prefs->SetShouldOpenPdfInSystemReader(!is_checked);
+ SetShouldPreferOpeningInBrowser(is_checked);
diff --git a/www/iridium/files/patch-chrome_browser_download_download__prefs.cc b/www/iridium/files/patch-chrome_browser_download_download__prefs.cc
new file mode 100644
index 000000000000..ddf30c396fc6
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__prefs.cc
@@ -0,0 +1,65 @@
+--- chrome/browser/download/download_prefs.cc.orig 2020-02-03 21:52:39 UTC
++++ chrome/browser/download/download_prefs.cc
+@@ -63,7 +63,7 @@ namespace {
+ // 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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath home_dir = base::GetHomeDir();
+ if (download_path == home_dir) {
+ return true;
+@@ -159,7 +159,7 @@ DownloadPrefs::DownloadPrefs(Profile* profile) : profi
+ GetDefaultDownloadDirectoryForProfile()));
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ should_open_pdf_in_system_reader_ =
+ prefs->GetBoolean(prefs::kOpenPdfDownloadInSystemReader);
+ #endif
+@@ -261,7 +261,7 @@ void DownloadPrefs::RegisterProfilePrefs(
+ default_download_path);
+ registry->RegisterFilePathPref(prefs::kSaveFileDefaultDirectory,
+ default_download_path);
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ registry->RegisterBooleanPref(prefs::kOpenPdfDownloadInSystemReader, false);
+ #endif
+ #if defined(OS_ANDROID)
+@@ -360,7 +360,7 @@ bool DownloadPrefs::IsDownloadPathManaged() const {
+ }
+
+ bool DownloadPrefs::IsAutoOpenUsed() const {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (ShouldOpenPdfInSystemReader())
+ return true;
+ #endif
+@@ -374,7 +374,7 @@ bool DownloadPrefs::IsAutoOpenEnabledBasedOnExtension(
+ return false;
+ DCHECK(extension[0] == base::FilePath::kExtensionSeparator);
+ extension.erase(0, 1);
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (base::FilePath::CompareEqualIgnoreCase(extension,
+ FILE_PATH_LITERAL("pdf")) &&
+ ShouldOpenPdfInSystemReader())
+@@ -411,7 +411,7 @@ void DownloadPrefs::DisableAutoOpenBasedOnExtension(
+ SaveAutoOpenState();
+ }
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ void DownloadPrefs::SetShouldOpenPdfInSystemReader(bool should_open) {
+ if (should_open_pdf_in_system_reader_ == should_open)
+ return;
+@@ -432,7 +432,7 @@ bool DownloadPrefs::ShouldOpenPdfInSystemReader() cons
+ #endif
+
+ void DownloadPrefs::ResetAutoOpen() {
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ SetShouldOpenPdfInSystemReader(false);
+ #endif
+ auto_open_.clear();
diff --git a/www/iridium/files/patch-chrome_browser_download_download__prefs.h b/www/iridium/files/patch-chrome_browser_download_download__prefs.h
new file mode 100644
index 000000000000..702f54b47279
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__prefs.h
@@ -0,0 +1,20 @@
+--- chrome/browser/download/download_prefs.h.orig 2019-06-04 18:55:17 UTC
++++ chrome/browser/download/download_prefs.h
+@@ -102,7 +102,7 @@ class DownloadPrefs {
+ // Disables auto-open based on file extension.
+ void DisableAutoOpenBasedOnExtension(const base::FilePath& file_name);
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_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);
+@@ -150,7 +150,7 @@ class DownloadPrefs {
+ AutoOpenCompareFunctor> AutoOpenSet;
+ AutoOpenSet auto_open_;
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ bool should_open_pdf_in_system_reader_;
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_browser_download_download__query.cc b/www/iridium/files/patch-chrome_browser_download_download__query.cc
new file mode 100644
index 000000000000..be6e0537adfc
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__query.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/download/download_query.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/download/download_query.cc
+@@ -27,7 +27,11 @@
+ #include "components/download/public/common/download_item.h"
+ #include "components/url_formatter/url_formatter.h"
+ #include "content/public/browser/content_browser_client.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ using download::DownloadDangerType;
diff --git a/www/iridium/files/patch-chrome_browser_download_download__shelf__context__menu.cc b/www/iridium/files/patch-chrome_browser_download_download__shelf__context__menu.cc
new file mode 100644
index 000000000000..71f0ca430012
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_download_download__shelf__context__menu.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/download/download_shelf_context_menu.cc.orig 2020-03-16 18:39:43 UTC
++++ chrome/browser/download/download_shelf_context_menu.cc
+@@ -147,7 +147,7 @@ base::string16 DownloadShelfContextMenu::GetLabelForCo
+ : IDS_DOWNLOAD_MENU_PLATFORM_OPEN_ALWAYS;
+ break;
+ }
+-#elif defined(OS_MACOSX) || defined(OS_LINUX)
++#elif defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (can_open_pdf_in_system_viewer) {
+ id = IDS_DOWNLOAD_MENU_PLATFORM_OPEN_ALWAYS;
+ break;
diff --git a/www/iridium/files/patch-chrome_browser_extensions_BUILD.gn b/www/iridium/files/patch-chrome_browser_extensions_BUILD.gn
new file mode 100644
index 000000000000..4309d41da843
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_BUILD.gn
@@ -0,0 +1,15 @@
+--- chrome/browser/extensions/BUILD.gn.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/extensions/BUILD.gn
+@@ -1175,6 +1175,12 @@ jumbo_static_library("extensions") {
+ deps += [ "//chrome/common:service_process_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/www/iridium/files/patch-chrome_browser_extensions_activity__log_activity__log.cc b/www/iridium/files/patch-chrome_browser_extensions_activity__log_activity__log.cc
new file mode 100644
index 000000000000..9d31ad4054df
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_activity__log_activity__log.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/extensions/activity_log/activity_log.cc.orig 2019-12-16 21:50:42 UTC
++++ chrome/browser/extensions/activity_log/activity_log.cc
+@@ -47,7 +47,11 @@
+ #include "extensions/browser/extensions_browser_client.h"
+ #include "extensions/common/extension.h"
+ #include "extensions/common/extension_messages.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ namespace constants = activity_log_constants;
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher.cc b/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher.cc
new file mode 100644
index 000000000000..591517203deb
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc.orig 2020-03-17 09:37:45 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc
+@@ -11,7 +11,7 @@
+ #include "chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.h"
+ #elif defined(OS_WIN)
+ #include "chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_linux.h"
+ #endif
+
+@@ -58,7 +58,7 @@ std::unique_ptr<DeviceInfoFetcher> DeviceInfoFetcher::
+ return std::make_unique<DeviceInfoFetcherMac>();
+ #elif defined(OS_WIN)
+ return std::make_unique<DeviceInfoFetcherWin>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return std::make_unique<DeviceInfoFetcherLinux>();
+ #else
+ return std::make_unique<StubDeviceFetcher>();
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher__linux.cc b/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher__linux.cc
new file mode 100644
index 000000000000..8620f64e57fd
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_enterprise__reporting__private_device__info__fetcher__linux.cc
@@ -0,0 +1,40 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_linux.cc.orig 2020-03-18 08:39:42 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_linux.cc
+@@ -8,7 +8,9 @@
+ #include <gio/gio.h>
+ #endif // defined(USE_GIO)
+ #include <sys/stat.h>
++#if !defined(OS_BSD)
+ #include <sys/sysmacros.h>
++#endif
+
+ #include <string>
+
+@@ -90,6 +92,7 @@ enterprise_reporting_private::SettingValue GetScreenlo
+ // Implements the logic from the native host installation script. First find the
+ // root device identifier, then locate its parent and get its type.
+ enterprise_reporting_private::SettingValue GetDiskEncrypted() {
++#if !defined(OS_BSD)
+ struct stat info;
+ // First figure out the device identifier.
+ stat("/", &info);
+@@ -109,6 +112,7 @@ enterprise_reporting_private::SettingValue GetDiskEncr
+ return is_encrypted ? enterprise_reporting_private::SETTING_VALUE_ENABLED
+ : enterprise_reporting_private::SETTING_VALUE_DISABLED;
+ }
++#endif
+ return enterprise_reporting_private::SETTING_VALUE_UNKNOWN;
+ }
+
+@@ -120,7 +124,11 @@ DeviceInfoFetcherLinux::~DeviceInfoFetcherLinux() = de
+
+ DeviceInfo DeviceInfoFetcherLinux::Fetch() {
+ DeviceInfo device_info;
++#if defined(OS_FREEBSD)
++ device_info.os_name = "freebsd";
++#else
+ device_info.os_name = "linux";
++#endif
+ device_info.os_version = GetOsVersion();
+ device_info.device_host_name = GetDeviceHostName();
+ device_info.device_model = GetDeviceModel();
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_erp_chrome_desktop_report_request_helper.cc b/www/iridium/files/patch-chrome_browser_extensions_api_erp_chrome_desktop_report_request_helper.cc
new file mode 100644
index 000000000000..8a3736baf4ee
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_erp_chrome_desktop_report_request_helper.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc.orig 2020-04-03 04:11:29 UTC
++++ chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
+@@ -39,7 +39,7 @@
+ #include "base/win/registry.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/environment.h"
+ #include "base/nix/xdg_util.h"
+ #endif
+@@ -382,7 +382,7 @@ base::FilePath GetEndpointVerificationDir() {
+ return *GetEndpointVerificationDirOverride();
+ #if defined(OS_WIN)
+ if (!base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path))
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ path = base::nix::GetXDGDirectory(env.get(), base::nix::kXdgConfigHomeEnvVar,
+ base::nix::kDotConfigDir);
+@@ -393,7 +393,7 @@ base::FilePath GetEndpointVerificationDir() {
+ if (true)
+ #endif
+ return path;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ path = path.AppendASCII("google");
+ #else
+ path = path.AppendASCII("Google");
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc b/www/iridium/files/patch-chrome_browser_extensions_api_image__writer__private_removable__storage__provider.cc
new file mode 100644
index 000000000000..0b5c1a821007
--- /dev/null
+++ b/www/iridium/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 2019-04-30 22:22:33 UTC
++++ chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
+@@ -21,6 +21,7 @@ static base::LazyInstance<scoped_refptr<StorageDeviceL
+
+ void RemovableStorageProvider::GetAllDevices(DeviceListReadyCallback callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
++#if !defined(OS_BSD)
+ if (g_test_device_list.Get().get() != nullptr) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+@@ -34,6 +35,9 @@ void RemovableStorageProvider::GetAllDevices(DeviceLis
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+ base::BindOnce(&RemovableStorageProvider::PopulateDeviceList),
+ std::move(callback));
++#else
++ NOTIMPLEMENTED();
++#endif
+ }
+
+ // static
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h b/www/iridium/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h
new file mode 100644
index 000000000000..1cb62fbbfdce
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_input__ime_input__ime__api.h
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/input_ime/input_ime_api.h.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/extensions/api/input_ime/input_ime_api.h
+@@ -31,7 +31,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.h"
+-#elif defined(OS_LINUX) || defined(OS_WIN)
++#elif defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.h"
+ #endif // defined(OS_CHROMEOS)
+
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc b/www/iridium/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
new file mode 100644
index 000000000000..d8b93a7a1069
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_runtime_chrome__runtime__api__delegate.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc.orig 2019-04-30 22:22:33 UTC
++++ chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+@@ -299,6 +299,8 @@ bool ChromeRuntimeAPIDelegate::GetPlatformInfo(Platfor
+ info->os = extensions::api::runtime::PLATFORM_OS_CROS;
+ } else if (strcmp(os, "linux") == 0) {
+ info->os = extensions::api::runtime::PLATFORM_OS_LINUX;
++ } else if (strcmp(os, "freebsd") == 0) {
++ info->os = extensions::api::runtime::PLATFORM_OS_FREEBSD;
+ } else if (strcmp(os, "openbsd") == 0) {
+ info->os = extensions::api::runtime::PLATFORM_OS_OPENBSD;
+ } else {
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc b/www/iridium/files/patch-chrome_browser_extensions_api_settings__private_prefs__util.cc
new file mode 100644
index 000000000000..40176332dcff
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:29 UTC
++++ chrome/browser/extensions/api/settings_private/prefs_util.cc
+@@ -160,7 +160,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelist
+ (*s_whitelist)[bookmarks::prefs::kShowBookmarkBar] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ (*s_whitelist)[::prefs::kUseCustomChromeFrame] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ #endif
+@@ -170,7 +170,7 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelist
+ // Appearance settings.
+ (*s_whitelist)[::prefs::kCurrentThemeID] =
+ settings_api::PrefType::PREF_TYPE_STRING;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ (*s_whitelist)[::prefs::kUsesSystemTheme] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc b/www/iridium/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc
new file mode 100644
index 000000000000..7440fdc3cc94
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_api_webrtc__logging__private_webrtc__logging__private__api.cc
@@ -0,0 +1,43 @@
+--- chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc.orig 2019-10-21 19:06:21 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 defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_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 defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ if (extension) {
+ enabled_by_permissions =
+ extension->permissions_data()->active_permissions().HasAPIPermission(
+@@ -557,7 +557,7 @@ void WebrtcLoggingPrivateStartEventLoggingFunction::Fi
+ }
+
+ bool WebrtcLoggingPrivateGetLogsDirectoryFunction::RunAsync() {
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_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
+@@ -580,11 +580,11 @@ bool WebrtcLoggingPrivateGetLogsDirectoryFunction::Run
+ &WebrtcLoggingPrivateGetLogsDirectoryFunction::FireErrorCallback,
+ this));
+ return true;
+-#else // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#else // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ SetError("Not supported on the current OS");
+ SendResponse(false);
+ return false;
+-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ }
+
+ void WebrtcLoggingPrivateGetLogsDirectoryFunction::FireCallback(
diff --git a/www/iridium/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc b/www/iridium/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..fbddcf6c422b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_browser__context__keyed__service__factories.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/browser_context_keyed_service_factories.cc.orig 2020-02-03 21:52:39 UTC
++++ chrome/browser/extensions/browser_context_keyed_service_factories.cc
+@@ -52,7 +52,7 @@
+ #include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
+ #include "ppapi/buildflags/buildflags.h"
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
+ #endif
+
+@@ -88,7 +88,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt()
+ extensions::IdentityAPI::GetFactoryInstance();
+ extensions::InstallTrackerFactory::GetInstance();
+ extensions::InstallVerifierFactory::GetInstance();
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ extensions::InputImeAPI::GetFactoryInstance();
+ #endif
+ extensions::LanguageSettingsPrivateDelegateFactory::GetInstance();
diff --git a/www/iridium/files/patch-chrome_browser_extensions_external__provider__impl.cc b/www/iridium/files/patch-chrome_browser_extensions_external__provider__impl.cc
new file mode 100644
index 000000000000..8c813c1db5c8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_external__provider__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/extensions/external_provider_impl.cc.orig 2020-03-16 18:39:44 UTC
++++ chrome/browser/extensions/external_provider_impl.cc
+@@ -760,7 +760,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ }
+ #endif
+ if (!profile->GetPrefs()->GetBoolean(pref_names::kBlockExternalExtensions)) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
+ base::MakeRefCounted<ExternalPrefLoader>(
+@@ -787,7 +787,7 @@ void ExternalProviderImpl::CreateExternalProviders(
+ bundled_extension_creation_flags));
+
+ // Define a per-user source of external extensions.
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && BUILDFLAG(CHROMIUM_BRANDING))
++#if defined(OS_MACOSX) || ((defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(CHROMIUM_BRANDING))
+ provider_list->push_back(std::make_unique<ExternalProviderImpl>(
+ service,
+ base::MakeRefCounted<ExternalPrefLoader>(
diff --git a/www/iridium/files/patch-chrome_browser_extensions_install__signer.cc b/www/iridium/files/patch-chrome_browser_extensions_install__signer.cc
new file mode 100644
index 000000000000..831136e37584
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_extensions_install__signer.cc
@@ -0,0 +1,18 @@
+--- chrome/browser/extensions/install_signer.cc.orig 2020-03-16 18:39:44 UTC
++++ chrome/browser/extensions/install_signer.cc
+@@ -294,13 +294,13 @@ void LogRequestStartHistograms() {
+ DCHECK(g_single_thread_checker.Get().CalledOnValidThread());
+
+ // Process::Current().CreationTime is only defined on some platforms.
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::Time process_creation_time =
+ base::Process::Current().CreationTime();
+ UMA_HISTOGRAM_COUNTS_1M(
+ "ExtensionInstallSigner.UptimeAtTimeOfRequest",
+ (base::Time::Now() - process_creation_time).InSeconds());
+-#endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ base::TimeDelta delta;
+ base::TimeTicks now = base::TimeTicks::Now();
diff --git a/www/iridium/files/patch-chrome_browser_first__run_first__run__dialog.h b/www/iridium/files/patch-chrome_browser_first__run_first__run__dialog.h
new file mode 100644
index 000000000000..c079a7eac3e3
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_first__run_first__run__dialog.h
@@ -0,0 +1,11 @@
+--- chrome/browser/first_run/first_run_dialog.h.orig 2019-07-29 18:50:26 UTC
++++ chrome/browser/first_run/first_run_dialog.h
+@@ -9,7 +9,7 @@
+ #include "build/build_config.h"
+
+ // Hide this function on platforms where the dialog does not exist.
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ class Profile;
+
diff --git a/www/iridium/files/patch-chrome_browser_first__run_first__run__internal.h b/www/iridium/files/patch-chrome_browser_first__run_first__run__internal.h
new file mode 100644
index 000000000000..5b60fc717be9
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_first__run_first__run__internal.h
@@ -0,0 +1,18 @@
+--- chrome/browser/first_run/first_run_internal.h.orig 2019-07-29 18:50:45 UTC
++++ chrome/browser/first_run/first_run_internal.h
+@@ -64,13 +64,13 @@ FirstRunState DetermineFirstRunState(bool has_sentinel
+ bool force_first_run,
+ bool no_first_run);
+
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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
+ // build, etc).
+ void ForceFirstRunDialogShownForTesting(bool shown);
+-#endif // defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#endif // defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ } // namespace internal
+ } // namespace first_run
diff --git a/www/iridium/files/patch-chrome_browser_first__run_first__run__internal__posix.cc b/www/iridium/files/patch-chrome_browser_first__run_first__run__internal__posix.cc
new file mode 100644
index 000000000000..1a28c1282fc1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_first__run_first__run__internal__posix.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/first_run/first_run_internal_posix.cc.orig 2020-04-10 00:39:11 UTC
++++ chrome/browser/first_run/first_run_internal_posix.cc
+@@ -46,7 +46,7 @@ enum class ForcedShowDialogState {
+ ForcedShowDialogState g_forced_show_dialog_state =
+ ForcedShowDialogState::kNotForced;
+
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ // Returns whether the first run dialog should be shown. This is only true for
+ // certain builds, and only if the user has not already set preferences. In a
+ // real, official-build first run, initializes the default metrics reporting if
+@@ -100,7 +100,7 @@ void ForceFirstRunDialogShownForTesting(bool shown) {
+ }
+
+ void DoPostImportPlatformSpecificTasks(Profile* profile) {
+-#if !defined(OS_CHROMEOS)
++#if !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ if (!ShouldShowFirstRunDialog())
+ return;
+
diff --git a/www/iridium/files/patch-chrome_browser_flag__descriptions.cc b/www/iridium/files/patch-chrome_browser_flag__descriptions.cc
new file mode 100644
index 000000000000..1a6b198aa788
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_flag__descriptions.cc
@@ -0,0 +1,65 @@
+--- chrome/browser/flag_descriptions.cc.orig 2020-04-10 00:39:02 UTC
++++ chrome/browser/flag_descriptions.cc
+@@ -3651,7 +3651,7 @@ const char kZeroStateFilesDescription[] =
+
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if BUILDFLAG(USE_TCMALLOC)
+ const char kDynamicTcmallocName[] = "Dynamic Tcmalloc Tuning";
+@@ -3660,7 +3660,7 @@ const char kDynamicTcmallocDescription[] =
+ "utilization.";
+ #endif // BUILDFLAG(USE_TCMALLOC)
+
+-#endif // #if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#endif // #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // All views-based platforms --------------------------------------------------
+
+@@ -3685,13 +3685,13 @@ const char kReopenTabInProductHelpDescription[] =
+
+ // Random platform combinations -----------------------------------------------
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ const char kWebGL2ComputeContextName[] = "WebGL 2.0 Compute";
+ const char kWebGL2ComputeContextDescription[] =
+ "Enable the use of WebGL 2.0 Compute API.";
+
+-#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if BUILDFLAG(ENABLE_CLICK_TO_CALL)
+
+@@ -3708,7 +3708,7 @@ const char kClickToCallDetectionV2Description[] =
+
+ #endif // BUILDFLAG(ENABLE_CLICK_TO_CALL)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+
+ const char kRemoteCopyReceiverName[] =
+@@ -3717,16 +3717,16 @@ const char kRemoteCopyReceiverDescription[] =
+ "Enables the remote copy feature to handle messages by writing content to "
+ "the clipboard and showing a notification to the user.";
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ const char kDirectManipulationStylusName[] = "Direct Manipulation Stylus";
+ const char kDirectManipulationStylusDescription[] =
+ "If enabled, Chrome will scroll web pages on stylus drag.";
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
+
diff --git a/www/iridium/files/patch-chrome_browser_flag__descriptions.h b/www/iridium/files/patch-chrome_browser_flag__descriptions.h
new file mode 100644
index 000000000000..ad2ca09a3baa
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_flag__descriptions.h
@@ -0,0 +1,72 @@
+--- chrome/browser/flag_descriptions.h.orig 2020-04-10 00:39:02 UTC
++++ chrome/browser/flag_descriptions.h
+@@ -21,9 +21,9 @@
+ #include "ui/android/buildflags.h"
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/allocator/buildflags.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // This file declares strings used in chrome://flags. These messages are not
+ // translated, because instead of end-users they target Chromium developers and
+@@ -2132,14 +2132,14 @@ extern const char kZeroStateFilesDescription[];
+
+ #endif // #if defined(OS_CHROMEOS)
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if BUILDFLAG(USE_TCMALLOC)
+ extern const char kDynamicTcmallocName[];
+ extern const char kDynamicTcmallocDescription[];
+ #endif // BUILDFLAG(USE_TCMALLOC)
+
+-#endif // #if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#endif // #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // All views-based platforms --------------------------------------------------
+
+@@ -2158,12 +2158,12 @@ extern const char kReopenTabInProductHelpDescription[]
+
+ // Random platform combinations -----------------------------------------------
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ extern const char kWebGL2ComputeContextName[];
+ extern const char kWebGL2ComputeContextDescription[];
+
+-#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if BUILDFLAG(ENABLE_CLICK_TO_CALL)
+
+@@ -2175,21 +2175,21 @@ extern const char kClickToCallDetectionV2Description[]
+
+ #endif // BUILDFLAG(ENABLE_CLICK_TO_CALL)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+
+ extern const char kRemoteCopyReceiverName[];
+ extern const char kRemoteCopyReceiverDescription[];
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ extern const char kDirectManipulationStylusName[];
+ extern const char kDirectManipulationStylusDescription[];
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
+
diff --git a/www/iridium/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc b/www/iridium/files/patch-chrome_browser_media__galleries_fileapi_mtp__device__map__service.cc
new file mode 100644
index 000000000000..93a3d5742fd1
--- /dev/null
+++ b/www/iridium/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 2019-04-30 22:22:34 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 !defined(OS_FREEBSD)
+ CreateMTPDeviceAsyncDelegate(
+ device_location, read_only,
+ base::Bind(&MTPDeviceMapService::AddAsyncDelegate,
+ base::Unretained(this), device_location, read_only));
++#endif
+ mtp_device_usage_map_[key] = 0;
+ }
+
diff --git a/www/iridium/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc b/www/iridium/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
new file mode 100644
index 000000000000..922d7c8beb61
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media__galleries_media__file__system__registry.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/media_galleries/media_file_system_registry.cc.orig 2019-04-30 22:22:34 UTC
++++ chrome/browser/media_galleries/media_file_system_registry.cc
+@@ -732,7 +732,10 @@ 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/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc b/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
new file mode 100644
index 000000000000..c131ed5d1aa8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__posix.cc
@@ -0,0 +1,28 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_posix.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_posix.cc
+@@ -10,6 +10,7 @@
+ #include <netinet/in.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
++#include <sys/time.h>
+
+ #include <algorithm>
+
+@@ -19,7 +20,7 @@
+ #include "chrome/browser/media/router/discovery/discovery_network_list_wifi.h"
+ #include "net/base/net_errors.h"
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ #include <netpacket/packet.h>
+ #else
+ #include <net/if_dl.h>
+@@ -28,7 +29,7 @@
+ namespace media_router {
+ namespace {
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ using sll = struct sockaddr_ll;
+ #define SOCKET_ARP_TYPE(s) ((s)->sll_hatype)
+ #define SOCKET_ADDRESS_LEN(s) ((s)->sll_halen)
diff --git a/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc b/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
new file mode 100644
index 000000000000..23a0d4544e24
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_router_discovery_discovery__network__list__wifi__linux.cc
@@ -0,0 +1,27 @@
+--- chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/media/router/discovery/discovery_network_list_wifi_linux.cc
+@@ -9,8 +9,6 @@
+ #include <sys/socket.h>
+ #include <sys/types.h>
+
+-#include <linux/wireless.h>
+-
+ #include "base/files/scoped_file.h"
+ #include "base/logging.h"
+ #include "net/base/network_interfaces_linux.h"
+@@ -20,6 +18,7 @@ namespace media_router {
+ bool MaybeGetWifiSSID(const std::string& if_name, std::string* ssid_out) {
+ DCHECK(ssid_out);
+
++#if !defined(OS_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 +40,7 @@ bool MaybeGetWifiSSID(const std::string& if_name, std:
+ ssid_out->assign(ssid);
+ return true;
+ }
++#endif
+ return false;
+ }
+
diff --git a/www/iridium/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc b/www/iridium/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc
new file mode 100644
index 000000000000..9b007ae67c87
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_router_providers_wired__display_wired__display__media__route__provider.cc
@@ -0,0 +1,23 @@
+--- chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc.orig 2019-09-09 21:55:09 UTC
++++ chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
+@@ -112,6 +112,12 @@ void WiredDisplayMediaRouteProvider::CreateRoute(
+ bool incognito,
+ CreateRouteCallback callback) {
+ DCHECK(!base::Contains(presentations_, presentation_id));
++#if defined(OS_BSD)
++ std::move(callback).Run(base::nullopt, nullptr,
++ std::string("Not implemented"),
++ RouteRequestResult::UNKNOWN_ERROR);
++ return;
++#else
+ base::Optional<Display> display = GetDisplayBySinkId(sink_id);
+ if (!display) {
+ std::move(callback).Run(base::nullopt, nullptr,
+@@ -138,6 +144,7 @@ void WiredDisplayMediaRouteProvider::CreateRoute(
+ std::move(callback).Run(route, nullptr, base::nullopt,
+ RouteRequestResult::OK);
+ NotifyRouteObservers();
++#endif
+ }
+
+ void WiredDisplayMediaRouteProvider::JoinRoute(
diff --git a/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__event__log__uploader.cc
new file mode 100644
index 000000000000..76fb8bab73c0
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:52:40 UTC
++++ chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
+@@ -38,7 +38,7 @@ constexpr size_t kExpectedMimeOverheadBytes = 1000; /
+ const char kProduct[] = "Chrome";
+ #elif defined(OS_MACOSX)
+ const char kProduct[] = "Chrome_Mac";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ const char kProduct[] = "Chrome_Linux";
+ #elif defined(OS_ANDROID)
+ const char kProduct[] = "Chrome_Android";
diff --git a/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
new file mode 100644
index 000000000000..c1ca8fcabf4e
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__log__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/media/webrtc/webrtc_log_uploader.cc.orig 2019-10-21 19:06:22 UTC
++++ chrome/browser/media/webrtc/webrtc_log_uploader.cc
+@@ -358,6 +358,8 @@ void WebRtcLogUploader::SetupMultipart(
+ const char product[] = "Chrome_Android";
+ #elif defined(OS_CHROMEOS)
+ const char product[] = "Chrome_ChromeOS";
++#elif defined(OS_FREEBSD)
++ const char product[] = "Chrome_FreeBSD";
+ #else
+ #error Platform not supported.
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc
new file mode 100644
index 000000000000..981d24078676
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc
@@ -0,0 +1,33 @@
+--- chrome/browser/media/webrtc/webrtc_logging_controller.cc.orig 2020-03-16 18:39:44 UTC
++++ chrome/browser/media/webrtc/webrtc_logging_controller.cc
+@@ -24,10 +24,10 @@
+ #include "content/public/browser/render_process_host.h"
+ #include "services/service_manager/public/cpp/connector.h"
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ #include "content/public/browser/child_process_security_policy.h"
+ #include "storage/browser/file_system/isolated_context.h"
+-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ using webrtc_event_logging::WebRtcEventLogManager;
+
+@@ -270,7 +270,7 @@ void WebRtcLoggingController::StartEventLogging(
+ web_app_id, callback);
+ }
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ void WebRtcLoggingController::GetLogsDirectory(
+ const LogsDirectoryCallback& callback,
+ const LogsDirectoryErrorCallback& error_callback) {
+@@ -315,7 +315,7 @@ void WebRtcLoggingController::GrantLogsDirectoryAccess
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(callback, file_system.id(), registered_name));
+ }
+-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ void WebRtcLoggingController::OnRtpPacket(
+ std::unique_ptr<uint8_t[]> packet_header,
diff --git a/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h
new file mode 100644
index 000000000000..e3ef33fc829f
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_media_webrtc_webrtc__logging__controller.h
@@ -0,0 +1,36 @@
+--- chrome/browser/media/webrtc/webrtc_logging_controller.h.orig 2019-10-30 15:50:11 UTC
++++ chrome/browser/media/webrtc/webrtc_logging_controller.h
+@@ -129,13 +129,13 @@ class WebRtcLoggingController
+ size_t web_app_id,
+ const StartEventLoggingCallback& callback);
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_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.
+ void GetLogsDirectory(const LogsDirectoryCallback& callback,
+ const LogsDirectoryErrorCallback& error_callback);
+-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ // chrome::mojom::WebRtcLoggingClient methods:
+ void OnAddMessages(
+@@ -188,7 +188,7 @@ class WebRtcLoggingController
+ bool success,
+ const std::string& error_message);
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_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|
+@@ -197,7 +197,7 @@ class WebRtcLoggingController
+ const LogsDirectoryCallback& callback,
+ const LogsDirectoryErrorCallback& error_callback,
+ const base::FilePath& logs_path);
+-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ static base::FilePath GetLogDirectoryAndEnsureExists(
+ const base::FilePath& browser_context_directory_path);
diff --git a/www/iridium/files/patch-chrome_browser_memory__details.cc b/www/iridium/files/patch-chrome_browser_memory__details.cc
new file mode 100644
index 000000000000..2c4302248909
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_memory__details.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/memory_details.cc.orig 2019-03-11 22:00:53 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 defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ #include "services/service_manager/zygote/zygote_host_linux.h"
+ #endif
+
+@@ -336,7 +336,7 @@ void MemoryDetails::CollectChildInfoOnUIThread() {
+ process.titles.push_back(title);
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ if (service_manager::ZygoteHost::GetInstance()->IsZygotePid(process.pid)) {
+ process.process_type = content::PROCESS_TYPE_ZYGOTE;
+ }
diff --git a/www/iridium/files/patch-chrome_browser_memory__details__linux.cc b/www/iridium/files/patch-chrome_browser_memory__details__linux.cc
new file mode 100644
index 000000000000..1112bd81ffcc
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_memory__details__linux.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/memory_details_linux.cc.orig 2019-03-11 22:00:53 UTC
++++ chrome/browser/memory_details_linux.cc
+@@ -72,8 +72,10 @@ ProcessData GetProcessDataMemoryInformation(
+
+ std::unique_ptr<base::ProcessMetrics> metrics(
+ base::ProcessMetrics::CreateProcessMetrics(pid));
++#if !defined(OS_BSD)
+ pmi.num_open_fds = metrics->GetOpenFdCount();
+ pmi.open_fds_soft_limit = metrics->GetOpenFdSoftLimit();
++#endif
+
+ process_data.processes.push_back(pmi);
+ }
diff --git a/www/iridium/files/patch-chrome_browser_metrics_bluetooth__available__utility.cc b/www/iridium/files/patch-chrome_browser_metrics_bluetooth__available__utility.cc
new file mode 100644
index 000000000000..3bb3c96f9188
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_metrics_bluetooth__available__utility.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/metrics/bluetooth_available_utility.cc.orig 2019-06-04 18:55:17 UTC
++++ chrome/browser/metrics/bluetooth_available_utility.cc
+@@ -76,8 +76,10 @@ void ReportBluetoothAvailability() {
+ return;
+ }
+
++#if !defined(OS_BSD)
+ device::BluetoothAdapterFactory::Get().GetAdapter(
+ base::BindOnce(&OnGetAdapter));
++#endif
+ }
+
+ } // namespace bluetooth_utility
diff --git a/www/iridium/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc b/www/iridium/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
new file mode 100644
index 000000000000..dd487ab9da88
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_metrics_chrome__browser__main__extra__parts__metrics.cc
@@ -0,0 +1,21 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig 2019-09-09 21:55:09 UTC
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+@@ -47,7 +47,9 @@
+
+ #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ #include <gnu/libc-version.h>
++#endif
+
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+ #include "base/strings/string_util.h"
+@@ -55,7 +57,7 @@
+ #if defined(USE_X11)
+ #include "ui/base/x/x11_util.h"
+ #endif
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if defined(USE_OZONE) || defined(USE_X11)
+ #include "ui/events/devices/device_data_manager.h"
diff --git a/www/iridium/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc b/www/iridium/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc
new file mode 100644
index 000000000000..a1c3fbc542a8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_metrics_chrome__metrics__service__client.cc
@@ -0,0 +1,25 @@
+--- chrome/browser/metrics/chrome_metrics_service_client.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/metrics/chrome_metrics_service_client.cc
+@@ -718,11 +718,11 @@ void ChromeMetricsServiceClient::RegisterMetricsServic
+ #endif // defined(OS_WIN)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ metrics_service_->RegisterMetricsProvider(
+ std::make_unique<DesktopPlatformFeaturesMetricsProvider>());
+ #endif // defined(OS_WIN) || defined(OS_MACOSX) || \
+- // (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if BUILDFLAG(ENABLE_PLUGINS)
+ plugin_metrics_provider_ = new PluginMetricsProvider(local_state);
+@@ -980,7 +980,7 @@ bool ChromeMetricsServiceClient::RegisterForProfileEve
+ }
+ #endif
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // This creates the DesktopProfileSessionDurationsServices if it didn't exist
+ // already.
+ metrics::DesktopProfileSessionDurationsServiceFactory::GetForBrowserContext(
diff --git a/www/iridium/files/patch-chrome_browser_metrics_process__memory__metrics__emitter.cc b/www/iridium/files/patch-chrome_browser_metrics_process__memory__metrics__emitter.cc
new file mode 100644
index 000000000000..7994a85f8cec
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_metrics_process__memory__metrics__emitter.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/metrics/process_memory_metrics_emitter.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/metrics/process_memory_metrics_emitter.cc
+@@ -438,7 +438,7 @@ void EmitProcessUmaAndUkm(const GlobalMemoryDump::Proc
+
+ builder->SetPrivateMemoryFootprint(pmd.os_dump().private_footprint_kb / 1024);
+ builder->SetSharedMemoryFootprint(pmd.os_dump().shared_footprint_kb / 1024);
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ builder->SetPrivateSwapFootprint(pmd.os_dump().private_footprint_swap_kb /
+ 1024);
+ #endif
+@@ -461,7 +461,7 @@ void EmitProcessUmaAndUkm(const GlobalMemoryDump::Proc
+ MEMORY_METRICS_HISTOGRAM_MB(std::string(kMemoryHistogramPrefix) +
+ process_name + ".SharedMemoryFootprint",
+ pmd.os_dump().shared_footprint_kb / 1024);
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ MEMORY_METRICS_HISTOGRAM_MB(std::string(kMemoryHistogramPrefix) +
+ process_name + ".PrivateSwapFootprint",
+ pmd.os_dump().private_footprint_swap_kb / 1024);
diff --git a/www/iridium/files/patch-chrome_browser_native__file__system_chrome__native__file__system__permission__context.cc b/www/iridium/files/patch-chrome_browser_native__file__system_chrome__native__file__system__permission__context.cc
new file mode 100644
index 000000000000..21db21328ad3
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_native__file__system_chrome__native__file__system__permission__context.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/native_file_system/chrome_native_file_system_permission_context.cc
+@@ -144,7 +144,7 @@ const struct {
+ {base::DIR_APP_DATA, nullptr, true},
+ {base::DIR_HOME, FILE_PATH_LITERAL("Library"), true},
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux also block access to devices via /dev, as well as security
+ // sensitive data in /sys and /proc.
+ {kNoBasePathKey, FILE_PATH_LITERAL("/dev"), true},
diff --git a/www/iridium/files/patch-chrome_browser_net_system__network__context__manager.cc b/www/iridium/files/patch-chrome_browser_net_system__network__context__manager.cc
new file mode 100644
index 000000000000..aace9f122f49
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_net_system__network__context__manager.cc
@@ -0,0 +1,64 @@
+--- chrome/browser/net/system_network_context_manager.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/net/system_network_context_manager.cc
+@@ -79,11 +79,11 @@
+ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/common/chrome_paths_internal.h"
+ #include "chrome/grit/chromium_strings.h"
+ #include "ui/base/l10n/l10n_util.h"
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if defined(OS_WIN) || defined(OS_MACOSX)
+ #include "content/public/common/network_service_util.h"
+@@ -160,10 +160,10 @@ network::mojom::HttpAuthDynamicParamsPtr CreateHttpAut
+ auth_dynamic_params->enable_negotiate_port =
+ local_state->GetBoolean(prefs::kEnableAuthNegotiatePort);
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ auth_dynamic_params->delegate_by_kdc_policy =
+ local_state->GetBoolean(prefs::kAuthNegotiateDelegateByKdcPolicy);
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ auth_dynamic_params->ntlm_v2_enabled =
+@@ -429,10 +429,10 @@ SystemNetworkContextManager::SystemNetworkContextManag
+ pref_change_registrar_.Add(prefs::kEnableAuthNegotiatePort,
+ auth_pref_callback);
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ pref_change_registrar_.Add(prefs::kAuthNegotiateDelegateByKdcPolicy,
+ auth_pref_callback);
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ pref_change_registrar_.Add(prefs::kNtlmV2Enabled, auth_pref_callback);
+@@ -485,10 +485,10 @@ void SystemNetworkContextManager::RegisterPrefs(PrefRe
+ registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string());
+ registry->RegisterStringPref(prefs::kAuthNegotiateDelegateWhitelist,
+ std::string());
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ registry->RegisterBooleanPref(prefs::kAuthNegotiateDelegateByKdcPolicy,
+ false);
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ registry->RegisterBooleanPref(
+@@ -610,7 +610,7 @@ void SystemNetworkContextManager::OnNetworkServiceCrea
+ insecure_stub_resolver_enabled, secure_dns_mode,
+ std::move(dns_over_https_servers));
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+
diff --git a/www/iridium/files/patch-chrome_browser_notifications_notification__display__service__impl.cc b/www/iridium/files/patch-chrome_browser_notifications_notification__display__service__impl.cc
new file mode 100644
index 000000000000..7688028b44a2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_notifications_notification__display__service__impl.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/notifications/notification_display_service_impl.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/notifications/notification_display_service_impl.cc
+@@ -33,7 +33,7 @@
+ #include "chrome/browser/notifications/notification_platform_bridge_message_center.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/send_tab_to_self/desktop_notification_handler.h"
+ #endif
+
+@@ -122,7 +122,7 @@ NotificationDisplayServiceImpl::NotificationDisplaySer
+ AddNotificationHandler(NotificationHandler::Type::WEB_PERSISTENT,
+ std::make_unique<PersistentNotificationHandler>());
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ AddNotificationHandler(
+ NotificationHandler::Type::SEND_TAB_TO_SELF,
+ std::make_unique<send_tab_to_self::DesktopNotificationHandler>(
diff --git a/www/iridium/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc b/www/iridium/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc
new file mode 100644
index 000000000000..b9786e7622f2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_password__manager_chrome__password__manager__client.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/password_manager/chrome_password_manager_client.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/password_manager/chrome_password_manager_client.cc
+@@ -88,7 +88,11 @@
+ #include "net/base/url_util.h"
+ #include "net/cert/cert_status_flags.h"
+ #include "services/metrics/public/cpp/ukm_recorder.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/url_constants.h"
+
+ #if BUILDFLAG(FULL_SAFE_BROWSING)
diff --git a/www/iridium/files/patch-chrome_browser_password__manager_password__store__factory.cc b/www/iridium/files/patch-chrome_browser_password__manager_password__store__factory.cc
new file mode 100644
index 000000000000..889049cf9109
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_password__manager_password__store__factory.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/password_manager/password_store_factory.cc.orig 2019-10-21 19:06:22 UTC
++++ chrome/browser/password_manager/password_store_factory.cc
+@@ -181,7 +181,7 @@ PasswordStoreFactory::BuildServiceInstanceFor(
+ base::TimeDelta::FromSeconds(20));
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ std::unique_ptr<password_manager::PasswordStoreSigninNotifier> notifier =
+ std::make_unique<password_manager::PasswordStoreSigninNotifierImpl>(
+ IdentityManagerFactory::GetForProfile(profile));
diff --git a/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.cc b/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.cc
new file mode 100644
index 000000000000..98bd40401783
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/performance_monitor/process_metrics_history.cc.orig 2019-10-21 19:06:22 UTC
++++ chrome/browser/performance_monitor/process_metrics_history.cc
+@@ -47,7 +47,7 @@ void ProcessMetricsHistory::SampleMetrics() {
+ #if defined(OS_WIN)
+ disk_usage_ = process_metrics_->GetDiskUsageBytesPerSecond();
+ #endif
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ idle_wakeups_ = process_metrics_->GetIdleWakeupsPerSecond();
+ #endif
+ #if defined(OS_MACOSX)
+@@ -88,7 +88,7 @@ void ProcessMetricsHistory::RunPerformanceTriggers() {
+ kDiskUsageHistogramMin, kDiskUsageHistogramMax,
+ kDiskUsageHistogramBucketCount);
+ #endif
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ UMA_HISTOGRAM_COUNTS_10000(
+ "PerformanceMonitor.IdleWakeups.BrowserProcess", idle_wakeups_);
+ #endif
+@@ -109,7 +109,7 @@ void ProcessMetricsHistory::RunPerformanceTriggers() {
+ UMA_HISTOGRAM_BOOLEAN("PerformanceMonitor.HighCPU.RendererProcess",
+ true);
+ }
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ UMA_HISTOGRAM_COUNTS_10000(
+ "PerformanceMonitor.IdleWakeups.RendererProcess", idle_wakeups_);
+ #endif
+@@ -129,7 +129,7 @@ void ProcessMetricsHistory::RunPerformanceTriggers() {
+ kHistogramBucketCount);
+ if (cpu_usage_ > kHighCPUUtilizationThreshold)
+ UMA_HISTOGRAM_BOOLEAN("PerformanceMonitor.HighCPU.GPUProcess", true);
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ UMA_HISTOGRAM_COUNTS_10000("PerformanceMonitor.IdleWakeups.GPUProcess",
+ idle_wakeups_);
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.h b/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.h
new file mode 100644
index 000000000000..cb195b6b0cf5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_performance__monitor_process__metrics__history.h
@@ -0,0 +1,11 @@
+--- chrome/browser/performance_monitor/process_metrics_history.h.orig 2019-06-04 18:55:17 UTC
++++ chrome/browser/performance_monitor/process_metrics_history.h
+@@ -72,7 +72,7 @@ class ProcessMetricsHistory {
+ uint64_t disk_usage_ = 0;
+ #endif
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ int idle_wakeups_ = 0;
+ #endif
+ #if defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-chrome_browser_plugins_plugin__info__host__impl.cc b/www/iridium/files/patch-chrome_browser_plugins_plugin__info__host__impl.cc
new file mode 100644
index 000000000000..c45a5b0d8d92
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_plugins_plugin__info__host__impl.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/plugins/plugin_info_host_impl.cc.orig 2020-02-03 21:52:40 UTC
++++ chrome/browser/plugins/plugin_info_host_impl.cc
+@@ -382,7 +382,7 @@ void PluginInfoHostImpl::ComponentPluginLookupDone(
+ std::unique_ptr<component_updater::ComponentInfo> cus_plugin_info) {
+ if (cus_plugin_info) {
+ output->status = chrome::mojom::PluginStatus::kComponentUpdateRequired;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (cus_plugin_info->version != base::Version("0")) {
+ output->status = chrome::mojom::PluginStatus::kRestartRequired;
+ }
diff --git a/www/iridium/files/patch-chrome_browser_plugins_plugins__resource__service.cc b/www/iridium/files/patch-chrome_browser_plugins_plugins__resource__service.cc
new file mode 100644
index 000000000000..35342997a152
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_plugins_plugins__resource__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/plugins/plugins_resource_service.cc.orig 2020-02-03 21:52:40 UTC
++++ chrome/browser/plugins/plugins_resource_service.cc
+@@ -62,7 +62,7 @@ GURL GetPluginsServerURL() {
+ filename = "plugins_win.json";
+ #elif defined(OS_CHROMEOS)
+ filename = "plugins_chromeos.json";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ filename = "plugins_linux.json";
+ #elif defined(OS_MACOSX)
+ filename = "plugins_mac.json";
diff --git a/www/iridium/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc b/www/iridium/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc
new file mode 100644
index 000000000000..b79d0d1d66d8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_policy_browser__signin__policy__handler.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/policy/browser_signin_policy_handler.cc.orig 2019-09-16 07:21:37 UTC
++++ chrome/browser/policy/browser_signin_policy_handler.cc
+@@ -39,7 +39,7 @@ void BrowserSigninPolicyHandler::ApplyPolicySettings(c
+ }
+ switch (static_cast<BrowserSigninMode>(int_value)) {
+ case BrowserSigninMode::kForced:
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_BSD)
+ prefs->SetValue(prefs::kForceBrowserSignin, base::Value(true));
+ #endif
+ FALLTHROUGH;
diff --git a/www/iridium/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc b/www/iridium/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc
new file mode 100644
index 000000000000..8f82b5f2a44d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_policy_configuration__policy__handler__list__factory.cc
@@ -0,0 +1,43 @@
+--- chrome/browser/policy/configuration_policy_handler_list_factory.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/policy/configuration_policy_handler_list_factory.cc
+@@ -118,7 +118,7 @@
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
+ #endif
+
+@@ -355,11 +355,11 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ { key::kWebComponentsV0Enabled,
+ prefs::kWebComponentsV0Enabled,
+ base::Value::Type::BOOLEAN },
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ { key::kAuthNegotiateDelegateByKdcPolicy,
+ prefs::kAuthNegotiateDelegateByKdcPolicy,
+ base::Value::Type::BOOLEAN },
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ #if defined(OS_POSIX)
+ { key::kNtlmV2Enabled,
+ prefs::kNtlmV2Enabled,
+@@ -1163,7 +1163,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ prefs::kExternalProtocolDialogShowAlwaysOpenCheckbox,
+ base::Value::Type::BOOLEAN },
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ { key::kAlternativeBrowserPath,
+ browser_switcher::prefs::kAlternativeBrowserPath,
+ base::Value::Type::STRING },
+@@ -1203,7 +1203,7 @@ const PolicyToPreferenceMapEntry kSimplePolicyMap[] =
+ browser_switcher::prefs::kChromeParameters,
+ base::Value::Type::LIST },
+ #endif
+-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD)
+ { key::kBrowserGuestModeEnforced,
+ prefs::kBrowserGuestModeEnforced,
+ base::Value::Type::BOOLEAN },
diff --git a/www/iridium/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc b/www/iridium/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc
new file mode 100644
index 000000000000..816eeffdc37e
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_policy_policy__prefs__browsertest.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/policy/policy_prefs_browsertest.cc.orig 2020-02-03 21:52:40 UTC
++++ chrome/browser/policy/policy_prefs_browsertest.cc
+@@ -250,6 +250,8 @@ class PolicyTestCase {
+ const std::string os("chromeos");
+ #elif defined(OS_LINUX)
+ const std::string os("linux");
++#elif defined(OS_FREEBSD)
++ const std::string os("freebsd");
+ #else
+ #error "Unknown platform"
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_prefs_browser__prefs.cc b/www/iridium/files/patch-chrome_browser_prefs_browser__prefs.cc
new file mode 100644
index 000000000000..7f9fbfc4cd49
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_prefs_browser__prefs.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/prefs/browser_prefs.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/prefs/browser_prefs.cc
+@@ -360,7 +360,7 @@
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
+ #endif
+
+@@ -1022,7 +1022,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySync
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ browser_switcher::BrowserSwitcherPrefs::RegisterProfilePrefs(registry);
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_browser_prefs_pref__service__incognito__whitelist.cc b/www/iridium/files/patch-chrome_browser_prefs_pref__service__incognito__whitelist.cc
new file mode 100644
index 000000000000..0fc02f402f9c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_prefs_pref__service__incognito__whitelist.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/prefs/pref_service_incognito_whitelist.cc.orig 2019-12-16 21:50:42 UTC
++++ chrome/browser/prefs/pref_service_incognito_whitelist.cc
+@@ -187,7 +187,7 @@ const char* const kPersistentPrefNames[] = {
+ prefs::kShowFullscreenToolbar,
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // 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/www/iridium/files/patch-chrome_browser_process__singleton__posix.cc b/www/iridium/files/patch-chrome_browser_process__singleton__posix.cc
new file mode 100644
index 000000000000..f8a7db8e85a3
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_process__singleton__posix.cc
@@ -0,0 +1,34 @@
+--- chrome/browser/process_singleton_posix.cc.orig 2019-10-21 19:06:22 UTC
++++ chrome/browser/process_singleton_posix.cc
+@@ -95,11 +95,11 @@
+ #include "net/base/network_interfaces.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/process_singleton_dialog_linux.h"
+ #endif
+
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -296,7 +296,7 @@ bool DisplayProfileInUseError(const base::FilePath& lo
+ if (g_disable_prompt)
+ return g_user_opted_unlock_in_use_profile;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::string16 relaunch_button_text = l10n_util::GetStringUTF16(
+ IDS_PROFILE_IN_USE_LINUX_RELAUNCH);
+ return ShowProcessSingletonDialog(error, relaunch_button_text);
+@@ -872,7 +872,7 @@ ProcessSingleton::NotifyResult ProcessSingleton::Notif
+ SendRemoteProcessInteractionResultHistogram(REMOTE_PROCESS_SHUTTING_DOWN);
+ return PROCESS_NONE;
+ } else if (strncmp(buf, kACKToken, base::size(kACKToken) - 1) == 0) {
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Likely NULL in unit tests.
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui)
diff --git a/www/iridium/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc b/www/iridium/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
new file mode 100644
index 000000000000..a2ac58994f69
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_profiles_chrome__browser__main__extra__parts__profiles.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+@@ -295,7 +295,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+ if (base::FeatureList::IsEnabled(media::kUseMediaHistoryStore))
+ media_history::MediaHistoryKeyedServiceFactory::GetInstance();
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ metrics::DesktopProfileSessionDurationsServiceFactory::GetInstance();
+ #endif
+ ModelTypeStoreServiceFactory::GetInstance();
diff --git a/www/iridium/files/patch-chrome_browser_profiles_profile__attributes__entry.cc b/www/iridium/files/patch-chrome_browser_profiles_profile__attributes__entry.cc
new file mode 100644
index 000000000000..48f0d0c5ddd2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_profiles_profile__attributes__entry.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/profiles/profile_attributes_entry.cc.orig 2020-03-16 18:39:44 UTC
++++ chrome/browser/profiles/profile_attributes_entry.cc
+@@ -108,7 +108,7 @@ void ProfileAttributesEntry::Initialize(ProfileInfoCac
+ if (is_force_signin_enabled_) {
+ if (!IsAuthenticated())
+ is_force_signin_profile_locked_ = true;
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ } else if (IsSigninRequired()) {
+ // Profiles that require signin in the absence of an enterprise policy are
+ // left-overs from legacy supervised users. Just unlock them, so users can
diff --git a/www/iridium/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc b/www/iridium/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc
new file mode 100644
index 000000000000..4a46416a7065
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_renderer__context__menu_render__view__context__menu.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/renderer_context_menu/render_view_context_menu.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/renderer_context_menu/render_view_context_menu.cc
+@@ -1702,7 +1702,7 @@ void RenderViewContextMenu::AppendEditableItems() {
+ // 'Undo' and 'Redo' for text input with no suggestions and no text selected.
+ // We make an exception for OS X as context clicking will select the closest
+ // word. In this case both items are always shown.
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_UNDO,
+ IDS_CONTENT_CONTEXT_UNDO);
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_REDO,
+@@ -1744,7 +1744,7 @@ void RenderViewContextMenu::AppendLanguageSettings() {
+ if (!use_spelling)
+ return;
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS,
+ IDS_CONTENT_CONTEXT_LANGUAGE_SETTINGS);
+ #else
+@@ -2083,7 +2083,7 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id)
+ case IDC_CHECK_SPELLING_WHILE_TYPING:
+ return prefs->GetBoolean(spellcheck::prefs::kSpellCheckEnable);
+
+-#if !defined(OS_MACOSX) && defined(OS_POSIX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD) && defined(OS_POSIX)
+ // TODO(suzhe): this should not be enabled for password fields.
+ case IDC_INPUT_METHODS_MENU:
+ return true;
diff --git a/www/iridium/files/patch-chrome_browser_renderer__preferences__util.cc b/www/iridium/files/patch-chrome_browser_renderer__preferences__util.cc
new file mode 100644
index 000000000000..db4c5e81a31d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_renderer__preferences__util.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/renderer_preferences_util.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/renderer_preferences_util.cc
+@@ -31,7 +31,7 @@
+ #include "ui/base/cocoa/defaults_utils.h"
+ #endif
+
+-#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "chrome/browser/themes/theme_service.h"
+ #include "chrome/browser/themes/theme_service_factory.h"
+ #include "ui/views/linux_ui/linux_ui.h"
+@@ -146,7 +146,7 @@ void UpdateFromSystemSettings(blink::mojom::RendererPr
+ prefs->caret_blink_interval = interval;
+ #endif
+
+-#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ if (linux_ui) {
+ if (ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) {
+@@ -165,7 +165,7 @@ void UpdateFromSystemSettings(blink::mojom::RendererPr
+ }
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_BSD)
+ content::UpdateFontRendererPreferencesFromSystemSettings(prefs);
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py b/www/iridium/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py
new file mode 100644
index 000000000000..de779e766d99
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_resources_safe__browsing_gen__file__type__proto.py
@@ -0,0 +1,19 @@
+--- chrome/browser/resources/safe_browsing/gen_file_type_proto.py.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/resources/safe_browsing/gen_file_type_proto.py
+@@ -31,6 +31,7 @@ def PlatformTypes():
+ "android": download_file_types_pb2.DownloadFileType.PLATFORM_ANDROID,
+ "chromeos": download_file_types_pb2.DownloadFileType.PLATFORM_CHROME_OS,
+ "linux": download_file_types_pb2.DownloadFileType.PLATFORM_LINUX,
++ "bsd": download_file_types_pb2.DownloadFileType.PLATFORM_LINUX,
+ "mac": download_file_types_pb2.DownloadFileType.PLATFORM_MAC,
+ "win": download_file_types_pb2.DownloadFileType.PLATFORM_WINDOWS,
+ }
+@@ -169,7 +170,7 @@ class DownloadFileTypeProtoGenerator(BinaryProtoGenera
+ 'Outfile must have a %d for version and %s for platform.')
+ parser.add_option('-t', '--type',
+ help='The platform type. One of android, chromeos, ' +
+- 'linux, mac, win')
++ 'linux, bsd, mac, win')
+
+ def AddExtraCommandLineArgsForVirtualEnvRun(self, opts, command):
+ if opts.type is not None:
diff --git a/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js b/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js
new file mode 100644
index 000000000000..6512d38fe080
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__browser__proxy.js
@@ -0,0 +1,20 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js.orig 2019-10-21 19:06:23 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
+@@ -19,7 +19,7 @@ cr.define('settings', function() {
+
+ useDefaultTheme() {}
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ useSystemTheme() {}
+
+ // </if>
+@@ -59,7 +59,7 @@ cr.define('settings', function() {
+ chrome.send('useDefaultTheme');
+ }
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ /** @override */
+ useSystemTheme() {
+ chrome.send('useSystemTheme');
diff --git a/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html b/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.html
new file mode 100644
index 000000000000..1470f1f0d2c0
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:29 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.html
+@@ -49,7 +49,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 or chromeos">
++<if expr="not is_posix or chromeos">
+ <template is="dom-if" if="[[prefs.extensions.theme.id.value]]">
+ <div class="separator"></div>
+ <cr-button id="useDefault" on-click="onUseDefaultTap_">
+@@ -57,7 +57,7 @@
+ </cr-button>
+ </template>
+ </if>
+-<if expr="is_linux and not chromeos">
++<if expr="is_posix and not chromeos">
+ <div class="settings-row continuation"
+ hidden="[[!showThemesSecondary_(
+ prefs.extensions.theme.id.value, useSystemTheme_)]]"
+@@ -120,7 +120,7 @@
+ pref="{{prefs.bookmark_bar.show_on_all_tabs}}"
+ label="$i18n{showBookmarksBar}">
+ </settings-toggle-button>
+-<if expr="is_linux and not chromeos">
++<if expr="is_posix and not chromeos">
+ <settings-toggle-button
+ class$="[[getFirst_(pageVisibility.bookmarksBar)]]"
+ pref="{{prefs.browser.custom_chrome_frame}}"
diff --git a/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js b/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js
new file mode 100644
index 000000000000..a080e83db65c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_resources_settings_appearance__page_appearance__page.js
@@ -0,0 +1,33 @@
+--- chrome/browser/resources/settings/appearance_page/appearance_page.js.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/resources/settings/appearance_page/appearance_page.js
+@@ -104,7 +104,7 @@ Polymer({
+ 'defaultFontSizeChanged_(prefs.webkit.webprefs.default_font_size.value)',
+ 'themeChanged_(prefs.extensions.theme.id.value, useSystemTheme_)',
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ // NOTE: this pref only exists on Linux.
+ 'useSystemThemePrefChanged_(prefs.extensions.theme.use_system.value)',
+ // </if>
+@@ -190,7 +190,7 @@ Polymer({
+ this.appearanceBrowserProxy_.useDefaultTheme();
+ },
+
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ /**
+ * @param {boolean} useSystemTheme
+ * @private
+@@ -267,10 +267,10 @@ Polymer({
+ }
+
+ let i18nId;
+- // <if expr="is_linux and not chromeos">
++ // <if expr="is_bsd and not chromeos">
+ i18nId = useSystemTheme ? 'systemTheme' : 'classicTheme';
+ // </if>
+- // <if expr="not is_linux or chromeos">
++ // <if expr="not is_bsd or chromeos">
+ i18nId = 'chooseFromWebStore';
+ // </if>
+ this.themeSublabel_ = this.i18n(i18nId);
diff --git a/www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc b/www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc
new file mode 100644
index 000000000000..2d242ce878e6
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__handler__util.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/safe_browsing/incident_reporting/incident_handler_util.cc.orig 2019-06-04 18:55:18 UTC
++++ chrome/browser/safe_browsing/incident_reporting/incident_handler_util.cc
+@@ -8,7 +8,12 @@
+
+ #include "base/hash/hash.h"
+ #include "base/logging.h"
++//XXX(rene) needs shim headers?
++#if defined(USE_SYSTEM_PROTOBUF)
++#include <google/protobuf/message_lite.h>
++#else
+ #include "third_party/protobuf/src/google/protobuf/message_lite.h"
++#endif
+
+ namespace safe_browsing {
+
diff --git a/www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc b/www/iridium/files/patch-chrome_browser_safe__browsing_incident__reporting_incident__reporting__service.cc
new file mode 100644
index 000000000000..0690a0795218
--- /dev/null
+++ b/www/iridium/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 2020-04-10 00:39:09 UTC
++++ chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+@@ -674,7 +674,7 @@ void IncidentReportingService::OnEnvironmentDataCollec
+ environment_collection_pending_ = false;
+
+ // Process::Current().CreationTime() is missing on some platforms.
+-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ base::TimeDelta uptime =
+ first_incident_time_ - base::Process::Current().CreationTime();
+ environment_data->mutable_process()->set_uptime_msec(uptime.InMilliseconds());
diff --git a/www/iridium/files/patch-chrome_browser_search_search__suggest_search__suggest__service.cc b/www/iridium/files/patch-chrome_browser_search_search__suggest_search__suggest__service.cc
new file mode 100644
index 000000000000..bf751427bd2a
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_search_search__suggest_search__suggest__service.cc
@@ -0,0 +1,14 @@
+--- chrome/browser/search/search_suggest/search_suggest_service.cc.orig 2019-12-16 21:50:43 UTC
++++ chrome/browser/search/search_suggest/search_suggest_service.cc
+@@ -20,7 +20,11 @@
+ #include "components/prefs/scoped_user_pref_update.h"
+ #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
+ #include "components/signin/public/identity_manager/identity_manager.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace {
+
diff --git a/www/iridium/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc b/www/iridium/files/patch-chrome_browser_send__tab__to__self_receiving__ui__handler__registry.cc
new file mode 100644
index 000000000000..f8a2b34d89f3
--- /dev/null
+++ b/www/iridium/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 2019-06-07 20:47:39 UTC
++++ chrome/browser/send_tab_to_self/receiving_ui_handler_registry.cc
+@@ -11,7 +11,7 @@
+ #include "chrome/browser/profiles/profile.h"
+ #include "chrome/browser/send_tab_to_self/receiving_ui_handler.h"
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "chrome/browser/send_tab_to_self/desktop_notification_handler.h"
+ #endif
+
+@@ -32,7 +32,7 @@ ReceivingUiHandlerRegistry* ReceivingUiHandlerRegistry
+ // Instantiates all the handlers relevant to this platform.
+ void ReceivingUiHandlerRegistry::InstantiatePlatformSpecificHandlers(
+ Profile* profile) {
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ applicable_handlers_.push_back(
+ std::make_unique<send_tab_to_self::DesktopNotificationHandler>(profile));
+ #elif defined(OS_ANDROID)
diff --git a/www/iridium/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc b/www/iridium/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc
new file mode 100644
index 000000000000..d20b30112256
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_send__tab__to__self_send__tab__to__self__client__service.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/send_tab_to_self/send_tab_to_self_client_service.cc.orig 2019-07-29 18:57:56 UTC
++++ chrome/browser/send_tab_to_self/send_tab_to_self_client_service.cc
+@@ -41,7 +41,7 @@ void SendTabToSelfClientService::SendTabToSelfModelLoa
+ void SendTabToSelfClientService::EntriesAddedRemotely(
+ const std::vector<const SendTabToSelfEntry*>& new_entries) {
+ for (const std::unique_ptr<ReceivingUiHandler>& handler : GetHandlers()) {
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_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/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.cc b/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.cc
new file mode 100644
index 000000000000..e1b209c81c94
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.cc
@@ -0,0 +1,17 @@
+--- chrome/browser/sharing/shared_clipboard/feature_flags.cc.orig 2020-02-07 12:34:27 UTC
++++ chrome/browser/sharing/shared_clipboard/feature_flags.cc
+@@ -10,12 +10,12 @@ const base::Feature kSharedClipboardReceiver{"SharedCl
+ const base::Feature kSharedClipboardUI{"SharedClipboardUI",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ const base::Feature kRemoteCopyReceiver{"RemoteCopyReceiver",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+ const base::FeatureParam<std::string> kRemoteCopyAllowedOrigins = {
+ &kRemoteCopyReceiver, "RemoteCopyAllowedOrigins", ""};
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
diff --git a/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.h b/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.h
new file mode 100644
index 000000000000..6a0e3079731b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_shared__clipboard_feature__flags.h
@@ -0,0 +1,19 @@
+--- chrome/browser/sharing/shared_clipboard/feature_flags.h.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/sharing/shared_clipboard/feature_flags.h
+@@ -17,14 +17,14 @@ extern const base::Feature kSharedClipboardReceiver;
+ // Feature to allow shared clipboard gets processed.
+ extern const base::Feature kSharedClipboardUI;
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ // Feature to enable handling remote copy messages.
+ extern const base::Feature kRemoteCopyReceiver;
+
+ // List of allowed origins to fetch images from, comma separated.
+ extern const base::FeatureParam<std::string> kRemoteCopyAllowedOrigins;
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #endif // CHROME_BROWSER_SHARING_SHARED_CLIPBOARD_FEATURE_FLAGS_H_
diff --git a/www/iridium/files/patch-chrome_browser_sharing_sharing__device__registration.cc b/www/iridium/files/patch-chrome_browser_sharing_sharing__device__registration.cc
new file mode 100644
index 000000000000..0c3723e85860
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_sharing__device__registration.cc
@@ -0,0 +1,24 @@
+--- chrome/browser/sharing/sharing_device_registration.cc.orig 2020-03-26 18:39:48 UTC
++++ chrome/browser/sharing/sharing_device_registration.cc
+@@ -325,7 +325,7 @@ bool SharingDeviceRegistration::IsSmsFetcherSupported(
+ }
+
+ bool SharingDeviceRegistration::IsRemoteCopySupported() const {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ return base::FeatureList::IsEnabled(kRemoteCopyReceiver);
+ #endif
+@@ -334,10 +334,10 @@ bool SharingDeviceRegistration::IsRemoteCopySupported(
+ }
+
+ bool SharingDeviceRegistration::IsPeerConnectionSupported() const {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ return base::FeatureList::IsEnabled(kSharingPeerConnectionReceiver);
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ return false;
diff --git a/www/iridium/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc b/www/iridium/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc
new file mode 100644
index 000000000000..a9744c4a6a8d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_sharing__handler__registry__impl.cc
@@ -0,0 +1,32 @@
+--- chrome/browser/sharing/sharing_handler_registry_impl.cc.orig 2020-03-16 18:39:44 UTC
++++ chrome/browser/sharing/sharing_handler_registry_impl.cc
+@@ -24,10 +24,10 @@
+ #include "chrome/browser/sharing/webrtc/webrtc_message_handler.h"
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ #include "chrome/browser/sharing/shared_clipboard/remote_copy_message_handler.h"
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ SharingHandlerRegistryImpl::SharingHandlerRegistryImpl(
+@@ -73,14 +73,14 @@ SharingHandlerRegistryImpl::SharingHandlerRegistryImpl
+ {chrome_browser_sharing::SharingMessage::kSharedClipboardMessage});
+ }
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ if (sharing_device_registration->IsRemoteCopySupported()) {
+ AddSharingHandler(
+ std::make_unique<RemoteCopyMessageHandler>(profile),
+ {chrome_browser_sharing::SharingMessage::kRemoteCopyMessage});
+ }
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #if !defined(OS_ANDROID)
diff --git a/www/iridium/files/patch-chrome_browser_sharing_sharing__service.cc b/www/iridium/files/patch-chrome_browser_sharing_sharing__service.cc
new file mode 100644
index 000000000000..7e096df1b053
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_sharing__service.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/sharing/sharing_service.cc.orig 2020-03-30 09:34:43 UTC
++++ chrome/browser/sharing/sharing_service.cc
+@@ -30,7 +30,7 @@ namespace {
+ SharingMessageSender::DelegateType GetSendDelegateType(
+ const syncer::DeviceInfo& device,
+ const chrome_browser_sharing::SharingMessage& message) {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ // Messages other than SharedClipboard are always sent via FCM.
+ if (message.payload_case() !=
+@@ -56,7 +56,7 @@ SharingMessageSender::DelegateType GetSendDelegateType
+ // logic once we wrap up the experiment and e.g. only send messages over a
+ // certain size via WebRTC.
+ return SharingMessageSender::DelegateType::kWebRtc;
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ // defined(OS_CHROMEOS)
+
+ // Only FCM is supported for non desktop OS.
diff --git a/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.cc b/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.cc
new file mode 100644
index 000000000000..cfac06c08d3d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.cc
@@ -0,0 +1,17 @@
+--- chrome/browser/sharing/webrtc/webrtc_flags.cc.orig 2020-03-30 09:35:30 UTC
++++ chrome/browser/sharing/webrtc/webrtc_flags.cc
+@@ -4,12 +4,12 @@
+
+ #include "chrome/browser/sharing/webrtc/webrtc_flags.h"
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ const base::Feature kSharingPeerConnectionReceiver{
+ "SharingPeerConnectionReceiver", base::FEATURE_DISABLED_BY_DEFAULT};
+
+ const base::Feature kSharingPeerConnectionSender{
+ "SharingPeerConnectionSender", base::FEATURE_ENABLED_BY_DEFAULT};
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
diff --git a/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.h b/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.h
new file mode 100644
index 000000000000..fdec699052e2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sharing_webrtc_webrtc__flags.h
@@ -0,0 +1,19 @@
+--- chrome/browser/sharing/webrtc/webrtc_flags.h.orig 2020-03-30 09:35:47 UTC
++++ chrome/browser/sharing/webrtc/webrtc_flags.h
+@@ -8,14 +8,14 @@
+ #include "base/feature_list.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ // Feature flag to enable receiving PeerConnection requests.
+ extern const base::Feature kSharingPeerConnectionReceiver;
+
+ // Feature flag to enable sending SharingMessage using PeerConnection.
+ extern const base::Feature kSharingPeerConnectionSender;
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #endif // CHROME_BROWSER_SHARING_WEBRTC_WEBRTC_FLAGS_H_
diff --git a/www/iridium/files/patch-chrome_browser_signin_signin__util.cc b/www/iridium/files/patch-chrome_browser_signin_signin__util.cc
new file mode 100644
index 000000000000..4c230f4f53f2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_signin_signin__util.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/signin/signin_util.cc.orig 2019-12-16 21:50:43 UTC
++++ chrome/browser/signin/signin_util.cc
+@@ -34,7 +34,7 @@
+ #include "google_apis/gaia/gaia_auth_util.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #include "chrome/browser/ui/browser_finder.h"
+ #include "chrome/browser/ui/browser_list.h"
+ #include "chrome/browser/ui/browser_list_observer.h"
diff --git a/www/iridium/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc b/www/iridium/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc
new file mode 100644
index 000000000000..50ed28cdeb0a
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ssl_ssl__error__controller__client.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ssl/ssl_error_controller_client.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/ssl/ssl_error_controller_client.cc
+@@ -79,7 +79,7 @@ void LaunchDateAndTimeSettingsImpl() {
+ #if defined(OS_ANDROID)
+ chrome::android::OpenDateAndTimeSettings();
+
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ struct ClockCommand {
+ const char* const pathname;
+ const char* const argument;
+@@ -205,7 +205,7 @@ void SSLErrorControllerClient::Proceed() {
+ }
+
+ bool SSLErrorControllerClient::CanLaunchDateAndTimeSettings() {
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || \
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ defined(OS_WIN)
+ return true;
+ #else
diff --git a/www/iridium/files/patch-chrome_browser_sync_chrome__sync__client.cc b/www/iridium/files/patch-chrome_browser_sync_chrome__sync__client.cc
new file mode 100644
index 000000000000..155f4fdf474c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_sync_chrome__sync__client.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/sync/chrome_sync_client.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/sync/chrome_sync_client.cc
+@@ -442,7 +442,7 @@ ChromeSyncClient::CreateDataTypeControllers(syncer::Sy
+ }
+ #endif // defined(OS_CHROMEOS)
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // Dictionary sync is enabled by default.
+ if (!disabled_types.Has(syncer::DICTIONARY)) {
+ controllers.push_back(
+@@ -450,7 +450,7 @@ ChromeSyncClient::CreateDataTypeControllers(syncer::Sy
+ syncer::DICTIONARY, model_type_store_factory,
+ GetSyncableServiceForType(syncer::DICTIONARY), dump_stack));
+ }
+-#endif // defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ if (arc::IsArcAllowedForProfile(profile_) &&
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.cc b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.cc
new file mode 100644
index 000000000000..1e077a7ff46c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.cc
@@ -0,0 +1,56 @@
+--- chrome/browser/task_manager/sampling/task_group.cc.orig 2019-09-09 21:55:10 UTC
++++ chrome/browser/task_manager/sampling/task_group.cc
+@@ -33,9 +33,9 @@ const int kBackgroundRefreshTypesMask =
+ #if defined(OS_WIN)
+ REFRESH_TYPE_START_TIME | REFRESH_TYPE_CPU_TIME |
+ #endif // defined(OS_WIN)
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ REFRESH_TYPE_FD_COUNT |
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #if BUILDFLAG(ENABLE_NACL)
+ REFRESH_TYPE_NACL |
+ #endif // BUILDFLAG(ENABLE_NACL)
+@@ -114,9 +114,9 @@ TaskGroup::TaskGroup(
+ #if BUILDFLAG(ENABLE_NACL)
+ nacl_debug_stub_port_(nacl::kGdbDebugStubPortUnknown),
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ open_fd_count_(-1),
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ idle_wakeups_per_second_(-1),
+ gpu_memory_has_duplicates_(false),
+ is_backgrounded_(false) {
+@@ -129,10 +129,10 @@ TaskGroup::TaskGroup(
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&TaskGroup::OnIdleWakeupsRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ base::Bind(&TaskGroup::OnOpenFdCountRefreshDone,
+ weak_ptr_factory_.GetWeakPtr()),
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ base::Bind(&TaskGroup::OnProcessPriorityDone,
+ weak_ptr_factory_.GetWeakPtr()));
+
+@@ -300,14 +300,14 @@ void TaskGroup::OnRefreshNaClDebugStubPortDone(int nac
+ }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ void TaskGroup::OnOpenFdCountRefreshDone(int open_fd_count) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ open_fd_count_ = open_fd_count;
+ OnBackgroundRefreshTypeFinished(REFRESH_TYPE_FD_COUNT);
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ void TaskGroup::OnCpuRefreshDone(double cpu_usage) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.h b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.h
new file mode 100644
index 000000000000..3b055c6018f5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group.h
@@ -0,0 +1,48 @@
+--- chrome/browser/task_manager/sampling/task_group.h.orig 2019-10-21 19:06:23 UTC
++++ chrome/browser/task_manager/sampling/task_group.h
+@@ -39,7 +39,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 defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ REFRESH_TYPE_FD_COUNT |
+ #endif
+ REFRESH_TYPE_HARD_FAULTS;
+@@ -122,9 +122,9 @@ class TaskGroup {
+ int nacl_debug_stub_port() const { return nacl_debug_stub_port_; }
+ #endif // BUILDFLAG(ENABLE_NACL)
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ int open_fd_count() const { return open_fd_count_; }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ int idle_wakeups_per_second() const { return idle_wakeups_per_second_; }
+
+@@ -138,9 +138,9 @@ class TaskGroup {
+ void RefreshNaClDebugStubPort(int child_process_unique_id);
+ void OnRefreshNaClDebugStubPortDone(int port);
+ #endif
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ void OnOpenFdCountRefreshDone(int open_fd_count);
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ void OnCpuRefreshDone(double cpu_usage);
+ void OnSwappedMemRefreshDone(int64_t swapped_mem_bytes);
+@@ -209,10 +209,10 @@ class TaskGroup {
+ #if BUILDFLAG(ENABLE_NACL)
+ int nacl_debug_stub_port_;
+ #endif // BUILDFLAG(ENABLE_NACL)
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ // The number of file descriptors currently open by the process.
+ int open_fd_count_;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ int idle_wakeups_per_second_;
+ bool gpu_memory_has_duplicates_;
+ bool is_backgrounded_;
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
new file mode 100644
index 000000000000..0727f82f22b9
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.cc
@@ -0,0 +1,72 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.cc.orig 2020-03-16 18:39:45 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.cc
+@@ -43,9 +43,9 @@ TaskGroupSampler::TaskGroupSampler(
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_swapped_mem_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnProcessPriorityCallback& on_process_priority)
+ : process_(std::move(process)),
+ process_metrics_(CreateProcessMetrics(process_.Handle())),
+@@ -53,9 +53,9 @@ 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 defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ on_open_fd_count_callback_(on_open_fd_count),
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ on_process_priority_callback_(on_process_priority) {
+ DCHECK(blocking_pool_runner.get());
+
+@@ -85,7 +85,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ base::BindOnce(on_swapped_mem_refresh_callback_));
+ }
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_IDLE_WAKEUPS,
+ refresh_flags)) {
+ base::PostTaskAndReplyWithResult(
+@@ -93,9 +93,9 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ base::BindOnce(&TaskGroupSampler::RefreshIdleWakeupsPerSecond, this),
+ base::BindOnce(on_idle_wakeups_callback_));
+ }
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_FD_COUNT,
+ refresh_flags)) {
+ base::PostTaskAndReplyWithResult(
+@@ -103,7 +103,7 @@ void TaskGroupSampler::Refresh(int64_t refresh_flags)
+ base::BindOnce(&TaskGroupSampler::RefreshOpenFdCount, this),
+ base::BindOnce(on_open_fd_count_callback_));
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ if (TaskManagerObserver::IsResourceRefreshEnabled(REFRESH_TYPE_PRIORITY,
+ refresh_flags)) {
+@@ -145,13 +145,13 @@ int TaskGroupSampler::RefreshIdleWakeupsPerSecond() {
+ return process_metrics_->GetIdleWakeupsPerSecond();
+ }
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ int TaskGroupSampler::RefreshOpenFdCount() {
+ DCHECK(worker_pool_sequenced_checker_.CalledOnValidSequence());
+
+ return process_metrics_->GetOpenFdCount();
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ bool TaskGroupSampler::RefreshProcessPriority() {
+ DCHECK(worker_pool_sequenced_checker_.CalledOnValidSequence());
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
new file mode 100644
index 000000000000..ee309764291e
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__group__sampler.h
@@ -0,0 +1,50 @@
+--- chrome/browser/task_manager/sampling/task_group_sampler.h.orig 2019-06-04 18:55:18 UTC
++++ chrome/browser/task_manager/sampling/task_group_sampler.h
+@@ -32,9 +32,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ using OnCpuRefreshCallback = base::Callback<void(double)>;
+ using OnSwappedMemRefreshCallback = base::Callback<void(int64_t)>;
+ using OnIdleWakeupsCallback = base::Callback<void(int)>;
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ using OnOpenFdCountCallback = base::Callback<void(int)>;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ using OnProcessPriorityCallback = base::Callback<void(bool)>;
+
+ TaskGroupSampler(
+@@ -43,9 +43,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ const OnCpuRefreshCallback& on_cpu_refresh,
+ const OnSwappedMemRefreshCallback& on_memory_refresh,
+ const OnIdleWakeupsCallback& on_idle_wakeups,
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnOpenFdCountCallback& on_open_fd_count,
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnProcessPriorityCallback& on_process_priority);
+
+ // Refreshes the expensive process' stats (CPU usage, memory usage, and idle
+@@ -60,9 +60,9 @@ class TaskGroupSampler : public base::RefCountedThread
+ double RefreshCpuUsage();
+ int64_t RefreshSwappedMem();
+ int RefreshIdleWakeupsPerSecond();
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ int RefreshOpenFdCount();
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ bool RefreshProcessPriority();
+
+ // The process that holds the handle that we own so that we can use it for
+@@ -84,9 +84,9 @@ 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 defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnOpenFdCountCallback on_open_fd_count_callback_;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const OnProcessPriorityCallback on_process_priority_callback_;
+
+ // To assert we're running on the correct thread.
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
new file mode 100644
index 000000000000..cb287277caa7
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_sampling_task__manager__impl.cc
@@ -0,0 +1,16 @@
+--- chrome/browser/task_manager/sampling/task_manager_impl.cc.orig 2019-10-21 19:06:23 UTC
++++ chrome/browser/task_manager/sampling/task_manager_impl.cc
+@@ -219,11 +219,11 @@ void TaskManagerImpl::GetUSERHandles(TaskId task_id,
+ }
+
+ int TaskManagerImpl::GetOpenFdCount(TaskId task_id) const {
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ return GetTaskGroupByTaskId(task_id)->open_fd_count();
+ #else
+ return -1;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ }
+
+ bool TaskManagerImpl::IsTaskOnBackgroundedProcess(TaskId task_id) const {
diff --git a/www/iridium/files/patch-chrome_browser_task__manager_task__manager__observer.h b/www/iridium/files/patch-chrome_browser_task__manager_task__manager__observer.h
new file mode 100644
index 000000000000..ee059c93979b
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_task__manager_task__manager__observer.h
@@ -0,0 +1,16 @@
+--- chrome/browser/task_manager/task_manager_observer.h.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/task_manager/task_manager_observer.h
+@@ -43,11 +43,11 @@ enum RefreshType {
+ // or backgrounded.
+ REFRESH_TYPE_PRIORITY = 1 << 13,
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ // For observers interested in getting the number of open file descriptors of
+ // processes.
+ REFRESH_TYPE_FD_COUNT = 1 << 14,
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ REFRESH_TYPE_KEEPALIVE_COUNT = 1 << 15,
+ REFRESH_TYPE_MEMORY_FOOTPRINT = 1 << 16,
diff --git a/www/iridium/files/patch-chrome_browser_themes_theme__service__factory.cc b/www/iridium/files/patch-chrome_browser_themes_theme__service__factory.cc
new file mode 100644
index 000000000000..cf606ad8b2ce
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_themes_theme__service__factory.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/themes/theme_service_factory.cc.orig 2020-03-16 18:39:45 UTC
++++ chrome/browser/themes/theme_service_factory.cc
+@@ -23,7 +23,7 @@
+ #include "chrome/browser/themes/theme_helper_win.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/browser/themes/theme_service_aura_linux.h"
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+@@ -78,7 +78,7 @@ ThemeServiceFactory::~ThemeServiceFactory() {}
+
+ KeyedService* ThemeServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* profile) const {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ using ThemeService = ThemeServiceAuraLinux;
+ #endif
+
+@@ -90,7 +90,7 @@ KeyedService* ThemeServiceFactory::BuildServiceInstanc
+
+ void ThemeServiceFactory::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ bool default_uses_system_theme = false;
+
+ const views::LinuxUI* linux_ui = views::LinuxUI::instance();
diff --git a/www/iridium/files/patch-chrome_browser_tracing_crash__service__uploader.cc b/www/iridium/files/patch-chrome_browser_tracing_crash__service__uploader.cc
new file mode 100644
index 000000000000..9e2f7535e762
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_tracing_crash__service__uploader.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/tracing/crash_service_uploader.cc.orig 2020-03-16 18:40:29 UTC
++++ chrome/browser/tracing/crash_service_uploader.cc
+@@ -160,6 +160,8 @@ void TraceCrashServiceUploader::DoCompressOnBackground
+ const char product[] = "Chrome_Linux";
+ #elif defined(OS_ANDROID)
+ const char product[] = "Chrome_Android";
++#elif defined(OS_FREEBSD)
++ const char product[] = "Chrome_FreeBSD";
+ #else
+ #error Platform not supported.
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_browser__command__controller.cc b/www/iridium/files/patch-chrome_browser_ui_browser__command__controller.cc
new file mode 100644
index 000000000000..1ee7f7ff4e27
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_browser__command__controller.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/browser_command_controller.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/browser_command_controller.cc
+@@ -82,7 +82,7 @@
+ #include "chrome/browser/ui/browser_commands_chromeos.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+ #endif
+
+@@ -252,7 +252,7 @@ bool BrowserCommandController::IsReservedCommandOrKey(
+ #endif
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // If this key was registered by the user as a content editing hotkey, then
+ // it is not reserved.
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+@@ -476,7 +476,7 @@ bool BrowserCommandController::ExecuteCommandWithDispo
+ break;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ case IDC_MINIMIZE_WINDOW:
+ browser_->window()->Minimize();
+ break;
+@@ -961,7 +961,7 @@ void BrowserCommandController::InitCommandState() {
+ command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_2, true);
+ command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_3, true);
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_MAXIMIZE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_WINDOW, true);
diff --git a/www/iridium/files/patch-chrome_browser_ui_browser__view__prefs.cc b/www/iridium/files/patch-chrome_browser_ui_browser__view__prefs.cc
new file mode 100644
index 000000000000..c393ceb5d02d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_browser__view__prefs.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/browser_view_prefs.cc.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/ui/browser_view_prefs.cc
+@@ -34,7 +34,7 @@ void RegisterBrowserViewLocalPrefs(PrefRegistrySimple*
+
+ void RegisterBrowserViewProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ bool custom_frame_pref_default = false;
+ #if defined(USE_X11)
+ custom_frame_pref_default = ui::GetCustomFramePrefDefault();
+@@ -45,7 +45,7 @@ void RegisterBrowserViewProfilePrefs(
+ #endif
+ registry->RegisterBooleanPref(prefs::kUseCustomChromeFrame,
+ custom_frame_pref_default);
+-#endif // OS_LINUX && !OS_CHROMEOS
++#endif // (OS_LINUX && !OS_CHROMEOS) || defined(OS_BSD)
+ }
+
+ void MigrateBrowserTabStripPrefs(PrefService* prefs) {
diff --git a/www/iridium/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc b/www/iridium/files/patch-chrome_browser_ui_exclusive__access_exclusive__access__bubble.cc
new file mode 100644
index 000000000000..c3704c9ebe7d
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:00:54 UTC
++++ chrome/browser/ui/exclusive_access/exclusive_access_bubble.cc
+@@ -16,7 +16,7 @@
+
+ // NOTE(koz): Linux doesn't use the thick shadowed border, so we add padding
+ // here.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const int ExclusiveAccessBubble::kPaddingPx = 8;
+ #else
+ const int ExclusiveAccessBubble::kPaddingPx = 15;
diff --git a/www/iridium/files/patch-chrome_browser_ui_gtk_print__dialog__gtk.cc b/www/iridium/files/patch-chrome_browser_ui_gtk_print__dialog__gtk.cc
new file mode 100644
index 000000000000..6d796805d2fa
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_gtk_print__dialog__gtk.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/gtk/print_dialog_gtk.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/gtk/print_dialog_gtk.cc
+@@ -336,7 +336,7 @@ void PrintDialogGtk::ShowDialog(
+ // Since we only generate PDF, only show printers that support PDF.
+ // TODO(thestig) Add more capabilities to support?
+ GtkPrintCapabilities cap = static_cast<GtkPrintCapabilities>(
+- GTK_PRINT_CAPABILITY_GENERATE_PDF | GTK_PRINT_CAPABILITY_PAGE_SET |
++ GTK_PRINT_CAPABILITY_GENERATE_PS | GTK_PRINT_CAPABILITY_GENERATE_PDF | GTK_PRINT_CAPABILITY_PAGE_SET |
+ GTK_PRINT_CAPABILITY_COPIES | GTK_PRINT_CAPABILITY_COLLATE |
+ GTK_PRINT_CAPABILITY_REVERSE);
+ gtk_print_unix_dialog_set_manual_capabilities(GTK_PRINT_UNIX_DIALOG(dialog_),
diff --git a/www/iridium/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc b/www/iridium/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc
new file mode 100644
index 000000000000..fd379c49386c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_input__method_input__method__engine__base.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/input_method/input_method_engine_base.cc.orig 2020-02-03 21:53:29 UTC
++++ chrome/browser/ui/input_method/input_method_engine_base.cc
+@@ -31,7 +31,7 @@
+ #include "ui/base/ime/chromeos/ime_keymap.h"
+ #elif defined(OS_WIN)
+ #include "ui/events/keycodes/keyboard_codes_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/events/keycodes/keyboard_codes_posix.h"
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_browser_ui_sad__tab.cc b/www/iridium/files/patch-chrome_browser_ui_sad__tab.cc
new file mode 100644
index 000000000000..d03e6c550af9
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_sad__tab.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/sad_tab.cc.orig 2020-03-16 18:39:45 UTC
++++ chrome/browser/ui/sad_tab.cc
+@@ -188,7 +188,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 defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc b/www/iridium/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
new file mode 100644
index 000000000000..e40b9803cffb
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_startup_bad__flags__prompt.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/startup/bad_flags_prompt.cc.orig 2020-02-03 21:53:29 UTC
++++ chrome/browser/ui/startup/bad_flags_prompt.cc
+@@ -87,7 +87,7 @@ static const char* kBadFlags[] = {
+ extensions::switches::kExtensionsOnChromeURLs,
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Speech dispatcher is buggy, it can crash and it can make Chrome freeze.
+ // http://crbug.com/327295
+ switches::kEnableSpeechDispatcher,
diff --git a/www/iridium/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc b/www/iridium/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
new file mode 100644
index 000000000000..b3cf9e596cbe
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_startup_startup__browser__creator.cc
@@ -0,0 +1,31 @@
+--- chrome/browser/ui/startup/startup_browser_creator.cc.orig 2020-02-03 21:52:41 UTC
++++ chrome/browser/ui/startup/startup_browser_creator.cc
+@@ -82,7 +82,7 @@
+ #include "chrome/browser/ui/user_manager.h"
+ #endif
+
+-#if defined(TOOLKIT_VIEWS) && defined(OS_LINUX)
++#if defined(TOOLKIT_VIEWS) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+
+@@ -291,7 +291,7 @@ bool IsSilentLaunchEnabled(const base::CommandLine& co
+ // true, send a warning if guest mode is requested but not allowed by policy.
+ bool IsGuestModeEnforced(const base::CommandLine& command_line,
+ bool show_warning) {
+-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD)
+ PrefService* service = g_browser_process->local_state();
+ DCHECK(service);
+
+@@ -662,8 +662,10 @@ bool StartupBrowserCreator::ProcessCmdLineImpl(
+ }
+ #endif // OS_CHROMEOS
+
++#if 0 /* XXX */
+ #if defined(TOOLKIT_VIEWS) && defined(USE_X11)
+ ui::TouchFactory::SetTouchDeviceListFromCommandLine();
++#endif
+ #endif
+
+ #if defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-chrome_browser_ui_tab__helpers.cc b/www/iridium/files/patch-chrome_browser_ui_tab__helpers.cc
new file mode 100644
index 000000000000..053ec7216342
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_tab__helpers.cc
@@ -0,0 +1,25 @@
+--- chrome/browser/ui/tab_helpers.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/tab_helpers.cc
+@@ -132,7 +132,7 @@
+ #include "components/zoom/zoom_controller.h"
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/blocked_content/framebust_block_tab_helper.h"
+ #include "chrome/browser/ui/hats/hats_helper.h"
+ #endif
+@@ -347,11 +347,11 @@ void TabHelpers::AttachTabHelpers(WebContents* web_con
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ metrics::DesktopSessionDurationObserver::CreateForWebContents(web_contents);
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(
+ features::kHappinessTrackingSurveysForDesktop) ||
+ base::FeatureList::IsEnabled(
diff --git a/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc b/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
new file mode 100644
index 000000000000..a5abcc83206d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__columns.cc
@@ -0,0 +1,15 @@
+--- chrome/browser/ui/task_manager/task_manager_columns.cc.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/ui/task_manager/task_manager_columns.cc
+@@ -93,10 +93,10 @@ const TableColumnData kColumns[] = {
+ base::size("100000") * kCharWidth, -1, true, false, false},
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ {IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN, ui::TableColumn::RIGHT, -1, 0,
+ base::size("999") * kCharWidth, -1, true, false, false},
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ {IDS_TASK_MANAGER_PROCESS_PRIORITY_COLUMN, ui::TableColumn::LEFT, -1, 0,
+ base::size("background") * kCharWidth, -1, true, true, false},
+ {IDS_TASK_MANAGER_KEEPALIVE_COUNT_COLUMN, ui::TableColumn::RIGHT, -1, 0,
diff --git a/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc b/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
new file mode 100644
index 000000000000..0f8d7e671406
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_task__manager_task__manager__table__model.cc
@@ -0,0 +1,50 @@
+--- chrome/browser/ui/task_manager/task_manager_table_model.cc.orig 2019-12-16 21:50:43 UTC
++++ chrome/browser/ui/task_manager/task_manager_table_model.cc
+@@ -450,13 +450,13 @@ base::string16 TaskManagerTableModel::GetText(int row,
+ ? stringifier_->backgrounded_string()
+ : stringifier_->foregrounded_string();
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_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)
+ : stringifier_->n_a_string();
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ case IDS_TASK_MANAGER_KEEPALIVE_COUNT_COLUMN: {
+ return stringifier_->GetKeepaliveCountText(
+@@ -616,7 +616,7 @@ int TaskManagerTableModel::CompareValues(int row1,
+ return BooleanCompare(is_proc1_bg, is_proc2_bg);
+ }
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN: {
+ const int proc1_fd_count =
+ observed_task_manager()->GetOpenFdCount(tasks_[row1]);
+@@ -624,7 +624,7 @@ int TaskManagerTableModel::CompareValues(int row1,
+ observed_task_manager()->GetOpenFdCount(tasks_[row2]);
+ return ValueCompare(proc1_fd_count, proc2_fd_count);
+ }
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ default:
+ NOTREACHED();
+@@ -790,11 +790,11 @@ void TaskManagerTableModel::UpdateRefreshTypes(int col
+ type = REFRESH_TYPE_KEEPALIVE_COUNT;
+ break;
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ case IDS_TASK_MANAGER_OPEN_FD_COUNT_COLUMN:
+ type = REFRESH_TYPE_FD_COUNT;
+ break;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+
+ default:
+ NOTREACHED();
diff --git a/www/iridium/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc b/www/iridium/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc
new file mode 100644
index 000000000000..f348ce9eaf16
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_toolbar_app__menu__model.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/toolbar/app_menu_model.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/toolbar/app_menu_model.cc
+@@ -684,7 +684,7 @@ bool AppMenuModel::IsCommandIdVisible(int command_id)
+ return app_menu_icon_controller_->GetTypeAndSeverity().type ==
+ AppMenuIconController::IconType::UPGRADE_NOTIFICATION;
+ }
+-#if !defined(OS_LINUX) || defined(USE_AURA)
++#if (!defined(OS_LINUX) && !defined(OS_BSD)) || defined(USE_AURA)
+ case IDC_BOOKMARK_THIS_TAB:
+ return !chrome::ShouldRemoveBookmarkThisTabUI(browser_->profile());
+ case IDC_BOOKMARK_ALL_TABS:
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_accelerator__table.cc b/www/iridium/files/patch-chrome_browser_ui_views_accelerator__table.cc
new file mode 100644
index 000000000000..5b89c27e8d36
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_accelerator__table.cc
@@ -0,0 +1,46 @@
+--- chrome/browser/ui/views/accelerator_table.cc.orig 2019-09-09 21:55:11 UTC
++++ chrome/browser/ui/views/accelerator_table.cc
+@@ -51,7 +51,7 @@ 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 defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ {ui::VKEY_9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NUMPAD9, ui::EF_ALT_DOWN, IDC_SELECT_LAST_TAB},
+ {ui::VKEY_NEXT, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, IDC_MOVE_TAB_NEXT},
+@@ -81,7 +81,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 defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ {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},
+@@ -99,7 +99,7 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ {ui::VKEY_8, ui::EF_ALT_DOWN, IDC_SELECT_TAB_7},
+ {ui::VKEY_NUMPAD8, ui::EF_ALT_DOWN, IDC_SELECT_TAB_7},
+ {ui::VKEY_BROWSER_FAVORITES, ui::EF_NONE, IDC_SHOW_BOOKMARK_BAR},
+-#endif // OS_LINUX && !OS_CHROMEOS
++#endif // (OS_LINUX || OS_BSD) && !OS_CHROMEOS
+ {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_PLATFORM_ACCELERATOR,
+ IDC_SHOW_BOOKMARK_BAR},
+ {ui::VKEY_OEM_MINUS, ui::EF_PLATFORM_ACCELERATOR, IDC_ZOOM_MINUS},
+@@ -125,14 +125,14 @@ const AcceleratorMapping kAcceleratorMap[] = {
+ IDC_SHOW_AVATAR_MENU},
+
+ // Platform-specific key maps.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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},
+ {ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, IDC_RELOAD},
+ {ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN, IDC_RELOAD_BYPASSING_CACHE},
+ {ui::VKEY_BROWSER_REFRESH, ui::EF_SHIFT_DOWN, IDC_RELOAD_BYPASSING_CACHE},
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_CHROMEOS)
+ // On Chrome OS, VKEY_BROWSER_SEARCH is handled in Ash.
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc b/www/iridium/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
new file mode 100644
index 000000000000..47a25b7a998d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_chrome__browser__main__extra__parts__views.cc
@@ -0,0 +1,38 @@
+--- chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc.orig 2020-02-03 21:52:41 UTC
++++ chrome/browser/ui/views/chrome_browser_main_extra_parts_views.cc
+@@ -33,7 +33,7 @@
+ #include "ui/wm/core/wm_state.h"
+ #endif // defined(USE_AURA)
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -43,7 +43,7 @@
+ #include "chrome/grit/generated_resources.h"
+ #include "content/public/common/content_switches.h"
+ #include "ui/base/l10n/l10n_util.h"
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+
+ // This connector is used in ui_devtools's TracingAgent to hook up with the
+ // tracing service.
+@@ -105,7 +105,7 @@ void ChromeBrowserMainExtraPartsViews::PreProfileInit(
+ devtools_server_->tracing_agent());
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // 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.
+@@ -136,7 +136,7 @@ void ChromeBrowserMainExtraPartsViews::PreProfileInit(
+ base::RunLoop().RunUntilIdle();
+
+ exit(EXIT_FAILURE);
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ }
+
+ void ChromeBrowserMainExtraPartsViews::PostBrowserStart() {
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_chrome__views__delegate.h b/www/iridium/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
new file mode 100644
index 000000000000..59453a839cab
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_chrome__views__delegate.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/chrome_views_delegate.h.orig 2019-06-04 18:55:18 UTC
++++ chrome/browser/ui/views/chrome_views_delegate.h
+@@ -44,7 +44,7 @@ class ChromeViewsDelegate : public views::ViewsDelegat
+ HICON GetSmallWindowIcon() const override;
+ int GetAppbarAutohideEdges(HMONITOR monitor,
+ base::OnceClosure callback) override;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ bool WindowManagerProvidesTitleBar(bool maximized) override;
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_download_download__item__view.cc b/www/iridium/files/patch-chrome_browser_ui_views_download_download__item__view.cc
new file mode 100644
index 000000000000..2e9f1501f8a7
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_download_download__item__view.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/download/download_item_view.cc.orig 2020-03-17 09:40:34 UTC
++++ chrome/browser/ui/views/download/download_item_view.cc
+@@ -234,7 +234,7 @@ DownloadItemView::DownloadItemView(DownloadUIModel::Do
+ open_button_ = AddChildView(std::move(open_button));
+
+ int file_name_style = views::style::STYLE_PRIMARY;
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(safe_browsing::kUseNewDownloadWarnings))
+ file_name_style = STYLE_EMPHASIZED;
+ #endif
+@@ -1633,7 +1633,7 @@ void DownloadItemView::StyleFilenameInLabel(views::Sty
+ if (!base::FeatureList::IsEnabled(safe_browsing::kUseNewDownloadWarnings))
+ return;
+
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_BSD)
+ base::string16 filename = ElidedFilename();
+ size_t file_name_position = label->GetText().find(filename);
+ if (file_name_position != std::string::npos) {
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_first__run__dialog.cc b/www/iridium/files/patch-chrome_browser_ui_views_first__run__dialog.cc
new file mode 100644
index 000000000000..d2029ff732a8
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_first__run__dialog.cc
@@ -0,0 +1,13 @@
+--- chrome/browser/ui/views/first_run_dialog.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/views/first_run_dialog.cc
+@@ -114,8 +114,10 @@ void FirstRunDialog::Done() {
+ bool FirstRunDialog::Accept() {
+ GetWidget()->Hide();
+
++#if !defined(OS_BSD)
+ ChangeMetricsReportingStateWithReply(report_crashes_->GetChecked(),
+ base::Bind(&InitCrashReporterIfEnabled));
++#endif
+
+ if (make_default_->GetChecked())
+ shell_integration::SetAsDefaultBrowser();
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__frame.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
new file mode 100644
index 000000000000..c1d853c940c7
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__frame.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/browser_frame.cc.orig 2019-10-21 19:06:24 UTC
++++ chrome/browser/ui/views/frame/browser_frame.cc
+@@ -46,7 +46,7 @@
+ namespace {
+
+ bool IsUsingGtkTheme(Profile* profile) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme();
+ #else
+ return false;
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
new file mode 100644
index 000000000000..cca78f0e9ece
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__non__client__frame__view__factory__views.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
+@@ -13,7 +13,7 @@
+ #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
+@@ -32,7 +32,7 @@ OpaqueBrowserFrameView* CreateOpaqueBrowserFrameView(
+ BrowserView* browser_view) {
+ #if BUILDFLAG(ENABLE_NATIVE_WINDOW_NAV_BUTTONS)
+ std::unique_ptr<views::NavButtonProvider> nav_button_provider;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (ThemeServiceFactory::GetForProfile(browser_view->browser()->profile())
+ ->UsingSystemTheme() &&
+ views::LinuxUI::instance()) {
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__view.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__view.cc
new file mode 100644
index 000000000000..b69b8869760f
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_frame_browser__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/browser_view.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/views/frame/browser_view.cc
+@@ -1633,7 +1633,7 @@ void BrowserView::UserChangedTheme(BrowserThemeChangeT
+ const bool should_use_native_frame = frame_->ShouldUseNativeFrame();
+
+ bool must_regenerate_frame;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // GTK and user theme changes can both change frame buttons, so the frame
+ // always needs to be regenerated on Linux.
+ must_regenerate_frame = true;
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
new file mode 100644
index 000000000000..9429876dcf27
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view.cc.orig 2020-03-16 18:39:45 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+@@ -48,7 +48,7 @@
+ #include "ui/views/window/vector_icons/vector_icons.h"
+ #include "ui/views/window/window_shape.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/views/controls/menu/menu_runner.h"
+ #endif
+
+@@ -349,7 +349,7 @@ void OpaqueBrowserFrameView::ButtonPressed(views::Butt
+ } else if (sender == close_button_) {
+ frame()->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked);
+ } else if (sender == window_icon_) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(pbos): Figure out / document why this is Linux only. This needs a
+ // comment.
+ views::MenuRunner menu_runner(frame()->GetSystemMenuModel(),
+@@ -478,7 +478,7 @@ bool OpaqueBrowserFrameView::EverHasVisibleBackgroundT
+
+ OpaqueBrowserFrameView::FrameButtonStyle
+ OpaqueBrowserFrameView::GetFrameButtonStyle() const {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return FrameButtonStyle::kMdButton;
+ #else
+ return FrameButtonStyle::kImageButton;
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc
new file mode 100644
index 000000000000..0586d8bb467d
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_frame_opaque__browser__frame__view__platform__specific.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/frame/opaque_browser_frame_view_platform_specific.cc.orig 2019-04-30 22:22:36 UTC
++++ chrome/browser/ui/views/frame/opaque_browser_frame_view_platform_specific.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_FREEBSD)
+
+ // static
+ std::unique_ptr<OpaqueBrowserFrameViewPlatformSpecific>
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__builder.cc
new file mode 100644
index 000000000000..dc06c4f10c39
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:52:41 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_builder.cc
+@@ -62,7 +62,7 @@ void SystemMenuModelBuilder::BuildMenu(ui::SimpleMenuM
+
+ void SystemMenuModelBuilder::BuildSystemMenuForBrowserWindow(
+ ui::SimpleMenuModel* model) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ 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);
+@@ -75,7 +75,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForBrowser
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddCheckItemWithStringId(IDC_USE_SYSTEM_TITLE_BAR,
+ IDS_SHOW_WINDOW_DECORATIONS_MENU);
+@@ -113,7 +113,7 @@ void SystemMenuModelBuilder::BuildSystemMenuForAppOrPo
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ model->AddSeparator(ui::NORMAL_SEPARATOR);
+ model->AddItemWithStringId(IDC_CLOSE_WINDOW, IDS_CLOSE);
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc b/www/iridium/files/patch-chrome_browser_ui_views_frame_system__menu__model__delegate.cc
new file mode 100644
index 000000000000..0e2672a7af5f
--- /dev/null
+++ b/www/iridium/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 2019-06-04 18:55:18 UTC
++++ chrome/browser/ui/views/frame/system_menu_model_delegate.cc
+@@ -15,7 +15,7 @@
+ #include "components/sessions/core/tab_restore_service.h"
+ #include "ui/base/l10n/l10n_util.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "chrome/common/pref_names.h"
+ #include "components/prefs/pref_service.h"
+ #endif
+@@ -30,7 +30,7 @@ SystemMenuModelDelegate::SystemMenuModelDelegate(
+ SystemMenuModelDelegate::~SystemMenuModelDelegate() {}
+
+ bool SystemMenuModelDelegate::IsCommandIdChecked(int command_id) const {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (command_id == IDC_USE_SYSTEM_TITLE_BAR) {
+ PrefService* prefs = browser_->profile()->GetPrefs();
+ return !prefs->GetBoolean(prefs::kUseCustomChromeFrame);
+@@ -44,7 +44,7 @@ bool SystemMenuModelDelegate::IsCommandIdEnabled(int c
+ }
+
+ bool SystemMenuModelDelegate::IsCommandIdVisible(int command_id) const {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ bool is_maximized = browser_->window()->IsMaximized();
+ switch (command_id) {
+ case IDC_MAXIMIZE_WINDOW:
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_hung__renderer__view.cc b/www/iridium/files/patch-chrome_browser_ui_views_hung__renderer__view.cc
new file mode 100644
index 000000000000..45d717c16389
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_hung__renderer__view.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/hung_renderer_view.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/views/hung_renderer_view.cc
+@@ -417,7 +417,7 @@ bool HungRendererDialogView::Cancel() {
+ content::RenderProcessHost* rph =
+ hung_pages_table_model_->GetRenderWidgetHost()->GetProcess();
+ if (rph) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc b/www/iridium/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc
new file mode 100644
index 000000000000..98e130553ec0
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_tabs_new__tab__button.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/new_tab_button.cc.orig 2019-12-16 21:51:24 UTC
++++ chrome/browser/ui/views/tabs/new_tab_button.cc
+@@ -84,7 +84,7 @@ class NewTabButton::HighlightPathGenerator
+ NewTabButton::NewTabButton(TabStrip* tab_strip, views::ButtonListener* listener)
+ : views::ImageButton(listener), tab_strip_(tab_strip) {
+ set_animate_on_state_change(true);
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ set_triggerable_event_flags(triggerable_event_flags() |
+ ui::EF_MIDDLE_MOUSE_BUTTON);
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab.cc b/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab.cc
new file mode 100644
index 000000000000..beabaf0792a0
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/views/tabs/tab.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/views/tabs/tab.cc
+@@ -584,7 +584,7 @@ void Tab::MaybeUpdateHoverStatus(const ui::MouseEvent&
+ if (mouse_hovered_ || !GetWidget()->IsMouseEventsEnabled())
+ return;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/978134): Once Linux/CrOS widget transparency is solved, remove
diff --git a/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc b/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
new file mode 100644
index 000000000000..166112807cf0
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_views_tabs_tab__drag__controller.cc
@@ -0,0 +1,29 @@
+--- chrome/browser/ui/views/tabs/tab_drag_controller.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/views/tabs/tab_drag_controller.cc
+@@ -450,7 +450,7 @@ void TabDragController::Init(TabDragContext* source_co
+ // synchronous on desktop Linux, so use that.
+ // - Chrome OS
+ // Releasing capture on Ash cancels gestures so avoid it.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ can_release_capture_ = false;
+ #endif
+ start_point_in_screen_ = gfx::Point(source_view_offset, mouse_offset.y());
+@@ -895,7 +895,7 @@ TabDragController::DragBrowserToNewTabStrip(TabDragCon
+ else
+ SetCapture(target_context);
+
+-#if !defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if (!defined(OS_LINUX) || defined(OS_CHROMEOS)) && !defined(OS_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.
+@@ -2082,7 +2082,7 @@ TabDragController::Liveness TabDragController::GetLoca
+ if (dragged_window)
+ exclude.insert(dragged_window);
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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/www/iridium/files/patch-chrome_browser_ui_webui_about__ui.cc b/www/iridium/files/patch-chrome_browser_ui_webui_about__ui.cc
new file mode 100644
index 000000000000..473b7690ddfc
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_webui_about__ui.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/about_ui.cc.orig 2020-02-03 21:52:41 UTC
++++ chrome/browser/ui/webui/about_ui.cc
+@@ -561,7 +561,7 @@ std::string ChromeURLs() {
+ return html;
+ }
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::string AboutLinuxProxyConfig() {
+ std::string data;
+ AppendHeader(&data, 0,
+@@ -617,7 +617,7 @@ void AboutUIHTMLSource::StartDataRequest(
+ response =
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(idr);
+ }
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ } else if (source_name_ == chrome::kChromeUILinuxProxyConfigHost) {
+ response = AboutLinuxProxyConfig();
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc b/www/iridium/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
new file mode 100644
index 000000000000..6fed2b7df1f6
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_webui_chrome__web__ui__controller__factory.cc
@@ -0,0 +1,55 @@
+--- chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+@@ -224,11 +224,11 @@
+ #include "chrome/browser/ui/webui/conflicts/conflicts_ui.h"
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "chrome/browser/ui/webui/discards/discards_ui.h"
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "chrome/browser/ui/webui/sandbox/sandbox_internals_ui.h"
+ #endif
+
+@@ -337,7 +337,7 @@ bool IsAboutUI(const GURL& url) {
+ #if !defined(OS_ANDROID)
+ || url.host_piece() == chrome::kChromeUITermsHost
+ #endif
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ || url.host_piece() == chrome::kChromeUILinuxProxyConfigHost
+ #endif
+ #if defined(OS_CHROMEOS)
+@@ -669,7 +669,7 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ if (url.host_piece() == chrome::kChromeUINaClHost)
+ return &NewWebUI<NaClUI>;
+ #endif
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUITabModalConfirmDialogHost)
+ return &NewWebUI<ConstrainedWebDialogUI>;
+ #endif
+@@ -717,17 +717,17 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* we
+ return &NewWebUI<CastUI>;
+ }
+ #endif
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUISandboxHost) {
+ return &NewWebUI<SandboxInternalsUI>;
+ }
+ #endif
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUIDiscardsHost)
+ return &NewWebUI<DiscardsUI>;
+ #endif
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (url.host_piece() == chrome::kChromeUIBrowserSwitchHost)
+ return &NewWebUI<BrowserSwitchUI>;
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc b/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
new file mode 100644
index 000000000000..bf333383f3f1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/settings/appearance_handler.cc.orig 2019-10-21 19:06:24 UTC
++++ chrome/browser/ui/webui/settings/appearance_handler.cc
+@@ -27,7 +27,7 @@ void AppearanceHandler::RegisterMessages() {
+ "useDefaultTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseDefaultTheme,
+ base::Unretained(this)));
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_BSD) && !defined(OS_CHROMEOS)
+ web_ui()->RegisterMessageCallback(
+ "useSystemTheme",
+ base::BindRepeating(&AppearanceHandler::HandleUseSystemTheme,
+@@ -39,7 +39,7 @@ void AppearanceHandler::HandleUseDefaultTheme(const ba
+ ThemeServiceFactory::GetForProfile(profile_)->UseDefaultTheme();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_BSD) && !defined(OS_CHROMEOS)
+ void AppearanceHandler::HandleUseSystemTheme(const base::ListValue* args) {
+ if (profile_->IsSupervised())
+ NOTREACHED();
diff --git a/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h b/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h
new file mode 100644
index 000000000000..79f7e3050fff
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_webui_settings_appearance__handler.h
@@ -0,0 +1,11 @@
+--- chrome/browser/ui/webui/settings/appearance_handler.h.orig 2019-03-11 22:00:54 UTC
++++ chrome/browser/ui/webui/settings/appearance_handler.h
+@@ -36,7 +36,7 @@ class AppearanceHandler : public SettingsPageUIHandler
+ // Changes the UI theme of the browser to the default theme.
+ void HandleUseDefaultTheme(const base::ListValue* args);
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ // Changes the UI theme of the browser to the system (GTK+) theme.
+ void HandleUseSystemTheme(const base::ListValue* args);
+ #endif
diff --git a/www/iridium/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc b/www/iridium/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc
new file mode 100644
index 000000000000..8df5419b8753
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_ui_webui_settings_settings__localized__strings__provider.cc
@@ -0,0 +1,20 @@
+--- chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+@@ -333,7 +333,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ {"enterCustomWebAddress", IDS_SETTINGS_ENTER_CUSTOM_WEB_ADDRESS},
+ {"homeButtonDisabled", IDS_SETTINGS_HOME_BUTTON_DISABLED},
+ {"themes", IDS_SETTINGS_THEMES},
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ {"systemTheme", IDS_SETTINGS_SYSTEM_THEME},
+ {"useSystemTheme", IDS_SETTINGS_USE_SYSTEM_THEME},
+ {"classicTheme", IDS_SETTINGS_CLASSIC_THEME},
+@@ -348,7 +348,7 @@ void AddAppearanceStrings(content::WebUIDataSource* ht
+ {"changeHomePage", IDS_SETTINGS_CHANGE_HOME_PAGE},
+ {"themesGalleryUrl", IDS_THEMES_GALLERY_URL},
+ {"chooseFromWebStore", IDS_SETTINGS_WEB_STORE},
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS},
+ #endif
+ #if defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__file__handler__registration.cc b/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__file__handler__registration.cc
new file mode 100644
index 000000000000..abc103c98166
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__file__handler__registration.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/components/web_app_file_handler_registration.cc.orig 2020-02-07 12:36:50 UTC
++++ chrome/browser/web_applications/components/web_app_file_handler_registration.cc
+@@ -15,7 +15,7 @@ namespace web_app {
+ //
+ // Note: Because OS_LINUX includes OS_CHROMEOS be sure to use the stub on
+ // OS_CHROMEOS.
+-#if !defined(OS_WIN) && !(defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if !defined(OS_WIN) && !((defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS))
+ bool ShouldRegisterFileHandlersWithOs() {
+ return false;
+ }
diff --git a/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__shortcut.cc b/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__shortcut.cc
new file mode 100644
index 000000000000..934359b14459
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_web__applications_components_web__app__shortcut.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/components/web_app_shortcut.cc.orig 2020-03-17 09:41:50 UTC
++++ chrome/browser/web_applications/components/web_app_shortcut.cc
+@@ -35,7 +35,7 @@ namespace {
+ const int kDesiredIconSizesForShortcut[] = {16, 32, 128, 256, 512};
+ const size_t kNumDesiredIconSizesForShortcut =
+ base::size(kDesiredIconSizesForShortcut);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_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};
diff --git a/www/iridium/files/patch-chrome_browser_web__applications_extensions_bookmark__app__finalizer__utils.cc b/www/iridium/files/patch-chrome_browser_web__applications_extensions_bookmark__app__finalizer__utils.cc
new file mode 100644
index 000000000000..9b0d271a91c7
--- /dev/null
+++ b/www/iridium/files/patch-chrome_browser_web__applications_extensions_bookmark__app__finalizer__utils.cc
@@ -0,0 +1,11 @@
+--- chrome/browser/web_applications/extensions/bookmark_app_finalizer_utils.cc.orig 2019-10-30 15:54:13 UTC
++++ chrome/browser/web_applications/extensions/bookmark_app_finalizer_utils.cc
+@@ -15,7 +15,7 @@ namespace {
+
+ #if !defined(OS_CHROMEOS)
+ bool CanOsAddDesktopShortcuts() {
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/www/iridium/files/patch-chrome_common_BUILD.gn b/www/iridium/files/patch-chrome_common_BUILD.gn
new file mode 100644
index 000000000000..bf1e0b6e0415
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_BUILD.gn
@@ -0,0 +1,13 @@
+--- chrome/common/BUILD.gn.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/BUILD.gn
+@@ -272,6 +272,10 @@ static_library("common") {
+ public_deps += [ "//ppapi/shared_impl" ]
+ }
+
++ if (is_bsd) {
++ sources -= [ "component_flash_hint_file_linux.cc" ]
++ }
++
+ if (enable_extensions) {
+ sources += [
+ "cast_messages.cc",
diff --git a/www/iridium/files/patch-chrome_common_channel__info.h b/www/iridium/files/patch-chrome_common_channel__info.h
new file mode 100644
index 000000000000..b290d11bd40c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_channel__info.h
@@ -0,0 +1,11 @@
+--- chrome/common/channel_info.h.orig 2019-12-17 19:22:25 UTC
++++ chrome/common/channel_info.h
+@@ -55,7 +55,7 @@ version_info::Channel GetChannelByName(const std::stri
+ std::string GetChannelSuffixForDataDir();
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Returns the channel-specific filename of the desktop shortcut used to launch
+ // the browser.
+ std::string GetDesktopName(base::Environment* env);
diff --git a/www/iridium/files/patch-chrome_common_channel__info__posix.cc b/www/iridium/files/patch-chrome_common_channel__info__posix.cc
new file mode 100644
index 000000000000..11726bed5663
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_channel__info__posix.cc
@@ -0,0 +1,20 @@
+--- chrome/common/channel_info_posix.cc.orig 2020-02-03 21:52:41 UTC
++++ chrome/common/channel_info_posix.cc
+@@ -67,7 +67,7 @@ std::string GetChannelSuffixForDataDir() {
+ }
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ std::string GetDesktopName(base::Environment* env) {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ version_info::Channel product_channel(GetChannel());
+@@ -89,7 +89,7 @@ std::string GetDesktopName(base::Environment* env) {
+ return "chromium-browser.desktop";
+ #endif
+ }
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ version_info::Channel GetChannel() {
+ return GetChannelImpl(nullptr);
diff --git a/www/iridium/files/patch-chrome_common_chrome__features.cc b/www/iridium/files/patch-chrome_common_chrome__features.cc
new file mode 100644
index 000000000000..4591e746fab7
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__features.cc
@@ -0,0 +1,18 @@
+--- chrome/common/chrome_features.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/chrome_features.cc
+@@ -86,13 +86,13 @@ const base::Feature kAsyncDns {
+ #endif
+ };
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_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.
+ const base::Feature kBackgroundModeAllowRestart{
+ "BackgroundModeAllowRestart", base::FEATURE_DISABLED_BY_DEFAULT};
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Once the user declines a notification permission prompt in a WebContents,
+ // automatically dismiss subsequent prompts in the same WebContents, from any
diff --git a/www/iridium/files/patch-chrome_common_chrome__features.h b/www/iridium/files/patch-chrome_common_chrome__features.h
new file mode 100644
index 000000000000..d23bca53bf82
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__features.h
@@ -0,0 +1,15 @@
+--- chrome/common/chrome_features.h.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/chrome_features.h
+@@ -68,10 +68,10 @@ extern const base::Feature kAppServiceShelf;
+
+ COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kAsyncDns;
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ COMPONENT_EXPORT(CHROME_FEATURES)
+ extern const base::Feature kBackgroundModeAllowRestart;
+-#endif // defined(OS_WIN) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+
+ COMPONENT_EXPORT(CHROME_FEATURES)
+ extern const base::Feature kBlockRepeatedNotificationPermissionPrompts;
diff --git a/www/iridium/files/patch-chrome_common_chrome__paths.cc b/www/iridium/files/patch-chrome_common_chrome__paths.cc
new file mode 100644
index 000000000000..8f8695168ae5
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__paths.cc
@@ -0,0 +1,111 @@
+--- chrome/common/chrome_paths.cc.orig 2020-02-03 21:52:41 UTC
++++ chrome/common/chrome_paths.cc
+@@ -51,21 +51,21 @@ const base::FilePath::CharType kPepperFlashSystemBaseD
+ FILE_PATH_LITERAL("Internet Plug-Ins/PepperFlashPlayer");
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/google-chrome/extensions");
+ #else
+- FILE_PATH_LITERAL("/usr/share/chromium/extensions");
++ FILE_PATH_LITERAL("/usr/local/share/chromium/extensions");
+ #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
+ // The path to the hint file that tells the pepper plugin loader
+ // where it can find the latest component updated flash.
+ const base::FilePath::CharType kComponentUpdatedFlashHint[] =
+ FILE_PATH_LITERAL("latest-component-updated-flash");
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_LINUX) && BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
+ // The name of the hint file that tells the latest component updated Widevine
+@@ -204,7 +204,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ return false;
+ break;
+ case chrome::DIR_DEFAULT_DOWNLOADS_SAFE:
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ if (!GetUserDownloadsDirectorySafe(&cur))
+ return false;
+ break;
+@@ -495,6 +495,9 @@ bool PathProvider(int key, base::FilePath* result) {
+ case chrome::DIR_POLICY_FILES: {
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ cur = base::FilePath(FILE_PATH_LITERAL("/etc/opt/chrome/policies"));
++#elif defined(OS_BSD)
++ cur = base::FilePath(FILE_PATH_LITERAL(
++ "/usr/local/etc/chrome/policies"));
+ #else
+ cur = base::FilePath(FILE_PATH_LITERAL("/etc/chromium/policies"));
+ #endif
+@@ -502,7 +505,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ }
+ #endif
+ #if defined(OS_CHROMEOS) || \
+- (defined(OS_LINUX) && BUILDFLAG(CHROMIUM_BRANDING)) || defined(OS_MACOSX)
++ ((defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(CHROMIUM_BRANDING)) || defined(OS_MACOSX)
+ case chrome::DIR_USER_EXTERNAL_EXTENSIONS: {
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &cur))
+ return false;
+@@ -510,7 +513,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ break;
+ }
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS: {
+ cur = base::FilePath(kFilepathSinglePrefExtensions);
+ break;
+@@ -545,7 +548,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ #endif
+ break;
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ case chrome::DIR_NATIVE_MESSAGING:
+ #if defined(OS_MACOSX)
+ #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+@@ -559,6 +562,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 defined(OS_BSD)
++ cur = base::FilePath(FILE_PATH_LITERAL(
++ "/usr/local/etc/chrome/native-messaging-hosts"));
+ #else
+ cur = base::FilePath(FILE_PATH_LITERAL(
+ "/etc/chromium/native-messaging-hosts"));
+@@ -571,7 +577,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ return false;
+ cur = cur.Append(FILE_PATH_LITERAL("NativeMessagingHosts"));
+ break;
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ #if !defined(OS_ANDROID)
+ case chrome::DIR_GLOBAL_GCM_STORE:
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &cur))
+@@ -579,7 +585,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ cur = cur.Append(kGCMStoreDirname);
+ break;
+ #endif // !defined(OS_ANDROID)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case chrome::FILE_COMPONENT_FLASH_HINT:
+ if (!base::PathService::Get(
+ chrome::DIR_COMPONENT_UPDATED_PEPPER_FLASH_PLUGIN, &cur)) {
+@@ -587,7 +593,7 @@ bool PathProvider(int key, base::FilePath* result) {
+ }
+ cur = cur.Append(kComponentUpdatedFlashHint);
+ break;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ #if defined(OS_CHROMEOS)
+ case chrome::FILE_CHROME_OS_COMPONENT_FLASH:
+ cur = base::FilePath(kChromeOSComponentFlash);
diff --git a/www/iridium/files/patch-chrome_common_chrome__paths.h b/www/iridium/files/patch-chrome_common_chrome__paths.h
new file mode 100644
index 000000000000..703fb6677e76
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__paths.h
@@ -0,0 +1,42 @@
+--- chrome/common/chrome_paths.h.orig 2019-12-16 21:50:44 UTC
++++ chrome/common/chrome_paths.h
+@@ -53,7 +53,7 @@ enum {
+ // contains subdirectories.
+ #endif
+ #if defined(OS_CHROMEOS) || \
+- (defined(OS_LINUX) && BUILDFLAG(CHROMIUM_BRANDING)) || defined(OS_MACOSX)
++ ((defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(CHROMIUM_BRANDING)) || defined(OS_MACOSX)
+ 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
+@@ -61,7 +61,7 @@ enum {
+ // create it.
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ DIR_STANDALONE_EXTERNAL_EXTENSIONS, // Directory for 'per-extension'
+ // definition manifest files that
+ // describe extensions which are to be
+@@ -122,7 +122,7 @@ enum {
+ DIR_SUPERVISED_USER_INSTALLED_WHITELISTS, // Directory where sanitized
+ // supervised user whitelists are
+ // installed.
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ DIR_NATIVE_MESSAGING, // System directory where native messaging host
+ // manifest files are stored.
+ DIR_USER_NATIVE_MESSAGING, // Directory with Native Messaging Hosts
+@@ -137,10 +137,10 @@ enum {
+ DIR_GEN_TEST_DATA, // Directory where generated test data resides.
+ DIR_TEST_DATA, // Directory where unit test data resides.
+ DIR_TEST_TOOLS, // Directory where unit test tools reside.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ FILE_COMPONENT_FLASH_HINT, // A file in a known location that points to
+ // the component updated flash plugin.
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ #if defined(OS_CHROMEOS)
+ FILE_CHROME_OS_COMPONENT_FLASH, // The location of component updated Flash on
+ // Chrome OS.
diff --git a/www/iridium/files/patch-chrome_common_chrome__paths__internal.h b/www/iridium/files/patch-chrome_common_chrome__paths__internal.h
new file mode 100644
index 000000000000..9bf429302cd3
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__paths__internal.h
@@ -0,0 +1,11 @@
+--- chrome/common/chrome_paths_internal.h.orig 2019-07-24 18:58:13 UTC
++++ chrome/common/chrome_paths_internal.h
+@@ -45,7 +45,7 @@ void GetUserCacheDirectory(const base::FilePath& profi
+ // Get the path to the user's documents directory.
+ bool GetUserDocumentsDirectory(base::FilePath* result);
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ // Gets the path to a safe default download directory for a user.
+ bool GetUserDownloadsDirectorySafe(base::FilePath* result);
+ #endif
diff --git a/www/iridium/files/patch-chrome_common_chrome__switches.cc b/www/iridium/files/patch-chrome_common_chrome__switches.cc
new file mode 100644
index 000000000000..0cf96df2deef
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__switches.cc
@@ -0,0 +1,11 @@
+--- chrome/common/chrome_switches.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/chrome_switches.cc
+@@ -846,7 +846,7 @@ const char kAllowNaClFileHandleAPI[] = "allow-n
+ const char kAllowNaClSocketAPI[] = "allow-nacl-socket-api";
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ const char kEnableNewAppMenuIcon[] = "enable-new-app-menu-icon";
+
+ // Causes the browser to launch directly in guest mode.
diff --git a/www/iridium/files/patch-chrome_common_chrome__switches.h b/www/iridium/files/patch-chrome_common_chrome__switches.h
new file mode 100644
index 000000000000..957faae8a127
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_chrome__switches.h
@@ -0,0 +1,11 @@
+--- chrome/common/chrome_switches.h.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/chrome_switches.h
+@@ -261,7 +261,7 @@ extern const char kAllowNaClFileHandleAPI[];
+ extern const char kAllowNaClSocketAPI[];
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_BSD)
+ extern const char kEnableNewAppMenuIcon[];
+ extern const char kGuest[];
+ #endif
diff --git a/www/iridium/files/patch-chrome_common_extensions_api_api__sources.gni b/www/iridium/files/patch-chrome_common_extensions_api_api__sources.gni
new file mode 100644
index 000000000000..52d07bac4945
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_extensions_api_api__sources.gni
@@ -0,0 +1,11 @@
+--- chrome/common/extensions/api/api_sources.gni.orig 2020-02-03 21:52:41 UTC
++++ chrome/common/extensions/api/api_sources.gni
+@@ -113,7 +113,7 @@ if (is_chromeos) {
+ if (use_cups) {
+ schema_sources_ += [ "printing.idl" ]
+ }
+-} else if (is_linux || is_win) {
++} else if (is_linux || is_bsd || is_win) {
+ schema_sources_ += [ "input_ime.json" ]
+ }
+
diff --git a/www/iridium/files/patch-chrome_common_extensions_command.cc b/www/iridium/files/patch-chrome_common_extensions_command.cc
new file mode 100644
index 000000000000..d69c38703319
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_extensions_command.cc
@@ -0,0 +1,11 @@
+--- chrome/common/extensions/command.cc.orig 2019-04-30 22:22:37 UTC
++++ chrome/common/extensions/command.cc
+@@ -300,7 +300,7 @@ std::string Command::CommandPlatform() {
+ return values::kKeybindingPlatformMac;
+ #elif defined(OS_CHROMEOS)
+ return values::kKeybindingPlatformChromeOs;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return values::kKeybindingPlatformLinux;
+ #else
+ return "";
diff --git a/www/iridium/files/patch-chrome_common_features.gni b/www/iridium/files/patch-chrome_common_features.gni
new file mode 100644
index 000000000000..5af21971a15e
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_features.gni
@@ -0,0 +1,14 @@
+--- chrome/common/features.gni.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/features.gni
+@@ -49,9 +49,9 @@ declare_args() {
+ (is_desktop_linux && use_dbus) || is_chromeos
+
+ enable_one_click_signin =
+- is_win || is_mac || (is_linux && !is_chromeos && !is_chromecast)
++ is_win || is_mac || is_bsd || (is_linux && !is_chromeos && !is_chromecast)
+
+- enable_service_discovery = (enable_mdns && !is_android) || is_mac
++ enable_service_discovery = (enable_mdns && !is_android) || is_mac || is_bsd
+
+ # Enables use of the session service, which is enabled by default.
+ # Android stores them separately on the Java side.
diff --git a/www/iridium/files/patch-chrome_common_media_cdm__host__file__path.cc b/www/iridium/files/patch-chrome_common_media_cdm__host__file__path.cc
new file mode 100644
index 000000000000..0f28ca47dca6
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_media_cdm__host__file__path.cc
@@ -0,0 +1,11 @@
+--- chrome/common/media/cdm_host_file_path.cc.orig 2020-03-17 09:44:41 UTC
++++ chrome/common/media/cdm_host_file_path.cc
+@@ -98,7 +98,7 @@ void AddCdmHostFilePaths(
+ cdm_host_file_paths->emplace_back(chrome_framework_path,
+ chrome_framework_sig_path);
+
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+
+ base::FilePath chrome_exe_dir;
+ if (!base::PathService::Get(base::DIR_EXE, &chrome_exe_dir))
diff --git a/www/iridium/files/patch-chrome_common_pref__names.cc b/www/iridium/files/patch-chrome_common_pref__names.cc
new file mode 100644
index 000000000000..edf68e0cec56
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_pref__names.cc
@@ -0,0 +1,44 @@
+--- chrome/common/pref_names.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/pref_names.cc
+@@ -1059,7 +1059,7 @@ const char kForceYouTubeRestrict[] = "settings.force_y
+ // only using an account that belongs to one of the domains from this pref.
+ const char kAllowedDomainsForApps[] = "settings.allowed_domains_for_apps";
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Linux specific preference on whether we should match the system theme.
+ const char kUsesSystemTheme[] = "extensions.theme.use_system";
+ #endif
+@@ -1193,7 +1193,7 @@ const char kShowUpdatePromotionInfoBar[] =
+ "browser.show_update_promotion_info_bar";
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // 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).
+ const char kUseCustomChromeFrame[] = "browser.custom_chrome_frame";
+@@ -1621,7 +1621,7 @@ const char kDownloadDefaultDirectory[] = "download.def
+ // upgrade a unsafe location to a safe location.
+ const char kDownloadDirUpgraded[] = "download.directory_upgrade";
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ const char kOpenPdfDownloadInSystemReader[] =
+ "download.open_pdf_in_system_reader";
+ #endif
+@@ -1917,12 +1917,12 @@ const char kGloballyScopeHTTPAuthCacheEnabled[] =
+ const char kAmbientAuthenticationInPrivateModesEnabled[] =
+ "auth.ambient_auth_in_private_modes";
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ // Boolean that specifies whether OK-AS-DELEGATE flag from KDC is respected
+ // along with kAuthNegotiateDelegateWhitelist.
+ const char kAuthNegotiateDelegateByKdcPolicy[] =
+ "auth.negotiate_delegate_by_kdc_policy";
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ // Boolean that specifies whether NTLMv2 is enabled.
diff --git a/www/iridium/files/patch-chrome_common_pref__names.h b/www/iridium/files/patch-chrome_common_pref__names.h
new file mode 100644
index 000000000000..7f7af0082f1f
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_pref__names.h
@@ -0,0 +1,41 @@
+--- chrome/common/pref_names.h.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/pref_names.h
+@@ -334,7 +334,7 @@ extern const char kHistoryMenuPromoShown[];
+ extern const char kForceGoogleSafeSearch[];
+ extern const char kForceYouTubeRestrict[];
+ extern const char kAllowedDomainsForApps[];
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ extern const char kUsesSystemTheme[];
+ #endif
+ extern const char kCurrentThemePackFilename[];
+@@ -365,7 +365,7 @@ extern const char kDefaultBrowserSettingEnabled[];
+ #if defined(OS_MACOSX)
+ extern const char kShowUpdatePromotionInfoBar[];
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ extern const char kUseCustomChromeFrame[];
+ #endif
+ #if BUILDFLAG(ENABLE_PLUGINS)
+@@ -532,7 +532,7 @@ extern const char kAppWindowPlacement[];
+ extern const char kDownloadDefaultDirectory[];
+ extern const char kDownloadExtensionsToOpen[];
+ extern const char kDownloadDirUpgraded[];
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ extern const char kOpenPdfDownloadInSystemReader[];
+ #endif
+ #if defined(OS_ANDROID)
+@@ -744,9 +744,9 @@ extern const char kAllowCrossOriginAuthPrompt[];
+ extern const char kGloballyScopeHTTPAuthCacheEnabled[];
+ extern const char kAmbientAuthenticationInPrivateModesEnabled[];
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ extern const char kAuthNegotiateDelegateByKdcPolicy[];
+-#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
++#endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ extern const char kNtlmV2Enabled[];
diff --git a/www/iridium/files/patch-chrome_common_webui__url__constants.cc b/www/iridium/files/patch-chrome_common_webui__url__constants.cc
new file mode 100644
index 000000000000..c9a01fc94ffe
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_webui__url__constants.cc
@@ -0,0 +1,48 @@
+--- chrome/common/webui_url_constants.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/webui_url_constants.cc
+@@ -321,7 +321,7 @@ bool IsSystemWebUIHost(base::StringPiece host) {
+ const char kChromeUICastHost[] = "cast";
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ const char kChromeUIDiscardsHost[] = "discards";
+ const char kChromeUIDiscardsURL[] = "chrome://discards/";
+ const char kChromeUIHatsHost[] = "hats";
+@@ -332,17 +332,17 @@ const char kChromeUIHatsURL[] = "chrome://hats/";
+ const char kChromeUILinuxProxyConfigHost[] = "linux-proxy-config";
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ const char kChromeUISandboxHost[] = "sandbox";
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ const char kChromeUIBrowserSwitchHost[] = "browser-switch";
+ const char kChromeUIBrowserSwitchURL[] = "chrome://browser-switch/";
+ #endif
+
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if ((defined(OS_LINUX) || defined(OS_BSD)) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
+ const char kChromeUITabModalConfirmDialogHost[] = "tab-modal-confirm-dialog";
+ #endif
+
+@@ -608,13 +608,13 @@ const char* const kChromeHostURLs[] = {
+ kChromeUIInternetDetailDialogHost,
+ kChromeUIAssistantOptInHost,
+ #endif
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ kChromeUIDiscardsHost,
+ #endif
+ #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
+ kChromeUILinuxProxyConfigHost,
+ #endif
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ kChromeUISandboxHost,
+ #endif
+ #if defined(OS_WIN)
diff --git a/www/iridium/files/patch-chrome_common_webui__url__constants.h b/www/iridium/files/patch-chrome_common_webui__url__constants.h
new file mode 100644
index 000000000000..dc27881da387
--- /dev/null
+++ b/www/iridium/files/patch-chrome_common_webui__url__constants.h
@@ -0,0 +1,32 @@
+--- chrome/common/webui_url_constants.h.orig 2020-03-16 18:40:30 UTC
++++ chrome/common/webui_url_constants.h
+@@ -275,7 +275,7 @@ bool IsSystemWebUIHost(base::StringPiece host);
+ extern const char kChromeUICastHost[];
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kChromeUIDiscardsHost[];
+ extern const char kChromeUIDiscardsURL[];
+ extern const char kChromeUIHatsHost[];
+@@ -287,17 +287,17 @@ extern const char kChromeUIHatsURL[];
+ extern const char kChromeUILinuxProxyConfigHost[];
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ extern const char kChromeUISandboxHost[];
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ extern const char kChromeUIBrowserSwitchHost[];
+ extern const char kChromeUIBrowserSwitchURL[];
+ #endif
+
+-#if (defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
++#if ((defined(OS_LINUX) || defined(OS_BSD)) && defined(TOOLKIT_VIEWS)) || defined(USE_AURA)
+ extern const char kChromeUITabModalConfirmDialogHost[];
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_renderer_chrome__content__renderer__client.cc b/www/iridium/files/patch-chrome_renderer_chrome__content__renderer__client.cc
new file mode 100644
index 000000000000..e6be28220164
--- /dev/null
+++ b/www/iridium/files/patch-chrome_renderer_chrome__content__renderer__client.cc
@@ -0,0 +1,11 @@
+--- chrome/renderer/chrome_content_renderer_client.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/renderer/chrome_content_renderer_client.cc
+@@ -1053,7 +1053,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
+ }
+
+ case chrome::mojom::PluginStatus::kRestartRequired: {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ placeholder =
+ create_blocked_plugin(IDR_BLOCKED_PLUGIN_HTML,
+ l10n_util::GetStringFUTF16(
diff --git a/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc b/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc
new file mode 100644
index 000000000000..d77103710996
--- /dev/null
+++ b/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.cc
@@ -0,0 +1,29 @@
+--- chrome/renderer/pepper/pepper_flash_font_file_host.cc.orig 2019-03-11 22:00:54 UTC
++++ chrome/renderer/pepper/pepper_flash_font_file_host.cc
+@@ -15,7 +15,7 @@
+ #include "ppapi/proxy/ppapi_messages.h"
+ #include "ppapi/proxy/serialized_structs.h"
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #include "content/public/common/common_sandbox_support_linux.h"
+ #elif defined(OS_WIN)
+@@ -29,7 +29,7 @@ PepperFlashFontFileHost::PepperFlashFontFileHost(
+ const ppapi::proxy::SerializedFontDescription& description,
+ PP_PrivateFontCharset charset)
+ : ResourceHost(host->GetPpapiHost(), instance, resource) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The global SkFontConfigInterface is configured and initialized with a
+ // SkFontconfigInterface compatible font_service::FontLoader in
+ // RendererBlinkPlatformImpl (called from RenderThreadImpl::Init) at startup
+@@ -74,7 +74,7 @@ bool PepperFlashFontFileHost::GetFontData(uint32_t tab
+ void* buffer,
+ size_t* length) {
+ bool result = false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (font_file_.IsValid()) {
+ result = content::GetFontTable(font_file_.GetPlatformFile(), table,
+ 0 /* offset */,
diff --git a/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h b/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h
new file mode 100644
index 000000000000..6acbcf8fc2d9
--- /dev/null
+++ b/www/iridium/files/patch-chrome_renderer_pepper_pepper__flash__font__file__host.h
@@ -0,0 +1,20 @@
+--- chrome/renderer/pepper/pepper_flash_font_file_host.h.orig 2019-03-11 22:00:54 UTC
++++ chrome/renderer/pepper/pepper_flash_font_file_host.h
+@@ -14,7 +14,7 @@
+ #include "ppapi/c/private/pp_private_font_charset.h"
+ #include "ppapi/host/resource_host.h"
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/files/file.h"
+ #elif defined(OS_WIN)
+ #include "third_party/skia/include/core/SkRefCnt.h"
+@@ -50,7 +50,7 @@ class PepperFlashFontFileHost : public ppapi::host::Re
+ uint32_t table);
+ bool GetFontData(uint32_t table, void* buffer, size_t* length);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::File font_file_;
+ #elif defined(OS_WIN)
+ sk_sp<SkTypeface> typeface_;
diff --git a/www/iridium/files/patch-chrome_service_cloud__print_print__system.cc b/www/iridium/files/patch-chrome_service_cloud__print_print__system.cc
new file mode 100644
index 000000000000..8624cc6a5068
--- /dev/null
+++ b/www/iridium/files/patch-chrome_service_cloud__print_print__system.cc
@@ -0,0 +1,11 @@
+--- chrome/service/cloud_print/print_system.cc.orig 2019-03-11 22:00:54 UTC
++++ chrome/service/cloud_print/print_system.cc
+@@ -36,7 +36,7 @@ std::string PrintSystem::GenerateProxyId() {
+ return base::GenerateGUID();
+ }
+
+-#if defined(OS_LINUX) && !defined(USE_CUPS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(USE_CUPS)
+ scoped_refptr<PrintSystem> PrintSystem::CreateInstance(
+ const base::DictionaryValue*) {
+ return nullptr;
diff --git a/www/iridium/files/patch-chrome_test_BUILD.gn b/www/iridium/files/patch-chrome_test_BUILD.gn
new file mode 100644
index 000000000000..67e371b45b43
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_BUILD.gn
@@ -0,0 +1,11 @@
+--- chrome/test/BUILD.gn.orig 2020-03-16 18:40:30 UTC
++++ chrome/test/BUILD.gn
+@@ -6042,7 +6042,7 @@ test("chrome_app_unittests") {
+ "//components/safe_browsing:buildflags",
+ "//components/tracing",
+ ]
+- if (!is_fuchsia) {
++ if (!is_fuchsia && !is_bsd) {
+ # TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
+ deps += [ "//third_party/breakpad:client" ]
+ }
diff --git a/www/iridium/files/patch-chrome_test_base_chrome__test__launcher.cc b/www/iridium/files/patch-chrome_test_base_chrome__test__launcher.cc
new file mode 100644
index 000000000000..d09f2d1d0fd1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_base_chrome__test__launcher.cc
@@ -0,0 +1,20 @@
+--- chrome/test/base/chrome_test_launcher.cc.orig 2020-04-06 07:46:40 UTC
++++ chrome/test/base/chrome_test_launcher.cc
+@@ -59,7 +59,7 @@
+ #endif
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "chrome/browser/first_run/scoped_relaunch_chrome_browser_override.h"
+ #include "testing/gtest/include/gtest/gtest.h"
+ #endif
+@@ -221,7 +221,7 @@ int LaunchChromeTests(size_t parallel_jobs,
+ }
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Cause a test failure for any test that triggers an unexpected relaunch.
+ // Tests that fail here should likely be restructured to put the "before
+ // relaunch" code into a PRE_ test with its own
diff --git a/www/iridium/files/patch-chrome_test_base_in__process__browser__test.cc b/www/iridium/files/patch-chrome_test_base_in__process__browser__test.cc
new file mode 100644
index 000000000000..f4de4bb39b0c
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_base_in__process__browser__test.cc
@@ -0,0 +1,40 @@
+--- chrome/test/base/in_process_browser_test.cc.orig 2020-04-03 04:11:30 UTC
++++ chrome/test/base/in_process_browser_test.cc
+@@ -77,6 +77,10 @@
+ #include "chrome/test/base/scoped_bundle_swizzler_mac.h"
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <signal.h>
++#endif
++
+ #if defined(OS_WIN)
+ #include "base/win/scoped_com_initializer.h"
+ #include "base/win/windows_version.h"
+@@ -104,7 +108,7 @@
+ #include "ui/events/test/event_generator.h"
+ #endif // defined(OS_CHROMEOS)
+
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/views/test/test_desktop_screen_x11.h"
+ #endif
+
+@@ -253,7 +257,7 @@ void InProcessBrowserTest::SetUp() {
+ // Cookies). Without this on Mac and Linux, many tests will hang waiting for a
+ // user to approve KeyChain/kwallet access. On Windows this is not needed as
+ // OS APIs never block.
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ OSCryptMocker::SetUp();
+ #endif
+
+@@ -308,7 +312,7 @@ void InProcessBrowserTest::TearDown() {
+ com_initializer_.reset();
+ #endif
+ BrowserTestBase::TearDown();
+-#if defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ OSCryptMocker::TearDown();
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_test_base_interactive__ui__tests__main.cc b/www/iridium/files/patch-chrome_test_base_interactive__ui__tests__main.cc
new file mode 100644
index 000000000000..f80c31dcc8d4
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_base_interactive__ui__tests__main.cc
@@ -0,0 +1,25 @@
+--- chrome/test/base/interactive_ui_tests_main.cc.orig 2020-04-06 07:47:38 UTC
++++ chrome/test/base/interactive_ui_tests_main.cc
+@@ -16,7 +16,7 @@
+ #if defined(USE_AURA)
+ #include "ui/aura/test/ui_controls_factory_aura.h"
+ #include "ui/base/test/ui_controls_aura.h"
+-#if defined(USE_OZONE) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(USE_OZONE) && ((defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD))
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif
+ #if defined(USE_X11)
+@@ -54,11 +54,11 @@ class InteractiveUITestSuite : public ChromeTestSuite
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
+ ui_controls::InstallUIControlsAura(
+ aura::test::CreateUIControlsAura(nullptr));
+-#elif defined(USE_OZONE) && defined(OS_LINUX)
++#elif defined(USE_OZONE) && (defined(OS_LINUX) || defined(OS_BSD))
+ ui::OzonePlatform::InitParams params;
+ params.single_process = true;
+ ui::OzonePlatform::InitializeForUI(params);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ui_controls::InstallUIControlsAura(
+ views::test::CreateUIControlsDesktopAura());
+ #else
diff --git a/www/iridium/files/patch-chrome_test_base_test__browser__window.h b/www/iridium/files/patch-chrome_test_base_test__browser__window.h
new file mode 100644
index 000000000000..842f9dd09dd2
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_base_test__browser__window.h
@@ -0,0 +1,11 @@
+--- chrome/test/base/test_browser_window.h.orig 2020-04-06 07:48:42 UTC
++++ chrome/test/base/test_browser_window.h
+@@ -178,7 +178,7 @@ class TestBrowserWindow : public BrowserWindow {
+ bool is_source_keyboard) override {}
+
+ #if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) || \
+- defined(OS_LINUX)
++ defined(OS_LINUX) || defined(OS_BSD)
+ void ShowHatsBubble(const std::string& site_id) override {}
+ #endif
+
diff --git a/www/iridium/files/patch-chrome_test_base_testing__browser__process.h b/www/iridium/files/patch-chrome_test_base_testing__browser__process.h
new file mode 100644
index 000000000000..97a81118bddd
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_base_testing__browser__process.h
@@ -0,0 +1,13 @@
+--- chrome/test/base/testing_browser_process.h.orig 2019-09-09 21:55:11 UTC
++++ chrome/test/base/testing_browser_process.h
+@@ -116,8 +116,8 @@ class TestingBrowserProcess : public BrowserProcess {
+ DownloadRequestLimiter* download_request_limiter() override;
+ StartupData* startup_data() override;
+
+-#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+- void StartAutoupdateTimer() override {}
++#if (defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FREEBSD)) && !defined(OS_CHROMEOS)
++ void StartAutoupdateTimer() /*override*/ {}
+ #endif
+
+ component_updater::ComponentUpdateService* component_updater() override;
diff --git a/www/iridium/files/patch-chrome_test_chromedriver_chrome__launcher.cc b/www/iridium/files/patch-chrome_test_chromedriver_chrome__launcher.cc
new file mode 100644
index 000000000000..79b4cc08b788
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_chromedriver_chrome__launcher.cc
@@ -0,0 +1,13 @@
+--- chrome/test/chromedriver/chrome_launcher.cc.orig 2020-03-16 18:40:30 UTC
++++ chrome/test/chromedriver/chrome_launcher.cc
+@@ -69,6 +69,10 @@
+ #include "chrome/test/chromedriver/keycode_text_conversion.h"
+ #endif
+
++#if defined(OS_BSD)
++#include <sys/wait.h>
++#endif
++
+ namespace {
+
+ const char* const kCommonSwitches[] = {
diff --git a/www/iridium/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc b/www/iridium/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
new file mode 100644
index 000000000000..1aa645203816
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_chromedriver_chrome_chrome__finder.cc
@@ -0,0 +1,20 @@
+--- chrome/test/chromedriver/chrome/chrome_finder.cc.orig 2020-02-24 18:39:10 UTC
++++ chrome/test/chromedriver/chrome/chrome_finder.cc
+@@ -50,7 +50,7 @@ void GetApplicationDirs(std::vector<base::FilePath>* l
+ installation_locations[i].Append(L"Chromium\\Application"));
+ }
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ void GetApplicationDirs(std::vector<base::FilePath>* locations) {
+ // TODO: Respect users' PATH variables.
+ // Until then, we use an approximation of the most common defaults.
+@@ -136,7 +136,7 @@ bool FindChrome(base::FilePath* browser_exe) {
+ #if defined(OS_WIN) || defined(OS_MACOSX)
+ base::FilePath(chrome::kBrowserProcessExecutablePath),
+ base::FilePath(chrome::kBrowserProcessExecutablePathChromium)
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath("google-chrome"),
+ base::FilePath(chrome::kBrowserProcessExecutablePath),
+ base::FilePath(chrome::kBrowserProcessExecutablePathChromium),
diff --git a/www/iridium/files/patch-chrome_test_chromedriver_key__converter__unittest.cc b/www/iridium/files/patch-chrome_test_chromedriver_key__converter__unittest.cc
new file mode 100644
index 000000000000..81970dcbbec1
--- /dev/null
+++ b/www/iridium/files/patch-chrome_test_chromedriver_key__converter__unittest.cc
@@ -0,0 +1,38 @@
+--- chrome/test/chromedriver/key_converter_unittest.cc.orig 2020-03-23 14:46:39 UTC
++++ chrome/test/chromedriver/key_converter_unittest.cc
+@@ -278,7 +278,7 @@ TEST(KeyConverter, AllShorthandKeys) {
+ ->Generate(&key_events);
+ builder.Generate(&key_events);
+ builder.SetKeyCode(ui::VKEY_TAB);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ builder.SetText("\t", "\t")->Generate(&key_events);
+ #else
+ builder.SetText(std::string(), std::string());
+@@ -286,7 +286,7 @@ TEST(KeyConverter, AllShorthandKeys) {
+ key_events.push_back(builder.SetType(kKeyUpEventType)->Build());
+ #endif
+ builder.SetKeyCode(ui::VKEY_BACK);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ builder.SetText("\b", "\b")->Generate(&key_events);
+ #else
+ builder.SetText(std::string(), std::string());
+@@ -297,7 +297,7 @@ TEST(KeyConverter, AllShorthandKeys) {
+ CheckEventsReleaseModifiers("\n\r\n\t\b ", key_events);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Fails on bots: crbug.com/174962
+ #define MAYBE_AllEnglishKeyboardSymbols DISABLED_AllEnglishKeyboardSymbols
+ #else
+@@ -354,7 +354,7 @@ TEST(KeyConverter, AllEnglishKeyboardTextChars) {
+ TEST(KeyConverter, AllSpecialWebDriverKeysOnEnglishKeyboard) {
+ ui::ScopedKeyboardLayout keyboard_layout(ui::KEYBOARD_LAYOUT_ENGLISH_US);
+ const char kTextForKeys[] = {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-chromecast_browser_cast__browser__main__parts.cc b/www/iridium/files/patch-chromecast_browser_cast__browser__main__parts.cc
new file mode 100644
index 000000000000..06032792b186
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_browser_cast__browser__main__parts.cc
@@ -0,0 +1,56 @@
+--- chromecast/browser/cast_browser_main_parts.cc.orig 2020-03-16 18:40:30 UTC
++++ chromecast/browser/cast_browser_main_parts.cc
+@@ -74,7 +74,7 @@
+ #include "ui/base/ui_base_switches.h"
+ #include "ui/gl/gl_switches.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ base::FilePath GetApplicationFontsDir() {
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+@@ -279,7 +279,7 @@ base::FilePath GetApplicationFontsDir() {
+ }
+ }
+
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ } // namespace
+
+@@ -308,7 +308,7 @@ const DefaultCommandLineSwitch kDefaultSwitches[] = {
+ {cc::switches::kDisableThreadedAnimation, ""},
+ #endif // defined(OS_ANDROID)
+ #endif // BUILDFLAG(IS_CAST_AUDIO_ONLY)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -318,7 +318,7 @@ const DefaultCommandLineSwitch kDefaultSwitches[] = {
+ {switches::kEnableHardwareOverlays, "cast"},
+ #endif
+ #endif
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ // It's better to start GPU process on demand. For example, for TV platforms
+ // cast starts in background and can't render until TV switches to cast
+ // input.
+@@ -459,7 +459,7 @@ void CastBrowserMainParts::ToolkitInitialized() {
+ views_delegate_ = std::make_unique<CastViewsDelegate>();
+ #endif // defined(USE_AURA)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath dir_font = GetApplicationFontsDir();
+ const FcChar8 *dir_font_char8 = reinterpret_cast<const FcChar8*>(dir_font.value().data());
+ if (!FcConfigAppFontAddDir(gfx::GetGlobalFontConfig(), dir_font_char8)) {
diff --git a/www/iridium/files/patch-chromecast_browser_cast__content__browser__client.cc b/www/iridium/files/patch-chromecast_browser_cast__content__browser__client.cc
new file mode 100644
index 000000000000..ceca4fa67274
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_browser_cast__content__browser__client.cc
@@ -0,0 +1,11 @@
+--- chromecast/browser/cast_content_browser_client.cc.orig 2020-03-16 18:40:30 UTC
++++ chromecast/browser/cast_content_browser_client.cc
+@@ -448,7 +448,7 @@ void CastContentBrowserClient::AppendExtraCommandLineS
+ switches::kAudioOutputChannels));
+ }
+ } else if (process_type == switches::kGpuProcess) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-chromecast_browser_metrics_BUILD.gn b/www/iridium/files/patch-chromecast_browser_metrics_BUILD.gn
new file mode 100644
index 000000000000..e3c84406e9bf
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_browser_metrics_BUILD.gn
@@ -0,0 +1,11 @@
+--- chromecast/browser/metrics/BUILD.gn.orig 2019-07-24 18:58:17 UTC
++++ chromecast/browser/metrics/BUILD.gn
+@@ -32,7 +32,7 @@ cast_source_set("metrics") {
+ "//third_party/metrics_proto",
+ ]
+
+- if (is_linux) {
++ if (is_linux || is_bsd) {
+ sources += [
+ "external_metrics.cc",
+ "external_metrics.h",
diff --git a/www/iridium/files/patch-chromecast_browser_tts_tts__controller__impl.cc b/www/iridium/files/patch-chromecast_browser_tts_tts__controller__impl.cc
new file mode 100644
index 000000000000..2c4456163b65
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_browser_tts_tts__controller__impl.cc
@@ -0,0 +1,14 @@
+--- chromecast/browser/tts/tts_controller_impl.cc.orig 2019-03-11 22:00:56 UTC
++++ chromecast/browser/tts/tts_controller_impl.cc
+@@ -390,7 +390,11 @@ int TtsControllerImpl::QueueSize() {
+ }
+
+ TtsPlatformImpl* TtsControllerImpl::GetPlatformImpl() {
++#if defined(OS_BSD)
++ return NULL;
++#else
+ return platform_impl_.get();
++#endif // defined(OS_BSD)
+ }
+
+ std::string TtsControllerImpl::GetApplicationLocale() const {
diff --git a/www/iridium/files/patch-chromecast_external__mojo_public_cpp_external__mojo__broker.cc b/www/iridium/files/patch-chromecast_external__mojo_public_cpp_external__mojo__broker.cc
new file mode 100644
index 000000000000..381734887dcb
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_external__mojo_public_cpp_external__mojo__broker.cc
@@ -0,0 +1,20 @@
+--- chromecast/external_mojo/public/cpp/external_mojo_broker.cc.orig 2020-02-03 21:52:43 UTC
++++ chromecast/external_mojo/public/cpp/external_mojo_broker.cc
+@@ -7,7 +7,7 @@
+ #include <map>
+ #include <utility>
+
+-#if OS_LINUX
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/stat.h>
+ #endif
+
+@@ -393,7 +393,7 @@ ExternalMojoBroker::ExternalMojoBroker(const std::stri
+ named_channel.TakeServerEndpoint();
+ DCHECK(server_endpoint.is_valid());
+
+-#if OS_LINUX
++#if defined(OS_LINUX) || defined(OS_BSD)
+ chmod(broker_path.c_str(), 0770);
+ #endif
+
diff --git a/www/iridium/files/patch-chromecast_media_base_monotonic__clock.cc b/www/iridium/files/patch-chromecast_media_base_monotonic__clock.cc
new file mode 100644
index 000000000000..d141e1f0a1cb
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_media_base_monotonic__clock.cc
@@ -0,0 +1,23 @@
+--- chromecast/media/base/monotonic_clock.cc.orig 2019-10-30 15:55:35 UTC
++++ chromecast/media/base/monotonic_clock.cc
+@@ -9,9 +9,9 @@
+ #include "base/time/time.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "chromecast/media/base/buildflags.h"
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_FUCHSIA)
+ #include <zircon/syscalls.h>
+@@ -20,7 +20,7 @@
+ namespace chromecast {
+ namespace media {
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ int64_t MonotonicClockNow() {
+ timespec now = {0, 0};
+ #if BUILDFLAG(MEDIA_CLOCK_MONOTONIC_RAW)
diff --git a/www/iridium/files/patch-chromecast_renderer_cast__content__renderer__client.cc b/www/iridium/files/patch-chromecast_renderer_cast__content__renderer__client.cc
new file mode 100644
index 000000000000..079d79856b84
--- /dev/null
+++ b/www/iridium/files/patch-chromecast_renderer_cast__content__renderer__client.cc
@@ -0,0 +1,11 @@
+--- chromecast/renderer/cast_content_renderer_client.cc.orig 2020-03-17 09:46:13 UTC
++++ chromecast/renderer/cast_content_renderer_client.cc
+@@ -208,7 +208,7 @@ void CastContentRendererClient::RenderFrameCreated(
+ dispatcher->OnRenderFrameCreated(render_frame);
+ #endif
+
+-#if defined(OS_LINUX) && defined(USE_OZONE)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_OZONE)
+ // JsChannelBindings destroys itself when the RenderFrame is destroyed.
+ JsChannelBindings::Create(render_frame);
+ #endif
diff --git a/www/iridium/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc b/www/iridium/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc
new file mode 100644
index 000000000000..f9da88b9683c
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_content_renderer_password__form__conversion__utils.cc
@@ -0,0 +1,14 @@
+--- components/autofill/content/renderer/password_form_conversion_utils.cc.orig 2019-12-16 21:50:45 UTC
++++ components/autofill/content/renderer/password_form_conversion_utils.cc
+@@ -19,7 +19,11 @@
+ #include "third_party/blink/public/web/web_form_control_element.h"
+ #include "third_party/blink/public/web/web_input_element.h"
+ #include "third_party/blink/public/web/web_local_frame.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "url/gurl.h"
+
+ using blink::WebElement;
diff --git a/www/iridium/files/patch-components_autofill_core_browser_autofill__experiments.cc b/www/iridium/files/patch-components_autofill_core_browser_autofill__experiments.cc
new file mode 100644
index 000000000000..294953ed5551
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_core_browser_autofill__experiments.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/browser/autofill_experiments.cc.orig 2019-12-16 21:50:45 UTC
++++ components/autofill/core/browser/autofill_experiments.cc
+@@ -233,7 +233,7 @@ bool IsAutofillNoLocalSaveOnUploadSuccessExperimentEna
+ }
+
+ bool OfferStoreUnmaskedCards(bool is_off_the_record) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // The checkbox can be forced on with a flag, but by default we don't store
+ // on Linux due to lack of system keychain integration. See crbug.com/162735
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/www/iridium/files/patch-components_autofill_core_browser_autofill__external__delegate.cc b/www/iridium/files/patch-components_autofill_core_browser_autofill__external__delegate.cc
new file mode 100644
index 000000000000..25ba63628ba8
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_core_browser_autofill__external__delegate.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/browser/autofill_external_delegate.cc.orig 2020-03-16 18:40:30 UTC
++++ components/autofill/core/browser/autofill_external_delegate.cc
+@@ -118,7 +118,7 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
+
+ // Append the "Hide Suggestions" menu item for only Autofill Address and
+ // Autocomplete popups.
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || \
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ if (base::FeatureList::IsEnabled(
+ features::kAutofillEnableHideSuggestionsUI)) {
diff --git a/www/iridium/files/patch-components_autofill_core_browser_personal__data__manager.cc b/www/iridium/files/patch-components_autofill_core_browser_personal__data__manager.cc
new file mode 100644
index 000000000000..76d3e7dee3ed
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_core_browser_personal__data__manager.cc
@@ -0,0 +1,15 @@
+--- components/autofill/core/browser/personal_data_manager.cc.orig 2020-03-16 18:40:30 UTC
++++ components/autofill/core/browser/personal_data_manager.cc
+@@ -1856,10 +1856,10 @@ bool PersonalDataManager::IsServerCard(const CreditCar
+
+ bool PersonalDataManager::ShouldShowCardsFromAccountOption() const {
+ // The feature is only for Linux, Windows and Mac.
+-#if (!defined(OS_LINUX) && !defined(OS_WIN) && !defined(OS_MACOSX)) || \
++#if (!defined(OS_LINUX) && !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)) || \
+ defined(OS_CHROMEOS)
+ return false;
+-#endif // (!defined(OS_LINUX) && !defined(OS_WIN) && !defined(OS_MACOSX)) ||
++#endif // (!defined(OS_LINUX) && !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_BSD)) ||
+ // defined(OS_CHROMEOS)
+
+ // This option should only be shown for users that have not enabled the Sync
diff --git a/www/iridium/files/patch-components_autofill_core_common_autofill__payments__features.cc b/www/iridium/files/patch-components_autofill_core_common_autofill__payments__features.cc
new file mode 100644
index 000000000000..016f6de85d3c
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_core_common_autofill__payments__features.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/common/autofill_payments_features.cc.orig 2020-03-16 18:40:30 UTC
++++ components/autofill/core/common/autofill_payments_features.cc
+@@ -122,7 +122,7 @@ const base::Feature kAutofillUpstreamEditableExpiratio
+
+ bool ShouldShowImprovedUserConsentForCreditCardSave() {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // The new user consent UI is fully launched on MacOS, Windows and Linux.
+ return true;
+ #endif
diff --git a/www/iridium/files/patch-components_autofill_core_common_autofill__util.cc b/www/iridium/files/patch-components_autofill_core_common_autofill__util.cc
new file mode 100644
index 000000000000..f4cdea27b407
--- /dev/null
+++ b/www/iridium/files/patch-components_autofill_core_common_autofill__util.cc
@@ -0,0 +1,11 @@
+--- components/autofill/core/common/autofill_util.cc.orig 2019-09-09 21:55:14 UTC
++++ components/autofill/core/common/autofill_util.cc
+@@ -213,7 +213,7 @@ bool SanitizedFieldIsEmpty(const base::string16& value
+ }
+
+ bool ShouldAutoselectFirstSuggestionOnArrowDown() {
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/www/iridium/files/patch-components_content__settings_core_browser_website__settings__registry.cc b/www/iridium/files/patch-components_content__settings_core_browser_website__settings__registry.cc
new file mode 100644
index 000000000000..3c85edbf2e08
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:00:56 UTC
++++ components/content_settings/core/browser/website_settings_registry.cc
+@@ -66,7 +66,7 @@ const WebsiteSettingsInfo* WebsiteSettingsRegistry::Re
+ #if defined(OS_WIN)
+ if (!(platform & PLATFORM_WINDOWS))
+ return nullptr;
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (!(platform & PLATFORM_LINUX))
+ return nullptr;
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/www/iridium/files/patch-components_cookie__config_cookie__store__util.cc b/www/iridium/files/patch-components_cookie__config_cookie__store__util.cc
new file mode 100644
index 000000000000..871d1f936cc4
--- /dev/null
+++ b/www/iridium/files/patch-components_cookie__config_cookie__store__util.cc
@@ -0,0 +1,24 @@
+--- components/cookie_config/cookie_store_util.cc.orig 2019-03-11 22:00:56 UTC
++++ components/cookie_config/cookie_store_util.cc
+@@ -11,7 +11,7 @@
+
+ namespace cookie_config {
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ namespace {
+
+ // Use the operating system's mechanisms to encrypt cookies before writing
+@@ -63,10 +63,10 @@ base::LazyInstance<CookieOSCryptoDelegate>::Destructor
+ net::CookieCryptoDelegate* GetCookieCryptoDelegate() {
+ return g_cookie_crypto_delegate.Pointer();
+ }
+-#else // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#else // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ net::CookieCryptoDelegate* GetCookieCryptoDelegate() {
+ return NULL;
+ }
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ } // namespace cookie_config
diff --git a/www/iridium/files/patch-components_crash_content_app_BUILD.gn b/www/iridium/files/patch-components_crash_content_app_BUILD.gn
new file mode 100644
index 000000000000..2d01264b0bad
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_content_app_BUILD.gn
@@ -0,0 +1,52 @@
+--- components/crash/content/app/BUILD.gn.orig 2020-03-16 18:40:30 UTC
++++ components/crash/content/app/BUILD.gn
+@@ -49,17 +49,20 @@ static_library("app") {
+ "crashpad_win.cc",
+ ]
+
+- if (is_mac || is_win || is_android || is_linux) {
++ if ((is_mac || is_win || is_android || is_linux) && !is_bsd) {
+ sources += [ "crashpad.cc" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "breakpad_linux.cc",
+ "breakpad_linux.h",
+ "breakpad_linux_impl.h",
+ ]
+ }
++ if (is_bsd) {
++ sources -= [ "crashpad_linux.cc" ]
++ }
+
+ defines = [ "CRASH_IMPLEMENTATION" ]
+
+@@ -69,7 +72,7 @@ static_library("app") {
+ "//build:branding_buildflags",
+ ]
+
+- if (is_mac || is_win || is_android || is_linux) {
++ if ((is_mac || is_win || is_android || is_linux) && !is_bsd) {
+ deps += [
+ "//third_party/crashpad/crashpad/client",
+ "//third_party/crashpad/crashpad/util",
+@@ -95,7 +98,7 @@ static_library("app") {
+ ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ deps += [ "//third_party/breakpad:client" ]
+ }
+
+@@ -126,7 +129,7 @@ static_library("app") {
+ libs = [ "log" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps = [ "//third_party/crashpad/crashpad/handler:crashpad_handler" ]
+ }
+ }
diff --git a/www/iridium/files/patch-components_crash_content_app_crashpad.cc b/www/iridium/files/patch-components_crash_content_app_crashpad.cc
new file mode 100644
index 000000000000..f709f5f3087d
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_content_app_crashpad.cc
@@ -0,0 +1,43 @@
+--- components/crash/content/app/crashpad.cc.orig 2019-04-30 22:22:41 UTC
++++ components/crash/content/app/crashpad.cc
+@@ -104,6 +104,12 @@ void InitializeCrashpadImpl(bool initial_client,
+ const base::FilePath& exe_path,
+ const std::vector<std::string>& initial_arguments,
+ bool embedded_handler) {
++
++#if defined(OS_BSD)
++ NOTIMPLEMENTED();
++ return;
++#endif
++
+ static bool initialized = false;
+ DCHECK(!initialized);
+ initialized = true;
+@@ -124,7 +130,7 @@ void InitializeCrashpadImpl(bool initial_client,
+ DCHECK(browser_process || process_type == "Chrome Installer" ||
+ process_type == "notification-helper" ||
+ process_type == "GCPW Installer" || process_type == "GCPW DLL");
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ DCHECK(browser_process);
+ #else
+ #error Port.
+@@ -192,7 +198,7 @@ void InitializeCrashpadImpl(bool initial_client,
+ // other "main, first process" to initialize things. There is no "relauncher"
+ // on Windows, so this is synonymous with initial_client.
+ const bool should_initialize_database_and_set_upload_policy = initial_client;
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ const bool should_initialize_database_and_set_upload_policy = browser_process;
+ #endif
+ if (should_initialize_database_and_set_upload_policy) {
+@@ -272,7 +278,9 @@ bool GetUploadsEnabled() {
+
+ #if !defined(OS_ANDROID)
+ void DumpWithoutCrashing() {
++#if !defined(OS_BSD)
+ CRASHPAD_SIMULATE_CRASH();
++#endif
+ }
+ #endif
+
diff --git a/www/iridium/files/patch-components_crash_content_app_crashpad.h b/www/iridium/files/patch-components_crash_content_app_crashpad.h
new file mode 100644
index 000000000000..caf10f1a4f6a
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_content_app_crashpad.h
@@ -0,0 +1,66 @@
+--- components/crash/content/app/crashpad.h.orig 2019-12-19 16:46:22 UTC
++++ components/crash/content/app/crashpad.h
+@@ -22,7 +22,7 @@
+ #include <windows.h>
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <signal.h>
+ #endif
+
+@@ -37,7 +37,7 @@ class CrashReportDatabase;
+
+ namespace crash_reporter {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(jperaza): Remove kEnableCrashpad and IsCrashpadEnabled() when Crashpad
+ // is fully enabled on Linux.
+ extern const char kEnableCrashpad[];
+@@ -146,11 +146,11 @@ void RequestSingleCrashUpload(const std::string& local
+
+ void DumpWithoutCrashing();
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Logs message and immediately crashes the current process without triggering a
+ // crash dump.
+ void CrashWithoutDumping(const std::string& message);
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ // Returns the Crashpad database path, only valid in the browser.
+ base::FilePath GetCrashpadDatabasePath();
+@@ -188,7 +188,7 @@ bool DumpWithoutCrashingForClient(CrashReporterClient*
+ void WhitelistMemoryRange(void* begin, size_t size);
+ #endif // OS_ANDROID
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Install a handler that gets a chance to handle faults before Crashpad. This
+ // is used by V8 for trap-based bounds checks.
+ void SetFirstChanceExceptionHandler(bool (*handler)(int, siginfo_t*, void*));
+@@ -196,7 +196,7 @@ void SetFirstChanceExceptionHandler(bool (*handler)(in
+ // Gets the socket and process ID of the Crashpad handler connected to this
+ // process, valid if this function returns `true`.
+ bool GetHandlerSocket(int* sock, pid_t* pid);
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ namespace internal {
+
+@@ -212,11 +212,11 @@ DWORD WINAPI DumpProcessForHungInputThread(void* param
+
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Starts the handler process with an initial client connected on fd.
+ // Returns `true` on success.
+ bool StartHandlerForClient(int fd);
+-#endif // OS_LINUX || OS_ANDROID
++#endif // OS_LINUX || OS_ANDROID || OS_BSD
+
+ // The platform-specific portion of InitializeCrashpad(). On Windows, if
+ // |user_data_dir| is non-empty, the user data directory will be passed to the
diff --git a/www/iridium/files/patch-components_crash_content_app_crashpad__linux.cc b/www/iridium/files/patch-components_crash_content_app_crashpad__linux.cc
new file mode 100644
index 000000000000..20d5d6295eb7
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_content_app_crashpad__linux.cc
@@ -0,0 +1,24 @@
+--- components/crash/content/app/crashpad_linux.cc.orig 2020-03-16 18:39:48 UTC
++++ components/crash/content/app/crashpad_linux.cc
+@@ -5,7 +5,9 @@
+ #include "components/crash/content/app/crashpad.h"
+
+ #include <pthread.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+
+ #include <limits>
+
+@@ -67,9 +69,11 @@ void SetPtracerAtFork() {
+ if (!GetHandlerSocket(nullptr, &pid)) {
+ return;
+ }
++#if !defined(OS_BSD)
+ if (pid > 0 && prctl(PR_SET_PTRACER, pid, 0, 0, 0) != 0) {
+ PLOG(ERROR) << "prctl";
+ }
++#endif
+ }
+
+ namespace internal {
diff --git a/www/iridium/files/patch-components_crash_content_browser_BUILD.gn b/www/iridium/files/patch-components_crash_content_browser_BUILD.gn
new file mode 100644
index 000000000000..6c5e78455e0f
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_content_browser_BUILD.gn
@@ -0,0 +1,27 @@
+--- components/crash/content/browser/BUILD.gn.orig 2019-03-11 22:00:56 UTC
++++ components/crash/content/browser/BUILD.gn
+@@ -28,7 +28,7 @@ source_set("browser") {
+ "//content/public/common",
+ ]
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android) {
+ set_sources_assignment_filter([])
+
+ # Want this file on both Linux and Android.
+@@ -42,13 +42,13 @@ source_set("browser") {
+ deps += [ "//third_party/crashpad/crashpad/client" ]
+ }
+
+- if (!is_android) {
++ if (!is_android && !is_bsd) {
+ deps += [ "//third_party/breakpad:client" ]
+ }
+
+ # This is not in the GYP build but this target includes breakpad client
+ # headers, so add the dependency here.
+- if ((is_posix && !is_ios) || is_fuchsia) {
++ if ((is_posix && !is_ios && !is_bsd) || is_fuchsia) {
+ configs += [ "//third_party/breakpad:client_config" ]
+ public_configs = [ "//third_party/breakpad:client_config" ]
+ }
diff --git a/www/iridium/files/patch-components_crash_core_common_BUILD.gn b/www/iridium/files/patch-components_crash_core_common_BUILD.gn
new file mode 100644
index 000000000000..b7c5ab969a32
--- /dev/null
+++ b/www/iridium/files/patch-components_crash_core_common_BUILD.gn
@@ -0,0 +1,31 @@
+--- components/crash/core/common/BUILD.gn.orig 2020-03-16 18:39:48 UTC
++++ components/crash/core/common/BUILD.gn
+@@ -7,7 +7,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") {
+@@ -104,7 +104,9 @@ target(crash_key_target_type, "crash_key_lib") {
+ ]
+ }
+
+- deps += [ "//third_party/breakpad:client" ]
++ if (!is_bsd) {
++ deps += [ "//third_party/breakpad:client" ]
++ }
+ if (use_combined_annotations) {
+ public_deps += [ "//third_party/crashpad/crashpad/client" ]
+ }
+@@ -167,7 +169,7 @@ source_set("unit_tests") {
+ sources += [ "objc_zombie_unittest.mm" ]
+ }
+
+- if (!is_mac && !is_ios && !is_win && !is_fuchsia && !is_android) {
++ if (!is_mac && !is_ios && !is_win && !is_fuchsia && !is_android && !is_bsd) {
+ include_dirs = [ "//third_party/breakpad/breakpad/src/" ]
+ sources += [ "crash_key_breakpad_unittest.cc" ]
+ }
diff --git a/www/iridium/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc b/www/iridium/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc
new file mode 100644
index 000000000000..def54d6eaffa
--- /dev/null
+++ b/www/iridium/files/patch-components_discardable__memory_service_discardable__shared__memory__manager.cc
@@ -0,0 +1,20 @@
+--- components/discardable_memory/service/discardable_shared_memory_manager.cc.orig 2020-03-16 18:40:30 UTC
++++ components/discardable_memory/service/discardable_shared_memory_manager.cc
+@@ -33,7 +33,7 @@
+ #include "components/discardable_memory/common/discardable_shared_memory_heap.h"
+ #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/files/file_path.h"
+ #include "base/files/file_util.h"
+ #include "base/metrics/histogram_macros.h"
+@@ -182,7 +182,7 @@ int64_t GetDefaultMemoryLimit() {
+ max_default_memory_limit /= 8;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::FilePath shmem_dir;
+ if (base::GetShmemTempDir(false, &shmem_dir)) {
+ int64_t shmem_dir_amount_of_free_space =
diff --git a/www/iridium/files/patch-components_download_internal_common_base__file.cc b/www/iridium/files/patch-components_download_internal_common_base__file.cc
new file mode 100644
index 000000000000..dbb0a0dd18dd
--- /dev/null
+++ b/www/iridium/files/patch-components_download_internal_common_base__file.cc
@@ -0,0 +1,20 @@
+--- components/download/internal/common/base_file.cc.orig 2019-12-16 21:50:45 UTC
++++ components/download/internal/common/base_file.cc
+@@ -603,7 +603,7 @@ GURL GetEffectiveAuthorityURL(const GURL& source_url,
+
+ } // namespace
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ DownloadInterruptReason BaseFile::AnnotateWithSourceInformationSync(
+ const std::string& client_guid,
+@@ -621,7 +621,7 @@ DownloadInterruptReason BaseFile::AnnotateWithSourceIn
+
+ return QuarantineFileResultToReason(result);
+ }
+-#else // !OS_WIN && !OS_MACOSX && !OS_LINUX
++#else // !OS_WIN && !OS_MACOSX && !OS_LINUX && !OS_BSD
+ DownloadInterruptReason BaseFile::AnnotateWithSourceInformationSync(
+ const std::string& client_guid,
+ const GURL& source_url,
diff --git a/www/iridium/files/patch-components_feature__engagement_public_event__constants.cc b/www/iridium/files/patch-components_feature__engagement_public_event__constants.cc
new file mode 100644
index 000000000000..ea4af4e91c50
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_event__constants.cc
@@ -0,0 +1,27 @@
+--- components/feature_engagement/public/event_constants.cc.orig 2020-02-03 21:52:44 UTC
++++ components/feature_engagement/public/event_constants.cc
+@@ -12,12 +12,12 @@ namespace feature_engagement {
+ namespace events {
+
+ #if defined(OS_IOS) || defined(OS_WIN) || defined(OS_MACOSX) || \
+- defined(OS_LINUX) || defined(OS_CHROMEOS)
++ defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ const char kNewTabOpened[] = "new_tab_opened";
+ #endif // defined(OS_IOS) || defined(OS_WIN) || defined(OS_MACOSX) ||
+- // defined(OS_LINUX) || defined(OS_CHROMEOS)
++ // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ const char kReopenTabConditionsMet[] = "reopen_tab_conditions_met";
+ const char kTabReopened[] = "tab_reopened";
+@@ -42,7 +42,7 @@ const char kIncognitoWindowOpened[] = "incognito_windo
+ const char kIncognitoWindowSessionTimeMet[] =
+ "incognito_window_session_time_met";
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #if defined(OS_IOS)
diff --git a/www/iridium/files/patch-components_feature__engagement_public_event__constants.h b/www/iridium/files/patch-components_feature__engagement_public_event__constants.h
new file mode 100644
index 000000000000..96b274df41fb
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_event__constants.h
@@ -0,0 +1,30 @@
+--- components/feature_engagement/public/event_constants.h.orig 2020-02-03 21:52:44 UTC
++++ components/feature_engagement/public/event_constants.h
+@@ -14,15 +14,15 @@ namespace events {
+
+ // Desktop and IOS.
+ #if defined(OS_IOS) || defined(OS_WIN) || defined(OS_MACOSX) || \
+- defined(OS_LINUX) || defined(OS_CHROMEOS)
++ defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ // The user has explicitly opened a new tab via an entry point from inside of
+ // Chrome.
+ extern const char kNewTabOpened[];
+ #endif // defined(OS_IOS) || defined(OS_WIN) || defined(OS_MACOSX) ||
+- // defined(OS_LINUX) || defined(OS_CHROMEOS)
++ // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+
+ // Desktop
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ // All conditions for reopen closed tab IPH were met. Since this IPH needs to
+ // track user events (opening/closing tabs, focusing the omnibox, etc) on the
+@@ -80,7 +80,7 @@ extern const char kIncognitoWindowOpened[];
+ extern const char kIncognitoWindowSessionTimeMet[];
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #if defined(OS_IOS)
diff --git a/www/iridium/files/patch-components_feature__engagement_public_feature__constants.cc b/www/iridium/files/patch-components_feature__engagement_public_feature__constants.cc
new file mode 100644
index 000000000000..699be09ed7b4
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_feature__constants.cc
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_constants.cc.orig 2020-02-03 21:53:30 UTC
++++ components/feature_engagement/public/feature_constants.cc
+@@ -14,7 +14,7 @@ const base::Feature kIPHDemoMode{"IPH_DemoMode",
+ const base::Feature kIPHDummyFeature{"IPH_Dummy",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ const base::Feature kIPHFocusModeFeature{"IPH_FocusMode",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+@@ -33,7 +33,7 @@ const base::Feature kIPHIncognitoWindowFeature{
+ const base::Feature kIPHNewTabFeature{"IPH_NewTab",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ #if defined(OS_ANDROID)
diff --git a/www/iridium/files/patch-components_feature__engagement_public_feature__constants.h b/www/iridium/files/patch-components_feature__engagement_public_feature__constants.h
new file mode 100644
index 000000000000..415b6f1d8c71
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_feature__constants.h
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_constants.h.orig 2020-02-03 21:53:30 UTC
++++ components/feature_engagement/public/feature_constants.h
+@@ -17,7 +17,7 @@ extern const base::Feature kIPHDemoMode;
+ // A feature to ensure all arrays can contain at least one feature.
+ extern const base::Feature kIPHDummyFeature;
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ extern const base::Feature kIPHFocusModeFeature;
+ extern const base::Feature kIPHGlobalMediaControlsFeature;
+@@ -29,7 +29,7 @@ extern const base::Feature kIPHBookmarkFeature;
+ extern const base::Feature kIPHIncognitoWindowFeature;
+ extern const base::Feature kIPHNewTabFeature;
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IPH)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ // All the features declared for Android below that are also used in Java,
diff --git a/www/iridium/files/patch-components_feature__engagement_public_feature__list.cc b/www/iridium/files/patch-components_feature__engagement_public_feature__list.cc
new file mode 100644
index 000000000000..6bfd36f75f8d
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_feature__list.cc
@@ -0,0 +1,20 @@
+--- components/feature_engagement/public/feature_list.cc.orig 2020-03-16 18:39:48 UTC
++++ components/feature_engagement/public/feature_list.cc
+@@ -58,7 +58,7 @@ const base::Feature* const kAllFeatures[] = {
+ &kIPHBadgedReadingListFeature,
+ &kIPHBadgedTranslateManualTriggerFeature,
+ #endif // defined(OS_IOS)
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ &kIPHFocusModeFeature,
+ &kIPHGlobalMediaControlsFeature,
+@@ -69,7 +69,7 @@ const base::Feature* const kAllFeatures[] = {
+ &kIPHIncognitoWindowFeature,
+ &kIPHNewTabFeature,
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+ };
+ } // namespace
diff --git a/www/iridium/files/patch-components_feature__engagement_public_feature__list.h b/www/iridium/files/patch-components_feature__engagement_public_feature__list.h
new file mode 100644
index 000000000000..246d10568f99
--- /dev/null
+++ b/www/iridium/files/patch-components_feature__engagement_public_feature__list.h
@@ -0,0 +1,38 @@
+--- components/feature_engagement/public/feature_list.h.orig 2020-03-16 18:39:48 UTC
++++ components/feature_engagement/public/feature_list.h
+@@ -111,7 +111,7 @@ DEFINE_VARIATION_PARAM(kIPHBadgedTranslateManualTrigge
+ "IPH_BadgedTranslateManualTrigger");
+ #endif // defined(OS_IOS)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ DEFINE_VARIATION_PARAM(kIPHFocusModeFeature, "IPH_FocusMode");
+ DEFINE_VARIATION_PARAM(kIPHGlobalMediaControls, "IPH_GlobalMediaControls");
+@@ -122,7 +122,7 @@ DEFINE_VARIATION_PARAM(kIPHBookmarkFeature, "IPH_Bookm
+ DEFINE_VARIATION_PARAM(kIPHIncognitoWindowFeature, "IPH_IncognitoWindow");
+ DEFINE_VARIATION_PARAM(kIPHNewTabFeature, "IPH_NewTab");
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+
+ } // namespace
+@@ -172,7 +172,7 @@ constexpr flags_ui::FeatureEntry::FeatureVariation
+ VARIATION_ENTRY(kIPHNewIncognitoTabTipFeature),
+ VARIATION_ENTRY(kIPHBadgedReadingListFeature),
+ VARIATION_ENTRY(kIPHBadgedTranslateManualTriggerFeature),
+-#elif defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#elif defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_CHROMEOS)
+ VARIATION_ENTRY(kIPHFocusModeFeature),
+ VARIATION_ENTRY(kIPHGlobalMediaControls),
+@@ -183,7 +183,7 @@ constexpr flags_ui::FeatureEntry::FeatureVariation
+ VARIATION_ENTRY(kIPHIncognitoWindowFeature),
+ VARIATION_ENTRY(kIPHNewTabFeature),
+ #endif // BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP)
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) ||
+ // defined(OS_CHROMEOS)
+ };
+
diff --git a/www/iridium/files/patch-components_feedback_anonymizer__tool.cc b/www/iridium/files/patch-components_feedback_anonymizer__tool.cc
new file mode 100644
index 000000000000..ec853d75bd26
--- /dev/null
+++ b/www/iridium/files/patch-components_feedback_anonymizer__tool.cc
@@ -0,0 +1,14 @@
+--- components/feedback/anonymizer_tool.cc.orig 2020-03-16 18:40:30 UTC
++++ components/feedback/anonymizer_tool.cc
+@@ -15,7 +15,11 @@
+ #include "base/threading/thread_restrictions.h"
+ #include "content/public/browser/browser_thread.h"
+ #include "net/base/ip_address.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using re2::RE2;
+
diff --git a/www/iridium/files/patch-components_flags__ui_flags__state.cc b/www/iridium/files/patch-components_flags__ui_flags__state.cc
new file mode 100644
index 000000000000..fdaa3f2f453c
--- /dev/null
+++ b/www/iridium/files/patch-components_flags__ui_flags__state.cc
@@ -0,0 +1,11 @@
+--- components/flags_ui/flags_state.cc.orig 2020-02-03 21:53:30 UTC
++++ components/flags_ui/flags_state.cc
+@@ -693,7 +693,7 @@ int FlagsState::GetCurrentPlatform() {
+ return kOsWin;
+ #elif defined(OS_CHROMEOS) // Needs to be before the OS_LINUX check.
+ return kOsCrOS;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_FREEBSD)
+ return kOsLinux;
+ #elif defined(OS_ANDROID)
+ return kOsAndroid;
diff --git a/www/iridium/files/patch-components_gcm__driver_gcm__client.h b/www/iridium/files/patch-components_gcm__driver_gcm__client.h
new file mode 100644
index 000000000000..d40f905a889e
--- /dev/null
+++ b/www/iridium/files/patch-components_gcm__driver_gcm__client.h
@@ -0,0 +1,10 @@
+--- components/gcm_driver/gcm_client.h.orig 2020-02-03 21:53:30 UTC
++++ components/gcm_driver/gcm_client.h
+@@ -87,6 +87,7 @@ class GCMClient {
+ PLATFORM_CROS,
+ PLATFORM_IOS,
+ PLATFORM_ANDROID,
++ PLATFORM_BSD,
+ PLATFORM_UNSPECIFIED
+ };
+
diff --git a/www/iridium/files/patch-components_gcm__driver_gcm__client__impl.cc b/www/iridium/files/patch-components_gcm__driver_gcm__client__impl.cc
new file mode 100644
index 000000000000..52e43837a5bd
--- /dev/null
+++ b/www/iridium/files/patch-components_gcm__driver_gcm__client__impl.cc
@@ -0,0 +1,12 @@
+--- components/gcm_driver/gcm_client_impl.cc.orig 2020-02-03 21:53:30 UTC
++++ components/gcm_driver/gcm_client_impl.cc
+@@ -135,6 +135,9 @@ void ToCheckinProtoVersion(
+ case GCMClient::PLATFORM_CROS:
+ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_CROS;
+ break;
++ case GCMClient::PLATFORM_BSD:
++ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX;
++ break;
+ case GCMClient::PLATFORM_UNSPECIFIED:
+ // For unknown platform, return as LINUX.
+ platform = checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX;
diff --git a/www/iridium/files/patch-components_keyed__service_core_dependency__graph__unittest.cc b/www/iridium/files/patch-components_keyed__service_core_dependency__graph__unittest.cc
new file mode 100644
index 000000000000..bbf7cb18c4a1
--- /dev/null
+++ b/www/iridium/files/patch-components_keyed__service_core_dependency__graph__unittest.cc
@@ -0,0 +1,14 @@
+--- components/keyed_service/core/dependency_graph_unittest.cc.orig 2019-03-11 22:00:56 UTC
++++ components/keyed_service/core/dependency_graph_unittest.cc
+@@ -9,7 +9,11 @@
+ #include "components/keyed_service/core/dependency_graph.h"
+ #include "components/keyed_service/core/dependency_node.h"
+ #include "testing/gtest/include/gtest/gtest.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace {
+
diff --git a/www/iridium/files/patch-components_metrics_BUILD.gn b/www/iridium/files/patch-components_metrics_BUILD.gn
new file mode 100644
index 000000000000..b89758947847
--- /dev/null
+++ b/www/iridium/files/patch-components_metrics_BUILD.gn
@@ -0,0 +1,14 @@
+--- components/metrics/BUILD.gn.orig 2020-03-16 18:40:30 UTC
++++ components/metrics/BUILD.gn
+@@ -173,6 +173,11 @@ jumbo_static_library("metrics") {
+ if (is_fuchsia) {
+ sources += [ "drive_metrics_provider_fuchsia.cc" ]
+ }
++
++ if (is_bsd) {
++ sources -= [ "system_memory_stats_recorder_linux.cc" ]
++ }
++
+ }
+
+ if (is_android) {
diff --git a/www/iridium/files/patch-components_metrics_drive__metrics__provider__linux.cc b/www/iridium/files/patch-components_metrics_drive__metrics__provider__linux.cc
new file mode 100644
index 000000000000..7e51eab82bdb
--- /dev/null
+++ b/www/iridium/files/patch-components_metrics_drive__metrics__provider__linux.cc
@@ -0,0 +1,16 @@
+--- components/metrics/drive_metrics_provider_linux.cc.orig 2019-03-11 22:00:56 UTC
++++ components/metrics/drive_metrics_provider_linux.cc
+@@ -4,7 +4,13 @@
+
+ #include "components/metrics/drive_metrics_provider.h"
+
++#if defined(OS_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/www/iridium/files/patch-components_metrics_metrics__log.cc b/www/iridium/files/patch-components_metrics_metrics__log.cc
new file mode 100644
index 000000000000..22cb98c234a2
--- /dev/null
+++ b/www/iridium/files/patch-components_metrics_metrics__log.cc
@@ -0,0 +1,11 @@
+--- components/metrics/metrics_log.cc.orig 2019-10-21 19:06:29 UTC
++++ components/metrics/metrics_log.cc
+@@ -202,7 +202,7 @@ void MetricsLog::RecordCoreSystemProfile(
+ // OperatingSystemVersion refers to the ChromeOS release version.
+ #if defined(OS_CHROMEOS)
+ os->set_kernel_version(base::SysInfo::KernelVersion());
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ // Linux operating system version is copied over into kernel version to be
+ // consistent.
+ os->set_kernel_version(base::SysInfo::OperatingSystemVersion());
diff --git a/www/iridium/files/patch-components_metrics_system__memory__stats__recorder__linux.cc b/www/iridium/files/patch-components_metrics_system__memory__stats__recorder__linux.cc
new file mode 100644
index 000000000000..1cb338f7464b
--- /dev/null
+++ b/www/iridium/files/patch-components_metrics_system__memory__stats__recorder__linux.cc
@@ -0,0 +1,18 @@
+--- components/metrics/system_memory_stats_recorder_linux.cc.orig 2019-09-09 21:55:14 UTC
++++ components/metrics/system_memory_stats_recorder_linux.cc
+@@ -30,6 +30,7 @@ namespace metrics {
+ UMA_HISTOGRAM_LINEAR(name, sample, 2500, 50)
+
+ void RecordMemoryStats(RecordMemoryStatsType type) {
++#if !defined(OS_FREEBSD)
+ base::SystemMemoryInfoKB memory;
+ if (!base::GetSystemMemoryInfo(&memory))
+ return;
+@@ -81,6 +82,7 @@ void RecordMemoryStats(RecordMemoryStatsType type) {
+ break;
+ }
+ }
++#endif // !defined(OS_FREEBSD)
+ }
+
+ } // namespace metrics
diff --git a/www/iridium/files/patch-components_neterror_resources_neterror.js b/www/iridium/files/patch-components_neterror_resources_neterror.js
new file mode 100644
index 000000000000..07a9dedb488d
--- /dev/null
+++ b/www/iridium/files/patch-components_neterror_resources_neterror.js
@@ -0,0 +1,11 @@
+--- components/neterror/resources/neterror.js.orig 2020-02-03 21:53:30 UTC
++++ components/neterror/resources/neterror.js
+@@ -201,7 +201,7 @@ function setUpCachedButton(buttonStrings) {
+ }
+
+ let primaryControlOnLeft = true;
+-// <if expr="is_macosx or is_ios or is_linux or is_android">
++// <if expr="is_macosx or is_ios or is_linux or is_android or is_bsd">
+ primaryControlOnLeft = false;
+ // </if>
+
diff --git a/www/iridium/files/patch-components_network__session__configurator_browser_network__session__configurator.cc b/www/iridium/files/patch-components_network__session__configurator_browser_network__session__configurator.cc
new file mode 100644
index 000000000000..658b31ad44fb
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:30 UTC
++++ components/network_session_configurator/browser/network_session_configurator.cc
+@@ -718,7 +718,7 @@ net::URLRequestContextBuilder::HttpCacheParams::Type C
+ }
+ #endif // #if !defined(OS_ANDROID)
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
+ #else
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE;
diff --git a/www/iridium/files/patch-components_new__or__sad__tab__strings.grdp b/www/iridium/files/patch-components_new__or__sad__tab__strings.grdp
new file mode 100644
index 000000000000..015ca5836d21
--- /dev/null
+++ b/www/iridium/files/patch-components_new__or__sad__tab__strings.grdp
@@ -0,0 +1,47 @@
+--- components/new_or_sad_tab_strings.grdp.orig 2020-03-16 18:40:30 UTC
++++ components/new_or_sad_tab_strings.grdp
+@@ -51,7 +51,7 @@
+ Open page in a new Incognito window (⇧⌘N)
+ </message>
+ </if>
+- <if expr="is_win or is_linux or chromeos">
++ <if expr="is_win or is_posix or chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_INCOGNITO" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to open the web page in Chrome's Incognito mode.">
+ Open page in a new Incognito window (Ctrl-Shift-N)
+ </message>
+@@ -66,7 +66,7 @@
+ Close other tabs or apps
+ </message>
+ </if>
+- <if expr="is_linux and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <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 and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <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>
+@@ -91,7 +91,7 @@
+ Restart Chromium
+ </message>
+ </if>
+- <if expr="is_win or is_linux or is_macosx or chromeos">
++ <if expr="is_win or is_posix or is_macosx or chromeos">
+ <message name="IDS_SAD_TAB_RELOAD_RESTART_DEVICE" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to restart their computer.">
+ Restart your computer
+ </message>
+@@ -106,7 +106,7 @@
+ Learn more
+ </message>
+ </if>
+- <if expr="is_win or is_linux or is_macosx or chromeos">
++ <if expr="is_win or is_posix or is_macosx or chromeos">
+ <message name="IDS_SAD_TAB_ERROR_CODE" desc="The message displayed on the crashed web page indicating the type of the crash.">
+ Error code: <ph name="ERROR_CODE">$1<ex>STATUS_ACCESS_VIOLATION</ex></ph>
+ </message>
diff --git a/www/iridium/files/patch-components_os__crypt_os__crypt.h b/www/iridium/files/patch-components_os__crypt_os__crypt.h
new file mode 100644
index 000000000000..f9e601a9a454
--- /dev/null
+++ b/www/iridium/files/patch-components_os__crypt_os__crypt.h
@@ -0,0 +1,48 @@
+--- components/os_crypt/os_crypt.h.orig 2020-02-03 21:53:30 UTC
++++ components/os_crypt/os_crypt.h
+@@ -15,9 +15,9 @@
+ #include "base/strings/string16.h"
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ class KeyStorageLinux;
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
+ class PrefRegistrySimple;
+@@ -34,13 +34,13 @@ struct Config;
+ // true for Linux, if a password management tool is available.
+ class OSCrypt {
+ public:
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Set the configuration of OSCrypt.
+ static COMPONENT_EXPORT(OS_CRYPT) void SetConfig(
+ std::unique_ptr<os_crypt::Config> config);
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+-#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // On Linux returns true iff the real secret key (not hardcoded one) is
+ // available. On MacOS returns true if Keychain is available (for mock
+ // Keychain it returns true if not using locked Keychain, false if using
+@@ -131,7 +131,7 @@ class OSCrypt {
+ DISALLOW_IMPLICIT_CONSTRUCTORS(OSCrypt);
+ };
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // For unit testing purposes, inject methods to be used.
+ // |get_key_storage_mock| provides the desired |KeyStorage| implementation.
+ // If the provider returns |nullptr|, a hardcoded password will be used.
+@@ -146,6 +146,6 @@ void UseMockKeyStorageForTesting(
+ // Clears any caching and most lazy initialisations performed by the production
+ // code. Should be used after any test which required a password.
+ COMPONENT_EXPORT(OS_CRYPT) void ClearCacheForTesting();
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ #endif // COMPONENTS_OS_CRYPT_OS_CRYPT_H_
diff --git a/www/iridium/files/patch-components_os__crypt_os__crypt__unittest.cc b/www/iridium/files/patch-components_os__crypt_os__crypt__unittest.cc
new file mode 100644
index 000000000000..d8cbdaad386c
--- /dev/null
+++ b/www/iridium/files/patch-components_os__crypt_os__crypt__unittest.cc
@@ -0,0 +1,11 @@
+--- components/os_crypt/os_crypt_unittest.cc.orig 2019-03-11 22:00:56 UTC
++++ components/os_crypt/os_crypt_unittest.cc
+@@ -18,7 +18,7 @@
+ #include "components/os_crypt/os_crypt_mocker.h"
+ #include "testing/gtest/include/gtest/gtest.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "components/os_crypt/os_crypt_mocker_linux.h"
+ #endif
+
diff --git a/www/iridium/files/patch-components_plugins_renderer_plugin__placeholder.cc b/www/iridium/files/patch-components_plugins_renderer_plugin__placeholder.cc
new file mode 100644
index 000000000000..0f704d529edf
--- /dev/null
+++ b/www/iridium/files/patch-components_plugins_renderer_plugin__placeholder.cc
@@ -0,0 +1,14 @@
+--- components/plugins/renderer/plugin_placeholder.cc.orig 2019-03-11 22:00:56 UTC
++++ components/plugins/renderer/plugin_placeholder.cc
+@@ -17,7 +17,11 @@
+ #include "third_party/blink/public/web/web_plugin_container.h"
+ #include "third_party/blink/public/web/web_script_source.h"
+ #include "third_party/blink/public/web/web_serialized_script_value.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif // defined(OS_BSD)
+
+ namespace plugins {
+
diff --git a/www/iridium/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc b/www/iridium/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc
new file mode 100644
index 000000000000..06a59baab59d
--- /dev/null
+++ b/www/iridium/files/patch-components_policy_core_common_cloud_cloud__policy__util.cc
@@ -0,0 +1,73 @@
+--- components/policy/core/common/cloud/cloud_policy_util.cc.orig 2020-02-03 21:52:44 UTC
++++ components/policy/core/common/cloud/cloud_policy_util.cc
+@@ -16,7 +16,7 @@
+ #include <wincred.h>
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_MACOSX)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) || defined(OS_BSD)
+ #include <pwd.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -31,7 +31,7 @@
+ #import <SystemConfiguration/SCDynamicStoreCopySpecific.h>
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include <limits.h> // For HOST_NAME_MAX
+ #endif
+
+@@ -60,7 +60,7 @@
+ #include "base/system/sys_info.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "base/system/sys_info.h"
+ #endif
+
+@@ -69,11 +69,24 @@ namespace policy {
+ namespace em = enterprise_management;
+
+ std::string GetMachineName() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+ char hostname[HOST_NAME_MAX];
+ if (gethostname(hostname, HOST_NAME_MAX) == 0) // Success.
+ return hostname;
+ return std::string();
++#elif defined(OS_BSD)
++ long host_name_max = sysconf(_SC_HOST_NAME_MAX);
++ if (host_name_max != -1) {
++ char *hostname = new char[host_name_max + 1]();
++ std::string hostname_r;
++
++ if (gethostname(hostname, host_name_max) == 0)
++ hostname_r = hostname;
++
++ delete[] hostname;
++ return hostname_r;
++ }
++ return std::string();
+ #elif defined(OS_MACOSX)
+ // TODO(crbug.com/1024115): Find a different replacement for -[NSHost
+ // currentHost] on iOS.
+@@ -123,7 +136,7 @@ std::string GetMachineName() {
+ }
+
+ std::string GetOSVersion() {
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ return base::SysInfo::OperatingSystemVersion();
+ #elif defined(OS_WIN)
+ base::win::OSInfo::VersionNumber version_number =
+@@ -146,7 +159,7 @@ std::string GetOSArchitecture() {
+ }
+
+ std::string GetOSUsername() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_MACOSX)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) || defined(OS_BSD)
+ struct passwd* creds = getpwuid(getuid());
+ if (!creds || !creds->pw_name)
+ return std::string();
diff --git a/www/iridium/files/patch-components_policy_core_common_schema.cc b/www/iridium/files/patch-components_policy_core_common_schema.cc
new file mode 100644
index 000000000000..084085fb3d9f
--- /dev/null
+++ b/www/iridium/files/patch-components_policy_core_common_schema.cc
@@ -0,0 +1,14 @@
+--- components/policy/core/common/schema.cc.orig 2019-03-11 22:00:56 UTC
++++ components/policy/core/common/schema.cc
+@@ -23,7 +23,11 @@
+ #include "base/strings/stringprintf.h"
+ #include "components/policy/core/common/json_schema_constants.h"
+ #include "components/policy/core/common/schema_internal.h"
++#if defined(OS_FREEBSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace schema = json_schema_constants;
+
diff --git a/www/iridium/files/patch-components_policy_resources_policy__templates.json b/www/iridium/files/patch-components_policy_resources_policy__templates.json
new file mode 100644
index 000000000000..5eca40e4b2ae
--- /dev/null
+++ b/www/iridium/files/patch-components_policy_resources_policy__templates.json
@@ -0,0 +1,83 @@
+--- components/policy/resources/policy_templates.json.orig 2020-03-16 18:40:31 UTC
++++ components/policy/resources/policy_templates.json
+@@ -1088,7 +1088,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.*:8-', 'chrome_os:11-', 'android:81-'],
++ 'supported_on': ['chrome.*:8-', 'chrome_os:11-', 'android:81-', 'chrome.freebsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -1118,7 +1118,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.*:8-', 'chrome_os:11-'],
++ 'supported_on': ['chrome.*:8-', 'chrome_os:11-', 'chrome.freebsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -1145,7 +1145,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.*:58-', 'chrome_os:58-'],
++ 'supported_on': ['chrome.*:58-', 'chrome_os:58-', 'chrome.freebsd:9-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -1944,7 +1944,7 @@
+ 'owners': ['jamiewalch@chromium.org', 'rkjnsn@chromium.org'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.linux:25-', 'chrome.mac:25-', 'chrome_os:42-'],
++ 'supported_on': ['chrome.linux:25-', 'chrome.mac:25-', 'chrome_os:42-', 'chrome.freebsd:25-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -3807,7 +3807,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'string',
+ 'schema': { 'type': 'string' },
+- 'supported_on': ['chrome.linux:9-'],
++ 'supported_on': ['chrome.linux:9-', 'chrome.freebsd:9-'],
+ 'features': {
+ 'dynamic_refresh': False,
+ 'per_profile': False,
+@@ -3861,7 +3861,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.linux:63-','chrome.mac:63-','chrome_os:63-','android:63-','webview_android:63-'],
++ 'supported_on': ['chrome.linux:63-','chrome.mac:63-','chrome_os:63-','android:63-','webview_android:63-', 'chrome.freebsd:63-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -7329,7 +7329,7 @@
+ 'owners': ['file://src/net/cert/OWNERS'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome_os:30-', 'chrome.linux:30-', 'chrome.win:30-'],
++ 'supported_on': ['chrome_os:30-', 'chrome.linux:30-', 'chrome.win:30-', 'chrome.freebsd:30-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': False,
+@@ -8621,7 +8621,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.win:19-', 'chrome.linux:19-'],
++ 'supported_on': ['chrome.win:19-', 'chrome.linux:19-', 'chrome.freebsd:19-'],
+ 'features': {
+ 'can_be_recommended': True,
+ 'dynamic_refresh': True,
+@@ -9297,7 +9297,7 @@
+ 'owners': ['file://components/policy/resources/OWNERS'],
+ 'type': 'main',
+ 'schema': { 'type': 'boolean' },
+- 'supported_on': ['chrome.win:31-', 'chrome.linux:31-', 'chrome_os:31-'],
++ 'supported_on': ['chrome.win:31-', 'chrome.linux:31-', 'chrome_os:31-', 'chrome.freebsd:31-'],
+ 'features': {
+ 'dynamic_refresh': True,
+ 'per_profile': True,
diff --git a/www/iridium/files/patch-components_policy_tools_generate__policy__source.py b/www/iridium/files/patch-components_policy_tools_generate__policy__source.py
new file mode 100644
index 000000000000..0274c627676a
--- /dev/null
+++ b/www/iridium/files/patch-components_policy_tools_generate__policy__source.py
@@ -0,0 +1,19 @@
+--- components/policy/tools/generate_policy_source.py.orig 2020-02-03 21:53:30 UTC
++++ components/policy/tools/generate_policy_source.py
+@@ -97,6 +97,7 @@ class PolicyDetails:
+ 'chrome.linux',
+ 'chrome.mac',
+ 'chrome.fuchsia',
++ 'chrome.freebsd',
+ 'chrome.*',
+ 'chrome.win7',
+ ]:
+@@ -119,7 +120,7 @@ class PolicyDetails:
+ if platform.startswith('chrome.'):
+ platform_sub = platform[7:]
+ if platform_sub == '*':
+- self.platforms.extend(['win', 'mac', 'linux', 'fuchsia'])
++ self.platforms.extend(['win', 'mac', 'linux', 'fuchsia', 'freebsd'])
+ elif platform_sub == 'win7':
+ self.platforms.append('win')
+ else:
diff --git a/www/iridium/files/patch-components_previews_core_previews__features.cc b/www/iridium/files/patch-components_previews_core_previews__features.cc
new file mode 100644
index 000000000000..fabf0b3025ea
--- /dev/null
+++ b/www/iridium/files/patch-components_previews_core_previews__features.cc
@@ -0,0 +1,18 @@
+--- components/previews/core/previews_features.cc.orig 2019-03-11 22:00:57 UTC
++++ components/previews/core/previews_features.cc
+@@ -14,12 +14,12 @@ namespace features {
+ // are enabled are controlled by other features.
+ const base::Feature kPreviews {
+ "Previews",
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ // Previews allowed for Android (but also allow on Linux for dev/debug).
+ base::FEATURE_ENABLED_BY_DEFAULT
+-#else // !defined(OS_ANDROID) || defined(OS_LINUX)
++#else // !defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ base::FEATURE_DISABLED_BY_DEFAULT
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ };
+
+ // Enables the Offline previews on android slow connections.
diff --git a/www/iridium/files/patch-components_security__interstitials_content_captive__portal__blocking__page.cc b/www/iridium/files/patch-components_security__interstitials_content_captive__portal__blocking__page.cc
new file mode 100644
index 000000000000..b9eaf2aa1e95
--- /dev/null
+++ b/www/iridium/files/patch-components_security__interstitials_content_captive__portal__blocking__page.cc
@@ -0,0 +1,11 @@
+--- components/security_interstitials/content/captive_portal_blocking_page.cc.orig 2020-03-16 18:39:49 UTC
++++ components/security_interstitials/content/captive_portal_blocking_page.cc
+@@ -106,7 +106,7 @@ std::string CaptivePortalBlockingPage::GetWiFiSSID() c
+ wifi_service->GetConnectedNetworkSSID(&ssid, &error);
+ if (!error.empty())
+ return std::string();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ssid = net::GetWifiSSID();
+ #elif defined(OS_ANDROID)
+ ssid = net::android::GetWifiSSID();
diff --git a/www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc b/www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.cc
new file mode 100644
index 000000000000..f6e9116c28d0
--- /dev/null
+++ b/www/iridium/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 2020-02-24 18:39:14 UTC
++++ components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.cc
+@@ -15,7 +15,7 @@
+
+ #if defined(OS_WIN)
+ #include "content/public/child/dwrite_font_proxy_init_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #endif
+
+@@ -35,7 +35,7 @@ PaintPreviewCompositorCollectionImpl::PaintPreviewComp
+ // Initialize font access for Skia.
+ #if defined(OS_WIN)
+ content::InitializeDWriteFontProxy();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ content::UtilityThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -54,7 +54,7 @@ PaintPreviewCompositorCollectionImpl::PaintPreviewComp
+ // encoding to PNG or we could provide our own codec implementations.
+
+ // Sanity check that fonts are working.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.h b/www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.h
new file mode 100644
index 000000000000..d84c48a27037
--- /dev/null
+++ b/www/iridium/files/patch-components_services_paint__preview__compositor_paint__preview__compositor__collection__impl.h
@@ -0,0 +1,20 @@
+--- components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.h.orig 2020-02-26 13:13:33 UTC
++++ components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.h
+@@ -19,7 +19,7 @@
+ #include "mojo/public/cpp/bindings/pending_receiver.h"
+ #include "mojo/public/cpp/bindings/receiver.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #include "third_party/skia/include/core/SkRefCnt.h"
+ #endif
+@@ -68,7 +68,7 @@ class PaintPreviewCompositorCollectionImpl
+ std::unique_ptr<PaintPreviewCompositorImpl>>
+ compositors_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/www/iridium/files/patch-components_storage__monitor_BUILD.gn b/www/iridium/files/patch-components_storage__monitor_BUILD.gn
new file mode 100644
index 000000000000..3d90d22d647b
--- /dev/null
+++ b/www/iridium/files/patch-components_storage__monitor_BUILD.gn
@@ -0,0 +1,16 @@
+--- components/storage_monitor/BUILD.gn.orig 2019-10-21 19:06:30 UTC
++++ components/storage_monitor/BUILD.gn
+@@ -81,6 +81,13 @@ static_library("storage_monitor") {
+ }
+ }
+
++ if (is_bsd) {
++ sources += [
++ "storage_monitor_freebsd.cc",
++ "storage_monitor_freebsd.h",
++ ]
++ }
++
+ if (use_udev) {
+ sources += [
+ "udev_util_linux.cc",
diff --git a/www/iridium/files/patch-components_storage__monitor_removable__device__constants.cc b/www/iridium/files/patch-components_storage__monitor_removable__device__constants.cc
new file mode 100644
index 000000000000..055ef8ce5281
--- /dev/null
+++ b/www/iridium/files/patch-components_storage__monitor_removable__device__constants.cc
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.cc.orig 2019-03-11 22:00:57 UTC
++++ components/storage_monitor/removable_device_constants.cc
+@@ -10,7 +10,7 @@ namespace storage_monitor {
+ const char kFSUniqueIdPrefix[] = "UUID:";
+ const char kVendorModelSerialPrefix[] = "VendorModelSerial:";
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const char kVendorModelVolumeStoragePrefix[] = "VendorModelVolumeStorage:";
+ #endif
+
diff --git a/www/iridium/files/patch-components_storage__monitor_removable__device__constants.h b/www/iridium/files/patch-components_storage__monitor_removable__device__constants.h
new file mode 100644
index 000000000000..6417016c4b7e
--- /dev/null
+++ b/www/iridium/files/patch-components_storage__monitor_removable__device__constants.h
@@ -0,0 +1,11 @@
+--- components/storage_monitor/removable_device_constants.h.orig 2019-03-11 22:00:57 UTC
++++ components/storage_monitor/removable_device_constants.h
+@@ -15,7 +15,7 @@ namespace storage_monitor {
+ extern const char kFSUniqueIdPrefix[];
+ extern const char kVendorModelSerialPrefix[];
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kVendorModelVolumeStoragePrefix[];
+ #endif
+
diff --git a/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.cc b/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.cc
new file mode 100644
index 000000000000..5565618b98b3
--- /dev/null
+++ b/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.cc
@@ -0,0 +1,57 @@
+--- components/storage_monitor/storage_monitor_freebsd.cc.orig 2019-03-17 01:47:13 UTC
++++ components/storage_monitor/storage_monitor_freebsd.cc
+@@ -0,0 +1,54 @@
++// 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.
++
++// StorageMonitorFreeBSD implementation.
++
++#include "components/storage_monitor/storage_monitor_freebsd.h"
++
++#include <stdio.h>
++
++#include <list>
++
++#include "base/bind.h"
++#include "base/metrics/histogram.h"
++#include "base/process/kill.h"
++#include "base/process/launch.h"
++#include "base/stl_util.h"
++#include "base/strings/string_number_conversions.h"
++#include "base/strings/string_util.h"
++#include "base/strings/utf_string_conversions.h"
++#include "components/storage_monitor/media_storage_util.h"
++#include "components/storage_monitor/removable_device_constants.h"
++#include "components/storage_monitor/storage_info.h"
++
++using content::BrowserThread;
++
++namespace storage_monitor {
++
++namespace {
++
++} // namespace
++
++StorageMonitorFreeBSD::StorageMonitorFreeBSD() {
++ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
++}
++
++StorageMonitorFreeBSD::~StorageMonitorFreeBSD() {
++ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
++}
++
++void StorageMonitorFreeBSD::Init() {
++}
++
++bool StorageMonitorFreeBSD::GetStorageInfoForPath(
++ const base::FilePath& path,
++ StorageInfo* device_info) const {
++ return false; // TODO
++}
++
++StorageMonitor* StorageMonitor::CreateInternal() {
++ return new StorageMonitorFreeBSD();
++}
++
++} // namespace storage_monitor
diff --git a/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.h b/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.h
new file mode 100644
index 000000000000..258c90fede4d
--- /dev/null
+++ b/www/iridium/files/patch-components_storage__monitor_storage__monitor__freebsd.h
@@ -0,0 +1,48 @@
+--- components/storage_monitor/storage_monitor_freebsd.h.orig 2019-03-17 01:47:13 UTC
++++ components/storage_monitor/storage_monitor_freebsd.h
+@@ -0,0 +1,45 @@
++// 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.
++
++// StorageMonitorFreeBSD processes mount point change events, notifies listeners
++// about the addition and deletion of media devices, and answers queries about
++// mounted devices.
++// StorageMonitorFreeBSD lives on the UI thread, and uses ???
++// the FILE thread to get mount point change events.
++
++#ifndef COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
++#define COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
++
++#include <map>
++#include <string>
++
++#include "base/compiler_specific.h"
++#include "base/files/file_path.h"
++#include "base/files/file_path_watcher.h"
++#include "base/memory/weak_ptr.h"
++#include "components/storage_monitor/storage_monitor.h"
++#include "content/public/browser/browser_thread.h"
++
++namespace storage_monitor {
++
++class StorageMonitorFreeBSD : public StorageMonitor {
++ public:
++ // Should only be called by browser start up code.
++ // Use StorageMonitor::GetInstance() instead.
++ explicit StorageMonitorFreeBSD();
++ virtual ~StorageMonitorFreeBSD();
++
++ // Must be called for StorageMonitorFreeBSD to work.
++ virtual void Init() override;
++ private:
++ // StorageMonitor implementation.
++ virtual bool GetStorageInfoForPath(const base::FilePath& path,
++ StorageInfo* device_info) const override;
++
++ DISALLOW_COPY_AND_ASSIGN(StorageMonitorFreeBSD);
++};
++
++} // namespace storage_monitor
++
++#endif // COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_FREEBSD_H_
diff --git a/www/iridium/files/patch-components_sync__device__info_device__info__sync__bridge.cc b/www/iridium/files/patch-components_sync__device__info_device__info__sync__bridge.cc
new file mode 100644
index 000000000000..c075e1c2a99c
--- /dev/null
+++ b/www/iridium/files/patch-components_sync__device__info_device__info__sync__bridge.cc
@@ -0,0 +1,16 @@
+--- components/sync_device_info/device_info_sync_bridge.cc.orig 2020-03-16 18:40:31 UTC
++++ components/sync_device_info/device_info_sync_bridge.cc
+@@ -456,11 +456,13 @@ void DeviceInfoSyncBridge::OnStoreCreated(
+ return;
+ }
+
++#if !defined(OS_BSD)
+ store_ = std::move(store);
+
+ base::SysInfo::GetHardwareInfo(
+ base::BindOnce(&DeviceInfoSyncBridge::OnHardwareInfoRetrieved,
+ weak_ptr_factory_.GetWeakPtr()));
++#endif
+ }
+
+ void DeviceInfoSyncBridge::OnHardwareInfoRetrieved(
diff --git a/www/iridium/files/patch-components_sync__device__info_local__device__info__util.cc b/www/iridium/files/patch-components_sync__device__info_local__device__info__util.cc
new file mode 100644
index 000000000000..19d4b54c7495
--- /dev/null
+++ b/www/iridium/files/patch-components_sync__device__info_local__device__info__util.cc
@@ -0,0 +1,11 @@
+--- components/sync_device_info/local_device_info_util.cc.orig 2019-12-31 14:40:27 UTC
++++ components/sync_device_info/local_device_info_util.cc
+@@ -19,7 +19,7 @@ std::string GetPersonalizableDeviceNameInternal();
+ sync_pb::SyncEnums::DeviceType GetLocalDeviceType() {
+ #if defined(OS_CHROMEOS)
+ return sync_pb::SyncEnums_DeviceType_TYPE_CROS;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return sync_pb::SyncEnums_DeviceType_TYPE_LINUX;
+ #elif defined(OS_ANDROID) || defined(OS_IOS)
+ return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET
diff --git a/www/iridium/files/patch-components_sync__device__info_local__device__info__util__linux.cc b/www/iridium/files/patch-components_sync__device__info_local__device__info__util__linux.cc
new file mode 100644
index 000000000000..5c9398a7ea7c
--- /dev/null
+++ b/www/iridium/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 2020-02-24 18:39:14 UTC
++++ components/sync_device_info/local_device_info_util_linux.cc
+@@ -37,8 +37,9 @@ std::string GetPersonalizableDeviceNameInternal() {
+ #if defined(OS_CHROMEOS)
+ return GetChromeOSDeviceNameFromType();
+ #else
+- char hostname[HOST_NAME_MAX];
+- if (gethostname(hostname, HOST_NAME_MAX) == 0) // Success.
++ int len = sysconf(_SC_HOST_NAME_MAX);
++ char hostname[len];
++ if (gethostname(hostname, _SC_HOST_NAME_MAX) == 0) // Success.
+ return hostname;
+ return base::GetLinuxDistro();
+ #endif
diff --git a/www/iridium/files/patch-components_update__client_update__query__params.cc b/www/iridium/files/patch-components_update__client_update__query__params.cc
new file mode 100644
index 000000000000..7da3a9299fb1
--- /dev/null
+++ b/www/iridium/files/patch-components_update__client_update__query__params.cc
@@ -0,0 +1,11 @@
+--- components/update_client/update_query_params.cc.orig 2019-10-21 19:06:31 UTC
++++ components/update_client/update_query_params.cc
+@@ -39,6 +39,8 @@ const char kOs[] =
+ "fuchsia";
+ #elif defined(OS_OPENBSD)
+ "openbsd";
++#elif defined(OS_FREEBSD)
++ "freebsd";
+ #else
+ #error "unknown os"
+ #endif
diff --git a/www/iridium/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc b/www/iridium/files/patch-components_url__formatter_spoof__checks_idn__spoof__checker.cc
new file mode 100644
index 000000000000..5b6a93f948a3
--- /dev/null
+++ b/www/iridium/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 2020-03-17 09:48:11 UTC
++++ components/url_formatter/spoof_checks/idn_spoof_checker.cc
+@@ -262,7 +262,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ "[ทนบพรหเà¹à¹à¸”ลปฟม]",
+ #else
+ "[บพเà¹à¹]",
diff --git a/www/iridium/files/patch-components_url__matcher_regex__set__matcher.cc b/www/iridium/files/patch-components_url__matcher_regex__set__matcher.cc
new file mode 100644
index 000000000000..33f3999ba526
--- /dev/null
+++ b/www/iridium/files/patch-components_url__matcher_regex__set__matcher.cc
@@ -0,0 +1,16 @@
+--- components/url_matcher/regex_set_matcher.cc.orig 2019-03-11 22:00:57 UTC
++++ components/url_matcher/regex_set_matcher.cc
+@@ -11,8 +11,13 @@
+ #include "base/logging.h"
+ #include "base/strings/string_util.h"
+ #include "components/url_matcher/substring_set_matcher.h"
++#if defined(OS_BSD)
++#include <re2/filtered_re2.h>
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/filtered_re2.h"
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace url_matcher {
+
diff --git a/www/iridium/files/patch-components_url__matcher_url__matcher__factory.cc b/www/iridium/files/patch-components_url__matcher_url__matcher__factory.cc
new file mode 100644
index 000000000000..533e9439604e
--- /dev/null
+++ b/www/iridium/files/patch-components_url__matcher_url__matcher__factory.cc
@@ -0,0 +1,14 @@
+--- components/url_matcher/url_matcher_factory.cc.orig 2019-03-11 22:00:57 UTC
++++ components/url_matcher/url_matcher_factory.cc
+@@ -16,7 +16,11 @@
+ #include "base/values.h"
+ #include "components/url_matcher/url_matcher_constants.h"
+ #include "components/url_matcher/url_matcher_helpers.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace url_matcher {
+
diff --git a/www/iridium/files/patch-components_viz_common_features.cc b/www/iridium/files/patch-components_viz_common_features.cc
new file mode 100644
index 000000000000..ad1c4166adfc
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_common_features.cc
@@ -0,0 +1,20 @@
+--- components/viz/common/features.cc.orig 2020-03-17 09:49:01 UTC
++++ components/viz/common/features.cc
+@@ -17,7 +17,7 @@
+ namespace features {
+
+ // Use Skia's readback API instead of GLRendererCopier.
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::Feature kUseSkiaForGLReadback{"UseSkiaForGLReadback",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+ #else
+@@ -26,7 +26,7 @@ const base::Feature kUseSkiaForGLReadback{"UseSkiaForG
+ #endif
+
+ // Use the SkiaRenderer.
+-#if defined(OS_LINUX) && !(defined(OS_CHROMEOS) || BUILDFLAG(IS_CHROMECAST))
++#if (defined(OS_LINUX) && !(defined(OS_CHROMEOS) || BUILDFLAG(IS_CHROMECAST))) || defined(OS_BSD)
+ const base::Feature kUseSkiaRenderer{"UseSkiaRenderer",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+ #else
diff --git a/www/iridium/files/patch-components_viz_common_gpu_dawn__context__provider.cc b/www/iridium/files/patch-components_viz_common_gpu_dawn__context__provider.cc
new file mode 100644
index 000000000000..ea33615fe7e0
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_common_gpu_dawn__context__provider.cc
@@ -0,0 +1,11 @@
+--- components/viz/common/gpu/dawn_context_provider.cc.orig 2020-02-26 13:14:08 UTC
++++ components/viz/common/gpu/dawn_context_provider.cc
+@@ -17,7 +17,7 @@ namespace {
+ dawn_native::BackendType GetDefaultBackendType() {
+ #if defined(OS_WIN)
+ return dawn_native::BackendType::D3D12;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return dawn_native::BackendType::Vulkan;
+ #else
+ NOTREACHED();
diff --git a/www/iridium/files/patch-components_viz_host_host__display__client.cc b/www/iridium/files/patch-components_viz_host_host__display__client.cc
new file mode 100644
index 000000000000..bdfec86f1ddf
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_host_host__display__client.cc
@@ -0,0 +1,11 @@
+--- components/viz/host/host_display_client.cc.orig 2020-02-03 21:52:45 UTC
++++ components/viz/host/host_display_client.cc
+@@ -56,7 +56,7 @@ void HostDisplayClient::CreateLayeredWindowUpdater(
+ }
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void HostDisplayClient::DidCompleteSwapWithNewSize(const gfx::Size& size) {
+ NOTIMPLEMENTED();
+ }
diff --git a/www/iridium/files/patch-components_viz_host_host__display__client.h b/www/iridium/files/patch-components_viz_host_host__display__client.h
new file mode 100644
index 000000000000..4b57c1bf5f23
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_host_host__display__client.h
@@ -0,0 +1,11 @@
+--- components/viz/host/host_display_client.h.orig 2020-02-03 21:52:45 UTC
++++ components/viz/host/host_display_client.h
+@@ -43,7 +43,7 @@ class VIZ_HOST_EXPORT HostDisplayClient : public mojom
+ mojo::PendingReceiver<mojom::LayeredWindowUpdater> receiver) override;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void DidCompleteSwapWithNewSize(const gfx::Size& size) override;
+ #endif
+
diff --git a/www/iridium/files/patch-components_viz_service_display__embedder_skia__output__device__dawn.cc b/www/iridium/files/patch-components_viz_service_display__embedder_skia__output__device__dawn.cc
new file mode 100644
index 000000000000..7b27a7dd14d1
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_service_display__embedder_skia__output__device__dawn.cc
@@ -0,0 +1,11 @@
+--- components/viz/service/display_embedder/skia_output_device_dawn.cc.orig 2020-02-26 13:15:08 UTC
++++ components/viz/service/display_embedder/skia_output_device_dawn.cc
+@@ -10,7 +10,7 @@
+
+ #if defined(OS_WIN)
+ #include <dawn_native/D3D12Backend.h>
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include <dawn_native/VulkanBackend.h>
+ #endif
+
diff --git a/www/iridium/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc b/www/iridium/files/patch-components_viz_service_display__embedder_skia__output__surface__impl.cc
new file mode 100644
index 000000000000..a3cbc1921992
--- /dev/null
+++ b/www/iridium/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 2020-03-17 09:50:06 UTC
++++ components/viz/service/display_embedder/skia_output_surface_impl.cc
+@@ -224,7 +224,7 @@ void SkiaOutputSurfaceImpl::Reshape(const gfx::Size& s
+ if (characterization_.isValid()) {
+ // TODO(vasilyt): We temporary keep old code for linux to not interferee
+ // with M81. Remove this after.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<SkColorSpace> sk_color_space = color_space.ToSkColorSpace();
+ if (!SkColorSpace::Equals(characterization_.colorSpace(),
+ sk_color_space.get())) {
diff --git a/www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.cc b/www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.cc
new file mode 100644
index 000000000000..a31cdeada8fc
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:53:31 UTC
++++ components/viz/service/display_embedder/software_output_surface.cc
+@@ -118,7 +118,7 @@ void SoftwareOutputSurface::SwapBuffersCallback(base::
+ base::TimeTicks now = base::TimeTicks::Now();
+ base::TimeDelta interval_to_next_refresh =
+ now.SnappedToNextTick(refresh_timebase_, refresh_interval_) - now;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (needs_swap_size_notifications_)
+ client_->DidSwapWithSize(pixel_size);
+ #endif
+@@ -147,7 +147,7 @@ gfx::OverlayTransform SoftwareOutputSurface::GetDispla
+ return gfx::OVERLAY_TRANSFORM_NONE;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void SoftwareOutputSurface::SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) {
+ needs_swap_size_notifications_ = needs_swap_size_notifications;
diff --git a/www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.h b/www/iridium/files/patch-components_viz_service_display__embedder_software__output__surface.h
new file mode 100644
index 000000000000..78a386e1b26f
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:31 UTC
++++ components/viz/service/display_embedder/software_output_surface.h
+@@ -50,7 +50,7 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : publi
+ UpdateVSyncParametersCallback callback) override;
+ void SetDisplayTransformHint(gfx::OverlayTransform transform) override {}
+ gfx::OverlayTransform GetDisplayTransform() override;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) override;
+ #endif
+@@ -72,7 +72,7 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : publi
+ std::queue<std::vector<ui::LatencyInfo>> stored_latency_info_;
+ ui::LatencyTracker latency_tracker_;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ bool needs_swap_size_notifications_ = false;
+ #endif
+
diff --git a/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.cc b/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.cc
new file mode 100644
index 000000000000..f52c82d287af
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.cc
@@ -0,0 +1,20 @@
+--- components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc.orig 2020-03-16 18:40:31 UTC
++++ components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+@@ -49,7 +49,7 @@ RootCompositorFrameSinkImpl::Create(
+ output_surface->SetNeedsSwapSizeNotifications(
+ params->send_swap_size_notifications);
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // For X11, we need notify client about swap completion after resizing, so the
+ // client can use it for synchronize with X11 WM.
+ output_surface->SetNeedsSwapSizeNotifications(true);
+@@ -418,7 +418,7 @@ void RootCompositorFrameSinkImpl::DisplayDidCompleteSw
+ #if defined(OS_ANDROID)
+ if (display_client_)
+ display_client_->DidCompleteSwapWithSize(pixel_size);
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (display_client_ && pixel_size != last_swap_pixel_size_) {
+ last_swap_pixel_size_ = pixel_size;
+ display_client_->DidCompleteSwapWithNewSize(last_swap_pixel_size_);
diff --git a/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.h b/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.h
new file mode 100644
index 000000000000..0cd42362caa3
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_service_frame__sinks_root__compositor__frame__sink__impl.h
@@ -0,0 +1,11 @@
+--- components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h.orig 2020-03-16 18:40:31 UTC
++++ components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h
+@@ -149,7 +149,7 @@ class RootCompositorFrameSinkImpl : public mojom::Comp
+ base::TimeDelta preferred_frame_interval_ =
+ FrameRateDecider::UnspecifiedFrameInterval();
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ gfx::Size last_swap_pixel_size_;
+ #endif
+
diff --git a/www/iridium/files/patch-components_viz_test_fake__output__surface.cc b/www/iridium/files/patch-components_viz_test_fake__output__surface.cc
new file mode 100644
index 000000000000..59a258fd3b15
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_test_fake__output__surface.cc
@@ -0,0 +1,11 @@
+--- components/viz/test/fake_output_surface.cc.orig 2020-04-06 07:59:49 UTC
++++ components/viz/test/fake_output_surface.cc
+@@ -114,7 +114,7 @@ gfx::OverlayTransform FakeOutputSurface::GetDisplayTra
+ : gfx::OVERLAY_TRANSFORM_NONE;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void FakeOutputSurface::SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) {}
+ #endif
diff --git a/www/iridium/files/patch-components_viz_test_fake__output__surface.h b/www/iridium/files/patch-components_viz_test_fake__output__surface.h
new file mode 100644
index 000000000000..5da27a2de0cd
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_test_fake__output__surface.h
@@ -0,0 +1,11 @@
+--- components/viz/test/fake_output_surface.h.orig 2020-04-06 08:00:10 UTC
++++ components/viz/test/fake_output_surface.h
+@@ -84,7 +84,7 @@ class FakeOutputSurface : public OutputSurface {
+ UpdateVSyncParametersCallback callback) override;
+ void SetDisplayTransformHint(gfx::OverlayTransform transform) override;
+ gfx::OverlayTransform GetDisplayTransform() override;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void SetNeedsSwapSizeNotifications(
+ bool needs_swap_size_notifications) override;
+ #endif
diff --git a/www/iridium/files/patch-components_viz_test_mock__display__client.h b/www/iridium/files/patch-components_viz_test_mock__display__client.h
new file mode 100644
index 000000000000..43940cf13781
--- /dev/null
+++ b/www/iridium/files/patch-components_viz_test_mock__display__client.h
@@ -0,0 +1,11 @@
+--- components/viz/test/mock_display_client.h.orig 2020-04-06 08:00:42 UTC
++++ components/viz/test/mock_display_client.h
+@@ -35,7 +35,7 @@ class MockDisplayClient : public mojom::DisplayClient
+ MOCK_METHOD1(OnContextCreationResult, void(gpu::ContextResult));
+ MOCK_METHOD1(SetPreferredRefreshRate, void(float refresh_rate));
+ #endif
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ MOCK_METHOD1(DidCompleteSwapWithNewSize, void(const gfx::Size&));
+ #endif
+
diff --git a/www/iridium/files/patch-components_webcrypto_algorithms_test__helpers.cc b/www/iridium/files/patch-components_webcrypto_algorithms_test__helpers.cc
new file mode 100644
index 000000000000..cc741c7d273f
--- /dev/null
+++ b/www/iridium/files/patch-components_webcrypto_algorithms_test__helpers.cc
@@ -0,0 +1,14 @@
+--- components/webcrypto/algorithms/test_helpers.cc.orig 2019-03-11 22:00:57 UTC
++++ components/webcrypto/algorithms/test_helpers.cc
+@@ -25,7 +25,11 @@
+ #include "components/webcrypto/status.h"
+ #include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
+ #include "third_party/blink/public/platform/web_crypto_key_algorithm.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace webcrypto {
+
diff --git a/www/iridium/files/patch-content_app_content__main__runner__impl.cc b/www/iridium/files/patch-content_app_content__main__runner__impl.cc
new file mode 100644
index 000000000000..dc4a030d4d3f
--- /dev/null
+++ b/www/iridium/files/patch-content_app_content__main__runner__impl.cc
@@ -0,0 +1,73 @@
+--- content/app/content_main_runner_impl.cc.orig 2020-03-16 18:40:31 UTC
++++ content/app/content_main_runner_impl.cc
+@@ -101,17 +101,17 @@
+ #include "base/posix/global_descriptors.h"
+ #include "content/public/common/content_descriptors.h"
+
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ #include "services/service_manager/zygote/common/zygote_fork_delegate_linux.h"
+ #endif
+-#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
++#if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ #include "sandbox/linux/services/libc_interceptor.h"
+ #include "services/service_manager/zygote/zygote_main.h"
+ #endif
+
+ #endif // OS_POSIX || OS_FUCHSIA
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/native_library.h"
+ #include "base/rand_util.h"
+ #include "services/service_manager/zygote/common/common_sandbox_support_linux.h"
+@@ -132,7 +132,7 @@
+ #include "content/public/common/content_client.h"
+ #endif
+
+-#endif // OS_LINUX
++#endif // OS_LINUX || defined(OS_BSD)
+
+ #if !defined(CHROME_MULTIPLE_DLL_BROWSER)
+ #include "content/child/field_trial.h"
+@@ -298,7 +298,7 @@ void InitializeZygoteSandboxForBrowserProcess(
+ }
+ #endif // BUILDFLAG(USE_ZYGOTE_HANDLE)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ #if BUILDFLAG(ENABLE_PLUGINS)
+ // Loads the (native) libraries but does not initialize them (i.e., does not
+@@ -395,7 +395,7 @@ void PreSandboxInit() {
+ }
+ #endif // BUILDFLAG(USE_ZYGOTE_HANDLE)
+
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ } // namespace
+
+@@ -462,7 +462,7 @@ int RunZygote(ContentMainDelegate* delegate) {
+ delegate->ZygoteStarting(&zygote_fork_delegates);
+ media::InitializeMediaLibrary();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ PreSandboxInit();
+ #endif
+
+@@ -622,11 +622,11 @@ int ContentMainRunnerImpl::Initialize(const ContentMai
+ base::GlobalDescriptors::kBaseDescriptor);
+ #endif // !OS_ANDROID
+
+-#if defined(OS_LINUX) || defined(OS_OPENBSD)
++#if defined(OS_LINUX)
+ g_fds->Set(service_manager::kCrashDumpSignal,
+ service_manager::kCrashDumpSignal +
+ base::GlobalDescriptors::kBaseDescriptor);
+-#endif // OS_LINUX || OS_OPENBSD
++#endif // OS_LINUX
+
+ #endif // !OS_WIN
+
diff --git a/www/iridium/files/patch-content_browser_browser__main__loop.cc b/www/iridium/files/patch-content_browser_browser__main__loop.cc
new file mode 100644
index 000000000000..d390038358d3
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_browser__main__loop.cc
@@ -0,0 +1,46 @@
+--- content/browser/browser_main_loop.cc.orig 2020-03-16 18:40:31 UTC
++++ content/browser/browser_main_loop.cc
+@@ -242,6 +242,13 @@
+ #include "mojo/public/cpp/bindings/lib/test_random_mojo_delays.h"
+ #endif
+
++#if defined(OS_BSD)
++#include "content/browser/sandbox_host_linux.h"
++#include "services/service_manager/zygote/common/common_sandbox_support_linux.h"
++#include "content/public/common/common_sandbox_support_linux.h"
++#include "services/service_manager/sandbox/sandbox.h"
++#endif
++
+ // One of the linux specific headers defines this as a macro.
+ #ifdef DestroyAll
+ #undef DestroyAll
+@@ -613,6 +620,11 @@ 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 defined(OS_BSD)
++ SandboxHostLinux::GetInstance()->Init();
++ base::FileHandleMappingVector fds_to_map;
++ const int sfd = SandboxHostLinux::GetInstance()->GetChildSocket();
++ fds_to_map.push_back(std::make_pair(sfd, service_manager::GetSandboxFD()));
+ #endif
+
+ #if defined(USE_X11)
+@@ -658,7 +670,7 @@ int BrowserMainLoop::EarlyInitialization() {
+ }
+ #endif // !defined(OS_MACOSX)
+
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_CHROMEOS) || \
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD) || \
+ defined(OS_ANDROID)
+ // We use quite a few file descriptors for our IPC as well as disk the disk
+ // cache,and the default limit on the Mac is low (256), so bump it up.
+@@ -668,7 +680,7 @@ int BrowserMainLoop::EarlyInitialization() {
+ // users can easily hit this limit with many open tabs. Bump up the limit to
+ // an arbitrarily high number. See https://crbug.com/539567
+ base::IncreaseFdLimitTo(8192);
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_CHROMEOS) ||
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD) ||
+ // defined(OS_ANDROID)
+
+ #if defined(OS_WIN)
diff --git a/www/iridium/files/patch-content_browser_child__process__launcher__helper__linux.cc b/www/iridium/files/patch-content_browser_child__process__launcher__helper__linux.cc
new file mode 100644
index 000000000000..49d1b92ec5ea
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_child__process__launcher__helper__linux.cc
@@ -0,0 +1,76 @@
+--- content/browser/child_process_launcher_helper_linux.cc.orig 2020-02-03 21:52:45 UTC
++++ content/browser/child_process_launcher_helper_linux.cc
+@@ -17,7 +17,9 @@
+ #include "content/public/common/sandboxed_process_launcher_delegate.h"
+ #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+ #include "services/service_manager/zygote/common/common_sandbox_support_linux.h"
++#if !defined(OS_BSD)
+ #include "services/service_manager/zygote/common/zygote_handle.h"
++#endif
+ #include "services/service_manager/zygote/host/zygote_communication_linux.h"
+ #include "services/service_manager/zygote/host/zygote_host_impl_linux.h"
+
+@@ -68,6 +70,7 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ int* launch_result) {
+ *is_synchronous_launch = true;
+
++#if !defined(OS_BSD)
+ service_manager::ZygoteHandle zygote_handle =
+ base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoZygote)
+ ? nullptr
+@@ -81,7 +84,6 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ GetProcessType());
+ *launch_result = LAUNCH_RESULT_SUCCESS;
+
+-#if !defined(OS_OPENBSD)
+ if (handle) {
+ // This is just a starting score for a renderer or extension (the
+ // only types of processes that will be started this way). It will
+@@ -92,13 +94,13 @@ ChildProcessLauncherHelper::LaunchProcessOnLauncherThr
+ service_manager::ZygoteHostImpl::GetInstance()->AdjustRendererOOMScore(
+ handle, kLowestRendererOomScore);
+ }
+-#endif
+
+ Process process;
+ process.process = base::Process(handle);
+ process.zygote = zygote_handle;
+ return process;
+ }
++#endif
+
+ Process process;
+ process.process = base::LaunchProcess(*command_line(), options);
+@@ -116,10 +118,14 @@ ChildProcessTerminationInfo ChildProcessLauncherHelper
+ const ChildProcessLauncherHelper::Process& process,
+ bool known_dead) {
+ ChildProcessTerminationInfo info;
++#if !defined(OS_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 {
+@@ -143,13 +149,17 @@ void ChildProcessLauncherHelper::ForceNormalProcessTer
+ DCHECK(CurrentlyOnProcessLauncherTaskRunner());
+ process.process.Terminate(service_manager::RESULT_CODE_NORMAL_EXIT, false);
+ // On POSIX, we must additionally reap the child.
++#if !defined(OS_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 !defined(OS_BSD)
+ }
++#endif
+ }
+
+ void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread(
diff --git a/www/iridium/files/patch-content_browser_devtools_protocol_system__info__handler.cc b/www/iridium/files/patch-content_browser_devtools_protocol_system__info__handler.cc
new file mode 100644
index 000000000000..3751c782527d
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_devtools_protocol_system__info__handler.cc
@@ -0,0 +1,11 @@
+--- content/browser/devtools/protocol/system_info_handler.cc.orig 2019-12-16 21:51:26 UTC
++++ content/browser/devtools/protocol/system_info_handler.cc
+@@ -48,7 +48,7 @@ std::unique_ptr<SystemInfo::Size> GfxSizeToSystemInfoS
+ // Give the GPU process a few seconds to provide GPU info.
+ // Linux Debug builds need more time -- see Issue 796437.
+ // Windows builds need more time -- see Issue 873112 and 1004472.
+-#if (defined(OS_LINUX) && !defined(NDEBUG))
++#if ((defined(OS_LINUX) || defined(OS_BSD)) && !defined(NDEBUG))
+ const int kGPUInfoWatchdogTimeoutMs = 20000;
+ #elif defined(OS_WIN)
+ const int kGPUInfoWatchdogTimeoutMs = 30000;
diff --git a/www/iridium/files/patch-content_browser_gpu_gpu__process__host.cc b/www/iridium/files/patch-content_browser_gpu_gpu__process__host.cc
new file mode 100644
index 000000000000..78851da5e325
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_gpu_gpu__process__host.cc
@@ -0,0 +1,11 @@
+--- content/browser/gpu/gpu_process_host.cc.orig 2020-03-16 18:40:31 UTC
++++ content/browser/gpu/gpu_process_host.cc
+@@ -1086,7 +1086,7 @@ bool GpuProcessHost::LaunchGpuProcess() {
+ std::unique_ptr<base::CommandLine> cmd_line =
+ std::make_unique<base::CommandLine>(base::CommandLine::NO_PROGRAM);
+ #else
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int child_flags = gpu_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF
+ : ChildProcessHost::CHILD_NORMAL;
+ #elif defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-content_browser_media_media__internals.cc b/www/iridium/files/patch-content_browser_media_media__internals.cc
new file mode 100644
index 000000000000..1e117219d0e9
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_media_media__internals.cc
@@ -0,0 +1,11 @@
+--- content/browser/media/media_internals.cc.orig 2020-03-16 18:40:31 UTC
++++ content/browser/media/media_internals.cc
+@@ -531,7 +531,7 @@ void MediaInternals::UpdateVideoCaptureDeviceCapabilit
+ device_dict->SetString("id", descriptor.device_id);
+ device_dict->SetString("name", descriptor.GetNameAndModel());
+ device_dict->Set("formats", std::move(format_list));
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || \
+ defined(OS_ANDROID)
+ device_dict->SetString("captureApi", descriptor.GetCaptureApiTypeString());
+ #endif
diff --git a/www/iridium/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc b/www/iridium/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc
new file mode 100644
index 000000000000..ff345048baf2
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_memory_swap__metrics__driver__impl__linux.cc
@@ -0,0 +1,27 @@
+--- content/browser/memory/swap_metrics_driver_impl_linux.cc.orig 2019-03-11 22:00:57 UTC
++++ content/browser/memory/swap_metrics_driver_impl_linux.cc
+@@ -43,6 +43,7 @@ SwapMetricsDriverImplLinux::~SwapMetricsDriverImplLinu
+
+ SwapMetricsDriver::SwapMetricsUpdateResult
+ SwapMetricsDriverImplLinux::UpdateMetricsInternal(base::TimeDelta interval) {
++#if !defined(OS_BSD)
+ base::VmStatInfo vmstat;
+ if (!base::GetVmStatInfo(&vmstat)) {
+ return SwapMetricsDriver::SwapMetricsUpdateResult::kSwapMetricsUpdateFailed;
+@@ -55,12 +56,15 @@ SwapMetricsDriverImplLinux::UpdateMetricsInternal(base
+
+ if (interval.is_zero())
+ return SwapMetricsDriver::SwapMetricsUpdateResult::
+- kSwapMetricsUpdateSuccess;
++ kSwapMetricsUpdateSuccess;
+
+ delegate_->OnSwapInCount(in_counts, interval);
+ delegate_->OnSwapOutCount(out_counts, interval);
+
+ return SwapMetricsDriver::SwapMetricsUpdateResult::kSwapMetricsUpdateSuccess;
++#else
++ return SwapMetricsDriver::SwapMetricsUpdateResult::kSwapMetricsUpdateFailed;
++#endif
+ }
+
+ } // namespace content
diff --git a/www/iridium/files/patch-content_browser_ppapi__plugin__process__host.cc b/www/iridium/files/patch-content_browser_ppapi__plugin__process__host.cc
new file mode 100644
index 000000000000..dd7271ca2db7
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_ppapi__plugin__process__host.cc
@@ -0,0 +1,11 @@
+--- content/browser/ppapi_plugin_process_host.cc.orig 2020-02-03 21:53:31 UTC
++++ content/browser/ppapi_plugin_process_host.cc
+@@ -365,7 +365,7 @@ bool PpapiPluginProcessHost::Init(const PepperPluginIn
+ base::CommandLine::StringType plugin_launcher =
+ browser_command_line.GetSwitchValueNative(switches::kPpapiPluginLauncher);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int flags = plugin_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF :
+ ChildProcessHost::CHILD_NORMAL;
+ #elif defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc b/www/iridium/files/patch-content_browser_ppapi__plugin__process__host__receiver__bindings.cc
new file mode 100644
index 000000000000..41c5edc15175
--- /dev/null
+++ b/www/iridium/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 2019-12-17 19:34:30 UTC
++++ content/browser/ppapi_plugin_process_host_receiver_bindings.cc
+@@ -8,7 +8,7 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>())
+ ConnectToFontService(std::move(font_receiver));
+ #endif
diff --git a/www/iridium/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc b/www/iridium/files/patch-content_browser_renderer__host_input_input__device__change__observer.cc
new file mode 100644
index 000000000000..3d6112bc698b
--- /dev/null
+++ b/www/iridium/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 2019-09-09 21:55:16 UTC
++++ content/browser/renderer_host/input/input_device_change_observer.cc
+@@ -10,7 +10,7 @@
+
+ #if defined(OS_WIN)
+ #include "ui/events/devices/input_device_observer_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/events/devices/device_data_manager.h"
+ #elif defined(OS_ANDROID)
+ #include "ui/events/devices/input_device_observer_android.h"
+@@ -22,7 +22,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ render_view_host_impl_ = rvhi;
+ #if defined(OS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->AddObserver(this);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ui::DeviceDataManager::GetInstance()->AddObserver(this);
+ #elif defined(OS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->AddObserver(this);
+@@ -32,7 +32,7 @@ InputDeviceChangeObserver::InputDeviceChangeObserver(R
+ InputDeviceChangeObserver::~InputDeviceChangeObserver() {
+ #if defined(OS_WIN)
+ ui::InputDeviceObserverWin::GetInstance()->RemoveObserver(this);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
+ #elif defined(OS_ANDROID)
+ ui::InputDeviceObserverAndroid::GetInstance()->RemoveObserver(this);
diff --git a/www/iridium/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc b/www/iridium/files/patch-content_browser_renderer__host_pepper_pepper__file__io__host.cc
new file mode 100644
index 000000000000..7e10ee7c69a9
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:31 UTC
++++ content/browser/renderer_host/pepper/pepper_file_io_host.cc
+@@ -433,7 +433,7 @@ void PepperFileIOHost::OnLocalFileOpened(
+ ppapi::host::ReplyMessageContext reply_context,
+ const base::FilePath& path,
+ base::File::Error error_code) {
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_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) {
+@@ -454,7 +454,7 @@ void PepperFileIOHost::OnLocalFileOpened(
+ #endif
+ }
+
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ void PepperFileIOHost::OnLocalFileQuarantined(
+ ppapi::host::ReplyMessageContext reply_context,
+ const base::FilePath& path,
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.cc b/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.cc
new file mode 100644
index 000000000000..91932a38a5e5
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/render_message_filter.cc.orig 2019-12-16 21:50:47 UTC
++++ content/browser/renderer_host/render_message_filter.cc
+@@ -70,7 +70,7 @@
+ #if defined(OS_MACOSX)
+ #include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/linux_util.h"
+ #include "base/threading/platform_thread.h"
+ #endif
+@@ -149,7 +149,7 @@ void RenderMessageFilter::CreateFullscreenWidget(
+ std::move(callback).Run(route_id);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void RenderMessageFilter::SetThreadPriorityOnFileThread(
+ base::PlatformThreadId ns_tid,
+ base::ThreadPriority priority) {
+@@ -170,7 +170,7 @@ void RenderMessageFilter::SetThreadPriorityOnFileThrea
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void RenderMessageFilter::SetThreadPriority(int32_t ns_tid,
+ base::ThreadPriority priority) {
+ constexpr base::TaskTraits kTraits = {
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.h b/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.h
new file mode 100644
index 000000000000..f50e2f2912d6
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_renderer__host_render__message__filter.h
@@ -0,0 +1,19 @@
+--- content/browser/renderer_host/render_message_filter.h.orig 2019-12-16 21:50:47 UTC
++++ content/browser/renderer_host/render_message_filter.h
+@@ -87,14 +87,14 @@ class CONTENT_EXPORT RenderMessageFilter
+ mojo::PendingRemote<mojom::Widget> widget,
+ CreateFullscreenWidgetCallback callback) override;
+ void HasGpuProcess(HasGpuProcessCallback callback) override;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SetThreadPriority(int32_t ns_tid,
+ base::ThreadPriority priority) override;
+ #endif
+
+ void OnResolveProxy(const GURL& url, IPC::Message* reply_msg);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SetThreadPriorityOnFileThread(base::PlatformThreadId ns_tid,
+ base::ThreadPriority priority);
+ #endif
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.cc b/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.cc
new file mode 100644
index 000000000000..f27d90720f9b
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.cc
@@ -0,0 +1,47 @@
+--- content/browser/renderer_host/render_process_host_impl.cc.orig 2020-03-16 18:40:31 UTC
++++ content/browser/renderer_host/render_process_host_impl.cc
+@@ -241,7 +241,7 @@
+ #include "content/browser/gpu/gpu_data_manager_impl.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/resource.h>
+ #include <sys/time.h>
+
+@@ -1176,7 +1176,7 @@ static constexpr size_t kUnknownPlatformProcessLimit =
+ // to indicate failure and std::numeric_limits<size_t>::max() to indicate
+ // unlimited.
+ size_t GetPlatformProcessLimit() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ struct rlimit limit;
+ if (getrlimit(RLIMIT_NPROC, &limit) != 0)
+ return kUnknownPlatformProcessLimit;
+@@ -1187,7 +1187,7 @@ size_t GetPlatformProcessLimit() {
+ #else
+ // TODO(https://crbug.com/104689): Implement on other platforms.
+ return kUnknownPlatformProcessLimit;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+ #endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
+@@ -1256,7 +1256,7 @@ class RenderProcessHostImpl::IOThreadHostImpl
+ return;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>()) {
+ ConnectToFontService(std::move(font_receiver));
+ return;
+@@ -1651,7 +1651,7 @@ bool RenderProcessHostImpl::Init() {
+ renderer_prefix =
+ browser_command_line.GetSwitchValueNative(switches::kRendererCmdPrefix);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int flags = renderer_prefix.empty() ? ChildProcessHost::CHILD_ALLOW_SELF
+ : ChildProcessHost::CHILD_NORMAL;
+ #elif defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.h b/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.h
new file mode 100644
index 000000000000..616427da0032
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_renderer__host_render__process__host__impl.h
@@ -0,0 +1,15 @@
+--- content/browser/renderer_host/render_process_host_impl.h.orig 2020-03-16 18:40:31 UTC
++++ content/browser/renderer_host/render_process_host_impl.h
+@@ -458,10 +458,10 @@ class CONTENT_EXPORT RenderProcessHostImpl
+ is_for_guests_only_ = is_for_guests_only;
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ // Launch the zygote early in the browser startup.
+ static void EarlyZygoteLaunch();
+-#endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ // Called when a video capture stream or an audio stream is added or removed
+ // and used to determine if the process should be backgrounded or not.
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__view__host__impl.cc b/www/iridium/files/patch-content_browser_renderer__host_render__view__host__impl.cc
new file mode 100644
index 000000000000..06332b50ef27
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:31 UTC
++++ content/browser/renderer_host/render_view_host_impl.cc
+@@ -206,7 +206,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 defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ prefs->system_font_family_name = gfx::Font().GetFontName();
+ #endif
+ }
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc b/www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
new file mode 100644
index 000000000000..99de1314b9ec
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__aura.cc
@@ -0,0 +1,29 @@
+--- content/browser/renderer_host/render_widget_host_view_aura.cc.orig 2020-03-16 18:40:31 UTC
++++ content/browser/renderer_host/render_widget_host_view_aura.cc
+@@ -115,7 +115,7 @@
+ #include "content/browser/accessibility/browser_accessibility_auralinux.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+ #endif
+@@ -2171,7 +2171,7 @@ bool RenderWidgetHostViewAura::NeedsInputGrab() {
+ }
+
+ bool RenderWidgetHostViewAura::NeedsMouseCapture() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ return NeedsInputGrab();
+ #endif
+ return false;
+@@ -2340,7 +2340,7 @@ void RenderWidgetHostViewAura::ForwardKeyboardEventWit
+ if (!target_host)
+ return;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ ui::TextEditKeyBindingsDelegateAuraLinux* keybinding_delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
diff --git a/www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc b/www/iridium/files/patch-content_browser_renderer__host_render__widget__host__view__event__handler.cc
new file mode 100644
index 000000000000..7321b9e2f949
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:53:31 UTC
++++ content/browser/renderer_host/render_widget_host_view_event_handler.cc
+@@ -611,7 +611,7 @@ bool RenderWidgetHostViewEventHandler::CanRendererHand
+ if (event->type() == ui::ET_MOUSE_EXITED) {
+ if (mouse_locked || selection_popup)
+ return false;
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-content_browser_scheduler_responsiveness_jank__monitor.cc b/www/iridium/files/patch-content_browser_scheduler_responsiveness_jank__monitor.cc
new file mode 100644
index 000000000000..68b512d069c4
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_scheduler_responsiveness_jank__monitor.cc
@@ -0,0 +1,11 @@
+--- content/browser/scheduler/responsiveness/jank_monitor.cc.orig 2020-02-03 21:53:31 UTC
++++ content/browser/scheduler/responsiveness/jank_monitor.cc
+@@ -321,7 +321,7 @@ void JankMonitor::ThreadExecutionState::DidRunTaskOrEv
+ // 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 !defined(OS_CHROMEOS) && defined(OS_LINUX) && defined(USE_OZONE)
++#if !defined(OS_CHROMEOS) && (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_OZONE)
+ task_execution_metadata_.clear();
+ #endif
+ return;
diff --git a/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc b/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc
new file mode 100644
index 000000000000..906761601b4b
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.cc
@@ -0,0 +1,29 @@
+--- content/browser/scheduler/responsiveness/native_event_observer.cc.orig 2019-03-11 22:00:58 UTC
++++ content/browser/scheduler/responsiveness/native_event_observer.cc
+@@ -15,7 +15,7 @@
+
+ #include "ui/events/platform/platform_event_source.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/aura/env.h"
+ #include "ui/events/event.h"
+ #endif
+@@ -39,7 +39,7 @@ NativeEventObserver::~NativeEventObserver() {
+ DeregisterObserver();
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void NativeEventObserver::RegisterObserver() {
+ aura::Env::GetInstance()->AddWindowEventDispatcherObserver(this);
+ }
+@@ -61,7 +61,7 @@ void NativeEventObserver::OnWindowEventDispatcherFinis
+ did_run_event_callback_.Run(info.unique_id);
+ events_being_processed_.pop_back();
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN)
+ void NativeEventObserver::RegisterObserver() {
diff --git a/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h b/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h
new file mode 100644
index 000000000000..03b31b8d904e
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_scheduler_responsiveness_native__event__observer.h
@@ -0,0 +1,47 @@
+--- content/browser/scheduler/responsiveness/native_event_observer.h.orig 2019-03-11 22:00:58 UTC
++++ content/browser/scheduler/responsiveness/native_event_observer.h
+@@ -14,7 +14,7 @@
+ #include "content/public/browser/native_event_processor_observer_mac.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/aura/window_event_dispatcher_observer.h"
+ #endif
+
+@@ -39,7 +39,7 @@ namespace responsiveness {
+ class CONTENT_EXPORT NativeEventObserver
+ #if defined(OS_MACOSX)
+ : public NativeEventProcessorObserver
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ : public aura::WindowEventDispatcherObserver
+ #elif defined(OS_WIN)
+ : public base::MessagePumpForUI::Observer
+@@ -56,7 +56,7 @@ class CONTENT_EXPORT NativeEventObserver
+ NativeEventObserver(WillRunEventCallback will_run_event_callback,
+ DidRunEventCallback did_run_event_callback);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ~NativeEventObserver() override;
+ #else
+ virtual ~NativeEventObserver();
+@@ -68,7 +68,7 @@ class CONTENT_EXPORT NativeEventObserver
+ // Exposed for tests.
+ void WillRunNativeEvent(const void* opaque_identifier) override;
+ void DidRunNativeEvent(const void* opaque_identifier) override;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ // aura::WindowEventDispatcherObserver overrides:
+ void OnWindowEventDispatcherStartedProcessing(
+ aura::WindowEventDispatcher* dispatcher,
+@@ -85,7 +85,7 @@ class CONTENT_EXPORT NativeEventObserver
+ void RegisterObserver();
+ void DeregisterObserver();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ struct EventInfo {
+ const void* unique_id;
+ };
diff --git a/www/iridium/files/patch-content_browser_scheduler_responsiveness_watcher.cc b/www/iridium/files/patch-content_browser_scheduler_responsiveness_watcher.cc
new file mode 100644
index 000000000000..ebeeac2a51c1
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_scheduler_responsiveness_watcher.cc
@@ -0,0 +1,20 @@
+--- content/browser/scheduler/responsiveness/watcher.cc.orig 2020-02-03 21:52:46 UTC
++++ content/browser/scheduler/responsiveness/watcher.cc
+@@ -101,7 +101,7 @@ void Watcher::DidRunTask(const base::PendingTask* task
+ // 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 !defined(OS_CHROMEOS) && defined(OS_LINUX) && defined(USE_OZONE)
++#if !defined(OS_CHROMEOS) && (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_OZONE)
+ return currently_running_metadata_ui_.clear();
+ #endif
+ DCHECK_LE(*mismatched_task_identifiers, 1);
+@@ -170,7 +170,7 @@ void Watcher::DidRunEventOnUIThread(const void* opaque
+ mismatched_event_identifiers_ui_ += 1;
+ // See comment in DidRunTask() for why |currently_running_metadata_ui_| may
+ // be reset.
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX) && defined(USE_OZONE)
++#if !defined(OS_CHROMEOS) && (defined(OS_LINUX) || defined(OS_BSD)) && defined(USE_OZONE)
+ return currently_running_metadata_ui_.clear();
+ #endif
+ DCHECK_LE(mismatched_event_identifiers_ui_, 1);
diff --git a/www/iridium/files/patch-content_browser_utility__process__host.cc b/www/iridium/files/patch-content_browser_utility__process__host.cc
new file mode 100644
index 000000000000..8360a7efdc5e
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_utility__process__host.cc
@@ -0,0 +1,11 @@
+--- content/browser/utility_process_host.cc.orig 2020-03-16 18:40:32 UTC
++++ content/browser/utility_process_host.cc
+@@ -210,7 +210,7 @@ UtilityProcessHost::UtilityProcessHost()
+
+ UtilityProcessHost::UtilityProcessHost(std::unique_ptr<Client> client)
+ : sandbox_type_(service_manager::SandboxType::kUtility),
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ child_flags_(ChildProcessHost::CHILD_ALLOW_SELF),
+ #else
+ child_flags_(ChildProcessHost::CHILD_NORMAL),
diff --git a/www/iridium/files/patch-content_browser_utility__process__host__receiver__bindings.cc b/www/iridium/files/patch-content_browser_utility__process__host__receiver__bindings.cc
new file mode 100644
index 000000000000..a69a1ccfe8b3
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_utility__process__host__receiver__bindings.cc
@@ -0,0 +1,20 @@
+--- content/browser/utility_process_host_receiver_bindings.cc.orig 2020-02-26 13:18:37 UTC
++++ content/browser/utility_process_host_receiver_bindings.cc
+@@ -8,7 +8,7 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 UtilityProcessHost::BindHostReceiver(
+ mojo::GenericPendingReceiver receiver) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (auto font_receiver = receiver.As<font_service::mojom::FontService>()) {
+ ConnectToFontService(std::move(font_receiver));
+ return;
diff --git a/www/iridium/files/patch-content_browser_v8__snapshot__files.cc b/www/iridium/files/patch-content_browser_v8__snapshot__files.cc
new file mode 100644
index 000000000000..957c743c222c
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_v8__snapshot__files.cc
@@ -0,0 +1,11 @@
+--- content/browser/v8_snapshot_files.cc.orig 2020-02-24 18:39:15 UTC
++++ content/browser/v8_snapshot_files.cc
+@@ -10,7 +10,7 @@
+ namespace content {
+
+ std::map<std::string, base::FilePath> GetV8SnapshotFilesToPreload() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #if defined(USE_V8_CONTEXT_SNAPSHOT)
+ return {{kV8ContextSnapshotDataDescriptor,
+ base::FilePath(FILE_PATH_LITERAL("v8_context_snapshot.bin"))}};
diff --git a/www/iridium/files/patch-content_browser_webui_shared__resources__data__source.cc b/www/iridium/files/patch-content_browser_webui_shared__resources__data__source.cc
new file mode 100644
index 000000000000..cb181bd0c0b3
--- /dev/null
+++ b/www/iridium/files/patch-content_browser_webui_shared__resources__data__source.cc
@@ -0,0 +1,17 @@
+--- content/browser/webui/shared_resources_data_source.cc.orig 2020-03-16 18:39:50 UTC
++++ content/browser/webui/shared_resources_data_source.cc
+@@ -131,12 +131,12 @@ const std::map<int, std::string> CreateMojoResourceIdT
+ "mojo/mojo/public/mojom/base/text_direction.mojom.html"},
+ {IDR_MOJO_TEXT_DIRECTION_MOJOM_LITE_JS,
+ "mojo/mojo/public/mojom/base/text_direction.mojom-lite.js"},
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ {IDR_MOJO_TIME_MOJOM_HTML,
+ "mojo/mojo/public/mojom/base/time.mojom.html"},
+ {IDR_MOJO_TIME_MOJOM_LITE_JS,
+ "mojo/mojo/public/mojom/base/time.mojom-lite.js"},
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ };
+ }
+
diff --git a/www/iridium/files/patch-content_common_BUILD.gn b/www/iridium/files/patch-content_common_BUILD.gn
new file mode 100644
index 000000000000..3d0913b5242b
--- /dev/null
+++ b/www/iridium/files/patch-content_common_BUILD.gn
@@ -0,0 +1,15 @@
+--- content/common/BUILD.gn.orig 2020-03-16 18:40:32 UTC
++++ content/common/BUILD.gn
+@@ -356,6 +356,12 @@ source_set("common") {
+ libs += [ "android" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "sandbox_init_linux.cc",
++ ]
++ }
++
+ if (is_debug && !is_component_build && enable_plugins) {
+ # Content depends on the PPAPI message logging stuff; if this isn't here,
+ # some unit test binaries won't compile. This only worked in release mode
diff --git a/www/iridium/files/patch-content_common_common__sandbox__support__linux.cc b/www/iridium/files/patch-content_common_common__sandbox__support__linux.cc
new file mode 100644
index 000000000000..95e576060511
--- /dev/null
+++ b/www/iridium/files/patch-content_common_common__sandbox__support__linux.cc
@@ -0,0 +1,10 @@
+--- content/common/common_sandbox_support_linux.cc.orig 2019-03-11 22:00:58 UTC
++++ content/common/common_sandbox_support_linux.cc
+@@ -5,6 +5,7 @@
+ #include "content/public/common/common_sandbox_support_linux.h"
+
+ #include <sys/stat.h>
++#include <unistd.h>
+
+ #include <limits>
+ #include <memory>
diff --git a/www/iridium/files/patch-content_common_user__agent.cc b/www/iridium/files/patch-content_common_user__agent.cc
new file mode 100644
index 000000000000..d842b3145b5d
--- /dev/null
+++ b/www/iridium/files/patch-content_common_user__agent.cc
@@ -0,0 +1,17 @@
+--- content/common/user_agent.cc.orig 2020-03-16 18:40:32 UTC
++++ content/common/user_agent.cc
+@@ -140,6 +140,14 @@ std::string BuildOSCpuInfo(bool include_android_build_
+ #endif
+ );
+
++#if defined(OS_BSD)
++#if defined(__x86_64__)
++ base::StringAppendF(&os_cpu, "; Linux x86_64");
++#else
++ base::StringAppendF(&os_cpu, "; Linux i686");
++#endif
++#endif
++
+ return os_cpu;
+ }
+
diff --git a/www/iridium/files/patch-content_gpu_BUILD.gn b/www/iridium/files/patch-content_gpu_BUILD.gn
new file mode 100644
index 000000000000..538b4bc2f7bc
--- /dev/null
+++ b/www/iridium/files/patch-content_gpu_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/gpu/BUILD.gn.orig 2020-03-16 18:40:32 UTC
++++ content/gpu/BUILD.gn
+@@ -128,7 +128,7 @@ target(link_target_type, "gpu_sources") {
+
+ # Use DRI on desktop Linux builds.
+ if (current_cpu != "s390x" && current_cpu != "ppc64" && is_desktop_linux &&
+- (!is_chromecast || is_cast_desktop_build)) {
++ (!is_chromecast || is_cast_desktop_build) && !is_bsd) {
+ configs += [ "//build/config/linux/dri" ]
+ }
+ }
diff --git a/www/iridium/files/patch-content_gpu_gpu__main.cc b/www/iridium/files/patch-content_gpu_gpu__main.cc
new file mode 100644
index 000000000000..ba08acddf473
--- /dev/null
+++ b/www/iridium/files/patch-content_gpu_gpu__main.cc
@@ -0,0 +1,56 @@
+--- content/gpu/gpu_main.cc.orig 2020-03-16 18:40:32 UTC
++++ content/gpu/gpu_main.cc
+@@ -84,7 +84,7 @@
+ #include "ui/gfx/x/x11_switches.h" // nogncheck
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "content/gpu/gpu_sandbox_hook_linux.h"
+ #include "content/public/common/sandbox_init.h"
+ #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+@@ -109,7 +109,7 @@ namespace content {
+
+ namespace {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread*,
+ const gpu::GPUInfo*,
+ const gpu::GpuPreferences&);
+@@ -177,7 +177,7 @@ class ContentSandboxHelper : public gpu::GpuSandboxHel
+ bool EnsureSandboxInitialized(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) override {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ return StartSandboxLinux(watchdog_thread, gpu_info, gpu_prefs);
+ #elif defined(OS_WIN)
+ return StartSandboxWindows(sandbox_info_);
+@@ -301,7 +301,7 @@ int GpuMain(const MainFunctionParams& parameters) {
+ main_thread_task_executor =
+ std::make_unique<base::SingleThreadTaskExecutor>(
+ gpu_preferences.message_pump_type);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #error "Unsupported Linux platform."
+ #elif defined(OS_MACOSX)
+ // Cross-process CoreAnimation requires a CFRunLoop to function at all, and
+@@ -442,7 +442,7 @@ int GpuMain(const MainFunctionParams& parameters) {
+
+ namespace {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdog_thread,
+ const gpu::GPUInfo* gpu_info,
+ const gpu::GpuPreferences& gpu_prefs) {
+@@ -479,7 +479,7 @@ bool StartSandboxLinux(gpu::GpuWatchdogThread* watchdo
+
+ return res;
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) && !defined(OS_BSD)
+
+ #if defined(OS_WIN)
+ bool StartSandboxWindows(const sandbox::SandboxInterfaceInfo* sandbox_info) {
diff --git a/www/iridium/files/patch-content_gpu_gpu__sandbox__hook__linux.cc b/www/iridium/files/patch-content_gpu_gpu__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..55ec485ae8ec
--- /dev/null
+++ b/www/iridium/files/patch-content_gpu_gpu__sandbox__hook__linux.cc
@@ -0,0 +1,58 @@
+--- content/gpu/gpu_sandbox_hook_linux.cc.orig 2020-03-16 18:39:50 UTC
++++ content/gpu/gpu_sandbox_hook_linux.cc
+@@ -97,8 +97,9 @@ static const char kLibV4lEncPluginPath[] =
+ "/usr/lib/libv4l/plugins/libv4l-encplugin.so";
+ #endif
+
+-constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE;
++constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL;
+
++#if !defined(OS_BSD)
+ void AddV4L2GpuWhitelist(
+ std::vector<BrokerFilePermission>* permissions,
+ const service_manager::SandboxSeccompBPF::Options& options) {
+@@ -333,8 +334,10 @@ std::vector<BrokerFilePermission> FilePermissionsForGp
+ AddStandardGpuWhiteList(&permissions);
+ return permissions;
+ }
++#endif
+
+ void LoadArmGpuLibraries() {
++#if !defined(OS_BSD)
+ // Preload the Mali library.
+ if (UseChromecastSandboxWhitelist()) {
+ for (const char* path : kWhitelistedChromecastPaths) {
+@@ -349,6 +352,7 @@ void LoadArmGpuLibraries() {
+ // Preload the Tegra V4L2 (video decode acceleration) library.
+ dlopen(kLibTegraPath, dlopen_flag);
+ }
++#endif
+ }
+
+ bool LoadAmdGpuLibraries() {
+@@ -404,6 +408,7 @@ bool LoadLibrariesForGpu(
+ return true;
+ }
+
++#if !defined(OS_BSD)
+ sandbox::syscall_broker::BrokerCommandSet CommandSetForGPU(
+ const service_manager::SandboxLinux::Options& options) {
+ sandbox::syscall_broker::BrokerCommandSet command_set;
+@@ -425,13 +430,17 @@ bool BrokerProcessPreSandboxHook(
+ service_manager::SetProcessTitleFromCommandLine(nullptr);
+ return true;
+ }
++#endif
+
+ } // namespace
+
+ bool GpuProcessPreSandboxHook(service_manager::SandboxLinux::Options options) {
++ NOTIMPLEMENTED();
++#if !defined(OS_BSD)
+ service_manager::SandboxLinux::GetInstance()->StartBrokerProcess(
+ CommandSetForGPU(options), FilePermissionsForGpu(options),
+ base::BindOnce(BrokerProcessPreSandboxHook), options);
++#endif
+
+ if (!LoadLibrariesForGpu(options))
+ return false;
diff --git a/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc b/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
new file mode 100644
index 000000000000..8708f1d34421
--- /dev/null
+++ b/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.cc
@@ -0,0 +1,29 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.cc.orig 2020-02-03 21:52:46 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.cc
+@@ -19,7 +19,7 @@
+
+ #if defined(OS_MACOSX)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #include "mojo/public/cpp/bindings/pending_remote.h"
+ #endif
+@@ -34,7 +34,7 @@ typedef struct CGFont* CGFontRef;
+ namespace content {
+
+ PpapiBlinkPlatformImpl::PpapiBlinkPlatformImpl() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ ChildThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -52,7 +52,7 @@ PpapiBlinkPlatformImpl::~PpapiBlinkPlatformImpl() {
+ void PpapiBlinkPlatformImpl::Shutdown() {}
+
+ blink::WebSandboxSupport* PpapiBlinkPlatformImpl::GetSandboxSupport() {
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ return sandbox_support_.get();
+ #else
+ return nullptr;
diff --git a/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h b/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
new file mode 100644
index 000000000000..d246feb0e6c4
--- /dev/null
+++ b/www/iridium/files/patch-content_ppapi__plugin_ppapi__blink__platform__impl.h
@@ -0,0 +1,25 @@
+--- content/ppapi_plugin/ppapi_blink_platform_impl.h.orig 2019-10-21 19:06:32 UTC
++++ content/ppapi_plugin/ppapi_blink_platform_impl.h
+@@ -13,7 +13,7 @@
+ #include "build/build_config.h"
+ #include "content/child/blink_platform_impl.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h"
+ #include "third_party/skia/include/core/SkRefCnt.h"
+ #endif
+@@ -36,11 +36,11 @@ class PpapiBlinkPlatformImpl : public BlinkPlatformImp
+ blink::WebThemeEngine* ThemeEngine() override;
+
+ private:
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/www/iridium/files/patch-content_public_app_content__main__delegate.cc b/www/iridium/files/patch-content_public_app_content__main__delegate.cc
new file mode 100644
index 000000000000..22a460c346ac
--- /dev/null
+++ b/www/iridium/files/patch-content_public_app_content__main__delegate.cc
@@ -0,0 +1,18 @@
+--- content/public/app/content_main_delegate.cc.orig 2020-03-16 18:40:32 UTC
++++ content/public/app/content_main_delegate.cc
+@@ -39,13 +39,13 @@ bool ContentMainDelegate::DelaySandboxInitialization(
+ return false;
+ }
+
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+
+ void ContentMainDelegate::ZygoteStarting(
+ std::vector<std::unique_ptr<service_manager::ZygoteForkDelegate>>*
+ delegates) {}
+
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ int ContentMainDelegate::TerminateForFatalInitializationError() {
+ CHECK(false);
diff --git a/www/iridium/files/patch-content_public_app_content__main__delegate.h b/www/iridium/files/patch-content_public_app_content__main__delegate.h
new file mode 100644
index 000000000000..06f339f70e30
--- /dev/null
+++ b/www/iridium/files/patch-content_public_app_content__main__delegate.h
@@ -0,0 +1,20 @@
+--- content/public/app/content_main_delegate.h.orig 2020-03-16 18:40:32 UTC
++++ content/public/app/content_main_delegate.h
+@@ -72,7 +72,7 @@ class CONTENT_EXPORT ContentMainDelegate {
+ // want it at all.
+ virtual bool DelaySandboxInitialization(const std::string& process_type);
+
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ // Tells the embedder that the zygote process is starting, and allows it to
+ // specify one or more zygote delegates if it wishes by storing them in
+ // |*delegates|.
+@@ -82,7 +82,7 @@ class CONTENT_EXPORT ContentMainDelegate {
+
+ // Called every time the zygote process forks.
+ virtual void ZygoteForked() {}
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // Fatal errors during initialization are reported by this function, so that
+ // the embedder can implement graceful exit by displaying some message and
diff --git a/www/iridium/files/patch-content_public_common_child__process__host.h b/www/iridium/files/patch-content_public_common_child__process__host.h
new file mode 100644
index 000000000000..bf91f4c4d0d2
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_child__process__host.h
@@ -0,0 +1,11 @@
+--- content/public/common/child_process_host.h.orig 2020-02-03 21:52:46 UTC
++++ content/public/common/child_process_host.h
+@@ -80,7 +80,7 @@ class CONTENT_EXPORT ChildProcessHost : public IPC::Se
+ // No special behavior requested.
+ CHILD_NORMAL = 0,
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Indicates that the child execed after forking may be execced from
+ // /proc/self/exe rather than using the "real" app path. This prevents
+ // autoupdate from confusing us if it changes the file out from under us.
diff --git a/www/iridium/files/patch-content_public_common_common__param__traits__macros.h b/www/iridium/files/patch-content_public_common_common__param__traits__macros.h
new file mode 100644
index 000000000000..3fa7b395b5ef
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_common__param__traits__macros.h
@@ -0,0 +1,11 @@
+--- content/public/common/common_param_traits_macros.h.orig 2020-03-16 18:40:32 UTC
++++ content/public/common/common_param_traits_macros.h
+@@ -326,7 +326,7 @@ IPC_STRUCT_TRAITS_BEGIN(blink::mojom::RendererPreferen
+ IPC_STRUCT_TRAITS_MEMBER(accept_languages)
+ IPC_STRUCT_TRAITS_MEMBER(disable_client_blocked_error_page)
+ IPC_STRUCT_TRAITS_MEMBER(plugin_fullscreen_allowed)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_MEMBER(system_font_family_name)
+ #endif
+ #if defined(OS_WIN)
diff --git a/www/iridium/files/patch-content_public_common_content__features.cc b/www/iridium/files/patch-content_public_common_content__features.cc
new file mode 100644
index 000000000000..ebaa5f3fdb2a
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_content__features.cc
@@ -0,0 +1,29 @@
+--- content/public/common/content_features.cc.orig 2020-03-16 18:40:32 UTC
++++ content/public/common/content_features.cc
+@@ -48,7 +48,7 @@ const base::Feature kAudioServiceLaunchOnStartup{
+ const base::Feature kAudioServiceOutOfProcess{
+ "AudioServiceOutOfProcess",
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
+@@ -693,7 +693,7 @@ const base::Feature kWebAssemblyThreads {
+ };
+
+ // Enable WebAssembly trap handler.
+-#if (defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)) && \
++#if (defined(OS_BSD) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)) && \
+ defined(ARCH_CPU_X86_64)
+ const base::Feature kWebAssemblyTrapHandler{"WebAssemblyTrapHandler",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+@@ -723,7 +723,7 @@ const base::Feature kWebAuth{"WebAuthentication",
+ // https://w3c.github.io/webauthn
+ const base::Feature kWebAuthCable {
+ "WebAuthenticationCable",
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if (!defined(OS_CHROMEOS) && defined(OS_LINUX)) || defined(OS_BSD)
+ base::FEATURE_DISABLED_BY_DEFAULT
+ #else
+ base::FEATURE_ENABLED_BY_DEFAULT
diff --git a/www/iridium/files/patch-content_public_common_content__switches.cc b/www/iridium/files/patch-content_public_common_content__switches.cc
new file mode 100644
index 000000000000..4f1ae111a366
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_content__switches.cc
@@ -0,0 +1,11 @@
+--- content/public/common/content_switches.cc.orig 2020-03-16 18:40:32 UTC
++++ content/public/common/content_switches.cc
+@@ -997,7 +997,7 @@ const char kEnableAggressiveDOMStorageFlushing[] =
+ // Enable indication that browser is controlled by automation.
+ const char kEnableAutomation[] = "enable-automation";
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_FREEBSD)
+ // 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/www/iridium/files/patch-content_public_common_content__switches.h b/www/iridium/files/patch-content_public_common_content__switches.h
new file mode 100644
index 000000000000..1a705f45ae7f
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_content__switches.h
@@ -0,0 +1,11 @@
+--- content/public/common/content_switches.h.orig 2020-03-16 18:40:32 UTC
++++ content/public/common/content_switches.h
+@@ -278,7 +278,7 @@ CONTENT_EXPORT extern const char kRemoteDebuggingSocke
+ CONTENT_EXPORT extern const char kRendererWaitForJavaDebugger[];
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_FREEBSD)
+ CONTENT_EXPORT extern const char kEnableSpeechDispatcher[];
+ #endif
+
diff --git a/www/iridium/files/patch-content_public_common_use__zoom__for__dsf__policy.cc b/www/iridium/files/patch-content_public_common_use__zoom__for__dsf__policy.cc
new file mode 100644
index 000000000000..b448c3f07db5
--- /dev/null
+++ b/www/iridium/files/patch-content_public_common_use__zoom__for__dsf__policy.cc
@@ -0,0 +1,11 @@
+--- content/public/common/use_zoom_for_dsf_policy.cc.orig 2019-03-11 22:00:58 UTC
++++ content/public/common/use_zoom_for_dsf_policy.cc
+@@ -25,7 +25,7 @@ const base::Feature kUseZoomForDsfEnabledByDefault{
+ #endif
+
+ bool IsUseZoomForDSFEnabledByDefault() {
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ return true;
+ #elif defined(OS_WIN) || defined(OS_ANDROID)
+ return base::FeatureList::IsEnabled(kUseZoomForDsfEnabledByDefault);
diff --git a/www/iridium/files/patch-content_public_test_browser__test__base.cc b/www/iridium/files/patch-content_public_test_browser__test__base.cc
new file mode 100644
index 000000000000..dd60982ba019
--- /dev/null
+++ b/www/iridium/files/patch-content_public_test_browser__test__base.cc
@@ -0,0 +1,31 @@
+--- content/public/test/browser_test_base.cc.orig 2020-04-03 04:11:32 UTC
++++ content/public/test/browser_test_base.cc
+@@ -71,7 +71,7 @@
+ #include "ui/gl/gl_implementation.h"
+ #include "ui/gl/gl_switches.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/platform_window/common/platform_window_defaults.h" // nogncheck
+ #endif
+
+@@ -98,6 +98,10 @@
+ #include "ui/views/test/event_generator_delegate_mac.h"
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <sys/signal.h>
++#endif
++
+ #if defined(OS_POSIX)
+ #include "base/process/process_handle.h"
+ #endif
+@@ -184,7 +188,7 @@ BrowserTestBase::BrowserTestBase()
+ "a new browser test suite that runs on Android, please add it to "
+ "//build/android/pylib/gtest/gtest_test_instance.py.";
+ g_instance_already_created = true;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ui::test::EnableTestConfigForPlatformWindows();
+ #endif
+
diff --git a/www/iridium/files/patch-content_public_test_content__browser__test.cc b/www/iridium/files/patch-content_public_test_content__browser__test.cc
new file mode 100644
index 000000000000..cc6012d2f89e
--- /dev/null
+++ b/www/iridium/files/patch-content_public_test_content__browser__test.cc
@@ -0,0 +1,29 @@
+--- content/public/test/content_browser_test.cc.orig 2020-04-06 08:25:58 UTC
++++ content/public/test/content_browser_test.cc
+@@ -26,7 +26,7 @@
+ #include "base/mac/foundation_util.h"
+ #endif
+
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if (!defined(OS_CHROMEOS) && defined(OS_LINUX)) || defined(OS_BSD)
+ #include "ui/base/ime/init/input_method_initializer.h"
+ #endif
+
+@@ -83,7 +83,7 @@ void ContentBrowserTest::SetUp() {
+ #endif
+
+ // LinuxInputMethodContextFactory has to be initialized.
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if (!defined(OS_CHROMEOS) && defined(OS_LINUX)) || defined(OS_BSD)
+ ui::InitializeInputMethodForTesting();
+ #endif
+
+@@ -96,7 +96,7 @@ void ContentBrowserTest::TearDown() {
+ BrowserTestBase::TearDown();
+
+ // LinuxInputMethodContextFactory has to be shutdown.
+-#if !defined(OS_CHROMEOS) && defined(OS_LINUX)
++#if (!defined(OS_CHROMEOS) && defined(OS_LINUX)) || defined(OS_BSD)
+ ui::ShutdownInputMethodForTesting();
+ #endif
+ }
diff --git a/www/iridium/files/patch-content_public_test_mock__render__thread.cc b/www/iridium/files/patch-content_public_test_mock__render__thread.cc
new file mode 100644
index 000000000000..5b12d835bc18
--- /dev/null
+++ b/www/iridium/files/patch-content_public_test_mock__render__thread.cc
@@ -0,0 +1,11 @@
+--- content/public/test/mock_render_thread.cc.orig 2019-12-16 21:51:26 UTC
++++ content/public/test/mock_render_thread.cc
+@@ -73,7 +73,7 @@ class MockRenderMessageFilterImpl : public mojom::Rend
+ std::move(callback).Run(false);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SetThreadPriority(int32_t platform_thread_id,
+ base::ThreadPriority thread_priority) override {}
+ #endif
diff --git a/www/iridium/files/patch-content_renderer_media_audio_audio__device__factory.cc b/www/iridium/files/patch-content_renderer_media_audio_audio__device__factory.cc
new file mode 100644
index 000000000000..c1a03f802347
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_media_audio_audio__device__factory.cc
@@ -0,0 +1,11 @@
+--- content/renderer/media/audio/audio_device_factory.cc.orig 2019-06-04 18:55:23 UTC
++++ content/renderer/media/audio/audio_device_factory.cc
+@@ -35,7 +35,7 @@ AudioDeviceFactory* AudioDeviceFactory::factory_ = nul
+ namespace {
+
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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/www/iridium/files/patch-content_renderer_render__process__impl.cc b/www/iridium/files/patch-content_renderer_render__process__impl.cc
new file mode 100644
index 000000000000..c0badaab0886
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_render__process__impl.cc
@@ -0,0 +1,20 @@
+--- content/renderer/render_process_impl.cc.orig 2020-03-16 18:40:32 UTC
++++ content/renderer/render_process_impl.cc
+@@ -43,7 +43,7 @@
+ #if defined(OS_WIN)
+ #include "base/win/win_util.h"
+ #endif
+-#if defined(OS_LINUX) && defined(ARCH_CPU_X86_64)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && defined(ARCH_CPU_X86_64)
+ #include "v8/include/v8-wasm-trap-handler-posix.h"
+ #endif
+ namespace {
+@@ -161,7 +161,7 @@ RenderProcessImpl::RenderProcessImpl()
+
+ SetV8FlagIfNotFeature(features::kWebAssemblyTrapHandler,
+ "--no-wasm-trap-handler");
+-#if defined(OS_LINUX) && defined(ARCH_CPU_X86_64)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && defined(ARCH_CPU_X86_64)
+ if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (!command_line->HasSwitch(
diff --git a/www/iridium/files/patch-content_renderer_render__thread__impl.cc b/www/iridium/files/patch-content_renderer_render__thread__impl.cc
new file mode 100644
index 000000000000..c231b5944895
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_render__thread__impl.cc
@@ -0,0 +1,51 @@
+--- content/renderer/render_thread_impl.cc.orig 2020-03-16 18:40:32 UTC
++++ content/renderer/render_thread_impl.cc
+@@ -172,12 +172,21 @@
+ #include "mojo/public/cpp/bindings/message_dumper.h"
+ #endif
+
++#if !defined(OS_BSD)
+ #if defined(OS_MACOSX)
+ #include <malloc/malloc.h>
+ #else
+ #include <malloc.h>
+ #endif
++#endif
+
++#if defined(OS_BSD)
++#include <stddef.h>
++#include <stdint.h>
++#include <sys/param.h>
++#include <sys/sysctl.h>
++#endif
++
+ using base::ThreadRestrictions;
+ using blink::WebDocument;
+ using blink::WebFrame;
+@@ -731,7 +740,7 @@ void RenderThreadImpl::Init() {
+ DCHECK(parsed_num_raster_threads) << string_value;
+ DCHECK_GT(num_raster_threads, 0);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ categorized_worker_pool_->SetBackgroundingCallback(
+ main_thread_scheduler_->DefaultTaskRunner(),
+ base::BindOnce(
+@@ -754,7 +763,7 @@ void RenderThreadImpl::Init() {
+ base::DiscardableMemoryAllocator::SetInstance(
+ discardable_memory_allocator_.get());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (base::FeatureList::IsEnabled(
+ blink::features::kBlinkCompositorUseDisplayThreadPriority)) {
+ render_message_filter()->SetThreadPriority(
+@@ -1136,7 +1145,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl:
+ !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames);
+ #else
+ cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
+-#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ const bool enable_media_stream_gpu_memory_buffers =
+ enable_gpu_memory_buffers &&
+ base::FeatureList::IsEnabled(
diff --git a/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.cc b/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.cc
new file mode 100644
index 000000000000..716ffe45a392
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.cc
@@ -0,0 +1,47 @@
+--- content/renderer/renderer_blink_platform_impl.cc.orig 2020-03-16 18:40:32 UTC
++++ content/renderer/renderer_blink_platform_impl.cc
+@@ -98,7 +98,7 @@
+
+ #if defined(OS_MACOSX)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #endif
+
+@@ -173,7 +173,7 @@ RendererBlinkPlatformImpl::RendererBlinkPlatformImpl(
+ if (RenderThreadImpl::current()) {
+ io_runner_ = RenderThreadImpl::current()->GetIOTaskRunner();
+ thread_safe_sender_ = RenderThreadImpl::current()->thread_safe_sender();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ RenderThreadImpl::current()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -183,7 +183,7 @@ RendererBlinkPlatformImpl::RendererBlinkPlatformImpl(
+ #endif
+ }
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ if (sandboxEnabled()) {
+ #if defined(OS_MACOSX)
+ sandbox_support_ = std::make_unique<WebSandboxSupportMac>();
+@@ -265,7 +265,7 @@ RendererBlinkPlatformImpl::CreateNetworkURLLoaderFacto
+
+ void RendererBlinkPlatformImpl::SetDisplayThreadPriority(
+ base::PlatformThreadId thread_id) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (RenderThreadImpl* render_thread = RenderThreadImpl::current()) {
+ render_thread->render_message_filter()->SetThreadPriority(
+ thread_id, base::ThreadPriority::DISPLAY);
+@@ -278,7 +278,7 @@ blink::BlameContext* RendererBlinkPlatformImpl::GetTop
+ }
+
+ blink::WebSandboxSupport* RendererBlinkPlatformImpl::GetSandboxSupport() {
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ return sandbox_support_.get();
+ #else
+ // These platforms do not require sandbox support.
diff --git a/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.h b/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.h
new file mode 100644
index 000000000000..5aa4c9e85488
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_renderer__blink__platform__impl.h
@@ -0,0 +1,29 @@
+--- content/renderer/renderer_blink_platform_impl.h.orig 2020-02-03 21:53:31 UTC
++++ content/renderer/renderer_blink_platform_impl.h
+@@ -30,7 +30,7 @@
+ #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+ #include "third_party/blink/public/mojom/loader/code_cache.mojom.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h" // nogncheck
+ #include "third_party/skia/include/core/SkRefCnt.h" // nogncheck
+ #endif
+@@ -218,7 +218,7 @@ class CONTENT_EXPORT RendererBlinkPlatformImpl : publi
+
+ scoped_refptr<base::SingleThreadTaskRunner> io_runner_;
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+
+@@ -242,7 +242,7 @@ class CONTENT_EXPORT RendererBlinkPlatformImpl : publi
+ mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host_remote_;
+ mojo::SharedRemote<blink::mojom::CodeCacheHost> code_cache_host_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/www/iridium/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc b/www/iridium/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
new file mode 100644
index 000000000000..3c78e664138b
--- /dev/null
+++ b/www/iridium/files/patch-content_renderer_renderer__main__platform__delegate__linux.cc
@@ -0,0 +1,19 @@
+--- content/renderer/renderer_main_platform_delegate_linux.cc.orig 2020-03-16 18:39:50 UTC
++++ content/renderer/renderer_main_platform_delegate_linux.cc
+@@ -30,6 +30,7 @@ void RendererMainPlatformDelegate::PlatformUninitializ
+ }
+
+ bool RendererMainPlatformDelegate::EnableSandbox() {
++#if !defined(OS_BSD)
+ // The setuid sandbox is started in the zygote process: zygote_main_linux.cc
+ // https://chromium.googlesource.com/chromium/src/+/master/docs/linux/suid_sandbox.md
+ //
+@@ -65,7 +66,7 @@ bool RendererMainPlatformDelegate::EnableSandbox() {
+ CHECK_EQ(errno, EPERM);
+ }
+ #endif // __x86_64__
+-
++#endif // ! OS_BSD
+ return true;
+ }
+
diff --git a/www/iridium/files/patch-content_shell_BUILD.gn b/www/iridium/files/patch-content_shell_BUILD.gn
new file mode 100644
index 000000000000..6a640a666c6a
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/shell/BUILD.gn.orig 2020-03-16 18:40:32 UTC
++++ content/shell/BUILD.gn
+@@ -932,7 +932,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/www/iridium/files/patch-content_shell_app_shell__main__delegate.cc b/www/iridium/files/patch-content_shell_app_shell__main__delegate.cc
new file mode 100644
index 000000000000..9e3e50211c22
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_app_shell__main__delegate.cc
@@ -0,0 +1,20 @@
+--- content/shell/app/shell_main_delegate.cc.orig 2020-03-16 18:40:32 UTC
++++ content/shell/app/shell_main_delegate.cc
+@@ -306,7 +306,7 @@ bool ShellMainDelegate::BasicStartupComplete(int* exit
+ }
+
+ void ShellMainDelegate::PreSandboxStartup() {
+-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
++#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ // Create an instance of the CPU class to parse /proc/cpuinfo and cache
+ // cpu_brand info.
+ base::CPU cpu_info;
+@@ -325,7 +325,7 @@ void ShellMainDelegate::PreSandboxStartup() {
+ // Reporting for sub-processes will be initialized in ZygoteForked.
+ if (process_type != service_manager::switches::kZygoteProcess) {
+ crash_reporter::InitializeCrashpad(process_type.empty(), process_type);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ crash_reporter::SetFirstChanceExceptionHandler(
+ v8::TryHandleWebAssemblyTrapPosix);
+ #endif
diff --git a/www/iridium/files/patch-content_shell_browser_shell__browser__context.cc b/www/iridium/files/patch-content_shell_browser_shell__browser__context.cc
new file mode 100644
index 000000000000..d9388fc9f1d2
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_browser_shell__browser__context.cc
@@ -0,0 +1,20 @@
+--- content/shell/browser/shell_browser_context.cc.orig 2019-10-21 19:06:33 UTC
++++ content/shell/browser/shell_browser_context.cc
+@@ -32,7 +32,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+ #include "base/base_paths_mac.h"
+@@ -107,7 +107,7 @@ void ShellBrowserContext::InitWhileIOAllowed() {
+ #if defined(OS_WIN)
+ CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path_));
+ path_ = path_.Append(std::wstring(L"content_shell"));
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ base::FilePath config_dir(
+ base::nix::GetXDGDirectory(env.get(),
diff --git a/www/iridium/files/patch-content_shell_browser_shell__browser__main__parts.cc b/www/iridium/files/patch-content_shell_browser_shell__browser__main__parts.cc
new file mode 100644
index 000000000000..dc97f7778f08
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_browser_shell__browser__main__parts.cc
@@ -0,0 +1,20 @@
+--- content/shell/browser/shell_browser_main_parts.cc.orig 2019-12-16 21:51:26 UTC
++++ content/shell/browser/shell_browser_main_parts.cc
+@@ -47,7 +47,7 @@
+ #if defined(USE_AURA) && defined(USE_X11)
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/base/ime/init/input_method_initializer.h"
+ #endif
+ #if defined(OS_CHROMEOS)
+@@ -123,7 +123,7 @@ int ShellBrowserMainParts::PreEarlyInitialization() {
+ #if defined(USE_X11)
+ ui::SetDefaultX11ErrorHandlers();
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_BSD) || defined(OS_LINUX))
+ ui::InitializeInputMethodForTesting();
+ #endif
+ #if defined(OS_ANDROID)
diff --git a/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__context.cc b/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__context.cc
new file mode 100644
index 000000000000..09235357330e
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__context.cc
@@ -0,0 +1,11 @@
+--- content/shell/browser/web_test/web_test_browser_context.cc.orig 2020-02-03 21:52:46 UTC
++++ content/shell/browser/web_test/web_test_browser_context.cc
+@@ -27,7 +27,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+ #include "base/base_paths_mac.h"
diff --git a/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__main__parts.cc b/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__main__parts.cc
new file mode 100644
index 000000000000..7aa29e2df609
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_browser_web__test_web__test__browser__main__parts.cc
@@ -0,0 +1,11 @@
+--- content/shell/browser/web_test/web_test_browser_main_parts.cc.orig 2019-09-09 21:55:17 UTC
++++ content/shell/browser/web_test/web_test_browser_main_parts.cc
+@@ -36,7 +36,7 @@
+ #if defined(USE_AURA) && defined(USE_X11)
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/base/ime/init/input_method_initializer.h"
+ #endif
+
diff --git a/www/iridium/files/patch-content_shell_test__runner_test__runner.cc b/www/iridium/files/patch-content_shell_test__runner_test__runner.cc
new file mode 100644
index 000000000000..c2e390ce3a41
--- /dev/null
+++ b/www/iridium/files/patch-content_shell_test__runner_test__runner.cc
@@ -0,0 +1,29 @@
+--- content/shell/test_runner/test_runner.cc.orig 2020-03-16 18:40:32 UTC
++++ content/shell/test_runner/test_runner.cc
+@@ -62,7 +62,7 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/skia_util.h"
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ #include "third_party/blink/public/platform/web_font_render_style.h"
+ #endif
+
+@@ -1532,7 +1532,7 @@ void TestRunner::Reset() {
+ drag_image_.reset();
+
+ blink::WebSecurityPolicy::ClearOriginAccessList();
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ blink::WebFontRenderStyle::SetSubpixelPositioning(false);
+ #endif
+
+@@ -2111,7 +2111,7 @@ void TestRunner::AddOriginAccessAllowListEntry(
+ }
+
+ void TestRunner::SetTextSubpixelPositioning(bool value) {
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ // Since FontConfig doesn't provide a variable to control subpixel
+ // positioning, we'll fall back to setting it globally for all fonts.
+ blink::WebFontRenderStyle::SetSubpixelPositioning(value);
diff --git a/www/iridium/files/patch-content_test_content__test__suite.cc b/www/iridium/files/patch-content_test_content__test__suite.cc
new file mode 100644
index 000000000000..de8be8785a7f
--- /dev/null
+++ b/www/iridium/files/patch-content_test_content__test__suite.cc
@@ -0,0 +1,18 @@
+--- content/test/content_test_suite.cc.orig 2019-12-16 21:50:48 UTC
++++ content/test/content_test_suite.cc
+@@ -84,6 +84,7 @@ void ContentTestSuite::Initialize() {
+ // to initialize GL, so don't do it here.
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ bool is_child_process = command_line->HasSwitch(switches::kTestChildProcess);
++#if !defined(OS_BSD)
+ if (!is_child_process) {
+ gl::GLSurfaceTestSupport::InitializeNoExtensionsOneOff();
+ auto* gpu_feature_info = gpu::GetTestGpuThreadHolder()->GetGpuFeatureInfo();
+@@ -91,6 +92,7 @@ void ContentTestSuite::Initialize() {
+ gpu_feature_info->disabled_extensions);
+ gl::init::InitializeExtensionSettingsOneOffPlatform();
+ }
++#endif
+ testing::TestEventListeners& listeners =
+ testing::UnitTest::GetInstance()->listeners();
+ listeners.Append(new TestInitializationListener);
diff --git a/www/iridium/files/patch-content_utility_BUILD.gn b/www/iridium/files/patch-content_utility_BUILD.gn
new file mode 100644
index 000000000000..6c7ec5a20c2c
--- /dev/null
+++ b/www/iridium/files/patch-content_utility_BUILD.gn
@@ -0,0 +1,11 @@
+--- content/utility/BUILD.gn.orig 2020-03-18 12:50:25 UTC
++++ content/utility/BUILD.gn
+@@ -78,7 +78,7 @@ jumbo_source_set("utility") {
+ deps += [ "//services/proxy_resolver:lib" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ deps += [ "//content/utility/soda:soda_sandbox_hook" ]
+ }
+ }
diff --git a/www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc b/www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.cc
new file mode 100644
index 000000000000..37e61a50af20
--- /dev/null
+++ b/www/iridium/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 2019-12-16 21:50:48 UTC
++++ content/utility/utility_blink_platform_with_sandbox_support_impl.cc
+@@ -9,7 +9,7 @@
+
+ #if defined(OS_MACOSX)
+ #include "content/child/child_process_sandbox_support_impl_mac.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "content/child/child_process_sandbox_support_impl_linux.h"
+ #endif
+
+@@ -17,7 +17,7 @@ namespace content {
+
+ UtilityBlinkPlatformWithSandboxSupportImpl::
+ UtilityBlinkPlatformWithSandboxSupportImpl() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ mojo::PendingRemote<font_service::mojom::FontService> font_service;
+ UtilityThread::Get()->BindHostReceiver(
+ font_service.InitWithNewPipeAndPassReceiver());
+@@ -34,7 +34,7 @@ UtilityBlinkPlatformWithSandboxSupportImpl::
+
+ blink::WebSandboxSupport*
+ UtilityBlinkPlatformWithSandboxSupportImpl::GetSandboxSupport() {
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ return sandbox_support_.get();
+ #else
+ return nullptr;
diff --git a/www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h b/www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h
new file mode 100644
index 000000000000..23f525c1b117
--- /dev/null
+++ b/www/iridium/files/patch-content_utility_utility__blink__platform__with__sandbox__support__impl.h
@@ -0,0 +1,24 @@
+--- content/utility/utility_blink_platform_with_sandbox_support_impl.h.orig 2019-12-16 21:50:48 UTC
++++ content/utility/utility_blink_platform_with_sandbox_support_impl.h
+@@ -11,7 +11,7 @@
+ #include "build/build_config.h"
+ #include "third_party/blink/public/platform/platform.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "components/services/font/public/cpp/font_loader.h" // nogncheck
+ #include "third_party/skia/include/core/SkRefCnt.h" // nogncheck
+ #endif
+@@ -33,10 +33,10 @@ class UtilityBlinkPlatformWithSandboxSupportImpl : pub
+ blink::WebSandboxSupport* GetSandboxSupport() override;
+
+ private:
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ std::unique_ptr<blink::WebSandboxSupport> sandbox_support_;
+ #endif
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ sk_sp<font_service::FontLoader> font_loader_;
+ #endif
+
diff --git a/www/iridium/files/patch-device_bluetooth_BUILD.gn b/www/iridium/files/patch-device_bluetooth_BUILD.gn
new file mode 100644
index 000000000000..222316adc8f5
--- /dev/null
+++ b/www/iridium/files/patch-device_bluetooth_BUILD.gn
@@ -0,0 +1,11 @@
+--- device/bluetooth/BUILD.gn.orig 2020-03-16 18:39:51 UTC
++++ device/bluetooth/BUILD.gn
+@@ -275,7 +275,7 @@ component("bluetooth") {
+ ]
+ }
+
+- if (is_chromeos || is_linux) {
++ if (is_chromeos || (is_linux && !is_bsd)) {
+ if (use_dbus) {
+ sources += [
+ "bluez/bluetooth_adapter_bluez.cc",
diff --git a/www/iridium/files/patch-device_gamepad_gamepad__provider.cc b/www/iridium/files/patch-device_gamepad_gamepad__provider.cc
new file mode 100644
index 000000000000..7c9a18a60c34
--- /dev/null
+++ b/www/iridium/files/patch-device_gamepad_gamepad__provider.cc
@@ -0,0 +1,11 @@
+--- device/gamepad/gamepad_provider.cc.orig 2020-03-16 18:39:51 UTC
++++ device/gamepad/gamepad_provider.cc
+@@ -147,7 +147,7 @@ void GamepadProvider::Initialize(std::unique_ptr<Gamep
+
+ if (!polling_thread_)
+ polling_thread_.reset(new base::Thread("Gamepad polling thread"));
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-device_gamepad_hid__writer__linux.cc b/www/iridium/files/patch-device_gamepad_hid__writer__linux.cc
new file mode 100644
index 000000000000..f962ad16a8f5
--- /dev/null
+++ b/www/iridium/files/patch-device_gamepad_hid__writer__linux.cc
@@ -0,0 +1,11 @@
+--- device/gamepad/hid_writer_linux.cc.orig 2019-10-31 07:37:06 UTC
++++ device/gamepad/hid_writer_linux.cc
+@@ -4,6 +4,8 @@
+
+ #include "device/gamepad/hid_writer_linux.h"
+
++#include <unistd.h>
++
+ #include "base/posix/eintr_wrapper.h"
+
+ namespace device {
diff --git a/www/iridium/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc b/www/iridium/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc
new file mode 100644
index 000000000000..697ace21a29a
--- /dev/null
+++ b/www/iridium/files/patch-extensions_browser_api_declarative__webrequest_webrequest__action.cc
@@ -0,0 +1,14 @@
+--- extensions/browser/api/declarative_webrequest/webrequest_action.cc.orig 2019-10-21 19:06:34 UTC
++++ extensions/browser/api/declarative_webrequest/webrequest_action.cc
+@@ -27,7 +27,11 @@
+ #include "extensions/common/extension.h"
+ #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+ #include "net/http/http_util.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using extension_web_request_api_helpers::EventResponseDelta;
+
diff --git a/www/iridium/files/patch-extensions_browser_api_messaging_message__service.cc b/www/iridium/files/patch-extensions_browser_api_messaging_message__service.cc
new file mode 100644
index 000000000000..7ded2d7c1140
--- /dev/null
+++ b/www/iridium/files/patch-extensions_browser_api_messaging_message__service.cc
@@ -0,0 +1,34 @@
+--- extensions/browser/api/messaging/message_service.cc.orig 2020-02-03 21:52:46 UTC
++++ extensions/browser/api/messaging/message_service.cc
+@@ -61,7 +61,7 @@ namespace {
+
+ const char kReceivingEndDoesntExistError[] =
+ "Could not establish connection. Receiving end does not exist.";
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ const char kMissingPermissionError[] =
+ "Access to native messaging requires nativeMessaging permission.";
+ const char kProhibitedByPoliciesError[] =
+@@ -391,7 +391,7 @@ void MessageService::OpenChannelToNativeApp(
+ if (!opener_port->IsValidPort())
+ return;
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ bool has_permission = extension->permissions_data()->HasAPIPermission(
+ APIPermission::kNativeMessaging);
+ if (!has_permission) {
+@@ -441,11 +441,11 @@ void MessageService::OpenChannelToNativeApp(
+ channel->opener->IncrementLazyKeepaliveCount();
+
+ AddChannel(std::move(channel), receiver_port_id);
+-#else // !(defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX))
++#else // !(defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD))
+ const char kNativeMessagingNotSupportedError[] =
+ "Native Messaging is not supported on this platform.";
+ opener_port->DispatchOnDisconnect(kNativeMessagingNotSupportedError);
+-#endif // !(defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX))
++#endif // !(defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD))
+ }
+
+ void MessageService::OpenChannelToTab(const ChannelEndpoint& source,
diff --git a/www/iridium/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc b/www/iridium/files/patch-extensions_browser_api_networking__private_networking__private__delegate__factory.cc
new file mode 100644
index 000000000000..aa2f5369b993
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:00:58 UTC
++++ extensions/browser/api/networking_private/networking_private_delegate_factory.cc
+@@ -11,7 +11,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "extensions/browser/api/networking_private/networking_private_chromeos.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "extensions/browser/api/networking_private/networking_private_linux.h"
+ #elif defined(OS_WIN) || defined(OS_MACOSX)
+ #include "components/wifi/wifi_service.h"
+@@ -61,7 +61,7 @@ KeyedService* NetworkingPrivateDelegateFactory::BuildS
+ NetworkingPrivateDelegate* delegate;
+ #if defined(OS_CHROMEOS)
+ delegate = new NetworkingPrivateChromeOS(browser_context);
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ delegate = new NetworkingPrivateLinux();
+ #elif defined(OS_WIN) || defined(OS_MACOSX)
+ std::unique_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create());
diff --git a/www/iridium/files/patch-extensions_browser_api_web__request_form__data__parser.cc b/www/iridium/files/patch-extensions_browser_api_web__request_form__data__parser.cc
new file mode 100644
index 000000000000..aebaba727ff9
--- /dev/null
+++ b/www/iridium/files/patch-extensions_browser_api_web__request_form__data__parser.cc
@@ -0,0 +1,14 @@
+--- extensions/browser/api/web_request/form_data_parser.cc.orig 2019-03-11 22:00:58 UTC
++++ extensions/browser/api/web_request/form_data_parser.cc
+@@ -15,7 +15,11 @@
+ #include "base/values.h"
+ #include "net/base/escape.h"
+ #include "net/http/http_request_headers.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using base::DictionaryValue;
+ using base::ListValue;
diff --git a/www/iridium/files/patch-extensions_browser_browser__context__keyed__service__factories.cc b/www/iridium/files/patch-extensions_browser_browser__context__keyed__service__factories.cc
new file mode 100644
index 000000000000..d640fe45fcf4
--- /dev/null
+++ b/www/iridium/files/patch-extensions_browser_browser__context__keyed__service__factories.cc
@@ -0,0 +1,11 @@
+--- extensions/browser/browser_context_keyed_service_factories.cc.orig 2020-02-03 21:52:46 UTC
++++ extensions/browser/browser_context_keyed_service_factories.cc
+@@ -71,7 +71,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt()
+ HidDeviceManager::GetFactoryInstance();
+ IdleManagerFactory::GetInstance();
+ ManagementAPI::GetFactoryInstance();
+-#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD)
+ NetworkingPrivateEventRouterFactory::GetInstance();
+ #endif
+ PowerAPI::GetFactoryInstance();
diff --git a/www/iridium/files/patch-extensions_common_api___permission__features.json b/www/iridium/files/patch-extensions_common_api___permission__features.json
new file mode 100644
index 000000000000..554abd741ba8
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_api___permission__features.json
@@ -0,0 +1,29 @@
+--- extensions/common/api/_permission_features.json.orig 2020-02-03 21:53:31 UTC
++++ extensions/common/api/_permission_features.json
+@@ -135,7 +135,7 @@
+ {
+ "channel": "stable",
+ "extension_types": ["platform_app"],
+- "platforms": ["chromeos", "win", "mac", "linux"],
++ "platforms": ["chromeos", "win", "mac", "linux", "bsd"],
+ "whitelist": [
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/387169
+ "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/387169
+@@ -468,7 +468,7 @@
+ }, {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "mac", "win", "linux"],
++ "platforms": ["chromeos", "mac", "win", "linux", "bsd"],
+ "whitelist": [
+ "0DE0F05680A4A056BCEC864ED8DDA84296F82B40", // http://crbug.com/434651
+ "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/293683
+@@ -499,7 +499,7 @@
+ "networkingPrivate": {
+ "channel": "stable",
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+- "platforms": ["chromeos", "mac", "win", "linux"],
++ "platforms": ["chromeos", "mac", "win", "linux", "bsd"],
+ "whitelist": [
+ // DO NOT ADD ANY MORE ENTRIES HERE.
+ // networkingPrivate is being migrated to networking.onc.
diff --git a/www/iridium/files/patch-extensions_common_api_runtime.json b/www/iridium/files/patch-extensions_common_api_runtime.json
new file mode 100644
index 000000000000..9d5dea52dcbc
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_api_runtime.json
@@ -0,0 +1,11 @@
+--- extensions/common/api/runtime.json.orig 2020-02-03 21:53:31 UTC
++++ extensions/common/api/runtime.json
+@@ -68,7 +68,7 @@
+ "id": "PlatformOs",
+ "type": "string",
+ "description": "The operating system chrome is running on.",
+- "enum": ["mac", "win", "android", "cros", "linux", "openbsd"]
++ "enum": ["mac", "win", "android", "cros", "linux", "freebsd", "openbsd"]
+ },
+ {
+ "id": "PlatformArch",
diff --git a/www/iridium/files/patch-extensions_common_feature__switch.cc b/www/iridium/files/patch-extensions_common_feature__switch.cc
new file mode 100644
index 000000000000..9cac45bedcb2
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_feature__switch.cc
@@ -0,0 +1,16 @@
+--- extensions/common/feature_switch.cc.orig 2019-10-21 19:06:34 UTC
++++ extensions/common/feature_switch.cc
+@@ -42,11 +42,11 @@ class CommonSwitches {
+ FeatureSwitch::DEFAULT_ENABLED),
+ load_media_router_component_extension(
+ kLoadMediaRouterComponentExtensionFlag,
+-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
++#if BUILDFLAG(GOOGLE_CHROME_BRANDING) || defined(OS_BSD)
+ FeatureSwitch::DEFAULT_ENABLED)
+ #else
+ FeatureSwitch::DEFAULT_DISABLED)
+-#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
++#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) || defined(OS_BSD)
+ {
+ }
+
diff --git a/www/iridium/files/patch-extensions_common_features_feature.cc b/www/iridium/files/patch-extensions_common_features_feature.cc
new file mode 100644
index 000000000000..e97794f406b1
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_features_feature.cc
@@ -0,0 +1,11 @@
+--- extensions/common/features/feature.cc.orig 2019-07-24 18:58:27 UTC
++++ extensions/common/features/feature.cc
+@@ -20,7 +20,7 @@ namespace extensions {
+ Feature::Platform Feature::GetCurrentPlatform() {
+ #if defined(OS_CHROMEOS)
+ return CHROMEOS_PLATFORM;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return LINUX_PLATFORM;
+ #elif defined(OS_MACOSX)
+ return MACOSX_PLATFORM;
diff --git a/www/iridium/files/patch-extensions_common_image__util.cc b/www/iridium/files/patch-extensions_common_image__util.cc
new file mode 100644
index 000000000000..7048ea59ebd3
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_image__util.cc
@@ -0,0 +1,14 @@
+--- extensions/common/image_util.cc.orig 2020-02-03 21:52:47 UTC
++++ extensions/common/image_util.cc
+@@ -18,7 +18,11 @@
+ #include "base/strings/stringprintf.h"
+ #include "base/time/time.h"
+ #include "base/timer/elapsed_timer.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif // defined(OS_BSD)
+ #include "third_party/skia/include/core/SkBitmap.h"
+ #include "third_party/skia/include/core/SkCanvas.h"
+ #include "third_party/skia/include/core/SkColor.h"
diff --git a/www/iridium/files/patch-extensions_common_stack__frame.cc b/www/iridium/files/patch-extensions_common_stack__frame.cc
new file mode 100644
index 000000000000..cb1f991f448f
--- /dev/null
+++ b/www/iridium/files/patch-extensions_common_stack__frame.cc
@@ -0,0 +1,14 @@
+--- extensions/common/stack_frame.cc.orig 2019-03-11 22:00:58 UTC
++++ extensions/common/stack_frame.cc
+@@ -7,7 +7,11 @@
+ #include <string>
+
+ #include "base/strings/utf_string_conversions.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ namespace extensions {
+
diff --git a/www/iridium/files/patch-extensions_renderer_bindings_api__binding__util.cc b/www/iridium/files/patch-extensions_renderer_bindings_api__binding__util.cc
new file mode 100644
index 000000000000..e5e060248182
--- /dev/null
+++ b/www/iridium/files/patch-extensions_renderer_bindings_api__binding__util.cc
@@ -0,0 +1,11 @@
+--- extensions/renderer/bindings/api_binding_util.cc.orig 2019-03-11 22:00:58 UTC
++++ extensions/renderer/bindings/api_binding_util.cc
+@@ -129,6 +129,8 @@ std::string GetPlatformString() {
+ return "mac";
+ #elif defined(OS_WIN)
+ return "win";
++#elif defined(OS_BSD)
++ return "bsd";
+ #else
+ NOTREACHED();
+ return std::string();
diff --git a/www/iridium/files/patch-extensions_shell_app_shell__main__delegate.cc b/www/iridium/files/patch-extensions_shell_app_shell__main__delegate.cc
new file mode 100644
index 000000000000..196003fc999d
--- /dev/null
+++ b/www/iridium/files/patch-extensions_shell_app_shell__main__delegate.cc
@@ -0,0 +1,20 @@
+--- extensions/shell/app/shell_main_delegate.cc.orig 2019-09-09 21:55:17 UTC
++++ extensions/shell/app/shell_main_delegate.cc
+@@ -38,7 +38,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #elif defined(OS_MACOSX)
+ #include "base/base_paths_mac.h"
+@@ -70,7 +70,7 @@ base::FilePath GetDataPath() {
+ return cmd_line->GetSwitchValuePath(switches::kContentShellDataPath);
+
+ base::FilePath data_dir;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc b/www/iridium/files/patch-extensions_shell_browser_api_runtime_shell__runtime__api__delegate.cc
new file mode 100644
index 000000000000..194f3950299b
--- /dev/null
+++ b/www/iridium/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 2019-09-16 09:48:37 UTC
++++ extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc
+@@ -45,7 +45,7 @@ void ShellRuntimeAPIDelegate::OpenURL(const GURL& unin
+ bool ShellRuntimeAPIDelegate::GetPlatformInfo(PlatformInfo* info) {
+ #if defined(OS_CHROMEOS)
+ info->os = api::runtime::PLATFORM_OS_CROS;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ info->os = api::runtime::PLATFORM_OS_LINUX;
+ #endif
+ return true;
diff --git a/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.cc b/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.cc
new file mode 100644
index 000000000000..7333dad7d6bf
--- /dev/null
+++ b/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.cc
@@ -0,0 +1,20 @@
+--- extensions/shell/browser/shell_extensions_api_client.cc.orig 2019-09-09 21:55:17 UTC
++++ extensions/shell/browser/shell_extensions_api_client.cc
+@@ -16,7 +16,7 @@
+ #include "extensions/shell/browser/shell_virtual_keyboard_delegate.h"
+ #include "extensions/shell/browser/shell_web_view_guest_delegate.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "extensions/shell/browser/api/file_system/shell_file_system_delegate.h"
+ #endif
+
+@@ -52,7 +52,7 @@ ShellExtensionsAPIClient::CreateDisplayInfoProvider()
+ return std::make_unique<ShellDisplayInfoProvider>();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ FileSystemDelegate* ShellExtensionsAPIClient::GetFileSystemDelegate() {
+ if (!file_system_delegate_)
+ file_system_delegate_ = std::make_unique<ShellFileSystemDelegate>();
diff --git a/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.h b/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.h
new file mode 100644
index 000000000000..31f01db1d1d5
--- /dev/null
+++ b/www/iridium/files/patch-extensions_shell_browser_shell__extensions__api__client.h
@@ -0,0 +1,19 @@
+--- extensions/shell/browser/shell_extensions_api_client.h.orig 2019-09-09 21:55:17 UTC
++++ extensions/shell/browser/shell_extensions_api_client.h
+@@ -32,14 +32,14 @@ class ShellExtensionsAPIClient : public ExtensionsAPIC
+ content::BrowserContext* browser_context) const override;
+ std::unique_ptr<DisplayInfoProvider> CreateDisplayInfoProvider()
+ const override;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ FileSystemDelegate* GetFileSystemDelegate() override;
+ #endif
+ MessagingDelegate* GetMessagingDelegate() override;
+ FeedbackPrivateDelegate* GetFeedbackPrivateDelegate() override;
+
+ private:
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ std::unique_ptr<FileSystemDelegate> file_system_delegate_;
+ #endif
+ std::unique_ptr<MessagingDelegate> messaging_delegate_;
diff --git a/www/iridium/files/patch-google__apis_gcm_engine_heartbeat__manager.cc b/www/iridium/files/patch-google__apis_gcm_engine_heartbeat__manager.cc
new file mode 100644
index 000000000000..7a7e1a0192c2
--- /dev/null
+++ b/www/iridium/files/patch-google__apis_gcm_engine_heartbeat__manager.cc
@@ -0,0 +1,53 @@
+--- google_apis/gcm/engine/heartbeat_manager.cc.orig 2020-03-16 18:39:51 UTC
++++ google_apis/gcm/engine/heartbeat_manager.cc
+@@ -31,13 +31,13 @@ const int kMinClientHeartbeatIntervalMs = 1000 * 30;
+ // Minimum time spent sleeping before we force a new heartbeat.
+ const int kMinSuspendTimeMs = 1000 * 10; // 10 seconds.
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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
+ // way to be notified of system suspend and resume events.
+ const int kHeartbeatMissedCheckMs = 1000 * 60 * 5; // 5 minutes.
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+
+ } // namespace
+
+@@ -191,7 +191,7 @@ void HeartbeatManager::RestartTimer() {
+ base::BindRepeating(&HeartbeatManager::OnHeartbeatTriggered,
+ weak_ptr_factory_.GetWeakPtr()));
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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.
+@@ -200,7 +200,7 @@ void HeartbeatManager::RestartTimer() {
+ base::BindOnce(&HeartbeatManager::CheckForMissedHeartbeat,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::TimeDelta::FromMilliseconds(kHeartbeatMissedCheckMs));
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ }
+
+ void HeartbeatManager::CheckForMissedHeartbeat() {
+@@ -216,14 +216,14 @@ void HeartbeatManager::CheckForMissedHeartbeat() {
+ return;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Otherwise check again later.
+ io_task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&HeartbeatManager::CheckForMissedHeartbeat,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::TimeDelta::FromMilliseconds(kHeartbeatMissedCheckMs));
+-#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#endif // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ }
+
+ void HeartbeatManager::UpdateHeartbeatInterval() {
diff --git a/www/iridium/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc b/www/iridium/files/patch-gpu_command__buffer_common_gpu__memory__buffer__support.cc
new file mode 100644
index 000000000000..3756044745e9
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:32 UTC
++++ gpu/command_buffer/common/gpu_memory_buffer_support.cc
+@@ -50,7 +50,7 @@ bool IsImageSizeValidForGpuMemoryBufferFormat(const gf
+ uint32_t GetPlatformSpecificTextureTarget() {
+ #if defined(OS_MACOSX)
+ return GL_TEXTURE_RECTANGLE_ARB;
+-#elif defined(OS_ANDROID) || defined(OS_LINUX)
++#elif defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ return GL_TEXTURE_EXTERNAL_OES;
+ #elif defined(OS_WIN) || defined(OS_FUCHSIA)
+ return GL_TEXTURE_2D;
+@@ -72,7 +72,7 @@ GPU_EXPORT uint32_t GetBufferTextureTarget(gfx::Buffer
+
+ GPU_EXPORT bool NativeBufferNeedsPlatformSpecificTextureTarget(
+ gfx::BufferFormat format) {
+-#if defined(USE_OZONE) || defined(OS_LINUX)
++#if defined(USE_OZONE) || defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.cc b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.cc
new file mode 100644
index 000000000000..04701c95d5c1
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.cc
@@ -0,0 +1,100 @@
+--- gpu/command_buffer/service/external_vk_image_backing.cc.orig 2020-03-16 18:40:32 UTC
++++ gpu/command_buffer/service/external_vk_image_backing.cc
+@@ -27,7 +27,7 @@
+ #include "ui/gl/buildflags.h"
+ #include "ui/gl/gl_context.h"
+
+-#if defined(OS_LINUX) && BUILDFLAG(USE_DAWN)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(USE_DAWN)
+ #include "gpu/command_buffer/service/external_vk_image_dawn_representation.h"
+ #endif
+
+@@ -35,7 +35,7 @@
+ #include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586
+ #endif
+
+@@ -630,7 +630,7 @@ std::unique_ptr<SharedImageRepresentationDawn>
+ ExternalVkImageBacking::ProduceDawn(SharedImageManager* manager,
+ MemoryTypeTracker* tracker,
+ WGPUDevice wgpuDevice) {
+-#if defined(OS_LINUX) && BUILDFLAG(USE_DAWN)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(USE_DAWN)
+ if (!wgpu_format_) {
+ DLOG(ERROR) << "Format not supported for Dawn";
+ return nullptr;
+@@ -653,14 +653,14 @@ ExternalVkImageBacking::ProduceDawn(SharedImageManager
+ return std::make_unique<ExternalVkImageDawnRepresentation>(
+ manager, this, tracker, wgpuDevice, wgpu_format_.value(), memory_fd,
+ image_info.fAlloc.fSize, memory_type_index_.value());
+-#else // !defined(OS_LINUX) || !BUILDFLAG(USE_DAWN)
++#else // (!defined(OS_LINUX) && !defined(OS_BSD)) || !BUILDFLAG(USE_DAWN)
+ NOTIMPLEMENTED_LOG_ONCE();
+ return nullptr;
+ #endif
+ }
+
+ GLuint ExternalVkImageBacking::ProduceGLTextureInternal() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ GrVkImageInfo image_info;
+ bool result = backend_texture_.getVkImageInfo(&image_info);
+ DCHECK(result);
+@@ -710,7 +710,7 @@ GLuint ExternalVkImageBacking::ProduceGLTextureInterna
+ #elif defined(OS_FUCHSIA)
+ NOTIMPLEMENTED_LOG_ONCE();
+ return 0;
+-#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
++#else // !defined(OS_LINUX) && !defined(OS_BSD) && !defined(OS_FUCHSIA)
+ #error Unsupported OS
+ #endif
+ }
+@@ -724,7 +724,7 @@ ExternalVkImageBacking::ProduceGLTexture(SharedImageMa
+ return nullptr;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!texture_) {
+ GLuint texture_service_id = ProduceGLTextureInternal();
+ if (!texture_service_id)
+@@ -755,7 +755,7 @@ ExternalVkImageBacking::ProduceGLTexture(SharedImageMa
+ #elif defined(OS_FUCHSIA)
+ NOTIMPLEMENTED_LOG_ONCE();
+ return nullptr;
+-#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
++#else // !defined(OS_LINUX) && !defined(OS_BSD) && !defined(OS_FUCHSIA)
+ #error Unsupported OS
+ #endif
+ }
+@@ -770,7 +770,7 @@ ExternalVkImageBacking::ProduceGLTexturePassthrough(
+ return nullptr;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!texture_passthrough_) {
+ GLuint texture_service_id = ProduceGLTextureInternal();
+ if (!texture_service_id)
+@@ -790,7 +790,7 @@ ExternalVkImageBacking::ProduceGLTexturePassthrough(
+ #elif defined(OS_FUCHSIA)
+ NOTIMPLEMENTED_LOG_ONCE();
+ return nullptr;
+-#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
++#else // !defined(OS_LINUX) && !defined(OS_BSD) && !defined(OS_FUCHSIA)
+ #error Unsupported OS
+ #endif
+ }
+@@ -808,7 +808,7 @@ ExternalVkImageBacking::ProduceSkia(
+ tracker);
+ }
+
+-#ifdef OS_LINUX
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int ExternalVkImageBacking::GetMemoryFd(const GrVkImageInfo& image_info) {
+ VkMemoryGetFdInfoKHR get_fd_info;
+ get_fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
diff --git a/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.h b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.h
new file mode 100644
index 000000000000..38283056309d
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__backing.h
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/service/external_vk_image_backing.h.orig 2020-03-16 18:40:32 UTC
++++ gpu/command_buffer/service/external_vk_image_backing.h
+@@ -132,7 +132,7 @@ class ExternalVkImageBacking final : public ClearTrack
+ base::Optional<WGPUTextureFormat> wgpu_format,
+ base::Optional<uint32_t> memory_type_index);
+
+-#ifdef OS_LINUX
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Extract file descriptor from image
+ int GetMemoryFd(const GrVkImageInfo& image_info);
+ #endif
diff --git a/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__gl__representation.cc b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__gl__representation.cc
new file mode 100644
index 000000000000..b94f6df0650f
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_service_external__vk__image__gl__representation.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/service/external_vk_image_gl_representation.cc.orig 2020-02-03 21:53:31 UTC
++++ gpu/command_buffer/service/external_vk_image_gl_representation.cc
+@@ -179,7 +179,7 @@ GLuint ExternalVkImageGLRepresentationShared::ImportVk
+ #if defined(OS_FUCHSIA)
+ NOTIMPLEMENTED_LOG_ONCE();
+ return 0;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ if (handle.vk_handle_type() !=
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT) {
+ DLOG(ERROR) << "Importing semaphore handle of unexpected type:"
+@@ -194,7 +194,7 @@ GLuint ExternalVkImageGLRepresentationShared::ImportVk
+ fd.release());
+
+ return gl_semaphore;
+-#else // !defined(OS_FUCHSIA) && !defined(OS_LINUX)
++#else // !defined(OS_FUCHSIA) && !defined(OS_LINUX) && !defined(OS_BSD)
+ #error Unsupported OS
+ #endif
+ }
diff --git a/www/iridium/files/patch-gpu_command__buffer_service_program__manager.cc b/www/iridium/files/patch-gpu_command__buffer_service_program__manager.cc
new file mode 100644
index 000000000000..9309b4a0c7ce
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_service_program__manager.cc
@@ -0,0 +1,14 @@
+--- gpu/command_buffer/service/program_manager.cc.orig 2019-03-11 22:00:59 UTC
++++ gpu/command_buffer/service/program_manager.cc
+@@ -30,7 +30,11 @@
+ #include "gpu/command_buffer/service/program_cache.h"
+ #include "gpu/command_buffer/service/shader_manager.h"
+ #include "gpu/config/gpu_preferences.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+ #include "ui/gl/gl_version_info.h"
+ #include "ui/gl/progress_reporter.h"
+
diff --git a/www/iridium/files/patch-gpu_command__buffer_tests_gl__copy__texture__CHROMIUM__unittest.cc b/www/iridium/files/patch-gpu_command__buffer_tests_gl__copy__texture__CHROMIUM__unittest.cc
new file mode 100644
index 000000000000..efb8db3c0dc3
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_tests_gl__copy__texture__CHROMIUM__unittest.cc
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc.orig 2020-03-16 18:39:51 UTC
++++ gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+@@ -642,7 +642,7 @@ class GLCopyTextureCHROMIUMES3Test : public GLCopyText
+
+ bool ShouldSkipNorm16() const {
+ DCHECK(!ShouldSkipTest());
+-#if (defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)) && \
++#if (defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)) && \
+ (defined(ARCH_CPU_X86) || defined(ARCH_CPU_X86_64))
+ // Make sure it's tested; it is safe to assume that the flag is always true
+ // on desktop.
diff --git a/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.cc b/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.cc
new file mode 100644
index 000000000000..9867201456bf
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.cc
@@ -0,0 +1,20 @@
+--- gpu/command_buffer/tests/gl_test_utils.cc.orig 2020-03-16 18:39:51 UTC
++++ gpu/command_buffer/tests/gl_test_utils.cc
+@@ -23,7 +23,7 @@
+ #include "ui/gl/gl_version_info.h"
+ #include "ui/gl/init/gl_factory.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gl/gl_image_native_pixmap.h"
+ #endif
+
+@@ -445,7 +445,7 @@ void GpuCommandBufferTestEGL::RestoreGLDefault() {
+ window_system_binding_info_ = gl::GLWindowSystemBindingInfo();
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ scoped_refptr<gl::GLImageNativePixmap>
+ GpuCommandBufferTestEGL::CreateGLImageNativePixmap(gfx::BufferFormat format,
+ gfx::Size size,
diff --git a/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.h b/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.h
new file mode 100644
index 000000000000..2a43e73c2793
--- /dev/null
+++ b/www/iridium/files/patch-gpu_command__buffer_tests_gl__test__utils.h
@@ -0,0 +1,11 @@
+--- gpu/command_buffer/tests/gl_test_utils.h.orig 2019-10-21 19:06:35 UTC
++++ gpu/command_buffer/tests/gl_test_utils.h
+@@ -120,7 +120,7 @@ class GpuCommandBufferTestEGL {
+ return gfx::HasExtension(gl_extensions_, extension);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Create GLImageNativePixmap filled in with the given pixels.
+ scoped_refptr<gl::GLImageNativePixmap> CreateGLImageNativePixmap(
+ gfx::BufferFormat format,
diff --git a/www/iridium/files/patch-gpu_config_gpu__control__list.cc b/www/iridium/files/patch-gpu_config_gpu__control__list.cc
new file mode 100644
index 000000000000..e666e762ba6a
--- /dev/null
+++ b/www/iridium/files/patch-gpu_config_gpu__control__list.cc
@@ -0,0 +1,32 @@
+--- gpu/config/gpu_control_list.cc.orig 2020-02-03 21:52:47 UTC
++++ gpu/config/gpu_control_list.cc
+@@ -16,7 +16,11 @@
+ #include "base/values.h"
+ #include "build/build_config.h"
+ #include "gpu/config/gpu_util.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif // defined(OS_BSD)
+
+ namespace gpu {
+ namespace {
+@@ -213,7 +217,7 @@ bool GpuControlList::More::GLVersionInfoMismatch(
+ GpuControlList::GLType GpuControlList::More::GetDefaultGLType() {
+ #if defined(OS_CHROMEOS)
+ return kGLTypeGL;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return kGLTypeGL;
+ #elif defined(OS_MACOSX)
+ return kGLTypeGL;
+@@ -713,7 +717,7 @@ GpuControlList::OsType GpuControlList::GetOsType() {
+ return kOsAndroid;
+ #elif defined(OS_FUCHSIA)
+ return kOsFuchsia;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return kOsLinux;
+ #elif defined(OS_MACOSX)
+ return kOsMacosx;
diff --git a/www/iridium/files/patch-gpu_config_gpu__test__config.cc b/www/iridium/files/patch-gpu_config_gpu__test__config.cc
new file mode 100644
index 000000000000..c5c6e5e16c76
--- /dev/null
+++ b/www/iridium/files/patch-gpu_config_gpu__test__config.cc
@@ -0,0 +1,11 @@
+--- gpu/config/gpu_test_config.cc.orig 2019-03-11 22:00:59 UTC
++++ gpu/config/gpu_test_config.cc
+@@ -25,7 +25,7 @@ namespace {
+ GPUTestConfig::OS GetCurrentOS() {
+ #if defined(OS_CHROMEOS)
+ return GPUTestConfig::kOsChromeOS;
+-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return GPUTestConfig::kOsLinux;
+ #elif defined(OS_WIN)
+ int32_t major_version = 0;
diff --git a/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc b/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
new file mode 100644
index 000000000000..d06bde69aa2d
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.cc
@@ -0,0 +1,47 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.cc.orig 2020-03-16 18:40:32 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.cc
+@@ -14,7 +14,7 @@
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_io_surface.h"
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/client_native_pixmap_factory.h"
+ #include "ui/gfx/linux/client_native_pixmap_factory_dmabuf.h"
+ #endif
+@@ -24,7 +24,7 @@
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif
+
+-#if defined(USE_OZONE) || defined(OS_LINUX)
++#if defined(USE_OZONE) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap.h"
+ #endif
+
+@@ -42,7 +42,7 @@ namespace gpu {
+ GpuMemoryBufferSupport::GpuMemoryBufferSupport() {
+ #if defined(USE_OZONE)
+ client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ client_native_pixmap_factory_.reset(
+ gfx::CreateClientNativePixmapFactoryDmabuf());
+ #endif
+@@ -56,7 +56,7 @@ GpuMemoryBufferSupport::GetNativeGpuMemoryBufferType()
+ return gfx::IO_SURFACE_BUFFER;
+ #elif defined(OS_ANDROID)
+ return gfx::ANDROID_HARDWARE_BUFFER;
+-#elif defined(OS_LINUX) || defined(USE_OZONE)
++#elif defined(OS_LINUX) || defined(USE_OZONE) || defined(OS_BSD)
+ return gfx::NATIVE_PIXMAP;
+ #elif defined(OS_WIN)
+ return gfx::DXGI_SHARED_HANDLE;
+@@ -181,7 +181,7 @@ GpuMemoryBufferSupport::CreateGpuMemoryBufferImplFromH
+ return GpuMemoryBufferImplIOSurface::CreateFromHandle(
+ std::move(handle), size, format, usage, std::move(callback));
+ #endif
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(USE_OZONE) || defined(OS_BSD)
+ case gfx::NATIVE_PIXMAP:
+ return GpuMemoryBufferImplNativePixmap::CreateFromHandle(
+ client_native_pixmap_factory(), std::move(handle), size, format,
diff --git a/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h b/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
new file mode 100644
index 000000000000..dc652a126740
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_common_gpu__memory__buffer__support.h
@@ -0,0 +1,29 @@
+--- gpu/ipc/common/gpu_memory_buffer_support.h.orig 2019-12-16 21:50:48 UTC
++++ gpu/ipc/common/gpu_memory_buffer_support.h
+@@ -16,7 +16,7 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/gpu_memory_buffer.h"
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ namespace gfx {
+ class ClientNativePixmapFactory;
+ }
+@@ -38,7 +38,7 @@ class GPU_EXPORT GpuMemoryBufferSupport {
+ bool IsNativeGpuMemoryBufferConfigurationSupported(gfx::BufferFormat format,
+ gfx::BufferUsage usage);
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ gfx::ClientNativePixmapFactory* client_native_pixmap_factory() {
+ return client_native_pixmap_factory_.get();
+ }
+@@ -62,7 +62,7 @@ class GPU_EXPORT GpuMemoryBufferSupport {
+ GpuMemoryBufferImpl::DestructionCallback callback);
+
+ private:
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ std::unique_ptr<gfx::ClientNativePixmapFactory> client_native_pixmap_factory_;
+ #endif
+
diff --git a/www/iridium/files/patch-gpu_ipc_service_gpu__init.cc b/www/iridium/files/patch-gpu_ipc_service_gpu__init.cc
new file mode 100644
index 000000000000..2dff9b7c455a
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_service_gpu__init.cc
@@ -0,0 +1,136 @@
+--- gpu/ipc/service/gpu_init.cc.orig 2020-03-16 18:40:32 UTC
++++ gpu/ipc/service/gpu_init.cc
+@@ -109,7 +109,7 @@ void InitializePlatformOverlaySettings(GPUInfo* gpu_in
+ #endif
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)) || defined(OS_BSD)
+ bool CanAccessNvidiaDeviceFile() {
+ bool res = true;
+ base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+@@ -120,7 +120,7 @@ bool CanAccessNvidiaDeviceFile() {
+ }
+ return res;
+ }
+-#endif // OS_LINUX && !OS_CHROMEOS && !BUILDFLAG(IS_CHROMECAST)
++#endif // (OS_LINUX && !OS_CHROMEOS && !BUILDFLAG(IS_CHROMECAST)) || defined(OS_BSD)
+
+ class GpuWatchdogInit {
+ public:
+@@ -170,7 +170,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ gpu_info_.subpixel_font_rendering = true;
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (gpu_info_.gpu.vendor_id == 0x10de && // NVIDIA
+ gpu_info_.gpu.driver_vendor == "NVIDIA" && !CanAccessNvidiaDeviceFile())
+ return false;
+@@ -221,7 +221,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ delayed_watchdog_enable = true;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // PreSandbox is mainly for resource handling and not related to the GPU
+ // driver, it doesn't need the GPU watchdog. The loadLibrary may take long
+ // time that killing and restarting the GPU process will not help.
+@@ -266,7 +266,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ }
+
+ bool attempted_startsandbox = false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_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.
+@@ -275,7 +275,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ watchdog_thread_.get(), &gpu_info_, gpu_preferences_);
+ attempted_startsandbox = true;
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) && !defined(OS_BSD)
+
+ base::TimeTicks before_initialize_one_off = base::TimeTicks::Now();
+
+@@ -299,14 +299,14 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ }
+ if (gl_initialized && use_swiftshader &&
+ gl::GetGLImplementation() != gl::kGLImplementationSwiftShaderGL) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
+ << "on Linux";
+ return false;
+ #else
+ gl::init::ShutdownGL(true);
+ gl_initialized = false;
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+ }
+
+ if (!gl_initialized) {
+@@ -332,7 +332,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ }
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) && !defined(OS_BSD)
+ // The ContentSandboxHelper is currently the only one implementation of
+ // gpu::GpuSandboxHelper and it has no dependency. Except on Linux where
+ // VaapiWrapper checks the GL implementation to determine which display
+@@ -370,7 +370,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ command_line, gpu_feature_info_,
+ gpu_preferences_.disable_software_rasterizer, false);
+ if (use_swiftshader) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
+ << "on Linux";
+ return false;
+@@ -384,7 +384,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ << "failed";
+ return false;
+ }
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+ }
+ } else { // use_swiftshader == true
+ switch (gpu_preferences_.use_vulkan) {
+@@ -440,7 +440,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+
+ InitializePlatformOverlaySettings(&gpu_info_);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -459,7 +459,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandL
+ return false;
+ }
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ if (use_swiftshader) {
+ AdjustInfoToSwiftShader();
+@@ -637,7 +637,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* c
+
+ InitializePlatformOverlaySettings(&gpu_info_);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -657,7 +657,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* c
+ }
+ }
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ if (use_swiftshader) {
+ AdjustInfoToSwiftShader();
diff --git a/www/iridium/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc b/www/iridium/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
new file mode 100644
index 000000000000..af39329a6e9d
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_service_gpu__memory__buffer__factory.cc
@@ -0,0 +1,20 @@
+--- gpu/ipc/service/gpu_memory_buffer_factory.cc.orig 2019-07-24 18:58:27 UTC
++++ gpu/ipc/service/gpu_memory_buffer_factory.cc
+@@ -12,7 +12,7 @@
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ #include "gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.h"
+ #endif
+
+@@ -34,7 +34,7 @@ GpuMemoryBufferFactory::CreateNativeType(
+ return std::make_unique<GpuMemoryBufferFactoryIOSurface>();
+ #elif defined(OS_ANDROID)
+ return std::make_unique<GpuMemoryBufferFactoryAndroidHardwareBuffer>();
+-#elif defined(OS_LINUX) || defined(OS_FUCHSIA)
++#elif defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ return std::make_unique<GpuMemoryBufferFactoryNativePixmap>(
+ vulkan_context_provider);
+ #elif defined(OS_WIN)
diff --git a/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.cc b/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.cc
new file mode 100644
index 000000000000..bcadfa7d9e7b
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.cc
@@ -0,0 +1,56 @@
+--- gpu/ipc/service/gpu_watchdog_thread.cc.orig 2020-03-16 18:40:32 UTC
++++ gpu/ipc/service/gpu_watchdog_thread.cc
+@@ -63,7 +63,7 @@ void GpuWatchdogTimeoutHistogram(GpuWatchdogTimeoutEve
+ base::UmaHistogramEnumeration("GPU.WatchdogThread.V1.Timeout", timeout_event);
+ }
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ const base::FilePath::CharType kTtyFilePath[] =
+ FILE_PATH_LITERAL("/sys/class/tty/tty0/active");
+ #endif
+@@ -81,7 +81,7 @@ GpuWatchdogThreadImplV1::GpuWatchdogThreadImplV1()
+ arm_cpu_time_(),
+ #endif
+ suspension_counter_(this)
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ ,
+ host_tty_(-1)
+ #endif
+@@ -103,7 +103,7 @@ GpuWatchdogThreadImplV1::GpuWatchdogThreadImplV1()
+ DCHECK(result);
+ #endif
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ tty_file_ = base::OpenFile(base::FilePath(kTtyFilePath), "r");
+ UpdateActiveTTY();
+ host_tty_ = active_tty_;
+@@ -251,7 +251,7 @@ GpuWatchdogThreadImplV1::~GpuWatchdogThreadImplV1() {
+
+ base::PowerMonitor::RemoveObserver(this);
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ if (tty_file_)
+ fclose(tty_file_);
+ #endif
+@@ -434,7 +434,7 @@ void GpuWatchdogThreadImplV1::DeliberatelyTerminateToR
+ return;
+ #endif
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ // Don't crash if we're not on the TTY of our host X11 server.
+ UpdateActiveTTY();
+ if (host_tty_ != -1 && active_tty_ != -1 && host_tty_ != active_tty_) {
+@@ -609,7 +609,7 @@ base::ThreadTicks GpuWatchdogThreadImplV1::GetWatchedT
+ }
+ #endif
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ void GpuWatchdogThreadImplV1::UpdateActiveTTY() {
+ last_active_tty_ = active_tty_;
+
diff --git a/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.h b/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.h
new file mode 100644
index 000000000000..e81e9e60d43d
--- /dev/null
+++ b/www/iridium/files/patch-gpu_ipc_service_gpu__watchdog__thread.h
@@ -0,0 +1,20 @@
+--- gpu/ipc/service/gpu_watchdog_thread.h.orig 2020-03-16 18:40:32 UTC
++++ gpu/ipc/service/gpu_watchdog_thread.h
+@@ -207,7 +207,7 @@ class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV1
+ base::ThreadTicks GetWatchedThreadTime();
+ #endif
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ void UpdateActiveTTY();
+ #endif
+
+@@ -265,7 +265,7 @@ class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV1
+ // whether GpuWatchdogThreadEvent::kGpuWatchdogStart has been recorded.
+ bool is_watchdog_start_histogram_recorded = false;
+
+-#if defined(USE_X11)
++#if defined(USE_X11) && !defined(OS_BSD)
+ FILE* tty_file_;
+ int host_tty_;
+ int active_tty_ = -1;
diff --git a/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.cc b/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.cc
new file mode 100644
index 000000000000..a6794bea5437
--- /dev/null
+++ b/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.cc
@@ -0,0 +1,32 @@
+--- gpu/vulkan/vulkan_function_pointers.cc.orig 2020-03-16 18:40:32 UTC
++++ gpu/vulkan/vulkan_function_pointers.cc
+@@ -782,7 +782,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointer
+ }
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ if (gfx::HasExtension(enabled_extensions,
+ VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)) {
+ vkGetSemaphoreFdKHRFn = reinterpret_cast<PFN_vkGetSemaphoreFdKHR>(
+@@ -801,9 +801,9 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointer
+ return false;
+ }
+ }
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (gfx::HasExtension(enabled_extensions,
+ VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)) {
+ vkGetMemoryFdKHRFn = reinterpret_cast<PFN_vkGetMemoryFdKHR>(
+@@ -823,7 +823,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointer
+ return false;
+ }
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_FUCHSIA)
+ if (gfx::HasExtension(enabled_extensions,
diff --git a/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.h b/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.h
new file mode 100644
index 000000000000..5684a3f44924
--- /dev/null
+++ b/www/iridium/files/patch-gpu_vulkan_vulkan__function__pointers.h
@@ -0,0 +1,45 @@
+--- gpu/vulkan/vulkan_function_pointers.h.orig 2020-03-16 18:40:32 UTC
++++ gpu/vulkan/vulkan_function_pointers.h
+@@ -180,15 +180,15 @@ struct VulkanFunctionPointers {
+ vkGetAndroidHardwareBufferPropertiesANDROIDFn = nullptr;
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHRFn = nullptr;
+ PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHRFn = nullptr;
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ PFN_vkGetMemoryFdKHR vkGetMemoryFdKHRFn = nullptr;
+ PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHRFn = nullptr;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_FUCHSIA)
+ PFN_vkImportSemaphoreZirconHandleFUCHSIA
+@@ -378,18 +378,18 @@ struct VulkanFunctionPointers {
+ ->vkGetAndroidHardwareBufferPropertiesANDROIDFn
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #define vkGetSemaphoreFdKHR \
+ gpu::GetVulkanFunctionPointers()->vkGetSemaphoreFdKHRFn
+ #define vkImportSemaphoreFdKHR \
+ gpu::GetVulkanFunctionPointers()->vkImportSemaphoreFdKHRFn
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #define vkGetMemoryFdKHR gpu::GetVulkanFunctionPointers()->vkGetMemoryFdKHRFn
+ #define vkGetMemoryFdPropertiesKHR \
+ gpu::GetVulkanFunctionPointers()->vkGetMemoryFdPropertiesKHRFn
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_FUCHSIA)
+ #define vkImportSemaphoreZirconHandleFUCHSIA \
diff --git a/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.cc b/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.cc
new file mode 100644
index 000000000000..86931c284dea
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.cc
@@ -0,0 +1,29 @@
+--- headless/lib/browser/headless_content_browser_client.cc.orig 2020-03-16 18:39:51 UTC
++++ headless/lib/browser/headless_content_browser_client.cc
+@@ -157,7 +157,7 @@ HeadlessContentBrowserClient::GetGeneratedCodeCacheSet
+ return content::GeneratedCodeCacheSettings(true, 0, context->GetPath());
+ }
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void HeadlessContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -168,7 +168,7 @@ void HeadlessContentBrowserClient::GetAdditionalMapped
+ mappings->Share(service_manager::kCrashDumpSignal, crash_signal_fd);
+ #endif // defined(HEADLESS_USE_BREAKPAD)
+ }
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ void HeadlessContentBrowserClient::AppendExtraCommandLineSwitches(
+ base::CommandLine* command_line,
+@@ -231,7 +231,7 @@ void HeadlessContentBrowserClient::AppendExtraCommandL
+ process_type, child_process_id);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Processes may only query perf_event_open with the BPF sandbox disabled.
+ if (old_command_line.HasSwitch(::switches::kEnableThreadInstructionCount) &&
+ old_command_line.HasSwitch(service_manager::switches::kNoSandbox)) {
diff --git a/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.h b/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.h
new file mode 100644
index 000000000000..f29e51b1a4f7
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_browser_headless__content__browser__client.h
@@ -0,0 +1,11 @@
+--- headless/lib/browser/headless_content_browser_client.h.orig 2020-03-16 18:39:51 UTC
++++ headless/lib/browser/headless_content_browser_client.h
+@@ -29,7 +29,7 @@ class HeadlessContentBrowserClient : public content::C
+ override;
+ content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
+ content::BrowserContext* context) override;
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
diff --git a/www/iridium/files/patch-headless_lib_browser_headless__request__context__manager.cc b/www/iridium/files/patch-headless_lib_browser_headless__request__context__manager.cc
new file mode 100644
index 000000000000..dbae7f502c62
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_browser_headless__request__context__manager.cc
@@ -0,0 +1,29 @@
+--- headless/lib/browser/headless_request_context_manager.cc.orig 2019-12-16 21:51:26 UTC
++++ headless/lib/browser/headless_request_context_manager.cc
+@@ -26,7 +26,7 @@ namespace headless {
+
+ namespace {
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ static char kProductName[] = "HeadlessChrome";
+ #endif
+
+@@ -56,7 +56,7 @@ net::NetworkTrafficAnnotationTag GetProxyConfigTraffic
+ return traffic_annotation;
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ ::network::mojom::CryptConfigPtr BuildCryptConfigOnce(
+ const base::FilePath& user_data_path) {
+ static bool done_once = false;
+@@ -197,7 +197,7 @@ HeadlessRequestContextManager::HeadlessRequestContextM
+ proxy_config_monitor_ = std::make_unique<HeadlessProxyConfigMonitor>(
+ base::ThreadTaskRunnerHandle::Get());
+ }
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ auto crypt_config = BuildCryptConfigOnce(user_data_path_);
+ if (crypt_config)
+ content::GetNetworkService()->SetCryptConfig(std::move(crypt_config));
diff --git a/www/iridium/files/patch-headless_lib_headless__content__main__delegate.cc b/www/iridium/files/patch-headless_lib_headless__content__main__delegate.cc
new file mode 100644
index 000000000000..b6d23a82eac8
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_headless__content__main__delegate.cc
@@ -0,0 +1,20 @@
+--- headless/lib/headless_content_main_delegate.cc.orig 2020-03-16 18:39:51 UTC
++++ headless/lib/headless_content_main_delegate.cc
+@@ -405,7 +405,7 @@ int HeadlessContentMainDelegate::RunProcess(
+ }
+ #endif // !defined(CHROME_MULTIPLE_DLL_CHILD)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void SIGTERMProfilingShutdown(int signal) {
+ content::Profiling::Stop();
+ struct sigaction sigact;
+@@ -440,7 +440,7 @@ void HeadlessContentMainDelegate::ZygoteForked() {
+ breakpad::InitCrashReporter(process_type);
+ #endif
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // static
+ HeadlessContentMainDelegate* HeadlessContentMainDelegate::GetInstance() {
diff --git a/www/iridium/files/patch-headless_lib_headless__content__main__delegate.h b/www/iridium/files/patch-headless_lib_headless__content__main__delegate.h
new file mode 100644
index 000000000000..ea587103f60e
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_headless__content__main__delegate.h
@@ -0,0 +1,11 @@
+--- headless/lib/headless_content_main_delegate.h.orig 2020-03-16 18:39:51 UTC
++++ headless/lib/headless_content_main_delegate.h
+@@ -60,7 +60,7 @@ class HEADLESS_EXPORT HeadlessContentMainDelegate
+
+ HeadlessBrowserImpl* browser() const { return browser_.get(); }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void ZygoteForked() override;
+ #endif
+
diff --git a/www/iridium/files/patch-headless_lib_headless__macros.h b/www/iridium/files/patch-headless_lib_headless__macros.h
new file mode 100644
index 000000000000..0e99c3066d6d
--- /dev/null
+++ b/www/iridium/files/patch-headless_lib_headless__macros.h
@@ -0,0 +1,13 @@
+--- headless/lib/headless_macros.h.orig 2019-03-11 22:00:59 UTC
++++ headless/lib/headless_macros.h
+@@ -7,8 +7,8 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+ #define HEADLESS_USE_BREAKPAD
+-#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
++#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD)
+
+ #endif // HEADLESS_LIB_HEADLESS_MACROS_H_
diff --git a/www/iridium/files/patch-ipc_ipc__channel.h b/www/iridium/files/patch-ipc_ipc__channel.h
new file mode 100644
index 000000000000..81baee2eca8d
--- /dev/null
+++ b/www/iridium/files/patch-ipc_ipc__channel.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_channel.h.orig 2020-02-03 21:53:32 UTC
++++ ipc/ipc_channel.h
+@@ -282,7 +282,7 @@ class COMPONENT_EXPORT(IPC) Channel : public Sender {
+ static std::string GenerateUniqueRandomChannelID();
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-ipc_ipc__channel__common.cc b/www/iridium/files/patch-ipc_ipc__channel__common.cc
new file mode 100644
index 000000000000..9a59e5cfaff6
--- /dev/null
+++ b/www/iridium/files/patch-ipc_ipc__channel__common.cc
@@ -0,0 +1,20 @@
+--- ipc/ipc_channel_common.cc.orig 2020-02-03 21:52:47 UTC
++++ ipc/ipc_channel_common.cc
+@@ -10,7 +10,7 @@
+
+ namespace IPC {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace {
+ int g_global_pid = 0;
+@@ -26,7 +26,7 @@ int Channel::GetGlobalPid() {
+ return g_global_pid;
+ }
+
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // static
+ std::unique_ptr<Channel> Channel::CreateClient(
diff --git a/www/iridium/files/patch-ipc_ipc__channel__mojo.cc b/www/iridium/files/patch-ipc_ipc__channel__mojo.cc
new file mode 100644
index 000000000000..54e779282f74
--- /dev/null
+++ b/www/iridium/files/patch-ipc_ipc__channel__mojo.cc
@@ -0,0 +1,15 @@
+--- ipc/ipc_channel_mojo.cc.orig 2020-02-03 21:52:47 UTC
++++ ipc/ipc_channel_mojo.cc
+@@ -74,10 +74,10 @@ class MojoChannelFactory : public ChannelFactory {
+ };
+
+ base::ProcessId GetSelfPID() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (int global_pid = Channel::GetGlobalPid())
+ return global_pid;
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+ #if defined(OS_NACL)
+ return -1;
+ #else
diff --git a/www/iridium/files/patch-ipc_ipc__message__utils.cc b/www/iridium/files/patch-ipc_ipc__message__utils.cc
new file mode 100644
index 000000000000..00d57043fb58
--- /dev/null
+++ b/www/iridium/files/patch-ipc_ipc__message__utils.cc
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.cc.orig 2019-07-24 18:58:29 UTC
++++ ipc/ipc_message_utils.cc
+@@ -355,7 +355,7 @@ void ParamTraits<unsigned int>::Log(const param_type&
+ l->append(base::NumberToString(p));
+ }
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || \
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD) || \
+ (defined(OS_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/www/iridium/files/patch-ipc_ipc__message__utils.h b/www/iridium/files/patch-ipc_ipc__message__utils.h
new file mode 100644
index 000000000000..39fc150c1a08
--- /dev/null
+++ b/www/iridium/files/patch-ipc_ipc__message__utils.h
@@ -0,0 +1,11 @@
+--- ipc/ipc_message_utils.h.orig 2020-02-03 21:53:32 UTC
++++ ipc/ipc_message_utils.h
+@@ -209,7 +209,7 @@ struct ParamTraits<unsigned int> {
+ // 3) Android 64 bit and Fuchsia also have int64_t typedef'd to long.
+ // 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 defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || \
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD) || \
+ (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
+ template <>
+ struct ParamTraits<long> {
diff --git a/www/iridium/files/patch-media_BUILD.gn b/www/iridium/files/patch-media_BUILD.gn
new file mode 100644
index 000000000000..2e46acb021a0
--- /dev/null
+++ b/www/iridium/files/patch-media_BUILD.gn
@@ -0,0 +1,12 @@
+--- media/BUILD.gn.orig 2020-03-16 18:40:33 UTC
++++ media/BUILD.gn
+@@ -63,6 +63,9 @@ config("media_config") {
+ defines += [ "DLOPEN_PULSEAUDIO" ]
+ }
+ }
++ if (use_sndio) {
++ defines += [ "USE_SNDIO" ]
++ }
+ if (use_cras) {
+ defines += [ "USE_CRAS" ]
+ }
diff --git a/www/iridium/files/patch-media_audio_BUILD.gn b/www/iridium/files/patch-media_audio_BUILD.gn
new file mode 100644
index 000000000000..a37b99f54c9c
--- /dev/null
+++ b/www/iridium/files/patch-media_audio_BUILD.gn
@@ -0,0 +1,22 @@
+--- media/audio/BUILD.gn.orig 2020-03-16 18:40:33 UTC
++++ media/audio/BUILD.gn
+@@ -232,8 +232,18 @@ source_set("audio") {
+ ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !use_sndio) {
+ sources += [ "linux/audio_manager_linux.cc" ]
++ }
++ if (use_sndio) {
++ libs += [ "sndio" ]
++ sources += [
++ "openbsd/audio_manager_openbsd.cc",
++ "sndio/sndio_input.cc",
++ "sndio/sndio_input.h",
++ "sndio/sndio_output.cc",
++ "sndio/sndio_output.h"
++ ]
+ }
+
+ if (use_alsa) {
diff --git a/www/iridium/files/patch-media_audio_alsa_audio__manager__alsa.cc b/www/iridium/files/patch-media_audio_alsa_audio__manager__alsa.cc
new file mode 100644
index 000000000000..313dd1df12eb
--- /dev/null
+++ b/www/iridium/files/patch-media_audio_alsa_audio__manager__alsa.cc
@@ -0,0 +1,54 @@
+--- media/audio/alsa/audio_manager_alsa.cc.orig 2019-04-30 22:22:52 UTC
++++ media/audio/alsa/audio_manager_alsa.cc
+@@ -92,7 +92,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ int card = -1;
+
+ // Loop through the sound cards to get ALSA device hints.
++#if defined(OS_LINUX)
+ while (!wrapper_->CardNext(&card) && card >= 0) {
++#endif
+ void** hints = NULL;
+ int error = wrapper_->DeviceNameHint(card, kPcmInterfaceName, &hints);
+ if (!error) {
+@@ -104,7 +106,9 @@ void AudioManagerAlsa::GetAlsaAudioDevices(StreamType
+ DLOG(WARNING) << "GetAlsaAudioDevices: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#if defined(OS_LINUX)
+ }
++#endif
+ }
+
+ void AudioManagerAlsa::GetAlsaDevicesInfo(AudioManagerAlsa::StreamType type,
+@@ -187,7 +191,11 @@ bool AudioManagerAlsa::IsAlsaDeviceAvailable(
+ // goes through software conversion if needed (e.g. incompatible
+ // sample rate).
+ // TODO(joi): Should we prefer "hw" instead?
++#ifdef OS_LINUX
+ static const char kDeviceTypeDesired[] = "plughw";
++#else
++ static const char kDeviceTypeDesired[] = "plug";
++#endif
+ return strncmp(kDeviceTypeDesired, device_name,
+ base::size(kDeviceTypeDesired) - 1) == 0;
+ }
+@@ -209,7 +217,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ // Loop through the sound cards.
+ // Don't use snd_device_name_hint(-1,..) since there is a access violation
+ // inside this ALSA API with libasound.so.2.0.0.
++#if defined(OS_LINUX)
+ 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++) {
+@@ -233,7 +243,9 @@ bool AudioManagerAlsa::HasAnyAlsaAudioDevice(
+ DLOG(WARNING) << "HasAnyAudioDevice: unable to get device hints: "
+ << wrapper_->StrError(error);
+ }
++#if defined(OS_LINUX)
+ }
++#endif
+
+ return has_device;
+ }
diff --git a/www/iridium/files/patch-media_audio_audio__input__device.cc b/www/iridium/files/patch-media_audio_audio__input__device.cc
new file mode 100644
index 000000000000..f96c5ac063c2
--- /dev/null
+++ b/www/iridium/files/patch-media_audio_audio__input__device.cc
@@ -0,0 +1,11 @@
+--- media/audio/audio_input_device.cc.orig 2019-03-17 21:43:40 UTC
++++ media/audio/audio_input_device.cc
+@@ -248,7 +248,7 @@ void AudioInputDevice::OnStreamCreated(
+ // also a risk of false positives if we are suspending when starting the stream
+ // here. See comments in AliveChecker and PowerObserverHelper for details and
+ // todos.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const bool stop_at_first_alive_notification = true;
+ const bool pause_check_during_suspend = false;
+ #else
diff --git a/www/iridium/files/patch-media_audio_audio__manager.cc b/www/iridium/files/patch-media_audio_audio__manager.cc
new file mode 100644
index 000000000000..5720491adf54
--- /dev/null
+++ b/www/iridium/files/patch-media_audio_audio__manager.cc
@@ -0,0 +1,29 @@
+--- media/audio/audio_manager.cc.orig 2019-03-11 22:00:59 UTC
++++ media/audio/audio_manager.cc
+@@ -48,7 +48,7 @@ class AudioManagerHelper {
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ void set_app_name(const std::string& app_name) { app_name_ = app_name; }
+ const std::string& app_name() const { return app_name_; }
+ #endif
+@@ -59,7 +59,7 @@ class AudioManagerHelper {
+ std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_for_testing_;
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ std::string app_name_;
+ #endif
+
+@@ -128,7 +128,7 @@ std::unique_ptr<AudioManager> AudioManager::CreateForT
+ return Create(std::move(audio_thread), GetHelper()->fake_log_factory());
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ void AudioManager::SetGlobalAppName(const std::string& app_name) {
+ GetHelper()->set_app_name(app_name);
diff --git a/www/iridium/files/patch-media_audio_audio__manager.h b/www/iridium/files/patch-media_audio_audio__manager.h
new file mode 100644
index 000000000000..817c3d812b8e
--- /dev/null
+++ b/www/iridium/files/patch-media_audio_audio__manager.h
@@ -0,0 +1,11 @@
+--- media/audio/audio_manager.h.orig 2019-03-11 22:00:59 UTC
++++ media/audio/audio_manager.h
+@@ -60,7 +60,7 @@ class MEDIA_EXPORT AudioManager {
+ static std::unique_ptr<AudioManager> CreateForTesting(
+ std::unique_ptr<AudioThread> audio_thread);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Sets the name of the audio source as seen by external apps. Only actually
+ // used with PulseAudio as of this writing.
+ static void SetGlobalAppName(const std::string& app_name);
diff --git a/www/iridium/files/patch-media_base_audio__latency.cc b/www/iridium/files/patch-media_base_audio__latency.cc
new file mode 100644
index 000000000000..d2289293450b
--- /dev/null
+++ b/www/iridium/files/patch-media_base_audio__latency.cc
@@ -0,0 +1,11 @@
+--- media/base/audio_latency.cc.orig 2019-03-11 22:00:59 UTC
++++ media/base/audio_latency.cc
+@@ -106,7 +106,7 @@ int AudioLatency::GetRtcBufferSize(int sample_rate, in
+ return frames_per_buffer;
+ }
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || defined(OS_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/www/iridium/files/patch-media_base_media__switches.cc b/www/iridium/files/patch-media_base_media__switches.cc
new file mode 100644
index 000000000000..ed61b97adc9d
--- /dev/null
+++ b/www/iridium/files/patch-media_base_media__switches.cc
@@ -0,0 +1,11 @@
+--- media/base/media_switches.cc.orig 2020-03-17 10:01:08 UTC
++++ media/base/media_switches.cc
+@@ -331,7 +331,7 @@ const base::Feature kFallbackAfterDecodeError{"Fallbac
+ const base::Feature kGlobalMediaControls {
+ "GlobalMediaControls",
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/www/iridium/files/patch-media_base_scopedfd__helper.h b/www/iridium/files/patch-media_base_scopedfd__helper.h
new file mode 100644
index 000000000000..5b097ec108c3
--- /dev/null
+++ b/www/iridium/files/patch-media_base_scopedfd__helper.h
@@ -0,0 +1,23 @@
+--- media/base/scopedfd_helper.h.orig 2019-09-09 21:55:20 UTC
++++ media/base/scopedfd_helper.h
+@@ -11,17 +11,17 @@
+ namespace media {
+
+ // Theoretically, we can test on defined(OS_POSIX) || defined(OS_FUCHSIA), but
+-// since the only current user is V4L2 we are limiting the scope to OS_LINUX so
++// since the only current user is V4L2 we are limiting the scope to OS_LINUX || OS_BSD so
+ // the binary size does not inflate on non-using systems. Feel free to adapt
+ // this and BUILD.gn as our needs evolve.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+
+ // Return a new vector containing duplicates of |fds|, or PCHECKs in case of an
+ // error.
+ MEDIA_EXPORT std::vector<base::ScopedFD> DuplicateFDs(
+ const std::vector<base::ScopedFD>& fds);
+
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ } // namespace media
+
diff --git a/www/iridium/files/patch-media_base_video__frame.cc b/www/iridium/files/patch-media_base_video__frame.cc
new file mode 100644
index 000000000000..430d0f3c5bb5
--- /dev/null
+++ b/www/iridium/files/patch-media_base_video__frame.cc
@@ -0,0 +1,74 @@
+--- media/base/video_frame.cc.orig 2019-12-16 21:50:49 UTC
++++ media/base/video_frame.cc
+@@ -57,7 +57,7 @@ std::string VideoFrame::StorageTypeToString(
+ return "OWNED_MEMORY";
+ case VideoFrame::STORAGE_SHMEM:
+ return "SHMEM";
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ case VideoFrame::STORAGE_DMABUFS:
+ return "DMABUFS";
+ #endif
+@@ -74,7 +74,7 @@ std::string VideoFrame::StorageTypeToString(
+ // static
+ bool VideoFrame::IsStorageTypeMappable(VideoFrame::StorageType storage_type) {
+ return
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // This is not strictly needed but makes explicit that, at VideoFrame
+ // level, DmaBufs are not mappable from userspace.
+ storage_type != VideoFrame::STORAGE_DMABUFS &&
+@@ -257,7 +257,7 @@ static base::Optional<VideoFrameLayout> GetDefaultLayo
+ return VideoFrameLayout::CreateWithPlanes(format, coded_size, planes);
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -275,7 +275,7 @@ class VideoFrame::DmabufHolder
+ friend class base::RefCountedThreadSafe<DmabufHolder>;
+ ~DmabufHolder() = default;
+ };
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // static
+ bool VideoFrame::IsValidConfig(VideoPixelFormat format,
+@@ -588,7 +588,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalGpuM
+ return frame;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // static
+ scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
+ const VideoFrameLayout& layout,
+@@ -724,7 +724,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
+ }
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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_;
+@@ -1050,7 +1050,7 @@ VideoFrame::mailbox_holder(size_t texture_index) const
+ : mailbox_holders_[texture_index];
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const std::vector<base::ScopedFD>& VideoFrame::DmabufFds() const {
+ DCHECK_EQ(storage_type_, STORAGE_DMABUFS);
+
+@@ -1133,7 +1133,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ dmabuf_fds_(base::MakeRefCounted<DmabufHolder>()),
+ #endif
+ timestamp_(timestamp),
diff --git a/www/iridium/files/patch-media_base_video__frame.h b/www/iridium/files/patch-media_base_video__frame.h
new file mode 100644
index 000000000000..d37ffac67837
--- /dev/null
+++ b/www/iridium/files/patch-media_base_video__frame.h
@@ -0,0 +1,50 @@
+--- media/base/video_frame.h.orig 2020-03-16 18:40:33 UTC
++++ media/base/video_frame.h
+@@ -39,9 +39,9 @@
+ #include "base/mac/scoped_cftyperef.h"
+ #endif // defined(OS_MACOSX)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/files/scoped_file.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace gfx {
+ class GpuMemoryBuffer;
+@@ -80,7 +80,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 unsafe (writable) shared memory.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -245,7 +245,7 @@ class MEDIA_EXPORT VideoFrame : public base::RefCounte
+ ReleaseMailboxCB mailbox_holder_release_cb,
+ base::TimeDelta timestamp);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -480,7 +480,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -662,7 +662,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ class DmabufHolder;
+
+ // Dmabufs for the frame, used when storage is STORAGE_DMABUFS. Size is either
diff --git a/www/iridium/files/patch-media_capture_video_create__video__capture__device__factory.cc b/www/iridium/files/patch-media_capture_video_create__video__capture__device__factory.cc
new file mode 100644
index 000000000000..ab3b5a40d144
--- /dev/null
+++ b/www/iridium/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 2019-10-21 19:06:36 UTC
++++ media/capture/video/create_video_capture_device_factory.cc
+@@ -10,7 +10,7 @@
+ #include "media/capture/video/fake_video_capture_device_factory.h"
+ #include "media/capture/video/file_video_capture_device_factory.h"
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ #include "media/capture/video/linux/video_capture_device_factory_linux.h"
+ #elif defined(OS_CHROMEOS)
+ #include "media/capture/video/chromeos/camera_app_device_bridge_impl.h"
+@@ -82,7 +82,7 @@ CreateChromeOSVideoCaptureDeviceFactory(
+ std::unique_ptr<VideoCaptureDeviceFactory>
+ CreatePlatformSpecificVideoCaptureDeviceFactory(
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return std::make_unique<VideoCaptureDeviceFactoryLinux>(ui_task_runner);
+ #elif defined(OS_CHROMEOS)
+ return CreateChromeOSVideoCaptureDeviceFactory(ui_task_runner, {});
diff --git a/www/iridium/files/patch-media_capture_video_fake__video__capture__device__factory.cc b/www/iridium/files/patch-media_capture_video_fake__video__capture__device__factory.cc
new file mode 100644
index 000000000000..76d95eebd304
--- /dev/null
+++ b/www/iridium/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 2019-12-16 21:50:49 UTC
++++ media/capture/video/fake_video_capture_device_factory.cc
+@@ -208,7 +208,7 @@ void FakeVideoCaptureDeviceFactory::GetDeviceDescripto
+ for (const auto& entry : devices_config_) {
+ device_descriptors->emplace_back(
+ base::StringPrintf("fake_device_%d", entry_index), entry.device_id,
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE
+ #elif defined(OS_MACOSX)
+ VideoCaptureApi::MACOSX_AVFOUNDATION
diff --git a/www/iridium/files/patch-media_capture_video_file__video__capture__device__factory.cc b/www/iridium/files/patch-media_capture_video_file__video__capture__device__factory.cc
new file mode 100644
index 000000000000..b1cc42128fa5
--- /dev/null
+++ b/www/iridium/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 2019-04-30 22:22:52 UTC
++++ media/capture/video/file_video_capture_device_factory.cc
+@@ -54,7 +54,7 @@ void FileVideoCaptureDeviceFactory::GetDeviceDescripto
+ #elif defined(OS_MACOSX)
+ command_line_file_path.value(), kFileVideoCaptureDeviceName,
+ VideoCaptureApi::MACOSX_AVFOUNDATION
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ command_line_file_path.value(), kFileVideoCaptureDeviceName,
+ VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE
+ #else
diff --git a/www/iridium/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc b/www/iridium/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
new file mode 100644
index 000000000000..3de31922be93
--- /dev/null
+++ b/www/iridium/files/patch-media_capture_video_linux_v4l2__capture__delegate.cc
@@ -0,0 +1,26 @@
+--- media/capture/video/linux/v4l2_capture_delegate.cc.orig 2019-03-11 22:00:59 UTC
++++ media/capture/video/linux/v4l2_capture_delegate.cc
+@@ -4,8 +4,10 @@
+
+ #include "media/capture/video/linux/v4l2_capture_delegate.h"
+
++#if !defined(OS_BSD)
+ #include <linux/version.h>
+ #include <linux/videodev2.h>
++#endif
+ #include <poll.h>
+ #include <sys/fcntl.h>
+ #include <sys/ioctl.h>
+@@ -24,10 +26,10 @@
+
+ using media::mojom::MeteringMode;
+
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
++// #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.
diff --git a/www/iridium/files/patch-media_capture_video_video__capture__buffer__pool__impl.cc b/www/iridium/files/patch-media_capture_video_video__capture__buffer__pool__impl.cc
new file mode 100644
index 000000000000..7dcb8b174ae1
--- /dev/null
+++ b/www/iridium/files/patch-media_capture_video_video__capture__buffer__pool__impl.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/video_capture_buffer_pool_impl.cc.orig 2019-12-16 21:50:49 UTC
++++ media/capture/video/video_capture_buffer_pool_impl.cc
+@@ -59,7 +59,7 @@ VideoCaptureBufferPoolImpl::CreateSharedMemoryViaRawFi
+ int buffer_id) {
+ // This requires platforms where base::SharedMemoryHandle is backed by a
+ // file descriptor.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::AutoLock lock(lock_);
+
+ VideoCaptureBufferTracker* tracker = GetTracker(buffer_id);
diff --git a/www/iridium/files/patch-media_capture_video_video__capture__device__client.cc b/www/iridium/files/patch-media_capture_video_video__capture__device__client.cc
new file mode 100644
index 000000000000..b36124fab651
--- /dev/null
+++ b/www/iridium/files/patch-media_capture_video_video__capture__device__client.cc
@@ -0,0 +1,11 @@
+--- media/capture/video/video_capture_device_client.cc.orig 2019-12-16 21:50:49 UTC
++++ media/capture/video/video_capture_device_client.cc
+@@ -297,7 +297,7 @@ void VideoCaptureDeviceClient::OnIncomingCapturedData(
+ // see http://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html.
+ // Windows RGB24 defines blue at lowest byte,
+ // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd407253
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ fourcc_format = libyuv::FOURCC_RAW;
+ #elif defined(OS_WIN)
+ fourcc_format = libyuv::FOURCC_24BG;
diff --git a/www/iridium/files/patch-media_filters_vp9__parser.h b/www/iridium/files/patch-media_filters_vp9__parser.h
new file mode 100644
index 000000000000..5e1f90d692b3
--- /dev/null
+++ b/www/iridium/files/patch-media_filters_vp9__parser.h
@@ -0,0 +1,10 @@
+--- media/filters/vp9_parser.h.orig 2019-03-11 22:00:59 UTC
++++ media/filters/vp9_parser.h
+@@ -14,6 +14,7 @@
+
+ #include <stddef.h>
+ #include <stdint.h>
++#include <unistd.h>
+ #include <sys/types.h>
+
+ #include <memory>
diff --git a/www/iridium/files/patch-media_formats_common_offset__byte__queue.cc b/www/iridium/files/patch-media_formats_common_offset__byte__queue.cc
new file mode 100644
index 000000000000..38994431f986
--- /dev/null
+++ b/www/iridium/files/patch-media_formats_common_offset__byte__queue.cc
@@ -0,0 +1,20 @@
+--- media/formats/common/offset_byte_queue.cc.orig 2019-03-11 22:00:59 UTC
++++ media/formats/common/offset_byte_queue.cc
+@@ -46,13 +46,13 @@ void OffsetByteQueue::PeekAt(int64_t offset, const uin
+ *size = tail() - offset;
+ }
+
+-bool OffsetByteQueue::Trim(int64_t max_offset) {
+- if (max_offset < head_) return true;
+- if (max_offset > tail()) {
++bool OffsetByteQueue::Trim(int64_t _max_offset) {
++ if (_max_offset < head_) return true;
++ if (_max_offset > tail()) {
+ Pop(size_);
+ return false;
+ }
+- Pop(max_offset - head_);
++ Pop(_max_offset - head_);
+ return true;
+ }
+
diff --git a/www/iridium/files/patch-media_formats_common_offset__byte__queue.h b/www/iridium/files/patch-media_formats_common_offset__byte__queue.h
new file mode 100644
index 000000000000..659dd9dfe9b3
--- /dev/null
+++ b/www/iridium/files/patch-media_formats_common_offset__byte__queue.h
@@ -0,0 +1,22 @@
+--- media/formats/common/offset_byte_queue.h.orig 2019-03-11 22:00:59 UTC
++++ media/formats/common/offset_byte_queue.h
+@@ -36,15 +36,15 @@ class MEDIA_EXPORT OffsetByteQueue {
+ // a null |buf| and a |size| of zero.
+ void PeekAt(int64_t offset, const uint8_t** buf, int* size);
+
+- // Marks the bytes up to (but not including) |max_offset| as ready for
++ // Marks the bytes up to (but not including) |_max_offset| as ready for
+ // deletion. This is relatively inexpensive, but will not necessarily reduce
+ // the resident buffer size right away (or ever).
+ //
+ // Returns true if the full range of bytes were successfully trimmed,
+- // including the case where |max_offset| is less than the current head.
+- // Returns false if |max_offset| > tail() (although all bytes currently
++ // including the case where |_max_offset| is less than the current head.
++ // Returns false if |_max_offset| > tail() (although all bytes currently
+ // buffered are still cleared).
+- bool Trim(int64_t max_offset);
++ bool Trim(int64_t _max_offset);
+
+ // The head and tail positions, in terms of the file's absolute offsets.
+ // tail() is an exclusive bound.
diff --git a/www/iridium/files/patch-media_formats_mp2t_es__parser__adts.cc b/www/iridium/files/patch-media_formats_mp2t_es__parser__adts.cc
new file mode 100644
index 000000000000..a9a96b393d53
--- /dev/null
+++ b/www/iridium/files/patch-media_formats_mp2t_es__parser__adts.cc
@@ -0,0 +1,26 @@
+--- media/formats/mp2t/es_parser_adts.cc.orig 2019-04-30 22:22:52 UTC
++++ media/formats/mp2t/es_parser_adts.cc
+@@ -62,11 +62,11 @@ bool EsParserAdts::LookForAdtsFrame(AdtsFrame* adts_fr
+ const uint8_t* es;
+ es_queue_->Peek(&es, &es_size);
+
+- int max_offset = es_size - kADTSHeaderMinSize;
+- if (max_offset <= 0)
++ int _max_offset = es_size - kADTSHeaderMinSize;
++ if (_max_offset <= 0)
+ return false;
+
+- for (int offset = 0; offset < max_offset; offset++) {
++ for (int offset = 0; offset < _max_offset; offset++) {
+ const uint8_t* cur_buf = &es[offset];
+ if (!isAdtsSyncWord(cur_buf))
+ continue;
+@@ -106,7 +106,7 @@ bool EsParserAdts::LookForAdtsFrame(AdtsFrame* adts_fr
+ return true;
+ }
+
+- es_queue_->Pop(max_offset);
++ es_queue_->Pop(_max_offset);
+ return false;
+ }
+
diff --git a/www/iridium/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc b/www/iridium/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc
new file mode 100644
index 000000000000..cd5710c554b0
--- /dev/null
+++ b/www/iridium/files/patch-media_formats_mp2t_es__parser__mpeg1audio.cc
@@ -0,0 +1,26 @@
+--- media/formats/mp2t/es_parser_mpeg1audio.cc.orig 2019-03-11 22:00:59 UTC
++++ media/formats/mp2t/es_parser_mpeg1audio.cc
+@@ -108,11 +108,11 @@ bool EsParserMpeg1Audio::LookForMpeg1AudioFrame(
+ const uint8_t* es;
+ es_queue_->Peek(&es, &es_size);
+
+- int max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize;
+- if (max_offset <= 0)
++ int _max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize;
++ if (_max_offset <= 0)
+ return false;
+
+- for (int offset = 0; offset < max_offset; offset++) {
++ for (int offset = 0; offset < _max_offset; offset++) {
+ const uint8_t* cur_buf = &es[offset];
+ if (cur_buf[0] != 0xff)
+ continue;
+@@ -153,7 +153,7 @@ bool EsParserMpeg1Audio::LookForMpeg1AudioFrame(
+ return true;
+ }
+
+- es_queue_->Pop(max_offset);
++ es_queue_->Pop(_max_offset);
+ return false;
+ }
+
diff --git a/www/iridium/files/patch-media_gpu_buffer__validation.cc b/www/iridium/files/patch-media_gpu_buffer__validation.cc
new file mode 100644
index 000000000000..7f3005140bd8
--- /dev/null
+++ b/www/iridium/files/patch-media_gpu_buffer__validation.cc
@@ -0,0 +1,48 @@
+--- media/gpu/buffer_validation.cc.orig 2019-12-17 19:41:51 UTC
++++ media/gpu/buffer_validation.cc
+@@ -12,15 +12,15 @@
+ #include "ui/gfx/geometry/size.h"
+ #include "ui/gfx/gpu_memory_buffer.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/types.h>
+ #include <unistd.h>
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace media {
+
+ bool GetFileSize(const int fd, size_t* size) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (fd < 0) {
+ VLOGF(1) << "Invalid file descriptor";
+ return false;
+@@ -46,7 +46,7 @@ bool GetFileSize(const int fd, size_t* size) {
+ #else
+ NOTIMPLEMENTED();
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ bool VerifyGpuMemoryBufferHandle(media::VideoPixelFormat pixel_format,
+@@ -56,7 +56,7 @@ bool VerifyGpuMemoryBufferHandle(media::VideoPixelForm
+ VLOGF(1) << "Unexpected GpuMemoryBufferType: " << gmb_handle.type;
+ return false;
+ }
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format);
+ if (num_planes != gmb_handle.native_pixmap_handle.planes.size() ||
+ num_planes == 0) {
+@@ -108,7 +108,7 @@ bool VerifyGpuMemoryBufferHandle(media::VideoPixelForm
+ #else
+ NOTIMPLEMENTED();
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ } // namespace media
diff --git a/www/iridium/files/patch-media_media__options.gni b/www/iridium/files/patch-media_media__options.gni
new file mode 100644
index 000000000000..f2783c3581d2
--- /dev/null
+++ b/www/iridium/files/patch-media_media__options.gni
@@ -0,0 +1,12 @@
+--- media/media_options.gni.orig 2020-03-16 18:40:33 UTC
++++ media/media_options.gni
+@@ -119,6 +119,9 @@ 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 non-Android, non-Mac POSIX systems.
+ # Alsa should be used on desktop Chromecast and audio-only Chromecast builds.
+ if (is_posix && !is_android && !is_mac &&
diff --git a/www/iridium/files/patch-media_mojo_clients_mojo__video__encode__accelerator.cc b/www/iridium/files/patch-media_mojo_clients_mojo__video__encode__accelerator.cc
new file mode 100644
index 000000000000..b208560a307d
--- /dev/null
+++ b/www/iridium/files/patch-media_mojo_clients_mojo__video__encode__accelerator.cc
@@ -0,0 +1,11 @@
+--- media/mojo/clients/mojo_video_encode_accelerator.cc.orig 2020-03-16 18:40:33 UTC
++++ media/mojo/clients/mojo_video_encode_accelerator.cc
+@@ -132,7 +132,7 @@ void MojoVideoEncodeAccelerator::Encode(scoped_refptr<
+ frame->layout().num_planes());
+ DCHECK(vea_.is_bound());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(crbug.com/1003197): Remove this once we stop supporting STORAGE_DMABUF
+ // in VideoEncodeAccelerator.
+ if (frame->storage_type() == VideoFrame::STORAGE_DMABUFS) {
diff --git a/www/iridium/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc b/www/iridium/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc
new file mode 100644
index 000000000000..46396d067968
--- /dev/null
+++ b/www/iridium/files/patch-media_mojo_mojom_video__frame__mojom__traits.cc
@@ -0,0 +1,32 @@
+--- media/mojo/mojom/video_frame_mojom_traits.cc.orig 2020-02-24 18:39:18 UTC
++++ media/mojo/mojom/video_frame_mojom_traits.cc
+@@ -20,9 +20,9 @@
+ #include "ui/gfx/mojom/buffer_types_mojom_traits.h"
+ #include "ui/gfx/mojom/color_space_mojom_traits.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/posix/eintr_wrapper.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace mojo {
+
+@@ -60,7 +60,7 @@ media::mojom::VideoFrameDataPtr MakeVideoFrameData(
+ mojo_frame->PlaneOffset(media::VideoFrame::kVPlane)));
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (input->storage_type() == media::VideoFrame::STORAGE_DMABUFS) {
+ std::vector<mojo::ScopedHandle> dmabuf_fds;
+
+@@ -161,7 +161,7 @@ bool StructTraits<media::mojom::VideoFrameDataView,
+ shared_buffer_data.u_offset(), shared_buffer_data.v_offset(),
+ shared_buffer_data.y_stride(), shared_buffer_data.u_stride(),
+ shared_buffer_data.v_stride(), timestamp);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ } else if (data.is_dmabuf_data()) {
+ media::mojom::DmabufVideoFrameDataDataView dmabuf_data;
+ data.GetDmabufDataDataView(&dmabuf_data);
diff --git a/www/iridium/files/patch-media_mojo_services_gpu__mojo__media__client.cc b/www/iridium/files/patch-media_mojo_services_gpu__mojo__media__client.cc
new file mode 100644
index 000000000000..ea181aa1b1f3
--- /dev/null
+++ b/www/iridium/files/patch-media_mojo_services_gpu__mojo__media__client.cc
@@ -0,0 +1,20 @@
+--- media/mojo/services/gpu_mojo_media_client.cc.orig 2020-03-16 18:40:33 UTC
++++ media/mojo/services/gpu_mojo_media_client.cc
+@@ -64,7 +64,7 @@ namespace media {
+ namespace {
+
+ #if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_MACOSX) || \
+- defined(OS_WIN) || defined(OS_LINUX)
++ defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ gpu::CommandBufferStub* GetCommandBufferStub(
+ scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner,
+ base::WeakPtr<MediaGpuChannelManager> media_gpu_channel_manager,
+@@ -263,7 +263,7 @@ std::unique_ptr<VideoDecoder> GpuMojoMediaClient::Crea
+ command_buffer_id->route_id));
+ }
+
+-#elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
++#elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ video_decoder = VdaVideoDecoder::Create(
+ task_runner, gpu_task_runner_, media_log->Clone(), target_color_space,
+ gpu_preferences_, gpu_workarounds_,
diff --git a/www/iridium/files/patch-media_video_fake__gpu__memory__buffer.cc b/www/iridium/files/patch-media_video_fake__gpu__memory__buffer.cc
new file mode 100644
index 000000000000..684c9adbd4b4
--- /dev/null
+++ b/www/iridium/files/patch-media_video_fake__gpu__memory__buffer.cc
@@ -0,0 +1,47 @@
+--- media/video/fake_gpu_memory_buffer.cc.orig 2019-12-17 19:43:52 UTC
++++ media/video/fake_gpu_memory_buffer.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+@@ -44,7 +44,7 @@ class FakeGpuMemoryBufferImpl : public gpu::GpuMemoryB
+
+ } // namespace
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::ScopedFD GetDummyFD() {
+ base::ScopedFD fd(open("/dev/zero", O_RDWR));
+ DCHECK(fd.is_valid());
+@@ -67,7 +67,7 @@ FakeGpuMemoryBuffer::FakeGpuMemoryBuffer(const gfx::Si
+ // Set a dummy id since this is for testing only.
+ handle_.id = gfx::GpuMemoryBufferId(0);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Set a dummy fd since this is for testing only.
+ handle_.native_pixmap_handle.planes.push_back(
+ gfx::NativePixmapPlane(size_.width(), 0, y_plane_size, GetDummyFD()));
+@@ -76,7 +76,7 @@ FakeGpuMemoryBuffer::FakeGpuMemoryBuffer(const gfx::Si
+ size_.width(), handle_.native_pixmap_handle.planes[0].size,
+ uv_plane_size, GetDummyFD()));
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ FakeGpuMemoryBuffer::~FakeGpuMemoryBuffer() = default;
+@@ -135,7 +135,7 @@ gfx::GpuMemoryBufferHandle FakeGpuMemoryBuffer::CloneH
+ gfx::GpuMemoryBufferHandle handle;
+ handle.type = gfx::NATIVE_PIXMAP;
+ handle.id = handle_.id;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ handle.native_pixmap_handle =
+ gfx::CloneHandleForIPC(handle_.native_pixmap_handle);
+ #endif
diff --git a/www/iridium/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc b/www/iridium/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc
new file mode 100644
index 000000000000..3941ed5af217
--- /dev/null
+++ b/www/iridium/files/patch-media_video_gpu__memory__buffer__video__frame__pool.cc
@@ -0,0 +1,11 @@
+--- media/video/gpu_memory_buffer_video_frame_pool.cc.orig 2020-02-03 21:53:32 UTC
++++ media/video/gpu_memory_buffer_video_frame_pool.cc
+@@ -572,7 +572,7 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::CreateHa
+ }
+
+ bool is_software_backed_video_frame = !video_frame->HasTextures();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ is_software_backed_video_frame &= !video_frame->HasDmaBufs();
+ #endif
+
diff --git a/www/iridium/files/patch-media_webrtc_webrtc__switches.cc b/www/iridium/files/patch-media_webrtc_webrtc__switches.cc
new file mode 100644
index 000000000000..68078dc67afd
--- /dev/null
+++ b/www/iridium/files/patch-media_webrtc_webrtc__switches.cc
@@ -0,0 +1,11 @@
+--- media/webrtc/webrtc_switches.cc.orig 2020-02-03 21:52:48 UTC
++++ media/webrtc/webrtc_switches.cc
+@@ -50,7 +50,7 @@ namespace media {
+
+ bool IsWebRtcApmInAudioServiceEnabled() {
+ #if defined(OS_WIN) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return base::FeatureList::IsEnabled(features::kWebRtcApmInAudioService) &&
+ !base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kForceDisableWebRtcApmInAudioService);
diff --git a/www/iridium/files/patch-mojo_public_c_system_thunks.cc b/www/iridium/files/patch-mojo_public_c_system_thunks.cc
new file mode 100644
index 000000000000..dec03d588689
--- /dev/null
+++ b/www/iridium/files/patch-mojo_public_c_system_thunks.cc
@@ -0,0 +1,49 @@
+--- mojo/public/c/system/thunks.cc.orig 2020-02-03 21:52:48 UTC
++++ mojo/public/c/system/thunks.cc
+@@ -15,7 +15,7 @@
+ #include "build/build_config.h"
+ #include "mojo/public/c/system/core.h"
+
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ #include "base/environment.h"
+ #include "base/files/file_path.h"
+ #include "base/optional.h"
+@@ -58,7 +58,7 @@ namespace mojo {
+ class CoreLibraryInitializer {
+ public:
+ CoreLibraryInitializer(const MojoInitializeOptions* options) {
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ bool application_provided_path = false;
+ base::Optional<base::FilePath> library_path;
+ if (options && options->struct_size >= sizeof(*options) &&
+@@ -77,7 +77,7 @@ class CoreLibraryInitializer {
+
+ if (!library_path) {
+ // Default to looking for the library in the current working directory.
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ const base::FilePath::CharType kDefaultLibraryPathValue[] =
+ FILE_PATH_LITERAL("./libmojo_core.so");
+ #elif defined(OS_WIN)
+@@ -127,16 +127,16 @@ class CoreLibraryInitializer {
+
+ CHECK_GT(g_thunks.size, 0u)
+ << "Invalid mojo_core library: " << library_path->value();
+-#else // defined(OS_CHROMEOS) || defined(OS_LINUX)
++#else // defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ NOTREACHED()
+ << "Dynamic mojo_core loading is not supported on this platform.";
+-#endif // defined(OS_CHROMEOS) || defined(OS_LINUX)
++#endif // defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ ~CoreLibraryInitializer() = default;
+
+ private:
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ base::Optional<base::ScopedNativeLibrary> library_;
+ #endif
+
diff --git a/www/iridium/files/patch-mojo_public_js_mojo__bindings__resources.grd b/www/iridium/files/patch-mojo_public_js_mojo__bindings__resources.grd
new file mode 100644
index 000000000000..b0970950923b
--- /dev/null
+++ b/www/iridium/files/patch-mojo_public_js_mojo__bindings__resources.grd
@@ -0,0 +1,11 @@
+--- mojo/public/js/mojo_bindings_resources.grd.orig 2020-03-16 18:39:53 UTC
++++ mojo/public/js/mojo_bindings_resources.grd
+@@ -70,7 +70,7 @@
+ use_base_dir="false"
+ type="BINDATA"
+ compress="gzip" />
+- <if expr="is_win or is_macosx or is_linux">
++ <if expr="is_win or is_macosx or is_posix">
+ <include name="IDR_MOJO_TIME_MOJOM_HTML"
+ file="${root_gen_dir}/mojo/public/mojom/base/time.mojom.html"
+ use_base_dir="false"
diff --git a/www/iridium/files/patch-net_BUILD.gn b/www/iridium/files/patch-net_BUILD.gn
new file mode 100644
index 000000000000..2696770beb1c
--- /dev/null
+++ b/www/iridium/files/patch-net_BUILD.gn
@@ -0,0 +1,46 @@
+--- net/BUILD.gn.orig 2020-03-16 18:40:33 UTC
++++ net/BUILD.gn
+@@ -103,7 +103,7 @@ net_configs = [
+ "//build/config/compiler:wexit_time_destructors",
+ ]
+
+-if (is_linux) {
++if (is_linux && !is_bsd) {
+ net_configs += [ "//build/config/linux:libresolv" ]
+ }
+
+@@ -1247,6 +1247,16 @@ component("net") {
+ ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "base/address_tracker_linux.cc",
++ "base/address_tracker_linux.h",
++ "base/network_change_notifier_linux.cc",
++ "base/network_change_notifier_linux.h",
++ "base/network_interfaces_linux.cc"
++ ]
++ }
++
+ if (is_mac) {
+ sources += [
+ "base/network_notification_thread_mac.cc",
+@@ -1373,7 +1383,7 @@ component("net") {
+ }
+ }
+
+- if (is_android || is_chromeos) {
++ if (is_android || is_chromeos || is_bsd) {
+ sources += [
+ "base/network_change_notifier_posix.cc",
+ "base/network_change_notifier_posix.h",
+@@ -1406,7 +1416,7 @@ component("net") {
+ }
+
+ # Use getifaddrs() on POSIX platforms, except Linux and Android.
+- if (is_posix && !is_linux && !is_android) {
++ if (is_posix && ((!is_linux && !is_android) || (is_bsd))) {
+ sources += [
+ "base/network_interfaces_getifaddrs.cc",
+ "base/network_interfaces_getifaddrs.h",
diff --git a/www/iridium/files/patch-net_base_address__tracker__linux.cc b/www/iridium/files/patch-net_base_address__tracker__linux.cc
new file mode 100644
index 000000000000..01047dcf1d20
--- /dev/null
+++ b/www/iridium/files/patch-net_base_address__tracker__linux.cc
@@ -0,0 +1,88 @@
+--- net/base/address_tracker_linux.cc.orig 2020-03-03 18:53:55 UTC
++++ net/base/address_tracker_linux.cc
+@@ -5,7 +5,9 @@
+ #include "net/base/address_tracker_linux.h"
+
+ #include <errno.h>
++#if !defined(OS_BSD)
+ #include <linux/if.h>
++#endif
+ #include <stdint.h>
+ #include <sys/ioctl.h>
+ #include <utility>
+@@ -177,6 +179,7 @@ AddressTrackerLinux::AddressTrackerLinux(
+ AddressTrackerLinux::~AddressTrackerLinux() = default;
+
+ void AddressTrackerLinux::Init() {
++#if !defined(OS_FREEBSD)
+ netlink_fd_.reset(socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE));
+ if (!netlink_fd_.is_valid()) {
+ PLOG(ERROR) << "Could not create NETLINK socket";
+@@ -272,6 +275,7 @@ void AddressTrackerLinux::AbortAndForceOnline() {
+ connection_type_initialized_cv_.Broadcast();
+ }
+
++#if !defined(OS_BSD)
+ AddressTrackerLinux::AddressMap AddressTrackerLinux::GetAddressMap() const {
+ AddressTrackerAutoLock lock(*this, address_map_lock_);
+ return address_map_;
+@@ -290,6 +294,7 @@ bool AddressTrackerLinux::IsInterfaceIgnored(int inter
+ const char* interface_name = get_interface_name_(interface_index, buf);
+ return ignored_interfaces_.find(interface_name) != ignored_interfaces_.end();
+ }
++#endif // !OS_BSD
+
+ NetworkChangeNotifier::ConnectionType
+ AddressTrackerLinux::GetCurrentConnectionType() {
+@@ -348,6 +353,7 @@ void AddressTrackerLinux::HandleMessage(const char* bu
+ bool* address_changed,
+ bool* link_changed,
+ bool* tunnel_changed) {
++#if !defined(OS_FREEBSD)
+ DCHECK(buffer);
+ // Note that NLMSG_NEXT decrements |length| to reflect the number of bytes
+ // remaining in |buffer|.
+@@ -460,6 +466,10 @@ void AddressTrackerLinux::HandleMessage(const char* bu
+ break;
+ }
+ }
++#else // !OS_FREEBSD
++ NOTIMPLEMENTED();
++ AbortAndForceOnline();
++#endif // !OS_FREEBSD
+ }
+
+ void AddressTrackerLinux::OnFileCanReadWithoutBlocking() {
+@@ -487,31 +497,7 @@ bool AddressTrackerLinux::IsTunnelInterfaceName(const
+ }
+
+ void AddressTrackerLinux::UpdateCurrentConnectionType() {
+- AddressTrackerLinux::AddressMap address_map = GetAddressMap();
+- std::unordered_set<int> online_links = GetOnlineLinks();
+-
+- // Strip out tunnel interfaces from online_links
+- for (auto it = online_links.cbegin(); it != online_links.cend();) {
+- if (IsTunnelInterface(*it)) {
+- it = online_links.erase(it);
+- } else {
+- ++it;
+- }
+- }
+-
+- NetworkInterfaceList networks;
+- NetworkChangeNotifier::ConnectionType type =
+- NetworkChangeNotifier::CONNECTION_NONE;
+- if (GetNetworkListImpl(&networks, 0, online_links, address_map,
+- get_interface_name_)) {
+- type = NetworkChangeNotifier::ConnectionTypeFromInterfaceList(networks);
+- } else {
+- type = online_links.empty() ? NetworkChangeNotifier::CONNECTION_NONE
+- : NetworkChangeNotifier::CONNECTION_UNKNOWN;
+- }
+-
+- AddressTrackerAutoLock lock(*this, connection_type_lock_);
+- current_connection_type_ = type;
++ NOTIMPLEMENTED();
+ }
+
+ int AddressTrackerLinux::GetThreadsWaitingForConnectionTypeInitForTesting() {
diff --git a/www/iridium/files/patch-net_base_address__tracker__linux.h b/www/iridium/files/patch-net_base_address__tracker__linux.h
new file mode 100644
index 000000000000..50b6ecbc20fb
--- /dev/null
+++ b/www/iridium/files/patch-net_base_address__tracker__linux.h
@@ -0,0 +1,12 @@
+--- net/base/address_tracker_linux.h.orig 2019-03-11 22:01:00 UTC
++++ net/base/address_tracker_linux.h
+@@ -7,9 +7,6 @@
+
+ #include <sys/socket.h> // Needed to include netlink.
+ // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38.
+-#define net net_kernel
+-#include <linux/rtnetlink.h>
+-#undef net
+ #include <stddef.h>
+
+ #include <map>
diff --git a/www/iridium/files/patch-net_base_address__tracker__linux__unittest.cc b/www/iridium/files/patch-net_base_address__tracker__linux__unittest.cc
new file mode 100644
index 000000000000..58a442e0f159
--- /dev/null
+++ b/www/iridium/files/patch-net_base_address__tracker__linux__unittest.cc
@@ -0,0 +1,14 @@
+--- net/base/address_tracker_linux_unittest.cc.orig 2019-03-11 22:01:00 UTC
++++ net/base/address_tracker_linux_unittest.cc
+@@ -4,7 +4,11 @@
+
+ #include "net/base/address_tracker_linux.h"
+
++#if defined(__linux__)
+ #include <linux/if.h>
++#else
++#include <net/if.h>
++#endif
+
+ #include <memory>
+ #include <unordered_set>
diff --git a/www/iridium/files/patch-net_base_features.cc b/www/iridium/files/patch-net_base_features.cc
new file mode 100644
index 000000000000..306de5e6d980
--- /dev/null
+++ b/www/iridium/files/patch-net_base_features.cc
@@ -0,0 +1,11 @@
+--- net/base/features.cc.orig 2020-03-17 10:02:15 UTC
++++ net/base/features.cc
+@@ -88,7 +88,7 @@ const base::FeatureParam<int>
+ #if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
+ const base::Feature kCertVerifierBuiltinFeature {
+ "CertVerifierBuiltin",
+-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
++#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_BSD)
+ base::FEATURE_ENABLED_BY_DEFAULT
+ #else
+ base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/www/iridium/files/patch-net_base_network__change__notifier.cc b/www/iridium/files/patch-net_base_network__change__notifier.cc
new file mode 100644
index 000000000000..b570610a6483
--- /dev/null
+++ b/www/iridium/files/patch-net_base_network__change__notifier.cc
@@ -0,0 +1,28 @@
+--- net/base/network_change_notifier.cc.orig 2020-02-03 21:52:49 UTC
++++ net/base/network_change_notifier.cc
+@@ -35,7 +35,7 @@
+ #include "net/base/network_change_notifier_linux.h"
+ #elif defined(OS_MACOSX)
+ #include "net/base/network_change_notifier_mac.h"
+-#elif defined(OS_CHROMEOS) || defined(OS_ANDROID)
++#elif defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "net/base/network_change_notifier_posix.h"
+ #elif defined(OS_FUCHSIA)
+ #include "net/base/network_change_notifier_fuchsia.h"
+@@ -229,7 +229,7 @@ std::unique_ptr<NetworkChangeNotifier> NetworkChangeNo
+ // service in a separate process.
+ return std::make_unique<NetworkChangeNotifierPosix>(initial_type,
+ initial_subtype);
+-#elif defined(OS_CHROMEOS)
++#elif defined(OS_CHROMEOS) || defined(OS_BSD)
+ return std::make_unique<NetworkChangeNotifierPosix>(initial_type,
+ initial_subtype);
+ #elif defined(OS_LINUX)
+@@ -241,7 +241,6 @@ std::unique_ptr<NetworkChangeNotifier> NetworkChangeNo
+ return std::make_unique<NetworkChangeNotifierFuchsia>(
+ 0 /* required_features */);
+ #else
+- NOTIMPLEMENTED();
+ return NULL;
+ #endif
+ }
diff --git a/www/iridium/files/patch-net_base_network__interfaces__posix.h b/www/iridium/files/patch-net_base_network__interfaces__posix.h
new file mode 100644
index 000000000000..44b17ad3eafa
--- /dev/null
+++ b/www/iridium/files/patch-net_base_network__interfaces__posix.h
@@ -0,0 +1,11 @@
+--- net/base/network_interfaces_posix.h.orig 2019-03-11 22:01:00 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/www/iridium/files/patch-net_disk__cache_blockfile_disk__format.h b/www/iridium/files/patch-net_disk__cache_blockfile_disk__format.h
new file mode 100644
index 000000000000..655e5cca978c
--- /dev/null
+++ b/www/iridium/files/patch-net_disk__cache_blockfile_disk__format.h
@@ -0,0 +1,12 @@
+--- net/disk_cache/blockfile/disk_format.h.orig 2019-03-11 22:01:01 UTC
++++ net/disk_cache/blockfile/disk_format.h
+@@ -149,7 +149,9 @@ struct RankingsNode {
+ };
+ #pragma pack(pop)
+
++#if !defined(OS_BSD)
+ static_assert(sizeof(RankingsNode) == 36, "bad RankingsNode");
++#endif
+
+ } // namespace disk_cache
+
diff --git a/www/iridium/files/patch-net_dns_address__sorter__posix.cc b/www/iridium/files/patch-net_dns_address__sorter__posix.cc
new file mode 100644
index 000000000000..f462de801f4a
--- /dev/null
+++ b/www/iridium/files/patch-net_dns_address__sorter__posix.cc
@@ -0,0 +1,12 @@
+--- net/dns/address_sorter_posix.cc.orig 2019-03-11 22:01:01 UTC
++++ net/dns/address_sorter_posix.cc
+@@ -13,7 +13,9 @@
+ #include <sys/socket.h> // Must be included before ifaddrs.h.
+ #include <ifaddrs.h>
+ #include <net/if.h>
++#include <net/if_var.h>
+ #include <netinet/in_var.h>
++#include <netinet6/in6_var.h>
+ #include <string.h>
+ #include <sys/ioctl.h>
+ #endif
diff --git a/www/iridium/files/patch-net_dns_dns__config__service__posix__unittest.cc b/www/iridium/files/patch-net_dns_dns__config__service__posix__unittest.cc
new file mode 100644
index 000000000000..21bd683f8187
--- /dev/null
+++ b/www/iridium/files/patch-net_dns_dns__config__service__posix__unittest.cc
@@ -0,0 +1,47 @@
+--- net/dns/dns_config_service_posix_unittest.cc.orig 2019-06-04 18:55:27 UTC
++++ net/dns/dns_config_service_posix_unittest.cc
+@@ -2,8 +2,6 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+
+-#include <resolv.h>
+-
+ #include <memory>
+
+ #include "base/cancelable_callback.h"
+@@ -50,7 +48,7 @@ const char* const kNameserversIPv4[] = {
+ "1.0.0.1",
+ };
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const char* const kNameserversIPv6[] = {
+ NULL,
+ "2001:DB8:0::42",
+@@ -86,7 +84,7 @@ void InitializeResState(res_state res) {
+ ++res->nscount;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Install IPv6 addresses, replacing the corresponding IPv4 addresses.
+ unsigned nscount6 = 0;
+ for (unsigned i = 0; i < base::size(kNameserversIPv6) && i < MAXNS; ++i) {
+@@ -107,7 +105,7 @@ void InitializeResState(res_state res) {
+ }
+
+ void CloseResState(res_state res) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ for (int i = 0; i < res->nscount; ++i) {
+ if (res->_u._ext.nsaddrs[i] != NULL)
+ free(res->_u._ext.nsaddrs[i]);
+@@ -132,7 +130,7 @@ void InitializeExpectedConfig(DnsConfig* config) {
+ config->nameservers.push_back(IPEndPoint(ip, NS_DEFAULTPORT + i));
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ for (unsigned i = 0; i < base::size(kNameserversIPv6) && i < MAXNS; ++i) {
+ if (!kNameserversIPv6[i])
+ continue;
diff --git a/www/iridium/files/patch-net_dns_dns__reloader.cc b/www/iridium/files/patch-net_dns_dns__reloader.cc
new file mode 100644
index 000000000000..34eb7a2e01ca
--- /dev/null
+++ b/www/iridium/files/patch-net_dns_dns__reloader.cc
@@ -0,0 +1,13 @@
+--- net/dns/dns_reloader.cc.orig 2019-03-11 22:01:01 UTC
++++ net/dns/dns_reloader.cc
+@@ -7,6 +7,10 @@
+ #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
+ !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
+
++#if defined(OS_FREEBSD)
++#include <netinet/in.h>
++#endif
++
+ #include <resolv.h>
+
+ #include "base/lazy_instance.h"
diff --git a/www/iridium/files/patch-net_dns_dns__util.cc b/www/iridium/files/patch-net_dns_dns__util.cc
new file mode 100644
index 000000000000..be75a59fbd52
--- /dev/null
+++ b/www/iridium/files/patch-net_dns_dns__util.cc
@@ -0,0 +1,11 @@
+--- net/dns/dns_util.cc.orig 2019-10-21 19:06:38 UTC
++++ net/dns/dns_util.cc
+@@ -38,6 +38,8 @@ const uint16_t kFlagNamePointer = 0xc000;
+
+ } // namespace
+
++#include <sys/socket.h>
++
+ #if defined(OS_POSIX)
+ #include <netinet/in.h>
+ #if !defined(OS_NACL)
diff --git a/www/iridium/files/patch-net_dns_host__resolver__proc.cc b/www/iridium/files/patch-net_dns_host__resolver__proc.cc
new file mode 100644
index 000000000000..752211dde398
--- /dev/null
+++ b/www/iridium/files/patch-net_dns_host__resolver__proc.cc
@@ -0,0 +1,11 @@
+--- net/dns/host_resolver_proc.cc.orig 2020-02-03 21:52:49 UTC
++++ net/dns/host_resolver_proc.cc
+@@ -159,7 +159,7 @@ int SystemHostResolverCall(const std::string& host,
+ base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+ base::BlockingType::WILL_BLOCK);
+
+-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
++#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_BSD) && \
+ !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
+ DnsReloaderMaybeReload();
+ #endif
diff --git a/www/iridium/files/patch-net_features.gni b/www/iridium/files/patch-net_features.gni
new file mode 100644
index 000000000000..cb5adcfbf764
--- /dev/null
+++ b/www/iridium/files/patch-net_features.gni
@@ -0,0 +1,11 @@
+--- net/features.gni.orig 2019-09-09 21:55:21 UTC
++++ net/features.gni
+@@ -23,7 +23,7 @@ declare_args() {
+ disable_brotli_filter = false
+
+ # Multicast DNS.
+- enable_mdns = is_win || is_linux || is_fuchsia || is_mac || is_ios
++ enable_mdns = is_win || is_linux || is_fuchsia || is_mac || is_ios || is_bsd
+
+ # Reporting not used on iOS.
+ enable_reporting = !is_ios
diff --git a/www/iridium/files/patch-net_http_http__auth__gssapi__posix.cc b/www/iridium/files/patch-net_http_http__auth__gssapi__posix.cc
new file mode 100644
index 000000000000..f4c603544da0
--- /dev/null
+++ b/www/iridium/files/patch-net_http_http__auth__gssapi__posix.cc
@@ -0,0 +1,14 @@
+--- net/http/http_auth_gssapi_posix.cc.orig 2020-02-03 21:52:49 UTC
++++ net/http/http_auth_gssapi_posix.cc
+@@ -367,8 +367,9 @@ base::NativeLibrary GSSAPISharedLibrary::LoadSharedLib
+ static const char* const kDefaultLibraryNames[] = {
+ #if defined(OS_MACOSX)
+ "/System/Library/Frameworks/GSS.framework/GSS"
+-#elif defined(OS_OPENBSD)
+- "libgssapi.so" // Heimdal - OpenBSD
++#elif defined(OS_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/www/iridium/files/patch-net_http_http__auth__gssapi__posix.h b/www/iridium/files/patch-net_http_http__auth__gssapi__posix.h
new file mode 100644
index 000000000000..e333287758ee
--- /dev/null
+++ b/www/iridium/files/patch-net_http_http__auth__gssapi__posix.h
@@ -0,0 +1,12 @@
+--- net/http/http_auth_gssapi_posix.h.orig 2019-09-09 21:55:21 UTC
++++ net/http/http_auth_gssapi_posix.h
+@@ -21,6 +21,9 @@
+ #include <GSS/gssapi.h>
+ #elif defined(OS_FREEBSD)
+ #include <gssapi/gssapi.h>
++#ifndef GSS_C_DELEG_POLICY_FLAG
++#define GSS_C_DELEG_POLICY_FLAG 32768
++#endif
+ #else
+ #include <gssapi.h>
+ #endif
diff --git a/www/iridium/files/patch-net_nqe_network__quality__estimator.cc b/www/iridium/files/patch-net_nqe_network__quality__estimator.cc
new file mode 100644
index 000000000000..e23051d78497
--- /dev/null
+++ b/www/iridium/files/patch-net_nqe_network__quality__estimator.cc
@@ -0,0 +1,11 @@
+--- net/nqe/network_quality_estimator.cc.orig 2020-03-16 18:40:33 UTC
++++ net/nqe/network_quality_estimator.cc
+@@ -100,7 +100,7 @@ nqe::internal::NetworkID DoGetCurrentNetworkID() {
+ case NetworkChangeNotifier::ConnectionType::CONNECTION_ETHERNET:
+ break;
+ case NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI:
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ network_id.id = GetWifiSSID();
+ #endif
+ break;
diff --git a/www/iridium/files/patch-net_nqe_network__quality__estimator__unittest.cc b/www/iridium/files/patch-net_nqe_network__quality__estimator__unittest.cc
new file mode 100644
index 000000000000..6851ab0d6bc3
--- /dev/null
+++ b/www/iridium/files/patch-net_nqe_network__quality__estimator__unittest.cc
@@ -0,0 +1,11 @@
+--- net/nqe/network_quality_estimator_unittest.cc.orig 2020-03-16 18:39:54 UTC
++++ net/nqe/network_quality_estimator_unittest.cc
+@@ -2107,7 +2107,7 @@ TEST_F(NetworkQualityEstimatorTest, TestGlobalSocketWa
+ // TestTCPSocketRTT requires kernel support for tcp_info struct, and so it is
+ // enabled only on certain platforms.
+ // ChromeOS is disabled due to crbug.com/986904
+-#if (defined(TCP_INFO) || defined(OS_LINUX) || defined(OS_ANDROID)) && \
++#if (defined(TCP_INFO) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)) && \
+ !defined(OS_CHROMEOS)
+ #define MAYBE_TestTCPSocketRTT TestTCPSocketRTT
+ #else
diff --git a/www/iridium/files/patch-net_proxy__resolution_proxy__config__service__linux.cc b/www/iridium/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
new file mode 100644
index 000000000000..cd644766442f
--- /dev/null
+++ b/www/iridium/files/patch-net_proxy__resolution_proxy__config__service__linux.cc
@@ -0,0 +1,39 @@
+--- net/proxy_resolution/proxy_config_service_linux.cc.orig 2020-03-16 18:40:33 UTC
++++ net/proxy_resolution/proxy_config_service_linux.cc
+@@ -6,7 +6,9 @@
+
+ #include <errno.h>
+ #include <limits.h>
++#if !defined(OS_BSD)
+ #include <sys/inotify.h>
++#endif
+ #include <unistd.h>
+
+ #include <map>
+@@ -511,6 +513,7 @@ int StringToIntOrDefault(base::StringPiece value, int
+ return default_value;
+ }
+
++#if !defined(OS_BSD)
+ // This is the KDE version that reads kioslaverc and simulates gsettings.
+ // Doing this allows the main Delegate code, as well as the unit tests
+ // for it, to stay the same - and the settings map fairly well besides.
+@@ -1000,6 +1003,7 @@ class SettingGetterImplKDE : public ProxyConfigService
+
+ DISALLOW_COPY_AND_ASSIGN(SettingGetterImplKDE);
+ };
++#endif
+
+ } // namespace
+
+@@ -1214,8 +1218,10 @@ ProxyConfigServiceLinux::Delegate::Delegate(
+ case base::nix::DESKTOP_ENVIRONMENT_KDE3:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE4:
+ case base::nix::DESKTOP_ENVIRONMENT_KDE5:
++#if !defined(OS_BSD)
+ setting_getter_.reset(new SettingGetterImplKDE(env_var_getter_.get()));
+ break;
++#endif
+ case base::nix::DESKTOP_ENVIRONMENT_XFCE:
+ case base::nix::DESKTOP_ENVIRONMENT_OTHER:
+ break;
diff --git a/www/iridium/files/patch-net_proxy__resolution_proxy__resolution__service.cc b/www/iridium/files/patch-net_proxy__resolution_proxy__resolution__service.cc
new file mode 100644
index 000000000000..ef8a51424888
--- /dev/null
+++ b/www/iridium/files/patch-net_proxy__resolution_proxy__resolution__service.cc
@@ -0,0 +1,29 @@
+--- net/proxy_resolution/proxy_resolution_service.cc.orig 2020-02-03 21:52:49 UTC
++++ net/proxy_resolution/proxy_resolution_service.cc
+@@ -49,7 +49,7 @@
+ #elif defined(OS_MACOSX)
+ #include "net/proxy_resolution/proxy_config_service_mac.h"
+ #include "net/proxy_resolution/proxy_resolver_mac.h"
+-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#elif (defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
+ #include "net/proxy_resolution/proxy_config_service_linux.h"
+ #elif defined(OS_ANDROID)
+ #include "net/proxy_resolution/proxy_config_service_android.h"
+@@ -63,7 +63,7 @@ namespace net {
+ namespace {
+
+ #if defined(OS_WIN) || defined(OS_IOS) || defined(OS_MACOSX) || \
+- (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++ ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS))
+ constexpr net::NetworkTrafficAnnotationTag kSystemProxyConfigTrafficAnnotation =
+ net::DefineNetworkTrafficAnnotation("proxy_config_system", R"(
+ semantics {
+@@ -1556,7 +1556,7 @@ ProxyResolutionService::CreateSystemProxyConfigService
+ << "profile_io_data.cc::CreateProxyConfigService and this should "
+ << "be used only for examples.";
+ return std::make_unique<UnsetProxyConfigService>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ std::unique_ptr<ProxyConfigServiceLinux> linux_config_service(
+ new ProxyConfigServiceLinux());
+
diff --git a/www/iridium/files/patch-net_socket_socket__posix.cc b/www/iridium/files/patch-net_socket_socket__posix.cc
new file mode 100644
index 000000000000..6b1297662465
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_socket__posix.cc
@@ -0,0 +1,11 @@
+--- net/socket/socket_posix.cc.orig 2019-12-16 21:51:27 UTC
++++ net/socket/socket_posix.cc
+@@ -517,7 +517,7 @@ void SocketPosix::ReadCompleted() {
+ }
+
+ int SocketPosix::DoWrite(IOBuffer* buf, int buf_len) {
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_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/www/iridium/files/patch-net_socket_socks5__client__socket.cc b/www/iridium/files/patch-net_socket_socks5__client__socket.cc
new file mode 100644
index 000000000000..1df3deefc418
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_socks5__client__socket.cc
@@ -0,0 +1,13 @@
+--- net/socket/socks5_client_socket.cc.orig 2019-04-30 22:22:55 UTC
++++ net/socket/socks5_client_socket.cc
+@@ -4,6 +4,10 @@
+
+ #include "net/socket/socks5_client_socket.h"
+
++#if defined(OS_BSD)
++#include <netinet/in.h>
++#endif
++
+ #include <utility>
+
+ #include "base/bind.h"
diff --git a/www/iridium/files/patch-net_socket_tcp__socket__posix.cc b/www/iridium/files/patch-net_socket_tcp__socket__posix.cc
new file mode 100644
index 000000000000..d2a7091eac8d
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_tcp__socket__posix.cc
@@ -0,0 +1,20 @@
+--- net/socket/tcp_socket_posix.cc.orig 2019-03-17 15:46:01 UTC
++++ net/socket/tcp_socket_posix.cc
+@@ -88,6 +88,17 @@ bool SetTCPKeepAlive(int fd, bool enable, int delay) {
+ PLOG(ERROR) << "Failed to set TCP_KEEPALIVE on fd: " << fd;
+ return false;
+ }
++#elif defined(OS_BSD)
++ // 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
+ return true;
+ }
diff --git a/www/iridium/files/patch-net_socket_udp__socket__posix.cc b/www/iridium/files/patch-net_socket_udp__socket__posix.cc
new file mode 100644
index 000000000000..c0cfba258179
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_udp__socket__posix.cc
@@ -0,0 +1,108 @@
+--- net/socket/udp_socket_posix.cc.orig 2019-09-09 21:55:22 UTC
++++ net/socket/udp_socket_posix.cc
+@@ -69,7 +69,7 @@ const int kActivityMonitorMinimumSamplesForThroughputE
+ const base::TimeDelta kActivityMonitorMsThreshold =
+ base::TimeDelta::FromMilliseconds(100);
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // When enabling multicast using setsockopt(IP_MULTICAST_IF) MacOS
+ // requires passing IPv4 address instead of interface index. This function
+ // resolves IPv4 address by interface index. The |address| is returned in
+@@ -98,7 +98,7 @@ int GetIPv4AddressFromIndex(int socket, uint32_t index
+ return OK;
+ }
+
+-#endif // OS_MACOSX
++#endif // OS_MACOSX || OS_BSD
+
+ #if defined(OS_MACOSX) && !defined(OS_IOS)
+
+@@ -644,13 +644,13 @@ int UDPSocketPosix::SetDoNotFragment() {
+ }
+
+ void UDPSocketPosix::SetMsgConfirm(bool confirm) {
+-#if !defined(OS_MACOSX) && !defined(OS_IOS)
++#if !defined(OS_MACOSX) && !defined(OS_IOS) && !defined(OS_BSD)
+ if (confirm) {
+ sendto_flags_ |= MSG_CONFIRM;
+ } else {
+ sendto_flags_ &= ~MSG_CONFIRM;
+ }
+-#endif // !defined(OS_MACOSX) && !defined(OS_IOS)
++#endif // !defined(OS_MACOSX) && !defined(OS_IOS) && !defined(OS_BSD)
+ }
+
+ int UDPSocketPosix::AllowAddressReuse() {
+@@ -665,17 +665,20 @@ int UDPSocketPosix::SetBroadcast(bool broadcast) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ int value = broadcast ? 1 : 0;
+ int rv;
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // SO_REUSEPORT on OSX permits multiple processes to each receive
+ // UDP multicast or broadcast datagrams destined for the bound
+ // port.
+ // This is only being set on OSX because its behavior is platform dependent
+ // and we are playing it safe by only setting it on platforms where things
+ // break.
++ rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value));
++ if (rv != 0)
++ return MapSystemError(errno);
+ rv = setsockopt(socket_, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value));
+ if (rv != 0)
+ return MapSystemError(errno);
+-#endif // defined(OS_MACOSX)
++#endif // defined(OS_MACOSX) || defined(OS_BSD)
+ rv = setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value));
+
+ return rv == 0 ? OK : MapSystemError(errno);
+@@ -935,7 +938,7 @@ int UDPSocketPosix::SetMulticastOptions() {
+ if (multicast_interface_ != 0) {
+ switch (addr_family_) {
+ case AF_INET: {
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ ip_mreq mreq = {};
+ int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
+ &mreq.imr_interface.s_addr);
+@@ -947,7 +950,11 @@ int UDPSocketPosix::SetMulticastOptions() {
+ mreq.imr_address.s_addr = htonl(INADDR_ANY);
+ #endif // !defined(OS_MACOSX)
+ int rv = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF,
++#if defined(OS_BSD)
++ reinterpret_cast<const char*>(&mreq.imr_interface.s_addr), sizeof(mreq.imr_interface.s_addr));
++#else
+ reinterpret_cast<const char*>(&mreq), sizeof(mreq));
++#endif
+ if (rv)
+ return MapSystemError(errno);
+ break;
+@@ -1009,7 +1016,7 @@ int UDPSocketPosix::JoinGroup(const IPAddress& group_a
+ if (addr_family_ != AF_INET)
+ return ERR_ADDRESS_INVALID;
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ ip_mreq mreq = {};
+ int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
+ &mreq.imr_interface.s_addr);
+@@ -1057,9 +1064,18 @@ int UDPSocketPosix::LeaveGroup(const IPAddress& group_
+ case IPAddress::kIPv4AddressSize: {
+ if (addr_family_ != AF_INET)
+ return ERR_ADDRESS_INVALID;
++#if defined(OS_BSD)
++ ip_mreq mreq = {};
++ int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
++ &mreq.imr_interface.s_addr);
++
++ if (error != OK)
++ return error;
++#else
+ ip_mreqn mreq = {};
+ mreq.imr_ifindex = multicast_interface_;
+ mreq.imr_address.s_addr = INADDR_ANY;
++#endif
+ memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
+ IPAddress::kIPv4AddressSize);
+ int rv = setsockopt(socket_, IPPROTO_IP, IP_DROP_MEMBERSHIP,
diff --git a/www/iridium/files/patch-net_socket_udp__socket__posix.h b/www/iridium/files/patch-net_socket_udp__socket__posix.h
new file mode 100644
index 000000000000..373c468ca84d
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_udp__socket__posix.h
@@ -0,0 +1,11 @@
+--- net/socket/udp_socket_posix.h.orig 2019-06-07 19:57:25 UTC
++++ net/socket/udp_socket_posix.h
+@@ -33,7 +33,7 @@
+
+ #if defined(__ANDROID__) && defined(__aarch64__)
+ #define HAVE_SENDMMSG 1
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define HAVE_SENDMMSG 1
+ #else
+ #define HAVE_SENDMMSG 0
diff --git a/www/iridium/files/patch-net_socket_unix__domain__client__socket__posix.cc b/www/iridium/files/patch-net_socket_unix__domain__client__socket__posix.cc
new file mode 100644
index 000000000000..9f9ad02d0d9c
--- /dev/null
+++ b/www/iridium/files/patch-net_socket_unix__domain__client__socket__posix.cc
@@ -0,0 +1,11 @@
+--- net/socket/unix_domain_client_socket_posix.cc.orig 2019-06-07 19:59:03 UTC
++++ net/socket/unix_domain_client_socket_posix.cc
+@@ -56,7 +56,7 @@ bool UnixDomainClientSocket::FillAddress(const std::st
+ return true;
+ }
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ // 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/www/iridium/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc b/www/iridium/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
new file mode 100644
index 000000000000..3e87bd2fcfd9
--- /dev/null
+++ b/www/iridium/files/patch-net_tools_cert__verify__tool_cert__verify__tool.cc
@@ -0,0 +1,20 @@
+--- net/tools/cert_verify_tool/cert_verify_tool.cc.orig 2020-03-16 18:39:54 UTC
++++ net/tools/cert_verify_tool/cert_verify_tool.cc
+@@ -29,7 +29,7 @@
+ #include "net/url_request/url_request_context_builder.h"
+ #include "net/url_request/url_request_context_getter.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "net/proxy_resolution/proxy_config.h"
+ #include "net/proxy_resolution/proxy_config_service_fixed.h"
+ #endif
+@@ -51,7 +51,7 @@ void SetUpOnNetworkThread(
+ base::WaitableEvent* initialization_complete_event) {
+ net::URLRequestContextBuilder url_request_context_builder;
+ url_request_context_builder.set_user_agent(GetUserAgent());
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, use a fixed ProxyConfigService, since the default one
+ // depends on glib.
+ //
diff --git a/www/iridium/files/patch-net_tools_quic_quic__http__proxy__backend.cc b/www/iridium/files/patch-net_tools_quic_quic__http__proxy__backend.cc
new file mode 100644
index 000000000000..65d641ec320d
--- /dev/null
+++ b/www/iridium/files/patch-net_tools_quic_quic__http__proxy__backend.cc
@@ -0,0 +1,11 @@
+--- net/tools/quic/quic_http_proxy_backend.cc.orig 2019-10-21 19:06:39 UTC
++++ net/tools/quic/quic_http_proxy_backend.cc
+@@ -161,7 +161,7 @@ void QuicHttpProxyBackend::InitializeURLRequestContext
+ // Enable HTTP2, but disable QUIC on the backend
+ context_builder.SetSpdyAndQuicEnabled(true /* http2 */, false /* quic */);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On Linux, use a fixed ProxyConfigService, since the default one
+ // depends on glib.
+ context_builder.set_proxy_config_service(
diff --git a/www/iridium/files/patch-net_traffic__annotation_network__traffic__annotation.h b/www/iridium/files/patch-net_traffic__annotation_network__traffic__annotation.h
new file mode 100644
index 000000000000..7f70fcc54ea6
--- /dev/null
+++ b/www/iridium/files/patch-net_traffic__annotation_network__traffic__annotation.h
@@ -0,0 +1,20 @@
+--- net/traffic_annotation/network_traffic_annotation.h.orig 2019-09-16 09:58:42 UTC
++++ net/traffic_annotation/network_traffic_annotation.h
+@@ -356,7 +356,7 @@ struct MutablePartialNetworkTrafficAnnotationTag {
+ } // namespace net
+
+ // Placeholder for unannotated usages.
+-#if !defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if !defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_BSD)
+ #define TRAFFIC_ANNOTATION_WITHOUT_PROTO(ANNOTATION_ID) \
+ net::DefineNetworkTrafficAnnotation(ANNOTATION_ID, "No proto yet.")
+ #endif
+@@ -367,7 +367,7 @@ struct MutablePartialNetworkTrafficAnnotationTag {
+ //
+ // On Linux and Windows, use MISSING_TRAFFIC_ANNOTATION or
+ // TRAFFIC_ANNOTATION_FOR_TESTS.
+-#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
++#if (!defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_CHROMEOS)
+ #define NO_TRAFFIC_ANNOTATION_YET \
+ net::DefineNetworkTrafficAnnotation("undefined", "Nothing here yet.")
+
diff --git a/www/iridium/files/patch-net_url__request_url__fetcher.cc b/www/iridium/files/patch-net_url__request_url__fetcher.cc
new file mode 100644
index 000000000000..36e2fa9c37e2
--- /dev/null
+++ b/www/iridium/files/patch-net_url__request_url__fetcher.cc
@@ -0,0 +1,11 @@
+--- net/url_request/url_fetcher.cc.orig 2019-10-30 16:19:14 UTC
++++ net/url_request/url_fetcher.cc
+@@ -11,7 +11,7 @@ namespace net {
+
+ URLFetcher::~URLFetcher() = default;
+
+-#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
++#if (!defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_CHROMEOS)
+ // static
+ std::unique_ptr<URLFetcher> URLFetcher::Create(
+ const GURL& url,
diff --git a/www/iridium/files/patch-net_url__request_url__fetcher.h b/www/iridium/files/patch-net_url__request_url__fetcher.h
new file mode 100644
index 000000000000..bd4fbd669d4c
--- /dev/null
+++ b/www/iridium/files/patch-net_url__request_url__fetcher.h
@@ -0,0 +1,11 @@
+--- net/url_request/url_fetcher.h.orig 2019-10-30 16:19:33 UTC
++++ net/url_request/url_fetcher.h
+@@ -113,7 +113,7 @@ class NET_EXPORT URLFetcher {
+ // The unannotated Create() methods are not available on desktop Linux +
+ // Windows. They are available on other platforms, since we only audit network
+ // annotations on Linux & Windows.
+-#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
++#if (!defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_CHROMEOS)
+ // |url| is the URL to send the request to. It must be valid.
+ // |request_type| is the type of request to make.
+ // |d| the object that will receive the callback on fetch completion.
diff --git a/www/iridium/files/patch-net_url__request_url__request__context.cc b/www/iridium/files/patch-net_url__request_url__request__context.cc
new file mode 100644
index 000000000000..fd2e091f9f61
--- /dev/null
+++ b/www/iridium/files/patch-net_url__request_url__request__context.cc
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context.cc.orig 2020-03-16 18:39:54 UTC
++++ net/url_request/url_request_context.cc
+@@ -89,7 +89,7 @@ const HttpNetworkSession::Context* URLRequestContext::
+ return &network_session->context();
+ }
+
+-#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
++#if (!defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_CHROMEOS)
+ std::unique_ptr<URLRequest> URLRequestContext::CreateRequest(
+ const GURL& url,
+ RequestPriority priority,
diff --git a/www/iridium/files/patch-net_url__request_url__request__context.h b/www/iridium/files/patch-net_url__request_url__request__context.h
new file mode 100644
index 000000000000..cc9af1e29180
--- /dev/null
+++ b/www/iridium/files/patch-net_url__request_url__request__context.h
@@ -0,0 +1,11 @@
+--- net/url_request/url_request_context.h.orig 2020-03-16 18:40:33 UTC
++++ net/url_request/url_request_context.h
+@@ -82,7 +82,7 @@ class NET_EXPORT URLRequestContext
+ // session.
+ const HttpNetworkSession::Context* GetNetworkSessionContext() const;
+
+-#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
++#if (!defined(OS_WIN) && !defined(OS_LINUX) && !defined(OS_BSD)) || defined(OS_CHROMEOS)
+ // This function should not be used in Chromium, please use the version with
+ // NetworkTrafficAnnotationTag in the future.
+ //
diff --git a/www/iridium/files/patch-net_url__request_url__request__context__builder.cc b/www/iridium/files/patch-net_url__request_url__request__context__builder.cc
new file mode 100644
index 000000000000..0144efb4a529
--- /dev/null
+++ b/www/iridium/files/patch-net_url__request_url__request__context__builder.cc
@@ -0,0 +1,20 @@
+--- net/url_request/url_request_context_builder.cc.orig 2020-03-16 18:40:33 UTC
++++ net/url_request/url_request_context_builder.cc
+@@ -507,7 +507,7 @@ std::unique_ptr<URLRequestContext> URLRequestContextBu
+ }
+
+ if (!proxy_resolution_service_) {
+-#if !defined(OS_LINUX) && !defined(OS_ANDROID)
++#if !defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ // TODO(willchan): Switch to using this code when
+ // ProxyResolutionService::CreateSystemProxyConfigService()'s signature
+ // doesn't suck.
+@@ -516,7 +516,7 @@ std::unique_ptr<URLRequestContext> URLRequestContextBu
+ ProxyResolutionService::CreateSystemProxyConfigService(
+ base::ThreadTaskRunnerHandle::Get().get());
+ }
+-#endif // !defined(OS_LINUX) && !defined(OS_ANDROID)
++#endif // !defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_BSD)
+ proxy_resolution_service_ = CreateProxyResolutionService(
+ std::move(proxy_config_service_), context.get(),
+ context->host_resolver(), context->network_delegate(),
diff --git a/www/iridium/files/patch-pdf_pdfium_pdfium__engine.cc b/www/iridium/files/patch-pdf_pdfium_pdfium__engine.cc
new file mode 100644
index 000000000000..c1b3c3d2c8a3
--- /dev/null
+++ b/www/iridium/files/patch-pdf_pdfium_pdfium__engine.cc
@@ -0,0 +1,56 @@
+--- pdf/pdfium/pdfium_engine.cc.orig 2020-03-16 18:40:33 UTC
++++ pdf/pdfium/pdfium_engine.cc
+@@ -52,7 +52,7 @@
+ #include "ui/gfx/geometry/rect.h"
+ #include "v8/include/v8.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "pdf/pdfium/pdfium_font_linux.h"
+ #endif
+
+@@ -377,7 +377,7 @@ void InitializeSDK(bool enable_v8) {
+ config.m_v8EmbedderSlot = gin::kEmbedderPDFium;
+ FPDF_InitLibraryWithConfig(&config);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ InitializeLinuxFontMapper();
+ #endif
+
+@@ -411,7 +411,7 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client,
+ IFSDK_PAUSE::user = nullptr;
+ IFSDK_PAUSE::NeedToPauseNow = Pause_NeedToPauseNow;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // PreviewModeClient does not know its pp::Instance.
+ SetLastInstance(client_->GetPluginInstance());
+ #endif
+@@ -878,7 +878,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPdf(
+
+ KillFormFocus();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SetLastInstance(client_->GetPluginInstance());
+ #endif
+
+@@ -2861,7 +2861,7 @@ bool PDFiumEngine::ContinuePaint(int progressive_index
+ DCHECK(image_data);
+
+ last_progressive_start_time_ = base::Time::Now();
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SetLastInstance(client_->GetPluginInstance());
+ #endif
+
+@@ -3357,7 +3357,7 @@ void PDFiumEngine::SetCurrentPage(int index) {
+ FORM_DoPageAAction(old_page, form(), FPDFPAGE_AACTION_CLOSE);
+ }
+ most_visible_page_ = index;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SetLastInstance(client_->GetPluginInstance());
+ #endif
+ if (most_visible_page_ != -1 && called_do_document_action_) {
diff --git a/www/iridium/files/patch-ppapi_proxy_file__io__resource.cc b/www/iridium/files/patch-ppapi_proxy_file__io__resource.cc
new file mode 100644
index 000000000000..bd63ba366842
--- /dev/null
+++ b/www/iridium/files/patch-ppapi_proxy_file__io__resource.cc
@@ -0,0 +1,48 @@
+--- ppapi/proxy/file_io_resource.cc.orig 2020-03-16 18:39:54 UTC
++++ ppapi/proxy/file_io_resource.cc
+@@ -284,17 +284,19 @@ int32_t FileIOResource::Write(int64_t offset,
+
+ if (check_quota_) {
+ int64_t increase = 0;
+- uint64_t max_offset = 0;
++ uint64_t _max_offset = 0;
++ // (rene) avoid name collission with /usr/include/vm/vm_map.h on FreeBSD
++ // which also defines max_offset
+ bool append = (open_flags_ & PP_FILEOPENFLAG_APPEND) != 0;
+ if (append) {
+ increase = bytes_to_write;
+ } else {
+- uint64_t max_offset = offset + bytes_to_write;
+- if (max_offset >
++ uint64_t _max_offset = offset + bytes_to_write;
++ if (_max_offset >
+ static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
+ return PP_ERROR_FAILED; // amount calculation would overflow.
+ }
+- increase = static_cast<int64_t>(max_offset) - max_written_offset_;
++ increase = static_cast<int64_t>(_max_offset) - max_written_offset_;
+ }
+
+ if (increase > 0) {
+@@ -318,7 +320,7 @@ int32_t FileIOResource::Write(int64_t offset,
+ if (append)
+ append_mode_write_amount_ += bytes_to_write;
+ else
+- max_written_offset_ = max_offset;
++ max_written_offset_ = _max_offset;
+ }
+ }
+ return WriteValidated(offset, buffer, bytes_to_write, callback);
+@@ -594,9 +596,9 @@ void FileIOResource::OnRequestWriteQuotaComplete(
+ } else {
+ DCHECK_LE(offset + bytes_to_write - max_written_offset_, granted);
+
+- int64_t max_offset = offset + bytes_to_write;
+- if (max_written_offset_ < max_offset)
+- max_written_offset_ = max_offset;
++ int64_t _max_offset = offset + bytes_to_write;
++ if (max_written_offset_ < _max_offset)
++ max_written_offset_ = _max_offset;
+ }
+
+ if (callback->is_blocking()) {
diff --git a/www/iridium/files/patch-ppapi_proxy_flash__resource.cc b/www/iridium/files/patch-ppapi_proxy_flash__resource.cc
new file mode 100644
index 000000000000..a45deba61a6e
--- /dev/null
+++ b/www/iridium/files/patch-ppapi_proxy_flash__resource.cc
@@ -0,0 +1,11 @@
+--- ppapi/proxy/flash_resource.cc.orig 2019-09-16 10:01:18 UTC
++++ ppapi/proxy/flash_resource.cc
+@@ -136,7 +136,7 @@ double FlashResource::GetLocalTimeZoneOffset(PP_Instan
+ // require filesystem access prohibited by the sandbox.
+ // TODO(shess): Figure out why OSX needs the access, the sandbox warmup should
+ // handle it. http://crbug.com/149006
+-#if defined(OS_LINUX) || defined(OS_MACOSX)
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD)
+ int32_t result = SyncCall<PpapiPluginMsg_Flash_GetLocalTimeZoneOffsetReply>(
+ BROWSER,
+ PpapiHostMsg_Flash_GetLocalTimeZoneOffset(PPTimeToTime(t)),
diff --git a/www/iridium/files/patch-printing_cups__config__helper.py b/www/iridium/files/patch-printing_cups__config__helper.py
new file mode 100644
index 000000000000..0795067ee45f
--- /dev/null
+++ b/www/iridium/files/patch-printing_cups__config__helper.py
@@ -0,0 +1,11 @@
+--- printing/cups_config_helper.py.orig 2019-12-16 21:50:51 UTC
++++ printing/cups_config_helper.py
+@@ -67,7 +67,7 @@ def main():
+ mode = sys.argv[1]
+ if len(sys.argv) > 2 and sys.argv[2]:
+ sysroot = sys.argv[2]
+- cups_config = os.path.join(sysroot, 'usr', 'bin', 'cups-config')
++ cups_config = os.path.join(sysroot, 'bin', 'cups-config')
+ if not os.path.exists(cups_config):
+ print('cups-config not found: %s' % cups_config)
+ return 1
diff --git a/www/iridium/files/patch-remoting_base_chromoting__event.cc b/www/iridium/files/patch-remoting_base_chromoting__event.cc
new file mode 100644
index 000000000000..93df172fe5e5
--- /dev/null
+++ b/www/iridium/files/patch-remoting_base_chromoting__event.cc
@@ -0,0 +1,11 @@
+--- remoting/base/chromoting_event.cc.orig 2019-09-09 21:55:22 UTC
++++ remoting/base/chromoting_event.cc
+@@ -188,7 +188,7 @@ void ChromotingEvent::AddSystemInfo() {
+ SetString(kCpuKey, base::SysInfo::OperatingSystemArchitecture());
+ SetString(kOsVersionKey, base::SysInfo::OperatingSystemVersion());
+ SetString(kWebAppVersionKey, STRINGIZE(VERSION));
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ Os os = Os::CHROMOTING_LINUX;
+ #elif defined(OS_CHROMEOS)
+ Os os = Os::CHROMOTING_CHROMEOS;
diff --git a/www/iridium/files/patch-remoting_client_display_sys__opengl.h b/www/iridium/files/patch-remoting_client_display_sys__opengl.h
new file mode 100644
index 000000000000..cb1787f42c60
--- /dev/null
+++ b/www/iridium/files/patch-remoting_client_display_sys__opengl.h
@@ -0,0 +1,11 @@
+--- remoting/client/display/sys_opengl.h.orig 2019-03-11 22:01:01 UTC
++++ remoting/client/display/sys_opengl.h
+@@ -9,7 +9,7 @@
+
+ #if defined(OS_IOS)
+ #include <OpenGLES/ES3/gl.h>
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define GL_GLEXT_PROTOTYPES
+ #include <GL/gl.h>
+ #include <GL/glext.h>
diff --git a/www/iridium/files/patch-remoting_host_evaluate__capability.cc b/www/iridium/files/patch-remoting_host_evaluate__capability.cc
new file mode 100644
index 000000000000..565d577bd91b
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_evaluate__capability.cc
@@ -0,0 +1,11 @@
+--- remoting/host/evaluate_capability.cc.orig 2019-03-11 22:01:01 UTC
++++ remoting/host/evaluate_capability.cc
+@@ -50,7 +50,7 @@ base::FilePath BuildHostBinaryPath() {
+ }
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (path.BaseName().value() ==
+ FILE_PATH_LITERAL("chrome-remote-desktop-host")) {
+ return path;
diff --git a/www/iridium/files/patch-remoting_host_host__attributes.cc b/www/iridium/files/patch-remoting_host_host__attributes.cc
new file mode 100644
index 000000000000..d2a35b8d8d01
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_host__attributes.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_attributes.cc.orig 2019-09-09 21:55:22 UTC
++++ remoting/host/host_attributes.cc
+@@ -124,7 +124,7 @@ std::string GetHostAttributes() {
+ media::InitializeMediaFoundation()) {
+ result.push_back("HWEncoder");
+ }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ result.push_back("HWEncoder");
+ #endif
+
diff --git a/www/iridium/files/patch-remoting_host_host__details.cc b/www/iridium/files/patch-remoting_host_host__details.cc
new file mode 100644
index 000000000000..2467708caed9
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_host__details.cc
@@ -0,0 +1,11 @@
+--- remoting/host/host_details.cc.orig 2019-09-09 21:55:22 UTC
++++ remoting/host/host_details.cc
+@@ -22,7 +22,7 @@ std::string GetHostOperatingSystemName() {
+ return "Mac";
+ #elif defined(OS_CHROMEOS)
+ return "ChromeOS";
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return "Linux";
+ #elif defined(OS_ANDROID)
+ return "Android";
diff --git a/www/iridium/files/patch-remoting_host_host__main.cc b/www/iridium/files/patch-remoting_host_host__main.cc
new file mode 100644
index 000000000000..72f86cb90395
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_host__main.cc
@@ -0,0 +1,27 @@
+--- remoting/host/host_main.cc.orig 2019-10-30 16:20:58 UTC
++++ remoting/host/host_main.cc
+@@ -49,9 +49,9 @@ int DesktopProcessMain();
+ int FileChooserMain();
+ int RdpDesktopSessionMain();
+ #endif // defined(OS_WIN)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ int XSessionChooserMain();
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ namespace {
+
+@@ -146,10 +146,10 @@ MainRoutineFn SelectMainRoutine(const std::string& pro
+ } else if (process_type == kProcessTypeRdpDesktopSession) {
+ main_routine = &RdpDesktopSessionMain;
+ #endif // defined(OS_WIN)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ } else if (process_type == kProcessTypeXSessionChooser) {
+ main_routine = &XSessionChooserMain;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ return main_routine;
diff --git a/www/iridium/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc b/www/iridium/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
new file mode 100644
index 000000000000..ca1e5dce0129
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_it2me_it2me__native__messaging__host__main.cc
@@ -0,0 +1,35 @@
+--- remoting/host/it2me/it2me_native_messaging_host_main.cc.orig 2020-02-03 21:52:49 UTC
++++ remoting/host/it2me/it2me_native_messaging_host_main.cc
+@@ -29,12 +29,12 @@
+ #include "remoting/host/switches.h"
+ #include "remoting/host/usage_stats_consent.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <gtk/gtk.h>
+
+ #include "base/linux_util.h"
+ #include "ui/gfx/x/x11.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_MACOSX)
+ #include "base/mac/mac_util.h"
+@@ -112,7 +112,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+
+ remoting::LoadResources("");
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Required in order for us to run multiple X11 threads.
+ XInitThreads();
+
+@@ -128,7 +128,7 @@ int It2MeNativeMessagingHostMain(int argc, char** argv
+ // Need to prime the host OS version value for linux to prevent IO on the
+ // network thread. base::GetLinuxDistro() caches the result.
+ base::GetLinuxDistro();
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ base::File read_file;
+ base::File write_file;
diff --git a/www/iridium/files/patch-remoting_host_me2me__desktop__environment.cc b/www/iridium/files/patch-remoting_host_me2me__desktop__environment.cc
new file mode 100644
index 000000000000..af1299dd2bdf
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_me2me__desktop__environment.cc
@@ -0,0 +1,11 @@
+--- remoting/host/me2me_desktop_environment.cc.orig 2019-09-09 21:55:22 UTC
++++ remoting/host/me2me_desktop_environment.cc
+@@ -129,7 +129,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ bool want_user_interface = false;
+ #elif defined(OS_MACOSX)
+ // Don't try to display any UI on top of the system's login screen as this
diff --git a/www/iridium/files/patch-remoting_host_remoting__me2me__host.cc b/www/iridium/files/patch-remoting_host_remoting__me2me__host.cc
new file mode 100644
index 000000000000..4773f4846b88
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_remoting__me2me__host.cc
@@ -0,0 +1,108 @@
+--- remoting/host/remoting_me2me_host.cc.orig 2020-03-16 18:40:33 UTC
++++ remoting/host/remoting_me2me_host.cc
+@@ -118,13 +118,13 @@
+ #include "remoting/host/mac/permission_utils.h"
+ #endif // defined(OS_MACOSX)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <gtk/gtk.h>
+ #include "base/linux_util.h"
+ #include "remoting/host/audio_capturer_linux.h"
+ #include "remoting/host/linux/certificate_watcher.h"
+ #include "ui/gfx/x/x11.h"
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_WIN)
+ #include <commctrl.h>
+@@ -159,11 +159,11 @@ const char kApplicationName[] = "chromoting";
+ const char kStdinConfigPath[] = "-";
+ #endif // !defined(REMOTING_MULTI_PROCESS)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The command line switch used to pass name of the pipe to capture audio on
+ // linux.
+ const char kAudioPipeSwitchName[] = "audio-pipe-name";
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ // The command line switch used to pass name of the unix domain socket used to
+@@ -357,7 +357,7 @@ class HostProcess : public ConfigWatcher::Delegate,
+
+ std::unique_ptr<ChromotingHostContext> context_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Watch for certificate changes and kill the host when changes occur
+ std::unique_ptr<CertificateWatcher> cert_watcher_;
+ #endif
+@@ -582,10 +582,10 @@ bool HostProcess::InitWithCommandLine(const base::Comm
+ enable_window_capture_ = cmd_line->HasSwitch(kWindowIdSwitchName);
+ if (enable_window_capture_) {
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ LOG(WARNING) << "Window capturing is not fully supported on Linux or "
+ "Windows.";
+-#endif // defined(OS_LINUX) || defined(OS_WIN)
++#endif // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+
+ // uint32_t is large enough to hold window IDs on all platforms.
+ uint32_t window_id;
+@@ -780,7 +780,7 @@ void HostProcess::CreateAuthenticatorFactory() {
+ DCHECK(third_party_auth_config_.token_url.is_valid());
+ DCHECK(third_party_auth_config_.token_validation_url.is_valid());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!cert_watcher_) {
+ cert_watcher_.reset(new CertificateWatcher(
+ base::Bind(&HostProcess::ShutdownHost, this, kSuccessExitCode),
+@@ -866,7 +866,7 @@ void HostProcess::StartOnUiThread() {
+ base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this)),
+ base::Bind(&HostProcess::OnPolicyError, base::Unretained(this)));
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // If an audio pipe is specific on the command-line then initialize
+ // AudioCapturerLinux to capture from it.
+ base::FilePath audio_pipe_name = base::CommandLine::ForCurrentProcess()->
+@@ -875,7 +875,7 @@ void HostProcess::StartOnUiThread() {
+ remoting::AudioCapturerLinux::InitializePipeReader(
+ context_->audio_task_runner(), audio_pipe_name);
+ }
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ #if defined(OS_POSIX)
+ base::FilePath security_key_socket_name =
+@@ -930,7 +930,7 @@ void HostProcess::ShutdownOnUiThread() {
+ // It is now safe for the HostProcess to be deleted.
+ self_ = nullptr;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -1529,7 +1529,7 @@ void HostProcess::StartHost() {
+ host_->AddExtension(std::make_unique<TestEchoExtension>());
+
+ // TODO(simonmorris): Get the maximum session duration from a policy.
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20));
+ #endif
+
+@@ -1698,7 +1698,7 @@ void HostProcess::OnCrash(const std::string& function_
+ int HostProcessMain() {
+ HOST_LOG << "Starting host process: version " << STRINGIZE(VERSION);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+ kReportOfflineReasonSwitchName)) {
+ // Required in order for us to run multiple X11 threads.
diff --git a/www/iridium/files/patch-remoting_host_switches.cc b/www/iridium/files/patch-remoting_host_switches.cc
new file mode 100644
index 000000000000..feb1d19fe0ec
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_switches.cc
@@ -0,0 +1,14 @@
+--- remoting/host/switches.cc.orig 2019-10-30 16:21:28 UTC
++++ remoting/host/switches.cc
+@@ -21,9 +21,9 @@ const char kProcessTypeHost[] = "host";
+ const char kProcessTypeRdpDesktopSession[] = "rdp_desktop_session";
+ const char kProcessTypeEvaluateCapability[] = "evaluate_capability";
+ const char kProcessTypeFileChooser[] = "file_chooser";
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ const char kProcessTypeXSessionChooser[] = "xsession_chooser";
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ const char kEvaluateCapabilitySwitchName[] = "evaluate-type";
+
diff --git a/www/iridium/files/patch-remoting_host_switches.h b/www/iridium/files/patch-remoting_host_switches.h
new file mode 100644
index 000000000000..39fcdf4bebb2
--- /dev/null
+++ b/www/iridium/files/patch-remoting_host_switches.h
@@ -0,0 +1,14 @@
+--- remoting/host/switches.h.orig 2019-10-30 16:21:42 UTC
++++ remoting/host/switches.h
+@@ -34,9 +34,9 @@ extern const char kProcessTypeHost[];
+ extern const char kProcessTypeRdpDesktopSession[];
+ extern const char kProcessTypeEvaluateCapability[];
+ extern const char kProcessTypeFileChooser[];
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ extern const char kProcessTypeXSessionChooser[];
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ extern const char kEvaluateCapabilitySwitchName[];
+
diff --git a/www/iridium/files/patch-remoting_resources_remoting__strings.grd b/www/iridium/files/patch-remoting_resources_remoting__strings.grd
new file mode 100644
index 000000000000..34c07b2c400d
--- /dev/null
+++ b/www/iridium/files/patch-remoting_resources_remoting__strings.grd
@@ -0,0 +1,20 @@
+--- remoting/resources/remoting_strings.grd.orig 2020-02-03 21:53:32 UTC
++++ remoting/resources/remoting_strings.grd
+@@ -1393,7 +1393,7 @@ If '<ph name="SERVICE_SCRIPT_NAME">$3<ex>org.chromium.
+ Open Screen Recording Preferences
+ </message>
+ </if>
+- <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>
+@@ -1409,7 +1409,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/www/iridium/files/patch-sandbox_features.gni b/www/iridium/files/patch-sandbox_features.gni
new file mode 100644
index 000000000000..b5a277f82178
--- /dev/null
+++ b/www/iridium/files/patch-sandbox_features.gni
@@ -0,0 +1,11 @@
+--- sandbox/features.gni.orig 2020-03-16 18:39:54 UTC
++++ sandbox/features.gni
+@@ -8,7 +8,7 @@ import("//build/config/nacl/config.gni")
+ # currently.
+ # Do not disable seccomp_bpf anywhere without talking to
+ # security@chromium.org!
+-use_seccomp_bpf = (is_linux || is_android) &&
++use_seccomp_bpf = (is_linux || is_android) && !is_bsd &&
+ (current_cpu == "x86" || current_cpu == "x64" ||
+ current_cpu == "arm" || current_cpu == "arm64" ||
+ current_cpu == "mipsel" || current_cpu == "mips64el")
diff --git a/www/iridium/files/patch-sandbox_linux_BUILD.gn b/www/iridium/files/patch-sandbox_linux_BUILD.gn
new file mode 100644
index 000000000000..d9c24596c644
--- /dev/null
+++ b/www/iridium/files/patch-sandbox_linux_BUILD.gn
@@ -0,0 +1,47 @@
+--- sandbox/linux/BUILD.gn.orig 2020-04-10 00:39:11 UTC
++++ sandbox/linux/BUILD.gn
+@@ -12,12 +12,12 @@ if (is_android) {
+ }
+
+ declare_args() {
+- compile_suid_client = is_linux
++ compile_suid_client = is_linux && !is_bsd
+
+- compile_credentials = is_linux
++ compile_credentials = is_linux && !is_bsd
+
+ # On Android, use plain GTest.
+- use_base_test_suite = is_linux
++ use_base_test_suite = is_linux && !is_bsd
+ }
+
+ if (is_nacl_nonsfi) {
+@@ -373,7 +373,7 @@ component("sandbox_services") {
+ public_deps += [ ":sandbox_services_headers" ]
+ }
+
+- if (is_nacl_nonsfi) {
++ if (is_nacl_nonsfi || is_bsd) {
+ cflags = [ "-fgnu-inline-asm" ]
+
+ sources -= [
+@@ -381,6 +381,8 @@ component("sandbox_services") {
+ "services/init_process_reaper.h",
+ "services/scoped_process.cc",
+ "services/scoped_process.h",
++ "services/syscall_wrappers.cc",
++ "services/syscall_wrappers.h",
+ "services/yama.cc",
+ "services/yama.h",
+ "syscall_broker/broker_channel.cc",
+@@ -399,6 +401,10 @@ component("sandbox_services") {
+ "syscall_broker/broker_process.h",
+ "syscall_broker/broker_simple_message.cc",
+ "syscall_broker/broker_simple_message.h",
++ ]
++ sources += [
++ "services/libc_interceptor.cc",
++ "services/libc_interceptor.h",
+ ]
+ } else if (!is_android) {
+ sources += [
diff --git a/www/iridium/files/patch-sandbox_linux_services_init__process__reaper.cc b/www/iridium/files/patch-sandbox_linux_services_init__process__reaper.cc
new file mode 100644
index 000000000000..ce19163df699
--- /dev/null
+++ b/www/iridium/files/patch-sandbox_linux_services_init__process__reaper.cc
@@ -0,0 +1,15 @@
+--- sandbox/linux/services/init_process_reaper.cc.orig 2019-03-11 22:01:01 UTC
++++ sandbox/linux/services/init_process_reaper.cc
+@@ -1,6 +1,7 @@
+ // 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.
++#if 0
+
+ #include "sandbox/linux/services/init_process_reaper.h"
+
+@@ -100,3 +101,4 @@ bool CreateInitProcessReaper(base::OnceClosure post_fo
+ }
+
+ } // namespace sandbox.
++#endif
diff --git a/www/iridium/files/patch-sandbox_linux_services_libc__interceptor.cc b/www/iridium/files/patch-sandbox_linux_services_libc__interceptor.cc
new file mode 100644
index 000000000000..6046b28b1771
--- /dev/null
+++ b/www/iridium/files/patch-sandbox_linux_services_libc__interceptor.cc
@@ -0,0 +1,21 @@
+--- sandbox/linux/services/libc_interceptor.cc.orig 2020-03-16 18:39:54 UTC
++++ sandbox/linux/services/libc_interceptor.cc
+@@ -11,7 +11,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <time.h>
+@@ -92,7 +94,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/www/iridium/files/patch-services_audio_BUILD.gn b/www/iridium/files/patch-services_audio_BUILD.gn
new file mode 100644
index 000000000000..32423e1a0600
--- /dev/null
+++ b/www/iridium/files/patch-services_audio_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/audio/BUILD.gn.orig 2020-03-16 18:39:54 UTC
++++ services/audio/BUILD.gn
+@@ -82,7 +82,7 @@ source_set("audio") {
+ "//services/service_manager/sandbox",
+ ]
+
+- if (is_linux) {
++ if ((is_linux) && (!is_bsd)) {
+ sources += [
+ "audio_sandbox_hook_linux.cc",
+ "audio_sandbox_hook_linux.h",
diff --git a/www/iridium/files/patch-services_device_geolocation_location__arbitrator.cc b/www/iridium/files/patch-services_device_geolocation_location__arbitrator.cc
new file mode 100644
index 000000000000..17db61b295df
--- /dev/null
+++ b/www/iridium/files/patch-services_device_geolocation_location__arbitrator.cc
@@ -0,0 +1,11 @@
+--- services/device/geolocation/location_arbitrator.cc.orig 2020-02-03 21:53:32 UTC
++++ services/device/geolocation/location_arbitrator.cc
+@@ -157,7 +157,7 @@ LocationArbitrator::NewNetworkLocationProvider(
+
+ std::unique_ptr<LocationProvider>
+ LocationArbitrator::NewSystemLocationProvider() {
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ return nullptr;
+ #else
+ return device::NewSystemLocationProvider();
diff --git a/www/iridium/files/patch-services_device_hid_BUILD.gn b/www/iridium/files/patch-services_device_hid_BUILD.gn
new file mode 100644
index 000000000000..01a7f29e58fa
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_BUILD.gn
@@ -0,0 +1,22 @@
+--- services/device/hid/BUILD.gn.orig 2019-06-04 18:55:28 UTC
++++ services/device/hid/BUILD.gn
+@@ -51,6 +51,19 @@ source_set("hid") {
+ deps += [ "//device/udev_linux" ]
+ }
+
++ if (is_bsd) {
++ sources -= [
++ "hid_connection_linux.cc",
++ "hid_connection_linux.h",
++ ]
++ sources += [
++ "hid_connection_freebsd.cc",
++ "hid_connection_freebsd.h",
++ "hid_service_freebsd.cc",
++ "hid_service_freebsd.h",
++ ]
++ }
++
+ if (is_chromeos) {
+ deps += [ "//chromeos/dbus/permission_broker" ]
+ }
diff --git a/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.cc b/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.cc
new file mode 100644
index 000000000000..42e0cc8b1986
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.cc
@@ -0,0 +1,243 @@
+--- services/device/hid/hid_connection_freebsd.cc.orig 2019-05-04 09:19:19 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/bind.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/single_thread_task_runner.h"
++#include "base/strings/stringprintf.h"
++#include "base/task/post_task.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "base/threading/thread_restrictions.h"
++#include "base/threading/thread_task_runner_handle.h"
++#include "components/device_event_log/device_event_log.h"
++#include "services/device/hid/hid_service.h"
++
++namespace device {
++
++class HidConnectionFreeBSD::BlockingTaskHelper {
++ public:
++ BlockingTaskHelper(base::ScopedFD fd,
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::WeakPtr<HidConnectionFreeBSD> connection)
++ : fd_(std::move(fd)),
++ connection_(connection),
++ origin_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
++ 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();
++ }
++
++ ~BlockingTaskHelper() { 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::Bind(&BlockingTaskHelper::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_;
++
++ DISALLOW_COPY_AND_ASSIGN(BlockingTaskHelper);
++};
++
++HidConnectionFreeBSD::HidConnectionFreeBSD(
++ scoped_refptr<HidDeviceInfo> device_info,
++ base::ScopedFD fd,
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
++ : HidConnection(device_info),
++ blocking_task_runner_(std::move(blocking_task_runner)),
++ weak_factory_(this) {
++ helper_ = std::make_unique<BlockingTaskHelper>(std::move(fd), device_info,
++ weak_factory_.GetWeakPtr());
++ blocking_task_runner_->PostTask(
++ FROM_HERE, base::BindOnce(&BlockingTaskHelper::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(&BlockingTaskHelper::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(&BlockingTaskHelper::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(&BlockingTaskHelper::SendFeatureReport,
++ base::Unretained(helper_.get()), buffer, std::move(callback)));
++}
++
++} // namespace device
diff --git a/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.h b/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.h
new file mode 100644
index 000000000000..0b6704917991
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_hid__connection__freebsd.h
@@ -0,0 +1,71 @@
+--- services/device/hid/hid_connection_freebsd.h.orig 2019-05-01 15:21:27 UTC
++++ services/device/hid/hid_connection_freebsd.h
+@@ -0,0 +1,68 @@
++// 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/macros.h"
++#include "base/memory/ptr_util.h"
++#include "base/memory/ref_counted_memory.h"
++#include "base/memory/weak_ptr.h"
++#include "base/sequence_checker.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);
++
++ private:
++ friend class base::RefCountedThreadSafe<HidConnectionFreeBSD>;
++ class BlockingTaskHelper;
++
++ ~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<BlockingTaskHelper> helper_;
++
++ const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
++ const scoped_refptr<base::SequencedTaskRunner> task_runner_;
++
++ SEQUENCE_CHECKER(sequence_checker_);
++
++ base::WeakPtrFactory<HidConnectionFreeBSD> weak_factory_;
++
++ DISALLOW_COPY_AND_ASSIGN(HidConnectionFreeBSD);
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_CONNECTION_FREEBSD_H_
diff --git a/www/iridium/files/patch-services_device_hid_hid__service.cc b/www/iridium/files/patch-services_device_hid_hid__service.cc
new file mode 100644
index 000000000000..cadfcbe6b358
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_hid__service.cc
@@ -0,0 +1,20 @@
+--- services/device/hid/hid_service.cc.orig 2019-03-11 22:01:01 UTC
++++ services/device/hid/hid_service.cc
+@@ -16,6 +16,8 @@
+
+ #if defined(OS_LINUX) && defined(USE_UDEV)
+ #include "services/device/hid/hid_service_linux.h"
++#elif defined(OS_BSD)
++#include "services/device/hid/hid_service_freebsd.h"
+ #elif defined(OS_MACOSX)
+ #include "services/device/hid/hid_service_mac.h"
+ #elif defined(OS_WIN)
+@@ -36,6 +38,8 @@ constexpr base::TaskTraits HidService::kBlockingTaskTr
+ std::unique_ptr<HidService> HidService::Create() {
+ #if defined(OS_LINUX) && defined(USE_UDEV)
+ return base::WrapUnique(new HidServiceLinux());
++#elif defined(OS_BSD)
++ return base::WrapUnique(new HidServiceFreeBSD());
+ #elif defined(OS_MACOSX)
+ return base::WrapUnique(new HidServiceMac());
+ #elif defined(OS_WIN)
diff --git a/www/iridium/files/patch-services_device_hid_hid__service__freebsd.cc b/www/iridium/files/patch-services_device_hid_hid__service__freebsd.cc
new file mode 100644
index 000000000000..1ede85233d94
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_hid__service__freebsd.cc
@@ -0,0 +1,386 @@
+--- services/device/hid/hid_service_freebsd.cc.orig 2020-03-17 15:11:01 UTC
++++ services/device/hid/hid_service_freebsd.cc
+@@ -0,0 +1,383 @@
++// 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/bind.h"
++#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/single_thread_task_runner.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/post_task.h"
++#include "base/threading/scoped_blocking_call.h"
++#include "base/threading/thread_task_runner_handle.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,
++ ConnectCallback callback)
++ : device_info(std::move(device_info)),
++ callback(std::move(callback)),
++ task_runner(base::ThreadTaskRunnerHandle::Get()),
++ blocking_task_runner(
++ base::CreateSequencedTaskRunner(kBlockingTaskTraits)) {}
++ ~ConnectParams() {}
++
++ scoped_refptr<HidDeviceInfo> device_info;
++ ConnectCallback callback;
++ scoped_refptr<base::SequencedTaskRunner> task_runner;
++ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner;
++ base::ScopedFD fd;
++};
++
++class HidServiceFreeBSD::BlockingTaskHelper {
++ public:
++ BlockingTaskHelper(base::WeakPtr<HidServiceFreeBSD> service)
++ : service_(std::move(service)),
++ task_runner_(base::ThreadTaskRunnerHandle::Get()) {
++ DETACH_FROM_SEQUENCE(sequence_checker_);
++
++ timer_.reset(new base::RepeatingTimer());
++ devd_buffer_ = new net::IOBufferWithSize(1024);
++ }
++
++ ~BlockingTaskHelper() {
++ }
++
++ 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::Bind(&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::Bind(&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::Bind(&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::Bind(&BlockingTaskHelper::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::TimeDelta::FromSeconds(1),
++ this, &BlockingTaskHelper::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_;
++
++ DISALLOW_COPY_AND_ASSIGN(BlockingTaskHelper);
++};
++
++HidServiceFreeBSD::HidServiceFreeBSD()
++ : task_runner_(base::ThreadTaskRunnerHandle::Get()),
++ blocking_task_runner_(
++ base::CreateSequencedTaskRunner(kBlockingTaskTraits)),
++ weak_factory_(this) {
++ helper_ = std::make_unique<BlockingTaskHelper>(weak_factory_.GetWeakPtr());
++ blocking_task_runner_->PostTask(
++ FROM_HERE,
++ base::Bind(&BlockingTaskHelper::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,
++ ConnectCallback callback) {
++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++
++ const auto& map_entry = devices().find(device_guid);
++ if (map_entry == devices().end()) {
++ base::ThreadTaskRunnerHandle::Get()->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, 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)
++ ));
++}
++
++} // namespace device
diff --git a/www/iridium/files/patch-services_device_hid_hid__service__freebsd.h b/www/iridium/files/patch-services_device_hid_hid__service__freebsd.h
new file mode 100644
index 000000000000..593c762ba5a1
--- /dev/null
+++ b/www/iridium/files/patch-services_device_hid_hid__service__freebsd.h
@@ -0,0 +1,50 @@
+--- services/device/hid/hid_service_freebsd.h.orig 2020-03-17 15:11:01 UTC
++++ services/device/hid/hid_service_freebsd.h
+@@ -0,0 +1,47 @@
++// 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/macros.h"
++#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() override;
++
++ void Connect(const std::string& device_guid,
++ ConnectCallback connect) override;
++ base::WeakPtr<HidService> GetWeakPtr() override;
++
++ private:
++ struct ConnectParams;
++ class BlockingTaskHelper;
++
++ static void OpenOnBlockingThread(std::unique_ptr<ConnectParams> params);
++ static void FinishOpen(std::unique_ptr<ConnectParams> params);
++
++ const scoped_refptr<base::SequencedTaskRunner> task_runner_;
++ 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<BlockingTaskHelper> helper_;
++ base::WeakPtrFactory<HidServiceFreeBSD> weak_factory_;
++
++ DISALLOW_COPY_AND_ASSIGN(HidServiceFreeBSD);
++};
++
++} // namespace device
++
++#endif // DEVICE_HID_HID_SERVICE_FREEBSD_H_
diff --git a/www/iridium/files/patch-services_device_serial_BUILD.gn b/www/iridium/files/patch-services_device_serial_BUILD.gn
new file mode 100644
index 000000000000..81589aec985e
--- /dev/null
+++ b/www/iridium/files/patch-services_device_serial_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/device/serial/BUILD.gn.orig 2019-03-11 22:01:01 UTC
++++ services/device/serial/BUILD.gn
+@@ -4,7 +4,7 @@
+
+ import("//build/config/features.gni")
+
+-if (is_win || (is_linux && use_udev) || is_mac) {
++if (is_win || (is_linux && use_udev) || is_mac || is_bsd) {
+ config("platform_support") {
+ visibility = [ ":serial" ]
+ if (is_win) {
diff --git a/www/iridium/files/patch-services_device_serial_serial__io__handler__posix.cc b/www/iridium/files/patch-services_device_serial_serial__io__handler__posix.cc
new file mode 100644
index 000000000000..e05dd930bc94
--- /dev/null
+++ b/www/iridium/files/patch-services_device_serial_serial__io__handler__posix.cc
@@ -0,0 +1,11 @@
+--- services/device/serial/serial_io_handler_posix.cc.orig 2019-04-30 22:22:56 UTC
++++ services/device/serial/serial_io_handler_posix.cc
+@@ -66,7 +66,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* spee
+ BITRATE_TO_SPEED_CASE(9600)
+ BITRATE_TO_SPEED_CASE(19200)
+ BITRATE_TO_SPEED_CASE(38400)
+-#if !defined(OS_MACOSX)
++#if !defined(OS_MACOSX) && !defined(OS_BSD)
+ BITRATE_TO_SPEED_CASE(57600)
+ BITRATE_TO_SPEED_CASE(115200)
+ BITRATE_TO_SPEED_CASE(230400)
diff --git a/www/iridium/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc b/www/iridium/files/patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc
new file mode 100644
index 000000000000..cff5f136f844
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:39:54 UTC
++++ services/device/time_zone_monitor/time_zone_monitor_linux.cc
+@@ -127,7 +127,11 @@ class TimeZoneMonitorLinuxImpl
+ // false positives are harmless, assuming the false positive rate is
+ // reasonable.
+ const char* const kFilesToWatch[] = {
++#if defined(OS_BSD)
++ "/etc/localtime",
++#else
+ "/etc/localtime", "/etc/timezone", "/etc/TZ",
++#endif
+ };
+ for (size_t index = 0; index < base::size(kFilesToWatch); ++index) {
+ file_path_watchers_.push_back(std::make_unique<base::FilePathWatcher>());
diff --git a/www/iridium/files/patch-services_device_usb_BUILD.gn b/www/iridium/files/patch-services_device_usb_BUILD.gn
new file mode 100644
index 000000000000..7c3ad6a76957
--- /dev/null
+++ b/www/iridium/files/patch-services_device_usb_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/device/usb/BUILD.gn.orig 2019-09-09 21:55:22 UTC
++++ services/device/usb/BUILD.gn
+@@ -110,7 +110,7 @@ static_library("usb") {
+ ]
+ }
+
+- 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/www/iridium/files/patch-services_network_BUILD.gn b/www/iridium/files/patch-services_network_BUILD.gn
new file mode 100644
index 000000000000..be4d33bb2644
--- /dev/null
+++ b/www/iridium/files/patch-services_network_BUILD.gn
@@ -0,0 +1,10 @@
+--- services/network/BUILD.gn.orig 2020-03-16 18:40:34 UTC
++++ services/network/BUILD.gn
+@@ -260,7 +260,6 @@ jumbo_component("network_service") {
+
+ if (is_linux) {
+ deps += [
+- "//sandbox/linux:sandbox_services",
+ "//services/service_manager/sandbox:sandbox",
+ ]
+ }
diff --git a/www/iridium/files/patch-services_network_network__context.cc b/www/iridium/files/patch-services_network_network__context.cc
new file mode 100644
index 000000000000..888674c04595
--- /dev/null
+++ b/www/iridium/files/patch-services_network_network__context.cc
@@ -0,0 +1,11 @@
+--- services/network/network_context.cc.orig 2020-03-16 18:40:34 UTC
++++ services/network/network_context.cc
+@@ -1758,7 +1758,7 @@ URLRequestContextOwner NetworkContext::MakeURLRequestC
+
+ net::CookieCryptoDelegate* crypto_delegate = nullptr;
+ if (params_->enable_encrypted_cookies) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)
+ DCHECK(network_service_->os_crypt_config_set())
+ << "NetworkService::SetCryptConfig must be called before creating a "
+ "NetworkContext with encrypted cookies.";
diff --git a/www/iridium/files/patch-services_network_network__sandbox__hook__linux.cc b/www/iridium/files/patch-services_network_network__sandbox__hook__linux.cc
new file mode 100644
index 000000000000..b7b7be5079f4
--- /dev/null
+++ b/www/iridium/files/patch-services_network_network__sandbox__hook__linux.cc
@@ -0,0 +1,18 @@
+--- services/network/network_sandbox_hook_linux.cc.orig 2019-03-11 22:01:01 UTC
++++ services/network/network_sandbox_hook_linux.cc
+@@ -14,6 +14,7 @@ using sandbox::syscall_broker::MakeBrokerCommandSet;
+ namespace network {
+
+ bool NetworkPreSandboxHook(service_manager::SandboxLinux::Options options) {
++#if !defined(OS_BSD)
+ auto* instance = service_manager::SandboxLinux::GetInstance();
+
+ // TODO(tsepez): remove universal permission under filesytem root.
+@@ -32,6 +33,7 @@ bool NetworkPreSandboxHook(service_manager::SandboxLin
+ service_manager::SandboxLinux::PreSandboxHook(), options);
+
+ instance->EngageNamespaceSandboxIfPossible();
++#endif // defined(OS_BSD)
+ return true;
+ }
+
diff --git a/www/iridium/files/patch-services_network_network__service.cc b/www/iridium/files/patch-services_network_network__service.cc
new file mode 100644
index 000000000000..1e69f01166a8
--- /dev/null
+++ b/www/iridium/files/patch-services_network_network__service.cc
@@ -0,0 +1,20 @@
+--- services/network/network_service.cc.orig 2020-03-16 18:40:34 UTC
++++ services/network/network_service.cc
+@@ -63,7 +63,7 @@
+ #include "third_party/boringssl/src/include/openssl/cpu.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)
+ #include "components/os_crypt/key_storage_config_linux.h"
+ #endif
+
+@@ -627,7 +627,7 @@ void NetworkService::OnCertDBChanged() {
+ net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void NetworkService::SetCryptConfig(mojom::CryptConfigPtr crypt_config) {
+ #if !BUILDFLAG(IS_CHROMECAST)
+ DCHECK(!os_crypt_config_set_);
diff --git a/www/iridium/files/patch-services_network_network__service.h b/www/iridium/files/patch-services_network_network__service.h
new file mode 100644
index 000000000000..5f21c0217c3a
--- /dev/null
+++ b/www/iridium/files/patch-services_network_network__service.h
@@ -0,0 +1,11 @@
+--- services/network/network_service.h.orig 2020-03-16 18:40:34 UTC
++++ services/network/network_service.h
+@@ -150,7 +150,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService
+ base::span<const uint8_t> config,
+ mojom::NetworkService::UpdateLegacyTLSConfigCallback callback) override;
+ void OnCertDBChanged() override;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void SetCryptConfig(mojom::CryptConfigPtr crypt_config) override;
+ #endif
+ #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
diff --git a/www/iridium/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc b/www/iridium/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc
new file mode 100644
index 000000000000..4c391c6c24c4
--- /dev/null
+++ b/www/iridium/files/patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc
@@ -0,0 +1,20 @@
+--- services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc.orig 2019-09-09 21:55:22 UTC
++++ services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
+@@ -43,7 +43,7 @@ namespace {
+ uint32_t CalculatePrivateFootprintKb(const mojom::RawOSMemDump& os_dump,
+ uint32_t shared_resident_kb) {
+ DCHECK(os_dump.platform_private_footprint);
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_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;
+@@ -82,7 +82,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 defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ os_dump->private_footprint_swap_kb =
+ internal_os_dump.platform_private_footprint->vm_swap_bytes / 1024;
+ #endif
diff --git a/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h b/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
new file mode 100644
index 000000000000..f8b2542dae6e
--- /dev/null
+++ b/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h
@@ -0,0 +1,32 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h.orig 2019-07-24 18:58:35 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
+@@ -28,9 +28,9 @@ class COMPONENT_EXPORT(
+ mojom::RawOSMemDump*);
+ static std::vector<mojom::VmRegionPtr> GetProcessMemoryMaps(base::ProcessId);
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ static void SetProcSmapsForTesting(FILE*);
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, ParseProcSmaps);
+@@ -44,7 +44,7 @@ class COMPONENT_EXPORT(
+ static std::vector<mojom::VmRegionPtr> GetProcessModules(base::ProcessId);
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // Provides information on the dump state of resident pages.
+ enum class MappedAndResidentPagesDumpState {
+ // Access to /proc/<pid>/pagemap can be denied for android devices running
+@@ -68,7 +68,7 @@ class COMPONENT_EXPORT(
+ // TODO(chiniforooshan): move to /base/process/process_metrics_linux.cc after
+ // making sure that peak RSS is useful.
+ static size_t GetPeakResidentSetSize(base::ProcessId pid);
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ };
+
+ } // namespace memory_instrumentation
diff --git a/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc b/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc
new file mode 100644
index 000000000000..b38e937afd6f
--- /dev/null
+++ b/www/iridium/files/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__linux.cc
@@ -0,0 +1,103 @@
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_linux.cc.orig 2019-07-24 18:58:35 UTC
++++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_linux.cc
+@@ -22,8 +22,10 @@
+ #include "build/build_config.h"
+ #include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h"
+
++#if !defined(OS_BSD)
+ // Symbol with virtual address of the start of ELF header of the current binary.
+ extern char __ehdr_start;
++#endif
+
+ namespace memory_instrumentation {
+
+@@ -86,6 +88,7 @@ struct ModuleData {
+
+ ModuleData GetMainModuleData() {
+ ModuleData module_data;
++#if !defined(OS_BSD)
+ Dl_info dl_info;
+ if (dladdr(&__ehdr_start, &dl_info)) {
+ base::debug::ElfBuildIdBuffer build_id;
+@@ -96,6 +99,7 @@ ModuleData GetMainModuleData() {
+ module_data.build_id = std::string(build_id, build_id_length);
+ }
+ }
++#endif
+ return module_data;
+ }
+
+@@ -143,14 +147,14 @@ bool ParseSmapsHeader(const char* header_line,
+ // Build ID is needed to symbolize heap profiles, and is generated only on
+ // official builds. Build ID is only added for the current library (chrome)
+ // since it is racy to read other libraries which can be unmapped any time.
+-#if defined(OFFICIAL_BUILD)
++#if defined(OFFICIAL_BUILD) && !defined(OS_BSD)
+ if (!region->mapped_file.empty() &&
+ base::StartsWith(main_module_data.path, region->mapped_file,
+ base::CompareCase::SENSITIVE) &&
+ !main_module_data.build_id.empty()) {
+ region->module_debugid = main_module_data.build_id;
+ }
+-#endif // defined(OFFICIAL_BUILD)
++#endif // defined(OFFICIAL_BUILD) && !defined(OS_BSD)
+
+ return res;
+ }
+@@ -239,6 +243,7 @@ bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
+ mojom::RawOSMemDump* dump) {
+ // TODO(chiniforooshan): There is no need to read both /statm and /status
+ // files. Refactor to get everything from /status using ProcessMetric.
++#if !defined(OS_BSD)
+ auto statm_file = GetProcPidDir(pid).Append("statm");
+ auto autoclose = base::ScopedFD(open(statm_file.value().c_str(), O_RDONLY));
+ int statm_fd = autoclose.get();
+@@ -253,6 +258,10 @@ bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
+
+ if (!success)
+ return false;
++#else
++ uint64_t resident_pages = 0;
++ uint64_t shared_pages = 0;
++#endif
+
+ auto process_metrics = CreateProcessMetrics(pid);
+
+@@ -293,6 +302,10 @@ bool OSMetrics::FillOSMemoryDump(base::ProcessId pid,
+
+ // static
+ std::vector<VmRegionPtr> OSMetrics::GetProcessMemoryMaps(base::ProcessId pid) {
++#if defined(OS_BSD)
++ NOTIMPLEMENTED();
++ return std::vector<VmRegionPtr>();
++#else
+ std::vector<VmRegionPtr> maps;
+ uint32_t res = 0;
+ if (g_proc_smaps_for_testing) {
+@@ -310,6 +323,7 @@ std::vector<VmRegionPtr> OSMetrics::GetProcessMemoryMa
+ return std::vector<VmRegionPtr>();
+
+ return maps;
++#endif
+ }
+
+ // static
+@@ -317,6 +331,10 @@ OSMetrics::MappedAndResidentPagesDumpState OSMetrics::
+ const size_t start_address,
+ const size_t end_address,
+ std::vector<uint8_t>* accessed_pages_bitmap) {
++#if defined(OS_BSD)
++ NOTIMPLEMENTED();
++ return OSMetrics::MappedAndResidentPagesDumpState::kFailure;
++#else
+ const char* kPagemap = "/proc/self/pagemap";
+
+ base::ScopedFILE pagemap_file(fopen(kPagemap, "r"));
+@@ -358,6 +376,7 @@ OSMetrics::MappedAndResidentPagesDumpState OSMetrics::
+ }
+ }
+ return OSMetrics::MappedAndResidentPagesDumpState::kSuccess;
++#endif
+ }
+
+ // static
diff --git a/www/iridium/files/patch-services_service__manager_embedder_main.cc b/www/iridium/files/patch-services_service__manager_embedder_main.cc
new file mode 100644
index 000000000000..9c935b9f16e1
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_embedder_main.cc
@@ -0,0 +1,11 @@
+--- services/service_manager/embedder/main.cc.orig 2019-10-21 19:06:40 UTC
++++ services/service_manager/embedder/main.cc
+@@ -272,7 +272,7 @@ int Main(const MainParams& params) {
+ #endif
+ base::EnableTerminationOnOutOfMemory();
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.cc b/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.cc
new file mode 100644
index 000000000000..56f27b3a6704
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.cc
@@ -0,0 +1,19 @@
+--- services/service_manager/embedder/set_process_title_linux.cc.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/embedder/set_process_title_linux.cc
+@@ -49,6 +49,8 @@
+ extern char** environ;
+
+ static char** g_main_argv = NULL;
++
++#if !defined(OS_FREEBSD)
+ static char* g_orig_argv0 = NULL;
+
+ void setproctitle(const char* fmt, ...) {
+@@ -101,6 +103,7 @@ void setproctitle(const char* fmt, ...) {
+ va_end(ap);
+ g_main_argv[1] = NULL;
+ }
++#endif
+
+ // A version of this built into glibc would not need this function, since
+ // it could stash the argv pointer in __libc_start_main(). But we need it.
diff --git a/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.h b/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.h
new file mode 100644
index 000000000000..0e1eb1ce1d32
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_embedder_set__process__title__linux.h
@@ -0,0 +1,20 @@
+--- services/service_manager/embedder/set_process_title_linux.h.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/embedder/set_process_title_linux.h
+@@ -5,6 +5,9 @@
+ #ifndef SERVICES_SERVICE_MANAGER_EMBEDDER_SET_PROCESS_TITLE_LINUX_H_
+ #define SERVICES_SERVICE_MANAGER_EMBEDDER_SET_PROCESS_TITLE_LINUX_H_
+
++#include "build/build_config.h"
++
++#if !defined(OS_FREEBSD)
+ // Set the process title that will show in "ps" and similar tools. Takes
+ // printf-style format string and arguments. After calling setproctitle()
+ // the original main() argv[] array should not be used. By default, the
+@@ -14,6 +17,7 @@
+ // This signature and naming is to be compatible with most other Unix
+ // implementations of setproctitle().
+ void setproctitle(const char* fmt, ...);
++#endif
+
+ // Initialize state needed for setproctitle() on Linux. Pass the argv pointer
+ // from main() to setproctitle_init() before calling setproctitle().
diff --git a/www/iridium/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn b/www/iridium/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn
new file mode 100644
index 000000000000..4e2b8913bd0b
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_public_cpp_service__executable_BUILD.gn
@@ -0,0 +1,14 @@
+--- services/service_manager/public/cpp/service_executable/BUILD.gn.orig 2019-04-30 22:22:56 UTC
++++ services/service_manager/public/cpp/service_executable/BUILD.gn
+@@ -29,6 +29,11 @@ source_set("support") {
+ "//sandbox/linux:seccomp_bpf",
+ ]
+ }
++ if (is_bsd) {
++ deps -= [
++ "//sandbox/linux:seccomp_bpf"
++ ]
++ }
+ }
+
+ source_set("switches") {
diff --git a/www/iridium/files/patch-services_service__manager_sandbox_BUILD.gn b/www/iridium/files/patch-services_service__manager_sandbox_BUILD.gn
new file mode 100644
index 000000000000..79967079b24d
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_sandbox_BUILD.gn
@@ -0,0 +1,11 @@
+--- services/service_manager/sandbox/BUILD.gn.orig 2020-03-16 18:40:34 UTC
++++ services/service_manager/sandbox/BUILD.gn
+@@ -26,7 +26,7 @@ component("sandbox") {
+ "//base",
+ "//sandbox:common",
+ ]
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "linux/bpf_audio_policy_linux.cc",
+ "linux/bpf_audio_policy_linux.h",
diff --git a/www/iridium/files/patch-services_service__manager_zygote_common_zygote__features.gni b/www/iridium/files/patch-services_service__manager_zygote_common_zygote__features.gni
new file mode 100644
index 000000000000..d6dc2aed4fb6
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_common_zygote__features.gni
@@ -0,0 +1,8 @@
+--- services/service_manager/zygote/common/zygote_features.gni.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/zygote/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_handle = is_posix && !is_android && !is_mac
++use_zygote_handle = is_posix && !is_android && !is_mac && !is_bsd
diff --git a/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc b/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc
new file mode 100644
index 000000000000..95e322cffb48
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.cc
@@ -0,0 +1,40 @@
+--- services/service_manager/zygote/host/zygote_host_impl_linux.cc.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/zygote/host/zygote_host_impl_linux.cc
+@@ -72,6 +72,7 @@ ZygoteHostImpl* ZygoteHostImpl::GetInstance() {
+ }
+
+ void ZygoteHostImpl::Init(const base::CommandLine& command_line) {
++#if !defined(OS_BSD)
+ if (command_line.HasSwitch(service_manager::switches::kNoSandbox)) {
+ return;
+ }
+@@ -122,6 +123,7 @@ void ZygoteHostImpl::Init(const base::CommandLine& com
+ "you can try using --"
+ << service_manager::switches::kNoSandbox << ".";
+ }
++#endif
+ }
+
+ void ZygoteHostImpl::AddZygotePid(pid_t pid) {
+@@ -146,6 +148,7 @@ pid_t ZygoteHostImpl::LaunchZygote(
+ base::CommandLine* cmd_line,
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds) {
++#if !defined(OS_BSD)
+ int fds[2];
+ CHECK_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds));
+ CHECK(base::UnixDomainSocket::EnableReceiveProcessId(fds[0]));
+@@ -210,9 +213,12 @@ pid_t ZygoteHostImpl::LaunchZygote(
+
+ AddZygotePid(pid);
+ return pid;
++#else
++ return 0;
++#endif
+ }
+
+-#if !defined(OS_OPENBSD)
++#if !defined(OS_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/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h b/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h
new file mode 100644
index 000000000000..2d846ba1732e
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_host_zygote__host__impl__linux.h
@@ -0,0 +1,13 @@
+--- services/service_manager/zygote/host/zygote_host_impl_linux.h.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/zygote/host/zygote_host_impl_linux.h
+@@ -44,8 +44,10 @@ class COMPONENT_EXPORT(SERVICE_MANAGER_ZYGOTE) ZygoteH
+ base::ScopedFD* control_fd,
+ base::FileHandleMappingVector additional_remapped_fds);
+
++#if !defined(OS_BSD)
+ void AdjustRendererOOMScore(base::ProcessHandle process_handle,
+ int score) override;
++#endif
+ bool HasZygote() { return !zygote_pids_.empty(); }
+
+ private:
diff --git a/www/iridium/files/patch-services_service__manager_zygote_zygote__host__linux.h b/www/iridium/files/patch-services_service__manager_zygote_zygote__host__linux.h
new file mode 100644
index 000000000000..bdf4e5ff2926
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_zygote__host__linux.h
@@ -0,0 +1,16 @@
+--- services/service_manager/zygote/zygote_host_linux.h.orig 2019-03-11 22:01:02 UTC
++++ services/service_manager/zygote/zygote_host_linux.h
+@@ -30,11 +30,13 @@ class ZygoteHost {
+ // after the first render has been forked.
+ virtual int GetRendererSandboxStatus() const = 0;
+
++#if !defined(OS_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
+ };
+
+ } // namespace service_manager
diff --git a/www/iridium/files/patch-services_service__manager_zygote_zygote__linux.cc b/www/iridium/files/patch-services_service__manager_zygote_zygote__linux.cc
new file mode 100644
index 000000000000..3a2ff8db55e7
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_zygote__linux.cc
@@ -0,0 +1,15 @@
+--- services/service_manager/zygote/zygote_linux.cc.orig 2019-06-04 18:55:28 UTC
++++ services/service_manager/zygote/zygote_linux.cc
+@@ -1,6 +1,7 @@
+ // 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.
++#if 0
+
+ #include "services/service_manager/zygote/zygote_linux.h"
+
+@@ -657,3 +658,4 @@ bool Zygote::HandleGetSandboxStatus(int fd, base::Pick
+ }
+
+ } // namespace service_manager
++#endif
diff --git a/www/iridium/files/patch-services_service__manager_zygote_zygote__main__linux.cc b/www/iridium/files/patch-services_service__manager_zygote_zygote__main__linux.cc
new file mode 100644
index 000000000000..c1871f137977
--- /dev/null
+++ b/www/iridium/files/patch-services_service__manager_zygote_zygote__main__linux.cc
@@ -0,0 +1,48 @@
+--- services/service_manager/zygote/zygote_main_linux.cc.orig 2020-02-03 21:53:32 UTC
++++ services/service_manager/zygote/zygote_main_linux.cc
+@@ -11,7 +11,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
++#if !defined(OS_BSD)
+ #include <sys/prctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -99,6 +101,7 @@ static bool CreateInitProcessReaper(
+ // created through the setuid sandbox.
+ static bool EnterSuidSandbox(sandbox::SetuidSandboxClient* setuid_sandbox,
+ base::OnceClosure post_fork_parent_callback) {
++#if !defined(OS_BSD)
+ DCHECK(setuid_sandbox);
+ DCHECK(setuid_sandbox->IsSuidSandboxChild());
+
+@@ -131,6 +134,9 @@ static bool EnterSuidSandbox(sandbox::SetuidSandboxCli
+
+ CHECK(service_manager::SandboxDebugHandling::SetDumpableStatusAndHandlers());
+ return true;
++#else
++ return false;
++#endif
+ }
+
+ static void DropAllCapabilities(int proc_fd) {
+@@ -176,6 +182,7 @@ static void EnterLayerOneSandbox(service_manager::Sand
+
+ bool ZygoteMain(
+ std::vector<std::unique_ptr<ZygoteForkDelegate>> fork_delegates) {
++#if !defined(OS_BSD)
+ sandbox::SetAmZygoteOrRenderer(true, GetSandboxFD());
+
+ auto* linux_sandbox = service_manager::SandboxLinux::GetInstance();
+@@ -238,6 +245,9 @@ bool ZygoteMain(
+
+ // This function call can return multiple times, once per fork().
+ return zygote.ProcessRequests();
++#else
++ return false;
++#endif
+ }
+
+ } // namespace service_manager
diff --git a/www/iridium/files/patch-services_tracing_public_cpp_perfetto_trace__time.cc b/www/iridium/files/patch-services_tracing_public_cpp_perfetto_trace__time.cc
new file mode 100644
index 000000000000..61e7cb3830ad
--- /dev/null
+++ b/www/iridium/files/patch-services_tracing_public_cpp_perfetto_trace__time.cc
@@ -0,0 +1,23 @@
+--- services/tracing/public/cpp/perfetto/trace_time.cc.orig 2020-03-17 10:13:47 UTC
++++ services/tracing/public/cpp/perfetto/trace_time.cc
+@@ -13,13 +13,17 @@ namespace tracing {
+
+ int64_t TraceBootTicksNow() {
+ // On Windows and Mac, TRACE_TIME_TICKS_NOW() behaves like boottime already.
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ struct timespec ts;
++#if defined(OS_BSD)
++ int res = clock_gettime(CLOCK_UPTIME, &ts);
++#else
+ int res = clock_gettime(CLOCK_BOOTTIME, &ts);
++#endif
+ if (res != -1)
+ return static_cast<int64_t>(perfetto::base::FromPosixTimespec(ts).count());
+ #endif
+ return TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds();
+ }
+
+-} // namespace tracing
+\ No newline at end of file
++} // namespace tracing
diff --git a/www/iridium/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc b/www/iridium/files/patch-services_tracing_public_cpp_stack__sampling_tracing__sampler__profiler.cc
new file mode 100644
index 000000000000..06d34c96b6cd
--- /dev/null
+++ b/www/iridium/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 2020-03-17 10:16:22 UTC
++++ services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
+@@ -362,7 +362,7 @@ TracingSamplerProfiler::TracingProfileBuilder::GetCall
+ }
+ #endif
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-services_video__capture_broadcasting__receiver.cc b/www/iridium/files/patch-services_video__capture_broadcasting__receiver.cc
new file mode 100644
index 000000000000..31c7ab5e263a
--- /dev/null
+++ b/www/iridium/files/patch-services_video__capture_broadcasting__receiver.cc
@@ -0,0 +1,20 @@
+--- services/video_capture/broadcasting_receiver.cc.orig 2019-12-16 21:51:28 UTC
++++ services/video_capture/broadcasting_receiver.cc
+@@ -40,7 +40,7 @@ void CloneSharedBufferHandle(const mojo::ScopedSharedB
+ void CloneSharedBufferToRawFileDescriptorHandle(
+ const mojo::ScopedSharedBufferHandle& source,
+ media::mojom::VideoBufferHandlePtr* target) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // |source| is unwrapped to a |PlatformSharedMemoryRegion|, from whence a file
+ // descriptor can be extracted which is then mojo-wrapped.
+ base::subtle::PlatformSharedMemoryRegion platform_region =
+@@ -183,7 +183,7 @@ void BroadcastingReceiver::BufferContext::
+ ConvertRawFileDescriptorToSharedBuffer() {
+ DCHECK(buffer_handle_->is_shared_memory_via_raw_file_descriptor());
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // The conversion unwraps the descriptor from its mojo handle to the raw file
+ // descriptor (ie, an int). This is used to create a
+ // PlatformSharedMemoryRegion which is then wrapped as a
diff --git a/www/iridium/files/patch-skia_ext_SkMemory__new__handler.cpp b/www/iridium/files/patch-skia_ext_SkMemory__new__handler.cpp
new file mode 100644
index 000000000000..e41e957b73ea
--- /dev/null
+++ b/www/iridium/files/patch-skia_ext_SkMemory__new__handler.cpp
@@ -0,0 +1,20 @@
+--- skia/ext/SkMemory_new_handler.cpp.orig 2019-03-11 22:01:02 UTC
++++ skia/ext/SkMemory_new_handler.cpp
+@@ -77,7 +77,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 defined(OS_IOS)
++#if defined(OS_IOS) || defined(OS_BSD)
+ result = malloc(size);
+ #else
+ // It's the responsibility of the caller to check the return value.
+@@ -97,7 +97,7 @@ static void* calloc_nothrow(size_t size) {
+ // TODO(b.kelemen): we should always use UncheckedCalloc but currently it
+ // doesn't work as intended everywhere.
+ void* result;
+-#if defined(OS_IOS)
++#if defined(OS_IOS) || defined(OS_BSD)
+ result = calloc(1, size);
+ #else
+ // It's the responsibility of the caller to check the return value.
diff --git a/www/iridium/files/patch-third__party_angle_BUILD.gn b/www/iridium/files/patch-third__party_angle_BUILD.gn
new file mode 100644
index 000000000000..330949cb3773
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_BUILD.gn
@@ -0,0 +1,10 @@
+--- third_party/angle/BUILD.gn.orig 2020-03-16 18:42:05 UTC
++++ third_party/angle/BUILD.gn
+@@ -384,6 +384,7 @@ angle_static_library("angle_gpu_info_util") {
+ "X11",
+ "Xi",
+ "Xext",
++ "GL",
+ ]
+ }
+ }
diff --git a/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__internal.h
new file mode 100644
index 000000000000..3d393c5b6483
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:07:59 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_internal.h
+@@ -14,8 +14,13 @@
+ namespace angle
+ {
+
++bool CollectMesaCardInfo(std::vector<GPUDeviceInfo> *devices);
++
+ // Defined in SystemInfo_libpci when GPU_INFO_USE_LIBPCI is defined.
+ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo> *devices);
++#if defined(__FreeBSD__)
++bool GetPCIDevicesFreeBSD(std::vector<GPUDeviceInfo> *devices);
++#endif
+ // Defined in SystemInfo_x11 when GPU_INFO_USE_X11 is defined.
+ bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version);
+
diff --git a/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__libpci.cpp
new file mode 100644
index 000000000000..8c7b858de64b
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:07: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"
+
+@@ -82,6 +87,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/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
new file mode 100644
index 000000000000..d69b549c46b1
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__linux.cpp
@@ -0,0 +1,21 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp.orig 2019-03-11 22:07:59 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
+@@ -71,10 +71,18 @@ bool GetPCIDevicesWithLibPCI(std::vector<GPUDeviceInfo
+
+ bool GetSystemInfo(SystemInfo *info)
+ {
++#if defined(__FreeBSD__)
++ if (!CollectMesaCardInfo(&(info->gpus)))
++ {
++ if (!GetPCIDevicesFreeBSD(&(info->gpus)))
++ return false;
++ }
++#else
+ if (!GetPCIDevicesWithLibPCI(&(info->gpus)))
+ {
+ return false;
+ }
++#endif
+
+ if (info->gpus.size() == 0)
+ {
diff --git a/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
new file mode 100644
index 000000000000..6b9bc94938ad
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_src_gpu__info__util_SystemInfo__x11.cpp
@@ -0,0 +1,55 @@
+--- third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp.orig 2019-03-11 22:07:59 UTC
++++ third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp
+@@ -8,6 +8,8 @@
+
+ #include "gpu_info_util/SystemInfo_internal.h"
+
++#include <GL/glx.h>
++#include <GL/glxext.h>
+ #include <X11/Xlib.h>
+
+ #include "common/debug.h"
+@@ -18,8 +20,43 @@
+ # error SystemInfo_x11.cpp compiled without GPU_INFO_USE_X11
+ #endif
+
++#define GLX_RENDERER_VENDOR_ID_MESA 0x8183
++#define GLX_RENDERER_DEVICE_ID_MESA 0x8184
++
+ namespace angle
+ {
++
++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;
++}
+
+ bool GetNvidiaDriverVersionWithXNVCtrl(std::string *version)
+ {
diff --git a/www/iridium/files/patch-third__party_angle_src_libANGLE_Display.cpp b/www/iridium/files/patch-third__party_angle_src_libANGLE_Display.cpp
new file mode 100644
index 000000000000..48998ce95915
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_src_libANGLE_Display.cpp
@@ -0,0 +1,11 @@
+--- third_party/angle/src/libANGLE/Display.cpp.orig 2020-03-16 18:42:05 UTC
++++ third_party/angle/src/libANGLE/Display.cpp
+@@ -286,7 +286,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(EGLAttrib di
+ {
+ impl = rx::CreateVulkanWin32Display(state);
+ }
+-# elif defined(ANGLE_PLATFORM_LINUX)
++# elif defined(ANGLE_PLATFORM_POSIX)
+ if (rx::IsVulkanXcbDisplayAvailable())
+ {
+ impl = rx::CreateVulkanXcbDisplay(state);
diff --git a/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_driver__utils.h b/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_driver__utils.h
new file mode 100644
index 000000000000..380c2f0a1a4f
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_driver__utils.h
@@ -0,0 +1,11 @@
+--- third_party/angle/src/libANGLE/renderer/driver_utils.h.orig 2020-03-16 18:42:06 UTC
++++ third_party/angle/src/libANGLE/renderer/driver_utils.h
+@@ -122,7 +122,7 @@ inline bool IsWindows()
+
+ inline bool IsLinux()
+ {
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_POSIX)
+ return true;
+ #else
+ return false;
diff --git a/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h b/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h
new file mode 100644
index 000000000000..aa021274cc80
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_src_libANGLE_renderer_vulkan_DisplayVk__api.h
@@ -0,0 +1,15 @@
+--- third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk_api.h.orig 2020-02-03 21:54:48 UTC
++++ third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk_api.h
+@@ -19,10 +19,10 @@ bool IsVulkanWin32DisplayAvailable();
+ DisplayImpl *CreateVulkanWin32Display(const egl::DisplayState &state);
+ #endif // defined(ANGLE_PLATFORM_WINDOWS)
+
+-#if defined(ANGLE_PLATFORM_LINUX)
++#if defined(ANGLE_PLATFORM_POSIX)
+ bool IsVulkanXcbDisplayAvailable();
+ DisplayImpl *CreateVulkanXcbDisplay(const egl::DisplayState &state);
+-#endif // defined(ANGLE_PLATFORM_LINUX)
++#endif // defined(ANGLE_PLATFORM_POSIX)
+
+ #if defined(ANGLE_PLATFORM_ANDROID)
+ bool IsVulkanAndroidDisplayAvailable();
diff --git a/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c b/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c
new file mode 100644
index 000000000000..c03540dc02ea
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_loader.c
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-loader/src/loader/loader.c.orig 2020-02-03 21:54:58 UTC
++++ third_party/angle/third_party/vulkan-loader/src/loader/loader.c
+@@ -238,7 +238,7 @@ void *loader_device_heap_realloc(const struct loader_d
+ }
+
+ // Environment variables
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+
+ static inline bool IsHighIntegrity() {
+ return geteuid() != getuid() || getegid() != getgid();
diff --git a/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h b/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h
new file mode 100644
index 000000000000..674705f68fd5
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_third__party_vulkan-loader_src_loader_vk__loader__platform.h
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-loader/src/loader/vk_loader_platform.h.orig 2019-03-11 22:08:05 UTC
++++ third_party/angle/third_party/vulkan-loader/src/loader/vk_loader_platform.h
+@@ -31,7 +31,7 @@
+ #include "vulkan/vk_platform.h"
+ #include "vulkan/vk_sdk_platform.h"
+
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+ /* Linux-specific common code: */
+
+ // Headers:
diff --git a/www/iridium/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h b/www/iridium/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h
new file mode 100644
index 000000000000..824788f6aa33
--- /dev/null
+++ b/www/iridium/files/patch-third__party_angle_third__party_vulkan-validation-layers_src_layers_vk__loader__platform.h
@@ -0,0 +1,11 @@
+--- third_party/angle/third_party/vulkan-validation-layers/src/layers/vk_loader_platform.h.orig 2019-03-11 22:08:06 UTC
++++ third_party/angle/third_party/vulkan-validation-layers/src/layers/vk_loader_platform.h
+@@ -31,7 +31,7 @@
+ #include "vulkan/vk_platform.h"
+ #include "vulkan/vk_sdk_platform.h"
+
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+ /* Linux-specific common code: */
+
+ // Headers:
diff --git a/www/iridium/files/patch-third__party_blink_renderer_BUILD.gn b/www/iridium/files/patch-third__party_blink_renderer_BUILD.gn
new file mode 100644
index 000000000000..3ee19aa5429f
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_BUILD.gn
@@ -0,0 +1,13 @@
+--- third_party/blink/renderer/BUILD.gn.orig 2020-03-16 18:40:34 UTC
++++ third_party/blink/renderer/BUILD.gn
+@@ -45,8 +45,8 @@ config("inside_blink") {
+ "-Wconversion",
+ "-Wno-float-conversion",
+ "-Wno-sign-conversion",
+- "-Wno-implicit-float-conversion",
+- "-Wno-implicit-int-conversion",
++# "-Wno-implicit-float-conversion",
++# "-Wno-implicit-int-conversion",
+ ]
+
+ if (!is_chromeos || default_toolchain != "//build/toolchain/cros:target") {
diff --git a/www/iridium/files/patch-third__party_blink_renderer_controller_blink__initializer.cc b/www/iridium/files/patch-third__party_blink_renderer_controller_blink__initializer.cc
new file mode 100644
index 000000000000..f2b1624738c8
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_controller_blink__initializer.cc
@@ -0,0 +1,20 @@
+--- third_party/blink/renderer/controller/blink_initializer.cc.orig 2020-03-17 10:17:22 UTC
++++ third_party/blink/renderer/controller/blink_initializer.cc
+@@ -69,7 +69,7 @@
+ #include "third_party/blink/renderer/controller/memory_usage_monitor_posix.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX) || \
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ defined(OS_WIN)
+ #include "third_party/blink/renderer/controller/highest_pmf_reporter.h"
+ #include "third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h"
+@@ -146,7 +146,7 @@ void InitializeCommon(Platform* platform, mojo::Binder
+ CrashMemoryMetricsReporterImpl::Instance();
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX) || \
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ defined(OS_WIN)
+ // Initialize UserLevelMemoryPressureSignalGenerator so it starts monitoring.
+ if (UserLevelMemoryPressureSignalGenerator::Enabled())
diff --git a/www/iridium/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h b/www/iridium/files/patch-third__party_blink_renderer_controller_memory__usage__monitor__posix.h
new file mode 100644
index 000000000000..0c30711ac49d
--- /dev/null
+++ b/www/iridium/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 2020-03-17 10:18:29 UTC
++++ third_party/blink/renderer/controller/memory_usage_monitor_posix.h
+@@ -12,7 +12,7 @@
+ #include "third_party/blink/renderer/controller/controller_export.h"
+ #include "third_party/blink/renderer/controller/memory_usage_monitor.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "third_party/blink/public/mojom/memory_usage_monitor_linux.mojom-blink.h"
+ #endif
+
+@@ -21,7 +21,7 @@ namespace blink {
+ // MemoryUsageMonitor implementation for Android and Linux.
+ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ : public MemoryUsageMonitor
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ public mojom::blink::MemoryUsageMonitorLinux
+ #endif
+@@ -29,7 +29,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ public:
+ MemoryUsageMonitorPosix() = default;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ static void Bind(
+ mojo::PendingReceiver<mojom::blink::MemoryUsageMonitorLinux> receiver);
+ #endif
+@@ -47,7 +47,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ uint64_t* vm_size,
+ uint64_t* vm_hwm_size);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // mojom::MemoryUsageMonitorLinux implementations:
+ void SetProcFiles(base::File statm_file, base::File status_file) override;
+ #endif
+@@ -65,7 +65,7 @@ class CONTROLLER_EXPORT MemoryUsageMonitorPosix
+ base::ScopedFD statm_fd_;
+ base::ScopedFD status_fd_;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ mojo::Receiver<mojom::blink::MemoryUsageMonitorLinux> receiver_{this};
+ #endif
+ };
diff --git a/www/iridium/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc b/www/iridium/files/patch-third__party_blink_renderer_core_editing_editing__behavior.cc
new file mode 100644
index 000000000000..1ba55b799c74
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:39:56 UTC
++++ third_party/blink/renderer/core/editing/editing_behavior.cc
+@@ -274,7 +274,7 @@ bool EditingBehavior::ShouldInsertCharacter(const Keyb
+ // unexpected behaviour
+ if (ch < ' ')
+ return false;
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc b/www/iridium/files/patch-third__party_blink_renderer_core_html_canvas_canvas__async__blob__creator.cc
new file mode 100644
index 000000000000..af22ef50a74c
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:52:51 UTC
++++ third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+@@ -41,7 +41,7 @@ constexpr base::TimeDelta kEncodeRowSlackBeforeDeadlin
+ base::TimeDelta::FromMicroseconds(100);
+
+ /* The value is based on user statistics on Nov 2017. */
+-#if (defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN))
++#if (defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)) || defined(OS_BSD)
+ const double kIdleTaskStartTimeoutDelayMs = 1000.0;
+ #else
+ const double kIdleTaskStartTimeoutDelayMs = 4000.0; // For ChromeOS, Mobile
diff --git a/www/iridium/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc b/www/iridium/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc
new file mode 100644
index 000000000000..d05dcc105788
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_core_html_forms_internal__popup__menu.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/core/html/forms/internal_popup_menu.cc.orig 2020-03-16 18:40:35 UTC
++++ third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
+@@ -122,7 +122,7 @@ class InternalPopupMenu::ItemIterationContext {
+ is_in_group_(false),
+ buffer_(buffer) {
+ DCHECK(buffer_);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // On other platforms, the <option> background color is the same as the
+ // <select> background color. On Linux, that makes the <option>
+ // background color very dark, so by default, try to use a lighter
diff --git a/www/iridium/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc b/www/iridium/files/patch-third__party_blink_renderer_core_inspector_inspector__memory__agent.cc
new file mode 100644
index 000000000000..5f3d6ec67939
--- /dev/null
+++ b/www/iridium/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 2019-09-09 21:55:24 UTC
++++ third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
+@@ -184,7 +184,7 @@ InspectorMemoryAgent::GetSamplingProfileById(uint32_t
+
+ Vector<String> InspectorMemoryAgent::Symbolize(
+ const WebVector<void*>& addresses) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // TODO(alph): Move symbolization to the client.
+ Vector<void*> addresses_to_symbolize;
+ for (size_t i = 0; i < addresses.size(); i++) {
diff --git a/www/iridium/files/patch-third__party_blink_renderer_core_layout_layout__view.cc b/www/iridium/files/patch-third__party_blink_renderer_core_layout_layout__view.cc
new file mode 100644
index 000000000000..eb2c92cf0610
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:35 UTC
++++ third_party/blink/renderer/core/layout/layout_view.cc
+@@ -59,7 +59,7 @@
+ #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
+ #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/font_cache.h"
+ #endif
+
+@@ -326,7 +326,7 @@ void LayoutView::UpdateLayout() {
+ DCHECK(!layout_state_);
+ LayoutState root_layout_state(*this);
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_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/www/iridium/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc b/www/iridium/files/patch-third__party_blink_renderer_core_paint_paint__layer.cc
new file mode 100644
index 000000000000..8414327a53f4
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:40:35 UTC
++++ third_party/blink/renderer/core/paint/paint_layer.cc
+@@ -106,7 +106,7 @@ namespace {
+ static CompositingQueryMode g_compositing_query_mode =
+ kCompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases;
+
+-#ifdef OS_LINUX
++#if defined(OS_LINUX) || defined(OS_BSD)
+ struct SameSizeAsPaintLayer : DisplayItemClient {
+ // The bit fields may fit into the machine word of DisplayItemClient which
+ // has only 8-bit data.
diff --git a/www/iridium/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc b/www/iridium/files/patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc
new file mode 100644
index 000000000000..2d02c5dfa4c2
--- /dev/null
+++ b/www/iridium/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 2020-03-16 18:39:56 UTC
++++ third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
+@@ -137,7 +137,7 @@ bool ScrollbarThemeAura::SupportsDragSnapBack() const
+ // Disable snapback on desktop Linux to better integrate with the desktop
+ // behavior. Typically, Linux apps do not implement scrollbar snapback (this
+ // is true for at least GTK and QT apps).
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ return false;
+ #endif
+
+@@ -301,7 +301,7 @@ ScrollbarPart ScrollbarThemeAura::PartsToInvalidateOnT
+
+ bool ScrollbarThemeAura::ShouldCenterOnThumb(const Scrollbar& scrollbar,
+ const WebMouseEvent& event) {
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
++#if ((defined(OS_BSD) || defined(OS_LINUX)) && !defined(OS_CHROMEOS))
+ if (event.button == WebPointerProperties::Button::kMiddle)
+ return true;
+ #endif
diff --git a/www/iridium/files/patch-third__party_blink_renderer_modules_mediastream_processed__local__audio__source.cc b/www/iridium/files/patch-third__party_blink_renderer_modules_mediastream_processed__local__audio__source.cc
new file mode 100644
index 000000000000..14dc2ef5bb1a
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_modules_mediastream_processed__local__audio__source.cc
@@ -0,0 +1,11 @@
+--- third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc.orig 2020-03-16 18:39:56 UTC
++++ third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
+@@ -444,7 +444,7 @@ void ProcessedLocalAudioSource::CaptureUsingProcessor(
+ bool key_pressed) {
+ #if defined(OS_WIN) || defined(OS_MACOSX)
+ DCHECK_LE(volume, 1.0);
+-#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_OPENBSD)
++#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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/www/iridium/files/patch-third__party_blink_renderer_platform_BUILD.gn b/www/iridium/files/patch-third__party_blink_renderer_platform_BUILD.gn
new file mode 100644
index 000000000000..6c239154d0c0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_BUILD.gn
@@ -0,0 +1,10 @@
+--- third_party/blink/renderer/platform/BUILD.gn.orig 2020-03-16 18:40:35 UTC
++++ third_party/blink/renderer/platform/BUILD.gn
+@@ -100,6 +100,7 @@ executable("character_data_generator") {
+ "//build/win:default_exe_manifest",
+ "//third_party/icu",
+ ]
++ libs = [ "cxxrt" ]
+ }
+
+ # This isn't strictly necessary since we can just add the deps to "platform",
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.cc
new file mode 100644
index 000000000000..086b16ed616f
--- /dev/null
+++ b/www/iridium/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 2020-02-03 21:52:52 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.cc
+@@ -76,7 +76,7 @@ static const char kColorEmojiLocale[] = "und-Zsye";
+
+ SkFontMgr* FontCache::static_font_manager_ = nullptr;
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ float FontCache::device_scale_factor_ = 1.0;
+ #endif
+
+@@ -115,7 +115,7 @@ FontCache::FontCache()
+ FontPlatformData* FontCache::SystemFontPlatformData(
+ const FontDescription& font_description) {
+ const AtomicString& family = FontCache::SystemFontFamily();
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ if (family.IsEmpty() || family == font_family_names::kSystemUi)
+ return nullptr;
+ #else
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
new file mode 100644
index 000000000000..ea74c8b323ef
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__cache.h
@@ -0,0 +1,58 @@
+--- third_party/blink/renderer/platform/fonts/font_cache.h.orig 2020-02-03 21:52:52 UTC
++++ third_party/blink/renderer/platform/fonts/font_cache.h
+@@ -58,7 +58,7 @@
+ #include "third_party/skia/include/core/SkFontMgr.h"
+ #include "third_party/skia/include/core/SkRefCnt.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/font_fallback_linux.h"
+ #endif
+
+@@ -166,7 +166,7 @@ class PLATFORM_EXPORT FontCache {
+ sk_sp<SkFontMgr> FontManager() { return font_manager_; }
+ static void SetFontManager(sk_sp<SkFontMgr>);
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ // These are needed for calling QueryRenderStyleForStrike, since
+ // gfx::GetFontRenderParams makes distinctions based on DSF.
+ static float DeviceScaleFactor() { return device_scale_factor_; }
+@@ -241,11 +241,11 @@ class PLATFORM_EXPORT FontCache {
+ const FontDescription&);
+ #endif // defined(OS_ANDROID)
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ static bool GetFontForCharacter(UChar32,
+ const char* preferred_locale,
+ gfx::FallbackFontData*);
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ scoped_refptr<SimpleFontData> FontDataFromFontPlatformData(
+ const FontPlatformData*,
+@@ -317,12 +317,12 @@ class PLATFORM_EXPORT FontCache {
+ const FontFaceCreationParams&,
+ std::string& name);
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ static AtomicString GetFamilyNameForCharacter(SkFontMgr*,
+ UChar32,
+ const FontDescription&,
+ FontFallbackPriority);
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ scoped_refptr<SimpleFontData> FallbackOnStandardFontStyle(
+ const FontDescription&,
+@@ -356,7 +356,7 @@ class PLATFORM_EXPORT FontCache {
+ std::unique_ptr<FallbackFamilyStyleCache> fallback_params_cache_;
+ #endif // defined(OS_WIN)
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ static float device_scale_factor_;
+ #endif
+
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__description.cc
new file mode 100644
index 000000000000..3c38c7f4dc44
--- /dev/null
+++ b/www/iridium/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 2019-12-16 21:50:53 UTC
++++ third_party/blink/renderer/platform/fonts/font_description.cc
+@@ -38,7 +38,7 @@
+ #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+ #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h"
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/font_cache.h"
+ #endif
+
+@@ -225,7 +225,7 @@ FontCacheKey FontDescription::CacheKey(
+ static_cast<unsigned>(fields_.orientation_) << 1 | // bit 2-3
+ static_cast<unsigned>(fields_.subpixel_text_position_); // bit 1
+
+-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
++#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_BSD)
+ float device_scale_factor_for_key = FontCache::DeviceScaleFactor();
+ #else
+ float device_scale_factor_for_key = 1.0f;
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__metrics.cc
new file mode 100644
index 000000000000..4445ec96128b
--- /dev/null
+++ b/www/iridium/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 2019-07-24 18:58:42 UTC
++++ third_party/blink/renderer/platform/fonts/font_metrics.cc
+@@ -38,7 +38,7 @@
+
+ namespace blink {
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_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
+@@ -60,7 +60,7 @@ void FontMetrics::AscentDescentWithHacks(
+ int vdmx_ascent = 0, vdmx_descent = 0;
+ bool is_vdmx_valid = false;
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_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).
+@@ -106,7 +106,7 @@ void FontMetrics::AscentDescentWithHacks(
+ visual_overflow_inflation_for_ascent = 1;
+ if (descent < metrics.fDescent) {
+ visual_overflow_inflation_for_descent = 1;
+-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_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/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_font__unique__name__lookup.cc
new file mode 100644
index 000000000000..4766c40ab521
--- /dev/null
+++ b/www/iridium/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 2019-06-04 18:55:30 UTC
++++ third_party/blink/renderer/platform/fonts/font_unique_name_lookup.cc
+@@ -8,7 +8,7 @@
+ #if defined(OS_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 defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "third_party/blink/renderer/platform/fonts/linux/font_unique_name_lookup_linux.h"
+ #elif defined(OS_WIN)
+ #include "third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.h"
+@@ -23,7 +23,7 @@ std::unique_ptr<FontUniqueNameLookup>
+ FontUniqueNameLookup::GetPlatformUniqueNameLookup() {
+ #if defined(OS_ANDROID)
+ return std::make_unique<FontUniqueNameLookupAndroid>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return std::make_unique<FontUniqueNameLookupLinux>();
+ #elif defined(OS_WIN)
+ return std::make_unique<FontUniqueNameLookupWin>();
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
new file mode 100644
index 000000000000..01d7699e4ddb
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_fonts_skia_font__cache__skia.cc
@@ -0,0 +1,38 @@
+--- third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc.orig 2019-09-09 21:55:26 UTC
++++ third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+@@ -59,7 +59,7 @@ AtomicString ToAtomicString(const SkString& str) {
+ return AtomicString::FromUTF8(str.c_str(), str.size());
+ }
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_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.
+@@ -82,7 +82,7 @@ AtomicString FontCache::GetFamilyNameForCharacter(
+ typeface->getFamilyName(&skia_family_name);
+ return ToAtomicString(skia_family_name);
+ }
+-#endif // defined(OS_ANDROID) || defined(OS_LINUX)
++#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+
+ void FontCache::PlatformInit() {}
+
+@@ -227,7 +227,7 @@ sk_sp<SkTypeface> FontCache::CreateTypeface(
+ }
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // On linux if the fontManager has been overridden then we should be calling
+ // the embedder provided font Manager rather than calling
+ // SkTypeface::CreateFromName which may redirect the call to the default font
+@@ -254,7 +254,7 @@ std::unique_ptr<FontPlatformData> FontCache::CreateFon
+ std::string name;
+
+ sk_sp<SkTypeface> typeface;
+-#if defined(OS_ANDROID) || defined(OS_LINUX)
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD)
+ if (alternate_name == AlternateFontName::kLocalUniqueFace &&
+ RuntimeEnabledFeatures::FontSrcLocalMatchingEnabled()) {
+ typeface = CreateTypefaceFromUniqueName(creation_params);
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
new file mode 100644
index 000000000000..27b83fe51ce9
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_container__annotations.h
@@ -0,0 +1,27 @@
+--- third_party/blink/renderer/platform/wtf/container_annotations.h.orig 2019-06-04 18:55:30 UTC
++++ third_party/blink/renderer/platform/wtf/container_annotations.h
+@@ -10,7 +10,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) && defined(OS_LINUX) && defined(ARCH_CPU_X86_64)
++#if defined(ADDRESS_SANITIZER) && (defined(OS_LINUX) || defined(OS_BSD)) && defined(ARCH_CPU_X86_64)
+ #define ANNOTATE_CONTIGUOUS_CONTAINER
+ #define ANNOTATE_NEW_BUFFER(buffer, capacity, newSize) \
+ if (buffer) { \
+@@ -35,13 +35,13 @@
+ ANNOTATE_NEW_BUFFER(buffer, newCapacity, bufferSize);
+ // Annotations require buffers to begin on an 8-byte boundary.
+
+-#else // ADDRESS_SANITIZER && OS_LINUX && ARCH_CPU_X86_64
++#else // ADDRESS_SANITIZER && (OS_LINUX || OS_BSD) && ARCH_CPU_X86_64
+
+ #define ANNOTATE_NEW_BUFFER(buffer, capacity, newSize)
+ #define ANNOTATE_DELETE_BUFFER(buffer, capacity, oldSize)
+ #define ANNOTATE_CHANGE_SIZE(buffer, capacity, oldSize, newSize)
+ #define ANNOTATE_CHANGE_CAPACITY(buffer, oldCapacity, bufferSize, newCapacity)
+
+-#endif // ADDRESS_SANITIZER && OS_LINUX && ARCH_CPU_X86_64
++#endif // ADDRESS_SANITIZER && (OS_LINUX || OS_BSD) && ARCH_CPU_X86_64
+
+ #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CONTAINER_ANNOTATIONS_H_
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
new file mode 100644
index 000000000000..24a812ce5223
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_stack__util.cc
@@ -0,0 +1,14 @@
+--- third_party/blink/renderer/platform/wtf/stack_util.cc.orig 2019-06-04 18:55:30 UTC
++++ third_party/blink/renderer/platform/wtf/stack_util.cc
+@@ -17,6 +17,11 @@
+ extern "C" void* __libc_stack_end; // NOLINT
+ #endif
+
++#if defined(OS_FREEBSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
++#endif
++
+ namespace WTF {
+
+ size_t GetUnderestimatedStackSize() {
diff --git a/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc
new file mode 100644
index 000000000000..1ab0c14a5a4e
--- /dev/null
+++ b/www/iridium/files/patch-third__party_blink_renderer_platform_wtf_threading__pthreads.cc
@@ -0,0 +1,22 @@
+--- third_party/blink/renderer/platform/wtf/threading_pthreads.cc.orig 2019-12-16 21:50:53 UTC
++++ third_party/blink/renderer/platform/wtf/threading_pthreads.cc
+@@ -50,12 +50,17 @@
+ #include <objc/objc-auto.h>
+ #endif
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <sys/syscall.h>
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include <unistd.h>
++#endif
++
++#if defined(OS_BSD)
++#include <sys/signal.h>
++#include <pthread_np.h>
+ #endif
+
+ namespace WTF {
diff --git a/www/iridium/files/patch-third__party_boringssl_BUILD.gn b/www/iridium/files/patch-third__party_boringssl_BUILD.gn
new file mode 100644
index 000000000000..8a3c15eac37d
--- /dev/null
+++ b/www/iridium/files/patch-third__party_boringssl_BUILD.gn
@@ -0,0 +1,36 @@
+--- third_party/boringssl/BUILD.gn.orig 2019-12-16 21:51:04 UTC
++++ third_party/boringssl/BUILD.gn
+@@ -71,7 +71,7 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+ } else if (current_cpu == "x64") {
+ if (is_mac) {
+ sources += crypto_sources_mac_x86_64
+- } else if (is_linux || is_android) {
++ } else if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_x86_64
+ } else {
+ public_configs = [ ":no_asm_config" ]
+@@ -79,13 +79,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+ } else if (current_cpu == "x86") {
+ if (is_mac) {
+ sources += crypto_sources_mac_x86
+- } else if (is_linux || is_android) {
++ } else if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_x86
+ } else {
+ public_configs = [ ":no_asm_config" ]
+ }
+ } else if (current_cpu == "arm") {
+- if (is_linux || is_android) {
++ if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_arm
+ } else if (is_ios) {
+ sources += crypto_sources_ios_arm
+@@ -93,7 +93,7 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+ public_configs = [ ":no_asm_config" ]
+ }
+ } else if (current_cpu == "arm64") {
+- if (is_linux || is_android) {
++ if (is_linux || is_bsd || is_android) {
+ sources += crypto_sources_linux_aarch64
+ } else if (is_ios) {
+ sources += crypto_sources_ios_aarch64
diff --git a/www/iridium/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c b/www/iridium/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c
new file mode 100644
index 000000000000..5856c89852d1
--- /dev/null
+++ b/www/iridium/files/patch-third__party_boringssl_src_crypto_cpu-aarch64-linux.c
@@ -0,0 +1,73 @@
+--- third_party/boringssl/src/crypto/cpu-aarch64-linux.c.orig 2020-03-03 18:55:22 UTC
++++ third_party/boringssl/src/crypto/cpu-aarch64-linux.c
+@@ -14,49 +14,45 @@
+
+ #include <openssl/cpu.h>
+
+-#if defined(OPENSSL_AARCH64) && defined(OPENSSL_LINUX) && \
+- !defined(OPENSSL_STATIC_ARMCAP)
++#if defined(OPENSSL_AARCH64)
+
+-#include <sys/auxv.h>
+-
+ #include <openssl/arm_arch.h>
+
+ #include "internal.h"
+
+-
+ extern uint32_t OPENSSL_armcap_P;
+
+-void OPENSSL_cpuid_setup(void) {
+- unsigned long hwcap = getauxval(AT_HWCAP);
++#include <sys/types.h>
++#include <machine/armreg.h>
+
+- // See /usr/include/asm/hwcap.h on an aarch64 installation for the source of
+- // these values.
+- static const unsigned long kNEON = 1 << 1;
+- static const unsigned long kAES = 1 << 3;
+- static const unsigned long kPMULL = 1 << 4;
+- static const unsigned long kSHA1 = 1 << 5;
+- static const unsigned long kSHA256 = 1 << 6;
++#ifndef ID_AA64ISAR0_AES_VAL
++#define ID_AA64ISAR0_AES_VAL ID_AA64ISAR0_AES
++#endif
++#ifndef ID_AA64ISAR0_SHA1_VAL
++#define ID_AA64ISAR0_SHA1_VAL ID_AA64ISAR0_SHA1
++#endif
++#ifndef ID_AA64ISAR0_SHA2_VAL
++#define ID_AA64ISAR0_SHA2_VAL ID_AA64ISAR0_SHA2
++#endif
+
+- if ((hwcap & kNEON) == 0) {
+- // Matching OpenSSL, if NEON is missing, don't report other features
+- // either.
+- return;
+- }
++void OPENSSL_cpuid_setup(void) {
++ uint64_t id_aa64isar0;
+
++ id_aa64isar0 = READ_SPECIALREG(id_aa64isar0_el1);
++
+ OPENSSL_armcap_P |= ARMV7_NEON;
+
+- if (hwcap & kAES) {
++ if (ID_AA64ISAR0_AES_VAL(id_aa64isar0) >= ID_AA64ISAR0_AES_BASE) {
+ OPENSSL_armcap_P |= ARMV8_AES;
+ }
+- if (hwcap & kPMULL) {
++ if (ID_AA64ISAR0_AES_VAL(id_aa64isar0) == ID_AA64ISAR0_AES_PMULL) {
+ OPENSSL_armcap_P |= ARMV8_PMULL;
+ }
+- if (hwcap & kSHA1) {
++ if (ID_AA64ISAR0_SHA1_VAL(id_aa64isar0) == ID_AA64ISAR0_SHA1_BASE) {
+ OPENSSL_armcap_P |= ARMV8_SHA1;
+ }
+- if (hwcap & kSHA256) {
++ if(ID_AA64ISAR0_SHA2_VAL(id_aa64isar0) >= ID_AA64ISAR0_SHA2_BASE) {
+ OPENSSL_armcap_P |= ARMV8_SHA256;
+ }
+ }
+-
+-#endif // OPENSSL_AARCH64 && !OPENSSL_STATIC_ARMCAP
++#endif // OPENSSL_AARCH64
diff --git a/www/iridium/files/patch-third__party_boringssl_src_crypto_ex__data.c b/www/iridium/files/patch-third__party_boringssl_src_crypto_ex__data.c
new file mode 100644
index 000000000000..6f2127918315
--- /dev/null
+++ b/www/iridium/files/patch-third__party_boringssl_src_crypto_ex__data.c
@@ -0,0 +1,13 @@
+--- third_party/boringssl/src/crypto/ex_data.c.orig 2019-03-11 22:07:58 UTC
++++ third_party/boringssl/src/crypto/ex_data.c
+@@ -186,7 +186,9 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index,
+ }
+ }
+
+- sk_void_set(ad->sk, index, val);
++ // expression result unused; should this cast be to 'void'?
++ // seems it should, feel free to investigate those #def
++ (void) sk_void_set(ad->sk, index, val);
+ return 1;
+ }
+
diff --git a/www/iridium/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h b/www/iridium/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h
new file mode 100644
index 000000000000..b0aaa7abccb6
--- /dev/null
+++ b/www/iridium/files/patch-third__party_breakpad_breakpad_src_common_simple__string__dictionary.h
@@ -0,0 +1,11 @@
+--- third_party/breakpad/breakpad/src/common/simple_string_dictionary.h.orig 2019-03-11 22:07:58 UTC
++++ third_party/breakpad/breakpad/src/common/simple_string_dictionary.h
+@@ -33,7 +33,7 @@
+ #include <assert.h>
+ #include <string.h>
+
+-#include "common/basictypes.h"
++#include "third_party/breakpad/breakpad/src/common/basictypes.h"
+
+ namespace google_breakpad {
+
diff --git a/www/iridium/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h b/www/iridium/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h
new file mode 100644
index 000000000000..0a76ed7ccadc
--- /dev/null
+++ b/www/iridium/files/patch-third__party_cacheinvalidation_src_google_cacheinvalidation_include_types.h
@@ -0,0 +1,11 @@
+--- third_party/cacheinvalidation/src/google/cacheinvalidation/include/types.h.orig 2019-03-11 22:01:15 UTC
++++ third_party/cacheinvalidation/src/google/cacheinvalidation/include/types.h
+@@ -334,6 +334,8 @@ class Status {
+ */
+ PERMANENT_FAILURE
+ };
++
++ Status() : code_(SUCCESS), message_() {}
+
+ /* Creates a new Status object given the code and message. */
+ Status(Code code, const string& message) : code_(code), message_(message) {}
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni b/www/iridium/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
new file mode 100644
index 000000000000..97991dfed588
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/build/crashpad_buildconfig.gni.orig 2020-02-03 21:53:08 UTC
++++ third_party/crashpad/crashpad/build/crashpad_buildconfig.gni
+@@ -38,7 +38,7 @@ if (crashpad_is_in_chromium) {
+ crashpad_is_mac = is_mac
+ crashpad_is_ios = is_ios
+ crashpad_is_win = is_win
+- crashpad_is_linux = is_linux
++ crashpad_is_linux = is_linux && !is_bsd
+ crashpad_is_android = is_android
+ crashpad_is_fuchsia = is_fuchsia
+
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_client_BUILD.gn b/www/iridium/files/patch-third__party_crashpad_crashpad_client_BUILD.gn
new file mode 100644
index 000000000000..acb48dc27344
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_client_BUILD.gn
@@ -0,0 +1,15 @@
+--- third_party/crashpad/crashpad/client/BUILD.gn.orig 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/client/BUILD.gn
+@@ -71,6 +71,12 @@ static_library("client") {
+ sources += [ "crashpad_client_fuchsia.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/www/iridium/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
new file mode 100644
index 000000000000..9cafc79f1aff
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
@@ -0,0 +1,41 @@
+--- third_party/crashpad/crashpad/client/crashpad_client_posix.cc.orig 2019-03-17 01:47:14 UTC
++++ third_party/crashpad/crashpad/client/crashpad_client_posix.cc
+@@ -0,0 +1,38 @@
++// 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"
++
++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) {
++ NOTREACHED(); // TODO(scottmg): https://crashpad.chromium.org/bug/196
++ return false;
++}
++
++} // namespace crashpad
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_address__types.h
new file mode 100644
index 000000000000..ead0b25e172c
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/misc/address_types.h
+@@ -25,7 +25,7 @@
+ #include <mach/mach_types.h>
+ #elif defined(OS_WIN)
+ #include "util/win/address_types.h"
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "util/linux/address_types.h"
+ #elif defined(OS_FUCHSIA)
+ #include <zircon/types.h>
+@@ -55,7 +55,7 @@ using VMSize = mach_vm_size_t;
+ using VMAddress = WinVMAddress;
+ using VMSize = WinVMSize;
+
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ using VMAddress = LinuxVMAddress;
+ using VMSize = LinuxVMSize;
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
new file mode 100644
index 000000000000..be1a55b8d574
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_capture__context.h
@@ -0,0 +1,20 @@
+--- third_party/crashpad/crashpad/util/misc/capture_context.h.orig 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/misc/capture_context.h
+@@ -21,7 +21,7 @@
+ #include <mach/mach.h>
+ #elif defined(OS_WIN)
+ #include <windows.h>
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include <ucontext.h>
+ #elif defined(OS_FUCHSIA)
+ #include <signal.h>
+@@ -35,7 +35,7 @@ using NativeCPUContext = x86_thread_state;
+ #endif
+ #elif defined(OS_WIN)
+ using NativeCPUContext = CONTEXT;
+-#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ using NativeCPUContext = ucontext_t;
+ #endif // OS_MACOSX
+
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
new file mode 100644
index 000000000000..f1804888aee1
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_metrics.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/metrics.cc.orig 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/misc/metrics.cc
+@@ -25,7 +25,7 @@
+ #define METRICS_OS_NAME "Win"
+ #elif defined(OS_ANDROID)
+ #define METRICS_OS_NAME "Android"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define METRICS_OS_NAME "Linux"
+ #elif defined(OS_FUCHSIA)
+ #define METRICS_OS_NAME "Fuchsia"
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
new file mode 100644
index 000000000000..d7a1ca9a0fd0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_util_misc_uuid.cc
@@ -0,0 +1,11 @@
+--- third_party/crashpad/crashpad/util/misc/uuid.cc.orig 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/misc/uuid.cc
+@@ -95,7 +95,7 @@ bool UUID::InitializeWithNew() {
+ InitializeFromBytes(uuid);
+ return true;
+ #elif defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || \
+- defined(OS_FUCHSIA)
++ defined(OS_FUCHSIA) || defined(OS_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/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
new file mode 100644
index 000000000000..e7dc2e3561db
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_close__multiple.cc
@@ -0,0 +1,29 @@
+--- third_party/crashpad/crashpad/util/posix/close_multiple.cc.orig 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/posix/close_multiple.cc
+@@ -31,7 +31,7 @@
+ #include "util/file/directory_reader.h"
+ #include "util/misc/implicit_cast.h"
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ #include <sys/sysctl.h>
+ #endif
+
+@@ -72,7 +72,7 @@ void CloseNowOrOnExec(int fd, bool ebadf_ok) {
+ // 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 defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ static constexpr char kFDDir[] = "/dev/fd";
+ #elif defined(OS_LINUX) || defined(OS_ANDROID)
+ static constexpr char kFDDir[] = "/proc/self/fd";
+@@ -146,7 +146,7 @@ void CloseMultipleNowOrOnExec(int fd, int preserve_fd)
+ // while the system is running, but it’s still a better upper bound than the
+ // current RLIMIT_NOFILE value.
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_BSD)
+ // See 10.11.6 xnu-3248.60.10/bsd/kern/kern_resource.c maxfilesperproc,
+ // referenced by dosetrlimit().
+ int oid[] = {CTL_KERN, KERN_MAXFILESPERPROC};
diff --git a/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_drop__privileges.cc
new file mode 100644
index 000000000000..42ba7366e3cb
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/posix/drop_privileges.cc
+@@ -23,7 +23,7 @@ void DropPrivileges() {
+ gid_t gid = getgid();
+ uid_t uid = getuid();
+
+-#if defined(OS_MACOSX)
++#if defined(OS_MACOSX) || defined(OS_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/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
new file mode 100644
index 000000000000..911ec6d61ccd
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_signals.cc
@@ -0,0 +1,40 @@
+--- third_party/crashpad/crashpad/util/posix/signals.cc.orig 2019-12-16 21:51:05 UTC
++++ third_party/crashpad/crashpad/util/posix/signals.cc
+@@ -45,10 +45,10 @@ constexpr int kCrashSignals[] = {
+ #if defined(SIGEMT)
+ SIGEMT,
+ #endif // defined(SIGEMT)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SIGXCPU,
+ SIGXFSZ,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ };
+
+ // These are the non-core-generating but terminating signals.
+@@ -85,9 +85,9 @@ constexpr int kTerminateSignals[] = {
+ SIGXCPU,
+ SIGXFSZ,
+ #endif // defined(OS_MACOSX)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ SIGIO,
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ };
+
+ bool InstallHandlers(const std::vector<int>& signals,
+@@ -224,8 +224,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/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc b/www/iridium/files/patch-third__party_crashpad_crashpad_util_posix_symbolic__constants__posix.cc
new file mode 100644
index 000000000000..63645eb0d883
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:01:15 UTC
++++ third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc
+@@ -64,7 +64,7 @@ constexpr const char* kSignalNames[] = {
+ "INFO",
+ "USR1",
+ "USR2",
+-#elif defined(OS_LINUX) || defined(OS_ANDROID)
++#elif defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #if defined(ARCH_CPU_MIPS_FAMILY)
+ "HUP",
+ "INT",
+@@ -135,7 +135,7 @@ constexpr const char* kSignalNames[] = {
+ #endif // defined(ARCH_CPU_MIPS_FAMILY)
+ #endif
+ };
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ // NSIG is 64 to account for real-time signals.
+ static_assert(base::size(kSignalNames) == 32, "kSignalNames length");
+ #else
diff --git a/www/iridium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h b/www/iridium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
new file mode 100644
index 000000000000..0dd0f21d8d58
--- /dev/null
+++ b/www/iridium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
@@ -0,0 +1,57 @@
+--- third_party/crc32c/src/src/crc32c_arm64_linux_check.h.orig 2020-03-03 18:55:23 UTC
++++ third_party/crc32c/src/src/crc32c_arm64_linux_check.h
+@@ -7,8 +7,6 @@
+ #ifndef CRC32C_CRC32C_ARM_LINUX_CHECK_H_
+ #define CRC32C_CRC32C_ARM_LINUX_CHECK_H_
+
+-// X86-specific code checking for the availability of SSE4.2 instructions.
+-
+ #include <cstddef>
+ #include <cstdint>
+
+@@ -16,30 +14,25 @@
+
+ #if HAVE_ARM64_CRC32C
+
+-#if HAVE_STRONG_GETAUXVAL
+-#include <sys/auxv.h>
+-#elif HAVE_WEAK_GETAUXVAL
+-// getauxval() is not available on Android until API level 20. Link it as a weak
+-// symbol.
+-extern "C" unsigned long getauxval(unsigned long type) __attribute__((weak));
++#include <sys/types.h>
++#include <machine/armreg.h>
+
+-#define AT_HWCAP 16
+-#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
++#ifndef ID_AA64ISAR0_AES_VAL
++#define ID_AA64ISAR0_AES_VAL ID_AA64ISAR0_AES
++#endif
++#ifndef ID_AA64ISAR0_CRC32_VAL
++#define ID_AA64ISAR0_CRC32_VAL ID_AA64ISAR0_CRC32
++#endif
+
+ namespace crc32c {
+
+-inline bool CanUseArm64Linux() {
+-#if HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
+- // From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code.
+- constexpr unsigned long kHWCAP_PMULL = 1 << 4;
+- constexpr unsigned long kHWCAP_CRC32 = 1 << 7;
+- unsigned long hwcap = (&getauxval != nullptr) ? getauxval(AT_HWCAP) : 0;
+- return (hwcap & (kHWCAP_PMULL | kHWCAP_CRC32)) ==
+- (kHWCAP_PMULL | kHWCAP_CRC32);
+-#else
+- return false;
+-#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
+-}
++ inline bool CanUseArm64Linux() {
++ uint64_t id_aa64isar0;
++
++ id_aa64isar0 = READ_SPECIALREG(id_aa64isar0_el1);
++ return ((ID_AA64ISAR0_AES_VAL(id_aa64isar0) == ID_AA64ISAR0_AES_PMULL) &&
++ (ID_AA64ISAR0_CRC32_VAL(id_aa64isar0) == ID_AA64ISAR0_CRC32_BASE));
++ }
+
+ } // namespace crc32c
+
diff --git a/www/iridium/files/patch-third__party_ffmpeg_libavutil_mem.c b/www/iridium/files/patch-third__party_ffmpeg_libavutil_mem.c
new file mode 100644
index 000000000000..23d1e5344a09
--- /dev/null
+++ b/www/iridium/files/patch-third__party_ffmpeg_libavutil_mem.c
@@ -0,0 +1,12 @@
+--- third_party/ffmpeg/libavutil/mem.c.orig 2019-03-11 22:08:00 UTC
++++ third_party/ffmpeg/libavutil/mem.c
+@@ -32,9 +32,6 @@
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#if HAVE_MALLOC_H
+-#include <malloc.h>
+-#endif
+
+ #include "avassert.h"
+ #include "avutil.h"
diff --git a/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc b/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc
new file mode 100644
index 000000000000..ba45bf4dc184
--- /dev/null
+++ b/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest-port.cc
@@ -0,0 +1,43 @@
+--- third_party/googletest/src/googletest/src/gtest-port.cc.orig 2020-03-16 18:42:08 UTC
++++ third_party/googletest/src/googletest/src/gtest-port.cc
+@@ -64,6 +64,11 @@
+ # endif
+ #endif
+
++#if GTEST_OS_FREEBSD
++#include <sys/sysctl.h>
++#include <sys/user.h>
++#endif
++
+ #if GTEST_OS_QNX
+ # include <devctl.h>
+ # include <fcntl.h>
+@@ -138,6 +143,28 @@ size_t GetThreadCount() {
+ } else {
+ return 0;
+ }
++}
++
++#elif GTEST_OS_FREEBSD
++
++#define KP_NLWP(kp) (kp.ki_numthreads)
++
++// Return the number of threads running in the process, or 0 to indicate that
++// we cannot detect it.
++size_t GetThreadCount() {
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PID,
++ getpid(),
++ };
++ u_int miblen = sizeof(mib) / sizeof(mib[0]);
++ struct kinfo_proc(info);
++ size_t size = sizeof(info);
++ if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
++ return 0;
++ }
++ return KP_NLWP(info);
+ }
+
+ #elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
diff --git a/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest.cc b/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest.cc
new file mode 100644
index 000000000000..e56b6079f8f5
--- /dev/null
+++ b/www/iridium/files/patch-third__party_googletest_src_googletest_src_gtest.cc
@@ -0,0 +1,10 @@
+--- third_party/googletest/src/googletest/src/gtest.cc.orig 2020-03-16 18:42:08 UTC
++++ third_party/googletest/src/googletest/src/gtest.cc
+@@ -118,6 +118,7 @@
+
+ #if GTEST_CAN_STREAM_RESULTS_
+ # include <arpa/inet.h> // NOLINT
++# include <sys/socket.h> // NOLINT
+ # include <netdb.h> // NOLINT
+ # include <sys/socket.h> // NOLINT
+ # include <sys/types.h> // NOLINT
diff --git a/www/iridium/files/patch-third__party_harfbuzz-ng_harfbuzz.gni b/www/iridium/files/patch-third__party_harfbuzz-ng_harfbuzz.gni
new file mode 100644
index 000000000000..eb8e42c94bca
--- /dev/null
+++ b/www/iridium/files/patch-third__party_harfbuzz-ng_harfbuzz.gni
@@ -0,0 +1,20 @@
+--- third_party/harfbuzz-ng/harfbuzz.gni.orig 2019-05-04 09:19:19 UTC
++++ third_party/harfbuzz-ng/harfbuzz.gni
+@@ -3,10 +3,11 @@
+ # found in the LICENSE file.
+
+ declare_args() {
+- # Blink uses a cutting-edge version of Harfbuzz; most Linux distros do not
+- # contain a new enough version of the code to work correctly. However,
+- # ChromeOS chroots (i.e, real ChromeOS builds for devices) do contain a
+- # new enough version of the library, and so this variable exists so that
+- # ChromeOS can build against the system lib and keep binary sizes smaller.
+- use_system_harfbuzz = false
++ # Blink uses a cutting-edge version of Harfbuzz (version listed in
++ # third_party/harfbuzz-ng/README.chromium); most Linux distros do not contain
++ # a new enough version of the code to work correctly. However, ChromeOS
++ # chroots (i.e. real ChromeOS builds for devices) do contain a new enough
++ # version of the library, and so this variable exists so that ChromeOS can
++ # build against the system lib and keep binary sizes smaller.
++ use_system_harfbuzz = true
+ }
diff --git a/www/iridium/files/patch-third__party_leveldatabase_env__chromium.cc b/www/iridium/files/patch-third__party_leveldatabase_env__chromium.cc
new file mode 100644
index 000000000000..74a2d6efc9a1
--- /dev/null
+++ b/www/iridium/files/patch-third__party_leveldatabase_env__chromium.cc
@@ -0,0 +1,14 @@
+--- third_party/leveldatabase/env_chromium.cc.orig 2020-03-16 18:40:42 UTC
++++ third_party/leveldatabase/env_chromium.cc
+@@ -40,7 +40,11 @@
+ #include "third_party/leveldatabase/leveldb_chrome.h"
+ #include "third_party/leveldatabase/leveldb_features.h"
+ #include "third_party/leveldatabase/src/include/leveldb/options.h"
++#if defined(OS_BSD)
++#include <re2/re2.h>
++#else
+ #include "third_party/re2/src/re2/re2.h"
++#endif
+
+ using base::FilePath;
+ using base::trace_event::MemoryAllocatorDump;
diff --git a/www/iridium/files/patch-third__party_libXNVCtrl_NVCtrl.c b/www/iridium/files/patch-third__party_libXNVCtrl_NVCtrl.c
new file mode 100644
index 000000000000..3d2353cdedae
--- /dev/null
+++ b/www/iridium/files/patch-third__party_libXNVCtrl_NVCtrl.c
@@ -0,0 +1,25 @@
+--- third_party/libXNVCtrl/NVCtrl.c.orig 2019-03-11 22:01:15 UTC
++++ third_party/libXNVCtrl/NVCtrl.c
+@@ -27,10 +27,6 @@
+ * libXNVCtrl library properly protects the Display connection.
+ */
+
+-#if !defined(XTHREADS)
+-#define XTHREADS
+-#endif /* XTHREADS */
+-
+ #define NEED_EVENTS
+ #define NEED_REPLIES
+ #include <stdint.h>
+@@ -39,6 +35,11 @@
+ #include <X11/Xutil.h>
+ #include <X11/extensions/Xext.h>
+ #include <X11/extensions/extutil.h>
++
++#if !defined(XTHREADS)
++#define XTHREADS
++#endif /* XTHREADS */
++
+ #include "NVCtrlLib.h"
+ #include "nv_control.h"
+
diff --git a/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h b/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_memory_singleton.h
new file mode 100644
index 000000000000..0815f041a8db
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:08:01 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/memory/singleton.h
+@@ -56,7 +56,7 @@ template <class T> boost::once_flag Singleton<T>::flag
+ #include "phonenumbers/base/logging.h"
+ #include "phonenumbers/base/thread_checker.h"
+
+-#if !defined(__linux__) && !defined(__APPLE__)
++#if !defined(__linux__) && !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
+
+ namespace i18n {
+ namespace phonenumbers {
diff --git a/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h b/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_synchronization_lock.h
new file mode 100644
index 000000000000..b09577e3c1d7
--- /dev/null
+++ b/www/iridium/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 2019-10-21 19:09:13 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/synchronization/lock.h
+@@ -63,7 +63,7 @@ class Lock { (private)
+ // Dummy lock implementation on non-POSIX platforms. If you are running on a
+ // different platform and care about thread-safety, please compile with
+ // -DI18N_PHONENUMBERS_USE_BOOST.
+-#elif !defined(__linux__) && !defined(__APPLE__)
++#elif !defined(__linux__) && !defined(__APPLE__) && !defined(__FreeBSD__)
+
+ namespace i18n {
+ namespace phonenumbers {
diff --git a/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h b/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
new file mode 100644
index 000000000000..86849dfe63cd
--- /dev/null
+++ b/www/iridium/files/patch-third__party_libphonenumber_dist_cpp_src_phonenumbers_base_thread__checker.h
@@ -0,0 +1,19 @@
+--- third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h.orig 2019-03-11 22:08:01 UTC
++++ third_party/libphonenumber/dist/cpp/src/phonenumbers/base/thread_checker.h
+@@ -23,6 +23,7 @@
+ // 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(__FreeBSD__) && !defined(__OpenBSD__) && \
+ !defined(I18N_PHONENUMBERS_NO_THREAD_SAFETY)
+ #error Building without Boost, please provide \
+ -DI18N_PHONENUMBERS_NO_THREAD_SAFETY
+@@ -31,7 +32,7 @@
+ #endif
+
+ #if !defined(NDEBUG) && !defined(I18N_PHONENUMBERS_USE_BOOST) && \
+- (defined(__linux__) || defined(__apple__))
++ (defined(__linux__) || defined(__apple__)) || defined(__FreeBSD__) || defined(__OpenBSD__)
+
+ #include <pthread.h>
+
diff --git a/www/iridium/files/patch-third__party_libpng_pnglibconf.h b/www/iridium/files/patch-third__party_libpng_pnglibconf.h
new file mode 100644
index 000000000000..81996a0cfa58
--- /dev/null
+++ b/www/iridium/files/patch-third__party_libpng_pnglibconf.h
@@ -0,0 +1,14 @@
+--- third_party/libpng/pnglibconf.h.orig 2020-03-03 18:53:28 UTC
++++ third_party/libpng/pnglibconf.h
+@@ -230,8 +230,11 @@
+ * This is necessary to build multiple copies of libpng. We need this while pdfium builds
+ * its own copy of libpng.
+ */
++/* Need to disable prefixing to unbundle chromium's libpng. */
++#if 0
+ #define PNG_PREFIX
+ #include "pngprefix.h"
++#endif
+ /* end of chromium prefixing */
+
+ #endif /* PNGLCONF_H */
diff --git a/www/iridium/files/patch-third__party_libyuv_include_libyuv_row.h b/www/iridium/files/patch-third__party_libyuv_include_libyuv_row.h
new file mode 100644
index 000000000000..25761a9d90ec
--- /dev/null
+++ b/www/iridium/files/patch-third__party_libyuv_include_libyuv_row.h
@@ -0,0 +1,37 @@
+--- third_party/libyuv/include/libyuv/row.h.orig 2019-03-11 22:08:01 UTC
++++ third_party/libyuv/include/libyuv/row.h
+@@ -157,10 +157,14 @@ extern "C" {
+ #define HAS_ARGBSHADEROW_SSE2
+ #define HAS_ARGBSUBTRACTROW_SSE2
+ #define HAS_ARGBUNATTENUATEROW_SSE2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_BLENDPLANEROW_SSSE3
++#endif
+ #define HAS_COMPUTECUMULATIVESUMROW_SSE2
+ #define HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_INTERPOLATEROW_SSSE3
++#endif
+ #define HAS_RGBCOLORTABLEROW_X86
+ #define HAS_SOBELROW_SSE2
+ #define HAS_SOBELTOPLANEROW_SSE2
+@@ -206,7 +210,9 @@ extern "C" {
+ #define HAS_I422TORGB565ROW_AVX2
+ #define HAS_I422TORGBAROW_AVX2
+ #define HAS_I444TOARGBROW_AVX2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_INTERPOLATEROW_AVX2
++#endif
+ #define HAS_J422TOARGBROW_AVX2
+ #define HAS_MERGEUVROW_AVX2
+ #define HAS_MIRRORROW_AVX2
+@@ -231,7 +237,9 @@ extern "C" {
+ #define HAS_ARGBMULTIPLYROW_AVX2
+ #define HAS_ARGBSUBTRACTROW_AVX2
+ #define HAS_ARGBUNATTENUATEROW_AVX2
++#if !(defined(__i386__) && defined(__GNUC__))
+ #define HAS_BLENDPLANEROW_AVX2
++#endif
+
+ #if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \
+ defined(_MSC_VER)
diff --git a/www/iridium/files/patch-third__party_nasm_config_config-linux.h b/www/iridium/files/patch-third__party_nasm_config_config-linux.h
new file mode 100644
index 000000000000..6846af2fe7c7
--- /dev/null
+++ b/www/iridium/files/patch-third__party_nasm_config_config-linux.h
@@ -0,0 +1,29 @@
+--- third_party/nasm/config/config-linux.h.orig 2019-04-30 22:25:54 UTC
++++ third_party/nasm/config/config-linux.h
+@@ -117,7 +117,7 @@
+ #define HAVE_ACCESS 1
+
+ /* Define to 1 if you have the `canonicalize_file_name' function. */
+-#define HAVE_CANONICALIZE_FILE_NAME 1
++/* #undef HAVE_CANONICALIZE_FILE_NAME */
+
+ /* Define to 1 if you have the `cpu_to_le16' intrinsic function. */
+ /* #undef HAVE_CPU_TO_LE16 */
+@@ -161,7 +161,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
+@@ -322,7 +322,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
diff --git a/www/iridium/files/patch-third__party_node_node.py b/www/iridium/files/patch-third__party_node_node.py
new file mode 100644
index 000000000000..d31ac51040e3
--- /dev/null
+++ b/www/iridium/files/patch-third__party_node_node.py
@@ -0,0 +1,10 @@
+--- third_party/node/node.py.orig 2019-03-11 22:01:16 UTC
++++ third_party/node/node.py
+@@ -12,6 +12,7 @@ import sys
+ def GetBinaryPath():
+ return os_path.join(os_path.dirname(__file__), *{
+ 'Darwin': ('mac', 'node-darwin-x64', 'bin', 'node'),
++ 'FreeBSD': ('freebsd', 'node-freebsd-x64', 'bin', 'node'),
+ 'Linux': ('linux', 'node-linux-x64', 'bin', 'node'),
+ 'Windows': ('win', 'node.exe'),
+ }[platform.system()])
diff --git a/www/iridium/files/patch-third__party_pdfium_core_fxcrt_cfx__datetime.cpp b/www/iridium/files/patch-third__party_pdfium_core_fxcrt_cfx__datetime.cpp
new file mode 100644
index 000000000000..0e9aa30717ed
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_core_fxcrt_cfx__datetime.cpp
@@ -0,0 +1,11 @@
+--- third_party/pdfium/core/fxcrt/cfx_datetime.cpp.orig 2019-07-29 13:55:20 UTC
++++ third_party/pdfium/core/fxcrt/cfx_datetime.cpp
+@@ -9,7 +9,7 @@
+ #include "build/build_config.h"
+ #include "core/fxcrt/fx_system.h"
+
+-#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || \
++#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_BSD) || \
+ defined(OS_ASMJS) || defined(__wasm__)
+ #include <sys/time.h>
+ #include <time.h>
diff --git a/www/iridium/files/patch-third__party_pdfium_core_fxcrt_fx__system.h b/www/iridium/files/patch-third__party_pdfium_core_fxcrt_fx__system.h
new file mode 100644
index 000000000000..05d6c3e28de0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_core_fxcrt_fx__system.h
@@ -0,0 +1,11 @@
+--- third_party/pdfium/core/fxcrt/fx_system.h.orig 2019-07-24 19:03:29 UTC
++++ third_party/pdfium/core/fxcrt/fx_system.h
+@@ -26,7 +26,7 @@
+ #define _FX_PLATFORM_ _FX_PLATFORM_WINDOWS_
+ #elif defined(_WIN64)
+ #define _FX_PLATFORM_ _FX_PLATFORM_WINDOWS_
+-#elif defined(__linux__)
++#elif defined(__linux__) || defined(__FreeBSD__)
+ #define _FX_PLATFORM_ _FX_PLATFORM_LINUX_
+ #elif defined(__APPLE__)
+ #define _FX_PLATFORM_ _FX_PLATFORM_APPLE_
diff --git a/www/iridium/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp b/www/iridium/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp
new file mode 100644
index 000000000000..272bf7a50bf9
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_core_fxge_fx__ge__linux.cpp
@@ -0,0 +1,14 @@
+--- third_party/pdfium/core/fxge/fx_ge_linux.cpp.orig 2020-03-16 18:42:12 UTC
++++ third_party/pdfium/core/fxge/fx_ge_linux.cpp
+@@ -155,9 +155,8 @@ std::unique_ptr<SystemFontInfoIface> SystemFontInfoIfa
+ const char** pUserPaths) {
+ auto pInfo = pdfium::MakeUnique<CFX_LinuxFontInfo>();
+ if (!pInfo->ParseFontCfg(pUserPaths)) {
+- pInfo->AddPath("/usr/share/fonts");
+- pInfo->AddPath("/usr/share/X11/fonts/Type1");
+- pInfo->AddPath("/usr/share/X11/fonts/TTF");
++ pInfo->AddPath("/usr/local/share/fonts/Type1");
++ pInfo->AddPath("/usr/local/share/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return std::move(pInfo);
diff --git a/www/iridium/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp b/www/iridium/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp
new file mode 100644
index 000000000000..292afa1968d0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_fxjs_cjs__publicmethods.cpp
@@ -0,0 +1,106 @@
+--- third_party/pdfium/fxjs/cjs_publicmethods.cpp.orig 2019-06-04 18:58:01 UTC
++++ third_party/pdfium/fxjs/cjs_publicmethods.cpp
+@@ -86,6 +86,103 @@ constexpr const wchar_t* kDateFormats[] = {L"m/d",
+ constexpr const wchar_t* kTimeFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss",
+ L"h:MM:ss tt"};
+
++#if defined(__FreeBSD__)
++/*
++ * cvt.c - IEEE floating point formatting routines for FreeBSD
++ * from GNU libc-4.6.27
++ */
++
++/*
++ * ap_ecvt converts to decimal
++ * the number of digits is specified by ndigit
++ * decpt is set to the position of the decimal point
++ * sign is set to 0 for positive, 1 for negative
++ */
++
++#define NDIG 80
++
++static char *
++ ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag)
++{
++ register int r2;
++ double fi, fj;
++ register char *p, *p1;
++ static char buf[NDIG];
++
++ if (ndigits >= NDIG - 1)
++ ndigits = NDIG - 2;
++ r2 = 0;
++ *sign = 0;
++ p = &buf[0];
++ if (arg < 0) {
++ *sign = 1;
++ arg = -arg;
++ }
++ arg = modf(arg, &fi);
++ p1 = &buf[NDIG];
++ /*
++ * Do integer part
++ */
++ if (fi != 0) {
++ p1 = &buf[NDIG];
++ while (fi != 0) {
++ fj = modf(fi / 10, &fi);
++ *--p1 = (int) ((fj + .03) * 10) + '0';
++ r2++;
++ }
++ while (p1 < &buf[NDIG])
++ *p++ = *p1++;
++ }
++ else if (arg > 0) {
++ while ((fj = arg * 10) < 1) {
++ arg = fj;
++ r2--;
++ }
++ }
++ p1 = &buf[ndigits];
++ if (eflag == 0)
++ p1 += r2;
++ *decpt = r2;
++ if (p1 < &buf[0]) {
++ buf[0] = '\0';
++ return (buf);
++ }
++ while (p <= p1 && p < &buf[NDIG]) {
++ arg *= 10;
++ arg = modf(arg, &fj);
++ *p++ = (int) fj + '0';
++ }
++ if (p1 >= &buf[NDIG]) {
++ buf[NDIG - 1] = '\0';
++ return (buf);
++ }
++ p = p1;
++ *p1 += 5;
++ while (*p1 > '9') {
++ *p1 = '0';
++ if (p1 > buf)
++ ++ * --p1;
++ else {
++ *p1 = '1';
++ (*decpt)++;
++ if (eflag == 0) {
++ if (p > buf)
++ *p = '0';
++ p++;
++ }
++ }
++ }
++ *p = '\0';
++ return (buf);
++}
++
++static char *
++ fcvt(double arg, int ndigits, int *decpt, int *sign)
++{
++ return (ap_cvt(arg, ndigits, decpt, sign, 0));
++}
++#endif // defined(__FreeBSD__)
++
+ template <typename T>
+ T StrTrim(const T& str) {
+ T result = str;
diff --git a/www/iridium/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp b/www/iridium/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp
new file mode 100644
index 000000000000..425ec0a4bc9a
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_fxjs_fx__date__helpers.cpp
@@ -0,0 +1,22 @@
+--- third_party/pdfium/fxjs/fx_date_helpers.cpp.orig 2019-07-24 19:03:29 UTC
++++ third_party/pdfium/fxjs/fx_date_helpers.cpp
+@@ -35,6 +35,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 defined(OS_WIN)
+ // In gcc 'timezone' is a global variable declared in time.h. In VC++, that
+@@ -43,6 +48,7 @@ double GetLocalTZA() {
+ _get_timezone(&timezone);
+ #endif
+ return (double)(-(timezone * 1000));
++#endif // __FreeBSD__
+ }
+
+ int GetDaylightSavingTA(double d) {
diff --git a/www/iridium/files/patch-third__party_pdfium_xfa_fgas_font_cfx__fontsourceenum__file.cpp b/www/iridium/files/patch-third__party_pdfium_xfa_fgas_font_cfx__fontsourceenum__file.cpp
new file mode 100644
index 000000000000..af4bafcfee40
--- /dev/null
+++ b/www/iridium/files/patch-third__party_pdfium_xfa_fgas_font_cfx__fontsourceenum__file.cpp
@@ -0,0 +1,14 @@
+--- third_party/pdfium/xfa/fgas/font/cfx_fontsourceenum_file.cpp.orig 2019-07-24 19:03:30 UTC
++++ third_party/pdfium/xfa/fgas/font/cfx_fontsourceenum_file.cpp
+@@ -16,9 +16,8 @@ constexpr char kFolderSeparator = '/';
+
+ constexpr const char* kFontFolders[] = {
+ #if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
+- "/usr/share/fonts",
+- "/usr/share/X11/fonts/Type1",
+- "/usr/share/X11/fonts/TTF",
++ "/usr/local/share/fonts/Type1",
++ "/usr/local/share/fonts/TTF",
+ "/usr/local/share/fonts",
+ #elif defined(OS_MACOSX)
+ "~/Library/Fonts",
diff --git a/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_build__config.h b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
new file mode 100644
index 000000000000..02a9c66ed8e5
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_build__config.h
@@ -0,0 +1,70 @@
+--- third_party/perfetto/include/perfetto/base/build_config.h.orig 2020-03-16 18:42:11 UTC
++++ third_party/perfetto/include/perfetto/base/build_config.h
+@@ -28,6 +28,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 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() 0
+@@ -37,6 +38,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 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() 0
+@@ -50,15 +52,27 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 1
++#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() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_NACL() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_IOS() 0
++#elif defined(__FreeBSD__)
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 1
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 1
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FUCHSIA() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_NACL() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_IOS() 0
+ #elif defined(_WIN32)
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FUCHSIA() 0
+@@ -68,6 +82,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 0
++#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FREEBSD() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WIN() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_WASM() 1
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_FUCHSIA() 0
+@@ -77,6 +92,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 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
+@@ -86,6 +102,7 @@
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_ANDROID() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_MACOSX() 0
+ #define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_OS_LINUX() 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() 0
diff --git a/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h
new file mode 100644
index 000000000000..c8947d13ecbf
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_thread__utils.h
@@ -0,0 +1,24 @@
+--- third_party/perfetto/include/perfetto/base/thread_utils.h.orig 2020-03-16 18:42:11 UTC
++++ third_party/perfetto/include/perfetto/base/thread_utils.h
+@@ -33,6 +33,9 @@
+ #include <sys/types.h>
+ #include <unistd.h>
+ #endif
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
++#include <pthread_np.h>
++#endif
+
+ namespace perfetto {
+ namespace base {
+@@ -41,6 +44,11 @@ namespace base {
+ using PlatformThreadId = pid_t;
+ inline PlatformThreadId GetThreadId() {
+ return gettid();
++}
++#elif PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
++using PlatformThreadId = pid_t;
++inline PlatformThreadId GetThreadId() {
++ return pthread_getthreadid_np();
+ }
+ #elif PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX)
+ using PlatformThreadId = pid_t;
diff --git a/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_time.h b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_time.h
new file mode 100644
index 000000000000..7750793e8235
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_include_perfetto_base_time.h
@@ -0,0 +1,20 @@
+--- third_party/perfetto/include/perfetto/base/time.h.orig 2020-03-16 18:42:11 UTC
++++ third_party/perfetto/include/perfetto/base/time.h
+@@ -141,6 +141,9 @@ inline TimeNanos GetTimeInternalNs(clockid_t clk_id) {
+ // Return ns from boot. Conversely to GetWallTimeNs, this clock counts also time
+ // during suspend (when supported).
+ inline TimeNanos GetBootTimeNs() {
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
++ return GetTimeInternalNs(kWallTimeClockSource);
++#else
+ // Determine if CLOCK_BOOTTIME is available on the first call.
+ static const clockid_t kBootTimeClockSource = [] {
+ struct timespec ts = {};
+@@ -148,6 +151,7 @@ inline TimeNanos GetBootTimeNs() {
+ return res == 0 ? CLOCK_BOOTTIME : kWallTimeClockSource;
+ }();
+ return GetTimeInternalNs(kBootTimeClockSource);
++#endif
+ }
+
+ inline TimeNanos GetWallTimeNs() {
diff --git a/www/iridium/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h b/www/iridium/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h
new file mode 100644
index 000000000000..e49d012bec39
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_include_perfetto_ext_base_event__fd.h
@@ -0,0 +1,13 @@
+--- third_party/perfetto/include/perfetto/ext/base/event_fd.h.orig 2019-09-16 11:03:16 UTC
++++ third_party/perfetto/include/perfetto/ext/base/event_fd.h
+@@ -20,8 +20,8 @@
+ #include "perfetto/base/build_config.h"
+ #include "perfetto/ext/base/scoped_file.h"
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+- PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
++#if !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD) && (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID))
+ #define PERFETTO_USE_EVENTFD() 1
+ #else
+ #define PERFETTO_USE_EVENTFD() 0
diff --git a/www/iridium/files/patch-third__party_perfetto_src_base_thread__task__runner.cc b/www/iridium/files/patch-third__party_perfetto_src_base_thread__task__runner.cc
new file mode 100644
index 000000000000..1196437c938c
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_src_base_thread__task__runner.cc
@@ -0,0 +1,20 @@
+--- third_party/perfetto/src/base/thread_task_runner.cc.orig 2020-03-19 11:48:14 UTC
++++ third_party/perfetto/src/base/thread_task_runner.cc
+@@ -27,7 +27,7 @@
+ #include "perfetto/base/logging.h"
+ #include "perfetto/ext/base/unix_task_runner.h"
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ #include <sys/prctl.h>
+ #endif
+@@ -84,6 +84,8 @@ void ThreadTaskRunner::RunTaskThread(
+ if (!name_.empty()) {
+ #if PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX)
+ pthread_setname_np(name_.c_str());
++#elif PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
++ pthread_set_name_np(pthread_self(), name_.c_str());
+ #elif PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ prctl(PR_SET_NAME, name_.c_str());
diff --git a/www/iridium/files/patch-third__party_perfetto_src_base_unix__socket.cc b/www/iridium/files/patch-third__party_perfetto_src_base_unix__socket.cc
new file mode 100644
index 000000000000..f14075502887
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_src_base_unix__socket.cc
@@ -0,0 +1,20 @@
+--- third_party/perfetto/src/base/unix_socket.cc.orig 2020-03-16 18:42:11 UTC
++++ third_party/perfetto/src/base/unix_socket.cc
+@@ -37,7 +37,7 @@
+ #include "perfetto/ext/base/string_utils.h"
+ #include "perfetto/ext/base/utils.h"
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX)
++#if PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX) || PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)
+ #include <sys/ucred.h>
+ #endif
+
+@@ -601,7 +601,7 @@ void UnixSocket::ReadPeerCredentials() {
+ if (sock_raw_.family() != SockFamily::kUnix)
+ return;
+
+-#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
++#if (PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) && !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD)) || \
+ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
+ struct ucred user_cred;
+ socklen_t len = sizeof(user_cred);
diff --git a/www/iridium/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc b/www/iridium/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
new file mode 100644
index 000000000000..f778d36188f5
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_src_tracing_core_tracing__service__impl.cc
@@ -0,0 +1,10 @@
+--- third_party/perfetto/src/tracing/core/tracing_service_impl.cc.orig 2020-03-16 18:42:12 UTC
++++ third_party/perfetto/src/tracing/core/tracing_service_impl.cc
+@@ -2306,6 +2306,7 @@ void TracingServiceImpl::SnapshotClocks(std::vector<Tr
+
+ #if !PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX) && \
+ !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) && \
++ !PERFETTO_BUILDFLAG(PERFETTO_OS_FREEBSD) && \
+ !PERFETTO_BUILDFLAG(PERFETTO_OS_NACL)
+ struct {
+ clockid_t id;
diff --git a/www/iridium/files/patch-third__party_perfetto_src_tracing_core_virtual__destructors.cc b/www/iridium/files/patch-third__party_perfetto_src_tracing_core_virtual__destructors.cc
new file mode 100644
index 000000000000..7bc926acd7a0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_perfetto_src_tracing_core_virtual__destructors.cc
@@ -0,0 +1,28 @@
+Backport of:
+
+From 46f0abc66c1d78c60a0415c5cb46852ef3bfa9bb Mon Sep 17 00:00:00 2001
+From: Nico Weber <thakis@chromium.org>
+Date: Sat, 8 Feb 2020 21:26:53 -0500
+Subject: [PATCH] Fix compile error emitted by trunk clang
+
+../../third_party/perfetto/src/tracing/core/virtual_destructors.cc:33:35:
+error: destructor cannot be declared using a type alias
+ 'perfetto::TracingService::ConsumerEndpoint' (aka
+ 'perfetto::ConsumerEndpoint') of the class name
+TracingService::ConsumerEndpoint::~ConsumerEndpoint() = default;
+
+Bug: chromium:1050372
+
+--- third_party/perfetto/src/tracing/core/virtual_destructors.cc.orig 2020-08-29 15:07:40 UTC
++++ third_party/perfetto/src/tracing/core/virtual_destructors.cc
+@@ -30,8 +30,8 @@ namespace perfetto {
+ Consumer::~Consumer() = default;
+ Producer::~Producer() = default;
+ TracingService::~TracingService() = default;
+-TracingService::ConsumerEndpoint::~ConsumerEndpoint() = default;
+-TracingService::ProducerEndpoint::~ProducerEndpoint() = default;
++ConsumerEndpoint::~ConsumerEndpoint() = default;
++ProducerEndpoint::~ProducerEndpoint() = default;
+ SharedMemory::~SharedMemory() = default;
+ SharedMemory::Factory::~Factory() = default;
+ SharedMemoryArbiter::~SharedMemoryArbiter() = default;
diff --git a/www/iridium/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h b/www/iridium/files/patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h
new file mode 100644
index 000000000000..2f151107c8c2
--- /dev/null
+++ b/www/iridium/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 2019-10-21 19:07:25 UTC
++++ third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
+@@ -118,7 +118,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) || defined(__FreeBSD__)
+ // 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/www/iridium/files/patch-third__party_skia_src_core_SkCpu.cpp b/www/iridium/files/patch-third__party_skia_src_core_SkCpu.cpp
new file mode 100644
index 000000000000..4d7db67f8556
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_src_core_SkCpu.cpp
@@ -0,0 +1,19 @@
+--- third_party/skia/src/core/SkCpu.cpp.orig 2019-07-24 19:03:35 UTC
++++ third_party/skia/src/core/SkCpu.cpp
+@@ -76,6 +76,8 @@
+ #include <sys/auxv.h>
+
+ static uint32_t read_cpu_features() {
++return 0;
++#if 0
+ const uint32_t kHWCAP_CRC32 = (1<< 7),
+ kHWCAP_ASIMDHP = (1<<10);
+
+@@ -112,6 +114,7 @@
+ }
+ }
+ return features;
++#endif
+ }
+
+ #elif defined(SK_CPU_ARM32) && __has_include(<sys/auxv.h>) && \
diff --git a/www/iridium/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h b/www/iridium/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h
new file mode 100644
index 000000000000..4621798922e7
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_src_gpu_GrAutoLocaleSetter.h
@@ -0,0 +1,11 @@
+--- third_party/skia/src/gpu/GrAutoLocaleSetter.h.orig 2019-03-11 22:08:28 UTC
++++ third_party/skia/src/gpu/GrAutoLocaleSetter.h
+@@ -27,7 +27,7 @@
+ #define HAVE_XLOCALE 0
+ #endif
+
+-#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION)
++#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION) || defined(__FreeBSD__)
+ #define HAVE_LOCALE_T 0
+ #else
+ #define HAVE_LOCALE_T 1
diff --git a/www/iridium/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp b/www/iridium/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp
new file mode 100644
index 000000000000..1241cb9d733b
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_src_images_SkJpegEncoder.cpp
@@ -0,0 +1,41 @@
+--- third_party/skia/src/images/SkJpegEncoder.cpp.orig 2019-09-09 21:57:02 UTC
++++ third_party/skia/src/images/SkJpegEncoder.cpp
+@@ -76,9 +76,14 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ return (transform_scanline_proc) nullptr;
+ };
+
++#ifdef JCS_EXTENSIONS
+ J_COLOR_SPACE jpegColorType = JCS_EXT_RGBA;
++#else
++ J_COLOR_SPACE jpegColorType = JCS_RGB;
++#endif
+ int numComponents = 0;
+ switch (srcInfo.colorType()) {
++#ifdef JCS_EXTENSIONS
+ case kRGBA_8888_SkColorType:
+ fProc = chooseProc8888();
+ jpegColorType = JCS_EXT_RGBA;
+@@ -89,6 +94,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_EXT_BGRA;
+ numComponents = 4;
+ break;
++#endif
+ case kRGB_565_SkColorType:
+ fProc = transform_scanline_565;
+ jpegColorType = JCS_RGB;
+@@ -108,6 +114,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_GRAYSCALE;
+ numComponents = 1;
+ break;
++#ifdef JCS_EXTENSIONS
+ case kRGBA_F16_SkColorType:
+ if (kUnpremul_SkAlphaType == srcInfo.alphaType() &&
+ options.fAlphaOption == SkJpegEncoder::AlphaOption::kBlendOnBlack) {
+@@ -118,6 +125,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& sr
+ jpegColorType = JCS_EXT_RGBA;
+ numComponents = 4;
+ break;
++#endif
+ default:
+ return false;
+ }
diff --git a/www/iridium/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp b/www/iridium/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp
new file mode 100644
index 000000000000..ce10a392a3de
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_src_ports_SkOSFile__stdio.cpp
@@ -0,0 +1,11 @@
+--- third_party/skia/src/ports/SkOSFile_stdio.cpp.orig 2020-02-03 21:54:56 UTC
++++ third_party/skia/src/ports/SkOSFile_stdio.cpp
+@@ -132,7 +132,7 @@ void sk_fflush(FILE* f) {
+
+ void sk_fsync(FILE* f) {
+ #if !defined(_WIN32) && !defined(SK_BUILD_FOR_ANDROID) && !defined(__UCLIBC__) \
+- && !defined(_NEWLIB_VERSION)
++ && !defined(_NEWLIB_VERSION) && !defined(__FreeBSD__)
+ int fd = fileno(f);
+ fsync(fd);
+ #endif
diff --git a/www/iridium/files/patch-third__party_skia_src_sksl_SkSLString.h b/www/iridium/files/patch-third__party_skia_src_sksl_SkSLString.h
new file mode 100644
index 000000000000..a6806cbac266
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_src_sksl_SkSLString.h
@@ -0,0 +1,11 @@
+--- third_party/skia/src/sksl/SkSLString.h.orig 2019-12-16 21:56:18 UTC
++++ third_party/skia/src/sksl/SkSLString.h
+@@ -17,6 +17,8 @@
+ #include "include/core/SkString.h"
+ #endif
+
++#include <stdarg.h>
++
+ namespace SkSL {
+
+ // Represents a (not necessarily null-terminated) slice of a string.
diff --git a/www/iridium/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h b/www/iridium/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h
new file mode 100644
index 000000000000..7357a76fa0f9
--- /dev/null
+++ b/www/iridium/files/patch-third__party_skia_third__party_vulkanmemoryallocator_include_vk__mem__alloc.h
@@ -0,0 +1,11 @@
+--- third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h.orig 2020-04-24 08:05:43 UTC
++++ third_party/skia/third_party/vulkanmemoryallocator/include/vk_mem_alloc.h
+@@ -2232,7 +2232,7 @@ remove them if not needed.
+ #include <mutex> // for std::mutex
+ #include <atomic> // for std::atomic
+
+-#if !defined(_WIN32) && !defined(__APPLE__)
++#if !defined(_WIN32) && !defined(__APPLE__) && !defined(__FreeBSD__)
+ #include <malloc.h> // for aligned_alloc()
+ #endif
+
diff --git a/www/iridium/files/patch-third__party_sqlite_BUILD.gn b/www/iridium/files/patch-third__party_sqlite_BUILD.gn
new file mode 100644
index 000000000000..9bc2ed01d5e2
--- /dev/null
+++ b/www/iridium/files/patch-third__party_sqlite_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/sqlite/BUILD.gn.orig 2019-09-09 21:55:43 UTC
++++ third_party/sqlite/BUILD.gn
+@@ -262,7 +262,7 @@ config("sqlite_warnings") {
+ ]
+ }
+ }
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ cflags += [
+ # SQLite doesn't believe in compiler warnings, preferring testing.
+ # http://www.sqlite.org/faq.html#q17
diff --git a/www/iridium/files/patch-third__party_swiftshader_BUILD.gn b/www/iridium/files/patch-third__party_swiftshader_BUILD.gn
new file mode 100644
index 000000000000..7869c319cc9c
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_BUILD.gn
@@ -0,0 +1,24 @@
+--- third_party/swiftshader/BUILD.gn.orig 2020-03-16 18:42:12 UTC
++++ third_party/swiftshader/BUILD.gn
+@@ -136,9 +136,6 @@ config("swiftshader_config") {
+ ldflags = [ "-Wl,--gc-sections" ]
+
+ if (target_cpu == "mipsel") {
+- ldflags += [
+- "-Wl,--hash-style=sysv",
+- ]
+ if (mips_arch_variant == "r1") {
+ ldflags += [
+ "-mips32",
+@@ -150,11 +147,8 @@ config("swiftshader_config") {
+ }
+ } else if (target_cpu == "mips64el") {
+ ldflags += [
+- "-Wl,--hash-style=sysv",
+ "-mips64r2",
+ ]
+- } else {
+- ldflags += [ "-Wl,--hash-style=both" ]
+ }
+
+ # A bug in the gold linker prevents using ICF on 32-bit (crbug.com/729532)
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_Common_Configurator.cpp b/www/iridium/files/patch-third__party_swiftshader_src_Common_Configurator.cpp
new file mode 100644
index 000000000000..a1e1ccf4a0f1
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_Common_Configurator.cpp
@@ -0,0 +1,12 @@
+--- third_party/swiftshader/src/Common/Configurator.cpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/Common/Configurator.cpp
+@@ -42,6 +42,9 @@ namespace sw
+
+ bool Configurator::readFile()
+ {
++#if defined(__FreeBSD__)
++ return false;
++#endif
+ #if defined(__unix__)
+ if(access(path.c_str(), R_OK) != 0)
+ {
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp b/www/iridium/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp
new file mode 100644
index 000000000000..96aca3af105f
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_Common_MutexLock.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/Common/MutexLock.hpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/Common/MutexLock.hpp
+@@ -17,7 +17,7 @@
+
+ #include "Thread.hpp"
+
+-#if defined(__linux__)
++#if defined(__linux__) || defined(__FreeBSD__)
+ // Use a pthread mutex on Linux. Since many processes may use SwiftShader
+ // at the same time it's best to just have the scheduler overhead.
+ #include <pthread.h>
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp b/www/iridium/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp
new file mode 100644
index 000000000000..fa03cd628462
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_Common_SharedLibrary.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/Common/SharedLibrary.hpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/Common/SharedLibrary.hpp
+@@ -97,7 +97,7 @@ void *loadLibrary(const std::string &libraryDirectory,
+
+ inline void *getLibraryHandle(const char *path)
+ {
+- #ifdef __ANDROID__
++ #if defined( __ANDROID__) || defined(__FreeBSD__)
+ // bionic doesn't support RTLD_NOLOAD before L
+ return dlopen(path, RTLD_NOW | RTLD_LOCAL);
+ #else
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp b/www/iridium/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp
new file mode 100644
index 000000000000..888c476a9108
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_Main_SwiftConfig.cpp
@@ -0,0 +1,14 @@
+--- third_party/swiftshader/src/Main/SwiftConfig.cpp.orig 2019-09-09 21:57:01 UTC
++++ third_party/swiftshader/src/Main/SwiftConfig.cpp
+@@ -764,7 +764,11 @@ namespace sw
+ struct stat status;
+ int lastModified = ini.getInteger("LastModified", "Time", 0);
+
++#if !defined(__FreeBSD__)
+ bool noConfig = stat("SwiftShader.ini", &status) != 0;
++#else
++ bool noConfig = false;
++#endif
+ newConfig = !noConfig && abs((int)status.st_mtime - lastModified) > 1;
+
+ if(disableServerOverride)
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Display.cpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Display.cpp
new file mode 100644
index 000000000000..7577231bc5a8
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Display.cpp
@@ -0,0 +1,20 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/Display.cpp.orig 2019-10-21 19:09:15 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/Display.cpp
+@@ -690,7 +690,7 @@ bool Display::isValidWindow(EGLNativeWindowType window
+ return status != 0;
+ }
+ return false;
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ return false; // Non X11 linux is headless only
+ #elif defined(__APPLE__)
+ return sw::OSX::IsValidWindow(window);
+@@ -868,7 +868,7 @@ sw::Format Display::getDisplayFormat() const
+ {
+ return sw::FORMAT_X8R8G8B8;
+ }
+- #elif defined(__linux__) // Non X11 linux is headless only
++ #elif defined(__linux__) || defined(__FreeBSD__) // Non X11 linux is headless only
+ return sw::FORMAT_A8B8G8R8;
+ #elif defined(__APPLE__)
+ return sw::FORMAT_A8B8G8R8;
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Surface.cpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Surface.cpp
new file mode 100644
index 000000000000..a21bb4acad17
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_Surface.cpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/Surface.cpp.orig 2019-10-21 19:09:15 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/Surface.cpp
+@@ -362,7 +362,7 @@ bool WindowSurface::checkForResize()
+
+ int windowWidth = windowAttributes.width;
+ int windowHeight = windowAttributes.height;
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ // Non X11 linux is headless only
+ int windowWidth = 100;
+ int windowHeight = 100;
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp
new file mode 100644
index 000000000000..3ca2cc4d69af
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.cpp
@@ -0,0 +1,29 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/libEGL.cpp.orig 2020-02-03 21:54:55 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/libEGL.cpp
+@@ -153,7 +153,7 @@ EGLDisplay EGLAPIENTRY GetDisplay(EGLNativeDisplayType
+ // FIXME: Check if display_id is the default display
+ }
+
+- #if defined(__linux__) && !defined(__ANDROID__)
++ #if (defined(__linux__) || defined(__FreeBSD)) && !defined(__ANDROID__)
+ #if defined(USE_X11)
+ if(!libX11)
+ #endif // Non X11 linux is headless only
+@@ -216,7 +216,7 @@ const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EG
+ {
+ return success(
+ "EGL_KHR_client_get_all_proc_addresses "
+-#if defined(__linux__) && !defined(__ANDROID__)
++#if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__)
+ "EGL_KHR_platform_gbm "
+ #endif
+ #if defined(USE_X11)
+@@ -1298,7 +1298,7 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum plat
+ {
+ TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLAttrib *attrib_list = %p)", platform, native_display, attrib_list);
+
+- #if defined(__linux__) && !defined(__ANDROID__)
++ #if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__)
+ switch(platform)
+ {
+ #if defined(USE_X11)
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp
new file mode 100644
index 000000000000..59c1f562fb03
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libEGL_libEGL.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libEGL/libEGL.hpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/OpenGL/libEGL/libEGL.hpp
+@@ -100,7 +100,7 @@ class LibEGL (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libEGL_lib[] = {"libEGL_swiftshader.so", "libEGL_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};
+ #else
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp
new file mode 100644
index 000000000000..1f68f9ed3be6
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLES__CM_libGLES__CM.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libGLES_CM/libGLES_CM.hpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+@@ -261,7 +261,7 @@ class LibGLES_CM (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libGLES_CM_lib[] = {"libGLESv1_CM_swiftshader.so", "libGLESv1_CM_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};
+ #else
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp
new file mode 100644
index 000000000000..7a1936b0dce0
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_OpenGL_libGLESv2_libGLESv2.hpp
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/src/OpenGL/libGLESv2/libGLESv2.hpp.orig 2019-03-11 22:08:03 UTC
++++ third_party/swiftshader/src/OpenGL/libGLESv2/libGLESv2.hpp
+@@ -286,7 +286,7 @@ class LibGLESv2 (private)
+ #endif
+ #elif defined(__ANDROID__)
+ const char *libGLESv2_lib[] = {"libGLESv2_swiftshader.so", "libGLESv2_swiftshader.so"};
+- #elif defined(__linux__)
++ #elif defined(__linux__) || defined(__FreeBSD__)
+ #if defined(__LP64__)
+ const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};
+ #else
diff --git a/www/iridium/files/patch-third__party_swiftshader_src_Vulkan_VkDebug.cpp b/www/iridium/files/patch-third__party_swiftshader_src_Vulkan_VkDebug.cpp
new file mode 100644
index 000000000000..c4eeb77baf0d
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_src_Vulkan_VkDebug.cpp
@@ -0,0 +1,53 @@
+--- third_party/swiftshader/src/Vulkan/VkDebug.cpp.orig 2020-04-03 04:13:08 UTC
++++ third_party/swiftshader/src/Vulkan/VkDebug.cpp
+@@ -29,12 +29,17 @@
+ # include <sys/sysctl.h>
+ # include <unistd.h>
+ #endif
++#if defined(__FreeBSD__)
++# include <sys/sysctl.h>
++# include <sys/user.h>
++# include <unistd.h>
++#endif
+
+ namespace {
+
+ bool IsUnderDebugger()
+ {
+-#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__)
++#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__) && !defined(__FreeBSD__)
+ static bool checked = false;
+ static bool res = false;
+
+@@ -56,7 +61,7 @@ bool IsUnderDebugger()
+ return res;
+ #elif defined(_WIN32) || defined(_WIN64)
+ return IsDebuggerPresent() != 0;
+-#elif defined(__APPLE__) || defined(__MACH__)
++#elif defined(__APPLE__) || defined(__MACH__) || defined(__FreeBSD__)
+ // Code comes from the Apple Technical Q&A QA1361
+
+ // Tell sysctl what info we're requestion. Specifically we're asking for
+@@ -71,14 +76,22 @@ bool IsUnderDebugger()
+ struct kinfo_proc info;
+ size_t size = sizeof(info);
+
++# if defined(__FreeBSD__)
++ info.ki_flag = 0;
++# else
+ info.kp_proc.p_flag = 0;
++# endif
+
+ // Get the info we're requesting, if sysctl fails then info.kp_proc.p_flag will remain 0.
+ res = sysctl(request, sizeof(request) / sizeof(*request), &info, &size, NULL, 0);
+ ASSERT_MSG(res == 0, "syscl returned %d", res);
+
+ // We're being debugged if the P_TRACED flag is set
++# if defined(__FreeBSD__)
++ return ((info.ki_flag & P_TRACED) != 0);
++# else
+ return ((info.kp_proc.p_flag & P_TRACED) != 0);
++# endif
+ #else
+ return false;
+ #endif
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_config.h b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_config.h
new file mode 100644
index 000000000000..32c68edfca31
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_config.h
@@ -0,0 +1,152 @@
+--- third_party/swiftshader/third_party/llvm-7.0/configs/linux/include/llvm/Config/config.h.orig 2020-03-16 18:42:15 UTC
++++ third_party/swiftshader/third_party/llvm-7.0/configs/linux/include/llvm/Config/config.h
+@@ -8,15 +8,15 @@
+ #define BUG_REPORT_URL "https://bugs.llvm.org/"
+
+ /* Define to 1 to enable backtraces, and to 0 otherwise. */
+-#define ENABLE_BACKTRACES 0
++#define ENABLE_BACKTRACES 1
+
+ /* Define to 1 to enable crash overrides, and to 0 otherwise. */
+-#define ENABLE_CRASH_OVERRIDES 0
++#define ENABLE_CRASH_OVERRIDES 1
+
+ /* Define to 1 if you have the `backtrace' function. */
+-/* #undef HAVE_BACKTRACE */
++#define HAVE_BACKTRACE 1
+
+-/* #undef BACKTRACE_HEADER */
++#define BACKTRACE_HEADER <execinfo.h>
+
+ /* Define to 1 if you have the <CrashReporterClient.h> header file. */
+ /* #undef HAVE_CRASHREPORTERCLIENT_H */
+@@ -26,7 +26,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. */
+@@ -50,7 +50,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
+@@ -89,7 +89,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 */
+@@ -107,25 +107,25 @@
+ /* #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
+
+ /* 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 */
+
+ /* Define to 1 if you have the `mallctl' function. */
+-/* #undef HAVE_MALLCTL */
++#define HAVE_MALLCTL 1
+
+ /* Define to 1 if you have the `mallinfo' function. */
+-#define HAVE_MALLINFO 1
++/* #undef HAVE_MALLINFO */
+
+ /* Define to 1 if you have the <malloc.h> header file. */
+-#define HAVE_MALLOC_H 1
++/* #undef HAVE_MALLOC_H */
+
+ /* Define to 1 if you have the <malloc/malloc.h> header file. */
+ /* #undef HAVE_MALLOC_MALLOC_H */
+@@ -137,7 +137,7 @@
+ #define HAVE_POSIX_FALLOCATE 1
+
+ /* 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
+@@ -158,16 +158,16 @@
+ #define HAVE_REALPATH 1
+
+ /* Define to 1 if you have the `sbrk' function. */
+-#define HAVE_SBRK 1
++/* #undef HAVE_SBRK */
+
+ /* Define to 1 if you have the `setenv' function. */
+ #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
+@@ -209,13 +209,13 @@
+ #define HAVE_SYS_TYPES_H 1
+
+ /* Define if the setupterm() function is supported this platform. */
+-/* #undef HAVE_TERMINFO */
++#define HAVE_TERMINFO 1
+
+ /* Define if the xar_open() function is supported this platform. */
+ /* #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
+@@ -224,7 +224,7 @@
+ /* #undef HAVE_VALGRIND_VALGRIND_H */
+
+ /* 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 */
+@@ -298,7 +298,7 @@
+ #elif defined(__arm__)
+ #define LLVM_DEFAULT_TARGET_TRIPLE "armv7-linux-gnueabihf"
+ #elif defined(__aarch64__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-linux-gnu"
++#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-portbld-freebsd"
+ #elif defined(__mips__)
+ #define LLVM_DEFAULT_TARGET_TRIPLE "mipsel-linux-gnu"
+ #elif defined(__mips64)
+@@ -310,7 +310,7 @@
+ #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 */
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_llvm-config.h b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_llvm-config.h
new file mode 100644
index 000000000000..4405e311225b
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-7.0_configs_linux_include_llvm_Config_llvm-config.h
@@ -0,0 +1,20 @@
+--- third_party/swiftshader/third_party/llvm-7.0/configs/linux/include/llvm/Config/llvm-config.h.orig 2019-09-09 21:57:03 UTC
++++ third_party/swiftshader/third_party/llvm-7.0/configs/linux/include/llvm/Config/llvm-config.h
+@@ -38,7 +38,7 @@
+ #elif defined(__arm__)
+ #define LLVM_DEFAULT_TARGET_TRIPLE "armv7-linux-gnueabihf"
+ #elif defined(__aarch64__)
+-#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-linux-gnu"
++#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-portbld-freebsd"
+ #elif defined(__mips__)
+ #define LLVM_DEFAULT_TARGET_TRIPLE "mipsel-linux-gnu"
+ #elif defined(__mips64)
+@@ -63,7 +63,7 @@
+ #elif defined(__arm__)
+ #define LLVM_HOST_TRIPLE "armv7-linux-gnueabihf"
+ #elif defined(__aarch64__)
+-#define LLVM_HOST_TRIPLE "aarch64-linux-gnu"
++#define LLVM_HOST_TRIPLE "aarch64-portbld-freebsd"
+ #elif defined(__mips__)
+ #define LLVM_HOST_TRIPLE "mipsel-linux-gnu"
+ #elif defined(__mips64)
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
new file mode 100644
index 000000000000..d5afa9c50345
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_build_Linux_include_llvm_Config_config.h
@@ -0,0 +1,29 @@
+--- third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h.orig 2019-03-11 22:08:30 UTC
++++ third_party/swiftshader/third_party/llvm-subzero/build/Linux/include/llvm/Config/config.h
+@@ -121,7 +121,7 @@
+ #define HAVE_LINK_H 1
+
+ /* 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 */
+@@ -130,7 +130,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.h> header file. */
+ #define HAVE_MALLOC_H 1
+@@ -154,7 +154,7 @@
+ /* #undef HAVE_NDIR_H */
+
+ /* 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. */
+ #define HAVE_POSIX_SPAWN 1
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc
new file mode 100644
index 000000000000..28c940535747
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_third__party_llvm-subzero_lib_Support_Unix_Process.inc
@@ -0,0 +1,11 @@
+--- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig 2019-03-11 22:08:30 UTC
++++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
+@@ -35,7 +35,7 @@
+ // DragonFlyBSD, OpenBSD, and Bitrig have deprecated <malloc.h> for
+ // <stdlib.h> instead. Unix.h includes this for us already.
+ #if defined(HAVE_MALLOC_H) && !defined(__DragonFly__) && \
+- !defined(__OpenBSD__) && !defined(__Bitrig__)
++ !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__Bitrig__)
+ #include <malloc.h>
+ #endif
+ #if defined(HAVE_MALLCTL)
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp b/www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_memory.cpp
new file mode 100644
index 000000000000..f34425cdd42e
--- /dev/null
+++ b/www/iridium/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 2019-12-22 15:09:53 UTC
++++ third_party/swiftshader/third_party/marl/src/memory.cpp
+@@ -19,7 +19,7 @@
+
+ #include <cstring>
+
+-#if defined(__linux__) || defined(__APPLE__)
++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+ #include <sys/mman.h>
+ #include <unistd.h>
+ namespace {
diff --git a/www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp b/www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp
new file mode 100644
index 000000000000..927560e4f971
--- /dev/null
+++ b/www/iridium/files/patch-third__party_swiftshader_third__party_marl_src_thread.cpp
@@ -0,0 +1,22 @@
+--- third_party/swiftshader/third_party/marl/src/thread.cpp.orig 2019-12-22 15:09:09 UTC
++++ third_party/swiftshader/third_party/marl/src/thread.cpp
+@@ -27,6 +27,10 @@
+ #include <mach/thread_act.h>
+ #include <pthread.h>
+ #include <unistd.h>
++#elif defined(__FreeBSD__)
++#include <pthread.h>
++#include <pthread_np.h>
++#include <unistd.h>
+ #else
+ #include <pthread.h>
+ #include <unistd.h>
+@@ -85,6 +89,8 @@ void Thread::setName(const char* fmt, ...) {
+
+ #if defined(__APPLE__)
+ pthread_setname_np(name);
++#elif defined(__FreeBSD__)
++ pthread_set_name_np(pthread_self(), name);
+ #elif !defined(__Fuchsia__)
+ pthread_setname_np(pthread_self(), name);
+ #endif
diff --git a/www/iridium/files/patch-third__party_usrsctp_BUILD.gn b/www/iridium/files/patch-third__party_usrsctp_BUILD.gn
new file mode 100644
index 000000000000..e12616cdc188
--- /dev/null
+++ b/www/iridium/files/patch-third__party_usrsctp_BUILD.gn
@@ -0,0 +1,20 @@
+--- third_party/usrsctp/BUILD.gn.orig 2019-03-11 22:01:18 UTC
++++ third_party/usrsctp/BUILD.gn
+@@ -116,11 +116,16 @@ static_library("usrsctp") {
+ "-UINET6",
+ ]
+
+- if (is_linux || is_android) {
++ if ((is_linux && !is_bsd) || is_android ) {
+ defines += [
+ "__Userspace_os_Linux",
+ "_GNU_SOURCE",
+ ]
++ } else if (is_bsd) {
++ defines += [
++ "__Userspace_os_FreeBSD",
++ ]
++ cflags += [ "-U__FreeBSD__" ]
+ } else if (is_mac || is_ios) {
+ defines += [
+ "HAVE_SA_LEN",
diff --git a/www/iridium/files/patch-third__party_webrtc_BUILD.gn b/www/iridium/files/patch-third__party_webrtc_BUILD.gn
new file mode 100644
index 000000000000..431b2f75d72c
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_BUILD.gn
@@ -0,0 +1,12 @@
+--- third_party/webrtc/BUILD.gn.orig 2020-03-16 18:42:13 UTC
++++ third_party/webrtc/BUILD.gn
+@@ -171,6 +171,9 @@ config("common_inherited_config") {
+ if (is_linux) {
+ defines += [ "WEBRTC_LINUX" ]
+ }
++ if (is_bsd) {
++ defines += [ "WEBRTC_BSD" ]
++ }
+ if (is_mac) {
+ defines += [ "WEBRTC_MAC" ]
+ }
diff --git a/www/iridium/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn b/www/iridium/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
new file mode 100644
index 000000000000..a9fe31ec37b8
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_modules_audio__device_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/modules/audio_device/BUILD.gn.orig 2020-03-16 18:42:14 UTC
++++ third_party/webrtc/modules/audio_device/BUILD.gn
+@@ -259,7 +259,7 @@ rtc_library("audio_device_impl") {
+ if (rtc_use_dummy_audio_file_devices) {
+ defines += [ "WEBRTC_DUMMY_FILE_DEVICES" ]
+ } else {
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "linux/alsasymboltable_linux.cc",
+ "linux/alsasymboltable_linux.h",
diff --git a/www/iridium/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc b/www/iridium/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc
new file mode 100644
index 000000000000..41cae80d56bd
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_modules_rtp__rtcp_source_forward__error__correction.cc
@@ -0,0 +1,10 @@
+--- third_party/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc.orig 2019-09-09 21:57:05 UTC
++++ third_party/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc
+@@ -13,6 +13,7 @@
+ #include <string.h>
+
+ #include <algorithm>
++#include <cstdlib>
+ #include <utility>
+
+ #include "absl/algorithm/container.h"
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_byte__order.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_byte__order.h
new file mode 100644
index 000000000000..0f3e3413f1ae
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_byte__order.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/byte_order.h.orig 2019-06-04 18:58:09 UTC
++++ third_party/webrtc/rtc_base/byte_order.h
+@@ -89,7 +89,7 @@
+ #endif // defined(WEBRTC_ARCH_LITTLE_ENDIAN)
+
+ #elif defined(WEBRTC_POSIX)
+-#include <endian.h>
++#include <sys/endian.h>
+ #else
+ #error "Missing byte order functions for this arch."
+ #endif // defined(WEBRTC_MAC)
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h
new file mode 100644
index 000000000000..b4945de800d2
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_ifaddrs__converter.h
@@ -0,0 +1,11 @@
+--- third_party/webrtc/rtc_base/ifaddrs_converter.h.orig 2019-03-11 22:08:15 UTC
++++ third_party/webrtc/rtc_base/ifaddrs_converter.h
+@@ -14,6 +14,8 @@
+ #if defined(WEBRTC_ANDROID)
+ #include "rtc_base/ifaddrs_android.h"
+ #else
++#include <sys/types.h>
++#include <sys/socket.h>
+ #include <ifaddrs.h>
+ #endif // WEBRTC_ANDROID
+
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.cc b/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.cc
new file mode 100644
index 000000000000..5fe1396d3154
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.cc
@@ -0,0 +1,12 @@
+--- third_party/webrtc/rtc_base/ip_address.cc.orig 2019-03-11 22:08:15 UTC
++++ third_party/webrtc/rtc_base/ip_address.cc
+@@ -11,6 +11,9 @@
+ #if defined(WEBRTC_POSIX)
+ #include <netinet/in.h>
+ #include <sys/socket.h>
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
++#endif
+ #ifdef OPENBSD
+ #include <netinet/in_systm.h>
+ #endif
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.h
new file mode 100644
index 000000000000..3db51306bd94
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_ip__address.h
@@ -0,0 +1,13 @@
+--- third_party/webrtc/rtc_base/ip_address.h.orig 2019-03-11 22:08:15 UTC
++++ third_party/webrtc/rtc_base/ip_address.h
+@@ -17,6 +17,10 @@
+ #include <netinet/in.h>
+ #include <sys/socket.h>
+ #endif
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
++#include <sys/socket.h>
++#endif
+ #if defined(WEBRTC_WIN)
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_network.cc b/www/iridium/files/patch-third__party_webrtc_rtc__base_network.cc
new file mode 100644
index 000000000000..e45c76f40a22
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_network.cc
@@ -0,0 +1,29 @@
+--- third_party/webrtc/rtc_base/network.cc.orig 2019-12-16 21:56:20 UTC
++++ third_party/webrtc/rtc_base/network.cc
+@@ -14,7 +14,7 @@
+ // linux/if.h can't be included at the same time as the posix sys/if.h, and
+ // it's transitively required by linux/route.h, so include that version on
+ // linux instead of the standard posix one.
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <linux/if.h>
+ #include <linux/route.h>
+ #elif !defined(__native_client__)
+@@ -767,7 +767,7 @@ bool BasicNetworkManager::CreateNetworks(bool include_
+ }
+ #endif // WEBRTC_WIN
+
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ bool IsDefaultRoute(const std::string& network_name) {
+ FILE* f = fopen("/proc/net/route", "r");
+ if (!f) {
+@@ -810,7 +810,7 @@ bool BasicNetworkManager::IsIgnoredNetwork(const Netwo
+ strncmp(network.name().c_str(), "vboxnet", 7) == 0) {
+ return true;
+ }
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ // Make sure this is a default route, if we're ignoring non-defaults.
+ if (ignore_non_default_routes_ && !IsDefaultRoute(network.name())) {
+ return true;
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_network.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_network.h
new file mode 100644
index 000000000000..46d64c258e37
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_network.h
@@ -0,0 +1,13 @@
+--- third_party/webrtc/rtc_base/network.h.orig 2019-12-16 21:56:20 UTC
++++ third_party/webrtc/rtc_base/network.h
+@@ -26,6 +26,10 @@
+ #include "rtc_base/system/rtc_export.h"
+ #include "rtc_base/third_party/sigslot/sigslot.h"
+
++#if defined(WEBRTC_BSD)
++#include <sys/types.h>
++#endif
++
+ #if defined(WEBRTC_POSIX)
+ struct ifaddrs;
+ #endif // defined(WEBRTC_POSIX)
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc b/www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc
new file mode 100644
index 000000000000..939381fc9f1a
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.cc
@@ -0,0 +1,47 @@
+--- third_party/webrtc/rtc_base/physical_socket_server.cc.orig 2020-03-16 18:42:14 UTC
++++ third_party/webrtc/rtc_base/physical_socket_server.cc
+@@ -51,7 +51,7 @@
+ #include "rtc_base/null_socket_server.h"
+ #include "rtc_base/time_utils.h"
+
+-#if defined(WEBRTC_LINUX)
++#if defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <linux/sockios.h>
+ #endif
+
+@@ -70,7 +70,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(WEBRTC_BSD) && !defined(__native_client__)
+
+ int64_t GetSocketRecvTimestamp(int socket) {
+ struct timeval tv_ioctl;
+@@ -290,7 +290,7 @@ int PhysicalSocket::GetOption(Option opt, int* value)
+ socklen_t optlen = sizeof(*value);
+ int ret = ::getsockopt(s_, slevel, sopt, (SockOptArg)value, &optlen);
+ if (ret != -1 && 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
+ }
+@@ -303,7 +303,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
+ }
+@@ -533,7 +533,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/www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_physical__socket__server.h
new file mode 100644
index 000000000000..3fe92f247ce2
--- /dev/null
+++ b/www/iridium/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 2019-03-11 22:08:16 UTC
++++ third_party/webrtc/rtc_base/physical_socket_server.h
+@@ -11,7 +11,7 @@
+ #ifndef RTC_BASE_PHYSICAL_SOCKET_SERVER_H_
+ #define RTC_BASE_PHYSICAL_SOCKET_SERVER_H_
+
+-#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX)
++#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX) && !defined(WEBRTC_BSD)
+ #include <sys/epoll.h>
+ #define WEBRTC_USE_EPOLL 1
+ #endif
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc b/www/iridium/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
new file mode 100644
index 000000000000..9d0e6fdcc5fd
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_platform__thread__types.cc
@@ -0,0 +1,39 @@
+--- third_party/webrtc/rtc_base/platform_thread_types.cc.orig 2019-12-16 21:56:20 UTC
++++ third_party/webrtc/rtc_base/platform_thread_types.cc
+@@ -11,7 +11,11 @@
+ #include "rtc_base/platform_thread_types.h"
+
+ #if defined(WEBRTC_LINUX)
++#if !defined(__FreeBSD__)
+ #include <sys/prctl.h>
++#else
++#include <pthread_np.h>
++#endif
+ #include <sys/syscall.h>
+ #endif
+
+@@ -27,6 +31,8 @@ PlatformThreadId CurrentThreadId() {
+ return gettid();
+ #elif defined(WEBRTC_FUCHSIA)
+ return zx_thread_self();
++#elif defined(__FreeBSD__)
++ return pthread_getthreadid_np();
+ #elif defined(WEBRTC_LINUX)
+ return syscall(__NR_gettid);
+ #elif defined(__EMSCRIPTEN__)
+@@ -57,6 +63,7 @@ bool IsThreadRefEqual(const PlatformThreadRef& a, cons
+ }
+
+ void SetCurrentThreadName(const char* name) {
++#if !defined(__FreeBSD__)
+ #if defined(WEBRTC_WIN)
+ // For details see:
+ // https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code
+@@ -81,6 +88,7 @@ void SetCurrentThreadName(const char* name) {
+ prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(name)); // NOLINT
+ #elif defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
+ pthread_setname_np(name);
++#endif
+ #endif
+ }
+
diff --git a/www/iridium/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h b/www/iridium/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h
new file mode 100644
index 000000000000..3d7e07133d72
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_rtc__base_third__party_sigslot_sigslot.h
@@ -0,0 +1,19 @@
+--- third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h.orig 2020-03-03 18:55:31 UTC
++++ third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h
+@@ -178,6 +178,8 @@ class multi_threaded_local {
+ #endif // _SIGSLOT_HAS_WIN32_THREADS
+
+ #ifdef _SIGSLOT_HAS_POSIX_THREADS
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wthread-safety-analysis"
+ // The multi threading policies only get compiled in if they are enabled.
+ class multi_threaded_global {
+ public:
+@@ -201,6 +203,7 @@ class multi_threaded_local {
+ private:
+ pthread_mutex_t m_mutex;
+ };
++#pragma GCC diagnostic pop
+ #endif // _SIGSLOT_HAS_POSIX_THREADS
+
+ template <class mt_policy>
diff --git a/www/iridium/files/patch-third__party_webrtc_system__wrappers_BUILD.gn b/www/iridium/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
new file mode 100644
index 000000000000..bb0b3df2b288
--- /dev/null
+++ b/www/iridium/files/patch-third__party_webrtc_system__wrappers_BUILD.gn
@@ -0,0 +1,11 @@
+--- third_party/webrtc/system_wrappers/BUILD.gn.orig 2019-09-09 21:57:06 UTC
++++ third_party/webrtc/system_wrappers/BUILD.gn
+@@ -58,8 +58,6 @@ rtc_static_library("system_wrappers") {
+ if (!build_with_chromium) {
+ deps += [ ":cpu_features_linux" ]
+ }
+-
+- libs += [ "rt" ]
+ }
+
+ if (is_win) {
diff --git a/www/iridium/files/patch-third__party_yasm_yasm__assemble.gni b/www/iridium/files/patch-third__party_yasm_yasm__assemble.gni
new file mode 100644
index 000000000000..a54244fd5e3e
--- /dev/null
+++ b/www/iridium/files/patch-third__party_yasm_yasm__assemble.gni
@@ -0,0 +1,157 @@
+--- third_party/yasm/yasm_assemble.gni.orig 2020-03-16 18:40:14 UTC
++++ third_party/yasm/yasm_assemble.gni
+@@ -1,105 +1,23 @@
+-# Copyright 2014 The Chromium Authors. All rights reserved.
++# 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.
+
+-# This provides the yasm_assemble() template which uses YASM to assemble
+-# assembly files.
+-#
+-# Files to be assembled with YASM should have an extension of .asm.
+-#
+-# Parameters
+-#
+-# yasm_flags (optional)
+-# [list of strings] Pass additional flags into YASM. These are appended
+-# to the command line. Note that the target machine type and system is
+-# already set up based on the current toolchain so you don't need to
+-# specify these things (see below).
+-#
+-# Example: yasm_flags = [ "--force-strict" ]
+-#
+-# include_dirs (optional)
+-# [list of dir names] List of additional include dirs. Note that the
+-# source root and the root generated file dir is always added, just like
+-# our C++ build sets up.
+-#
+-# Example: include_dirs = [ "//some/other/path", target_gen_dir ]
+-#
+-# defines (optional)
+-# [list of strings] List of defines, as with the native code defines.
+-#
+-# Example: defines = [ "FOO", "BAR=1" ]
+-#
+-# inputs, deps, visibility (optional)
+-# These have the same meaning as in an action.
+-#
+-# Example
+-#
+-# yasm_assemble("my_yasm_target") {
+-# sources = [
+-# "ultra_optimized_awesome.asm",
+-# ]
+-# include_dirs = [ "assembly_include" ]
+-# }
+-
+-if (is_mac || is_ios) {
+- if (current_cpu == "x86") {
+- _yasm_flags = [
+- "-fmacho32",
+- "-m",
+- "x86",
+- ]
+- } else if (current_cpu == "x64") {
+- _yasm_flags = [
+- "-fmacho64",
+- "-m",
+- "amd64",
+- ]
+- }
+-} else if (is_posix || is_fuchsia) {
+- if (current_cpu == "x86") {
+- _yasm_flags = [
+- "-felf32",
+- "-m",
+- "x86",
+- ]
+- } else if (current_cpu == "x64") {
+- _yasm_flags = [
+- "-DPIC",
+- "-felf64",
+- "-m",
+- "amd64",
+- ]
+- }
+-} else if (is_win) {
+- if (current_cpu == "x86") {
+- _yasm_flags = [
+- "-DPREFIX",
+- "-fwin32",
+- "-m",
+- "x86",
+- ]
+- } else if (current_cpu == "x64") {
+- _yasm_flags = [
+- "-fwin64",
+- "-m",
+- "amd64",
+- ]
+- }
++if (current_cpu == "x86") {
++ _yasm_flags = [
++ "-felf32",
++ "-m",
++ "x86",
++ ]
++} else if (current_cpu == "x64") {
++ _yasm_flags = [
++ "-DPIC",
++ "-felf64",
++ "-m",
++ "amd64",
++ ]
+ }
+
+-if (is_win) {
+- asm_obj_extension = "obj"
+-} else {
+- asm_obj_extension = "o"
+-}
+-
+ template("yasm_assemble") {
+- assert(defined(invoker.sources), "Need sources defined for $target_name")
+-
+- # Only depend on YASM on x86 systems. Force compilation of .asm files for
+- # ARM to fail.
+- assert(current_cpu == "x86" || current_cpu == "x64")
+-
+ action_name = "${target_name}_action"
+ source_set_name = target_name
+
+@@ -114,22 +32,12 @@ template("yasm_assemble") {
+ inputs = invoker.inputs
+ }
+
+- # Executable (first in the args). The binary might be in the root build dir
+- # (no cross-compiling) or in a toolchain-specific subdirectory of that
+- # (when cross-compiling).
+- yasm_label = "//third_party/yasm($host_toolchain)"
+- args = [ "./" + # Force current dir.
+- rebase_path(get_label_info(yasm_label, "root_out_dir") + "/yasm",
+- root_build_dir) ]
+-
+- # Deps.
+- deps = [ yasm_label ]
++ deps = []
+ if (defined(invoker.deps)) {
+ deps += invoker.deps
+ }
+
+- # Flags.
+- args += _yasm_flags
++ args = [ "yasm" ] + _yasm_flags
+ if (defined(invoker.yasm_flags)) {
+ args += invoker.yasm_flags
+ }
+@@ -184,9 +92,6 @@ template("yasm_assemble") {
+ }
+
+ sources = get_target_outputs(":$action_name")
+-
+- # Do not publicize any header to remove build dependency.
+- public = []
+
+ deps = [ ":$action_name" ]
+ }
diff --git a/www/iridium/files/patch-tools_gn_build_gen.py b/www/iridium/files/patch-tools_gn_build_gen.py
new file mode 100644
index 000000000000..1461138a4fd5
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_build_gen.py
@@ -0,0 +1,24 @@
+--- tools/gn/build/gen.py.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/build/gen.py
+@@ -73,6 +73,9 @@ class Platform(object):
+ def is_haiku(self):
+ return self._platform == 'haiku'
+
++ def is_freebsd(self):
++ return self._platform == 'freebsd'
++
+ def is_posix(self):
+ return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku']
+
+@@ -351,6 +354,11 @@ def WriteGNNinja(path, platform, host, options):
+ elif platform.is_haiku():
+ cflags.append('-fPIC')
+ cflags.extend(['-D_BSD_SOURCE'])
++ elif platform.is_freebsd():
++ cflags.extend(['-Wno-deprecated-register', '-Wno-parentheses-equality'])
++ ldflags.extend(['-pthread'])
++ libs.extend(['-lexecinfo', '-lkvm', '-lutil'])
++ include_dirs += ['/usr/local/include']
+
+ if platform.is_posix() and not platform.is_haiku():
+ ldflags.append('-pthread')
diff --git a/www/iridium/files/patch-tools_gn_src_base_files_file__posix.cc b/www/iridium/files/patch-tools_gn_src_base_files_file__posix.cc
new file mode 100644
index 000000000000..26958b7bf8f1
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_base_files_file__posix.cc
@@ -0,0 +1,11 @@
+--- tools/gn/src/base/files/file_posix.cc.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/base/files/file_posix.cc
+@@ -372,7 +372,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/www/iridium/files/patch-tools_gn_src_base_files_file__util.h b/www/iridium/files/patch-tools_gn_src_base_files_file__util.h
new file mode 100644
index 000000000000..910d80aa09c6
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_base_files_file__util.h
@@ -0,0 +1,11 @@
+--- tools/gn/src/base/files/file_util.h.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/base/files/file_util.h
+@@ -325,7 +325,7 @@ bool VerifyPathControlledByAdmin(const base::FilePath&
+ // the directory |path|, in the number of FilePath::CharType, or -1 on failure.
+ int GetMaximumPathComponentLength(const base::FilePath& path);
+
+-#if defined(OS_LINUX) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
+ // Broad categories of file systems as returned by statfs() on Linux.
+ enum FileSystemType {
+ FILE_SYSTEM_UNKNOWN, // statfs failed.
diff --git a/www/iridium/files/patch-tools_gn_src_base_files_file__util__posix.cc b/www/iridium/files/patch-tools_gn_src_base_files_file__util__posix.cc
new file mode 100644
index 000000000000..b5476cba713c
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_base_files_file__util__posix.cc
@@ -0,0 +1,11 @@
+--- tools/gn/src/base/files/file_util_posix.cc.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/base/files/file_util_posix.cc
+@@ -210,7 +210,7 @@ bool ReplaceFile(const FilePath& from_path,
+ }
+
+ bool CreateLocalNonBlockingPipe(int fds[2]) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return pipe2(fds, O_CLOEXEC | O_NONBLOCK) == 0;
+ #else
+ int raw_fds[2];
diff --git a/www/iridium/files/patch-tools_gn_src_base_files_scoped__file.cc b/www/iridium/files/patch-tools_gn_src_base_files_scoped__file.cc
new file mode 100644
index 000000000000..acc59789e438
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_base_files_scoped__file.cc
@@ -0,0 +1,11 @@
+--- tools/gn/src/base/files/scoped_file.cc.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/base/files/scoped_file.cc
+@@ -30,7 +30,7 @@ void ScopedFDCloseTraits::Free(int fd) {
+ // a single open directory would bypass the entire security model.
+ int ret = IGNORE_EINTR(close(fd));
+
+-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || \
++#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || defined(OS_BSD) || \
+ defined(OS_ANDROID)
+ // NB: Some file descriptors can return errors from close() e.g. network
+ // filesystems such as NFS and Linux input devices. On Linux, macOS, and
diff --git a/www/iridium/files/patch-tools_gn_src_gn_exec__process.cc b/www/iridium/files/patch-tools_gn_src_gn_exec__process.cc
new file mode 100644
index 000000000000..761ee60ca826
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_gn_exec__process.cc
@@ -0,0 +1,13 @@
+--- tools/gn/src/gn/exec_process.cc.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/gn/exec_process.cc
+@@ -30,6 +30,10 @@
+ #include "base/posix/file_descriptor_shuffle.h"
+ #endif
+
++#if defined(OS_BSD)
++#include <signal.h>
++#endif
++
+ namespace internal {
+
+ #if defined(OS_WIN)
diff --git a/www/iridium/files/patch-tools_gn_src_util_sys__info.cc b/www/iridium/files/patch-tools_gn_src_util_sys__info.cc
new file mode 100644
index 000000000000..8b5fbb9cdb14
--- /dev/null
+++ b/www/iridium/files/patch-tools_gn_src_util_sys__info.cc
@@ -0,0 +1,11 @@
+--- tools/gn/src/util/sys_info.cc.orig 2020-03-16 18:48:21 UTC
++++ tools/gn/src/util/sys_info.cc
+@@ -28,6 +28,8 @@ std::string 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/www/iridium/files/patch-tools_json__schema__compiler_feature__compiler.py b/www/iridium/files/patch-tools_json__schema__compiler_feature__compiler.py
new file mode 100644
index 000000000000..fda74ee7deec
--- /dev/null
+++ b/www/iridium/files/patch-tools_json__schema__compiler_feature__compiler.py
@@ -0,0 +1,10 @@
+--- tools/json_schema_compiler/feature_compiler.py.orig 2020-02-03 21:53:12 UTC
++++ tools/json_schema_compiler/feature_compiler.py
+@@ -218,6 +218,7 @@ FEATURE_GRAMMAR = (
+ 'enum_map': {
+ 'chromeos': 'Feature::CHROMEOS_PLATFORM',
+ 'linux': 'Feature::LINUX_PLATFORM',
++ 'bsd': 'Feature::LINUX_PLATFORM',
+ 'mac': 'Feature::MACOSX_PLATFORM',
+ 'win': 'Feature::WIN_PLATFORM',
+ }
diff --git a/www/iridium/files/patch-tools_json__schema__compiler_model.py b/www/iridium/files/patch-tools_json__schema__compiler_model.py
new file mode 100644
index 000000000000..054250e781d5
--- /dev/null
+++ b/www/iridium/files/patch-tools_json__schema__compiler_model.py
@@ -0,0 +1,11 @@
+--- tools/json_schema_compiler/model.py.orig 2019-12-16 21:51:07 UTC
++++ tools/json_schema_compiler/model.py
+@@ -605,7 +605,7 @@ class Platforms(object):
+ """
+ CHROMEOS = _PlatformInfo("chromeos")
+ CHROMEOS_TOUCH = _PlatformInfo("chromeos_touch")
+- LINUX = _PlatformInfo("linux")
++ LINUX = _PlatformInfo("bsd")
+ MAC = _PlatformInfo("mac")
+ WIN = _PlatformInfo("win")
+
diff --git a/www/iridium/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn b/www/iridium/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
new file mode 100644
index 000000000000..ac82f274b479
--- /dev/null
+++ b/www/iridium/files/patch-tools_perf_chrome__telemetry__build_BUILD.gn
@@ -0,0 +1,11 @@
+--- tools/perf/chrome_telemetry_build/BUILD.gn.orig 2020-03-16 18:40:43 UTC
++++ tools/perf/chrome_telemetry_build/BUILD.gn
+@@ -46,7 +46,7 @@ group("telemetry_chrome_test") {
+ data_deps += [ "//chrome:reorder_imports" ]
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ data_deps += [
+ "//third_party/breakpad:dump_syms($host_toolchain)",
+ "//third_party/crashpad/crashpad/tools:crashpad_database_util",
diff --git a/www/iridium/files/patch-tools_variations_fieldtrial__to__struct.py b/www/iridium/files/patch-tools_variations_fieldtrial__to__struct.py
new file mode 100644
index 000000000000..940d72d03d24
--- /dev/null
+++ b/www/iridium/files/patch-tools_variations_fieldtrial__to__struct.py
@@ -0,0 +1,10 @@
+--- tools/variations/fieldtrial_to_struct.py.orig 2020-03-16 18:40:14 UTC
++++ tools/variations/fieldtrial_to_struct.py
+@@ -35,6 +35,7 @@ _platforms = [
+ 'android_weblayer',
+ 'android_webview',
+ 'chromeos',
++ 'freebsd',
+ 'fuchsia',
+ 'ios',
+ 'linux',
diff --git a/www/iridium/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc b/www/iridium/files/patch-ui_base_dragdrop_os__exchange__data__provider__factory.cc
new file mode 100644
index 000000000000..40534eb32dbb
--- /dev/null
+++ b/www/iridium/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 2019-07-24 18:59:18 UTC
++++ ui/base/dragdrop/os_exchange_data_provider_factory.cc
+@@ -8,7 +8,7 @@
+
+ #if defined(USE_X11)
+ #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
+ #elif defined(OS_MACOSX)
+ #include "ui/base/dragdrop/os_exchange_data_provider_builder_mac.h"
+@@ -23,7 +23,7 @@ std::unique_ptr<OSExchangeData::Provider>
+ OSExchangeDataProviderFactory::CreateProvider() {
+ #if defined(USE_X11)
+ return std::make_unique<OSExchangeDataProviderAuraX11>();
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ return std::make_unique<OSExchangeDataProviderAura>();
+ #elif defined(OS_MACOSX)
+ return ui::BuildOSExchangeDataProviderMac();
diff --git a/www/iridium/files/patch-ui_base_ime_init_input__method__initializer.cc b/www/iridium/files/patch-ui_base_ime_init_input__method__initializer.cc
new file mode 100644
index 000000000000..8f3c47ebd01b
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_ime_init_input__method__initializer.cc
@@ -0,0 +1,38 @@
+--- ui/base/ime/init/input_method_initializer.cc.orig 2019-06-04 18:55:49 UTC
++++ ui/base/ime/init/input_method_initializer.cc
+@@ -8,7 +8,7 @@
+
+ #if defined(OS_CHROMEOS)
+ #include "ui/base/ime/ime_bridge.h"
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "base/logging.h"
+ #include "ui/base/ime/linux/fake_input_method_context_factory.h"
+ #elif defined(OS_WIN)
+@@ -18,7 +18,7 @@
+
+ namespace {
+
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ const ui::LinuxInputMethodContextFactory*
+ g_linux_input_method_context_factory_for_testing;
+ #endif
+@@ -46,7 +46,7 @@ void ShutdownInputMethod() {
+ void InitializeInputMethodForTesting() {
+ #if defined(OS_CHROMEOS)
+ IMEBridge::Initialize();
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ if (!g_linux_input_method_context_factory_for_testing)
+ g_linux_input_method_context_factory_for_testing =
+ new FakeInputMethodContextFactory();
+@@ -67,7 +67,7 @@ void InitializeInputMethodForTesting() {
+ void ShutdownInputMethodForTesting() {
+ #if defined(OS_CHROMEOS)
+ IMEBridge::Shutdown();
+-#elif defined(USE_AURA) && defined(OS_LINUX)
++#elif defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ const LinuxInputMethodContextFactory* factory =
+ LinuxInputMethodContextFactory::instance();
+ CHECK(!factory || factory == g_linux_input_method_context_factory_for_testing)
diff --git a/www/iridium/files/patch-ui_base_resource_resource__bundle.cc b/www/iridium/files/patch-ui_base_resource_resource__bundle.cc
new file mode 100644
index 000000000000..91e1320a26f5
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_resource_resource__bundle.cc
@@ -0,0 +1,20 @@
+--- ui/base/resource/resource_bundle.cc.orig 2020-03-16 18:40:15 UTC
++++ ui/base/resource/resource_bundle.cc
+@@ -822,7 +822,7 @@ void ResourceBundle::ReloadFonts() {
+ }
+
+ ScaleFactor ResourceBundle::GetMaxScaleFactor() const {
+-#if defined(OS_WIN) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_BSD)
+ return max_scale_factor_;
+ #else
+ return GetSupportedScaleFactors().back();
+@@ -875,7 +875,7 @@ void ResourceBundle::InitSharedInstance(Delegate* dele
+ // On platforms other than iOS, 100P is always a supported scale factor.
+ // For Windows we have a separate case in this function.
+ supported_scale_factors.push_back(SCALE_FACTOR_100P);
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ supported_scale_factors.push_back(SCALE_FACTOR_200P);
+ #endif
+ #endif
diff --git a/www/iridium/files/patch-ui_base_resource_resource__bundle__freebsd.cc b/www/iridium/files/patch-ui_base_resource_resource__bundle__freebsd.cc
new file mode 100644
index 000000000000..ea5ade19da2e
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_resource_resource__bundle__freebsd.cc
@@ -0,0 +1,24 @@
+--- ui/base/resource/resource_bundle_freebsd.cc.orig 2019-03-17 01:47:14 UTC
++++ ui/base/resource/resource_bundle_freebsd.cc
+@@ -0,0 +1,21 @@
++// Copyright 2017 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 "ui/base/resource/resource_bundle.h"
++
++#include "base/logging.h"
++#include "base/macros.h"
++#include "ui/gfx/image/image.h"
++
++namespace ui {
++
++void ResourceBundle::LoadCommonResources() {
++ LoadChromeResources();
++}
++
++gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
++ return GetImageNamed(resource_id);
++}
++
++} // namespace ui
diff --git a/www/iridium/files/patch-ui_base_ui__base__features.cc b/www/iridium/files/patch-ui_base_ui__base__features.cc
new file mode 100644
index 000000000000..aa850d8e1146
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_ui__base__features.cc
@@ -0,0 +1,20 @@
+--- ui/base/ui_base_features.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/base/ui_base_features.cc
+@@ -113,7 +113,7 @@ const base::Feature kEnableAutomaticUiAdjustmentsForTo
+ "EnableAutomaticUiAdjustmentsForTouch", base::FEATURE_ENABLED_BY_DEFAULT};
+ #endif // defined(OS_WIN) || defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ // Enables stylus appearing as touch when in contact with digitizer.
+ const base::Feature kDirectManipulationStylus = {
+ "DirectManipulationStylus",
+@@ -123,7 +123,7 @@ const base::Feature kDirectManipulationStylus = {
+ base::FEATURE_DISABLED_BY_DEFAULT
+ #endif
+ };
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Disable the FormControlsRefresh feature for all platforms. See
+ // crbug.com/1057669.
diff --git a/www/iridium/files/patch-ui_base_ui__base__features.h b/www/iridium/files/patch-ui_base_ui__base__features.h
new file mode 100644
index 000000000000..d86c205b8c2e
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_ui__base__features.h
@@ -0,0 +1,15 @@
+--- ui/base/ui_base_features.h.orig 2020-03-16 18:40:43 UTC
++++ ui/base/ui_base_features.h
+@@ -61,10 +61,10 @@ COMPONENT_EXPORT(UI_BASE_FEATURES)
+ extern const base::Feature kEnableAutomaticUiAdjustmentsForTouch;
+ #endif // defined(OS_WIN) || defined(OS_CHROMEOS)
+
+-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+ COMPONENT_EXPORT(UI_BASE_FEATURES)
+ extern const base::Feature kDirectManipulationStylus;
+-#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
++#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
+
+ // Used to enable the new controls UI.
+ COMPONENT_EXPORT(UI_BASE_FEATURES)
diff --git a/www/iridium/files/patch-ui_base_webui_web__ui__util.cc b/www/iridium/files/patch-ui_base_webui_web__ui__util.cc
new file mode 100644
index 000000000000..422ea71485b9
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_webui_web__ui__util.cc
@@ -0,0 +1,11 @@
+--- ui/base/webui/web_ui_util.cc.orig 2020-03-16 18:40:15 UTC
++++ ui/base/webui/web_ui_util.cc
+@@ -236,7 +236,7 @@ std::string GetFontFamily() {
+
+ // TODO(dnicoara) Remove Ozone check when PlatformFont support is introduced
+ // into Ozone: crbug.com/320050
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS) && !defined(USE_OZONE)
+ font_family = ui::ResourceBundle::GetSharedInstance().GetFont(
+ ui::ResourceBundle::BaseFont).GetFontName() + ", " + font_family;
+ #endif
diff --git a/www/iridium/files/patch-ui_base_x_x11__shm__image__pool__base.cc b/www/iridium/files/patch-ui_base_x_x11__shm__image__pool__base.cc
new file mode 100644
index 000000000000..7546426f2036
--- /dev/null
+++ b/www/iridium/files/patch-ui_base_x_x11__shm__image__pool__base.cc
@@ -0,0 +1,43 @@
+--- ui/base/x/x11_shm_image_pool_base.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/base/x/x11_shm_image_pool_base.cc
+@@ -16,6 +16,7 @@
+ #include "base/environment.h"
+ #include "base/location.h"
+ #include "base/strings/string_util.h"
++#include "base/system/sys_info.h"
+ #include "base/threading/thread_task_runner_handle.h"
+ #include "build/build_config.h"
+ #include "net/base/url_util.h"
+@@ -44,10 +45,14 @@ constexpr float kShmResizeShrinkThreshold =
+ 1.0f / (kShmResizeThreshold * kShmResizeThreshold);
+
+ std::size_t MaxShmSegmentSizeImpl() {
++#if defined(OS_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() {
+@@ -199,7 +204,7 @@ bool XShmImagePoolBase::Resize(const gfx::Size& pixel_
+ shmctl(state.shminfo_.shmid, IPC_RMID, nullptr);
+ return false;
+ }
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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.
+@@ -209,7 +214,7 @@ bool XShmImagePoolBase::Resize(const gfx::Size& pixel_
+ if (!XShmAttach(display_, &state.shminfo_))
+ return false;
+ state.shmem_attached_to_server_ = true;
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_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.
+ // XShmAttach is asynchronous, so we must also sync.
diff --git a/www/iridium/files/patch-ui_compositor_compositor.cc b/www/iridium/files/patch-ui_compositor_compositor.cc
new file mode 100644
index 000000000000..f89ddbcf2b9f
--- /dev/null
+++ b/www/iridium/files/patch-ui_compositor_compositor.cc
@@ -0,0 +1,11 @@
+--- ui/compositor/compositor.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/compositor/compositor.cc
+@@ -669,7 +669,7 @@ void Compositor::OnFrameTokenChanged(uint32_t frame_to
+ NOTREACHED();
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void Compositor::OnCompleteSwapWithNewSize(const gfx::Size& size) {
+ for (auto& observer : observer_list_)
+ observer.OnCompositingCompleteSwapWithNewSize(this, size);
diff --git a/www/iridium/files/patch-ui_compositor_compositor.h b/www/iridium/files/patch-ui_compositor_compositor.h
new file mode 100644
index 000000000000..89e662bc3e66
--- /dev/null
+++ b/www/iridium/files/patch-ui_compositor_compositor.h
@@ -0,0 +1,11 @@
+--- ui/compositor/compositor.h.orig 2020-03-16 18:40:43 UTC
++++ ui/compositor/compositor.h
+@@ -380,7 +380,7 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerT
+ void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
+ void OnFrameTokenChanged(uint32_t frame_token) override;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ void OnCompleteSwapWithNewSize(const gfx::Size& size);
+ #endif
+
diff --git a/www/iridium/files/patch-ui_compositor_compositor__observer.h b/www/iridium/files/patch-ui_compositor_compositor__observer.h
new file mode 100644
index 000000000000..deab6a8328f8
--- /dev/null
+++ b/www/iridium/files/patch-ui_compositor_compositor__observer.h
@@ -0,0 +1,16 @@
+--- ui/compositor/compositor_observer.h.orig 2019-12-17 19:56:41 UTC
++++ ui/compositor/compositor_observer.h
+@@ -42,11 +42,11 @@ class COMPOSITOR_EXPORT CompositorObserver {
+ // Called when a child of the compositor is resizing.
+ virtual void OnCompositingChildResizing(Compositor* compositor) {}
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ // Called when a swap with new size is completed.
+ virtual void OnCompositingCompleteSwapWithNewSize(ui::Compositor* compositor,
+ const gfx::Size& size) {}
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ // Called at the top of the compositor's destructor, to give observers a
+ // chance to remove themselves.
diff --git a/www/iridium/files/patch-ui_compositor_host_host__context__factory__private.cc b/www/iridium/files/patch-ui_compositor_host_host__context__factory__private.cc
new file mode 100644
index 000000000000..b7be4b020629
--- /dev/null
+++ b/www/iridium/files/patch-ui_compositor_host_host__context__factory__private.cc
@@ -0,0 +1,11 @@
+--- ui/compositor/host/host_context_factory_private.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/compositor/host/host_context_factory_private.cc
+@@ -29,7 +29,7 @@ namespace {
+
+ static const char* kBrowser = "Browser";
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ class HostDisplayClient : public viz::HostDisplayClient {
+ public:
+ explicit HostDisplayClient(ui::Compositor* compositor)
diff --git a/www/iridium/files/patch-ui_events_devices_x11_device__data__manager__x11.cc b/www/iridium/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
new file mode 100644
index 000000000000..df1fa86b3c0d
--- /dev/null
+++ b/www/iridium/files/patch-ui_events_devices_x11_device__data__manager__x11.cc
@@ -0,0 +1,19 @@
+--- ui/events/devices/x11/device_data_manager_x11.cc.orig 2019-09-09 21:55:46 UTC
++++ ui/events/devices/x11/device_data_manager_x11.cc
+@@ -826,6 +826,8 @@ void DeviceDataManagerX11::SetDisabledKeyboardAllowedK
+ }
+
+ void DeviceDataManagerX11::DisableDevice(int deviceid) {
++ NOTIMPLEMENTED();
++#if !defined(OS_BSD)
+ blocked_devices_.set(deviceid, true);
+ // TODO(rsadam@): Support blocking touchscreen devices.
+ std::vector<InputDevice> keyboards = GetKeyboardDevices();
+@@ -836,6 +838,7 @@ void DeviceDataManagerX11::DisableDevice(int deviceid)
+ keyboards.erase(it);
+ DeviceDataManager::OnKeyboardDevicesUpdated(keyboards);
+ }
++#endif
+ }
+
+ void DeviceDataManagerX11::EnableDevice(int deviceid) {
diff --git a/www/iridium/files/patch-ui_events_event__switches.cc b/www/iridium/files/patch-ui_events_event__switches.cc
new file mode 100644
index 000000000000..565f70395687
--- /dev/null
+++ b/www/iridium/files/patch-ui_events_event__switches.cc
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.cc.orig 2019-03-11 22:01:19 UTC
++++ ui/events/event_switches.cc
+@@ -14,7 +14,7 @@ namespace switches {
+ const char kCompensateForUnstablePinchZoom[] =
+ "compensate-for-unstable-pinch-zoom";
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_FREEBSD)
+ // 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/www/iridium/files/patch-ui_events_event__switches.h b/www/iridium/files/patch-ui_events_event__switches.h
new file mode 100644
index 000000000000..e7351a731084
--- /dev/null
+++ b/www/iridium/files/patch-ui_events_event__switches.h
@@ -0,0 +1,11 @@
+--- ui/events/event_switches.h.orig 2019-03-11 22:01:19 UTC
++++ ui/events/event_switches.h
+@@ -13,7 +13,7 @@ namespace switches {
+
+ EVENTS_BASE_EXPORT extern const char kCompensateForUnstablePinchZoom[];
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_FREEBSD)
+ EVENTS_BASE_EXPORT extern const char kTouchDevices[];
+ EVENTS_BASE_EXPORT extern const char kPenDevices[];
+ #endif
diff --git a/www/iridium/files/patch-ui_events_keycodes_dom_keycode__converter.cc b/www/iridium/files/patch-ui_events_keycodes_dom_keycode__converter.cc
new file mode 100644
index 000000000000..2bae1687515b
--- /dev/null
+++ b/www/iridium/files/patch-ui_events_keycodes_dom_keycode__converter.cc
@@ -0,0 +1,11 @@
+--- ui/events/keycodes/dom/keycode_converter.cc.orig 2020-03-16 18:40:15 UTC
++++ ui/events/keycodes/dom/keycode_converter.cc
+@@ -20,7 +20,7 @@ namespace {
+ #if defined(OS_WIN)
+ #define DOM_CODE(usb, evdev, xkb, win, mac, code, id) \
+ { usb, win, code }
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #define DOM_CODE(usb, evdev, xkb, win, mac, code, id) \
+ { usb, xkb, code }
+ #elif defined(OS_MACOSX)
diff --git a/www/iridium/files/patch-ui_gfx_BUILD.gn b/www/iridium/files/patch-ui_gfx_BUILD.gn
new file mode 100644
index 000000000000..be500c1b94d5
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_BUILD.gn
@@ -0,0 +1,11 @@
+--- ui/gfx/BUILD.gn.orig 2020-03-16 18:40:43 UTC
++++ ui/gfx/BUILD.gn
+@@ -578,7 +578,7 @@ jumbo_source_set("memory_buffer_sources") {
+ deps += [ "//build/config/linux/libdrm" ]
+ }
+
+- if (is_linux || is_android) {
++ if ((is_linux || is_android) && !is_bsd) {
+ deps += [ "//third_party/libsync" ]
+ }
+
diff --git a/www/iridium/files/patch-ui_gfx_canvas__skia.cc b/www/iridium/files/patch-ui_gfx_canvas__skia.cc
new file mode 100644
index 000000000000..5d99916e4eb1
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_canvas__skia.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/canvas_skia.cc.orig 2020-02-03 21:53:13 UTC
++++ ui/gfx/canvas_skia.cc
+@@ -206,7 +206,7 @@ void Canvas::DrawStringRectWithFlags(const base::strin
+ Range range = StripAcceleratorChars(flags, &adjusted_text);
+ bool elide_text = ((flags & NO_ELLIPSIS) == 0);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-ui_gfx_codec_jpeg__codec.cc b/www/iridium/files/patch-ui_gfx_codec_jpeg__codec.cc
new file mode 100644
index 000000000000..1bd5ac55ec9e
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_codec_jpeg__codec.cc
@@ -0,0 +1,20 @@
+--- ui/gfx/codec/jpeg_codec.cc.orig 2019-03-11 22:01:19 UTC
++++ ui/gfx/codec/jpeg_codec.cc
+@@ -207,6 +207,7 @@ bool JPEGCodec::Decode(const unsigned char* input, siz
+ case JCS_GRAYSCALE:
+ case JCS_RGB:
+ case JCS_YCbCr:
++#ifdef JCS_EXTENSIONS
+ // Choose an output colorspace and return if it is an unsupported one.
+ // Same as JPEGCodec::Encode(), libjpeg-turbo supports all input formats
+ // used by Chromium (i.e. RGBA and BGRA) and we just map the input
+@@ -223,6 +224,9 @@ bool JPEGCodec::Decode(const unsigned char* input, siz
+ NOTREACHED() << "Invalid pixel format";
+ return false;
+ }
++#else
++ cinfo.out_color_space = JCS_RGB;
++#endif
+ break;
+ case JCS_CMYK:
+ case JCS_YCCK:
diff --git a/www/iridium/files/patch-ui_gfx_font__fallback__linux.cc b/www/iridium/files/patch-ui_gfx_font__fallback__linux.cc
new file mode 100644
index 000000000000..26597a5d4cb2
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_font__fallback__linux.cc
@@ -0,0 +1,13 @@
+--- ui/gfx/font_fallback_linux.cc.orig 2019-12-16 21:51:34 UTC
++++ ui/gfx/font_fallback_linux.cc
+@@ -24,6 +24,10 @@
+ #include "ui/gfx/linux/fontconfig_util.h"
+ #include "ui/gfx/platform_font.h"
+
++#if defined(OS_BSD)
++#include <unistd.h>
++#endif
++
+ namespace gfx {
+
+ namespace {
diff --git a/www/iridium/files/patch-ui_gfx_font__list.cc b/www/iridium/files/patch-ui_gfx_font__list.cc
new file mode 100644
index 000000000000..542476a0c3e2
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_font__list.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/font_list.cc.orig 2019-03-11 22:01:19 UTC
++++ ui/gfx/font_list.cc
+@@ -24,7 +24,7 @@ base::LazyInstance<scoped_refptr<gfx::FontListImpl>>::
+ bool g_default_impl_initialized = false;
+
+ bool IsFontFamilyAvailable(const std::string& family, SkFontMgr* fontManager) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return !!fontManager->legacyMakeTypeface(family.c_str(), SkFontStyle());
+ #else
+ sk_sp<SkFontStyleSet> set(fontManager->matchFamily(family.c_str()));
diff --git a/www/iridium/files/patch-ui_gfx_font__names__testing.cc b/www/iridium/files/patch-ui_gfx_font__names__testing.cc
new file mode 100644
index 000000000000..2c268488ae30
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_font__names__testing.cc
@@ -0,0 +1,29 @@
+--- ui/gfx/font_names_testing.cc.orig 2020-04-06 08:38:05 UTC
++++ ui/gfx/font_names_testing.cc
+@@ -22,7 +22,7 @@ Note that we have to support the full range from Jelly
+ dessert.
+ */
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ const char kTestFontName[] = "Arimo";
+ #elif defined(OS_ANDROID)
+ const char kTestFontName[] = "sans-serif";
+@@ -30,7 +30,7 @@ const char kTestFontName[] = "sans-serif";
+ const char kTestFontName[] = "Arial";
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ const char kSymbolFontName[] = "DejaVu Sans";
+ #elif defined(OS_ANDROID)
+ const char kSymbolFontName[] = "monospace";
+@@ -40,7 +40,7 @@ const char kSymbolFontName[] = "Segoe UI Symbol";
+ const char kSymbolFontName[] = "Symbol";
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ const char kCJKFontName[] = "Noto Sans CJK JP";
+ #elif defined(OS_ANDROID)
+ const char kCJKFontName[] = "serif";
diff --git a/www/iridium/files/patch-ui_gfx_font__render__params.h b/www/iridium/files/patch-ui_gfx_font__render__params.h
new file mode 100644
index 000000000000..5f0bb35c60b5
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_font__render__params.h
@@ -0,0 +1,18 @@
+--- ui/gfx/font_render_params.h.orig 2019-07-24 18:59:22 UTC
++++ ui/gfx/font_render_params.h
+@@ -111,13 +111,13 @@ GFX_EXPORT FontRenderParams GetFontRenderParams(
+ const FontRenderParamsQuery& query,
+ std::string* family_out);
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Clears GetFontRenderParams()'s cache. Intended to be called by tests that are
+ // changing Fontconfig's configuration.
+ GFX_EXPORT void ClearFontRenderParamsCacheForTest();
+ #endif
+
+-#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || \
++#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD) || \
+ defined(OS_FUCHSIA)
+ // Gets the device scale factor to query the FontRenderParams.
+ GFX_EXPORT float GetFontRenderParamsDeviceScaleFactor();
diff --git a/www/iridium/files/patch-ui_gfx_font__util.cc b/www/iridium/files/patch-ui_gfx_font__util.cc
new file mode 100644
index 000000000000..70270c4ee997
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_font__util.cc
@@ -0,0 +1,25 @@
+--- ui/gfx/font_util.cc.orig 2019-12-17 19:58:26 UTC
++++ ui/gfx/font_util.cc
+@@ -6,7 +6,7 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <fontconfig/fontconfig.h>
+ #include "ui/gfx/linux/fontconfig_util.h"
+ #endif
+@@ -24,11 +24,11 @@ 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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Ensures the config is created on this thread.
+ FcConfig* config = GetGlobalFontConfig();
+ DCHECK(config);
+-#endif // OS_LINUX
++#endif // OS_LINUX || OS_BSD
+
+ #if defined(OS_WIN)
+ gfx::win::InitializeDirectWrite();
diff --git a/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.cc b/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.cc
new file mode 100644
index 000000000000..fe42d4a3bace
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.cc
@@ -0,0 +1,11 @@
+--- ui/gfx/gpu_memory_buffer.cc.orig 2019-12-17 19:59:38 UTC
++++ ui/gfx/gpu_memory_buffer.cc
+@@ -28,7 +28,7 @@ GpuMemoryBufferHandle GpuMemoryBufferHandle::Clone() c
+ handle.region = region.Duplicate();
+ handle.offset = offset;
+ handle.stride = stride;
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ handle.native_pixmap_handle = CloneHandleForIPC(native_pixmap_handle);
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
+ NOTIMPLEMENTED();
diff --git a/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.h b/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.h
new file mode 100644
index 000000000000..a05a77674080
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_gpu__memory__buffer.h
@@ -0,0 +1,20 @@
+--- ui/gfx/gpu_memory_buffer.h.orig 2020-02-03 21:53:13 UTC
++++ ui/gfx/gpu_memory_buffer.h
+@@ -15,7 +15,7 @@
+ #include "ui/gfx/geometry/rect.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if defined(USE_OZONE) || defined(OS_LINUX)
++#if defined(USE_OZONE) || defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
+ #include "ui/gfx/mac/io_surface.h"
+@@ -65,7 +65,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
+ base::UnsafeSharedMemoryRegion region;
+ uint32_t offset;
+ int32_t stride;
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ NativePixmapHandle native_pixmap_handle;
+ #elif defined(OS_MACOSX) && !defined(OS_IOS)
+ ScopedRefCountedIOSurfaceMachPort mach_port;
diff --git a/www/iridium/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h b/www/iridium/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h
new file mode 100644
index 000000000000..22be111486c5
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_ipc_gfx__param__traits__macros.h
@@ -0,0 +1,44 @@
+--- ui/gfx/ipc/gfx_param_traits_macros.h.orig 2019-10-21 19:07:29 UTC
++++ ui/gfx/ipc/gfx_param_traits_macros.h
+@@ -18,7 +18,7 @@
+ #include "ui/gfx/selection_bound.h"
+ #include "ui/gfx/swap_result.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "ui/gfx/native_pixmap_handle.h"
+ #endif
+
+@@ -51,7 +51,7 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferHandle)
+ IPC_STRUCT_TRAITS_MEMBER(region)
+ IPC_STRUCT_TRAITS_MEMBER(offset)
+ IPC_STRUCT_TRAITS_MEMBER(stride)
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_MEMBER(native_pixmap_handle)
+ #elif defined(OS_MACOSX)
+ IPC_STRUCT_TRAITS_MEMBER(mach_port)
+@@ -66,12 +66,12 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferId)
+ IPC_STRUCT_TRAITS_MEMBER(id)
+ IPC_STRUCT_TRAITS_END()
+
+-#if defined(OS_LINUX) || defined(OS_FUCHSIA)
++#if defined(OS_LINUX) || defined(OS_FUCHSIA) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_BEGIN(gfx::NativePixmapPlane)
+ IPC_STRUCT_TRAITS_MEMBER(stride)
+ IPC_STRUCT_TRAITS_MEMBER(offset)
+ IPC_STRUCT_TRAITS_MEMBER(size)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_MEMBER(fd)
+ #elif defined(OS_FUCHSIA)
+ IPC_STRUCT_TRAITS_MEMBER(vmo)
+@@ -80,7 +80,7 @@ IPC_STRUCT_TRAITS_END()
+
+ IPC_STRUCT_TRAITS_BEGIN(gfx::NativePixmapHandle)
+ IPC_STRUCT_TRAITS_MEMBER(planes)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ IPC_STRUCT_TRAITS_MEMBER(modifier)
+ #endif
+ #if defined(OS_FUCHSIA)
diff --git a/www/iridium/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc b/www/iridium/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc
new file mode 100644
index 000000000000..1741c4d863e8
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_linux_client__native__pixmap__dmabuf.cc
@@ -0,0 +1,25 @@
+--- ui/gfx/linux/client_native_pixmap_dmabuf.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/gfx/linux/client_native_pixmap_dmabuf.cc
+@@ -5,7 +5,9 @@
+ #include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
+
+ #include <fcntl.h>
++#if !defined(__FreeBSD__)
+ #include <linux/version.h>
++#endif
+ #include <stddef.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+@@ -26,11 +28,7 @@
+ #include "ui/gfx/buffer_format_util.h"
+ #include "ui/gfx/switches.h"
+
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+-#include <linux/dma-buf.h>
+-#else
+-#include <linux/types.h>
+-
++#if defined(__FreeBSD__)
+ struct dma_buf_sync {
+ __u64 flags;
+ };
diff --git a/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc b/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc
new file mode 100644
index 000000000000..a2a977047d43
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.cc
@@ -0,0 +1,75 @@
+--- ui/gfx/mojom/buffer_types_mojom_traits.cc.orig 2019-10-30 16:33:03 UTC
++++ ui/gfx/mojom/buffer_types_mojom_traits.cc
+@@ -24,15 +24,15 @@ bool StructTraits<gfx::mojom::BufferUsageAndFormatData
+ return data.ReadUsage(&out->usage) && data.ReadFormat(&out->format);
+ }
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ mojo::ScopedHandle StructTraits<
+ gfx::mojom::NativePixmapPlaneDataView,
+ gfx::NativePixmapPlane>::buffer_handle(gfx::NativePixmapPlane& plane) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return mojo::WrapPlatformFile(plane.fd.release());
+ #elif defined(OS_FUCHSIA)
+ return mojo::WrapPlatformHandle(mojo::PlatformHandle(std::move(plane.vmo)));
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ bool StructTraits<
+@@ -45,7 +45,7 @@ bool StructTraits<
+
+ mojo::PlatformHandle handle =
+ mojo::UnwrapPlatformHandle(data.TakeBufferHandle());
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ if (!handle.is_fd())
+ return false;
+ out->fd = handle.TakeFD();
+@@ -53,7 +53,7 @@ bool StructTraits<
+ if (!handle.is_handle())
+ return false;
+ out->vmo = zx::vmo(handle.TakeHandle());
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ return true;
+ }
+@@ -62,7 +62,7 @@ bool StructTraits<
+ gfx::mojom::NativePixmapHandleDataView,
+ gfx::NativePixmapHandle>::Read(gfx::mojom::NativePixmapHandleDataView data,
+ gfx::NativePixmapHandle* out) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ out->modifier = data.modifier();
+ #endif
+
+@@ -75,7 +75,7 @@ bool StructTraits<
+
+ return data.ReadPlanes(&out->planes);
+ }
+-#endif // defined(OS_LINUX) || defined(USE_OZONE)
++#endif // defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+
+ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTraits<
+ gfx::mojom::GpuMemoryBufferHandleDataView,
+@@ -88,7 +88,7 @@ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTra
+ return gfx::mojom::GpuMemoryBufferPlatformHandle::NewSharedMemoryHandle(
+ std::move(handle.region));
+ case gfx::NATIVE_PIXMAP:
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ return gfx::mojom::GpuMemoryBufferPlatformHandle::NewNativePixmapHandle(
+ std::move(handle.native_pixmap_handle));
+ #else
+@@ -164,7 +164,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 defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ case gfx::mojom::GpuMemoryBufferPlatformHandleDataView::Tag::
+ NATIVE_PIXMAP_HANDLE:
+ out->type = gfx::NATIVE_PIXMAP;
diff --git a/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.h b/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.h
new file mode 100644
index 000000000000..b7e56d150e01
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_mojom_buffer__types__mojom__traits.h
@@ -0,0 +1,29 @@
+--- ui/gfx/mojom/buffer_types_mojom_traits.h.orig 2019-12-16 21:51:08 UTC
++++ ui/gfx/mojom/buffer_types_mojom_traits.h
+@@ -194,7 +194,7 @@ struct StructTraits<gfx::mojom::GpuMemoryBufferIdDataV
+ }
+ };
+
+-#if defined(OS_LINUX) || defined(USE_OZONE)
++#if defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+ template <>
+ struct StructTraits<gfx::mojom::NativePixmapPlaneDataView,
+ gfx::NativePixmapPlane> {
+@@ -220,7 +220,7 @@ struct StructTraits<gfx::mojom::NativePixmapHandleData
+ return pixmap_handle.planes;
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ static uint64_t modifier(const gfx::NativePixmapHandle& pixmap_handle) {
+ return pixmap_handle.modifier;
+ }
+@@ -244,7 +244,7 @@ struct StructTraits<gfx::mojom::NativePixmapHandleData
+ static bool Read(gfx::mojom::NativePixmapHandleDataView data,
+ gfx::NativePixmapHandle* out);
+ };
+-#endif // defined(OS_LINUX) || defined(USE_OZONE)
++#endif // defined(OS_LINUX) || defined(OS_BSD) || defined(USE_OZONE)
+
+ template <>
+ struct StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
diff --git a/www/iridium/files/patch-ui_gfx_native__pixmap__handle.cc b/www/iridium/files/patch-ui_gfx_native__pixmap__handle.cc
new file mode 100644
index 000000000000..20952718c93d
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_native__pixmap__handle.cc
@@ -0,0 +1,64 @@
+--- ui/gfx/native_pixmap_handle.cc.orig 2020-02-24 18:39:44 UTC
++++ ui/gfx/native_pixmap_handle.cc
+@@ -8,11 +8,15 @@
+
+ #include "build/build_config.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include <drm_fourcc.h>
+ #include "base/posix/eintr_wrapper.h"
+ #endif
+
++#if defined(OS_BSD)
++#include <unistd.h>
++#endif
++
+ #if defined(OS_FUCHSIA)
+ #include <lib/zx/vmo.h>
+ #include "base/fuchsia/fuchsia_logging.h"
+@@ -20,7 +24,7 @@
+
+ namespace gfx {
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ static_assert(NativePixmapHandle::kNoModifier == DRM_FORMAT_MOD_INVALID,
+ "gfx::NativePixmapHandle::kNoModifier should be an alias for"
+ "DRM_FORMAT_MOD_INVALID");
+@@ -31,7 +35,7 @@ NativePixmapPlane::NativePixmapPlane() : stride(0), of
+ NativePixmapPlane::NativePixmapPlane(int stride,
+ int offset,
+ uint64_t size
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ base::ScopedFD fd
+ #elif defined(OS_FUCHSIA)
+@@ -42,7 +46,7 @@ NativePixmapPlane::NativePixmapPlane(int stride,
+ : stride(stride),
+ offset(offset),
+ size(size)
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ fd(std::move(fd))
+ #elif defined(OS_FUCHSIA)
+@@ -70,7 +74,7 @@ NativePixmapHandle& NativePixmapHandle::operator=(Nati
+ NativePixmapHandle CloneHandleForIPC(const NativePixmapHandle& handle) {
+ NativePixmapHandle clone;
+ for (auto& plane : handle.planes) {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ DCHECK(plane.fd.is_valid());
+ base::ScopedFD fd_dup(HANDLE_EINTR(dup(plane.fd.get())));
+ if (!fd_dup.is_valid()) {
+@@ -96,7 +100,7 @@ NativePixmapHandle CloneHandleForIPC(const NativePixma
+ #endif
+ }
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ clone.modifier = handle.modifier;
+ #endif
+
diff --git a/www/iridium/files/patch-ui_gfx_native__pixmap__handle.h b/www/iridium/files/patch-ui_gfx_native__pixmap__handle.h
new file mode 100644
index 000000000000..6306e267fbeb
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_native__pixmap__handle.h
@@ -0,0 +1,38 @@
+--- ui/gfx/native_pixmap_handle.h.orig 2019-10-21 19:07:29 UTC
++++ ui/gfx/native_pixmap_handle.h
+@@ -15,7 +15,7 @@
+ #include "build/build_config.h"
+ #include "ui/gfx/gfx_export.h"
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/files/scoped_file.h"
+ #endif
+
+@@ -32,7 +32,7 @@ struct GFX_EXPORT NativePixmapPlane {
+ NativePixmapPlane(int stride,
+ int offset,
+ uint64_t size
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ ,
+ base::ScopedFD fd
+ #elif defined(OS_FUCHSIA)
+@@ -53,7 +53,7 @@ struct GFX_EXPORT NativePixmapPlane {
+ // This is necessary to map the buffers.
+ uint64_t size;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // File descriptor for the underlying memory object (usually dmabuf).
+ base::ScopedFD fd;
+ #elif defined(OS_FUCHSIA)
+@@ -82,7 +82,7 @@ struct GFX_EXPORT NativePixmapHandle {
+
+ std::vector<NativePixmapPlane> planes;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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/www/iridium/files/patch-ui_gfx_render__text.cc b/www/iridium/files/patch-ui_gfx_render__text.cc
new file mode 100644
index 000000000000..446317a3101a
--- /dev/null
+++ b/www/iridium/files/patch-ui_gfx_render__text.cc
@@ -0,0 +1,46 @@
+--- ui/gfx/render_text.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/gfx/render_text.cc
+@@ -1169,32 +1169,33 @@ void RenderText::SetDisplayOffset(int horizontal_offse
+ const int extra_content = GetContentWidth() - display_rect_.width();
+ const int cursor_width = cursor_enabled_ ? 1 : 0;
+
+- int min_offset = 0;
+- int max_offset = 0;
++ // avoid collisions with vm_map.h on FreeBSD --cmt
++ int _min_offset = 0;
++ int _max_offset = 0;
+ if (extra_content > 0) {
+ switch (GetCurrentHorizontalAlignment()) {
+ case ALIGN_LEFT:
+- min_offset = -extra_content;
++ _min_offset = -extra_content;
+ break;
+ case ALIGN_RIGHT:
+- max_offset = extra_content;
++ _max_offset = extra_content;
+ break;
+ case ALIGN_CENTER:
+ // The extra space reserved for cursor at the end of the text is ignored
+ // when centering text. So, to calculate the valid range for offset, we
+ // exclude that extra space, calculate the range, and add it back to the
+ // range (if cursor is enabled).
+- min_offset = -(extra_content - cursor_width + 1) / 2 - cursor_width;
+- max_offset = (extra_content - cursor_width) / 2;
++ _min_offset = -(extra_content - cursor_width + 1) / 2 - cursor_width;
++ _max_offset = (extra_content - cursor_width) / 2;
+ break;
+ default:
+ break;
+ }
+ }
+- if (horizontal_offset < min_offset)
+- horizontal_offset = min_offset;
+- else if (horizontal_offset > max_offset)
+- horizontal_offset = max_offset;
++ if (horizontal_offset < _min_offset)
++ horizontal_offset = _min_offset;
++ else if (horizontal_offset > _max_offset)
++ horizontal_offset = _max_offset;
+
+ cached_bounds_and_offset_valid_ = true;
+ display_offset_.set_x(horizontal_offset);
diff --git a/www/iridium/files/patch-ui_gl_BUILD.gn b/www/iridium/files/patch-ui_gl_BUILD.gn
new file mode 100644
index 000000000000..39f08eacf39a
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_BUILD.gn
@@ -0,0 +1,11 @@
+--- ui/gl/BUILD.gn.orig 2020-03-16 18:40:43 UTC
++++ ui/gl/BUILD.gn
+@@ -233,7 +233,7 @@ jumbo_component("gl") {
+ ]
+ }
+
+- if (is_posix && !is_fuchsia && !is_mac) {
++ if (is_posix && !is_fuchsia && !is_mac && !is_bsd) {
+ # Windows has USE_EGL but doesn't support base::FileDescriptor.
+ # libsync isn't supported or needed on MacOSX.
+ # Fuchsia is excluded due to a libsync dependency and because it's
diff --git a/www/iridium/files/patch-ui_gl_generate__bindings.py b/www/iridium/files/patch-ui_gl_generate__bindings.py
new file mode 100644
index 000000000000..c3ea0a6c23a3
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_generate__bindings.py
@@ -0,0 +1,12 @@
+--- ui/gl/generate_bindings.py.orig 2020-03-16 18:40:43 UTC
++++ ui/gl/generate_bindings.py
+@@ -2777,6 +2777,9 @@ GLX_FUNCTIONS = [
+ 'arguments':
+ 'Display* dpy, GLXDrawable drawable, int32_t* numerator, '
+ 'int32_t* denominator' },
++{ 'return_type': '__GLXextFuncPtr',
++ 'names': ['glXGetProcAddressARB'],
++ 'arguments': 'const GLubyte* procName', },
+ { 'return_type': 'void',
+ 'names': ['glXGetSelectedEvent'],
+ 'arguments': 'Display* dpy, GLXDrawable drawable, unsigned long* mask', },
diff --git a/www/iridium/files/patch-ui_gl_gl__bindings__api__autogen__glx.h b/www/iridium/files/patch-ui_gl_gl__bindings__api__autogen__glx.h
new file mode 100644
index 000000000000..c51dba36aabe
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_gl__bindings__api__autogen__glx.h
@@ -0,0 +1,10 @@
+--- ui/gl/gl_bindings_api_autogen_glx.h.orig 2019-03-11 22:01:19 UTC
++++ ui/gl/gl_bindings_api_autogen_glx.h
+@@ -88,6 +88,7 @@ bool glXGetMscRateOMLFn(Display* dpy,
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator) override;
++__GLXextFuncPtr glXGetProcAddressARBFn(const GLubyte* procName) override;
+ void glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) override;
diff --git a/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.cc b/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.cc
new file mode 100644
index 000000000000..4aeda03a0414
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.cc
@@ -0,0 +1,61 @@
+--- ui/gl/gl_bindings_autogen_glx.cc.orig 2020-02-24 18:39:44 UTC
++++ ui/gl/gl_bindings_autogen_glx.cc
+@@ -115,6 +115,8 @@ void DriverGLX::InitializeExtensionBindings() {
+
+ ext.b_GLX_ARB_create_context =
+ gfx::HasExtension(extensions, "GLX_ARB_create_context");
++ ext.b_GLX_ARB_get_proc_address =
++ gfx::HasExtension(extensions, "GLX_ARB_get_proc_address");
+ ext.b_GLX_EXT_swap_control =
+ gfx::HasExtension(extensions, "GLX_EXT_swap_control");
+ ext.b_GLX_EXT_texture_from_pixmap =
+@@ -145,6 +147,11 @@ void DriverGLX::InitializeExtensionBindings() {
+ GetGLProcAddress("glXCreateContextAttribsARB"));
+ }
+
++ if (ext.b_GLX_ARB_get_proc_address) {
++ fn.glXGetProcAddressARBFn = reinterpret_cast<glXGetProcAddressARBProc>(
++ GetGLProcAddress("glXGetProcAddressARB"));
++ }
++
+ if (ext.b_GLX_SGIX_fbconfig) {
+ fn.glXGetFBConfigFromVisualSGIXFn =
+ reinterpret_cast<glXGetFBConfigFromVisualSGIXProc>(
+@@ -346,6 +353,10 @@ bool GLXApiBase::glXGetMscRateOMLFn(Display* dpy,
+ return driver_->fn.glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+ }
+
++__GLXextFuncPtr GLXApiBase::glXGetProcAddressARBFn(const GLubyte* procName) {
++ return driver_->fn.glXGetProcAddressARBFn(procName);
++}
++
+ void GLXApiBase::glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) {
+@@ -647,6 +658,11 @@ bool TraceGLXApi::glXGetMscRateOMLFn(Display* dpy,
+ return glx_api_->glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
+ }
+
++__GLXextFuncPtr TraceGLXApi::glXGetProcAddressARBFn(const GLubyte* procName) {
++ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glXGetProcAddressARB")
++ return glx_api_->glXGetProcAddressARBFn(procName);
++}
++
+ void TraceGLXApi::glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) {
+@@ -1068,6 +1084,14 @@ bool LogGLXApi::glXGetMscRateOMLFn(Display* dpy,
+ << static_cast<const void*>(denominator) << ")");
+ bool result =
+ glx_api_->glXGetMscRateOMLFn(dpy, drawable, numerator, denominator);
++ GL_SERVICE_LOG("GL_RESULT: " << result);
++ return result;
++}
++
++__GLXextFuncPtr LogGLXApi::glXGetProcAddressARBFn(const GLubyte* procName) {
++ GL_SERVICE_LOG("glXGetProcAddressARB"
++ << "(" << static_cast<const void*>(procName) << ")");
++ __GLXextFuncPtr result = glx_api_->glXGetProcAddressARBFn(procName);
+ GL_SERVICE_LOG("GL_RESULT: " << result);
+ return result;
+ }
diff --git a/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.h b/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.h
new file mode 100644
index 000000000000..e95b9179865e
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_gl__bindings__autogen__glx.h
@@ -0,0 +1,43 @@
+--- ui/gl/gl_bindings_autogen_glx.h.orig 2019-03-11 22:01:19 UTC
++++ ui/gl/gl_bindings_autogen_glx.h
+@@ -104,6 +104,8 @@ typedef bool(GL_BINDING_CALL* glXGetMscRateOMLProc)(Di
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator);
++typedef __GLXextFuncPtr(GL_BINDING_CALL* glXGetProcAddressARBProc)(
++ const GLubyte* procName);
+ typedef void(GL_BINDING_CALL* glXGetSelectedEventProc)(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask);
+@@ -166,6 +168,7 @@ typedef void(GL_BINDING_CALL* glXWaitXProc)(void);
+
+ struct ExtensionsGLX {
+ bool b_GLX_ARB_create_context;
++ bool b_GLX_ARB_get_proc_address;
+ bool b_GLX_EXT_swap_control;
+ bool b_GLX_EXT_texture_from_pixmap;
+ bool b_GLX_MESA_copy_sub_buffer;
+@@ -203,6 +206,7 @@ struct ProcsGLX {
+ glXGetFBConfigFromVisualSGIXProc glXGetFBConfigFromVisualSGIXFn;
+ glXGetFBConfigsProc glXGetFBConfigsFn;
+ glXGetMscRateOMLProc glXGetMscRateOMLFn;
++ glXGetProcAddressARBProc glXGetProcAddressARBFn;
+ glXGetSelectedEventProc glXGetSelectedEventFn;
+ glXGetSyncValuesOMLProc glXGetSyncValuesOMLFn;
+ glXGetVisualFromFBConfigProc glXGetVisualFromFBConfigFn;
+@@ -310,6 +314,7 @@ class GL_EXPORT GLXApi {
+ GLXDrawable drawable,
+ int32_t* numerator,
+ int32_t* denominator) = 0;
++ virtual __GLXextFuncPtr glXGetProcAddressARBFn(const GLubyte* procName) = 0;
+ virtual void glXGetSelectedEventFn(Display* dpy,
+ GLXDrawable drawable,
+ unsigned long* mask) = 0;
+@@ -394,6 +399,7 @@ class GL_EXPORT GLXApi {
+ ::gl::g_current_glx_context->glXGetFBConfigFromVisualSGIXFn
+ #define glXGetFBConfigs ::gl::g_current_glx_context->glXGetFBConfigsFn
+ #define glXGetMscRateOML ::gl::g_current_glx_context->glXGetMscRateOMLFn
++#define glXGetProcAddressARB ::gl::g_current_glx_context->glXGetProcAddressARBFn
+ #define glXGetSelectedEvent ::gl::g_current_glx_context->glXGetSelectedEventFn
+ #define glXGetSyncValuesOML ::gl::g_current_glx_context->glXGetSyncValuesOMLFn
+ #define glXGetVisualFromFBConfig \
diff --git a/www/iridium/files/patch-ui_gl_gl__fence.cc b/www/iridium/files/patch-ui_gl_gl__fence.cc
new file mode 100644
index 000000000000..5ba84b4bdb36
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_gl__fence.cc
@@ -0,0 +1,11 @@
+--- ui/gl/gl_fence.cc.orig 2019-03-11 22:01:19 UTC
++++ ui/gl/gl_fence.cc
+@@ -18,7 +18,7 @@
+ #include "ui/gl/gl_fence_apple.h"
+ #endif
+
+-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_MACOSX)
++#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD)
+ #define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC
+ #include "ui/gl/gl_fence_android_native_fence_sync.h"
+ #include "ui/gl/gl_surface_egl.h"
diff --git a/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.cc b/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.cc
new file mode 100644
index 000000000000..7295d4c6df5e
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.cc
@@ -0,0 +1,43 @@
+--- ui/gl/sync_control_vsync_provider.cc.orig 2019-04-30 22:23:42 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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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
+@@ -156,11 +156,11 @@ bool SyncControlVSyncProvider::GetVSyncParametersIfAva
+ return true;
+ #else
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ bool SyncControlVSyncProvider::SupportGetVSyncParametersIfAvailable() const {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
diff --git a/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.h b/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.h
new file mode 100644
index 000000000000..4321d70a7288
--- /dev/null
+++ b/www/iridium/files/patch-ui_gl_sync__control__vsync__provider.h
@@ -0,0 +1,34 @@
+--- ui/gl/sync_control_vsync_provider.h.orig 2019-03-11 22:01:19 UTC
++++ ui/gl/sync_control_vsync_provider.h
+@@ -26,11 +26,11 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ bool SupportGetVSyncParametersIfAvailable() const override;
+
+ static constexpr bool IsSupported() {
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return true;
+ #else
+ return false;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+ }
+
+ protected:
+@@ -41,7 +41,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ virtual bool GetMscRate(int32_t* numerator, int32_t* denominator) = 0;
+
+ private:
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ base::TimeTicks last_timebase_;
+ uint64_t last_media_stream_counter_ = 0;
+ base::TimeDelta last_good_interval_;
+@@ -52,7 +52,7 @@ class SyncControlVSyncProvider : public gfx::VSyncProv
+ // from configuration change (monitor reconfiguration, moving windows
+ // between monitors, suspend and resume, etc.).
+ base::queue<base::TimeDelta> last_computed_intervals_;
+-#endif // defined(OS_LINUX)
++#endif // defined(OS_LINUX) || defined(OS_BSD)
+
+ DISALLOW_COPY_AND_ASSIGN(SyncControlVSyncProvider);
+ };
diff --git a/www/iridium/files/patch-ui_message__center_public_cpp_message__center__constants.h b/www/iridium/files/patch-ui_message__center_public_cpp_message__center__constants.h
new file mode 100644
index 000000000000..8f993bfbfbc6
--- /dev/null
+++ b/www/iridium/files/patch-ui_message__center_public_cpp_message__center__constants.h
@@ -0,0 +1,11 @@
+--- ui/message_center/public/cpp/message_center_constants.h.orig 2019-06-04 18:55:50 UTC
++++ ui/message_center/public/cpp/message_center_constants.h
+@@ -105,7 +105,7 @@ const int kButtonHorizontalPadding = 16; // In DIPs.
+ const int kButtonIconTopPadding = 11; // In DIPs.
+ const int kButtonIconToTitlePadding = 16; // In DIPs.
+
+-#if !defined(OS_LINUX) || defined(USE_AURA)
++#if (!defined(OS_LINUX) && !defined(OS_BSD)) || defined(USE_AURA)
+ constexpr SkColor kButtonSeparatorColor = SkColorSetRGB(234, 234, 234);
+ constexpr SkColor kHoveredButtonBackgroundColor = SkColorSetRGB(243, 243, 243);
+ #endif
diff --git a/www/iridium/files/patch-ui_message__center_views_message__popup__view.cc b/www/iridium/files/patch-ui_message__center_views_message__popup__view.cc
new file mode 100644
index 000000000000..7037f8a47604
--- /dev/null
+++ b/www/iridium/files/patch-ui_message__center_views_message__popup__view.cc
@@ -0,0 +1,11 @@
+--- ui/message_center/views/message_popup_view.cc.orig 2019-12-16 21:51:34 UTC
++++ ui/message_center/views/message_popup_view.cc
+@@ -101,7 +101,7 @@ void MessagePopupView::AutoCollapse() {
+ void MessagePopupView::Show() {
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
+ params.z_order = ui::ZOrderLevel::kFloatingWindow;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_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_YES;
diff --git a/www/iridium/files/patch-ui_native__theme_native__theme.h b/www/iridium/files/patch-ui_native__theme_native__theme.h
new file mode 100644
index 000000000000..af4951e7fb10
--- /dev/null
+++ b/www/iridium/files/patch-ui_native__theme_native__theme.h
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme.h.orig 2019-10-21 19:07:29 UTC
++++ ui/native_theme/native_theme.h
+@@ -49,7 +49,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
+ // The part to be painted / sized.
+ enum Part {
+ kCheckbox,
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ kFrameTopArea,
+ #endif
+ kInnerSpinButton,
diff --git a/www/iridium/files/patch-ui_native__theme_native__theme__base.cc b/www/iridium/files/patch-ui_native__theme_native__theme__base.cc
new file mode 100644
index 000000000000..96f69fe1f796
--- /dev/null
+++ b/www/iridium/files/patch-ui_native__theme_native__theme__base.cc
@@ -0,0 +1,11 @@
+--- ui/native_theme/native_theme_base.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/native_theme/native_theme_base.cc
+@@ -256,7 +256,7 @@ void NativeThemeBase::Paint(cc::PaintCanvas* canvas,
+ case kCheckbox:
+ PaintCheckbox(canvas, state, rect, extra.button, color_scheme);
+ break;
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ case kFrameTopArea:
+ PaintFrameTopArea(canvas, state, rect, extra.frame_top_area,
+ color_scheme);
diff --git a/www/iridium/files/patch-ui_platform__window_platform__window__init__properties.h b/www/iridium/files/patch-ui_platform__window_platform__window__init__properties.h
new file mode 100644
index 000000000000..78b9f0444781
--- /dev/null
+++ b/www/iridium/files/patch-ui_platform__window_platform__window__init__properties.h
@@ -0,0 +1,20 @@
+--- ui/platform_window/platform_window_init_properties.h.orig 2020-02-24 18:40:16 UTC
++++ ui/platform_window/platform_window_init_properties.h
+@@ -41,7 +41,7 @@ enum class PlatformWindowOpacity {
+
+ class WorkspaceExtensionDelegate;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ class X11ExtensionDelegate;
+ #endif
+
+@@ -82,7 +82,7 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindo
+
+ WorkspaceExtensionDelegate* workspace_extension_delegate = nullptr;
+
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ bool prefer_dark_theme = false;
+ gfx::ImageSkia* icon = nullptr;
+ base::Optional<int> background_color;
diff --git a/www/iridium/files/patch-ui_strings_app__locale__settings.grd b/www/iridium/files/patch-ui_strings_app__locale__settings.grd
new file mode 100644
index 000000000000..9341a0bc5305
--- /dev/null
+++ b/www/iridium/files/patch-ui_strings_app__locale__settings.grd
@@ -0,0 +1,11 @@
+--- ui/strings/app_locale_settings.grd.orig 2020-03-16 18:40:15 UTC
++++ ui/strings/app_locale_settings.grd
+@@ -216,7 +216,7 @@
+ 75%
+ </message>
+ </if>
+- <if expr="(is_linux or is_android or is_bsd) and not chromeos">
++ <if expr="is_posix and not chromeos">
+ <!-- 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/www/iridium/files/patch-ui_views_bubble_bubble__dialog__delegate__view.cc b/www/iridium/files/patch-ui_views_bubble_bubble__dialog__delegate__view.cc
new file mode 100644
index 000000000000..4cdcd2b4bfd1
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_bubble_bubble__dialog__delegate__view.cc
@@ -0,0 +1,11 @@
+--- ui/views/bubble/bubble_dialog_delegate_view.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/views/bubble/bubble_dialog_delegate_view.cc
+@@ -174,7 +174,7 @@ Widget* BubbleDialogDelegateView::CreateBubble(
+ bubble_delegate->SetAnchorView(bubble_delegate->GetAnchorView());
+ Widget* bubble_widget = CreateBubbleWidget(bubble_delegate);
+
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) || defined(OS_BSD)
+ // Linux clips bubble windows that extend outside their parent window bounds.
+ // Mac never adjusts.
+ bubble_delegate->set_adjust_if_offscreen(false);
diff --git a/www/iridium/files/patch-ui_views_controls_label.cc b/www/iridium/files/patch-ui_views_controls_label.cc
new file mode 100644
index 000000000000..f6f9790bdbae
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_controls_label.cc
@@ -0,0 +1,20 @@
+--- ui/views/controls/label.cc.orig 2020-02-03 21:53:40 UTC
++++ ui/views/controls/label.cc
+@@ -695,7 +695,7 @@ bool Label::OnMousePressed(const ui::MouseEvent& event
+ GetFocusManager()->SetFocusedView(this);
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (event.IsOnlyMiddleMouseButton() && GetFocusManager() && !had_focus)
+ GetFocusManager()->SetFocusedView(this);
+ #endif
+@@ -880,7 +880,7 @@ bool Label::PasteSelectionClipboard() {
+ }
+
+ void Label::UpdateSelectionClipboard() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ if (!GetObscured()) {
+ ui::ScopedClipboardWriter(ui::ClipboardBuffer::kSelection)
+ .WriteText(GetSelectedText());
diff --git a/www/iridium/files/patch-ui_views_controls_textfield_textfield.cc b/www/iridium/files/patch-ui_views_controls_textfield_textfield.cc
new file mode 100644
index 000000000000..f22c358d52d8
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_controls_textfield_textfield.cc
@@ -0,0 +1,73 @@
+--- ui/views/controls/textfield/textfield.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/views/controls/textfield/textfield.cc
+@@ -60,7 +60,7 @@
+ #include "base/win/win_util.h"
+ #endif
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ #include "base/strings/utf_string_conversions.h"
+ #include "ui/base/ime/linux/text_edit_command_auralinux.h"
+ #include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+@@ -183,14 +183,14 @@ ui::TextEditCommand GetCommandForKeyEvent(const ui::Ke
+ #endif
+ return ui::TextEditCommand::DELETE_BACKWARD;
+ }
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Only erase by line break on Linux and ChromeOS.
+ if (shift && control)
+ return ui::TextEditCommand::DELETE_TO_END_OF_LINE;
+@@ -258,7 +258,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 defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ return flags & ui::EF_CONTROL_DOWN;
+ #else
+ return false;
+@@ -730,7 +730,7 @@ bool Textfield::OnMousePressed(const ui::MouseEvent& e
+ #endif
+ }
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (!handled && !had_focus && event.IsOnlyMiddleMouseButton())
+ RequestFocusWithPointer(ui::EventPointerType::POINTER_TYPE_MOUSE);
+ #endif
+@@ -776,7 +776,7 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event
+ if (!textfield)
+ return handled;
+
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+ std::vector<ui::TextEditCommandAuraLinux> commands;
+@@ -923,7 +923,7 @@ void Textfield::AboutToRequestFocusFromTabTraversal(bo
+ }
+
+ bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ // Skip any accelerator handling that conflicts with custom keybindings.
+ ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
+ ui::GetTextEditKeyBindingsDelegate();
+@@ -2182,7 +2182,7 @@ bool Textfield::PasteSelectionClipboard() {
+ }
+
+ void Textfield::UpdateSelectionClipboard() {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ if (text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD) {
+ ui::ScopedClipboardWriter(ui::ClipboardBuffer::kSelection)
+ .WriteText(GetSelectedText());
diff --git a/www/iridium/files/patch-ui_views_corewm_tooltip__aura.cc b/www/iridium/files/patch-ui_views_corewm_tooltip__aura.cc
new file mode 100644
index 000000000000..af036b2cf5d1
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_corewm_tooltip__aura.cc
@@ -0,0 +1,11 @@
+--- ui/views/corewm/tooltip_aura.cc.orig 2019-12-16 21:51:34 UTC
++++ ui/views/corewm/tooltip_aura.cc
+@@ -43,7 +43,7 @@ constexpr int kVerticalPaddingBottom = 5;
+
+ // TODO(varkha): Update if native widget can be transparent on Linux.
+ bool CanUseTranslucentTooltipWidget() {
+-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_WIN)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_WIN) || defined(OS_BSD)
+ return false;
+ #else
+ return true;
diff --git a/www/iridium/files/patch-ui_views_examples_widget__example.cc b/www/iridium/files/patch-ui_views_examples_widget__example.cc
new file mode 100644
index 000000000000..ae3eee7d03ac
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_examples_widget__example.cc
@@ -0,0 +1,11 @@
+--- ui/views/examples/widget_example.cc.orig 2020-02-03 21:53:14 UTC
++++ ui/views/examples/widget_example.cc
+@@ -70,7 +70,7 @@ void WidgetExample::CreateExampleView(View* container)
+ BuildButton(container, "Popup widget", POPUP);
+ BuildButton(container, "Dialog widget", DIALOG);
+ BuildButton(container, "Modal Dialog", MODAL_DIALOG);
+-#if defined(OS_LINUX)
++#if defined(OS_LINUX) || defined(OS_BSD)
+ // Windows does not support TYPE_CONTROL top-level widgets.
+ BuildButton(container, "Child widget", CHILD);
+ #endif
diff --git a/www/iridium/files/patch-ui_views_selection__controller.cc b/www/iridium/files/patch-ui_views_selection__controller.cc
new file mode 100644
index 000000000000..9504c67a2803
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_selection__controller.cc
@@ -0,0 +1,11 @@
+--- ui/views/selection_controller.cc.orig 2019-12-16 21:51:09 UTC
++++ ui/views/selection_controller.cc
+@@ -22,7 +22,7 @@ SelectionController::SelectionController(SelectionCont
+ delegate_(delegate),
+ handles_selection_clipboard_(false) {
+ // On Linux, update the selection clipboard on a text selection.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && !defined(OS_CHROMEOS)
+ set_handles_selection_clipboard(true);
+ #endif
+
diff --git a/www/iridium/files/patch-ui_views_style_platform__style.cc b/www/iridium/files/patch-ui_views_style_platform__style.cc
new file mode 100644
index 000000000000..28a000e3e6de
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_style_platform__style.cc
@@ -0,0 +1,11 @@
+--- ui/views/style/platform_style.cc.orig 2020-02-03 21:53:14 UTC
++++ ui/views/style/platform_style.cc
+@@ -74,7 +74,7 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const
+
+ #endif // OS_MACOSX
+
+-#if !BUILDFLAG(ENABLE_DESKTOP_AURA) || !defined(OS_LINUX)
++#if !BUILDFLAG(ENABLE_DESKTOP_AURA) || (!defined(OS_LINUX) && !defined(OS_BSD))
+ // static
+ std::unique_ptr<Border> PlatformStyle::CreateThemedLabelButtonBorder(
+ LabelButton* button) {
diff --git a/www/iridium/files/patch-ui_views_views__delegate.cc b/www/iridium/files/patch-ui_views_views__delegate.cc
new file mode 100644
index 000000000000..6ed6c077584f
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_views__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.cc.orig 2020-02-03 21:53:14 UTC
++++ ui/views/views_delegate.cc
+@@ -85,7 +85,7 @@ HICON ViewsDelegate::GetSmallWindowIcon() const {
+ bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const {
+ return false;
+ }
+-#elif defined(OS_LINUX) && BUILDFLAG(ENABLE_DESKTOP_AURA)
++#elif (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(ENABLE_DESKTOP_AURA)
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return nullptr;
+ }
diff --git a/www/iridium/files/patch-ui_views_views__delegate.h b/www/iridium/files/patch-ui_views_views__delegate.h
new file mode 100644
index 000000000000..b5bdee958617
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_views__delegate.h
@@ -0,0 +1,11 @@
+--- ui/views/views_delegate.h.orig 2020-02-03 21:53:14 UTC
++++ ui/views/views_delegate.h
+@@ -131,7 +131,7 @@ class VIEWS_EXPORT ViewsDelegate {
+ // Returns true if the window passed in is in the Windows 8 metro
+ // environment.
+ virtual bool IsWindowInMetro(gfx::NativeWindow window) const;
+-#elif defined(OS_LINUX) && BUILDFLAG(ENABLE_DESKTOP_AURA)
++#elif (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(ENABLE_DESKTOP_AURA)
+ virtual gfx::ImageSkia* GetDefaultWindowIcon() const;
+ #endif
+
diff --git a/www/iridium/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc b/www/iridium/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc
new file mode 100644
index 000000000000..ab44393b52fb
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_widget_desktop__aura_desktop__window__tree__host__platform.cc
@@ -0,0 +1,11 @@
+--- ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+@@ -747,7 +747,7 @@ void DesktopWindowTreeHostPlatform::AddAdditionalInitP
+ // DesktopWindowTreeHost:
+
+ // Linux subclasses this host and adds some Linux specific bits.
+-#if !defined(OS_LINUX)
++#if !defined(OS_LINUX) && !defined(OS_BSD)
+ // static
+ DesktopWindowTreeHost* DesktopWindowTreeHost::Create(
+ internal::NativeWidgetDelegate* native_widget_delegate,
diff --git a/www/iridium/files/patch-ui_views_widget_native__widget__aura.cc b/www/iridium/files/patch-ui_views_widget_native__widget__aura.cc
new file mode 100644
index 000000000000..61706964d7c0
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_widget_native__widget__aura.cc
@@ -0,0 +1,27 @@
+--- ui/views/widget/native_widget_aura.cc.orig 2020-03-16 18:40:43 UTC
++++ ui/views/widget/native_widget_aura.cc
+@@ -64,7 +64,7 @@
+ #include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
+ #endif
+
+-#if BUILDFLAG(ENABLE_DESKTOP_AURA) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_DESKTOP_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/views/linux_ui/linux_ui.h"
+ #include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
+ #endif
+@@ -1099,13 +1099,13 @@ void Widget::CloseAllSecondaryWidgets() {
+ EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, 0);
+ #endif
+
+-#if BUILDFLAG(ENABLE_DESKTOP_AURA) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_DESKTOP_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ DesktopWindowTreeHostLinux::CleanUpWindowList(CloseWindow);
+ #endif
+ }
+
+ const ui::NativeTheme* Widget::GetNativeTheme() const {
+-#if BUILDFLAG(ENABLE_DESKTOP_AURA) && defined(OS_LINUX)
++#if BUILDFLAG(ENABLE_DESKTOP_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ const LinuxUI* linux_ui = LinuxUI::instance();
+ if (linux_ui) {
+ ui::NativeTheme* native_theme =
diff --git a/www/iridium/files/patch-ui_views_window_custom__frame__view.cc b/www/iridium/files/patch-ui_views_window_custom__frame__view.cc
new file mode 100644
index 000000000000..4c35d22da5da
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_window_custom__frame__view.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/custom_frame_view.cc.orig 2019-09-09 21:55:47 UTC
++++ ui/views/window/custom_frame_view.cc
+@@ -287,7 +287,7 @@ int CustomFrameView::NonClientTopBorderHeight() const
+ int CustomFrameView::CaptionButtonY() const {
+ // Maximized buttons start at window top so that even if their images aren't
+ // drawn flush with the screen edge, they still obey Fitts' Law.
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_BSD)
+ return FrameBorderThickness();
+ #else
+ return frame_->IsMaximized() ? FrameBorderThickness() : kFrameShadowThickness;
diff --git a/www/iridium/files/patch-ui_views_window_dialog__delegate.cc b/www/iridium/files/patch-ui_views_window_dialog__delegate.cc
new file mode 100644
index 000000000000..b92881838304
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_window_dialog__delegate.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/dialog_delegate.cc.orig 2020-02-03 21:53:40 UTC
++++ ui/views/window/dialog_delegate.cc
+@@ -59,7 +59,7 @@ Widget* DialogDelegate::CreateDialogWidget(WidgetDeleg
+
+ // static
+ bool DialogDelegate::CanSupportCustomFrame(gfx::NativeView parent) {
+-#if defined(OS_LINUX) && BUILDFLAG(ENABLE_DESKTOP_AURA)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(ENABLE_DESKTOP_AURA)
+ // The new style doesn't support unparented dialogs on Linux desktop.
+ return parent != nullptr;
+ #elif defined(OS_WIN)
diff --git a/www/iridium/files/patch-ui_views_window_frame__background.cc b/www/iridium/files/patch-ui_views_window_frame__background.cc
new file mode 100644
index 000000000000..18a363a65e8f
--- /dev/null
+++ b/www/iridium/files/patch-ui_views_window_frame__background.cc
@@ -0,0 +1,11 @@
+--- ui/views/window/frame_background.cc.orig 2020-02-03 21:53:14 UTC
++++ ui/views/window/frame_background.cc
+@@ -107,7 +107,7 @@ void FrameBackground::PaintMaximized(gfx::Canvas* canv
+ const View* view) const {
+ // Fill the top with the frame color first so we have a constant background
+ // for areas not covered by the theme image.
+-#if defined(OS_LINUX) && BUILDFLAG(ENABLE_DESKTOP_AURA)
++#if (defined(OS_LINUX) || defined(OS_BSD)) && BUILDFLAG(ENABLE_DESKTOP_AURA)
+ auto* native_theme = view->GetNativeTheme();
+ ui::NativeTheme::ExtraParams params;
+ params.frame_top_area.use_custom_frame = use_custom_frame_;
diff --git a/www/iridium/files/patch-ui_webui_resources_js_cr.js b/www/iridium/files/patch-ui_webui_resources_js_cr.js
new file mode 100644
index 000000000000..2df5b1190a27
--- /dev/null
+++ b/www/iridium/files/patch-ui_webui_resources_js_cr.js
@@ -0,0 +1,14 @@
+--- ui/webui/resources/js/cr.js.orig 2019-12-16 21:51:34 UTC
++++ ui/webui/resources/js/cr.js
+@@ -437,6 +437,11 @@ var cr = cr || function(global) {
+ get isMac() {
+ return /Mac/.test(navigator.platform);
+ },
++
++ /** Whether this is on *BSD. */
++ get isBSD() {
++ return /BSD/.test(navigator.userAgent);
++ },
+
+ /** Whether this is on the Windows platform or not. */
+ get isWindows() {
diff --git a/www/iridium/files/patch-ui_webui_resources_js_icon.js b/www/iridium/files/patch-ui_webui_resources_js_icon.js
new file mode 100644
index 000000000000..26d3260b5cff
--- /dev/null
+++ b/www/iridium/files/patch-ui_webui_resources_js_icon.js
@@ -0,0 +1,11 @@
+--- ui/webui/resources/js/icon.js.orig 2019-10-21 19:07:29 UTC
++++ ui/webui/resources/js/icon.js
+@@ -16,7 +16,7 @@ cr.define('cr.icon', function() {
+ // supports SCALE_FACTOR_100P on all non-iOS platforms.
+ supportedScaleFactors.push(1);
+ }
+- if (cr.isMac || cr.isChromeOS || cr.isWindows || cr.isLinux) {
++ if (cr.isMac || cr.isChromeOS || cr.isWindows || cr.isLinux || cr.isBSD) {
+ // All desktop platforms support zooming which also updates the renderer's
+ // device scale factors (a.k.a devicePixelRatio), and these platforms have
+ // high DPI assets for 2x. Let the renderer pick the closest image for
diff --git a/www/iridium/files/patch-v8_BUILD.gn b/www/iridium/files/patch-v8_BUILD.gn
new file mode 100644
index 000000000000..0fe25aa48094
--- /dev/null
+++ b/www/iridium/files/patch-v8_BUILD.gn
@@ -0,0 +1,32 @@
+--- v8/BUILD.gn.orig 2020-03-16 18:42:16 UTC
++++ v8/BUILD.gn
+@@ -3616,7 +3616,7 @@ v8_component("v8_libbase") {
+ }
+ }
+
+- if (is_linux) {
++ if (is_linux && !is_bsd) {
+ sources += [
+ "src/base/debug/stack_trace_posix.cc",
+ "src/base/platform/platform-linux.cc",
+@@ -3636,6 +3636,12 @@ v8_component("v8_libbase") {
+ "dl",
+ "rt",
+ ]
++ } else if (is_bsd) {
++ sources += [
++ "src/base/debug/stack_trace_posix.cc",
++ "src/base/platform/platform-freebsd.cc",
++ ]
++ libs = [ "rt", "execinfo" ]
+ } else if (is_android) {
+ if (current_toolchain == host_toolchain) {
+ libs = [
+@@ -3891,6 +3897,7 @@ if (current_toolchain == v8_snapshot_toolchain) {
+ "src/snapshot/mksnapshot.cc",
+ "src/snapshot/snapshot-empty.cc",
+ ]
++ libs = ["execinfo"]
+
+ configs = [ ":internal_config" ]
+
diff --git a/www/iridium/files/patch-v8_include_v8config.h b/www/iridium/files/patch-v8_include_v8config.h
new file mode 100644
index 000000000000..18b8adbb56b8
--- /dev/null
+++ b/www/iridium/files/patch-v8_include_v8config.h
@@ -0,0 +1,21 @@
+--- v8/include/v8config.h.orig 2020-03-03 18:55:34 UTC
++++ v8/include/v8config.h
+@@ -273,7 +273,18 @@
+ # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
+ (__has_attribute(warn_unused_result))
+
++// Work around Clang bug present in 9.0.1, at least.
++//
++// Clang stores alignment as a 32-bit unsigned integer, but V8 only uses
++// V8_ASSUME_ALIGNED() for a 4GB (2^32) alignment
++// (kPtrComprIsolateRootAlignment). As such, the alignment overflows and
++// becomes zero, triggering an internal Clang assertion that alignment must not
++// be zero.
++#if 0
+ # define V8_HAS_BUILTIN_ASSUME_ALIGNED (__has_builtin(__builtin_assume_aligned))
++#else
++# define V8_HAS_BUILTIN_ASSUME_ALIGNED 0
++#endif
+ # define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))
+ # define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))
+ # define V8_HAS_BUILTIN_BSWAP64 (__has_builtin(__builtin_bswap64))
diff --git a/www/iridium/files/patch-v8_src_api_api.cc b/www/iridium/files/patch-v8_src_api_api.cc
new file mode 100644
index 000000000000..f32636389a90
--- /dev/null
+++ b/www/iridium/files/patch-v8_src_api_api.cc
@@ -0,0 +1,11 @@
+--- v8/src/api/api.cc.orig 2020-03-16 18:42:16 UTC
++++ v8/src/api/api.cc
+@@ -5657,7 +5657,7 @@ bool v8::V8::Initialize() {
+ return true;
+ }
+
+-#if V8_OS_LINUX || V8_OS_MACOSX
++#if V8_OS_LINUX || V8_OS_MACOSX || V8_OS_OPENBSD || V8_OS_FREEBSD
+ bool TryHandleWebAssemblyTrapPosix(int sig_code, siginfo_t* info,
+ void* context) {
+ #if V8_TARGET_ARCH_X64 && !V8_OS_ANDROID
diff --git a/www/iridium/files/patch-v8_src_base_cpu.cc b/www/iridium/files/patch-v8_src_base_cpu.cc
new file mode 100644
index 000000000000..c11e6a384aa0
--- /dev/null
+++ b/www/iridium/files/patch-v8_src_base_cpu.cc
@@ -0,0 +1,18 @@
+--- v8/src/base/cpu.cc.orig 2019-12-16 21:56:22 UTC
++++ v8/src/base/cpu.cc
+@@ -422,6 +422,7 @@ CPU::CPU()
+
+ #if V8_OS_LINUX
+
++#if V8_OS_LINUX
+ CPUInfo cpu_info;
+
+ // Extract implementor from the "CPU implementer" field.
+@@ -455,6 +456,7 @@ CPU::CPU()
+ }
+ delete[] part;
+ }
++#endif
+
+ // Extract architecture from the "CPU Architecture" field.
+ // The list is well-known, unlike the the output of
diff --git a/www/iridium/files/patch-v8_src_base_platform_platform-freebsd.cc b/www/iridium/files/patch-v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 000000000000..14e3ac15e039
--- /dev/null
+++ b/www/iridium/files/patch-v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,13 @@
+--- v8/src/base/platform/platform-freebsd.cc.orig 2020-03-24 16:12:11 UTC
++++ v8/src/base/platform/platform-freebsd.cc
+@@ -81,8 +81,8 @@ std::vector<OS::SharedLibraryAddress> OS::GetSharedLib
+ lib_name = std::string(path);
+ }
+ result.push_back(SharedLibraryAddress(
+- lib_name, reinterpret_cast<uintptr_t>(map->kve_start),
+- reinterpret_cast<uintptr_t>(map->kve_end)));
++ lib_name, static_cast<uintptr_t>(map->kve_start),
++ static_cast<uintptr_t>(map->kve_end)));
+ }
+
+ start += ssize;
diff --git a/www/iridium/files/patch-v8_src_base_platform_platform-posix.cc b/www/iridium/files/patch-v8_src_base_platform_platform-posix.cc
new file mode 100644
index 000000000000..e60a94f246f1
--- /dev/null
+++ b/www/iridium/files/patch-v8_src_base_platform_platform-posix.cc
@@ -0,0 +1,24 @@
+--- v8/src/base/platform/platform-posix.cc.orig 2020-02-03 21:55:00 UTC
++++ v8/src/base/platform/platform-posix.cc
+@@ -427,7 +427,7 @@ bool OS::DiscardSystemPages(void* address, size_t size
+
+ // static
+ bool OS::HasLazyCommits() {
+-#if V8_OS_AIX || V8_OS_LINUX || V8_OS_MACOSX
++#if V8_OS_AIX || V8_OS_LINUX || V8_OS_MACOSX || V8_OS_FREEBSD
+ return true;
+ #else
+ // TODO(bbudge) Return true for all POSIX platforms.
+@@ -558,6 +558,12 @@ int OS::GetCurrentThreadId() {
+ return static_cast<int>(syscall(__NR_gettid));
+ #elif V8_OS_ANDROID
+ return static_cast<int>(gettid());
++#elif V8_OS_DRAGONFLYBSD || defined(__DragonFly__)
++ return static_cast<int>(lwp_gettid());
++#elif V8_OS_FREEBSD
++ return static_cast<int>(pthread_getthreadid_np());
++#elif V8_OS_NETBSD
++ return static_cast<int>(_lwp_self());
+ #elif V8_OS_AIX
+ return static_cast<int>(thread_self());
+ #elif V8_OS_FUCHSIA
diff --git a/www/iridium/files/patch-weblayer_app_content__main__delegate__impl.cc b/www/iridium/files/patch-weblayer_app_content__main__delegate__impl.cc
new file mode 100644
index 000000000000..ef8149182926
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_app_content__main__delegate__impl.cc
@@ -0,0 +1,11 @@
+--- weblayer/app/content_main_delegate_impl.cc.orig 2020-03-17 10:35:42 UTC
++++ weblayer/app/content_main_delegate_impl.cc
+@@ -146,7 +146,7 @@ bool ContentMainDelegateImpl::BasicStartupComplete(int
+ }
+
+ void ContentMainDelegateImpl::PreSandboxStartup() {
+-#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX))
++#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_BSD))
+ // Create an instance of the CPU class to parse /proc/cpuinfo and cache
+ // cpu_brand info.
+ base::CPU cpu_info;
diff --git a/www/iridium/files/patch-weblayer_browser_browser__main__parts__impl.cc b/www/iridium/files/patch-weblayer_browser_browser__main__parts__impl.cc
new file mode 100644
index 000000000000..ca6a91a131c6
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_browser_browser__main__parts__impl.cc
@@ -0,0 +1,20 @@
+--- weblayer/browser/browser_main_parts_impl.cc.orig 2020-03-16 18:40:43 UTC
++++ weblayer/browser/browser_main_parts_impl.cc
+@@ -41,7 +41,7 @@
+ #if defined(USE_AURA) && defined(USE_X11)
+ #include "ui/events/devices/x11/touch_factory_x11.h" // nogncheck
+ #endif
+-#if !defined(OS_CHROMEOS) && defined(USE_AURA) && defined(OS_LINUX)
++#if !defined(OS_CHROMEOS) && defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ #include "ui/base/ime/init/input_method_initializer.h"
+ #endif
+
+@@ -109,7 +109,7 @@ int BrowserMainPartsImpl::PreEarlyInitialization() {
+ #if defined(USE_X11)
+ ui::SetDefaultX11ErrorHandlers();
+ #endif
+-#if defined(USE_AURA) && defined(OS_LINUX)
++#if defined(USE_AURA) && (defined(OS_LINUX) || defined(OS_BSD))
+ ui::InitializeInputMethodForTesting();
+ #endif
+ #if defined(OS_ANDROID)
diff --git a/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.cc b/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.cc
new file mode 100644
index 000000000000..cdb4c7b0f2a0
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.cc
@@ -0,0 +1,38 @@
+--- weblayer/browser/content_browser_client_impl.cc.orig 2020-03-16 18:40:43 UTC
++++ weblayer/browser/content_browser_client_impl.cc
+@@ -72,7 +72,7 @@
+ #include "weblayer/browser/safe_browsing/safe_browsing_service.h"
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ #include "content/public/common/content_descriptors.h"
+ #endif
+
+@@ -247,7 +247,7 @@ ContentBrowserClientImpl::CreateNetworkContext(
+
+ void ContentBrowserClientImpl::OnNetworkServiceCreated(
+ network::mojom::NetworkService* network_service) {
+-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
++#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
+ network::mojom::CryptConfigPtr config = network::mojom::CryptConfig::New();
+ content::GetNetworkService()->SetCryptConfig(std::move(config));
+ #endif
+@@ -426,7 +426,7 @@ SafeBrowsingService* ContentBrowserClientImpl::GetSafe
+ }
+ #endif
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ void ContentBrowserClientImpl::GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+@@ -460,7 +460,7 @@ void ContentBrowserClientImpl::GetAdditionalMappedFile
+ mappings->Share(service_manager::kCrashDumpSignal, crash_signal_fd);
+ #endif // defined(OS_ANDROID)
+ }
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ #if defined(OS_ANDROID)
+ bool ContentBrowserClientImpl::ShouldOverrideUrlLoading(
diff --git a/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.h b/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.h
new file mode 100644
index 000000000000..41c6b7a9b08d
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_browser_content__browser__client__impl.h
@@ -0,0 +1,17 @@
+--- weblayer/browser/content_browser_client_impl.h.orig 2020-03-16 18:40:43 UTC
++++ weblayer/browser/content_browser_client_impl.h
+@@ -85,12 +85,12 @@ class ContentBrowserClientImpl : public content::Conte
+ service_manager::BinderMapWithContext<content::RenderFrameHost*>* map)
+ override;
+
+-#if defined(OS_LINUX) || defined(OS_ANDROID)
++#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+ void GetAdditionalMappedFilesForChildProcess(
+ const base::CommandLine& command_line,
+ int child_process_id,
+ content::PosixFileDescriptorInfo* mappings) override;
+-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
++#endif // defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_BSD)
+
+ #if defined(OS_ANDROID)
+ bool ShouldOverrideUrlLoading(int frame_tree_node_id,
diff --git a/www/iridium/files/patch-weblayer_browser_system__network__context__manager.cc b/www/iridium/files/patch-weblayer_browser_system__network__context__manager.cc
new file mode 100644
index 000000000000..4ac2c36b5362
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_browser_system__network__context__manager.cc
@@ -0,0 +1,11 @@
+--- weblayer/browser/system_network_context_manager.cc.orig 2020-03-17 10:36:11 UTC
++++ weblayer/browser/system_network_context_manager.cc
+@@ -102,7 +102,7 @@ SystemNetworkContextManager::CreateSystemNetworkContex
+
+ network_context_params->context_name = std::string("system");
+ network_context_params->primary_network_context = true;
+-#if defined(OS_LINUX) || defined(OS_WIN)
++#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_BSD)
+ // We're not configuring the cookie encryption on these platforms yet.
+ network_context_params->enable_encrypted_cookies = false;
+ #endif
diff --git a/www/iridium/files/patch-weblayer_common_weblayer__paths.cc b/www/iridium/files/patch-weblayer_common_weblayer__paths.cc
new file mode 100644
index 000000000000..54019d8cc261
--- /dev/null
+++ b/www/iridium/files/patch-weblayer_common_weblayer__paths.cc
@@ -0,0 +1,20 @@
+--- weblayer/common/weblayer_paths.cc.orig 2020-03-16 18:40:15 UTC
++++ weblayer/common/weblayer_paths.cc
+@@ -17,7 +17,7 @@
+
+ #if defined(OS_WIN)
+ #include "base/base_paths_win.h"
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_BSD)
+ #include "base/nix/xdg_util.h"
+ #endif
+
+@@ -35,7 +35,7 @@ bool GetDefaultUserDataDirectory(base::FilePath* resul
+ return false;
+ *result = result->AppendASCII("weblayer");
+ return true;
+-#elif defined(OS_LINUX)
++#elif defined(OS_LINUX) || defined(OS_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/www/iridium/files/sndio_input.cc b/www/iridium/files/sndio_input.cc
new file mode 100644
index 000000000000..6c7bc8b8025b
--- /dev/null
+++ b/www/iridium/files/sndio_input.cc
@@ -0,0 +1,201 @@
+// 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/bind.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/message_loop/message_loop.h"
+#include "media/base/audio_timestamp_helper.h"
+#include "media/audio/openbsd/audio_manager_openbsd.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();
+}
+
+bool SndioAudioInputStream::Open() {
+ struct sio_par par;
+ int sig;
+
+ if (state != kClosed)
+ return false;
+
+ if (params.format() != AudioParameters::AUDIO_PCM_LINEAR &&
+ params.format() != AudioParameters::AUDIO_PCM_LOW_LATENCY) {
+ LOG(WARNING) << "Unsupported audio format.";
+ return false;
+ }
+
+ 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 false;
+ }
+
+ 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 true;
+bad_close:
+ sio_close(hdl);
+ return false;
+}
+
+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)
+ return;
+
+ if (state == kRunning)
+ Stop();
+
+ state = kClosed;
+ delete [] buffer;
+ sio_close(hdl);
+
+ 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(buffer, nframes, SampleFormatToBytesPerChannel(kSampleFormat));
+
+ // invoke callback
+ callback->OnData(audio_bus.get(), base::TimeTicks::Now() - delay, 1.);
+ }
+}
+
+} // namespace media
diff --git a/www/iridium/files/sndio_input.h b/www/iridium/files/sndio_input.h
new file mode 100644
index 000000000000..d868e0469db5
--- /dev/null
+++ b/www/iridium/files/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/macros.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() override;
+
+ // Implementation of AudioInputStream.
+ bool 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;
+
+ DISALLOW_COPY_AND_ASSIGN(SndioAudioInputStream);
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
diff --git a/www/iridium/files/sndio_output.cc b/www/iridium/files/sndio_output.cc
new file mode 100644
index 000000000000..a6719f9aac8d
--- /dev/null
+++ b/www/iridium/files/sndio_output.cc
@@ -0,0 +1,183 @@
+// 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() {
+ struct sio_par par;
+ int sig;
+
+ if (params.format() != AudioParameters::AUDIO_PCM_LINEAR &&
+ params.format() != AudioParameters::AUDIO_PCM_LOW_LATENCY) {
+ LOG(WARNING) << "Unsupported audio format.";
+ return false;
+ }
+ 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 false;
+ }
+ 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.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.";
+ goto bad_close;
+ }
+ state = kStopped;
+ volpending = 0;
+ vol = 0;
+ buffer = new char[audio_bus->frames() * params.GetBytesPerFrame(kSampleFormat)];
+ sio_onmove(hdl, &OnMoveCallback, this);
+ sio_onvol(hdl, &OnVolCallback, this);
+ return true;
+ bad_close:
+ sio_close(hdl);
+ return false;
+}
+
+void SndioAudioOutputStream::Close() {
+ if (state == kClosed)
+ return;
+ if (state == kRunning)
+ Stop();
+ state = kClosed;
+ delete [] buffer;
+ sio_close(hdl);
+ manager->ReleaseOutputStream(this); // Calls the destructor
+}
+
+void SndioAudioOutputStream::Start(AudioSourceCallback* callback) {
+ 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);
+ state = kStopped;
+ }
+}
+
+void SndioAudioOutputStream::Stop() {
+ if (state == kStopped)
+ return;
+ state = kStopWait;
+ pthread_join(thread, NULL);
+ sio_stop(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(), 0, audio_bus.get());
+ audio_bus->ToInterleaved(count, SampleFormatToBytesPerChannel(kSampleFormat), 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/www/iridium/files/sndio_output.h b/www/iridium/files/sndio_output.h
new file mode 100644
index 000000000000..ead220ca96e7
--- /dev/null
+++ b/www/iridium/files/sndio_output.h
@@ -0,0 +1,86 @@
+// 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);
+ 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;
+
+ DISALLOW_COPY_AND_ASSIGN(SndioAudioOutputStream);
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_SNDIO_SNDIO_OUTPUT_H_
diff --git a/www/iridium/pkg-descr b/www/iridium/pkg-descr
new file mode 100644
index 000000000000..50b29c6098d7
--- /dev/null
+++ b/www/iridium/pkg-descr
@@ -0,0 +1,7 @@
+Iridium is a free, open, and libre browser modification of the Chromium
+code base, with privacy being enhanced in several key areas.
+
+Automatic transmission of partial queries, keywords, metrics to central
+services is inhibited and only occurs with consent.
+
+WWW: https://iridiumbrowser.de/
diff --git a/www/iridium/pkg-plist b/www/iridium/pkg-plist
new file mode 100644
index 000000000000..d71c983aceb2
--- /dev/null
+++ b/www/iridium/pkg-plist
@@ -0,0 +1,1101 @@
+bin/iridium
+%%DATADIR%%/iridium
+%%DATADIR%%/chrome_100_percent.pak
+%%DATADIR%%/chrome_200_percent.pak
+%%DATADIR%%/headless_lib.pak
+%%DATADIR%%/icudtl.dat
+%%DATADIR%%/libEGL.so
+%%DATADIR%%/libGLESv2.so
+%%DATADIR%%/libVkICD_mock_icd.so
+%%DATADIR%%/locales/am.pak
+%%DATADIR%%/locales/am.pak.info
+%%DATADIR%%/locales/ar.pak
+%%DATADIR%%/locales/ar.pak.info
+%%DATADIR%%/locales/bg.pak
+%%DATADIR%%/locales/bg.pak.info
+%%DATADIR%%/locales/bn.pak
+%%DATADIR%%/locales/bn.pak.info
+%%DATADIR%%/locales/ca.pak
+%%DATADIR%%/locales/ca.pak.info
+%%DATADIR%%/locales/cs.pak
+%%DATADIR%%/locales/cs.pak.info
+%%DATADIR%%/locales/da.pak
+%%DATADIR%%/locales/da.pak.info
+%%DATADIR%%/locales/de.pak
+%%DATADIR%%/locales/de.pak.info
+%%DATADIR%%/locales/el.pak
+%%DATADIR%%/locales/el.pak.info
+%%DATADIR%%/locales/en-GB.pak
+%%DATADIR%%/locales/en-GB.pak.info
+%%DATADIR%%/locales/en-US.pak
+%%DATADIR%%/locales/en-US.pak.info
+%%DATADIR%%/locales/es-419.pak
+%%DATADIR%%/locales/es-419.pak.info
+%%DATADIR%%/locales/es.pak
+%%DATADIR%%/locales/es.pak.info
+%%DATADIR%%/locales/et.pak
+%%DATADIR%%/locales/et.pak.info
+%%DATADIR%%/locales/fa.pak
+%%DATADIR%%/locales/fa.pak.info
+%%DATADIR%%/locales/fi.pak
+%%DATADIR%%/locales/fi.pak.info
+%%DATADIR%%/locales/fil.pak
+%%DATADIR%%/locales/fil.pak.info
+%%DATADIR%%/locales/fr.pak
+%%DATADIR%%/locales/fr.pak.info
+%%DATADIR%%/locales/gu.pak
+%%DATADIR%%/locales/gu.pak.info
+%%DATADIR%%/locales/he.pak
+%%DATADIR%%/locales/he.pak.info
+%%DATADIR%%/locales/hi.pak
+%%DATADIR%%/locales/hi.pak.info
+%%DATADIR%%/locales/hr.pak
+%%DATADIR%%/locales/hr.pak.info
+%%DATADIR%%/locales/hu.pak
+%%DATADIR%%/locales/hu.pak.info
+%%DATADIR%%/locales/id.pak
+%%DATADIR%%/locales/id.pak.info
+%%DATADIR%%/locales/it.pak
+%%DATADIR%%/locales/it.pak.info
+%%DATADIR%%/locales/ja.pak
+%%DATADIR%%/locales/ja.pak.info
+%%DATADIR%%/locales/kn.pak
+%%DATADIR%%/locales/kn.pak.info
+%%DATADIR%%/locales/ko.pak
+%%DATADIR%%/locales/ko.pak.info
+%%DATADIR%%/locales/lt.pak
+%%DATADIR%%/locales/lt.pak.info
+%%DATADIR%%/locales/lv.pak
+%%DATADIR%%/locales/lv.pak.info
+%%DATADIR%%/locales/ml.pak
+%%DATADIR%%/locales/ml.pak.info
+%%DATADIR%%/locales/mr.pak
+%%DATADIR%%/locales/mr.pak.info
+%%DATADIR%%/locales/ms.pak
+%%DATADIR%%/locales/ms.pak.info
+%%DATADIR%%/locales/nb.pak
+%%DATADIR%%/locales/nb.pak.info
+%%DATADIR%%/locales/nl.pak
+%%DATADIR%%/locales/nl.pak.info
+%%DATADIR%%/locales/pl.pak
+%%DATADIR%%/locales/pl.pak.info
+%%DATADIR%%/locales/pt-BR.pak
+%%DATADIR%%/locales/pt-BR.pak.info
+%%DATADIR%%/locales/pt-PT.pak
+%%DATADIR%%/locales/pt-PT.pak.info
+%%DATADIR%%/locales/ro.pak
+%%DATADIR%%/locales/ro.pak.info
+%%DATADIR%%/locales/ru.pak
+%%DATADIR%%/locales/ru.pak.info
+%%DATADIR%%/locales/sk.pak
+%%DATADIR%%/locales/sk.pak.info
+%%DATADIR%%/locales/sl.pak
+%%DATADIR%%/locales/sl.pak.info
+%%DATADIR%%/locales/sr.pak
+%%DATADIR%%/locales/sr.pak.info
+%%DATADIR%%/locales/sv.pak
+%%DATADIR%%/locales/sv.pak.info
+%%DATADIR%%/locales/sw.pak
+%%DATADIR%%/locales/sw.pak.info
+%%DATADIR%%/locales/ta.pak
+%%DATADIR%%/locales/ta.pak.info
+%%DATADIR%%/locales/te.pak
+%%DATADIR%%/locales/te.pak.info
+%%DATADIR%%/locales/th.pak
+%%DATADIR%%/locales/th.pak.info
+%%DATADIR%%/locales/tr.pak
+%%DATADIR%%/locales/tr.pak.info
+%%DATADIR%%/locales/uk.pak
+%%DATADIR%%/locales/uk.pak.info
+%%DATADIR%%/locales/vi.pak
+%%DATADIR%%/locales/vi.pak.info
+%%DATADIR%%/locales/zh-CN.pak
+%%DATADIR%%/locales/zh-CN.pak.info
+%%DATADIR%%/locales/zh-TW.pak
+%%DATADIR%%/locales/zh-TW.pak.info
+%%DATADIR%%/mksnapshot
+%%DATADIR%%/product_logo_48.png
+%%DATADIR%%/protoc
+%%DATADIR%%/resources.pak
+%%DATADIR%%/resources/inspector/.htaccess
+%%DATADIR%%/resources/inspector/Images/accelerometer-back.svg
+%%DATADIR%%/resources/inspector/Images/accelerometer-bottom.png
+%%DATADIR%%/resources/inspector/Images/accelerometer-front.svg
+%%DATADIR%%/resources/inspector/Images/accelerometer-left.png
+%%DATADIR%%/resources/inspector/Images/accelerometer-right.png
+%%DATADIR%%/resources/inspector/Images/accelerometer-top.png
+%%DATADIR%%/resources/inspector/Images/audits_logo.svg
+%%DATADIR%%/resources/inspector/Images/breakpoint.svg
+%%DATADIR%%/resources/inspector/Images/breakpointConditional.svg
+%%DATADIR%%/resources/inspector/Images/checkboxCheckmark.svg
+%%DATADIR%%/resources/inspector/Images/checker.png
+%%DATADIR%%/resources/inspector/Images/chevrons.svg
+%%DATADIR%%/resources/inspector/Images/chromeDisabledSelect.png
+%%DATADIR%%/resources/inspector/Images/chromeDisabledSelect_2x.png
+%%DATADIR%%/resources/inspector/Images/chromeLeft.png
+%%DATADIR%%/resources/inspector/Images/chromeMiddle.png
+%%DATADIR%%/resources/inspector/Images/chromeRight.png
+%%DATADIR%%/resources/inspector/Images/chromeSelect.png
+%%DATADIR%%/resources/inspector/Images/chromeSelect_2x.png
+%%DATADIR%%/resources/inspector/Images/cssoverview_icons_2x.png
+%%DATADIR%%/resources/inspector/Images/errorWave.svg
+%%DATADIR%%/resources/inspector/Images/ic_info_black_18dp.svg
+%%DATADIR%%/resources/inspector/Images/ic_warning_black_18dp.svg
+%%DATADIR%%/resources/inspector/Images/largeIcons.svg
+%%DATADIR%%/resources/inspector/Images/mediumIcons.svg
+%%DATADIR%%/resources/inspector/Images/navigationControls.png
+%%DATADIR%%/resources/inspector/Images/navigationControls_2x.png
+%%DATADIR%%/resources/inspector/Images/nodeIcon.png
+%%DATADIR%%/resources/inspector/Images/popoverArrows.png
+%%DATADIR%%/resources/inspector/Images/profileGroupIcon.png
+%%DATADIR%%/resources/inspector/Images/profileIcon.png
+%%DATADIR%%/resources/inspector/Images/profileSmallIcon.png
+%%DATADIR%%/resources/inspector/Images/radioDot.png
+%%DATADIR%%/resources/inspector/Images/radioDot-dark-theme.png
+%%DATADIR%%/resources/inspector/Images/resizeDiagonal.png
+%%DATADIR%%/resources/inspector/Images/resizeDiagonal_2x.png
+%%DATADIR%%/resources/inspector/Images/resizeHorizontal.png
+%%DATADIR%%/resources/inspector/Images/resizeHorizontal_2x.png
+%%DATADIR%%/resources/inspector/Images/resizeVertical.png
+%%DATADIR%%/resources/inspector/Images/resizeVertical_2x.png
+%%DATADIR%%/resources/inspector/Images/resourceCSSIcon.png
+%%DATADIR%%/resources/inspector/Images/resourceDocumentIcon.png
+%%DATADIR%%/resources/inspector/Images/resourceDocumentIconSmall.png
+%%DATADIR%%/resources/inspector/Images/resourceJSIcon.png
+%%DATADIR%%/resources/inspector/Images/resourcePlainIcon.png
+%%DATADIR%%/resources/inspector/Images/resourcePlainIconSmall.png
+%%DATADIR%%/resources/inspector/Images/resourcesTimeGraphIcon.png
+%%DATADIR%%/resources/inspector/Images/searchNext.png
+%%DATADIR%%/resources/inspector/Images/searchPrev.png
+%%DATADIR%%/resources/inspector/Images/securityIcons.svg
+%%DATADIR%%/resources/inspector/Images/smallIcons.svg
+%%DATADIR%%/resources/inspector/Images/speech.png
+%%DATADIR%%/resources/inspector/Images/toolbarResizerVertical.png
+%%DATADIR%%/resources/inspector/Images/touchCursor.png
+%%DATADIR%%/resources/inspector/Images/touchCursor_2x.png
+%%DATADIR%%/resources/inspector/Images/treeoutlineTriangles.svg
+%%DATADIR%%/resources/inspector/Images/whatsnew.png
+%%DATADIR%%/resources/inspector/InspectorBackendCommands.js
+%%DATADIR%%/resources/inspector/SupportedCSSProperties.js
+%%DATADIR%%/resources/inspector/Tests.js
+%%DATADIR%%/resources/inspector/accessibility/accessibility_module.js
+%%DATADIR%%/resources/inspector/accessibility/accessibility-legacy.js
+%%DATADIR%%/resources/inspector/accessibility/accessibility.js
+%%DATADIR%%/resources/inspector/accessibility/AccessibilityModel.js
+%%DATADIR%%/resources/inspector/accessibility/AccessibilityNodeView.js
+%%DATADIR%%/resources/inspector/accessibility/AccessibilitySidebarView.js
+%%DATADIR%%/resources/inspector/accessibility/AccessibilityStrings.js
+%%DATADIR%%/resources/inspector/accessibility/AccessibilitySubPane.js
+%%DATADIR%%/resources/inspector/accessibility/ARIAAttributesView.js
+%%DATADIR%%/resources/inspector/accessibility/ARIAMetadata.js
+%%DATADIR%%/resources/inspector/accessibility/ARIAProperties.js
+%%DATADIR%%/resources/inspector/accessibility/AXBreadcrumbsPane.js
+%%DATADIR%%/resources/inspector/accessibility_test_runner/accessibility_test_runner_module.js
+%%DATADIR%%/resources/inspector/animation/animation_module.js
+%%DATADIR%%/resources/inspector/animation/animation-legacy.js
+%%DATADIR%%/resources/inspector/animation/animation.js
+%%DATADIR%%/resources/inspector/animation/AnimationGroupPreviewUI.js
+%%DATADIR%%/resources/inspector/animation/AnimationModel.js
+%%DATADIR%%/resources/inspector/animation/AnimationScreenshotPopover.js
+%%DATADIR%%/resources/inspector/animation/AnimationTimeline.js
+%%DATADIR%%/resources/inspector/animation/AnimationUI.js
+%%DATADIR%%/resources/inspector/application_test_runner/application_test_runner_module.js
+%%DATADIR%%/resources/inspector/audits/audits_module.js
+%%DATADIR%%/resources/inspector/audits/audits-legacy.js
+%%DATADIR%%/resources/inspector/audits/audits.js
+%%DATADIR%%/resources/inspector/audits/AuditsController.js
+%%DATADIR%%/resources/inspector/audits/AuditsPanel.js
+%%DATADIR%%/resources/inspector/audits/AuditsProtocolService.js
+%%DATADIR%%/resources/inspector/audits/AuditsReportRenderer.js
+%%DATADIR%%/resources/inspector/audits/AuditsReportSelector.js
+%%DATADIR%%/resources/inspector/audits/AuditsStartView.js
+%%DATADIR%%/resources/inspector/audits/AuditsStatusView.js
+%%DATADIR%%/resources/inspector/audits/lighthouse/report-generator.js
+%%DATADIR%%/resources/inspector/audits/lighthouse/report.js
+%%DATADIR%%/resources/inspector/audits/RadioSetting.js
+%%DATADIR%%/resources/inspector/audits_test_runner/audits_test_runner_module.js
+%%DATADIR%%/resources/inspector/audits_worker.js
+%%DATADIR%%/resources/inspector/audits_worker/audits_worker_module.js
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ar-XB.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ar.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/bg.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ca.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/cs.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/da.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/de.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/el.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/en-GB.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/en-US.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/en-XA.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/en-XL.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/es-419.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/es.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/fi.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/fil.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/fr.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/he.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/hi.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/hr.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/hu.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/id.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/it.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ja.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ko.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/lt.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/lv.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/nl.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/no.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/pl.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/pt-PT.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/pt.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ro.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ru.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/sk.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/sl.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/sr-Latn.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/sr.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/sv.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/ta.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/te.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/th.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/tr.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/uk.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/vi.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/zh-HK.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/zh-TW.json
+%%DATADIR%%/resources/inspector/audits_worker/lighthouse/locales/zh.json
+%%DATADIR%%/resources/inspector/axe_core_test_runner/axe_core_test_runner_module.js
+%%DATADIR%%/resources/inspector/bindings_test_runner/bindings_test_runner_module.js
+%%DATADIR%%/resources/inspector/bindings/bindings.js
+%%DATADIR%%/resources/inspector/bindings/bindings-legacy.js
+%%DATADIR%%/resources/inspector/bindings/BlackboxManager.js
+%%DATADIR%%/resources/inspector/bindings/BreakpointManager.js
+%%DATADIR%%/resources/inspector/bindings/CompilerScriptMapping.js
+%%DATADIR%%/resources/inspector/bindings/ContentProviderBasedProject.js
+%%DATADIR%%/resources/inspector/bindings/CSSWorkspaceBinding.js
+%%DATADIR%%/resources/inspector/bindings/DebuggerLanguagePlugins.js
+%%DATADIR%%/resources/inspector/bindings/DebuggerWorkspaceBinding.js
+%%DATADIR%%/resources/inspector/bindings/DefaultScriptMapping.js
+%%DATADIR%%/resources/inspector/bindings/FileUtils.js
+%%DATADIR%%/resources/inspector/bindings/LiveLocation.js
+%%DATADIR%%/resources/inspector/bindings/NetworkProject.js
+%%DATADIR%%/resources/inspector/bindings/PresentationConsoleMessageHelper.js
+%%DATADIR%%/resources/inspector/bindings/ResourceMapping.js
+%%DATADIR%%/resources/inspector/bindings/ResourceScriptMapping.js
+%%DATADIR%%/resources/inspector/bindings/ResourceUtils.js
+%%DATADIR%%/resources/inspector/bindings/SASSSourceMapping.js
+%%DATADIR%%/resources/inspector/bindings/StylesSourceMapping.js
+%%DATADIR%%/resources/inspector/bindings/TempFile.js
+%%DATADIR%%/resources/inspector/bindings/language_plugins/CXXDWARFLanguagePlugin.js
+%%DATADIR%%/resources/inspector/browser_debugger/browser_debugger_module.js
+%%DATADIR%%/resources/inspector/browser_debugger/browser_debugger-legacy.js
+%%DATADIR%%/resources/inspector/browser_debugger/browser_debugger.js
+%%DATADIR%%/resources/inspector/browser_debugger/DOMBreakpointsSidebarPane.js
+%%DATADIR%%/resources/inspector/browser_debugger/EventListenerBreakpointsSidebarPane.js
+%%DATADIR%%/resources/inspector/browser_debugger/ObjectEventListenersSidebarPane.js
+%%DATADIR%%/resources/inspector/browser_debugger/XHRBreakpointsSidebarPane.js
+%%DATADIR%%/resources/inspector/browser_sdk/browser_sdk.js
+%%DATADIR%%/resources/inspector/browser_sdk/browser_sdk-legacy.js
+%%DATADIR%%/resources/inspector/browser_sdk/LogManager.js
+%%DATADIR%%/resources/inspector/changes/changes_module.js
+%%DATADIR%%/resources/inspector/changes/changes-legacy.js
+%%DATADIR%%/resources/inspector/changes/changes.js
+%%DATADIR%%/resources/inspector/changes/ChangesHighlighter.js
+%%DATADIR%%/resources/inspector/changes/ChangesSidebar.js
+%%DATADIR%%/resources/inspector/changes/ChangesTextEditor.js
+%%DATADIR%%/resources/inspector/changes/ChangesView.js
+%%DATADIR%%/resources/inspector/cm_headless/cm_headless.js
+%%DATADIR%%/resources/inspector/cm_headless/headlesscodemirror.js
+%%DATADIR%%/resources/inspector/cm_modes/clike.js
+%%DATADIR%%/resources/inspector/cm_modes/clojure.js
+%%DATADIR%%/resources/inspector/cm/cm_module.js
+%%DATADIR%%/resources/inspector/cm/active-line.js
+%%DATADIR%%/resources/inspector/cm/brace-fold.js
+%%DATADIR%%/resources/inspector/cm/closebrackets.js
+%%DATADIR%%/resources/inspector/cm/cm.js
+%%DATADIR%%/resources/inspector/cm/codemirror.js
+%%DATADIR%%/resources/inspector/cm/comment.js
+%%DATADIR%%/resources/inspector/cm/foldcode.js
+%%DATADIR%%/resources/inspector/cm/foldgutter.js
+%%DATADIR%%/resources/inspector/cm/mark-selection.js
+%%DATADIR%%/resources/inspector/cm/matchbrackets.js
+%%DATADIR%%/resources/inspector/cm/multiplex.js
+%%DATADIR%%/resources/inspector/cm/overlay.js
+%%DATADIR%%/resources/inspector/cm_modes/cm_modes_module.js
+%%DATADIR%%/resources/inspector/cm_modes/cm_modes.js
+%%DATADIR%%/resources/inspector/cm_modes/coffeescript.js
+%%DATADIR%%/resources/inspector/cm_modes/DefaultCodeMirrorMimeMode.js
+%%DATADIR%%/resources/inspector/cm_modes/jsx.js
+%%DATADIR%%/resources/inspector/cm_modes/livescript.js
+%%DATADIR%%/resources/inspector/cm_modes/markdown.js
+%%DATADIR%%/resources/inspector/cm_modes/php.js
+%%DATADIR%%/resources/inspector/cm_modes/python.js
+%%DATADIR%%/resources/inspector/cm_modes/shell.js
+%%DATADIR%%/resources/inspector/cm_web_modes/cm_web_modes_cm.js
+%%DATADIR%%/resources/inspector/cm_web_modes/cm_web_modes_headless.js
+%%DATADIR%%/resources/inspector/cm_web_modes/cm_web_modes_module.js
+%%DATADIR%%/resources/inspector/cm_web_modes/cm_web_modes.js
+%%DATADIR%%/resources/inspector/cm_web_modes/css.js
+%%DATADIR%%/resources/inspector/cm_web_modes/htmlembedded.js
+%%DATADIR%%/resources/inspector/cm_web_modes/htmlmixed.js
+%%DATADIR%%/resources/inspector/cm_web_modes/javascript.js
+%%DATADIR%%/resources/inspector/cm_web_modes/xml.js
+%%DATADIR%%/resources/inspector/color_picker/color_picker_module.js
+%%DATADIR%%/resources/inspector/color_picker/color_picker-legacy.js
+%%DATADIR%%/resources/inspector/color_picker/color_picker.js
+%%DATADIR%%/resources/inspector/color_picker/ContrastDetails.js
+%%DATADIR%%/resources/inspector/color_picker/ContrastInfo.js
+%%DATADIR%%/resources/inspector/color_picker/ContrastOverlay.js
+%%DATADIR%%/resources/inspector/color_picker/Spectrum.js
+%%DATADIR%%/resources/inspector/common/App.js
+%%DATADIR%%/resources/inspector/common/AppProvider.js
+%%DATADIR%%/resources/inspector/common/CharacterIdMap.js
+%%DATADIR%%/resources/inspector/common/Color.js
+%%DATADIR%%/resources/inspector/common/common.js
+%%DATADIR%%/resources/inspector/common/common-legacy.js
+%%DATADIR%%/resources/inspector/common/Console.js
+%%DATADIR%%/resources/inspector/common/ContentProvider.js
+%%DATADIR%%/resources/inspector/common/EventTarget.js
+%%DATADIR%%/resources/inspector/common/JavaScriptMetaData.js
+%%DATADIR%%/resources/inspector/common/Linkifier.js
+%%DATADIR%%/resources/inspector/common/Object.js
+%%DATADIR%%/resources/inspector/common/ParsedURL.js
+%%DATADIR%%/resources/inspector/common/Progress.js
+%%DATADIR%%/resources/inspector/common/QueryParamHandler.js
+%%DATADIR%%/resources/inspector/common/ResourceType.js
+%%DATADIR%%/resources/inspector/common/Revealer.js
+%%DATADIR%%/resources/inspector/common/Runnable.js
+%%DATADIR%%/resources/inspector/common/SegmentedRange.js
+%%DATADIR%%/resources/inspector/common/Settings.js
+%%DATADIR%%/resources/inspector/common/StaticContentProvider.js
+%%DATADIR%%/resources/inspector/common/StringOutputStream.js
+%%DATADIR%%/resources/inspector/common/TextDictionary.js
+%%DATADIR%%/resources/inspector/common/Throttler.js
+%%DATADIR%%/resources/inspector/common/Trie.js
+%%DATADIR%%/resources/inspector/common/UIString.js
+%%DATADIR%%/resources/inspector/common/Worker.js
+%%DATADIR%%/resources/inspector/components/components.js
+%%DATADIR%%/resources/inspector/components/components-legacy.js
+%%DATADIR%%/resources/inspector/components/DockController.js
+%%DATADIR%%/resources/inspector/components/ImagePreview.js
+%%DATADIR%%/resources/inspector/components/JSPresentationUtils.js
+%%DATADIR%%/resources/inspector/components/Linkifier.js
+%%DATADIR%%/resources/inspector/components/Reload.js
+%%DATADIR%%/resources/inspector/components/TargetDetachedDialog.js
+%%DATADIR%%/resources/inspector/console_counters/console_counters.js
+%%DATADIR%%/resources/inspector/console_counters/console_counters-legacy.js
+%%DATADIR%%/resources/inspector/console_counters/WarningErrorCounter.js
+%%DATADIR%%/resources/inspector/console/console_module.js
+%%DATADIR%%/resources/inspector/console/console-legacy.js
+%%DATADIR%%/resources/inspector/console/console.js
+%%DATADIR%%/resources/inspector/console/ConsoleContextSelector.js
+%%DATADIR%%/resources/inspector/console/ConsoleFilter.js
+%%DATADIR%%/resources/inspector/console/ConsolePanel.js
+%%DATADIR%%/resources/inspector/console/ConsolePinPane.js
+%%DATADIR%%/resources/inspector/console/ConsolePrompt.js
+%%DATADIR%%/resources/inspector/console/ConsoleSidebar.js
+%%DATADIR%%/resources/inspector/console/ConsoleView.js
+%%DATADIR%%/resources/inspector/console/ConsoleViewMessage.js
+%%DATADIR%%/resources/inspector/console/ConsoleViewport.js
+%%DATADIR%%/resources/inspector/console_test_runner/console_test_runner_module.js
+%%DATADIR%%/resources/inspector/cookie_table/cookie_table_module.js
+%%DATADIR%%/resources/inspector/cookie_table/cookie_table-legacy.js
+%%DATADIR%%/resources/inspector/cookie_table/cookie_table.js
+%%DATADIR%%/resources/inspector/cookie_table/CookiesTable.js
+%%DATADIR%%/resources/inspector/coverage/coverage_module.js
+%%DATADIR%%/resources/inspector/coverage/coverage-legacy.js
+%%DATADIR%%/resources/inspector/coverage/coverage.js
+%%DATADIR%%/resources/inspector/coverage/CoverageDecorationManager.js
+%%DATADIR%%/resources/inspector/coverage/CoverageListView.js
+%%DATADIR%%/resources/inspector/coverage/CoverageModel.js
+%%DATADIR%%/resources/inspector/coverage/CoverageView.js
+%%DATADIR%%/resources/inspector/coverage_test_runner/coverage_test_runner_module.js
+%%DATADIR%%/resources/inspector/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js
+%%DATADIR%%/resources/inspector/css_overview/css_overview_module.js
+%%DATADIR%%/resources/inspector/css_overview/css_overview-legacy.js
+%%DATADIR%%/resources/inspector/css_overview/css_overview.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewCompletedView.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewController.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewModel.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewPanel.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewProcessingView.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewSidebarPanel.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewStartView.js
+%%DATADIR%%/resources/inspector/css_overview/CSSOverviewUnusedDeclarations.js
+%%DATADIR%%/resources/inspector/dagre_layout/dagre_layout_module.js
+%%DATADIR%%/resources/inspector/data_grid/data_grid_module.js
+%%DATADIR%%/resources/inspector/data_grid/data_grid-legacy.js
+%%DATADIR%%/resources/inspector/data_grid/data_grid.js
+%%DATADIR%%/resources/inspector/data_grid/DataGrid.js
+%%DATADIR%%/resources/inspector/data_grid/ShowMoreDataGridNode.js
+%%DATADIR%%/resources/inspector/data_grid/SortableDataGrid.js
+%%DATADIR%%/resources/inspector/data_grid/ViewportDataGrid.js
+%%DATADIR%%/resources/inspector/data_grid_test_runner/data_grid_test_runner_module.js
+%%DATADIR%%/resources/inspector/device_mode_test_runner/device_mode_test_runner_module.js
+%%DATADIR%%/resources/inspector/devices/devices_module.js
+%%DATADIR%%/resources/inspector/devtools_app.html
+%%DATADIR%%/resources/inspector/devtools_app.js
+%%DATADIR%%/resources/inspector/devtools_compatibility.js
+%%DATADIR%%/resources/inspector/devtools_extension_api.js
+%%DATADIR%%/resources/inspector/diff/diff_match_patch.js
+%%DATADIR%%/resources/inspector/diff/diff_module.js
+%%DATADIR%%/resources/inspector/diff/diff-legacy.js
+%%DATADIR%%/resources/inspector/diff/diff.js
+%%DATADIR%%/resources/inspector/diff/DiffWrapper.js
+%%DATADIR%%/resources/inspector/dom_extension/dom_extension.js
+%%DATADIR%%/resources/inspector/dom_extension/DOMExtension.js
+%%DATADIR%%/resources/inspector/elements/elements_module.js
+%%DATADIR%%/resources/inspector/elements/elements-legacy.js
+%%DATADIR%%/resources/inspector/elements/elements.js
+%%DATADIR%%/resources/inspector/elements/ClassesPaneWidget.js
+%%DATADIR%%/resources/inspector/elements/ColorSwatchPopoverIcon.js
+%%DATADIR%%/resources/inspector/elements/ComputedStyleModel.js
+%%DATADIR%%/resources/inspector/elements/ComputedStyleWidget.js
+%%DATADIR%%/resources/inspector/elements/DOMLinkifier.js
+%%DATADIR%%/resources/inspector/elements/DOMPath.js
+%%DATADIR%%/resources/inspector/elements/ElementsBreadcrumbs.js
+%%DATADIR%%/resources/inspector/elements/ElementsPanel.js
+%%DATADIR%%/resources/inspector/elements/ElementsSidebarPane.js
+%%DATADIR%%/resources/inspector/elements/ElementStatePaneWidget.js
+%%DATADIR%%/resources/inspector/elements/ElementsTreeElement.js
+%%DATADIR%%/resources/inspector/elements/ElementsTreeElementHighlighter.js
+%%DATADIR%%/resources/inspector/elements/ElementsTreeOutline.js
+%%DATADIR%%/resources/inspector/elements/EventListenersWidget.js
+%%DATADIR%%/resources/inspector/elements/InspectElementModeController.js
+%%DATADIR%%/resources/inspector/elements/MarkerDecorator.js
+%%DATADIR%%/resources/inspector/elements/MetricsSidebarPane.js
+%%DATADIR%%/resources/inspector/elements/NodeStackTraceWidget.js
+%%DATADIR%%/resources/inspector/elements/PlatformFontsWidget.js
+%%DATADIR%%/resources/inspector/elements/PropertiesWidget.js
+%%DATADIR%%/resources/inspector/elements/StylePropertyHighlighter.js
+%%DATADIR%%/resources/inspector/elements/StylePropertyTreeElement.js
+%%DATADIR%%/resources/inspector/elements/StylesSidebarPane.js
+%%DATADIR%%/resources/inspector/elements_test_runner/elements_test_runner_module.js
+%%DATADIR%%/resources/inspector/emulated_devices/MotoG4-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/MotoG4-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/Nexus5X-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/Nexus5X-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/Nexus6P-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/Nexus6P-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/emulated_devices_module.js
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-default-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-default-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-navigation-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-horizontal-navigation-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-default-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-default-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-keyboard-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-keyboard-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-navigation-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5-vertical-navigation-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-default-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-default-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-default-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-default-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-navigation-1x.png
+%%DATADIR%%/resources/inspector/emulated_devices/google-nexus-5x-vertical-navigation-2x.png
+%%DATADIR%%/resources/inspector/emulated_devices/iPad-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPad-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone5-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone5-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone6-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone6-portrait.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone6Plus-landscape.svg
+%%DATADIR%%/resources/inspector/emulated_devices/iPhone6Plus-portrait.svg
+%%DATADIR%%/resources/inspector/emulation/AdvancedApp.js
+%%DATADIR%%/resources/inspector/emulation/DeviceModeModel.js
+%%DATADIR%%/resources/inspector/emulation/DeviceModeToolbar.js
+%%DATADIR%%/resources/inspector/emulation/DeviceModeView.js
+%%DATADIR%%/resources/inspector/emulation/DeviceModeWrapper.js
+%%DATADIR%%/resources/inspector/emulation/DevicesSettingsTab.js
+%%DATADIR%%/resources/inspector/emulation/EmulatedDevices.js
+%%DATADIR%%/resources/inspector/emulation/emulation-legacy.js
+%%DATADIR%%/resources/inspector/emulation/emulation.js
+%%DATADIR%%/resources/inspector/emulation/GeolocationsSettingsTab.js
+%%DATADIR%%/resources/inspector/emulation/InspectedPagePlaceholder.js
+%%DATADIR%%/resources/inspector/emulation/MediaQueryInspector.js
+%%DATADIR%%/resources/inspector/emulation/SensorsView.js
+%%DATADIR%%/resources/inspector/event_listeners/event_listeners_module.js
+%%DATADIR%%/resources/inspector/event_listeners/event_listeners-legacy.js
+%%DATADIR%%/resources/inspector/event_listeners/event_listeners.js
+%%DATADIR%%/resources/inspector/event_listeners/EventListenersUtils.js
+%%DATADIR%%/resources/inspector/event_listeners/EventListenersView.js
+%%DATADIR%%/resources/inspector/extensions_test_runner/extensions_test_runner_module.js
+%%DATADIR%%/resources/inspector/extensions/ExtensionAPI.js
+%%DATADIR%%/resources/inspector/extensions/ExtensionPanel.js
+%%DATADIR%%/resources/inspector/extensions/extensions-legacy.js
+%%DATADIR%%/resources/inspector/extensions/extensions.js
+%%DATADIR%%/resources/inspector/extensions/ExtensionServer.js
+%%DATADIR%%/resources/inspector/extensions/ExtensionTraceProvider.js
+%%DATADIR%%/resources/inspector/extensions/ExtensionView.js
+%%DATADIR%%/resources/inspector/formatter_worker_entrypoint.js
+%%DATADIR%%/resources/inspector/formatter_worker/acorn/acorn.js
+%%DATADIR%%/resources/inspector/formatter_worker/acorn/acorn_loose.js
+%%DATADIR%%/resources/inspector/formatter_worker/AcornTokenizer.js
+%%DATADIR%%/resources/inspector/formatter_worker/CSSFormatter.js
+%%DATADIR%%/resources/inspector/formatter_worker/CSSRuleParser.js
+%%DATADIR%%/resources/inspector/formatter_worker/ESTreeWalker.js
+%%DATADIR%%/resources/inspector/formatter_worker/FormattedContentBuilder.js
+%%DATADIR%%/resources/inspector/formatter_worker/formatter_worker.js
+%%DATADIR%%/resources/inspector/formatter_worker/formatter_worker-legacy.js
+%%DATADIR%%/resources/inspector/formatter_worker/FormatterWorker.js
+%%DATADIR%%/resources/inspector/formatter_worker/HTMLFormatter.js
+%%DATADIR%%/resources/inspector/formatter_worker/IdentityFormatter.js
+%%DATADIR%%/resources/inspector/formatter_worker/JavaScriptFormatter.js
+%%DATADIR%%/resources/inspector/formatter_worker/JavaScriptOutline.js
+%%DATADIR%%/resources/inspector/formatter_worker/RelaxedJSONParser.js
+%%DATADIR%%/resources/inspector/formatter/formatter_module.js
+%%DATADIR%%/resources/inspector/formatter/formatter-legacy.js
+%%DATADIR%%/resources/inspector/formatter/formatter.js
+%%DATADIR%%/resources/inspector/formatter/FormatterWorkerPool.js
+%%DATADIR%%/resources/inspector/formatter/ScriptFormatter.js
+%%DATADIR%%/resources/inspector/formatter/SourceFormatter.js
+%%DATADIR%%/resources/inspector/har_importer/har_importer_module.js
+%%DATADIR%%/resources/inspector/har_importer/har_importer-legacy.js
+%%DATADIR%%/resources/inspector/har_importer/har_importer.js
+%%DATADIR%%/resources/inspector/har_importer/HARFormat.js
+%%DATADIR%%/resources/inspector/har_importer/HARImporter.js
+%%DATADIR%%/resources/inspector/heap_profiler_test_runner/heap_profiler_test_runner_module.js
+%%DATADIR%%/resources/inspector/heap_snapshot_model/heap_snapshot_model_module.js
+%%DATADIR%%/resources/inspector/heap_snapshot_model/heap_snapshot_model-legacy.js
+%%DATADIR%%/resources/inspector/heap_snapshot_model/heap_snapshot_model.js
+%%DATADIR%%/resources/inspector/heap_snapshot_model/HeapSnapshotModel.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker_entrypoint.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/AllocationProfile.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/heap_snapshot_worker_module.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/heap_snapshot_worker-legacy.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/heap_snapshot_worker.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/HeapSnapshot.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/HeapSnapshotLoader.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/HeapSnapshotWorker.js
+%%DATADIR%%/resources/inspector/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js
+%%DATADIR%%/resources/inspector/help/help_module.js
+%%DATADIR%%/resources/inspector/help/help-legacy.js
+%%DATADIR%%/resources/inspector/help/help.js
+%%DATADIR%%/resources/inspector/help/HelpImpl.js
+%%DATADIR%%/resources/inspector/help/ReleaseNoteText.js
+%%DATADIR%%/resources/inspector/help/ReleaseNoteView.js
+%%DATADIR%%/resources/inspector/host/host.js
+%%DATADIR%%/resources/inspector/host/host-legacy.js
+%%DATADIR%%/resources/inspector/host/InspectorFrontendHost.js
+%%DATADIR%%/resources/inspector/host/InspectorFrontendHostAPI.js
+%%DATADIR%%/resources/inspector/host/Platform.js
+%%DATADIR%%/resources/inspector/host/ResourceLoader.js
+%%DATADIR%%/resources/inspector/host/UserMetrics.js
+%%DATADIR%%/resources/inspector/inline_editor/BezierEditor.js
+%%DATADIR%%/resources/inspector/inline_editor/BezierUI.js
+%%DATADIR%%/resources/inspector/inline_editor/ColorSwatch.js
+%%DATADIR%%/resources/inspector/inline_editor/CSSShadowEditor.js
+%%DATADIR%%/resources/inspector/inline_editor/CSSShadowModel.js
+%%DATADIR%%/resources/inspector/inline_editor/inline_editor_module.js
+%%DATADIR%%/resources/inspector/inline_editor/inline_editor-legacy.js
+%%DATADIR%%/resources/inspector/inline_editor/inline_editor.js
+%%DATADIR%%/resources/inspector/inline_editor/SwatchPopoverHelper.js
+%%DATADIR%%/resources/inspector/input/input_module.js
+%%DATADIR%%/resources/inspector/input/input-legacy.js
+%%DATADIR%%/resources/inspector/input/input.js
+%%DATADIR%%/resources/inspector/input/InputModel.js
+%%DATADIR%%/resources/inspector/input/InputTimeline.js
+%%DATADIR%%/resources/inspector/inspector_main/inspector_main.js
+%%DATADIR%%/resources/inspector/inspector_main/inspector_main-legacy.js
+%%DATADIR%%/resources/inspector/inspector_main/InspectorMain.js
+%%DATADIR%%/resources/inspector/inspector_main/RenderingOptions.js
+%%DATADIR%%/resources/inspector/inspector.html
+%%DATADIR%%/resources/inspector/inspector.js
+%%DATADIR%%/resources/inspector/integration_test_runner.html
+%%DATADIR%%/resources/inspector/integration_test_runner.js
+%%DATADIR%%/resources/inspector/javascript_metadata/javascript_metadata_module.js
+%%DATADIR%%/resources/inspector/javascript_metadata/javascript_metadata-legacy.js
+%%DATADIR%%/resources/inspector/javascript_metadata/javascript_metadata.js
+%%DATADIR%%/resources/inspector/javascript_metadata/JavaScriptMetadata.js
+%%DATADIR%%/resources/inspector/javascript_metadata/NativeFunctions.js
+%%DATADIR%%/resources/inspector/js_app.html
+%%DATADIR%%/resources/inspector/js_app.js
+%%DATADIR%%/resources/inspector/js_main/js_main.js
+%%DATADIR%%/resources/inspector/js_main/js_main-legacy.js
+%%DATADIR%%/resources/inspector/js_main/JsMain.js
+%%DATADIR%%/resources/inspector/js_profiler/js_profiler_module.js
+%%DATADIR%%/resources/inspector/layer_viewer/layer_viewer_module.js
+%%DATADIR%%/resources/inspector/layer_viewer/layer_viewer-legacy.js
+%%DATADIR%%/resources/inspector/layer_viewer/layer_viewer.js
+%%DATADIR%%/resources/inspector/layer_viewer/LayerDetailsView.js
+%%DATADIR%%/resources/inspector/layer_viewer/Layers3DView.js
+%%DATADIR%%/resources/inspector/layer_viewer/LayerTreeOutline.js
+%%DATADIR%%/resources/inspector/layer_viewer/LayerViewHost.js
+%%DATADIR%%/resources/inspector/layer_viewer/PaintProfilerView.js
+%%DATADIR%%/resources/inspector/layer_viewer/TransformController.js
+%%DATADIR%%/resources/inspector/layers/layers_module.js
+%%DATADIR%%/resources/inspector/layers/layers-legacy.js
+%%DATADIR%%/resources/inspector/layers/layers.js
+%%DATADIR%%/resources/inspector/layers/LayerPaintProfilerView.js
+%%DATADIR%%/resources/inspector/layers/LayersPanel.js
+%%DATADIR%%/resources/inspector/layers/LayerTreeModel.js
+%%DATADIR%%/resources/inspector/layers_test_runner/layers_test_runner_module.js
+%%DATADIR%%/resources/inspector/main/ExecutionContextSelector.js
+%%DATADIR%%/resources/inspector/main/main-legacy.js
+%%DATADIR%%/resources/inspector/main/main.js
+%%DATADIR%%/resources/inspector/main/MainImpl.js
+%%DATADIR%%/resources/inspector/main/SimpleApp.js
+%%DATADIR%%/resources/inspector/media/media_module.js
+%%DATADIR%%/resources/inspector/mobile_throttling/mobile_throttling.js
+%%DATADIR%%/resources/inspector/mobile_throttling/mobile_throttling-legacy.js
+%%DATADIR%%/resources/inspector/mobile_throttling/MobileThrottlingSelector.js
+%%DATADIR%%/resources/inspector/mobile_throttling/NetworkPanelIndicator.js
+%%DATADIR%%/resources/inspector/mobile_throttling/NetworkThrottlingSelector.js
+%%DATADIR%%/resources/inspector/mobile_throttling/ThrottlingManager.js
+%%DATADIR%%/resources/inspector/mobile_throttling/ThrottlingPresets.js
+%%DATADIR%%/resources/inspector/mobile_throttling/ThrottlingSettingsTab.js
+%%DATADIR%%/resources/inspector/ndb_app.html
+%%DATADIR%%/resources/inspector/ndb_app.js
+%%DATADIR%%/resources/inspector/network/network_module.js
+%%DATADIR%%/resources/inspector/network/network-legacy.js
+%%DATADIR%%/resources/inspector/network/network.js
+%%DATADIR%%/resources/inspector/network/BinaryResourceView.js
+%%DATADIR%%/resources/inspector/network/BlockedURLsPane.js
+%%DATADIR%%/resources/inspector/network/EventSourceMessagesView.js
+%%DATADIR%%/resources/inspector/network/HARWriter.js
+%%DATADIR%%/resources/inspector/network/NetworkConfigView.js
+%%DATADIR%%/resources/inspector/network/NetworkDataGridNode.js
+%%DATADIR%%/resources/inspector/network/NetworkFrameGrouper.js
+%%DATADIR%%/resources/inspector/network/NetworkItemView.js
+%%DATADIR%%/resources/inspector/network/NetworkLogView.js
+%%DATADIR%%/resources/inspector/network/NetworkLogViewColumns.js
+%%DATADIR%%/resources/inspector/network/NetworkManageCustomHeadersView.js
+%%DATADIR%%/resources/inspector/network/NetworkOverview.js
+%%DATADIR%%/resources/inspector/network/NetworkPanel.js
+%%DATADIR%%/resources/inspector/network/NetworkSearchScope.js
+%%DATADIR%%/resources/inspector/network/NetworkTimeCalculator.js
+%%DATADIR%%/resources/inspector/network/NetworkWaterfallColumn.js
+%%DATADIR%%/resources/inspector/network/RequestCookiesView.js
+%%DATADIR%%/resources/inspector/network/RequestHeadersView.js
+%%DATADIR%%/resources/inspector/network/RequestHTMLView.js
+%%DATADIR%%/resources/inspector/network/RequestInitiatorView.js
+%%DATADIR%%/resources/inspector/network/RequestPreviewView.js
+%%DATADIR%%/resources/inspector/network/RequestResponseView.js
+%%DATADIR%%/resources/inspector/network/RequestTimingView.js
+%%DATADIR%%/resources/inspector/network/ResourceWebSocketFrameView.js
+%%DATADIR%%/resources/inspector/network/SignedExchangeInfoView.js
+%%DATADIR%%/resources/inspector/network_test_runner/network_test_runner_module.js
+%%DATADIR%%/resources/inspector/node_app.html
+%%DATADIR%%/resources/inspector/node_app.js
+%%DATADIR%%/resources/inspector/node_debugger/node_debugger_module.js
+%%DATADIR%%/resources/inspector/node_main/node_main-legacy.js
+%%DATADIR%%/resources/inspector/node_main/node_main.js
+%%DATADIR%%/resources/inspector/node_main/NodeConnectionsPanel.js
+%%DATADIR%%/resources/inspector/node_main/NodeMain.js
+%%DATADIR%%/resources/inspector/object_ui/object_ui_module.js
+%%DATADIR%%/resources/inspector/object_ui/object_ui-legacy.js
+%%DATADIR%%/resources/inspector/object_ui/object_ui.js
+%%DATADIR%%/resources/inspector/object_ui/CustomPreviewComponent.js
+%%DATADIR%%/resources/inspector/object_ui/JavaScriptAutocomplete.js
+%%DATADIR%%/resources/inspector/object_ui/ObjectPopoverHelper.js
+%%DATADIR%%/resources/inspector/object_ui/ObjectPropertiesSection.js
+%%DATADIR%%/resources/inspector/object_ui/RemoteObjectPreviewFormatter.js
+%%DATADIR%%/resources/inspector/object_ui/JavaScriptREPL.js
+%%DATADIR%%/resources/inspector/perf_ui/perf_ui_module.js
+%%DATADIR%%/resources/inspector/perf_ui/perf_ui-legacy.js
+%%DATADIR%%/resources/inspector/perf_ui/perf_ui.js
+%%DATADIR%%/resources/inspector/perf_ui/ChartViewport.js
+%%DATADIR%%/resources/inspector/perf_ui/FilmStripView.js
+%%DATADIR%%/resources/inspector/perf_ui/FlameChart.js
+%%DATADIR%%/resources/inspector/perf_ui/GCActionDelegate.js
+%%DATADIR%%/resources/inspector/perf_ui/LineLevelProfile.js
+%%DATADIR%%/resources/inspector/perf_ui/LiveHeapProfile.js
+%%DATADIR%%/resources/inspector/perf_ui/NetworkPriorities.js
+%%DATADIR%%/resources/inspector/perf_ui/OverviewGrid.js
+%%DATADIR%%/resources/inspector/perf_ui/PieChart.js
+%%DATADIR%%/resources/inspector/perf_ui/TimelineGrid.js
+%%DATADIR%%/resources/inspector/perf_ui/TimelineOverviewPane.js
+%%DATADIR%%/resources/inspector/performance_monitor/performance_monitor_module.js
+%%DATADIR%%/resources/inspector/performance_monitor/performance_monitor-legacy.js
+%%DATADIR%%/resources/inspector/performance_monitor/performance_monitor.js
+%%DATADIR%%/resources/inspector/performance_monitor/PerformanceMonitor.js
+%%DATADIR%%/resources/inspector/performance_test_runner/performance_test_runner_module.js
+%%DATADIR%%/resources/inspector/persistence/Automapping.js
+%%DATADIR%%/resources/inspector/persistence/EditFileSystemView.js
+%%DATADIR%%/resources/inspector/persistence/FileSystemWorkspaceBinding.js
+%%DATADIR%%/resources/inspector/persistence/IsolatedFileSystem.js
+%%DATADIR%%/resources/inspector/persistence/IsolatedFileSystemManager.js
+%%DATADIR%%/resources/inspector/persistence/NetworkPersistenceManager.js
+%%DATADIR%%/resources/inspector/persistence/persistence.js
+%%DATADIR%%/resources/inspector/persistence/persistence-legacy.js
+%%DATADIR%%/resources/inspector/persistence/PersistenceActions.js
+%%DATADIR%%/resources/inspector/persistence/PersistenceImpl.js
+%%DATADIR%%/resources/inspector/persistence/PersistenceUtils.js
+%%DATADIR%%/resources/inspector/persistence/PlatformFileSystem.js
+%%DATADIR%%/resources/inspector/persistence/WorkspaceSettingsTab.js
+%%DATADIR%%/resources/inspector/platform/platform.js
+%%DATADIR%%/resources/inspector/platform/utilities.js
+%%DATADIR%%/resources/inspector/profiler/profiler_module.js
+%%DATADIR%%/resources/inspector/profiler/profiler-legacy.js
+%%DATADIR%%/resources/inspector/profiler/profiler.js
+%%DATADIR%%/resources/inspector/profiler/BottomUpProfileDataGrid.js
+%%DATADIR%%/resources/inspector/profiler/ChildrenProvider.js
+%%DATADIR%%/resources/inspector/profiler/CPUProfileFlameChart.js
+%%DATADIR%%/resources/inspector/profiler/CPUProfileView.js
+%%DATADIR%%/resources/inspector/profiler/HeapProfilerPanel.js
+%%DATADIR%%/resources/inspector/profiler/HeapProfileView.js
+%%DATADIR%%/resources/inspector/profiler/HeapSnapshotDataGrids.js
+%%DATADIR%%/resources/inspector/profiler/HeapSnapshotGridNodes.js
+%%DATADIR%%/resources/inspector/profiler/HeapSnapshotProxy.js
+%%DATADIR%%/resources/inspector/profiler/HeapSnapshotView.js
+%%DATADIR%%/resources/inspector/profiler/HeapTimelineOverview.js
+%%DATADIR%%/resources/inspector/profiler/IsolateSelector.js
+%%DATADIR%%/resources/inspector/profiler/LiveHeapProfileView.js
+%%DATADIR%%/resources/inspector/profiler/ProfileDataGrid.js
+%%DATADIR%%/resources/inspector/profiler/ProfileHeader.js
+%%DATADIR%%/resources/inspector/profiler/ProfileLauncherView.js
+%%DATADIR%%/resources/inspector/profiler/ProfileSidebarTreeElement.js
+%%DATADIR%%/resources/inspector/profiler/ProfilesPanel.js
+%%DATADIR%%/resources/inspector/profiler/ProfileTypeRegistry.js
+%%DATADIR%%/resources/inspector/profiler/ProfileView.js
+%%DATADIR%%/resources/inspector/profiler/TopDownProfileDataGrid.js
+%%DATADIR%%/resources/inspector/protocol_monitor/protocol_monitor_module.js
+%%DATADIR%%/resources/inspector/protocol_monitor/protocol_monitor-legacy.js
+%%DATADIR%%/resources/inspector/protocol_monitor/protocol_monitor.js
+%%DATADIR%%/resources/inspector/protocol_monitor/ProtocolMonitor.js
+%%DATADIR%%/resources/inspector/protocol/InspectorBackend.js
+%%DATADIR%%/resources/inspector/protocol/NodeURL.js
+%%DATADIR%%/resources/inspector/protocol/protocol.js
+%%DATADIR%%/resources/inspector/protocol/protocol-legacy.js
+%%DATADIR%%/resources/inspector/quick_open/quick_open_module.js
+%%DATADIR%%/resources/inspector/quick_open/quick_open-legacy.js
+%%DATADIR%%/resources/inspector/quick_open/quick_open.js
+%%DATADIR%%/resources/inspector/quick_open/CommandMenu.js
+%%DATADIR%%/resources/inspector/quick_open/FilteredListWidget.js
+%%DATADIR%%/resources/inspector/quick_open/HelpQuickOpen.js
+%%DATADIR%%/resources/inspector/quick_open/QuickOpen.js
+%%DATADIR%%/resources/inspector/resources/resources_module.js
+%%DATADIR%%/resources/inspector/resources/resources-legacy.js
+%%DATADIR%%/resources/inspector/resources/resources.js
+%%DATADIR%%/resources/inspector/resources/ApplicationCacheItemsView.js
+%%DATADIR%%/resources/inspector/resources/ApplicationCacheModel.js
+%%DATADIR%%/resources/inspector/resources/ApplicationPanelSidebar.js
+%%DATADIR%%/resources/inspector/resources/AppManifestView.js
+%%DATADIR%%/resources/inspector/resources/BackgroundServiceModel.js
+%%DATADIR%%/resources/inspector/resources/BackgroundServiceView.js
+%%DATADIR%%/resources/inspector/resources/ClearStorageView.js
+%%DATADIR%%/resources/inspector/resources/CookieItemsView.js
+%%DATADIR%%/resources/inspector/resources/DatabaseModel.js
+%%DATADIR%%/resources/inspector/resources/DatabaseQueryView.js
+%%DATADIR%%/resources/inspector/resources/DatabaseTableView.js
+%%DATADIR%%/resources/inspector/resources/DOMStorageItemsView.js
+%%DATADIR%%/resources/inspector/resources/DOMStorageModel.js
+%%DATADIR%%/resources/inspector/resources/IndexedDBModel.js
+%%DATADIR%%/resources/inspector/resources/IndexedDBViews.js
+%%DATADIR%%/resources/inspector/resources/ResourcesPanel.js
+%%DATADIR%%/resources/inspector/resources/ServiceWorkerCacheViews.js
+%%DATADIR%%/resources/inspector/resources/ServiceWorkersView.js
+%%DATADIR%%/resources/inspector/resources/StorageItemsView.js
+%%DATADIR%%/resources/inspector/root.js
+%%DATADIR%%/resources/inspector/Runtime.js
+%%DATADIR%%/resources/inspector/screencast/InputModel.js
+%%DATADIR%%/resources/inspector/screencast/screencast.js
+%%DATADIR%%/resources/inspector/screencast/screencast-legacy.js
+%%DATADIR%%/resources/inspector/screencast/ScreencastApp.js
+%%DATADIR%%/resources/inspector/screencast/ScreencastView.js
+%%DATADIR%%/resources/inspector/sdk_test_runner/sdk_test_runner_module.js
+%%DATADIR%%/resources/inspector/sdk/ChildTargetManager.js
+%%DATADIR%%/resources/inspector/sdk/CompilerSourceMappingContentProvider.js
+%%DATADIR%%/resources/inspector/sdk/Connections.js
+%%DATADIR%%/resources/inspector/sdk/ConsoleModel.js
+%%DATADIR%%/resources/inspector/sdk/Cookie.js
+%%DATADIR%%/resources/inspector/sdk/CookieModel.js
+%%DATADIR%%/resources/inspector/sdk/CookieParser.js
+%%DATADIR%%/resources/inspector/sdk/CPUProfileDataModel.js
+%%DATADIR%%/resources/inspector/sdk/CPUProfilerModel.js
+%%DATADIR%%/resources/inspector/sdk/CSSMatchedStyles.js
+%%DATADIR%%/resources/inspector/sdk/CSSMedia.js
+%%DATADIR%%/resources/inspector/sdk/CSSMetadata.js
+%%DATADIR%%/resources/inspector/sdk/CSSModel.js
+%%DATADIR%%/resources/inspector/sdk/CSSProperty.js
+%%DATADIR%%/resources/inspector/sdk/CSSRule.js
+%%DATADIR%%/resources/inspector/sdk/CSSStyleDeclaration.js
+%%DATADIR%%/resources/inspector/sdk/CSSStyleSheetHeader.js
+%%DATADIR%%/resources/inspector/sdk/DebuggerModel.js
+%%DATADIR%%/resources/inspector/sdk/DOMDebuggerModel.js
+%%DATADIR%%/resources/inspector/sdk/DOMModel.js
+%%DATADIR%%/resources/inspector/sdk/EmulationModel.js
+%%DATADIR%%/resources/inspector/sdk/FilmStripModel.js
+%%DATADIR%%/resources/inspector/sdk/HARLog.js
+%%DATADIR%%/resources/inspector/sdk/HeapProfilerModel.js
+%%DATADIR%%/resources/inspector/sdk/IsolateManager.js
+%%DATADIR%%/resources/inspector/sdk/IssuesModel.js
+%%DATADIR%%/resources/inspector/sdk/LayerTreeBase.js
+%%DATADIR%%/resources/inspector/sdk/LogModel.js
+%%DATADIR%%/resources/inspector/sdk/NetworkLog.js
+%%DATADIR%%/resources/inspector/sdk/NetworkManager.js
+%%DATADIR%%/resources/inspector/sdk/NetworkRequest.js
+%%DATADIR%%/resources/inspector/sdk/OverlayModel.js
+%%DATADIR%%/resources/inspector/sdk/PaintProfiler.js
+%%DATADIR%%/resources/inspector/sdk/PerformanceMetricsModel.js
+%%DATADIR%%/resources/inspector/sdk/ProfileTreeModel.js
+%%DATADIR%%/resources/inspector/sdk/RemoteObject.js
+%%DATADIR%%/resources/inspector/sdk/Resource.js
+%%DATADIR%%/resources/inspector/sdk/ResourceTreeModel.js
+%%DATADIR%%/resources/inspector/sdk/RuntimeModel.js
+%%DATADIR%%/resources/inspector/sdk/ScreenCaptureModel.js
+%%DATADIR%%/resources/inspector/sdk/Script.js
+%%DATADIR%%/resources/inspector/sdk/sdk.js
+%%DATADIR%%/resources/inspector/sdk/sdk-legacy.js
+%%DATADIR%%/resources/inspector/sdk/SDKModel.js
+%%DATADIR%%/resources/inspector/sdk/SecurityOriginManager.js
+%%DATADIR%%/resources/inspector/sdk/ServerTiming.js
+%%DATADIR%%/resources/inspector/sdk/ServiceWorkerCacheModel.js
+%%DATADIR%%/resources/inspector/sdk/ServiceWorkerManager.js
+%%DATADIR%%/resources/inspector/sdk/SourceMap.js
+%%DATADIR%%/resources/inspector/sdk/SourceMapManager.js
+%%DATADIR%%/resources/inspector/sdk/TracingManager.js
+%%DATADIR%%/resources/inspector/sdk/TracingModel.js
+%%DATADIR%%/resources/inspector/sdk/wasm_source_map/pkg/wasm_source_map_bg.wasm
+%%DATADIR%%/resources/inspector/sdk/wasm_source_map/pkg/wasm_source_map.js
+%%DATADIR%%/resources/inspector/search/search_module.js
+%%DATADIR%%/resources/inspector/search/search-legacy.js
+%%DATADIR%%/resources/inspector/search/search.js
+%%DATADIR%%/resources/inspector/search/SearchConfig.js
+%%DATADIR%%/resources/inspector/search/SearchResultsPane.js
+%%DATADIR%%/resources/inspector/search/SearchView.js
+%%DATADIR%%/resources/inspector/security/security_module.js
+%%DATADIR%%/resources/inspector/security/security-legacy.js
+%%DATADIR%%/resources/inspector/security/security.js
+%%DATADIR%%/resources/inspector/security/SecurityModel.js
+%%DATADIR%%/resources/inspector/security/SecurityPanel.js
+%%DATADIR%%/resources/inspector/security_test_runner/security_test_runner_module.js
+%%DATADIR%%/resources/inspector/services/ServiceManager.js
+%%DATADIR%%/resources/inspector/services/services.js
+%%DATADIR%%/resources/inspector/services/services-legacy.js
+%%DATADIR%%/resources/inspector/settings/settings_module.js
+%%DATADIR%%/resources/inspector/settings/settings-legacy.js
+%%DATADIR%%/resources/inspector/settings/settings.js
+%%DATADIR%%/resources/inspector/settings/FrameworkBlackboxSettingsTab.js
+%%DATADIR%%/resources/inspector/settings/SettingsScreen.js
+%%DATADIR%%/resources/inspector/shell.js
+%%DATADIR%%/resources/inspector/snippets/snippets_module.js
+%%DATADIR%%/resources/inspector/snippets/snippets-legacy.js
+%%DATADIR%%/resources/inspector/snippets/snippets.js
+%%DATADIR%%/resources/inspector/snippets/ScriptSnippetFileSystem.js
+%%DATADIR%%/resources/inspector/snippets/SnippetsQuickOpen.js
+%%DATADIR%%/resources/inspector/source_frame/source_frame_module.js
+%%DATADIR%%/resources/inspector/source_frame/source_frame-legacy.js
+%%DATADIR%%/resources/inspector/source_frame/source_frame.js
+%%DATADIR%%/resources/inspector/source_frame/BinaryResourceViewFactory.js
+%%DATADIR%%/resources/inspector/source_frame/FontView.js
+%%DATADIR%%/resources/inspector/source_frame/ImageView.js
+%%DATADIR%%/resources/inspector/source_frame/JSONView.js
+%%DATADIR%%/resources/inspector/source_frame/PreviewFactory.js
+%%DATADIR%%/resources/inspector/source_frame/ResourceSourceFrame.js
+%%DATADIR%%/resources/inspector/source_frame/SourceCodeDiff.js
+%%DATADIR%%/resources/inspector/source_frame/SourceFrame.js
+%%DATADIR%%/resources/inspector/source_frame/SourcesTextEditor.js
+%%DATADIR%%/resources/inspector/source_frame/XMLView.js
+%%DATADIR%%/resources/inspector/sources/sources_module.js
+%%DATADIR%%/resources/inspector/sources/sources-legacy.js
+%%DATADIR%%/resources/inspector/sources/sources.js
+%%DATADIR%%/resources/inspector/sources/AddSourceMapURLDialog.js
+%%DATADIR%%/resources/inspector/sources/BreakpointEditDialog.js
+%%DATADIR%%/resources/inspector/sources/CallStackSidebarPane.js
+%%DATADIR%%/resources/inspector/sources/CoveragePlugin.js
+%%DATADIR%%/resources/inspector/sources/CSSPlugin.js
+%%DATADIR%%/resources/inspector/sources/DebuggerPausedMessage.js
+%%DATADIR%%/resources/inspector/sources/DebuggerPlugin.js
+%%DATADIR%%/resources/inspector/sources/EditingLocationHistoryManager.js
+%%DATADIR%%/resources/inspector/sources/FilePathScoreFunction.js
+%%DATADIR%%/resources/inspector/sources/FilteredUISourceCodeListProvider.js
+%%DATADIR%%/resources/inspector/sources/GoToLineQuickOpen.js
+%%DATADIR%%/resources/inspector/sources/GutterDiffPlugin.js
+%%DATADIR%%/resources/inspector/sources/InplaceFormatterEditorAction.js
+%%DATADIR%%/resources/inspector/sources/JavaScriptBreakpointsSidebarPane.js
+%%DATADIR%%/resources/inspector/sources/JavaScriptCompilerPlugin.js
+%%DATADIR%%/resources/inspector/sources/NavigatorView.js
+%%DATADIR%%/resources/inspector/sources/OpenFileQuickOpen.js
+%%DATADIR%%/resources/inspector/sources/OutlineQuickOpen.js
+%%DATADIR%%/resources/inspector/sources/Plugin.js
+%%DATADIR%%/resources/inspector/sources/ScopeChainSidebarPane.js
+%%DATADIR%%/resources/inspector/sources/ScriptFormatterEditorAction.js
+%%DATADIR%%/resources/inspector/sources/ScriptOriginPlugin.js
+%%DATADIR%%/resources/inspector/sources/SearchSourcesView.js
+%%DATADIR%%/resources/inspector/sources/SimpleHistoryManager.js
+%%DATADIR%%/resources/inspector/sources/SnippetsPlugin.js
+%%DATADIR%%/resources/inspector/sources/SourceMapNamesResolver.js
+%%DATADIR%%/resources/inspector/sources/SourcesNavigator.js
+%%DATADIR%%/resources/inspector/sources/SourcesPanel.js
+%%DATADIR%%/resources/inspector/sources/SourcesSearchScope.js
+%%DATADIR%%/resources/inspector/sources/SourcesView.js
+%%DATADIR%%/resources/inspector/sources/TabbedEditorContainer.js
+%%DATADIR%%/resources/inspector/sources/ThreadsSidebarPane.js
+%%DATADIR%%/resources/inspector/sources/UISourceCodeFrame.js
+%%DATADIR%%/resources/inspector/sources/WatchExpressionsSidebarPane.js
+%%DATADIR%%/resources/inspector/sources_test_runner/sources_test_runner_module.js
+%%DATADIR%%/resources/inspector/test_runner/test_runner.js
+%%DATADIR%%/resources/inspector/test_runner/TestRunner.js
+%%DATADIR%%/resources/inspector/text_editor/text_editor_module.js
+%%DATADIR%%/resources/inspector/text_editor/CodeMirrorTextEditor.js
+%%DATADIR%%/resources/inspector/text_editor/CodeMirrorUtils.js
+%%DATADIR%%/resources/inspector/text_editor/text_editor.js
+%%DATADIR%%/resources/inspector/text_editor/text_editor-legacy.js
+%%DATADIR%%/resources/inspector/text_editor/TextEditorAutocompleteController.js
+%%DATADIR%%/resources/inspector/text_utils/text_utils.js
+%%DATADIR%%/resources/inspector/text_utils/text_utils-legacy.js
+%%DATADIR%%/resources/inspector/text_utils/Text.js
+%%DATADIR%%/resources/inspector/text_utils/TextCursor.js
+%%DATADIR%%/resources/inspector/text_utils/TextRange.js
+%%DATADIR%%/resources/inspector/text_utils/TextUtils.js
+%%DATADIR%%/resources/inspector/third_party/wasmparser/WasmDis.js
+%%DATADIR%%/resources/inspector/third_party/wasmparser/WasmParser.js
+%%DATADIR%%/resources/inspector/timeline_model/timeline_model_module.js
+%%DATADIR%%/resources/inspector/timeline_model/timeline_model-legacy.js
+%%DATADIR%%/resources/inspector/timeline_model/timeline_model.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineFrameModel.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineIRModel.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineJSProfile.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineModel.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineModelFilter.js
+%%DATADIR%%/resources/inspector/timeline_model/TimelineProfileTree.js
+%%DATADIR%%/resources/inspector/timeline_model/TracingLayerTree.js
+%%DATADIR%%/resources/inspector/timeline/timeline_module.js
+%%DATADIR%%/resources/inspector/timeline/timeline-legacy.js
+%%DATADIR%%/resources/inspector/timeline/timeline.js
+%%DATADIR%%/resources/inspector/timeline/CountersGraph.js
+%%DATADIR%%/resources/inspector/timeline/EventsTimelineTreeView.js
+%%DATADIR%%/resources/inspector/timeline/ExtensionTracingSession.js
+%%DATADIR%%/resources/inspector/timeline/PerformanceModel.js
+%%DATADIR%%/resources/inspector/timeline/TimelineController.js
+%%DATADIR%%/resources/inspector/timeline/TimelineDetailsView.js
+%%DATADIR%%/resources/inspector/timeline/TimelineEventOverview.js
+%%DATADIR%%/resources/inspector/timeline/TimelineFilters.js
+%%DATADIR%%/resources/inspector/timeline/TimelineFlameChartDataProvider.js
+%%DATADIR%%/resources/inspector/timeline/TimelineFlameChartNetworkDataProvider.js
+%%DATADIR%%/resources/inspector/timeline/TimelineFlameChartView.js
+%%DATADIR%%/resources/inspector/timeline/TimelineHistoryManager.js
+%%DATADIR%%/resources/inspector/timeline/TimelineLayersView.js
+%%DATADIR%%/resources/inspector/timeline/TimelineLoader.js
+%%DATADIR%%/resources/inspector/timeline/TimelinePaintProfilerView.js
+%%DATADIR%%/resources/inspector/timeline/TimelinePanel.js
+%%DATADIR%%/resources/inspector/timeline/TimelineTreeView.js
+%%DATADIR%%/resources/inspector/timeline/TimelineUIUtils.js
+%%DATADIR%%/resources/inspector/timeline/UIDevtoolsController.js
+%%DATADIR%%/resources/inspector/timeline/UIDevtoolsUtils.js
+%%DATADIR%%/resources/inspector/toolbox_bootstrap/toolbox_bootstrap.js
+%%DATADIR%%/resources/inspector/toolbox.html
+%%DATADIR%%/resources/inspector/toolbox.js
+%%DATADIR%%/resources/inspector/ui/Action.js
+%%DATADIR%%/resources/inspector/ui/ActionDelegate.js
+%%DATADIR%%/resources/inspector/ui/ActionRegistry.js
+%%DATADIR%%/resources/inspector/ui/ARIAUtils.js
+%%DATADIR%%/resources/inspector/ui/Context.js
+%%DATADIR%%/resources/inspector/ui/ContextFlavorListener.js
+%%DATADIR%%/resources/inspector/ui/ContextMenu.js
+%%DATADIR%%/resources/inspector/ui/Dialog.js
+%%DATADIR%%/resources/inspector/ui/DropTarget.js
+%%DATADIR%%/resources/inspector/ui/EmptyWidget.js
+%%DATADIR%%/resources/inspector/ui/FilterBar.js
+%%DATADIR%%/resources/inspector/ui/FilterSuggestionBuilder.js
+%%DATADIR%%/resources/inspector/ui/ForwardedInputEventHandler.js
+%%DATADIR%%/resources/inspector/ui/Fragment.js
+%%DATADIR%%/resources/inspector/ui/Geometry.js
+%%DATADIR%%/resources/inspector/ui/GlassPane.js
+%%DATADIR%%/resources/inspector/ui/HistoryInput.js
+%%DATADIR%%/resources/inspector/ui/Icon.js
+%%DATADIR%%/resources/inspector/ui/Infobar.js
+%%DATADIR%%/resources/inspector/ui/InplaceEditor.js
+%%DATADIR%%/resources/inspector/ui/InspectorView.js
+%%DATADIR%%/resources/inspector/ui/KeyboardShortcut.js
+%%DATADIR%%/resources/inspector/ui/ListControl.js
+%%DATADIR%%/resources/inspector/ui/ListModel.js
+%%DATADIR%%/resources/inspector/ui/ListWidget.js
+%%DATADIR%%/resources/inspector/ui/Panel.js
+%%DATADIR%%/resources/inspector/ui/PopoverHelper.js
+%%DATADIR%%/resources/inspector/ui/ProgressIndicator.js
+%%DATADIR%%/resources/inspector/ui/RemoteDebuggingTerminatedScreen.js
+%%DATADIR%%/resources/inspector/ui/ReportView.js
+%%DATADIR%%/resources/inspector/ui/ResizerWidget.js
+%%DATADIR%%/resources/inspector/ui/RootView.js
+%%DATADIR%%/resources/inspector/ui/SearchableView.js
+%%DATADIR%%/resources/inspector/ui/SegmentedButton.js
+%%DATADIR%%/resources/inspector/ui/SettingsUI.js
+%%DATADIR%%/resources/inspector/ui/ShortcutRegistry.js
+%%DATADIR%%/resources/inspector/ui/ShortcutsScreen.js
+%%DATADIR%%/resources/inspector/ui/SoftContextMenu.js
+%%DATADIR%%/resources/inspector/ui/SoftDropDown.js
+%%DATADIR%%/resources/inspector/ui/SplitWidget.js
+%%DATADIR%%/resources/inspector/ui/SuggestBox.js
+%%DATADIR%%/resources/inspector/ui/SyntaxHighlighter.js
+%%DATADIR%%/resources/inspector/ui/TabbedPane.js
+%%DATADIR%%/resources/inspector/ui/TargetCrashedScreen.js
+%%DATADIR%%/resources/inspector/ui/TextEditor.js
+%%DATADIR%%/resources/inspector/ui/TextPrompt.js
+%%DATADIR%%/resources/inspector/ui/ThrottledWidget.js
+%%DATADIR%%/resources/inspector/ui/Toolbar.js
+%%DATADIR%%/resources/inspector/ui/Tooltip.js
+%%DATADIR%%/resources/inspector/ui/Treeoutline.js
+%%DATADIR%%/resources/inspector/ui/ui.js
+%%DATADIR%%/resources/inspector/ui/ui-legacy.js
+%%DATADIR%%/resources/inspector/ui/UIUtils.js
+%%DATADIR%%/resources/inspector/ui/View.js
+%%DATADIR%%/resources/inspector/ui/ViewManager.js
+%%DATADIR%%/resources/inspector/ui/Widget.js
+%%DATADIR%%/resources/inspector/ui/XElement.js
+%%DATADIR%%/resources/inspector/ui/XLink.js
+%%DATADIR%%/resources/inspector/ui/XWidget.js
+%%DATADIR%%/resources/inspector/ui/ZoomManager.js
+%%DATADIR%%/resources/inspector/ui/utils/append-style.js
+%%DATADIR%%/resources/inspector/ui/utils/create-shadow-root-with-core-styles.js
+%%DATADIR%%/resources/inspector/ui/utils/focus-changed.js
+%%DATADIR%%/resources/inspector/ui/utils/inject-core-styles.js
+%%DATADIR%%/resources/inspector/ui/utils/measured-scrollbar-width.js
+%%DATADIR%%/resources/inspector/ui/utils/register-custom-element.js
+%%DATADIR%%/resources/inspector/ui/utils/utils.js
+%%DATADIR%%/resources/inspector/wasmparser_worker_entrypoint.js
+%%DATADIR%%/resources/inspector/wasmparser_worker/wasmparser_worker.js
+%%DATADIR%%/resources/inspector/wasmparser_worker/WasmParserWorker.js
+%%DATADIR%%/resources/inspector/web_audio/web_audio_module.js
+%%DATADIR%%/resources/inspector/web_audio/web_audio-legacy.js
+%%DATADIR%%/resources/inspector/web_audio/web_audio.js
+%%DATADIR%%/resources/inspector/web_audio/AudioContextContentBuilder.js
+%%DATADIR%%/resources/inspector/web_audio/AudioContextSelector.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/EdgeView.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/GraphManager.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/GraphStyle.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/GraphView.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/NodeRendererUtility.js
+%%DATADIR%%/resources/inspector/web_audio/graph_visualizer/NodeView.js
+%%DATADIR%%/resources/inspector/web_audio/WebAudioModel.js
+%%DATADIR%%/resources/inspector/web_audio/WebAudioView.js
+%%DATADIR%%/resources/inspector/worker_app.html
+%%DATADIR%%/resources/inspector/worker_app.js
+%%DATADIR%%/resources/inspector/worker_main/worker_main-legacy.js
+%%DATADIR%%/resources/inspector/worker_main/worker_main.js
+%%DATADIR%%/resources/inspector/worker_main/WorkerMain.js
+%%DATADIR%%/resources/inspector/workspace_diff/workspace_diff_module.js
+%%DATADIR%%/resources/inspector/workspace_diff/workspace_diff-legacy.js
+%%DATADIR%%/resources/inspector/workspace_diff/workspace_diff.js
+%%DATADIR%%/resources/inspector/workspace_diff/WorkspaceDiff.js
+%%DATADIR%%/resources/inspector/workspace/FileManager.js
+%%DATADIR%%/resources/inspector/workspace/UISourceCode.js
+%%DATADIR%%/resources/inspector/workspace/workspace.js
+%%DATADIR%%/resources/inspector/workspace/workspace-legacy.js
+%%DATADIR%%/resources/inspector/workspace/WorkspaceImpl.js
+%%DATADIR%%/snapshot_blob.bin
+%%DATADIR%%/libvk_swiftshader.so
+%%DATADIR%%/swiftshader/libEGL.so
+%%DATADIR%%/swiftshader/libGLESv2.so
+%%DATADIR%%/v8_context_snapshot.bin
+%%DEBUG%%%%DATADIR%%/character_data_generator
+%%DEBUG%%%%DATADIR%%/libVkLayer_khronos_validation.so
+%%DEBUG%%%%DATADIR%%/libvulkan.so
+man/man1/iridium.1.gz
+share/applications/iridium-browser.desktop
+share/icons/hicolor/128x128/apps/iridium.png
+share/icons/hicolor/22x22/apps/iridium.png
+share/icons/hicolor/24x24/apps/iridium.png
+share/icons/hicolor/256x256/apps/iridium.png
+share/icons/hicolor/48x48/apps/iridium.png
+share/icons/hicolor/64x64/apps/iridium.png
diff --git a/www/moinmoin/Makefile b/www/moinmoin/Makefile
new file mode 100644
index 000000000000..cbd1c6c21db1
--- /dev/null
+++ b/www/moinmoin/Makefile
@@ -0,0 +1,91 @@
+# Created by: Hye-Shik Chang <perky@python.or.kr>
+# $FreeBSD$
+
+PORTNAME= moinmoin
+PORTVERSION= 1.9.10
+CATEGORIES= www python
+MASTER_SITES= https://static.moinmo.in/files/
+DISTNAME= moin-${PORTVERSION}
+
+MAINTAINER= python@FreeBSD.org
+COMMENT= Easy to use, full-featured and extensible wiki software package
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/docs/licenses/COPYING
+
+USES= cpe python:2.7 shebangfix
+USE_PYTHON= distutils
+
+NO_ARCH= yes
+CPE_VENDOR= moinmo
+PYDISTUTILS_PKGNAME= moin
+SHEBANG_FILES= wiki/server/moin*
+
+PLIST_SUB+= PYTHON_SITELIB=${PYTHON_SITELIBDIR:S|^${LOCALBASE}/||} \
+ DATADIR=share/moin
+SUB_FILES= pkg-install
+SUB_LIST= MOINDIR=${MOINDIR} MOINDEST=${MOINDEST} MOINVER=${MOINVER} \
+ HTDOCS=${PYTHON_SITELIBDIR}/MoinMoin/web/static/htdocs
+
+OPTIONS_DEFINE= RECAPTCHA VERIFYEMAIL
+OPTIONS_DEFAULT= RECAPTCHA VERIFYEMAIL
+OPTIONS_SUB= yes
+
+RECAPTCHA_DESC= reCAPTCHA v2 support
+VERIFYEMAIL_DESC= Support for verifying new account email addresses
+
+RECAPTCHA_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-recaptchav2
+VERIFYEMAIL_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-verifyemail
+
+CGIUSER?= www
+CGIGROUP?= www
+MOINDIR= ${PREFIX}/share/moin
+MOINDEST?= ${PREFIX}/www/wiki
+MOINVER?= ${PORTVERSION:S|.||g}
+MOINTYPE?= CGI
+
+PKGDEINSTALL= ${PKGINSTALL}
+
+.if ${MOINTYPE} == "STANDALONE"
+MOINSCRIPT= ${MOINDIR}/server/moin
+.elif ${MOINTYPE} == "FCGI"
+MOINSCRIPT= ${MOINDIR}/server/moin.fcgi
+.elif ${MOINTYPE} == "MOD_PYTHON"
+.elif ${MOINTYPE} == "CGI"
+MOINSCRIPT= ${MOINDIR}/server/moin.cgi
+.elif ${MOINTYPE} == "WSGI"
+MOINSCRIPT= ${MOINDIR}/server/moin.wsgi
+.else
+BROKEN= MOINTYPE must be a STANDALONE, FCGI, WSGI, MOD_PYTHON, or CGI
+.endif
+
+pre-everything::
+ @${ECHO}
+ @${ECHO} "Set MOINTYPE=(CGI|FCGI|WSGI|STANDALONE) to define"
+ @${ECHO} "type of installation. Default is CGI."
+ @${ECHO} "Use MOINDEST=/path to modify installation destination."
+ @${ECHO} "Default value for MOINDEST is ${PREFIX}/www/wiki."
+ @${ECHO}
+ @${ECHO} "To get correct permissions, please set CGIUSER, CGIGROUP"
+ @${ECHO} "per default it is set to www:www."
+ @${ECHO}
+
+instance: pre-everything apply-slist
+ @${ECHO_CMD} "Creating a new wiki instance in ${MOINDEST}."; \
+ if [ -f ${MOINDIR}/config/wikiconfig.py ]; then \
+ ${MKDIR} ${MOINDEST}; \
+ ${CP} -R ${MOINDIR}/data ${MOINDEST}; \
+ ${CP} -R ${MOINDIR}/underlay ${MOINDEST}; \
+ ${CHMOD} -R u+rw,go-ws ${MOINDEST}/data; \
+ ${INSTALL_SCRIPT} ${MOINDIR}/config/wikiconfig.py ${MOINDEST}; \
+ if [ ! -z ${MOINSCRIPT} ]; then \
+ ${INSTALL_SCRIPT} ${MOINSCRIPT} ${MOINDEST}; \
+ fi; \
+ ${CHOWN} -R ${CGIUSER}:${CGIGROUP} ${MOINDEST}; \
+ ${SH} ${PKGINSTALL} ${PKGNAME} INSTANCE ${MOINTYPE}; \
+ else \
+ ${ECHO_CMD} "You need to install moinmoin first before trying"; \
+ ${ECHO_CMD} "to add a new wiki instance."; \
+ fi
+
+.include <bsd.port.mk>
diff --git a/www/moinmoin/distinfo b/www/moinmoin/distinfo
new file mode 100644
index 000000000000..44f6c502c523
--- /dev/null
+++ b/www/moinmoin/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1536591873
+SHA256 (moin-1.9.10.tar.gz) = 4a264418e886082abd457c26991f4a8f4847cd1a2ffc11e10d66231da8a5053c
+SIZE (moin-1.9.10.tar.gz) = 37283678
diff --git a/www/moinmoin/files/extra-patch-recaptchav2 b/www/moinmoin/files/extra-patch-recaptchav2
new file mode 100644
index 000000000000..60241b7cf0cf
--- /dev/null
+++ b/www/moinmoin/files/extra-patch-recaptchav2
@@ -0,0 +1,299 @@
+# Based on https://gist.github.com/tfoote/675b98df53369e199dea
+
+--- MoinMoin/action/AttachFile.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/action/AttachFile.py
+@@ -44,6 +44,7 @@ from MoinMoin import config, packages
+ from MoinMoin.Page import Page
+ from MoinMoin.util import filesys, timefuncs
+ from MoinMoin.security.textcha import TextCha
++from MoinMoin.security.sec_recaptcha import ReCaptcha
+ from MoinMoin.events import FileAttachedEvent, FileRemovedEvent, send_event
+
+ action_name = __name__.split('.')[-1]
+@@ -654,6 +655,7 @@ def send_uploadform(pagename, request):
+ <dd><input type="checkbox" name="overwrite" value="1" %(overwrite_checked)s></dd>
+ </dl>
+ %(textcha)s
++%(recaptcha)s
+ <p>
+ <input type="hidden" name="action" value="%(action_name)s">
+ <input type="hidden" name="do" value="upload">
+@@ -671,6 +673,7 @@ def send_uploadform(pagename, request):
+ 'overwrite_checked': ('', 'checked')[request.form.get('overwrite', '0') == '1'],
+ 'upload_button': _('Upload'),
+ 'textcha': TextCha(request).render(),
++ 'recaptcha': ReCaptcha(request).render(),
+ 'ticket': wikiutil.createTicket(request),
+ })
+
+@@ -728,6 +731,8 @@ def _do_upload(pagename, request):
+ # but it could be extended to more/all attachment write access
+ if not TextCha(request).check_answer_from_form():
+ return _('TextCha: Wrong answer! Go back and try again...')
++ if not ReCaptcha(request).check_answer_from_form():
++ return _('ReCaptcha: Wrong answer! Go back and try again...')
+
+ form = request.form
+
+--- MoinMoin/action/CopyPage.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/action/CopyPage.py
+@@ -14,6 +14,7 @@ from MoinMoin.Page import Page
+ from MoinMoin.PageEditor import PageEditor
+ from MoinMoin.action import ActionBase
+ from MoinMoin.security.textcha import TextCha
++from MoinMoin.security.sec_recaptcha import ReCaptcha
+
+ class CopyPage(ActionBase):
+ """ Copy page action
+@@ -45,11 +46,14 @@ class CopyPage(ActionBase):
+
+ def do_action(self):
+ """ copy this page to "pagename" """
++ status = False
+ _ = self._
+ # Currently we only check TextCha for upload (this is what spammers ususally do),
+ # but it could be extended to more/all attachment write access
+ if not TextCha(self.request).check_answer_from_form():
+ return False, _('TextCha: Wrong answer! Go back and try again...')
++ if not ReCaptcha(self.request).check_answer_from_form():
++ return status, _('ReCaptcha: Wrong answer! Go back and try again...')
+
+ form = self.form
+ newpagename = form.get('newpagename', u'')
+@@ -90,6 +94,7 @@ class CopyPage(ActionBase):
+
+ d = {
+ 'textcha': TextCha(self.request).render(),
++ 'recaptcha': ReCaptcha(self.request).render(),
+ 'subpage': subpages,
+ 'subpages_checked': ('', 'checked')[self.request.args.get('subpages_checked', '0') == '1'],
+ 'subpage_label': _('Copy all /subpages too?'),
+@@ -105,6 +110,7 @@ class CopyPage(ActionBase):
+ <br>
+ <br>
+ %(textcha)s
++%(recaptcha)s
+ <table>
+ <tr>
+ <dd>
+@@ -140,6 +146,7 @@ class CopyPage(ActionBase):
+ else:
+ d = {
+ 'textcha': TextCha(self.request).render(),
++ 'recaptcha': ReCaptcha(self.request).render(),
+ 'pagename': wikiutil.escape(self.pagename, True),
+ 'newname_label': _("New name"),
+ 'comment_label': _("Optional reason for the copying"),
+@@ -147,6 +154,7 @@ class CopyPage(ActionBase):
+ }
+ return '''
+ %(textcha)s
++%(recaptcha)s
+ <table>
+ <tr>
+ <td class="label"><label>%(newname_label)s</label></td>
+--- MoinMoin/action/edit.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/action/edit.py
+@@ -163,6 +163,9 @@ def execute(pagename, request):
+ from MoinMoin.security.textcha import TextCha
+ if not TextCha(request).check_answer_from_form():
+ raise pg.SaveError(_('TextCha: Wrong answer! Try again below...'))
++ from MoinMoin.security.sec_recaptcha import ReCaptcha
++ if not ReCaptcha(request).check_answer_from_form():
++ raise pg.SaveError(_('ReCaptcha: Wrong answer! Try again below...'))
+ if request.cfg.comment_required and not comment:
+ raise pg.SaveError(_('Supplying a comment is mandatory. Write a comment below and try again...'))
+ savemsg = pg.saveText(savetext, rev, trivial=trivial, comment=comment)
+--- MoinMoin/action/Load.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/action/Load.py
+@@ -14,6 +14,7 @@ from MoinMoin.action import ActionBase, AttachFile
+ from MoinMoin.PageEditor import PageEditor
+ from MoinMoin.Page import Page
+ from MoinMoin.security.textcha import TextCha
++from MoinMoin.security.sec_recaptcha import ReCaptcha
+
+ class Load(ActionBase):
+ """ Load page action
+@@ -40,6 +41,8 @@ class Load(ActionBase):
+ # but it could be extended to more/all attachment write access
+ if not TextCha(request).check_answer_from_form():
+ return status, _('TextCha: Wrong answer! Go back and try again...')
++ if not ReCaptcha(request).check_answer_from_form():
++ return _('ReCaptcha: Wrong answer! Go back and try again...')
+
+ comment = form.get('comment', u'')
+ comment = wikiutil.clean_input(comment)
+@@ -97,6 +100,7 @@ class Load(ActionBase):
+ <dd><input type="text" name="comment" size="80" maxlength="200"></dd>
+ </dl>
+ %(textcha)s
++%(recaptcha)s
+ <p>
+ <input type="hidden" name="action" value="%(action_name)s">
+ <input type="hidden" name="do" value="upload">
+@@ -115,6 +119,7 @@ class Load(ActionBase):
+ 'buttons_html': buttons_html,
+ 'action_name': self.form_trigger,
+ 'textcha': TextCha(self.request).render(),
++ 'recaptcha': ReCaptcha(self.request).render(),
+ }
+
+ def execute(pagename, request):
+--- MoinMoin/action/newaccount.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/action/newaccount.py
+@@ -10,6 +10,7 @@ from MoinMoin import user, wikiutil
+ from MoinMoin.Page import Page
+ from MoinMoin.widget import html
+ from MoinMoin.security.textcha import TextCha
++from MoinMoin.security.sec_recaptcha import ReCaptcha
+ from MoinMoin.auth import MoinAuth
+
+
+@@ -26,6 +27,9 @@ def _create_user(request):
+ if not TextCha(request).check_answer_from_form():
+ return _('TextCha: Wrong answer! Go back and try again...')
+
++ if not ReCaptcha(request).check_answer_from_form():
++ return _('ReCaptcha: Wrong answer! Go back and try again...')
++
+ # Create user profile
+ theuser = user.User(request, auth_method="new-user")
+
+@@ -141,6 +145,17 @@ def _create_form(request):
+ if textcha:
+ td.append(textcha.render())
+ row.append(td)
++
++ recaptcha = ReCaptcha(request)
++ if recaptcha.is_enabled():
++ row = html.TR()
++ tbl.append(row)
++ row.append(html.TD().append(html.STRONG().append(
++ html.Text(_('ReCaptcha (required)')))))
++ td = html.TD()
++ if recaptcha:
++ td.append(recaptcha.render())
++ row.append(td)
+
+ row = html.TR()
+ tbl.append(row)
+--- MoinMoin/PageEditor.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/PageEditor.py
+@@ -422,6 +422,9 @@ If you don't want that, hit '''%(cancel_button_text)s'
+ from MoinMoin.security.textcha import TextCha
+ request.write(TextCha(request).render())
+
++ from MoinMoin.security.sec_recaptcha import ReCaptcha
++ request.write(ReCaptcha(request).render())
++
+ # Add textarea with page text
+ self.sendconfirmleaving()
+
+--- MoinMoin/PageGraphicalEditor.py.orig 2016-10-31 20:44:01 UTC
++++ MoinMoin/PageGraphicalEditor.py
+@@ -305,6 +305,9 @@ If you don't want that, hit '''%(cancel_button_text)s'
+ from MoinMoin.security.textcha import TextCha
+ request.write(TextCha(request).render())
+
++ from MoinMoin.security.sec_recaptcha import ReCaptcha
++ request.write(ReCaptcha(request).render())
++
+ self.sendconfirmleaving() # TODO update state of flgChange to make this work, see PageEditor
+
+ # Add textarea with page text
+--- MoinMoin/security/sec_recaptcha.py.orig 2018-05-02 03:24:23 UTC
++++ MoinMoin/security/sec_recaptcha.py
+@@ -0,0 +1,93 @@
++# -*- coding: iso-8859-1 -*-
++"""
++ MoinMoin - recaptcha support
++
++ Based heavily on the textcha support in textcha.py
++
++ @copyright: 2011 by Steve McIntyre
++ @copyright: 2018 by d42
++ @license: GNU GPL, see COPYING for details.
++"""
++import json
++import urllib
++import urllib2
++from textwrap import dedent
++
++from MoinMoin import log
++
++logging = log.getLogger(__name__)
++
++
++class ReCaptcha(object):
++ """ Recaptcha support """
++
++ VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify"
++
++ def __init__(self, request):
++ """ Initialize the Recaptcha setup.
++
++ @param request: the request object
++ """
++ self.request = request
++ self.user_info = request.user.valid and request.user.name or request.remote_addr
++
++ self.site_key = getattr(request.cfg, "recaptcha_site_key", None)
++ self.secret_key = getattr(request.cfg, "recaptcha_secret_key", None)
++
++ def is_enabled(self):
++ """ check if we're configured, i.e. we have a key
++ """
++ return self.site_key and self.secret_key
++
++ def check_answer_from_form(self, form=None):
++ form = self.request.form if form is None else form
++
++ if not self.is_enabled():
++ return True
++
++ return self._submit(
++ response=form.get("g-recaptcha-response"),
++ remoteip=self.request.remote_addr
++ )
++
++ def _submit(self, response, remoteip):
++
++ def encode_if_necessary(s):
++ return s.encode("utf-8") if isinstance(s, unicode) else s
++
++ data = urllib.urlencode({
++ "secret": encode_if_necessary(self.secret_key),
++ "response": encode_if_necessary(response),
++ "remoteip": encode_if_necessary(remoteip),
++ })
++
++ request = urllib2.Request(
++ url=self.VERIFY_URL,
++ data=data,
++ headers={"Content-type": "application/x-www-form-urlencoded"}
++ )
++
++ try:
++ resp = urllib2.urlopen(request)
++ http_code = resp.getcode()
++ resp_json = json.loads(resp.read())
++ return resp_json["success"] if http_code == 200 else False
++ except urllib2.URLError as e:
++ logging.exception(e)
++ return False
++ finally:
++ resp.close()
++
++ def render(self, form=None):
++ """ Checks if ReCaptchas are enabled and returns HTML for one,
++ or an empty string if they are not enabled.
++
++ @return: unicode result html
++ """
++ if not self.is_enabled():
++ return u""
++
++ return dedent(u"""
++ <script src='//www.google.com/recaptcha/api.js'></script>
++ <div class="g-recaptcha" data-sitekey="{SITE_KEY}"></div>
++ """.format(SITE_KEY=self.site_key))
diff --git a/www/moinmoin/files/extra-patch-verifyemail b/www/moinmoin/files/extra-patch-verifyemail
new file mode 100644
index 000000000000..0b5da29c741a
--- /dev/null
+++ b/www/moinmoin/files/extra-patch-verifyemail
@@ -0,0 +1,232 @@
+Description: Add support for requiring new accounts to be verified by email
+Origin: http://moinmo.in/MoinMoinPatch/VerifyAccountCreationByEmail
+Author: Steve McIntyre
+Last-Update: 2013-09-04
+
+--- ./MoinMoin/action/newaccount.py 2014-10-17 12:45:32.000000000 -0700
++++ ./MoinMoin/action/newaccount.py 2016-01-15 13:53:33.209638000 -0800
+@@ -12,5 +12,27 @@
+ from MoinMoin.security.textcha import TextCha
+ from MoinMoin.auth import MoinAuth
++from MoinMoin.mail import sendmail
++import subprocess
+
++def _send_verification_mail(request, user):
++ _ = request.getText
++ querystr = {'action': 'verifyaccount',
++ 'i': user.id,
++ 'v': user.account_verification}
++ page = Page(request, "FrontPage")
++ pagelink = "%(link)s" % {'link': request.getQualifiedURL(page.url(request, querystr))}
++ subject = _('[%(sitename)s] account verification check for new user %(username)s') % {
++ 'sitename': request.page.cfg.sitename or request.url_root,
++ 'username': user.name,
++ }
++
++ text = "Please verify your account by visiting this URL:\n\n %(link)s\n\n" % {
++ 'link': pagelink}
++
++ mailok, msg = sendmail.sendmail(request, user.email, subject, text, request.cfg.mail_from)
++ if mailok:
++ return (1, _("Verification message sent to %(email)s" % {'email': user.email}))
++ else:
++ return (mailok, msg)
+
+ def _create_user(request):
+@@ -43,6 +65,16 @@
+
+ # Name required to be unique. Check if name belong to another user.
+- if user.getUserId(request, theuser.name):
+- return _("This user name already belongs to somebody else.")
++ userid = user.getUserId(request, theuser.name)
++ if userid:
++ if request.cfg.require_email_verification and theuser.account_verification:
++ resendlink = request.page.url(request, querystr={
++ 'action': 'newaccount',
++ 'i': userid,
++ 'resend': '1'})
++ return _('This user name already belongs to somebody else. If this is a new account'
++ ' and you need another verification link, try <a href="%s">'
++ 'sending another one</a>. ' % resendlink)
++ else:
++ return _("This user name already belongs to somebody else.")
+
+ # try to get the password and pw repeat
+@@ -73,16 +105,39 @@
+ theuser.email = email.strip()
+ if not theuser.email and 'email' not in request.cfg.user_form_remove:
+- return _("Please provide your email address. If you lose your"
+- " login information, you can get it by email.")
++ if request.cfg.require_email_verification:
++ return _("Please provide your email address. You will need it"
++ " to be able to confirm your registration.")
++ else:
++ return _("Please provide your email address. If you lose your"
++ " login information, you can get it by email.")
+
+ # Email should be unique - see also MoinMoin/script/accounts/moin_usercheck.py
+ if theuser.email and request.cfg.user_email_unique:
+- if user.get_by_email_address(request, theuser.email):
+- return _("This email already belongs to somebody else.")
++ emailuser = user.get_by_email_address(request, theuser.email)
++ if emailuser:
++ if request.cfg.require_email_verification and theuser.account_verification:
++ resendlink = request.page.url(request, querystr={
++ 'action': 'newaccount',
++ 'i': emailuser.id,
++ 'resend': '1'})
++ return _('This email already belongs to somebody else. If this is a new account'
++ ' and you need another verification link, try <a href="%s">'
++ 'sending another one</a>. ' % resendlink)
++ else:
++ return _("This email already belongs to somebody else.")
++
++ # Send verification links if desired
++ if request.cfg.require_email_verification:
++ mailok, msg = _send_verification_mail(request, theuser)
++ if mailok:
++ result = _("User account created! Use the link in your email (%s) to verify your account"
++ " then you will be able to use this account to login..." % theuser.email)
++ else:
++ request.theme.add_msg(_("Unable to send verification mail, %s. Account creation aborted." % msg), "error")
++ else:
++ result = _("User account created! You can use this account to login now...")
+
+ # save data
+ theuser.save()
+-
+- result = _("User account created! You can use this account to login now...")
+ return result
+
+@@ -171,7 +226,18 @@
+ submitted = form.has_key('create')
+
++ uid = request.values.get('i', None)
++ resend = request.values.get('resend', None)
++
+ if submitted: # user pressed create button
+ request.theme.add_msg(_create_user(request), "dialog")
+ return page.send_page()
++ if resend and uid:
++ theuser = user.User(request, id=uid)
++ mailok, msg = _send_verification_mail(request, theuser)
++ if mailok:
++ request.theme.add_msg(_("Verification message re-sent to %s" % theuser.email), "dialog")
++ else:
++ request.theme.add_msg(_("Unable to re-send verification message, %s" % msg), "dialog")
++ return page.send_page()
+ else: # show create form
+ request.theme.send_title(_("Create Account"), pagename=pagename)
+--- ./MoinMoin/action/verifyaccount.py 1969-12-31 16:00:00.000000000 -0800
++++ ./MoinMoin/action/verifyaccount.py 2016-01-15 13:53:33.209957000 -0800
+@@ -0,0 +1,64 @@
++# -*- coding: iso-8859-1 -*-
++"""
++ MoinMoin - verify account action
++
++ @copyright: 2012 Steve McIntyre
++ @license: GNU GPL, see COPYING for details.
++"""
++
++from MoinMoin import user, wikiutil
++from MoinMoin.Page import Page
++from MoinMoin.widget import html
++from MoinMoin.auth import MoinAuth
++
++def execute(pagename, request):
++ found = False
++ for auth in request.cfg.auth:
++ if isinstance(auth, MoinAuth):
++ found = True
++ break
++
++ if not found:
++ # we will not have linked, so forbid access
++ request.makeForbidden(403, 'No MoinAuth in auth list')
++ return
++
++ page = Page(request, "FrontPage")
++ _ = request.getText
++
++ if not request.cfg.require_email_verification:
++ result = _("Verification not configured!")
++ request.theme.add_msg(result, "error")
++ return page.send_page()
++
++ uid = request.values.get('i', None)
++ verify = request.values.get('v', None)
++
++ # Grab user profile
++ theuser = user.User(request, id=uid)
++
++ # Compare the verification code
++ if not theuser.valid:
++ result = _("Unable to verify user account i=%s v=%s") % (uid, verify)
++ request.theme.add_msg(result, "error")
++ return page.send_page()
++
++ if not theuser.account_verification:
++ result = _("User account has been verified!")
++ request.theme.add_msg(result, "error")
++ return page.send_page()
++
++ if theuser.account_verification != verify:
++ result = _("Unable to verify user account i=%s v=%s") % (uid, verify)
++ request.theme.add_msg(result, "error")
++ return page.send_page()
++
++ # All looks sane. Mark verification as done, save data
++ theuser.account_verification = ""
++ theuser.save()
++
++ loginlink = request.page.url(request, querystr={'action': 'login'})
++ result = _('User account verified! You can use this account to <a href="%s">login</a> now...' % loginlink)
++ request.theme.add_msg(result, "dialog")
++ return page.send_page()
++
+--- ./MoinMoin/auth/__init__.py 2014-10-17 12:45:32.000000000 -0700
++++ ./MoinMoin/auth/__init__.py 2016-01-15 13:53:33.210285000 -0800
+@@ -250,6 +250,13 @@
+ check_surge_protect(request, action='auth-name', username=username)
+
+- u = user.User(request, name=username, password=password, auth_method=self.name)
++ u = user.User(request, name=username, password=password, auth_method=self.name)
+ if u.valid:
++ try:
++ verification = u.account_verification
++ except:
++ verification = False
++ if request.cfg.require_email_verification and verification:
++ logging.debug("%s: could not authenticate user %r (not verified yet)" % (self.name, username))
++ return ContinueLogin(user_obj, _("User account not verified yet."))
+ logging.debug("%s: successfully authenticated user %r (valid)" % (self.name, u.name))
+ log_attempt("auth/login (moin)", True, request, username)
+--- ./MoinMoin/config/multiconfig.py 2014-10-17 12:45:32.000000000 -0700
++++ ./MoinMoin/config/multiconfig.py 2016-01-15 13:53:33.210918000 -0800
+@@ -1097,4 +1097,6 @@
+ ('userprefs_disabled', [],
+ "Disable the listed user preferences plugins."),
++ ('require_email_verification', False ,
++ "Require verification of new user accounts."),
+ )),
+ # ==========================================================================
+--- ./MoinMoin/user.py 2014-10-17 12:45:32.000000000 -0700
++++ ./MoinMoin/user.py 2016-01-15 13:53:33.211435000 -0800
+@@ -24,4 +24,5 @@
+ from copy import deepcopy
+ import md5crypt
++import uuid
+
+ try:
+@@ -523,4 +524,10 @@
+ if password is not None:
+ self.enc_password = encodePassword(self._cfg, password)
++ self.account_creation_date = str(time.time())
++ self.account_creation_host = self._request.remote_addr
++ if self._cfg.require_email_verification:
++ self.account_verification = uuid.uuid4()
++ else:
++ self.account_verification = ""
+
+ # "may" so we can say "if user.may.read(pagename):"
+
diff --git a/www/moinmoin/files/patch-setup.cfg b/www/moinmoin/files/patch-setup.cfg
new file mode 100644
index 000000000000..3255dbcefa1c
--- /dev/null
+++ b/www/moinmoin/files/patch-setup.cfg
@@ -0,0 +1,10 @@
+--- setup.cfg.orig 2018-09-09 18:10:20 UTC
++++ setup.cfg
+@@ -1,6 +1,6 @@
+ # MoinMoin - Distutils config
+ #
+-# Copyright (c) 2001 by Jürgen Hermann <jh@web.de>
++# Copyright (c) 2001 by Jurgen Hermann <jh@web.de>
+ # All rights reserved, see COPYING for details.
+
+ [bdist_rpm]
diff --git a/www/moinmoin/files/patch-setup.py b/www/moinmoin/files/patch-setup.py
new file mode 100644
index 000000000000..18960d14d2ca
--- /dev/null
+++ b/www/moinmoin/files/patch-setup.py
@@ -0,0 +1,10 @@
+--- setup.py.orig 2016-10-31 20:44:02 UTC
++++ setup.py
+@@ -26,6 +26,7 @@ def isbad(name):
+ return (name.startswith('.') or
+ name.startswith('#') or
+ name.endswith('.pickle') or
++ name.endswith('.orig') or
+ name == 'CVS')
+
+ def isgood(name):
diff --git a/www/moinmoin/files/pkg-install.in b/www/moinmoin/files/pkg-install.in
new file mode 100644
index 000000000000..601cf963bff0
--- /dev/null
+++ b/www/moinmoin/files/pkg-install.in
@@ -0,0 +1,148 @@
+#! /bin/sh
+
+destdir=%%MOINDEST%%
+htdocs=%%HTDOCS%%
+moinver=%%MOINVER%%
+
+case "x$2" in
+
+"xINSTANCE")
+
+ echo "************************************************************"
+
+ case "x$3" in
+
+ "xMOD_PYTHON")
+
+ echo "Since you chose MOINTYPE=MOD_PYTHON, you may want to"
+ echo "add something like that to your Apache configuration."
+ echo ""
+ echo ",-----"
+ echo " Alias /moin_static$moinver/ \"$htdocs/\""
+ echo " <Directory \"$htdocs/\">"
+ echo " Order deny,allow"
+ echo " Allow from all"
+ echo " </Directory>"
+ echo " Alias /mywiki $destdir"
+ echo " <Location \"/mywiki\">"
+ echo " SetHandler python-program"
+ echo " PythonPath \"['$destdir'] + sys.path\""
+ echo " PythonHandler MoinMoin.request.request_modpython::Request.run"
+ echo " PythonAutoReload On"
+ echo " PythonDebug On"
+ echo " </Location>"
+ echo "\`-----"
+ echo ""
+
+ ;;
+
+ "xCGI")
+
+ echo "Since you chose MOINTYPE=CGI, you may want to"
+ echo "add something like that to your Apache configuration."
+ echo ""
+
+ echo ",-----"
+ echo " Alias /moin_static$moinver/ \"$htdocs/\""
+ echo " <Directory \"$htdocs/\">"
+ echo " Order deny,allow"
+ echo " Allow from all"
+ echo " </Directory>"
+ echo " ScriptAlias /mywiki \"$destdir/moin.cgi\""
+ echo " <Directory \"$destdir/\">"
+ echo " Order deny,allow"
+ echo " Allow from all"
+ echo " </Directory>"
+ echo "\`-----"
+ echo ""
+
+ ;;
+
+ "xWSGI")
+
+ echo "Since you chose MOINTYPE=WSGI, you should "
+ echo "add something like that to your Apache configuration."
+ echo ""
+
+ echo ",-----"
+ echo " Alias /moin_static$moinver/ \"$htdocs/\""
+ echo " <Directory \"$htdocs/\">"
+ echo " Order deny,allow"
+ echo " Allow from all"
+ echo " </Directory>"
+ echo " WSGIScriptAlias /mywiki \"$destdir/moin.wsgi\""
+ echo "#If you use HTTP authorization enable the following also"
+ echo "#WSGIPassAuthorization On"
+ echo " <Directory \"$destdir/\">"
+ echo " Order deny,allow"
+ echo " Allow from all"
+ echo " </Directory>"
+ echo "\`-----"
+ echo ""
+
+ ;;
+
+ *)
+
+ ;;
+
+ esac
+
+ echo "You may need to modify wikiconfig.py in your wiki instance"
+ echo "directory (eg. $destdir)."
+ echo ""
+ echo "If you want to install additional wiki instances"
+ echo "call 'make instance' with appriopriate arguments."
+ echo "E.g.: make MOINTYPE=FCGI MOINDEST=%%PREFIX%%/www/wiki instance"
+ echo "************************************************************"
+
+ ;;
+
+"xPOST-INSTALL")
+
+ echo "************************************************************"
+ echo "Important: You have currently no wiki instance installed."
+ echo ""
+ echo "If you're installing from ports, just run 'make instance'"
+ echo "with appriopriate arguments."
+ echo "eg. make MOINTYPE=FCGI MOINDEST=%%PREFIX%%/www/wiki instance"
+ echo ""
+ echo "If you're installing from package, run these commands."
+ echo ""
+ echo "# Choose here one script depending on the type of wiki you"
+ echo "# want : moin.py (standalone), moin.fcg (FCGI), moin.wsgi (WSGI) or moin.cgi."
+ echo 'export MOINSCRIPT="moin.cgi"'
+ echo '# Defaults should be fine but you may want to modify these.'
+ echo 'export MOINDIR="%%MOINDIR%%"'
+ echo 'export MOINDEST="%%MOINDEST%%"'
+ echo '# Set this to your apache user and group.'
+ echo 'export CGIUSER="www"'
+ echo 'export CGIGROUP="www"'
+ echo ''
+ echo 'mkdir -p ${MOINDEST}/data'
+ echo 'mkdir -p ${MOINDEST}/underlay'
+ echo 'cp -R ${MOINDIR}/data ${MOINDEST}'
+ echo 'cp -R ${MOINDIR}/underlay ${MOINDEST}'
+ echo 'chmod -R u+rw,go-ws ${MOINDEST}/data'
+ echo 'install -m 0555 ${MOINDIR}/config/wikiconfig.py ${MOINDEST}'
+ echo 'test -z "${MOINSCRIPT}" || \'
+ echo ' install -m 0555 ${MOINDIR}/server/${MOINSCRIPT} ${MOINDEST}'
+ echo 'chown -R ${CGIUSER}:${CGIGROUP} ${MOINDEST}'
+ echo ""
+ echo "Note: export might not work with your shell, use"
+ echo "# setenv VAR 'value' instead"
+ echo "************************************************************"
+
+ ;;
+
+"xDEINSTALL")
+
+ echo "************************************************************"
+ echo "All shared files have been removed."
+ echo "To complete deinstallation, please remove all the wiki"
+ echo "instances you have created."
+ echo "************************************************************"
+
+ ;;
+
+esac
diff --git a/www/moinmoin/pkg-descr b/www/moinmoin/pkg-descr
new file mode 100644
index 000000000000..74c680a3560f
--- /dev/null
+++ b/www/moinmoin/pkg-descr
@@ -0,0 +1,5 @@
+MoinMoin is a Python clone of WikiWiki, which is a composition system;
+it's a discussion medium; it's a repository; it's a mail system;
+it's a tool for collaboration.
+
+WWW: https://moinmo.in/
diff --git a/www/moinmoin/pkg-plist b/www/moinmoin/pkg-plist
new file mode 100644
index 000000000000..8f4683a0fa18
--- /dev/null
+++ b/www/moinmoin/pkg-plist
@@ -0,0 +1,3555 @@
+bin/moin
+%%PYTHON_SITELIBDIR%%/MoinMoin/Page.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/Page.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/Page.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageEditor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageEditor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageEditor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageGraphicalEditor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageGraphicalEditor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/PageGraphicalEditor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/_template.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/_template.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/_template.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/AttachFile.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/AttachFile.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/AttachFile.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/CopyPage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/CopyPage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/CopyPage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/DeletePage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/DeletePage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/DeletePage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Despam.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Despam.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Despam.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LikePages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LikePages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LikePages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Load.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Load.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Load.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LocalSiteMap.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LocalSiteMap.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/LocalSiteMap.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/MyPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/MyPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/MyPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/PackagePages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/PackagePages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/PackagePages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenamePage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenamePage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenamePage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenderAsDocbook.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenderAsDocbook.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/RenderAsDocbook.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Save.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Save.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/Save.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SlideShow.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SlideShow.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SlideShow.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SpellCheck.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SpellCheck.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SpellCheck.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SubscribeUser.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SubscribeUser.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SubscribeUser.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SyncPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SyncPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/SyncPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/anywikidraw.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/anywikidraw.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/anywikidraw.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/backup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/backup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/backup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/bookmark.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/bookmark.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/bookmark.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/cache.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/cache.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/cache.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/chart.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/chart.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/chart.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/diff.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/diff.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/diff.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/edit.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/edit.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/edit.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fckdialog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fckdialog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fckdialog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fullsearch.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fullsearch.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/fullsearch.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/info.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/info.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/info.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/language_setup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/language_setup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/language_setup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/links.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/links.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/links.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/login.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/login.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/login.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/logout.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/logout.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/logout.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newaccount.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newaccount.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newaccount.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newpage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newpage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/newpage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/pollsistersites.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/pollsistersites.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/pollsistersites.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quicklink.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quicklink.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quicklink.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quickunlink.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quickunlink.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/quickunlink.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/recoverpass.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/recoverpass.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/recoverpass.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/refresh.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/refresh.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/refresh.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/revert.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/revert.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/revert.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/rss_rc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/rss_rc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/rss_rc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/serveopenid.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/serveopenid.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/serveopenid.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/showtags.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/showtags.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/showtags.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sisterpages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sisterpages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sisterpages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sitemap.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sitemap.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/sitemap.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/subscribe.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/subscribe.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/subscribe.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/supplementation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/supplementation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/supplementation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/thread_monitor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/thread_monitor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/thread_monitor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/titleindex.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/titleindex.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/titleindex.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/twikidraw.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/twikidraw.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/twikidraw.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/unsubscribe.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/unsubscribe.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/unsubscribe.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprefs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprefs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprefs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprofile.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprofile.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/action/userprofile.pyo
+%%VERIFYEMAIL%%%%PYTHON_SITELIBDIR%%/MoinMoin/action/verifyaccount.py
+%%VERIFYEMAIL%%%%PYTHON_SITELIBDIR%%/MoinMoin/action/verifyaccount.pyc
+%%VERIFYEMAIL%%%%PYTHON_SITELIBDIR%%/MoinMoin/action/verifyaccount.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/_PHPsessionParser.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/_PHPsessionParser.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/_PHPsessionParser.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/botbouncer.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/botbouncer.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/botbouncer.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/cas.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/cas.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/cas.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/http.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/http.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/http.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/interwiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/interwiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/interwiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/ldap_login.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/ldap_login.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/ldap_login.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/log.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/log.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/log.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/mysql_group.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/mysql_group.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/mysql_group.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_sreg.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_sreg.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_sreg.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_teams.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_teams.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/openidrp_ext/openidrp_teams.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/php_session.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/php_session.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/php_session.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/smb_mount.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/smb_mount.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/smb_mount.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/sslclientcert.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/sslclientcert.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/auth/sslclientcert.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/caching.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/caching.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/caching.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/multiconfig.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/multiconfig.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/config/multiconfig.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/conftest.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/conftest.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/conftest.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/text_html_text_moin_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/text_html_text_moin_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/converter/text_html_text_moin_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_dicts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_dicts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_dicts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_groups.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_groups.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/composite_groups.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_dicts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_dicts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_dicts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_groups.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_groups.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_groups.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_lazy_groups.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_lazy_groups.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/config_lazy_groups.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_dicts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_dicts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_dicts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_groups.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_groups.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/datastruct/backends/wiki_groups.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/error.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/error.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/error.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/emailnotify.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/emailnotify.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/emailnotify.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/jabbernotify.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/jabbernotify.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/jabbernotify.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/notification.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/notification.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/notification.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/xapian_index.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/xapian_index.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/events/xapian_index.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/EXIF.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/EXIF.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/EXIF.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_msword.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_msword.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_msword.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_octet_stream.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_octet_stream.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_octet_stream.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_pdf.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_pdf.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_pdf.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_excel.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_excel.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_excel.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_powerpoint.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_powerpoint.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_ms_powerpoint.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_presentation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_presentation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_presentation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_spreadsheet.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_spreadsheet.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_spreadsheet.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_text.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_text.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_oasis_opendocument_text.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_calc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_calc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_calc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_writer.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_writer.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/application_vnd_sun_xml_writer.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/audio.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/audio.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/audio.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image_jpeg.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image_jpeg.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/image_jpeg.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_rtf.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_rtf.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_rtf.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_xml.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_xml.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/text_xml.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/video.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/video.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/filter/video.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/dom_xml.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/dom_xml.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/dom_xml.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/groups.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/groups.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/groups.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/pagelinks.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/pagelinks.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/pagelinks.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_docbook.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_docbook.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_docbook.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_gedit.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_gedit.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_gedit.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html_percent.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html_percent.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_html_percent.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_plain.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_plain.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_plain.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_python.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_python.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_python.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_xml.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_xml.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/formatter/text_xml.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/Makefile
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/MoinMoin.pot
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/README
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ar.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/bg.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ca.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/cs.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/da.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/de.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/el.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/en.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/es.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/fa.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/fi.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/fr.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/gl.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/he.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/hi.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/hr.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/hu.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/id.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/it.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ja.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/jabberbot/JabberBot.pot
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/jabberbot/Makefile
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/jabberbot/pl.JabberBot.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ko.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ku.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/lt.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/lv.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/mk.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/mn.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/msgfmt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/msgfmt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/msgfmt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/nb.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/nl.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/pl.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/pt-br.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/pt.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ro.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/ru.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/sk.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/sl.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/sr.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/strings.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/strings.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/strings.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/sv.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/check_i18n.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/check_i18n.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/check_i18n.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/mail_i18n-maintainers.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/mail_i18n-maintainers2.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/markup15to16.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/markup15to16.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/markup15to16.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/mk_POTFILES.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/mk_POTFILES.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/mk_POTFILES.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/po2wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/po2wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/po2wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/prepend.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/prepend.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/prepend.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/recode.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/recode.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/recode.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/wiki2po.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/wiki2po.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tools/wiki2po.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/tr.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/uk.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/vi.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/zh-tw.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/i18n/zh.MoinMoin.po
+%%PYTHON_SITELIBDIR%%/MoinMoin/log.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/log.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/log.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/editlog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/editlog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/editlog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/eventlog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/eventlog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/logfile/eventlog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AbandonedPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AbandonedPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AbandonedPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Action.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Action.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Action.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AdvancedSearch.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AdvancedSearch.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AdvancedSearch.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachInfo.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachInfo.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachInfo.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachList.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachList.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/AttachList.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/BR.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/BR.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/BR.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditTemplates.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditTemplates.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditTemplates.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditedSystemPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditedSystemPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EditedSystemPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EmbedObject.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EmbedObject.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/EmbedObject.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FootNote.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FootNote.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FootNote.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearch.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearch.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearch.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearchCached.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearchCached.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/FullSearchCached.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText2.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText2.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/GetText2.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/HighlighterList.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/HighlighterList.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/HighlighterList.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Hits.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Hits.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Hits.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Include.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Include.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Include.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/InterWiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/InterWiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/InterWiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/LikePages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/LikePages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/LikePages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/MonthCalendar.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/MonthCalendar.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/MonthCalendar.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Navigation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Navigation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Navigation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/NewPage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/NewPage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/NewPage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/OrphanedPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/OrphanedPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/OrphanedPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageCount.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageCount.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageCount.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageHits.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageHits.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageHits.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageList.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageList.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageList.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageSize.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageSize.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/PageSize.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomPage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomPage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomPage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomQuote.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomQuote.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RandomQuote.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RecentChanges.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RecentChanges.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/RecentChanges.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/ShowSmileys.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/ShowSmileys.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/ShowSmileys.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/StatsChart.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/StatsChart.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/StatsChart.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemAdmin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemAdmin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemAdmin.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemInfo.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemInfo.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/SystemInfo.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TableOfContents.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TableOfContents.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TableOfContents.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TeudView.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TeudView.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/TeudView.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Verbatim.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Verbatim.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/Verbatim.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WantedPages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WantedPages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WantedPages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfig.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfig.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfig.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfigHelp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfigHelp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/WikiConfigHelp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/macro/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/mailimport.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/mailimport.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/mailimport.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/sendmail.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/sendmail.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/mail/sendmail.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/multiconfig.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/multiconfig.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/multiconfig.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/packages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/packages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/packages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_ParserBase.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_ParserBase.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_ParserBase.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_creole.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_creole.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/_creole.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/highlight.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/highlight.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/highlight.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_cplusplus.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_cplusplus.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_cplusplus.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_creole.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_creole.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_creole.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_csv.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_csv.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_csv.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_diff.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_diff.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_diff.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_docbook.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_docbook.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_docbook.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_irssi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_irssi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_irssi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_java.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_java.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_java.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_moin_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_moin_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_moin_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_pascal.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_pascal.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_pascal.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_python.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_python.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_python.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_rst.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_rst.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_rst.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_xslt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_xslt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/parser/text_xslt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/check.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/check.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/check.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/create.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/create.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/create.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/disable.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/disable.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/disable.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/homepage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/homepage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/homepage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/inactive.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/inactive.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/inactive.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/resetpw.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/resetpw.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/account/resetpw.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/show.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/show.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/cli/show.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/dump.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/dump.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/dump.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/eventlog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/eventlog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/eventlog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/package.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/package.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/export/package.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/irclog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/irclog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/irclog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/wikipage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/wikipage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/import/wikipage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/build.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/build.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/index/build.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleancache.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleancache.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleancache.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleanpage.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleanpage.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleanpage.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleansessions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleansessions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/cleansessions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/globaledit.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/globaledit.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/globaledit.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mailtranslators.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mailtranslators.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mailtranslators.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/makecache.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/makecache.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/makecache.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mkpagepacks.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mkpagepacks.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/mkpagepacks.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/reducewiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/reducewiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/maint/reducewiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050301.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050301.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050301.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050400.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050400.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050400.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050500.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050500.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050500.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050600.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050600.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050600.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050700.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050700.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050700.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050800.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050800.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1050800.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059997.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059997.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059997.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059998.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059998.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059998.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059999.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059999.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1059999.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060000.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060000.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060000.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060100.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060100.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060100.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060200.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060200.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060200.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060400.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060400.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060400.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060500.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060500.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060500.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060600.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060600.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060600.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060700.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060700.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060700.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060800.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060800.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060800.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060900.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060900.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1060900.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1069999.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1069999.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1069999.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070000.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070000.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070000.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070100.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070100.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070100.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070200.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070200.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070200.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1070300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080000.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080000.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080000.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080100.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080100.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080100.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080200.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080200.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080200.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080400.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080400.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080400.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080500.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080500.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080500.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080600.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080600.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080600.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080700.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080700.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080700.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080800.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080800.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080800.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080900.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080900.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1080900.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1089999.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1089999.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1089999.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090000.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090000.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090000.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090100.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090100.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090100.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090200.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090200.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090200.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090400.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090400.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090400.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090500.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090500.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090500.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090600.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090600.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090600.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090700.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090700.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090700.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090800.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090800.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090800.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090900.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090900.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1090900.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1091000.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1091000.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/1091000.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/_conv160a_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/data.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/data.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/data.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/migutil.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/migutil.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/migutil.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin158_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin158_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin158_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin160a_wiki.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin160a_wiki.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/text_moin160a_wiki.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/wikiutil160a.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/wikiutil160a.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/migration/wikiutil160a.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/moin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/moin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/moin.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig01.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig01.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig01.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig02.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig02.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig02.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig03.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig03.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig03.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig04.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig04.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig04.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig05.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig05.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig05.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig06.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig06.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig06.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig07.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig07.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig07.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig08.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig08.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig08.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig09.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig09.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig09.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig10.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig10.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig10.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig11.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig11.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/12_to_13_mig11.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/152_to_1050300.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/152_to_1050300.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/152_to_1050300.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/migration/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/print_stats.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/print_stats.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/print_stats.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/repair_language.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/repair_language.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/repair_language.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/HelloWorld.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/HelloWorld.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/HelloWorld.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/UpdateGroupTest.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/UpdateGroupTest.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/UpdateGroupTest.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/old/xmlrpc-tools/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/standalone.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/standalone.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/server/standalone.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/mailimport.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/mailimport.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/mailimport.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/remote.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/remote.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/remote.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/retrieve.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/retrieve.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/retrieve.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/write.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/write.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/script/xmlrpc/write.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/indexing.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/indexing.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/indexing.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/search.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/search.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/search.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/tokenizer.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/tokenizer.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/Xapian/tokenizer.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/builtin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/builtin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/builtin.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/expressions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/expressions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/queryparser/expressions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/results.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/results.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/search/results.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/antispam.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/antispam.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/antispam.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/autoadmin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/autoadmin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/autoadmin.pyo
+%%RECAPTCHA%%%%PYTHON_SITELIBDIR%%/MoinMoin/security/sec_recaptcha.py
+%%RECAPTCHA%%%%PYTHON_SITELIBDIR%%/MoinMoin/security/sec_recaptcha.pyc
+%%RECAPTCHA%%%%PYTHON_SITELIBDIR%%/MoinMoin/security/sec_recaptcha.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/textcha.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/textcha.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/security/textcha.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/chart.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/chart.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/chart.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/hitcounts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/hitcounts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/hitcounts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/languages.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/languages.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/languages.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/pagesize.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/pagesize.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/pagesize.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/useragents.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/useragents.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/stats/useragents.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/BasicAuthTransport.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/BasicAuthTransport.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/BasicAuthTransport.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/fcgi_app.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/fcgi_app.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/fcgi_app.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/scgi_app.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/scgi_app.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/client/scgi_app.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_base.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_base.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_base.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_fork.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_fork.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/ajp_fork.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/cgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/cgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/cgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_base.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_base.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_base.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_fork.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_fork.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_fork.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_single.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_single.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/fcgi_single.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/paste_factory.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/paste_factory.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/paste_factory.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/preforkserver.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/preforkserver.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/preforkserver.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_base.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_base.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_base.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_fork.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_fork.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/scgi_fork.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/singleserver.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/singleserver.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/singleserver.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadedserver.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadedserver.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadedserver.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadpool.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadpool.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/flup/server/threadpool.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/htmlmarkup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/htmlmarkup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/htmlmarkup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/md5crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/md5crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/md5crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/context.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/context.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/context.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/parsedatetime.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/parsedatetime.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/parsedatetime.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/base.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/base.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/base.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/de_DE.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/de_DE.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/de_DE.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_AU.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_AU.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_AU.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_US.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_US.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/en_US.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/es.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/es.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/es.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/fr_FR.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/fr_FR.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/fr_FR.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/icu.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/icu.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/icu.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/nl_NL.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/nl_NL.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/nl_NL.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/pt_BR.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/pt_BR.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/pt_BR.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/ru_RU.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/ru_RU.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/pdt_locales/ru_RU.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/warns.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/warns.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/parsedatetime/warns.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/stamp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/stamp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/_setup/stamp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apache.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apache.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apache.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apps.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apps.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/apps.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/context.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/context.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/context.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/exc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/exc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/exc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/models.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/models.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/models.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/utils.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/utils.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ext/django/utils.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/argon2.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/argon2.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/argon2.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/bcrypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/bcrypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/bcrypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/cisco.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/cisco.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/cisco.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/des_crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/des_crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/des_crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/digests.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/digests.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/digests.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/django.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/django.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/django.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/fshp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/fshp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/fshp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/ldap_digests.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/ldap_digests.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/ldap_digests.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/md5_crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/md5_crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/md5_crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/misc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/misc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/misc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mssql.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mssql.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mssql.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mysql.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mysql.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/mysql.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/oracle.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/oracle.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/oracle.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/pbkdf2.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/pbkdf2.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/pbkdf2.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/phpass.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/phpass.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/phpass.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/postgres.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/postgres.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/postgres.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/roundup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/roundup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/roundup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scram.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scram.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scram.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scrypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scrypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/scrypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha1_crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha1_crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha1_crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha2_crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha2_crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sha2_crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sun_md5_crypt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sun_md5_crypt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/sun_md5_crypt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/windows.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/windows.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/handlers/windows.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hash.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hash.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hash.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hosts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hosts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/hosts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ifc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ifc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/ifc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/pwd.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/pwd.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/pwd.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/registry.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/registry.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/registry.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/totp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/totp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/totp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/binary.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/binary.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/binary.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/_ordered_dict.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/_ordered_dict.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/compat/_ordered_dict.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/decor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/decor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/decor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/des.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/des.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/des.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/handlers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/handlers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/handlers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/md4.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/md4.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/md4.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/pbkdf2.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/pbkdf2.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/utils/pbkdf2.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/win32.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/win32.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/passlib/win32.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/cmdline.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/cmdline.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/cmdline.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/console.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/console.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/console.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filter.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filter.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filter.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filters/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filters/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/filters/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatter.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatter.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatter.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/_mapping.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/_mapping.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/_mapping.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/bbcode.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/bbcode.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/bbcode.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/img.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/img.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/img.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/irc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/irc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/irc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/latex.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/latex.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/latex.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/other.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/other.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/other.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/rtf.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/rtf.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/rtf.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/svg.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/svg.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/svg.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal256.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal256.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/formatters/terminal256.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexer.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexer.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexer.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_asy_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_asy_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_asy_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cl_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cl_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cl_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cocoa_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cocoa_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_cocoa_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_csound_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_csound_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_csound_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lasso_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lasso_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lasso_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lua_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lua_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_lua_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mapping.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mapping.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mapping.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mql_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mql_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_mql_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_openedge_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_openedge_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_openedge_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_php_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_php_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_php_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_postgres_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_postgres_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_postgres_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_scilab_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_scilab_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_scilab_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_sourcemod_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_sourcemod_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_sourcemod_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_stan_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_stan_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_stan_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_vim_builtins.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_vim_builtins.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/_vim_builtins.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/actionscript.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/actionscript.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/actionscript.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/agile.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/agile.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/agile.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/algebra.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/algebra.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/algebra.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ambient.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ambient.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ambient.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/apl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/apl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/apl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/archetype.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/archetype.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/archetype.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/asm.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/asm.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/asm.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/automation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/automation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/automation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/basic.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/basic.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/basic.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/business.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/business.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/business.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_cpp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_cpp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_cpp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_like.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_like.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/c_like.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/chapel.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/chapel.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/chapel.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/compiled.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/compiled.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/compiled.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/configs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/configs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/configs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/console.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/console.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/console.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/csound.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/csound.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/csound.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/css.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/css.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/css.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/d.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/d.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/d.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dalvik.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dalvik.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dalvik.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/data.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/data.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/data.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/diff.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/diff.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/diff.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dotnet.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dotnet.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dotnet.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dsls.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dsls.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dsls.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dylan.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dylan.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/dylan.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ecl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ecl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ecl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/eiffel.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/eiffel.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/eiffel.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/elm.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/elm.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/elm.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/erlang.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/erlang.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/erlang.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/esoteric.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/esoteric.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/esoteric.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ezhil.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ezhil.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ezhil.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/factor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/factor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/factor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fantom.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fantom.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fantom.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/felix.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/felix.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/felix.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fortran.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fortran.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/fortran.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/foxpro.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/foxpro.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/foxpro.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/functional.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/functional.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/functional.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/go.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/go.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/go.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/grammar_notation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/grammar_notation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/grammar_notation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graph.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graph.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graph.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graphics.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graphics.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/graphics.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haskell.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haskell.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haskell.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haxe.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haxe.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/haxe.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hdl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hdl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hdl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hexdump.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hexdump.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/hexdump.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/idl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/idl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/idl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/igor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/igor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/igor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/inferno.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/inferno.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/inferno.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/installers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/installers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/installers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/int_fiction.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/int_fiction.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/int_fiction.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/iolang.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/iolang.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/iolang.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/j.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/j.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/j.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/javascript.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/javascript.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/javascript.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/julia.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/julia.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/julia.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/jvm.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/jvm.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/jvm.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/lisp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/lisp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/lisp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/make.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/make.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/make.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/markup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/markup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/markup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/math.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/math.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/math.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/matlab.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/matlab.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/matlab.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ml.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ml.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ml.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modeling.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modeling.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modeling.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modula2.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modula2.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/modula2.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nimrod.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nimrod.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nimrod.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nit.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nit.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nit.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nix.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nix.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/nix.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/oberon.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/oberon.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/oberon.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/objective.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/objective.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/objective.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ooc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ooc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ooc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/other.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/other.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/other.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parasail.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parasail.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parasail.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parsers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parsers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/parsers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pascal.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pascal.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pascal.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pawn.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pawn.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/pawn.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/perl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/perl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/perl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/php.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/php.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/php.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/praat.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/praat.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/praat.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/prolog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/prolog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/prolog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/python.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/python.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/python.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/qvt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/qvt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/qvt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/r.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/r.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/r.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rdf.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rdf.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rdf.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rebol.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rebol.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rebol.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/resource.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/resource.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/resource.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/roboconf.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/roboconf.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/roboconf.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/robotframework.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/robotframework.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/robotframework.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ruby.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ruby.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/ruby.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rust.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rust.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/rust.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/scripting.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/scripting.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/scripting.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/shell.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/shell.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/shell.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/smalltalk.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/smalltalk.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/smalltalk.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/snobol.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/snobol.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/snobol.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/special.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/special.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/special.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/sql.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/sql.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/sql.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/supercollider.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/supercollider.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/supercollider.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/tcl.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/tcl.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/tcl.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/templates.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/templates.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/templates.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/testing.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/testing.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/testing.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/text.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/text.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/text.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textedit.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textedit.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textedit.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textfmts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textfmts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/textfmts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/theorem.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/theorem.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/theorem.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/trafficscript.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/trafficscript.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/trafficscript.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/urbi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/urbi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/urbi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/web.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/web.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/web.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/webmisc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/webmisc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/webmisc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/x10.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/x10.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/lexers/x10.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/modeline.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/modeline.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/modeline.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/plugin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/plugin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/plugin.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/regexopt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/regexopt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/regexopt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/scanner.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/scanner.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/scanner.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/sphinxext.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/sphinxext.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/sphinxext.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/style.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/style.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/style.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol_nu.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol_nu.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/algol_nu.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/arduino.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/arduino.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/arduino.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/autumn.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/autumn.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/autumn.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/borland.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/borland.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/borland.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/bw.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/bw.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/bw.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/colorful.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/colorful.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/colorful.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/default.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/default.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/default.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/emacs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/emacs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/emacs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/friendly.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/friendly.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/friendly.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/fruity.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/fruity.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/fruity.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/igor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/igor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/igor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/lovelace.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/lovelace.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/lovelace.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/manni.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/manni.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/manni.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/monokai.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/monokai.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/monokai.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/murphy.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/murphy.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/murphy.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/native.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/native.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/native.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_dark.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_dark.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_dark.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_light.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_light.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/paraiso_light.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/pastie.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/pastie.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/pastie.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/perldoc.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/perldoc.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/perldoc.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/rrt.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/rrt.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/rrt.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/tango.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/tango.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/tango.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/trac.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/trac.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/trac.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vim.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vim.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vim.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/vs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/xcode.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/xcode.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/styles/xcode.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/token.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/token.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/token.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/unistring.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/unistring.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/unistring.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/util.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/util.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/pygments/util.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/python_compatibility.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/python_compatibility.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/python_compatibility.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_compat.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_compat.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_compat.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_internal.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_internal.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_internal.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_reloader.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_reloader.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/_reloader.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/atom.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/atom.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/atom.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/cache.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/cache.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/cache.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/fixers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/fixers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/fixers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/iterio.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/iterio.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/iterio.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/jsrouting.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/jsrouting.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/jsrouting.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/limiter.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/limiter.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/limiter.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/lint.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/lint.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/lint.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/profiler.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/profiler.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/profiler.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/securecookie.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/securecookie.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/securecookie.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/sessions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/sessions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/sessions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/testtools.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/testtools.pyc
+@comment %%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/testtools.pycj
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/testtools.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/wrappers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/wrappers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/contrib/wrappers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/datastructures.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/datastructures.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/datastructures.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/console.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/console.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/console.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/repr.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/repr.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/repr.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/tbtools.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/tbtools.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/debug/tbtools.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/exceptions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/exceptions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/exceptions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/filesystem.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/filesystem.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/filesystem.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/formparser.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/formparser.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/formparser.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/http.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/http.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/http.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/local.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/local.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/local.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/posixemulation.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/posixemulation.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/posixemulation.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/routing.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/routing.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/routing.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/security.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/security.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/security.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/serving.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/serving.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/serving.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/test.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/test.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/test.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/testapp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/testapp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/testapp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/urls.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/urls.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/urls.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/useragents.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/useragents.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/useragents.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/utils.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/utils.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/utils.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wrappers.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wrappers.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wrappers.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wsgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wsgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/werkzeug/wsgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/_checkxapian.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/_checkxapian.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/_checkxapian.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/datastructures.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/datastructures.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/datastructures.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/errors.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/errors.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/errors.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldactions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldactions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldactions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldmappings.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldmappings.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/fieldmappings.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/highlight.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/highlight.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/highlight.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/indexerconnection.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/indexerconnection.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/indexerconnection.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/marshall.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/marshall.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/marshall.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/memutils.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/memutils.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/memutils.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/parsedate.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/parsedate.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/parsedate.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/replaylog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/replaylog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/replaylog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/schema.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/schema.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/schema.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/searchconnection.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/searchconnection.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/support/xappy/searchconnection.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/classic.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/classic.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/classic.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modern.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modern.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modern.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized_cms.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized_cms.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/modernized_cms.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/rightsidebar.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/rightsidebar.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/theme/rightsidebar.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/user.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/user.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/user.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/admin.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/admin.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/admin.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/login.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/login.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userform/login.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/changepass.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/changepass.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/changepass.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/notification.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/notification.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/notification.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oid.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oid.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oid.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oidserv.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oidserv.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/oidserv.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/prefs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/prefs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/prefs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/suid.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/suid.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/userprefs/suid.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/SubProcess.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/SubProcess.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/SubProcess.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/abuse.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/abuse.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/abuse.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/bdiff.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/bdiff.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/bdiff.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes_create.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes_create.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/chartypes_create.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/clock.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/clock.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/clock.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/daemon.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/daemon.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/daemon.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/dataset.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/dataset.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/dataset.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff3.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff3.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff3.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_text.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_text.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/diff_text.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/filesys.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/filesys.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/filesys.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/lock.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/lock.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/lock.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/moinoid.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/moinoid.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/moinoid.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/profile.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/profile.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/profile.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/pysupport.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/pysupport.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/pysupport.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/rpc_aggregator.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/rpc_aggregator.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/rpc_aggregator.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/thread_monitor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/thread_monitor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/thread_monitor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/timefuncs.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/timefuncs.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/timefuncs.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/web.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/web.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/util/web.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/version.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/version.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/version.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/_fallback_cgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/_fallback_cgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/_fallback_cgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/contexts.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/contexts.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/contexts.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/exceptions.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/exceptions.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/exceptions.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/flup_frontend.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/flup_frontend.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/flup_frontend.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/frontend.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/frontend.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/frontend.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/profile.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/profile.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/profile.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/request.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/request.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/request.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/serving.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/serving.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/serving.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/session.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/session.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/session.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/_documentation.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/_upgrade.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/_whatsnew.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/_whatsnew_history.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckcontextmenu.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdataprocessor.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdocumentfragment_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdocumentfragment_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdomrange.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdomrange_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdomrange_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckdomrangeiterator.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckeditingarea.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckelementpath.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckenterkey.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckevents.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckhtmliterator.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckicon.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckiecleanup.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckimagepreloader.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckkeystrokehandler.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckmenublock.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckmenublockpanel.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckmenuitem.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckpanel.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckspecialcombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckstyle.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbar.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarbreak_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarbreak_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarbutton.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarbuttonui.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarfontformatcombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarfontscombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarfontsizecombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarpanelbutton.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarspecialcombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fcktoolbarstylecombo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckw3crange.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckxml.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckxml_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/classes/fckxml_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fck_othercommands.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckblockquotecommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckcorestylecommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckfitwindow.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckindentcommands.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckjustifycommands.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fcklistcommands.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fcknamedcommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckpastewordcommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckremoveformatcommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckshowblocks.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fckstylecommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fcktablecommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/commandclasses/fcktextcolorcommand.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/fckconstants.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/fckeditorapi.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/fckjscoreextensions.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/fckscriptloader.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fck.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fck_contextmenu.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fck_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fck_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckbrowserinfo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckcodeformatter.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckcommands.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckconfig.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckdebug.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckdebug_empty.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckdialog.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckdocumentprocessor.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckdomtools.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcklanguagemanager.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcklisthandler.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcklistslib.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckplugins.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckregexlib.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckscayt.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckselection.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckselection_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckselection_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckstyles.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktablehandler.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktablehandler_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktablehandler_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktoolbaritems.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktoolbarset.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktools.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktools_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fcktools_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckundo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckurlparams.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckxhtml.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckxhtml_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckxhtml_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/_source/internals/fckxhtmlentities.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/behaviors/disablehandles.htc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/behaviors/showtableborders.htc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/fck_editorarea.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/fck_internal.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/fck_showtableborders_gecko.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_address.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_blockquote.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_div.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h1.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h4.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h5.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_h6.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_p.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/block_pre.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/fck_anchor.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/fck_flashlogo.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/fck_hiddenfield.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/fck_pagebreak.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/css/images/fck_plugin.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/common/fck_dialog_common.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/common/fck_dialog_common.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/common/images/locked.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/common/images/reset.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/common/images/unlocked.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_about.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_about/logo_fckeditor.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_about/logo_fredck.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_anchor.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_button.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_checkbox.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_colorselector.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_div.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_docprops.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_docprops/fck_document_preview.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_flash.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_flash/fck_flash.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_flash/fck_flash_preview.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_form.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_hiddenfield.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_image.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_image/fck_image.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_image/fck_image_preview.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_link.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_link/fck_link.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_listprop.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_paste.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_radiobutton.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_replace.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_scayt.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_scayt/scayt_dialog.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_select.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_select/fck_select.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_smiley.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_source.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_specialchar.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_table.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_tablecell.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_template.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_template/images/template1.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_template/images/template2.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_template/images/template3.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_textarea.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dialog/fck_textfield.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dtd/fck_dtd_test.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dtd/fck_xhtml10strict.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/dtd/fck_xhtml10transitional.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/fckdebug.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/fckdialog.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/fckeditor.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/fckeditor.original.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/browser.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/browser.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmactualfolder.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmcreatefolder.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmfolders.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmresourceslist.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmresourcetype.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/frmupload.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/ButtonArrow.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/Folder.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/Folder32.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/FolderOpened.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/FolderOpened32.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/FolderUp.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/ai.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/avi.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/cs.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/dll.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/doc.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/exe.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/fla.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/gif.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/htm.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/html.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/js.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/png.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/swf.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/swt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/txt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/xls.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/xml.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/32/zip.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/ai.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/avi.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/bmp.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/cs.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/default.icon.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/dll.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/doc.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/exe.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/fla.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/gif.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/htm.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/html.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/jpg.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/js.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/mdb.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/mp3.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/pdf.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/png.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/ppt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/rdp.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/swf.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/swt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/txt.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/vsd.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/xls.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/xml.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/icons/zip.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/images/spacer.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/js/common.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/browser/default/js/fckxml.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/basexml.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/class_upload.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/commands.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/config.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/connector.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/io.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/upload.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/asp/util.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/aspx/config.ascx
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/aspx/connector.aspx
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/aspx/upload.aspx
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/ImageObject.cfc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_commands.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_connector.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_io.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_upload.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/cf_util.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/config.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/connector.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/image.cfc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/cfm/upload.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/lasso/config.lasso
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/lasso/connector.lasso
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/lasso/upload.lasso
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/basexml.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/commands.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/config.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/connector.cgi
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/io.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/upload.cgi
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/upload_fck.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/perl/util.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/basexml.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/commands.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/config.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/connector.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/io.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/phpcompat.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/upload.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/php/util.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/config.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/config.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/config.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/connector.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/connector.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/connector.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckcommands.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckcommands.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckcommands.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckconnector.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckconnector.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckconnector.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckoutput.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckoutput.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckoutput.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckutil.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckutil.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/fckutil.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/htaccess.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/upload.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/upload.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/upload.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/wsgi.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/wsgi.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/wsgi.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/zope.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/zope.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/py/zope.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/test.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/filemanager/connectors/uploadtest.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/anchor.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/arrow_ltr.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/arrow_rtl.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/angel_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/angry_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/broken_heart.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/cake.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/confused_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/cry_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/devil_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/embaressed_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/envelope.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/heart.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/kiss.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/lightbulb.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/omg_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/regular_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/sad_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/shades_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/teeth_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/thumbs_down.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/thumbs_up.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/tounge_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/smiley/msn/wink_smile.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/images/spacer.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/js/fckadobeair.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/js/fckeditorcode_gecko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/js/fckeditorcode_ie.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/_translationstatus.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/af.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ar.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/bg.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/bn.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/bs.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ca.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/cs.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/da.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/de.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/el.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/en-au.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/en-ca.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/en-uk.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/en.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/eo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/es.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/et.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/eu.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/fa.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/fi.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/fo.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/fr-ca.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/fr.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/gl.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/gu.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/he.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/hi.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/hr.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/hu.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/is.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/it.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ja.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/km.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ko.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/lt.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/lv.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/mn.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ms.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/nb.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/nl.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/no.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/pl.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/pt-br.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/pt.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ro.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/ru.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/sk.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/sl.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/sr-latn.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/sr.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/sv.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/th.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/tr.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/uk.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/vi.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/zh-cn.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/lang/zh.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/autogrow/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/bbcode/_sample/sample.config.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/bbcode/_sample/sample.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/bbcode/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/dragresizetable/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/fck_placeholder.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/de.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/en.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/es.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/fr.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/it.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/lang/pl.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/placeholder/placeholder.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/simplecommands/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/plugins/tablecommands/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/_fckviewstrips.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/fck_dialog.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/fck_dialog_ie6.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/fck_editor.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/fck_strip.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/dialog.sides.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/dialog.sides.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/dialog.sides.rtl.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/sprites.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/sprites.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.arrowright.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.buttonarrow.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.collapse.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.end.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.expand.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.separator.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/default/images/toolbar.start.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/fck_dialog.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/fck_dialog_ie6.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/fck_editor.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/fck_strip.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/dialog.sides.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/dialog.sides.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/dialog.sides.rtl.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/sprites.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/sprites.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.arrowright.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.bg.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.collapse.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.end.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.expand.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.separator.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/office2003/images/toolbar.start.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/fck_dialog.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/fck_dialog_ie6.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/fck_editor.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/fck_strip.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/dialog.sides.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/dialog.sides.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/dialog.sides.rtl.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/sprites.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/sprites.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.arrowright.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.buttonarrow.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.buttonbg.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.collapse.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.end.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.expand.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.separator.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/skins/silver/images/toolbar.start.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/wsc/ciframe.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/wsc/tmpFrameset.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/editor/wsc/w.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckconfig.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.afp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.asp
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.cfc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.lasso
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.pl
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor_php4.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckeditor_php5.php
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckpackager.xml
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckstyles.xml
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fcktemplates.xml
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/fckutils.cfm
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/FCKeditor/license.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/TWikiDrawPlugin/README
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/TWikiDrawPlugin/twikidraw.jar
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/anywikidraw/README
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/anywikidraw/lib/AnyWikiDrawForMoinMoin.jar
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/anywikidraw/lib/Splash.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/macro/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/macro/lang/en.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/macro/lang/it.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/macro/macro.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinattachment/attachment.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinattachment/fck_attachment.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinattachment/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinbehaviour/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinformat/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinimage/fck_image.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinimage/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinlink/fck_link.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinlink/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinunlink/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/moinurllib.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/placeholder/fck_placeholder.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/placeholder/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/placeholder/lang/en.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/placeholder/lang/it.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/placeholder/placeholder.gif
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/restrict_actions/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/selection/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/smiley/fck_smiley.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/smiley/fckplugin.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinFCKplugins/smiley/smile.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinfckconfig.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/applets/moinfckstyles.xml
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/css/common.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/css/msie.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/css/print.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/css/projection.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/css/screen.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/PythonPowered.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/alert.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/angry.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/attention.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/biggrin.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/checkmark.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/devil.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/draft.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/frown.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/icon-error.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/icon-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/idea.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-bottom.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-conflict.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-deleted.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-diff.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-edit.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-email.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-ftp.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-help.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-home.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-icon.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-inter.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-new.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-news.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-parent.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-print.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-raw.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-renamed.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-rss.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-search.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-show.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-subscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-telnet.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-top.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-unsubscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-updated.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-www.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-xml.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/moin-xml2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/ohwell.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/prio1.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/prio2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/prio3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/redface.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/sad.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/smile.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/smile2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/smile3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/smile4.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/star_off.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/star_on.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/thumbs-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/tired.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/classic/img/tongue.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/js/common.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/js/countdown.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/js/infobox.js
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/moindude.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/moinmoin.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/moinmoin_alpha.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/common/openid.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/favicon.ico
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/index.html
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/css/common.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/css/msie.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/css/print.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/css/projection.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/css/screen.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/PythonPowered.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/admon-caution.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/admon-important.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/admon-note.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/admon-tip.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/admon-warning.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/alert.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/angry.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/attention.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/biggrin.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/checkmark.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/devil.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/draft.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/frown.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/icon-error.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/icon-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/idea.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-bottom.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-conflict.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-deleted.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-diff.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-edit.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-email.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-ftp.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-help.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-home.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-icon.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-inter.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-new.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-news.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-parent.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-print.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-raw.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-renamed.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-rss.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-search.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-show.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-subscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-telnet.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-top.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-unsubscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-updated.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-www.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-xml.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/moin-xml2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/ohwell.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/prio1.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/prio2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/prio3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/redface.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/sad.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/smile.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/smile2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/smile3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/smile4.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/star_off.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/star_on.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/thumbs-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/tired.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modern/img/tongue.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/SlideShow.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/common.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/msie.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/print.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/projection.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/css/screen.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/PythonPowered.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/admon-caution.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/admon-important.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/admon-note.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/admon-tip.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/admon-warning.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/alert.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/angry.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/attention.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/biggrin.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/checkmark.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/devil.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/draft.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/frown.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/icon-error.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/icon-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/idea.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-action.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-bottom.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-conflict.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-deleted.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-diff.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-download.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-edit.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-email.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-ftp.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-help.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-home.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-icon.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-inter.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-jabber.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-new.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-news.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-parent.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-print.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-raw.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-readonly.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-renamed.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-rss.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-search.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-show.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-subscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-telnet.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-top.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-unsubscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-updated.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/moin-www.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/ohwell.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/prio1.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/prio2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/prio3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/redface.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/sad.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/smile.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/smile2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/smile3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/smile4.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/star_off.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/star_on.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/thumbs-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/tired.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/modernized/img/tongue.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/css/common.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/css/msie.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/css/print.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/css/projection.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/css/screen.css
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/PythonPowered.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/alert.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/angry.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/attention.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/biggrin.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/checkmark.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/devil.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/draft.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/frown.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/icon-error.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/icon-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/idea.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/logout.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-attach.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-bottom.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-conflict.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-deleted.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-diff.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-edit.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-email.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-ftp.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-help.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-home.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-icon.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-info.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-inter.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-new.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-news.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-parent.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-print.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-raw.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-renamed.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-rss.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-search.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-show.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-subscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-telnet.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-top.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-unsubscribe.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-updated.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-www.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-xml.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/moin-xml2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/ohwell.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/prio1.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/prio2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/prio3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/redface.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/sad.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/smile.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/smile2.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/smile3.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/smile4.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/star_off.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/star_on.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/thumbs-up.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/tired.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/rightsidebar/img/tongue.png
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/static/htdocs/robots.txt
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/utils.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/utils.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/web/utils.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/base.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/base.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/base.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/browser.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/browser.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/browser.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/dialog.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/dialog.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/dialog.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/html.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/html.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/widget/html.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikisync.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikisync.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikisync.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikiutil.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikiutil.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikiutil.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/marshal.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/marshal.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/marshal.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/util.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/util.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wikixml/util.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/wsgiapp.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/wsgiapp.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/wsgiapp.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/HelloWorld.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/HelloWorld.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/HelloWorld.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/ProcessMail.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/ProcessMail.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/ProcessMail.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/RemoteScript.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/RemoteScript.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/RemoteScript.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/UpdateGroup.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/UpdateGroup.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/UpdateGroup.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/WhoAmI.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/WhoAmI.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/WhoAmI.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/__init__.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/__init__.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/__init__.pyo
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/putClientInfo.py
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/putClientInfo.pyc
+%%PYTHON_SITELIBDIR%%/MoinMoin/xmlrpc/putClientInfo.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/__init__.py
+%%PYTHON_SITELIBDIR%%/jabberbot/__init__.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/__init__.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/bot.py
+%%PYTHON_SITELIBDIR%%/jabberbot/bot.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/bot.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/capat.py
+%%PYTHON_SITELIBDIR%%/jabberbot/capat.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/capat.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/commands.py
+%%PYTHON_SITELIBDIR%%/jabberbot/commands.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/commands.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/config.py
+%%PYTHON_SITELIBDIR%%/jabberbot/config.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/config.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/i18n.py
+%%PYTHON_SITELIBDIR%%/jabberbot/i18n.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/i18n.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/oob.py
+%%PYTHON_SITELIBDIR%%/jabberbot/oob.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/oob.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/xmlrpcbot.py
+%%PYTHON_SITELIBDIR%%/jabberbot/xmlrpcbot.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/xmlrpcbot.pyo
+%%PYTHON_SITELIBDIR%%/jabberbot/xmppbot.py
+%%PYTHON_SITELIBDIR%%/jabberbot/xmppbot.pyc
+%%PYTHON_SITELIBDIR%%/jabberbot/xmppbot.pyo
+%%DATADIR%%/config/logging/README
+%%DATADIR%%/config/logging/abuse
+%%DATADIR%%/config/logging/logfile
+%%DATADIR%%/config/logging/logfile_debug_auth
+%%DATADIR%%/config/logging/stderr
+%%DATADIR%%/config/more_samples/README
+%%DATADIR%%/config/more_samples/auth_session_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/auth_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/dicts_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/groups_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/jabber_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/ldap_2servers_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/ldap_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/mail_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/mailimportconf.py
+%%DATADIR%%/config/more_samples/openid_sreg_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/openid_teams_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/secrets_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/security_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/smb_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/ui_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/user_wikiconfig_snippet
+%%DATADIR%%/config/more_samples/xapian_wikiconfig_snippet
+%%DATADIR%%/config/wikiconfig.py
+%%DATADIR%%/config/wikifarm/farmconfig.py
+%%DATADIR%%/config/wikifarm/mywiki.py
+%%DATADIR%%/data/cache/README
+%%DATADIR%%/data/dict/dummy_dict
+%%DATADIR%%/data/edit-log
+%%DATADIR%%/data/event-log
+%%DATADIR%%/data/intermap.txt
+%%DATADIR%%/data/meta
+%%DATADIR%%/data/pages/BadContent/current
+%%DATADIR%%/data/pages/BadContent/revisions/00000001
+%%DATADIR%%/data/plugin/__init__.py
+%%DATADIR%%/data/plugin/action/__init__.py
+%%DATADIR%%/data/plugin/converter/__init__.py
+%%DATADIR%%/data/plugin/events/__init__.py
+%%DATADIR%%/data/plugin/filter/__init__.py
+%%DATADIR%%/data/plugin/formatter/__init__.py
+%%DATADIR%%/data/plugin/macro/__init__.py
+%%DATADIR%%/data/plugin/parser/__init__.py
+%%DATADIR%%/data/plugin/theme/__init__.py
+%%DATADIR%%/data/plugin/userprefs/__init__.py
+%%DATADIR%%/data/plugin/xmlrpc/__init__.py
+%%DATADIR%%/data/user/README
+%%DATADIR%%/server/moin
+%%DATADIR%%/server/moin.ajp
+%%DATADIR%%/server/moin.cgi
+%%DATADIR%%/server/moin.fcgi
+%%DATADIR%%/server/moin.scgi
+%%DATADIR%%/server/moin.wsgi
+%%DATADIR%%/server/test.wsgi
+%%DATADIR%%/server/wikiserverconfig.py
+%%DATADIR%%/underlay/pages/BadContent/current
+%%DATADIR%%/underlay/pages/BadContent/revisions/00000001
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/00_needs_fixing.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Brazilian_Portuguese--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Bulgarian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Chinese_Taiwan--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Croatian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Czech--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Danish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Dutch--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--course_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--not_translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/English--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Finnish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/French--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Galician--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Galician--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Galician--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Galician--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Galician--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--course_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/German--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hebrew--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hebrew--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hebrew--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hebrew--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hebrew--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hindi--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hindi--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hindi--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hindi--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hindi--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Hungarian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Indonesian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--course_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Italian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Japanese--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Korean--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Latvian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Lithuanian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Mongolian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--course_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Norwegian_Bokmal--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Persian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Polish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Portuguese--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Romanian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--course_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Russian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Serbian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Simplified_Chinese--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--essential_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovak--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Slovenian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Spanish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--admin_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--all_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--essential_category_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Swedish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Turkish--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--all_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--all_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--all_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--all_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--essential_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--essential_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--essential_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--optional_help_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--optional_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--optional_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--optional_template_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/attachments/Ukrainian--translated_system_pages.zip
+%%DATADIR%%/underlay/pages/LanguageSetup/current
+%%DATADIR%%/underlay/pages/LanguageSetup/revisions/00000001
diff --git a/www/node10/Makefile b/www/node10/Makefile
new file mode 100644
index 000000000000..17992d5c28e0
--- /dev/null
+++ b/www/node10/Makefile
@@ -0,0 +1,108 @@
+# $FreeBSD$
+
+PORTNAME= node
+PORTVERSION= 10.23.0
+DISTVERSIONPREFIX= v
+PORTREVISION= 1
+CATEGORIES= www
+MASTER_SITES= http://nodejs.org/dist/v${PORTVERSION}/
+PKGNAMESUFFIX= 10
+
+MAINTAINER= bhughes@FreeBSD.org
+COMMENT= V8 JavaScript for client and server
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BROKEN_SSL= libressl libressl-devel
+BROKEN_SSL_REASON= Node.js 10.x LTS requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled
+ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le
+
+OPTIONS_DEFINE= BUNDLED_SSL DOCS NLS DTRACE
+OPTIONS_DEFAULT= DTRACE
+OPTIONS_DEFAULT_FreeBSD_11= BUNDLED_SSL
+OPTIONS_DEFAULT+= ${OPTIONS_DEFAULT_${OPSYS}_${OSREL:R}}
+OPTIONS_SUB= yes
+
+.if !exists(/usr/sbin/dtrace)
+OPTIONS_EXCLUDE+= DTRACE
+.endif
+
+OPTIONS_EXCLUDE_aarch64= DTRACE
+# dt_modtext:/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c(820): arm not implemented
+OPTIONS_EXCLUDE_armv6= DTRACE
+OPTIONS_EXCLUDE_armv7= DTRACE
+OPTIONS_EXCLUDE_powerpc64= DTRACE
+OPTIONS_EXCLUDE_powerpc64le= DTRACE
+
+BUNDLED_SSL_DESC= Use node.js's bundled OpenSSL implementation
+BUNDLED_SSL_USES_OFF= ssl
+BUNDLED_SSL_CONFIGURE_OFF= --shared-openssl --openssl-use-def-ca-store
+BUNDLED_SSL_RUN_DEPENDS_OFF= ca_root_nss>=0:security/ca_root_nss
+
+NLS_CONFIGURE_ON= --with-intl=system-icu
+NLS_BUILD_DEPENDS= icu>=64.2:devel/icu
+NLS_LIB_DEPENDS= libicui18n.so:devel/icu
+
+DTRACE_CONFIGURE_ON= --with-dtrace
+
+USES= compiler:c++11-lib gmake python:2.7,build pkgconfig \
+ localbase shebangfix
+
+HAS_CONFIGURE= yes
+
+CONFLICTS_INSTALL= node12-[0-9]* node14-[0-9]* node-[0-9]*
+
+CONFIGURE_ARGS= --prefix=${PREFIX_RELDEST} \
+ --without-npm \
+ --shared-cares \
+ --shared-libuv \
+ --shared-nghttp2 \
+ --shared-zlib
+
+SHEBANG_FILES= tools/specialize_node_d.py tools/genv8constants.py
+
+PREFIX_RELDEST= ${PREFIX:S,^${DESTDIR},,}
+REINPLACE_ARGS= -i ''
+MAKE_ENV+= CC.host=${CC} CFLAGS.host="${CFLAGS}" \
+ CXX.host=${CXX} CXXFLAGS.host="${CXXFLAGS}" \
+ LINK.host=${CXX} LDFLAGS.host="${LDFLAGS}"
+
+BUILD_DEPENDS+= c-ares>=1.15.0:dns/c-ares\
+ libuv>=1.34.2:devel/libuv \
+ libnghttp2>=1.41.0:www/libnghttp2 \
+ objdump:devel/binutils
+LIB_DEPENDS+= libcares.so:dns/c-ares\
+ libuv.so:devel/libuv \
+ libnghttp2.so:www/libnghttp2
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1200085
+BROKEN_SSL+= base
+.endif
+
+.if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64 && ${ARCH} != i386
+CONFIGURE_ARGS+=--openssl-no-asm
+.elif (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-common.gypi
+.endif
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|' \
+ ${WRKSRC}/deps/v8/gypfiles/v8.gyp
+
+post-configure:
+ # Post-process Makefile and *.mk files created by node-gyp and remove
+ # all occurrences of -I${LOCALBASE}/include. C*FLAGS include this
+ # before all -I../deps/* for bundled code. This can cause build
+ # breakages if the dependency is installed in ${LOCALBASE}. The
+ # USES+=localbase # above will ensure that we pick up includes for real
+ # external dependencies.
+ ${FIND} ${WRKSRC}/out -type f -print0 \
+ | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g"
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/node
+
+.include <bsd.port.mk>
diff --git a/www/node10/distinfo b/www/node10/distinfo
new file mode 100644
index 000000000000..59cc4fe970b3
--- /dev/null
+++ b/www/node10/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1603979909
+SHA256 (node-v10.23.0.tar.gz) = d93041d1d1e75cef6c562c29b63333b2f39a16de3cb0310b695130cea2ae7f27
+SIZE (node-v10.23.0.tar.gz) = 46560417
diff --git a/www/node10/files/extra-patch-common.gypi b/www/node10/files/extra-patch-common.gypi
new file mode 100644
index 000000000000..8e817a2959c9
--- /dev/null
+++ b/www/node10/files/extra-patch-common.gypi
@@ -0,0 +1,13 @@
+--- common.gypi.orig 2019-10-01 15:32:40.000000000 +0200
++++ common.gypi 2019-10-16 12:47:09.236138000 +0200
+@@ -390,8 +390,8 @@
+ 'ldflags': [ '-m32' ],
+ }],
+ [ 'target_arch=="ppc64" and OS!="aix"', {
+- 'cflags': [ '-m64', '-mminimal-toc' ],
+- 'ldflags': [ '-m64' ],
++ 'cflags': [ '-m64' ],
++ 'ldflags': [ '-m64' ],
+ }],
+ [ 'target_arch=="s390x"', {
+ 'cflags': [ '-m64', '-march=z196' ],
diff --git a/www/node10/files/patch-common.gypi b/www/node10/files/patch-common.gypi
new file mode 100644
index 000000000000..3f24b48b797b
--- /dev/null
+++ b/www/node10/files/patch-common.gypi
@@ -0,0 +1,18 @@
+--- common.gypi.orig 2020-06-08 21:52:35 UTC
++++ common.gypi
+@@ -509,15 +509,6 @@
+ 'libraries': [ '-lelf' ],
+ }],
+ ['OS=="freebsd"', {
+- 'conditions': [
+- ['"0" < llvm_version < "4.0"', {
+- # Use this flag because on FreeBSD std::pairs copy constructor is non-trivial.
+- # Doesn't apply to llvm 4.0 (FreeBSD 11.1) or later.
+- # Refs: https://lists.freebsd.org/pipermail/freebsd-toolchain/2016-March/002094.html
+- # Refs: https://svnweb.freebsd.org/ports/head/www/node/Makefile?revision=444555&view=markup
+- 'cflags': [ '-D_LIBCPP_TRIVIAL_PAIR_COPY_CTOR=1' ],
+- }],
+- ],
+ 'ldflags': [
+ '-Wl,--export-dynamic',
+ ],
diff --git a/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl-cl.gypi b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl-cl.gypi
new file mode 100644
index 000000000000..814c284e473f
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl-cl.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/config/archs/linux-elf/asm/openssl-cl.gypi.orig 2020-06-02 14:43:34 UTC
++++ deps/openssl/config/archs/linux-elf/asm/openssl-cl.gypi
+@@ -25,12 +25,11 @@
+ ],
+ 'openssl_cflags_linux-elf': [
+ '-Wa,--noexecstack',
+- '-Wall -O3 -fomit-frame-pointer',
++ '-Wall -O3',
+ '-pthread',
+- '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '',
+ ],
+ 'openssl_cli_srcs_linux-elf': [
+ 'openssl/apps/asn1pars.c',
diff --git a/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl.gypi b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl.gypi
new file mode 100644
index 000000000000..a987849c6eec
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_asm_openssl.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/config/archs/linux-elf/asm/openssl.gypi.orig 2020-06-02 14:43:34 UTC
++++ deps/openssl/config/archs/linux-elf/asm/openssl.gypi
+@@ -722,12 +722,11 @@
+ ],
+ 'openssl_cflags_linux-elf': [
+ '-Wa,--noexecstack',
+- '-Wall -O3 -fomit-frame-pointer',
++ '-Wall -O3',
+ '-pthread',
+- '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '',
+ ],
+ },
+ 'include_dirs': [
diff --git a/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
new file mode 100644
index 000000000000..061ff03fb028
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi.orig 2019-05-28 21:32:15 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi
+@@ -7,12 +7,11 @@
+ 'OPENSSL_PIC',
+ ],
+ 'openssl_cflags_linux-elf': [
+- '-Wall -O3 -fomit-frame-pointer',
++ '-Wall -O3',
+ '-pthread',
+- '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '',
+ ],
+ 'openssl_cli_srcs_linux-elf': [
+ 'openssl/apps/asn1pars.c',
diff --git a/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
new file mode 100644
index 000000000000..f11e73db2996
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi.orig 2019-05-29 20:16:06 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi
+@@ -691,12 +691,11 @@
+ 'OPENSSL_PIC',
+ ],
+ 'openssl_cflags_linux-elf': [
+- '-Wall -O3 -fomit-frame-pointer',
++ '-Wall -O3',
+ '-pthread',
+- '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '',
+ ],
+ },
+ 'include_dirs': [
diff --git a/www/node10/files/patch-deps_openssl_config_bn__conf__asm.h b/www/node10/files/patch-deps_openssl_config_bn__conf__asm.h
new file mode 100644
index 000000000000..0d2a636e2676
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_bn__conf__asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/bn_conf_asm.h.orig 2018-05-11 12:01:43 UTC
++++ deps/openssl/config/bn_conf_asm.h
+@@ -21,8 +21,8 @@
+ # include "./archs/VC-WIN32/asm/crypto/include/internal/bn_conf.h"
+ #elif defined(_WIN32) && defined(_M_X64)
+ # include "./archs/VC-WIN64A/asm/crypto/include/internal/bn_conf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/asm/crypto/include/internal/bn_conf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/asm/crypto/include/internal/bn_conf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/asm/crypto/include/internal/bn_conf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_config_bn__conf__no-asm.h b/www/node10/files/patch-deps_openssl_config_bn__conf__no-asm.h
new file mode 100644
index 000000000000..54910b76feb6
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_bn__conf__no-asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/bn_conf_no-asm.h.orig 2019-05-28 21:32:16 UTC
++++ deps/openssl/config/bn_conf_no-asm.h
+@@ -23,8 +23,8 @@
+ # include "./archs/VC-WIN64A/no-asm/crypto/include/internal/bn_conf.h"
+ #elif defined(_WIN32) && defined(_M_ARM64)
+ # include "./archs/VC-WIN64-ARM/no-asm/crypto/include/internal/bn_conf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/no-asm/crypto/include/internal/bn_conf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/no-asm/crypto/include/internal/bn_conf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/no-asm/crypto/include/internal/bn_conf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_config_dso__conf__asm.h b/www/node10/files/patch-deps_openssl_config_dso__conf__asm.h
new file mode 100644
index 000000000000..d5d0e9d9b4ea
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_dso__conf__asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/dso_conf_asm.h.orig 2018-05-11 12:02:07 UTC
++++ deps/openssl/config/dso_conf_asm.h
+@@ -21,8 +21,8 @@
+ # include "./archs/VC-WIN32/asm/crypto/include/internal/dso_conf.h"
+ #elif defined(_WIN32) && defined(_M_X64)
+ # include "./archs/VC-WIN64A/asm/crypto/include/internal/dso_conf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/asm/crypto/include/internal/dso_conf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/asm/crypto/include/internal/dso_conf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/asm/crypto/include/internal/dso_conf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_config_dso__conf__no-asm.h b/www/node10/files/patch-deps_openssl_config_dso__conf__no-asm.h
new file mode 100644
index 000000000000..d8b36237d51c
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_dso__conf__no-asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/dso_conf_no-asm.h.orig 2019-05-28 21:32:16 UTC
++++ deps/openssl/config/dso_conf_no-asm.h
+@@ -23,8 +23,8 @@
+ # include "./archs/VC-WIN64A/no-asm/crypto/include/internal/dso_conf.h"
+ #elif defined(_WIN32) && defined(_M_ARM64)
+ # include "./archs/VC-WIN64-ARM/no-asm/crypto/include/internal/dso_conf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/no-asm/crypto/include/internal/dso_conf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/no-asm/crypto/include/internal/dso_conf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/no-asm/crypto/include/internal/dso_conf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_config_opensslconf__asm.h b/www/node10/files/patch-deps_openssl_config_opensslconf__asm.h
new file mode 100644
index 000000000000..814bd24dc300
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_opensslconf__asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/opensslconf_asm.h.orig 2018-05-11 11:27:00 UTC
++++ deps/openssl/config/opensslconf_asm.h
+@@ -108,8 +108,8 @@
+ # include "./archs/VC-WIN32/asm/include/openssl/opensslconf.h"
+ #elif defined(_WIN32) && defined(_M_X64)
+ # include "./archs/VC-WIN64A/asm/include/openssl/opensslconf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/asm/include/openssl/opensslconf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/asm/include/openssl/opensslconf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/asm/include/openssl/opensslconf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_config_opensslconf__no-asm.h b/www/node10/files/patch-deps_openssl_config_opensslconf__no-asm.h
new file mode 100644
index 000000000000..c6568e994ebe
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_config_opensslconf__no-asm.h
@@ -0,0 +1,13 @@
+--- deps/openssl/config/opensslconf_no-asm.h.orig 2019-05-28 21:32:16 UTC
++++ deps/openssl/config/opensslconf_no-asm.h
+@@ -18,8 +18,8 @@
+ # include "./archs/VC-WIN64A/no-asm/include/openssl/opensslconf.h"
+ #elif defined(_WIN32) && defined(_M_ARM64)
+ # include "./archs/VC-WIN64-ARM/no-asm/include/openssl/opensslconf.h"
+-#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
+-# include "./archs/BSD-x86/no-asm/include/openssl/opensslconf.h"
++//#elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__i386__)
++//# include "./archs/BSD-x86/no-asm/include/openssl/opensslconf.h"
+ #elif (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__x86_64__)
+ # include "./archs/BSD-x86_64/no-asm/include/openssl/opensslconf.h"
+ #elif defined(__sun) && defined(__i386__)
diff --git a/www/node10/files/patch-deps_openssl_openssl-cl__no__asm.gypi b/www/node10/files/patch-deps_openssl_openssl-cl__no__asm.gypi
new file mode 100644
index 000000000000..4026ea3d537f
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_openssl-cl__no__asm.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/openssl-cl_no_asm.gypi.orig 2019-07-31 17:44:59 UTC
++++ deps/openssl/openssl-cl_no_asm.gypi
+@@ -1,4 +1,5 @@
+ {
++ 'defines': ['OPENSSL_NO_ASM'],
+ 'conditions': [
+ ['target_arch=="ppc" and OS=="aix"', {
+ 'includes': ['config/archs/aix-gcc/no-asm/openssl-cl.gypi'],
+@@ -43,7 +44,7 @@
+ 'includes': ['config/archs/linux-x86_64/no-asm/openssl-cl.gypi'],
+ }, {
+ # Other architectures don't use assembly
+- 'includes': ['config/archs/linux-x86_64/no-asm/openssl-cl.gypi'],
++ 'includes': ['config/archs/linux-elf/no-asm/openssl-cl.gypi'],
+ }],
+ ],
+ }
diff --git a/www/node10/files/patch-deps_openssl_openssl__no__asm.gypi b/www/node10/files/patch-deps_openssl_openssl__no__asm.gypi
new file mode 100644
index 000000000000..a8cb353e9aab
--- /dev/null
+++ b/www/node10/files/patch-deps_openssl_openssl__no__asm.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/openssl_no_asm.gypi.orig 2019-07-31 17:45:01 UTC
++++ deps/openssl/openssl_no_asm.gypi
+@@ -44,7 +44,7 @@
+ 'includes': ['config/archs/linux-x86_64/no-asm/openssl.gypi'],
+ }, {
+ # Other architectures don't use assembly
+- 'includes': ['config/archs/linux-x86_64/no-asm/openssl.gypi'],
++ 'includes': ['config/archs/linux-elf/no-asm/openssl.gypi'],
+ }],
+ ],
+ }
diff --git a/www/node10/files/patch-deps_v8_src_arm_cpu-arm.cc b/www/node10/files/patch-deps_v8_src_arm_cpu-arm.cc
new file mode 100644
index 000000000000..ceafdbfaa376
--- /dev/null
+++ b/www/node10/files/patch-deps_v8_src_arm_cpu-arm.cc
@@ -0,0 +1,22 @@
+--- deps/v8/src/arm/cpu-arm.cc.orig 2018-08-15 13:53:24 UTC
++++ deps/v8/src/arm/cpu-arm.cc
+@@ -7,6 +7,9 @@
+ #ifdef __QNXNTO__
+ #include <sys/mman.h> // for cache flushing.
+ #undef MAP_TYPE
++#elif defined(__FreeBSD__)
++#include <sys/types.h>
++#include <machine/sysarch.h> // for cache flushing.
+ #else
+ #include <sys/syscall.h> // for cache flushing.
+ #endif
+@@ -24,6 +27,9 @@ void CpuFeatures::FlushICache(void* star
+ #if !defined(USE_SIMULATOR)
+ #if V8_OS_QNX
+ msync(start, size, MS_SYNC | MS_INVALIDATE_ICACHE);
++#elif defined(__FreeBSD__)
++ struct arm_sync_icache_args args = { .addr = (uintptr_t)start, .len = size };
++ sysarch(ARM_SYNC_ICACHE, (void *)&args);
+ #else
+ register uint32_t beg asm("r0") = reinterpret_cast<uint32_t>(start);
+ register uint32_t end asm("r1") = beg + size;
diff --git a/www/node10/files/patch-deps_v8_src_base_platform_platform-freebsd.cc b/www/node10/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 000000000000..2247e5ad98e1
--- /dev/null
+++ b/www/node10/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,50 @@
+--- deps/v8/src/base/platform/platform-freebsd.cc.orig 2018-08-15 13:53:24 UTC
++++ deps/v8/src/base/platform/platform-freebsd.cc
+@@ -86,5 +86,47 @@ std::vector<OS::SharedLibraryAddress> OS
+
+ void OS::SignalCodeMovingGC() {}
+
++#ifdef __arm__
++
++bool OS::ArmUsingHardFloat() {
++// GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
++// the Floating Point ABI used (PCS stands for Procedure Call Standard).
++// We use these as well as a couple of other defines to statically determine
++// what FP ABI used.
++// GCC versions 4.4 and below don't support hard-fp.
++// GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
++// __ARM_PCS_VFP.
++
++#define GCC_VERSION \
++ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
++#if GCC_VERSION >= 40600 && !defined(__clang__)
++#if defined(__ARM_PCS_VFP)
++ return true;
++#else
++ return false;
++#endif
++
++#elif GCC_VERSION < 40500 && !defined(__clang__)
++ return false;
++
++#else
++#if defined(__ARM_PCS_VFP)
++ return true;
++#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
++ !defined(__VFP_FP__)
++ return false;
++#else
++#error \
++ "Your version of compiler does not report the FP ABI compiled for." \
++ "Please report it on this issue" \
++ "http://code.google.com/p/v8/issues/detail?id=2140"
++
++#endif
++#endif
++#undef GCC_VERSION
++}
++
++#endif // def __arm__
++
+ } // namespace base
+ } // namespace v8
diff --git a/www/node10/files/patch-deps_v8_src_libsampler_sampler.cc b/www/node10/files/patch-deps_v8_src_libsampler_sampler.cc
new file mode 100644
index 000000000000..1548b15aae4b
--- /dev/null
+++ b/www/node10/files/patch-deps_v8_src_libsampler_sampler.cc
@@ -0,0 +1,19 @@
+--- deps/v8/src/libsampler/sampler.cc.orig 2019-03-05 15:16:28 UTC
++++ deps/v8/src/libsampler/sampler.cc
+@@ -550,9 +550,13 @@ void SignalHandler::FillRegisterState(void* context, R
+ state->sp = reinterpret_cast<void*>(mcontext.mc_rsp);
+ state->fp = reinterpret_cast<void*>(mcontext.mc_rbp);
+ #elif V8_HOST_ARCH_ARM
+- state->pc = reinterpret_cast<void*>(mcontext.mc_r15);
+- state->sp = reinterpret_cast<void*>(mcontext.mc_r13);
+- state->fp = reinterpret_cast<void*>(mcontext.mc_r11);
++ state->pc = reinterpret_cast<void*>(mcontext.__gregs[_REG_PC]);
++ state->sp = reinterpret_cast<void*>(mcontext.__gregs[_REG_SP]);
++ state->fp = reinterpret_cast<void*>(mcontext.__gregs[_REG_FP]);
++#elif V8_TARGET_ARCH_PPC_BE
++ state->pc = reinterpret_cast<void*>(mcontext.mc_srr0);
++ state->sp = reinterpret_cast<void*>(mcontext.mc_frame[1]);
++ state->fp = reinterpret_cast<void*>(mcontext.mc_frame[31]);
+ #endif // V8_HOST_ARCH_*
+ #elif V8_OS_NETBSD
+ #if V8_HOST_ARCH_IA32
diff --git a/www/node10/files/patch-icu68 b/www/node10/files/patch-icu68
new file mode 100644
index 000000000000..69dbad34273e
--- /dev/null
+++ b/www/node10/files/patch-icu68
@@ -0,0 +1,109 @@
+Regressed by https://github.com/unicode-org/icu/commit/c3fe7e09d844
+
+../deps/v8/src/objects/intl-objects.cc:246:22: error: use of undeclared identifier 'FALSE'
+ FALSE, &status);
+ ^
+../deps/v8/src/objects/intl-objects.cc:425:22: error: use of undeclared identifier 'FALSE'
+ FALSE, &status);
+ ^
+../deps/v8/src/objects/intl-objects.cc:660:22: error: use of undeclared identifier 'FALSE'
+ FALSE, &status);
+ ^
+../deps/v8/src/objects/intl-objects.cc:799:22: error: use of undeclared identifier 'FALSE'
+ FALSE, &status);
+ ^
+../deps/v8/src/runtime/runtime-intl.cc:88:66: error: use of undeclared identifier 'TRUE'
+ uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
+ ^
+../deps/v8/src/runtime/runtime-intl.cc:135:66: error: use of undeclared identifier 'FALSE'
+ uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
+ ^
+../deps/v8/src/runtime/runtime-intl.cc:167:22: error: use of undeclared identifier 'FALSE'
+ FALSE, &status);
+ ^
+../deps/v8/src/runtime/runtime-intl.cc:402:9: error: use of undeclared identifier 'FALSE'
+ FALSE, GetUCharBufferFromFlat(flat1, &sap1, length1), length1);
+ ^
+../deps/v8/src/runtime/runtime-intl.cc:404:9: error: use of undeclared identifier 'FALSE'
+ FALSE, GetUCharBufferFromFlat(flat2, &sap2, length2), length2);
+ ^
+
+--- deps/v8/src/objects/intl-objects.cc.orig 2020-09-15 13:25:38 UTC
++++ deps/v8/src/objects/intl-objects.cc
+@@ -243,7 +243,7 @@ void SetResolvedDateSettings(Isolate* isolate, const i
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY,
+- FALSE, &status);
++ false, &status);
+ if (U_SUCCESS(status)) {
+ JSObject::SetProperty(resolved, factory->NewStringFromStaticChars("locale"),
+ factory->NewStringFromAsciiChecked(result),
+@@ -422,7 +422,7 @@ void SetResolvedNumericSettings(Isolate* isolate, cons
+ char result[ULOC_FULLNAME_CAPACITY];
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_toLanguageTag(icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY,
+- FALSE, &status);
++ false, &status);
+ if (U_SUCCESS(status)) {
+ JSObject::SetProperty(resolved, factory->NewStringFromStaticChars("locale"),
+ factory->NewStringFromAsciiChecked(result),
+@@ -657,7 +657,7 @@ void SetResolvedCollatorSettings(Isolate* isolate,
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY,
+- FALSE, &status);
++ false, &status);
+ if (U_SUCCESS(status)) {
+ JSObject::SetProperty(resolved, factory->NewStringFromStaticChars("locale"),
+ factory->NewStringFromAsciiChecked(result),
+@@ -796,7 +796,7 @@ void SetResolvedBreakIteratorSettings(Isolate* isolate
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY,
+- FALSE, &status);
++ false, &status);
+ if (U_SUCCESS(status)) {
+ JSObject::SetProperty(resolved, factory->NewStringFromStaticChars("locale"),
+ factory->NewStringFromAsciiChecked(result),
+--- deps/v8/src/runtime/runtime-intl.cc.orig 2020-09-15 13:25:38 UTC
++++ deps/v8/src/runtime/runtime-intl.cc
+@@ -85,7 +85,7 @@ RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) {
+ char result[ULOC_FULLNAME_CAPACITY];
+
+ // Force strict BCP47 rules.
+- uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
++ uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, true, &error);
+
+ if (U_FAILURE(error) || error == U_STRING_NOT_TERMINATED_WARNING) {
+ return *factory->NewStringFromAsciiChecked(kInvalidTag);
+@@ -132,7 +132,7 @@ RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) {
+
+ error = U_ZERO_ERROR;
+ // No need to force strict BCP47 rules.
+- uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
++ uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, false, &error);
+ if (U_FAILURE(error) || error == U_STRING_NOT_TERMINATED_WARNING) {
+ // This shouldn't happen, but lets not break the user.
+ continue;
+@@ -164,7 +164,7 @@ RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) {
+ char result[ULOC_FULLNAME_CAPACITY];
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_toLanguageTag(default_locale.getName(), result, ULOC_FULLNAME_CAPACITY,
+- FALSE, &status);
++ false, &status);
+ if (U_SUCCESS(status)) {
+ return *factory->NewStringFromAsciiChecked(result);
+ }
+@@ -399,9 +399,9 @@ RUNTIME_FUNCTION(Runtime_InternalCompare) {
+ std::unique_ptr<uc16[]> sap1;
+ std::unique_ptr<uc16[]> sap2;
+ icu::UnicodeString string_val1(
+- FALSE, GetUCharBufferFromFlat(flat1, &sap1, length1), length1);
++ false, GetUCharBufferFromFlat(flat1, &sap1, length1), length1);
+ icu::UnicodeString string_val2(
+- FALSE, GetUCharBufferFromFlat(flat2, &sap2, length2), length2);
++ false, GetUCharBufferFromFlat(flat2, &sap2, length2), length2);
+ result = collator->compare(string_val1, string_val2, status);
+ }
+ if (U_FAILURE(status)) return isolate->ThrowIllegalOperation();
diff --git a/www/node10/files/patch-node.gypi b/www/node10/files/patch-node.gypi
new file mode 100644
index 000000000000..a28bd89c098d
--- /dev/null
+++ b/www/node10/files/patch-node.gypi
@@ -0,0 +1,12 @@
+--- node.gypi.orig 2019-07-31 17:45:05 UTC
++++ node.gypi
+@@ -316,6 +316,9 @@
+ ['openssl_fips != ""', {
+ 'defines': [ 'NODE_FIPS_MODE' ],
+ }],
++ ['openssl_no_asm==1', {
++ 'defines': [ 'OPENSSL_NO_ASM' ],
++ }],
+ [ 'node_shared_openssl=="false"', {
+ 'dependencies': [
+ './deps/openssl/openssl.gyp:openssl',
diff --git a/www/node10/pkg-descr b/www/node10/pkg-descr
new file mode 100644
index 000000000000..76a5a3c0625d
--- /dev/null
+++ b/www/node10/pkg-descr
@@ -0,0 +1,6 @@
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript
+engine. Node.js uses an event-driven, non-blocking I/O model that
+makes it lightweight and efficient. Node.js' package ecosystem,
+npm, is the largest ecosystem of open source libraries in the world.
+
+WWW: https://nodejs.org/
diff --git a/www/node10/pkg-message b/www/node10/pkg-message
new file mode 100644
index 000000000000..ddea08386149
--- /dev/null
+++ b/www/node10/pkg-message
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+Note: If you need npm (Node Package Manager), please install www/npm.
+EOM
+}
+]
diff --git a/www/node10/pkg-plist b/www/node10/pkg-plist
new file mode 100644
index 000000000000..e6fc5c48f1b3
--- /dev/null
+++ b/www/node10/pkg-plist
@@ -0,0 +1,431 @@
+bin/node
+include/node/common.gypi
+include/node/config.gypi
+include/node/libplatform/libplatform.h
+include/node/libplatform/libplatform-export.h
+include/node/libplatform/v8-tracing.h
+include/node/node.h
+include/node/node_api.h
+include/node/node_api_types.h
+include/node/node_buffer.h
+include/node/node_object_wrap.h
+include/node/node_version.h
+%%BUNDLED_SSL%%include/node/openssl/aes.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/asn1.h
+%%BUNDLED_SSL%%include/node/openssl/asn1_mac.h
+%%BUNDLED_SSL%%include/node/openssl/asn1err.h
+%%BUNDLED_SSL%%include/node/openssl/asn1t.h
+%%BUNDLED_SSL%%include/node/openssl/async.h
+%%BUNDLED_SSL%%include/node/openssl/asyncerr.h
+%%BUNDLED_SSL%%include/node/openssl/bio.h
+%%BUNDLED_SSL%%include/node/openssl/bioerr.h
+%%BUNDLED_SSL%%include/node/openssl/blowfish.h
+%%BUNDLED_SSL%%include/node/openssl/bn.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/bnerr.h
+%%BUNDLED_SSL%%include/node/openssl/buffer.h
+%%BUNDLED_SSL%%include/node/openssl/buffererr.h
+%%BUNDLED_SSL%%include/node/openssl/camellia.h
+%%BUNDLED_SSL%%include/node/openssl/cast.h
+%%BUNDLED_SSL%%include/node/openssl/cmac.h
+%%BUNDLED_SSL%%include/node/openssl/cms.h
+%%BUNDLED_SSL%%include/node/openssl/cmserr.h
+%%BUNDLED_SSL%%include/node/openssl/comp.h
+%%BUNDLED_SSL%%include/node/openssl/comperr.h
+%%BUNDLED_SSL%%include/node/openssl/conf.h
+%%BUNDLED_SSL%%include/node/openssl/conf_api.h
+%%BUNDLED_SSL%%include/node/openssl/conferr.h
+%%BUNDLED_SSL%%include/node/openssl/crypto.h
+%%BUNDLED_SSL%%include/node/openssl/cryptoerr.h
+%%BUNDLED_SSL%%include/node/openssl/ct.h
+%%BUNDLED_SSL%%include/node/openssl/cterr.h
+%%BUNDLED_SSL%%include/node/openssl/des.h
+%%BUNDLED_SSL%%include/node/openssl/dh.h
+%%BUNDLED_SSL%%include/node/openssl/dherr.h
+%%BUNDLED_SSL%%include/node/openssl/dsa.h
+%%BUNDLED_SSL%%include/node/openssl/dsaerr.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/dtls1.h
+%%BUNDLED_SSL%%include/node/openssl/e_os2.h
+%%BUNDLED_SSL%%include/node/openssl/ebcdic.h
+%%BUNDLED_SSL%%include/node/openssl/ec.h
+%%BUNDLED_SSL%%include/node/openssl/ecdh.h
+%%BUNDLED_SSL%%include/node/openssl/ecdsa.h
+%%BUNDLED_SSL%%include/node/openssl/ecerr.h
+%%BUNDLED_SSL%%include/node/openssl/engine.h
+%%BUNDLED_SSL%%include/node/openssl/engineerr.h
+%%BUNDLED_SSL%%include/node/openssl/err.h
+%%BUNDLED_SSL%%include/node/openssl/evp.h
+%%BUNDLED_SSL%%include/node/openssl/evperr.h
+%%BUNDLED_SSL%%include/node/openssl/hmac.h
+%%BUNDLED_SSL%%include/node/openssl/idea.h
+%%BUNDLED_SSL%%include/node/openssl/kdf.h
+%%BUNDLED_SSL%%include/node/openssl/kdferr.h
+%%BUNDLED_SSL%%include/node/openssl/lhash.h
+%%BUNDLED_SSL%%include/node/openssl/md2.h
+%%BUNDLED_SSL%%include/node/openssl/md4.h
+%%BUNDLED_SSL%%include/node/openssl/md5.h
+%%BUNDLED_SSL%%include/node/openssl/mdc2.h
+%%BUNDLED_SSL%%include/node/openssl/modes.h
+%%BUNDLED_SSL%%include/node/openssl/obj_mac.h
+%%BUNDLED_SSL%%include/node/openssl/objects.h
+%%BUNDLED_SSL%%include/node/openssl/objectserr.h
+%%BUNDLED_SSL%%include/node/openssl/ocsp.h
+%%BUNDLED_SSL%%include/node/openssl/ocsperr.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/opensslv.h
+%%BUNDLED_SSL%%include/node/openssl/ossl_typ.h
+%%BUNDLED_SSL%%include/node/openssl/pem.h
+%%BUNDLED_SSL%%include/node/openssl/pem2.h
+%%BUNDLED_SSL%%include/node/openssl/pemerr.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs12.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs12err.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs7.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs7err.h
+%%BUNDLED_SSL%%include/node/openssl/rand.h
+%%BUNDLED_SSL%%include/node/openssl/rand_drbg.h
+%%BUNDLED_SSL%%include/node/openssl/randerr.h
+%%BUNDLED_SSL%%include/node/openssl/rc2.h
+%%BUNDLED_SSL%%include/node/openssl/rc4.h
+%%BUNDLED_SSL%%include/node/openssl/rc5.h
+%%BUNDLED_SSL%%include/node/openssl/ripemd.h
+%%BUNDLED_SSL%%include/node/openssl/rsa.h
+%%BUNDLED_SSL%%include/node/openssl/rsaerr.h
+%%BUNDLED_SSL%%include/node/openssl/safestack.h
+%%BUNDLED_SSL%%include/node/openssl/seed.h
+%%BUNDLED_SSL%%include/node/openssl/sha.h
+%%BUNDLED_SSL%%include/node/openssl/srp.h
+%%BUNDLED_SSL%%include/node/openssl/srtp.h
+%%BUNDLED_SSL%%include/node/openssl/ssl.h
+%%BUNDLED_SSL%%include/node/openssl/ssl2.h
+%%BUNDLED_SSL%%include/node/openssl/ssl3.h
+%%BUNDLED_SSL%%include/node/openssl/sslerr.h
+%%BUNDLED_SSL%%include/node/openssl/stack.h
+%%BUNDLED_SSL%%include/node/openssl/store.h
+%%BUNDLED_SSL%%include/node/openssl/storeerr.h
+%%BUNDLED_SSL%%include/node/openssl/symhacks.h
+%%BUNDLED_SSL%%include/node/openssl/tls1.h
+%%BUNDLED_SSL%%include/node/openssl/ts.h
+%%BUNDLED_SSL%%include/node/openssl/tserr.h
+%%BUNDLED_SSL%%include/node/openssl/txt_db.h
+%%BUNDLED_SSL%%include/node/openssl/ui.h
+%%BUNDLED_SSL%%include/node/openssl/uierr.h
+%%BUNDLED_SSL%%include/node/openssl/whrlpool.h
+%%BUNDLED_SSL%%include/node/openssl/x509.h
+%%BUNDLED_SSL%%include/node/openssl/x509_vfy.h
+%%BUNDLED_SSL%%include/node/openssl/x509err.h
+%%BUNDLED_SSL%%include/node/openssl/x509v3.h
+%%BUNDLED_SSL%%include/node/openssl/x509v3err.h
+include/node/v8-inspector-protocol.h
+include/node/v8-inspector.h
+include/node/v8-platform.h
+include/node/v8-profiler.h
+include/node/v8-testing.h
+include/node/v8-util.h
+include/node/v8-value-serializer-version.h
+include/node/v8-version.h
+include/node/v8-version-string.h
+include/node/v8.h
+include/node/v8config.h
+%%DTRACE%%lib/dtrace/node.d
+@(,,444) man/man1/node.1.gz
+%%PORTDOCS%%%%DOCSDIR%%/gdbinit
+%%PORTDOCS%%%%DOCSDIR%%/lldb_commands.py
+%%PORTDOCS%%%%DOCSDIR%%/lldbinit
+share/systemtap/tapset/node.stp
diff --git a/www/node12/Makefile b/www/node12/Makefile
new file mode 100644
index 000000000000..a14c7e50a3f5
--- /dev/null
+++ b/www/node12/Makefile
@@ -0,0 +1,111 @@
+# $FreeBSD$
+
+PORTNAME= node
+PORTVERSION= 12.20.0
+DISTVERSIONPREFIX= v
+CATEGORIES= www
+MASTER_SITES= http://nodejs.org/dist/v${PORTVERSION}/
+PKGNAMESUFFIX= 12
+
+MAINTAINER= bhughes@FreeBSD.org
+COMMENT= V8 JavaScript for client and server
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BROKEN_SSL= libressl libressl-devel
+BROKEN_SSL_REASON= Node.js 12.x LTS requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled
+ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le
+
+OPTIONS_DEFINE= BUNDLED_SSL DOCS NLS DTRACE
+OPTIONS_DEFAULT= DTRACE
+OPTIONS_DEFAULT_FreeBSD_11= BUNDLED_SSL
+OPTIONS_DEFAULT+= ${OPTIONS_DEFAULT_${OPSYS}_${OSREL:R}}
+OPTIONS_SUB= yes
+
+.if !exists(/usr/sbin/dtrace)
+OPTIONS_EXCLUDE+= DTRACE
+.endif
+
+OPTIONS_EXCLUDE_aarch64= DTRACE
+# dt_modtext:/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c(820): arm not implemented
+OPTIONS_EXCLUDE_armv6= DTRACE
+OPTIONS_EXCLUDE_armv7= DTRACE
+OPTIONS_EXCLUDE_powerpc64= DTRACE
+OPTIONS_EXCLUDE_powerpc64le= DTRACE
+
+BUNDLED_SSL_DESC= Use node.js's bundled OpenSSL implementation
+BUNDLED_SSL_USES_OFF= ssl
+BUNDLED_SSL_CONFIGURE_OFF= --shared-openssl --openssl-use-def-ca-store
+BUNDLED_SSL_RUN_DEPENDS_OFF= ca_root_nss>=0:security/ca_root_nss
+
+NLS_CONFIGURE_ON= --with-intl=system-icu
+NLS_BUILD_DEPENDS= icu>=67.1:devel/icu
+NLS_LIB_DEPENDS= libicui18n.so:devel/icu
+
+DTRACE_CONFIGURE_ON= --with-dtrace
+
+USES= compiler:c++11-lib gmake python:2.7,build pkgconfig \
+ localbase shebangfix
+
+HAS_CONFIGURE= yes
+
+CONFLICTS_INSTALL= node10-[0-9]* node14-[0-9]* node-[0-9]*
+
+CONFIGURE_ARGS= --prefix=${PREFIX_RELDEST} \
+ --without-npm \
+ --shared-cares \
+ --shared-libuv \
+ --shared-nghttp2 \
+ --shared-zlib
+
+SHEBANG_FILES= tools/specialize_node_d.py tools/genv8constants.py
+
+PREFIX_RELDEST= ${PREFIX:S,^${DESTDIR},,}
+REINPLACE_ARGS= -i ''
+MAKE_ENV+= CC.host=${CC} CFLAGS.host="${CFLAGS}" \
+ CXX.host=${CXX} CXXFLAGS.host="${CXXFLAGS}" \
+ LINK.host=${CXX} LDFLAGS.host="${LDFLAGS}"
+
+BUILD_DEPENDS+= c-ares>=1.16.1:dns/c-ares \
+ libuv>=1.40.0:devel/libuv \
+ libnghttp2>=1.41.0:www/libnghttp2 \
+ objdump:devel/binutils
+LIB_DEPENDS+= libcares.so:dns/c-ares\
+ libuv.so:devel/libuv \
+ libnghttp2.so:www/libnghttp2
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1200085
+BROKEN_SSL+= base
+.endif
+
+.if ${ARCH} == armv6 || ${ARCH} == armv7
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-tools_v8__gypfiles_v8.gyp
+.elif (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-common.gypi
+.endif
+
+.if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64
+CONFIGURE_ARGS+=--openssl-no-asm
+.endif
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|' \
+ ${WRKSRC}/tools/v8_gypfiles/v8.gyp
+
+post-configure:
+ # Post-process Makefile and *.mk files created by node-gyp and remove
+ # all occurrences of -I${LOCALBASE}/include. C*FLAGS include this
+ # before all -I../deps/* for bundled code. This can cause build
+ # breakages if the dependency is installed in ${LOCALBASE}. The
+ # USES+=localbase # above will ensure that we pick up includes for real
+ # external dependencies.
+ ${FIND} ${WRKSRC}/out -type f -print0 \
+ | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g"
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/node
+
+.include <bsd.port.mk>
diff --git a/www/node12/distinfo b/www/node12/distinfo
new file mode 100644
index 000000000000..16457af7e4c4
--- /dev/null
+++ b/www/node12/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1606257052
+SHA256 (node-v12.20.0.tar.gz) = b91065ebe60981faa0e1f0a37d1788154141c710bb0521635a900895a7ce8dd8
+SIZE (node-v12.20.0.tar.gz) = 53497742
diff --git a/www/node12/files/extra-patch-common.gypi b/www/node12/files/extra-patch-common.gypi
new file mode 100644
index 000000000000..8e817a2959c9
--- /dev/null
+++ b/www/node12/files/extra-patch-common.gypi
@@ -0,0 +1,13 @@
+--- common.gypi.orig 2019-10-01 15:32:40.000000000 +0200
++++ common.gypi 2019-10-16 12:47:09.236138000 +0200
+@@ -390,8 +390,8 @@
+ 'ldflags': [ '-m32' ],
+ }],
+ [ 'target_arch=="ppc64" and OS!="aix"', {
+- 'cflags': [ '-m64', '-mminimal-toc' ],
+- 'ldflags': [ '-m64' ],
++ 'cflags': [ '-m64' ],
++ 'ldflags': [ '-m64' ],
+ }],
+ [ 'target_arch=="s390x"', {
+ 'cflags': [ '-m64', '-march=z196' ],
diff --git a/www/node12/files/extra-patch-tools_v8__gypfiles_v8.gyp b/www/node12/files/extra-patch-tools_v8__gypfiles_v8.gyp
new file mode 100644
index 000000000000..56c68f309309
--- /dev/null
+++ b/www/node12/files/extra-patch-tools_v8__gypfiles_v8.gyp
@@ -0,0 +1,11 @@
+--- tools/v8_gypfiles/v8.gyp.orig 2020-04-25 08:58:14 UTC
++++ tools/v8_gypfiles/v8.gyp
+@@ -809,7 +809,7 @@
+ }],
+ # Platforms that don't have Compare-And-Swap (CAS) support need to link atomic library
+ # to implement atomic memory access
+- ['v8_current_cpu in ["mips", "mipsel", "mips64", "mips64el", "ppc", "arm"]', {
++ ['v8_current_cpu in ["mips", "mipsel", "mips64", "mips64el", "ppc"]', {
+ 'link_settings': {
+ 'libraries': ['-latomic', ],
+ },
diff --git a/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi b/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
new file mode 100644
index 000000000000..aae558fe58db
--- /dev/null
+++ b/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi.orig 2019-08-06 20:46:23 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi
+@@ -12,7 +12,7 @@
+ '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '-pthread',
+ ],
+ 'openssl_cli_srcs_linux-elf': [
+ 'openssl/apps/asn1pars.c',
diff --git a/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi b/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
new file mode 100644
index 000000000000..552266b703f0
--- /dev/null
+++ b/www/node12/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi.orig 2019-08-06 20:46:23 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi
+@@ -696,7 +696,7 @@
+ '-Wall -O3 -fomit-frame-pointer',
+ ],
+ 'openssl_ex_libs_linux-elf': [
+- '-ldl -pthread',
++ '-pthread',
+ ],
+ },
+ 'include_dirs': [
diff --git a/www/node12/files/patch-deps_openssl_openssl-cl__no__asm.gypi b/www/node12/files/patch-deps_openssl_openssl-cl__no__asm.gypi
new file mode 100644
index 000000000000..5164a41cab19
--- /dev/null
+++ b/www/node12/files/patch-deps_openssl_openssl-cl__no__asm.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/openssl-cl_no_asm.gypi.orig 2020-10-06 18:05:13 UTC
++++ deps/openssl/openssl-cl_no_asm.gypi
+@@ -1,4 +1,5 @@
+ {
++ 'defines': ['OPENSSL_NO_ASM'],
+ 'conditions': [
+ ['target_arch=="ppc" and OS=="aix"', {
+ 'includes': ['config/archs/aix-gcc/no-asm/openssl-cl.gypi'],
+@@ -47,7 +48,7 @@
+ 'includes': ['config/archs/linux64-mips64/no-asm/openssl-cl.gypi'],
+ }, {
+ # Other architectures don't use assembly
+- 'includes': ['config/archs/linux-x86_64/no-asm/openssl-cl.gypi'],
++ 'includes': ['config/archs/linux-elf/no-asm/openssl-cl.gypi'],
+ }],
+ ],
+ }
diff --git a/www/node12/files/patch-deps_openssl_openssl__no__asm.gypi b/www/node12/files/patch-deps_openssl_openssl__no__asm.gypi
new file mode 100644
index 000000000000..aba4a4ff4b66
--- /dev/null
+++ b/www/node12/files/patch-deps_openssl_openssl__no__asm.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/openssl_no_asm.gypi.orig 2020-10-06 18:05:13 UTC
++++ deps/openssl/openssl_no_asm.gypi
+@@ -48,7 +48,7 @@
+ 'includes': ['config/archs/linux64-mips64/no-asm/openssl.gypi'],
+ }, {
+ # Other architectures don't use assembly
+- 'includes': ['config/archs/linux-x86_64/no-asm/openssl.gypi'],
++ 'includes': ['config/archs/linux-elf/no-asm/openssl.gypi'],
+ }],
+ ],
+ }
diff --git a/www/node12/files/patch-deps_v8_src_base_platform_platform-freebsd.cc b/www/node12/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 000000000000..d1f61a84b37b
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,62 @@
+--- deps/v8/src/base/platform/platform-freebsd.cc.orig 2020-01-07 22:07:49 UTC
++++ deps/v8/src/base/platform/platform-freebsd.cc
+@@ -81,8 +81,8 @@ std::vector<OS::SharedLibraryAddress> OS::GetSharedLib
+ lib_name = std::string(path);
+ }
+ result.push_back(SharedLibraryAddress(
+- lib_name, reinterpret_cast<uintptr_t>(map->kve_start),
+- reinterpret_cast<uintptr_t>(map->kve_end)));
++ lib_name, static_cast<uintptr_t>(map->kve_start),
++ static_cast<uintptr_t>(map->kve_end)));
+ }
+
+ start += ssize;
+@@ -93,6 +93,48 @@ std::vector<OS::SharedLibraryAddress> OS::GetSharedLib
+ }
+
+ void OS::SignalCodeMovingGC() {}
++
++#ifdef __arm__
++
++bool OS::ArmUsingHardFloat() {
++// GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
++// the Floating Point ABI used (PCS stands for Procedure Call Standard).
++// We use these as well as a couple of other defines to statically determine
++// what FP ABI used.
++// GCC versions 4.4 and below don't support hard-fp.
++// GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
++// __ARM_PCS_VFP.
++
++#define GCC_VERSION \
++ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
++#if GCC_VERSION >= 40600 && !defined(__clang__)
++#if defined(__ARM_PCS_VFP)
++ return true;
++#else
++ return false;
++#endif
++
++#elif GCC_VERSION < 40500 && !defined(__clang__)
++ return false;
++
++#else
++#if defined(__ARM_PCS_VFP)
++ return true;
++#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
++ !defined(__VFP_FP__)
++ return false;
++#else
++#error \
++ "Your version of compiler does not report the FP ABI compiled for." \
++ "Please report it on this issue" \
++ "http://code.google.com/p/v8/issues/detail?id=2140"
++
++#endif
++#endif
++#undef GCC_VERSION
++}
++
++#endif // def __arm__
+
+ void OS::AdjustSchedulingParams() {}
+
diff --git a/www/node12/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc b/www/node12/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
new file mode 100644
index 000000000000..726f3e7a0d31
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
@@ -0,0 +1,22 @@
+--- deps/v8/src/codegen/arm/cpu-arm.cc.orig 2019-08-20 17:14:50 UTC
++++ deps/v8/src/codegen/arm/cpu-arm.cc
+@@ -7,6 +7,9 @@
+ #ifdef __QNXNTO__
+ #include <sys/mman.h> // for cache flushing.
+ #undef MAP_TYPE // NOLINT
++#elif defined(__FreeBSD__)
++#include <sys/types.h>
++#include <machine/sysarch.h> // for cache flushing.
+ #else
+ #include <sys/syscall.h> // for cache flushing.
+ #endif
+@@ -25,6 +28,9 @@ V8_NOINLINE void CpuFeatures::FlushICache(void* start,
+ #if !defined(USE_SIMULATOR)
+ #if V8_OS_QNX
+ msync(start, size, MS_SYNC | MS_INVALIDATE_ICACHE);
++#elif defined(__FreeBSD__)
++ struct arm_sync_icache_args args = { .addr = (uintptr_t)start, .len = size };
++ sysarch(ARM_SYNC_ICACHE, (void *)&args);
+ #else
+ register uint32_t beg asm("r0") = reinterpret_cast<uint32_t>(start);
+ register uint32_t end asm("r1") = beg + size;
diff --git a/www/node12/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h b/www/node12/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
new file mode 100644
index 000000000000..044fd3a292f3
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
@@ -0,0 +1,20 @@
+--- deps/v8/src/codegen/ppc/constants-ppc.h.orig 2019-09-09 16:27:17 UTC
++++ deps/v8/src/codegen/ppc/constants-ppc.h
+@@ -34,7 +34,7 @@
+ #define ABI_PASSES_HANDLES_IN_REGS 0
+ #endif
+
+-#if !V8_HOST_ARCH_PPC || !V8_TARGET_ARCH_PPC64 || V8_TARGET_LITTLE_ENDIAN || \
++#if !V8_HOST_ARCH_PPC || !V8_TARGET_ARCH_PPC64 || \
+ (defined(_CALL_ELF) && _CALL_ELF == 2)
+ #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 1
+ #else
+@@ -43,7 +43,7 @@
+
+ #if !V8_HOST_ARCH_PPC || \
+ (V8_TARGET_ARCH_PPC64 && \
+- (V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2)))
++ (defined(_CALL_ELF) && _CALL_ELF == 2))
+ #define ABI_CALL_VIA_IP 1
+ #else
+ #define ABI_CALL_VIA_IP 0
diff --git a/www/node12/files/patch-deps_v8_src_compiler_backend_instruction-selector.cc b/www/node12/files/patch-deps_v8_src_compiler_backend_instruction-selector.cc
new file mode 100644
index 000000000000..2038a1e3c910
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_compiler_backend_instruction-selector.cc
@@ -0,0 +1,11 @@
+--- deps/v8/src/compiler/backend/instruction-selector.cc.orig 2020-07-22 15:26:52 UTC
++++ deps/v8/src/compiler/backend/instruction-selector.cc
+@@ -2788,7 +2788,7 @@ void InstructionSelector::VisitCall(Node* node, BasicB
+ switch (call_descriptor->kind()) {
+ case CallDescriptor::kCallAddress: {
+ int misc_field = static_cast<int>(call_descriptor->ParameterCount());
+-#if defined(_AIX)
++#if defined(_AIX) || (V8_TARGET_ARCH_PPC_BE && (!defined(_CALL_ELF) || _CALL_ELF == 1))
+ // Highest misc_field bit is used on AIX to indicate if a CFunction call
+ // has function descriptor or not.
+ misc_field |= call_descriptor->HasFunctionDescriptor()
diff --git a/www/node12/files/patch-deps_v8_src_compiler_backend_ppc_code-generator-ppc.cc b/www/node12/files/patch-deps_v8_src_compiler_backend_ppc_code-generator-ppc.cc
new file mode 100644
index 000000000000..8a2fd0d75a1a
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_compiler_backend_ppc_code-generator-ppc.cc
@@ -0,0 +1,11 @@
+--- deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc.orig 2020-04-21 11:38:50 UTC
++++ deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
+@@ -1026,7 +1026,7 @@
+ Label start_call;
+ bool isWasmCapiFunction =
+ linkage()->GetIncomingDescriptor()->IsWasmCapiFunction();
+-#if defined(_AIX)
++#if defined(_AIX) || (V8_TARGET_ARCH_PPC_BE && (!defined(_CALL_ELF) || _CALL_ELF == 1))
+ // AIX/PPC64BE Linux uses a function descriptor
+ int kNumParametersMask = kHasFunctionDescriptorBitMask - 1;
+ num_parameters = kNumParametersMask & misc_field;
diff --git a/www/node12/files/patch-deps_v8_src_execution_simulator.h b/www/node12/files/patch-deps_v8_src_execution_simulator.h
new file mode 100644
index 000000000000..70b5ae1171bb
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_execution_simulator.h
@@ -0,0 +1,11 @@
+--- deps/v8/src/execution/simulator.h.orig 2019-11-21 21:14:01 UTC
++++ deps/v8/src/execution/simulator.h
+@@ -122,7 +122,7 @@
+
+ DISABLE_CFI_ICALL Return Call(Args... args) {
+ // When running without a simulator we call the entry directly.
+-#if V8_OS_AIX
++#if V8_OS_AIX || (V8_TARGET_ARCH_PPC_BE && (!defined(_CALL_ELF) || _CALL_ELF == 1))
+ // AIX ABI requires function descriptors (FD). Artificially create a pseudo
+ // FD to ensure correct dispatch to generated code. The 'volatile'
+ // declaration is required to avoid the compiler from not observing the
diff --git a/www/node12/files/patch-deps_v8_src_libsampler_sampler.cc b/www/node12/files/patch-deps_v8_src_libsampler_sampler.cc
new file mode 100644
index 000000000000..9c1992530cfd
--- /dev/null
+++ b/www/node12/files/patch-deps_v8_src_libsampler_sampler.cc
@@ -0,0 +1,19 @@
+--- deps/v8/src/libsampler/sampler.cc.orig 2019-08-20 17:14:50 UTC
++++ deps/v8/src/libsampler/sampler.cc
+@@ -477,9 +477,13 @@ void SignalHandler::FillRegisterState(void* context, R
+ state->sp = reinterpret_cast<void*>(mcontext.mc_rsp);
+ state->fp = reinterpret_cast<void*>(mcontext.mc_rbp);
+ #elif V8_HOST_ARCH_ARM
+- state->pc = reinterpret_cast<void*>(mcontext.mc_r15);
+- state->sp = reinterpret_cast<void*>(mcontext.mc_r13);
+- state->fp = reinterpret_cast<void*>(mcontext.mc_r11);
++ state->pc = reinterpret_cast<void*>(mcontext.__gregs[_REG_PC]);
++ state->sp = reinterpret_cast<void*>(mcontext.__gregs[_REG_SP]);
++ state->fp = reinterpret_cast<void*>(mcontext.__gregs[_REG_FP]);
++#elif V8_TARGET_ARCH_PPC_BE
++ state->pc = reinterpret_cast<void*>(mcontext.mc_srr0);
++ state->sp = reinterpret_cast<void*>(mcontext.mc_frame[1]);
++ state->fp = reinterpret_cast<void*>(mcontext.mc_frame[31]);
+ #endif // V8_HOST_ARCH_*
+ #elif V8_OS_NETBSD
+ #if V8_HOST_ARCH_IA32
diff --git a/www/node12/files/patch-node.gypi b/www/node12/files/patch-node.gypi
new file mode 100644
index 000000000000..57c16c71f210
--- /dev/null
+++ b/www/node12/files/patch-node.gypi
@@ -0,0 +1,12 @@
+--- node.gypi.orig 2020-05-26 11:53:34 UTC
++++ node.gypi
+@@ -323,6 +323,9 @@
+ ['openssl_fips != "" or openssl_is_fips=="true"', {
+ 'defines': [ 'NODE_FIPS_MODE' ],
+ }],
++ ['openssl_no_asm==1', {
++ 'defines': [ 'OPENSSL_NO_ASM' ],
++ }],
+ [ 'node_shared_openssl=="false"', {
+ 'dependencies': [
+ './deps/openssl/openssl.gyp:openssl',
diff --git a/www/node12/pkg-descr b/www/node12/pkg-descr
new file mode 100644
index 000000000000..76a5a3c0625d
--- /dev/null
+++ b/www/node12/pkg-descr
@@ -0,0 +1,6 @@
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript
+engine. Node.js uses an event-driven, non-blocking I/O model that
+makes it lightweight and efficient. Node.js' package ecosystem,
+npm, is the largest ecosystem of open source libraries in the world.
+
+WWW: https://nodejs.org/
diff --git a/www/node12/pkg-message b/www/node12/pkg-message
new file mode 100644
index 000000000000..ddea08386149
--- /dev/null
+++ b/www/node12/pkg-message
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+Note: If you need npm (Node Package Manager), please install www/npm.
+EOM
+}
+]
diff --git a/www/node12/pkg-plist b/www/node12/pkg-plist
new file mode 100644
index 000000000000..5989720d1f0b
--- /dev/null
+++ b/www/node12/pkg-plist
@@ -0,0 +1,478 @@
+bin/node
+include/node/common.gypi
+include/node/config.gypi
+include/node/js_native_api.h
+include/node/js_native_api_types.h
+include/node/libplatform/libplatform.h
+include/node/libplatform/libplatform-export.h
+include/node/libplatform/v8-tracing.h
+include/node/node.h
+include/node/node_api.h
+include/node/node_api_types.h
+include/node/node_buffer.h
+include/node/node_object_wrap.h
+include/node/node_version.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/BSD-x86_64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN32/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/VC-WIN64A/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/aix64-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-arm64-cc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin-i386-cc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-aarch64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-armv4/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-elf/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-mips64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-ppc64le/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x32/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux-x86_64/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux32-s390x/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/linux64-s390x/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris-x86-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/progs.h
+%%BUNDLED_SSL%%include/node/openssl/aes.h
+%%BUNDLED_SSL%%include/node/openssl/asn1.h
+%%BUNDLED_SSL%%include/node/openssl/asn1_mac.h
+%%BUNDLED_SSL%%include/node/openssl/asn1err.h
+%%BUNDLED_SSL%%include/node/openssl/asn1t.h
+%%BUNDLED_SSL%%include/node/openssl/async.h
+%%BUNDLED_SSL%%include/node/openssl/asyncerr.h
+%%BUNDLED_SSL%%include/node/openssl/bio.h
+%%BUNDLED_SSL%%include/node/openssl/bioerr.h
+%%BUNDLED_SSL%%include/node/openssl/blowfish.h
+%%BUNDLED_SSL%%include/node/openssl/bn.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/bn_conf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/bnerr.h
+%%BUNDLED_SSL%%include/node/openssl/buffer.h
+%%BUNDLED_SSL%%include/node/openssl/buffererr.h
+%%BUNDLED_SSL%%include/node/openssl/camellia.h
+%%BUNDLED_SSL%%include/node/openssl/cast.h
+%%BUNDLED_SSL%%include/node/openssl/cmac.h
+%%BUNDLED_SSL%%include/node/openssl/cms.h
+%%BUNDLED_SSL%%include/node/openssl/cmserr.h
+%%BUNDLED_SSL%%include/node/openssl/comp.h
+%%BUNDLED_SSL%%include/node/openssl/comperr.h
+%%BUNDLED_SSL%%include/node/openssl/conf.h
+%%BUNDLED_SSL%%include/node/openssl/conf_api.h
+%%BUNDLED_SSL%%include/node/openssl/conferr.h
+%%BUNDLED_SSL%%include/node/openssl/crypto.h
+%%BUNDLED_SSL%%include/node/openssl/cryptoerr.h
+%%BUNDLED_SSL%%include/node/openssl/ct.h
+%%BUNDLED_SSL%%include/node/openssl/cterr.h
+%%BUNDLED_SSL%%include/node/openssl/des.h
+%%BUNDLED_SSL%%include/node/openssl/dh.h
+%%BUNDLED_SSL%%include/node/openssl/dherr.h
+%%BUNDLED_SSL%%include/node/openssl/dsa.h
+%%BUNDLED_SSL%%include/node/openssl/dsaerr.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/dso_conf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/dtls1.h
+%%BUNDLED_SSL%%include/node/openssl/e_os2.h
+%%BUNDLED_SSL%%include/node/openssl/ebcdic.h
+%%BUNDLED_SSL%%include/node/openssl/ec.h
+%%BUNDLED_SSL%%include/node/openssl/ecdh.h
+%%BUNDLED_SSL%%include/node/openssl/ecdsa.h
+%%BUNDLED_SSL%%include/node/openssl/ecerr.h
+%%BUNDLED_SSL%%include/node/openssl/engine.h
+%%BUNDLED_SSL%%include/node/openssl/engineerr.h
+%%BUNDLED_SSL%%include/node/openssl/err.h
+%%BUNDLED_SSL%%include/node/openssl/evp.h
+%%BUNDLED_SSL%%include/node/openssl/evperr.h
+%%BUNDLED_SSL%%include/node/openssl/hmac.h
+%%BUNDLED_SSL%%include/node/openssl/idea.h
+%%BUNDLED_SSL%%include/node/openssl/kdf.h
+%%BUNDLED_SSL%%include/node/openssl/kdferr.h
+%%BUNDLED_SSL%%include/node/openssl/lhash.h
+%%BUNDLED_SSL%%include/node/openssl/md2.h
+%%BUNDLED_SSL%%include/node/openssl/md4.h
+%%BUNDLED_SSL%%include/node/openssl/md5.h
+%%BUNDLED_SSL%%include/node/openssl/mdc2.h
+%%BUNDLED_SSL%%include/node/openssl/modes.h
+%%BUNDLED_SSL%%include/node/openssl/obj_mac.h
+%%BUNDLED_SSL%%include/node/openssl/objects.h
+%%BUNDLED_SSL%%include/node/openssl/objectserr.h
+%%BUNDLED_SSL%%include/node/openssl/ocsp.h
+%%BUNDLED_SSL%%include/node/openssl/ocsperr.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf_asm.h
+%%BUNDLED_SSL%%include/node/openssl/opensslconf_no-asm.h
+%%BUNDLED_SSL%%include/node/openssl/opensslv.h
+%%BUNDLED_SSL%%include/node/openssl/ossl_typ.h
+%%BUNDLED_SSL%%include/node/openssl/pem2.h
+%%BUNDLED_SSL%%include/node/openssl/pem.h
+%%BUNDLED_SSL%%include/node/openssl/pemerr.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs12.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs12err.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs7.h
+%%BUNDLED_SSL%%include/node/openssl/pkcs7err.h
+%%BUNDLED_SSL%%include/node/openssl/rand.h
+%%BUNDLED_SSL%%include/node/openssl/rand_drbg.h
+%%BUNDLED_SSL%%include/node/openssl/randerr.h
+%%BUNDLED_SSL%%include/node/openssl/rc2.h
+%%BUNDLED_SSL%%include/node/openssl/rc4.h
+%%BUNDLED_SSL%%include/node/openssl/rc5.h
+%%BUNDLED_SSL%%include/node/openssl/ripemd.h
+%%BUNDLED_SSL%%include/node/openssl/rsa.h
+%%BUNDLED_SSL%%include/node/openssl/rsaerr.h
+%%BUNDLED_SSL%%include/node/openssl/safestack.h
+%%BUNDLED_SSL%%include/node/openssl/seed.h
+%%BUNDLED_SSL%%include/node/openssl/sha.h
+%%BUNDLED_SSL%%include/node/openssl/srp.h
+%%BUNDLED_SSL%%include/node/openssl/srtp.h
+%%BUNDLED_SSL%%include/node/openssl/ssl.h
+%%BUNDLED_SSL%%include/node/openssl/ssl2.h
+%%BUNDLED_SSL%%include/node/openssl/ssl3.h
+%%BUNDLED_SSL%%include/node/openssl/sslerr.h
+%%BUNDLED_SSL%%include/node/openssl/stack.h
+%%BUNDLED_SSL%%include/node/openssl/store.h
+%%BUNDLED_SSL%%include/node/openssl/storeerr.h
+%%BUNDLED_SSL%%include/node/openssl/symhacks.h
+%%BUNDLED_SSL%%include/node/openssl/tls1.h
+%%BUNDLED_SSL%%include/node/openssl/ts.h
+%%BUNDLED_SSL%%include/node/openssl/tserr.h
+%%BUNDLED_SSL%%include/node/openssl/txt_db.h
+%%BUNDLED_SSL%%include/node/openssl/ui.h
+%%BUNDLED_SSL%%include/node/openssl/uierr.h
+%%BUNDLED_SSL%%include/node/openssl/whrlpool.h
+%%BUNDLED_SSL%%include/node/openssl/x509.h
+%%BUNDLED_SSL%%include/node/openssl/x509_vfy.h
+%%BUNDLED_SSL%%include/node/openssl/x509err.h
+%%BUNDLED_SSL%%include/node/openssl/x509v3.h
+%%BUNDLED_SSL%%include/node/openssl/x509v3err.h
+include/node/v8-internal.h
+include/node/v8-platform.h
+include/node/v8-profiler.h
+include/node/v8-testing.h
+include/node/v8-util.h
+include/node/v8-value-serializer-version.h
+include/node/v8-version.h
+include/node/v8-version-string.h
+include/node/v8-wasm-trap-handler-posix.h
+include/node/v8-wasm-trap-handler-win.h
+include/node/v8.h
+include/node/v8config.h
+%%DTRACE%%lib/dtrace/node.d
+@(,,444) man/man1/node.1.gz
+%%PORTDOCS%%%%DOCSDIR%%/gdbinit
+%%PORTDOCS%%%%DOCSDIR%%/lldb_commands.py
+share/systemtap/tapset/node.stp
diff --git a/www/trac-OhlohWidgetsMacro/Makefile b/www/trac-OhlohWidgetsMacro/Makefile
new file mode 100644
index 000000000000..765040a3be29
--- /dev/null
+++ b/www/trac-OhlohWidgetsMacro/Makefile
@@ -0,0 +1,23 @@
+# Created by: Douglas Thrift <douglas@douglasthrift.net>
+# $FreeBSD$
+
+PORTNAME= OhlohWidgetsMacro
+PORTVERSION= 0.2
+PORTREVISION= 1
+CATEGORIES= www devel python
+MASTER_SITES= CHEESESHOP
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= douglas@douglasthrift.net
+COMMENT= Trac macro to embed Ohloh widgets
+
+LICENSE= MIT
+
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pycerberus>=0.3:devel/py-pycerberus@${PY_FLAVOR} \
+ tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-OhlohWidgetsMacro/distinfo b/www/trac-OhlohWidgetsMacro/distinfo
new file mode 100644
index 000000000000..5c01e4b2750b
--- /dev/null
+++ b/www/trac-OhlohWidgetsMacro/distinfo
@@ -0,0 +1,2 @@
+SHA256 (OhlohWidgetsMacro-0.2.tar.gz) = 0d39e0503d5460f88899267210a08cd0a6d190e8c3fc6b5f6108cc111f749cc2
+SIZE (OhlohWidgetsMacro-0.2.tar.gz) = 10359
diff --git a/www/trac-OhlohWidgetsMacro/files/patch-ohloh_widgets__macro.py b/www/trac-OhlohWidgetsMacro/files/patch-ohloh_widgets__macro.py
new file mode 100644
index 000000000000..138d86a6c075
--- /dev/null
+++ b/www/trac-OhlohWidgetsMacro/files/patch-ohloh_widgets__macro.py
@@ -0,0 +1,20 @@
+--- ohloh_widgets/macro.py.orig 2010-07-04 06:54:44 UTC
++++ ohloh_widgets/macro.py
+@@ -46,7 +46,7 @@ class OhlohWidgetMacro(MacroWithValidati
+ ![[OhlohWidget(project_id, widget_name)]]
+
+ The macro gets two parameters which you can get from Ohloh's widget page
+- for your project (!http://www.ohloh.net/p/<project name>/widgets) when you
++ for your project (!https://www.ohloh.net/p/<project name>/widgets) when you
+ look at the embeddable HTML snippet:
+
+ * project_id -- a 6 digit number which identifies your project
+@@ -70,7 +70,7 @@ class OhlohWidgetMacro(MacroWithValidati
+
+ def url(self, parameters):
+ query_string = ''
+- url_template = 'http://www.ohloh.net/p/%(project_id)d/widgets/%(widget_name)s.js'
++ url_template = 'https://www.ohloh.net/p/%(project_id)d/widgets/%(widget_name)s.js'
+ widget_name = parameters.widget_name
+ if '?' in widget_name:
+ parameters['widget_name'], query_parameters = widget_name.split('?', 1)
diff --git a/www/trac-OhlohWidgetsMacro/pkg-descr b/www/trac-OhlohWidgetsMacro/pkg-descr
new file mode 100644
index 000000000000..1c502c9418c3
--- /dev/null
+++ b/www/trac-OhlohWidgetsMacro/pkg-descr
@@ -0,0 +1,3 @@
+OhlohWidgetsMacro is a plugin for Trac which embeds Ohloh widgets.
+
+WWW: http://www.schwarz.eu/opensource/projects/ohloh_widgets_macro
diff --git a/www/trac-TracGoogleAnalytics/Makefile b/www/trac-TracGoogleAnalytics/Makefile
new file mode 100644
index 000000000000..3e7fb173b0a2
--- /dev/null
+++ b/www/trac-TracGoogleAnalytics/Makefile
@@ -0,0 +1,25 @@
+# Created by: Douglas Thrift
+# $FreeBSD$
+
+PORTNAME= TracGoogleAnalytics
+PORTVERSION= 0.2.4
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= CHEESESHOP
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= douglas@douglasthrift.net
+COMMENT= Trac plugin to enable logging by Google Analytics
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= tracd:www/trac \
+ ${PYTHON_PKGNAMEPREFIX}Genshi>=0.5:textproc/py-genshi@${PY_FLAVOR}
+RUN_DEPENDS:= ${BUILD_DEPENDS}
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-TracGoogleAnalytics/distinfo b/www/trac-TracGoogleAnalytics/distinfo
new file mode 100644
index 000000000000..66d85f806630
--- /dev/null
+++ b/www/trac-TracGoogleAnalytics/distinfo
@@ -0,0 +1,2 @@
+SHA256 (TracGoogleAnalytics-0.2.4.tar.gz) = 79ee119aa187ef9d6aff4df599f91641dbc04ab816a432c5fb292e78113cc790
+SIZE (TracGoogleAnalytics-0.2.4.tar.gz) = 11292
diff --git a/www/trac-TracGoogleAnalytics/pkg-descr b/www/trac-TracGoogleAnalytics/pkg-descr
new file mode 100644
index 000000000000..2e482f1688b1
--- /dev/null
+++ b/www/trac-TracGoogleAnalytics/pkg-descr
@@ -0,0 +1,8 @@
+Previously known as Google Analytics Plugin, this plugin will enable
+your trac environment to be logged by Google Analytics.
+
+It adds the necessary javascript code to log your environment, plus, it
+also logs the downloads of regular filenames which end with a specific
+extension; these extensions are defined by you; and also external links.
+
+WWW: http://google.ufsoft.org/wiki/TracGoogleAnalytics
diff --git a/www/trac-accountmanager/Makefile b/www/trac-accountmanager/Makefile
new file mode 100644
index 000000000000..567687580483
--- /dev/null
+++ b/www/trac-accountmanager/Makefile
@@ -0,0 +1,37 @@
+# $FreeBSD$
+
+PORTNAME= accountmanager
+PORTVERSION= 0.5.${REV}
+PORTEPOCH= 1
+CATEGORIES= www devel python
+MASTER_SITES= http://trac-hacks.org/changeset/${REV}/accountmanagerplugin/trunk?old_path=/&format=zip&filename=
+PKGNAMEPREFIX= trac-
+DIST_SUBDIR= trac
+
+MAINTAINER= kuriyama@FreeBSD.org
+COMMENT= Account Manager Plugin for trac
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac
+
+FETCH_BEFORE_ARGS= -o ${DISTFILES}
+REV= 17339
+WRKSRC= ${WRKDIR}/accountmanagerplugin/trunk
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# --- trac.ini
+# [components]
+# acct_mgr.* = enabled
+#
+# [account-manager]
+# password_format = htpasswd
+# password_file = /var/trac/trac.htpasswd
+#
+# --- httpd.conf
+# SetEnv PYTHON_EGG_CACHE "/tmp/cache"
+
+.include <bsd.port.mk>
diff --git a/www/trac-accountmanager/distinfo b/www/trac-accountmanager/distinfo
new file mode 100644
index 000000000000..8c3012c0654c
--- /dev/null
+++ b/www/trac-accountmanager/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1557078449
+SHA256 (trac/accountmanager-0.5.17339.zip) = b3b56a81ca307e22662194907f1e246be00094ab867a8c6b9b16d9a9b1c7748f
+SIZE (trac/accountmanager-0.5.17339.zip) = 360825
diff --git a/www/trac-accountmanager/pkg-descr b/www/trac-accountmanager/pkg-descr
new file mode 100644
index 000000000000..e64be83c0873
--- /dev/null
+++ b/www/trac-accountmanager/pkg-descr
@@ -0,0 +1,4 @@
+Trac plugin to enable users to register new accounts or manage their
+existing account.
+
+WWW: https://trac-hacks.org/wiki/AccountManagerPlugin
diff --git a/www/trac-advancedticketworkflow/Makefile b/www/trac-advancedticketworkflow/Makefile
new file mode 100644
index 000000000000..2ee3371c0e86
--- /dev/null
+++ b/www/trac-advancedticketworkflow/Makefile
@@ -0,0 +1,22 @@
+# Created by: Martin Matuska <mm@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= advancedticketworkflow
+PORTVERSION= 0.10.3940
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= http://people.freebsd.org/~mm/trac/
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Advanced Ticket Workflow Plugin for Trac
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-advancedticketworkflow/distinfo b/www/trac-advancedticketworkflow/distinfo
new file mode 100644
index 000000000000..01337362eada
--- /dev/null
+++ b/www/trac-advancedticketworkflow/distinfo
@@ -0,0 +1,2 @@
+SHA256 (advancedticketworkflowplugin-0.10.3940.tar.gz) = 6f69eb4d698dbe36e335a85f29032911812fc1ff71932392fa588cbe9bab4618
+SIZE (advancedticketworkflowplugin-0.10.3940.tar.gz) = 3558
diff --git a/www/trac-advancedticketworkflow/pkg-descr b/www/trac-advancedticketworkflow/pkg-descr
new file mode 100644
index 000000000000..61375eb72721
--- /dev/null
+++ b/www/trac-advancedticketworkflow/pkg-descr
@@ -0,0 +1,5 @@
+AdvancedTicketWorkflowPlugin provides a number of advanced operations
+for customizable workflows that are similar to the operations provided
+in the customizeable workflow of the core system.
+
+WWW: https://trac-hacks.org/wiki/AdvancedTicketWorkflowPlugin
diff --git a/www/trac-autocomplete/Makefile b/www/trac-autocomplete/Makefile
new file mode 100644
index 000000000000..a380a5878170
--- /dev/null
+++ b/www/trac-autocomplete/Makefile
@@ -0,0 +1,23 @@
+# Created by: Eygene Ryabinkin <rea-fbsd@codelabs.ru>
+# $FreeBSD$
+
+PORTNAME= autocomplete
+PORTVERSION= 0.4.1
+PORTREVISION= 7
+CATEGORIES= www python
+MASTER_SITES= http://dist.codelabs.ru/fbsd/
+PKGNAMEPREFIX= trac-
+DISTNAME= autocompleteusersplugin-r${REL}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for autocompletion of user names in ticket fields
+
+RUN_DEPENDS= trac>=0.11:www/trac
+
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+WRKSRC= ${WRKDIR}/autocompleteusersplugin/0.11
+NO_ARCH= yes
+REL= 8451
+
+.include <bsd.port.mk>
diff --git a/www/trac-autocomplete/distinfo b/www/trac-autocomplete/distinfo
new file mode 100644
index 000000000000..d150eeac4abd
--- /dev/null
+++ b/www/trac-autocomplete/distinfo
@@ -0,0 +1,2 @@
+SHA256 (autocompleteusersplugin-r8451.zip) = 7d4f5e1547c0bae0b5e320b2d0f729ef9deebd6c52c1e82a4c4ca022ef182e8a
+SIZE (autocompleteusersplugin-r8451.zip) = 14217
diff --git a/www/trac-autocomplete/pkg-descr b/www/trac-autocomplete/pkg-descr
new file mode 100644
index 000000000000..df2f9bc5dfe9
--- /dev/null
+++ b/www/trac-autocomplete/pkg-descr
@@ -0,0 +1,4 @@
+The AutocompleteUsersPlugin allows AJAX completion of users
+for the owner and CC fields on new and existing tickets.
+
+WWW: https://trac-hacks.org/wiki/AutocompleteUsersPlugin
diff --git a/www/trac-ccselector/Makefile b/www/trac-ccselector/Makefile
new file mode 100644
index 000000000000..9560d63792d3
--- /dev/null
+++ b/www/trac-ccselector/Makefile
@@ -0,0 +1,23 @@
+# Created by: glarkin
+# $FreeBSD$
+
+PORTNAME= ccselector
+PORTVERSION= 0.0.2.4001
+PORTREVISION= 4
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Visually edit the Trac ticket CC field
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-ccselector/distinfo b/www/trac-ccselector/distinfo
new file mode 100644
index 000000000000..e48e5a9c3067
--- /dev/null
+++ b/www/trac-ccselector/distinfo
@@ -0,0 +1,2 @@
+SHA256 (ccselectorplugin-0.0.2.4001.zip) = f1f27c53b4e250557aa0acb3aab958876e9306bc9cb0ac3489ad8c4adc263c54
+SIZE (ccselectorplugin-0.0.2.4001.zip) = 7084
diff --git a/www/trac-ccselector/pkg-descr b/www/trac-ccselector/pkg-descr
new file mode 100644
index 000000000000..6888eb39d44b
--- /dev/null
+++ b/www/trac-ccselector/pkg-descr
@@ -0,0 +1,13 @@
+This plugin allows visual CC field editing.
+
+A pop-up window with bunch of checkboxes is opened, user checks
+boxes, email addresses are added and removed to CC field. There is
+a list of pre-defined addresses in cc_selector.js (these addresses
+will always be available). If you want to change this list you must
+edit cc_selector.js manually.
+
+Of course, you can always edit CC field without all this hassle -
+all addresses you entered manually will be shown, too - and can be
+removed with new, shiny checkboxes.
+
+WWW: https://trac-hacks.org/wiki/CcSelectorPlugin
diff --git a/www/trac-ccselector/pkg-message b/www/trac-ccselector/pkg-message
new file mode 100644
index 000000000000..9f16ca88d56e
--- /dev/null
+++ b/www/trac-ccselector/pkg-message
@@ -0,0 +1,13 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+cc_selector.* = enabled
+
+to your trac.ini to enable the visual CC field
+editor.
+EOM
+}
+]
diff --git a/www/trac-customfieldadmin/Makefile b/www/trac-customfieldadmin/Makefile
new file mode 100644
index 000000000000..5e069bec3102
--- /dev/null
+++ b/www/trac-customfieldadmin/Makefile
@@ -0,0 +1,30 @@
+# Created by: Greg Larkin <glarkin@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= customfieldadmin
+PORTVERSION= 0.2.2.6485
+PORTREVISION= 4
+PORTEPOCH= 1
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Web interface to administer Trac ticket custom fields
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+RUN_DEPENDS= tracd:www/trac
+
+PORTSCOUT= skipv:0.2.6485
+
+USES= python:2.7 zip
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-customfieldadmin/distinfo b/www/trac-customfieldadmin/distinfo
new file mode 100644
index 000000000000..ee734b207b91
--- /dev/null
+++ b/www/trac-customfieldadmin/distinfo
@@ -0,0 +1,2 @@
+SHA256 (customfieldadminplugin-0.2.2.6485.zip) = e434dfab30bc9c6767cdf123cdc84d53f1d1e15ee05cdff70f7a53b02bb52977
+SIZE (customfieldadminplugin-0.2.2.6485.zip) = 14727
diff --git a/www/trac-customfieldadmin/pkg-descr b/www/trac-customfieldadmin/pkg-descr
new file mode 100644
index 000000000000..b4d4ca22529e
--- /dev/null
+++ b/www/trac-customfieldadmin/pkg-descr
@@ -0,0 +1,8 @@
+This plugin is a Web Admin panel for administrating custom fields -
+adding, modifying and deleting them without editing the trac.ini file
+directly.
+
+This plugin is a cooperation between CodeResort.com and Optaros.com,
+and is made freely available under a BSD license.
+
+WWW: http://trac-hacks.org/wiki/CustomFieldAdminPlugin
diff --git a/www/trac-customfieldadmin/pkg-message b/www/trac-customfieldadmin/pkg-message
new file mode 100644
index 000000000000..23b864ba68d6
--- /dev/null
+++ b/www/trac-customfieldadmin/pkg-message
@@ -0,0 +1,13 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+customfieldadmin.* = enabled
+
+to your trac.ini to enable the ticket custom field
+administrator.
+EOM
+}
+]
diff --git a/www/trac-datefield/Makefile b/www/trac-datefield/Makefile
new file mode 100644
index 000000000000..192015cb7335
--- /dev/null
+++ b/www/trac-datefield/Makefile
@@ -0,0 +1,23 @@
+# Created by: Eygene Ryabinkin <rea-fbsd@codelabs.ru>
+# $FreeBSD$
+
+PORTNAME= datefield
+PORTVERSION= 1.0.1
+PORTREVISION= 5
+CATEGORIES= www python
+MASTER_SITES= http://dist.codelabs.ru/fbsd/
+PKGNAMEPREFIX= trac-
+DISTNAME= datefieldplugin-r${REL}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for creating date fields
+
+RUN_DEPENDS= trac>=0.11:www/trac
+
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+WRKSRC= ${WRKDIR}/datefieldplugin/0.11
+REL= 7267
+
+.include <bsd.port.mk>
diff --git a/www/trac-datefield/distinfo b/www/trac-datefield/distinfo
new file mode 100644
index 000000000000..54e2fac2d5ea
--- /dev/null
+++ b/www/trac-datefield/distinfo
@@ -0,0 +1,2 @@
+SHA256 (datefieldplugin-r7267.zip) = 565869c98580bd2b64c180b0a466d640b2b36f55a85d2f46804a6c676c1a8abe
+SIZE (datefieldplugin-r7267.zip) = 105459
diff --git a/www/trac-datefield/pkg-descr b/www/trac-datefield/pkg-descr
new file mode 100644
index 000000000000..0b809dd1506c
--- /dev/null
+++ b/www/trac-datefield/pkg-descr
@@ -0,0 +1,4 @@
+This plugin allows for validating custom fields as dates in tickets
+and adds fancy date selector to these fields.
+
+WWW: https://trac-hacks.org/wiki/DateFieldPlugin
diff --git a/www/trac-defaultcc/Makefile b/www/trac-defaultcc/Makefile
new file mode 100644
index 000000000000..323b75563f2a
--- /dev/null
+++ b/www/trac-defaultcc/Makefile
@@ -0,0 +1,27 @@
+# Created by: Eygene Ryabinkin <rea@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= defaultcc
+PORTVERSION= 0.1
+PORTREVISION= 3
+CATEGORIES= www python
+MASTER_SITES= http://dist.codelabs.ru/fbsd/trac-${PORTNAME}/
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-r${REL}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin that adds default CC value for tickets
+
+LICENSE= GPLv2
+
+RUN_DEPENDS= trac>=0.11:www/trac
+
+USES= python:2.7 zip
+
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/trunk
+REL= 10605
+
+.include <bsd.port.mk>
diff --git a/www/trac-defaultcc/distinfo b/www/trac-defaultcc/distinfo
new file mode 100644
index 000000000000..e002ffb4ffa0
--- /dev/null
+++ b/www/trac-defaultcc/distinfo
@@ -0,0 +1,2 @@
+SHA256 (defaultccplugin-r10605.zip) = 5fbc6969327f7bdbc9e0fc8e97624e7af0ee740f501cd5cd203dec8905f594cf
+SIZE (defaultccplugin-r10605.zip) = 5043
diff --git a/www/trac-defaultcc/pkg-descr b/www/trac-defaultcc/pkg-descr
new file mode 100644
index 000000000000..149df70cb3dd
--- /dev/null
+++ b/www/trac-defaultcc/pkg-descr
@@ -0,0 +1,4 @@
+This plugin automatically adds a default CC list
+when a new ticket is created, based on its initial component.
+
+WWW: https://trac-hacks.org/wiki/DefaultCcPlugin
diff --git a/www/trac-devel/Makefile b/www/trac-devel/Makefile
new file mode 100644
index 000000000000..6b7eab14608f
--- /dev/null
+++ b/www/trac-devel/Makefile
@@ -0,0 +1,61 @@
+# $FreeBSD$
+
+PORTNAME= trac
+DISTVERSION= 1.3.3
+PORTREVISION= 1
+CATEGORIES= www devel python
+MASTER_SITES= http://ftp.edgewall.com/pub/trac/ \
+ ftp://ftp.edgewall.com/pub/trac/
+PKGNAMESUFFIX= -devel
+DISTNAME= Trac-${DISTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Enhanced wiki and issue tracking system for software projects
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}Babel>=2.3.4:devel/py-babel@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Genshi>=0.7:textproc/py-genshi@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Jinja2>=2.10:devel/py-Jinja2@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}Babel>=2.3.4:devel/py-babel@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Genshi>=0.7:textproc/py-genshi@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Jinja2>=2.10:devel/py-Jinja2@${PY_FLAVOR}
+
+CONFLICTS_INSTALL= trac
+
+USES= python:2.7 shebangfix
+SHEBANG_FILES= trac/tests/functional/better_twill.py trac/tests/functional/tester.py \
+ trac/tests/functional/testenv.py trac/tests/functional/compat.py \
+ trac/tests/functional/__init__.py contrib/emailfilter.py \
+ contrib/checkwiki.py contrib/htpasswd.py
+USE_PYTHON= distutils autoplist
+USE_RC_SUBR= tracd
+SUB_LIST= PYTHON_CMD=${PYTHON_CMD}
+
+PORTEXAMPLES= *
+PORTDATA= *
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= DOCUTILS PYGMENTS TZ SVN EXAMPLES
+OPTIONS_DEFAULT= DOCUTILS PYGMENTS TZ SVN SQLITE
+OPTIONS_RADIO= DATABASE
+OPTIONS_RADIO_DATABASE= PGSQL SQLITE
+DOCUTILS_DESC= Allow additional text markup
+PYGMENTS_DESC= Use generic syntax highlighter
+TZ_DESC= Process Time Zones
+
+DOCUTILS_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}docutils>=0.14:textproc/py-docutils@${PY_FLAVOR}
+PYGMENTS_RUN_DEPENDS= ${PY_PYGMENTS}
+TZ_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytz>0:devel/py-pytz@${PY_FLAVOR}
+PGSQL_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}psycopg2>0:databases/py-psycopg2@${PY_FLAVOR}
+SQLITE_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR}
+SVN_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}subversion-lts>0:devel/py-subversion@${PY_FLAVOR}
+
+post-install-EXAMPLES-on:
+ @${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/sample-plugins
+ ${FIND} ${WRKSRC}/contrib -type f -maxdepth 1 -exec ${INSTALL_DATA} {} ${STAGEDIR}${EXAMPLESDIR}/ \;
+ (cd ${WRKSRC}/sample-plugins && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}/sample-plugins)
+
+.include <bsd.port.mk>
diff --git a/www/trac-devel/distinfo b/www/trac-devel/distinfo
new file mode 100644
index 000000000000..e2785ef48d8a
--- /dev/null
+++ b/www/trac-devel/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1544263946
+SHA256 (Trac-1.3.3.tar.gz) = 0ff793613de57851adbc2d45188d3263ac64b97ca39d8182e7a1ac226c396239
+SIZE (Trac-1.3.3.tar.gz) = 6466543
diff --git a/www/trac-devel/files/tracd.in b/www/trac-devel/files/tracd.in
new file mode 100644
index 000000000000..27756822a86a
--- /dev/null
+++ b/www/trac-devel/files/tracd.in
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# tracd startup
+#
+# $FreeBSD$
+
+# PROVIDE: tracd
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable or configure tracd:
+# tracd_enable (bool): Set to "NO" by default.
+# Set it to "YES" to enable tracd.
+# tracd_listen (str): The host name or IP address to bind tracd to.
+# By default tracd listens 0.0.0.0, i.e. all the
+# available addresses on all interfaces.
+# tracd_port (str): The port number to bind to, 80 by default.
+# tracd_pidfile (str): When daemonizing, file to which to write pid
+# if not to /var/run/tracd.pid.
+# tracd_envdir (str): Directory of the project environments. Set to
+# "/home/trac" by default.
+# tracd_env (str): The project environment name while using single
+# environment mode. The default is empty, meaning
+# multiproject mode.
+# tracd_args (str): Extra arguments passed to tracd startup
+# command. Empty by default.
+#
+
+. /etc/rc.subr
+
+name="tracd"
+rcvar=tracd_enable
+
+tracd_enable=${tracd_enable:-"NO"}
+tracd_listen=${tracd_listen:-"0.0.0.0"}
+tracd_port=${tracd_port:-"80"}
+tracd_pidfile=${tracd_pidfile:-"/var/run/tracd.pid"}
+tracd_envdir=${tracd_envdir:-"/home/trac"}
+tracd_env=${tracd_env:-""}
+tracd_args=${tracd_args:-""}
+
+load_rc_config ${name}
+
+command_args="--daemonize --hostname=${tracd_listen} --port=${tracd_port}"
+command_args="${command_args} --pidfile=${tracd_pidfile} ${tracd_args}"
+
+required_dirs=${tracd_envdir}
+pidfile=${tracd_pidfile}
+
+if [ -z "${tracd_env}" ]; then
+ _trac_env="--env-parent-dir ${tracd_envdir}"
+else
+ _trac_env="${tracd_envdir}/${tracd_env}"
+ command_args="${command_args} --single-env"
+fi
+
+command_args="%%PREFIX%%/bin/tracd ${command_args} ${_trac_env}"
+command="%%PYTHON_CMD%%"
+
+run_rc_command $1
diff --git a/www/trac-devel/pkg-descr b/www/trac-devel/pkg-descr
new file mode 100644
index 000000000000..b008fe05e687
--- /dev/null
+++ b/www/trac-devel/pkg-descr
@@ -0,0 +1,21 @@
+Trac uses a minimalistic approach to web-based software project management.
+Our mission; to help developers write great software while staying out of
+the way. Trac should impose as little as possible on a team's established
+development process and policies.
+
+All aspects of Trac have been designed with one single goal, to simplify
+tracking and communication of software issues, enhancements and monitoring
+overall progress.
+
+What is Trac?
+
+ * An integrated system for managing software projects
+ * An enhanced wiki
+ * A flexible web-based issue tracker
+ * An interface to the Subversion revision control system
+
+At the core of Trac lies an integrated wiki and issue/bug database. Using
+wiki markup, all objects managed by Trac can directly link to other
+issues/bug reports, code changesets, documentation and files.
+
+WWW: http://trac.edgewall.org/
diff --git a/www/trac-devel/pkg-message b/www/trac-devel/pkg-message
new file mode 100644
index 000000000000..8d8c58ec1add
--- /dev/null
+++ b/www/trac-devel/pkg-message
@@ -0,0 +1,17 @@
+[
+{ type: upgrade, maximum_version: 1
+ message: <<EOM
+From 0.12.x to 1.0.x
+---------------------
+You should be careful to check that the plugins you depend on have
+been ported to 1.0.x, as they most probably won't work without adaptation
+due to the numerous internal changes that occurred during 1.0.x development.
+
+See: http://trac.edgewall.org/wiki/TracDev/ApiChanges/1.0
+
+Consult the upgrade instructions at:
+
+ http://trac.edgewall.org/wiki/TracUpgrade
+EOM
+}
+]
diff --git a/www/trac-discussion/Makefile b/www/trac-discussion/Makefile
new file mode 100644
index 000000000000..4e0f712efc55
--- /dev/null
+++ b/www/trac-discussion/Makefile
@@ -0,0 +1,33 @@
+# $FreeBSD$
+
+PORTNAME= discussion
+PORTVERSION= 0.7
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Discussion forum plugin for Trac
+
+RUN_DEPENDS= tracd:www/trac \
+ trac-TracSpamFilter>=0.2.1:www/trac-spam-filter
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export http://trac-hacks.org/svn/discussionplugin/0.11/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && ${TAR} cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-discussion/distinfo b/www/trac-discussion/distinfo
new file mode 100644
index 000000000000..ed2839fda2bb
--- /dev/null
+++ b/www/trac-discussion/distinfo
@@ -0,0 +1,2 @@
+SHA256 (discussion-0.7.tar.gz) = 15022167b9435951b713ec02f15fff39171fa5b0098d4d8846e6c72f2f80f430
+SIZE (discussion-0.7.tar.gz) = 216576
diff --git a/www/trac-discussion/pkg-descr b/www/trac-discussion/pkg-descr
new file mode 100644
index 000000000000..087ff4501015
--- /dev/null
+++ b/www/trac-discussion/pkg-descr
@@ -0,0 +1,9 @@
+The DiscussionPlugin adds discussion forums to Trac. An arbitrary number
+of forums can be added, organised to forum groups. Users can create
+topics in forums and reply to them which together creates discussion
+threads. Threaded or flat view to topics and its replies is supported.
+Each forum has a list of moderators who can delete topics, replies,
+etc. Appending new forums and topics either as new replies shows up in
+timeline. Searching capability in topics and replies is supported too.
+
+WWW: https://trac-hacks.org/wiki/DiscussionPlugin
diff --git a/www/trac-downloads/Makefile b/www/trac-downloads/Makefile
new file mode 100644
index 000000000000..da4df7ff23e9
--- /dev/null
+++ b/www/trac-downloads/Makefile
@@ -0,0 +1,34 @@
+# $FreeBSD$
+
+PORTNAME= downloads
+PORTVERSION= ${TRAC_VERSION}.${PLUGIN_VERSION}.${SVN_REV}
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Trac plugin providing a downloads section
+
+RUN_DEPENDS= tracd:www/trac
+
+TRAC_VERSION= 0.12
+PLUGIN_VERSION= 0.3
+SVN_REV= 10047
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.if defined(BOOTSTRAP)
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ svn export -r ${SVN_REV} http://trac-hacks.org/svn/downloadsplugin/${TRAC_VERSION}/ ${WRKSRC}
+ ${MKDIR} ${_DISTDIR}
+ cd ${WRKDIR} && \
+ ${TAR} cfvz ${_DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-downloads/distinfo b/www/trac-downloads/distinfo
new file mode 100644
index 000000000000..93a6b4fb4166
--- /dev/null
+++ b/www/trac-downloads/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/downloadsplugin-0.12.0.3.10047.tar.gz) = 966b88e4f0b2cbd4da72e5bdec8c592670d2574771460be7780edb18c03e4e7a
+SIZE (trac/downloadsplugin-0.12.0.3.10047.tar.gz) = 18756
diff --git a/www/trac-downloads/files/patch-tracdownloads_consoleadmin.py b/www/trac-downloads/files/patch-tracdownloads_consoleadmin.py
new file mode 100644
index 000000000000..cda3e74bb169
--- /dev/null
+++ b/www/trac-downloads/files/patch-tracdownloads_consoleadmin.py
@@ -0,0 +1,12 @@
+--- tracdownloads/consoleadmin.py.orig 2011-04-07 08:36:09 UTC
++++ tracdownloads/consoleadmin.py
+@@ -122,7 +122,8 @@ class DownloadsConsoleAdmin(Component):
+ self.log.debug(download)
+
+ # Upload file to DB and file storage.
+- api.store_download(context, download, file)
++ api._add_download(context, download, file)
++
+
+ # Close input file and commit changes in DB.
+ file.close()
diff --git a/www/trac-downloads/files/patch-tracdownloads_tags.py b/www/trac-downloads/files/patch-tracdownloads_tags.py
new file mode 100644
index 000000000000..b529b88dda42
--- /dev/null
+++ b/www/trac-downloads/files/patch-tracdownloads_tags.py
@@ -0,0 +1,14 @@
+--- tracdownloads/tags.py.orig 2010-10-12 12:42:10 UTC
++++ tracdownloads/tags.py
+@@ -1,11 +1,5 @@
+ # -*- coding: utf-8 -*-
+
+-# Deprecated as for Python 2.6.
+-try:
+- import sets
+-except:
+- pass
+-
+ # Trac imports.
+ from trac.core import *
+ from trac.resource import Resource
diff --git a/www/trac-downloads/pkg-descr b/www/trac-downloads/pkg-descr
new file mode 100644
index 000000000000..a3de563c6392
--- /dev/null
+++ b/www/trac-downloads/pkg-descr
@@ -0,0 +1,11 @@
+This plugin provides downloads section which may contain releases or
+other files. It is administrated via WebAdminPlugin and there is an
+interface to the trac-admin tool that may help during automatic server
+maintenance. The Downloads section of Trac displays a table with
+information about the uploaded files such as description, component,
+version, size, architecture, type and optionally assigned tags which the
+download is related to. It also collects information about number of
+downloads which can be displayed on wiki page together with direct links
+to the specified download.
+
+WWW: https://trac-hacks.org/wiki/DownloadsPlugin
diff --git a/www/trac-email2trac-postfix/Makefile b/www/trac-email2trac-postfix/Makefile
new file mode 100644
index 000000000000..048ac6f07b32
--- /dev/null
+++ b/www/trac-email2trac-postfix/Makefile
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+PKGNAMESUFFIX= -postfix
+
+CONFLICTS_INSTALL= trac-email2trac-[0-9]*
+
+OPTIONS_SLAVE= POSTFIX
+
+MASTERDIR= ${.CURDIR}/../trac-email2trac
+
+.include "${MASTERDIR}/Makefile"
diff --git a/www/trac-email2trac/Makefile b/www/trac-email2trac/Makefile
new file mode 100644
index 000000000000..5d42e67adc30
--- /dev/null
+++ b/www/trac-email2trac/Makefile
@@ -0,0 +1,53 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= email2trac
+PORTVERSION= 2.12.2
+CATEGORIES= www devel python
+MASTER_SITES= ftp://ftp.sara.nl/pub/outgoing/
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Convert email to trac tickets
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= tracd:www/trac
+
+CONFLICTS_INSTALL?= trac-email2trac-postfix-[0-9]*
+
+OPTIONS_DEFINE= POSTFIX DOCS
+POSTFIX_DESC= Configure suid script for postfix
+
+TRACUSER?= ${WWWOWN}
+
+GNU_CONFIGURE= yes
+CONFIGURE_ARGS= --with-trac-user=${TRACUSER} --with-mta-user=${MTAUSER}
+USES= python:2.7
+
+PORTDOCS= AUTHORS ChangeLog INSTALL README
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MPOSTFIX}
+MTAUSER?= nobody
+.else
+MTAUSER?= mailnull
+.endif
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/delete_spam.py ${STAGEDIR}${PREFIX}/bin/delete_spam
+ ${INSTALL_SCRIPT} ${WRKSRC}/email2trac.py ${STAGEDIR}${PREFIX}/bin/email2trac
+ ${INSTALL_PROGRAM} \
+ ${WRKSRC}/run_email2trac ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_DATA} ${WRKSRC}/email2trac.conf \
+ ${STAGEDIR}${PREFIX}/etc/email2trac.conf.sample
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for file in ${PORTDOCS}
+ ${INSTALL_DATA} ${WRKSRC}/${file} ${STAGEDIR}${DOCSDIR}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/www/trac-email2trac/distinfo b/www/trac-email2trac/distinfo
new file mode 100644
index 000000000000..0d470ce7cb99
--- /dev/null
+++ b/www/trac-email2trac/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1525095454
+SHA256 (email2trac-2.12.2.tar.gz) = d2540cdfdb337b10c137a4dd069856e13c5831efa0ced47e905f6901827212d6
+SIZE (email2trac-2.12.2.tar.gz) = 102415
diff --git a/www/trac-email2trac/pkg-descr b/www/trac-email2trac/pkg-descr
new file mode 100644
index 000000000000..4eec701c05cc
--- /dev/null
+++ b/www/trac-email2trac/pkg-descr
@@ -0,0 +1,12 @@
+This is a release of the SARA package email2trac that contains utilities that
+we use to convert emails to trac tickets. The initial setup was made by Daniel
+Lundin from Edgewall Software. SARA has extend the initial setup, with the
+following extensions:
+
+* HTML messages
+* Attachments
+* Use commandline options
+* Use config file to change the behaviour of the email2trac.py program
+* unicode support for special characters in the headers of an email message
+
+WWW: https://oss.trac.surfsara.nl/email2trac
diff --git a/www/trac-email2trac/pkg-plist b/www/trac-email2trac/pkg-plist
new file mode 100644
index 000000000000..bebe28228b82
--- /dev/null
+++ b/www/trac-email2trac/pkg-plist
@@ -0,0 +1,4 @@
+bin/delete_spam
+bin/email2trac
+@(,,4111) bin/run_email2trac
+@sample etc/email2trac.conf.sample
diff --git a/www/trac-estimator/Makefile b/www/trac-estimator/Makefile
new file mode 100644
index 000000000000..e2fb9a675eb3
--- /dev/null
+++ b/www/trac-estimator/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+PORTNAME= estimator
+PORTVERSION= 0.1.1
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Produce detailed range-based estimations for Trac tickets
+
+LICENSE= MIT
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-estimator/distinfo b/www/trac-estimator/distinfo
new file mode 100644
index 000000000000..b8675d0618aa
--- /dev/null
+++ b/www/trac-estimator/distinfo
@@ -0,0 +1,2 @@
+SHA256 (estimatorplugin-0.1.1.tar.gz) = bc6d16af2da264b91c1445d5fc8732f0fa77913a70f8c94e859ff2e402f14155
+SIZE (estimatorplugin-0.1.1.tar.gz) = 32631
diff --git a/www/trac-estimator/pkg-descr b/www/trac-estimator/pkg-descr
new file mode 100644
index 000000000000..2dde91eb6b1d
--- /dev/null
+++ b/www/trac-estimator/pkg-descr
@@ -0,0 +1,5 @@
+This Trac plugin implements a page for creating time estimates. The
+estimates will be attached to whatever tickets are specified in the
+tickets box.
+
+WWW: https://trac-hacks.org/wiki/EstimatorPlugin
diff --git a/www/trac-estimator/pkg-message b/www/trac-estimator/pkg-message
new file mode 100644
index 000000000000..279f1eef0181
--- /dev/null
+++ b/www/trac-estimator/pkg-message
@@ -0,0 +1,21 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+estimatorplugin.api.estimatorsetupparticipant = enabled
+estimatorplugin.macro_provider.estimatormacroprovider = enabled
+estimatorplugin.webui.estimationspage = enabled
+
+to your trac.ini to enable the plugin.
+
+Next, upgrade your database with the command:
+
+ trac-admin /full/path/to/YourProjectName upgrade
+
+Finally, restart your web server, browse to your Trac URL
+and click on the "Estimate" button to create an estimate.
+EOM
+}
+]
diff --git a/www/trac-fivestarvote/Makefile b/www/trac-fivestarvote/Makefile
new file mode 100644
index 000000000000..8d929a227c24
--- /dev/null
+++ b/www/trac-fivestarvote/Makefile
@@ -0,0 +1,34 @@
+# $FreeBSD$
+
+PORTNAME= fivestarvote
+PORTVERSION= 0.1
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Five star plugin for voting on Trac resources
+
+RUN_DEPENDS= tracd:www/trac
+
+LICENSE= BSD
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export http://trac-hacks.org/svn/fivestarvoteplugin/0.11/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-fivestarvote/distinfo b/www/trac-fivestarvote/distinfo
new file mode 100644
index 000000000000..dd517802c657
--- /dev/null
+++ b/www/trac-fivestarvote/distinfo
@@ -0,0 +1,2 @@
+SHA256 (fivestarvote-0.1.tar.gz) = a648d657b7af82e116244a943d79bb6604ed0212a3e6daae9e943076eac064ee
+SIZE (fivestarvote-0.1.tar.gz) = 19456
diff --git a/www/trac-fivestarvote/pkg-descr b/www/trac-fivestarvote/pkg-descr
new file mode 100644
index 000000000000..a438d5a2b770
--- /dev/null
+++ b/www/trac-fivestarvote/pkg-descr
@@ -0,0 +1,6 @@
+This plugin is a modified version of the VotePlugin (www/trac-vote).
+
+Instead of having up and down arrows, this plugin uses a 5-star approach
+to rate resources.
+
+WWW: https://trac-hacks.org/wiki/FiveStarVotePlugin
diff --git a/www/trac-fullblog/Makefile b/www/trac-fullblog/Makefile
new file mode 100644
index 000000000000..7b7b1ba7bff2
--- /dev/null
+++ b/www/trac-fullblog/Makefile
@@ -0,0 +1,33 @@
+# $FreeBSD$
+
+PORTNAME= fullblog
+PORTVERSION= 0.1.1
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin that provides a project Blog
+
+LICENSE= BSD
+
+RUN_DEPENDS= htmldoc:textproc/htmldoc \
+ tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.if defined(BOOTSTRAP)
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ svn export http://trac-hacks.org/svn/fullblogplugin/0.11/ ${WRKSRC}
+ ${MKDIR} ${_DISTDIR}
+ cd ${WRKDIR} && \
+ ${TAR} cfvz ${_DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-fullblog/distinfo b/www/trac-fullblog/distinfo
new file mode 100644
index 000000000000..c74ece692b80
--- /dev/null
+++ b/www/trac-fullblog/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/fullblogplugin-0.1.1.tar.gz) = 9d6480a0b4a82c92af81ccd20af843721c46c1cc42b309a5bc2ccc45cd693288
+SIZE (trac/fullblogplugin-0.1.1.tar.gz) = 34052
diff --git a/www/trac-fullblog/pkg-descr b/www/trac-fullblog/pkg-descr
new file mode 100644
index 000000000000..399a0ec33989
--- /dev/null
+++ b/www/trac-fullblog/pkg-descr
@@ -0,0 +1,5 @@
+This plugin provides a project Blog, but unlike TracBlogPlugin and
+SimpleBlogPlugin it does not use Wiki pages to store the content.
+It has no dependencies on other plugins.
+
+WWW: https://trac-hacks.org/wiki/FullBlogPlugin
diff --git a/www/trac-fullblognotification/Makefile b/www/trac-fullblognotification/Makefile
new file mode 100644
index 000000000000..07964434ab7d
--- /dev/null
+++ b/www/trac-fullblognotification/Makefile
@@ -0,0 +1,31 @@
+# $FreeBSD$
+
+PORTNAME= fullblognotification
+PORTVERSION= 0.2.1
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin that provides a project Blog
+
+RUN_DEPENDS= trac-fullblog>=0.1.1:www/trac-fullblog
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.if defined(BOOTSTRAP)
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ svn export http://trac-hacks.org/svn/fullblognotificationplugin/0.12/ \
+ ${WRKSRC}
+ ${MKDIR} ${_DISTDIR}
+ cd ${WRKDIR} && \
+ tar cfvz ${_DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-fullblognotification/distinfo b/www/trac-fullblognotification/distinfo
new file mode 100644
index 000000000000..e8242e76e2dd
--- /dev/null
+++ b/www/trac-fullblognotification/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/fullblognotificationplugin-0.2.1.tar.gz) = 3c58f59cdb05bdaea6de17af710a90f95915b1bad3880468a87f2bc2edf5eba3
+SIZE (trac/fullblognotificationplugin-0.2.1.tar.gz) = 4605
diff --git a/www/trac-fullblognotification/pkg-descr b/www/trac-fullblognotification/pkg-descr
new file mode 100644
index 000000000000..c2cfe265ebaa
--- /dev/null
+++ b/www/trac-fullblognotification/pkg-descr
@@ -0,0 +1,18 @@
+This plugin uses the blog change interface in FullBlogPlugin to send out
+email notifications for:
+ * new posts
+ * updated posts
+ * comment added
+ * deleted posts
+
+Email notifications are sent to the user who made the change.
+Notifications can also be sent to other users or a distribution list by
+specifying the smtp_always_cc option.
+
+The emails are sent in plain text using a template that was modeled
+after Trac's ticket_notify_email template.
+
+If you are using the AnnouncerPlugin, you should use its FullBlogPlugin
+rather than the FullBlogNotificationPlugin.
+
+WWW: https://trac-hacks.org/wiki/FullBlogNotificationPlugin
diff --git a/www/trac-graphviz/Makefile b/www/trac-graphviz/Makefile
new file mode 100644
index 000000000000..bb9edda7aaf7
--- /dev/null
+++ b/www/trac-graphviz/Makefile
@@ -0,0 +1,33 @@
+# $FreeBSD$
+
+PORTNAME= ${PYDISTUTILS_PKGNAME:S;^Trac;;S;Plugin$;;:tl}
+PORTVERSION= 0.7.4
+PORTREVISION= 9
+CATEGORIES= www devel graphics python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Graphviz plugin for Trac's wiki
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= urwfonts>0:x11-fonts/urwfonts \
+ dot:graphics/graphviz \
+ tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= autoplist distutils
+PYDISTUTILS_PKGNAME= graphviz
+NO_ARCH= yes
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
+ -e 's|%%PREFIX%%|${PREFIX}|' \
+ -e 's|%%OSMAJOR%%|${OSREL:C/\..*$//}|' \
+ ${WRKSRC}/graphviz/graphviz.py
+
+.include <bsd.port.mk>
diff --git a/www/trac-graphviz/distinfo b/www/trac-graphviz/distinfo
new file mode 100644
index 000000000000..a297bc890187
--- /dev/null
+++ b/www/trac-graphviz/distinfo
@@ -0,0 +1,2 @@
+SHA256 (graphvizplugin-0.7.4.tar.gz) = 46de5e8de432366cc21b5683718894f1d6b4db10a5440559ad1dc2b94ac188e1
+SIZE (graphvizplugin-0.7.4.tar.gz) = 17881
diff --git a/www/trac-graphviz/files/patch-graphviz_graphviz.py b/www/trac-graphviz/files/patch-graphviz_graphviz.py
new file mode 100644
index 000000000000..0600bf20bc3e
--- /dev/null
+++ b/www/trac-graphviz/files/patch-graphviz_graphviz.py
@@ -0,0 +1,36 @@
+--- graphviz/graphviz.py.orig 2008-10-13 16:24:45 UTC
++++ graphviz/graphviz.py
+@@ -16,11 +16,11 @@ __docformat__ = 'restructuredtext'
+ __version__ = '0.7.2'
+
+
++import hashlib
+ import inspect
+ import locale
+ import os
+ import re
+-import sha
+ import subprocess
+ import sys
+
+@@ -59,10 +59,7 @@ class Graphviz(Component):
+ 'c:\\Program Files\\ATT\\Graphviz\\bin',
+ ],
+
+- 'freebsd6': ['/usr/local/bin',
+- ],
+-
+- 'freebsd5': ['/usr/local/bin',
++ 'freebsd%%OSMAJOR%%': ['%%LOCALBASE%%/bin',
+ ],
+
+ 'darwin': ['/opt/local/bin',
+@@ -312,7 +309,7 @@ class Graphviz(Component):
+ encoded_cmd = (processor + unicode(self.processor_options)) \
+ .encode(self.encoding)
+ encoded_content = content.encode(self.encoding)
+- sha_key = sha.new(encoded_cmd + encoded_content).hexdigest()
++ sha_key = hashlib.sha1(encoded_cmd + encoded_content).hexdigest()
+ img_name = '%s.%s.%s' % (sha_key, processor, out_format)
+ # cache: hash.<dot>.<png>
+ img_path = os.path.join(self.cache_dir, img_name)
diff --git a/www/trac-graphviz/pkg-descr b/www/trac-graphviz/pkg-descr
new file mode 100644
index 000000000000..c9a4cde28478
--- /dev/null
+++ b/www/trac-graphviz/pkg-descr
@@ -0,0 +1,4 @@
+The GraphvizPlugin allows for the inline creation of diagrams for abstract
+graphs and networks using the Graphviz programs.
+
+WWW: http://trac-hacks.org/wiki/GraphvizPlugin
diff --git a/www/trac-iniadmin/Makefile b/www/trac-iniadmin/Makefile
new file mode 100644
index 000000000000..e576b28b537e
--- /dev/null
+++ b/www/trac-iniadmin/Makefile
@@ -0,0 +1,24 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= iniadmin
+PORTVERSION= 0.2.3915
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= http://people.freebsd.org/~mm/trac/
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Edit all trac.ini option via the WebAdminPlugin
+
+LICENSE= BSD
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-iniadmin/distinfo b/www/trac-iniadmin/distinfo
new file mode 100644
index 000000000000..087b5a9878ef
--- /dev/null
+++ b/www/trac-iniadmin/distinfo
@@ -0,0 +1,2 @@
+SHA256 (iniadminplugin-0.2.3915.tar.gz) = 43ebd22de58f79922b84aef87d4727baa04c6e56830385565484013313777389
+SIZE (iniadminplugin-0.2.3915.tar.gz) = 2735
diff --git a/www/trac-iniadmin/pkg-descr b/www/trac-iniadmin/pkg-descr
new file mode 100644
index 000000000000..702563423e46
--- /dev/null
+++ b/www/trac-iniadmin/pkg-descr
@@ -0,0 +1,3 @@
+Edit all trac.ini options via the WebAdminPlugin
+
+WWW: https://trac-hacks.org/wiki/IniAdminPlugin
diff --git a/www/trac-keywords/Makefile b/www/trac-keywords/Makefile
new file mode 100644
index 000000000000..ff6f01d68104
--- /dev/null
+++ b/www/trac-keywords/Makefile
@@ -0,0 +1,31 @@
+# Created by: Eygene Ryabinkin <rea-fbsd@codelabs.ru>
+# $FreeBSD$
+
+PORTNAME= keywords
+PORTVERSION= 0.2
+PORTREVISION= 4
+CATEGORIES= www python
+MASTER_SITES= http://dist.codelabs.ru/fbsd/
+PKGNAMEPREFIX= trac-
+DISTNAME= trackeywordsplugin-r${REL}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for using pre-configured keywords
+
+LICENSE= BSD3CLAUSE
+
+RUN_DEPENDS= trac>=0.11:www/trac
+
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+WRKSRC= ${WRKDIR}/trackeywordsplugin/0.11
+NO_ARCH= yes
+REL= 7273
+
+post-extract:
+# Fix misplaced Genshi template: https://trac-hacks.org/ticket/6104
+ @${MV} ${WRKDIR}/trackeywordsplugin/0.10/trackeywords/templates/keywords.html ${WRKSRC}/trackeywords/templates/
+# Seems like web_ui.py was misplaced too.
+ @${MV} ${WRKDIR}/trackeywordsplugin/0.10/trackeywords/web_ui.py ${WRKSRC}/trackeywords/
+
+.include <bsd.port.mk>
diff --git a/www/trac-keywords/distinfo b/www/trac-keywords/distinfo
new file mode 100644
index 000000000000..8bfa3a9b928b
--- /dev/null
+++ b/www/trac-keywords/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trackeywordsplugin-r7273.zip) = 64f4e88a96039cbcc35ae835d87ed2a9a1aa28e97281caa443092c52ad18f572
+SIZE (trackeywordsplugin-r7273.zip) = 9528
diff --git a/www/trac-keywords/files/patch-fix-javascript b/www/trac-keywords/files/patch-fix-javascript
new file mode 100644
index 000000000000..cb0e6270b48c
--- /dev/null
+++ b/www/trac-keywords/files/patch-fix-javascript
@@ -0,0 +1,22 @@
+--- trackeywords/templates/keywords.cs.orig 2007-09-11 15:09:40 UTC
++++ trackeywords/templates/keywords.cs
+@@ -9,7 +9,7 @@ function initTags() {
+ var el = document.getElementById('keywords');
+ var currentTags = el.value.split(/\s+/);
+ for(i in currentTags) {
+- link = document.getElementById('add_' + currentTags[i]);
++ var link = document.getElementById('add_' + currentTags[i]);
+ if(link)
+ link.className = "sel";
+ }
+--- trackeywords/templates/keywords.html.orig 2009-09-09 13:18:34 UTC
++++ trackeywords/templates/keywords.html
+@@ -14,7 +14,7 @@ function initTags() {
+ var currentTags = el.value.split(/\s+/);
+
+ for(i in currentTags) {
+- link = document.getElementById('add_' + currentTags[i]);
++ var link = document.getElementById('add_' + currentTags[i]);
+ if(link)
+ link.className = "sel";
+ }
diff --git a/www/trac-keywords/files/patch-trackeywords_web__ui.py b/www/trac-keywords/files/patch-trackeywords_web__ui.py
new file mode 100644
index 000000000000..5ad5c2e587c3
--- /dev/null
+++ b/www/trac-keywords/files/patch-trackeywords_web__ui.py
@@ -0,0 +1,12 @@
+--- trackeywords/web_ui.py.orig 2009-09-09 13:18:34 UTC
++++ trackeywords/web_ui.py
+@@ -80,7 +80,8 @@ class TracKeywordsComponent(core.Compone
+
+ # changed to Genshi signature
+ def post_process_request(self, req, template, data, content_type):
+- data['keywords'] = self._get_keywords()
++ if data is not None:
++ data['keywords'] = self._get_keywords()
+ return (template, data, content_type)
+
+ ### ITemplateProvider methods
diff --git a/www/trac-keywords/pkg-descr b/www/trac-keywords/pkg-descr
new file mode 100644
index 000000000000..c7a3e9d9d598
--- /dev/null
+++ b/www/trac-keywords/pkg-descr
@@ -0,0 +1,4 @@
+This plug-in allows you to add entries to the Keywords entry field
+from a configured list of keywords by clicking on them.
+
+WWW: https://trac-hacks.org/wiki/TracKeywordsPlugin
diff --git a/www/trac-keywordsecretticket/Makefile b/www/trac-keywordsecretticket/Makefile
new file mode 100644
index 000000000000..ebd67236d779
--- /dev/null
+++ b/www/trac-keywordsecretticket/Makefile
@@ -0,0 +1,26 @@
+# Created by: Hung-Yi Chen <gaod@hychen.org>
+# $FreeBSD$
+
+PORTNAME= keywordsecretticket
+PORTVERSION= 1.0.2
+CATEGORIES= www devel python
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= gaod@hychen.org
+COMMENT= Ticket security policy based on keyword for Trac
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7
+
+USE_GITHUB= yes
+GH_ACCOUNT= trac-hacks
+GH_PROJECT= trac-keyword-secret-ticket-plugin
+
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-keywordsecretticket/distinfo b/www/trac-keywordsecretticket/distinfo
new file mode 100644
index 000000000000..51710f9c3257
--- /dev/null
+++ b/www/trac-keywordsecretticket/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1541880058
+SHA256 (trac-hacks-trac-keyword-secret-ticket-plugin-1.0.2_GH0.tar.gz) = 60a364b359f5d7b856d69106a1810e958db7947bde6a1506272497c752c37fdd
+SIZE (trac-hacks-trac-keyword-secret-ticket-plugin-1.0.2_GH0.tar.gz) = 2832
diff --git a/www/trac-keywordsecretticket/pkg-descr b/www/trac-keywordsecretticket/pkg-descr
new file mode 100644
index 000000000000..8d61773438ed
--- /dev/null
+++ b/www/trac-keywordsecretticket/pkg-descr
@@ -0,0 +1,3 @@
+Adds ticket security policy based on keyword.
+
+WWW: https://github.com/KKBOX/trac-keyword-secret-ticket-plugin
diff --git a/www/trac-ldap/Makefile b/www/trac-ldap/Makefile
new file mode 100644
index 000000000000..2272155f7600
--- /dev/null
+++ b/www/trac-ldap/Makefile
@@ -0,0 +1,42 @@
+# $FreeBSD$
+
+PORTNAME= ldap
+PORTVERSION= 0.7.0.${SVN_REVISION}
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/matthew
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Trac plugin to use LDAP to store permissions
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac \
+ trac-accountmanager>0:www/trac-accountmanager
+
+NO_ARCH= yes
+PORTSCOUT= ignore:1
+SVN_REVISION= 15146
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export --non-interactive \
+ --trust-server-cert-failures=unknown-ca \
+ --revision ${SVN_REVISION} \
+ https://trac-hacks.org/svn/${PORTNAME}plugin/0.12/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-ldap/distinfo b/www/trac-ldap/distinfo
new file mode 100644
index 000000000000..4e0b8be2c9b1
--- /dev/null
+++ b/www/trac-ldap/distinfo
@@ -0,0 +1,2 @@
+SHA256 (ldapplugin-0.7.0.15146.tar.gz) = 3d7fcd4e8bca7155482982b0c521eb26b0101756d9bffd301b813ffa757a9895
+SIZE (ldapplugin-0.7.0.15146.tar.gz) = 40960
diff --git a/www/trac-ldap/pkg-descr b/www/trac-ldap/pkg-descr
new file mode 100644
index 000000000000..ef5e8325fe25
--- /dev/null
+++ b/www/trac-ldap/pkg-descr
@@ -0,0 +1,9 @@
+LDAP extensions to grant group permissions
+
+This extension enables the use of existing LDAP groups to grant
+permissions rather than defining permissions for every single user on
+the system. Also permits storage of permissions (both users and
+groups permissions) in the LDAP directory itself rather than in the
+database backend.
+
+WWW: https://trac-hacks.org/wiki/LdapPlugin
diff --git a/www/trac-ldapauthstore/Makefile b/www/trac-ldapauthstore/Makefile
new file mode 100644
index 000000000000..120ec49d25ca
--- /dev/null
+++ b/www/trac-ldapauthstore/Makefile
@@ -0,0 +1,44 @@
+# $FreeBSD$
+
+PORTNAME= ldapauthstore
+PORTVERSION= 0.3.2.${SVN_REVISION}
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/matthew
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Trac AccountManager plugin using LDAP authentication store
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac \
+ trac-accountmanager>0:www/trac-accountmanager \
+ trac-ldap>0:www/trac-ldap \
+ ${PYTHON_PKGNAMEPREFIX}ldap>0:net/py-ldap@${PY_FLAVOR}
+
+NO_ARCH= yes
+PORTSCOUT= ignore:1
+SVN_REVISION= 15146
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export --non-interactive \
+ --trust-server-cert-failures=unknown-ca \
+ --revision ${SVN_REVISION} \
+ https://trac-hacks.org/svn/${PORTNAME}plugin/trunk/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-ldapauthstore/distinfo b/www/trac-ldapauthstore/distinfo
new file mode 100644
index 000000000000..eb1d63e430cc
--- /dev/null
+++ b/www/trac-ldapauthstore/distinfo
@@ -0,0 +1,2 @@
+SHA256 (ldapauthstoreplugin-0.3.2.15146.tar.gz) = 380797ff3a965373e36d274dc2b85549d5d9abd5d9eac3278f8b2160a69d52f6
+SIZE (ldapauthstoreplugin-0.3.2.15146.tar.gz) = 25600
diff --git a/www/trac-ldapauthstore/pkg-descr b/www/trac-ldapauthstore/pkg-descr
new file mode 100644
index 000000000000..6225d598c76e
--- /dev/null
+++ b/www/trac-ldapauthstore/pkg-descr
@@ -0,0 +1,9 @@
+This plugin is a password store for the AccountManagerPlugin that
+provides authentication and group membership from an LDAP
+service. Users are authenticated by performing an LDAP bind against a
+directory using their credentials. The plugin will also pull the email
+address and username from the directory and populate the
+session_attribute table.
+
+WWW: https://trac-hacks.org/wiki/LdapAuthStorePlugin
+
diff --git a/www/trac-math/Makefile b/www/trac-math/Makefile
new file mode 100644
index 000000000000..d9b3230a9a3b
--- /dev/null
+++ b/www/trac-math/Makefile
@@ -0,0 +1,35 @@
+# $FreeBSD$
+
+PORTNAME= math
+PORTVERSION= 0.1
+PORTREVISION= 8
+CATEGORIES= www math python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Support for LaTeX math formulas in wiki pages
+
+RUN_DEPENDS= tracd:www/trac
+
+USE_TEX= latex
+SUB_FILES= pkg-message
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export http://trac-hacks.org/svn/tracmathplugin/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-math/distinfo b/www/trac-math/distinfo
new file mode 100644
index 000000000000..8b57fe8b56f0
--- /dev/null
+++ b/www/trac-math/distinfo
@@ -0,0 +1,2 @@
+SHA256 (math-0.1.tar.gz) = 6690f91e1905b6a3f213edb2a69e9268695a7acc1b3df921e963d453d9b2b2db
+SIZE (math-0.1.tar.gz) = 12800
diff --git a/www/trac-math/files/patch-tracmath_tracmath.py b/www/trac-math/files/patch-tracmath_tracmath.py
new file mode 100644
index 000000000000..f0b37da150da
--- /dev/null
+++ b/www/trac-math/files/patch-tracmath_tracmath.py
@@ -0,0 +1,21 @@
+--- tracmath/tracmath.py.orig 2008-04-04 08:58:46 UTC
++++ tracmath/tracmath.py
+@@ -4,8 +4,8 @@ This has currently been tested only on t
+ """
+
+ import codecs
++import hashlib
+ import re
+-import sha
+ from cStringIO import StringIO
+ import os
+ import sys
+@@ -142,7 +142,7 @@ class TracMathPlugin(Component):
+ if m:
+ label = m.group(1)
+
+- key = sha.new(content.encode('utf-8')).hexdigest()
++ key = hashlib.sha1(content.encode('utf-8')).hexdigest()
+
+ imgname = key + '.png'
+ imgpath = os.path.join(self.cacheDirectory, imgname)
diff --git a/www/trac-math/files/pkg-message.in b/www/trac-math/files/pkg-message.in
new file mode 100644
index 000000000000..bb0738e10587
--- /dev/null
+++ b/www/trac-math/files/pkg-message.in
@@ -0,0 +1,17 @@
+[
+{ type: install
+ message: <<EOM
+To use the plugin, you must add at least the following to your trac.ini.
+
+ [tracmath]
+ latex_cmd = %%LOCALBASE%%/bin/latex
+ dvipng_cmd = %%LOCALBASE%%/bin/dvipng
+
+You may also wish to set:
+
+ cache_dir = <cache directory>
+ max_png = <max number of pngs in cache - defaults to 500>
+ use_dollars = enabled
+EOM
+}
+]
diff --git a/www/trac-math/pkg-descr b/www/trac-math/pkg-descr
new file mode 100644
index 000000000000..eb49bb16f000
--- /dev/null
+++ b/www/trac-math/pkg-descr
@@ -0,0 +1,4 @@
+Allow embedded equations in wiki pages. Basically a port of mt-math to
+trac.
+
+WWW: https://trac-hacks.org/wiki/TracMathPlugin
diff --git a/www/trac-mercurial/Makefile b/www/trac-mercurial/Makefile
new file mode 100644
index 000000000000..d14af09a6463
--- /dev/null
+++ b/www/trac-mercurial/Makefile
@@ -0,0 +1,25 @@
+# $FreeBSD$
+
+PORTNAME= mercurial
+PORTVERSION= 1.0.0.3
+PORTREVISION= 2
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/rm
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin to use Mercurial instead of Subversion in Trac
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= ${PY_MERCURIAL} \
+ tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-mercurial/distinfo b/www/trac-mercurial/distinfo
new file mode 100644
index 000000000000..17567214e9d4
--- /dev/null
+++ b/www/trac-mercurial/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/mercurialplugin-1.0.0.3.tar.gz) = 733f0e30c5b3e9521f72b755f471b8b8f9ae27f5643ab7ffb01d6ca4bcda2bc9
+SIZE (trac/mercurialplugin-1.0.0.3.tar.gz) = 26597
diff --git a/www/trac-mercurial/pkg-descr b/www/trac-mercurial/pkg-descr
new file mode 100644
index 000000000000..00fdabf14e4e
--- /dev/null
+++ b/www/trac-mercurial/pkg-descr
@@ -0,0 +1,4 @@
+This a plugin for Trac which enables Mercurial to be used instead of Subversion
+as the VersioningSystemBackend for Trac.
+
+WWW: http://trac.edgewall.org/wiki/TracMercurial
diff --git a/www/trac-navadd/Makefile b/www/trac-navadd/Makefile
new file mode 100644
index 000000000000..627a78815a59
--- /dev/null
+++ b/www/trac-navadd/Makefile
@@ -0,0 +1,23 @@
+# $FreeBSD$
+
+PORTNAME= navadd
+PORTVERSION= 0.1
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for adding navigation items into Trac navigation bars
+
+LICENSE= BSD
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin
+
+.include <bsd.port.mk>
diff --git a/www/trac-navadd/distinfo b/www/trac-navadd/distinfo
new file mode 100644
index 000000000000..d5c0b8c185bf
--- /dev/null
+++ b/www/trac-navadd/distinfo
@@ -0,0 +1,2 @@
+SHA256 (navaddplugin-0.1.tar.gz) = be851c37c704e1c031e8043bf9845a259c5c9f3b2e1828be7dcbd5b9f8b0d4fa
+SIZE (navaddplugin-0.1.tar.gz) = 981
diff --git a/www/trac-navadd/pkg-descr b/www/trac-navadd/pkg-descr
new file mode 100644
index 000000000000..9c38a36e61a1
--- /dev/null
+++ b/www/trac-navadd/pkg-descr
@@ -0,0 +1,9 @@
+This plugin allows you to add custom items ("buttons") to both the main
+and the meta navigation bar. Item name, title and URL can be specified
+in trac.ini, as well as an optional permission the user is required to
+have to see the item.
+
+The plugin was inspired by and derived from NavMoverPlugin. In contrast
+to NavMoverPlugin this plugin does not hide navigation bars.
+
+WWW: https://trac-hacks.org/wiki/NavAddPlugin
diff --git a/www/trac-permredirect/Makefile b/www/trac-permredirect/Makefile
new file mode 100644
index 000000000000..091aae99a68b
--- /dev/null
+++ b/www/trac-permredirect/Makefile
@@ -0,0 +1,27 @@
+# Created by: Grzegorz Blach <gblach@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= permredirect
+PORTVERSION= 3.0
+PORTREVISION= 1
+CATEGORIES= www devel python
+MASTER_SITES= http://trac-hacks.org/changeset/${REV}/${PORTNAME}plugin/tags/${PORTVERSION}?old_path=${PORTNAME}plugin&format=zip&filename= \
+ LOCAL/gblach/
+PKGNAMEPREFIX= trac-
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Redirect users to the login screen on PermissionError
+
+LICENSE= BSD
+
+RUN_DEPENDS= tracd:www/trac
+
+FETCH_BEFORE_ARGS= -o ${DISTFILES}
+REV= 13353
+USES= python:2.7 zip:infozip
+USE_PYTHON= distutils autoplist
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/tags/${PORTVERSION}
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-permredirect/distinfo b/www/trac-permredirect/distinfo
new file mode 100644
index 000000000000..c685a3fa4664
--- /dev/null
+++ b/www/trac-permredirect/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/permredirect-3.0.zip) = cdad7f4efefeda90a54cb079ee0ef73eb157227074a638c211481b8b7b89721f
+SIZE (trac/permredirect-3.0.zip) = 2095
diff --git a/www/trac-permredirect/pkg-descr b/www/trac-permredirect/pkg-descr
new file mode 100644
index 000000000000..050b9c799e00
--- /dev/null
+++ b/www/trac-permredirect/pkg-descr
@@ -0,0 +1,3 @@
+Trac plugin which redirects users to the login screen on PermissionError.
+
+WWW: https://trac-hacks.org/wiki/PermRedirectPlugin
diff --git a/www/trac-privatetickets/Makefile b/www/trac-privatetickets/Makefile
new file mode 100644
index 000000000000..1ea12adbb489
--- /dev/null
+++ b/www/trac-privatetickets/Makefile
@@ -0,0 +1,22 @@
+# Created by: Li-Wen Hsu <lwhsu@lwhsu.org>
+# $FreeBSD$
+
+PORTNAME= privatetickets
+PORTVERSION= 2.3.0
+CATEGORIES= www devel python
+MASTER_SITES= CHEESESHOP
+PKGNAMEPREFIX= trac-
+DISTNAME= TracPrivateTickets-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Modified ticket security for Trac
+
+LICENSE= BSD2CLAUSE
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-privatetickets/distinfo b/www/trac-privatetickets/distinfo
new file mode 100644
index 000000000000..6b98af1f5e5f
--- /dev/null
+++ b/www/trac-privatetickets/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1536176139
+SHA256 (TracPrivateTickets-2.3.0.tar.gz) = 6ab51573ccafa937b5c9f80c9fa152483d20173823779b6ffc88c0efed7c4a86
+SIZE (TracPrivateTickets-2.3.0.tar.gz) = 5933
diff --git a/www/trac-privatetickets/pkg-descr b/www/trac-privatetickets/pkg-descr
new file mode 100644
index 000000000000..ed2b54c339bd
--- /dev/null
+++ b/www/trac-privatetickets/pkg-descr
@@ -0,0 +1,12 @@
+Allow users to only see tickets they are associated with.
+
+There are three new permissions for this plugin: TICKET_VIEW_REPORTER,
+TICKET_VIEW_CC, and TICKET_VIEW_OWNER. TICKET_VIEW_SELF is an alias
+for all three of these.
+
+With each permission, users will only be able to see tickets where they are
+the person mentioned in the permission. So if a user has TICKET_VIEW_REPORTER,
+they can only see tickets they reported. For TICKET_VIEW_CC, they just have to
+be included in the CC list.
+
+WWW: https://trac-hacks.org/wiki/PrivateTicketsPlugin
diff --git a/www/trac-pydotorgtheme/Makefile b/www/trac-pydotorgtheme/Makefile
new file mode 100644
index 000000000000..e7f0a9e9b700
--- /dev/null
+++ b/www/trac-pydotorgtheme/Makefile
@@ -0,0 +1,23 @@
+# $FreeBSD$
+
+PORTNAME= pydotorgtheme
+PORTVERSION= 2.0
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Theme that emulates the look of python.org
+
+LICENSE= BSD
+
+RUN_DEPENDS= tracd:www/trac \
+ trac-themeengine>=2.0:www/trac-themeengine
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+WRKSRC= ${WRKDIR}/${PORTNAME}
+
+.include <bsd.port.mk>
diff --git a/www/trac-pydotorgtheme/distinfo b/www/trac-pydotorgtheme/distinfo
new file mode 100644
index 000000000000..eeabe8617a6c
--- /dev/null
+++ b/www/trac-pydotorgtheme/distinfo
@@ -0,0 +1,2 @@
+SHA256 (pydotorgtheme-2.0.tar.gz) = 22158d92710938ef7a7ccc4622461a820d596c8292b208d06a981355d0a9d178
+SIZE (pydotorgtheme-2.0.tar.gz) = 2732
diff --git a/www/trac-pydotorgtheme/pkg-descr b/www/trac-pydotorgtheme/pkg-descr
new file mode 100644
index 000000000000..966de1bc7e82
--- /dev/null
+++ b/www/trac-pydotorgtheme/pkg-descr
@@ -0,0 +1,3 @@
+This is a theme that emulates the look of python.org.
+
+WWW: https://trac-hacks.org/wiki/PyDotOrgTheme
diff --git a/www/trac-scrumburndown/Makefile b/www/trac-scrumburndown/Makefile
new file mode 100644
index 000000000000..e04a0aff33c5
--- /dev/null
+++ b/www/trac-scrumburndown/Makefile
@@ -0,0 +1,25 @@
+# Created by: Greg Larkin <glarkin@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= scrumburndown
+PORTVERSION= 1.9.2
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin to enable Scrum burndown chart capabilities
+
+LICENSE= APACHE20
+
+RUN_DEPENDS= tracd:www/trac \
+ trac-timingandestimation>=0:www/trac-timingandestimation
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-scrumburndown/distinfo b/www/trac-scrumburndown/distinfo
new file mode 100644
index 000000000000..85dc93d12a6f
--- /dev/null
+++ b/www/trac-scrumburndown/distinfo
@@ -0,0 +1,2 @@
+SHA256 (scrumburndown-1.9.2.tar.gz) = bcd7a685fdc191a590f0485991dd1f69063f9b1f29824beb4b5d775d85f06d95
+SIZE (scrumburndown-1.9.2.tar.gz) = 6194062
diff --git a/www/trac-scrumburndown/pkg-descr b/www/trac-scrumburndown/pkg-descr
new file mode 100644
index 000000000000..57edabdb5640
--- /dev/null
+++ b/www/trac-scrumburndown/pkg-descr
@@ -0,0 +1,4 @@
+This Trac plugin adds burndown chart capabilities, a common part
+of Scrum and other agile development methodologies.
+
+WWW: http://trac-hacks.org/wiki/ScrumBurndownPlugin
diff --git a/www/trac-scrumburndown/pkg-message b/www/trac-scrumburndown/pkg-message
new file mode 100644
index 000000000000..a198216937f0
--- /dev/null
+++ b/www/trac-scrumburndown/pkg-message
@@ -0,0 +1,22 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+timingandestimationplugin.* = enabled
+burndown.* = enabled
+
+to your trac.ini to enable the plugins.
+
+Next, upgrade your database with the command:
+
+ trac-admin /full/path/to/YourProjectName upgrade
+
+Finally, visit:
+http://trac-hacks.org/wiki/ScrumBurndownPlugin#Usingtheplugin
+
+for usage instructions.
+EOM
+}
+]
diff --git a/www/trac-spam-filter/Makefile b/www/trac-spam-filter/Makefile
new file mode 100644
index 000000000000..11d6db34c6be
--- /dev/null
+++ b/www/trac-spam-filter/Makefile
@@ -0,0 +1,23 @@
+# Created by: sutra
+# $FreeBSD$
+
+PORTNAME= TracSpamFilter
+PORTVERSION= 0.2.1
+PORTREVISION= 7
+CATEGORIES= www devel python
+MASTER_SITES= http://zhoushuqun.com/files/ \
+ http://freebsd.unixfreunde.de/sources/
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= zhoushuqun@gmail.com
+COMMENT= Allow different ways to reject contributions that contain spam
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}dev
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-spam-filter/distinfo b/www/trac-spam-filter/distinfo
new file mode 100644
index 000000000000..92a8ef98e72b
--- /dev/null
+++ b/www/trac-spam-filter/distinfo
@@ -0,0 +1,2 @@
+SHA256 (TracSpamFilter-0.2.1.tar.gz) = 9f94e3b8d6daacc7b1e6cb908925d95793726cbc08a22e116ccddbb1210815ec
+SIZE (TracSpamFilter-0.2.1.tar.gz) = 50911
diff --git a/www/trac-spam-filter/pkg-descr b/www/trac-spam-filter/pkg-descr
new file mode 100644
index 000000000000..8f3a8af758a0
--- /dev/null
+++ b/www/trac-spam-filter/pkg-descr
@@ -0,0 +1,4 @@
+A plugin is being developed that will allow different ways to reject
+contributions that contain spam.
+
+WWW: http://trac.edgewall.org/wiki/SpamFilter
diff --git a/www/trac-subtickets/Makefile b/www/trac-subtickets/Makefile
new file mode 100644
index 000000000000..c2a97c506c61
--- /dev/null
+++ b/www/trac-subtickets/Makefile
@@ -0,0 +1,28 @@
+# Created by: Hung-Yi Chen <gaod@hychen.org>
+# $FreeBSD$
+
+PORTNAME= subtickets
+PORTVERSION= 0.2.0.${GITDATE}
+PORTREVISION= 2
+CATEGORIES= www devel python
+MASTER_SITES= http://distfiles.cse.tw/
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= gaod@hychen.org
+COMMENT= Offers sub-ticket feature for managing tickets
+
+LICENSE= BSD3CLAUSE
+
+RUN_DEPENDS= tracd:www/trac
+
+USE_GITHUB= yes
+GH_ACCOUNT= itota
+GH_PROJECT= trac-subtickets-plugin
+GH_TAGNAME= a0fc153
+GITDATE= 20130328
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-subtickets/distinfo b/www/trac-subtickets/distinfo
new file mode 100644
index 000000000000..06e329f9ee44
--- /dev/null
+++ b/www/trac-subtickets/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1477434380
+SHA256 (itota-trac-subtickets-plugin-0.2.0.20130328-a0fc153_GH0.tar.gz) = 06302d61339cae566f5f3e07a69f81679165ad6910a267843ed62a89bc451452
+SIZE (itota-trac-subtickets-plugin-0.2.0.20130328-a0fc153_GH0.tar.gz) = 7439
diff --git a/www/trac-subtickets/files/patch-setup.cfg b/www/trac-subtickets/files/patch-setup.cfg
new file mode 100644
index 000000000000..ae7ca6ad05af
--- /dev/null
+++ b/www/trac-subtickets/files/patch-setup.cfg
@@ -0,0 +1,10 @@
+--- setup.cfg.orig 2012-10-27 18:40:31 UTC
++++ setup.cfg
+@@ -1,6 +1,6 @@
+ [egg_info]
+ tag_build = .dev
+-tag_date = True
++tag_date = False
+
+ [extract_messages]
+ add_comments = TRANSLATOR:
diff --git a/www/trac-subtickets/files/patch-tracsubtickets_api.py b/www/trac-subtickets/files/patch-tracsubtickets_api.py
new file mode 100644
index 000000000000..d36c42d185d3
--- /dev/null
+++ b/www/trac-subtickets/files/patch-tracsubtickets_api.py
@@ -0,0 +1,20 @@
+--- tracsubtickets/api.py.orig 2012-10-27 18:40:31 UTC
++++ tracsubtickets/api.py
+@@ -153,7 +153,7 @@ class SubTicketsSystem(Component):
+ (parent, ticket.id))
+ # add a comment to old parent
+ xticket = Ticket(self.env, parent)
+- xticket.save_changes(author, _('Remove a subticket #%s.') % ticket.id)
++ xticket.save_changes(author, _('Remove a subticket #%s. (%s)') % (ticket.id, ticket['summary']))
+ tn = TicketNotifyEmail(self.env)
+ tn.notify(xticket, newticket=False, modtime=xticket['changetime'])
+
+@@ -164,7 +164,7 @@ class SubTicketsSystem(Component):
+ (parent, ticket.id))
+ # add a comment to new parent
+ xticket = Ticket(self.env, parent)
+- xticket.save_changes(author, _('Add a subticket #%s.') % ticket.id)
++ xticket.save_changes(author, _('Add a subticket #%s. (%s)') % (ticket.id, ticket['summary']))
+ tn = TicketNotifyEmail(self.env)
+ tn.notify(xticket, newticket=False, modtime=xticket['changetime'])
+
diff --git a/www/trac-subtickets/pkg-descr b/www/trac-subtickets/pkg-descr
new file mode 100644
index 000000000000..aca581164563
--- /dev/null
+++ b/www/trac-subtickets/pkg-descr
@@ -0,0 +1,3 @@
+This plugin offers sub-ticket feature for managing tickets.
+
+WWW: http://trac-hacks.org/wiki/SubticketsPlugin
diff --git a/www/trac-tags/Makefile b/www/trac-tags/Makefile
new file mode 100644
index 000000000000..9959761ea12c
--- /dev/null
+++ b/www/trac-tags/Makefile
@@ -0,0 +1,46 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= tags
+DISTVERSION= 0.7.r${SVN_REV}
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Generic tags frontend for trac
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7 tar:bzip2
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.pre.mk>
+
+.if !defined(SVN_REV)
+.if defined(BOOTSTRAP)
+SVN_REV!= svn info http://trac-hacks.org/svn/tagsplugin/trunk/ | ${GREP} Revision | cut -d' ' -f2
+.else
+.include "Makefile.svn_rev"
+.endif
+.endif
+
+.if defined(BOOTSTRAP) || defined(SVN_FETCH)
+FETCH_DEPENDS+= svn:devel/subversion
+
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ svn export -r ${SVN_REV} \
+ http://trac-hacks.org/svn/tagsplugin/trunk/ ${WRKSRC}
+ cd ${WRKDIR}; tar cvfy ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME}.tar.bz2 ${DISTNAME}
+ echo "SVN_REV= ${SVN_REV}" > ${MASTERDIR}/Makefile.svn_rev
+.if ${USER} == brooks
+ scp ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME}.tar.bz2 \
+ freefall.freebsd.org:public_distfiles/
+.endif
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/www/trac-tags/Makefile.svn_rev b/www/trac-tags/Makefile.svn_rev
new file mode 100644
index 000000000000..c45cee588277
--- /dev/null
+++ b/www/trac-tags/Makefile.svn_rev
@@ -0,0 +1 @@
+SVN_REV= 11504
diff --git a/www/trac-tags/distinfo b/www/trac-tags/distinfo
new file mode 100644
index 000000000000..b6385d4dcdff
--- /dev/null
+++ b/www/trac-tags/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/tags-0.7.r11504.tar.bz2) = d4ca2ad73d8e3ab197b854639daf41747ba3bcacccbedd0e0ecc9c291a588353
+SIZE (trac/tags-0.7.r11504.tar.bz2) = 25799
diff --git a/www/trac-tags/files/patch-tractags_model.py b/www/trac-tags/files/patch-tractags_model.py
new file mode 100644
index 000000000000..66f3247eebdd
--- /dev/null
+++ b/www/trac-tags/files/patch-tractags_model.py
@@ -0,0 +1,21 @@
+--- tractags/model.py.orig 2011-12-14 21:19:06 UTC
++++ tractags/model.py
+@@ -62,17 +62,7 @@ class TagModelProvider(Component):
+ self._upgrade_db(db)
+
+ def _need_migration(self, db):
+- try:
+- cursor = db.cursor()
+- cursor.execute("SELECT COUNT(*) FROM wiki_namespace")
+- cursor.fetchone()
+- self.env.log.debug("tractags needs to migrate old data")
+- return True
+- except Exception, e:
+- # The expected outcome for any up-to-date installation.
+- if self.rollback_is_safe:
+- db.rollback()
+- return False
++ return False
+
+ def _upgrade_db(self, db):
+ try:
diff --git a/www/trac-tags/pkg-descr b/www/trac-tags/pkg-descr
new file mode 100644
index 000000000000..42811568371a
--- /dev/null
+++ b/www/trac-tags/pkg-descr
@@ -0,0 +1,6 @@
+The TagsPlugin implements both a generic tagging engine and frontends for the
+Wiki and ticket systems. An extra text entry box is added to the Wiki edit page
+for tagging Wiki pages and ticket fields (you can configure which ones) are
+treated as tags for the ticket system.
+
+WWW: http://trac-hacks.org/wiki/TagsPlugin
diff --git a/www/trac-themeengine/Makefile b/www/trac-themeengine/Makefile
new file mode 100644
index 000000000000..3e5b4ada0b96
--- /dev/null
+++ b/www/trac-themeengine/Makefile
@@ -0,0 +1,23 @@
+# $FreeBSD$
+
+PORTNAME= themeengine
+PORTVERSION= 2.1.3
+PORTREVISION= 2
+CATEGORIES= www devel python
+MASTER_SITES= CHEESESHOP
+PKGNAMEPREFIX= trac-
+DISTNAME= TracThemeEngine-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin to simplify distributing and deploying themes and styles
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7 tar:bzip2
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-themeengine/distinfo b/www/trac-themeengine/distinfo
new file mode 100644
index 000000000000..df222f18c704
--- /dev/null
+++ b/www/trac-themeengine/distinfo
@@ -0,0 +1,2 @@
+SHA256 (TracThemeEngine-2.1.3.tar.bz2) = 1f6f3e0ce4215dd0098c8d17d2e97715bc94407dcf94b819572b967321ba1824
+SIZE (TracThemeEngine-2.1.3.tar.bz2) = 181127
diff --git a/www/trac-themeengine/pkg-descr b/www/trac-themeengine/pkg-descr
new file mode 100644
index 000000000000..ff85496d9bcb
--- /dev/null
+++ b/www/trac-themeengine/pkg-descr
@@ -0,0 +1,4 @@
+This plugin simplifies the process of distributing and deploying
+themes and styles.
+
+WWW: http://trac-hacks.org/wiki/ThemeEnginePlugin
diff --git a/www/trac-ticketimport/Makefile b/www/trac-ticketimport/Makefile
new file mode 100644
index 000000000000..2666cb73e72b
--- /dev/null
+++ b/www/trac-ticketimport/Makefile
@@ -0,0 +1,35 @@
+# $FreeBSD$
+
+PORTNAME= ticketimport
+PORTVERSION= 0.7c
+PORTREVISION= 4
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Import or update tickets from a CSV file or Excel file
+
+LICENSE= BSD3CLAUSE # "same license as trac"
+
+RUN_DEPENDS= tracd:www/trac \
+ ${PYTHON_PKGNAMEPREFIX}xlrd>=0.7.1:textproc/py-xlrd@${PY_FLAVOR}
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export http://trac-hacks.org/svn/ticketimportplugin/0.11/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-ticketimport/distinfo b/www/trac-ticketimport/distinfo
new file mode 100644
index 000000000000..c0514b315361
--- /dev/null
+++ b/www/trac-ticketimport/distinfo
@@ -0,0 +1,2 @@
+SHA256 (ticketimport-0.7c.tar.gz) = a6cab62cc62ba0d599107869b862951f2826e1fce4ac65f57eb066e4d3843643
+SIZE (ticketimport-0.7c.tar.gz) = 2811904
diff --git a/www/trac-ticketimport/pkg-descr b/www/trac-ticketimport/pkg-descr
new file mode 100644
index 000000000000..91e6afcc20f6
--- /dev/null
+++ b/www/trac-ticketimport/pkg-descr
@@ -0,0 +1,15 @@
+This plugin lets you import into Trac a series of tickets from a CSV
+file or (if the xlrd library is installed) from an Excel file.
+
+You can also use it to modify tickets in batch, by saving a report as
+CSV, editing the CSV file, and re-importing the tickets.
+
+This plugin is very useful when starting a new project: you can import a
+list of requirements that may have come from meeting notes, list of
+features, other ticketing systems... It's also great to review the
+tickets off-line, or to do massive changes to tickets.
+
+Based on the ticket id (or, if no id exists, on the summary) in the
+imported file, tickets are either created or updated.
+
+WWW: http://trac-hacks.org/wiki/TicketImportPlugin
diff --git a/www/trac-tickettemplate/Makefile b/www/trac-tickettemplate/Makefile
new file mode 100644
index 000000000000..369295ccfb63
--- /dev/null
+++ b/www/trac-tickettemplate/Makefile
@@ -0,0 +1,24 @@
+# Created by: Eygene Ryabinkin <rea@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= tickettemplate
+PORTVERSION= 0.7
+PORTREVISION= 3
+CATEGORIES= www python
+MASTER_SITES= http://dist.codelabs.ru/fbsd/trac-${PORTNAME}/
+PKGNAMEPREFIX= trac-
+DISTNAME= trac${PORTNAME}plugin-r${REL}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for making ticket templates
+
+RUN_DEPENDS= trac>=0.11:www/trac
+
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+WRKSRC= ${WRKDIR}/trac${PORTNAME}plugin/0.11
+REL= 10605
+
+.include <bsd.port.mk>
diff --git a/www/trac-tickettemplate/distinfo b/www/trac-tickettemplate/distinfo
new file mode 100644
index 000000000000..6bd1fb501fc8
--- /dev/null
+++ b/www/trac-tickettemplate/distinfo
@@ -0,0 +1,2 @@
+SHA256 (tractickettemplateplugin-r10605.zip) = b37a9509ace8ebb2b73b79fd614e3c5f00cc7cfc7cbdfd6e38f581880eed95f2
+SIZE (tractickettemplateplugin-r10605.zip) = 48209
diff --git a/www/trac-tickettemplate/pkg-descr b/www/trac-tickettemplate/pkg-descr
new file mode 100644
index 000000000000..02af7d2b312f
--- /dev/null
+++ b/www/trac-tickettemplate/pkg-descr
@@ -0,0 +1,4 @@
+TicketTemplate enable users to create ticket using templates
+which can be customized by Trac administrator and themselves.
+
+WWW: http://trac-hacks.org/wiki/TracTicketTemplatePlugin
diff --git a/www/trac-timingandestimation/Makefile b/www/trac-timingandestimation/Makefile
new file mode 100644
index 000000000000..412c47c4e51b
--- /dev/null
+++ b/www/trac-timingandestimation/Makefile
@@ -0,0 +1,23 @@
+# Created by: Greg Larkin <glarkin@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= timingandestimation
+PORTVERSION= 1.0.8b
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Add estimation and time tracking functionality to Trac
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/branches/trac0.12-Permissions
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-timingandestimation/distinfo b/www/trac-timingandestimation/distinfo
new file mode 100644
index 000000000000..a1a4118b4f2c
--- /dev/null
+++ b/www/trac-timingandestimation/distinfo
@@ -0,0 +1,2 @@
+SHA256 (timingandestimationplugin-1.0.8b.zip) = d12eea326e03a27aa7fc3bda5b75ed21749c071bb5cf2e74a4736c1c602ca252
+SIZE (timingandestimationplugin-1.0.8b.zip) = 88910
diff --git a/www/trac-timingandestimation/pkg-descr b/www/trac-timingandestimation/pkg-descr
new file mode 100644
index 000000000000..424edf1f2590
--- /dev/null
+++ b/www/trac-timingandestimation/pkg-descr
@@ -0,0 +1,6 @@
+This is a plugin that adds (aspires to add) estimation and time
+tracking to Trac. This basically adds CustomFields and CustomReports
+and an interface for filling the dynamic variables for the report
+(requires Javascript).
+
+WWW: http://trac-hacks.org/wiki/TimingAndEstimationPlugin
diff --git a/www/trac-timingandestimation/pkg-message b/www/trac-timingandestimation/pkg-message
new file mode 100644
index 000000000000..0fb5bf3b8fff
--- /dev/null
+++ b/www/trac-timingandestimation/pkg-message
@@ -0,0 +1,21 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+timingandestimationplugin.* = enabled
+
+to your trac.ini to enable the plugin.
+
+Next, upgrade your database with the command:
+
+ trac-admin /full/path/to/YourProjectName upgrade
+
+Finally, visit:
+http://trac-hacks.org/wiki/TimingAndEstimationPlugin#PostInstallationConfigurationOptions
+
+for configuration instructions.
+EOM
+}
+]
diff --git a/www/trac-tocmacro/Makefile b/www/trac-tocmacro/Makefile
new file mode 100644
index 000000000000..0cfc8f0789f1
--- /dev/null
+++ b/www/trac-tocmacro/Makefile
@@ -0,0 +1,21 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= tocmacro
+PORTVERSION= 11.0.0.3
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= http://people.freebsd.org/~mm/trac/
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Table of contents macro
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-tocmacro/distinfo b/www/trac-tocmacro/distinfo
new file mode 100644
index 000000000000..82ae9d4b7559
--- /dev/null
+++ b/www/trac-tocmacro/distinfo
@@ -0,0 +1,2 @@
+SHA256 (tocmacro-11.0.0.3.tar.gz) = 0a4432991604739e143f64831ec11772118f9e52655ee77de10c314103adab80
+SIZE (tocmacro-11.0.0.3.tar.gz) = 5125
diff --git a/www/trac-tocmacro/pkg-descr b/www/trac-tocmacro/pkg-descr
new file mode 100644
index 000000000000..e77a455d5fd3
--- /dev/null
+++ b/www/trac-tocmacro/pkg-descr
@@ -0,0 +1,4 @@
+The TocMacro generates a table of contents for the current page or a set of
+pages.
+
+WWW: http://trac-hacks.org/wiki/TocMacro
diff --git a/www/trac-tweakui/Makefile b/www/trac-tweakui/Makefile
new file mode 100644
index 000000000000..79eea59f0374
--- /dev/null
+++ b/www/trac-tweakui/Makefile
@@ -0,0 +1,35 @@
+# Created by: glarkin
+# $FreeBSD$
+
+PORTNAME= tweakui
+PORTVERSION= 0.1.7413
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Easily tweak Trac pages with JavaScript expressions
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= dos2unix python:2.7 zip
+DOS2UNIX_REGEX= .*\.(css|html|js|py|txt)$
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+EXAMPLESDIR= ${PREFIX}/share/examples/${PKGNAMEPREFIX}${PORTNAME}
+PORTEXAMPLES= *
+
+SUB_FILES= pkg-message
+
+WRKSRC= ${WRKDIR}/trac${PORTNAME}plugin/0.11
+
+OPTIONS_DEFINE= EXAMPLES
+
+post-install:
+ cd ${WRKSRC}/tractweakui/htdocs && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}
+
+.include <bsd.port.mk>
diff --git a/www/trac-tweakui/distinfo b/www/trac-tweakui/distinfo
new file mode 100644
index 000000000000..69ab510848b3
--- /dev/null
+++ b/www/trac-tweakui/distinfo
@@ -0,0 +1,2 @@
+SHA256 (tweakuiplugin-0.1.7413.zip) = f067282d97843e9287ea4031de3f100af280942d4feb69d65695e3f6026c6ea3
+SIZE (tweakuiplugin-0.1.7413.zip) = 68697
diff --git a/www/trac-tweakui/files/pkg-message.in b/www/trac-tweakui/files/pkg-message.in
new file mode 100644
index 000000000000..bc3fc1dbd803
--- /dev/null
+++ b/www/trac-tweakui/files/pkg-message.in
@@ -0,0 +1,28 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+tractweakui.* = enabled
+
+to your trac.ini to enable the plugin.
+
+Next, visit:
+http://trac-hacks.org/wiki/TracTweakUiPlugin#Example
+for usage examples.
+
+If you have installed the examples into
+%%EXAMPLESDIR%%,
+you can incorporate them into your Trac project
+with the following command:
+
+cp -Rp %%EXAMPLESDIR%%/* \
+ $TRAC_ENV/htdocs
+
+$TRAC_ENV is the root directory of your Trac
+project. You can copy the TweakUi examples into
+as many Trac projects as you like.
+EOM
+}
+]
diff --git a/www/trac-tweakui/pkg-descr b/www/trac-tweakui/pkg-descr
new file mode 100644
index 000000000000..0657044e85c7
--- /dev/null
+++ b/www/trac-tweakui/pkg-descr
@@ -0,0 +1,9 @@
+This plugin implements a Javascript deployment platform, enabling
+Trac administrators to easily tweak Trac pages with Javascript
+expressions.
+
+The plugin supports the Trac web admin system, and it can apply
+Javascript tweaks to multiple pages by matching their names with
+regular expressions.
+
+WWW: http://trac-hacks.org/wiki/TracTweakUiPlugin
diff --git a/www/trac-vote/Makefile b/www/trac-vote/Makefile
new file mode 100644
index 000000000000..1de0d701ee1d
--- /dev/null
+++ b/www/trac-vote/Makefile
@@ -0,0 +1,32 @@
+# $FreeBSD$
+
+PORTNAME= vote
+PORTVERSION= 0.1.2
+PORTREVISION= 4
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for voting on Trac resources
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+# Maintainter targets below this point
+
+# Retrieve the latest version from SVN and package in a tarball.
+.if defined(BOOTSTRAP)
+FETCH_DEPENDS+= svn:devel/subversion
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ cd ${WRKDIR} && \
+ svn export http://trac-hacks.org/svn/voteplugin/0.11/ \
+ ${DISTNAME}
+ cd ${WRKDIR} && tar cvf ${DISTDIR}/${DISTNAME}.tar.gz ${DISTNAME}
+.endif
+
+.include <bsd.port.mk>
diff --git a/www/trac-vote/distinfo b/www/trac-vote/distinfo
new file mode 100644
index 000000000000..12887a26197a
--- /dev/null
+++ b/www/trac-vote/distinfo
@@ -0,0 +1,2 @@
+SHA256 (vote-0.1.2.tar.gz) = 9f22fc467799ba15ab6ed5fd96ce085909b65fa56781143e6016c17e191791f8
+SIZE (vote-0.1.2.tar.gz) = 30720
diff --git a/www/trac-vote/pkg-descr b/www/trac-vote/pkg-descr
new file mode 100644
index 000000000000..3e81cd5668ce
--- /dev/null
+++ b/www/trac-vote/pkg-descr
@@ -0,0 +1,7 @@
+This plugin adds a context-navigation entry that lets users easily vote
+for a Trac resource, including Wiki pages, tickets, milestones, etc.
+
+If a user has a valid session and the VOTE_MODIFY permission they will
+be able to vote.
+
+WWW: http://trac-hacks.org/wiki/VotePlugin
diff --git a/www/trac-wikigoodies/Makefile b/www/trac-wikigoodies/Makefile
new file mode 100644
index 000000000000..b9cbda7a5007
--- /dev/null
+++ b/www/trac-wikigoodies/Makefile
@@ -0,0 +1,26 @@
+# Created by: Alexey V. Degtyarev <alexey@renatasystems.org>
+# $FreeBSD$
+
+PORTNAME= wikigoodies
+PORTVERSION= 0.3.3522
+PORTREVISION= 3
+CATEGORIES= www devel python
+MASTER_SITES= ftp://ftp.renatasystems.org/pub/FreeBSD/ports/distfiles/
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin.${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin for Trac which extends the Wiki with some goodies
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/0.11
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-wikigoodies/distinfo b/www/trac-wikigoodies/distinfo
new file mode 100644
index 000000000000..408c4f51e4c3
--- /dev/null
+++ b/www/trac-wikigoodies/distinfo
@@ -0,0 +1,2 @@
+SHA256 (wikigoodiesplugin.0.3.3522.tar.gz) = 10a24cf3c4a92dc305051c754590adf43a15baebfd4a2a32869bbe18df6260c8
+SIZE (wikigoodiesplugin.0.3.3522.tar.gz) = 11538
diff --git a/www/trac-wikigoodies/pkg-descr b/www/trac-wikigoodies/pkg-descr
new file mode 100644
index 000000000000..1fcc39de7f3d
--- /dev/null
+++ b/www/trac-wikigoodies/pkg-descr
@@ -0,0 +1,14 @@
+This plugin extends the Trac Wiki in several ways:
+
+- Support for displaying smileys;
+- HTML 4.0 entities (named entities and numerical entities);
+- Automatic replacement of common text idioms by their corresponding symbols
+ (e.g. arrows, fractions, etc.);
+- Simplified markup for single words: *this* /is/ _important_;
+- Replace <name@domain> with "mailto:" links (obfuscated if needed)
+ (0.11 only - though that's now in Trac core);
+- Replace \\... UNC paths with "file:///" links (0.11 only);
+
+Each feature can be disabled individually if needed.
+
+WWW: https://trac-hacks.org/wiki/WikiGoodiesPlugin
diff --git a/www/trac-wikinotification/Makefile b/www/trac-wikinotification/Makefile
new file mode 100644
index 000000000000..45af8074c15d
--- /dev/null
+++ b/www/trac-wikinotification/Makefile
@@ -0,0 +1,24 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= wikinotificationplugin
+PORTVERSION= 0.2.1
+PORTREVISION= 5
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Allow email notifications on wiki page changes
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= tracd:www/trac
+
+WRKSRC= ${WRKDIR}/${PORTNAME}
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-wikinotification/distinfo b/www/trac-wikinotification/distinfo
new file mode 100644
index 000000000000..5cc9e2e425d9
--- /dev/null
+++ b/www/trac-wikinotification/distinfo
@@ -0,0 +1,2 @@
+SHA256 (wikinotificationplugin-0.2.1.tar.gz) = 91263ba7ca6e34f54634740cf0f55bd6c84b90f1b36a9f4e9c1b7adf49e8949f
+SIZE (wikinotificationplugin-0.2.1.tar.gz) = 13510
diff --git a/www/trac-wikinotification/files/patch-WikiNotification__notification.py b/www/trac-wikinotification/files/patch-WikiNotification__notification.py
new file mode 100644
index 000000000000..c55eb80a6d4f
--- /dev/null
+++ b/www/trac-wikinotification/files/patch-WikiNotification__notification.py
@@ -0,0 +1,79 @@
+--- WikiNotification/notification.py.orig 2008-03-14 09:02:03 UTC
++++ WikiNotification/notification.py
+@@ -14,14 +14,13 @@
+ # =============================================================================
+
+ import re
+-import md5
+
+ from trac import __version__
+ from trac.core import *
+ from trac.util.text import CRLF
+ from trac.wiki.model import WikiPage
+ from trac.versioncontrol.diff import unified_diff
+-from trac.notification import NotifyEmail
++from trac.notification import NotifyEmail, NotificationSystem
+ from trac.config import Option, BoolOption, ListOption, IntOption
+
+ from genshi.template.text import TextTemplate
+@@ -33,6 +32,7 @@ diff_header = """Index: %(name)s
+ +++ %(name)s (version: %(version)s)
+ """
+
++
+ class WikiNotificationSystem(Component):
+ smtp_from = Option(
+ 'wiki-notification', 'smtp_from', 'trac+wiki@localhost',
+@@ -131,7 +131,7 @@ class WikiNotifyEmail(NotifyEmail):
+ if page.version > 0 and action == 'modified':
+ diff = diff_header % {'name': self.page.name,
+ 'version': self.page.version,
+- 'oldversion': self.page.version -1
++ 'oldversion': self.page.version -1,
+ }
+ oldpage = WikiPage(self.env, page.name, page.version - 1)
+ self.data["oldversion"]= oldpage.version
+@@ -183,8 +183,8 @@ class WikiNotifyEmail(NotifyEmail):
+ public_cc = self.config.getbool('wiki-notification', 'use_public_cc')
+ headers = {}
+ headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__
+- headers['X-Trac-Version'] = __version__
+- headers['X-Trac-Project'] = projname
++ headers['X-Trac-Version'] = __version__
++ headers['X-Trac-Project'] = projname
+ headers['X-URL'] = self.config.get('project', 'url')
+ headers['Precedence'] = 'bulk'
+ headers['Auto-Submitted'] = 'auto-generated'
+@@ -284,18 +284,16 @@ class WikiNotifyEmail(NotifyEmail):
+ del msg['Content-Transfer-Encoding']
+ msg.set_charset(self._charset)
+
+- self.add_headers(msg, headers);
+- self.add_headers(msg, mime_headers);
+- self.env.log.info("Sending SMTP notification to %s:%d to %s"
+- % (self.smtp_server, self.smtp_port, recipients))
++ self.add_headers(msg, headers)
++ self.add_headers(msg, mime_headers)
++ self.env.log.info("Sending SMTP notification to %s"
++ % str(recipients))
+ msgtext = msg.as_string()
+ # Ensure the message complies with RFC2822: use CRLF line endings
+ recrlf = re.compile("\r?\n")
+ msgtext = CRLF.join(recrlf.split(msgtext))
+- try:
+- self.server.sendmail(msg['From'], recipients, msgtext)
+- except Exception, err:
+- self.env.log.debug('Notification could not be sent: %r', err)
++ NotificationSystem(self.env).send_email(self.from_email, recipients,
++ msgtext)
+
+ def format_subject(self, action):
+ template = self.config.get('wiki-notification', 'subject_template')
+@@ -308,6 +306,6 @@ class WikiNotifyEmail(NotifyEmail):
+ data = {
+ 'page': self.page,
+ 'prefix': prefix,
+- 'action': action
++ 'action': action,
+ }
+ return template.generate(**data).render('text', encoding=None).strip()
diff --git a/www/trac-wikinotification/files/patch-WikiNotification__templates__wiki_notification_email_template.txt b/www/trac-wikinotification/files/patch-WikiNotification__templates__wiki_notification_email_template.txt
new file mode 100644
index 000000000000..f02f617568d9
--- /dev/null
+++ b/www/trac-wikinotification/files/patch-WikiNotification__templates__wiki_notification_email_template.txt
@@ -0,0 +1,59 @@
+--- WikiNotification/templates/wiki_notification_email_template.txt.orig 2008-03-14 09:02:03 UTC
++++ WikiNotification/templates/wiki_notification_email_template.txt
+@@ -1,40 +1,40 @@
+
+-#if action == 'added'
++{% if action == 'added' %}
+ Added page "${name}" by ${author} from ${ip}*
+ Page URL: <${link}>
+- #if comment
++ {% if comment %}
+ Comment: ${comment}
+- #end
++ {% end %}
+ Content:
+ -------8<------8<------8<------8<------8<------8<------8<------8<--------
+ ${text}
+ -------8<------8<------8<------8<------8<------8<------8<------8<--------
+-#end
+-#if action == 'modified'
++{% end %}
++{% if action == 'modified' %}
+ Changed page "${name}" by ${author} from ${ip}*
+ Page URL: <${link}>
+ Diff URL: <${linkdiff}>
+ Revision ${version}
+- #if comment
++ {% if comment %}
+ Comment: ${comment}
+- #end
++ {% end %}
+
+- #if wikidiff!=None
++ {% if wikidiff!=None %}
+ -------8<------8<------8<------8<------8<------8<------8<------8<--------
+ ${wikidiff}
+ -------8<------8<------8<------8<------8<------8<------8<------8<--------
+- #end
+- #if wikidiff==None
++ {% end %}
++ {% if wikidiff==None %}
+ Changes on attached ${name}.diff file.
+- #end
+-#end
+-#if action == 'deleted'
++ {% end %}
++{% end %}
++{% if action == 'deleted' %}
+ Deleted page "${name}" by ${author} from ${ip}*
+-#end
+-#if action == 'deleted_version'
++{% end %}
++{% if action == 'deleted_version' %}
+ Page URL: <${link}>
+ Deleted version "${version}" of page "${name}" by ${author} from ${ip}*
+-#end
++{% end %}
+
+ * The IP shown here might not mean anything if the user or the server is
+ behind a proxy.
diff --git a/www/trac-wikinotification/pkg-descr b/www/trac-wikinotification/pkg-descr
new file mode 100644
index 000000000000..0936ff2025d0
--- /dev/null
+++ b/www/trac-wikinotification/pkg-descr
@@ -0,0 +1,5 @@
+Trac Wiki Notification is a plugin that allows users (even anonymous,
+as long as email is set) to select wiki pages that they wish to be
+notified (by email) when a change occurs on it.
+
+WWW: http://trac-hacks.org/wiki/WikiNotificationPlugin
diff --git a/www/trac-wikinotification/pkg-message b/www/trac-wikinotification/pkg-message
new file mode 100644
index 000000000000..83fb3af296f6
--- /dev/null
+++ b/www/trac-wikinotification/pkg-message
@@ -0,0 +1,17 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+wikinotification.* = enabled
+
+to your trac.ini to enable the plugin.
+
+Next, visit:
+http://wikinotification.ufsoft.org/wiki/Documentation/0.2.x
+
+for additional configuration instructions.
+EOM
+}
+]
diff --git a/www/trac-wikitemplates/Makefile b/www/trac-wikitemplates/Makefile
new file mode 100644
index 000000000000..74f21c59bf9e
--- /dev/null
+++ b/www/trac-wikitemplates/Makefile
@@ -0,0 +1,27 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= wikitemplates
+PORTVERSION= 0.3.0p3
+PORTREVISION= 6
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/glarkin
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION:S/p/rc/}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Templates for the Trac wiki
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS= tracd:www/trac
+# ${PYTHON_SITELIBDIR}/TracCtxtnavAdd-2.0-py${PYTHON_VER}.egg:www/trac-ctxtnavadd
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-wikitemplates/distinfo b/www/trac-wikitemplates/distinfo
new file mode 100644
index 000000000000..29cf794ed22d
--- /dev/null
+++ b/www/trac-wikitemplates/distinfo
@@ -0,0 +1,2 @@
+SHA256 (wikitemplatesplugin-0.3.0rc3.tar.gz) = c6299de414f4c4d23d3e84f4724ee5a926380e26ab73576fed889b5a11974bae
+SIZE (wikitemplatesplugin-0.3.0rc3.tar.gz) = 46332
diff --git a/www/trac-wikitemplates/pkg-descr b/www/trac-wikitemplates/pkg-descr
new file mode 100644
index 000000000000..c75be7e210cf
--- /dev/null
+++ b/www/trac-wikitemplates/pkg-descr
@@ -0,0 +1,4 @@
+WikiTemplates is a Trac plugin. This plugin will provide you a way to include
+parts of other wiki pages, the templates, into our current wiki page.
+
+WWW: http://trac-hacks.org/wiki/WikiTemplatesPlugin
diff --git a/www/trac-wikitopdf/Makefile b/www/trac-wikitopdf/Makefile
new file mode 100644
index 000000000000..eaf64467769a
--- /dev/null
+++ b/www/trac-wikitopdf/Makefile
@@ -0,0 +1,22 @@
+# $FreeBSD$
+
+PORTNAME= wikitopdf
+PORTVERSION= 2.2.2
+PORTREVISION= 7
+CATEGORIES= www devel python
+MASTER_SITES= LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Plugin to generate PDF documents from the Wiki
+
+RUN_DEPENDS= htmldoc:textproc/htmldoc \
+ tracd:www/trac
+
+USES= python:2.7
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin
+
+.include <bsd.port.mk>
diff --git a/www/trac-wikitopdf/distinfo b/www/trac-wikitopdf/distinfo
new file mode 100644
index 000000000000..7906b1099a34
--- /dev/null
+++ b/www/trac-wikitopdf/distinfo
@@ -0,0 +1,2 @@
+SHA256 (wikitopdfplugin-2.2.2.tar.gz) = fdc9ad5a928ba6850f946ada50129c28267a7f3974389422514397c58a3c9f7b
+SIZE (wikitopdfplugin-2.2.2.tar.gz) = 1819454
diff --git a/www/trac-wikitopdf/pkg-descr b/www/trac-wikitopdf/pkg-descr
new file mode 100644
index 000000000000..078708c7a266
--- /dev/null
+++ b/www/trac-wikitopdf/pkg-descr
@@ -0,0 +1,15 @@
+WikiToPdf combines the functionality of CombineWikiPlugin and
+PageToPdfPlugin on only one plugin and allows one to setup a template
+file used to generate the PDF file with a cover and a licence page, for
+example.
+
+At the end of each wiki page there is a link named WikiToPdf and
+works like athomas PageToPdfPlugin plugin but takes into account the
+parameters on trac.ini (see below) and passes them to htmldoc.
+
+Alternatively, it's possible to select one or more wiki pages and
+generate one single PDF file just like coderanger work with a cover and
+a licence from a template file. This feature also takes into account the
+parameters on trac.ini.
+
+WWW: http://trac-hacks.org/wiki/TracWikiToPdfPlugin
diff --git a/www/trac-wysiwyg/Makefile b/www/trac-wysiwyg/Makefile
new file mode 100644
index 000000000000..e9be92c80b0a
--- /dev/null
+++ b/www/trac-wysiwyg/Makefile
@@ -0,0 +1,43 @@
+# Created by: Greg Larkin <glarkin@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= wysiwyg
+DISTVERSION= 0.4.${SVN_REV}
+PORTREVISION= 2
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/ \
+ LOCAL/brooks
+PKGNAMEPREFIX= trac-
+DIST_SUBDIR= trac
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= WYSIWYG editor for Trac wiki
+
+RUN_DEPENDS= tracd:www/trac
+
+USES= python:2.7 tar:bzip2
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.pre.mk>
+
+.if !defined(SVN_REV)
+.if defined(BOOTSTRAP)
+SVN_URL= http://trac-hacks.org/svn/tracwysiwygplugin/0.12/
+SVN_REV!= svn info ${SVN_URL} | ${GREP} Revision | cut -d' ' -f2
+.else
+.include "Makefile.svn_rev"
+.endif
+.endif
+
+.if defined(BOOTSTRAP) || defined(SVN_FETCH)
+FETCH_DEPENDS+= svn:devel/subversion
+
+do-fetch:
+ ${MKDIR} ${WRKDIR}
+ svn export -r ${SVN_REV} ${SVN_URL} ${WRKSRC}
+ cd ${WRKDIR}; tar cvfy ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME}.tar.bz2 ${DISTNAME}
+ echo "SVN_REV= ${SVN_REV}" > ${MASTERDIR}/Makefile.svn_rev
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/www/trac-wysiwyg/Makefile.svn_rev b/www/trac-wysiwyg/Makefile.svn_rev
new file mode 100644
index 000000000000..c5f669401716
--- /dev/null
+++ b/www/trac-wysiwyg/Makefile.svn_rev
@@ -0,0 +1 @@
+SVN_REV= 11508
diff --git a/www/trac-wysiwyg/distinfo b/www/trac-wysiwyg/distinfo
new file mode 100644
index 000000000000..91602684b96d
--- /dev/null
+++ b/www/trac-wysiwyg/distinfo
@@ -0,0 +1,2 @@
+SHA256 (trac/wysiwyg-0.4.11508.tar.bz2) = 2c988573b57bd4942fad7b023b2faed9a82e3a11beec130cba38ada98de91895
+SIZE (trac/wysiwyg-0.4.11508.tar.bz2) = 41353
diff --git a/www/trac-wysiwyg/pkg-descr b/www/trac-wysiwyg/pkg-descr
new file mode 100644
index 000000000000..b9b647ff36fc
--- /dev/null
+++ b/www/trac-wysiwyg/pkg-descr
@@ -0,0 +1,5 @@
+This plugin provides a wiki WYSIWYG editor that generates Trac
+wiki markup. This enables users to switch between the WYSIWYG mode
+and the standard wiki markup format, as needed.
+
+WWW: http://trac-hacks.org/wiki/TracWysiwygPlugin
diff --git a/www/trac-wysiwyg/pkg-message b/www/trac-wysiwyg/pkg-message
new file mode 100644
index 000000000000..e4b42c817f80
--- /dev/null
+++ b/www/trac-wysiwyg/pkg-message
@@ -0,0 +1,12 @@
+[
+{ type: install
+ message: <<EOM
+To complete the installation, please add:
+
+[components]
+tracwysiwyg.* = enabled
+
+to your trac.ini to enable the WYSIWYG editor.
+EOM
+}
+]
diff --git a/www/trac-xmlrpc/Makefile b/www/trac-xmlrpc/Makefile
new file mode 100644
index 000000000000..7aa1ace41629
--- /dev/null
+++ b/www/trac-xmlrpc/Makefile
@@ -0,0 +1,28 @@
+# Created by: Gerrit Beine <gerrit.beine@gmx.de>
+# $FreeBSD$
+
+PORTNAME= xmlrpc
+PORTVERSION= 1.1.2.r${SVN_REV}
+PORTREVISION= 2
+CATEGORIES= www devel python
+MASTER_SITES= http://www.sourcehosting.net/freebsd/distfiles/
+PKGNAMEPREFIX= trac-
+DISTNAME= ${PORTNAME}plugin-r${SVN_REV}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Provides an XML-RPC interface to Trac
+
+LICENSE= BSD3CLAUSE
+
+RUN_DEPENDS= tracd:www/trac
+
+SVN_REV= 13203
+
+WRKSRC= ${WRKDIR}/${PORTNAME}plugin/trunk
+FETCH_BEFORE_ARGS= -o ${DISTFILES}
+
+USES= python:2.7 zip
+USE_PYTHON= distutils autoplist
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/www/trac-xmlrpc/distinfo b/www/trac-xmlrpc/distinfo
new file mode 100644
index 000000000000..87a67cc1f04a
--- /dev/null
+++ b/www/trac-xmlrpc/distinfo
@@ -0,0 +1,2 @@
+SHA256 (xmlrpcplugin-r13203.zip) = c5c00337e1674d874ca8974e5f6609c6683c82cfcbf27c0833b2b1b34629cc28
+SIZE (xmlrpcplugin-r13203.zip) = 58856
diff --git a/www/trac-xmlrpc/pkg-descr b/www/trac-xmlrpc/pkg-descr
new file mode 100644
index 000000000000..4dac1945eb40
--- /dev/null
+++ b/www/trac-xmlrpc/pkg-descr
@@ -0,0 +1,7 @@
+This plugin allows Trac plugins to export select parts of their
+interface via XML-RPC.
+
+It also includes some exported functions for manipulating tickets,
+with plans to include interfaces to other parts of Trac's API.
+
+WWW: http://trac-hacks.org/wiki/XmlRpcPlugin
diff --git a/www/trac/Makefile b/www/trac/Makefile
new file mode 100644
index 000000000000..680072458e20
--- /dev/null
+++ b/www/trac/Makefile
@@ -0,0 +1,61 @@
+# Created by: Kuei-Feng Li <thinker@branda.to>
+# $FreeBSD$
+
+PORTNAME= trac
+PORTVERSION= 1.2.5
+PORTREVISION= 1
+CATEGORIES= www devel python
+MASTER_SITES= http://ftp.edgewall.com/pub/trac/ \
+ ftp://ftp.edgewall.com/pub/trac/
+DISTNAME= Trac-${PORTVERSION}
+
+MAINTAINER= joneum@FreeBSD.org
+COMMENT= Enhanced wiki and issue tracking system for software projects
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}Babel>=2.8.0:devel/py-babel@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Genshi>=0.7.3:textproc/py-genshi@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}Babel>=2.8.0:devel/py-babel@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Genshi>=0.7.3:textproc/py-genshi@${PY_FLAVOR}
+
+CONFLICTS_INSTALL= trac-devel
+
+PORTSCOUT= limit:^1\.2\.[0-9]*
+
+USES= python:2.7 shebangfix
+SHEBANG_FILES= trac/tests/functional/better_twill.py trac/tests/functional/tester.py \
+ trac/tests/functional/testenv.py trac/tests/functional/compat.py \
+ trac/tests/functional/__init__.py contrib/emailfilter.py \
+ contrib/checkwiki.py contrib/htpasswd.py
+USE_PYTHON= distutils autoplist
+USE_RC_SUBR= tracd
+SUB_LIST= PYTHON_CMD=${PYTHON_CMD}
+
+PORTEXAMPLES= *
+PORTDATA= *
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= DOCUTILS PYGMENTS TZ SVN EXAMPLES
+OPTIONS_DEFAULT= DOCUTILS PYGMENTS TZ SVN SQLITE
+OPTIONS_RADIO= DATABASE
+OPTIONS_RADIO_DATABASE= PGSQL SQLITE
+DOCUTILS_DESC= Allow additional text markup
+PYGMENTS_DESC= Use generic syntax highlighter
+TZ_DESC= Process Time Zones
+
+DOCUTILS_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}docutils>=0.15.2:textproc/py-docutils@${PY_FLAVOR}
+PYGMENTS_RUN_DEPENDS= ${PY_PYGMENTS}
+TZ_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytz>0:devel/py-pytz@${PY_FLAVOR}
+PGSQL_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}psycopg2>0:databases/py-psycopg2@${PY_FLAVOR}
+SQLITE_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR}
+SVN_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}subversion-lts>0:devel/py-subversion@${PY_FLAVOR}
+
+post-install-EXAMPLES-on:
+ @${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/sample-plugins
+ ${FIND} ${WRKSRC}/contrib -type f -maxdepth 1 -exec ${INSTALL_DATA} {} ${STAGEDIR}${EXAMPLESDIR}/ \;
+ (cd ${WRKSRC}/sample-plugins && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}/sample-plugins)
+
+.include <bsd.port.mk>
diff --git a/www/trac/distinfo b/www/trac/distinfo
new file mode 100644
index 000000000000..7b119f185ebe
--- /dev/null
+++ b/www/trac/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1583237050
+SHA256 (Trac-1.2.5.tar.gz) = 5e26309c19c8781e03ba3db2196f0eac4bfb95dae9d795cfe6a977ba488bc9e6
+SIZE (Trac-1.2.5.tar.gz) = 5333965
diff --git a/www/trac/files/tracd.in b/www/trac/files/tracd.in
new file mode 100644
index 000000000000..27756822a86a
--- /dev/null
+++ b/www/trac/files/tracd.in
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# tracd startup
+#
+# $FreeBSD$
+
+# PROVIDE: tracd
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable or configure tracd:
+# tracd_enable (bool): Set to "NO" by default.
+# Set it to "YES" to enable tracd.
+# tracd_listen (str): The host name or IP address to bind tracd to.
+# By default tracd listens 0.0.0.0, i.e. all the
+# available addresses on all interfaces.
+# tracd_port (str): The port number to bind to, 80 by default.
+# tracd_pidfile (str): When daemonizing, file to which to write pid
+# if not to /var/run/tracd.pid.
+# tracd_envdir (str): Directory of the project environments. Set to
+# "/home/trac" by default.
+# tracd_env (str): The project environment name while using single
+# environment mode. The default is empty, meaning
+# multiproject mode.
+# tracd_args (str): Extra arguments passed to tracd startup
+# command. Empty by default.
+#
+
+. /etc/rc.subr
+
+name="tracd"
+rcvar=tracd_enable
+
+tracd_enable=${tracd_enable:-"NO"}
+tracd_listen=${tracd_listen:-"0.0.0.0"}
+tracd_port=${tracd_port:-"80"}
+tracd_pidfile=${tracd_pidfile:-"/var/run/tracd.pid"}
+tracd_envdir=${tracd_envdir:-"/home/trac"}
+tracd_env=${tracd_env:-""}
+tracd_args=${tracd_args:-""}
+
+load_rc_config ${name}
+
+command_args="--daemonize --hostname=${tracd_listen} --port=${tracd_port}"
+command_args="${command_args} --pidfile=${tracd_pidfile} ${tracd_args}"
+
+required_dirs=${tracd_envdir}
+pidfile=${tracd_pidfile}
+
+if [ -z "${tracd_env}" ]; then
+ _trac_env="--env-parent-dir ${tracd_envdir}"
+else
+ _trac_env="${tracd_envdir}/${tracd_env}"
+ command_args="${command_args} --single-env"
+fi
+
+command_args="%%PREFIX%%/bin/tracd ${command_args} ${_trac_env}"
+command="%%PYTHON_CMD%%"
+
+run_rc_command $1
diff --git a/www/trac/pkg-descr b/www/trac/pkg-descr
new file mode 100644
index 000000000000..c3fa069b0639
--- /dev/null
+++ b/www/trac/pkg-descr
@@ -0,0 +1,21 @@
+Trac uses a minimalistic approach to web-based software project management.
+Our mission; to help developers write great software while staying out of
+the way. Trac should impose as little as possible on a team's established
+development process and policies.
+
+All aspects of Trac have been designed with one single goal, to simplify
+tracking and communication of software issues, enhancements and monitoring
+overall progress.
+
+What is Trac?
+
+ * An integrated system for managing software projects
+ * An enhanced wiki
+ * A flexible web-based issue tracker
+ * An interface to the Subversion revision control system
+
+At the core of Trac lies an integrated wiki and issue/bug database. Using
+wiki markup, all objects managed by Trac can directly link to other
+issues/bug reports, code changesets, documentation and files.
+
+WWW: https://trac.edgewall.org/
diff --git a/www/trac/pkg-message b/www/trac/pkg-message
new file mode 100644
index 000000000000..8d8c58ec1add
--- /dev/null
+++ b/www/trac/pkg-message
@@ -0,0 +1,17 @@
+[
+{ type: upgrade, maximum_version: 1
+ message: <<EOM
+From 0.12.x to 1.0.x
+---------------------
+You should be careful to check that the plugins you depend on have
+been ported to 1.0.x, as they most probably won't work without adaptation
+due to the numerous internal changes that occurred during 1.0.x development.
+
+See: http://trac.edgewall.org/wiki/TracDev/ApiChanges/1.0
+
+Consult the upgrade instructions at:
+
+ http://trac.edgewall.org/wiki/TracUpgrade
+EOM
+}
+]