Version in base suite: 140.4.0esr-1~deb13u1 Version in overlay suite: 140.5.0esr-1~deb13u1 Base version: thunderbird_140.5.0esr-1~deb13u1 Target version: thunderbird_140.6.0esr-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/t/thunderbird/thunderbird_140.5.0esr-1~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/t/thunderbird/thunderbird_140.6.0esr-1~deb13u1.dsc /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/third_party/zucchini/tests/gtest/testdata/chrome64_1.exe |binary /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/third_party/zucchini/tests/gtest/testdata/chrome64_2.exe |binary /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/third_party/zucchini/tests/gtest/testdata/setup1.exe |binary /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/third_party/zucchini/tests/gtest/testdata/setup2.exe |binary /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/toolkit/mozapps/update/tests/data/partial_zucchini.mar |binary /srv/release.debian.org/tmp/EAWqPq9bto/thunderbird-140.6.0esr/toolkit/mozapps/update/tests/data/partial_zucchini_mac.mar |binary thunderbird-140.6.0esr/CLOBBER | 2 thunderbird-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs | 14 thunderbird-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js | 35 thunderbird-140.6.0esr/browser/components/firefoxview/history.mjs | 3 thunderbird-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js | 33 thunderbird-140.6.0esr/browser/components/sidebar/sidebar-history.mjs | 5 thunderbird-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs | 6 thunderbird-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs | 7 thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs | 6 thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js | 56 thunderbird-140.6.0esr/browser/config/mozconfigs/win32/mingwclang | 1 thunderbird-140.6.0esr/browser/config/mozconfigs/win64/mingwclang | 1 thunderbird-140.6.0esr/browser/config/version.txt | 2 thunderbird-140.6.0esr/browser/config/version_display.txt | 2 thunderbird-140.6.0esr/browser/extensions/webcompat/data/interventions.json | 32 thunderbird-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js | 122 thunderbird-140.6.0esr/browser/extensions/webcompat/manifest.json | 2 thunderbird-140.6.0esr/browser/locales/en-US/browser/permissions.ftl | 5 thunderbird-140.6.0esr/browser/locales/l10n-changesets.json | 206 thunderbird-140.6.0esr/browser/modules/PermissionUI.sys.mjs | 20 thunderbird-140.6.0esr/build/moz.configure/update-programs.configure | 43 thunderbird-140.6.0esr/comm/.gecko_rev.yml | 4 thunderbird-140.6.0esr/comm/mail/config/version.txt | 2 thunderbird-140.6.0esr/comm/mail/config/version_display.txt | 2 thunderbird-140.6.0esr/comm/taskcluster/kinds/release-msix-push/kind.yml | 26 thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-msix/kind.yml | 4 thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-shippable-l10n-msix/kind.yml | 4 thunderbird-140.6.0esr/config/milestone.txt | 2 thunderbird-140.6.0esr/debian/changelog | 33 thunderbird-140.6.0esr/debian/patches/debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch | 27 thunderbird-140.6.0esr/debian/patches/porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch | 25 thunderbird-140.6.0esr/debian/patches/prefs/Don-t-auto-disable-extensions-in-system-directories.patch | 2 thunderbird-140.6.0esr/debian/patches/series | 1 thunderbird-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js | 15 thunderbird-140.6.0esr/devtools/client/shared/curl.js | 12 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml | 7 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs | 3 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs | 5 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs | 5 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html | 50 thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html | 69 thunderbird-140.6.0esr/dom/canvas/TexUnpackBlob.cpp | 12 thunderbird-140.6.0esr/dom/media/tools/generateGmpJson.py | 2 thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp | 42 thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h | 2 thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.cpp | 42 thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.h | 4 thunderbird-140.6.0esr/dom/webtransport/api/WebTransport.cpp | 3 thunderbird-140.6.0esr/editor/libeditor/EditorBase.cpp | 9 thunderbird-140.6.0esr/editor/libeditor/EditorBase.h | 54 thunderbird-140.6.0esr/editor/libeditor/HTMLEditor.cpp | 1 thunderbird-140.6.0esr/editor/libeditor/TextEditor.cpp | 4 thunderbird-140.6.0esr/image/imgLoader.cpp | 14 thunderbird-140.6.0esr/js/loader/ImportMap.cpp | 31 thunderbird-140.6.0esr/js/src/jit/CacheIR.cpp | 16 thunderbird-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h | 4 thunderbird-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h | 6 thunderbird-140.6.0esr/js/src/vm/BigIntType.cpp | 36 thunderbird-140.6.0esr/js/src/vm/BigIntType.h | 2 thunderbird-140.6.0esr/js/src/vm/EqualityOperations.cpp | 101 thunderbird-140.6.0esr/netwerk/base/nsIUDPSocket.idl | 7 thunderbird-140.6.0esr/netwerk/base/nsUDPSocket.cpp | 2 thunderbird-140.6.0esr/netwerk/dns/effective_tld_names.dat | 171 thunderbird-140.6.0esr/netwerk/protocol/http/Http3Session.cpp | 10 thunderbird-140.6.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp | 12 thunderbird-140.6.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp | 5 thunderbird-140.6.0esr/nsprpub/TAG-INFO | 2 thunderbird-140.6.0esr/nsprpub/configure | 2 thunderbird-140.6.0esr/nsprpub/configure.in | 2 thunderbird-140.6.0esr/nsprpub/pr/include/prinit.h | 4 thunderbird-140.6.0esr/nsprpub/pr/src/misc/prtime.c | 2 thunderbird-140.6.0esr/nsprpub/pr/tests/parsetm.c | 58 thunderbird-140.6.0esr/nsprpub/pr/tests/vercheck.c | 5 thunderbird-140.6.0esr/security/ct/CTKnownLogs.h | 34 thunderbird-140.6.0esr/security/manager/ssl/StaticHPKPins.h | 2 thunderbird-140.6.0esr/security/manager/ssl/nsSTSPreloadList.inc | 3671 +++---- thunderbird-140.6.0esr/security/manager/tools/log_list.json | 68 thunderbird-140.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json | 2911 +++++ thunderbird-140.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json | 164 thunderbird-140.6.0esr/services/settings/dumps/main/search-config-icons.json | 19 thunderbird-140.6.0esr/services/settings/dumps/main/search-config-v2.json | 47 thunderbird-140.6.0esr/services/settings/dumps/security-state/intermediates.json | 388 thunderbird-140.6.0esr/sourcestamp.txt | 6 thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml | 1 thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml | 1 thunderbird-140.6.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html | 40 thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html | 32 thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html | 84 thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html | 3 thunderbird-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html | 1 thunderbird-140.6.0esr/third_party/moz.build | 3 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h | 21 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/allocator/partition_allocator/partition_alloc_buildflags.h | 35 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/debug/debugging_buildflags.h | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/debug/stack_trace.h | 22 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/logging.cc | 181 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/logging_buildflags.h | 18 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/synchronization/synchronization_buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/threading/scoped_blocking_call.h | 47 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/time/buildflags/buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/tracing_buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/base/values.h | 16 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/build/blink_buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/build/branding_buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/build/chromecast_buildflags.h | 18 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/build/chromeos_buildflags.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/components/zucchini/buildflags.h | 20 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0001-Remove-dependency-on-double-conversion.patch | 93 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0002-Adjust-prefix-path-computations-for-base-Location.patch | 49 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0003-Limit-dependencies-in-check.cc.patch | 111 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0004-Neuter-RefCountedBase-CalledOnValidSequence.patch | 27 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0005-Only-define-IsUser32AndGdi32Available-from-win_util..patch | 61 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0006-Define-only-the-required-functions-from-file_util.h.patch | 502 + thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0007-Only-define-SysInfo-VMAllocationGranularity-from-sys.patch | 366 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0008-Neuter-debug-only-CheckedScopedHandle-in-scoped_hand.patch | 109 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0009-Limit-dependencies-in-file_path.cc.patch | 56 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0010-Limit-dependencies-in-file.-cc-h-and-friends.patch | 165 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0011-Limit-dependencies-in-memory_mapped_file.-cc-h-and-m.patch | 118 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0012-Remove-debug-only-lock-implementation.patch | 32 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0013-Limit-dependencies-in-time.-cc-h-and-time_win.cc.patch | 164 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0014-Neuter-chromium-logging-and-error-handling-in-zucchi.patch | 56 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0015-Make-MappedFileWriter-usable-without-the-DELETE-acce.patch | 81 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0016-Use-zucchini-status-Code-definition-from-moz_zucchin.patch | 43 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0017-Neuter-file-descriptor-ownership-enforcement.patch | 69 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0018-Remove-third-party-dependencies-in-rand_util.h-and-f.patch | 197 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0019-Adjust-base_paths.h-and-friends.patch | 289 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0020-Limit-dependencies-in-foundation_util.mm.patch | 88 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0021-Fix-zucchini-gtests.patch | 109 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/patches/0022-Support-build-linux64-base-toolchains-clang-jobs.patch | 729 + thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/testing/gtest/include/gtest/gtest.h | 12 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/testing/gtest/include/gtest/gtest_prod.h | 12 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/base/attributes.h | 7 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/functional/function_ref.h | 7 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/types/optional.h | 7 thunderbird-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/utility/utility.h | 7 thunderbird-140.6.0esr/third_party/zucchini/chromium/LICENSE | 27 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h | 22 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h | 235 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h | 80 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h | 41 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h | 264 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h | 16 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h | 333 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h | 94 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h | 1049 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h | 37 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h | 120 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h | 444 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h | 71 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h | 75 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h | 153 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h | 94 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h | 190 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h | 69 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_export.h | 29 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc | 73 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h | 102 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc | 52 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h | 22 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm | 82 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc | 139 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h | 28 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc | 236 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h | 66 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h | 48 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bits.h | 142 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.cc | 347 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.h | 279 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc | 101 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.h | 254 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc | 706 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.h | 342 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h | 441 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h | 57 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h | 299 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h | 1130 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h | 97 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h | 108 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h | 33 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h | 41 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h | 42 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h | 33 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h | 38 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h | 37 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h | 36 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h | 43 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h | 48 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h | 46 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h | 41 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h | 553 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h | 23 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h | 21 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h | 193 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc | 387 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.h | 159 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h | 29 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h | 50 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h | 22 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc | 181 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.h | 426 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc | 32 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h | 246 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc | 265 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc | 228 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc | 1420 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h | 532 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc | 625 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc | 63 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h | 96 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc | 533 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h | 724 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm | 71 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc | 1393 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc | 1291 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc | 508 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc | 158 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h | 155 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc | 110 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc | 152 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h | 43 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc | 49 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h | 115 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc | 122 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc | 105 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h | 71 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h | 98 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h | 459 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h | 1826 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback.h | 496 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_forward.h | 24 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_helpers.h | 252 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_internal.cc | 75 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_internal.h | 219 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_tags.h | 34 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/disallow_unretained.h | 71 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/function_ref.h | 106 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/identity.h | 28 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/invoke.h | 152 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/unretained_traits.h | 157 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/gtest_prod_util.h | 66 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/immediate_crash.h | 154 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/location.cc | 156 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/location.h | 127 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/logging.h | 774 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/foundation_util.h | 320 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/foundation_util.mm | 482 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/mac_logging.h | 101 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/mach_logging.cc | 92 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/mach_logging.h | 171 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_cftyperef.h | 50 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_mach_port.h | 79 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_typeref.h | 146 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr.h | 13 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_asan_bound_arg_tracker.h | 123 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_asan_service.h | 101 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_exclusion.h | 13 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ref.h | 13 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h | 55 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/ref_counted.cc | 106 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/ref_counted.h | 492 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/safe_ref_traits.h | 22 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/scoped_policy.h | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/scoped_refptr.h | 435 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/memory/weak_ptr.h | 479 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/no_destructor.h | 132 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/notreached.h | 98 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/checked_math.h | 380 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/checked_math_impl.h | 593 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/clamped_math.h | 260 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/clamped_math_impl.h | 340 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions.h | 388 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions_arm_impl.h | 51 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions_impl.h | 855 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math.h | 12 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_arm_impl.h | 125 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_clang_gcc_impl.h | 157 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_shared_impl.h | 216 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/path_service.cc | 375 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/path_service.h | 93 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/posix/eintr_wrapper.h | 68 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/posix/safe_strerror.cc | 116 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/posix/safe_strerror.h | 44 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle.h | 145 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle_posix.cc | 23 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle_win.cc | 55 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/process/process_metrics.h | 648 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/rand_util.cc | 153 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/rand_util.h | 213 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/rand_util_posix.cc | 257 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/rand_util_win.cc | 106 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/ranges/algorithm.h | 5018 ++++++++++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/ranges/functional.h | 32 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/ranges/ranges.h | 140 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/scoped_clear_last_error.h | 55 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/scoped_clear_last_error_win.cc | 20 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/scoped_generic.h | 325 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/sequence_checker.h | 136 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/sequence_checker_impl.h | 68 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/sequence_token.h | 119 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat.cc | 45 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat.h | 109 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_internal.h | 76 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_win.cc | 31 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_win.h | 36 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions.cc | 179 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions.h | 156 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions_internal.h | 285 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions_win.h | 34 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_piece.h | 36 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_piece_forward.h | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split.cc | 149 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split.h | 145 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split_internal.h | 103 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split_win.h | 45 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_tokenizer.h | 360 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util.cc | 445 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util.h | 604 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_constants.cc | 56 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_impl_helpers.h | 617 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_internal.h | 62 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_posix.h | 38 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_win.cc | 143 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_win.h | 200 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/stringprintf.cc | 224 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/stringprintf.h | 75 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/sys_string_conversions.h | 93 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/sys_string_conversions_posix.cc | 159 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/to_string.h | 117 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_ostream_operators.cc | 31 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_ostream_operators.h | 46 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversion_utils.h | 119 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversions.cc | 362 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversions.h | 102 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/synchronization/atomic_flag.h | 51 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock.h | 140 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl.h | 260 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl_posix.cc | 126 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl_win.cc | 21 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info.h | 301 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_internal.h | 58 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_posix.cc | 313 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_win.cc | 330 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/template_util.h | 146 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/test/gtest_util.h | 132 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/third_party/icu/LICENSE | 76 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/third_party/icu/icu_utf.h | 569 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/LICENSE | 35 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/prtime.cc | 1189 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/prtime.h | 263 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/thread_annotations.h | 263 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/threading/platform_thread.h | 361 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/threading/platform_thread_ref.h | 62 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/threading/thread_checker_impl.h | 108 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/threading/thread_collision_warner.h | 251 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time.cc | 333 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time.h | 1394 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time_mac.mm | 259 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time_now_posix.cc | 140 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time_override.h | 95 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/time/time_win.cc | 834 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/base_tracing.h | 35 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/base_tracing_forward.h | 46 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/common/trace_event_common.h | 1133 ++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/memory_allocator_dump_guid.h | 55 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/trace_event_stub.cc | 60 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/trace_event/trace_event_stub.h | 275 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/types/always_false.h | 48 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/types/pass_key.h | 48 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/types/supports_ostream_operator.h | 28 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/version.h | 77 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/current_module.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/scoped_handle.cc | 77 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/scoped_handle.h | 227 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/shlwapi.h | 19 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/win_handle_types.h | 16 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/win_handle_types_list.inc | 25 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/win_util.cc | 842 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/win_util.h | 293 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/windows_defines.inc | 12 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/windows_types.h | 372 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/windows_undefines.inc | 9 thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/windows_version.cc | 511 + thunderbird-140.6.0esr/third_party/zucchini/chromium/base/win/windows_version.h | 260 thunderbird-140.6.0esr/third_party/zucchini/chromium/build/build_config.h | 385 thunderbird-140.6.0esr/third_party/zucchini/chromium/build/buildflag.h | 47 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils.cc | 211 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils.h | 142 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils_unittest.cc | 555 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator.cc | 258 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator.h | 201 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator_unittest.cc | 586 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/algorithm.h | 147 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/algorithm_unittest.cc | 360 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils.cc | 597 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils.h | 423 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils_unittest.cc | 866 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram.cc | 91 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram.h | 90 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram_unittest.cc | 144 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink.cc | 11 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink.h | 69 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink_unittest.cc | 84 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source.cc | 116 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source.h | 155 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source_unittest.cc | 428 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_view.h | 210 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_view_unittest.cc | 290 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32.cc | 43 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32.h | 17 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32_unittest.cc | 49 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler.cc | 61 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler.h | 177 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf.cc | 781 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf.h | 363 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf_unittest.cc | 177 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_no_op.cc | 31 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_no_op.h | 41 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_win32.cc | 410 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_win32.h | 135 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection.cc | 200 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection.h | 62 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection_unittest.cc | 102 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view.cc | 78 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view.h | 189 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view_unittest.cc | 202 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/ensemble_matcher.cc | 37 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/ensemble_matcher.h | 60 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map.cc | 567 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map.h | 208 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map_unittest.cc | 659 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win.cc | 74 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win.h | 81 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win_unittest.cc | 237 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/heuristic_ensemble_matcher.cc | 370 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/heuristic_ensemble_matcher.h | 40 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index.cc | 78 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index.h | 116 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index_unittest.cc | 131 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_utils.h | 275 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_utils_unittest.cc | 33 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher.cc | 142 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher.h | 83 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher_unittest.cc | 244 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/integration_test.cc | 111 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils.cc | 52 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils.h | 146 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils_unittest.cc | 160 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/main_utils.cc | 266 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/main_utils.h | 34 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file.cc | 81 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file.h | 93 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file_unittest.cc | 61 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_read_write_unittest.cc | 804 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_reader.cc | 405 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_reader.h | 283 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_utils.h | 139 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_utils_unittest.cc | 183 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_writer.cc | 298 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_writer.h | 272 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set.cc | 60 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set.h | 65 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set_unittest.cc | 49 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder.cc | 294 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder.h | 284 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder_unittest.cc | 744 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils.cc | 86 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils.h | 212 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils_unittest.cc | 548 + thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf.cc | 167 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf.h | 104 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf_unittest.cc | 242 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32.cc | 199 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32.h | 141 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32_unittest.cc | 250 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/suffix_array.h | 476 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/suffix_array_unittest.cc | 350 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool.cc | 83 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool.h | 81 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool_unittest.cc | 64 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity.cc | 108 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity.h | 74 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity_unittest.cc | 131 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_disassembler.cc | 61 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_disassembler.h | 77 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_reference_reader.cc | 20 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_reference_reader.h | 32 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_utils.cc | 26 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_utils.h | 35 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/type_elf.h | 283 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/type_win_pe.h | 191 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/typed_value.h | 57 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/typed_value_unittest.cc | 40 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/version_info.h | 30 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini.h | 80 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply.cc | 218 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply.h | 41 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply_unittest.cc | 14 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_commands.cc | 154 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_commands.h | 58 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen.cc | 468 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen.h | 85 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen_unittest.cc | 181 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_integration.cc | 274 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_integration.h | 78 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_main.cc | 63 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_tools.cc | 140 thunderbird-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_tools.h | 45 thunderbird-140.6.0esr/third_party/zucchini/chromium/moz.yaml | 441 thunderbird-140.6.0esr/third_party/zucchini/executable/moz.build | 43 thunderbird-140.6.0esr/third_party/zucchini/moz.build | 167 thunderbird-140.6.0esr/third_party/zucchini/moz_zucchini.cc | 183 thunderbird-140.6.0esr/third_party/zucchini/moz_zucchini.h | 77 thunderbird-140.6.0esr/third_party/zucchini/tests/gtest/moz.build | 80 thunderbird-140.6.0esr/thunderbird-l10n/af/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ar/localization/ar/toolkit/neterror/certError.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/ar/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ast/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/be/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/devtools/client/accessibility.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/devtools/client/boxmodel.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/devtools/client/changes.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/devtools/client/components.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/devtools/client/debugger.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/chrome/bg/locale/bg/necko/necko.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/devtools/client/accessibility.ftl | 3 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/devtools/client/application.ftl | 9 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/devtools/client/compatibility.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/devtools/client/toolbox-options.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutWebauthn.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/localization/bg/toolkit/pdfviewer/viewer.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/bg/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/br/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ca/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/cak/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/netmonitor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/webconsole.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/localization/cs/toolkit/global/extensionPermissions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/localization/cs/toolkit/global/extensions.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/cs/localization/cs/toolkit/neterror/netError.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/cs/localization/cs/toolkit/pdfviewer/viewer.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/cs/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/cy/chrome/cy/locale/cy/mozapps/profile/profileSelection.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/cy/localization/cy/toolkit/global/profileSelection.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/cy/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/da/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/devtools/client/debugger.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/devtools/shared/styleinspector.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/global/css.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/global/dom/dom.properties | 10 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/global/layout/htmlparser.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/global/layout_errors.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/global/security/security.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/chrome/de/locale/de/pipnss/nsserrors.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/about/aboutProcesses.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/about/aboutServiceWorkers.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/about/aboutSupport.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/about/aboutWebrtc.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/neterror/certError.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/de/localization/de/toolkit/neterror/nsserrors.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/de/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/dsb/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/el/chrome/el/locale/el/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/el/localization/el/crashreporter/aboutcrashes.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/el/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/en-CA/localization/en-CA/toolkit/neterror/certError.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/en-CA/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/en-GB/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/csp.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-AR/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-ES/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/client/netmonitor.properties | 16 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/client/network-throttling.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/client/responsive.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/client/styleeditor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/client/toolbox.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/devtools/shared/styleinspector.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/global/appstrings.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/global/dom/dom.properties | 12 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/global/security/security.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/chrome/es-MX/locale/es-MX/global/xul.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/crashreporter/crashreporter.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/devtools/client/perftools.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/security/pippki/pippki.ftl | 7 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutAddons.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutCompat.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutLogging.ftl | 5 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutNetworking.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutReader.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/about/aboutSupport.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/contentanalysis/contentanalysis.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/firefoxlabs/features.ftl | 18 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/global/alert.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/global/extensionPermissions.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/global/extensions.ftl | 21 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/global/textActions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/global/unknownContentType.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/neterror/netError.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/localization/es-MX/toolkit/pdfviewer/viewer.ftl | 25 thunderbird-140.6.0esr/thunderbird-l10n/es-MX/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/et/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutLogging.ftl | 11 thunderbird-140.6.0esr/thunderbird-l10n/eu/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/fi/localization/fi/toolkit/global/textActions.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/fi/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/fr/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/pdfviewer/viewer.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/fy-NL/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ga-IE/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/gd/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/gl/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/netmonitor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/global/layout/xmlparser.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/he/chrome/he/locale/he/global/resetProfile.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/devtools/client/aboutdebugging.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/devtools/client/storage.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/devtools/client/toolbox-options.ftl | 3 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/toolkit/about/aboutNetworking.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/toolkit/about/aboutWebrtc.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/toolkit/about/url-classifier.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/he/localization/he/toolkit/global/resetProfile.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/he/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/hr/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/hsb/localization/hsb/toolkit/global/wizard.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hsb/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/hu/localization/hu/devtools/client/styleeditor.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hu/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties | 14 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties | 10 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/styleeditor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/webconsole.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/shared/screenshot.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/appstrings.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/places/places.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/dom/XMLPrettyPrint.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/security/pippki/pippki.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl | 18 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutSupport.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutTelemetry.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/config.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/handlerDialog.ftl | 5 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/textActions.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/videocontrols.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/main-window/findbar.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/pdfviewer/viewer.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/pictureinpicture/pictureinpicture.ftl | 9 thunderbird-140.6.0esr/thunderbird-l10n/hy-AM/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/debugger.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/id/chrome/id/locale/id/global/dom/dom.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/id/chrome/id/locale/id/necko/necko.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/security/pippki/pippki.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/toolkit/about/aboutLogging.ftl | 14 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/toolkit/firefoxlabs/features.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/toolkit/global/extensions.ftl | 15 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/toolkit/neterror/certError.ftl | 18 thunderbird-140.6.0esr/thunderbird-l10n/id/localization/id/toolkit/neterror/netError.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/id/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/is/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/it/localization/it/toolkit/global/datepicker.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/it/localization/it/toolkit/neterror/certError.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/it/localization/it/toolkit/neterror/netError.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/it/localization/it/toolkit/pdfviewer/viewer.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/it/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ja/localization/ja/devtools/client/tooltips.ftl | 16 thunderbird-140.6.0esr/thunderbird-l10n/ja/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ka/chrome/ka/locale/ka/pipnss/nsserrors.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutGlean.ftl | 38 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutLogging.ftl | 14 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutReader.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/neterror/certError.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ka/localization/ka/toolkit/pdfviewer/viewer.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/ka/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/webconsole.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/kab/chrome/kab/locale/kab/global/dom/dom.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/csp.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/crashreporter/crashreporter.ftl | 15 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/devtools/client/perftools.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/security/pippki/pippki.ftl | 7 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl | 11 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutReader.ftl | 15 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutWebauthn.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/branding/brandings.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/firefoxlabs/features.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/formautofill/formAutofill.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/kab/localization/kab/toolkit/pdfviewer/viewer.ftl | 3 thunderbird-140.6.0esr/thunderbird-l10n/kab/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/kk/chrome/kk/locale/kk/global/security/csp.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/kk/chrome/kk/locale/kk/mozapps/profile/profileSelection.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutSupport.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kk/localization/kk/toolkit/firefoxlabs/features.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/kk/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/responsive.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/startup.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/global/extensions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/global/textActions.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/neterror/certError.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/neterror/netError.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ko/localization/ko/toolkit/pdfviewer/viewer.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ko/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/lt/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/lv/chrome/lv/locale/lv/devtools/client/toolbox.properties | 64 thunderbird-140.6.0esr/thunderbird-l10n/lv/localization/lv/devtools/client/toolbox-options.ftl | 77 thunderbird-140.6.0esr/thunderbird-l10n/lv/localization/lv/devtools/client/toolbox.ftl | 22 thunderbird-140.6.0esr/thunderbird-l10n/lv/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ms/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutThirdParty.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/textActions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/intl/languageNames.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/pdfviewer/viewer.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/nb-NO/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/nl/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/textActions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/neterror/certError.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/neterror/netError.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/nn-NO/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/chrome/pa-IN/locale/pa-IN/devtools/client/netmonitor.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/chrome/pa-IN/locale/pa-IN/devtools/client/network-throttling.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/chrome/pa-IN/locale/pa-IN/devtools/shared/screenshot.properties | 22 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/devtools/shared/highlighters.ftl | 9 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/toolkit/about/aboutCompat.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/toolkit/about/aboutWebauthn.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/pa-IN/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/pl/localization/pl/toolkit/neterror/netError.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/pl/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/neterror/certError.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/pt-BR/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/contentanalysis/contentanalysis.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/pt-PT/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/rm/chrome/rm/locale/rm/global/appstrings.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/rm/chrome/rm/locale/rm/global/dom/dom.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/rm/chrome/rm/locale/rm/global/layout/htmlparser.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/rm/chrome/rm/locale/rm/global/security/csp.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/rm/localization/rm/toolkit/neterror/certError.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/rm/localization/rm/toolkit/neterror/netError.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/rm/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/accessibility.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/inspector.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/webconsole.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/shared/styleinspector.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/global/appstrings.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/global/printdialog.properties | 16 thunderbird-140.6.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/global/printing.properties | 24 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl | 6 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutWebauthn.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/contentanalysis/contentanalysis.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/global/textActions.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/pdfviewer/viewer.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/printing/printDialogs.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/printing/printPreview.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ro/localization/ro/toolkit/printing/printUI.ftl | 16 thunderbird-140.6.0esr/thunderbird-l10n/ro/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/devtools/client/debugger.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/devtools/client/netmonitor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/global-platform/mac/accessible.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/global-platform/unix/accessible.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/global-platform/win/accessible.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/global/nsWebBrowserPersist.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/devtools/client/aboutdebugging.ftl | 16 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/devtools/client/application.ftl | 16 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/devtools/client/perftools.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/devtools/client/toolbox-options.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutServiceWorkers.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutTelemetry.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/ru/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/crashreporter/crashreporter.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/devtools/client/perftools.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutProfiles.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutSupport.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutThirdParty.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/contentanalysis/contentanalysis.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/global/profileSelection.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/global/resetProfile.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/global/run-from-dmg.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sk/localization/sk/toolkit/updates/backgroundupdate.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sk/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/sl/localization/sl/toolkit/main-window/findbar.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sl/localization/sl/toolkit/pdfviewer/viewer.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/sl/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/sq/chrome/sq/locale/sq/global/dom/dom.properties | 10 thunderbird-140.6.0esr/thunderbird-l10n/sq/chrome/sq/locale/sq/global/xul.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/sq/chrome/sq/locale/sq/necko/necko.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/crashreporter/crashreporter.ftl | 1 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl | 21 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutLogging.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/contentanalysis/contentanalysis.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/global/extensionPermissions.ftl | 12 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/global/extensions.ftl | 20 thunderbird-140.6.0esr/thunderbird-l10n/sq/localization/sq/toolkit/neterror/certError.ftl | 17 thunderbird-140.6.0esr/thunderbird-l10n/sq/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/sr/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/sv-SE/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/th/chrome/th/locale/th/devtools/client/webconsole.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/th/chrome/th/locale/th/pipnss/pipnss.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/th/localization/th/devtools/client/application.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/th/localization/th/security/certificates/certManager.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/th/localization/th/toolkit/about/aboutTelemetry.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/th/localization/th/toolkit/neterror/certError.ftl | 18 thunderbird-140.6.0esr/thunderbird-l10n/th/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/tr/chrome/tr/locale/tr/global/dom/dom.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/tr/chrome/tr/locale/tr/global/layout/HtmlForm.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/localization/tr/security/certificates/deviceManager.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/localization/tr/toolkit/global/appPicker.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/localization/tr/toolkit/global/handlerDialog.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/localization/tr/toolkit/global/mozInputFolder.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/localization/tr/toolkit/global/unknownContentType.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/tr/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/accessibility.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/memory.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/netmonitor.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/startup.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/uk/chrome/uk/locale/uk/passwordmgr/passwordmgr.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/devtools/client/aboutdebugging.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/devtools/client/netmonitor.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/security/certificates/certManager.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutTelemetry.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/about/config.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/firefoxlabs/features.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/global/resetProfile.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/neterror/certError.ftl | 10 thunderbird-140.6.0esr/thunderbird-l10n/uk/localization/uk/toolkit/neterror/netError.ftl | 12 thunderbird-140.6.0esr/thunderbird-l10n/uk/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/uz/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties | 8 thunderbird-140.6.0esr/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties | 6 thunderbird-140.6.0esr/thunderbird-l10n/vi/localization/vi/devtools/client/toolbox-options.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/vi/localization/vi/security/pippki/pippki.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl | 8 thunderbird-140.6.0esr/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl | 4 thunderbird-140.6.0esr/thunderbird-l10n/vi/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/debugger.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/styleeditor.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/shared/accessibility.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/shared/styleinspector.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/aboutStudies.properties | 4 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/dom/dom.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/mozapps/profile/profileSelection.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/devtools/client/accessibility.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutLogging.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/formautofill/formAutofill.ftl | 12 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/createProfileWizard.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/extensionPermissions.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-CN/manifest.json | 4 thunderbird-140.6.0esr/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/pipnss/nsserrors.properties | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-TW/localization/zh-TW/devtools/client/tooltips.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/handlerDialog.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/neterror/nsserrors.ftl | 2 thunderbird-140.6.0esr/thunderbird-l10n/zh-TW/manifest.json | 4 thunderbird-140.6.0esr/toolkit/components/cleardata/ClearDataService.sys.mjs | 66 thunderbird-140.6.0esr/toolkit/components/extensions/moz.build | 1 thunderbird-140.6.0esr/toolkit/components/extensions/parent/ext-identity.js | 2 thunderbird-140.6.0esr/toolkit/components/extensions/test/browser/protocol-remote-false/browser.toml | 7 thunderbird-140.6.0esr/toolkit/components/extensions/test/browser/protocol-remote-false/browser_ext_dir_listing.js | 130 thunderbird-140.6.0esr/toolkit/content/gmp-sources/openh264.json | 16 thunderbird-140.6.0esr/toolkit/content/license.html | 6 thunderbird-140.6.0esr/toolkit/crashreporter/nsExceptionHandler.cpp | 17 thunderbird-140.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js | 2 thunderbird-140.6.0esr/toolkit/mozapps/update/UpdateService.sys.mjs | 148 thunderbird-140.6.0esr/toolkit/mozapps/update/metrics.yaml | 14 thunderbird-140.6.0esr/toolkit/mozapps/update/nsIUpdateService.idl | 3 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/data/README.md | 79 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js | 90 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/moz.build | 5 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/test_file_change_mtime.cpp | 65 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/test_file_hold_open.cpp | 53 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_aus_update/accessAndLockout.js | 122 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.toml | 4 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marCallbackAppStageSuccessPartialZucchini_win.js | 31 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marCallbackAppSuccessPartialZucchini_win.js | 24 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFailurePartialZucchini.js | 39 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileInUseStageFailurePartialZucchini_win.js | 44 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileInUseSuccessPartialZucchini_win.js | 27 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileLockedFailurePartialZucchini_win.js | 26 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileLockedStageFailurePartialZucchini_win.js | 33 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marRMRFDirFileInUseStageFailurePartialZucchini_win.js | 47 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marRMRFDirFileInUseSuccessPartialZucchini_win.js | 30 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marStageFailurePartialZucchini.js | 31 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marStageSuccessPartialZucchini.js | 36 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marSuccessPartialZucchini.js | 30 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marSuccessPartialZucchiniWhileBackgroundTaskRunning.js | 130 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/xpcshell_base.toml | 42 thunderbird-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/xpcshell_service.toml | 36 thunderbird-140.6.0esr/toolkit/mozapps/update/updater/bspatch/bspatch.cpp | 6 thunderbird-140.6.0esr/toolkit/mozapps/update/updater/bspatch/bspatch.h | 2 thunderbird-140.6.0esr/toolkit/mozapps/update/updater/updater-common.build | 11 thunderbird-140.6.0esr/toolkit/mozapps/update/updater/updater.cpp | 335 thunderbird-140.6.0esr/toolkit/toolkit.mozbuild | 13 thunderbird-140.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in | 2 thunderbird-140.6.0esr/toolkit/xre/dllservices/mozglue/interceptor/PatcherDetour.h | 7 thunderbird-140.6.0esr/uriloader/base/nsDocLoader.cpp | 77 thunderbird-140.6.0esr/uriloader/base/nsDocLoader.h | 4 thunderbird-140.6.0esr/widget/ContentCache.cpp | 2 thunderbird-140.6.0esr/widget/tests/browser/browser_test_ContentCache.js | 33 thunderbird-140.6.0esr/widget/windows/TSFTextStore.cpp | 34 thunderbird-140.6.0esr/widget/windows/TSFTextStoreBase.cpp | 5 928 files changed, 97039 insertions(+), 3375 deletions(-) diff -Nru thunderbird-140.5.0esr/CLOBBER thunderbird-140.6.0esr/CLOBBER --- thunderbird-140.5.0esr/CLOBBER 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/CLOBBER 2025-12-09 01:27:11.000000000 +0000 @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Merge day clobber 2025-10-13 \ No newline at end of file +Merge day clobber 2025-11-10 \ No newline at end of file diff -Nru thunderbird-140.5.0esr/browser/components/aboutlogins/content/components/login-item.mjs thunderbird-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs --- thunderbird-140.5.0esr/browser/components/aboutlogins/content/components/login-item.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -969,13 +969,6 @@ } _updatePasswordRevealState() { - if ( - window.AboutLoginsUtils && - window.AboutLoginsUtils.passwordRevealVisible === false - ) { - this._revealCheckbox.hidden = true; - } - let { checked } = this._revealCheckbox; let inputType = checked ? "text" : "password"; this._passwordInput.type = inputType; @@ -988,6 +981,13 @@ this._revealCheckbox.hidden = false; } + if ( + window.AboutLoginsUtils && + window.AboutLoginsUtils.passwordRevealVisible === false + ) { + this._revealCheckbox.hidden = true; + } + // Swap which is in the document depending on whether we need the // real .value (which means that the primary password was already entered, // if applicable) diff -Nru thunderbird-140.5.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js thunderbird-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js --- thunderbird-140.5.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js 2025-12-09 01:27:11.000000000 +0000 @@ -4,6 +4,41 @@ "use strict"; add_task(async function test_hidden_reveal_password() { + let login = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance( + Ci.nsILoginInfo + ); + login.init("https://example.com", "", null, "username", "password"); + login.QueryInterface(Ci.nsILoginMetaInfo); + login.timePasswordChanged = Date.now(); + await Services.logins.addLoginAsync(login); + + await setupPolicyEngineWithJson({ + policies: { + DisablePasswordReveal: true, + }, + }); + + let aboutLoginsTab = await BrowserTestUtils.openNewForegroundTab({ + gBrowser, + url: "about:logins", + }); + + let browser = gBrowser.selectedBrowser; + + await SpecialPowers.spawn(browser, [], () => { + let loginItem = Cu.waiveXrays(content.document.querySelector("login-item")); + + let passwordReveal = loginItem.shadowRoot.querySelector( + ".reveal-password-checkbox" + ); + is(passwordReveal.hidden, true, "Password reveal button should be hidden"); + }); + BrowserTestUtils.removeTab(aboutLoginsTab); + + await Services.logins.removeAllLogins(); +}); + +add_task(async function test_bug_1696948() { await setupPolicyEngineWithJson({ policies: { DisablePasswordReveal: true, diff -Nru thunderbird-140.5.0esr/browser/components/firefoxview/history.mjs thunderbird-140.6.0esr/browser/components/firefoxview/history.mjs --- thunderbird-140.5.0esr/browser/components/firefoxview/history.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/firefoxview/history.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -214,7 +214,8 @@ return ( this.profileAge < 8 && !this.hasImportedHistoryPref && - !this.importHistoryDismissedPref + !this.importHistoryDismissedPref && + Services.policies.isAllowed("profileImport") ); } diff -Nru thunderbird-140.5.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js thunderbird-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js --- thunderbird-140.5.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js 2025-12-09 01:27:11.000000000 +0000 @@ -3,10 +3,14 @@ const PATH_NET = TEST_PATH + "file_dummy.html"; const PATH_ORG = PATH_NET.replace("example.net", "example.org"); -add_task(async function () { +async function runTest(defaultZoom) { let tab1, tab1Zoom; tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, PATH_NET); + + tab1Zoom = ZoomManager.getZoomForBrowser(tab1.linkedBrowser); + is(tab1Zoom, defaultZoom, "We are starting with the default zoom."); + await FullZoom.setZoom(1.25, tab1.linkedBrowser); tab1Zoom = ZoomManager.getZoomForBrowser(tab1.linkedBrowser); @@ -46,7 +50,7 @@ is( tab1Zoom, - 1.0, + defaultZoom, "privacy.resistFingerprinting is true, site-specific zoom should be reset when clearing FPP state for tab1" ); @@ -55,4 +59,29 @@ BrowserTestUtils.removeTab(tab1); await SpecialPowers.popPrefEnv(); +} + +add_task(async function () { + await runTest(1.0); + + let defaultZoom = 1.5; + let context = Cu.createLoadContext(); + let cps2 = Cc["@mozilla.org/content-pref/service;1"].getService( + Ci.nsIContentPrefService2 + ); + let { promise, resolve, reject } = Promise.withResolvers(); + cps2.setGlobal(FullZoom.name, defaultZoom, context, { + handleError(error) { + reject(error); + }, + handleCompletion() { + resolve(); + }, + }); + await promise; + try { + await runTest(defaultZoom); + } finally { + cps2.removeGlobal(FullZoom.name, context); + } }); diff -Nru thunderbird-140.5.0esr/browser/components/sidebar/sidebar-history.mjs thunderbird-140.6.0esr/browser/components/sidebar/sidebar-history.mjs --- thunderbird-140.5.0esr/browser/components/sidebar/sidebar-history.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/sidebar/sidebar-history.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -16,6 +16,7 @@ ChromeUtils.defineESModuleGetters(lazy, { HistoryController: "resource:///modules/HistoryController.sys.mjs", + PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", Sanitizer: "resource:///modules/Sanitizer.sys.mjs", }); @@ -72,6 +73,10 @@ if (!this.triggerNode) { e.preventDefault(); } + let privateWindowMenuItem = this._contextMenu.querySelector( + "#sidebar-history-context-open-in-private-window" + ); + privateWindowMenuItem.hidden = !lazy.PrivateBrowsingUtils.enabled; } handleCommandEvent(e) { diff -Nru thunderbird-140.5.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs thunderbird-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs --- thunderbird-140.5.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -4,6 +4,7 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { + PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", SyncedTabsController: "resource:///modules/SyncedTabsController.sys.mjs", }); @@ -75,6 +76,11 @@ ); // Enable the feature only if the device supports it closeTabMenuItem.disabled = !this.triggerNode.canClose; + + let privateWindowMenuItem = contextMenu.querySelector( + "#sidebar-synced-tabs-context-open-in-private-window" + ); + privateWindowMenuItem.hidden = !lazy.PrivateBrowsingUtils.enabled; } handleCommandEvent(e) { diff -Nru thunderbird-140.5.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs thunderbird-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs --- thunderbird-140.5.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -82,11 +82,6 @@ return null; } - if (suggestion.source == "rust") { - suggestion.icon = suggestion.iconUrl; - delete suggestion.iconUrl; - } - // Set UTM params unless they're already defined. This allows remote // settings or Merino to override them if need be. let url = new URL(suggestion.url); @@ -100,6 +95,8 @@ url: url.href, originalUrl: suggestion.url, shouldShowUrl: true, + // Rust uses `iconUrl` but Merino uses `icon`. + icon: suggestion.iconUrl ?? suggestion.icon, title: suggestion.title, description: suggestion.description, bottomTextL10n: { id: "firefox-suggest-addons-recommended" }, diff -Nru thunderbird-140.5.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs --- thunderbird-140.5.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -943,8 +943,10 @@ source = "rust", provider = "Yelp", isTopPick = false, - // The default Yelp suggestedIndex is 0, unlike most other Suggest - // suggestion types, which use -1. + // The logic for the default Yelp `suggestedIndex` is complex and depends on + // whether `UrlbarProviderSearchSuggestions` is active and whether search + // suggestions are shown first. By default -- when the answer to both of + // those questions is Yes -- Yelp's `suggestedIndex` is 0. suggestedIndex = 0, isSuggestedIndexRelativeToGroup = true, originalUrl = undefined, diff -Nru thunderbird-140.5.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js --- thunderbird-140.5.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js 2025-12-09 01:27:11.000000000 +0000 @@ -263,10 +263,16 @@ "quicksuggest-dismissals-changed" ); + let actualResult = await getActualResult({ + providers: [UrlbarProviderQuickSuggest.name], + query: queriesForDismissals[0].query, + expectedResult: result, + }); + triggerCommand({ - result, command, feature, + result: actualResult, expectedCountsByCall: { removeResult: 1, }, @@ -280,7 +286,7 @@ "canClearDismissedSuggestions should return true after triggering command" ); Assert.ok( - await QuickSuggest.isResultDismissed(result), + await QuickSuggest.isResultDismissed(actualResult), "The result should be dismissed" ); @@ -374,10 +380,16 @@ "quicksuggest-dismissals-changed" ); + let actualResult = await getActualResult({ + providers: [UrlbarProviderQuickSuggest.name], + query: queries[0].query, + expectedResult: result, + }); + triggerCommand({ - result, command, feature, + result: actualResult, expectedCountsByCall: { removeResult: 1, }, @@ -443,6 +455,44 @@ } /** + * Does a search, asserts an actual result exists that matches the given result, + * and returns it. + * + * @param {object} options + * Options object. + * @param {SuggestFeature} options.query + * The search string. + * @param {UrlbarResult} options.expectedResult + * The expected result. + * @param {string[]} [options.providers] + * The providers to query. + */ +async function getActualResult({ + query, + expectedResult, + providers = [UrlbarProviderQuickSuggest.name], +}) { + info("Doing search to get an actual result: " + JSON.stringify(query)); + let context = createContext(query, { + providers, + isPrivate: false, + }); + await check_results({ + context, + matches: [expectedResult], + }); + + let actualResult = context.results.find( + r => + r.providerName == UrlbarProviderQuickSuggest.name && + r.payload.provider == expectedResult.payload.provider + ); + Assert.ok(actualResult, "Search should have returned a matching result"); + + return actualResult; +} + +/** * Does some "show less frequently" tests where the cap is set in remote * settings and Nimbus. See `doOneShowLessFrequentlyTest()`. This function * assumes the matching behavior implemented by the given `SuggestFeature` is diff -Nru thunderbird-140.5.0esr/browser/config/mozconfigs/win32/mingwclang thunderbird-140.6.0esr/browser/config/mozconfigs/win32/mingwclang --- thunderbird-140.5.0esr/browser/config/mozconfigs/win32/mingwclang 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/config/mozconfigs/win32/mingwclang 2025-12-09 01:27:11.000000000 +0000 @@ -34,6 +34,7 @@ ac_add_options --disable-update-agent # Bug 1561797 ac_add_options --disable-default-browser-agent # Relies on toast notifications which don't build on mingw. ac_add_options --disable-notification-server # Toast notifications don't build on mingw. +ac_add_options --disable-zucchini # Bug 1975960: SEH unavailable in mingwclang on win32 # Find our toolchain HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" diff -Nru thunderbird-140.5.0esr/browser/config/mozconfigs/win64/mingwclang thunderbird-140.6.0esr/browser/config/mozconfigs/win64/mingwclang --- thunderbird-140.5.0esr/browser/config/mozconfigs/win64/mingwclang 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/config/mozconfigs/win64/mingwclang 2025-12-09 01:27:11.000000000 +0000 @@ -34,6 +34,7 @@ ac_add_options --disable-update-agent # Bug 1561797 ac_add_options --disable-default-browser-agent # Relies on toast notifications which don't build on mingw. ac_add_options --disable-notification-server # Toast notifications don't build on mingw. +ac_add_options --disable-zucchini # Bug 1975960: SEH unavailable in mingwclang on win32, disable on win64 for parity # Find our toolchain HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" diff -Nru thunderbird-140.5.0esr/browser/config/version.txt thunderbird-140.6.0esr/browser/config/version.txt --- thunderbird-140.5.0esr/browser/config/version.txt 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/config/version.txt 2025-12-09 01:27:11.000000000 +0000 @@ -1 +1 @@ -140.5.0 +140.6.0 diff -Nru thunderbird-140.5.0esr/browser/config/version_display.txt thunderbird-140.6.0esr/browser/config/version_display.txt --- thunderbird-140.5.0esr/browser/config/version_display.txt 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/config/version_display.txt 2025-12-09 01:27:11.000000000 +0000 @@ -1 +1 @@ -140.5.0esr +140.6.0esr diff -Nru thunderbird-140.5.0esr/browser/extensions/webcompat/data/interventions.json thunderbird-140.6.0esr/browser/extensions/webcompat/data/interventions.json --- thunderbird-140.5.0esr/browser/extensions/webcompat/data/interventions.json 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/extensions/webcompat/data/interventions.json 2025-12-09 01:27:11.000000000 +0000 @@ -3332,7 +3332,10 @@ "interventions": [ { "platforms": ["all"], - "ua_string": ["Chrome", "add_Firefox_as_Gecko"] + "content_scripts": { + "js": ["bug1950282-f1tv.formula1.com-unblock-firefox.js"] + }, + "ua_string": ["Chrome"] }, { "platforms": ["linux"], @@ -3695,5 +3698,32 @@ "ua_string": ["Chrome", "add_Firefox_as_Gecko"] } ] + }, + "1996823": { + "label": "rogers.com and fido.ca", + "bugs": { + "1996823": { + "issue": "page-fails-to-load", + "matches": [ + "*://www.rogers.com/bbapp/bbapi.js*", + "*://www.fido.ca/bbapp/bbapi.js*" + ] + } + }, + "interventions": [ + { + "platforms": ["all"], + "replace_string_in_request": [ + { + "find": "window\\.location\\.href = link;", + "replace": "let url = new URL(window.location.href); url.hash = link; window.location.href = url.href;", + "urls": [ + "*://www.rogers.com/bbapp/bbapi.js*", + "*://www.fido.ca/bbapp/bbapi.js*" + ] + } + ] + } + ] } } diff -Nru thunderbird-140.5.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js thunderbird-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js --- thunderbird-140.5.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js 2025-12-09 01:27:11.000000000 +0000 @@ -0,0 +1,122 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +/** + * Bug 1950282 - UA spoof for f1tv.formula1.com + * + * This site is deliberately blocking Firefox, possibly due to bug 1992579. + */ + +/* globals cloneInto, exportFunction */ + +console.info( + "The window environment is being altered for compatibility reasons. If you're a web developer working on this site, please get in touch with developer-outreach@mozilla.com. See https://bugzilla.mozilla.org/show_bug.cgi?id=1950282 for details." +); + +delete window.wrappedJSObject.InstallTrigger; +delete window.wrappedJSObject.mozInnerScreenX; +delete window.wrappedJSObject.mozInnerScreenY; +delete window.wrappedJSObject.MozConsentBanner; + +const nav = Object.getPrototypeOf(navigator.wrappedJSObject); +const vendor = Object.getOwnPropertyDescriptor(nav, "vendor"); +vendor.get = exportFunction(() => "Google Inc.", window); +Object.defineProperty(nav, "vendor", vendor); + +const css = CSS.wrappedJSObject; +const supports = Object.getOwnPropertyDescriptor(css, "supports"); +const oldSupports = supports.value; +supports.value = exportFunction(function (query) { + if (query.includes("moz-")) { + return false; + } + return oldSupports.call(this, query); +}, window); +Object.defineProperty(css, "supports", supports); + +function generateTimeStamp(base, factor = 10) { + if (base) { + // increase another timestamp by a little + return (base + Math.random() * factor).toString().substr(0, 14); + } + const r = Math.random().toString(); + const d10 = `1${r.substr(5, 9)}`; + const d3 = r.substr(2, 3); + return parseFloat(`${d10}.${d3}`); +} + +const startLoadTime = generateTimeStamp(); +const commitLoadTime = generateTimeStamp(startLoadTime); +const firstPaintTime = generateTimeStamp(commitLoadTime); +const finishDocumentLoadTime = generateTimeStamp(firstPaintTime); +const finishLoadTime = generateTimeStamp(finishDocumentLoadTime); + +const csi = cloneInto( + { + onloadT: parseInt(finishDocumentLoadTime * 100), + pageT: generateTimeStamp().toString().substr(-11), + startE: parseInt(parseFloat(startLoadTime * 100)), + tran: 10 + parseInt(4 + Math.random() * 4), + }, + window +); + +const loadTimes = cloneInto( + { + commitLoadTime, + connectionInfo: "h3", + finishDocumentLoadTime, + finishLoadTime, + firstPaintAfterLoadTime: 0, + firstPaintTime, + navigationType: "Other", + npnNegotiatedProtocol: "h3", + requestTime: startLoadTime, + startLoadTime, + wasAlternateProtocolAvailable: false, + wasFetchedViaSpdy: true, + wasNpnNegotiated: true, + }, + window +); + +window.wrappedJSObject.chrome = cloneInto( + { + app: { + InstallState: { + DISABLED: "disabled", + INSTALLED: "installed", + NOT_INSTALLED: "not_installed", + }, + RunningState: { + CANNOT_RUN: "cannot_run", + READY_TO_RUN: "ready_to_run", + RUNNING: "running", + }, + getDetails() { + return null; + }, + getIsInstalled() { + return false; + }, + installState() { + return undefined; + }, + isInstalled: false, + runningState() { + return window.chrome.app.InstallState.NOT_INSTALLED; + }, + }, + csi() { + return csi; + }, + loadTimes() { + return loadTimes; + }, + }, + window, + { cloneFunctions: true } +); diff -Nru thunderbird-140.5.0esr/browser/extensions/webcompat/manifest.json thunderbird-140.6.0esr/browser/extensions/webcompat/manifest.json --- thunderbird-140.5.0esr/browser/extensions/webcompat/manifest.json 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/extensions/webcompat/manifest.json 2025-12-09 01:27:11.000000000 +0000 @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Web Compatibility Interventions", "description": "Urgent post-release fixes for web compatibility.", - "version": "140.8.0", + "version": "140.11.0", "browser_specific_settings": { "gecko": { "id": "webcompat@mozilla.org", diff -Nru thunderbird-140.5.0esr/browser/locales/en-US/browser/permissions.ftl thunderbird-140.6.0esr/browser/locales/en-US/browser/permissions.ftl --- thunderbird-140.5.0esr/browser/locales/en-US/browser/permissions.ftl 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/browser/locales/en-US/browser/permissions.ftl 2025-12-09 01:27:11.000000000 +0000 @@ -0,0 +1,5 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +perm-persistent-storage-remember = Remember this decision diff -Nru thunderbird-140.5.0esr/browser/locales/l10n-changesets.json thunderbird-140.6.0esr/browser/locales/l10n-changesets.json --- thunderbird-140.5.0esr/browser/locales/l10n-changesets.json 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/locales/l10n-changesets.json 2025-12-09 01:27:11.000000000 +0000 @@ -17,7 +17,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "af": { "pin": false, @@ -37,7 +37,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "an": { "pin": false, @@ -57,7 +57,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ar": { "pin": false, @@ -77,7 +77,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ast": { "pin": false, @@ -97,7 +97,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "az": { "pin": false, @@ -117,7 +117,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "be": { "pin": false, @@ -137,7 +137,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bg": { "pin": false, @@ -157,7 +157,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bn": { "pin": false, @@ -177,7 +177,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "br": { "pin": false, @@ -197,7 +197,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bs": { "pin": false, @@ -217,7 +217,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ca": { "pin": false, @@ -237,7 +237,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ca-valencia": { "pin": false, @@ -257,7 +257,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cak": { "pin": false, @@ -277,7 +277,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cs": { "pin": false, @@ -297,7 +297,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cy": { "pin": false, @@ -317,7 +317,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "da": { "pin": false, @@ -337,7 +337,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "de": { "pin": false, @@ -357,7 +357,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "dsb": { "pin": false, @@ -377,7 +377,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "el": { "pin": false, @@ -397,7 +397,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "en-CA": { "pin": false, @@ -417,7 +417,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "en-GB": { "pin": false, @@ -437,7 +437,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "eo": { "pin": false, @@ -457,7 +457,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-AR": { "pin": false, @@ -477,7 +477,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-CL": { "pin": false, @@ -497,7 +497,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-ES": { "pin": false, @@ -517,7 +517,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-MX": { "pin": false, @@ -537,7 +537,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "et": { "pin": false, @@ -557,7 +557,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "eu": { "pin": false, @@ -577,7 +577,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fa": { "pin": false, @@ -597,7 +597,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ff": { "pin": false, @@ -617,7 +617,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fi": { "pin": false, @@ -637,7 +637,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fr": { "pin": false, @@ -657,7 +657,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fur": { "pin": false, @@ -677,7 +677,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fy-NL": { "pin": false, @@ -697,7 +697,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ga-IE": { "pin": false, @@ -717,7 +717,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gd": { "pin": false, @@ -737,7 +737,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gl": { "pin": false, @@ -757,7 +757,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gn": { "pin": false, @@ -777,7 +777,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gu-IN": { "pin": false, @@ -797,7 +797,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "he": { "pin": false, @@ -817,7 +817,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hi-IN": { "pin": false, @@ -837,7 +837,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hr": { "pin": false, @@ -857,7 +857,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hsb": { "pin": false, @@ -877,7 +877,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hu": { "pin": false, @@ -897,7 +897,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hy-AM": { "pin": false, @@ -917,7 +917,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ia": { "pin": false, @@ -937,7 +937,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "id": { "pin": false, @@ -957,7 +957,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "is": { "pin": false, @@ -977,7 +977,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "it": { "pin": false, @@ -997,7 +997,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ja": { "pin": false, @@ -1015,7 +1015,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ja-JP-mac": { "pin": false, @@ -1023,7 +1023,7 @@ "macosx64", "macosx64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ka": { "pin": false, @@ -1043,7 +1043,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kab": { "pin": false, @@ -1063,7 +1063,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kk": { "pin": false, @@ -1083,7 +1083,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "km": { "pin": false, @@ -1103,7 +1103,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kn": { "pin": false, @@ -1123,7 +1123,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ko": { "pin": false, @@ -1143,7 +1143,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lij": { "pin": false, @@ -1163,7 +1163,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lt": { "pin": false, @@ -1183,7 +1183,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lv": { "pin": false, @@ -1203,7 +1203,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "mk": { "pin": false, @@ -1223,7 +1223,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "mr": { "pin": false, @@ -1243,7 +1243,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ms": { "pin": false, @@ -1263,7 +1263,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "my": { "pin": false, @@ -1283,7 +1283,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nb-NO": { "pin": false, @@ -1303,7 +1303,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ne-NP": { "pin": false, @@ -1323,7 +1323,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nl": { "pin": false, @@ -1343,7 +1343,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nn-NO": { "pin": false, @@ -1363,7 +1363,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "oc": { "pin": false, @@ -1383,7 +1383,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pa-IN": { "pin": false, @@ -1403,7 +1403,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pl": { "pin": false, @@ -1423,7 +1423,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pt-BR": { "pin": false, @@ -1443,7 +1443,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pt-PT": { "pin": false, @@ -1463,7 +1463,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "rm": { "pin": false, @@ -1483,7 +1483,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ro": { "pin": false, @@ -1503,7 +1503,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ru": { "pin": false, @@ -1523,7 +1523,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sat": { "pin": false, @@ -1543,7 +1543,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sc": { "pin": false, @@ -1563,7 +1563,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sco": { "pin": false, @@ -1583,7 +1583,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "si": { "pin": false, @@ -1603,7 +1603,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sk": { "pin": false, @@ -1623,7 +1623,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "skr": { "pin": false, @@ -1643,7 +1643,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sl": { "pin": false, @@ -1663,7 +1663,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "son": { "pin": false, @@ -1683,7 +1683,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sq": { "pin": false, @@ -1703,7 +1703,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sr": { "pin": false, @@ -1723,7 +1723,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sv-SE": { "pin": false, @@ -1743,7 +1743,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "szl": { "pin": false, @@ -1763,7 +1763,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ta": { "pin": false, @@ -1783,7 +1783,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "te": { "pin": false, @@ -1803,7 +1803,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tg": { "pin": false, @@ -1823,7 +1823,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "th": { "pin": false, @@ -1843,7 +1843,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tl": { "pin": false, @@ -1863,7 +1863,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tr": { "pin": false, @@ -1883,7 +1883,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "trs": { "pin": false, @@ -1903,7 +1903,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "uk": { "pin": false, @@ -1923,7 +1923,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ur": { "pin": false, @@ -1943,7 +1943,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "uz": { "pin": false, @@ -1963,7 +1963,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "vi": { "pin": false, @@ -1983,7 +1983,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "xh": { "pin": false, @@ -2003,7 +2003,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "zh-CN": { "pin": false, @@ -2023,7 +2023,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "zh-TW": { "pin": false, @@ -2043,6 +2043,6 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" } } \ No newline at end of file diff -Nru thunderbird-140.5.0esr/browser/modules/PermissionUI.sys.mjs thunderbird-140.6.0esr/browser/modules/PermissionUI.sys.mjs --- thunderbird-140.5.0esr/browser/modules/PermissionUI.sys.mjs 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/browser/modules/PermissionUI.sys.mjs 2025-12-09 01:27:11.000000000 +0000 @@ -99,6 +99,10 @@ ); }); +ChromeUtils.defineLazyGetter(lazy, "gFluentStrings", function () { + return new Localization(["browser/permissions.ftl"], true /* aSync */); +}); + import { SITEPERMS_ADDON_PROVIDER_PREF } from "resource://gre/modules/addons/siteperms-addon-utils.sys.mjs"; XPCOMUtils.defineLazyPreferenceGetter( @@ -1167,11 +1171,25 @@ let learnMoreURL = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions"; - return { + let options = { learnMoreURL, displayURI: false, name: this.getPrincipalName(), }; + + options.checkbox = { + show: !lazy.PrivateBrowsingUtils.isWindowPrivate( + this.browser.ownerGlobal + ), + }; + + if (options.checkbox.show) { + options.checkbox.label = lazy.gFluentStrings.formatValueSync( + "perm-persistent-storage-remember" + ); + } + + return options; } get notificationID() { diff -Nru thunderbird-140.5.0esr/build/moz.configure/update-programs.configure thunderbird-140.6.0esr/build/moz.configure/update-programs.configure --- thunderbird-140.5.0esr/build/moz.configure/update-programs.configure 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/build/moz.configure/update-programs.configure 2025-12-09 01:27:11.000000000 +0000 @@ -264,3 +264,46 @@ ) set_config("MOZ_NOTIFICATION_SERVER", True, when="--enable-notification-server") + +# Supported patch formats for the updater +# ======================================= + + +@depends(target, when="--enable-updater") +def zucchini_is_available(target): + # Desktop Linux, macOS or Windows: we exclude Android by checking for GNU. + return (target.os, target.kernel) == ("GNU", "Linux") or target.os in ( + "OSX", + "WINNT", + ) + + +with only_when(~zucchini_is_available): + set_config("MOZ_BSPATCH", True, when="--enable-updater") + set_define("MOZ_BSPATCH", True, when="--enable-updater") + + +with only_when(zucchini_is_available): + option( + "--disable-bspatch", + help="Disable bspatch support", + ) + + set_config("MOZ_BSPATCH", True, when="--enable-bspatch") + set_define("MOZ_BSPATCH", True, when="--enable-bspatch") + + option( + "--disable-zucchini", + help="Disable zucchini support", + ) + + set_config("MOZ_ZUCCHINI", True, when="--enable-zucchini") + set_define("MOZ_ZUCCHINI", True, when="--enable-zucchini") + + @depends("--enable-bspatch", "--enable-zucchini") + def check_at_least_one_patch_format(bspatch, zucchini): + if not bspatch and not zucchini: + die( + "You must enable at least one patch format when --enable-updater " + "is used. Use --enable-bspatch or --enable-zucchini." + ) diff -Nru thunderbird-140.5.0esr/comm/.gecko_rev.yml thunderbird-140.6.0esr/comm/.gecko_rev.yml --- thunderbird-140.5.0esr/comm/.gecko_rev.yml 2025-11-08 04:45:27.000000000 +0000 +++ thunderbird-140.6.0esr/comm/.gecko_rev.yml 2025-12-09 01:27:42.000000000 +0000 @@ -1,8 +1,8 @@ --- GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-esr140 -GECKO_HEAD_REF: FIREFOX_140_5_0esr_BUILD2 -GECKO_HEAD_REV: 558705980ca9db16de0564b5a6031b5d6e0a7efe +GECKO_HEAD_REF: FIREFOX_140_6_0esr_BUILD1 +GECKO_HEAD_REV: 18556c0b079c839f4d15597a57b0f048fdadcedd ###### ### For comm-central diff -Nru thunderbird-140.5.0esr/comm/mail/config/version.txt thunderbird-140.6.0esr/comm/mail/config/version.txt --- thunderbird-140.5.0esr/comm/mail/config/version.txt 2025-11-08 04:45:27.000000000 +0000 +++ thunderbird-140.6.0esr/comm/mail/config/version.txt 2025-12-09 01:27:42.000000000 +0000 @@ -1 +1 @@ -140.5.0 +140.6.0 diff -Nru thunderbird-140.5.0esr/comm/mail/config/version_display.txt thunderbird-140.6.0esr/comm/mail/config/version_display.txt --- thunderbird-140.5.0esr/comm/mail/config/version_display.txt 2025-11-08 04:45:27.000000000 +0000 +++ thunderbird-140.6.0esr/comm/mail/config/version_display.txt 2025-12-09 01:27:42.000000000 +0000 @@ -1 +1 @@ -140.5.0esr +140.6.0esr diff -Nru thunderbird-140.5.0esr/comm/taskcluster/kinds/release-msix-push/kind.yml thunderbird-140.6.0esr/comm/taskcluster/kinds/release-msix-push/kind.yml --- thunderbird-140.5.0esr/comm/taskcluster/kinds/release-msix-push/kind.yml 2025-11-08 04:45:27.000000000 +0000 +++ thunderbird-140.6.0esr/comm/taskcluster/kinds/release-msix-push/kind.yml 2025-12-09 01:27:43.000000000 +0000 @@ -10,14 +10,14 @@ - gecko_taskgraph.transforms.release_msix_push:transforms - gecko_taskgraph.transforms.task:transforms -kind-dependencies: - - repackage-shippable-l10n-msix +#kind-dependencies: +# - repackage-shippable-l10n-msix task-defaults: description: Pushes msix archives to Microsoft Store run-on-projects: [] # to make sure this never runs as part of CI - run-on-releases: [esr140] - shipping-phase: ship # note override in transform +# run-on-releases: [beta, release, esr140] +# shipping-phase: ship # note override in transform treeherder: platform: win32-shippable/opt kind: build @@ -30,14 +30,14 @@ implementation: push-msix channel: by-release-type: - esr140: release + beta.*: beta + release.*: release + esr140: esr default: mock - publish-mode: - by-release-type: - esr140: Manual + publish-mode: Manual -tasks: - thunderbird: - shipping-product: thunderbird - treeherder: - symbol: MSIX(push) +#tasks: +# thunderbird: +# shipping-product: thunderbird +# treeherder: +# symbol: MSIX(push) diff -Nru thunderbird-140.5.0esr/comm/taskcluster/kinds/repackage-msix/kind.yml thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-msix/kind.yml --- thunderbird-140.5.0esr/comm/taskcluster/kinds/repackage-msix/kind.yml 2025-11-08 04:45:28.000000000 +0000 +++ thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-msix/kind.yml 2025-12-09 01:27:43.000000000 +0000 @@ -56,7 +56,7 @@ by-release-type: beta.*: beta release.*: official - esr.*: official + esr.*: esr default: nightly identity-name: by-package-format: @@ -69,7 +69,7 @@ msix-store: by-release-type: beta.*: ThunderbirdBeta - release.*: MZLA + release.*: MozillaThunderbirdRelease esr.*: MZLA default: ThunderbirdDaily publisher: diff -Nru thunderbird-140.5.0esr/comm/taskcluster/kinds/repackage-shippable-l10n-msix/kind.yml thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-shippable-l10n-msix/kind.yml --- thunderbird-140.5.0esr/comm/taskcluster/kinds/repackage-shippable-l10n-msix/kind.yml 2025-11-08 04:45:27.000000000 +0000 +++ thunderbird-140.6.0esr/comm/taskcluster/kinds/repackage-shippable-l10n-msix/kind.yml 2025-12-09 01:27:43.000000000 +0000 @@ -59,7 +59,7 @@ by-release-type: beta.*: beta release.*: official - esr.*: official + esr.*: esr default: nightly identity-name: by-package-format: @@ -72,7 +72,7 @@ msix-store: by-release-type: beta.*: ThunderbirdBeta - release.*: MZLA + release.*: MozillaThunderbirdRelease esr.*: MZLA default: ThunderbirdDaily publisher: diff -Nru thunderbird-140.5.0esr/config/milestone.txt thunderbird-140.6.0esr/config/milestone.txt --- thunderbird-140.5.0esr/config/milestone.txt 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/config/milestone.txt 2025-12-09 01:27:11.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -140.5.0 +140.6.0 diff -Nru thunderbird-140.5.0esr/debian/changelog thunderbird-140.6.0esr/debian/changelog --- thunderbird-140.5.0esr/debian/changelog 2025-11-14 17:40:38.000000000 +0000 +++ thunderbird-140.6.0esr/debian/changelog 2025-12-11 09:46:52.000000000 +0000 @@ -1,3 +1,36 @@ +thunderbird (1:140.6.0esr-1~deb13u1) trixie-security; urgency=medium + + * Rebuild for trixie-security + + -- Christoph Goehre Thu, 11 Dec 2025 10:46:52 +0100 + +thunderbird (1:140.6.0esr-1) unstable; urgency=medium + + [ Carsten Schoenert ] + * [6956481] Rebuild patch queue from patch-queue branch. + Added patch: + debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch + (Closes: #1115859) + + [ Christoph Goehre ] + * [f9ca412] New upstream version 140.6.0esr + Fixed CVE issues in upstream version 140.6 (MFSA 2025-96): + CVE-2025-14321: Use-after-free in the WebRTC: Signaling component + CVE-2025-14322: Sandbox escape due to incorrect boundary conditions in the + Graphics: CanvasWebGL component + CVE-2025-14323: Privilege escalation in the DOM: Notifications component + CVE-2025-14324: JIT miscompilation in the JavaScript Engine: JIT component + CVE-2025-14325: JIT miscompilation in the JavaScript Engine: JIT component + CVE-2025-14328: Privilege escalation in the Netmonitor component + CVE-2025-14329: Privilege escalation in the Netmonitor component + CVE-2025-14330: JIT miscompilation in the JavaScript Engine: JIT component + CVE-2025-14331: Same-origin policy bypass in the Request Handling + component + CVE-2025-14333: Memory safety bugs fixed in Firefox ESR 140.6, Thunderbird + ESR 140.6, Firefox 146 and Thunderbird 146 + + -- Christoph Goehre Thu, 11 Dec 2025 10:07:20 +0100 + thunderbird (1:140.5.0esr-1~deb13u1) trixie-security; urgency=medium * Rebuild for trixie-security diff -Nru thunderbird-140.5.0esr/debian/patches/debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch thunderbird-140.6.0esr/debian/patches/debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch --- thunderbird-140.5.0esr/debian/patches/debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/debian/patches/debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch 2025-12-11 09:46:52.000000000 +0000 @@ -0,0 +1,27 @@ +From: Carsten Schoenert +Date: Fri, 28 Nov 2025 17:50:31 +0200 +Subject: all-thunderbird.js: Append "esr" to "%VERSION%" variable + +The ESR series is missing the string "esr" in the concatenated URL that +is pointing to the release notes of the used version. So this patch is +basically only relevant for the ESR versions and not for Beta, non ESR +candidates and release versions. + +Forwarded: not-needed +--- + comm/mail/app/profile/all-thunderbird.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/comm/mail/app/profile/all-thunderbird.js b/comm/mail/app/profile/all-thunderbird.js +index 5d4e4e5..ee6702c 100644 +--- a/comm/mail/app/profile/all-thunderbird.js ++++ b/comm/mail/app/profile/all-thunderbird.js +@@ -150,7 +150,7 @@ pref("app.update.langpack.enabled", true); + #endif + + // Release notes URL +-pref("app.releaseNotesURL", "https://live.thunderbird.net/%APP%/releasenotes?locale=%LOCALE%&version=%VERSION%&channel=%CHANNEL%&os=%OS%&buildid=%APPBUILDID%"); ++pref("app.releaseNotesURL", "https://live.thunderbird.net/%APP%/releasenotes?locale=%LOCALE%&version=%VERSION%esr&channel=%CHANNEL%&os=%OS%&buildid=%APPBUILDID%"); + + #ifdef XP_MACOSX + // If set to true, Thunderbird will automatically restart if it is left diff -Nru thunderbird-140.5.0esr/debian/patches/porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch thunderbird-140.6.0esr/debian/patches/porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch --- thunderbird-140.5.0esr/debian/patches/porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch 2025-11-14 17:40:38.000000000 +0000 +++ thunderbird-140.6.0esr/debian/patches/porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch 2025-12-11 09:46:52.000000000 +0000 @@ -7,20 +7,23 @@ Forwarded: not-needed --- - comm/third_party/botan/src/build-data/arch/loongarch64.txt | 3 +++ - comm/third_party/botan/src/build-data/detect_arch.cpp | 3 +++ - 2 files changed, 6 insertions(+) - create mode 100644 comm/third_party/botan/src/build-data/arch/loongarch64.txt + .../botan/src/build-data/arch/{riscv64.txt => loongarch64.txt} | 2 +- + comm/third_party/botan/src/build-data/detect_arch.cpp | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + copy comm/third_party/botan/src/build-data/arch/{riscv64.txt => loongarch64.txt} (60%) -diff --git a/comm/third_party/botan/src/build-data/arch/loongarch64.txt b/comm/third_party/botan/src/build-data/arch/loongarch64.txt -new file mode 100644 -index 0000000..e386477 ---- /dev/null +diff --git a/comm/third_party/botan/src/build-data/arch/riscv64.txt b/comm/third_party/botan/src/build-data/arch/loongarch64.txt +similarity index 60% +copy from comm/third_party/botan/src/build-data/arch/riscv64.txt +copy to comm/third_party/botan/src/build-data/arch/loongarch64.txt +index 8aa90ed..e386477 100644 +--- a/comm/third_party/botan/src/build-data/arch/riscv64.txt +++ b/comm/third_party/botan/src/build-data/arch/loongarch64.txt -@@ -0,0 +1,3 @@ +@@ -1,3 +1,3 @@ +-family riscv +family loongarch -+endian little -+wordsize 64 + endian little + wordsize 64 diff --git a/comm/third_party/botan/src/build-data/detect_arch.cpp b/comm/third_party/botan/src/build-data/detect_arch.cpp index 4de5892..bf3571d 100644 --- a/comm/third_party/botan/src/build-data/detect_arch.cpp diff -Nru thunderbird-140.5.0esr/debian/patches/prefs/Don-t-auto-disable-extensions-in-system-directories.patch thunderbird-140.6.0esr/debian/patches/prefs/Don-t-auto-disable-extensions-in-system-directories.patch --- thunderbird-140.5.0esr/debian/patches/prefs/Don-t-auto-disable-extensions-in-system-directories.patch 2025-11-14 17:40:38.000000000 +0000 +++ thunderbird-140.6.0esr/debian/patches/prefs/Don-t-auto-disable-extensions-in-system-directories.patch 2025-12-11 09:46:52.000000000 +0000 @@ -7,7 +7,7 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comm/mail/app/profile/all-thunderbird.js b/comm/mail/app/profile/all-thunderbird.js -index d370f4f..939c5fb 100644 +index 7c92789..5d4e4e5 100644 --- a/comm/mail/app/profile/all-thunderbird.js +++ b/comm/mail/app/profile/all-thunderbird.js @@ -222,7 +222,7 @@ pref("extensions.systemAddon.update.enabled", true); // See bug 1462160. diff -Nru thunderbird-140.5.0esr/debian/patches/series thunderbird-140.6.0esr/debian/patches/series --- thunderbird-140.5.0esr/debian/patches/series 2025-11-14 17:40:38.000000000 +0000 +++ thunderbird-140.6.0esr/debian/patches/series 2025-12-11 09:46:52.000000000 +0000 @@ -20,3 +20,4 @@ debian-hacks/Allow-to-override-rust-LTO-flag.patch porting-ppc64el/skia-Adjust-detection-of-ppc64-architecture.patch porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch +debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch diff -Nru thunderbird-140.5.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js thunderbird-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js --- thunderbird-140.5.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2025-12-09 01:27:11.000000000 +0000 @@ -360,6 +360,21 @@ '^\"query=evil^\n\n^\n\ncmd^\\^\" /c timeout /t 3 ^& calc.exe^\n\n^\n\n^\"', "The evil command is escaped properly" ); + + // Control characters https://www.ascii-code.com/characters/control-characters + const containsControlChars = " - \u0007 \u0010 \u0014 \u001B \x1a - "; + is( + CurlUtils.escapeStringWin(containsControlChars), + '^\" - \u0007 \u0010 \u0014 \u001b \u001a - ^\"', + "Control characters should not be escaped with ^." + ); + + const controlCharsWithWhitespaces = " -\tcalc.exe\f- "; + is( + CurlUtils.escapeStringWin(controlCharsWithWhitespaces), + '^\" - calc.exe - ^\"', + "Control (non-printable) characters which are whitespace like charaters e.g (tab & form feed)" + ); } async function createCurlData(selected, getLongString, requestData) { diff -Nru thunderbird-140.5.0esr/devtools/client/shared/curl.js thunderbird-140.6.0esr/devtools/client/shared/curl.js --- thunderbird-140.5.0esr/devtools/client/shared/curl.js 2025-11-08 04:44:55.000000000 +0000 +++ thunderbird-140.6.0esr/devtools/client/shared/curl.js 2025-12-09 01:27:11.000000000 +0000 @@ -463,7 +463,9 @@ // Then escape all characters we are not sure about with ^ to ensure it // gets to MS Crt parser safely. - .replace(/[^a-zA-Z0-9\s_\-:=+~\/.',?;()*`]/g, "^$&") + // Note: Also do not escape unicode control (C) non-printable characters + // https://www.compart.com/en/unicode/category (this is captured with `\p{C}` and the `u` unicode flag) + .replace(/[^-a-zA-Z0-9\s_:=+~\/.',?;()*`\p{C}]/gu, "^$&") // The % character is special because MS Crt parser will try and look for // ENV variables and fill them in its place. We cannot escape them with % @@ -474,6 +476,14 @@ // by the previous replace. .replace(/%(?=[a-zA-Z0-9_])/g, "%^") + // All other whitespace characters are replaced with a single space, as there + // is no way to enter their literal values in a command line, and they do break + // the command allowing for injection. + // Since want to keep line breaks, we need to exclude them in the regex (`[^\r\n]`), + // and use double negations to get the other whitespace chars (`[^\S]` translates + // to "not not whitespace") + .replace(/[^\S\r\n]/g, " ") + // Lastly we replace new lines with ^ and TWO new lines because the first // new line is there to enact the escape command the second is the character // to escape (in this case new line). diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/chrome.toml thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/chrome.toml 2025-11-08 04:44:56.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml 2025-12-09 01:27:12.000000000 +0000 @@ -2,18 +2,25 @@ support-files = [ "external_importMap.js", "insert_a_base_element.js", + "module_1979050.mjs", "module_simpleImportMap.mjs", "module_simpleImportMap_dir.mjs", "module_simpleImportMap_remap.mjs", "module_simpleImportMap_remap_https.mjs", "module_simpleExport.mjs", "module_sortedImportMap.mjs", + "scope1/module_1979050.mjs", "scope1/module_simpleExport.mjs", "scope1/module_simpleImportMap.mjs", + "scope1/scope2/module_1979050.mjs", "scope1/scope2/module_simpleExport.mjs", "scope1/scope2/module_simpleImportMap.mjs", ] +["test_1979050.html"] + +["test_1979050_2.html"] + ["test_dynamic_import_reject_importMap.html"] ["test_externalImportMap.html"] diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs 2025-12-09 01:27:12.000000000 +0000 @@ -0,0 +1,3 @@ +import { x } from "./module_simpleExport.mjs"; + +result = x; diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs 2025-12-09 01:27:12.000000000 +0000 @@ -0,0 +1,5 @@ +import { x } from "./module_simpleExport.mjs"; + +result2 = x; + +export let y = x; diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs 2025-12-09 01:27:12.000000000 +0000 @@ -0,0 +1,5 @@ +import { x } from "./module_simpleExport.mjs"; + +result3 = x; + +export let z = x; diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html 2025-12-09 01:27:11.000000000 +0000 @@ -0,0 +1,50 @@ + + +Test bug 1979050 + + + + + + + + + + diff -Nru thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html --- thunderbird-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html 2025-12-09 01:27:11.000000000 +0000 @@ -0,0 +1,69 @@ + + +Test bug 1979050 + + + + + + + + + diff -Nru thunderbird-140.5.0esr/dom/canvas/TexUnpackBlob.cpp thunderbird-140.6.0esr/dom/canvas/TexUnpackBlob.cpp --- thunderbird-140.5.0esr/dom/canvas/TexUnpackBlob.cpp 2025-11-08 04:44:56.000000000 +0000 +++ thunderbird-140.6.0esr/dom/canvas/TexUnpackBlob.cpp 2025-12-09 01:27:12.000000000 +0000 @@ -406,7 +406,17 @@ if (!rowLength || !rowCount) return true; - if (srcStride <= 0 || dstStride <= 0) { + auto minSrcStride = + CheckedInt( + WebGLTexelConversions::TexelBytesForFormat(srcFormat)) * + rowLength; + auto minDstStride = + CheckedInt( + WebGLTexelConversions::TexelBytesForFormat(dstFormat)) * + rowLength; + if (srcStride <= 0 || dstStride <= 0 || !minSrcStride.isValid() || + !minDstStride.isValid() || size_t(srcStride) < minSrcStride.value() || + size_t(dstStride) < minDstStride.value()) { webgl->ErrorInvalidOperation("Invalid stride."); return false; } diff -Nru thunderbird-140.5.0esr/dom/media/tools/generateGmpJson.py thunderbird-140.6.0esr/dom/media/tools/generateGmpJson.py --- thunderbird-140.5.0esr/dom/media/tools/generateGmpJson.py 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/dom/media/tools/generateGmpJson.py 2025-12-09 01:27:13.000000000 +0000 @@ -313,7 +313,7 @@ args = parser.parse_args() if args.plugin == "openh264": - url_base = "http://ciscobinary.openh264.org" + url_base = "https://ciscobinary.openh264.org" if args.version is None or args.revision is None: parser.error("openh264 requires version and revision") elif args.plugin == "widevine": diff -Nru thunderbird-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp --- thunderbird-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -12,8 +12,21 @@ #include "js/ArrayBuffer.h" namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_WITH_JS_MEMBERS(RTCEncodedFrameBase, (mGlobal), - (mData)) + +NS_IMPL_CYCLE_COLLECTION_CLASS(RTCEncodedFrameBase) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCEncodedFrameBase) + using ::ImplCycleCollectionUnlink; + tmp->DetachData(); + NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mData) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCEncodedFrameBase) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(RTCEncodedFrameBase) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBERS(mData) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCEncodedFrameBase) @@ -39,11 +52,27 @@ jsapi.cx(), mFrame->GetData().size(), (void*)(mFrame->GetData().data())); } -RTCEncodedFrameBase::~RTCEncodedFrameBase() = default; +RTCEncodedFrameBase::~RTCEncodedFrameBase() { DetachData(); } + +void RTCEncodedFrameBase::DetachData() { + // We might have handled this in unlink already + if (mGlobal) { + AutoJSAPI jsapi; + if (NS_WARN_IF(!jsapi.Init(mGlobal))) { + return; + } + + JS::Rooted rootedData(jsapi.cx(), mData); + if (rootedData) { + JS::DetachArrayBuffer(jsapi.cx(), rootedData); + } + } +} unsigned long RTCEncodedFrameBase::Timestamp() const { return mTimestamp; } void RTCEncodedFrameBase::SetData(const ArrayBuffer& aData) { + DetachData(); mData.set(aData.Obj()); if (mFrame) { aData.ProcessData([&](const Span& aData, JS::AutoCheckCannotGC&&) { @@ -61,12 +90,7 @@ std::unique_ptr RTCEncodedFrameBase::TakeFrame() { - AutoJSAPI jsapi; - if (!jsapi.Init(mGlobal)) { - MOZ_CRASH("Could not init JSAPI!"); - } - JS::Rooted rootedData(jsapi.cx(), mData); - JS::DetachArrayBuffer(jsapi.cx(), rootedData); + DetachData(); return std::move(mFrame); } diff -Nru thunderbird-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h --- thunderbird-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2025-12-09 01:27:13.000000000 +0000 @@ -47,6 +47,8 @@ protected: virtual ~RTCEncodedFrameBase(); + void DetachData(); + RefPtr mGlobal; std::unique_ptr mFrame; const uint64_t mCounter = 0; diff -Nru thunderbird-140.5.0esr/dom/permission/PermissionStatusSink.cpp thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.cpp --- thunderbird-140.5.0esr/dom/permission/PermissionStatusSink.cpp 2025-11-08 04:44:56.000000000 +0000 +++ thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -50,10 +50,26 @@ MutexAutoLock lock(mMutex); - mWorkerRef = WeakWorkerRef::Create( - workerPrivate, [self = RefPtr(this)] { self->Disentangle(); }); + RefPtr workerRef = StrongWorkerRef::Create( + workerPrivate, "PermissionStatusSink", + [self = RefPtr(this)]() { self->Disentangle(); }); + if (NS_WARN_IF(!workerRef)) { + // If WorkerRef creation fails, the Worker has started shutting down. But + // we are on the Worker thread, promise handlers in + // PermissionStatus::Init()/Permissions::Query() can still be dispatched + // to the Worker thread for outer promise rejection. + return PermissionStatePromise::CreateAndReject(NS_ERROR_FAILURE, + __func__); + ; + } + + mWorkerRef = new ThreadSafeWorkerRef(workerRef); } + // On the Worker thread, so the below async function must be executed before + // WorkerRef callback which should also be on the Worker thread. So the above + // created WorkerRef should protect the outer promise handling can be + // dispatched on the Worker thread. return InvokeAsync(GetMainThreadSerialEventTarget(), __func__, [self = RefPtr(this)] { MOZ_ASSERT(!self->mObserver); @@ -101,6 +117,17 @@ void PermissionStatusSink::PermissionChangedOnMainThread() { MOZ_ASSERT(NS_IsMainThread()); + // Nothing to do if Worker had shutted down. + if (!mSerialEventTarget->IsOnCurrentThread()) { + MutexAutoLock lock(mMutex); + if (!mWorkerRef) { + return; + } + } + + // mWorkerRef is not nullptr, it will protect the promise handling can be + // dispatched to the Worker thread, even though the Worker starts shutdown, + // because mWorkerRef is nullify on the main thread. ComputeStateOnMainThread()->Then( mSerialEventTarget, __func__, [self = RefPtr(this)]( @@ -116,17 +143,16 @@ mPermissionStatus = nullptr; - { - MutexAutoLock lock(mMutex); - mWorkerRef = nullptr; - } - NS_DispatchToMainThread( NS_NewRunnableFunction(__func__, [self = RefPtr(this)] { if (self->mObserver) { self->mObserver->RemoveSink(self); self->mObserver = nullptr; } + { + MutexAutoLock lock(self->mMutex); + self->mWorkerRef = nullptr; + } })); } @@ -166,7 +192,7 @@ // If we have mWorkerRef, we haven't received the WorkerRef notification // yet. - WorkerPrivate* workerPrivate = mWorkerRef->GetUnsafePrivate(); + WorkerPrivate* workerPrivate = mWorkerRef->Private(); MOZ_ASSERT(workerPrivate); ancestorWindow = workerPrivate->GetAncestorWindow(); diff -Nru thunderbird-140.5.0esr/dom/permission/PermissionStatusSink.h thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.h --- thunderbird-140.5.0esr/dom/permission/PermissionStatusSink.h 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/dom/permission/PermissionStatusSink.h 2025-12-09 01:27:13.000000000 +0000 @@ -19,7 +19,7 @@ class PermissionObserver; class PermissionStatus; -class WeakWorkerRef; +class ThreadSafeWorkerRef; class PermissionStatusSink { public: @@ -70,7 +70,7 @@ // Protected by mutex. // Created and released on worker-thread. Used also on main-thread. - RefPtr mWorkerRef MOZ_GUARDED_BY(mMutex); + RefPtr mWorkerRef MOZ_GUARDED_BY(mMutex); PermissionName mPermissionName; nsCString mPermissionType; diff -Nru thunderbird-140.5.0esr/dom/webtransport/api/WebTransport.cpp thunderbird-140.6.0esr/dom/webtransport/api/WebTransport.cpp --- thunderbird-140.5.0esr/dom/webtransport/api/WebTransport.cpp 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/dom/webtransport/api/WebTransport.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -277,6 +277,7 @@ PBackgroundChild* backgroundChild = BackgroundChild::GetOrCreateForCurrentThread(); if (NS_WARN_IF(!backgroundChild)) { + aError.Throw(NS_ERROR_FAILURE); return; } @@ -295,9 +296,11 @@ RefPtr child = new WebTransportChild(this); if (NS_IsMainThread()) { if (!childEndpoint.Bind(child)) { + aError.Throw(NS_ERROR_FAILURE); return; } } else if (!childEndpoint.Bind(child, mGlobal->SerialEventTarget())) { + aError.Throw(NS_ERROR_FAILURE); return; } diff -Nru thunderbird-140.5.0esr/editor/libeditor/EditorBase.cpp thunderbird-140.6.0esr/editor/libeditor/EditorBase.cpp --- thunderbird-140.5.0esr/editor/libeditor/EditorBase.cpp 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/editor/libeditor/EditorBase.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -6591,16 +6591,11 @@ mParentData(aEditorBase.mEditActionData), mData(VoidString()), mRawEditAction(aEditAction), - mTopLevelEditSubAction(EditSubAction::eNone), - mAborted(false), - mHasTriedToDispatchBeforeInputEvent(false), - mBeforeInputEventCanceled(false), - mMakeBeforeInputEventNonCancelable(false), - mHasTriedToDispatchClipboardEvent(false), mEditorWasDestroyedDuringHandlingEditAction( mParentData && mParentData->mEditorWasDestroyedDuringHandlingEditAction), - mHandled(false) { + mEditorWasReinitialized(mParentData && + mParentData->mEditorWasReinitialized) { // If we're nested edit action, copies necessary data from the parent. if (mParentData) { mSelection = mParentData->mSelection; diff -Nru thunderbird-140.5.0esr/editor/libeditor/EditorBase.h thunderbird-140.6.0esr/editor/libeditor/EditorBase.h --- thunderbird-140.5.0esr/editor/libeditor/EditorBase.h 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/editor/libeditor/EditorBase.h 2025-12-09 01:27:14.000000000 +0000 @@ -1002,6 +1002,8 @@ AutoEditActionDataSetter(const EditorBase& aEditorBase, EditAction aEditAction, nsIPrincipal* aPrincipal = nullptr); + AutoEditActionDataSetter() = delete; + AutoEditActionDataSetter(const AutoEditActionDataSetter& aOther) = delete; ~AutoEditActionDataSetter(); void SetSelectionCreatedByDoubleclick(bool aSelectionCreatedByDoubleclick) { @@ -1031,11 +1033,11 @@ [[nodiscard]] bool CanHandle() const { #ifdef DEBUG mHasCanHandleChecked = true; -#endif // #ifdefn DEBUG +#endif // #ifdef DEBUG // Don't allow to run new edit action when an edit action caused // destroying the editor while it's being handled. if (mEditAction != EditAction::eInitializing && - mEditorWasDestroyedDuringHandlingEditAction) { + HasEditorDestroyedDuringHandlingEditActionAndNotYetReinitialized()) { NS_WARNING("Editor was destroyed during an edit action being handled"); return false; } @@ -1231,14 +1233,38 @@ // something other unexpected event listeners. In the cases, new child // edit action shouldn't been aborted. mEditorWasDestroyedDuringHandlingEditAction = true; + mEditorWasReinitialized = false; } if (mParentData) { mParentData->OnEditorDestroy(); } } - bool HasEditorDestroyedDuringHandlingEditAction() const { + void OnEditorInitialized() { + if (mEditorWasDestroyedDuringHandlingEditAction) { + mEditorWasReinitialized = true; + } + if (mParentData) { + mParentData->OnEditorInitialized(); + } + } + /** + * Return true if the editor was destroyed at least once while the + * EditAction is being handled. Note that the editor may have already been + * reinitialized even if this returns true. + */ + [[nodiscard]] bool HasEditorDestroyedDuringHandlingEditAction() const { return mEditorWasDestroyedDuringHandlingEditAction; } + /** + * Return true if the editor was destroyed while the EditAction is being + * handled and has not been reinitialized. I.e., the editor is still under + * the destroyed state. + */ + [[nodiscard]] bool + HasEditorDestroyedDuringHandlingEditActionAndNotYetReinitialized() const { + return mEditorWasDestroyedDuringHandlingEditAction && + !mEditorWasReinitialized; + } void SetTopLevelEditSubAction(EditSubAction aEditSubAction, EDirection aDirection = eNone) { @@ -1475,40 +1501,40 @@ // instance's mTopLevelEditSubAction member since it's copied from the // parent instance at construction and it's always cleared before this // won't be overwritten and cleared before destruction. - EditSubAction mTopLevelEditSubAction; + EditSubAction mTopLevelEditSubAction = EditSubAction::eNone; - EDirection mDirectionOfTopLevelEditSubAction; + EDirection mDirectionOfTopLevelEditSubAction = nsIEditor::eNone; - bool mAborted; + bool mAborted = false; // Set to true when this handles "beforeinput" event dispatching. Note // that even if "beforeinput" event shouldn't be dispatched for this, // instance, this is set to true when it's considered. - bool mHasTriedToDispatchBeforeInputEvent; + bool mHasTriedToDispatchBeforeInputEvent = false; // Set to true if "beforeinput" event was dispatched and it's canceled. - bool mBeforeInputEventCanceled; + bool mBeforeInputEventCanceled = false; // Set to true if `beforeinput` event must not be cancelable even if // its inputType is defined as cancelable by the standards. - bool mMakeBeforeInputEventNonCancelable; + bool mMakeBeforeInputEventNonCancelable = false; // Set to true when the edit action handler tries to dispatch a clipboard // event. - bool mHasTriedToDispatchClipboardEvent; + bool mHasTriedToDispatchClipboardEvent = false; // The editor instance may be destroyed once temporarily if `document.write` // etc runs. In such case, we should mark this flag of being handled // edit action. bool mEditorWasDestroyedDuringHandlingEditAction; + // This is set to `true` if the editor was destroyed but now, it's + // initialized again. + bool mEditorWasReinitialized; // This is set before dispatching `input` event and notifying editor // observers. - bool mHandled; + bool mHandled = false; // Whether the editor is dispatching a `beforeinput` or `input` event. bool mDispatchingInputEvent = false; #ifdef DEBUG mutable bool mHasCanHandleChecked = false; #endif // #ifdef DEBUG - - AutoEditActionDataSetter() = delete; - AutoEditActionDataSetter(const AutoEditActionDataSetter& aOther) = delete; }; void UpdateEditActionData(const nsAString& aData) { diff -Nru thunderbird-140.5.0esr/editor/libeditor/HTMLEditor.cpp thunderbird-140.6.0esr/editor/libeditor/HTMLEditor.cpp --- thunderbird-140.5.0esr/editor/libeditor/HTMLEditor.cpp 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/editor/libeditor/HTMLEditor.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -435,6 +435,7 @@ MOZ_ASSERT(!mInitSucceeded, "HTMLEditor::Init() shouldn't be nested"); mInitSucceeded = true; + editActionData.OnEditorInitialized(); return NS_OK; } diff -Nru thunderbird-140.5.0esr/editor/libeditor/TextEditor.cpp thunderbird-140.6.0esr/editor/libeditor/TextEditor.cpp --- thunderbird-140.5.0esr/editor/libeditor/TextEditor.cpp 2025-11-08 04:44:57.000000000 +0000 +++ thunderbird-140.6.0esr/editor/libeditor/TextEditor.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -168,11 +168,12 @@ return NS_ERROR_FAILURE; } - // We set mInitSucceeded here rather than at the end of the function, + // We set the initialized state here rather than at the end of the function, // since InitEditorContentAndSelection() can perform some transactions // and can warn if mInitSucceeded is still false. MOZ_ASSERT(!mInitSucceeded, "TextEditor::Init() shouldn't be nested"); mInitSucceeded = true; + editActionData.OnEditorInitialized(); rv = InitEditorContentAndSelection(); if (NS_FAILED(rv)) { @@ -180,6 +181,7 @@ // XXX Shouldn't we expose `NS_ERROR_EDITOR_DESTROYED` even though this // is a public method? mInitSucceeded = false; + editActionData.OnEditorDestroy(); return EditorBase::ToGenericNSResult(rv); } diff -Nru thunderbird-140.5.0esr/image/imgLoader.cpp thunderbird-140.6.0esr/image/imgLoader.cpp --- thunderbird-140.5.0esr/image/imgLoader.cpp 2025-11-08 04:44:58.000000000 +0000 +++ thunderbird-140.6.0esr/image/imgLoader.cpp 2025-12-09 01:27:13.000000000 +0000 @@ -923,12 +923,14 @@ } else { // either we are loading something inside a document, in which case // we should always have a requestingNode, or we are loading something - // outside a document, in which case the triggeringPrincipal and - // triggeringPrincipal should always be the systemPrincipal. - // However, there are exceptions: one is Notifications which create a - // channel in the parent process in which case we can't get a - // requestingNode. - rv = NS_NewChannel(aResult, aURI, nsContentUtils::GetSystemPrincipal(), + // outside a document, in which case the triggeringPrincipal should be the + // systemPrincipal. However, there are exceptions: one is Notifications + // which create a channel in the parent process in which case we can't get a + // requestingNode though we might have a valid triggeringPrincipal. + rv = NS_NewChannel(aResult, aURI, + aTriggeringPrincipal + ? aTriggeringPrincipal + : nsContentUtils::GetSystemPrincipal(), securityFlags, aPolicyType, nullptr, // nsICookieJarSettings nullptr, // PerformanceStorage diff -Nru thunderbird-140.5.0esr/js/loader/ImportMap.cpp thunderbird-140.6.0esr/js/loader/ImportMap.cpp --- thunderbird-140.5.0esr/js/loader/ImportMap.cpp 2025-11-08 04:44:58.000000000 +0000 +++ thunderbird-140.6.0esr/js/loader/ImportMap.cpp 2025-12-09 01:27:14.000000000 +0000 @@ -9,6 +9,7 @@ #include "js/Array.h" // IsArrayObject #include "js/friend/ErrorMessages.h" // js::GetErrorMessage, JSMSG_* #include "js/JSON.h" // JS_ParseJSON +#include "js/PropertyDescriptor.h" // JS::PropertyDescriptor #include "LoadedScript.h" #include "ModuleLoaderBase.h" // ScriptLoaderInterface #include "nsContentUtils.h" @@ -371,6 +372,21 @@ return normalized; } +static bool GetOwnProperty(JSContext* aCx, Handle aObj, + const char* aName, MutableHandle aValueOut) { + JS::Rooted> desc(aCx); + if (!JS_GetOwnPropertyDescriptor(aCx, aObj, aName, &desc)) { + return false; + } + + if (desc.isNothing()) { + return true; + } + MOZ_ASSERT(!desc->isAccessorDescriptor()); + aValueOut.set(desc->value()); + return true; +} + // https://html.spec.whatwg.org/multipage/webappapis.html#parse-an-import-map-string // static UniquePtr ImportMap::ParseString( @@ -415,9 +431,9 @@ return nullptr; } - JS::RootedObject parsedObj(aCx, &parsedVal.toObject()); - JS::RootedValue importsVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "imports", &importsVal)) { + RootedObject parsedObj(aCx, &parsedVal.toObject()); + RootedValue importsVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "imports", &importsVal)) { return nullptr; } @@ -452,8 +468,8 @@ } } - JS::RootedValue scopesVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "scopes", &scopesVal)) { + RootedValue scopesVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "scopes", &scopesVal)) { return nullptr; } @@ -488,8 +504,8 @@ } } - JS::RootedValue integrityVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "integrity", &integrityVal)) { + RootedValue integrityVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "integrity", &integrityVal)) { return nullptr; } @@ -583,7 +599,6 @@ const SpecifierMap* aSpecifierMap) { // Step 1. For each specifierKey → resolutionResult of specifierMap, for (auto&& [specifierKey, resolutionResult] : *aSpecifierMap) { - nsAutoString specifier{aNormalizedSpecifier}; nsCString asURL = aAsURL ? aAsURL->GetSpecOrDefault() : EmptyCString(); // Step 1.1. If specifierKey is normalizedSpecifier, then: diff -Nru thunderbird-140.5.0esr/js/src/jit/CacheIR.cpp thunderbird-140.6.0esr/js/src/jit/CacheIR.cpp --- thunderbird-140.5.0esr/js/src/jit/CacheIR.cpp 2025-11-08 04:44:59.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/jit/CacheIR.cpp 2025-12-09 01:27:15.000000000 +0000 @@ -5554,12 +5554,13 @@ return false; } } else { - // Normal Case: If property exists this isn't an "add" + // Normal Case: If property exists or is an OOB typed array index, this + // isn't an "add". PropertyResult prop; if (!LookupOwnPropertyPure(cx_, nobj, id, &prop)) { return false; } - if (prop.isFound()) { + if (prop.isFound() || prop.isTypedArrayOutOfRange()) { return false; } } @@ -5663,6 +5664,10 @@ } JSObject* obj = &lhsVal_.toObject(); + if (!obj->is()) { + return AttachDecision::NoAction; + } + NativeObject* nobj = &obj->as(); PropertyResult prop; if (!LookupOwnPropertyPure(cx_, obj, id, &prop)) { @@ -5672,11 +5677,7 @@ return AttachDecision::NoAction; } - if (!obj->is()) { - return AttachDecision::NoAction; - } - auto* nobj = &obj->as(); - + MOZ_RELEASE_ASSERT(prop.isNativeProperty()); PropertyInfo propInfo = prop.propertyInfo(); NativeObject* holder = nobj; @@ -5688,6 +5689,7 @@ // The property must be the last added property of the object. SharedShape* newShape = holder->sharedShape(); + MOZ_RELEASE_ASSERT(oldShape != newShape); MOZ_RELEASE_ASSERT(newShape->lastProperty() == propInfo); #ifdef DEBUG diff -Nru thunderbird-140.5.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h thunderbird-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h --- thunderbird-140.5.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h 2025-11-08 04:44:59.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h 2025-12-09 01:27:14.000000000 +0000 @@ -791,10 +791,10 @@ void unboxGCThingForGCBarrier(const Address& src, Register dest) { loadPtr(src, dest); - ExtractBits(dest, dest, 0, JSVAL_TAG_SHIFT - 1); + ExtractBits(dest, dest, 0, JSVAL_TAG_SHIFT); } void unboxGCThingForGCBarrier(const ValueOperand& src, Register dest) { - ExtractBits(dest, src.valueReg(), 0, JSVAL_TAG_SHIFT - 1); + ExtractBits(dest, src.valueReg(), 0, JSVAL_TAG_SHIFT); } void unboxWasmAnyRefGCThingForGCBarrier(const Address& src, Register dest) { diff -Nru thunderbird-140.5.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h thunderbird-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h --- thunderbird-140.5.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h 2025-11-08 04:44:58.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h 2025-12-09 01:27:15.000000000 +0000 @@ -746,8 +746,10 @@ // secondary range veneers assuming the worst case deadlines. // Total pending secondary range veneer size. - size_t secondaryVeneers = guardSize_ * (branchDeadlines_.size() - - branchDeadlines_.maxRangeSize()); + size_t secondaryVeneers = + guardSize_ * + (branchDeadlines_.size() - branchDeadlines_.maxRangeSize()) * + InstSize; if (deadline < poolEnd + secondaryVeneers) { return false; diff -Nru thunderbird-140.5.0esr/js/src/vm/BigIntType.cpp thunderbird-140.6.0esr/js/src/vm/BigIntType.cpp --- thunderbird-140.5.0esr/js/src/vm/BigIntType.cpp 2025-11-08 04:45:01.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/vm/BigIntType.cpp 2025-12-09 01:27:17.000000000 +0000 @@ -3684,42 +3684,6 @@ return equal(lhs, rhsBigInt); } -// BigInt proposal section 3.2.5 -JS::Result BigInt::looselyEqual(JSContext* cx, HandleBigInt lhs, - HandleValue rhs) { - // Step 1. - if (rhs.isBigInt()) { - return equal(lhs, rhs.toBigInt()); - } - - // Steps 2-5 (not applicable). - - // Steps 6-7. - if (rhs.isString()) { - RootedString rhsString(cx, rhs.toString()); - return equal(cx, lhs, rhsString); - } - - // Steps 8-9 (not applicable). - - // Steps 10-11. - if (rhs.isObject()) { - RootedValue rhsPrimitive(cx, rhs); - if (!ToPrimitive(cx, &rhsPrimitive)) { - return cx->alreadyReportedError(); - } - return looselyEqual(cx, lhs, rhsPrimitive); - } - - // Step 12. - if (rhs.isNumber()) { - return equal(lhs, rhs.toNumber()); - } - - // Step 13. - return false; -} - // BigInt proposal section 1.1.12. BigInt::lessThan ( x, y ) bool BigInt::lessThan(const BigInt* x, const BigInt* y) { return compare(x, y) < 0; diff -Nru thunderbird-140.5.0esr/js/src/vm/BigIntType.h thunderbird-140.6.0esr/js/src/vm/BigIntType.h --- thunderbird-140.5.0esr/js/src/vm/BigIntType.h 2025-11-08 04:45:01.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/vm/BigIntType.h 2025-12-09 01:27:17.000000000 +0000 @@ -255,8 +255,6 @@ static bool equal(const BigInt* lhs, double rhs); static JS::Result equal(JSContext* cx, Handle lhs, HandleString rhs); - static JS::Result looselyEqual(JSContext* cx, Handle lhs, - HandleValue rhs); static bool lessThan(const BigInt* x, const BigInt* y); // These methods return Nothing when the non-BigInt operand is NaN diff -Nru thunderbird-140.5.0esr/js/src/vm/EqualityOperations.cpp thunderbird-140.6.0esr/js/src/vm/EqualityOperations.cpp --- thunderbird-140.5.0esr/js/src/vm/EqualityOperations.cpp 2025-11-08 04:45:02.000000000 +0000 +++ thunderbird-140.6.0esr/js/src/vm/EqualityOperations.cpp 2025-12-09 01:27:18.000000000 +0000 @@ -78,37 +78,47 @@ return js::LooselyEqual(cx, lvalue, rval, result); } -// ES6 draft rev32 7.2.12 Abstract Equality Comparison +// ES2026 Draft rev e936549f1c05ac1b206ad4c5817e77ee3ecbc787 +// +// IsLooselyEqual ( x, y ) +// https://tc39.es/ecma262/#sec-islooselyequal bool js::LooselyEqual(JSContext* cx, JS::Handle lval, JS::Handle rval, bool* result) { - // Step 3. + // Step 1. If SameType(x, y) is true, then if (JS::SameType(lval, rval)) { + // Step 1.a. Return IsStrictlyEqual(x, y). return EqualGivenSameType(cx, lval, rval, result); } - // Handle int32 x double. + // NOTE: JS::SameType distinguishes between Int32 vs Double, + // but the spec's SameType doesn't. if (lval.isNumber() && rval.isNumber()) { *result = (lval.toNumber() == rval.toNumber()); return true; } - // Step 4. This a bit more complex, because of the undefined emulating object. + // Step 2. If x is null and y is undefined, return true. + // Step 3. If x is undefined and y is null, return true. + // Step 4. Normative Optional + // If the host is a web browser or otherwise supports The + // [[IsHTMLDDA]] Internal Slot, then + // Step 4.a. If x is an Object, x has an [[IsHTMLDDA]] internal slot, and y + // is either undefined or null, return true. + // Step 4.b. If x is either undefined or null, y is an Object, and y has an + // [[IsHTMLDDA]] internal slot, return true. if (lval.isNullOrUndefined()) { - // We can return early here, because null | undefined is only equal to the - // same set. *result = rval.isNullOrUndefined() || (rval.isObject() && EmulatesUndefined(&rval.toObject())); return true; } - - // Step 5. if (rval.isNullOrUndefined()) { MOZ_ASSERT(!lval.isNullOrUndefined()); *result = lval.isObject() && EmulatesUndefined(&lval.toObject()); return true; } - // Step 6. + // Step 5. If x is a Number and y is a String, return ! IsLooselyEqual(x, ! + // ToNumber(y)). if (lval.isNumber() && rval.isString()) { double num; if (!StringToNumber(cx, rval.toString(), &num)) { @@ -118,7 +128,8 @@ return true; } - // Step 7. + // Step 6. If x is a String and y is a Number, return ! IsLooselyEqual(! + // ToNumber(x), y). if (lval.isString() && rval.isNumber()) { double num; if (!StringToNumber(cx, lval.toString(), &num)) { @@ -128,18 +139,50 @@ return true; } - // Step 8. + // Step 7. If x is a BigInt and y is a String, then + if (lval.isBigInt() && rval.isString()) { + // Step 7.a. Let n be StringToBigInt(y). + BigInt* n; + JS::Rooted str(cx, rval.toString()); + JS_TRY_VAR_OR_RETURN_FALSE(cx, n, StringToBigInt(cx, str)); + if (!n) { + // Step 7.b. If n is undefined, return false. + *result = false; + return true; + } + // Step 7.c. Return ! IsLooselyEqual(x, n). + *result = JS::BigInt::equal(lval.toBigInt(), n); + return true; + } + + // Step 8. If x is a String and y is a BigInt, return ! IsLooselyEqual(y, + // x). + if (lval.isString() && rval.isBigInt()) { + BigInt* n; + JS::Rooted str(cx, lval.toString()); + JS_TRY_VAR_OR_RETURN_FALSE(cx, n, StringToBigInt(cx, str)); + if (!n) { + *result = false; + return true; + } + *result = JS::BigInt::equal(rval.toBigInt(), n); + return true; + } + + // Step 9. If x is a Boolean, return ! IsLooselyEqual(! ToNumber(x), y). if (lval.isBoolean()) { return LooselyEqualBooleanAndOther(cx, lval, rval, result); } - // Step 9. + // Step 10. If y is a Boolean, return ! IsLooselyEqual(x, ! ToNumber(y)). if (rval.isBoolean()) { return LooselyEqualBooleanAndOther(cx, rval, lval, result); } - // Step 10. - if ((lval.isString() || lval.isNumber() || lval.isSymbol()) && + // Step 11. If x is either a String, a Number, a BigInt, or a Symbol and y + // is an Object, return ! IsLooselyEqual(x, ? ToPrimitive(y)). + if ((lval.isString() || lval.isNumber() || lval.isBigInt() || + lval.isSymbol()) && rval.isObject()) { JS::Rooted rvalue(cx, rval); if (!ToPrimitive(cx, &rvalue)) { @@ -148,9 +191,10 @@ return js::LooselyEqual(cx, lval, rvalue, result); } - // Step 11. - if (lval.isObject() && - (rval.isString() || rval.isNumber() || rval.isSymbol())) { + // Step 12. If x is an Object and y is either a String, a Number, a BigInt, + // or a Symbol, return ! IsLooselyEqual(? ToPrimitive(x), y). + if (lval.isObject() && (rval.isString() || rval.isNumber() || + rval.isBigInt() || rval.isSymbol())) { JS::Rooted lvalue(cx, lval); if (!ToPrimitive(cx, &lvalue)) { return false; @@ -158,25 +202,20 @@ return js::LooselyEqual(cx, lvalue, rval, result); } - if (lval.isBigInt()) { - JS::Rooted lbi(cx, lval.toBigInt()); - bool tmpResult; - JS_TRY_VAR_OR_RETURN_FALSE(cx, tmpResult, - JS::BigInt::looselyEqual(cx, lbi, rval)); - *result = tmpResult; + // Step 13. If x is a BigInt and y is a Number, or if x is a Number and y + // is a BigInt, then + if (lval.isBigInt() && rval.isNumber()) { + // Step 13.a. If x is not finite or y is not finite, return false. + // Step 13.b. If ℝ(x) = ℝ(y), return true; otherwise return false. + *result = BigInt::equal(lval.toBigInt(), rval.toNumber()); return true; } - - if (rval.isBigInt()) { - JS::Rooted rbi(cx, rval.toBigInt()); - bool tmpResult; - JS_TRY_VAR_OR_RETURN_FALSE(cx, tmpResult, - JS::BigInt::looselyEqual(cx, rbi, lval)); - *result = tmpResult; + if (lval.isNumber() && rval.isBigInt()) { + *result = BigInt::equal(rval.toBigInt(), lval.toNumber()); return true; } - // Step 12. + // Step 14. Return false. *result = false; return true; } diff -Nru thunderbird-140.5.0esr/netwerk/base/nsIUDPSocket.idl thunderbird-140.6.0esr/netwerk/base/nsIUDPSocket.idl --- thunderbird-140.5.0esr/netwerk/base/nsIUDPSocket.idl 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/base/nsIUDPSocket.idl 2025-12-09 01:27:19.000000000 +0000 @@ -273,6 +273,13 @@ */ [noscript, notxpcom] void enableWritePoll(); + /** + * isSocketClosed + * + * @return true when the socket is already closed. + */ + [noscript, notxpcom] boolean isSocketClosed(); + /** * addOutputBytes * diff -Nru thunderbird-140.5.0esr/netwerk/base/nsUDPSocket.cpp thunderbird-140.6.0esr/netwerk/base/nsUDPSocket.cpp --- thunderbird-140.5.0esr/netwerk/base/nsUDPSocket.cpp 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/base/nsUDPSocket.cpp 2025-12-09 01:27:20.000000000 +0000 @@ -1224,6 +1224,8 @@ mPollFlags = (PR_POLL_WRITE | PR_POLL_READ | PR_POLL_EXCEPT); } +bool nsUDPSocket::IsSocketClosed() { return mFD == nullptr; } + NS_IMETHODIMP nsUDPSocket::SendBinaryStream(const nsACString& aHost, uint16_t aPort, nsIInputStream* aStream) { diff -Nru thunderbird-140.5.0esr/netwerk/dns/effective_tld_names.dat thunderbird-140.6.0esr/netwerk/dns/effective_tld_names.dat --- thunderbird-140.5.0esr/netwerk/dns/effective_tld_names.dat 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/dns/effective_tld_names.dat 2025-12-09 01:27:19.000000000 +0000 @@ -5,8 +5,8 @@ // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. -// VERSION: 2025-11-06_15-16-33_UTC -// COMMIT: 8a6908f3823256c5319a38b67ff20e8c1ab2c686 +// VERSION: 2025-11-27_13-27-58_UTC +// COMMIT: d3567de748c61e2de5a3156cc52ef0e0fdc1dc0c // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. @@ -1118,13 +1118,14 @@ // completely removed. aland.fi -// fj : http://domains.fj/ -// Submitted by registry 2020-02-11 +// fj : https://www.iana.org/domains/root/db/fj.html fj ac.fj biz.fj com.fj +edu.fj gov.fj +id.fj info.fj mil.fj name.fj @@ -1414,6 +1415,8 @@ ponpes.id sch.id web.id +// xn--9tfky.id (.id, Und-Bali) +ᬩᬮᬶ.id // ie : https://www.iana.org/domains/root/db/ie.html ie @@ -1459,6 +1462,7 @@ // see also: https://registry.in/policies // Please note, that nic.in is not an official eTLD, but used by most // government institutions. +// Confirmed by Gaurav Kansal 2025-11-06 in 5g.in 6g.in @@ -4516,8 +4520,6 @@ bievát.no bindal.no birkenes.no -bjarkoy.no -bjarkøy.no bjerkreim.no bjugn.no bodo.no @@ -4794,7 +4796,6 @@ sande.møre-og-romsdal.no moskenes.no moss.no -mosvik.no muosat.no muosát.no naamesjevuemie.no @@ -6815,7 +6816,7 @@ // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-10-24T15:19:14Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-11-08T15:16:38Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -10981,7 +10982,7 @@ // https://www.iana.org/domains/root/db/xn--fhbei.html كوم -// xn--fiq228c5hs : TLD REGISTRY LIMITED OY +// xn--fiq228c5hs : Beijing TLD Registry Technology Limited // https://www.iana.org/domains/root/db/xn--fiq228c5hs.html 中文网 @@ -11331,6 +11332,10 @@ // Submitted by Gavin Brown africa.com +// AgentbaseAI Inc. : https://assistant-ui.com +// Submitted by Simon Farshid +*.auiusercontent.com + // Agnat sp. z o.o. : https://domena.pl // Submitted by Przemyslaw Plewa beep.pl @@ -11589,7 +11594,7 @@ // Amazon Managed Workflows for Apache Airflow // Submitted by AWS Security -// Reference: 2f697e23-58d6-4b97-be6b-77a26e811dad +// Reference: bfd043cc-2816-451d-894e-612c6b61a438 *.airflow.af-south-1.on.aws *.airflow.ap-east-1.on.aws *.airflow.ap-northeast-1.on.aws @@ -11636,6 +11641,7 @@ *.ap-southeast-3.airflow.amazonaws.com *.ap-southeast-4.airflow.amazonaws.com *.ap-southeast-5.airflow.amazonaws.com +*.ap-southeast-7.airflow.amazonaws.com *.ca-central-1.airflow.amazonaws.com *.ca-west-1.airflow.amazonaws.com *.eu-central-1.airflow.amazonaws.com @@ -11655,6 +11661,46 @@ *.us-west-1.airflow.amazonaws.com *.us-west-2.airflow.amazonaws.com +// Amazon Relational Database Service +// Submitted by: AWS Security +// Reference: 5aa87906-fd4f-4831-8727-4ffca6094159 +*.rds.cn-north-1.amazonaws.com.cn +*.rds.cn-northwest-1.amazonaws.com.cn +*.af-south-1.rds.amazonaws.com +*.ap-east-1.rds.amazonaws.com +*.ap-east-2.rds.amazonaws.com +*.ap-northeast-1.rds.amazonaws.com +*.ap-northeast-2.rds.amazonaws.com +*.ap-northeast-3.rds.amazonaws.com +*.ap-south-1.rds.amazonaws.com +*.ap-south-2.rds.amazonaws.com +*.ap-southeast-1.rds.amazonaws.com +*.ap-southeast-2.rds.amazonaws.com +*.ap-southeast-3.rds.amazonaws.com +*.ap-southeast-4.rds.amazonaws.com +*.ap-southeast-5.rds.amazonaws.com +*.ap-southeast-6.rds.amazonaws.com +*.ap-southeast-7.rds.amazonaws.com +*.ca-central-1.rds.amazonaws.com +*.ca-west-1.rds.amazonaws.com +*.eu-central-1.rds.amazonaws.com +*.eu-central-2.rds.amazonaws.com +*.eu-west-1.rds.amazonaws.com +*.eu-west-2.rds.amazonaws.com +*.eu-west-3.rds.amazonaws.com +*.il-central-1.rds.amazonaws.com +*.me-central-1.rds.amazonaws.com +*.me-south-1.rds.amazonaws.com +*.mx-central-1.rds.amazonaws.com +*.sa-east-1.rds.amazonaws.com +*.us-east-1.rds.amazonaws.com +*.us-east-2.rds.amazonaws.com +*.us-gov-east-1.rds.amazonaws.com +*.us-gov-west-1.rds.amazonaws.com +*.us-northeast-1.rds.amazonaws.com +*.us-west-1.rds.amazonaws.com +*.us-west-2.rds.amazonaws.com + // Amazon S3 // Submitted by AWS Security // Reference: ada5c9df-55e1-4195-a1ce-732d6c81e357 @@ -12165,7 +12211,7 @@ // AWS Elastic Beanstalk // Submitted by AWS Security -// Reference: bb5a965c-dec3-4967-aa22-e306ad064797 +// Reference: e4e02a54-eaf9-4fe7-b662-39ccbc011a04 cn-north-1.eb.amazonaws.com.cn cn-northwest-1.eb.amazonaws.com.cn elasticbeanstalk.com @@ -12178,14 +12224,18 @@ ap-southeast-1.elasticbeanstalk.com ap-southeast-2.elasticbeanstalk.com ap-southeast-3.elasticbeanstalk.com +ap-southeast-5.elasticbeanstalk.com +ap-southeast-7.elasticbeanstalk.com ca-central-1.elasticbeanstalk.com eu-central-1.elasticbeanstalk.com eu-north-1.elasticbeanstalk.com eu-south-1.elasticbeanstalk.com +eu-south-2.elasticbeanstalk.com eu-west-1.elasticbeanstalk.com eu-west-2.elasticbeanstalk.com eu-west-3.elasticbeanstalk.com il-central-1.elasticbeanstalk.com +me-central-1.elasticbeanstalk.com me-south-1.elasticbeanstalk.com sa-east-1.elasticbeanstalk.com us-east-1.elasticbeanstalk.com @@ -12206,6 +12256,32 @@ // Reference: d916759d-a08b-4241-b536-4db887383a6a awsglobalaccelerator.com +// AWS Lambda Function URLs +// Submitted by AWS Security +// Reference: 57df74ca-0820-46a5-89ea-0f0d0c4714b7 +lambda-url.af-south-1.on.aws +lambda-url.ap-east-1.on.aws +lambda-url.ap-northeast-1.on.aws +lambda-url.ap-northeast-2.on.aws +lambda-url.ap-northeast-3.on.aws +lambda-url.ap-south-1.on.aws +lambda-url.ap-southeast-1.on.aws +lambda-url.ap-southeast-2.on.aws +lambda-url.ap-southeast-3.on.aws +lambda-url.ca-central-1.on.aws +lambda-url.eu-central-1.on.aws +lambda-url.eu-north-1.on.aws +lambda-url.eu-south-1.on.aws +lambda-url.eu-west-1.on.aws +lambda-url.eu-west-2.on.aws +lambda-url.eu-west-3.on.aws +lambda-url.me-south-1.on.aws +lambda-url.sa-east-1.on.aws +lambda-url.us-east-1.on.aws +lambda-url.us-east-2.on.aws +lambda-url.us-west-1.on.aws +lambda-url.us-west-2.on.aws + // AWS re:Post Private // Submitted by AWS Security // Reference: 83385945-225f-416e-9aa0-ad0632bfdcee @@ -12430,6 +12506,8 @@ // Submitted by Andrea Brancaleoni brave.app *.s.brave.app +brave.dev +*.s.brave.dev brave.io *.s.brave.io @@ -12658,8 +12736,9 @@ *.devinapps.com // Combell.com : https://www.combell.com -// Submitted by Thomas Wouters +// Submitted by Combell Team webhosting.be +prvw.eu hosting-cluster.nl // Contentful GmbH : https://www.contentful.com @@ -12788,6 +12867,15 @@ deta.app deta.dev +// Developed Methods LLC : https://methods.dev +// Submitted by Patrick Lorio +*.at.ply.gg +d6.ply.gg +joinmc.link +playit.plus +*.at.playit.plus +with.playit.plus + // Dfinity Foundation: https://dfinity.org/ // Submitted by Dfinity Team icp0.io @@ -12828,6 +12916,10 @@ // Submitted by Calvin Browne jozi.biz +// DNSHE : https://de5.net +// Submitted by DNSHE Team +de5.net + // DNShome : https://www.dnshome.de/ // Submitted by Norbert Auler dnshome.de @@ -13200,6 +13292,11 @@ elementor.cloud elementor.cool +// Emergent : https://emergent.sh +// Submitted by Emergent Security Team +emergent.cloud +emergent.host + // En root‽ : https://en-root.org // Submitted by Emmanuel Raviart en-root.fr @@ -13440,6 +13537,7 @@ // Figma : https://www.figma.com // Submitted by Nick Frost figma.site +figma-gov.site preview.site // Filegear Inc. : https://www.filegear.com @@ -13545,6 +13643,11 @@ *.kunden.ortsinfo.at *.statics.cloud +// Gadget Software Inc. : https://gadget.dev +// Submitted by Harry Brundage +gadget.app +gadget.host + // GCom Internet : https://www.gcom.net.au // Submitted by Leo Julius aliases121.com @@ -13770,6 +13873,10 @@ // Submitted by Matt Yamkowy grayjayleagues.com +// Grebedoc : https://grebedoc.dev +// Submitted by Catherine Zotova +grebedoc.dev + // GünstigBestellen : https://günstigbestellen.de // Submitted by Furkan Akkoc günstigbestellen.de @@ -14030,6 +14137,10 @@ iserv.dev iserv.host +// Ispmanager : https://www.ispmanager.com/ +// Submitted by Ispmanager infrastructure team +ispmanager.name + // Jelastic, Inc. : https://jelastic.com/ // Submitted by Ihor Kolodyuk mel.cloudlets.com.au @@ -14438,8 +14549,12 @@ azurewebsites.net cloudapp.net trafficmanager.net +servicebus.usgovcloudapi.net +usgovcloudapp.net blob.core.windows.net servicebus.windows.net +azure-api.us +azurewebsites.us // MikroTik : https://mikrotik.com // Submitted by MikroTik SysAdmin Team @@ -14466,6 +14581,12 @@ typo3server.info project.space +// Mocha : https://getmocha.com +// Submitted by Ben Reinhart +mocha.app +mochausercontent.com +mocha-sandbox.dev + // MODX Systems LLC : https://modx.com // Submitted by Elizabeth Southwell modx.dev @@ -14504,6 +14625,10 @@ // Submitted by Felix Herbst needle.run +// Neo : https://www.neo.space +// Submitted by Ankit Kulkarni +co.site + // Net at Work Gmbh : https://www.netatwork.de // Submitted by Jan Jaeschke cloud.nospamproxy.com @@ -14513,10 +14638,6 @@ // Submitted by Philippe PITTOLI netlib.re -// Netfy Domains : https://netfy.domains -// Submitted by Suranga Ranasinghe -netfy.app - // Netlify : https://www.netlify.com // Submitted by Jessica Parsons netlify.app @@ -14707,10 +14828,6 @@ // Submitted by the prvcy.page Registry Team prvcy.page -// Obl.ong : https://obl.ong -// Submitted by Reese Armstrong -obl.ong - // Observable, Inc. : https://observablehq.com // Submitted by Mike Bostock observablehq.cloud @@ -15721,6 +15838,10 @@ site.transip.me *.transurl.nl +// Tunnelmole: https://tunnelmole.com +// Submitted by Robbie Cahill +tunnelmole.net + // TuxFamily : http://tuxfamily.org // Submitted by TuxFamily administrators tuxfamily.org @@ -15764,6 +15885,10 @@ // Submitted by ITComdomains it.com +// Umso Software Inc. : https://www.umso.com +// Submitted by Alexis Taylor +umso.co + // Unison Computing, PBC : https://unison.cloud // Submitted by Simon Højberg unison-services.cloud @@ -15909,8 +16034,6 @@ // William Harrison : https://wharrison.com.au // Submitted by William Harrison -wdh.app -hrsn.au vps.hrsn.au hrsn.dev is-a.dev @@ -15976,6 +16099,10 @@ demon.nl xs4all.space +// xTool : https://xtool.com +// Submitted by Echo +xtooldevice.com + // Yandex.Cloud LLC : https://cloud.yandex.com // Submitted by Alexander Lodin yandexcloud.net diff -Nru thunderbird-140.5.0esr/netwerk/protocol/http/Http3Session.cpp thunderbird-140.6.0esr/netwerk/protocol/http/Http3Session.cpp --- thunderbird-140.5.0esr/netwerk/protocol/http/Http3Session.cpp 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/protocol/http/Http3Session.cpp 2025-12-09 01:27:20.000000000 +0000 @@ -409,6 +409,11 @@ LOG(("Http3Session::ProcessInput writer=%p [this=%p state=%d]", mUdpConn.get(), this, mState)); + if (!socket || socket->IsSocketClosed()) { + MOZ_DIAGNOSTIC_ASSERT(false, "UDP socket should still be open"); + return NS_ERROR_UNEXPECTED; + } + if (mUseNSPRForIO) { while (true) { nsTArray data; @@ -941,6 +946,11 @@ LOG(("Http3Session::ProcessOutput reader=%p, [this=%p]", mUdpConn.get(), this)); + if (!socket || socket->IsSocketClosed()) { + MOZ_DIAGNOSTIC_ASSERT(false, "UDP socket should still be open"); + return NS_ERROR_UNEXPECTED; + } + if (mUseNSPRForIO) { mSocket = socket; nsresult rv = mHttp3Connection->ProcessOutputAndSendUseNSPRForIO( diff -Nru thunderbird-140.5.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp thunderbird-140.6.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp --- thunderbird-140.5.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp 2025-12-09 01:27:19.000000000 +0000 @@ -282,6 +282,12 @@ mSocket->Close(); mSocket = nullptr; } + + if (mHttp3Session) { + mHttp3Session->SetCleanShutdown(true); + mHttp3Session->Close(reason); + mHttp3Session = nullptr; + } } void HttpConnectionUDP::DontReuse() { @@ -367,7 +373,7 @@ // response headers so that it will be ready to receive the new response. if (mIsReused && ((PR_IntervalNow() - mHttp3Session->LastWriteTime()) < k1000ms)) { - Close(NS_ERROR_NET_RESET); + CloseTransaction(mHttp3Session, NS_ERROR_NET_RESET); *reset = true; return NS_OK; } @@ -697,7 +703,9 @@ NS_IMETHODIMP HttpConnectionUDP::OnStopListening(nsIUDPSocket* aSocket, nsresult aStatus) { - CloseTransaction(mHttp3Session, aStatus); + // At this point, the UDP socket has already been closed. Set aIsShutdown to + // true to ensure that mHttp3Session is also closed. + CloseTransaction(mHttp3Session, aStatus, true); return NS_OK; } diff -Nru thunderbird-140.5.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp thunderbird-140.6.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp --- thunderbird-140.5.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp 2025-12-09 01:27:20.000000000 +0000 @@ -135,8 +135,9 @@ if (NS_FAILED(rv)) return rv; // We use the original URI for the title and parent link when it's a - // resource:// url, instead of the jar:file:// url it resolves to. - if (!uri->SchemeIs("resource")) { + // resource:// or moz-extension:// url, instead of the jar:file:// + // url it resolves to. + if (!uri->SchemeIs("resource") && !uri->SchemeIs("moz-extension")) { rv = channel->GetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; } diff -Nru thunderbird-140.5.0esr/nsprpub/TAG-INFO thunderbird-140.6.0esr/nsprpub/TAG-INFO --- thunderbird-140.5.0esr/nsprpub/TAG-INFO 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/TAG-INFO 2025-12-09 01:27:20.000000000 +0000 @@ -1 +1 @@ -NSPR_4_36_RTM \ No newline at end of file +NSPR_4_36_2_RTM \ No newline at end of file diff -Nru thunderbird-140.5.0esr/nsprpub/configure thunderbird-140.6.0esr/nsprpub/configure --- thunderbird-140.5.0esr/nsprpub/configure 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/configure 2025-12-09 01:27:20.000000000 +0000 @@ -3004,7 +3004,7 @@ MOD_MAJOR_VERSION=4 MOD_MINOR_VERSION=36 -MOD_PATCH_VERSION=0 +MOD_PATCH_VERSION=2 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= diff -Nru thunderbird-140.5.0esr/nsprpub/configure.in thunderbird-140.6.0esr/nsprpub/configure.in --- thunderbird-140.5.0esr/nsprpub/configure.in 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/configure.in 2025-12-09 01:27:20.000000000 +0000 @@ -16,7 +16,7 @@ dnl ======================================================== MOD_MAJOR_VERSION=4 MOD_MINOR_VERSION=36 -MOD_PATCH_VERSION=0 +MOD_PATCH_VERSION=2 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= diff -Nru thunderbird-140.5.0esr/nsprpub/pr/include/prinit.h thunderbird-140.6.0esr/nsprpub/pr/include/prinit.h --- thunderbird-140.5.0esr/nsprpub/pr/include/prinit.h 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/pr/include/prinit.h 2025-12-09 01:27:19.000000000 +0000 @@ -31,10 +31,10 @@ ** The format of the version string is ** ".[.] []" */ -#define PR_VERSION "4.36" +#define PR_VERSION "4.36.2" #define PR_VMAJOR 4 #define PR_VMINOR 36 -#define PR_VPATCH 0 +#define PR_VPATCH 2 #define PR_BETA PR_FALSE /* diff -Nru thunderbird-140.5.0esr/nsprpub/pr/src/misc/prtime.c thunderbird-140.6.0esr/nsprpub/pr/src/misc/prtime.c --- thunderbird-140.5.0esr/nsprpub/pr/src/misc/prtime.c 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/pr/src/misc/prtime.c 2025-12-09 01:27:19.000000000 +0000 @@ -1277,7 +1277,7 @@ { break; } - if ((end - rest) == 2) + else if ((end - rest) == 2) tmp_sec = ((rest[0] - '0') * 10 + (rest[1] - '0')); else { tmp_sec = (rest[0] - '0'); diff -Nru thunderbird-140.5.0esr/nsprpub/pr/tests/parsetm.c thunderbird-140.6.0esr/nsprpub/pr/tests/parsetm.c --- thunderbird-140.5.0esr/nsprpub/pr/tests/parsetm.c 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/pr/tests/parsetm.c 2025-12-09 01:27:20.000000000 +0000 @@ -3,12 +3,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -/* - * This test program should eventually become a full-blown test for - * PR_ParseTimeString. Right now it just verifies that PR_ParseTimeString - * doesn't crash on an out-of-range time string (bug 480740). - */ - #include "prtime.h" #include @@ -59,7 +53,52 @@ } } +static PRStatus KnownAnswerTest(void) { + static const struct { + const char* string; + PRBool default_to_gmt; + PRTime expected; + } tests[] = { + {"Mon, 15 Oct 2007 19:45:00 GMT", PR_FALSE, PR_INT64(1192477500000000)}, + {"15 Oct 07 19:45 GMT", PR_FALSE, PR_INT64(1192477500000000)}, + {"Mon Oct 15 12:45 PDT 2007", PR_FALSE, PR_INT64(1192477500000000)}, + {"16 Oct 2007 4:45-JST (Tuesday)", PR_FALSE, PR_INT64(1192477500000000)}, + // Not normalized. + {"Mon Oct 15 12:44:60 PDT 2007", PR_FALSE, PR_INT64(1192477500000000)}, + // Not normalized. + {"Sun Oct 14 36:45 PDT 2007", PR_FALSE, PR_INT64(1192477500000000)}, + {"Mon, 15 Oct 2007 19:45:23 GMT", PR_FALSE, PR_INT64(1192477523000000)}, + }; + + PRBool failed = PR_FALSE; + + for (int i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { + PRTime result = 0; + if (PR_ParseTimeString(tests[i].string, tests[i].default_to_gmt, &result) != + PR_SUCCESS) { + printf("PR_ParseTimeString(\"%s\", %s, &result) failed\n", + tests[i].string, tests[i].default_to_gmt ? "PR_TRUE" : "PR_FALSE"); + failed = PR_TRUE; + continue; + } + if (result != tests[i].expected) { + printf( + "PR_ParseTimeString(\"%s\", %s, &result) returns %lld, expected " + "%lld\n", + tests[i].string, tests[i].default_to_gmt ? "PR_TRUE" : "PR_FALSE", + (long long)result, (long long)tests[i].expected); + failed = PR_TRUE; + } + } + + return failed ? PR_FAILURE : PR_SUCCESS; +} + int main(int argc, char** argv) { + /* + * 1. Verify that PR_ParseTimeString doesn't crash on an out-of-range time + * string (bug 480740). + */ PRTime ct; PRExplodedTime et; PRStatus rv; @@ -84,5 +123,12 @@ PrintExplodedTime(&et); printf("\n"); + /* 2. Run a full-blown test for PR_ParseTimeString. */ + if (KnownAnswerTest() != PR_SUCCESS) { + printf("FAIL\n"); + return 1; + } + + printf("PASS\n"); return 0; } diff -Nru thunderbird-140.5.0esr/nsprpub/pr/tests/vercheck.c thunderbird-140.6.0esr/nsprpub/pr/tests/vercheck.c --- thunderbird-140.5.0esr/nsprpub/pr/tests/vercheck.c 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/nsprpub/pr/tests/vercheck.c 2025-12-09 01:27:20.000000000 +0000 @@ -37,7 +37,8 @@ "4.10.9", "4.10.10", "4.11", "4.12", "4.13", "4.14", "4.15", "4.16", "4.17", "4.18", "4.19", "4.20", "4.21", "4.22", "4.23", "4.24", "4.25", "4,26", "4.27", "4.28", "4.29", - "4.30", "4.31", "4.32", "4.33", "4.34", "4.35", PR_VERSION}; + "4.30", "4.31", "4.32", "4.33", "4.34", "4.35", "4.36", + "4.36.1", PR_VERSION}; /* * This release is not backward compatible with the old @@ -48,7 +49,7 @@ */ static char* incompatible_version[] = { "2.1 19980529", "3.0", "3.0.1", "3.1", "3.1.1", - "3.1.2", "3.1.3", "3.5", "3.5.1", "4.36.1", + "3.1.2", "3.1.3", "3.5", "3.5.1", "4.36.3", "4.37", "4.37.1", "10.0", "11.1", "12.14.20"}; int main(int argc, char** argv) { diff -Nru thunderbird-140.5.0esr/security/ct/CTKnownLogs.h thunderbird-140.6.0esr/security/ct/CTKnownLogs.h --- thunderbird-140.5.0esr/security/ct/CTKnownLogs.h 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/security/ct/CTKnownLogs.h 2025-12-09 01:27:20.000000000 +0000 @@ -14,7 +14,7 @@ #include -static const PRTime kCTExpirationTime = INT64_C(1768508507000000); +static const PRTime kCTExpirationTime = INT64_C(1770634470000000); namespace mozilla::ct { @@ -148,7 +148,7 @@ "\xa3", 91}, {"Cloudflare 'Nimbus2027'", CTLogState::Admissible, CTLogFormat::RFC6962, - 1757030400000, // 2025-09-05T00:00:00Z + 1763164800000, // 2025-11-15T00:00:00Z 1, // operated by Cloudflare "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x62\x37\x7f\x8c\x4d\x04\xa0\x08\x4d" @@ -468,7 +468,7 @@ "\x15", 91}, {"Let's Encrypt 'Sycamore2025h2d'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x44\x8f\x20\xad\xdd\xeb\xb2\xe1\x3d" @@ -478,7 +478,7 @@ "\x7e", 91}, {"Let's Encrypt 'Sycamore2026h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x7c\x41\x1e\xd0\x96\x64\x9c\x0f\x75" @@ -488,7 +488,7 @@ "\x80", 91}, {"Let's Encrypt 'Sycamore2026h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xc1\x1d\x45\xb6\x28\x8c\x6e\x9b\xf1" @@ -498,7 +498,7 @@ "\xa8", 91}, {"Let's Encrypt 'Sycamore2027h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x5a\xb1\x9d\x63\x26\x58\x07\xbb\x5e" @@ -508,7 +508,7 @@ "\xf2", 91}, {"Let's Encrypt 'Sycamore2027h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x2b\xed\xb3\xcb\x65\x16\x44\xc2\x32" @@ -518,7 +518,7 @@ "\x9c", 91}, {"Let's Encrypt 'Willow2025h2d'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x95\x7e\xfc\x58\xe6\x6c\xac\x3a\x7b" @@ -528,7 +528,7 @@ "\xb8", 91}, {"Let's Encrypt 'Willow2026h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xb6\x91\x72\xba\x5c\x20\xcb\x5f\xae" @@ -538,7 +538,7 @@ "\xe0", 91}, {"Let's Encrypt 'Willow2026h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xa7\xcc\x07\xf1\x1e\xb3\x7c\xcf\x94" @@ -548,7 +548,7 @@ "\x88", 91}, {"Let's Encrypt 'Willow2027h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xce\xc3\x0a\xb6\x88\xce\xd0\x15\x41" @@ -558,7 +558,7 @@ "\xd3", 91}, {"Let's Encrypt 'Willow2027h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 4, // operated by Let's Encrypt "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x61\xb3\x03\x83\x4a\x90\x10\x46\x23" @@ -738,7 +738,7 @@ "\x1c", 91}, {"IPng Networks 'Gouda2025h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 7, // operated by IPng Networks "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xa4\x78\x8f\xdb\x83\x0d\xa3\xca\x60" @@ -748,7 +748,7 @@ "\xc0", 91}, {"IPng Networks 'Gouda2026h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 7, // operated by IPng Networks "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x47\xac\x2f\xa9\x5c\x21\x7f\x98\xac" @@ -758,7 +758,7 @@ "\xec", 91}, {"IPng Networks 'Gouda2026h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 7, // operated by IPng Networks "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x8d\xac\x9c\xce\x68\x54\x30\xd7\xed" @@ -768,7 +768,7 @@ "\xf5", 91}, {"IPng Networks 'Gouda2027h1'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 7, // operated by IPng Networks "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x3a\x1d\x75\x07\x66\x91\x4f\xd0\x62" @@ -778,7 +778,7 @@ "\x81", 91}, {"IPng Networks 'Gouda2027h2'", CTLogState::Admissible, CTLogFormat::Tiled, - 1758078000000, // 2025-09-17T03:00:00Z + 1764212400000, // 2025-11-27T03:00:00Z 7, // operated by IPng Networks "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" "\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x3e\xec\x4f\x1f\x6d\x2c\x4a\xa5\x33" diff -Nru thunderbird-140.5.0esr/security/manager/ssl/StaticHPKPins.h thunderbird-140.6.0esr/security/manager/ssl/StaticHPKPins.h --- thunderbird-140.5.0esr/security/manager/ssl/StaticHPKPins.h 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/security/manager/ssl/StaticHPKPins.h 2025-12-09 01:27:20.000000000 +0000 @@ -726,4 +726,4 @@ static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1770927663163000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1773053640200000); diff -Nru thunderbird-140.5.0esr/security/manager/ssl/nsSTSPreloadList.inc thunderbird-140.6.0esr/security/manager/ssl/nsSTSPreloadList.inc --- thunderbird-140.5.0esr/security/manager/ssl/nsSTSPreloadList.inc 2025-11-08 04:45:03.000000000 +0000 +++ thunderbird-140.6.0esr/security/manager/ssl/nsSTSPreloadList.inc 2025-12-09 01:27:20.000000000 +0000 @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1773346859559000); +const PRTime gPreloadListExpirationTime = INT64_C(1775472836741000); %% 0--1.de, 1 0-0.io, 1 @@ -17,6 +17,7 @@ 0-24.com, 1 0-24.net, 1 0-9.com, 1 +0-nuisibles.fr, 1 0.com.ms, 1 0.sb, 1 00.eco, 1 @@ -162,7 +163,6 @@ 053ks.com, 1 055268.com, 1 0553z6.com, 1 -0555z6.com, 0 056687.com, 0 056697.com, 0 0570168.com, 1 @@ -199,7 +199,7 @@ 081115.com, 0 081752.com, 1 081769.com, 1 -081783.com, 1 +081783.com, 0 081925.com, 1 081927.com, 1 081957.com, 1 @@ -354,6 +354,7 @@ 1001iq.com, 1 1001kartini.com, 1 1001mv.com, 1 +1001n.com, 1 1001reasonstolearnspanish.com, 1 1001telecommandes.com, 1 1007337.com, 0 @@ -361,6 +362,7 @@ 10086.ru, 1 100baksov.tk, 1 100ballov.tk, 1 +100beauty.com, 1 100bib.ru, 1 100kraz.ga, 1 100nome.com, 1 @@ -388,6 +390,7 @@ 101010.hopto.org, 1 101010.pl, 1 10161997.xyz, 1 +10198.com, 1 101android.ru, 0 101st-airborne.tk, 1 101st.tk, 1 @@ -534,6 +537,7 @@ 11333837.com, 1 113k8.com, 0 113z6.com, 1 +11400.com, 1 11443837.com, 0 114514ss.com, 1 114online.com, 1 @@ -542,6 +546,7 @@ 1174healing.com, 1 117766.xyz, 1 1177z6.com, 1 +11792.com, 1 1182asaka-shika.com, 1 1190america.tk, 1 1199bet.vip, 1 @@ -643,7 +648,6 @@ 12.ag, 1 12.digital, 1 1200.cf, 1 -12006.com, 1 120percent-inc.com, 1 1212.tk, 1 1212873467.rsc.cdn77.org, 1 @@ -723,6 +727,7 @@ 125-rue.com, 1 12517.com, 1 12557.com, 1 +12588.com, 1 125c.cn, 1 125colours.tk, 1 125m125.de, 1 @@ -730,7 +735,6 @@ 127661.com, 1 1288366.com, 1 129.co, 1 -12apostleshotel.com, 1 12fkcdtcetteefqv.myfritz.net, 1 12go.asia, 1 12go.co, 1 @@ -738,6 +742,7 @@ 12grid.co.jp, 0 12l.nl, 1 12lasee.com, 1 +12meat.de, 1 12nomos.tk, 1 12photos.eu, 0 12socialsmansa.tk, 1 @@ -950,7 +955,6 @@ 168365t.com, 1 1688zp.xyz, 1 168esb.com, 1 -16974.cc, 1 169xpj.com, 1 16megablast.tk, 1 16packets.com, 1 @@ -1037,7 +1041,6 @@ 174343.com, 1 175dt.com, 1 177milkstreet.com, 1 -17920.com, 1 17dbz.org, 1 17experience.com.br, 1 17hats.com, 0 @@ -1052,7 +1055,6 @@ 1800mattress.co, 1 1800mattress.net, 1 1800petmeds.com, 1 -181ks.net, 1 182wh.com, 1 1831365.com, 1 1832365.com, 1 @@ -1080,7 +1082,6 @@ 18teensporn.pro, 1 18upchat.com, 1 18vr.com, 1 -18webdesign.com, 1 1911-movie.jp, 1 1911trust.com, 1 1912x.com, 1 @@ -1154,6 +1155,7 @@ 1a-diamantscheiben.de, 1 1a-hyp.de, 1 1a-media.com, 1 +1a-spezialreinigung.de, 1 1a-werkstattgeraete.de, 1 1ab-machinery.com, 1 1abcicka.ru, 1 @@ -1197,11 +1199,11 @@ 1dollar.ml, 1 1dollarwebsite.gq, 1 1dot1dot1dot1.cf, 1 +1dp.com, 1 1dt.ltd, 1 1dv.link, 1 1e9.nl, 1 1eanda.com, 1 -1earn.com, 1 1er-secours.ch, 0 1f123.net, 1 1f616emo.xyz, 1 @@ -1271,7 +1273,6 @@ 1se.co, 1 1se2or3.com, 1 1secondeveryday.com, 1 -1secretaire.com, 1 1sociaaldomein.nl, 1 1sports1.com, 1 1st-bounce.co.uk, 1 @@ -1292,7 +1293,6 @@ 1tomplumber.com, 1 1tpt.com, 1 1up.it, 1 -1v-lsd.eu, 1 1v9.im, 1 1v9.io, 1 1viemeilleure.eu, 1 @@ -1302,6 +1302,7 @@ 1w6.net, 1 1way.faith, 1 1web.be, 1 +1werkcentrum.nl, 1 1whw.uk, 1 1wirelog.de, 1 1x-00.com, 1 @@ -1498,7 +1499,6 @@ 200mmx.net, 1 200pppp.com, 1 2012review.tk, 1 -2013download.com, 1 2013review.tk, 1 20140301.xyz, 1 2015review.tk, 1 @@ -1509,6 +1509,7 @@ 2018fifaworldcup.tk, 1 202020.health, 1 2020cadillac.com, 1 +2020insight.co.za, 1 2020spaces.com, 1 2021bleibtsernst.at, 1 2022.dog, 0 @@ -1552,6 +1553,7 @@ 20plus.com, 1 20sights.tk, 1 21.co.uk, 1 +2103kobo.net, 1 2113.ch, 1 214701.xyz, 1 21566365.com, 0 @@ -1727,7 +1729,6 @@ 24chance.tk, 1 24gazette.ga, 1 24go.me, 1 -24hod.com, 1 24hour-locksmithsanantonio.com, 1 24hourcyclist.co.uk, 1 24hourlocksmithdallastx.com, 1 @@ -1737,8 +1738,9 @@ 24images.com, 1 24k.co.jp, 1 24onlain.tk, 1 +24see.com, 1 +24share.com, 1 24slides.com, 1 -24status.com, 1 24webservice.nl, 1 24x7aircargoservices.co.in, 1 24x7serversupport.io, 1 @@ -1901,7 +1903,6 @@ 2th.me, 1 2think.org, 1 2to.co, 1 -2todrive.nl, 0 2travel8.world, 1 2ugaming.com, 1 2url.link, 1 @@ -1924,6 +1925,7 @@ 300m.com, 1 301.one, 0 301.technology, 1 +301routes.com, 1 30375500.com, 1 30375533.com, 1 3056999.com, 1 @@ -1933,6 +1935,7 @@ 30deagosto.tk, 1 30for30podcasts.com, 1 30hb.cn, 1 +30minut.com, 1 30nama1.tk, 1 30parkplace.co.uk, 1 30region.tk, 1 @@ -1994,7 +1997,6 @@ 3336321.com, 1 333capital.com, 1 333capital.com.au, 1 -333industrial.com.au, 1 33445111.com, 1 33445222.com, 1 33445444.com, 1 @@ -2061,8 +2063,7 @@ 360hosting.com.au, 1 360islam.com, 1 360kuvia.fi, 1 -360mediaworks.com, 1 -360now.com, 1 +360mediaworks.com, 0 360organic.com, 1 360primeview.ie, 1 360prokuvat.fi, 1 @@ -2142,7 +2143,6 @@ 365canvas.com, 0 365clo.com, 1 365cn-288.com, 1 -365coupon.com, 1 365eib.com, 1 365eif.com, 1 365eil.com, 1 @@ -2193,7 +2193,6 @@ 3798.com, 0 37987.com, 1 37987d.com, 1 -37zk.com, 0 37zw.com, 1 3800.cf, 1 380111000.com, 1 @@ -2306,6 +2305,7 @@ 3d-fotoshpalery.com.ua, 1 3d-glow.de, 1 3d-station.fr, 1 +3d47.com, 1 3dadvance.fr, 1 3dall.ro, 1 3danimation.tk, 1 @@ -2328,6 +2328,7 @@ 3dissue.com, 1 3djake.de, 1 3djake.uk, 1 +3djapan.com, 1 3djava.ml, 1 3dlab.team, 1 3dm.audio, 1 @@ -2347,6 +2348,7 @@ 3dstoragellc.com, 1 3dstore.dk, 1 3dsupplies.be, 1 +3dthink.tech, 1 3dvisual.studio, 1 3dzip.org, 1 3ecpa.com.hk, 1 @@ -2355,6 +2357,7 @@ 3ee365.com, 1 3einfrastructure.com, 1 3em1.pt, 1 +3enota.by, 1 3eyonetim.com, 1 3ff365.com, 1 3fragezeichen.de, 1 @@ -2365,7 +2368,6 @@ 3gokushi.com, 1 3haeuserprojekt.org, 1 3hh365.com, 1 -3huan.com, 1 3i-infotech.com, 1 3ieimpact.org, 1 3ii365.com, 1 @@ -2547,7 +2549,6 @@ 43klive.com, 1 43rddems.org, 1 44-k.com, 1 -440304.xyz, 1 44168365.com, 1 443.one, 0 443.org, 1 @@ -2602,12 +2603,13 @@ 491.jp, 1 491mhz.net, 1 492977.com, 0 -497552.com, 0 49889.com, 1 49948522.com, 1 499ks.net, 1 49ko.com, 0 +4ads.de, 1 4armed.com, 1 +4b.ua, 1 4baby.com.br, 1 4beats.ml, 1 4best.tk, 1 @@ -2629,6 +2631,7 @@ 4digitiq.nl, 1 4dillusion.tk, 1 4dimension.net, 1 +4dplay.com, 1 4dsoft.com, 1 4dstyle.com, 1 4e8.net, 1 @@ -2826,7 +2829,6 @@ 51dazhe.com, 1 51evar.com, 1 51fishing.com, 1 -51flower.com, 1 51fss.marketing, 1 51lavanderiaindustrial.com.br, 1 51life.com, 1 @@ -2836,11 +2838,9 @@ 51pig.com, 1 51resume.com, 1 51senluo.com, 1 -51share.com, 1 51space.com, 1 51talk.ph, 1 51tiaojiu.com, 1 -51train.com, 1 51xiongmao.cn, 1 52002a.com, 1 52002b.com, 1 @@ -2881,7 +2881,6 @@ 528sss.com, 1 5298h.cc, 0 529sss.com, 1 -52b9.com, 1 52b9.net, 1 52chatai.com, 1 52danji.cc, 1 @@ -2912,7 +2911,6 @@ 543yazilim.com, 1 54below.com, 0 54cuatro.com, 1 -550885.com, 0 5518k3.com, 1 5533445.com, 1 55365t.com, 1 @@ -2953,6 +2951,7 @@ 578380.com, 1 5792.org, 1 5795887.com, 1 +580strategies.com, 1 588e.com, 1 589174.com, 1 589team.com, 1 @@ -3056,7 +3055,6 @@ 5stardesigner.tk, 1 5starexterior.com, 0 5stars.tv, 1 -5startrucksales.us, 1 5stones-consulting.cn, 1 5stones-consulting.com, 1 5stones-consulting.ru, 1 @@ -3144,6 +3142,7 @@ 6396zzz.com, 0 63fg.com, 1 63gaming.com, 1 +644.ro, 1 645ds.com, 0 64970.com, 1 64bit.me, 1 @@ -3413,7 +3412,6 @@ 69wasted.net, 1 6a.nz, 1 6b.com.au, 1 -6bet86.com, 1 6bwcp.com, 1 6conecta.com, 1 6dec.gc.ca, 1 @@ -3431,7 +3429,6 @@ 7-zip.de, 1 7.ls, 1 700.az, 1 -700creditsolution.com, 1 700dealer.com, 1 700wns.com, 1 7014twinlakes.com, 1 @@ -3519,11 +3516,11 @@ 77177.de, 1 7733445.com, 1 775018.com, 0 -777.tf, 1 777111.xyz, 1 777365t.com, 1 7776321.com, 0 777coin.com, 1 +777mage.com, 1 77909a.com, 0 77909b.com, 0 77909c.com, 0 @@ -3536,14 +3533,13 @@ 77909i.com, 0 77b58.com, 1 77bet86.com, 1 -78-couvreur.fr, 1 +77online.com, 1 78.to, 1 780aa.com, 1 783346.com, 1 78365b.com, 0 783lab.com, 1 787637.com, 1 -787k3.com, 1 7885765.com, 1 7888815.com, 1 788zzz.com, 1 @@ -3562,6 +3558,7 @@ 7aga7.mk, 1 7akawyna.tk, 1 7b.gg, 1 +7colli.it, 1 7comm.com.br, 1 7datarecovery.com, 1 7daystodie.top, 1 @@ -3577,9 +3574,9 @@ 7graus.pt, 1 7h12.com, 1 7heavencr.com, 1 +7hills-consulting.de, 1 7hills.us, 1 7hq.ru, 1 -7inci.com, 1 7ki.photography, 1 7kovrikov.ru, 1 7kvadratov.by, 1 @@ -3593,6 +3590,7 @@ 7ovz.ru, 1 7pixel.ro, 1 7plus.com.au, 1 +7press.com, 1 7proxies.com, 1 7qly.com, 1 7sdre.am, 1 @@ -3614,9 +3612,11 @@ 800999.xyz, 1 800email.com, 1 800ink.com, 1 +800live.com, 1 800mattress.com, 1 800perkins.com, 1 800sports.com, 1 +800tea.com, 1 800tutor.com, 1 8012d88.com, 1 8019d88.com, 1 @@ -3745,6 +3745,7 @@ 83365365.com, 1 834365.com, 1 8349822.com, 1 +838888.net, 1 83ir2k8b.duckdns.org, 1 83kb88.com, 1 84000.com, 1 @@ -3812,7 +3813,6 @@ 8522top.com, 1 8522tw.com, 1 8522usa.com, 1 -8560.be, 1 8602010.com, 1 863479.com, 1 8649955.com, 1 @@ -3839,7 +3839,6 @@ 878431.com, 1 8796.jp, 1 87kb88.com, 1 -880557.com, 0 8809d88.com, 1 88168365.com, 1 8816d88.com, 1 @@ -3912,7 +3911,6 @@ 889w889.com, 1 889w889.net, 1 88acesmaritime.com, 1 -88bet86.com, 0 88bill.com, 1 88cakescorner.com, 1 88djl.cc, 1 @@ -3971,6 +3969,7 @@ 8l.com.au, 1 8maerz.at, 1 8me.nl, 1 +8n.pw, 1 8shequapp.com, 1 8t8.eu, 1 8tech.com.hk, 1 @@ -4080,6 +4079,7 @@ 9098.cf, 1 90daydiet.org, 1 90daysales.com, 1 +90minut.com, 1 90r.jp, 1 90splease.com, 1 91-av.com, 1 @@ -4483,8 +4483,8 @@ 9508.cf, 1 9509.cf, 1 9510.cf, 1 -95105.com, 1 95107.com, 1 +95108.com, 1 9511.cf, 1 9512.cf, 1 9513.cf, 1 @@ -4555,6 +4555,7 @@ 9578.cf, 1 9579.cf, 1 9580.cf, 1 +95808.com, 1 9581.cf, 1 9582.cf, 1 9584.cf, 1 @@ -4593,12 +4594,12 @@ 9617.cf, 1 9617818.net, 1 9618.cf, 1 -96181.com, 1 9619.cf, 1 9620.cf, 1 96200.com, 1 9621.cf, 1 9622.cf, 1 +96220.com, 1 96229.com, 1 9623.cf, 1 9624.cf, 1 @@ -4608,12 +4609,17 @@ 9629.cf, 1 9630.cf, 1 9631.cf, 1 +96316.com, 1 9632.cf, 1 9633.cf, 1 -96607.com, 1 +96448.com, 1 +96577.com, 1 +96605.com, 1 9666ks.com, 1 96685.com, 1 966ty.com, 1 +96896.com, 1 +96961.com, 1 9700.cf, 1 9701.cf, 1 9702.cf, 1 @@ -4785,7 +4791,6 @@ 9908.cf, 1 9908.ml, 1 9909.cf, 1 -990buy.com, 1 9910.cf, 1 9912.cf, 1 9913.cf, 1 @@ -4882,7 +4887,9 @@ 999family.com, 0 999salon.co, 1 999zlong.com, 1 +99bt.com, 1 99buffets.com, 1 +99dog.com, 1 99furnitureideasandtips.gq, 1 99furnitureideasexamples.ga, 1 99laptops.com, 1 @@ -5023,7 +5030,6 @@ a-shirouto.com, 1 a-starbouncycastles.co.uk, 1 a-systems.ru.com, 1 -a-up.info, 1 a.ac, 1 a.tt, 1 a.wtf, 1 @@ -5057,7 +5063,6 @@ a1scuba.com, 1 a1seowebdirectory.com, 0 a1speedyrooter.com, 1 -a1websitepro.com, 1 a210.online, 1 a24dmng.de, 1 a24help.ru, 1 @@ -5120,7 +5125,8 @@ aaapl.com, 1 aaaplumbers.com, 1 aaapo.com.br, 1 -aaar.com.hk, 1 +aaappfeel.de, 1 +aaar.com.hk, 0 aabeltech.com, 1 aabenjaminjewelry.com, 0 aabigbirminghamconvention.com, 1 @@ -5143,7 +5149,6 @@ aalalbayt.com, 1 aalalbayt.net, 1 aalaslearninglibrary.org, 1 -aaldef.org, 1 aalderstotaaltechniek.nl, 1 aalen.tk, 1 aalianbinhaider.ml, 1 @@ -5277,6 +5282,7 @@ abasky.net, 1 abasteo.mx, 1 abastor.tk, 1 +abaton.es, 1 abay-today.tk, 1 abbadabbabouncycastles.co.uk, 1 abbas.ch, 1 @@ -5395,6 +5401,7 @@ aberon.pl, 1 aberrantvascular.tk, 1 aberte.com, 1 +abetrans.com, 1 abettercreditunion.com, 1 abetterdeath.com, 1 abetterwichita.org, 1 @@ -5403,6 +5410,7 @@ abg.com.sa, 1 abg.ninja, 1 abgeo.ga, 1 +abhaken.com, 1 abhaldus.ee, 1 abhandshake.com, 1 abhayaranya.com, 1 @@ -5614,9 +5622,11 @@ abramsand.co, 1 abraofilho.blog.br, 1 abrarahmed.tk, 1 +abrasivosmaverick.com.br, 1 abraxan.pro, 1 abraxas-apis.ch, 1 abraxas-apps.ch, 1 +abrcr.org.br, 1 abre.cloud, 1 abreactive.net, 1 abreactive.org, 1 @@ -5634,16 +5644,14 @@ absat.tk, 1 abschleppdienst-in-recklinghausen.de, 1 abseher-technology.com, 1 +abseher.tech, 1 abseits.org, 0 absentia.cf, 1 absinsurance.com, 1 absolab.xyz, 1 absolem.cc, 1 absoluav.com, 1 -absoluconseils.com, 1 -absolucopine.com, 1 absolugroupe.com, 1 -absoluphoto.com, 1 absolute.digital, 1 absoluteblack.cc, 1 absolutebritney.com, 1 @@ -5727,7 +5735,6 @@ academiaveritas.com, 1 academicassembly.com, 1 academicexperts.com, 1 -academicexperts.org, 1 academichealthscience.net, 1 academichelp.gq, 1 academie-angoumois.org, 1 @@ -5741,7 +5748,6 @@ acadiate.com, 1 acadolimited.com, 1 acafcantabria.es, 1 -acaging.ca, 1 acalcio.ga, 1 acana.com, 1 acandroid.top, 1 @@ -5758,7 +5764,6 @@ acaro.it, 1 acasadavella.tk, 1 acasadoprodutor.com.br, 1 -acaseta.com, 1 acasundayschool.org, 1 acat.io, 1 acatepec.com, 1 @@ -5791,8 +5796,9 @@ accelergent.com, 1 accelsnow.com, 1 accentchair.net, 1 +accentharmonizer.ai, 1 accentsduterroir.fr, 1 -accentwebs.ie, 1 +accentwebs.ie, 0 accesdirectmarketing.ca, 1 accesdirectmarketing.com, 1 accesloges.com, 1 @@ -5856,6 +5862,7 @@ accounts.google.com, 1 accountsfilingmadesimple.com, 1 accountsinterchange.com, 1 +accpacific.com, 1 accpl.co, 1 accreditamento.net, 1 accreditedbuildingservices.com, 1 @@ -5869,6 +5876,7 @@ accueillons.org, 1 acculongrange.com, 1 accumulus.org, 1 +accuphotography.com, 1 accuracast.com, 1 accurateinfosolutions.in, 1 accuride.com, 1 @@ -5876,7 +5884,6 @@ accurxinc.com, 1 accustandard.com, 1 accustomedicals.ga, 1 -accutone.com.mx, 1 acdc-tech.eu, 1 acdc-tech.lv, 1 acdk2.de, 1 @@ -5989,13 +5996,14 @@ achtzehn.eu, 1 achtzig20.de, 0 aci-asiapac.aero, 1 +acic-cbit.in, 1 aciclovir.ga, 1 acidchrist.tk, 1 +acidlabs.io, 1 acidoascorbico.com, 1 acidstudios.ro, 1 acidtool.com, 1 acierto.com, 1 -acihotel.vn, 1 acilicraft.cn, 1 acina.fr, 1 acingov.pt, 1 @@ -6056,7 +6064,7 @@ acousticalsolutions.com, 1 acousticandfire.co.uk, 1 acousticbuy.com.ua, 1 -acoustics.network, 1 +acoustics.network, 0 acoustics.tech, 1 acousticsoundrecords.com, 1 acoustictabs.tk, 1 @@ -6089,7 +6097,7 @@ acriticismlab.org, 1 acrlatinoamerica.com, 1 acroaccounting.au, 1 -acroballe-circus.fr, 0 +acroballe-circus.fr, 1 acrobatic.cf, 1 acrobatic.tk, 1 acrolife.cz, 0 @@ -6120,7 +6128,7 @@ acsports.ca, 1 acss.com, 1 acstallningsmontage.se, 1 -acsvalves.com, 0 +acsvalves.com, 1 act-news.com, 1 act-on.com, 1 act-web-sa.com, 1 @@ -6173,7 +6181,6 @@ activate.ch, 1 activate.swiss, 1 activated.win, 1 -activatenow.com, 1 activators.ml, 1 active-electrical.com, 1 active-english.tk, 1 @@ -6189,7 +6196,7 @@ activehire.co.uk, 1 activeleisure.ie, 1 activelife.travel, 1 -activemoneymanage.com, 1 +activemoneymanage.com, 0 activenl.co.uk, 1 activeplatesystem.ga, 1 activeprospect.com, 1 @@ -6348,7 +6355,6 @@ adameveplus.com, 1 adamevevod.com, 1 adamfontenot.com, 1 -adamgian.com, 1 adamgibbins.com, 1 adamh.us, 1 adamj.eu, 1 @@ -6506,7 +6512,6 @@ adelina.com.br, 0 adelinemerrick.com, 1 adelonline.tk, 1 -adelphiawines.com, 1 ademaulana.tk, 1 adenergetics.tech, 1 adenhurra.cf, 1 @@ -6550,6 +6555,7 @@ adhigamindia.com, 1 adhockery.ga, 1 adhocracy.plus, 1 +adhoor.ir, 1 adi.com.au, 1 adi.net.au, 1 adiaf.com, 1 @@ -6580,6 +6586,8 @@ aditumconsulting.com, 1 adityadees.com, 1 adityaes.eu.org, 1 +adityainfotechindia.com, 1 +adityajaishi.com.np, 1 adiyamandanal.com, 1 adiyamanhaberleri.tk, 1 adje-fansite.tk, 1 @@ -6704,7 +6712,6 @@ adp.fr, 1 adphotography.pl, 1 adpot.xyz, 0 -adpromotora.com.br, 1 adquest.ro, 1 adr-stock.com, 1 adr.gov, 1 @@ -6805,19 +6812,19 @@ adt.co.za, 1 adtelligent.com, 1 adtgroup.com, 1 -adtv.ae, 0 +adtv.ae, 1 aduanasgama.com, 1 aduarte.es, 1 adubosvidere.com.br, 1 adult-block.com, 1 adultbizz.eu, 1 adulteducation.org.uk, 1 -adultforum.gr, 0 adultgames.pro, 1 adulttrust.com, 1 aduro.com.tr, 1 adurra.com, 1 adutoras.com.br, 1 +aduxia.net, 1 adv-geosci.net, 1 adv-radio-sci.net, 1 adv-stat-clim-meteorol-oceanogr.net, 1 @@ -6856,6 +6863,7 @@ advancedmedicalcertification.com, 1 advancednetflowtraining.com, 1 advancedoneroofing.com, 1 +advancedseniorcare.com, 1 advancedsepticandpumping.com, 0 advancedtherapies.com, 1 advancedturf.tk, 1 @@ -6941,6 +6949,7 @@ advicepay.com, 0 advicepharma.com, 1 adviceprime.tk, 1 +adviceregtech.co, 1 advicted.com, 1 advictedgames.com, 1 adviesfactuur.nl, 1 @@ -6954,6 +6963,7 @@ advmaster.cf, 1 advocaat-dejonge.be, 1 advocacyforyou.co.uk, 1 +advocat.te.ua, 1 advocatae.com, 1 advocatburo.tk, 1 advocateanakha.com, 1 @@ -6988,10 +6998,12 @@ advokaty.cf, 1 advokaty.gq, 1 advosy.com, 1 +advpassos.com.br, 1 advritujeph.in, 1 advtran.com, 0 advu.no, 1 adware.pl, 0 +adwokat-kielce.com.pl, 1 adwokatkosterka.pl, 1 adwokatzdunek.pl, 1 adwork.net, 1 @@ -7055,6 +7067,8 @@ aegisaccounting.co.uk, 1 aegisalarm.co.uk, 1 aegisalarm.com, 1 +aegisbds.com, 1 +aegissec.ca, 1 aegisys.com, 1 aegon.hu, 0 aegrel.ee, 1 @@ -7077,17 +7091,16 @@ aelintx.com, 1 aelisya.net, 0 aelyapi.com, 1 -aenahome.com, 1 aenes.com, 1 +aenima.tech, 1 aeolservice.es, 1 aeon.co, 0 aeonc.com, 1 aeonct.org, 1 aeonfoundation.my, 1 aeonian.live, 0 -aeonmall.global, 1 +aeonmall.global, 0 aeonsapi.uk, 1 -aep-digital.com, 1 aeperocovilha.pt, 1 aeperodacovilha.pt, 1 aeptic.org, 1 @@ -7109,6 +7122,7 @@ aerobiomasa.com, 1 aerobotz.com, 0 aeroclub-tolhuin.tk, 1 +aerodoc.com, 1 aeroelectronics.net, 1 aeroequity.com, 1 aeroexpress.tk, 1 @@ -7122,7 +7136,6 @@ aerojet.com, 1 aeroklub.tk, 1 aerolog.co, 0 -aeromot.com, 1 aeronautix.com, 1 aeronote.net, 1 aeropetz.com.br, 1 @@ -7194,7 +7207,6 @@ af-clan.tk, 1 af.link, 1 af2c.org, 1 -af5t.com, 1 afacanpalmer.cat, 1 afadansedeparis.com, 1 afadvantage.gov, 1 @@ -7263,7 +7275,7 @@ affiliateprograms.gq, 1 affiliates-psychicsource.com, 1 affiliates.trade, 1 -affiliatexpo.it, 1 +affiliatexpo.it, 0 affine.ai, 1 affine.space, 1 affinipay.com, 0 @@ -7271,7 +7283,6 @@ affinity.co, 1 affinity.vc, 1 affinitycu.ca, 1 -affinityinnovations.com, 1 affinityplus.org, 1 affinitysync.com, 1 affinityweb.co, 1 @@ -7401,6 +7412,7 @@ afterlifeos.com, 1 aftermagic.com, 1 aftermarketinternational.com, 1 +aftermix.com, 1 afternoonhereyes.tk, 1 afteroblivion.tk, 1 afterpay.com, 1 @@ -7409,7 +7421,6 @@ afterstack.net, 1 aftodioikisi.gr, 1 aftonbladet.se, 1 -aftontickets.com, 1 afuturewithoutfear.org, 1 afuturewithoutfear.us, 1 afuzion.com, 1 @@ -7428,7 +7439,6 @@ ag1projects.com, 1 ag3232g.com, 0 ag388.vip, 1 -ag399.vip, 1 ag4.app, 0 ag518518.net, 1 ag6.pub, 1 @@ -7473,7 +7483,6 @@ agabucheros.tk, 1 agad.tk, 1 agafayoasissky.com, 1 -agagent.vip, 1 against.tk, 1 againstgynexams.tk, 1 againsttheneighbour.tk, 1 @@ -7600,7 +7609,6 @@ agenziapubblicitaria.roma.it, 1 agenziefunebri.it, 1 ageofreason.tk, 1 -agerton.lt, 1 ages-its.de, 1 ages-service.de, 1 agesofarda.net, 1 @@ -7610,7 +7618,6 @@ agg097.com, 1 agg88.com, 1 aggcom.org, 1 -aggielandrealtors.com, 1 aggielandtutoring.com, 1 agglo-sion.ch, 1 aggm.at, 1 @@ -7675,6 +7682,8 @@ agks9.com, 0 agks92.com, 1 agktest1.ga, 1 +aglais.de, 1 +aglais.org, 1 aglar.com.ec, 1 aglar.tk, 1 agleventis.com, 1 @@ -7734,6 +7743,7 @@ agri.ee, 0 agricolacastellana.es, 1 agricult.tk, 1 +agricultura.gov.br, 1 agricultural-technology.tk, 1 agriculture-schools.com, 1 agriculturejournals.cz, 1 @@ -7756,7 +7766,9 @@ agro-dom.solutions, 1 agro-ferma.tk, 1 agro-forestry.net, 1 +agro-iva.com, 1 agro-parts.bg, 1 +agro.gov.br, 1 agrobank.uz, 0 agrobaza.com.ua, 1 agrocabildo.org, 1 @@ -7771,13 +7783,11 @@ agroexp.com.ua, 1 agrofind.com.br, 1 agrogrup79.com, 1 -agrohim.com, 1 agroinsider.com, 1 agrokomi.tk, 1 agrokredit.ga, 1 agroland.tk, 1 agrolife.tk, 1 -agroma.com, 1 agromanagement.kz, 1 agromotorsburzaco.com, 1 agron.tk, 1 @@ -7802,8 +7812,11 @@ agscinemas.com, 1 agscinemasapp.com, 1 agsun6.com, 1 +agswatersolutions.es, 1 aguantepimpinero.tk, 1 aguarani.com.br, 1 +aguasdaserra.pt, 1 +aguasdecarrazeda.pt, 1 aguasdefafe.pt, 1 aguaviva.tk, 1 aguiascarecas.org, 1 @@ -7863,6 +7876,7 @@ ahityayinlari.org, 1 ahj.no, 1 ahjindigital.com, 1 +ahl-net.com, 1 ahl.gov.au, 0 ahl.im, 1 ahlac.tk, 1 @@ -7888,6 +7902,7 @@ ahmedalneaimy.com, 1 ahmedcorp.tk, 1 ahmedelgamalanimations.tk, 1 +ahmedkagan.com, 1 ahmedszaidi.com, 1 ahmerjamilkhan.org, 1 ahmetazgin.net, 1 @@ -7907,6 +7922,7 @@ ahorroenergeticoenhogares.es, 1 ahosamuel.com, 1 ahouansou.cz, 1 +ahqf.com, 1 ahrefs.com, 1 ahroproject.org, 1 ahrq.gov, 1 @@ -7949,7 +7965,6 @@ aiat.net, 1 aiatsis.gov.au, 1 aib.gov.uk, 1 -aibaoyou.com, 1 aibes.org, 1 aibili.pt, 1 aibios.cloud, 1 @@ -7965,6 +7980,7 @@ aica.org, 1 aiccc.com.au, 1 aiccorp.com, 1 +aiceopenlab.org, 1 aicfb.in, 1 aichat.io, 1 aichi-tokko-shien.com, 1 @@ -7993,10 +8009,10 @@ aidez-moi.eu, 1 aidhan.net, 1 aidi-ahmi.com, 1 -aidiscore.com, 1 aidliveers.ga, 1 aido.gq, 1 aidoc.com, 1 +aidong.com, 1 aidoru.net, 1 aidoru.top, 1 aids-dissidents.tk, 1 @@ -8042,6 +8058,7 @@ aikidoboskovice.cz, 1 aikidoinfo.tk, 1 aikidosaltadojo.tk, 1 +aikidozentrum.com, 1 aikijutsu.tk, 1 aikiva.com, 1 aikoly.com, 1 @@ -8078,7 +8095,6 @@ aimplas.es, 1 aimreply.com, 1 aimrom.org, 1 -aimserv.com, 1 aimsouq.com, 1 aimvancouver.com, 1 aimwa.com, 1 @@ -8116,8 +8132,6 @@ aipi.tel, 1 aipi.uk, 1 aipodcast.education, 1 -aipregnancy.com, 1 -aipregnant.com, 1 aiprime.solutions, 1 aipulse.org, 1 aiqinggu.com, 1 @@ -8146,7 +8160,6 @@ airbnb.cat, 1 airbnb.ch, 1 airbnb.cl, 1 -airbnb.cn, 1 airbnb.co.cr, 1 airbnb.co.id, 1 airbnb.co.il, 1 @@ -8161,7 +8174,6 @@ airbnb.com.bo, 1 airbnb.com.br, 1 airbnb.com.bz, 1 -airbnb.com.cn, 1 airbnb.com.co, 1 airbnb.com.ec, 1 airbnb.com.gt, 1 @@ -8205,7 +8217,6 @@ airbnb.pt, 1 airbnb.se, 1 airbnb.tools, 1 -airbnbchina.cn, 1 airborne-clan.tk, 1 airborne-commando.tk, 1 airburners.com, 1 @@ -8226,7 +8237,6 @@ aircrewportpages.com, 1 airday.tk, 1 airdeer.com, 1 -airdropics.com, 1 airdropkings.com, 1 airductcleaninggrandprairie.com, 1 airductcleaningpa.com, 1 @@ -8271,6 +8281,7 @@ airhorn.de, 1 airi.ga, 1 airicy.com, 1 +airit.co.uk, 1 airjet.cf, 1 airjordanpascher.tk, 1 airkiss.ga, 1 @@ -8414,6 +8425,7 @@ airlinetravelinternational.com, 1 airlinevegas.com, 1 airlitegroup.com.au, 1 +airlok.com.au, 1 airm.aero, 1 airmag.tk, 1 airmail.cc, 0 @@ -8518,6 +8530,7 @@ airzone.tk, 1 aisawa22.com, 1 aiscale.fr, 1 +aischannel.com, 1 aischepervers-porn.com, 1 aisdent.com, 1 aisdr.com, 1 @@ -8575,7 +8588,6 @@ aizxxs.net, 1 aj-laixada.tk, 1 ajancctv.com, 1 -ajansguru.com, 1 ajansmanisa.com, 1 ajarope.com, 1 ajatelier.com, 1 @@ -8656,6 +8668,7 @@ akachanwebsite.tk, 1 akad.com.br, 1 akademiaantykorupcyjna.pl, 1 +akademiaginekologiionkologicznej.pl, 1 akademiamarleen.pl, 1 akademiawawer.pl, 1 akademiawellbeing.pl, 1 @@ -8704,6 +8717,7 @@ akcs.one, 1 akdenizecza.com, 1 akdenizecza.com.tr, 1 +akdenizeczam.com, 1 akdenizim.tk, 1 akdusekbudil.cz, 1 akeeba.com, 1 @@ -8737,6 +8751,7 @@ akiba-server.info, 1 akiekintveld.com, 1 akiganka.com, 1 +akihabara-tour.com, 1 akijo.de, 1 akikat.tk, 1 akilli-devre.com, 1 @@ -8746,7 +8761,6 @@ aking.com.my, 1 akinoiro.ru, 1 akinokae.de, 1 -akinsoft.com.tr, 1 akiranet.tk, 1 akisazame.tk, 1 akita-boutique.com, 1 @@ -8801,6 +8815,7 @@ akselinurmio.fi, 1 aksenov.tk, 1 aksenovalexey.tk, 1 +aksesuarai.com, 1 akshavitrends.com, 1 akshay.in.eu.org, 1 akshit.me, 1 @@ -8873,6 +8888,7 @@ al3ilm.com, 1 al3xpro.com, 1 al911.net, 1 +alaan.com, 1 alaattinkaraca.tk, 1 alab.space, 1 alabalaporto.tk, 1 @@ -8962,6 +8978,7 @@ alarmnewengland.com, 1 alarmport-security.net, 1 alarmport.cz, 1 +alarmreceiver.com, 1 alarmreceiver.net, 1 alarna.de, 1 alaroche.be, 1 @@ -9019,6 +9036,8 @@ albanylaser.ca, 1 albanyoregon.gov, 1 albarius.ga, 1 +albaron.io, 1 +albaron.net, 1 albaronglobal.com, 1 albaronventures.com, 1 albarugby.tk, 1 @@ -9034,7 +9053,6 @@ albergolafiorita.com, 1 alberguecovadonga.es, 1 alberosano.it, 1 -albert-yu.com, 1 albert.lol, 1 albertapp.com, 1 albertathome.org, 1 @@ -9051,7 +9069,6 @@ albertonsolarsystems.co.za, 1 albertooc.com, 1 albertosobrino.tk, 1 -albertotriano.com, 1 albertovr.com, 1 albertovr.net, 1 albertpedersen.com, 1 @@ -9065,6 +9082,7 @@ albeso.ml, 1 albi-tourisme.fr, 1 albilaga.id, 1 +albinliljestrand.se, 1 albinonderdelen.nl, 1 albinsoft.es, 1 albinvega.tk, 1 @@ -9109,6 +9127,7 @@ alchemy.gr, 1 alchemy.net, 1 alchemyinfusionco.com.au, 1 +alchemytechconnect.com, 1 alchemywellness.health, 1 alchevsk-news.ru, 1 alchevsknews.ru, 1 @@ -9124,6 +9143,7 @@ alcoholismtreatment.tk, 1 alcoleadetajo.tk, 1 alcolecapital.com, 0 +alconight-phuket.com, 1 alcor.tk, 1 alcorncountyms.gov, 1 alcove.cf, 1 @@ -9170,6 +9190,7 @@ alehinta.fi, 1 alejandrocruz.es, 1 alejandromateoconde.tk, 1 +alejandromillalen.com, 1 alejandromunoz.es, 1 alejandropernett.tk, 1 alejandrophones.com.mx, 1 @@ -9241,7 +9262,6 @@ alesto-mail.eu, 1 alesto.at, 1 aleszejdl.cz, 1 -alethea.ai, 0 aletm.it, 0 alevel.tech, 0 alevi-forum.tk, 1 @@ -9288,7 +9308,6 @@ alexandraschick.at, 1 alexandraschmidt.coach, 1 alexandrastrauss.fr, 1 -alexandrawett.org, 1 alexandre-acaries.fr, 1 alexandre-barret.fr, 1 alexandrebassi.com, 1 @@ -9354,7 +9373,6 @@ alexnedea.ro, 1 alexosecure.com, 1 alexpavel.com, 1 -alexpetryk.com, 1 alexpotter.net, 1 alexridevski.net, 1 alexridge.tk, 1 @@ -9396,7 +9414,7 @@ alfa-reserve.tk, 1 alfa-tech.su, 1 alfaair.aero, 1 -alfabetagamma.com, 1 +alfabetagamma.com, 0 alfabetajuega.com, 1 alfabuster.com, 1 alfacharlie.co, 0 @@ -9410,6 +9428,7 @@ alfahir.hu, 1 alfalasteenyia.cf, 1 alfambra.tk, 1 +alfamed.biz, 1 alfapack-shop.com, 1 alfaproweb.fr, 1 alfardanexchange.com, 1 @@ -9511,6 +9530,7 @@ aliceboyle.net, 1 aliceforchildren.it, 1 alicehairstyling.tk, 1 +alicehartley.com, 1 alicekinkycat.net, 1 alicestudio.it, 1 alicetone.net, 1 @@ -9519,6 +9539,7 @@ aliciabytes.com, 1 aliciacryst.com, 1 alicialab.org, 1 +alicjawkrainiecanavan.pl, 1 alida.com, 1 aliel.fr, 1 alien-life.tk, 1 @@ -9545,6 +9566,7 @@ alightwell.com, 1 align-pilates.lt, 1 align27.com, 1 +alignancekinesiologie.fr, 1 alignedchiro.org, 1 aligneddc.com, 1 alignedweb.com, 1 @@ -9554,13 +9576,11 @@ aliim.gdn, 1 alikarslanov.tk, 1 alikasimoglu.com, 1 -alikgriffin.com, 0 alila.dog, 1 alilepro.cf, 1 alilialili.ga, 1 alimahmood.com, 1 alimanaka-rabesata.tk, 1 -alimarketfoodtech.es, 1 aliment-covid19.com, 1 alimentosmcf.com, 1 alimentsduquebecaumenu.com, 1 @@ -9595,12 +9615,12 @@ alisondavenport.ga, 1 alisonmatter.tk, 1 alisonswindles.com, 0 -alisoviejolifecoach.com, 1 alissa-group.com, 1 alissanoir.net, 1 alisstyle.tk, 1 alistairshepherd.uk, 1 alistaku.tk, 1 +alistar.ltd, 1 alistelab.com, 1 alistshop.com, 1 alisufyan.cloud, 1 @@ -9641,6 +9661,7 @@ alkame.com, 1 alkamitech.com, 1 alkanbelgelendirme.com.tr, 1 +alkebulanread.com, 1 alkel.info, 1 alkemy.mx, 1 alkesznevelde.hu, 1 @@ -9651,7 +9672,6 @@ alkoferma.gq, 1 alkogol.ga, 1 alkoholiker-forum.de, 1 -alkomedfrank.com, 1 alkon.gg, 1 alkopedia.tk, 1 alkor.tk, 1 @@ -9671,8 +9691,6 @@ all-mountains.fr, 1 all-music.ml, 1 all-music.tk, 1 -all-payroll-solutions.com, 1 -all-payroll-solutions.de, 1 all-pics.tk, 1 all-rating.tk, 1 all-seo.tk, 1 @@ -9710,7 +9728,6 @@ allahabadhighcourt.in, 1 allamakee.k12.ia.us, 1 allamericangutterprotection.com, 0 -allamericanprotection.net, 1 allamericatrans.com, 0 allandrich.ml, 1 allandrichonline.tk, 1 @@ -9800,6 +9817,7 @@ allenivory.com, 1 allenkreger.com, 1 allenpcservices.co.uk, 1 +allenperformingarts.org, 1 allensonit.com, 1 allensun.org, 1 allentertainment.de, 1 @@ -9895,6 +9913,7 @@ allio.com.tw, 1 allis.co.jp, 1 allis.jp, 1 +allislight.com.au, 1 allisonsite.tk, 1 allisonsklar.com, 1 allitcrm.sytes.net, 1 @@ -9949,7 +9968,6 @@ allporncomic.com, 1 allpornvids.com, 1 allpost.co, 1 -allprices.world, 1 allprints.tk, 1 allproptonline.com, 1 allrad-buck.de, 1 @@ -10069,6 +10087,7 @@ almastabriz.com, 0 almatinki.com, 1 almatytips.com, 1 +almawsoa.com, 1 almayadeen.education, 1 almayoreo.com.co, 1 almaz-host.ml, 1 @@ -10140,6 +10159,7 @@ aloo.ga, 1 aloomic.com.au, 1 alopezlawfirm.com, 1 +aloplay.io, 1 alorimusic.es, 1 aloris-controle.fr, 1 aloro.io, 1 @@ -10153,6 +10173,7 @@ alpa.is, 1 alpaca.haus, 1 alpahandling.com, 1 +alpaka-rave.de, 1 alpan.ml, 1 alpan.tk, 1 alpca.org, 1 @@ -10211,6 +10232,7 @@ alphadronten.tk, 1 alphaetomega3d.fr, 1 alphagames.tk, 1 +alphagrowth.io, 1 alphahosting.hu, 1 alphainsider.com, 1 alphakites.de, 1 @@ -10437,7 +10459,6 @@ altospam.net, 1 altovoltaggio.tk, 1 altoweb.tk, 1 -altphotos.com, 1 altralamezia.tk, 1 altramarsala.tk, 1 altransport.ca, 1 @@ -10502,7 +10523,6 @@ alviano.com, 0 alvicom.hu, 1 alviere.com, 0 -alvies-laufbus.de, 1 alvimedika.com.ua, 1 alvinalvelino.com, 1 alvinaonline.com, 1 @@ -10587,7 +10607,7 @@ amaisd.org, 1 amaiz.com, 0 amalbansode.com, 1 -amalelmohtar.com, 1 +amalelmohtar.com, 0 amalfi5stars.com, 1 amalfipositanoboatrental.com, 1 amalgaamvrij.tk, 1 @@ -10607,13 +10627,16 @@ amanerain.com, 1 amanet.ro, 1 amani-kinderdorf.de, 1 +amanit.ch, 1 amanitae.eu, 1 amansinghbhogal.com, 0 +amanwithoutaname.com, 1 amanydesignstudio.com, 1 amapspa.it, 1 amaranth-legacy.community, 1 amaranth.gq, 1 amaranth.tk, 1 +amaranthbusinesssolutions.com, 1 amaranthus.com.ph, 1 amaresq.com, 1 amarilio.com.mx, 1 @@ -10651,7 +10674,6 @@ amaxautomotive.com.au, 1 amayagrowth.fund, 1 amazarashi.com, 1 -amazdriver.com, 1 amazetimberfurniture.com.au, 1 amazfoods.com.ng, 1 amazhot.com, 1 @@ -10696,6 +10718,7 @@ amberba.tk, 1 ambercaravalho.com, 1 amberddesign.com, 1 +amberesdetective.be, 1 amberhouse.cf, 1 amberhouse.ga, 1 amberhouse.gq, 1 @@ -10773,10 +10796,8 @@ ameenaccounting.co.za, 1 ameeradubai.com, 1 amees.me, 0 -ameeventos.pt, 0 amefrec.co.jp, 1 ameho.me, 0 -ameinteriores.pt, 0 ameisenbaer.tk, 1 amelanchiers.tk, 1 amelia-wedding.pl, 1 @@ -10834,7 +10855,6 @@ americanlegaltranscription.com, 1 americanmessaging.net, 1 americanmusical.com, 0 -americannationaldogregistry.org, 1 americanoncology.com, 1 americanpointer.co, 1 americanpop.be, 1 @@ -10937,13 +10957,14 @@ amigosgranada4050.tk, 1 amihousebuyers.com, 1 amikekszunkjatek.hu, 1 -amilaresort.com, 1 +amilaresort.com, 0 amilcalcados.com.br, 1 amilesportes.com.br, 1 amilum.org, 1 amimi.tk, 1 amimore.ru, 1 aminafrance.com, 1 +amindigital.uk, 1 amineptine.com, 1 aminfarhoodi.tk, 1 aminformatica.ml, 1 @@ -11054,7 +11075,6 @@ amos.ovh, 1 amosca.tk, 1 amotarget.com, 0 -amotheart.com, 1 amotive.shop, 1 amoursucre.com, 1 amoxicillin-500mg.ga, 1 @@ -11121,7 +11141,6 @@ ams-ix.net, 1 ams.co.rs, 1 amsaantours.com, 1 -amsconnectapp.com, 1 amscrosscomp.nl, 1 amsel305nc.ddnss.de, 1 amsev.de, 1 @@ -11178,6 +11197,7 @@ amyria.jp, 1 amyrussellhair.com, 1 amyshao.cn, 1 +amysnotdrunk.com, 1 amytuarez.ga, 1 amytuarez.gq, 1 amytuarez.ml, 1 @@ -11188,7 +11208,6 @@ amzinfotech.com, 0 amzn.com, 1 amzn.ee, 1 -amzn.rocks, 1 amznrbs.com, 1 an-alf-denkend.de, 1 an-alles-gedacht.de, 1 @@ -11356,7 +11375,6 @@ ancestryinstitution.com, 1 ancestryunofficial.com, 1 anchev.net, 1 -anchoragedemocrats.org, 0 anchorbvfs.com, 1 anchorit.gov, 1 anchoritsg.com, 1 @@ -11387,6 +11405,7 @@ andefang.com, 1 andel.info, 0 anders.hamburg, 1 +andersbedraad.nl, 1 anderskp.dk, 0 andersoncountytn.gov, 1 andersonenergy.com.au, 1 @@ -11477,7 +11496,6 @@ andreferreira.website, 1 andrehartensveld.tk, 1 andrehazeswinactie.nl, 1 -andreichira.ro, 1 andreihodorog.com, 1 andreiluca.com, 1 andrejbenz.com, 1 @@ -11485,7 +11503,6 @@ andremalraux.com, 1 andrematosband.tk, 1 andreoliveira.io, 1 -andreotti-furniture.com, 1 andrepicard.de, 1 andresbandb.tk, 1 andrescuartas.tk, 1 @@ -11500,7 +11517,6 @@ andresvillanueva.mx, 1 andresxmd.eu, 1 andreundnina.de, 0 -andrew-lazarev.com, 1 andrew.eu.org, 1 andrew.fi, 1 andrewazzopardi.org, 1 @@ -11526,7 +11542,6 @@ andrewpeng.net, 1 andrewpucci.com, 0 andrewrdaws.com, 1 -andrewreaganm.com, 1 andrewrgoss.com, 1 andrewryno.com, 1 andrewsfasteners.uk, 1 @@ -11540,6 +11555,7 @@ andrey1p.ru, 1 andreyborisov.cf, 1 andreyjuravlev.ga, 1 +andreykapro.ink, 1 andreysmirnov.tk, 1 andrian.ga, 1 andrian.io, 1 @@ -11554,6 +11570,7 @@ android-10-inch-tablets.tk, 1 android-center.tk, 1 android-club.cf, 1 +android-digital.de, 1 android-gamers.tk, 1 android-hit.ml, 1 android-it.cf, 1 @@ -11593,12 +11610,12 @@ androidworld.nl, 1 androidzone.me, 1 androlab.tk, 1 +andromeda.se, 1 andropia-online.fr, 1 androscoggincountyema.gov, 1 androskylugo.com, 0 androtix.com, 1 andrush.eu, 1 -andrzej.website, 1 andscape.com, 1 andsecure.ch, 0 andthisismyodyssey.tk, 1 @@ -11656,14 +11673,12 @@ anessex.wedding, 1 anesterov.xyz, 1 anetaben.nl, 1 -anetofwellness.com, 0 anetteolzon.tk, 1 anewlife.care, 1 anewlife.it, 1 anewperspectiveconstruction.com, 1 anex.us, 1 anexperimentedblog.tk, 1 -anextraordinaryday.net, 1 anfadern.com, 1 anfieldbc.co.uk, 1 anfilada.info, 1 @@ -11704,7 +11719,6 @@ angelinafilipski.tk, 1 angeliquewoudenberg.tk, 1 angelitomagno.es, 1 -angelkeepers.net, 1 angellswesternwear.com, 1 angelo4ek.tk, 1 angeloangioi.tk, 1 @@ -11884,6 +11898,7 @@ animeday.tk, 1 animedescarga.ml, 1 animedon.tk, 1 +animedreamai.com, 1 animeelite.tk, 1 animefeverzone.com, 1 animefluxxx.com, 1 @@ -11947,6 +11962,7 @@ aniwatch.me, 1 aniwhen.com, 1 aniya.moe, 1 +anja-vastgoed.nl, 1 anjajoerger.life, 1 anjansundaram.com, 1 anjara.eu, 1 @@ -11991,7 +12007,7 @@ ankiuser.net, 1 ankiweb.net, 1 anklepainclinic.sg, 1 -anklesdown.com, 1 +anklesdown.com, 0 ankos.cf, 1 ankosofttech.com, 1 ankosofttech.de, 1 @@ -12083,6 +12099,7 @@ annonces34.tk, 1 annonline.com, 1 annonseringonline.se, 1 +annotera.ai, 1 announcement.tk, 1 annovasolutions.com, 1 annoyinggui.de, 1 @@ -12157,12 +12174,12 @@ anoual-lycee.tk, 1 anouncer.ga, 1 anova.com, 1 -anoxinon.de, 1 anoxinon.media, 1 anp.it, 1 anpaju.gq, 1 anpigabon.ga, 1 anquankongjian.com, 1 +anquanssl.com, 1 anrworldwide.com, 1 ans-ge.ch, 0 ans-solutions.com, 1 @@ -12250,6 +12267,7 @@ antennisti.palermo.it, 1 antennisti.roma.it, 1 anteny.ml, 1 +anteos.de, 1 antephaber.tk, 1 anteros.shop, 0 antfarm.cf, 1 @@ -12350,7 +12368,6 @@ antikvar-net.tk, 1 antikvariat22.cz, 1 antikvarshop.tk, 1 -antilaserpriority.com, 1 antiled.by, 1 antimateri.com, 1 antimaterie.tk, 1 @@ -12384,6 +12401,7 @@ antitabak.tk, 1 antitarlo.it, 1 antiuser.tk, 1 +antiva.uk, 1 antivandal.tk, 1 antivigilancia.tk, 1 antiviraci.cz, 1 @@ -12395,7 +12413,6 @@ antizanzare.it, 1 antize.tk, 1 antnetwork.tk, 1 -antocom.com, 1 antocom.ru, 1 antoga.eu, 1 antoinat.fr, 1 @@ -12530,7 +12547,6 @@ anystack.xyz, 1 anythingforsports.com, 1 anytimefitness.co.in, 1 -anytimefitness.co.uk, 1 anytimefitness.nl, 1 anytimefundingers.ga, 1 anytimefundingest.ga, 1 @@ -12573,7 +12589,6 @@ aolcollege.com, 1 aomar-mohammedi.tk, 1 aomeikey.org, 0 -aomz.org, 1 aonedatasolution.com, 1 aonhewitt.com.cy, 1 aonhewitt.gr, 1 @@ -12599,7 +12614,6 @@ aotech.tw, 1 aotopo.com, 1 aova.loan, 1 -aoxinstudy.com, 1 aoyadaily2024.com, 1 aoyagi-farm.jp, 1 aoyama-azabu-dc.com, 1 @@ -12652,7 +12666,6 @@ apdtalents.org.tw, 1 apea.com, 1 apec.fr, 1 -apecsustain.com, 1 apedreira.com, 1 apef.ch, 0 apefrog.tk, 1 @@ -12771,7 +12784,6 @@ apk-world.cf, 1 apk.li, 1 apk4fun.com, 1 -apkcunk.com, 1 apkdv.com, 0 apkmint.co, 1 apkmody.io, 1 @@ -13040,7 +13052,6 @@ appraf.com, 1 appraisalroomest.ga, 1 apprank.in, 1 -appreal-vr.com, 1 apprendre-le-russe-avec-ania.fr, 1 apprenticedocs.com.au, 1 apprenticeship-toolbox.eu, 1 @@ -13122,6 +13133,7 @@ aprincesadolar.pt, 1 apriorit.com, 1 aprofunda.art.br, 1 +aprogramozo.hu, 1 apropoaalst.be, 1 apropont.hu, 1 apropotv.ro, 0 @@ -13135,6 +13147,7 @@ apsa.paris, 1 apsb.cz, 1 apsbengdubi.org, 1 +apsc.jp, 1 apse.ga, 1 apsissolutions.com, 1 apsistemas.info, 1 @@ -13187,8 +13200,10 @@ aqlivia.com, 1 aqmetrics.com, 1 aqqrate.com, 1 +aqss.rs, 1 aqu.com, 1 aqua-academy.at, 1 +aqua-dom33.ru, 1 aqua-ferra.co.uk, 1 aqua-fitness-nacht.de, 1 aqua-fm.tk, 1 @@ -13253,6 +13268,7 @@ aquarq.com, 1 aquasaur.tk, 1 aquascaping.tk, 1 +aquasis.es, 1 aquasis.pt, 1 aquasplash.ae, 1 aquastudios.games, 1 @@ -13283,7 +13299,6 @@ ar-vernet.fr, 1 ar.al, 1 araadvocats.net, 1 -arab-drama.com, 1 arab-drama.tv, 1 arab-dream.net, 1 arab-romance.tk, 1 @@ -13303,7 +13318,6 @@ arabic-for-nerds.com, 1 arabic-shirts.com, 1 arabicbayan.tk, 1 -arabicdress.com, 1 arabictranslation.tk, 1 arabicxz.com, 1 arabigolestan.tk, 1 @@ -13336,7 +13350,6 @@ araluenvalleyhotel.ga, 1 aralun.net, 1 aralys.com, 1 -aramega.com, 1 aramido.de, 1 aramleisure.com, 1 aramyayinevi.com, 1 @@ -13403,6 +13416,7 @@ arc.int, 0 arc.net, 1 arc.run, 1 +arca.info.ro, 1 arca.live, 1 arcada-company.com, 1 arcadami.gov, 1 @@ -13627,7 +13641,6 @@ arge-bilisim.com, 1 argedijital.com, 1 argekultur.at, 1 -argency.com, 1 argentas.com, 1 argentinachat.tk, 1 argentinatrabaja.org, 1 @@ -13776,6 +13789,7 @@ arkagis.com, 1 arkagt.ir, 1 arkaic.dyndns.org, 1 +arkaitzmolinuevo.com, 1 arkanpath.com, 1 arkansastitlesearch.com, 1 arkcapitaltrading.com, 1 @@ -13825,6 +13839,7 @@ armadilloroofing.co.uk, 1 armadilloscubatx.com, 1 armado.tk, 1 +armagangultekin.av.tr, 1 armageddonclan.tk, 1 armahackers.tk, 1 armakuni.com, 1 @@ -13841,7 +13856,7 @@ armaplatform.com, 1 armarinhovirtual.com.br, 1 armaselektronik.com, 1 -armateursderhum.fr, 1 +armateursderhum.fr, 0 armatura.kiev.ua, 1 armazemdaminiatura.com.br, 1 armazemdeminasmg.com.br, 1 @@ -13943,7 +13958,6 @@ aroma-therapy.tk, 1 aroma24.ml, 1 aromachat.eu, 1 -aromacoffee.bg, 1 aromacos.ch, 1 aromaduft.at, 1 aromaecocandles.ca, 1 @@ -14287,7 +14301,6 @@ artru.tk, 1 arts.gov, 1 artsalon.tk, 1 -artsautomotive.com, 1 artscanvas.org, 1 artsinbushwick.org, 1 artslife.com, 1 @@ -14358,7 +14371,6 @@ arxarios.tk, 1 aryacom.com, 1 aryalaroca.de, 1 -aryan-nation.com, 1 aryani-fitriana.tk, 1 aryaoffshore.com, 1 aryasenna.net, 1 @@ -14389,9 +14401,9 @@ as200351.net, 1 as202413.net, 1 as203145.com, 1 +as204830.net, 1 as204982.net, 1 as205794.net, 1 -as205941.net, 1 as207618.net, 1 as207960.net, 1 as209245.net, 1 @@ -14489,12 +14501,12 @@ asdf.one, 1 asdfqwerty.duckdns.org, 1 asdwfwqd.com, 1 +aseannow.com, 1 asecla.com, 1 asecus.ch, 1 aseelanimalhealth.com, 1 asegem.es, 1 aseglobal.com, 0 -aseishika.com, 1 aseith.com, 1 aselectionoffice.gov, 1 aselo.org, 1 @@ -14547,11 +14559,11 @@ asherosborne.com, 1 asheroto.com, 1 asherrit.com, 1 +ashersec.com, 1 ashesdiamonds.com, 1 ashesheriff.gov, 1 ashevillemenshealth.com, 1 ashfak.tk, 1 -ashfordcastle.com, 1 ashgroveclinic.com.au, 1 ashgw.me, 0 ashiba-kagu.com, 1 @@ -14598,8 +14610,7 @@ asiaferguson.com, 1 asiafood-curator.com, 1 asiagate.ga, 1 -asiahabit.com, 1 -asiahilux.com, 1 +asiahabit.com, 0 asiakartu.tk, 1 asialeonding.at, 1 asialivenewscafe.gq, 1 @@ -14681,7 +14692,6 @@ askjan.org, 1 askkaren.gov, 1 asklea.ai, 1 -asklyrics.com, 1 askme-events.vip, 0 askme-fast.tk, 1 askme24.de, 1 @@ -14700,6 +14710,7 @@ askwhy.cz, 1 askwhy.eu, 1 asla.info, 1 +aslabs.com.br, 1 aslanadam.com, 1 aslansbookkeeping.com, 1 aslansigorta.net, 1 @@ -14760,7 +14771,6 @@ aspernallee.at, 1 asphaltfruehling.de, 1 asphalting.org, 1 -asphaltsolutionsnc.com, 1 asphyxia.su, 1 aspi.cz, 1 aspietechygamer.tk, 1 @@ -14833,7 +14843,6 @@ assently.com, 1 assentooriginal.com.br, 1 assessmentpractitioner.co.za, 1 -assessments.careers, 1 assessorindie.tk, 1 assetbacked.capital, 0 asseti.co, 1 @@ -14849,7 +14858,6 @@ assignacii.ml, 1 assignmentcrafters.com, 1 assignmenthelper.org, 1 -assignmenthelponline.co.uk, 1 assignmenthelpservices.com, 1 assignments4u.com, 1 assikerujked.tk, 1 @@ -14873,7 +14881,6 @@ assistere-a-domicilio.it, 1 assistere-in-famiglia.it, 1 assistivebathing.co.uk, 1 -assistlink.io, 1 assistmedica.com, 1 assistouest.fr, 1 assistouest.net, 1 @@ -14905,6 +14912,7 @@ assyrus.it, 0 ast-nabytek.cz, 1 ast-travel.ru, 1 +astacus.nl, 1 astana.cf, 1 astanainform.tk, 1 astanakz.tk, 1 @@ -14949,7 +14957,6 @@ astigmatic.gq, 1 astilesphotography.com, 1 astilla.com.ar, 1 -astleyplumbing.com, 1 astmatiki.ru, 1 astmb117.com, 1 astmg85.com, 1 @@ -15068,6 +15075,7 @@ asvsa.ch, 0 aswe.win, 1 asweetsmile.com, 1 +aswinibajajclasses.com, 1 asws.nl, 1 asyadexpress.com, 1 asyaport.com, 1 @@ -15135,7 +15143,6 @@ atcstl.org, 1 atcworldaviation.com, 1 atds.ch, 0 -ateainsights.com, 1 ateam.net, 1 ateamsport.dk, 1 atease-salon.jp, 1 @@ -15154,13 +15161,11 @@ ateliercommerce.com, 1 atelierdelachaine.fr, 0 atelierdelacreation.com, 1 -atelierdeloulou.fr, 1 atelierdesflammesnoires.fr, 1 atelierferro.be, 1 atelierhsn.com, 1 atelierjs.com, 1 atelierkuni.jp, 1 -atelierlk.art, 1 ateliernaruby.cz, 1 atelierquersin.fr, 1 atelierssud.swiss, 1 @@ -15304,13 +15309,10 @@ atlas-sat.tk, 1 atlas-staging.ml, 1 atlas.computer, 0 -atlas.md, 1 atlas.promo, 1 atlasams.com, 1 atlasbridge.com, 1 -atlasbus.by, 1 atlasbus.pl, 1 -atlasbus.ru, 1 atlascloud.cn, 1 atlascoffeeclub.com, 1 atlascultural.com, 1 @@ -15318,7 +15320,6 @@ atlasdev.io, 1 atlasescorts.com, 1 atlasflare.com, 1 -atlasgaming.ma, 0 atlasindustries.com, 1 atlaslandrecords.com, 1 atlasleeuwen.tk, 1 @@ -15380,6 +15381,7 @@ atom-china.org, 1 atombase.org, 1 atomeus.nl, 0 +atomglimpses.cn, 1 atomic-bounce.com, 1 atomic.radio, 1 atomicanet.tk, 1 @@ -15417,7 +15419,6 @@ atrevillot.com, 1 atrexservices.com, 1 atriamedical.ro, 1 -atriaresort.ro, 1 atrias.net, 1 atriballi.com.br, 1 atribo.com, 1 @@ -15525,7 +15526,6 @@ aubergegilly.ch, 0 aubi-plus.de, 1 aubio.org, 1 -aubry.org, 1 aubs.co.uk, 1 auburn-housekeeper.com, 1 auburnma.gov, 1 @@ -15537,7 +15537,6 @@ aucc.org.nz, 1 auchan.fr, 1 auchan.pt, 1 -aucielrose.com, 1 auckland-lawyer.co.nz, 1 auckland-painter.co.nz, 1 auckland.ac.nz, 1 @@ -15651,6 +15650,7 @@ augur.us, 1 auguri-shop.ro, 1 august-hoegn.tk, 1 +august-wenzler.de, 1 august.me, 1 augusta-apotheke.nrw, 1 augustaky.gov, 1 @@ -15683,6 +15683,7 @@ aumc.net, 1 aumigona.com, 1 aumilieudumonde.gf, 1 +aumisc.com, 1 aumonerie-lacatho.fr, 1 aumpram.org, 1 auntiesnorkel.com, 1 @@ -15714,6 +15715,7 @@ aurbrowser.tk, 1 aurdumesti.ro, 1 aurea-sp.org, 1 +auregaldescoches.fr, 1 aurelharmoniebeaute.fr, 1 aurelie-valognes.com, 1 aurelien-duchene.fr, 1 @@ -15779,6 +15781,7 @@ ausgrants.com.au, 1 ausics.net, 1 ausielogistics.com.au, 1 +auskast.com, 1 auskate.tk, 1 auskunftsbegehren.at, 1 ausl.mo.it, 1 @@ -15808,8 +15811,8 @@ austcm.com.au, 1 austenplumbing.com, 1 austercita.tk, 1 -austickcarremoval.com.au, 0 -austin-security-cameras.com, 1 +austickcarremoval.com.au, 1 +austillconstruction.com, 1 austinbestdjs.com, 1 austincardiac.com, 1 austincosmetic.com, 1 @@ -15817,6 +15820,7 @@ austinlaw.co.uk, 1 austinnoll.com, 1 austinonline.tk, 1 +austinosuide.com, 1 austinoutline.com, 1 austinoverheaddoorcompany.com, 0 austinrifleclub.org, 1 @@ -15825,7 +15829,6 @@ australia.cn, 1 australia.com, 1 australia.jp, 1 -australiabusinessblog.com, 0 australiadaily.ga, 1 australiaday.com.au, 1 australian.tk, 1 @@ -15842,7 +15845,6 @@ australianonlineappliances.ga, 1 australianpropertyanalytics.ga, 1 australiantales.com, 0 -australiantemporarytattoos.com.au, 1 australianvolunteers.com, 1 australien-tipps.info, 1 austria-salzburg.at, 1 @@ -15875,6 +15877,7 @@ authenticfoodquest.com, 1 authentick.online, 1 authentick.systems, 1 +authenticwindows.com, 1 authentisch-italienisch-kochen.de, 1 authic.io, 0 authinfo-bestellen.de, 1 @@ -15965,6 +15968,7 @@ autocenters.ca, 1 autocheck.co.nz, 1 autocirkel.tk, 1 +autoclean93.fr, 1 autocmall.com, 1 autocoder.chat, 1 autoconcept.ga, 1 @@ -15978,6 +15982,7 @@ autocrossteam.tk, 1 autoctona.org, 1 autodeal.com.ph, 1 +autodeal.my, 1 autodemolizioni.roma.it, 1 autodidactic.ai, 1 autodidacticstudios.com, 1 @@ -16042,8 +16047,10 @@ automa.biz, 1 automaatic.com, 1 automagischeberegening.nl, 1 +automaq.com.py, 1 automastercastlerock.com, 1 automatecodes.com, 1 +automaticagarage.it, 1 automationlab.it.com, 1 automationpro.me, 1 automationsforum.se, 1 @@ -16254,6 +16261,7 @@ autorepmans.com, 1 autoresponderilimitado.tk, 1 autoreview.ml, 1 +autoricambisanmauro.it, 1 autorijschooldehaas.nl, 0 autorijschooljohanbos.nl, 1 autorijschoolrichardschut.nl, 1 @@ -16282,7 +16290,6 @@ autospurghi.roma.it, 1 autospurgo.co, 1 autospurgo.com, 1 -autospurgo.it, 1 autospurgo.milano.it, 1 autospurgo.name, 1 autostationsest.ga, 1 @@ -16431,6 +16438,7 @@ avantumrx.com, 1 avanwyk.com, 1 avanzbanc.com, 1 +avanzza.net, 1 avaralar.tk, 1 avarcom.tk, 1 avarie.ru, 1 @@ -16474,7 +16482,6 @@ avenir-now.ch, 1 avenir-now.com, 1 avenir-now.de, 1 -avensure.com, 0 avensurereviews.com, 1 aventabarbados.com, 1 aventajamaica.com, 1 @@ -16510,7 +16517,6 @@ avia-krasnoyarsk.ru, 0 aviabilet.tk, 1 aviacao.pt, 0 -avianbrands.com, 1 aviandirectory.uk, 1 avianotravel.com, 1 aviaphoto.tk, 1 @@ -16550,7 +16556,6 @@ avie.de, 1 avif.tf, 1 avilatinoamerica.com, 1 -avilauto.com, 1 avilauto.net, 1 aviles.com.sv, 1 avinguard.com, 1 @@ -16745,6 +16750,7 @@ awo-bremen.de, 1 awo-sh.de, 1 awoau.com.au, 1 +awqaf.gov.ae, 1 awqaf.gov.ly, 1 awrcourtreporter.com, 1 awrcourtreporters.com, 1 @@ -16772,6 +16778,7 @@ axa-mandiri.co.id, 1 axa.ch, 1 axa.de, 1 +axarobd.com, 1 axavalon.tk, 1 axchap.ir, 1 axcient.com, 1 @@ -16877,7 +16884,6 @@ ay-net.jp, 1 ay-tour.ru, 1 ayabank.us, 1 -ayahya.me, 0 ayakatenshi.tk, 1 ayamchikchik.com, 1 ayanomimi.com, 1 @@ -17033,6 +17039,7 @@ azaleos.com, 1 azalhavayolu.com.tr, 1 azallon.com.br, 1 +azapp-vvv-program-api-dev.azurewebsites.net, 1 azaria.blog, 1 azarkepic.com, 1 azartmania.ga, 1 @@ -17203,13 +17210,10 @@ b2bchiemihara.com, 1 b2be.com, 1 b2bespada.com, 1 -b2bhint.com, 1 b2bimmo.ch, 0 b2binpay.com, 0 b2bmail.ga, 1 -b2bmuzikbank.com, 1 b2bpoke.com, 1 -b2btaz.com, 1 b2markt.de, 1 b2music.asia, 1 b2og.com, 1 @@ -17365,6 +17369,7 @@ babb.is, 1 babbel.tk, 1 babbelchat.tk, 1 +babbels.com, 1 babblefeed.tk, 1 babehunt.tk, 1 babekids.tk, 1 @@ -17542,7 +17547,6 @@ backtobed.com, 1 backtobed.org, 1 backup-kurumsal.com, 1 -backup-mx.email, 1 backupassist.de, 1 backupauthentication.com, 1 backwardsalphabet.tk, 1 @@ -17584,7 +17588,6 @@ bad.spdns.de, 1 badaa.info, 1 badaniebezdechu.pl, 1 -badante.it, 1 badanteinfamiglia.it, 1 badaparda.com, 1 badass-women.club, 1 @@ -17655,6 +17658,7 @@ badrequest.me, 1 badri-taxi-vtc.com, 1 badrock.tk, 1 +badsam.fr, 1 badseacoffee.com, 1 badsl.nl, 1 badstar.tk, 1 @@ -17681,6 +17685,7 @@ bafoeg-rechner.de, 1 baframedya.tk, 1 bafus.ru, 1 +bagatip.com, 1 bagdagul.tk, 1 bagelbrands.com, 1 bagelsbakery.com, 0 @@ -17747,6 +17752,7 @@ baileyladders.com.au, 1 baileysharborwi.gov, 1 baileystrailsystem.org, 1 +baileyventuresllc.com, 1 bailleux.be, 1 bailodromo.tk, 1 bailong.kr.ua, 1 @@ -17779,7 +17785,6 @@ bajacalifornia.tk, 1 bajajplasticsurgery.com, 1 bajalotodo.tk, 1 -bajanthings.com, 1 bajaprogramas.tk, 1 bajic.ch, 1 bajiotec.com, 1 @@ -17812,7 +17817,6 @@ bakercounty911or.gov, 1 bakercountyor.gov, 1 bakercountysheriffor.gov, 1 -bakerlawfirm.ca, 1 bakersafari.co, 1 bakersfieldhomeoffer.com, 1 bakerviewdentalcentre.com, 1 @@ -17850,7 +17854,6 @@ balador.io, 1 baladygov.com, 1 balafon.cloud, 1 -balaga.pl, 1 balaganlimited.cf, 1 balaganoff.tk, 1 balagne-corsica.com, 1 @@ -17979,7 +17982,6 @@ baltlex.de, 1 baltrag.com, 1 bam.com.gt, 1 -bamahi.ir, 1 bamaland.org, 1 bambamthetanman.com, 0 bamberger-maelzerei.de, 1 @@ -18028,7 +18030,6 @@ bancamiga.com, 1 bancastato.ch, 1 banch.io, 1 -banchungcu.com, 1 bancoagricola.com, 1 bancoatlantida.com.ni, 1 bancobica.com.ar, 1 @@ -18201,7 +18202,6 @@ bannsecurity.com, 1 banquevanbreda.be, 0 banri.me, 1 -bansalacademy.com, 1 bansenkou.co.jp, 1 bantaihost.com, 1 bantchev.com, 1 @@ -18218,7 +18218,6 @@ banzhuti.com, 1 bao-in.net, 1 baobabgroup.com, 1 -baobaoquming.net, 0 baocheng.tech, 1 baofuzhuan.com, 1 baogao.store, 1 @@ -18263,9 +18262,9 @@ barbarareynoldsphotography.com, 1 barbarianbear.art, 1 barbarians.com, 0 -barbaros.info, 1 barbate.fr, 1 barbatulsuperior.ro, 1 +barbeirocetif.com.br, 1 barbericonic.com, 1 barberscorner.tk, 1 barbershop-harmony.org, 0 @@ -18286,7 +18285,6 @@ barca-movie.jp, 1 barcamp.koeln, 1 barcelonapremiummini.es, 1 -barcelonatours.net, 0 barcelonawinewalk.com, 1 barchetta.org, 1 barcicuvele.tk, 1 @@ -18307,7 +18305,6 @@ bardfarm.org, 1 bardian.net, 1 bardian.org, 1 -bardiharborow.com, 1 bardoferry.com, 1 bardtech.com, 1 barduschinamusic.org, 1 @@ -18339,7 +18336,6 @@ barinov.ga, 1 barinov.ml, 1 barinov.tk, 1 -bario.com.tr, 1 baripedia.org, 0 baris-sagdic.com, 1 barisdayak.com, 1 @@ -18381,6 +18377,8 @@ barnvets.co.uk, 1 barnwellcountysc.gov, 1 barobax.tk, 1 +barobot.net, 1 +barocco.by, 1 baroclean.fr, 1 barok.tk, 1 barokahmadinah.id, 1 @@ -18411,7 +18409,7 @@ barraqueirotransportes.pt, 1 barrasaccess.com, 1 barratennis.com.br, 1 -barrebody.com.au, 0 +barrebody.com.au, 1 barreiroappraisals.com, 1 barrelfish.org, 1 barrencountyky.gov, 1 @@ -18518,7 +18516,6 @@ basetherm.com, 1 basetruck.cn, 1 baseweb.design, 1 -basf-vcar.com, 1 bashari.tk, 1 bashc.at, 1 bashhack.cf, 1 @@ -18622,8 +18619,8 @@ basyspro.net, 1 bata.co.zm, 1 bata.com.bo, 1 -batac.gov.ph, 1 batacas.com, 1 +batacatalogo.pe, 1 batailleros.tk, 1 bataindustrials.ca, 1 bataindustrials.cl, 1 @@ -18651,6 +18648,7 @@ batch-media.de, 1 batch.com, 0 batchfoundation.org, 1 +batchjob.ai, 1 batchroom.com, 1 batdongsancongnghiep.vn, 0 bateaux-sans-permis.com, 0 @@ -18706,11 +18704,11 @@ battery-center.fr, 1 batteryboys.ca, 0 batteryboys.com, 0 +batterymarket.bg, 1 batterymax.org, 1 batteryreconditioning.ml, 1 battl-victory-records.com, 1 battle-arena.tk, 1 -battle-game.com, 1 battlefield1942.tk, 1 battleforkhashuri.tk, 1 battlefrontoldschool.cf, 1 @@ -18739,6 +18737,7 @@ bauer-reininghorses.com, 1 bauer.network, 0 bauermediaoutdoor.com, 1 +bauermediaoutdoor.nl, 1 bauernhof-koch-edingen.de, 1 bauernhof-lercher.at, 1 bauernmarkt-fernitz.at, 1 @@ -18777,6 +18776,7 @@ baumkuchen-aus-dresden.de, 0 baummer.com.br, 1 bauplanmanager.com, 1 +baurs.com, 1 bausep.de, 1 bausparkassen.tk, 1 baustils.com, 1 @@ -18813,6 +18813,7 @@ bayareamustangs.tk, 1 bayareaplasticsurgery.com, 1 bayashi.net, 1 +bayati.me, 1 baycialis.net, 1 baycitymi.gov, 1 baycountyfltax.gov, 1 @@ -18870,6 +18871,7 @@ bazar-pc.tk, 1 bazar.bg, 0 bazaralsham.com, 1 +bazarchy.com, 1 bazardelregalo.es, 1 bazardunet.tk, 1 bazarfds.com.br, 1 @@ -18887,7 +18889,6 @@ bazos.cz, 1 bazos.pl, 1 bazos.sk, 1 -bazziergraphik.com, 1 bb-aroundtheworld.se, 1 bb-es.ca, 1 bb-vinimport.dk, 1 @@ -19063,7 +19064,6 @@ bdmusic25.us, 1 bdo-tools.jp, 1 bdo.com, 1 -bdocfurniture.com, 1 bdpachicago.tech, 1 bdpn.ru, 1 bdrmedia.rs, 1 @@ -19208,7 +19208,6 @@ beaton.tk, 1 beatquantum.com, 1 beatrice-nightscout.herokuapp.com, 1 -beatrice-raws.org, 1 beatricedailysun.com, 1 beatriz-urbano-vega.tk, 1 beatrizaebischer.ch, 0 @@ -19237,6 +19236,7 @@ beautiful.ai, 1 beautifulart.ml, 1 beautifulbicester.co.uk, 1 +beautifullybrokenwords.com, 1 beautifulplaces.tk, 1 beautifulreflectionsmedspa.com, 1 beautifulrussianwomen.cf, 1 @@ -19285,6 +19285,7 @@ beautystudio-linda.com, 1 beautytechpro.ro, 1 beautytherapies.gr, 1 +beautywien.at, 1 beaver-creek.ga, 1 beavercityut.gov, 1 beaverdamautos.com, 1 @@ -19410,6 +19411,7 @@ bedrijfsfeesten.tk, 1 bedrijfsfotoreportages.nl, 1 bedrijfswasmachine.nl, 1 +bedroc.com, 1 bedrockcommunity.ml, 1 bedrockdata.com, 1 bedrocklinux.org, 1 @@ -19469,12 +19471,13 @@ beencrypted.com, 1 beenox.com, 1 beeone.nl, 1 +beep.vip, 1 beepassvpn.com, 1 beepcar.ru, 1 beeportfolio.com, 1 beeps.website, 1 beer-sheva.city, 1 -beerbruhs.com, 1 +beerbruhs.com, 0 beercast.co.uk, 1 beeremovaljohannesburg.co.za, 1 beeremovalpretoria.co.za, 1 @@ -19563,8 +19566,6 @@ behatech.tk, 1 behavhealth.ml, 1 behaving.tk, 1 -behaviorchangeimpact.org, 1 -behcr.com, 1 behealthandrehab.com, 1 behealthoncologia.com, 1 behealthpr.com, 1 @@ -19590,6 +19591,7 @@ beihelsinki.de, 1 beijing.bj, 1 beijinglug.club, 1 +beijingwonderunion.com, 1 beimchristoph.de, 1 beinad.com, 1 beinchrist.ca, 1 @@ -19621,7 +19623,6 @@ bekolite.com, 1 bekoplc.com, 1 bekstone.co.uk, 1 -bel-snegirek.ru, 0 belacapa.com.br, 1 belacine.com, 1 belafcenter.com, 1 @@ -19739,6 +19740,7 @@ bellebakes.blog, 1 bellebaum.eu, 1 bellecarmen.tk, 1 +bellehorizon.co.za, 1 bellenews.com, 1 bellenundballern.de, 1 belleplaineiowa.gov, 1 @@ -19879,6 +19881,7 @@ benefitfocus.com, 1 benefitharbor.com, 1 benefits.gov, 1 +benefitsapi.com, 1 benefitsbookcase.com, 1 benefitsforesight.com, 1 benefitsystems.ro, 0 @@ -19972,7 +19975,6 @@ bennink.me, 1 benno.frl, 1 bennygommers.nl, 1 -bennykrobot.cz, 1 bennythink.com, 1 benobi.one, 0 benoit.jp.net, 1 @@ -20080,6 +20082,7 @@ bergencountynj.gov, 1 bergenfieldnj.gov, 1 bergerandgreen.com, 1 +bergerfromm.com, 1 berget.ai, 1 berget.cloud, 1 bergevoet-fa.nl, 0 @@ -20103,7 +20106,6 @@ beritamotor.tk, 1 beritanow.tk, 1 beritatopbanten.com, 0 -beritavirall.com, 1 berjou.me, 1 berk.tk, 1 berkat-luqs.ddns.net, 1 @@ -20124,7 +20126,6 @@ berlin-cuisine.com, 1 berlin-flirt.de, 1 berlin-hotel.tk, 1 -berlin-school.foundation, 1 berlin-starlight-orchestra.de, 1 berlinal.gov, 1 berlinartweek.de, 1 @@ -20215,7 +20216,6 @@ berrialinks.fi, 1 berriencountyga.gov, 1 berries.com, 1 -berrnd.net, 1 berrus.com, 1 berry.cat, 1 berrycheapers.ga, 1 @@ -20229,6 +20229,7 @@ bersier.net, 1 bersierservices.ch, 0 berst.cz, 1 +berston.org, 1 bert-dijkink.tk, 1 bert.org, 1 bertaudarthur.fr, 1 @@ -20276,7 +20277,6 @@ besola.de, 1 besole.ch, 1 besolov.tk, 1 -besonline.es, 1 besox.be, 1 bespaarbazaar.nl, 1 bespaarenergie.click, 1 @@ -20330,6 +20330,7 @@ bestads.co.il, 1 bestafricaradio.tk, 1 bestallgames.com, 1 +bestapptools.com, 1 bestarts.tk, 1 bestasquadradas.org, 1 bestastrologermohali.in, 1 @@ -20374,7 +20375,6 @@ bestdatingsite.ml, 1 bestdatingsite.tk, 1 bestdeal-umzug.de, 1 -bestdefense.com, 1 bestdigitalsubscription.com, 1 bestdlsites2.tk, 1 bestdslrcameras.tk, 1 @@ -20385,10 +20385,10 @@ besteckliste.com, 1 bestedeal.nl, 1 besteenergieleverancier.com, 1 -bestelectricrazors.com, 1 bestelhetmaar.nl, 1 bestellipticalmachinereview.info, 1 bestelsportprijzen.nl, 1 +bestepost.de, 1 bestertagderwelt.de, 1 bestessayhelp.com, 1 bestethereumcasinos.io, 1 @@ -20417,7 +20417,6 @@ besties.house, 1 besties4life.ml, 1 bestill.foundation, 1 -bestin.ph, 1 bestinductioncooktop.us, 1 bestinsider.net, 0 bestinsulatedwaterbottle.tk, 1 @@ -20666,11 +20665,9 @@ bet1668888.com, 1 bet166999.com, 1 bet166c.com, 1 -bet166uu.com, 1 +bet166uu.com, 0 bet166ww.com, 1 bet166yy.com, 1 -bet1x-th.com, 1 -bet1x-thai.com, 1 bet333123.com, 1 bet333222.com, 1 bet333345.com, 0 @@ -20684,7 +20681,7 @@ bet333w.com, 0 bet333x.com, 1 bet333y.com, 1 -bet333z.com, 1 +bet333z.com, 0 bet338c.com, 1 bet365bc.net, 1 bet365bet2020.com, 1 @@ -20748,7 +20745,6 @@ bet86gz.com, 1 bet86hlj.com, 1 bet86hn.com, 1 -bet86jl.com, 1 bet86js.com, 1 bet86jx.com, 1 bet86ln.com, 1 @@ -20804,6 +20800,7 @@ betaworx.eu, 1 betbed.ml, 1 betbravo.et, 1 +betbrothers.es, 1 betc.com, 1 betcn-mart.com, 1 betecnet.de, 1 @@ -20851,6 +20848,7 @@ betor.sk, 1 betordertr.com, 1 betoskip.tk, 1 +betransfer.eu, 1 betreut.at, 1 betreut.de, 1 betriebsrat-ivb.at, 1 @@ -20875,7 +20873,6 @@ bettashoerepairs.com.au, 1 bettendorf.gov, 1 bettenhaus-schlafoase.de, 1 -better.ad, 1 better.com, 1 better.fyi, 1 betterbaseball.com, 1 @@ -20887,7 +20884,6 @@ bettercommunication.org.uk, 1 bettercrypto.org, 1 betterdecoratingbible.com, 1 -betterdoggos.com, 1 betterhealthatworkaward.org.uk, 1 betterhelp.com, 1 betterhelp.com.au, 1 @@ -20932,7 +20928,6 @@ bettysseafoodshack.com, 1 betulashop.ch, 1 betus.tk, 1 -betvisa.com, 1 betweenbuns.com.br, 1 betweenthehills.be, 1 betweenthesheets.tk, 1 @@ -20950,13 +20945,10 @@ betwinner1.com, 1 betwinner2.com, 1 betwinner5.mobi, 1 -betwinnerfrance.net, 1 betwinnerkenya.com, 1 -betwinnermobileapp.com, 1 betwinnernigeria.com, 1 betwinnerperu.com, 1 betwinnerportugal.com, 1 -betwinnerpromocode.net, 1 betz-family.de, 1 betza.online, 1 betzgmbh.de, 1 @@ -21080,6 +21072,9 @@ bezerocarbonmarkets.com, 1 bezin.ga, 1 bezoek-benidorm.tk, 1 +bezoekmonumentendag.nl, 1 +bezoekopenmonumentdag.nl, 1 +bezoekopenmonumentendag.nl, 1 bezoomnyville.com, 1 bezopasna-rabota.tk, 1 bezpaliuk.com, 1 @@ -21108,7 +21103,6 @@ bfly.tech, 1 bfob.gg, 1 bfoliver.com, 0 -bforb.sk, 1 bforben.uk, 1 bfp-mail.de, 1 bfpg.org, 1 @@ -21127,6 +21121,7 @@ bgbet365.com, 1 bgbhsf.top, 1 bgd-info.tk, 1 +bgembassy-cairo.com, 1 bgemi.net, 1 bget.org.uk, 1 bgetfuel.co.uk, 1 @@ -21228,6 +21223,7 @@ biasmath.es, 1 biaxin.cf, 1 biaxin.ml, 1 +biba-shop.fr, 1 bibb.de, 1 bibbvoice.com, 1 biber-bike.de, 1 @@ -21239,7 +21235,6 @@ bibit.id, 1 bibitbunga.com, 1 bibitec.de, 1 -bible-help.ru, 1 bible-maroc.com, 1 bible4u.net, 1 biblebrainhealth.com, 1 @@ -21373,9 +21368,11 @@ bietinidesign.be, 1 bieville-beuville.fr, 0 biewen.me, 0 +bifangknt.com, 1 bifatura.com.tr, 1 biflosgknm.tk, 1 biforthepeople.de, 1 +bifrostdk.dk, 1 bifrostwallet.com, 1 biftin.net, 1 big-black.de, 1 @@ -21438,7 +21435,6 @@ bigchance.tk, 1 bigchris.tk, 1 bigclassaction.com, 1 -bigcloudy.in, 1 bigcomputerchair.gq, 1 bigcorestintas.com.br, 1 bigcountry.com.br, 1 @@ -21535,6 +21531,7 @@ bigstr.com, 1 bigthree.ga, 1 bigthunder.ca, 1 +bigtime.gg, 1 bigtimeiq.com, 1 bigtitsmilf.com, 1 bigtix.io, 0 @@ -21547,9 +21544,7 @@ bigwest.org, 1 bigwicks.co.uk, 1 bigzoo.com.br, 1 -biharhelp.in, 0 biharujala.com, 1 -bihr.org, 1 bijlesbart.nl, 1 bijlesportal.nl, 1 bijou.be, 1 @@ -21558,7 +21553,6 @@ bijouxcherie.com, 1 bijralph.com, 1 bijzonderekoorprojecten.nl, 1 -bijzonderondernemen.nl, 1 bike-kurse.ch, 1 bike-liptov.tk, 1 bike-shack.com, 1 @@ -21644,6 +21638,7 @@ billa.bg, 1 billa.sk, 1 billaltermatt.com, 1 +billardessentials.com, 1 billaud.eu, 1 billaud.eu.org, 1 billboard-panama.ml, 1 @@ -21691,7 +21686,6 @@ billionkiaparts.com, 1 billjohnstonlandscape.com, 1 billkochman.com, 1 -billmyersrealtor.com, 1 billo.life, 1 billoberst.com, 1 billogram.com, 1 @@ -21854,6 +21848,7 @@ biodots.it, 1 bioedilizia.roma.it, 1 bioemsan.cz, 0 +bioenergias.pt, 1 bioenergie-eferding.at, 1 bioenergy-solutions.eco, 1 bioetco.ch, 1 @@ -21965,6 +21960,7 @@ bioshome.de, 1 biosignalanalytics.com, 1 biosky.tk, 1 +biosmart.pt, 1 biosolveit.de, 1 biospw.com, 1 biostaffic.com, 1 @@ -21996,6 +21992,7 @@ bip.gov.sa, 0 bipart.eu, 1 bipedecurieux.com, 1 +biplophossain.me, 1 bipolardisorderexplained.com, 1 bipolargeek.com, 1 bipolargeek.net, 1 @@ -22015,6 +22012,7 @@ birdsite.ga, 1 birdslabel.com, 1 birdsnow.com, 1 +birdviewpsa.com, 1 birdwatchireland.ie, 1 birebirvilla.com, 1 birenbaum.se, 1 @@ -22286,6 +22284,7 @@ bitski.com, 1 bitsler.ie, 1 bitso.com, 1 +bitsody.com, 1 bitsoffreedom.nl, 1 bitspaceonline.ml, 1 bitstack.nz, 1 @@ -22391,6 +22390,7 @@ bizzexpress.com, 1 bizzix.tk, 1 bizzseo.tk, 1 +bizztor.com, 1 bizzvisor.site, 0 bj-caffe.tk, 1 bja.gov, 1 @@ -22549,7 +22549,6 @@ bkin-43450.xyz, 1 bkin-46680.xyz, 1 bkk24.de, 1 -bkkf.at, 1 bkkposn.com, 1 bklaindia.com, 1 bkli.me, 1 @@ -22609,6 +22608,7 @@ black-rosella.tk, 1 black-side.tk, 1 black.com, 1 +blackace.tech, 1 blackagendareport.org, 1 blackandblond.tk, 1 blackanddecker.com, 1 @@ -22656,6 +22656,7 @@ blackforeststheoriginal.cf, 1 blackforeststheoriginal.ga, 1 blackforeststheoriginal.ml, 1 +blackframeai.org, 1 blackfridaynew.com, 1 blackfur.gay, 1 blackgamelp.de, 1 @@ -22675,7 +22676,6 @@ blackidfound.org, 1 blackisbetter.com, 1 blackjackballroomcasino.info, 1 -blackjackcalc.com, 1 blackjackprogramest.ga, 1 blackjaguar.tk, 1 blackkeg.ca, 1 @@ -22800,6 +22800,7 @@ blako-squad.tk, 1 blakylle.de, 1 blan.tk, 1 +blana.ro, 1 blanboom.org, 1 blancamartinez.com, 1 blanchardandcalhoun.com, 1 @@ -22856,9 +22857,7 @@ blauwegeit.nl, 1 blauwereigercoaching.nl, 1 blauwgras.nl, 1 -blauwwit.be, 1 blavandbike.de, 1 -blavandbike.dk, 1 blavaty.tk, 1 blayne.me, 0 blayneallan.com, 1 @@ -22958,6 +22957,7 @@ blinklabs.io, 1 blinkspeed.eu, 1 blinniza.tk, 1 +blinq-r.com, 1 blinq.me, 1 blio.tk, 1 blisko.co, 1 @@ -23072,7 +23072,6 @@ blogdieconomia.it, 1 blogdimoda.com, 1 blogdimotori.it, 1 -blogdolcevita.com, 1 blogdosimoveis.com.br, 1 blogexpress.org, 1 blogfeng.tk, 1 @@ -23106,7 +23105,6 @@ blognews.cf, 1 blognik.pl, 1 blognone.com, 1 -blogofapps.com, 1 blogom.at, 1 blogotomia.tk, 1 blogpark.tk, 1 @@ -23183,7 +23181,6 @@ blowingrock.gov, 1 blpress.org, 1 blrjmt.com, 1 -blsattestation.com, 1 blt-avocat-nantes.fr, 0 bltc.co.uk, 1 bltc.com, 1 @@ -23206,7 +23203,8 @@ blue-sky.capital, 1 blue1.com, 1 blue2purple.com, 1 -blue3investimentos.com.br, 0 +blue3investimentos.com.br, 1 +blue6ix.com.br, 1 blueangel.org.tw, 1 bluearrowrecords.com, 1 bluebahari.gq, 1 @@ -23232,7 +23230,6 @@ bluefieldwvpd.gov, 1 bluefinn.life, 1 blueflare.org, 1 -bluefletch.com, 1 blueflow.pl, 1 bluefrog.ca, 1 bluefrontier.co.uk, 1 @@ -23474,7 +23471,6 @@ bnwrdil.gov, 1 bnz.co.nz, 1 bo-1xbet.com, 1 -bo-elguitars.com, 1 bo-rad.de, 1 bo.ke, 1 bo1689.com, 0 @@ -23488,6 +23484,8 @@ boardex.com, 1 boardfree.tk, 1 boardgamegeeks.de, 1 +boardgamepulse.com, 1 +boardgamereview.online, 1 boardgamesforallages.com, 1 boardingschoolreview.com, 1 boardlinks.gov.au, 1 @@ -23499,7 +23497,6 @@ boardusersers.ga, 1 boat-engines.eu, 1 boat-systems.pl, 0 -boatandsailboat.com, 1 boathut.com.au, 1 boats.com, 0 boatsandoats.com, 1 @@ -23523,6 +23520,7 @@ bobbielee.co.uk, 1 bobbyfischer.tk, 1 bobbyhardman.co.uk, 1 +bobbylondon.co.uk, 1 bobbylondon.uk, 1 bobbyoriginal.tk, 1 bobbyrobinson.tk, 1 @@ -23609,7 +23607,6 @@ bodyconcept-kfz.de, 1 bodyhealthcare.tk, 1 bodymassage.cf, 1 -bodymfr.com, 1 bodymod.tk, 1 bodymusclejournal.com, 1 bodyofevidence.ca, 1 @@ -23951,6 +23948,7 @@ booking.com, 1 booking.site, 1 bookingdata.net, 1 +bookingengine.es, 1 bookinghealth.com, 1 bookingkoala.com, 1 bookinglane.com, 1 @@ -24056,6 +24054,8 @@ bootcampkatwijk.nl, 1 boothillcasino.com, 1 booths.cyou, 1 +bootlabs.net, 1 +bootrading.com, 1 boots-shop.tk, 1 bootsa.ga, 1 bootsa.tk, 1 @@ -24112,6 +24112,7 @@ boreo.si, 1 boresmail.ru, 1 borfin.com, 1 +borgcube.me, 1 borgerligabegravningsbyran.com, 1 borglig.se, 1 borgligbegravning.com, 1 @@ -24422,6 +24423,7 @@ bouwbedrijfdesmet.be, 1 bouwbedrijfjstam.nl, 1 bouwbedrijfkorstanje.nl, 1 +bouwenaandenbosch.nl, 1 bouwklikshop.nl, 1 bouwklikweb.nl, 1 bouwma.nl, 1 @@ -24437,7 +24439,6 @@ bowdens.me, 1 bowdoinmaine.gov, 1 bowenrealty.com, 1 -boweryandvine.com, 1 bowhill.me, 1 bowhunter-ahorn.de, 0 bowlcake.fr, 1 @@ -24524,7 +24525,6 @@ bpastudies.org, 1 bpconsulting.kz, 1 bpd.nl, 1 -bpddemystified.com, 1 bpetersondesign.com, 1 bphostels.com, 1 bpinvest.ch, 1 @@ -24584,7 +24584,7 @@ bracknellvets.co.uk, 1 bractwogothica.ml, 1 brad.fi, 1 -bradbinko.com, 1 +bradalnutri.com.br, 1 bradeales.com, 1 bradentonfl.gov, 1 bradfield-designs.com, 1 @@ -24691,6 +24691,8 @@ branchtobox.com, 1 branchtrack.com, 1 brand-design.studio, 1 +brand.contact, 1 +brand.site, 1 brandabaski.tk, 1 brandbags.gr, 1 brandbastion.com, 1 @@ -24704,18 +24706,19 @@ brandfolder.com, 1 brandhost.tk, 1 brandhout-b-tree.be, 1 -brandinc.digital, 1 brandingcoapps.com, 1 brandinspiration.fr, 1 brandinstitute.com, 1 brandketers.com, 1 brandmovers.co, 1 +brandmrwijchen.nl, 1 brandnucreations.com, 1 brando753.xyz, 1 brandon-manilow.tk, 1 brandon.so, 0 brandonbonine.com, 1 brandoncricket.tk, 1 +brandonfoxphotos.com, 1 brandongevallen.tk, 1 brandongomez.me, 1 brandonhaynesmd.com, 1 @@ -24734,9 +24737,9 @@ brandsafe.io, 1 brandsclub.tk, 1 brandsource.com, 1 -brandsourcett.com, 1 brandsseekers.com, 1 brandstof-prijzen.nl, 1 +brandsynergy.pl, 1 brandtechdesign.co.uk, 1 brandtrapselfie.nl, 1 brandweer-almelo.tk, 1 @@ -24772,6 +24775,7 @@ brasil66.tk, 1 brasilandia.tk, 1 brasilcheats.tk, 1 +brasilcursinhos.org, 1 brasilduino.tk, 1 brasilemergenciasmedicas.com.br, 1 brasiliademinasnet.tk, 1 @@ -24801,7 +24805,6 @@ bratunaconline.tk, 1 brau-ingenieur.de, 1 braudoktor.de, 1 -brauer-augenoptik.de, 1 brauingenieur.de, 1 braunbergerfreelance.com, 1 braunpodiatryplus.com, 1 @@ -24889,7 +24892,6 @@ breakingdeal.fr, 1 breakingnewskenya.tk, 1 breakingthesilence.org.il, 1 -breakingvap.fr, 1 breakinoutpr.com, 1 breakofdawn.tk, 1 breaksome.tech, 1 @@ -25001,7 +25003,6 @@ brewcentralny.com, 1 brewerybarbotley.com, 1 brewin.ml, 1 -brewmovers.com, 1 brewsouth.com, 1 brex.pw, 1 brexit.tk, 1 @@ -25061,7 +25062,6 @@ brickftp.com, 1 brickland.tk, 1 bricks-clicks.com, 1 -bricks4kidzelearn.com, 1 bricksandmotor.co.uk, 1 brickweb.co.uk, 1 brickwerks.io, 1 @@ -25138,7 +25138,7 @@ brighter.ai, 1 brightershoreswiki.org, 1 brightfuturemadebyme.com, 1 -brighthope-nwl.org.uk, 1 +brighthope-nwl.org.uk, 0 brightideaspromotional.co.uk, 1 brightmachines.com, 1 brightmovers.com, 1 @@ -25195,7 +25195,7 @@ bringonbusiness.com, 1 brinker.com, 1 brinkhaven.gov, 1 -brinkhu.is, 1 +brinkhu.is, 0 brinksurl.com, 1 brinksurls.com, 1 brinokidzonline.tk, 1 @@ -25257,6 +25257,7 @@ britneymanias.tk, 1 britofootball.com, 1 britrail.com, 1 +britsdale.com, 1 britsoc.co.uk, 1 brittainconsulting.ca, 1 brittany.com.ph, 1 @@ -25318,6 +25319,7 @@ brock.guide, 1 brockenhurstguide.com, 1 brockenhurstonline.com, 1 +brockhaus.com, 1 brockwayministorage.com, 1 brockwaytwpmn.gov, 1 brocos.io, 1 @@ -25361,7 +25363,6 @@ broker-innovix.pl, 1 broker.id, 1 brokerdecredite.ro, 1 -brokeria.sk, 1 brokerlink.ca, 1 brokernews.com.au, 1 brokernotes.co, 1 @@ -25458,7 +25459,6 @@ brownwoodnews.cf, 1 browsbybecca.ca, 1 browse-china.com, 1 -browse-tutorials.com, 1 browselog.com, 1 browsemycity.com, 1 browser.style, 1 @@ -25592,7 +25592,7 @@ bryte-rp.tk, 1 brzc.st, 1 brztec.com, 1 -bs-facilityservice.ch, 0 +bs-facilityservice.ch, 1 bs-paderborn-senne.de, 1 bs.sb, 1 bs.to, 1 @@ -25610,14 +25610,11 @@ bsatroop3.com, 1 bsatroop794.org, 1 bsbet365.com, 1 -bsbi.org, 1 bsc-rietz.at, 1 bsc01.dyndns.org, 1 bscc.support, 1 bsconnect.nl, 1 -bscyb.ch, 1 bsd-box.net, 1 -bsd-sec.com, 1 bsd-unix.org, 1 bsd.com.ro, 1 bsd.gay, 1 @@ -25647,7 +25644,6 @@ bsidesf.com, 1 bsidessf.com, 1 bskhq.tk, 1 -bskmt.com, 1 bsktweetup.info, 1 bslim-e-boutique.com, 1 bslinguistics.co.uk, 1 @@ -25659,6 +25655,7 @@ bsnb.com, 1 bsociabl.com, 1 bsod.me, 1 +bsod.wtf, 1 bsolut.com, 1 bsolut.de, 1 bsolut.org, 1 @@ -25762,7 +25759,8 @@ btwschool.it, 1 btwservice.it, 1 btwstore.it, 1 -btyr.net, 1 +btynews.com, 1 +btyr.net, 0 bu-e.com, 1 buai.cf, 1 buai.gq, 1 @@ -25819,6 +25817,7 @@ bucket.tk, 1 buckethead.tk, 1 buckeye.com, 1 +buckfast-belegstellen.de, 1 buckfast.tk, 1 buckglobal.com, 1 bucklinmo.gov, 1 @@ -25845,6 +25844,7 @@ budatx.gov, 1 budbringerne.tk, 1 buddenbrookhaus.de, 1 +buddhabodhis.com, 1 buddhas.tk, 1 buddhism.cf, 1 buddhismedia.com, 1 @@ -25884,6 +25884,7 @@ budgetlovers.nl, 1 budgetrf.tk, 1 budgetscan.nl, 1 +budgie.lol, 1 budgow.com, 1 budiarto.id, 1 budidayatani.com, 0 @@ -25942,14 +25943,11 @@ buffetbouc.com, 1 buffge.com, 1 buffl.co, 1 -buffstreams.city, 1 buffup.media, 1 buffus.cz, 1 -bufla.net, 1 bufo.tk, 1 bug.blue, 1 bug.ee, 1 -bug321.com, 1 bugabond.bg, 1 bugaim.com, 1 bugalert.org, 1 @@ -26004,7 +26002,6 @@ buildinginspectionmandurah.ga, 1 buildingmaterials.tk, 1 buildingpathwaysma.org, 1 -buildingpoint.pt, 0 buildingpointne.com, 1 buildingprojectsswanseama.gov, 1 buildingresiliency.org, 1 @@ -26018,6 +26015,7 @@ builds.gg, 1 buildsimple.co.uk, 1 buildtestsolutions.com, 1 +buildux.com, 1 buildwealth.uk, 1 buileo.com, 1 builtbyworkhorse.com, 1 @@ -26028,7 +26026,6 @@ builtinboston.com, 1 builtinchicago.org, 1 builtincolorado.com, 1 -builtingym.com, 1 builtinla.com, 1 builtinnyc.com, 1 builtinseattle.com, 1 @@ -26052,7 +26049,6 @@ bukowski.se, 1 bukowski.tk, 1 bukpcszerviz.hu, 1 -buksu.edu.ph, 1 bukularis.ga, 1 bul3seas.eu, 1 bulabanews.com.ng, 1 @@ -26158,6 +26154,7 @@ buncombecounty.org, 1 buncranacarndonaghgreenway.ie, 1 bund-muelheim.de, 1 +bund-von-theramore.de, 1 bundesamtsozialesicherung.de, 1 bundesanzeieger.com, 1 bundesliga-tickets.com, 1 @@ -26463,6 +26460,7 @@ businessgroove.ga, 1 businessgrowth.ga, 1 businessgrowthleaders.com, 1 +businessguide.co.ke, 1 businessgun.ga, 1 businesshandsome.ga, 1 businesshome.ml, 1 @@ -26593,7 +26591,7 @@ businesssend.ga, 1 businessshoot.ga, 1 businessslide.ga, 1 -businesssolutionsprofits.com, 1 +businesssolutionsprofits.com, 0 businesssonic.ga, 1 businesssouthbeach.ga, 1 businesssparkle.ga, 1 @@ -26701,6 +26699,7 @@ butserdocumentary.tk, 1 buttedesmortssd1wi.gov, 1 butter.horse, 1 +butterchat.io, 1 butterflytigress.com, 1 butterhost.ga, 1 buttermilk.cf, 1 @@ -26741,7 +26740,6 @@ buy-decadron.tk, 1 buy-deltasone.tk, 1 buy-essay-online.ga, 1 -buy-express-vpn.asia, 1 buy-human-hair-extension.tk, 1 buy-indocin.cf, 1 buy-invertor.shop, 1 @@ -26814,6 +26812,7 @@ buyland.com.ua, 1 buylasix.ml, 1 buylevaquin.tk, 1 +buyme.lk, 1 buymetforminonline.tk, 1 buymobic.ml, 1 buymyvoip.com, 1 @@ -26900,6 +26899,7 @@ bvfz.pt, 1 bvgg.eu, 1 bvgt.org, 1 +bvharmreduction.org, 1 bvi106.eu, 1 bvionline.eu, 1 bviphotovideo.com, 1 @@ -27038,7 +27038,6 @@ byte.nl, 1 byte128.com, 0 bytebiter.io, 1 -byteblobs.com, 1 bytebodega.com, 1 bytebolt.at, 1 bytebucket.org, 1 @@ -27080,6 +27079,7 @@ bytrain.net, 1 byuro.org, 1 byzhihuo.com, 1 +bz2.pl, 1 bzbet365.com, 1 bzh.tf, 1 bzhserv.ovh, 1 @@ -27088,6 +27088,7 @@ bzik.cf, 1 bzjv-ffm.de, 1 bzkj.de, 1 +bznz.me, 1 bzomak.com, 1 bztech.com.br, 1 bztech.ru, 1 @@ -27184,7 +27185,6 @@ c4539.com, 1 c4b.tools, 1 c4k3.net, 1 -c4me.online, 1 c5197.co, 1 c5h8no4na.net, 1 c5y.moe, 1 @@ -27240,6 +27240,7 @@ cabineritten.nl, 1 cabinet-bedin.com, 0 cabinet-life.fr, 0 +cabinet-offenbach.com, 1 cabinet-voyance-orca.tk, 1 cabinetdecomptablesaguenay.com, 1 cabinetlm.com, 1 @@ -27544,7 +27545,6 @@ calculadora-de-integrales.com, 1 calculadoraconversor.com, 1 calculadoratrabalhista.com, 1 -calculafin.com.br, 1 calcularis.ch, 1 calculate-vat.uk, 1 calculate.co.kr, 1 @@ -27672,6 +27672,7 @@ calliesalls.com, 1 calligraph.gq, 1 calligraphychic.com, 1 +callinsdecor.com.br, 1 callipeg.com, 1 callmewatkins.com, 1 callmewhatever.com, 1 @@ -27753,7 +27754,7 @@ cambridgesecuritygroup.org, 1 cambridgetutors.com, 1 cambridgevaulting.com, 1 -cambuslangharriers.org, 1 +cambuslangharriers.org, 0 camconn.cc, 0 camdenhistory.com, 1 camdennj.gov, 1 @@ -27824,6 +27825,7 @@ camixo.tk, 1 camjackson.net, 0 cammamam.gq, 1 +cammurphy.com, 1 camnews.tk, 1 camokakis.sg, 1 camon.si, 1 @@ -27964,8 +27966,12 @@ canadianpointerclub.tk, 1 canadiansinternet.com, 1 canadiansrit.tk, 1 +canae.com.es, 1 canae.es, 1 +canae.net, 1 +canae.nom.es, 1 canae.org, 1 +canae.org.es, 1 canal4.com.ni, 1 canalbpv.com, 1 canalconfidencial.com.br, 1 @@ -28025,6 +28031,7 @@ candidcard.ga, 1 candidcarders.ga, 1 candidcardest.ga, 1 +candidroot.com, 1 candinya.com, 1 candinya.me, 1 candiscreen.com, 1 @@ -28040,7 +28047,6 @@ candyalexa.net, 1 candyboulevard.tk, 1 candybouquet.tk, 1 -candybygrant.com, 1 candydol.xyz, 1 candydoll11.com, 1 candydoll12.com, 1 @@ -28091,7 +28097,6 @@ canker.org, 1 cankhon.tk, 1 cankirihaber.tk, 1 -cankutahya.com.tr, 1 canliradyodinle.fm, 1 canlitelefonhatti.ga, 1 canlom.tk, 1 @@ -28175,7 +28180,6 @@ canuluduz.tk, 1 canv4s.com, 1 canva-dev.com, 1 -canva-staging.com, 1 canva.com, 1 canvas-art.tk, 1 canvaspersonalized.com, 1 @@ -28206,7 +28210,6 @@ capari.co, 1 caparicasurflessons.com, 1 caparua.com, 1 -capathsuccess.com, 1 capcut.cn, 1 cape.blue, 1 capeannvacations.com, 1 @@ -28412,6 +28415,7 @@ carbonadvantage.tk, 1 carbonaphta.com, 1 carbonateds.com, 1 +carbonating.com, 1 carboncountypa.gov, 1 carboncountywy.gov, 1 carbondaleil.gov, 1 @@ -28461,7 +28465,6 @@ cardinus.com, 1 cardioagainstcancer.nl, 1 cardiology.gq, 1 -cardios.srv.br, 1 cardiosportsilvinadelgado.com, 0 cardiothinklab.com, 1 cardity.de, 1 @@ -28518,7 +28521,6 @@ care-q.net, 1 care.com, 1 care2communities.org, 1 -care4all.com, 1 care4today.com, 1 careapp.com.au, 1 careapptest.dk, 1 @@ -28555,6 +28557,7 @@ careloco.tk, 1 caremad.io, 1 caremobi-prod.herokuapp.com, 1 +caremore.pt, 1 carenepal.org, 1 carepan.ga, 1 carepassport.com, 1 @@ -28584,7 +28587,6 @@ cargo.build, 1 cargobas.com, 1 cargobay.net, 1 -cargomovingcompany.com.ua, 1 cargorestraintsystems.com.au, 1 cargosapiens.com.br, 1 cargotariff.ml, 1 @@ -28630,7 +28632,6 @@ carlcsaposs.com, 1 carlesribot.tk, 1 carlgo11.com, 1 -carlicahn.com, 1 carlijnottens.nl, 1 carlili.fr, 0 carlingfordapartments.com.au, 1 @@ -28689,7 +28690,6 @@ carlshamnvaxtrike.se, 1 carlsonfonder.se, 1 carlsonfunds.com, 1 -carlsonsolutionsmn.com, 1 carlsonsw.com, 1 carlstammerjohn.com, 1 carlstoker.com, 1 @@ -28728,6 +28728,7 @@ carnet-du-voyageur.com, 1 carnetdemotions.com, 1 carni.tk, 1 +carnica-belegstellen.de, 1 carnica.tk, 1 carniceriaserrador.es, 1 carnildo.com, 1 @@ -28827,7 +28828,6 @@ carrollcountynh.gov, 1 carrollcountynhdeeds.gov, 1 carrolltontx.gov, 1 -carropro.fr, 1 carroseletricosbh.com.br, 1 carrosserie-delaval.be, 1 carrousel-ommen.nl, 1 @@ -28898,6 +28898,7 @@ carthagesavings.com, 1 cartierplan.ga, 0 cartographiepremiereligne.ca, 1 +cartoleriabotticelli.it, 1 cartomancieperso.tk, 1 cartona.com, 1 cartongesso.roma.it, 1 @@ -28920,12 +28921,10 @@ cartridgereviewsers.ga, 1 cartridgereviewsest.ga, 1 cartridgesave.co.uk, 1 -cartruckcyclee.com, 1 cartturbo.com, 1 cartucce24.it, 1 cartuchoonline.com.br, 1 cartunings.tk, 1 -cartwrightrealestate.com, 0 carty.bg, 1 carun.us, 0 carunion.nl, 1 @@ -28948,7 +28947,6 @@ cas-chauxdefonds.ch, 0 cas-ebbers.nl, 1 casa-brel.ml, 1 -casa-carla.it, 1 casa-due-pur.com, 1 casa-due-pur.de, 1 casa-due.com, 1 @@ -28959,9 +28957,7 @@ casa-mea-inteligenta.ro, 1 casa-mitica.com, 1 casa-prince.tk, 1 -casaasia.cat, 1 casaasia.es, 1 -casaasia.eu, 1 casabella.com.tw, 1 casacampolima.com, 1 casacapalbio.com, 1 @@ -28974,13 +28970,13 @@ casadedios.tk, 1 casadegomes.com, 1 casadelasvinas.com, 1 -casadelsole.ro, 0 casadentalsas.com, 1 casadetiteres.tk, 1 casadoarbitro.com.br, 1 casadopulpo.com, 1 casadostratoresjau.com.br, 1 casadue.de, 1 +casaearomas.com.br, 1 casaessencias.com.br, 1 casafina.tk, 1 casagami.ga, 1 @@ -29035,6 +29031,7 @@ cascavelle.fr, 1 cascavelle.nl, 1 casden.fr, 1 +case-jucu.ro, 1 case-la-rosu.ro, 1 case-vacanza-salento.com, 1 case-ware.info, 1 @@ -29100,7 +29097,6 @@ cashconverters.co.uk, 1 cashconverters.com, 1 cashconverters.com.au, 1 -cashdeskapp.com, 1 cashdo.co.il, 1 cashdrop.ga, 1 cashewmanufacturers.com, 1 @@ -29289,6 +29285,7 @@ casinozonderregistratie.net, 1 casitawn.cf, 1 casjenprome.cz, 1 +cask.directory, 1 caskntandoor.co.uk, 1 casko-insurance.tk, 1 casman.tk, 1 @@ -29358,6 +29355,7 @@ castlabs.com, 0 castle-emarketing.com, 1 castle-engine.io, 1 +castle-house-ireland.com, 1 castlebar.one, 1 castlebeats.de, 1 castlecapers.com.au, 1 @@ -29366,6 +29364,7 @@ castlehack.ga, 1 castlekingdomstockport.co.uk, 1 castlekingkent.co.uk, 1 +castlelodgeludlow.co.uk, 1 castlemania.tk, 1 castleoblivion.tk, 1 castlepointanime.com, 1 @@ -29391,7 +29390,6 @@ casusgrillcaribbean.com, 1 cat-encyclopedia.ml, 1 cat-problems.ml, 1 -cat-sounds.com, 0 cat.casa, 1 cat.fo, 1 cat.ma, 1 @@ -29410,6 +29408,7 @@ catalogingpro.com, 1 catalogobiblioteca.com, 1 catalogobiblioteca.net, 1 +catalogosdemujer.com, 1 catalogosvirtualesonline.com, 1 catalogueau.com, 0 catalojic.tk, 1 @@ -29417,7 +29416,6 @@ catalyseurs-territoriaux.org, 1 catalyst-ecommerce.com, 1 catalystapp.co, 1 -catalystindustrialservices.com, 1 catalyzr.info, 1 catandmoonalchemy.com.au, 1 cataniatoday.it, 1 @@ -29445,13 +29443,12 @@ catcatnya.com, 1 catchall.tw, 1 catchers.cc, 1 -catchhimandkeephim.com, 1 +catchhimandkeephim.com, 0 catchief.com, 1 catchook.com, 1 catchteamca.gov, 1 catchthestars.org, 1 catchup-enschede.tk, 1 -catchyz.com, 1 catclouds.net, 1 catcontent.cloud, 1 catcoxx.com, 1 @@ -29489,6 +29486,7 @@ catholic-colleges.com, 1 catholic8964.org, 1 catholiccaretas.org.au, 1 +catholicgallery.org, 1 catholicjobs.com, 1 catholicnewstt.com, 1 catholicprayers.tk, 1 @@ -29676,7 +29674,6 @@ cbs-engineering.com, 1 cbs.nl, 1 cbs3design.it, 1 -cbsr.ru, 1 cbt.quest, 1 cbt.tj, 1 cbw.sh, 1 @@ -29760,7 +29757,6 @@ ccmclassic.com, 1 ccmg.com, 1 ccnadesdecero.com, 1 -ccnbikes.com, 1 ccnda.net, 1 ccnda.org, 1 ccnexus.global, 1 @@ -29775,9 +29771,13 @@ ccpinvestments.com, 1 ccplot.org, 1 ccprwebsite.org, 1 +ccrf501.com, 1 +ccrfi.net, 1 +ccrfi.org, 1 ccrun.tk, 1 ccsaposs.com, 1 ccshire.ga, 1 +ccsinnovations.com, 1 ccsioims.ph, 1 ccsk.training, 1 ccskills.org.uk, 1 @@ -29824,7 +29824,6 @@ cdawoerden.org, 1 cdbp.pro, 1 cdbtech.com, 1 -cdc.cx, 1 cdc.gov, 1 cdcflix.xyz, 1 cdcpartners.gov, 1 @@ -29931,7 +29930,6 @@ cecimo.eu, 1 cecipu.gob.cl, 1 ceco.cf, 1 -cecop-rh.com, 1 ced-services.nl, 1 ceda-fi.tk, 1 cedac.org, 1 @@ -30119,7 +30117,6 @@ centolos.tk, 1 centr.dn.ua, 1 central-apartman.tk, 1 -central-services.ir, 1 central4.me, 1 centralbank.ae, 1 centralbetsers.ga, 1 @@ -30127,6 +30124,7 @@ centralcityjuniorkindergarten.com, 1 centralclinic.science, 1 centralcoasthomeloans.com.au, 1 +centralcoaststadium.com.au, 1 centralconvergence.com, 1 centralcountiesservices.org, 0 centralcranetrucks.com.au, 0 @@ -30147,7 +30145,6 @@ centrallaketownshipmi.gov, 1 centrallead.net, 1 centrallondonaesthetics.co.uk, 0 -centralmissourifoundationrepair.com, 1 centralnic.com, 1 centralpaellera.com, 1 centralpay.eu, 0 @@ -30196,7 +30193,6 @@ centropagina.it, 1 centros.ml, 1 centros.tk, 1 -centrosocialferrel.pt, 1 centrovenetoservizi.it, 1 centrum-bz.it, 1 centrum-edukacji.tk, 1 @@ -30235,6 +30231,7 @@ centuryreporters.com, 1 centurystudios.com, 1 centurytiling.com.au, 1 +ceo-consulting.eu, 1 ceomanipur.nic.in, 1 ceomonthlyest.ga, 1 ceopedia.org, 1 @@ -30267,6 +30264,8 @@ cerda-avocats.com, 1 cerebelo.info, 1 cerebralnaparaliza.com, 1 +cerebrito.com, 1 +cerebrito.net, 1 cerebrosano.gov, 1 cerebrum.com, 1 cerecup.com, 0 @@ -30279,6 +30278,7 @@ ceres-corp.org, 0 cerezacomunicacion.com, 1 cerfid.com.pe, 1 +ceris.com, 1 cernac.cz, 1 cernakova.eu, 1 cernalistina.eu, 1 @@ -30312,6 +30312,8 @@ certi.photo, 1 certible.com, 1 certidao-nascimento-pt.org, 1 +certifi.com, 1 +certifi.net, 1 certificadodigitalpari.com.br, 1 certificados.edu.do, 1 certificatedetails.com, 1 @@ -30338,6 +30340,7 @@ certly.co, 1 certnazionale.it, 1 certo-escrow.com, 1 +certos.com, 1 certp.fr, 1 certprep.fr, 0 certpro.uk, 1 @@ -30383,7 +30386,7 @@ ceskydj.cz, 1 ceslasvegasnews.com, 1 cesltd.com, 1 -cesmet.mil.do, 1 +cesmet.mil.do, 0 cesobaly.cz, 1 cesonia.io, 0 cespedes.fr, 1 @@ -30408,7 +30411,7 @@ cetong.se, 1 cetorebe.tk, 1 ceu.edu.ph, 1 -ceuniverse.com, 1 +ceuniverse.com, 0 ceva-dsp.com, 1 cevaplari.net, 1 ceverett.io, 0 @@ -30422,9 +30425,11 @@ cexplorer.io, 1 ceyhanmolla.com, 1 ceyizlikelisleri.com, 1 +ceylon-lang.org, 1 cezannehr.com, 1 cezdent.com, 1 cf-ide.de, 1 +cf-sillinsel.com, 1 cf-tm.net, 1 cf.nl.eu.org, 1 cf11.de, 0 @@ -30445,7 +30450,6 @@ cfdtrading.com, 1 cfenns.ath.cx, 1 cfent.xyz, 1 -cfgllc.us, 1 cfh.com, 1 cfigura.com, 1 cflblaw.com, 1 @@ -30500,6 +30504,7 @@ cgelves.com, 1 cgestiona.com, 0 cgeventoseturismo.com.br, 1 +cgfordparts.com, 1 cggs.vic.edu.au, 1 cggsaquatic.com.au, 1 cgha.us, 1 @@ -30515,12 +30520,12 @@ cgpe.com, 1 cgplumbing.com, 1 cgplumbingservice.com, 1 -cgpn.fr, 1 cgps.ch, 1 cgsmart.com, 1 cgsmotors.com, 1 cgstprayagraj.gov.in, 1 cgt-univ-nantes.fr, 1 +cgtburgos.org, 1 cgtcaixabank.es, 1 cgtsoft.com, 1 cgtv.ml, 1 @@ -30603,7 +30608,7 @@ chalonsenchampagne.fr, 1 chaloo.com.pk, 1 chalov.ml, 1 -chama.gr, 1 +chama.gr, 0 chamanga.store, 1 chamartin.tk, 1 chamath.co.uk, 1 @@ -30658,6 +30663,7 @@ chandradeepdey.com, 1 chandramani.tk, 1 changdunovel.com, 1 +change-coaching-gmbh.ch, 1 change10000lives.com.ph, 1 changeactivation.com, 1 changeanalytics.us, 1 @@ -30688,9 +30694,11 @@ channellife.news, 1 channelpro.es, 1 channingmotorsport.tk, 1 +chanrray.com, 1 chanrycz.com, 1 chanska.com, 1 chantage.tk, 1 +chantalflores.co.uk, 1 chantellbeauty.co.uk, 1 chantierjob.com, 1 chantuong.org, 1 @@ -30743,6 +30751,7 @@ chargehound.com, 1 chargeincluded.eu, 1 chargeover.com, 0 +chargevz.com, 1 chargifi.com, 1 chariot.works, 1 chariots.tk, 1 @@ -30956,7 +30965,6 @@ chatzimanolis.com, 0 chatzimanolis.gr, 1 chaudierecogeneration.com, 1 -chauffage-budget.fr, 1 chauffeurandbeyond.com, 1 chaumiere.ddns.net, 0 chaurocks.com, 1 @@ -30998,7 +31006,6 @@ cheapautoinsuranceblog.com, 1 cheapbloggingers.ga, 1 cheapchiaplotting.com, 1 -cheapcoursesonline.com, 1 cheapervacations.com, 1 cheapessay.net, 1 cheapestdirectdebit.co.uk, 1 @@ -31023,6 +31030,7 @@ cheapmessengersest.ga, 1 cheapmixesers.ga, 1 cheapnolvadex.ml, 1 +cheapokey.com, 1 cheapsmall.tk, 1 cheapspecialistsers.ga, 1 cheapspecialistsest.ga, 1 @@ -31079,8 +31087,8 @@ checkfresh.com, 1 checkiday.com, 1 checkingfinder.com, 1 +checkjelinkje.nl, 1 checklistbuilder.herokuapp.com, 1 -checklytics.com, 1 checkmack.cf, 1 checkmack.ga, 1 checkmack.gq, 1 @@ -31096,6 +31104,8 @@ checknetworks.com.au, 1 checkngo.com, 1 checkout.google.com, 1 +checkprograms.com, 1 +checkprograms.net, 1 checkr.com, 0 checkra.in, 1 checkras.tk, 1 @@ -31103,11 +31113,13 @@ checkreview.in, 1 checkrz.com, 1 checksandbalancesproject.org, 1 +checksoft.net, 1 checkspf.net, 1 checktls.nl, 0 checktype.com, 1 checkui.com, 1 checkurinsurance.com, 1 +checkwebsites.net, 1 checkyourmath.com, 1 checkyourprivilege.org, 1 checookies.com, 1 @@ -31143,7 +31155,7 @@ cheholchik.tk, 1 cheibegaudi.ch, 1 cheiloplasty.tk, 1 -chekaonline.com, 1 +chekaonline.com, 0 chekhov.gq, 1 chel.ga, 1 chelabotanica.com, 1 @@ -31252,7 +31264,6 @@ cherryonit.com, 0 cherrypink.no, 1 cherubicsoft.com, 1 -cheryforum.net, 1 cheryls.com, 1 cheryltweedy.tk, 1 cherysunzhang.com, 1 @@ -31271,7 +31282,6 @@ chester-law.com, 1 chesterbennington.tk, 1 chestercountysc.gov, 1 -chesterfieldmayfair.com, 1 chesterultimatefrisbee.tk, 1 chestnut.cf, 1 chetin-orlov.ga, 1 @@ -31300,10 +31310,6 @@ chhlayban.tk, 1 chhy.at, 1 chi-new-energy.com.ua, 1 -chialab.eu, 1 -chialab.info, 1 -chialab.net, 1 -chialab.srl, 1 chiamami.online, 1 chiangli.ml, 1 chiangmaimontessori.com, 1 @@ -31314,6 +31320,7 @@ chiasang.tk, 1 chiaseek.com, 1 chiavistello.it, 1 +chiaylimon.com, 1 chiba-shika.jp, 1 chiba-tour.jp, 1 chiboard.co, 1 @@ -31345,12 +31352,11 @@ chickencentral.tk, 1 chickencoop.ml, 1 chickenfarms.tk, 1 -chickensaladchick.com, 0 +chickensaladchick.com, 1 chickhint.com, 1 chicki.tk, 1 chickteam.tk, 1 chicofc.tk, 1 -chiconyitd.com, 1 chicorec.gov, 1 chicospanico.tk, 1 chicovive.com, 1 @@ -31362,7 +31368,6 @@ chiefworks.com, 1 chielonline.tk, 1 chiemgauflirt.de, 1 -chiemseeballooning.de, 1 chienluoc.tk, 1 chiesanuova.nl, 1 chietech.com.br, 1 @@ -31502,6 +31507,7 @@ chinplugins.com, 1 chinplugins.net, 1 chinplugins.xyz, 1 +chintai.io, 1 chintaparthi.tk, 1 chintaparthihome.tk, 1 chinteni.com, 1 @@ -31585,7 +31591,6 @@ chlth.com, 1 chmfin.com, 1 chmielarz.it, 1 -chmsoft.ru, 1 chmurakotori.ml, 1 chnbilling.com, 1 chngold.com, 1 @@ -31617,6 +31622,7 @@ chocudan.tk, 1 choda.vn, 1 chodaczek.pl, 1 +chodichvu.vn, 1 choe.fi, 1 choesfirm.tk, 1 chofan.tk, 1 @@ -31677,6 +31683,7 @@ chosentrends.com, 1 choservices.com, 1 chosting.dk, 1 +chosunonline.com, 1 chou-chinois.com, 1 choufei.com, 1 choukou.com, 1 @@ -31782,10 +31789,9 @@ christianliebel.com, 1 christianlis.org.uk, 1 christianlis.uk, 1 -christianmoore.me, 1 christianmorales.tk, 1 christianmuseumtours.com, 1 -christianoliff.com, 1 +christianoliff.com, 0 christianotero.co, 1 christianplumbingservices.com, 1 christianr.me, 1 @@ -31798,6 +31804,7 @@ christianwenz.de, 1 christianwitts.tech, 1 christiehawkes.com, 1 +christina-miles.art, 1 christinabjoern-nilsson.dk, 1 christinacrawford.cf, 1 christinacrawford.ga, 1 @@ -31808,7 +31815,6 @@ christine-kraemer.de, 0 christineandcie.fr, 1 christineglaeser.de, 1 -christinenieva.com, 1 christineprayon.de, 1 christmasdesigners.com, 1 christmasinelmhurst.org, 1 @@ -31914,6 +31920,7 @@ chronodelivery.com, 1 chronology.no, 1 chronometre-en-ligne.com, 1 +chronoox.com, 1 chronoshop.cz, 0 chronotech.fr, 1 chronus.com, 1 @@ -32108,6 +32115,7 @@ ciftkabincikmaparca.com.tr, 1 ciftkabinyedekparca.com.tr, 1 ciftlikesintisi.com, 1 +cigaaranomaly.xyz, 1 cigarafterten.com, 1 cigarette-electronique.tk, 1 cigarettes-electronik.fr, 1 @@ -32115,16 +32123,14 @@ cigdelivery.com, 1 ciginsurance.com, 1 cign.nl, 1 -cigniti.com, 0 +cigniti.com, 1 cignium.com, 1 cigotracker.com, 1 cihanmedya.ga, 1 cihar.com, 1 cihr-irsc.gc.ca, 1 -cihr.ca, 1 cihucm.com, 1 cilacapnews.ml, 1 -cilaxreklam.com, 1 cile.cf, 1 cile.tk, 1 cilin.net, 1 @@ -32143,6 +32149,7 @@ cimsp.com, 1 cimsp.net, 1 cimtools.net, 1 +cin-dere-lla.com, 1 cin.net.au, 1 cinafilm.com, 1 cinay.pw, 1 @@ -32172,7 +32179,6 @@ cinemaclub.co, 1 cinemadoma.tk, 1 cinemafrix.cf, 1 -cinemaindo.icu, 1 cinemaperto.tk, 1 cinemaschool.by, 1 cinemasetfree.com, 1 @@ -32191,6 +32197,7 @@ cinerariosgruporosete.com, 1 cinet.jp, 1 cineterror.tk, 1 +cinevia.org, 1 cinexilio.tk, 1 cinicloud.com, 1 cinicostudio.com, 1 @@ -32200,6 +32207,7 @@ cinkciarz.pl, 0 cinn.ml, 1 cinnagar.tk, 1 +cinnamombakery.com, 1 cinnamon.bot, 1 cinnamon.gq, 1 cinnamonsnail.com, 0 @@ -32299,6 +32307,7 @@ cirurgicasaopaulo.com.br, 1 cirurgicavirtual.com.br, 1 cis.at, 1 +cis.es, 1 cisa.gov, 1 cisabroad.com, 0 cisalpinatours.it, 1 @@ -32341,6 +32350,7 @@ citafun.tk, 1 citagenix.com, 1 citakon.cz, 1 +citalid.com, 1 citalopram-20-mg.ml, 1 citalopram20.ga, 1 citalopramgeneric.ga, 1 @@ -32530,7 +32540,7 @@ cityofroyaltonmn.gov, 1 cityofsacramento.gov, 1 cityofsalemky.gov, 1 -cityofsalemnj.gov, 1 +cityofsalemnj.gov, 0 cityofsanmateoca.gov, 1 cityofsantamariaca.gov, 1 cityofsavannail.gov, 1 @@ -32592,7 +32602,6 @@ citywidealarms.com, 1 citywidechimneysweephouston.com, 1 citywindsor.ca, 1 -citywinecellar.com, 1 citywisdom.tk, 1 cityworksonline.com, 1 ciubotaru.tk, 1 @@ -32617,6 +32626,7 @@ civicunicorn.com, 1 civicunicorn.us, 1 civil-works-sri.com, 1 +civilbikes.com, 1 civilconcretellc.com, 1 civilengineeringhandbook.tk, 1 civilhost.tk, 1 @@ -32724,6 +32734,7 @@ clairegold.com, 1 clairelefort-architectes.com, 1 clairescastles.co.uk, 1 +clairesvall.com, 1 clairette-de-die-lantheaume.fr, 1 clairevoyance.tk, 1 claitec.com, 1 @@ -32799,12 +32810,12 @@ clarkcountynv.gov, 0 clarkcountywi.gov, 1 clarkdemo.com, 1 -clarkelectricalservices.com.au, 1 clarkfoodserviceequipment.biz, 1 clarkglobalcity.com, 1 clarkhowell.com, 1 clarkinc.biz, 1 clarkltl.com, 1 +clarkmanagementconsulting.com, 1 clarkmerrick.com, 1 clarknationalaccounts.com, 1 clarkpacific.com.au, 1 @@ -32870,6 +32881,7 @@ classicprague.sk, 1 classicpraha.com, 1 classicstories.tk, 1 +classificacaoderisco.com, 1 classificacaogeral.com.br, 1 classificadostodaoferta.tk, 1 classificazionerifiuti.it, 1 @@ -32912,11 +32924,11 @@ claus-cremer.tk, 1 clauseriksen.net, 0 clausewitz-gesellschaft.de, 1 +clausion.net, 1 claustrofobia.tk, 1 clautopieces.fr, 1 clave2000.com.co, 1 clavit4.zone, 1 -clawe.de, 1 clawedfrogs.tk, 1 clawington.com, 0 claycountyne.gov, 1 @@ -32932,7 +32944,6 @@ claytwp-hamin.gov, 1 claytwpmi.gov, 1 clazzor.eu, 1 -clbmconsultancy.com, 1 clcakes.au, 1 clcakes.com.au, 1 clclawncare.com, 1 @@ -33028,7 +33039,6 @@ cleartheear.co.uk, 1 clearview-creative.com, 1 clearview-psychiatry.com, 1 -clearview.se, 1 clearviewinstitute.com, 1 clearviewok.gov, 1 clearviewwealthprojector.com.au, 1 @@ -33036,7 +33046,7 @@ clearvoice.org, 0 clearvoice1.com, 1 clearvoiceu.com, 0 -clearwateragency.com.au, 1 +clearwateragency.com.au, 0 clearwatercountyid.gov, 1 clearwatercountymn.gov, 1 clearwaterseries.tk, 1 @@ -33096,7 +33106,7 @@ clevon.com, 1 clevon.us, 1 clevoninvestors.com, 1 -clevvi.com.au, 0 +clevvi.com.au, 1 clevyr.ai, 1 clevyr.biz, 1 clevyr.careers, 1 @@ -33142,7 +33152,6 @@ clickatell.com, 1 clickbizhub.com, 1 clickcell.tk, 1 -clickclickmedia.com.au, 0 clickclinicals.com, 1 clickcollect.boutique, 1 clickdebateest.ga, 1 @@ -33314,6 +33323,7 @@ clipclip.com, 1 clipertrucado.com, 1 clipfor.ge, 1 +clipperai.com, 1 clips.ga, 1 cliqit.com.au, 1 cliquetis.ddns.net, 1 @@ -33402,7 +33412,6 @@ cloud24.kz, 1 cloud24x7.us, 1 cloud255.com, 1 -cloud4c.com, 1 cloud96.su, 1 cloud9bouncycastlehire.com, 1 cloudads.ga, 1 @@ -33411,7 +33420,6 @@ cloudapps.digital, 1 cloudatabases.com, 1 cloudatedge.com, 1 -cloudav.pt, 1 cloudavy.com, 1 cloudaware.eu, 1 cloudbattle.net, 1 @@ -33455,12 +33463,12 @@ cloudfleet.ai, 1 cloudforce.com, 1 cloudfree.shop, 1 -cloudfree.top, 1 cloudfronts.com, 1 cloudfudge.com, 1 cloudgray.com.au, 1 cloudhero.ai, 1 cloudia.org, 1 +cloudigy.es, 1 cloudily.com, 1 cloudimprovedtest.com, 1 cloudindex.io, 1 @@ -33546,7 +33554,6 @@ cloudwave.fr, 1 cloudwayc.com, 1 cloudwayq.com, 1 -cloudways.cm, 1 cloudwellmarketing.com, 1 cloudwithlightning.net, 1 cloudykingdom.com, 1 @@ -33626,6 +33633,7 @@ clubedoberloque.com.br, 1 clubedogis.com.br, 1 clubedohardware.com.br, 1 +clubedojornalismo.com.br, 1 clubedores.com.br, 1 clubeflor.com.br, 1 clubegls.com, 1 @@ -33701,10 +33709,10 @@ cluin.org, 1 cluj.help, 1 clun.top, 0 +clurinternational.com, 1 clush.pw, 1 cluster.biz.tr, 1 cluster446.fr, 1 -clusteraudit.com, 1 clusterfuck.nz, 1 clustermaze.net, 1 clvr.sh, 1 @@ -33754,7 +33762,6 @@ cmlex.com, 1 cmlignon.ch, 1 cmmcinfo.org, 1 -cmme.cloud, 1 cmn-group.com, 0 cmn-groupe.com, 0 cmngroup.com, 0 @@ -33783,6 +33790,7 @@ cmsdca.gov, 1 cmsec.de, 1 cmserviscz.cz, 0 +cmsfox.de, 1 cmsfs.de, 1 cmskh.co.uk, 1 cmsonline.com, 1 @@ -33818,6 +33826,7 @@ cncr.ga, 1 cncs.gov.pt, 1 cnctop.tw, 1 +cnet.com, 1 cnetion.com, 1 cnetw.xyz, 1 cnews.ru, 1 @@ -33917,6 +33926,7 @@ cobbcountygeorgia.ml, 1 coberturaplus.com, 1 cobiz.nl, 1 +cobolotobolo.com, 1 coboo.nl, 1 coboxviagens.com.br, 1 cobracastles.co.uk, 1 @@ -33942,7 +33952,6 @@ cochesaescala.tk, 1 cochin-brahma.tk, 1 cochise.gov, 1 -cochranwriting.com, 1 cocina.guru, 1 cocinandoenelsalnes.com, 1 cocinasazahara.tk, 1 @@ -33999,7 +34008,6 @@ codastory.com, 1 codcourier.org, 1 code-35.com, 0 -code-alliance.de, 1 code-ch.com, 1 code-de-la-route-gratuit.net, 1 code-gen.ca, 1 @@ -34021,6 +34029,7 @@ codeable.dk, 1 codeactive.fr, 1 codeactive.net, 1 +codeaegis.com, 1 codeandpeace.com, 1 codeandsupply.co, 1 codeberg.org, 1 @@ -34036,6 +34045,7 @@ codecnetworks.com, 1 codecolliders.com, 1 codecommunity.io, 1 +codeconnect.ir, 1 codecool.com, 0 codecreate.co.uk, 1 codecrew.us, 1 @@ -34156,6 +34166,7 @@ codezenith.com, 1 codezeno.com.au, 1 codialog.org, 1 +codice-rosso.net, 1 codicecer.it, 1 codicicer.it, 1 codifi.com, 1 @@ -34176,7 +34187,6 @@ codingblog.org, 1 codingforspeed.com, 1 codingfromhell.net, 1 -codinggirl.com, 1 codinghomeworkhelp.net, 1 codinginfinity.me, 1 codingnbb.com, 1 @@ -34222,8 +34232,6 @@ coffeebeanstudios.tk, 1 coffeebreak.bg, 1 coffeechi.ir, 1 -coffeeciel.com, 1 -coffeeciel.com.tr, 1 coffeeholic.tk, 1 coffeehousewriters.com, 1 coffeemoment.nl, 1 @@ -34238,7 +34246,6 @@ coffer.fi, 1 coffstotalroofing.com.au, 1 cofidisperte.it, 1 -cofigs.com, 1 cofinco.nl, 1 coforge.com, 1 cofradiaqueimada.tk, 1 @@ -34257,7 +34264,9 @@ cogknockers.com, 1 cogknockers.net, 1 cognac-oenologie.com, 1 +cognicrypt.com, 1 cognicrypt.de, 1 +cognicrypt.org, 1 cognigennetwork.tk, 1 cognitive-enhancers.com, 1 cognitiveapplications.net, 1 @@ -34289,7 +34298,6 @@ coinamount.com, 0 coinbase.com, 1 coinbit.trade, 0 -coincabin.io, 1 coincalc.tk, 1 coinchapter.com, 1 coincircle.com, 1 @@ -34429,7 +34437,6 @@ collaboracloudsuite.com, 0 collaboraoffice.co.uk, 1 collaboraoffice.com, 1 -collaboration.cafe, 1 collaborativedrug.com, 1 collabornation.net, 1 collacott.org, 1 @@ -34460,6 +34467,7 @@ collective-incubator.de, 1 collectivecorruption.com, 1 collectivedg.com, 1 +collectivite365.fr, 1 collector.cf, 1 collectorknives.net, 1 collectorscorner.com, 1 @@ -34494,7 +34502,7 @@ colley.tk, 1 collezione.it, 1 collide.be, 1 -collideascope.co, 1 +collideascope.co, 0 colliechatter.com, 1 collierlittler.com, 1 collierlunaire.fr, 1 @@ -34692,6 +34700,7 @@ comdirect.de, 1 comdmedias.fr, 1 comdotgame.com, 1 +comdurav.com, 1 come.ga, 1 come2cook.com, 1 comealong.org, 1 @@ -34733,6 +34742,7 @@ comevius.org, 1 comevius.xyz, 1 comewith.online, 1 +comex.biz, 1 comfandivirtual.com.co, 1 comff.net, 1 comfinagro.com.co, 1 @@ -34740,8 +34750,11 @@ comfipark.com, 1 comfis.nl, 1 comfitsweets.co.uk, 1 +comfort-place.com.ua, 1 comfortablelife.tk, 1 +comfortcredit.ru, 1 comfortdelgro.com, 1 +comfortingsolutions.pro, 1 comfortsolutionsair.com, 1 comfriesland.tk, 1 comfuzztible.tk, 1 @@ -34778,13 +34791,15 @@ comm.cx, 1 comma-store.eu, 1 commagere.com, 1 -command53.fr, 1 commanderone.net, 1 commanderx.cf, 1 commanderx.ml, 1 commanderx.tk, 1 commania.co.kr, 1 commbox.io, 1 +commboxdemo.com, 1 +commboxdemo.com.au, 1 +commboxdev.com, 1 commboxexp.com, 1 commco.nl, 1 commde.com, 1 @@ -34815,7 +34830,6 @@ commfortchat.tk, 1 commissaris-vraagbaak.nl, 1 commissionagenda.com, 1 -commissionaires.ca, 1 commissioner.tk, 1 commitsandrebases.com, 1 commloan.com, 1 @@ -34830,6 +34844,7 @@ commonroom.io, 1 commons-mayflower.tk, 1 commonsensedivorce.ca, 0 +commonsenseinactie.nl, 1 commonsubdoc.com, 1 commonsubdoc.io, 1 commonvoice.tk, 1 @@ -34859,7 +34874,6 @@ communitycollegereview.com, 1 communitycreditunion.com, 1 communitydirectory.tk, 1 -communityeducators.net, 1 communitylivingalgoma.org, 1 communitymalls.com.ph, 1 communitymalls.ph, 1 @@ -34920,6 +34934,7 @@ companyintranet.au, 1 companyintranet.com.au, 1 companywebcast.com, 0 +compaoffers.com, 1 comparamejor.com, 1 comparatif-moto.fr, 1 comparativ.net, 1 @@ -35021,9 +35036,11 @@ compress.cafe, 1 compressor.io, 1 comprising.de, 1 +comprocanal.com, 1 comprofacil.es, 1 compromis-promesse-vente.fr, 1 compservice.in.ua, 1 +compsoc-dev.com, 1 compta.tools, 1 comptakech.com, 1 compteq.solutions, 0 @@ -35104,7 +35121,7 @@ comtex.com.au, 1 comtois.hk, 1 comumlab.org, 1 -comunal.co, 1 +comunal.co, 0 comune.palermo.it, 1 comunic.io, 1 comunicat.global, 1 @@ -35119,7 +35136,6 @@ comunityflashgame.cf, 1 comw.cc, 1 comwave.net, 1 -comwwwcomcom.com, 1 con-ca.jp, 1 con-vergence.com, 1 con-vergence.nl, 1 @@ -35137,6 +35153,7 @@ concentrade.de, 0 concepcion-futbol-club.tk, 1 concept-web.ch, 0 +concept.cleaning, 1 concept3d.com, 1 concept4photography.com, 1 concept5.co.il, 1 @@ -35185,7 +35202,7 @@ concurseirosdeplantao.com.br, 1 concursos.com.br, 1 concursosabertos.com.br, 1 -concursuri.biz, 1 +concursuri.biz, 0 concursurionline.ro, 1 condemnity.net, 1 condenast.co.uk, 1 @@ -35206,6 +35223,7 @@ condroz-motors.be, 0 coneall.com, 1 conectada.tk, 1 +conectagob.gov.co, 1 conectatop.com.br, 1 conectens.com, 1 conectumfinanse.pl, 1 @@ -35268,7 +35286,6 @@ confiscate.ga, 1 confiscation.tk, 1 confiwall.de, 1 -conflictcontrol.fi, 1 conflidentliving.cf, 1 confluent.cloud, 1 confluents.fr, 1 @@ -35316,11 +35333,13 @@ conmatic.tk, 1 connactz.com, 1 connect-again.com, 1 +connect-av.co.uk, 1 connect.facebook.net, 1 connect.gov, 1 connect.net.pk, 1 connectaimpianti.it, 1 connectall.tk, 1 +connectapparelstore.com, 1 connectavid.com, 1 connectcablenet.com, 1 connectedbynexus.com, 1 @@ -35343,6 +35362,7 @@ connectivityparty.tk, 1 connectmath.com, 1 connectme.com.mx, 1 +connectmed360.com, 1 connectmy.car, 1 connecto.group, 1 connectpay.com, 1 @@ -35468,7 +35488,6 @@ constinit.org, 1 constipationrecords.tk, 1 constitution.website, 0 -constrofacilitator.com, 1 constru-vegas.com.mx, 1 construccionesceyve.com, 1 construct.net, 1 @@ -35490,7 +35509,6 @@ consul.io, 0 consuldat.com, 1 consulenteambientale.it, 1 -consulentedellavoro.it, 1 consulenza.pro, 1 consulimp.com.br, 1 consult-altius.co.uk, 1 @@ -35515,7 +35533,6 @@ consultorseo.pt, 1 consultorseolocal.eu, 1 consultpetkov.com, 1 -consultregen.com, 1 consumatore.it, 1 consumer.ee, 0 consumer.gov, 1 @@ -35562,7 +35579,6 @@ contato.vip, 1 contecgmbh.com, 1 contempfleury.com, 1 -contemplativeeducation.org, 1 contemptevoke.com, 1 contenedoresdereciclaje.online, 1 contentcaching.com, 1 @@ -35579,7 +35595,6 @@ continuousimprovementonline.com, 1 continuousinksupplysystem.com.au, 1 continuum.memorial, 0 -continuum.sbs, 1 continuumdesign.net, 1 contiprint.com.ec, 0 contortion.tk, 1 @@ -35633,7 +35648,6 @@ controllertech.com, 1 controllingchemsex.com, 1 controlpad.com, 1 -controlpro.mx, 1 controlshiftlabs.com, 1 controltvpodcast.tk, 1 controlup.com, 1 @@ -35650,6 +35664,7 @@ conv2pdf.com, 1 convair.net.au, 1 convecteurs.net, 1 +convenantencheck.nl, 1 convergence.fi, 1 convergencela.com, 1 convergent.tn, 1 @@ -35666,6 +35681,7 @@ converting.click, 1 convertire-documenti.it, 1 convertr.io, 1 +convertreference.org, 1 convexic.com, 1 conveyinc.com, 1 convicted-driver-insurance.com, 1 @@ -35744,6 +35760,7 @@ coolgeography.co.uk, 1 coolgifs.de, 1 coolink.pub, 1 +cooliran.com, 1 cooljs.me, 1 cooljv.com, 1 coolkidsparty.nl, 1 @@ -35848,6 +35865,7 @@ coraldivers.co.za, 1 coralenergy.gr, 1 coralexpeditions.com, 1 +coralpark.bg, 1 coralreef.blue, 1 coralreef.tk, 1 coralsprings.gov, 1 @@ -35888,6 +35906,7 @@ cordovarpd.gov, 1 corduroyproducts-velvetjackets.tk, 1 core-networks.de, 1 +core-v.cn, 1 core.edu, 1 core.ly, 1 core.md, 1 @@ -35905,6 +35924,7 @@ corebit.nl, 1 corecapital.cz, 1 corecdn.org, 1 +corechair.com, 1 corecollective.sg, 1 corecolor.co.jp, 1 coreconcepts.com.sg, 1 @@ -35952,7 +35972,6 @@ corima.it, 1 corina-york.de, 1 corinnanese.de, 1 -corintech.net, 1 coriolis.ch, 1 corisu.co, 1 corisu.net, 1 @@ -35968,6 +35987,7 @@ cormac-corp.com, 1 cormed-heverlee.tk, 1 corn.az, 1 +corn.ninja, 1 cornday.org, 1 cornel1801.com, 1 cornelia-kaufmann.tk, 1 @@ -36051,6 +36071,7 @@ corpusslayer.com, 1 corpvs.com.br, 1 corr-met.pl, 1 +corradofranco.it, 1 corrales-sanchez.tk, 1 correct.cf, 1 correctconstructions.com.au, 1 @@ -36120,6 +36141,7 @@ corus.lt, 1 corvaglia.com, 1 corvax.kiev.ua, 1 +corvel.com, 1 corvettesalvage.com, 1 corvetto.tk, 1 corvus.eu.org, 1 @@ -36138,7 +36160,6 @@ coshima.ga, 1 coshima.gq, 1 coshima.tk, 1 -cosimofilippini.ch, 1 cosirex.com, 1 coskun.tk, 1 coslinker.com, 0 @@ -36314,7 +36335,6 @@ countrysmile.org, 0 county10.com, 1 countybankdel.com, 1 -countyfarmcentre.com, 1 countyofbarton.gov, 1 countyofcolusaca.gov, 1 countyofkingsca.gov, 1 @@ -36348,7 +36368,6 @@ coursemology.sg, 1 courseorbit.com, 1 coursera.org, 1 -coursesanswer.com, 1 coursesidekick.com, 1 courseware.nl, 1 courseworkbank.info, 1 @@ -36488,6 +36507,7 @@ cozumelisparadise.com, 1 cozyeggdesigns.com, 1 cozyfarms.in, 1 +cozylocale.com, 1 cozynergy.com, 1 cp-st-martin.be, 1 cpac.moe, 1 @@ -36591,7 +36611,6 @@ crabo3d.de, 1 crabrave.space, 1 crabtreestore.nl, 1 -cracedkey.com, 1 crackajack.cf, 1 crackalackincakes.au, 1 crackalackincakes.com.au, 1 @@ -36608,7 +36627,6 @@ crackrequest.org, 1 cracksnet.tk, 1 crackstation.net, 1 -crackstreams.city, 1 crackunit.com, 1 cracky-chan.bounceme.net, 1 cracky-chan.com, 1 @@ -36650,13 +36668,11 @@ craftination.net, 1 craftingcomrades.net, 1 craftinghand.com, 0 -craftique.pk, 1 craftist.de, 1 craftmachinec.com, 1 craftmenu.ru, 1 craftmeow.com, 1 craftmeow.support, 1 -craftngo.hu, 1 craftottawa.ca, 1 craftshiponline.tk, 1 craftsmandruggets.com, 1 @@ -36812,7 +36828,6 @@ creand.es, 1 creandgroup.com, 1 creandoydesarrollando.com, 1 -creaplus.com, 1 crear-webs-baratas.com, 0 creared.edu.co, 1 crearesiteweb.tk, 1 @@ -36822,6 +36837,7 @@ creasetheband.tk, 1 create-ls.jp, 1 create-website.ga, 1 +create-wish.com, 1 create2.be, 1 createbeauty.tk, 1 createbot.ml, 1 @@ -36891,7 +36907,6 @@ creativlabor.ch, 1 creativo.biz, 1 creatix.tk, 1 -creatixcode.nl, 1 creatomatic.co.uk, 1 creatormetrics.io, 1 creators.direct, 1 @@ -36903,6 +36918,7 @@ creayes.com, 1 crebita.de, 1 creche-noel.com, 1 +crechepequenopolegar.com.br, 1 crecips.com, 1 crecman.fr, 1 crecycle.eco, 1 @@ -36926,6 +36942,7 @@ creditcorponline.com, 1 creditenonstop.ro, 1 crediteurope.ru, 1 +creditfair.in, 1 credithuman.com, 1 creditif.tk, 1 creditkarma.ca, 1 @@ -37041,7 +37058,6 @@ cricpa.com, 1 cricrocket.com, 1 crictechs.com, 1 -cridigital.net, 1 criena.com, 0 criena.net, 1 crigler-najjar.fr, 1 @@ -37054,7 +37070,6 @@ crimeamet.ml, 1 crimean-wines.tk, 1 crimeandwar.com, 1 -crimefreeliving.com, 1 crimeid.cc, 1 crimemuseum.org, 1 crimereports.com, 1 @@ -37188,7 +37203,6 @@ crmplace.com, 1 crmservice.fi, 1 crmtaxi.ml, 1 -crmzz.com, 1 crn.li, 1 crnajobsite.com, 1 crnalab.net, 1 @@ -37196,7 +37210,6 @@ croatia.hr, 1 crobeauty.com, 1 croceverdevb.it, 1 -crocheclube.com, 1 crochefin.com, 1 crocheteursdefrance.fr, 1 crochetkim.com, 1 @@ -37219,6 +37232,9 @@ cromefire.myds.me, 1 cromosceltavigo.tk, 1 cromosomax.com, 1 +cromox.at, 1 +cromox.de, 1 +cromox.net, 1 cromwell-intl.com, 1 cromwellarc.co.uk, 1 cromwellvets.co.uk, 1 @@ -37304,7 +37320,6 @@ crowdstack.com, 1 crowdstack.io, 1 crowdsupply.com, 1 -crowefitlab.com, 1 croweleaseaccountingexpress.com, 1 croweserver.com, 1 crowleytxlicensedelectrician.com, 1 @@ -37327,7 +37342,6 @@ crowter.li, 1 crowwing.gov, 1 crowwingenergized.org, 1 -croydon-coop.org.uk, 1 croydon-nh.gov, 1 croydonapartments.com.au, 1 croydonbouncycastles.co.uk, 1 @@ -37370,7 +37384,6 @@ cruisecheap.com, 1 cruisecontrolnovels.com, 1 cruisefashion.tk, 1 -cruiseguy.com, 1 cruiselaw.de, 1 cruiselookout.com, 1 cruisemoab.com, 1 @@ -37433,12 +37446,10 @@ crypto-gambling.tv, 1 crypto-gaming.tk, 1 crypto-iptv.online, 1 -crypto-recovery.ch, 1 crypto-trade.org, 0 crypto-wiki.tk, 1 crypto.bzh, 1 crypto.graphics, 1 -cryptoafternoon.com, 1 cryptoagility.cloud, 1 cryptoanarchist.tk, 1 cryptoarabsolar.tk, 1 @@ -37461,7 +37472,6 @@ cryptodore.com, 1 cryptodredge.org, 1 cryptoearnblog.xyz, 1 -cryptoedicate.com, 1 cryptofacilities.com, 1 cryptofan.org, 1 cryptofinance.ai, 1 @@ -37576,6 +37586,7 @@ cs2.net.cn, 0 cs2.pub, 1 cs2.ren, 1 +cs2legends.com, 1 csa-clan.tk, 1 csa.co.za, 1 csa.support, 1 @@ -37656,6 +37667,7 @@ cshs.edu, 1 csilies.de, 1 csillagoszpumi.se, 1 +csiperseus.com, 1 csirt.ee, 0 csitarz.com, 1 cskentertainment.co.uk, 1 @@ -37682,11 +37694,13 @@ csreturn.com.au, 1 csrin.org, 1 csroot.cf, 1 +csrtci.com, 1 csru.net, 1 css-clamp-generator.com, 1 css-krebs.ch, 1 css-tricks.tk, 1 css.direct, 1 +css.style, 1 cssai.eu, 1 cssbmb.gov, 1 cssninja.io, 1 @@ -37697,6 +37711,7 @@ csszamotuly.pl, 1 cst.dk, 1 cst188.cc, 1 +cst3000.be, 1 cstanley.net, 1 cstevens.cc, 1 cstg.com, 1 @@ -37722,14 +37737,13 @@ csx.co.za, 1 csy.hu, 1 csyxy.fi, 1 -cszj.wang, 1 +cszj.wang, 0 ct-static.com, 1 ct-watches.dk, 1 ct.search.yahoo.com, 0 ctafo.com, 0 ctauditors.gov, 1 ctbirding.org, 1 -ctc-g.com.sg, 1 ctcloud.ml, 1 ctcom-peru.com, 1 ctconp.org, 1 @@ -37775,11 +37789,11 @@ ctrlaltstream.com, 1 ctrlcvz.tk, 1 ctsd.de, 1 -ctspcallao.org.pe, 1 ctsu.org, 1 cttso.gov, 1 ctu.cz, 1 ctul.net, 1 +ctx.build, 1 ctyrisinkneri.cz, 1 cu247secure.ie, 1 cua911.gov, 1 @@ -37940,7 +37954,6 @@ cumbiaperuana.tk, 1 cumbreamazonica.tk, 1 cumfiesta.com, 1 -cumi-murugappa.com, 1 cumiconnect.com, 1 cuminas.com, 1 cumingcountyne.gov, 1 @@ -37996,6 +38009,7 @@ curamcare.ml, 1 curareldolordeespalda.com, 1 curascapes.com, 1 +curatd.africa, 1 curatednews.xyz, 1 curatednow.ca, 1 curationist.org, 1 @@ -38061,18 +38075,18 @@ cursoandroid.com, 1 cursodehipnosis.tk, 1 cursodememorizacao.ml, 1 -cursofuturosresidentes.com, 1 cursointeractivo.com, 1 cursomente.online, 1 cursorcam.tk, 1 cursos-trabajadores.net, 1 cursos.com, 1 +cursos.enf.br, 1 cursosbajoprecio.com, 1 cursosdepestanas.com, 1 cursosemmaus.es, 1 cursosforex.com, 1 cursosingles.com, 1 -cursosprogramacion.online, 1 +cursosprogramacion.online, 0 cursossena.co, 1 cursossilvania.com, 1 cursosypostgrados.com, 1 @@ -38122,7 +38136,6 @@ customerservicepal.com, 1 customerware.com.au, 0 customessaystation.gq, 1 -customfiberglasscoaches.com, 1 customhomerealty.com, 1 customlogoit.com, 1 custommadecasino.com, 1 @@ -38133,7 +38146,6 @@ customradio.tk, 1 customromlist.com, 1 customsandals.tk, 1 -customshort.link, 1 customsportsocks.com, 0 customtel.com.au, 1 customtshirtrequest.com, 0 @@ -38174,8 +38186,6 @@ cuubconsultancy.com, 1 cuvantul.tk, 1 cuve-ibc.be, 1 -cuve-shop.fr, 1 -cuve.be, 1 cuvva.co, 1 cuvva.co.uk, 1 cuvva.com, 1 @@ -38228,11 +38238,11 @@ cvpartner.com, 1 cvpcorp.com, 0 cvrn.cc, 1 -cvroadtrip.pt, 1 cvsec.org, 1 cvsepeti.org, 1 cvsmash.io, 1 cvsmile.be, 1 +cvstravel.com.tr, 1 cvt-dakwerken.nl, 1 cvtemplatemaster.com, 1 cvtenerife.tk, 1 @@ -38403,6 +38413,7 @@ cyberix.sk, 1 cyberjake.xyz, 1 cyberkey.cz, 1 +cyberkeypoint.com, 1 cyberkov.com, 1 cyberlaracom.fr, 1 cyberlaw.be, 1 @@ -38420,6 +38431,7 @@ cybermavi.com, 1 cyberme.sh, 1 cybermeldpunt.nl, 1 +cybermoov.eu, 1 cybermotives.com, 1 cybern.tk, 1 cybernetworkglobal.com, 1 @@ -38474,6 +38486,7 @@ cybersecuritywerkt.nl, 1 cyberserver.cz, 1 cybershark.space, 1 +cybershelter.be, 1 cybershieldscan.com, 1 cybershot.tk, 1 cybersight.org, 1 @@ -38484,10 +38497,8 @@ cybersolve.com, 1 cybersoulz.com, 1 cybersound.tk, 1 -cyberspect.com, 1 cyberspect.io, 1 cyberspot-ci.net, 1 -cyberstatus.de, 1 cyberstrikerz.tech, 1 cybersummitusa.com, 1 cybersystem.io, 1 @@ -38559,7 +38570,6 @@ cygnatus.com, 1 cygnius.net, 1 cykelbanor.se, 1 -cykeldirekt.eu, 1 cyklistika24.cz, 1 cyklokoalicia.sk, 1 cylex-italia.it, 1 @@ -38618,6 +38628,7 @@ cz.nl, 1 czakey.net, 1 czarni-czarne.tk, 1 +czarniecki-eco-design.com, 1 czaw.org, 1 czbix.com, 1 czc.cz, 0 @@ -38706,6 +38717,7 @@ d39rl9amo4q27v.cloudfront.net, 1 d3d3.tk, 1 d3dev.cf, 1 +d3dstudio.de, 1 d3lab.net, 1 d3oe4g2tw01ssi.cloudfront.net, 1 d3ojty55ovjfr5.cloudfront.net, 1 @@ -38791,6 +38803,7 @@ dachnie-reshenia.ru, 0 dachshundsaspets.com, 1 dachshundtalk.com, 1 +daciaclubnederland.nl, 1 daconsult.uk, 1 dacsansach.com, 1 dacxichain.com, 1 @@ -38908,6 +38921,7 @@ dailyeasternnews.com, 1 dailyegyptian.com, 1 dailyfictive.com, 1 +dailyfish.ru, 1 dailyforex.com, 1 dailyfx.com, 1 dailyhealthylife.ml, 1 @@ -38917,6 +38931,7 @@ dailyjigsawpuzzles.net, 1 dailykos.com, 1 dailykosbeta.com, 1 +dailyletter.tv, 1 dailylime.kr, 1 dailylviv.com, 1 dailymedicalinfo.com, 1 @@ -38929,7 +38944,6 @@ dailyotovinfast.com.vn, 1 dailypop.ru, 1 dailypost.ng, 1 -dailyproductsclub.com, 1 dailyprogress.com, 1 dailyreels.ga, 1 dailyrenewblog.com, 1 @@ -38968,6 +38982,7 @@ dajaskincare.nl, 1 dajiale.org, 1 dajjal.org, 1 +dajoose.com, 1 dakcess.net, 1 daken.hu, 1 daki-host.tk, 1 @@ -38991,6 +39006,7 @@ daldropsbb.com, 1 daleanddollops.com, 1 dalecountyal.gov, 1 +daleunavueltaalmundo.com, 1 dalevuelta.tk, 1 dalfsennet.nl, 1 dali-boli.me, 1 @@ -39072,6 +39088,7 @@ damnkid.ml, 1 damnmodz.com, 1 damonline.dk, 1 +damore.nl, 1 dampedia.com, 1 dampfbahn-leverkusen.com, 1 dampfbahn-leverkusen.de, 1 @@ -39122,7 +39139,6 @@ danceworld.tk, 1 dancingangels.tk, 1 dancingcubs.co.uk, 1 -dancingtofu.com, 1 danddy.eu, 1 dandelikaliadventure.com, 1 dandelion.eu, 1 @@ -39322,6 +39338,7 @@ danovamix.com.br, 1 danparkercarpentry.com, 1 danpiel.net, 1 +danpol.co.uk, 1 danq.me, 1 danramer.tk, 1 dansage.co, 0 @@ -39426,7 +39443,7 @@ dark-crystal.tk, 1 dark-dreams.tk, 1 dark-infection.de, 1 -dark-lake.com, 1 +dark-lake.com, 0 dark-legion.tk, 1 dark-manga.com, 1 dark-nova.me, 1 @@ -39483,7 +39500,6 @@ darkness.sk, 1 darknessflickers.com, 0 darknessinme.tk, 1 -darknight.blog, 1 darkoctoberseance.com, 1 darkoff.tk, 1 darkotip.tk, 1 @@ -39532,7 +39548,6 @@ darom.jp, 1 darosen.de, 1 darosen.eu, 1 -darpa.mil, 1 darrellsmarket.com, 1 darren.to, 1 darrenflemingphotography.co.uk, 1 @@ -39578,6 +39593,7 @@ das-mediale-haus.de, 1 das-sommercamp.de, 1 dasabomobil.de, 1 +dasads.de, 1 dasble.com, 1 dascan.com.br, 1 dasdanny.de, 1 @@ -39600,7 +39616,6 @@ dashlane.com, 1 dashofmedia.com, 1 dashofting.com, 1 -dashtwo.com, 1 dashwebconsulting.com, 1 dasignsource.com, 1 dasinternetluegt.at, 1 @@ -39637,6 +39652,10 @@ data.haus, 1 data.world, 1 data18.com, 0 +data2desktop.au, 1 +data2desktop.com, 1 +data2desktop.com.au, 1 +data2desktop.net, 1 data3w.nl, 1 dataadvantage.se, 1 database-excel-integration.com, 1 @@ -39679,6 +39698,7 @@ datacomlocalgovt.co.nz, 1 datacomm.com, 1 datacommissioner.gov.au, 0 +datacomp.sk, 1 datacool.tk, 1 datacorp.fr, 1 datadefendersforum.com, 1 @@ -39690,7 +39710,6 @@ dataentry.top, 1 datafactory.co.za, 1 datafinland.com, 1 -datafloq.com, 1 datagir.ir, 0 datagrail.io, 1 datagrid.ga, 1 @@ -39713,7 +39732,6 @@ dataloop.ai, 1 datalysis.ch, 0 dataman.ml, 1 -datamark.net, 1 datamate.org, 1 datamatics.com, 1 datamationgroup.com, 1 @@ -39726,6 +39744,7 @@ dataprivacyframework.gov, 1 dataprivacysolution.com, 1 dataproject.com, 1 +dataprowess.com.au, 1 datapun.ch, 1 datarails.com, 1 dataregister.info, 1 @@ -39748,7 +39767,6 @@ dataspace-connector.io, 1 dataspace.pl, 1 datastack.design, 1 -datastar.net, 1 datastream.org, 1 datastream.re, 0 datastudio.google.com, 1 @@ -39772,6 +39790,7 @@ datavizable.org, 1 datawar.tk, 1 datawarehouseinfo.com, 1 +dataweeknl.nl, 1 datax-cloud.de, 1 dataxl.net, 1 datazoo.asia, 1 @@ -39852,7 +39871,6 @@ datovyportal.sk, 1 datrixgroup.com, 1 datsumouseek.jp, 1 -dattelking.com, 1 dattelking.de, 1 datumdecipher.com, 1 datumplus.co.uk, 1 @@ -39872,11 +39890,11 @@ daunendecke.de, 1 dauphincounty.gov, 1 dausendschoen.de, 1 +dautais.fr, 1 dav-tech.work, 1 dav.com.au, 1 davalochki.tk, 1 davar1.co.il, 1 -davaro.ro, 1 davd.cf, 1 dave-pearce.com, 1 daveaglick.com, 0 @@ -39952,7 +39970,6 @@ davidforward.net, 1 davidg.cc, 1 davidgarymorrison.com, 0 -davidgarza.email, 1 davidgarza.me, 1 davidgouveia.net, 1 davidgreig.uk, 1 @@ -40259,7 +40276,6 @@ dcmt.co, 1 dcnews.jp, 1 dco.sg, 1 -dcomedieta.it, 1 dcparts.com.br, 1 dcpf.online, 1 dcpower.eu, 1 @@ -40312,6 +40328,7 @@ ddhlawyers.com, 1 ddhosted.com, 0 ddiaz.tk, 1 +ddimmery.com, 1 ddinox.be, 1 dditechnology.com, 1 ddjia.com, 0 @@ -40355,11 +40372,11 @@ de-spil.be, 1 de.gt, 1 de.ls, 1 +de.md, 1 de.search.yahoo.com, 0 de.sk, 1 de.vg, 1 dea.gov, 1 -deacondavid.org, 1 dead-letter.email, 1 dead-parrot.de, 1 deadbeef.ninja, 1 @@ -40438,6 +40455,7 @@ deasserstadsloop.nl, 1 deasy-store.com, 1 death-notices.co.uk, 1 +death.ceo, 1 death.social, 1 deathberry.ddns.net, 1 deathbits.com, 1 @@ -40493,6 +40511,7 @@ debian.link, 1 debianizzati.org, 1 debigare.com, 1 +debipay.co.za, 1 debita.fi, 1 debita.org, 1 debitterballetjes.tk, 1 @@ -40664,6 +40683,7 @@ deelmee.nl, 1 deelmijnreis.nl, 1 deelodge.art, 0 +deeltaxi-regioshertogenbosch.nl, 1 deemasfashion.us, 1 deemlove.com, 1 deeonix.eu, 1 @@ -40702,7 +40722,6 @@ deepumathew.tk, 1 deepvalley.tech, 1 deepwoodshop.com, 1 -deepworx.de, 1 deerfieldbeachhistoricalsociety.com, 0 deerfieldknoll.com, 1 deeringnh.gov, 1 @@ -40737,7 +40756,6 @@ defero.io, 1 defesa.gov.br, 1 defesaaereanaval.com.br, 1 -defiantphoenix.net, 0 defifa.ga, 1 defile.ml, 1 defiler.tk, 1 @@ -40883,7 +40901,6 @@ del-ex.de, 1 delagen.pro, 1 delahaye-group.fr, 1 -delahrzolder.nl, 1 delamoreretirement.com.au, 1 delamourencocotte.com, 1 delanomn.gov, 1 @@ -40902,6 +40919,7 @@ delay-dengi.cf, 1 delaydengy.tk, 1 delaysoft.tk, 1 +delbridge.solutions, 1 delcan.ga, 1 delcan.gq, 1 delcan.ml, 1 @@ -40986,7 +41004,6 @@ delphinarabic.tk, 1 delphine.dance, 1 delphinewong.com, 1 -delpick.com, 1 delpilarrungue.cl, 1 delplanque.xyz, 1 delprete.me, 1 @@ -41049,6 +41066,7 @@ deluxemassage.co.uk, 1 deluxeside.com, 1 deluxetransfers.co.uk, 1 +delvinoadegas.com.br, 1 delycate.com, 1 delycate.fr, 1 delzottolink.com, 1 @@ -41126,7 +41144,6 @@ demonoid.is, 1 demonstrably.live, 1 demontage.tk, 1 -demonwav.com, 1 demonwithin.tk, 1 demonwolfdev.com, 1 demopanel.tk, 1 @@ -41155,11 +41172,15 @@ denarium.com, 1 denatured.tk, 1 denbar.org, 1 +denboschdataweek.nl, 1 +denboschtimemachine.eu, 1 +denboschtimemachine.nl, 1 dencel.lv, 1 denchik.tk, 1 dencore.eu, 1 dendi.tk, 1 dendibanget.tk, 1 +dendionigi.com, 1 dendra.io, 0 dendrite.fail, 1 denegka-mgnovenno.cf, 1 @@ -41182,12 +41203,12 @@ deniani.com, 1 denied.gr, 1 denieuwenederlandsevlag.tk, 1 +denikoo.co, 1 deniky.cz, 1 denimology.com, 1 denimtoday.com, 1 denis-pommier.com, 1 denisaadolfova.com, 1 -denisadinu.com, 1 denisdimoski.tk, 1 deniseeisenhauer.de, 1 denisesdanceacademy.com, 1 @@ -41284,7 +41305,6 @@ dentistalagoasanta.com.br, 1 dentisteliege.be, 1 dentistesdarveauetrioux.com, 1 -dentistree.in.ua, 1 dentistsgainesvillega.com, 1 dentistslilburnga.com, 1 dentoncounty.gov, 1 @@ -41419,6 +41439,7 @@ der-gardinenmann.de, 1 der-niedergelassene-arzt.de, 1 der-rohrstock.club, 1 +der-umzugsprofi.com, 1 derailer.org, 1 derakkers.tk, 1 derango.tk, 1 @@ -41566,13 +41587,13 @@ desic-sl.com, 1 desiderantes.tk, 1 desideriushogeschool.be, 1 -design-market.eu, 0 design-n-art.tk, 1 design-netzwerk.eu, 1 design-production.jp, 1 design-tooning.de, 1 design-tricks.gq, 1 design-your-life.info, 1 +design.com, 1 design2u.eu, 1 designacademy.nl, 1 designacademy.ru, 1 @@ -41667,6 +41688,7 @@ despedidas-madrid.com, 1 desperate.solutions, 1 desperatesailors.com, 1 +despertarcomluz.com, 1 despertarparavida.org, 1 desplainesil.gov, 1 despoina-vandi.tk, 1 @@ -41742,6 +41764,7 @@ detectro.cc, 1 deteken.be, 1 detekenmuze.nl, 1 +detektivskaagencija.com, 1 detektywtd24.pl, 0 determapp.de, 1 determinatie.tk, 1 @@ -41785,8 +41808,10 @@ deunopostenacional.com.br, 1 deurenfabriek.nl, 1 deuro.net, 1 +deurs.fr, 1 deurwaardersveilingen.nl, 1 deusarodrigues.com.br, 1 +deuskai.com, 1 deustech-media.tk, 1 deustech.tk, 1 deutsche-finanzagentur.de, 1 @@ -41801,6 +41826,7 @@ deutz-fahr-zentrum.de, 1 deuxfleurs.fr, 1 dev, 1 +dev-academy.com, 1 dev-advancedservicesportal.com, 1 dev-amag.com, 1 dev-brandywineglobal.com, 1 @@ -41879,6 +41905,7 @@ devendradox.ml, 1 devendrameena.tk, 1 devenirconseillerbienetre.com, 1 +deventura.com, 1 devenv.ml, 1 deverse.eu, 1 deveshrx.com, 1 @@ -41892,7 +41919,6 @@ devianthardcore.com, 1 deviation.tk, 1 devicebattle.ai, 1 -deviceeurope.com, 1 deviceinventory.com, 1 deviceshots.com, 1 devicom.mx, 1 @@ -42052,6 +42078,7 @@ dffgpro.de, 1 dfg.re, 1 dfiik.com, 1 +dfilip.icu, 1 dfilucky.com, 1 dfm.ae, 0 dfmn.berlin, 1 @@ -42135,6 +42162,7 @@ dgtl.tools, 1 dgtl.work, 1 dgund.com, 1 +dh-etechnik.de, 1 dh-leasing.si, 1 dh.si, 1 dh26a.com, 0 @@ -42182,8 +42210,10 @@ di2pra.com, 0 di2pra.fr, 0 dia-de.com, 1 +dia-te.ch, 1 dia.com.br, 1 diaakademi.com, 1 +diabetes-te.ch, 1 diabetesdietjournal.com, 1 diabetessucks.net, 1 diableros.tk, 1 @@ -42279,7 +42309,7 @@ diannejonesassociates.com, 1 diannejonescsr.com, 1 dianoxofficiel.tk, 1 -dianshangyi.net, 1 +dianshangyi.net, 0 dianshuju.com, 1 diansung.com, 1 diaocan.com, 1 @@ -42370,7 +42400,6 @@ dictionarybook.org, 1 dictionaryofsydney.org, 1 dictionarypro.net, 1 -dictzone.com, 1 dida.xin, 1 didactic.ml, 1 didaktik4you.de, 1 @@ -42408,6 +42437,7 @@ die-sinlosen.de, 1 die-speisekammer-reutlingen.de, 1 die-sterntaufe.de, 1 +die-testagenten.de, 1 die.de, 1 die.one, 1 diebasis-partei.de, 1 @@ -42462,7 +42492,6 @@ dierenpagina.tk, 1 dierenrijk.nl, 0 dierenschilderijen.tk, 1 -dierenwiki.nl, 1 dieschnuckelchen.myasustor.com, 1 diesdasananas.spdns.de, 1 dieselanimals.lt, 1 @@ -42478,8 +42507,8 @@ diesse.nl, 0 dieste.com, 1 dieta-figura.tk, 1 -dieta-vita.com, 1 dietandexercises.tk, 1 +dietanic.co, 1 dietaryguidelines.gov, 1 dietbrand.eu, 1 dieter.one, 1 @@ -42590,7 +42619,6 @@ digisfil.fr, 1 digisign.tk, 1 digislovakia.sk, 1 -digistore.fr, 1 digistorm.com, 1 digit.bg, 1 digit.ec, 1 @@ -42654,8 +42682,10 @@ digitalchurch.ng, 1 digitalcircusmerch.com, 0 digitalcitizens.uk, 1 +digitalcodes.info, 1 digitalcoffeepodcast.com, 1 digitalcolony.com, 1 +digitalcolposcopy.com, 1 digitalcomponents.de, 1 digitalconcrete.co.uk, 1 digitalcourage.de, 1 @@ -42672,7 +42702,6 @@ digitaldem.it, 1 digitaldesign.ga, 1 digitaldesk.net, 1 -digitaldialogueforum.com, 1 digitaldisaster.tk, 1 digitaldruck.info, 1 digitale-afvalscheiding.nl, 1 @@ -42717,10 +42746,8 @@ digitalistan.tk, 1 digitalizer.my.id, 1 digitalizzazioneverona.it, 0 -digitaljuliac.com.br, 1 digitalkashmir.ml, 1 digitalkey.pro, 1 -digitalkoran.com, 1 digitallife.tk, 1 digitallink.be, 1 digitalliteracy.gov, 1 @@ -42736,11 +42763,10 @@ digitalninja.tk, 1 digitalnomadgirls.com, 1 digitalnomadsunderground.com, 1 +digitalnovasphere.com, 1 digitalo.cz, 1 digitaloath.com, 1 digitalphone.tk, 1 -digitalphoto.group, 1 -digitalphoto.tech, 1 digitalpiloten.org, 1 digitalplayground.com, 1 digitalplaygroundnetwork.com, 1 @@ -42808,7 +42834,6 @@ digivan.ml, 1 digivibe.cz, 1 digiwedoo.com.au, 1 -digiyatrafoundation.com, 1 diglloyd.com, 1 digminecraft.com, 1 dignilog.com, 1 @@ -42889,7 +42914,6 @@ dimitri-papadimitriou.gr, 1 dimitri.network, 1 dimitris.tk, 1 -dimitrovaus.com, 1 dimitrovgrad.bg, 1 dimitrovi.tk, 1 dimmak.com, 0 @@ -42958,12 +42982,11 @@ dinos-mag.tk, 1 dinotv.at, 1 dintrafic.net, 1 -diobrasperu.com, 1 +diocesedeosorio.org, 1 diodo.me, 1 dioesfoto.com, 1 diogbatech.tk, 1 diogenenettoyage.com, 1 -diogeneshoy.com, 1 diogocapela.com, 1 diogof.pt, 1 diogofmedeiros.com, 1 @@ -42984,6 +43007,7 @@ dipalma.me, 1 dipanopaulista.com.br, 1 dipanshuparashar.ml, 1 +dipietro.id.au, 1 dipling.de, 1 diplom-ru.tk, 1 diplomatic-council.org, 1 @@ -42998,6 +43022,7 @@ dipsis.com, 1 dipsis.kz, 1 dipsis.ru, 1 +dipsy.fi, 1 dipsytroller.com, 1 dipuleon.es, 1 dipuma.com, 1 @@ -43018,6 +43043,7 @@ directautoverhuur.com, 1 directb2b.ca, 1 directcouriers.com.au, 1 +directdawai.com, 1 directfinance.cz, 1 directhomeremodelinginc.com, 1 directinspectionskc.com, 1 @@ -43105,6 +43131,7 @@ dirunreddy.tk, 1 dis-tract.com, 1 disability.gov, 1 +disabilitynetwork.co.uk, 1 disabilityscoop.com, 1 disabled-world.com, 1 disabledpersons-railcard.co.uk, 1 @@ -43152,7 +43179,6 @@ discordbee.com, 1 discordextremelist.xyz, 1 discordghost.space, 1 -discordhome.com, 1 discordjs-japan.org, 1 discordservers.com, 1 discordsworld.tk, 1 @@ -43185,6 +43211,7 @@ discoverkeesler.marketing, 1 discoverlutruwita.com, 1 discoverradiance.com, 1 +discoversnoop.com, 1 discoverthehawkesbury.com.au, 1 discoverthreejs.com, 1 discoverucg.co.uk, 1 @@ -43205,7 +43232,6 @@ discuss.no, 1 discussionner.com, 1 discuzturkiye.tk, 1 -diseasekillertricks.com, 1 disengaged.tk, 1 disenialia.com, 1 disenian.com, 1 @@ -43266,7 +43292,6 @@ disinfestazioni.it, 1 disinfestazioni.milano.it, 1 disinfestazioni.modena.it, 1 -disinfestazioni.napoli.it, 1 disinfestazioni.net, 1 disinfestazioni.padova.it, 1 disinfestazioni.rimini.it, 1 @@ -43349,6 +43374,7 @@ disti.com, 1 distilleren.tk, 1 distinctdesign2009.com, 1 +distinctiveremodeling.com, 1 distinguishedlegal.com, 1 distinguishedprisoner.com, 1 disto.tk, 1 @@ -43356,6 +43382,7 @@ distortionwizard.com, 1 distortionx.tk, 1 distracteddriving.gov, 1 +distraction-league.de, 1 distraction.gov, 1 distraction.tk, 1 distractors.tk, 1 @@ -43381,12 +43408,14 @@ distrigenosa.tk, 1 distrikia.com.co, 0 distrilogservices.com, 1 +distrito10.cl, 1 distritoae.com, 1 distritotres.tk, 1 distritoxic.tk, 1 distro.re, 0 distrophy-grind.tk, 1 distrust.co, 1 +distruzionedocumentisensibili.it, 1 disturbedwarriors.tk, 1 dit.moe, 1 ditdot.hr, 1 @@ -43395,6 +43424,7 @@ ditetovinejlip.cz, 1 ditevsrdci.cz, 1 ditex.ddns.net, 1 +ditiee.com, 1 dities.tk, 1 ditissaskia.nl, 1 ditprint.dk, 1 @@ -43407,6 +43437,7 @@ div.energy, 1 diva-app.de, 1 divacresent.tk, 1 +divamengemudi.com, 1 divanogiusto.it, 1 divari.nl, 1 divas.joburg, 1 @@ -43451,7 +43482,6 @@ dividendz.net, 1 divider.tk, 1 divienna.nl, 1 -divigear.com, 1 divihosting.nl, 1 divinasaiamodas.com.br, 1 divineangel.tk, 1 @@ -43537,7 +43567,6 @@ dj-phil.fr, 1 dj-schoolzwolle.nl, 1 dj-wout.tk, 1 -dj-x.info, 1 dj16888a.com, 1 dj16888b.com, 1 dj16888c.com, 1 @@ -43566,7 +43595,6 @@ djanneli.tk, 1 djarman.tk, 1 djattack.com, 1 -djav.org, 1 djawabna.ga, 1 djax.tk, 1 djazair.ml, 1 @@ -43608,7 +43636,6 @@ djfede.tk, 1 djfelix.tk, 1 djfilms.tk, 1 -djfrenchy.com, 1 djfunkyju.de, 1 djgarcia.tk, 1 djh-nordmark.de, 1 @@ -43664,6 +43691,7 @@ djpatrik.tk, 1 djpiere.tk, 1 djpippoalpar.tk, 1 +djprmf.com, 1 djpromo.tk, 1 djpump-diaphragmpump.com, 1 djpyerr.tk, 1 @@ -43716,6 +43744,7 @@ djwilson.tk, 1 djyaman.tk, 1 djyoungcruse.tk, 1 +djzeneyer.com, 1 dk-kromeriz.cz, 1 dk-squad.de, 1 dk.search.yahoo.com, 0 @@ -43881,6 +43910,7 @@ dmhoteles.pe, 1 dmi.es, 1 dmi.gov.lb, 1 +dmia.org.au, 1 dmiapis.id, 1 dmiaviation.com, 1 dmilb.org, 1 @@ -43911,6 +43941,7 @@ dmsbg.com, 1 dmsgovernance.com, 1 dmshynk.com, 1 +dmskaspr.com, 1 dmslog.com, 1 dmslog.com.br, 1 dmstechnology.com, 1 @@ -43920,7 +43951,6 @@ dmvape.us, 0 dmwaste.com, 0 dmwclan.tk, 1 -dmx.xyz, 1 dmxclan.tk, 1 dmz.rs, 1 dmze.tk, 1 @@ -43928,6 +43958,7 @@ dn3s.me, 1 dn42.us, 1 dn9b1f9o30q82.cloudfront.net, 1 +dna-agency.it, 1 dna-technology.ua, 1 dna.li, 0 dnadk.com, 1 @@ -43983,6 +44014,7 @@ dngrexplorer.cf, 1 dnhome.net, 0 dnk.company, 1 +dnm-contracting.com, 1 dnmlab.it, 1 dnns.no, 1 dnplegal.com, 1 @@ -44003,6 +44035,7 @@ dns0.eu, 1 dnsaio.com, 1 dnsbird.org, 1 +dnsblocks.com, 1 dnscheck.tools, 1 dnscrawler.com, 1 dnscrypt-blacklist.tk, 1 @@ -44025,9 +44058,7 @@ dnsmonitor.com, 1 dnsnox.com, 1 dnspod.ml, 1 -dnspropagation.net, 1 dnsrate.com, 1 -dnsrevolve.com, 1 dnsscience.org, 1 dnssec.au, 1 dnssecandipv6.se, 1 @@ -44074,7 +44105,6 @@ dobrev.family, 1 dobrinya.tk, 1 dobrisan.ro, 1 -dobrisan.uk, 1 dobro-rok.cz, 1 dobro.ml, 1 dobrodar.tk, 1 @@ -44170,20 +44200,20 @@ doctorsarfarazdo.ga, 1 doctorsatdoor.com, 1 doctorshealthfund.com.au, 1 -doctorsinternet.com, 1 doctorswithoutborders.org, 1 -doctortmd.com, 1 doctorwho.cz, 1 doctosofi.mx, 1 doctour.eu, 1 doctour.fr, 1 doctrine.fr, 1 doctyapp.com, 1 +docu-tools.com, 1 docu.io, 1 docubox.info, 1 docugate.cloud, 1 docugatetest.cloud, 1 documaniatv.com, 1 +document360.com, 1 documentat.ga, 1 documentations-sociales.com, 1 documentationsite.net, 1 @@ -44290,7 +44320,6 @@ dogma.it, 1 dogma2000.tk, 1 dogmagic.tk, 1 -dogmap.jp, 1 dogmazic.net, 1 dogodki.today, 1 dogofwar.tk, 1 @@ -44415,6 +44444,7 @@ dolphins.tk, 1 dolphyserver.tk, 1 dolsee.com, 1 +dolutech.com, 1 dolys.fr, 1 dom-byt.tk, 1 dom-desertov.tk, 1 @@ -44431,6 +44461,7 @@ domadillo.com, 1 domagovic.tk, 1 domain-comparison.com, 1 +domain-privacy.org, 1 domain-skachat.cf, 1 domain-speicher.com, 0 domain-swiss.ch, 1 @@ -44653,7 +44684,6 @@ donggala.go.id, 1 dongha.org, 1 donghochinhhang.store, 1 -donghua-europe.com, 1 donghuapiandaquan.com, 1 dongjing.re, 1 dongor.tk, 1 @@ -44691,7 +44721,6 @@ donpietraos.tk, 1 donplafon.ru, 1 donpomodoro.com.co, 1 -donporque.com, 1 donquix.nl, 1 donsdoneriteautowash.com, 1 donsgroupattire.com, 1 @@ -44790,6 +44819,7 @@ dopesoft.de, 1 dopewars.tk, 1 dopfer-fenstertechnik.de, 1 +dophys.top, 1 dopiatku.pl, 1 doppeleinhorn.de, 1 doppenpost.nl, 1 @@ -44807,7 +44837,6 @@ doramamusic.gq, 1 doramiru.com, 1 dorams.one, 1 -doranobi-fansub.id, 1 dorcelvision.com, 1 dorco.be, 1 dordtpas.nl, 1 @@ -44816,7 +44845,6 @@ dorfkultur.net, 1 dorfzittig.de, 1 dorganico.cl, 1 -dorhandverkeren.no, 0 doriangardes.fr, 1 dorianharmans.nl, 1 dorianmuthig.com, 1 @@ -44826,6 +44854,7 @@ doritadata.com, 1 dorizonline.tk, 1 dorkface.tk, 1 +dorm.social, 1 dormi.hu, 1 dormilaine.fr, 1 dorminyeremenyjatek.hu, 1 @@ -44856,6 +44885,7 @@ dosei.net, 1 dosel.co.in, 1 dosenkiwi.at, 1 +dosenpendidikan.co.id, 1 dosenpintar.com, 1 doserres.tk, 1 dosgame.club, 1 @@ -44930,7 +44960,6 @@ dotrox.net, 1 dotsandarrows.eu, 1 dotsbuy.com, 1 -dotshule.ug, 1 dotsiam.co.th, 1 dotsiam.com, 1 dotsiam.in.th, 1 @@ -44947,6 +44976,10 @@ dotyk.me, 1 dotzauer-stb.de, 1 douai.me, 1 +douari.info, 1 +douari.jp, 1 +douari.net, 1 +douari.xxx, 1 douban.city, 1 double20.gg, 1 doublearm.in, 1 @@ -44974,7 +45007,7 @@ douceurcarlet.com, 1 doudlahfarms.com, 1 doudouquirespire.com, 1 -doudun.site, 1 +doudun.site, 0 doughseeker.com, 1 doughstory.cf, 1 douglas-ma.gov, 1 @@ -45019,10 +45052,8 @@ dovamzallag.com, 0 dovanow.com, 1 dovebuttare.it, 1 -dovechina.com, 1 doveconviene.it, 1 dovecotedental.co.uk, 1 -dovecraft.com.ua, 1 dovemoe.com, 1 dovenzorgmalawi.nl, 1 doverma.gov, 1 @@ -45036,7 +45067,6 @@ dovizborsa.com, 1 dovodlaw.ru, 1 dovolena-ihned.cz, 1 -dowell.media, 1 dowhatmakegood.de, 1 dowhatyoucannow.com, 1 dowina.com, 1 @@ -45115,7 +45145,6 @@ doyoulyft.com, 1 doypacky.cz, 1 doze-cloud.tech, 1 -dozecloud.com, 1 dozen-donuts.com, 1 dozor.ga, 1 dozor.gq, 1 @@ -45206,6 +45235,7 @@ drachenleder.de, 1 dracisvet.cz, 1 dracollectors.com, 1 +draconiusgo.com, 1 dracoon.team, 1 dracula.city, 1 drademirel.com, 1 @@ -45296,7 +45326,6 @@ dramatherapie.tk, 1 dramaticaudio.com, 1 dramaticpeople.com, 1 -drambikarathi.com, 1 dramyalderman.com, 1 drandrewarnold.com, 1 drandrewlofman.com, 1 @@ -45322,7 +45351,7 @@ dratini0.hu, 1 draughts64.org, 1 draugr.de, 1 -draup.com, 0 +draup.com, 1 draussen.tk, 1 dravalance.com, 1 dravengard.com, 1 @@ -45361,6 +45390,7 @@ drcorderocirujanoplastico.com, 1 drcroof.com, 1 drct.aero, 1 +drdach.pl, 1 drdamirplasticsurgeon.com, 1 drdb.gr, 1 drdca.gov, 1 @@ -45483,7 +45513,6 @@ dreso.com, 1 dress-cons.com, 1 dressabelle.tk, 1 -dresscodeny.com, 1 dressdiversions.com, 1 dressesbal.tk, 1 dressestore.tk, 1 @@ -45518,7 +45547,6 @@ drhildebrand.net, 1 drhiteshpatel.in, 1 drhogarth.co.uk, 1 -drhopeson.com, 1 drhouserepairs.com, 1 drianpublishing.tk, 1 drica.tk, 1 @@ -45608,6 +45636,7 @@ drivingschoolnearmelbourne.com.au, 1 drivio.co.uk, 1 drivio.uk, 1 +drivvie.com, 1 drivya.be, 1 drivya.ch, 1 drivya.com, 1 @@ -45620,7 +45649,6 @@ drjaensch.de, 1 drjamalazmi.in, 1 drjessicalattman.com, 1 -drjoe.ca, 1 drjonathansykes.com, 1 drjosebarrera.com, 1 drjulianneil.com, 1 @@ -45648,6 +45676,7 @@ drmatthewrandall.com, 1 drmichaelwong.com, 1 drmiltenbergermd.com, 1 +drminchev.com, 1 drminev.com, 1 drms.us, 1 drmtransit.com, 1 @@ -45725,6 +45754,7 @@ drouhin.com, 1 drowz.ee, 1 drozd.biz, 1 +drozera.com, 1 drpalmer-training.com, 1 drpancholi.com, 1 drpatyuen.com, 1 @@ -45758,7 +45788,6 @@ drt.org.nz, 1 drtanyaescobedo.com, 1 drthalhammer.at, 1 -drthiagopinheiro.com.br, 1 drthiagorighetto.com.br, 1 drtimmarch.com, 1 drtimothysteel.com.au, 1 @@ -45793,6 +45822,7 @@ druko.ga, 1 druko.gq, 1 drukwerkdeal.nl, 1 +drulvihasanov.com, 1 drum-majo-ijsselstrand.tk, 1 drum.tk, 1 drumbe.at, 1 @@ -45876,7 +45906,6 @@ dsecure.me, 1 dseg.org, 1 dsektionen.se, 0 -dsfnews.com, 1 dsfzsq.com, 1 dsg.ac.cn, 1 dsg.gd.cn, 1 @@ -45885,13 +45914,11 @@ dsgvo-addon.eu, 1 dsgvo-analyse.de, 1 dsgvo.name, 1 -dsh.io, 1 dshield.org, 1 dsigroup.com.tw, 1 dsimonitor.online, 1 dsiteam.in, 1 dsjbvba.be, 1 -dskbank.bg, 1 dskhome.bg, 0 dskrecords.tk, 1 dslz.tk, 1 @@ -45900,6 +45927,7 @@ dsmnet.org, 1 dsn-it.com, 1 dsn-k.com, 1 +dsnusantara.com, 1 dso-izlake.si, 1 dsobook.club, 1 dsol.hu, 1 @@ -45933,6 +45961,7 @@ dsyunmall.com, 1 dt-privacyportal-ui.azurewebsites.net, 1 dt2rmc.pt, 1 +dtacogo.com, 1 dtacogo.eu, 1 dtact.com, 1 dtail-platform.com, 1 @@ -45996,13 +46025,13 @@ duama.top, 1 duanemorrisinstitute.com, 1 duanre.tk, 1 +duanything.com, 1 duarteeleiteconsultoria.com.br, 1 dubachinn.com, 1 dubai-realestate.space, 1 dubaiaward.link, 1 dubaibliss.com, 1 dubaifitnesschallenge.com, 1 -dubaigrandsale.com, 1 dubailuxuryinvestors.com, 1 dubaimonsters.com, 1 dubaipremiuminvest.com, 1 @@ -46081,7 +46110,6 @@ dudeexpert.cf, 1 dudesunderwear.com.br, 0 dudleypolicema.gov, 1 -dudushu.com, 1 due-diligence-security.com, 1 duediligencedataroom.com, 1 duelhost.dk, 0 @@ -46133,7 +46161,6 @@ dukegat.de, 0 dukemaps.net, 1 dukeofmetal.tk, 1 -dukes-london.com, 1 dukes.ca, 1 dukeshotel.com, 1 dukin.tk, 1 @@ -46157,7 +46184,6 @@ dum.tw, 1 dumax.fr, 1 dumb-laws.net.ru, 1 -dumbcryptopunks.com, 1 dumbdrinker.com, 1 dumbeartech.com, 1 dumbfunded.co.uk, 1 @@ -46190,7 +46216,6 @@ dunescorporation.tk, 1 dungbui.co, 0 dungbui.net, 1 -dungchata.com, 1 dungenesskids.com, 1 dungeon-bbs.de, 1 dungeoncity.com, 1 @@ -46288,6 +46313,7 @@ dustbox.tk, 1 dustinbrett.com, 1 dustindecker.com, 1 +dustinpurdy.com, 1 dustman.tk, 1 dustpla.net, 1 dustplanet.de, 1 @@ -46339,6 +46365,7 @@ duttonmt.gov, 1 dutyfreeperfumes.tk, 1 duurzaamgww.nl, 1 +duurzaamheidskaart.nl, 1 duurzaamwonen.amsterdam, 1 duux.com, 1 duv.al, 1 @@ -46358,6 +46385,7 @@ duxbow.de, 1 duxbury-ma.gov, 1 duxi-s-feromonami.ga, 1 +duxsco.de, 1 duysondang.name.vn, 1 duzavo.cz, 1 duzcehaberleri.tk, 1 @@ -46435,7 +46463,6 @@ dxjdata.com, 1 dxm.no-ip.biz, 1 dxrating.net, 1 -dxsigner.com, 1 dxzl.org, 1 dxzsj.cn, 1 dy.express, 1 @@ -46493,7 +46520,6 @@ dyn-nserve.net, 1 dyn.net, 1 dynabob.tk, 1 -dynacrop.space, 1 dynadns.de, 1 dynalogix.eu, 0 dynamic-movie.com, 1 @@ -46513,6 +46539,7 @@ dynamicpl.us, 1 dynamicplus.it, 1 dynamicquantum.net, 1 +dynamicroofingconcepts.com, 1 dynamicsandlearning.com, 1 dynamicsdays.info, 1 dynamicservers.co.uk, 1 @@ -46520,6 +46547,7 @@ dynamicsretailnotes.com, 1 dynamictesting.co.uk, 1 dynamictostatic.com, 1 +dynamicwheelco.nz, 1 dynamicyou.co.uk, 1 dynamis.tk, 1 dynamitejobs.com, 1 @@ -46671,7 +46699,7 @@ e-bookshelf.de, 1 e-borneoshop.com, 1 e-boss.tk, 1 -e-branchekoden.dk, 1 +e-branchekoden.dk, 0 e-buro.tk, 1 e-census2021.bg, 1 e-classroom.tk, 1 @@ -46748,6 +46776,7 @@ e-matras.ua, 1 e-medicines.tk, 1 e-migration.ch, 0 +e-modusvivendi.com, 1 e-mutation.com, 1 e-nail.tk, 1 e-name.tk, 1 @@ -46756,7 +46785,6 @@ e-networks.jp, 1 e-node.ru, 1 e-noos.com, 1 -e-office.ro, 1 e-ops.bg, 1 e-otdyx.tk, 1 e-parvaldnieks.lv, 1 @@ -46882,7 +46910,6 @@ ea2drocks.com, 1 eaa-online.org, 1 eac.gov, 1 -eac222.com, 1 eac444.com, 1 eac555.com, 1 each.tk, 1 @@ -47024,7 +47051,7 @@ easiest-way.de, 1 easlerlaw.com, 1 easol.com, 1 -east-front-miniatures.com, 1 +east-front-miniatures.com, 0 east-line.su, 1 east-westlogistics.com, 1 eastafricafeed.ga, 1 @@ -47065,7 +47092,6 @@ eastmedo.pl, 1 easton.fun, 1 easton.ga, 1 -eastonpaxtongolf.com, 0 eastpeoria-il.gov, 1 eastpershingdental.com, 1 eastping.com, 1 @@ -47241,6 +47267,7 @@ eauxdevienne.fr, 1 eava.ga, 1 eavafm.com, 1 +eawmaas.top, 1 eazy.de, 1 eazy.gr, 1 eazycert.in, 1 @@ -47313,7 +47340,6 @@ ebingwa.co.ke, 1 ebiografia.com, 1 ebiografias.com.br, 1 -ebis.info, 1 ebisee.com, 1 ebizarts.com, 1 ebjork.se, 1 @@ -47407,7 +47433,7 @@ ecdpm.org, 1 ece-inc.net, 1 ecelembrou.ovh, 1 -ecemella.com, 0 +ecemella.com, 1 ecemi-alu.com, 1 ecency.com, 1 ecetechsol.com, 1 @@ -47423,6 +47449,7 @@ echidna.com.au, 1 echidnalock.com.au, 1 echinus.solutions, 1 +echo-bms.com, 1 echo-in.info, 1 echo-n.nz, 0 echo-online.de, 1 @@ -47439,7 +47466,6 @@ echoit.net.au, 1 echoit.services, 1 echomail.org, 1 -echonautique.com, 1 echopaper.com, 1 echorecovery.org, 1 echosdg.com, 1 @@ -47492,8 +47518,8 @@ eclipseide.org, 1 eclipseinspectionservices.co.uk, 1 eclipsesource.com, 1 +eclipsestatus.io, 1 eclixo.com, 1 -ecmr.fi, 1 ecmx.eu, 1 ecn.ir, 1 ecnetworker.com, 1 @@ -47510,6 +47536,7 @@ eco69.com, 1 eco69.eu, 1 eco69.pl, 1 +ecoacqua.net, 1 ecobalispa.com, 1 ecobiosaude.com.br, 1 ecobunker.co.uk, 1 @@ -47526,7 +47553,6 @@ ecodepur.fr, 1 ecodesign-labo.jp, 1 ecodesigns.nl, 1 -ecodrive.in.ua, 1 ecoelectricsandiego.com, 1 ecoeuropa.cf, 1 ecofinancing.com, 1 @@ -47537,6 +47563,7 @@ ecogarden.design, 1 ecogen.com.au, 1 ecogen.net.au, 1 +ecogenamerica.com, 1 ecohaus-pinklao-salaya.com, 0 ecoheatcool.co.uk, 1 ecohimdv.tk, 1 @@ -47619,6 +47646,7 @@ econsumer.gov, 1 econveyancer.co.uk, 1 ecoon.net, 1 +ecopaint.pt, 1 ecopark.asia, 1 ecopath.org, 1 ecopiscines.fr, 1 @@ -47675,7 +47703,6 @@ ecrehabandwellness.com, 1 ecrehou.com, 1 ecrequipamientos.com, 1 -ecrimeresearch.org, 1 ecrimex.net, 1 ecrownoffire.com, 1 ecrums.gov, 1 @@ -47730,7 +47757,6 @@ eddesign.ch, 1 eddi.org.au, 1 eddie.website, 1 -eddiepatella.co, 0 eddmil.es, 1 eddns.de, 1 eddns.eu, 1 @@ -47792,7 +47818,6 @@ edgeconnectnj.net, 1 edgecustomersportal.com, 1 edgeimpulse.com, 1 -edgeinteriors.nz, 1 edgeinvestments.estate, 1 edgeless.pp.ua, 0 edgelogs.com, 1 @@ -47872,12 +47897,10 @@ edmilia.tk, 1 edmoncu.com, 1 edmondok.gov, 1 -edmontonwellness.ca, 0 edmundcelis.com, 1 edmundo.ro, 1 edmundy.tk, 1 edmwaves.org, 1 -edocperso.fr, 1 edocr.com, 1 edok.com.br, 1 edopomoga.gov.ua, 1 @@ -47892,7 +47915,6 @@ edremitweb.site, 1 edrepay.com, 1 edrgroup.nl, 1 -edri.org, 1 edrosd.cf, 1 edrost.tk, 1 edsby.com, 0 @@ -47901,7 +47923,6 @@ edservicing.com, 1 edshogg.co.uk, 1 edsm.net, 1 -edsmartparts.nl, 1 edsplain.ro, 1 edstem.org, 1 edstep.com, 1 @@ -47927,7 +47948,9 @@ edubirdie.com, 1 edublognews.tk, 1 edubox.pt, 1 +educ-aid.site, 1 educabis.tk, 1 +educacaopocos.com.br, 1 educacionnm.ml, 1 educacionvirtual.com.ar, 1 educaenvivo.com, 1 @@ -47971,14 +47994,12 @@ educourse.nl, 1 edudip-next.com, 1 edudip.com, 1 -edudoc.ch, 1 edufever.com, 1 edufever.in, 0 eduflow.at, 1 -edugain.org, 1 edugeton.com, 1 edugram.com, 1 -eduhk.hk, 1 +eduhk.hk, 0 eduhub.ml, 1 eduhublisbon.com, 1 eduid.se, 1 @@ -47991,7 +48012,9 @@ edulinks.ml, 1 edumanage.tk, 1 edumaritime.net, 1 +edumedcourses.com, 1 edumerson.com, 1 +edumontclasses.com, 1 edunaut.com.au, 1 edunet.gq, 1 edunian.com, 1 @@ -48004,7 +48027,6 @@ eduqfix.com, 1 eduradiadores.com.br, 1 eduroam.no, 1 -eduroam.org, 1 eduroam.uy, 1 edusanjal.com, 1 eduschool.ml, 1 @@ -48025,7 +48047,6 @@ edv-lehrgang.de, 1 edvan.com.br, 1 edvberger.com, 1 -edvestinu.com, 1 edvgarbe.de, 1 edvision.ga, 1 edvmesstec.de, 1 @@ -48053,6 +48074,8 @@ edytabania.com, 1 edzo.dk, 1 ee-terminals.com, 1 +ee4j.com, 1 +ee4j.net, 1 ee4j.org, 1 ee5197.co, 1 ee6729.co, 1 @@ -48100,6 +48123,7 @@ eery.de, 1 eesti.id, 1 eestitervisekassa.ee, 1 +eetadvies.be, 1 eetestingcenter.com, 1 eevie.io, 1 eevpn.com, 1 @@ -48204,6 +48228,7 @@ efterfest.tk, 1 eftotoekspertizbalikesir.com, 1 efutbol.tk, 1 +efxclipse.org, 1 eg-quaternary-sci-j.net, 1 eg-secure.co.jp, 0 eg22.com, 1 @@ -48292,6 +48317,7 @@ egotripproductions.org, 1 egoutierrpaquette.ca, 1 egov.digital, 1 +egrabby.com, 1 egrasmanipur.nic.in, 1 egreensvape.com, 1 egregius.be, 0 @@ -48315,6 +48341,7 @@ egyptexposed.tk, 1 egypthomemaintenance.com, 1 egyptian.gq, 1 +egyptianegyptology.org, 1 egyptianeuphoria.com, 1 egyptianhak.tk, 1 egytimes.tk, 1 @@ -48328,7 +48355,6 @@ eharmony.com, 1 ehazi.hu, 1 ehbo-woenselnoord.nl, 1 -ehbo.nl, 1 ehbsecuritydavy.be, 1 ehcommerce.com, 1 ehealth.gov.au, 1 @@ -48390,7 +48416,6 @@ eifel.website, 1 eifelstuebchen.de, 1 eiffageconstruction.com, 1 -eiga.com, 1 eigenaardig.tk, 1 eigenbubi.de, 1 eigendeeg.eu, 1 @@ -48448,14 +48473,12 @@ eintageinzug.de, 1 eintoepfe-bruchsal.de, 1 eintracht-rodde.de, 1 -einvestment.com, 1 einwie.com, 1 eirb.fr, 1 eirgroup.com.au, 1 eirik.eu, 1 eiriksdottir.is, 1 eirikyrolae.tk, 1 -eis.org.uk, 1 eisaev.ru, 1 eisblau.org, 1 eisei-iinkai.com, 1 @@ -48509,7 +48532,10 @@ ejkweb.nl, 1 ejkwebdesign.nl, 1 ejsc.co.jp, 1 +ejuniper.co, 1 ejuniper.com, 1 +ejuniper.es, 1 +ejuniper.net, 1 ek-networks.de, 0 eka1.com, 0 ekadry.info, 1 @@ -48533,7 +48559,6 @@ ekherelakhbar.com, 1 ekho.tk, 1 ekimae-pharma.jp, 1 -ekimaeseitai.com, 1 ekimma.com, 1 ekiphost.com, 1 ekivita.eu, 1 @@ -48564,7 +48589,6 @@ ekoport.ru, 1 ekosaltis.lt, 1 ekosf.ru, 1 -ekospajzka.cz, 1 ekostecki.de, 1 ekourbanisterna.se, 0 ekowibowo.com, 1 @@ -48581,7 +48605,6 @@ eksisozluk.com, 0 eksperiments.lv, 1 ekspert.tk, 1 -ekspertemerytalny.pl, 1 ekspertka.com.pl, 1 ekwador.com, 1 ekyu.moe, 1 @@ -48590,6 +48613,7 @@ el-akses.com, 1 el-cell.com, 1 el-hossari.com, 1 +el-jefe.me, 1 el-masri.bg, 1 el-mundo.tk, 1 el-tatwer.tk, 1 @@ -48640,7 +48664,6 @@ elbiaadmin.sk, 1 elbiahosting.sk, 1 elbir.tk, 1 -elblogdeldev.es, 1 elblogdeldinero.com, 1 elblogdezoe.es, 1 elblok.com, 1 @@ -48649,6 +48672,7 @@ elburn.gov, 1 elburnfire.gov, 1 elbuz.com, 1 +elbvision.de, 1 elbwiese.de, 0 elcactus.tk, 1 elcajon.gov, 1 @@ -48694,6 +48718,7 @@ eldercaring.ca, 0 elderdentallab.com, 1 elderdevelopmentgroup.com, 1 +elderfittv.com, 1 elderindex.org, 1 elderjustice.gov, 1 elderplan.org, 1 @@ -48711,7 +48736,7 @@ eldorado.aero, 1 eldoradocylinders.com, 1 eldoradoil.gov, 1 -eldoradoinsiders.com, 1 +eldoradoinsiders.com, 0 eldoradotechnical.com, 1 eldrid.ge, 1 ele-sm.com, 1 @@ -48721,7 +48746,6 @@ elearningi.pl, 1 elearningpilot.com, 1 eleather.it, 1 -elecbuz.com, 0 eleconomista.com.ar, 1 electa-sourcing.com, 1 electerious.com, 1 @@ -48765,7 +48789,7 @@ electricgatemotorshillcrest.co.za, 1 electricgatemotorsroodepoort.co.za, 1 electricgypsies.nl, 1 -electrichome.fr, 0 +electrichome.fr, 1 electriciancenturion24hours.co.za, 1 electriciannewburypark.com, 1 electricianpacificpalisades.com, 1 @@ -48835,7 +48859,6 @@ elefantcms.com, 1 elefanten-cup.de, 1 elefantschule.de, 1 -elefsisport.gr, 0 elegance-lingerie.com, 1 elegance-sm.com, 1 elegance96.tk, 1 @@ -48922,7 +48945,6 @@ elemenik.com, 1 elemenop.tk, 1 element-ppf.com, 1 -element.io, 1 elementair.co.nz, 1 elemental-photography.co.uk, 1 elemental.software, 1 @@ -49017,7 +49039,6 @@ elev8fashion.ca, 1 elevacionesrama.com, 1 elevanhairdressing.co.uk, 1 -elevateservices.com, 1 elevatewebdesigns.com, 1 elevationplumbingandheating.com, 1 elevator.ee, 1 @@ -49032,13 +49053,10 @@ elexel.ru, 1 elexon.co.uk, 1 elexprimidor.com, 1 -elfagr-med.com, 1 elfe.de, 1 elfejoyeux.com, 1 elfi.com, 1 -elfinit.net, 1 elfix.sk, 1 -elfland.me, 1 elfnon.com, 1 elforat.tk, 1 elforno.gr, 1 @@ -49049,6 +49067,7 @@ elgancho.tk, 1 elgargajo.tk, 1 elgenero.com, 1 +elgha.co, 1 elgin.ga, 1 elgin.tk, 1 elginhotels.com, 1 @@ -49078,6 +49097,7 @@ eliasong.com, 0 eliassierra.pro, 1 eliaswendt.com, 0 +eliasworldmedia.com, 0 eliaustvarjaspomine.si, 1 eliav.tk, 1 elibidore.ml, 1 @@ -49100,7 +49120,6 @@ elikers.ml, 1 elimidrol.com, 1 eliminations.tk, 1 -elimit.eu, 1 elimitecreamforsale.ga, 1 elimperiolatino.com, 1 elina.pp.ua, 1 @@ -49152,6 +49171,7 @@ elite-tools.tk, 1 elite-units.tk, 1 elite.memorial, 1 +elite12.de, 1 eliteaccounting.co.nz, 1 eliteammunition.com, 1 elitebike.com.co, 1 @@ -49186,14 +49206,17 @@ eliteprofit.fr, 1 elitepumps.net, 1 eliterequestboard.tk, 1 +eliteself.tech, 1 elitesim.ga, 1 elitesquadmodz.tk, 1 elitesynergyservices.com, 1 elitetechz.nl, 1 elitetoy.com.br, 1 elitewealth.in, 1 +elitexindia.in, 1 elitexxx.com, 1 elithus.se, 1 +elitmedopt.ru, 1 elivenet.com, 1 elixi.re, 1 elixir.bzh, 1 @@ -49256,8 +49279,8 @@ ellinkauppa.fi, 0 elliot.cat, 0 elliotadler.co, 0 -elliotbrandwein.com, 1 elliotlewisms.com, 1 +elliott-assist.com, 1 elliottallanhilsinger.com, 0 elliottbernstein.com, 1 elliottgaming.ga, 1 @@ -49304,12 +49327,12 @@ elo-forum.org, 1 elo-rocket.com, 1 elobservador.tk, 1 -eloca.ls, 1 elocals.me, 1 elodees.com, 1 elodieclerc.ch, 1 elodrias.de, 1 elog.tokyo, 1 +eloi.co, 1 eloiseponnau.com, 1 elok.eu.org, 1 elon.gov, 1 @@ -49319,6 +49342,7 @@ elontime.de, 1 elorbe.com, 1 elorrieta.eus, 1 +elosconstrutora.com.br, 1 elosoavila.tk, 1 elovip.com.br, 1 elpac.info, 1 @@ -49332,10 +49356,8 @@ elpcnc.com, 1 elpellejodelabreva.tk, 1 elperdigon.tk, 1 -elperfil.pe, 1 elperiodicodelaenergia.com, 1 elpincho.tk, 1 -elpitazo.net, 1 elplugins.xyz, 1 elpo.net, 1 elpradopaloalto.com, 1 @@ -49367,7 +49389,6 @@ elsg.co.uk, 1 elshop1eu.com, 1 elshou.com, 1 -elsieapp.com, 1 elsoundspeakers.com, 1 elstravato.com, 1 elsuccionador.com, 1 @@ -49415,6 +49436,7 @@ elviraszabo.com, 1 elvis-atouchofgold.com, 1 elvis-presley.tk, 1 +elvis.com.ua, 1 elvismania.tk, 1 elvispresley.net, 1 elvisvrconnect.co.uk, 1 @@ -49435,7 +49457,6 @@ elysiumware.com, 1 elyx70days.org, 1 elz-ergotherapie.de, 1 -elzoo.shop, 1 em-biotek.cz, 0 em-racing.com, 1 em-racing.de, 1 @@ -49458,7 +49479,6 @@ emailablev.com, 1 emailalaperformance.fr, 1 emailassist.ai, 1 -emailbildirim.com, 1 emailbusters.tk, 1 emailer.party, 1 emailexpress.ga, 1 @@ -49487,7 +49507,6 @@ emanol.co.uk, 1 emanuel-loos.eu, 1 emanuel.photography, 1 -emanuela-gabriela.co.uk, 1 emanuelachiriaco.tk, 1 emanuelduss.ch, 1 emanuelemazzotta.com, 1 @@ -49597,6 +49616,7 @@ emielraaijmakers.nl, 1 emigrantes.tk, 1 emigratieplanner.com, 1 +emil-akademie.de, 1 emil-dein-baecker.com, 1 emil-dein-baecker.de, 1 emil-reimann.com, 1 @@ -49645,6 +49665,7 @@ emita.ee, 1 emiten.com, 1 emivauthey.com, 0 +emjaygold.com, 1 emkanrecords.com, 0 emkode.pl, 1 emlakkonut.com.tr, 1 @@ -49690,7 +49711,6 @@ emocionestlp.com, 1 emocionypensamiento.com, 1 emoforum.tk, 1 -emoha.com, 1 emoji-meaning.org, 1 emoji-symbols.org, 1 emoji.build, 1 @@ -49775,6 +49795,7 @@ emporiorochaeamorim.com.br, 1 emporium-italy.com, 1 emporiumbeverages.com, 1 +empost.eu, 1 empower.ae, 1 empoweraces.com, 1 empowerdb.com, 1 @@ -49852,7 +49873,6 @@ emyself.org, 1 emystars.tk, 1 emz.im, 1 -emzi0767.com, 1 emzy.de, 1 en-develop.fr, 1 en-je.fr, 1 @@ -49866,9 +49886,7 @@ enablingcommunities.com.au, 1 enactor.co, 1 enago.com, 1 -enagramm.com, 1 enai.eu, 1 -enaktenan.com, 1 enalean.com, 1 enam.gov.in, 1 enamae.net, 1 @@ -49885,7 +49903,7 @@ encanroy.ca, 1 encanroy.com, 1 encanstanne.ca, 1 -encantowater.com, 1 +encantowater.com, 0 encd.life, 1 ence.es, 1 encenna.com.br, 0 @@ -49903,6 +49921,7 @@ encontracarros.pt, 1 encontreumagp.com, 1 encontro.online, 1 +encontroespiritadeinverno.com.br, 1 encore.tech, 1 encoro.org, 1 encotentin.fr, 1 @@ -49918,7 +49937,6 @@ encrypted.google.com, 1 encryptedaudience.com, 1 encryptedconnection.net, 1 -encryptio.it, 1 encryptionweb.tk, 1 encryptmy.site, 1 encryptmycard.com, 1 @@ -49983,7 +50001,6 @@ endsoftpatents.org, 1 endsoftwarepatents.org, 1 endspamwith.us, 1 -endstation-chaos.de, 1 enduranceseries.ca, 1 enduro-center.pt, 1 enduroxtrem.tk, 1 @@ -50081,6 +50098,7 @@ energylocals.au, 1 energylocals.com, 1 energylocals.com.au, 1 +energylocalsretail.com.au, 1 energymedia.tk, 1 energymonitor.ai, 1 energyperformancecertificates.co.uk, 1 @@ -50116,6 +50134,7 @@ enfieldheightsacademy.org.uk, 1 enfinnit.com, 1 enflow.nl, 1 +enfluentia.com, 1 enforcement-trends-dev.azurewebsites.net, 1 enforcement-trends-test.azurewebsites.net, 1 enforcement-trends.azurewebsites.net, 1 @@ -50138,7 +50157,6 @@ engardelinux.org, 1 engaugetools.com, 1 engbers.com, 1 -engehall.com, 1 engelandautohuur.nl, 1 engeldasein.at, 1 engeldasein.com, 1 @@ -50149,10 +50167,12 @@ engelsism.tk, 1 engeltransportes.com.br, 1 engelundlicht.ch, 1 +engelwerbung.de, 1 engelzicht.com, 1 engen.co.za, 0 engg.ca, 1 enggar.tk, 1 +engicenter.com, 1 engie-energia.pe, 1 engie-laadpalen.nl, 0 engima.nl, 1 @@ -50179,14 +50199,13 @@ engl-distribution.com, 1 engl-distribution.de, 1 engl-distribution.net, 1 -engl-server.de, 1 +engl-server.de, 0 engl-systems.de, 1 englandbeach.com, 1 englandgenealogy.co.uk, 1 englandlearn.com, 0 englandschool.tk, 1 englesh.org, 1 -english-community.com, 1 english-to-russian-translation.tk, 1 english-training.tk, 1 english.events, 1 @@ -50234,6 +50253,7 @@ enigmamusic.tk, 1 enigmatry-website-test.azurewebsites.net, 1 enigmavault.io, 1 +enilive.it, 1 enimo.ru, 1 enisor.bg, 1 enitso.de, 1 @@ -50273,7 +50293,7 @@ enmedia.eu, 1 enmowe.co.ke, 1 enmowe.tech, 1 -ennekoops.nl, 0 +ennekoops.nl, 1 enno.mom, 0 ennori.jp, 1 ennova.com, 0 @@ -50365,6 +50385,7 @@ entdeckertouren.com, 1 enteente.com, 1 entegrations.io, 1 +entelodont-laboratory.cz, 1 ententaxi.de, 1 enter.co, 1 enteratesoria.tk, 1 @@ -50393,7 +50414,6 @@ enthrallinggumption.com, 1 enticingai.com, 1 entitlementtrap.com, 1 -entityelevation.com, 1 entityfiling.com, 1 entoen.nu, 1 entomologia.it, 1 @@ -50519,7 +50539,6 @@ environmental-colleges.com, 1 environmentaljustice.gov, 1 envirosell.com, 1 -envirotecmagazine.com, 1 envirotecstructures.com.au, 1 envirotivity.com, 1 envirowastemanagement.com, 1 @@ -50680,6 +50699,7 @@ epoch-film.ml, 1 epochcg.pt, 1 epochconcepts.com, 0 +epochstream.com, 1 epolitiker.com, 1 epos.az, 1 eposmidlands.co.uk, 1 @@ -50707,7 +50727,6 @@ epropertyplus.com, 1 eprosto.cf, 1 eprzybornik.pl, 1 -eprzydasie.pl, 1 epsamsg.com, 1 epsilogix.com, 1 epsilon.photography, 1 @@ -50716,6 +50735,7 @@ epsomnhpolice.gov, 1 epson.ru, 1 epspolymer.com, 1 +epstechclub.ca, 1 eptg.hu, 0 eptirgotajs.lv, 1 epu-crestois.fr, 1 @@ -50804,6 +50824,7 @@ erasmusmc.nl, 0 erasmusplus.org.pl, 1 erasmusplusrooms.com, 1 +eraspadita.com.uy, 1 erasure.tk, 1 erasyou.com, 1 erate.fi, 1 @@ -50822,6 +50843,8 @@ erdekesseg.com, 1 erdelyireceptek.ro, 1 erdethamburgeronsdag.no, 1 +erdewiege.dedyn.io, 1 +erdewiege.moe, 1 ereader.uno, 1 erebuildings.com, 1 erectiepillenwinkel.nl, 1 @@ -50834,6 +50857,7 @@ erenvakfi.org, 1 erethon.com, 1 erfgoedeisden.tk, 1 +erfgoeds-hertogenbosch.nl, 1 erfolgreich-fuer-freiberg.de, 1 erfolgsmaschine.ch, 0 erftstadt.de, 1 @@ -50844,7 +50868,6 @@ ergobyte.eu, 1 ergobyte.gr, 1 ergodark.com, 1 -ergolabos.gr, 1 ergolyam.top, 1 ergomar-ergolding.de, 1 ergometrics.org, 1 @@ -50869,6 +50892,7 @@ ericafielderstudio.com, 1 ericairwin.com, 1 ericccheng.com, 1 +ericdeanseaton.com, 1 ericdiao.com, 1 ericdobson.com, 1 ericfm.tk, 1 @@ -50951,7 +50975,6 @@ erlebniswege-asbach-baeumenheim.de, 1 erlebniswelt-meissen.com, 1 erli.pl, 1 -erma.agency, 1 ermak.tk, 1 erman.ga, 1 ermanyaman.com.tr, 1 @@ -51079,6 +51102,7 @@ es888999.com, 1 esaborit.ddns.net, 0 esadnext.cloud, 1 +esafetyfirst.com, 1 esagente.com, 1 esajokinen.net, 1 esalinity.com, 0 @@ -51119,7 +51143,6 @@ escapees.com, 0 escapeforyou.com, 1 escapegames.dk, 1 -escapejunk.com, 1 escapely.com, 1 escapemotions.com, 1 escapeplaza.de, 1 @@ -51171,7 +51194,6 @@ escueladego.tk, 1 escueladelsabor.com, 1 escueladeministerioytecnologia.com, 1 -escuelagobierno.org, 1 escuelaparapapas.tk, 1 escuelasargento.tk, 1 escuelitasansebastian.cl, 1 @@ -51248,6 +51270,7 @@ esleme.com, 1 eslightinghire.co.uk, 1 eslint.org, 0 +eslnewsstories.com, 1 eslove.jp, 1 eslutt.cc, 1 esm.kr, 0 @@ -51333,7 +51356,6 @@ espoonkumi.fi, 0 esport-agency.fr, 1 esporte.casino, 1 -esporters.it, 1 esporters.today, 1 esportsbattles.ga, 1 espower.com.sg, 1 @@ -51405,7 +51427,6 @@ essenzarj.com, 1 esseriumani.com, 1 essex.cc, 1 -essexapartmenthomes.com, 1 essexcountyvermont.gov, 1 essexhighways.org, 1 essexmoneyman.com, 1 @@ -51462,13 +51483,13 @@ esteticka-chirurgie-nohy.cz, 1 estetista.net, 1 estheclinic.co.uk, 1 +esther.hu, 1 esthergoh.com, 1 estherlew.is, 1 estherstas.com, 1 estherstasiniewicz.com, 1 esthesoleil.jp, 1 esthetiqueboissiere.fr, 1 -estila.co, 1 estilopack-loja.com.br, 1 estintori.roma.it, 1 estiv-ales.fr, 1 @@ -51480,6 +51501,7 @@ estoniananonymous.tk, 1 estoniantrade.ee, 1 estonoentraenelexamen.com, 1 +estonoesloquepareze.com, 1 estopero.tk, 1 estopwatch.net, 1 estorgio.com, 1 @@ -51506,11 +51528,13 @@ estudiemosvirtualmente.com, 1 estudio21pattern.com, 0 estudiodeatores.com.br, 1 +estudiojmgutierrez.com, 1 estudiomantis.tk, 1 estudionale.com, 1 estudios-biblicos.tk, 1 estudiosalmogavares.tk, 1 estudiosmart.com, 1 +estudiossocioeconomicos.com, 1 estudiovillaran.com, 1 esu.dog, 1 esu.moe, 1 @@ -51534,6 +51558,7 @@ et-inf.de, 1 et-xprojects.co.za, 1 et.al, 1 +et2c.com, 1 et420nrw.tk, 1 etaconic.com, 1 etaes.eu, 1 @@ -51662,6 +51687,7 @@ etiqa.tk, 1 etiquetaswithlove.com, 1 etisalat.af, 1 +etitlelien.net, 1 etke.cc, 1 etlab.in, 1 etme.com, 1 @@ -51782,6 +51808,7 @@ eung.ga, 1 eunicetan.com, 1 eunomy.io, 1 +eupack.pl, 1 eupay.de, 1 euphoriaonline.tk, 1 euphoriareign.com, 1 @@ -51852,7 +51879,6 @@ eurohell-design.de, 1 euroherp.com, 1 eurohouse.tk, 1 -euroindia.net, 1 eurolink.tk, 1 eurolocarno.es, 1 eurologix.com, 1 @@ -51877,20 +51903,17 @@ europastudien-chemnitz.de, 1 europastudien.de, 1 europatour2005.tk, 1 -european-accreditation.org, 1 european-agency.org, 1 european-alternatives.eu, 1 european-hospital.ga, 1 european-hospital.ml, 1 european-hospital.tk, 1 european-silk-road.eu, 1 -european-village.com, 1 europeananomalouswave.tk, 1 europeanbcc.eu, 1 europeancuisine.tk, 1 europeancupinline.eu, 1 europeangaming.eu, 1 -europeanjournalism.fund, 1 europeanlifemedia.com, 0 europeanmemories.net, 1 europeannewschool.eu, 1 @@ -51899,8 +51922,7 @@ europeanspring.net, 1 europeanstudies-chemnitz.de, 1 europeantransmissions.com, 1 -europeantransportmanagement.com, 1 -europeanwineresource.com, 1 +europedigital.cloud, 1 europeluxuryweddings.com, 1 europeonline.tk, 1 europeontrack.org, 1 @@ -51998,7 +52020,6 @@ evanescenceturkey.tk, 1 evanfiddes.com, 1 evang.at, 1 -evangelicalmagazine.com, 1 evangelietuin.tk, 1 evangelionmagi.tk, 1 evangelise.asia, 1 @@ -52007,7 +52028,6 @@ evanreev.es, 1 evanscourtreporters.com, 1 evanserver.org, 1 -evansfox.com, 1 evanspoliceny.gov, 1 evanstonnow.com, 0 evansville-wy.gov, 1 @@ -52056,11 +52076,13 @@ event-register.jp, 1 event-reisen.tk, 1 event-trac.com, 1 +event-wunsch.de, 1 event.coffee, 1 event1teamstore.com, 0 event4fun.no, 1 event64.ru, 1 eventact.com, 0 +eventario.co, 1 eventaro.com, 1 eventblog2017.tk, 1 eventbrite.at, 1 @@ -52302,8 +52324,8 @@ evolutionmuaythai.com, 1 evolutionosteopathy.co.uk, 1 evolutive-records.tk, 1 +evolutlabs.com, 1 evoluxion.co, 1 -evoluzione.fr, 0 evolve-analytics.co.uk, 1 evolve.com, 1 evolveagency.gr, 1 @@ -52327,7 +52349,7 @@ evosyn.com, 1 evote-ch.ch, 1 evotec.pl, 1 -evoting-test.ch, 0 +evoting-test.ch, 1 evoting.ch, 0 evrial.com, 1 evromandie.ch, 1 @@ -52442,11 +52464,9 @@ excdn.eu.org, 1 exceed-clan.tk, 1 excel-mechanical.com, 1 -excelbroadcast.com, 1 excelbusinessservices.ie, 1 excelcenter.org, 1 exceldatapro.com, 1 -exceldepo.com, 1 exceldor.ca, 1 exceldor.com, 1 exceldorcooperative.ca, 1 @@ -52514,6 +52534,7 @@ executiveprodry.com, 1 executiveseatsers.ga, 1 executivoshotel.com.br, 1 +executormarin.ro, 1 exedo.nl, 1 exegese.ch, 0 exegol.co.uk, 1 @@ -52589,7 +52610,6 @@ exoticaz.to, 1 exotictravel.tk, 1 exousiakaidunamis.pw, 1 -exousiamg.com, 1 exoweb.ca, 1 exp.gg, 1 expancio.com, 0 @@ -52650,16 +52670,19 @@ expert96.cf, 1 experta.bg, 1 expertairductcleaninghouston.com, 1 +expertbrand.pl, 1 expertclub.tk, 1 expertcomics.ca, 1 +expertdentalgrp.com, 1 experteasy.com.au, 1 expertembeleza.com, 1 expertembeleza.com.br, 1 expertestate.org, 1 +expertgreen.pl, 1 experthiring.net, 1 experthive.co.za, 1 expertisevision.fr, 1 -expertittelco.com.au, 1 +expertittelco.com.au, 0 expertmarketer.ro, 1 expertmarktrg.com, 1 expertofficefitouts.com.au, 1 @@ -52670,6 +52693,7 @@ experts-excel.com, 1 experts-united.tk, 1 experts.com, 1 +expertsoftware.pl, 1 expertvagabond.com, 0 expertviolinteacher.com, 1 expertyusa.com, 0 @@ -52680,11 +52704,11 @@ expis.tk, 1 explainly.com, 1 explane.org, 1 -expleo.com, 1 explicamente.pt, 1 explode.tk, 1 explodie.org, 1 explohub.com, 1 +exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 exploited.cz, 1 @@ -52761,7 +52785,6 @@ expresfm.eu, 1 expresjet.cz, 1 expresradio.cz, 1 -express-delivery.co.il, 1 express-fm.com, 1 express-fm.cz, 1 express-fm.eu, 1 @@ -52783,6 +52806,7 @@ expresshsp.com, 1 expressinfo.cz, 1 expressinfo.sk, 1 +expressinsurance.com.au, 1 expressional.social, 1 expressionfunerals.co.nz, 1 expressivee.com, 1 @@ -52801,6 +52825,7 @@ expungement.law, 1 expxkcd.com, 1 exquisique.tk, 1 +exquisitebeadsaccessories.com, 1 exquisito.tk, 1 exs.lv, 1 exseedhealth.com, 1 @@ -52840,7 +52865,6 @@ externalapps.com, 1 externalfb.com, 1 externer-datenschutzbeauftragter-bochum.de, 0 -externeverslaggeving.nl, 1 externevoorzitter.nl, 1 extinctionrebellion.de, 1 extirosli.ga, 1 @@ -52895,7 +52919,6 @@ exudestudios.tk, 1 exum.tk, 1 exusi.ai, 1 -exvega.com, 1 exvisits.tk, 1 exwaiti.com, 1 exxoncannabis.com, 1 @@ -52967,7 +52990,6 @@ ezinezone.tk, 1 ezinternet.com.au, 1 ezitech.com, 1 -ezkrt.com, 1 ezloans4realestate.com, 1 ezlogi.jp, 1 ezlogzblog.com, 1 @@ -53089,8 +53111,8 @@ faac-sloupy.cz, 0 faac-zavory.cz, 0 faaog.com, 1 -faaq.ru, 1 faavem.org, 1 +faazadvocatenkantoor.nl, 1 faazmusic.com, 1 fabao.in, 1 fabarm.fr, 1 @@ -53112,9 +53134,9 @@ fabian-kluge.de, 1 fabian-zoske.de, 1 fabian.gq, 1 -fabianackle.ch, 1 fabianbeiner.com, 1 fabianbeiner.de, 1 +fabianbertona.com, 1 fabianegli.ch, 1 fabianfranke.de, 1 fabianni.tk, 1 @@ -53122,6 +53144,7 @@ fabien-hebuterne.fr, 0 fabienbaker.com, 1 fabienne-roux.org, 1 +fabientraisnel.com, 1 fabil.id, 1 fabilnatural.co.id, 1 fabilpages.com, 1 @@ -53144,7 +53167,6 @@ fabiopaiva.pt, 1 fabiosantos.tech, 1 fablabchemnitz.de, 0 -fabledsolutions.com, 1 fableforge.nl, 1 fableheartmedia.com, 1 fabpilot.com, 1 @@ -53193,7 +53215,6 @@ facanabota.com, 1 facanabota.com.br, 1 facarospauls.com, 1 -facchinaggio.it, 1 facchinaggio.milano.it, 1 facchinaggio.roma.it, 1 facchinetti.cloud, 1 @@ -53300,7 +53321,6 @@ factys.do, 1 factys.es, 1 facucosta.com.ar, 1 -facuint.org, 1 facultyforthefuture.net, 1 fadaebalears.org, 1 fadaex.org, 1 @@ -53426,6 +53446,7 @@ fairyballet.ga, 1 fairyclinic.com.tw, 1 fairydust.space, 1 +fairystar.com.tw, 1 fairyth.tk, 1 faisia.tk, 1 faith-for-life.com, 1 @@ -53480,7 +53501,6 @@ faktotum.tech, 1 fakturi.com, 1 fakturoid.cz, 1 -faktury.co, 1 fal.moe, 1 falaeapp.org, 1 falastin.tk, 1 @@ -53787,6 +53807,7 @@ farfor.tk, 1 farhadexchange.com, 1 farhandanish.tk, 1 +farhandigital.id, 1 farian.tk, 1 faribanx-porn.com, 1 faribanx-xxx.com, 1 @@ -53839,7 +53860,7 @@ farmvilleva.gov, 1 faro-car-hire.co.uk, 1 faro.com, 1 -farodegracia.com, 1 +farodegracia.com, 0 farodistribuidora.com.br, 1 faroes.net, 0 faroes.org, 1 @@ -54021,12 +54042,10 @@ fastestknowntime.com, 1 fastfast.click, 1 fastfix.nl, 1 -fastfloorscreed.ie, 1 fastfoodsetup.com, 1 fastforwardsociety.nl, 1 fastforwardthemes.com, 1 fastfox.tk, 1 -fastfrom.net, 1 fastgamingro.tk, 1 fastgit.cc, 1 fastighetsekonomi.com, 0 @@ -54114,6 +54133,7 @@ faus-moliner.com, 1 fautchen.eu, 1 fauteuil-bebe.fr, 1 +fauv.art, 1 fauveal.xyz, 1 fauvettes.be, 1 fauwater.com, 1 @@ -54127,7 +54147,6 @@ favirei.com, 1 favor-group.ru, 1 favorai.com, 1 -favorislotgiris.com, 1 favorit-stroy-snab.ru, 1 favorite.org.ua, 1 favoritenewspaperers.ga, 1 @@ -54191,7 +54210,6 @@ fbijobs.gov, 1 fbilab.gov, 1 fbk.moe, 1 -fbmedia-ckl.com, 1 fbnquest.com, 1 fbo.gov, 1 fbo.network, 1 @@ -54260,7 +54278,6 @@ fdicig.gov, 1 fdicoig.gov, 1 fdimmo24.com, 1 -fdis.net.cn, 1 fdj.fr, 1 fdkm.eu, 1 fdlibre.eu, 1 @@ -54298,7 +54315,6 @@ featherfan.io, 1 feathermc.com, 1 feathersbtq.com, 0 -featherstonett.com, 1 featherwallet.org, 1 feature-branch.nl, 1 featured.tk, 1 @@ -54307,7 +54323,6 @@ febeditora.com.br, 1 febooti.com, 1 februarystars.nl, 1 -fecskefeszekotthonom.hu, 1 fecyt.es, 1 fed-shashek.spb.ru, 1 fed.monster, 1 @@ -54504,7 +54519,6 @@ feliratok.eu, 1 felis.com.mx, 1 feliscatus.tk, 1 -feliwyn.fr, 1 felix-amez.tk, 1 felix-hirner.de, 1 felixbarta.de, 1 @@ -54594,6 +54608,7 @@ fengying.co, 1 fenhl.net, 1 fenichelar.com, 1 +feniksforge.com, 1 fenitriatnica.tk, 1 fenix-site.tk, 1 fenix-zone.tk, 1 @@ -54666,7 +54681,6 @@ fermani.com.ar, 1 fermastore.cf, 1 fermastore.tk, 1 -fermateh.com.ua, 1 fermemarineau.com, 1 fermentcerealesbio.fr, 1 fermenteana.com, 1 @@ -54763,6 +54777,7 @@ festivaltower.au, 1 festivaltower.com.au, 1 festmaniastore.com.br, 1 +festnav.com, 1 festo.net, 1 festo.online, 1 festrentcar.pl, 1 @@ -54808,7 +54823,6 @@ feuerwerksmanufaktur.de, 1 feuerwolke.spdns.de, 1 feurich.tk, 1 -fever.ch, 1 fevo.us, 1 fevolden.com, 1 fewo-groden.de, 1 @@ -54851,6 +54865,7 @@ ffbsee.net, 0 ffc-gerlingen.de, 1 ffd.or.id, 1 +ffdfrontroyal.com, 1 ffestiniogtravel.com, 1 fff-du.de, 1 fff-musique.fr, 1 @@ -54903,6 +54918,7 @@ fharbe.com, 1 fharbe.de, 1 fharbe.net, 1 +fhasia-chn.com, 1 fhasiacorp.com, 1 fhasiacorporate.com, 1 fhasiagroup.com, 1 @@ -54932,6 +54948,7 @@ fhjituancn.com, 1 fhjituanzhs.com, 1 fhjt-apac.com, 1 +fhjt-chn.com, 1 fhjt-zh.com, 1 fhjtapac.com, 1 fhjtchn.com, 1 @@ -54971,13 +54988,13 @@ fibretv.tv, 1 fibroarrendacaseton.mx, 0 fibromuebles.com, 1 +fibromyalgir.com, 1 fibu.email, 1 fibune.com, 1 fic.is, 1 fichajes.com, 1 ficharjmd.es, 1 fichier-pdf.fr, 0 -ficil.lv, 1 fickfreundinnen.net, 1 fickweiler.nl, 1 ficlab.com, 1 @@ -55018,6 +55035,7 @@ fieldeffect.com, 1 fieldgroupny.com, 1 fieldsgynroboticsurgery.com, 1 +fieldsusa.com, 1 fieldworkbrewing.com, 1 fieldworks.ne.jp, 1 fiemmeimpianti.it, 1 @@ -55048,7 +55066,7 @@ fifehg.org.uk, 1 fifemedicalgroup.co.uk, 1 fiff.de, 0 -fifpro.org, 1 +fifpro.org, 0 fifr.nl, 1 fifthgear.net, 1 fifthwall.com, 0 @@ -55063,6 +55081,7 @@ figaroparrucchiere.it, 1 figbytes.biz, 1 figbytes.com, 1 +figgy.mk, 1 figherie.it, 1 fighribali.tk, 1 fightape.cf, 1 @@ -55082,7 +55101,6 @@ figma.com, 1 figma.site, 1 figmalover.com, 1 -figshare.com, 1 figswoodfiredbistro.com, 1 figuras.tk, 1 figure.com, 1 @@ -55117,12 +55135,10 @@ filebin.net, 1 filebox.one, 1 filecopa.com, 1 -filedesc.com, 1 filedir.com, 0 filedoom.ml, 1 filehash.de, 1 filehippo.com, 1 -filehorsefile.com, 1 fileio.io, 1 filejo.com, 1 filek.ga, 1 @@ -55212,7 +55228,6 @@ filmsearch.tk, 1 filmserver.de, 1 filmsidan.tk, 1 -filmsleague.com, 1 filmtheaternieuwegein.tk, 1 filmwallpapers.ml, 1 filmweltverleih.de, 1 @@ -55235,6 +55250,7 @@ filtr.me, 0 filtrmyfeed.com, 1 filwebasia.com, 1 +fimallc.com, 1 fimc-biodiversityportal.org, 1 fimfiction.net, 1 fimmcyte.com, 1 @@ -55303,6 +55319,7 @@ finanzen-az.com, 1 finanzen-weblog.de, 1 finanzfluss.de, 1 +finanzia.fi, 1 finanzierung-sofortzusage.de, 1 finanztime.com, 1 finanzwende-recherche.de, 1 @@ -55332,6 +55349,7 @@ findbalancedliving.com, 1 findbestfirm.com, 1 findblockchaingames.com, 1 +findbugs.net, 1 findby.co.kr, 1 findcanary.com, 1 findcasinos.net, 1 @@ -55339,9 +55357,10 @@ findcep.com, 0 finddecisionsest.ga, 1 findedeinencoach.net, 1 -finder.bike, 1 +finderrors.net, 1 findete.tk, 1 findeth.io, 1 +findfaults.net, 1 findheim.at, 0 findinggenius.com, 1 findingimagesers.ga, 1 @@ -55542,7 +55561,6 @@ firemail.de, 1 firemaker.tk, 1 firenews.cf, 1 -firenneon.org, 1 firenzetoday.it, 1 fireoakstrategies.com, 1 fireplex.co.uk, 1 @@ -55552,6 +55570,7 @@ fireradio.tk, 1 firerain.me, 1 fireservicerota.co.uk, 1 +fireshellsecurity.team, 1 firesmoke.ca, 1 firesofheaven.org, 1 firesprite.com, 0 @@ -55638,7 +55657,6 @@ firstcontact.cf, 1 firstdry.com.br, 1 firstechpayments.com, 0 -firstenergyservice.com, 1 firstever.eu, 1 firstfederalbath.com, 1 firstfinanceit.com, 1 @@ -55647,7 +55665,6 @@ firstgulf.com, 1 firsthomebuyersaustralia.com.au, 1 firstimpressionsecuritydoors.com, 1 -firstinvestorsusa.com, 1 firstkeyhomes.com, 1 firstky.com, 1 firstlab.com, 1 @@ -55724,7 +55741,6 @@ fishing-battery.com, 1 fishingworld.tk, 1 fishingzone.bg, 1 -fishlanestudios.com, 1 fishman.idv.tw, 1 fishoftheday.tv, 1 fishseller.shop, 1 @@ -55746,6 +55762,7 @@ fisiotohome.com, 1 fiskalloy.com, 1 fiskaly.com, 1 +fiskarsinlaituri.fi, 1 fisophi.com, 1 fispan.com, 1 fistingtogether.com, 1 @@ -55850,7 +55867,6 @@ fix.mk, 1 fix8mt.com, 1 fixabzar.com, 1 -fixator10.ru, 1 fixcyprus.cy, 1 fixedfeeplacements.co.uk, 1 fixedgear.tk, 1 @@ -55951,7 +55967,6 @@ flaeskeklubben.dk, 1 flaeskeklubben.eu, 1 flagcdn.com, 1 -flagfox.net, 1 flaggorvarlden.se, 1 flaggrimsby.co.uk, 1 flagi-panstw.pl, 1 @@ -55984,7 +55999,7 @@ flam.studio, 1 flaman-h7a.fr, 1 flamanville.fr, 1 -flameflyff.com, 1 +flameflyff.com, 0 flamehaze.tk, 1 flamellugano.com, 1 flamencoexplained.com, 0 @@ -56010,7 +56025,6 @@ flanadot.com, 1 flanagan.tk, 1 flanderslaw.com, 1 -flandersmake.be, 1 flanga.io, 0 flanigan.tk, 1 flannetlux.com, 1 @@ -56100,7 +56114,6 @@ flearfarmcottages.com, 1 fleche-ardennaise.be, 1 flect.net, 1 -fleeb.xyz, 1 fleep.io, 1 fleeps.co, 1 fleesty.dynv6.net, 1 @@ -56122,6 +56135,7 @@ fleetlinkatlascopco.com, 1 fleetofhope.tk, 1 fleetone.com.au, 1 +fleetpal.io, 1 fleetserviceoftulsa.com, 1 fleetssl.com, 1 fleettools.tk, 1 @@ -56196,6 +56210,7 @@ flextrades.com, 1 flextribly.xyz, 1 flextudo.com, 1 +flextypes.com, 1 flexundfix.de, 1 flexve.com, 1 flexworkhero.de, 1 @@ -56214,6 +56229,7 @@ flicks2click.com, 1 flie.co.jp, 1 flieger-funk-runde.de, 1 +fliesen-raffler.de, 1 fliesen-waldschmidt.de, 1 fliesenbock.com, 1 fliessendes.mx, 1 @@ -56285,6 +56301,7 @@ flixpatrol.com, 1 flixports.com, 1 flmedicaidmanagedcare.com, 1 +flo-bois-services.fr, 1 floart.tk, 1 floatapp.com, 0 floatationlocations.com, 1 @@ -56343,6 +56360,7 @@ floralin.se, 1 floralworkshopsers.ga, 1 florasite.tk, 1 +florattapaisagismo.com.br, 1 floravan.com, 1 floravino.de, 1 floreg.com, 1 @@ -56357,7 +56375,6 @@ florenciasabio.com, 1 florent-tatard.fr, 1 florentinraud.net, 1 -floreriamaryel.com, 1 floresastrid.tk, 1 floreseartes.com.br, 1 floreseflores.pt, 1 @@ -56523,7 +56540,6 @@ flugplatz-edvc.de, 1 flugplatzmanager.de, 1 flugrueckerstattung.de, 1 -flugsimulatorfrankfurt.com, 1 fluidattacks.com, 0 fluidbb.co.uk, 1 fluids.ac.uk, 1 @@ -56585,6 +56601,7 @@ flygforsening.se, 1 flygon.pink, 1 flygplanering.se, 1 +flyhd.fr, 1 flyhealthy.gov, 1 flying-angels.tk, 1 flyingangels.cf, 1 @@ -56665,7 +56682,6 @@ fmpilot2.com, 0 fmportal.biz, 1 fmpuertomadero.cf, 1 -fmsautomocion.es, 1 fmservis.sk, 1 fmsforestry.com, 1 fmsgroup.sk, 1 @@ -56796,7 +56812,6 @@ follow-the-leader.tk, 1 follower98.ir, 1 followerfast.com, 1 -followlearning.com, 1 followme.com, 1 followmystaff.com, 1 followpharma.com, 1 @@ -57022,7 +57037,6 @@ fooladi.tk, 1 foolip.org, 1 foolproofcomics.tk, 1 -foomtbal.futbol, 1 foonly.fi, 1 foorack.com, 1 foosball.pt, 1 @@ -57065,7 +57079,6 @@ for.gd, 1 forabrokenrobot.tk, 1 forajeputuri-denisipari.ro, 1 -foranewworld.org, 1 foranimalsforearth.com, 1 forat.tk, 1 foray-jero.me, 1 @@ -57083,13 +57096,11 @@ force.com, 1 force4racing.co.uk, 1 force4racing.com, 1 -forcebasements.com, 1 forcecompanies.com, 1 forcelink.eu, 1 forcelink.nl, 1 forcelinkamerica.com, 1 forcelinkamerica.nl, 1 -forcemasonry.net, 1 forcemasonryinc.com, 1 forcemat.fr, 0 forcenet.gov.au, 1 @@ -57163,10 +57174,8 @@ forex-trading-tutorial.tk, 1 forex-up.cf, 1 forex.ee, 1 -forex92.com, 1 forexbrokerinspect.com, 1 forexcity.cf, 1 -forexcomreview.co, 1 forexee.com, 1 forexexchange.tk, 1 forexfactbook.com, 1 @@ -57268,6 +57277,7 @@ formstrap.com, 1 formue.com, 1 formula.cf, 1 +formulacigar.com, 1 formulacionquimica.com, 1 formulario-rutas.lat, 1 formulastudent.de, 1 @@ -57416,7 +57426,6 @@ forumdabeleza.com.br, 1 forumfeeers.ga, 1 forumhsbm.tk, 1 -forumirc.net, 1 forumistudentore.tk, 1 forumix.tk, 1 forummobile.com.br, 1 @@ -57456,6 +57465,7 @@ foselectro.ru, 1 foshanshequ.com, 0 foss-rec.net, 1 +fossa.com, 1 fossagarrafoni.tk, 1 fossbots.org, 1 fossboxen.com, 1 @@ -57570,7 +57580,6 @@ foundationrepairchicagoil.com, 1 foundationsasha.org, 1 foundationspecialisteast.com, 1 -foundationspecialistmi.com, 1 foundchurch.co.uk, 1 founderinvestors.tk, 1 founderio.net, 1 @@ -57603,7 +57612,7 @@ fourpeaks.com, 1 fourscore.ga, 1 fourseasonsalbany.com, 1 -fourseasonsfairways.com, 1 +fourseasonsfairways.com, 0 fourseasonssunroomsyosset.com, 1 fourstrategy.de, 1 fourwaysplumber24-7.co.za, 1 @@ -57818,7 +57827,6 @@ francabellarsi.tk, 1 france-cartouches.fr, 1 france-chien.fr, 1 -france-metal-awards.com, 0 france-news.cf, 1 france-orchidees.org, 1 france-serres.com, 1 @@ -57838,6 +57846,7 @@ francescorenna.tk, 1 francescosiciliano.tk, 1 francesfluente.cf, 1 +franceshr.com, 1 franceskivillas.tk, 1 franceterritoires.com, 1 francetraceur.fr, 1 @@ -57857,7 +57866,7 @@ franciscadelasllagasvirtual.com, 1 franciscasacarneiro.pt, 1 franciscoeduardocruz.tk, 1 -franciscolapa.eu, 1 +franciscolapa.eu, 0 franciscoperezyoma.com, 0 francisfazzini.com, 1 francishouserecovery.org, 1 @@ -58190,6 +58199,7 @@ freedomhouse.org, 1 freedomisslavery.tk, 1 freedomkiaparts.com, 1 +freedomlab.io, 1 freedomonline.bg, 1 freedomonthenet.org, 1 freedomravenswood.co.nz, 1 @@ -58228,6 +58238,7 @@ freelance.barcelona, 1 freelance.boutique, 1 freelance.nl, 1 +freelanceerp.com, 1 freelanceessaywriters.com, 1 freelancehunt.com, 1 freelancemw.com, 0 @@ -58320,7 +58331,6 @@ freesourcestl.org, 1 freespace.info, 1 freespanlift.com, 1 -freespeech.org, 1 freesports.ml, 1 freestart.hu, 1 freesteam.net, 1 @@ -58383,7 +58393,6 @@ freitasm.com, 1 freitasul.com.br, 1 freitasul.io, 1 -freiwurst.net, 1 freizeitpark.tk, 1 freizeitplaza.de, 1 freja.com, 1 @@ -58452,7 +58461,6 @@ freshfishdelivery.com, 1 freshhosting.tk, 1 freshinsport.fr, 1 -freshjoomlatemplates.com, 1 freshman.tech, 1 freshmans-pizza.de, 1 freshmilk.com.sg, 1 @@ -58571,8 +58579,8 @@ frikandelmoord.nl, 1 friker.tk, 1 frikilinks.tk, 1 -frikipandi.com, 1 frikipedia.tk, 1 +frikis.sytes.net, 1 frikiteca.tk, 1 frikizone.tk, 1 frikotv.tk, 1 @@ -58607,7 +58615,6 @@ fritzbox-forum.tk, 1 friv-2018.ga, 1 frizim.com, 1 -friziraj.me, 1 frizo.com, 1 frlcnews.com, 1 frlt.one, 1 @@ -58746,7 +58753,6 @@ fruit.ga, 1 fruitbouquets.com, 1 fruitdiva.com, 1 -fruitfits.com, 1 fruitfulenglish.com, 1 fruition.co.jp, 1 fruitjuicetab.ch, 1 @@ -58756,7 +58762,6 @@ fruitmoose.com, 1 fruitscale.com, 1 fruitsexpressdelivery.com.sg, 1 -fruitsfromchile.com, 1 fruittree.com.my, 1 fruittree.com.sg, 1 fruitware.ae, 1 @@ -58880,6 +58885,7 @@ ftrac.com.br, 1 ftrfnd.me, 1 ftri.co.jp, 1 +ftstartup.co.uk, 1 ftth.eu.org, 0 ftv.re, 1 ftworthhousekeeper.com, 1 @@ -59047,8 +59053,6 @@ fullertonhealth.com, 1 fullertonne.gov, 1 fullfilez.com, 1 -fullhost.com, 1 -fullhotfilm.co, 1 fullhouseresorts.com, 1 fullhub.ru, 1 fullinsiderers.ga, 1 @@ -59117,7 +59121,6 @@ fundamentalrightsforum.eu, 1 fundamentals.lu, 1 fundamentt.com, 1 -fundatiacomunitaragalati.ro, 1 fundayltd.com, 1 fundedschools.ml, 1 fundelva.com, 1 @@ -59262,6 +59265,7 @@ funreaktor.com, 1 funretro.io, 1 funshirts.tk, 1 +funshop.id, 1 funsite.tk, 1 funsmsmailing.tk, 1 funsoup.tk, 1 @@ -59292,7 +59296,6 @@ furca.ca, 1 furcdn.net, 1 furcity.me, 1 -fureais.com, 1 furgetmeknot.co.za, 1 furgetmeknot.org, 1 furgetmeknot.org.za, 1 @@ -59319,7 +59322,6 @@ furlan.tk, 1 furlog.it, 1 furnace-zero.tk, 1 -furness-whisper.uk, 1 furnet.eu, 1 furnet.net, 1 furnfurs.com, 1 @@ -59419,7 +59421,6 @@ fussfetisch.tk, 1 fussy.ee, 1 fussycats.com, 1 -fussycats.uk, 1 fusu.re, 1 fuszara.eu, 1 fut21gen.com, 1 @@ -59455,9 +59456,9 @@ futunk.net, 1 futunk.nl, 1 futuo.jp, 1 -futurains.com, 1 futurama-il.tk, 1 future-dance.tk, 1 +future-look.de, 1 future-telecom.com, 1 futureappin.com.au, 1 futureaudiographics.com, 0 @@ -59480,6 +59481,7 @@ futureofyoucdc.sg, 1 futureplan.de, 1 futureplanet.tk, 1 +futureproperty.in, 1 futures.io, 1 futuresafe.com, 0 futuresinmarketing.co.uk, 1 @@ -59507,7 +59509,6 @@ fuyeor.top, 1 fuyer.cn, 1 fuyu.moe, 1 -fuzenet.net, 1 fuzhi.com, 1 fuzigames.com, 1 fuzion.co.th, 1 @@ -59553,7 +59554,6 @@ fx-w.io, 1 fx.kg, 1 fx.to, 1 -fxcg-education.com, 1 fxci.com, 1 fxcm-arabic.com, 1 fxcm-chn.com, 1 @@ -59561,6 +59561,7 @@ fxcm-markets.com, 1 fxcm-online.com, 1 fxcm-zhs.com, 1 +fxcm.co.jp, 1 fxcm.com, 1 fxcm.com.tw, 1 fxcm.com.vn, 1 @@ -59593,7 +59594,6 @@ fxeuropa.com, 1 fxexplained.co.uk, 1 fxislamic.com, 1 -fxmds.com, 1 fxnotch.com, 1 fxopen.co.uk, 1 fxopen.com, 1 @@ -59622,6 +59622,7 @@ fyndiq.se, 1 fyndloggan.se, 1 fyndus.de, 1 +fyntun.eu, 1 fyol.pw, 1 fyou.co, 1 fyp-aiman.com, 1 @@ -59637,6 +59638,7 @@ fyss.ga, 1 fysuite.com, 1 fytorio-pasxalis.gr, 1 +fyvel.io, 1 fyziotonka.sk, 1 fzoske.de, 1 fzx750.ru, 1 @@ -59666,7 +59668,6 @@ g0l4.top, 1 g0man.com, 1 g0nz0.me.uk, 1 -g10e.ch, 1 g1313g.com, 1 g15ubezpieczenia.pl, 1 g2-inc.com, 1 @@ -59689,7 +59690,6 @@ g51365.com, 1 g5197.co, 1 g5custommetalart.com, 1 -g5yss.uk, 1 g6666g.tk, 1 g6729.co, 1 g6957.co, 1 @@ -59706,7 +59706,7 @@ ga.fr, 1 ga4wp.com, 1 gaaog.com, 1 -gaasuper6.com, 1 +gaapo.com.br, 1 gabalakarvansarayhotel.az, 1 gabaldon.eu, 1 gabaldon.nl, 1 @@ -59735,7 +59735,6 @@ gablesportsga.com, 0 gablesvets.co.uk, 1 gably.net, 1 -gabnotes.org, 1 gabodesign.tk, 1 gaborg.hu, 1 gabraham.tk, 1 @@ -59820,6 +59819,7 @@ gafachi.com, 1 gafan.cf, 1 gaff-rig.co.uk, 1 +gaffel.co, 1 gafisa.com.br, 1 gaflooring.com, 1 gag101.com, 1 @@ -59949,6 +59949,7 @@ galio.lt, 1 galiuzvejoti.org, 1 galive.ga, 1 +galix.com, 1 galizae-sports.tk, 1 gallagher.com, 1 gallagherperformance.com, 1 @@ -60083,6 +60084,7 @@ gameofbooks.de, 1 gameonespirit.tk, 1 gameoveronline.tk, 1 +gamepedi.com, 1 gameplaysforkids.com, 1 gameplus.win, 1 gamepokies.ml, 1 @@ -60124,6 +60126,7 @@ gamerstudiozinc.tk, 1 gamersuniverse.tk, 1 gamersweb.ga, 1 +gamertechau.com, 1 gamertelligence.com, 1 gamertrashers.ga, 1 gamerturk.tk, 1 @@ -60135,6 +60138,8 @@ games4theworld.org, 1 gamesandcasino.com, 1 gamesaviour.com, 1 +gamescatalogue.blog, 1 +gamesclix.com, 1 gamescore.tk, 1 gamesector.tk, 1 gameserver-admin.ga, 1 @@ -60157,7 +60162,7 @@ gamesputnik.ru, 1 gamestand.net, 1 gamester.tv, 1 -gamestic.be, 1 +gamestic.nl, 1 gamesunited.tk, 1 gameszone.tn, 1 gametainment.net, 1 @@ -60169,7 +60174,7 @@ gamewayz.online, 1 gamewinninggoal.com, 1 gameworldcdr.tk, 1 -gamezero.nl, 1 +gamezkiki.com, 1 gamezon.ga, 1 gamezon.tk, 1 gamezsmack.com, 1 @@ -60263,7 +60268,6 @@ gaojianli.tk, 1 gaojue.art, 1 gaon.network, 1 -gaoqirun.com, 1 gaos.org, 1 gaozih.com, 1 gap150.jp, 1 @@ -60297,7 +60301,6 @@ garbuszus.de, 1 garbuz.ga, 1 garcia-leplus.com, 1 -garciaconstruction.com, 1 garcialeplus.com, 1 garciam.gt, 1 garco.co, 0 @@ -60322,7 +60325,6 @@ gardensuperstore.com.au, 1 gardentotable.org, 1 gardinenzubehoer.tk, 1 -gardinia.ae, 1 gardinolsson.se, 1 gardnerbender.com, 1 garduri-electrice-animale.ro, 1 @@ -60413,7 +60415,6 @@ gas-boilers.tk, 1 gas-online.cz, 1 gas-proekt.tk, 1 -gas.tn, 1 gasb87leaseaccounting.com, 1 gasbarkenora.com, 1 gasdetect.com.br, 1 @@ -60485,6 +60486,7 @@ gatestoaesgaard.tk, 1 gatetoadventures.com, 1 gatewayfurniture.com, 1 +gatewaylink.co.jp, 1 gatewayplanning.org, 1 gatewaytire.com, 1 gatewaytrust.org.uk, 1 @@ -60730,6 +60732,7 @@ geba-online.de, 1 gebaeude-braun.de, 1 gebaeudebilanzierung.de, 1 +gebaeudeklima-schweiz.ch, 1 gebbs.com, 1 gebbscareer.com, 1 gebbsmyspace.com, 1 @@ -60762,7 +60765,6 @@ gediga.net, 1 gedlingcastlehire.co.uk, 1 gedlingtherapy.co.uk, 1 -geecloud.io, 0 geecrat.com, 1 geek-hub.de, 1 geek-rooms.tk, 1 @@ -60825,6 +60827,7 @@ geele.co.th, 1 geely.ci, 1 geemprestimos.com, 1 +geen.gp, 1 geenspam.net, 1 geerdsen.net, 1 geertdegraaf.nl, 1 @@ -60832,7 +60835,10 @@ geertswei.nl, 1 gees.ch, 1 geesthof.de, 1 +geetoo.com, 1 +geetooholding.com, 1 gefaessmedizin-rapperswil.ch, 1 +gefmo.pl, 1 gefolge.org, 1 gegeco.ch, 0 gegevensdelen.nl, 1 @@ -60938,10 +60944,12 @@ gemonite.com, 1 gemooi.com, 1 gemquery.com, 1 +gemsen.com, 1 gemstones.com, 1 gemwerx.com, 1 gen.cn.eu.org, 1 gen.net.eu.org, 1 +gen3marketing.com, 1 gen53.org, 1 genbars.jp, 1 genbrugge.tk, 1 @@ -61094,7 +61102,6 @@ geniustudio.net, 1 geniuswin.it, 1 geniuszone.biz, 1 -genizu.com, 1 genkisushi.com.hk, 1 genlack.com, 0 gennaroabete.duckdns.org, 1 @@ -61136,6 +61143,7 @@ genpathdiagnostics.com, 1 genroe.com, 1 gensenwedding.jp, 1 +genserve.ai, 1 genshiken-itb.org, 0 gensicke.de, 1 gensleiten.de, 1 @@ -61182,6 +61190,7 @@ gentrack.com, 0 gentryarkansaspd.gov, 1 gentrydeng.cn, 1 +genuinekeys.in, 1 genuinetech.pk, 1 genunlimited.ga, 1 genunlimited.tk, 1 @@ -61196,7 +61205,6 @@ geo-bohr.de, 1 geo-files.tk, 1 geo-industrie.fr, 1 -geo-jobe.com, 1 geo-portale.it, 1 geo-television.de, 1 geoapps.nl, 1 @@ -61210,6 +61218,7 @@ geocompass.at, 1 geoconvention.ga, 1 geodatasource.com, 0 +geodecoder.ai, 1 geodecoder.com, 1 geodesign.tk, 1 geodesist-msk.ru, 1 @@ -61221,9 +61230,9 @@ geoffmyers.com, 1 geoffreyrichard.com, 1 geoffsec.org, 1 +geofillconstruction.com, 1 geoflowerstudio.com, 1 geoforex.ro, 1 -geofox.eu, 1 geofox.org, 1 geogas.com.au, 1 geogr-helv.net, 1 @@ -61325,7 +61334,6 @@ georgioskontaxis.org, 1 georgiosnetworks.com, 1 georglauterbach.com, 1 -georglauterbach.de, 1 georgmayer.eu, 1 geosales.tk, 1 geosci-model-dev-discuss.net, 1 @@ -61345,6 +61353,7 @@ geothermalproducts.info, 1 geotrack.email, 1 geotracsolutions.com, 1 +geotrader.nl, 1 geotrellis.io, 1 geotrust.com.ru, 1 geotruth.net, 1 @@ -61352,6 +61361,7 @@ geowest.tk, 1 gepassociati.cloud, 1 gepgroup.gr, 1 +gepo69.net, 1 gepps.de, 0 geppy.im, 1 gera-haushaltsaufloesung.de, 1 @@ -61366,7 +61376,6 @@ gerardozamudio.mx, 1 gerardpropertygroup.com, 1 gerards-abenteuer.de, 1 -gerasadultomayor.com, 1 gerbang-singkolo.ga, 1 gerber-construction.com, 1 gerbil.tk, 1 @@ -61439,7 +61448,6 @@ geschenkzauber.de, 1 geschichtscheck.de, 1 geschichtswerkstatt.tk, 1 -geschmackspiloten.de, 0 geschwinder.net, 1 geseduc.cl, 1 gesentorno.tk, 1 @@ -61452,11 +61460,11 @@ gesolarinverter.com, 1 gespasa.az, 1 gessettirotti.it, 1 +gestaoboa.com.br, 1 gestaoclub.com.br, 1 gestcoelho.com, 1 gestion-optimum.com, 1 gestionaleamica.com, 1 -gestionalecero.it, 1 gestione-certificazioni.it, 1 gestionth.com, 1 gestorehotel.com, 1 @@ -61469,7 +61477,6 @@ get-a-wingman.com, 1 get-asterisk.ru, 1 get-baaam.com, 1 -get-express-vpn.com, 1 get-file.eu, 1 get-maurice.com, 1 get-my-report.com, 1 @@ -61495,6 +61502,7 @@ getback.ch, 1 getbalitour.com, 1 getbellhop.co, 1 +getbenepass.com, 1 getblogger.ru, 1 getboomerangwater.com, 1 getboost.social, 1 @@ -61523,6 +61531,7 @@ getcomposer.org, 1 getcontact.com, 1 getcookie.ml, 1 +getcooltricks.com, 1 getcryst.al, 1 getcyber.me, 1 getdash.io, 1 @@ -61541,7 +61550,6 @@ getevidenceers.ga, 1 getfastanswer.com, 1 getfedora.org, 1 -getfire.bot, 1 getfit.md, 1 getfitbee.com, 1 getfitwithkip.com, 1 @@ -61558,7 +61566,6 @@ getgeek.se, 1 getgiftable.com, 1 getgivi.com, 1 -getgreencarpetct.com, 1 gethere.gq, 1 gethotspotshield.com, 1 gethow.org, 1 @@ -61586,6 +61593,7 @@ getleanflorida.gov, 1 getliberty.org, 1 getlibrary.com, 1 +getlocalink.com, 1 getmarksvoice.com, 1 getmdl.io, 1 getme.cf, 1 @@ -61621,7 +61629,6 @@ getpro.plumbing, 1 getprohealth.com, 1 getpromo.cf, 1 -getpsolid.com, 1 getpublii.com, 1 getraenke-hoffmann.de, 1 getready2dance.tk, 1 @@ -61656,6 +61663,7 @@ gett-group.com, 1 getteamninja.com, 1 gettext.tk, 1 +gettheanchor.org, 1 getthefriendsyouwant.com, 0 getthejobicanhelp.com, 1 getthink.co.uk, 1 @@ -61721,7 +61729,6 @@ gexobiz.tk, 1 geyduschek.be, 0 geymbadi.com, 1 -geytabir.cf, 1 gezakekazeg.tk, 1 gezentianne.com, 1 gezginsolar.com, 1 @@ -61742,6 +61749,7 @@ gfestival.fo, 1 gfgmmarketing.com, 1 gfiber.com, 1 +gficr.com, 1 gfk-kunststoff-luebben.de, 1 gfleaks.com, 1 gfmp.com.pl, 1 @@ -61934,7 +61942,6 @@ gickelskerb.de, 1 gidapgs.cf, 1 gidc.gd, 1 -giddensus.com, 1 gidding.net, 1 giddyaunt.net, 1 giddyup.to, 1 @@ -62111,6 +62118,7 @@ giocolive.com, 1 gioiellerialucchese.it, 1 gioielleriamolena.com, 1 +gioielleriaregolini.it, 1 giomi.com.tr, 1 gion-ent.co.jp, 1 giopiu.it, 1 @@ -62208,6 +62216,7 @@ git.market, 0 git.nl.eu.org, 1 git.org.il, 0 +git.pink, 1 git.sb, 1 git.tt, 0 gita-vam.hu, 1 @@ -62383,6 +62392,7 @@ glasiko.tk, 1 glasp.ai, 1 glass-blaster.com, 1 +glass.fish, 1 glass.google.com, 1 glass.photo, 1 glassact.com, 0 @@ -62495,7 +62505,6 @@ glnpo.gov, 1 global-assistance.eu, 1 global-business-solutions.cf, 1 -global-carbonsolutions.com, 1 global-content.net, 1 global-electronic-music.tk, 1 global-factory.co.jp, 1 @@ -62563,7 +62572,6 @@ globalhomicideers.ga, 1 globalhorses.de, 1 globalhubb.ro, 1 -globalimmigrationvisa.com, 1 globalind.com.au, 1 globalink.tk, 1 globalinvestorgate.com, 1 @@ -62607,7 +62615,6 @@ globalsecuritydatabase.io, 1 globalsecuritydatabase.net, 1 globalsecuritydatabase.org, 1 -globalsens.com, 1 globalsensationsers.ga, 1 globalsensationsest.ga, 1 globalseo.ga, 1 @@ -62714,7 +62721,6 @@ glpreparation.com, 1 glreit.com, 1 glsauto.com, 1 -gltch.ai, 1 gltjp.com, 1 gluconote.net, 1 gluconote.org, 1 @@ -62733,11 +62739,13 @@ gluit.de, 1 glumac.com, 1 glumcasaepet.com.br, 1 +glutenfree.it, 1 glutenfreehomemaker.com, 1 glutenfreelife.co.nz, 1 glutenfreeonashoestring.com, 1 glutenfreevr.com, 1 gluto.tk, 1 +gluwee.com, 1 glxnet.com, 1 glxplatform.com, 1 glyam.nl, 1 @@ -62764,17 +62772,18 @@ gmanlabs.com, 1 gmao.com, 1 gmasil.de, 1 +gmatic.info, 1 gmavsg.org, 1 gmbh-kiekin.de, 1 gmc-mca.org, 1 gmc-roma.it, 1 gmc.uy, 1 -gmcbm.net, 1 gmcd.co, 1 gmcomo.com, 1 gmcourtreporters.com, 1 gmdsc.gov, 1 gmdu.net, 1 +gmgard.com, 1 gmgcyouth.org, 1 gmhdrivingschool.co.uk, 1 gmhostingservices.co.uk, 1 @@ -62836,7 +62845,6 @@ gnomon-transport.com.ng, 1 gnosco.net, 1 gnosis.bg, 1 -gnosislabs.net, 1 gnrinfo.tk, 1 gns.gov.pt, 1 gns3.com, 1 @@ -62906,6 +62914,7 @@ goathub.io, 0 goatlord.tk, 1 goatstore.ca, 1 +goaudits.com, 1 gobarrelroll.com, 1 gobebra.com, 1 gobeline.com, 1 @@ -62923,7 +62932,6 @@ gocar.ie, 1 gocardless.com, 1 gocareserv.com, 1 -gocho.com, 1 gociicii.com, 1 gocivilairpatrol.com, 1 gock.ceo, 1 @@ -62935,6 +62943,7 @@ goclearit.com, 1 goclinic.com.br, 1 goclix.ml, 1 +gocomet.com, 1 goconow.com, 1 gocornwallbus.co.uk, 1 gocpa.space, 1 @@ -62971,7 +62980,6 @@ godoza.tk, 1 godrealms.com, 0 godreamcast.com, 1 -godrejnoida.org, 1 godrive.ga, 1 godruoyi.com, 1 godsofhell.com, 1 @@ -63074,7 +63082,6 @@ gokon.se, 0 goksu.in, 1 goktoday.com, 1 -gokturkfindik.com, 1 gokyrgyzstan.com, 1 golan.ml, 1 golang.org, 1 @@ -63127,7 +63134,6 @@ goldenkeys.io, 1 goldenmunchbakeshop.com, 1 goldenoaksgolfclub.com, 1 -goldenpi.com, 1 goldenplate.com.sg, 1 goldenpreference.com, 1 goldenravengifts.com, 1 @@ -63150,6 +63156,7 @@ goldenyacca.org, 1 goldequipment.com.br, 1 goldex.tk, 1 +goldfieldslogistics.co.za, 1 goldfingermusic.tk, 1 goldfm1031.tk, 1 goldfmromania.ro, 1 @@ -63260,7 +63267,6 @@ gomorrabeach.tk, 1 gomovein.com, 1 gomtz.gq, 1 -gon.nl, 1 gon45.com, 1 gonalops.gq, 1 goncalofontoura.tk, 1 @@ -63285,7 +63291,6 @@ gonitro.com, 0 gonoodle.com, 1 gonortheast.co.uk, 1 -gontagro.com.ua, 1 gonulyoluturizm.com.tr, 1 gonumber.ga, 1 gonvarri.com, 1 @@ -63356,7 +63361,6 @@ goodtasteofhome.com, 1 goodtea.com, 1 goodth.ink, 1 -goodtimesrvsales.com, 1 goodtotell.nl, 1 goodtrader.tk, 1 goodtrip.kr, 1 @@ -63392,6 +63396,7 @@ gooil.ee, 1 goolnk.com, 1 goombi.fr, 1 +goon.university, 1 goondocks.io, 1 goonersworld.co.uk, 1 goontu.be, 1 @@ -63429,6 +63434,7 @@ gopronow.ga, 1 gopuntaisla.com, 1 gopwhip.gov, 1 +gopwnit.com, 1 goquiq.com, 1 goquiqstatus.com, 1 gorakhpurclassifieds.tk, 1 @@ -63539,7 +63545,6 @@ gosq.co, 1 gosq.com, 1 gossiptimes.tk, 1 -gossr.pw, 1 gost-energo.ru, 1 gostargazer.com, 1 gostargazing.co.uk, 1 @@ -63595,6 +63600,7 @@ gotonline.ml, 1 gotonline.tk, 1 gotorussia.tk, 1 +gototus.com, 1 gotovilekovi.tk, 1 gotovka.ga, 1 gotovka.tk, 1 @@ -63622,7 +63628,7 @@ gotzg.de, 1 gouda-rf.se, 1 goudenharynck.be, 1 -goudt.nl, 1 +goudt.nl, 0 gouforit.com, 1 goug0.com, 1 gougeaway.tk, 1 @@ -63639,6 +63645,7 @@ goutsmits-tegelwerken.nl, 1 gouwdata.nl, 0 gov-online.go.jp, 1 +gov.cz, 1 gov.exposed, 1 gov.ky, 1 gov.md, 1 @@ -63646,7 +63653,9 @@ gov.uk, 0 govalidation.net, 1 govape.tk, 1 +govars.com, 1 govecountyks.gov, 1 +governikus.de, 1 governmentjob.gq, 1 governmentjobs.gov, 1 governmentphoneservice.com, 1 @@ -63699,6 +63708,7 @@ gpcp.org, 1 gpcs.ml, 1 gpcsolutions.fr, 0 +gpdifreshlife.church, 1 gpdp.it, 0 gpfclan.de, 1 gpforum.tk, 1 @@ -63721,6 +63731,7 @@ gpodev.gov, 1 gpolanco.com, 1 gpony.fr, 1 +gppdash.co.za, 1 gpremium.cl, 1 gpridezone.com, 1 gps-coordinaten.nl, 1 @@ -63739,6 +63750,7 @@ gpstrackersaustralia.com, 1 gpsvideocanada.com, 1 gpswebsoft.ml, 1 +gpt4.me, 1 gpthub.gg, 1 gptunnel.kz, 1 gptunnel.ru, 1 @@ -63862,6 +63874,7 @@ grama.pro, 1 gramati.com.br, 1 grameenbazar.pl, 1 +grameenponno.com, 1 gramercyarts.com, 1 gramilano.com, 1 gramlee.com, 1 @@ -63886,7 +63899,6 @@ grand-design.tk, 1 grand-hotel-de-france.com, 1 grand-house.gq, 1 -grand-indonesia.com, 1 grand-knighki.gq, 1 grand-roissy-tourisme.com, 1 grand-sity.ru, 1 @@ -63949,7 +63961,6 @@ granitbank.ro, 1 granitebaydermatologyandlaser.com, 1 graniteclub.com, 1 -graniteedvance.org, 1 graniteescrow.com, 1 granitehillcapital.com, 1 graniteind.com, 1 @@ -63990,7 +64001,6 @@ grape33.com, 1 grapee.jp, 1 grapeintentions.com, 1 -grapesthewineco.com, 1 grapevine.is, 1 graph.org, 1 graphe.gq, 1 @@ -64022,6 +64032,7 @@ grapholio.net, 1 graphpaper.studio, 1 graphviewer.tk, 1 +graphy.com, 1 grapplinginsider.com, 1 grasboom35plus.nl, 1 grasdealer.com, 1 @@ -64156,8 +64167,8 @@ greatlakelocksmiths.co.nz, 1 greatlakesdatastream.ca, 1 greatlakesden.net, 1 -greatlakesendurance.com, 1 greatlakesnow.org, 1 +greatlakesstone.com, 1 greatlakestechdiving.com, 1 greatlearning.in, 1 greatlifeinsurancegroup.com, 1 @@ -64219,14 +64230,13 @@ green-snake.com, 1 green-wlan.de, 1 green-wood.com, 1 -green.com.do, 1 green1052.com, 1 greenangels.com.ua, 1 greenartistsswiss.ch, 0 greenassembly.fr, 1 greenbat57.fr, 1 greenbaytechsupport.com, 1 -greenbeauty.in, 1 +greenbrickgroup.com, 1 greenburghny.gov, 1 greencapital.gent, 1 greencbd.com, 1 @@ -64240,6 +64250,7 @@ greencross.cf, 1 greencybersec.com, 1 greencyprus.com, 1 +greendam.icu, 1 greendaylivecrew.tk, 1 greendesserters.ga, 1 greendessertest.ga, 1 @@ -64259,6 +64270,7 @@ greenetwpclintonpa.gov, 1 greenews.ga, 1 greenfever.pl, 1 +greenfielddynamics.com, 1 greenfieldlaxwi.gov, 1 greenfieldwi.gov, 1 greenforum.tk, 1 @@ -64282,13 +64294,11 @@ greenkitchen.tk, 1 greenlakecountywi.gov, 1 greenland-estate.tk, 1 -greenland-organic.com, 1 greenlifetour.tk, 1 -greenlighttreeservices.com, 1 +greenline-bg.com, 1 greenline.financial, 1 greenline.hr, 1 greenliquidsystem.com, 1 -greenliv.pl, 1 greenmaquinas.com.br, 1 greenmesg.org, 1 greenmind.tk, 1 @@ -64313,13 +64323,11 @@ greensad36.ru, 1 greensboro.com, 1 greensborocc.org, 1 -greensborosecuritycameras.com, 1 greensborovt.gov, 1 greenscreenportal.com, 1 greenseo.org, 1 greensidevetpractice.co.uk, 1 greensilllatam.com, 1 -greensmartplanet.com.my, 1 greensmartplanet.my, 1 greensofthestoneage.com, 1 greenspace.expert, 1 @@ -64385,6 +64393,7 @@ gregory-kramer.fr, 1 gregory-thibault.com, 1 gregorydorrifourt.fr, 1 +gregoryfca.com, 1 gregoryhammond.ca, 1 gregorykelleher.com, 1 gregorylefever.com, 1 @@ -64394,7 +64403,6 @@ gregpierson.com, 0 gregproffit.com, 1 gregtutors.com, 1 -gregvogt.net, 1 greizer.tk, 1 grekiskagudar.tk, 1 grekos.com.pl, 1 @@ -64459,7 +64467,6 @@ grhotels.gr, 1 griassdi-reseller.de, 1 gricargo.com, 1 -grickle.org, 1 grid.is, 1 gridale.org, 1 gridcatalyst.org, 1 @@ -64500,17 +64507,18 @@ grigorev.tk, 1 grijalba.tk, 1 grijpskerk500.tk, 1 +grilehub.ro, 1 grillboxtaxi.de, 1 grillen-darf-nicht-gesund-sein.de, 1 grillfocused.com, 1 grillhuette-horchheim.info, 1 grillidellostretto.tk, 1 grilllness.com, 1 +grillteller42.de, 1 grimetoshinecleaners.co.uk, 1 grimm.cz, 1 grimmonolith.tk, 1 grimorium.tk, 1 -grimsby.ac.uk, 1 grimsbydns.com, 1 grimsbymoneyman.com, 1 grimsbysoilandmulch.ca, 1 @@ -64543,11 +64551,11 @@ grnbank.com, 1 groaccess.com, 1 groben-itsolutions.de, 1 -grocerybudgetph.com, 1 grocerytv.com, 1 grockradio.ga, 1 grocock.me.uk, 1 grocy.info, 1 +groda.art, 1 groenaquasolutions.info, 1 groenaquasolutions.nl, 1 groenemoskeeen.nl, 1 @@ -64567,6 +64575,7 @@ grolimur.ch, 0 grolleau.fr, 1 gromasikov.tk, 1 +gromman.com, 1 gromovphotography.tk, 1 grondius.com, 1 grondwerkencooreman.be, 1 @@ -64578,7 +64587,7 @@ grooove.pl, 1 groothagenbeek.nl, 1 grootinadvies.nl, 1 -groots.com, 1 +groottuighuis.nl, 1 groove3.com, 1 grooveguard.tk, 1 groover.com.br, 1 @@ -64613,6 +64622,7 @@ groundball.tk, 1 groundcaresolutionsllc.com, 1 groundfm.tk, 1 +groundjerusalem.com, 1 groundmc.net, 1 groundsdirect.com, 1 groundspan.com, 1 @@ -64672,7 +64682,6 @@ grovecity.ga, 1 grovecity.gq, 1 grovecity.ml, 1 -grovecrypto.com, 1 grovefinancialgroup.com.au, 1 groveland.place, 1 grovelandfl.gov, 1 @@ -64682,7 +64691,6 @@ growatiopex.com, 1 growbydata.com, 1 growbyrabbit.com, 1 -growcredit.com, 1 growebmarketing.com, 0 growery.org, 1 growglam.com, 1 @@ -64720,6 +64728,7 @@ grtmmail.com, 1 gruaskmsa.cl, 1 gruasllanos.cl, 1 +grubiradovi.rs, 1 gruble.de, 1 gruca.com.br, 1 grucha-sound.pl, 1 @@ -64762,7 +64771,6 @@ grunttoziemia.pl, 1 grunwaldzki.center, 1 grunwasser.fr, 1 -grupa-stonewall.pl, 1 grupatvogzivota.tk, 1 grupcarles.com, 1 grupdedansa.tk, 1 @@ -64841,6 +64849,7 @@ grzegorzchomutowski.pl, 1 gs-pflege.de, 1 gs-schlossberg.de, 1 +gs1.hk, 1 gs93.de, 1 gsa-online.de, 1 gsa.gov, 1 @@ -64873,13 +64882,11 @@ gsmbrick.com, 1 gsmkungen.com, 1 gsmmedia.tk, 1 -gsmr.org, 1 gsmsale.nl, 1 gsmsolutions.co.rs, 1 gsmtool.tk, 1 gsmvermist.tk, 1 gsp.com, 1 -gspcreations.com, 1 gspilar.tk, 1 gsplast.com, 1 gsrank.org, 1 @@ -64942,6 +64949,7 @@ gtsoftware.gr, 1 gttnews.com, 1 gtupgrade.eu, 1 +gtwaction.org, 1 gtxmail.de, 1 gtxthere.tk, 1 gu153gx.uk, 1 @@ -64959,6 +64967,7 @@ guanggaonet.com, 1 guangjiangk.com, 1 guanquan.com, 1 +guanwangquanji.com, 1 guanxiong.com, 1 guanzhong.ca, 1 guapcoinswap.finance, 1 @@ -65006,6 +65015,7 @@ guder.ru, 1 gudibaths.com, 1 gudini.net, 1 +gudluu.com, 1 gudostudio.tk, 1 gudrun.ml, 1 gudrun.tk, 1 @@ -65080,7 +65090,6 @@ guiaturismovallarta.com, 1 guiaturisticanuevayork.com, 1 guichetunique-pl.org, 1 -guid2steamid.com, 1 guid2steamid.pw, 1 guidaditalia.com, 1 guidanceetbienetre.com, 1 @@ -65093,7 +65102,7 @@ guidebook.co.tz, 1 guidecbd.fr, 1 guidechecking.com, 1 -guidedchoice.com, 0 +guidedchoice.com, 1 guidedesventes.fr, 1 guidedogs.org.uk, 1 guidedselling.net, 1 @@ -65118,6 +65127,7 @@ guidingdementia.com, 1 guidingdementia.org, 1 guidinglightapostolic.com, 1 +guido-leenders.eu, 1 guidoclub.fr, 1 guidopedia.ga, 1 guild.xyz, 1 @@ -65166,7 +65176,6 @@ gujarat.tk, 1 guki.me, 1 gulabovski.ga, 1 -gulchuk.com, 1 gulcinulutuna.com, 1 guldhaug.org, 1 guldkorn.dk, 1 @@ -65234,7 +65243,6 @@ guolaoban.xyz, 1 guolaw.ca, 1 guoman.com, 1 -guopin.com.cn, 1 guozeyu.com, 1 guozhenhao.com, 0 gupy.io, 1 @@ -65265,7 +65273,6 @@ gus.zone, 1 gusar.by, 1 guscanada.com, 0 -guschan.com, 1 gusembauche.ca, 1 gusembauche.com, 1 gusfranchising.com, 1 @@ -65274,7 +65281,6 @@ gusli.net, 1 guso.gq, 1 gussignature.com, 1 -gust.edu.kw, 0 gust.org.pl, 1 gustaff.de, 1 gustarfsberg.cf, 1 @@ -65337,11 +65343,11 @@ guyretreaters.ga, 1 guyretreatest.ga, 1 guys-reviews.ml, 1 +guysandstthomas.nhs.uk, 1 guysauto.com, 1 guysroulette.com, 1 guytarrant.co.uk, 1 guzdek.co, 1 -guzek.uk, 1 guzelforum.tk, 1 guzelkadinlar.tk, 1 guzellikmerkezleri.tk, 1 @@ -65462,6 +65468,7 @@ gynzy.com, 1 gyongyosi.ga, 1 gyoriedes.hu, 1 +gyors-autoszerviz.hu, 1 gyoza.beer, 1 gypsiebylouise.com, 1 gypso-sendai.com, 1 @@ -65477,8 +65484,8 @@ gz-benz.com, 1 gz-bmw.com, 1 gz514.top, 1 -gz99.top, 1 -gz999.top, 1 +gz99.top, 0 +gz999.top, 0 gzdh.com, 1 gzitech.com, 1 gzitech.net, 1 @@ -65509,7 +65516,7 @@ h09.eu, 1 h0r.st, 1 h0stb3rry.org, 1 -h10l.com, 1 +h10l.com, 0 h10s.net, 1 h11.io, 1 h11.moe, 1 @@ -65546,6 +65553,7 @@ h5q.net, 1 h6729.co, 1 h6957.co, 1 +h6k.io, 1 h6p.de, 1 h82365.com, 0 h8p.de, 1 @@ -65594,6 +65602,7 @@ haber.law, 1 habercininyeri.com, 1 haberer.me, 1 +haberizma.com, 1 haberlandconsulting.com, 1 haberlanddesign.com, 1 haberlanddigital.com, 1 @@ -65670,7 +65679,6 @@ hackerflare.com, 1 hackerforums.tk, 1 hackerhotel.nl, 1 -hackeriet.no, 1 hackeriet.se, 1 hackerinfo.ml, 1 hackerli.st, 1 @@ -65698,6 +65706,7 @@ hackgunny.tk, 1 hackhit.info, 1 hackhouse.sh, 1 +hackingcult.de, 1 hackingdh.com, 1 hackingdumpdrive.org, 1 hackingfever.tk, 1 @@ -65729,6 +65738,7 @@ hackzogtum-coburg.de, 1 hacoas.com, 1 hacp.gov, 1 +hacquemand.be, 1 hacquemand.co, 1 hacsapp.co.uk, 1 hadaly.fr, 1 @@ -65761,7 +65771,6 @@ hady.boutique, 1 hady.fr, 1 haefligermedia.ch, 1 -haegele.consulting, 1 haehnel.xyz, 1 haehnlein.at, 1 haemka.de, 1 @@ -65812,6 +65821,7 @@ haifengz.com, 0 haigle.com, 1 haihuan.com, 1 +haikunap.hu, 1 haileybury.com.au, 1 hails.info, 1 hailstorm.nl, 1 @@ -65879,7 +65889,6 @@ hajekj.cz, 1 hajekj.net, 1 hajery.com, 1 -hajibaba.co, 1 hak-lab.com, 1 hak-zona.tk, 1 hak.edu.ee, 1 @@ -65890,6 +65899,7 @@ hakase.pw, 1 hakasia.tk, 1 hakatemia.fi, 0 +hakcongress.org, 1 hake.me, 1 hakenseek.jp, 1 haker24.tk, 1 @@ -65975,7 +65985,6 @@ hallofoddities.tk, 1 hallofworlds.online, 1 halloway.tk, 1 -halloweencostumesideas101.com, 1 halloweenmusic.org, 1 hallsonsservices.com, 1 hallspumpandwellservice.net, 0 @@ -65998,6 +66007,7 @@ haloperidol.cf, 1 halopsa.com, 1 haloscenter.com, 1 +halottvault.ddns.net, 1 halovanic.org, 1 halpin.tk, 1 halseyor.gov, 1 @@ -66030,7 +66040,6 @@ hamdiscussions.com, 1 hameddental.com, 1 hamedfans.tk, 1 -hamelneinfachonline.de, 0 hamelnpsychotherapie.de, 1 hamerslag.tk, 1 hamgamweb.com, 1 @@ -66172,9 +66181,9 @@ handwerk-digital-steinfurt.de, 1 handwerker4u.de, 1 handwerkwebseiten.de, 0 -handwfenceco.com, 1 handy-fun.tk, 1 handy-page.tk, 1 +handy.gy, 1 handy.lc, 1 handymanbibleers.ga, 1 handymanbibleest.ga, 1 @@ -66228,7 +66237,6 @@ hannehovi.fi, 1 hannekroencke.com, 1 hannes.paris, 1 -hannit.de, 0 hannoluteijn.nl, 1 hannover-96.tk, 1 hannover-gis.de, 1 @@ -66239,7 +66247,6 @@ hanomag-tractors.tk, 1 hanpenblog.com, 1 hanrobado.com, 1 -hansa-flex.com.ua, 1 hansa.org.ru, 1 hansahome.ddns.net, 1 hansamed.net, 1 @@ -66249,6 +66256,7 @@ hansbruis.tk, 1 hanschconsulting.com, 1 hanschventures.com, 1 +hansemind.de, 1 hansen-kronshagen.de, 1 hansen.hn, 1 hanseyachtsag.com, 1 @@ -66265,7 +66273,6 @@ hansklok.tk, 1 hansmund.com, 1 hansmunt.nl, 1 -hansolrella.com, 1 hansonian.com, 1 hansottotheater.de, 1 hanspaulske-cteni.tk, 1 @@ -66290,7 +66297,6 @@ haoz.tk, 1 haozhexie.com, 1 haozi.me, 1 -hapfox.de, 1 hapi.agency, 1 hapijs.cn, 1 hapissl.com, 1 @@ -66301,7 +66307,6 @@ happiestoutdoors.ca, 1 happii.dk, 1 happine.ss, 1 -happiness.solutions, 1 happist.com, 1 happity.co.uk, 1 happo-en.com, 1 @@ -66403,15 +66408,18 @@ harakeke.net, 1 harald-pfeiffer.de, 1 harambo.cf, 1 +harant.ru, 1 harapecorita.com, 1 harapjunk.hu, 1 harasov.tk, 1 +harataka.com, 1 harbecke.cloud, 1 harbecke.me, 1 harbecke.net, 1 harbecke.org, 1 harbecke.xyz, 1 harbinger.media, 1 +harbor-app.de, 1 harbor.com, 1 harborbyte.com, 1 harborhillsdaycamp.com, 1 @@ -66487,14 +66495,15 @@ hari-katha.tk, 1 hari-tech.com, 1 haribilalic.com, 1 -haribo.com.tr, 1 hariharnagar.tk, 1 hariji.tk, 1 haringtwpmi.gov, 1 harishgoyal.tk, 1 harithaayurveda.com, 1 +harithahospital.com, 1 haritsa.co.id, 1 hariz.ga, 1 +harizalan.hu, 1 harlan.cc, 1 harlem-mt.gov, 1 harlemeverafter.com, 1 @@ -66588,7 +66597,6 @@ harrypotterpuzzlesandspells.com, 1 harrypottervenezuela.tk, 1 harrysmallbones.co.uk, 1 -harryswine.com, 1 harryvapoteur.com, 1 harryvrancken.nl, 1 harryxxjohnson.ga, 1 @@ -66605,7 +66613,6 @@ hartie95.de, 1 hartig-hirsch.de, 1 hartlep.email, 1 -hartlewicki.com, 1 hartleycountytx.gov, 1 hartlieb.me, 1 hartmancpa.com, 1 @@ -66649,7 +66656,6 @@ has.work, 1 hasabig.wang, 1 hasalittle.wang, 1 -hasandeniz.uk, 1 hasandurmus.com, 1 hasankayra04.com, 1 hasas-automatizari.ro, 1 @@ -66661,6 +66667,7 @@ hasenmueller.de, 1 hasgeek.com, 1 hash.ai, 1 +hash.moe, 1 hash.works, 1 hashbrownhaus.com, 1 hashcat.net, 1 @@ -66715,7 +66722,6 @@ hastmassage.tk, 1 hastyllc.com, 1 hasudashika.com, 1 -hasx.me, 1 hasznosithato.tk, 1 hatake.tk, 1 hatakekaigi.com, 1 @@ -66829,7 +66835,7 @@ hawaiianlion.ga, 1 hawaiianlion.gq, 1 hawaiifamilydental.com, 1 -hawaiifoodbank.org, 1 +hawaiifoodbank.org, 0 hawaiiforbernie.com, 1 hawaiinet.tk, 1 hawaiipolice.gov, 1 @@ -66945,14 +66951,12 @@ hbs-it-gmbh.de, 1 hbslick.com, 1 hbsslaw.co.uk, 1 -hbsslaw.com, 1 hbsvzos.nl, 1 hbudd.com, 0 hbussmann.com, 1 hbweb.io, 1 hby.cx, 1 hc-sc.gc.ca, 0 -hc.ws, 1 hcabilling.com, 1 hcahealthcare.co.uk, 1 hcai-info.ca, 1 @@ -67046,7 +67050,6 @@ hdv.paris, 1 hdv12.horse, 1 hdview.co.uk, 1 -hdwallpapers.net, 1 hdwetpussy.com, 1 hdxxxpics.net, 1 hdy.nz, 1 @@ -67082,6 +67085,7 @@ headstartkernow.org.uk, 1 headstrong.de, 1 headsuphealth.com, 1 +headtopics.com, 1 headwall-hosting.com, 1 headwayapp.co, 1 healdsburg.gov, 1 @@ -67190,7 +67194,6 @@ healthcompany.tk, 1 healthconfluence.tk, 1 healthconstruct.ga, 1 -healthcostinstitute.org, 0 healthcounty.ga, 1 healthcourier.ga, 1 healthcrafter.ga, 1 @@ -67229,7 +67232,6 @@ healthfame.ga, 1 healthfiesta.ga, 1 healthfinder.gov, 1 -healthfitnessinsight.com, 1 healthfitstore.com, 1 healthflavor.ga, 1 healthfleet.ga, 1 @@ -67280,6 +67282,7 @@ healthlowprice.ga, 1 healthlucky.ga, 1 healthmagazines.tk, 1 +healthmanagement.org, 1 healthmanager.ml, 1 healthmanchester.tk, 1 healthmatchapp.com, 1 @@ -67374,6 +67377,7 @@ healthslide.ga, 1 healthsomerset.tk, 1 healthsone.com, 1 +healthsource.online, 1 healthsouthfield.tk, 1 healthsparkle.ga, 1 healthspencer.tk, 1 @@ -67557,7 +67561,6 @@ heber.tk, 1 hebersprings.gov, 1 heberut.gov, 1 -hebikhiv.nl, 1 hebin.cf, 1 hebmexico.tk, 1 hebrew.ga, 1 @@ -67800,8 +67803,8 @@ helioanodyne.eu, 1 heliobil.fr, 1 heliocentrism.jp, 1 +heliolira.com, 1 helion.ch, 0 -helioring.com, 1 helios4.com, 1 heliosbot.net, 1 heliosenergie.it, 1 @@ -67809,12 +67812,12 @@ heliosvoting.org, 0 heliport-moscow.ru, 1 heliport-parts.ru, 1 -helisimmer.com, 1 helium.computer, 1 heliumtech.tk, 1 heliwing.com, 1 helix.am, 1 helixagencyservices.com, 0 +helixsense.com, 1 helixternak.com, 1 helkyn.eu, 1 helkyn.fr, 1 @@ -67856,7 +67859,6 @@ helloheadsup.com, 1 hellohealthgroup.com, 1 helloindia.tk, 1 -hellojimi.com, 1 hellokashmir.tk, 1 hellolove.sg, 1 hellomonet.com, 1 @@ -67886,7 +67888,6 @@ hellothought.net, 1 hellov.in, 1 helloverify.com, 1 -hellovillam.com, 1 helloworldhost.com, 0 helloyubo.com, 1 hellpc.net, 0 @@ -67898,6 +67899,7 @@ hellsoldiers.tk, 1 hellven.net, 1 hellvis.tk, 1 +hellwer.de, 1 hellyeahbeer.tk, 1 helm-pokale.de, 1 helmethouse.com, 1 @@ -67982,7 +67984,6 @@ hemnia.com, 1 hemorroi.ga, 1 hemp.com, 1 -hemphopper.eu, 1 hempsteadcitytx.gov, 1 hemrin.com, 1 hen.ee, 1 @@ -68041,8 +68042,11 @@ henriknoerr.com, 1 henriksachse.de, 1 henriksoderlund.com, 1 +henrikstougaard.com, 1 +henrikstougaard.dk, 1 henrilammers.nl, 1 henrimalhas.pt, 1 +henriquediogo.com, 1 henrri.net, 1 henry.gg, 1 henryalanbrown.com, 1 @@ -68117,6 +68121,7 @@ herbarex.bg, 1 herbarium.cf, 1 herbdish.com, 1 +herbdonbass.ru, 1 herberichfamily.com, 1 herbers.tk, 1 herbertjanvandinther.nl, 1 @@ -68164,7 +68169,6 @@ heritageireland.ie, 1 heritagereformed.tk, 1 heritagetea.tk, 1 -heritagetechnologies.net, 1 herizon.cf, 1 herkam.pl, 1 herkel.email, 1 @@ -68211,6 +68215,7 @@ heroco.xyz, 1 herod.tk, 1 heroes3stat.tk, 1 +heroeshomeadvantage.com, 1 heroesoftomorrow.nl, 0 heroesorchestra.com, 1 herofil.es, 1 @@ -68320,7 +68325,6 @@ hetveurtheater.nl, 1 hetvezercsarda.hu, 1 hetwalhalla.nl, 1 -hetwebsitebedrijf.nl, 1 heureka2.com, 1 heute-kaufen.de, 1 heute.training, 1 @@ -68352,7 +68356,6 @@ hexatech.gq, 1 hexatech.tk, 1 hexaunits.com, 1 -hexaware.com, 1 hexaweb.tk, 1 hexcel.com, 1 hexcode.in, 1 @@ -68369,6 +68372,7 @@ hexo.io, 0 hexobind.com, 1 hexoff.com, 1 +hexony.com, 1 hexsafe.io, 1 hexstream.expert, 1 hexstream.exposed, 1 @@ -68398,6 +68402,7 @@ heyghost.io, 1 heyitgirl.com, 1 heyitsfree.net, 1 +heyjenndigital.com, 1 heyjoecoffee.com, 1 heyjoflyer.win, 1 heylogin.com, 1 @@ -68424,6 +68429,7 @@ hflsdev.org, 0 hfma.org.uk, 1 hfox.org, 1 +hfpatios.com, 1 hfsctx.gov, 1 hfsg-habicht.at, 1 hfvuejq.pro, 1 @@ -68471,6 +68477,7 @@ hhs.gov, 1 hhspress.org, 1 hhsrocketry.tk, 1 +hhu-fscs.de, 1 hhxiaozhan.ml, 1 hi-million.ga, 1 hi-million.ml, 1 @@ -68496,6 +68503,7 @@ hibiscuscommunications.com, 1 hibiscusprintshop.com, 1 hiboomapp.com, 1 +hibretone.org, 1 hibrid-turf.com, 1 hiccupsandjuice.co.uk, 1 hicklinghacks.co.uk, 1 @@ -68508,7 +68516,6 @@ hicoria.com, 1 hicts.nl, 1 hiczp.com, 1 -hidalgo-project.eu, 1 hidashin.co.jp, 1 hidbo.de, 1 hidden-audio.de, 1 @@ -68568,6 +68575,7 @@ hifly.aero, 1 hifund.co.il, 1 hig.gov, 1 +higeniqcleaning.com.au, 1 higentexpo.com, 1 higginsroofing.com.au, 1 higgsboson.tk, 1 @@ -68730,7 +68738,7 @@ himei.city, 1 himeji-kanbee.jp, 1 himens.com, 0 -himic.ru, 0 +himiku.com, 1 himj.de, 1 himnosycanticos.org, 1 himpler.com, 0 @@ -68859,6 +68867,7 @@ hispanoslibresyunidos.com, 1 hispashare.org, 1 hispasonic.com, 1 +hispatrofeo.com, 1 hisregistries.net, 1 hisregistries.org, 1 hisscentralen.se, 1 @@ -68895,6 +68904,7 @@ history.pe, 1 historytree.net, 1 hit-electronics.com, 1 +hit.com.ro, 1 hit.moe, 1 hitchcockcountyne.gov, 1 hitchen.net, 1 @@ -68906,6 +68916,7 @@ hitech-zone.com, 0 hitechreporting.com, 1 hitechsupport.com.au, 1 +hitecnologia.com.br, 1 hitekcomputing.net, 1 hitekmechanical.com, 1 hitel.tk, 1 @@ -68929,6 +68940,7 @@ hitmix.tk, 1 hitmyheart.tk, 1 hitn.at, 1 +hito.com.mx, 1 hitocom.net.br, 1 hitokoto.cn, 1 hitomecha.com, 1 @@ -69001,6 +69013,7 @@ hjerpbakk.com, 1 hjes.com.ve, 1 hjkbm.cn, 1 +hjmag.com, 1 hjorslev.com, 1 hjort-froik.com, 1 hjort.land, 1 @@ -69021,6 +69034,7 @@ hkas.org.hk, 1 hkconcept.lu, 1 hkedquity.org, 1 +hkengage.gov.hk, 1 hkgix.net, 1 hkl-gruppe.de, 1 hkm-webdesign.ca, 1 @@ -69139,7 +69153,6 @@ hoberg.ch, 1 hobiliga.mk, 1 hobindesign.com, 1 -hobo.video, 1 hoboken.tk, 1 hobokencarwash.com, 1 hobokenpdnj.gov, 1 @@ -69168,6 +69181,7 @@ hockeyalertest.ga, 1 hockeyapp.ch, 1 hockeymotion.ch, 0 +hockingfamily.com, 1 hockingfamily.net, 1 hockingfamily.nz, 1 hockinghills.com, 1 @@ -69228,7 +69242,6 @@ hogren.ga, 1 hogren.gq, 1 hogvorts.tk, 1 -hogwarts.io, 1 hogwartshome.org.ua, 1 hoh.com.sg, 1 hohberg.de, 1 @@ -69263,7 +69276,6 @@ hola-smart.com, 1 holacannx.com, 1 holacbdoils.com, 1 -holaceibita.com, 1 holad.de, 1 holadinero.es, 0 holadinero.mx, 0 @@ -69716,6 +69728,7 @@ homeseguridad.com, 1 homeseller.com, 1 homeserve.es, 1 +homeservegruppe.de, 1 homeserver-kp.de, 1 homesforaustralia.ga, 1 homeshow.ml, 1 @@ -69731,7 +69744,6 @@ homesteadserver.cloud, 1 homesteadtwpmi.gov, 1 homestick.ga, 1 -homestimulusprogram.com, 1 homestreaming.ga, 1 homestuck.ml, 1 homesugar.ga, 1 @@ -69742,6 +69754,7 @@ hometownticketing.com, 1 hometrust.ca, 0 hometunnel.de, 0 +hometurfdallas.com, 1 homeunder.ga, 1 homeunion.tk, 1 homeview.ga, 1 @@ -69845,8 +69858,8 @@ hongyun-rent.com, 1 honigconte.com, 1 honigkuchenpferdeher.de, 1 +honk.house, 1 honkai.sr, 1 -honkhonk.net, 1 honkion.net, 1 honmoku-select-shika.com, 1 honoka-seitai.jp, 1 @@ -69886,7 +69899,7 @@ hoop.la, 1 hoopa-nsn.gov, 1 hooperlabs.xyz, 1 -hoopernewton.com, 1 +hoopernewton.com, 0 hoopertechnicalsolutions.com, 1 hooprelief.tk, 1 hoops-inc.com, 1 @@ -69901,10 +69914,10 @@ hop-ict.nl, 1 hop.exchange, 1 hopeandhealing.cz, 1 +hopeforhearts.com.au, 1 hopeforlorn.tk, 1 hopeforukraine.org.uk, 1 hopefultexas.com, 0 -hopeharborwellness.com, 1 hopemeet.info, 1 hopemeet.me, 1 hopepartnershipproject.com, 1 @@ -69958,12 +69971,12 @@ horizon.ne.jp, 1 horizondds.com, 1 horizoneurope.ie, 1 +horizonhealth.com, 1 horizonlawncare.tk, 1 horizonleague.org, 1 horizonmail.ga, 1 horizonsblogs.com, 1 horizonshypnosis.ca, 0 -horizonsocial.media, 1 horizontalsystems.io, 1 horizontly.com, 1 horizontly.net, 1 @@ -69977,11 +69990,11 @@ hormigonimpreso.biz, 1 hormonetrackerers.ga, 1 hormonetrackerest.ga, 1 +hornafricpost.com, 1 hornbach-holding.de, 1 hornblower.tk, 1 hornburg.io, 1 hornby.com, 1 -horne.com, 1 horneytownbrewing.com, 1 horngyihyangped.com.tw, 1 hornofamerica.com, 1 @@ -70000,7 +70013,6 @@ horoscopo.ml, 1 horotoday.tk, 1 horovod.im, 1 -horozo.com, 1 horrell.ca, 1 horrendous-servers.com, 1 horror-forum.de, 1 @@ -70072,6 +70084,7 @@ hospitaldaluz.pt, 1 hospitaldebarcelona.cat, 1 hospitaldelaconcepcion.com, 1 +hospitaldeovalle.cl, 1 hospitality-colleges.com, 1 hospitality-on.com, 1 hospitalityandcateringnews.com, 1 @@ -70162,6 +70175,7 @@ hostmeapp.com, 1 hostmijnpagina.nl, 1 hostmodern.com.au, 1 +hostmore.com.br, 1 hostnook.com, 1 hostonssd.ga, 1 hostpoint-static.ch, 1 @@ -70181,12 +70195,10 @@ hot-games.gq, 1 hot-horse.si, 1 hot-models.tk, 1 -hot-secret.com, 1 hot-sex-photos.com, 1 hot-shots-photos.com, 1 hot-spa.ch, 0 hot.ee, 1 -hot.in.th, 1 hot.v.ua, 1 hot101fm.tk, 1 hotaircoldlove.tk, 1 @@ -70225,11 +70237,13 @@ hotel-fleuralp.it, 1 hotel-garni-letizia.it, 1 hotel-insectes.be, 1 +hotel-jahnatal.de, 1 hotel-kontorhaus.de, 1 hotel-krone.ch, 1 hotel-kronjuwel.de, 1 hotel-kyiv.com.ua, 1 hotel-lacourcarree.com, 1 +hotel-lapaz.com, 1 hotel-le-vaisseau.ch, 0 hotel-leda.com, 1 hotel-promyk.pl, 1 @@ -70254,7 +70268,6 @@ hotelconsulado.com.br, 1 hotelcorporate.codes, 1 hotelcorporatecodes.com, 1 -hoteldahu.it, 1 hoteldealsphuket.com, 1 hoteldegraaff.nl, 1 hoteldel.com, 1 @@ -70271,7 +70284,6 @@ hotelite.tk, 1 hotelizalde.com, 1 hotelkeihan.co.jp, 1 -hotelkop.com, 1 hotellamm.it, 1 hotellocaldubai.com, 1 hotelmap.com, 1 @@ -70319,7 +70331,6 @@ hotgirl.tv, 1 hotglue.me, 1 hothardware.com, 1 -hothawk.ai, 1 hothbricks.com, 0 hothousecucumber.com, 1 hothub.net, 1 @@ -70428,6 +70439,7 @@ houseofhipsters.com, 1 houseofpheromones.com, 0 houseofshades.com, 1 +houseofsupplements.com, 1 houseofyee.com, 1 houseplant.tk, 1 houser.lu, 1 @@ -70464,6 +70476,7 @@ houstonmethodist.org, 1 houstonproperties.com, 1 houstonqualityatticinsulation.com, 1 +hout.eu, 1 houtar.eu.org, 1 houthandelbunskoek.nl, 1 houthandeljacobs.nl, 1 @@ -70634,6 +70647,7 @@ hrafnsholl.is, 1 hrajhry.sk, 1 hrajme.tk, 1 +hram.site, 1 hranicka.cz, 1 hravatar.com, 1 hrbanen.nl, 1 @@ -70675,13 +70689,11 @@ hrnk.org, 1 hrntknr.net, 1 hrobert.hu, 1 -hroc.co.uk, 1 hrodna.life, 1 hroling.nl, 1 hromaticworld.tk, 1 hronikatm.com, 1 hroschyk.cz, 1 -hrp-community.net, 1 hrpage.ml, 1 hrpayhub.com, 1 hrprofessionals.tk, 1 @@ -70712,7 +70724,6 @@ hsbcnet.com, 1 hsbte.com, 1 hsbuild.com, 1 -hsc.com.vn, 1 hschen.top, 0 hscomposites.co.nz, 1 hse-dev.com, 1 @@ -70721,7 +70732,6 @@ hselectricalservices.com, 1 hsg-lumdatal.de, 1 hsi.gov, 1 -hsi.health, 1 hsiot.com.au, 1 hsivonen.com, 1 hsivonen.fi, 1 @@ -70839,7 +70849,9 @@ httpsecured.net, 1 httpsiseasy.com, 1 httpsispisseasy.com, 1 +httpsrdr.me, 1 httpsredirector.com, 1 +httpssify.com, 1 httpstaak.tk, 1 httpstest.eu, 1 httpstest.nl, 1 @@ -70862,7 +70874,6 @@ huang.nu, 1 huangban.org.cn, 1 huangguancq.com, 1 -huangh.com, 1 huangjia71.com, 1 huangjia72.com, 1 huangjia73.com, 1 @@ -70891,6 +70902,7 @@ huarenda.com, 0 huashan.co.uk, 1 huashang.tk, 1 +huaskj.com, 1 huawenyy.com, 1 huaxinba.com, 1 huaxueba.com, 1 @@ -70915,6 +70927,7 @@ huber-informatik.de, 1 huberheightschamber.com, 1 hubermanlab.com, 1 +huberts.com, 1 hubilo.com, 1 hublaagram.ml, 1 hubmark.co, 1 @@ -71001,7 +71014,6 @@ hugonote.ovh, 1 hugonote.tk, 1 hugopvigo.es, 1 -hugotech.vn, 1 hugovr.me, 1 hugovr.nl, 1 hugs.ua, 1 @@ -71066,7 +71078,6 @@ humanesdemadrid.tk, 1 humanewolf.com, 1 humanhairgo.tk, 1 -humanhealth.pl, 1 humanidad.tk, 1 humaninterest.com, 1 humaniora.com, 1 @@ -71074,14 +71085,13 @@ humanitiesacademicpublishers.com, 0 humanitiesnebraska.org, 1 humanity.com, 1 -humanityunited.org, 1 humanize.security, 1 humankode.com, 1 humanlocation.net, 1 humanresources.gq, 1 humanresourcesmanager.de, 1 humanrights-geneva.info, 1 -humanrights.gov.au, 1 +humanrights.gov.au, 0 humanrights.tk, 1 humanrightscareers.com, 1 humanrightseducation.cn, 1 @@ -71219,6 +71229,7 @@ huntloc.com, 1 huntnewsnu.com, 1 huntreminder.com, 1 +huntressholdings.com, 1 huntsvillealtransit.gov, 1 huntsvillecottage.ca, 1 huntvac.com, 1 @@ -71257,6 +71268,7 @@ hurtigtinternet.dk, 1 husakbau.at, 1 huseyinpala.com, 1 +hushbabysleep.com, 1 hushfile.it, 1 hushlayer.com, 1 hushpuppiesobuv.ru, 1 @@ -71543,6 +71555,7 @@ hyrulekingdom.tk, 1 hyrumcity.gov, 1 hys-te-ria.tk, 1 +hys.com.tw, 1 hyser.com.ua, 1 hysh.jp, 1 hysh.net, 1 @@ -71661,7 +71674,6 @@ iaata.info, 1 iabot.tk, 1 iac-indooraircare.com, 1 -iacc.cl, 1 iacee.org, 1 iacono.com.br, 0 iactor.co.jp, 1 @@ -71677,6 +71689,7 @@ iaf.nu, 1 iafd.com, 0 iafda.org, 1 +iafisgroup.com, 1 iafss2023.com, 1 iageengineering.net, 1 iainsimms.co.uk, 1 @@ -71690,6 +71703,7 @@ iambhatti.tk, 1 iamcloud.de, 1 iamconnected.eu, 1 +iamedicale.fr, 1 iamfortytwo.com, 1 iamhealthystore.com, 1 iamhenryjvera.com, 1 @@ -71710,6 +71724,7 @@ iamthelife.io, 1 iamthesweetspot.com, 0 iamtp.com, 1 +iamveryti.red, 1 ian-barker.co.uk, 1 ian.sh, 0 ian678.com, 1 @@ -71753,6 +71768,7 @@ iaudited.com, 1 iav.com, 1 iav.de, 1 +iava.ind.br, 1 iavalley.edu, 1 iawx.net, 1 iaxx.eu, 1 @@ -71771,6 +71787,7 @@ ibb.istanbul, 1 ibc-container.be, 1 ibc.com, 1 +ibcfinancial.com, 1 ibcmed.com, 0 ibdmdb.org, 1 ibe.de, 1 @@ -71792,7 +71809,6 @@ ibericarreicomsa.es, 1 ibericartechnik.es, 1 ibetora.com, 1 -ibex.co, 1 ibexpackaging.com, 1 ibexrepair.co.uk, 0 ibhgospel.com, 1 @@ -71802,6 +71818,7 @@ ibilezakat.com, 1 ibilog.net, 1 ibin.co, 1 +ibipoint.com, 1 ibiu.xyz, 0 ibiz.mk, 1 ibizads.tk, 1 @@ -71958,6 +71975,7 @@ ici.ac.nz, 1 ici.ms, 1 ici.net.au, 1 +icicidirect.com, 1 icie.info, 1 icieducation.ca, 1 icieducation.co.uk, 1 @@ -71981,6 +71999,7 @@ icnagenda.fr, 1 icnc.ga, 1 icnsoft.org, 1 +icodrops.com, 1 icojapan.tokyo, 1 icolabo.yokohama, 1 icolc.net, 1 @@ -72022,6 +72041,7 @@ icrat.org, 1 icreative.nl, 1 icruise.com, 1 +icsense.com, 1 icsolutions.nl, 1 icst.tk, 1 icsti.org, 1 @@ -72135,7 +72155,6 @@ idealmilf.com, 1 idealnastrona.pl, 1 idealni-hypoteka.cz, 1 -idealofficefurnitureinc.com, 1 idealog.id, 1 idealsegurancaeletronica.com.br, 1 idealserralheriabh.com.br, 1 @@ -72181,7 +72200,6 @@ ident4u.de, 1 identassist.com, 1 identeco.de, 1 -identidadesmexico.com, 1 identifyme.net, 1 identifytag.com, 1 identigraf.center, 1 @@ -72257,6 +72275,7 @@ idream-solutions.co.uk, 1 idrissi.eu, 1 idrivegroup.ie, 1 +idrix.com.ec, 1 idroot.us, 1 idrycolumbus.com, 1 idsafe.co.za, 1 @@ -72273,14 +72292,15 @@ idute.com, 0 idvchile.cl, 1 idvl.de, 1 -idw.pt, 0 -idwaste.com, 1 +idw.pt, 1 idwebtools.tk, 1 idxforza.com, 1 idyeslogistics.com, 1 idysse.com, 1 ie.search.yahoo.com, 0 ieap.it, 1 +iear.be, 1 +iear.nl, 1 iec-telecom.com, 1 iedereenaanzet.nl, 1 iedr.ie, 1 @@ -72309,6 +72329,7 @@ iesledzkarjeru.lv, 1 iesm.lk, 1 iesonline.co.in, 1 +iess2047.gov.in, 1 iesvegadesanmateo.org, 1 ieval.ro, 1 ievgenialehner.com, 1 @@ -72338,6 +72359,7 @@ ifederalland.com, 1 ifelse.io, 1 ifengge.cn, 1 +ifey.org, 1 iffk.in, 1 iffland-hoeren.de, 1 ifgcdn.com, 1 @@ -72388,7 +72410,6 @@ ig.com, 1 ig.me, 1 iga-semi.jp, 1 -igad.int, 1 igame.ml, 1 igamingaffiliateprograms.com, 1 igamingdirectory.com, 1 @@ -72412,6 +72433,7 @@ iggprivate.com, 1 iggsoft.com, 1 iggsoftware.com, 1 +iggyz.com, 1 igi-2.com, 1 igiftcards.de, 1 igiftcards.nl, 1 @@ -72433,7 +72455,6 @@ igloopartnerportal.com, 1 igloopreview.ca, 1 iglosujemy.pl, 1 -iglus.org, 1 igmus.org, 1 ign-proprete.fr, 1 ignace72.eu, 1 @@ -72532,6 +72553,7 @@ ihk-onlinewahl2021.de, 1 ihkk.net, 1 ihls.world, 0 +ihm.is, 1 ihmc.us, 1 ihmmarketing.com, 1 ihmphila.org, 1 @@ -72566,7 +72588,6 @@ iieccpora.org, 1 iiet.pl, 0 iig-order.com, 1 -iig-qa.com, 1 iihr.res.in, 1 iii-coalition.us, 1 iiid.work, 1 @@ -72797,7 +72818,6 @@ illuxat.com, 1 ilmaestro.net, 1 ilmainensanakirja.fi, 1 -ilmanifesto.it, 0 ilmcorp.com, 1 ilmiogiardiniere.it, 1 ilmrl.com, 1 @@ -72997,7 +73017,6 @@ imigrasilampung.co.id, 1 imigrate.me, 1 imin.co, 1 -iminathi.net, 1 iming.fr, 1 iminshell.com, 0 imirhil.fr, 1 @@ -73046,6 +73065,7 @@ immigration.com.az, 1 immigration.gov.mn, 1 immigrationdirect.com.au, 1 +immigrationhelp.co.nz, 1 immijobs.co.uk, 1 immo-agentur.com, 1 immo-aval.com, 1 @@ -73146,14 +73166,17 @@ immospezial.info, 1 immospezial.net, 1 immospezial.org, 1 +immowot.de, 1 immtel.co, 1 immtel.com, 1 immune.cf, 1 immunetolerance.org, 1 immuniweb.com, 1 immunoboost.be, 1 -immutable.com, 1 +immunowell-jcv-portal.com, 1 +immutable.com, 0 imnabrasive.com, 1 +imnhealth.com, 1 imnot.uk, 1 imo.de, 1 imo.pl, 1 @@ -73181,7 +73204,6 @@ imorano.it, 1 imos3d.com, 1 imosthailand.com, 1 -imoter.it, 1 imouto.ru, 1 imouyang.com, 0 imove-germany.de, 1 @@ -73198,6 +73220,7 @@ impactartstudy.com, 1 impactdepth.com, 1 impacter.eu, 1 +impactict.com.au, 1 impacto.cw, 1 impactovenezuela.com, 1 impactparcels.co.uk, 1 @@ -73214,6 +73237,7 @@ impeka.in, 1 impelsys.com, 1 impelup.com, 1 +impelup.net, 1 impendulo.org, 1 imperator-janssens.tk, 1 imperdin.com, 1 @@ -73287,6 +73311,7 @@ impresapulizie.it, 1 impresapulizie.milano.it, 1 impresapuliziebergamo.it, 1 +impresiones3d.com.es, 1 impress-app.com, 1 impress-connect.eu, 1 impress-project.eu, 1 @@ -73297,6 +73322,7 @@ imprezer.tk, 1 imprezzor.com, 1 imprimante-3d-store.fr, 1 +imprimetextile.fr, 1 improbo-group.com, 1 improd.works, 1 improfestival.ee, 1 @@ -73359,11 +73385,11 @@ in-flames.com, 1 in-line.ru, 1 in-love.tk, 1 +in-melbet.com, 1 in-nova-re.com, 1 in-star.com.ua, 1 in-ua.com, 1 in.search.yahoo.com, 0 -in.xero.com, 0 in2core.com, 1 inab.me, 1 inaji.com, 1 @@ -73393,7 +73419,6 @@ inbitcoin.it, 1 inblank.tk, 1 inbound.tk, 1 -inbounder.io, 0 inbox.com, 1 inbox.google.com, 1 inbox.gq, 1 @@ -73492,9 +73517,9 @@ indecente.tk, 1 indeco.com.ec, 1 indecomm.com, 1 +indega.com.py, 1 indegene.com, 1 indeika.ml, 1 -indejuice.com, 1 indeksonline.tk, 1 indemer.mc, 1 indenturaswork.lt, 1 @@ -73534,7 +73559,6 @@ india-ennenga.ga, 1 india-export.com.ua, 1 india.info, 1 -indiaai.gov.in, 1 indiaexport.com.ua, 1 indiaflowermall.com, 1 indiafm.tk, 1 @@ -73555,7 +73579,6 @@ indianbeauty.ml, 1 indianbridalservices.com, 1 indianbrides.cf, 1 -indiancountryguide.com, 1 indiancreekvillagepdfl.gov, 1 indianculture.gov.in, 1 indiandramasonline.tk, 1 @@ -73624,7 +73647,6 @@ indir2017.tk, 1 indirhadi.tk, 1 indirimkuponumarketim.com, 1 -indirimlim.com, 1 indironline.com, 1 inditip.com, 1 indivicloud.me, 0 @@ -73665,7 +73687,6 @@ indramdhani.net, 1 indranesia.tk, 1 indraq.tk, 1 -indreams.me, 1 indretningmedplanter.dk, 1 indst.eu, 1 indstocks.com, 1 @@ -73680,6 +73701,7 @@ indusgame.com, 1 indushospital.org.pk, 1 indust.me, 1 +industreegroupstadium.com.au, 1 industreiler.com.br, 1 industriafranchini.com, 1 industriagraficabrasileira.com.br, 1 @@ -73715,7 +73737,6 @@ inetinfo.io, 1 inetis.com, 1 inetol.net, 1 -inetpro.io, 1 inetserver.eu, 1 inetuser.tk, 1 inetworking.it, 1 @@ -73755,17 +73776,16 @@ infi.ch, 1 inficom.org, 1 infidel.org, 1 +infidels.org, 1 infidia.tk, 1 infiernoalgecireno.tk, 1 infihow.com, 1 infinbank.com, 1 -infineon-bipolar.com, 1 infinether.net, 1 infinifit.store, 1 infinipharm.com, 1 infinitblog.de, 1 infinite.com, 1 -infiniteautomation.com.au, 1 infinitecollision.com, 1 infinitelightofbeing.org, 1 infinitenews.cf, 1 @@ -73779,7 +73799,6 @@ infinitipartsdeal.com, 1 infinitiresearch.com, 1 infinito.tk, 1 -infinitomarca.com, 1 infinitoporciento.tk, 1 infinity-area.com, 1 infinity-photography.co.uk, 1 @@ -73794,6 +73813,7 @@ infinityosa.com, 1 infinityready.com, 1 infinityrecruitinggroup.com, 1 +infinityspm.com, 1 infinityvr.net, 1 infinityweb.com.au, 1 infinityworks.com, 1 @@ -73872,6 +73892,7 @@ infocrypto.pl, 1 infocus.company, 0 infocusvr.net, 1 +infoderechopenal.es, 1 infodis.com, 1 infoduv.fr, 1 infoeccos.com, 1 @@ -73903,7 +73924,6 @@ infomate360.com, 1 infomatricula.pt, 1 infomax.gr, 1 -infomeddnews.com, 1 infomega.fr, 1 infomexico.tk, 1 infomikulcice.cz, 1 @@ -74014,80 +74034,32 @@ infra.land, 1 infraball.com, 1 infrabase.cc, 1 -infrabeep.com, 1 -infrabeta.com, 1 -infrabind.com, 1 -infrabold.com, 1 -infrabond.com, 1 infrabox.nl, 1 -infraclass.com, 1 -infraclip.com, 1 infracron.com, 1 -infradart.com, 1 infradio.am, 1 -infradisk.com, 1 infradive.com, 1 -infradot.com, 1 -infradrop.com, 1 infraedifice.com, 1 -infrafile.com, 1 -infrafire.com, 1 -infraflip.com, 1 -infraflux.com, 1 -infrafuse.com, 1 -infrafusion.com, 1 +infrafor.us, 1 infragardnational.org, 1 -infraget.com, 1 infralicht.nl, 1 -infralira.com, 1 -infralist.com, 1 infraloon.com, 1 -inframake.com, 1 inframaps.com, 1 -inframeet.com, 1 -inframenu.com, 1 -inframetro.com, 1 -inframint.com, 1 infraname.com, 1 -infranest.com, 1 -infranium.com, 1 infranium.eu, 1 infranium.info, 1 infranium.net, 1 infranium.org, 1 -infranotes.com, 1 -infranoto.com, 1 -infranox.com, 1 infrapass.com, 1 infrapedia.ch, 1 -infrapeer.com, 1 -infrapilot.com, 1 -infraping.com, 1 infrapirtis.lt, 1 -infrapixel.com, 1 -infraplot.com, 1 infraplushk.com, 1 -infrarank.com, 1 -infrarate.com, 1 -infrareader.com, 1 infraredproductions.com, 1 infraredradiant.com, 1 infras.fr, 1 infrasa.gov.br, 1 -infrasend.com, 1 -infraspin.com, 1 -infrastat.com, 1 infrastatic.com, 1 -infratank.com, 1 -infratask.com, 1 -infrathink.com, 1 -infratrip.com, 1 -infravibe.com, 1 -infravideo.com, 1 infravoce.com, 1 -infravoice.com, 1 infraware.com, 1 -infrazine.com, 1 infrony.com, 1 infruction.com, 1 infstudios.nl, 1 @@ -74210,6 +74182,7 @@ inkburners.ga, 1 inkburnest.ga, 1 inkdawgz.com, 0 +inkeddytattoo.fi, 1 inkedin.com, 1 inkedindarkness.com, 1 inkflaremagazine.com, 1 @@ -74229,6 +74202,7 @@ inkopers.org, 1 inkor.tk, 1 inksay.com, 1 +inkstar.ro, 1 inkteeshop.com, 1 inkthedealseminars.com, 1 inkthreadable.co.uk, 1 @@ -74260,6 +74234,7 @@ inmemoria.tk, 1 inmemorium.tk, 1 inmemoryofdaniella.com, 1 +inmet.gov.br, 1 inmigracionjusta.com, 1 inmo3.com.ec, 1 inmobanking.com.gt, 1 @@ -74343,6 +74318,7 @@ innovativeplumbingpros.com, 1 innovativetrials.com, 1 innovativeunderwriters.com, 1 +innovatopia.jp, 1 innovent.com, 1 innover.se, 1 innoviafilms.com, 0 @@ -74376,6 +74352,7 @@ inotic.ir, 1 inovalon.com, 1 inovalon.global, 1 +inovamaquinas.com, 1 inovamaquinas.com.br, 1 inovamedia.net, 1 inovangroup.com.tr, 1 @@ -74417,7 +74394,6 @@ insaattedarik.com.tr, 1 insane.studio, 1 insaneair.co.uk, 1 -insanedevs.com, 1 insanepyro.tk, 1 insanity.zone, 1 insblauehinein.nl, 1 @@ -74436,7 +74412,6 @@ inser.com.co, 1 inserta.tk, 1 insertcoin.fr, 1 -insertcoins.net, 1 insertcredit.com, 1 insertface.com, 1 inshapenutrition.com.br, 1 @@ -74464,7 +74439,7 @@ insiderx.com, 1 insidethefirewall.tk, 1 insidetheigloo.com, 1 -insideuniversal.net, 1 +insideuniversal.net, 0 insideview.com, 1 insightfulpsychics.com, 1 insighti.com, 1 @@ -74477,6 +74452,7 @@ insinuator.net, 1 insisypheprod.fr, 1 insitepackaging.com, 1 +insitox.com, 1 insitusales.com, 1 insolent.ch, 1 insomnia-isterica.tk, 1 @@ -74545,7 +74521,6 @@ instahub.net, 0 instalamosyreformamos.es, 1 instalatii-pardoseala.ro, 1 -install-solar.co.uk, 0 installation-hotte-cuisine.com, 1 installation-of-xenon.tk, 1 installationdehotte.com, 1 @@ -74593,6 +74568,7 @@ institutoaccesibilidadweb.com, 1 institutoclaro.org.br, 1 institutoessencia.com, 1 +institutog4.edu.co, 1 institutogiuseppe.com.ar, 1 institutoiboru.com.br, 1 institutoliderar.edu.co, 1 @@ -74643,10 +74619,12 @@ insuremycar.ru, 1 insureon.com, 1 insurethebox.tk, 1 +insureyourhorse.com, 1 insurgence.org, 1 insurgencebook.com, 1 insurgent.tk, 1 insurgo.cloud, 1 +insurox.com, 1 insurrectosdelbosque.tk, 1 insyde.cloud, 1 insyde.com, 1 @@ -74741,6 +74719,7 @@ intellicus.com, 1 intellicyb.com, 1 intelligence-explosion.com, 1 +intelligence-privee.com, 1 intelligentglo.fi, 1 intelligentgo.org, 1 intelligentnegotiator.com, 0 @@ -74777,7 +74756,6 @@ interacademybrazil.com.br, 1 interacthindu.tk, 1 interactiveanddesign.com, 1 -interactivebrokersreview.co, 1 interactivedigesters.ga, 1 interactivedigestest.ga, 1 interactiveliterature.org, 1 @@ -74843,7 +74821,6 @@ interguardian.de, 1 interhealthcare.com.au, 1 interiery-waters.cz, 1 -interieurplaza.nl, 1 interieursud.fr, 1 interimnorge.no, 1 interiofyspaces.com, 1 @@ -74882,6 +74859,7 @@ internalkmc.com, 1 internally.ga, 1 internalportal.net, 1 +internat-sourdun.fr, 1 international-books.org, 1 international-friends.net, 1 international-lisp-conference.org, 1 @@ -74958,7 +74936,6 @@ internetsociety.org, 1 internetstatistik.se, 1 internetstiftelsen.se, 1 -internetstones.com, 1 internetsubsidie.tk, 1 internettoday.ga, 1 internettradie.com.au, 0 @@ -74975,6 +74952,7 @@ interpoolme.com, 1 interprete.tk, 1 interratrade.gr, 1 +interregtesimnext.eu, 1 intersectionconsultancy.co.uk, 1 intersein-landshut.de, 1 intersein-sangha-landshut.de, 1 @@ -75082,7 +75060,6 @@ intstyle.com.ua, 1 intsurfing.com, 1 intsys.fi, 1 -intuitionmedicine.org, 1 intuitionmedicineonline.org, 1 intux.be, 0 intvonline.com, 1 @@ -75110,7 +75087,9 @@ invantive.cloud, 1 invantive.co.uk, 1 invantive.es, 1 +invantive.eu, 1 invantive.net, 1 +invantive.nl, 1 invantive.org, 1 invariax.com, 1 invata-ma.ro, 1 @@ -75133,7 +75112,6 @@ inventorybase.co.uk, 1 inventorybase.com, 1 inventoryimages.co.uk, 1 -inventorylab.com, 1 inventos.tk, 1 inventoseinventores.com, 1 inventum.cloud, 1 @@ -75179,7 +75157,6 @@ investingdiary.cn, 1 investinginamerica.gov, 1 investingnews.com, 1 -investingoal.com, 1 investingoutlook.co, 1 investingrenada.gd, 1 investingtrader.net, 1 @@ -75195,7 +75172,6 @@ investisiya.az, 1 investment-adh.com, 1 investment.com, 1 -investmentinnovate.com, 1 investmentmonitor.ai, 1 investmentpal.com, 1 investmentrankingsers.ga, 1 @@ -75222,7 +75198,6 @@ invicta.fr, 1 invicti.com, 1 invictuscustodia.com, 1 -invictuspharmacy.com, 1 invidis.de, 1 invisia.com.br, 1 invisible-college.com, 1 @@ -75287,6 +75262,8 @@ iocurrents.com, 0 iodb.ru, 1 iodu.re, 1 +iofog.com, 1 +iofog.net, 1 ioga.tk, 1 iogm-official.id, 1 iograficathemes.com, 0 @@ -75502,7 +75479,6 @@ ipschool.spb.ru, 1 ipsec.pl, 1 ipsecurelink.com, 1 -ipservices.pl, 1 ipsilon-project.org, 1 ipso.com.tr, 1 ipso.paris, 1 @@ -75510,6 +75486,7 @@ ipssl.li, 1 ipstoragesolutions.com, 1 ipsubscription.store, 1 +ipsubtv.com, 1 ipsum.dk, 0 ipswichgrammar.com, 1 ipt.za.com, 1 @@ -75563,7 +75540,6 @@ iraanswersers.ga, 1 iraanswersest.ga, 1 iraf.de, 1 -iragoldreview.com, 1 irajsingh.tk, 1 iramellor.com, 1 iran-best.cf, 1 @@ -75657,6 +75633,7 @@ iriemag.com, 1 irina-beauty.de, 1 irinaf.tk, 1 +irinar.co, 1 irioka.be, 1 irion-edm.com, 1 iris-design.info, 1 @@ -75697,7 +75674,6 @@ irkutsk38.tk, 1 irland-firma.com, 1 irlfp.com, 1 -irlpack.pl, 1 irlprable.tk, 1 irma-gadalka.tk, 1 irmag.ru, 1 @@ -75748,9 +75724,8 @@ ironycats.net, 1 iroomz.co.uk, 1 iroquoiscountyil.gov, 1 -irotravel.xyz, 1 irpadafrique.ml, 1 -irr52.ru, 0 +irr52.ru, 1 irr59.ru, 1 irrewilse.se, 1 irrigation.zone, 1 @@ -75818,7 +75793,6 @@ isadamlari.tk, 1 isae3402.com, 1 isaeus.nl, 1 -isafe.org, 1 isahaya-media.com, 1 isakow.cf, 1 isakow.gq, 1 @@ -75864,7 +75838,6 @@ isernogiemandopkantoor.nl, 1 iserve-it.nl, 1 iservicio.mx, 1 -isesmt.com, 1 iseulde.com, 1 isexu.ga, 1 isg-one.com, 0 @@ -75922,7 +75895,6 @@ islam-doc.tk, 1 islam-net.tk, 1 islam.az, 1 -islam.si, 1 islam4all.tk, 1 islam4congo.tk, 1 islamabadcourt.tk, 1 @@ -75991,6 +75963,7 @@ ismekkurs.com, 1 ismena.bg, 1 ismetroburning.com, 1 +ismiledental.ro, 1 isminc.com, 1 ismmed.org, 1 ismywebsitepenalized.com, 1 @@ -75998,6 +75971,7 @@ isn.education, 1 isnadf.org, 1 isnap.club, 1 +isnatgram.com, 1 isnot.ai, 1 iso27001.dk, 1 iso27032.com, 1 @@ -76181,6 +76155,7 @@ it-actually.work, 1 it-admin.sk, 1 it-altstadt.de, 1 +it-beratung-berger.com, 1 it-biznes.com, 1 it-blog.cf, 1 it-boss.ro, 1 @@ -76409,7 +76384,6 @@ itprosmgmt.com, 1 itprotect.pl, 1 itqlatam.com, 1 -itracks.com, 0 itradeit.in, 1 itradenetwork.com, 1 itraffic.cf, 1 @@ -76557,10 +76531,12 @@ iuniverse.com.au, 1 iupibaby.pt, 1 iuppiter-ssd.it, 1 +iurisnow.com, 1 iusedtobelieve.com, 1 iv-vr.com, 1 iv.pl, 0 iv4kiso.com, 1 +ivadev.kz, 1 ivahbbiz.tk, 1 ivan-maliy.tk, 1 ivan-popov.tk, 1 @@ -76577,7 +76553,6 @@ ivanesalud.com, 1 ivaniglesias.es, 1 ivanilla.org, 1 -ivanime.com, 1 ivankuchin.tk, 1 ivanmeade.com, 1 ivanov.icu, 1 @@ -76672,10 +76647,10 @@ iwatt.sk, 1 iwch.tk, 1 iwd.gc.ca, 1 -iwebdna.com, 1 +iwebdna.com, 0 iwebing.tk, 1 +iweblab.it, 1 iwebsolution.tk, 1 -iwec.pk, 1 iwex.swiss, 1 iwf.sport, 1 iwhite.tk, 1 @@ -76726,6 +76701,7 @@ iyouewo.com, 1 iyoumu.top, 1 iyspanel.com, 1 +iz4wnp.it, 1 iz8mbw.net, 1 izabava.tk, 1 izabel.tk, 1 @@ -76743,6 +76719,7 @@ izidream.bg, 1 izimaths.fr, 1 izipik.gq, 1 +izirh.io, 1 izitex.shop, 1 izkustvo.com, 1 izletiyo.com, 1 @@ -76766,6 +76743,7 @@ izmityazilim.com.tr, 1 izo.es, 1 izodiacsigns.com, 1 +izradasajtovaweb.com, 1 izs.me, 1 izttech.com, 1 izuba.info, 0 @@ -76789,6 +76767,7 @@ j-inb.net, 1 j-library.com, 1 j-maxton.de, 1 +j-para.com, 1 j-ph.ovh, 1 j-robertson.com, 1 j-step.or.jp, 1 @@ -76829,7 +76808,6 @@ j70444.com, 0 j70555.com, 0 j9297.co, 1 -j9514.com, 0 j95app.com, 0 j95cc.com, 0 j95ee.com, 0 @@ -76864,6 +76842,7 @@ jabber.at, 1 jabber.fr, 1 jabber.uk, 1 +jabber.vg, 1 jabberd.org, 1 jabberdog.tk, 1 jabberfr.org, 1 @@ -76899,7 +76878,6 @@ jackblues.tk, 1 jackcasady.com, 1 jackcon.com, 1 -jackdanielssauces.com, 1 jackdawphoto.co.uk, 1 jacket-coat.tk, 1 jackets-coats.tk, 1 @@ -77000,7 +76978,6 @@ jadiercms.cf, 1 jadox.com, 1 jaduniv.cf, 1 -jae.fi, 1 jae.su, 1 jae.zone, 1 jaeger.link, 1 @@ -77009,7 +76986,6 @@ jafarmehdipor.ga, 1 jafisportcamp.pl, 1 jag-meccar.tk, 1 -jagadhatrionline.co.in, 1 jagan.be, 1 jagar.com.pl, 1 jagbouncycastles.co.uk, 1 @@ -77051,6 +77027,7 @@ jairsinho.me, 1 jaisiam.co.th, 1 jaispirit.com, 1 +jaiswalfertility.com, 1 jaiyun.tk, 1 jajce.tk, 1 jajojababy.com, 1 @@ -77058,6 +77035,7 @@ jakabszallas.hu, 1 jakarta-tourism.go.id, 1 jakarta.ee, 1 +jakartaee.org, 1 jakartaone.org, 1 jake.ac, 1 jakegines.in, 1 @@ -77312,8 +77290,6 @@ japancarts.ru, 1 japanchiropractic.com.br, 1 japandigest.de, 1 -japandizen.com, 1 -japandizen.pl, 1 japanese-cuisine.com, 1 japanese-dominatrix.com, 1 japanese-imperialism971.tk, 1 @@ -77348,6 +77324,7 @@ jaraizaboli.tk, 1 jaramilloconstrucciones.pe, 1 jaraontheroad.cz, 1 +jardhus.is, 1 jardigital.com.au, 1 jardiminfantildeferrel.pt, 1 jardinderline.ch, 1 @@ -77365,7 +77342,9 @@ jarett-lee.com, 1 jarigvandaag.nl, 1 jaris.blog, 1 +jaris.com, 1 jaris.fi, 1 +jaris.io, 1 jarkkorahkonen.fi, 1 jarl.ninja, 1 jarlette.com, 1 @@ -77412,7 +77391,6 @@ jasm1nii.xyz, 1 jasminedirectory.com, 1 jasminefields.net, 1 -jasminetroll.net, 1 jasminka.cz, 1 jasminlive.cam, 1 jasminum.uk, 1 @@ -77421,7 +77399,6 @@ jason-isaacs.tk, 1 jason.red, 1 jasonamorrow.com, 0 -jasonchampagne.fr, 1 jasoncoopermd.com, 1 jasoncosper.com, 1 jasoncs.eu.org, 1 @@ -77433,7 +77410,6 @@ jasonm.us.kg, 1 jasonmili.online, 1 jasonreadinglandscapes.com.au, 1 -jasonrubinins.com, 0 jasonsansone.com, 1 jasonsplecoscichlids.com, 1 jasonthai.me, 0 @@ -77492,6 +77468,7 @@ javierflorescastillero.es, 0 javiergddw.com, 1 javierjurado.tk, 1 +javierlorente.es, 1 javiermascherano.tk, 1 javiersanchez.tk, 1 javiscoffee.com, 1 @@ -77521,8 +77498,8 @@ jayjardine.ga, 1 jayjardine.gq, 1 jayjardine.ml, 1 +jaylewis.us, 1 jaylineko.com, 1 -jaymecd.rocks, 1 jaypandit.me, 1 jaypark.gq, 1 jaypeeonline.tk, 1 @@ -77531,7 +77508,7 @@ jayshettycoaching.com, 1 jayspage.tk, 1 jayspov.net, 1 -jaytauron.xyz, 1 +jaysuingcare.com, 1 jaytx.com, 1 jayveel.nl, 1 jayxon.com, 1 @@ -77689,6 +77666,7 @@ jdmarketinggroup.com, 1 jdmicro.com, 1 jdoi.pw, 1 +jdon.com, 1 jdpleisure.co.uk, 1 jdscastlehire.co.uk, 1 jdsecurity.co.nz, 1 @@ -77799,7 +77777,6 @@ jeffersonkyattorney.gov, 1 jeffersonlandscaping.com, 1 jeffersonohio.gov, 1 -jeffersonreal.uk, 1 jeffersonregan.co.uk, 1 jeffersonregan.com, 1 jeffersonregan.net, 1 @@ -77818,6 +77795,7 @@ jeffri.me, 1 jeffsanders.com, 1 jefftron.net, 0 +jeffweb.net, 1 jeflix.stream, 1 jefrydco.id, 1 jefsweden.eu, 1 @@ -77838,7 +77816,6 @@ jelena-karleusa.tk, 1 jelenkovic.rs, 1 jell.ie, 1 -jellebo.dk, 1 jellekaufmann.nl, 1 jelleluteijn.com, 1 jelleluteijn.eu, 1 @@ -78120,7 +78097,6 @@ jezura.cz, 1 jezykoteka.pl, 1 jezzicat.org, 1 -jf-beco.pt, 0 jf-fotos.de, 1 jf-igrejanovadosobral.pt, 0 jf-madalena.tk, 1 @@ -78339,6 +78315,7 @@ jinbo123.com, 0 jinbowiki.org, 1 jinbuguo.com, 1 +jinde.com.my, 1 jinduoduo369.com, 1 jinduoduo666.com, 1 jinduoduo888.com, 1 @@ -78346,6 +78323,7 @@ jingbo.fan, 1 jinglebugs.co.nz, 1 jingmi.com.tw, 1 +jingshuschool.com, 1 jinhaagency.com, 1 jinhaagency1.com, 1 jinja.ai, 1 @@ -78419,6 +78397,7 @@ jjura.dk, 1 jjzmaj.tk, 1 jk-forensics.de, 1 +jk-play.com, 1 jk-rjevka.gq, 1 jkarteaga.tk, 1 jkbfabrics.com, 0 @@ -78535,6 +78514,7 @@ jmzo.nl, 0 jn1.me, 1 jnana-yoga.info, 1 +jnblict.co.za, 1 jncie.eu, 1 jng.pt, 1 jnjpolymer.com, 1 @@ -78555,6 +78535,7 @@ joa-ebert.com, 1 joa.fr, 1 joalheriamaya.com.br, 1 +joanamarcalo.com, 1 joandso.com, 1 joanmoreira.tk, 1 joannadziekan.com, 1 @@ -78604,8 +78585,6 @@ joblover.ml, 1 joblyconnect.com, 1 jobmacon.com, 1 -jobmonkey.com, 1 -jobnas.com, 1 jobnmadu.com, 1 joboutlook.gov.au, 1 jobpeintre.com, 1 @@ -78623,7 +78602,6 @@ jobs4sales.ch, 1 jobscan.co, 1 jobsconnected.com, 1 -jobscope.io, 1 jobscore.com, 1 jobseeker.com, 1 jobseekeritalia.it, 1 @@ -78698,7 +78676,6 @@ joelving.dk, 0 joembayawaphotography.com, 1 joepitt.co.uk, 0 -joeran.de, 1 joerg-wellpott.de, 1 joerger.ch, 1 joergschneider.com, 1 @@ -79081,10 +79058,10 @@ jose-alexand.re, 1 jose-latino.tk, 1 jose-manuel-benito-alvarez.tk, 1 +joseantonioramos.es, 1 josebernabe.ch, 1 josedaniel.website, 1 joseenriquegonzalez.tk, 1 -joseeplamondon.com, 1 joseetesser.nl, 1 josef-lotz.de, 1 josefernandomorilloardila.tk, 1 @@ -79170,7 +79147,6 @@ jotivachurch.com.br, 1 jotoho.de, 1 jotoma.de, 1 -joubinkhorsandmd.com, 1 jouetspetitechanson.com, 1 jouleperformance.ch, 0 jouleperformance.de, 0 @@ -79178,6 +79154,7 @@ jouonline.nl, 1 jouons-aux-echecs.be, 1 jourbook.cf, 1 +jourdain.pro, 1 jourdespa.fr, 1 journal-officiel.ga, 1 journaldufumeur.ch, 1 @@ -79186,7 +79163,6 @@ journalgameest.ga, 1 journalism-schools.com, 1 journalism.org, 1 -journalismgrants.org, 1 journaliste.tk, 1 journalisticapp.com, 1 journalnow.com, 1 @@ -79202,6 +79178,7 @@ journeyrent.com, 1 journeytofi.com, 1 journeytomastery.net, 1 +journi.me, 1 jousiammuntahalli.fi, 1 joustsec.com, 1 jouw-job.nl, 1 @@ -79219,6 +79196,7 @@ joweb.co, 1 jowm-jo.com, 1 joworld.net, 0 +joy-iq.com, 1 joy-ride.yokohama, 1 joy.co.ua, 1 joy.szkola.pl, 1 @@ -79249,7 +79227,6 @@ joysinventingblog.com, 1 joystickblog.tk, 1 joywahrestaurant.com, 1 -joyz.pro, 1 jozefkvasnica.tk, 1 jozefmichalmintal.com, 1 jozefmutis.com, 1 @@ -79317,6 +79294,7 @@ jrc.cz, 1 jrc9.ca, 0 jrchaseify.xyz, 1 +jrcmo.com, 1 jreb.nl, 1 jredmond.io, 1 jreiff.de, 1 @@ -79324,6 +79302,7 @@ jrelsawy.com, 1 jrflorian.com, 1 jrfortune.com, 1 +jriffe.com, 1 jrjuristen.nl, 0 jrlopezoficial.com, 1 jrmora.com, 0 @@ -79331,7 +79310,6 @@ jrock.us, 1 jrom.net, 1 jross.me, 1 -jrrmail.com, 1 jrroofinglancs.co.uk, 1 jrrw.de, 1 jrstehlik.com, 1 @@ -79374,7 +79352,6 @@ jsg.hk, 1 jsgr.ca, 1 jsh.marketing, 0 -jsh918.com, 1 jsheard.co.uk, 1 jsheard.com, 1 jsheard.me.uk, 1 @@ -79562,7 +79539,6 @@ julia-clarete.tk, 1 julia-facon.pl, 1 julia-jones.org, 1 -julia-recipes.com, 1 julia-spriggs.fr, 1 julia.school, 1 julia0815.de, 1 @@ -79704,7 +79680,6 @@ jungleworks.com, 1 junglist.org, 1 jungschuetzen.tk, 1 -jungundwild-design.de, 1 jungyonghwa.tk, 1 juniet.net, 1 juniku.tk, 1 @@ -79880,7 +79855,6 @@ justmysocks.xyz, 1 justnajoua.tk, 1 justneworleans.com, 1 -justninja.com, 1 justnu.se, 0 justor.ru, 1 justpass.co.uk, 1 @@ -79928,7 +79902,6 @@ jvetter.net, 1 jvianes.ddns.net, 1 jvlfinance.cz, 1 -jvmcomunicacao.com.br, 0 jvn.photo, 1 jvphotoboothhire.co.uk, 1 jvspin.com, 1 @@ -79949,7 +79922,6 @@ jwds.blog, 1 jwe.nl, 1 jweditions.co.uk, 1 -jwestgrenprojects.com, 1 jwetv.com, 1 jwgarber.ca, 1 jwhite.network, 1 @@ -79991,8 +79963,8 @@ k-h-c.ru, 1 k-homes.net, 1 k-labs.be, 1 +k-larevue.com, 1 k-linkcarecenter.com, 1 -k-lol.com, 1 k-matsudaclinic.com, 1 k-moto.sk, 1 k-net.dk, 1 @@ -80043,7 +80015,6 @@ k85.app, 0 k86681.com, 1 k86690.com, 0 -k86853.com, 1 k869.co, 0 k86921.com, 0 k86930.com, 1 @@ -80180,6 +80151,7 @@ kadvi.tk, 1 kadykchanskiy.ml, 1 kadymacdonalddenton.ca, 1 +kaeme.com, 1 kaeptns-sechser.de, 1 kaeru-seitai.com, 1 kaesehagen.nl, 1 @@ -80268,6 +80240,7 @@ kaizenreporting.com, 1 kaizeronion.com, 1 kaizoku-dmc.com, 1 +kajabi.com, 1 kajak.land, 1 kajalkumar.tk, 1 kajasafe.fi, 1 @@ -80341,6 +80314,7 @@ kaliartistry.com, 1 kaliboairport.tk, 1 kaliforniya.tk, 1 +kalika.com.au, 1 kalimantan.tk, 1 kalimari.tk, 1 kalimat.gq, 1 @@ -80382,7 +80356,6 @@ kalsa.ga, 1 kalsbouncies.com, 1 kaltenbrunner.it, 1 -kaltenburg.org, 1 kalterersee.ch, 1 kaltmiete.com, 1 kaluga-news.net, 1 @@ -80516,7 +80489,6 @@ kandrive.gov, 1 kanduit.live, 1 kanduit.tech, 1 -kandwliquor.com, 1 kaneadvocates.com, 1 kaneandtrap.com, 1 kanecastles.com, 1 @@ -80526,6 +80498,7 @@ kanepes.lv, 1 kaneprod.com, 1 kanetix.ca, 1 +kanevlukaev.com, 1 kanganer.com, 1 kangaroo-bouncycastle.co.uk, 1 kangaroohost.com.br, 1 @@ -80600,6 +80573,7 @@ kaosintesta.tk, 1 kap-kirche.de, 1 kap.pe, 1 +kapa7.com, 1 kapageridis.com, 1 kapakinig.org, 1 kapamed.ro, 1 @@ -80742,7 +80716,7 @@ karlswift.com, 0 karlzotter.com, 1 karmaflux.com, 1 -karmaful.de, 1 +karmaful.de, 0 karmagroup.com, 1 karmapafoundation.eu, 1 karmaspa.se, 0 @@ -80773,7 +80747,6 @@ karramba.tk, 1 karriharju.tk, 1 karrot.world, 1 -karryfishing.com, 1 karsiyakacilingir.biz.tr, 1 karsofsystems.com, 1 karsta.de, 1 @@ -80802,6 +80775,7 @@ karudomizile.de, 1 karula.org, 0 karunasehgal.com, 1 +karvina.cz, 1 kas.ie, 1 kasad.com, 1 kasai-wks.com, 1 @@ -80831,7 +80805,6 @@ kasiafricagroup.org, 1 kasinoilmanrekisteroitymista.io, 1 kasinonetti.com, 1 -kasinopartio.com, 1 kasis.nl, 1 kaskadee.eu, 1 kaskocdn.com, 1 @@ -80958,7 +80931,6 @@ katrelleonline.tk, 1 katretter.de, 1 katrin.tk, 1 -katrina.st, 1 katrinakaifphotos.tk, 1 katrinapirie.com, 1 katrinasevilla.com, 1 @@ -80975,7 +80947,6 @@ katushka.ga, 1 katyl.info, 0 katyusha.net, 1 -katzenbrunnen-test.de, 1 katzensklave.me, 1 katzrkool.xyz, 1 kau-boys.com, 1 @@ -81014,7 +80985,6 @@ kavli-express.gr, 1 kavovary-kava.cz, 1 kavshipping.com, 1 -kavya-arora.in, 1 kawabeest.tk, 1 kawadoart.com, 1 kawaii-dollies.tk, 1 @@ -81041,6 +81011,7 @@ kayakpolouniversidades.tk, 1 kayenta.io, 1 kayentatownship-nsn.gov, 1 +kayher-kirschbluetenlauf.de, 1 kayipkiliseler.com, 1 kayisir.com, 1 kayit.co.uk, 1 @@ -81094,7 +81065,6 @@ kb1000.de, 1 kb1313.com, 1 kb16.de, 1 -kb283.com, 1 kb35.net, 1 kb38.net, 1 kb5050.com, 0 @@ -81172,7 +81142,6 @@ kdcinfo.com, 1 kdcompany.ru, 1 kde-je-skladem.cz, 1 -kdgd.de, 1 kdhealing.com, 1 kdiender.nl, 1 kdistech.nz, 1 @@ -81210,7 +81179,6 @@ kebabbruce.com, 0 kebabsanfior.it, 1 kebo.xyz, 1 -keca.ca, 1 kech-immobilier.com, 1 kecht.at, 1 keckmedicine.org, 1 @@ -81317,7 +81285,6 @@ keizeror.gov, 1 kejiben.fun, 1 kejpop.pl, 1 -kekaoxing.com, 1 kekarimi.com, 1 keke-shop.ch, 1 kekoskee.gov, 1 @@ -81505,14 +81472,12 @@ kenzelmann.name, 1 kenzie.com.br, 0 keops-spine.fr, 1 -keops-spine.us, 1 keos.ga, 1 keos.tk, 1 kep-sbt.hu, 1 kepak.tk, 1 kepkonyvtar.hu, 1 kepleruniklinikum.at, 1 -kepoper.com, 1 keppler.tk, 1 kepsbt.hu, 1 keptknowledge.com, 1 @@ -81576,7 +81541,6 @@ keschi.at, 1 kesen.news, 1 kesen.wang, 0 -keshankang.com, 1 keshankang.org, 1 keshausconsulting.com, 1 keshav.cc, 1 @@ -81614,7 +81578,6 @@ kettererholmes.tk, 1 kettinggeleider.be, 1 kettlebellspower.com, 1 -kettleworx.com, 1 kettmail.com, 1 ketto.org, 1 kettsy.com, 1 @@ -81716,6 +81679,7 @@ keymicrosystems.com, 1 keynes.id.au, 1 keyoxide.org, 1 +keypazar.tr, 1 keypers.io, 1 keyphotojs.cf, 1 keypoint.edu.au, 1 @@ -81732,6 +81696,7 @@ keystone-europe.com, 1 keystoneco.gov, 1 keystore.eu.org, 1 +keysupport.net, 1 keyth.com, 1 keytoenergy.com, 1 keytomylime.com, 1 @@ -81836,11 +81801,11 @@ khg-orchester.de, 1 khinpyonemonbatik.com, 1 khipu.com, 1 -khmb.ru, 0 khmelnitskiy-news.ru, 1 khmelnitskiynews.ru, 1 khmerios.tk, 1 khmerlive.cf, 1 +khmusic.tw, 1 khoasweb.tk, 1 khodrobaraneshiraz.com, 1 khodromedic.com, 1 @@ -82012,7 +81977,6 @@ kiinanharjakoirat.tk, 1 kiind.com.au, 1 kiiteyo.net, 1 -kijkmeaanwanneerik.com, 1 kik-computer.de, 1 kik-info.com, 1 kik-textilien.sk, 1 @@ -82041,6 +82005,7 @@ kilianvalkhof.com, 1 kiliflix.de, 1 kilimstyle.com, 1 +kilinskiego12.pl, 1 kilkennyaccountingservices.ie, 1 kilkennycoco.ie, 1 kilkimzaibu.tk, 1 @@ -82076,7 +82041,6 @@ kilpiapp.com, 1 kilte.tk, 1 kilwickit.com, 1 -kim-ariyor.com, 1 kim-coiffure.fr, 1 kim-tetzlaff.dk, 1 kima.de, 0 @@ -82158,8 +82122,6 @@ kindan.net, 1 kindapoth.com, 1 kinde.com, 1 -kinden-giankyou.jp, 1 -kinden-kizuna.com, 1 kinder-garten.tk, 1 kinderarzt-berlin-zia.de, 1 kinderarzt-traunstein.de, 1 @@ -82173,7 +82135,6 @@ kinderhaus-kunterbunt-priestewitz.de, 1 kinderhilfe-nepal-mitterfels.de, 1 kinderjugendfreizeitverein.de, 1 -kinderkleding.news, 1 kinderkrebsforschung.at, 1 kinderland.bg, 1 kindermarket.bg, 1 @@ -82253,7 +82214,6 @@ kingpie.co.za, 1 kingpin.pro, 1 kingpincages.com, 1 -kingroot.com, 1 kings-potong.com, 1 kings-world.net, 1 kingsaft.net, 1 @@ -82275,7 +82235,7 @@ kingstonma.gov, 1 kingstonsoftware.de, 1 kingstream.uk, 1 -kingsurfa.com, 1 +kingsurfa.com, 0 kingsvetcentre.com, 1 kingsvilletexas.com, 1 kingswinehaus.com, 1 @@ -82360,7 +82320,6 @@ kiokoman.eu.org, 0 kiomara.com, 1 kiomoda.com, 1 -kionetworks.es, 1 kiosbank.id, 1 kiosk.ac, 1 kioske.de, 1 @@ -82428,14 +82387,15 @@ kirs.is, 1 kirsch-gestaltung.de, 1 kirschbaum.cloud, 1 +kirschbaum.me, 1 kirsehir.tk, 1 kirsehirhaber.tk, 1 kirstenbos.ca, 1 -kirstengillibrand.com, 1 kirstenwillner.de, 1 kirstygreenwoodartist.ga, 1 kirtlandforcesupport.us, 1 kirtlandfss.tv, 1 +kirwandigital.com, 1 kisakazan.ml, 1 kisallatorvos.hu, 1 kisaragi.fund, 1 @@ -82622,7 +82582,6 @@ kkiskra.tk, 1 kkk0011.com, 0 kkk102.com, 0 -kkk104.com, 0 kkk106.com, 0 kkk109.com, 0 kkk202.com, 0 @@ -82671,6 +82630,9 @@ klart.se, 1 klasko.ru, 1 klaspas.be, 1 +klass-forklifts.ro, 1 +klass-hydrauliks.fr, 1 +klass-hydrauliks.it, 1 klassen.tk, 1 klassenfahrt-tirol.at, 1 klassiekballet.tk, 1 @@ -82759,7 +82721,6 @@ kliemann.me, 1 klik-klak.nl, 1 klikacc.com, 0 -klikajkupujonline.pl, 1 klikarnia.pl, 1 kliker.de, 1 kliki.tk, 1 @@ -82829,11 +82790,11 @@ klosetestumgebungnextcloud.de, 1 klosko.net, 1 kloster-michaelstein.de, 1 -klosto.com, 1 kloudstack.me, 0 klover-avantages.fr, 1 klover-cse.fr, 1 kloza.tk, 1 +klpl.com.sg, 1 kls-desk.com, 1 kls-platform.com, 1 kls.rs, 1 @@ -82854,7 +82815,6 @@ klushka.cf, 1 klushnikova.tk, 1 klustermedia.com, 1 -klusweb-merenwijk.nl, 1 klutchcard.com, 1 klute.spdns.de, 1 kluzza.nl, 1 @@ -82936,7 +82896,6 @@ knightcrier.org, 1 knightsblog.de, 1 knightsbridge.net, 1 -knightsbridgewine.com, 1 knightsfs.ie, 1 knightsweep.com, 0 knightway.ca, 1 @@ -82985,6 +82944,7 @@ know.cf, 1 know.domains, 1 know2protect.gov, 1 +knowage-suite.com, 1 knoware.be, 1 knowasiak.com, 1 knowbook.org, 1 @@ -83027,9 +82987,9 @@ knurses.com, 1 knuterikskare.no, 1 knuthildebrandt.de, 0 -knutselcreaties.nl, 1 knutton.org, 1 knuwiki.tk, 1 +knx-trade.ru, 1 knxstore.cz, 1 knyawningrenovation.com, 0 knzb.nl, 1 @@ -83051,6 +83011,7 @@ kobayashi-zeimukaikei.jp, 1 kobb.tk, 1 kobe-shimasui.jp, 1 +kobelco.com.ph, 1 koberl.com, 1 kobes.ca, 1 kobet.tk, 1 @@ -83148,7 +83109,6 @@ koethen-markt.de, 1 koetjesenkanker.nl, 1 koez-mangal.ch, 1 -koffer-schweiz.ch, 1 koffie-enzo.com, 1 koffiekoeken.tk, 1 koffiekompaan.nl, 1 @@ -83167,7 +83127,6 @@ kohlmajer.de, 1 kohlpharma.com, 1 kohparadise.com, 1 -kohqaf.org, 1 koidulag.edu.ee, 1 koifish.org, 1 koing.de, 1 @@ -83260,6 +83219,7 @@ komatsu-dental.jp, 1 komatsuforklift.com, 1 kombikredit.de, 1 +kombiprevoz.net, 1 kombo.lt, 1 komehyo.co.jp, 1 komelin.com, 0 @@ -83374,6 +83334,7 @@ koniag-gs.com, 1 konijnen-knaagdieren.tk, 1 konila.com, 1 +koningdrank.com, 1 koningerik.nl, 1 konings.it, 1 koningslust.tk, 1 @@ -83392,7 +83353,7 @@ kononenko.ml, 1 konopizza.at, 1 konpyuta.nl, 1 -konser.co.uk, 0 +konser.co.uk, 1 konsertoversikt.no, 1 konservy.tk, 1 konsol.pro, 1 @@ -83566,6 +83527,7 @@ korst.tk, 1 korstanjebouw.nl, 1 korstanjetimmerwerken.nl, 1 +korsvloeren.nl, 1 kortarsmagyarfesto.tk, 1 kortgebyr.dk, 1 korttipeli.com, 1 @@ -83590,6 +83552,8 @@ koshvolt.com, 1 kosinc.org, 1 kosinkai.com, 1 +koskamp.nl, 1 +koskampopleidingen.nl, 1 kosmetykifm.pl, 1 kosmiq-it.com, 1 kosmonavt.tk, 1 @@ -83624,7 +83588,6 @@ kosuzu.moe, 1 koszmetics.com, 1 kot.ae, 1 -kot.pink, 1 kotaartsklan.com, 1 kotaev.tk, 1 kotajakarta.info, 1 @@ -83654,6 +83617,7 @@ kotorimusic.ga, 1 kotoriyama.com, 1 kotrak.com, 1 +kotsilkovi.com, 1 kottbulle.net, 1 kotthaus-bs.de, 1 kottur.is, 1 @@ -83731,6 +83695,7 @@ kpmgccc.co.nz, 0 kpmgclientcollab.co.nz, 0 kpntdolive.nl, 1 +kpnthings.com, 1 kpo.fi, 0 kpop.re, 1 kpop.ro, 1 @@ -83751,7 +83716,9 @@ kr0n.dk, 1 kr1shna4garwal.com, 1 kra.ee, 0 +kra2laiz.eu, 1 kraakgeluiden.tk, 1 +kraakman.com, 1 kraavi.com, 1 krabathor.tk, 1 krabbelsisters.tk, 1 @@ -83956,7 +83923,6 @@ kristekno.com, 1 kristenpaigejohnson.com, 1 kristiescholten.com, 1 -kristieslaw.org, 1 kristina-lari.ru, 1 kristinaolsen.net, 1 kristineskitchenblog.com, 1 @@ -83981,10 +83947,7 @@ krizialim.tk, 1 krk-gaming.de, 1 krmela.com, 1 -krmeni.cz, 0 -kroanworks.be, 1 kroati.de, 1 -krock.io, 1 kroczynski.net, 1 kroell.net, 1 kroenland.at, 1 @@ -84008,7 +83971,6 @@ krona.ddns.net, 1 kronanshopping.se, 1 kronofogden.se, 1 -kronosnxs.com, 1 kronosproject.tk, 1 kronospsi.es, 1 krony.de, 1 @@ -84070,7 +84032,6 @@ kruvesh.tk, 1 krvtz.net, 1 krw-intl.com, 1 -krx1bet.com, 1 kry.no, 1 kry.se, 1 kryddveitingahus.is, 1 @@ -84156,7 +84117,7 @@ ks8218.com, 0 ks8225.com, 1 ks8265.com, 1 -ks8266.com, 0 +ks8266.com, 1 ks8278.com, 1 ks8831.com, 0 ks8915.com, 1 @@ -84240,6 +84201,7 @@ ksw.hr, 1 kswebtags.gov, 1 kswork.life, 1 +kszczot.pl, 1 kt-events.de, 1 kt-motors.com, 1 kt.pl, 1 @@ -84303,7 +84265,6 @@ kubspzoo.com.pl, 1 kubusadvocaten.nl, 1 kucharvi.cz, 1 -kuche7.com, 1 kuchen-am-stiel.de, 1 kuchennyhit.pl, 1 kuchugury.ru, 1 @@ -84344,7 +84305,6 @@ kukiulpindo.com, 1 kukla.club, 1 kukla.io, 1 -kuko-crews.org, 0 kukuklok.com, 1 kukuma.tk, 1 kukutza.tk, 1 @@ -84360,6 +84320,7 @@ kulinarika.net, 1 kulinaristi.fi, 1 kulinariya.tk, 1 +kulinarnykoneser.pl, 1 kulshe.com, 1 kultham.ml, 1 kulthist.tk, 1 @@ -84401,7 +84362,9 @@ kundenerreichen.de, 1 kundenvertrag.de, 1 kundesjekk.no, 0 +kundo.pl, 1 kundo.se, 1 +kunfu.pl, 1 kungfudirect.com, 1 kungsangen.com, 0 kungsangsgymnasiet.se, 1 @@ -84499,7 +84462,6 @@ kurserne.dk, 1 kursk-news.net, 1 kursk-news.ru, 1 -kursk-otoplenie.ru, 1 kursk.cf, 1 kurssertifikasi.com, 1 kurswahl-online.de, 1 @@ -84517,11 +84479,11 @@ kurtosys.com, 1 kurtschlatzer.com, 1 kurtschleinbeck.com, 1 -kurumsalsayfa.com, 1 kurungkurawal.id, 1 kuruppa.xyz, 1 kuruyo.com, 1 kurvysf.com, 1 +kurz.onl, 1 kurz.pw, 1 kurzly.de, 1 kurztrip-fuer-verliebte.de, 0 @@ -84547,7 +84509,6 @@ kustvissen.tk, 1 kusunokitomori.com, 1 kutahyaciniyapitasarim.com.tr, 1 -kutahyaelcincicek.com, 1 kutaisi.it, 1 kutalek.cz, 1 kutano.ca, 1 @@ -84584,7 +84545,7 @@ kvalita-1a.cz, 0 kvalitetsaktiepodden.se, 1 kvalitetskatalog.tk, 1 -kvanli.com, 1 +kvanli.com, 0 kvapay.com, 1 kvarta.tk, 1 kvartira-grad.tk, 1 @@ -84622,6 +84583,7 @@ kwai.tv, 1 kwalifikacje.gov.pl, 1 kwanafo.space, 1 +kwattz.ai, 1 kwc.gov, 1 kwcolville.com, 1 kweb.ml, 1 @@ -84710,7 +84672,6 @@ kylvaja.fi, 1 kymcojp.com, 1 kymecon.fi, 1 -kyn.be, 1 kynaston.org.uk, 1 kynastonwedding.co.uk, 1 kyncostyle.com, 1 @@ -84745,7 +84706,6 @@ kyujin-office.net, 1 kyushu-ds.com, 1 kyusyu.org, 1 -kyxtro.com, 1 kyzyl-senir.ml, 1 kz-dentalclinic.com, 1 kz.search.yahoo.com, 0 @@ -84777,7 +84737,6 @@ l2news.ga, 1 l2relax.ml, 1 l2support.tk, 1 -l33roy.com, 1 l33te.net, 1 l36533.com, 1 l3limo.com, 1 @@ -84799,7 +84758,6 @@ la-boutique-langlois.fr, 1 la-boutique-web.com, 1 la-casa.tk, 1 -la-compagnie-des-elfes.fr, 1 la-dameblanche.fr, 1 la-grande-jaugue.fr, 1 la-kaz-a-velo.fr, 1 @@ -84823,7 +84781,6 @@ laatikko.io, 1 lab-advancedservicesportal.com, 1 lab-oborud.com, 1 -lab-ratz.com, 1 lab-recherche-environnement.org, 1 lab-test.ru, 1 lab9pro.be, 1 @@ -84917,7 +84874,6 @@ labscon.io, 1 labsector.com, 1 labsitserviss.lv, 1 -labsys.xyz, 1 labtalleraudiovisual.tk, 1 labwebplus.com, 1 labworking.lt, 1 @@ -84945,16 +84901,17 @@ lacaveducinquantenaire.com, 1 lacaverna.net, 1 lacazadora.tk, 1 -lacebeauty.it, 0 laceleste.it, 1 lacentral.com, 0 lacera.gov, 1 lacfm.cf, 1 lachainedesentrepreneurs.fr, 1 lachaussettedebrasparts.fr, 0 +lachispadetucuriosidad.es, 1 lachlan-harris.com, 1 lachlanb.me, 1 lachner.cloud, 1 +lachowicz.link, 1 lachyoga-schwieberdingen.de, 1 laciana.tk, 1 lacicloud.net, 1 @@ -84963,7 +84920,6 @@ lackan.tk, 1 lacker-baugutachten.de, 1 lackfer.tk, 1 -lackierereischmitt.de, 1 lackinflaveis.com.br, 1 lacledelareussite.com, 0 lacledeslan.com, 1 @@ -85021,7 +84977,6 @@ ladinvestment.ml, 1 ladisko.tk, 1 ladislav-antos.cz, 1 -ladislavbrezovnik.com, 0 lado.ltd, 1 lado.site, 1 ladobe.com.mx, 1 @@ -85111,6 +85066,7 @@ lafeepraline.fr, 1 lafelguera.net, 1 lafermegourmande.fr, 1 +laferreteriaonline.es, 1 laffacake.com, 1 laffer.tk, 1 laffgaff.com, 1 @@ -85125,7 +85081,7 @@ lafr4nc3.xyz, 1 lafraia.com, 1 lafraia.com.br, 1 -lafraise.pro, 1 +lafraise.pro, 0 lafrenchtech.com, 1 lafsc.co.uk, 1 lafuriadelguardiancelta.tk, 1 @@ -85139,10 +85095,9 @@ lagardere-tr.it, 1 lagardere-tr.ro, 1 lagavach.com, 1 -lagence.ch, 1 lagencerie.fr, 1 +lagera-m-residence.com, 1 lagerauftrag.info, 0 -lagerraum-mieten-berlin.com, 1 laget.com.ua, 1 laget.se, 1 laghiinitalia.com, 1 @@ -85241,7 +85196,6 @@ lakemary-doctor.com, 1 lakemillsiowa.gov, 1 lakenakurukenya.com, 1 -lakenheathfss.marketing, 1 lakenheathfss.support, 1 lakeofflowers.com, 1 lakepoint.gov, 1 @@ -85388,6 +85342,7 @@ lampsh.ml, 1 lampsi.ru, 1 lampyiswiatlo.pl, 1 +lamsa.com.mx, 1 lamsa.tk, 1 lamscommunity.org, 1 lamudi.ga, 1 @@ -85469,7 +85424,6 @@ landofelves.net, 0 landofmerlin.tk, 1 landoftherisingson.com, 0 -landoftile.com, 1 landolakeswi.gov, 1 landoncreekapartments.com, 1 landonkhull.ddns.net, 1 @@ -85489,7 +85443,6 @@ landscaping.gq, 1 landscapingipswich.com, 1 landscapingrepairers.ga, 1 -landschaftsbaugartenbau.de, 1 landsearch.com, 1 landsforsale.co.il, 1 landslide.tk, 1 @@ -85511,7 +85464,7 @@ langadeduero.tk, 1 langages-programmation.tk, 1 langapi.com, 1 -langatang.com, 0 +langatang.com, 1 langauto.hu, 1 langbein.org, 1 langemensen.be, 1 @@ -85611,7 +85564,6 @@ lapakmaboy.com, 1 lapaksulawesi.tk, 1 lapakus.com, 1 -lapapeleriadelola.com, 1 laparcela.tk, 1 laparoscopyhospital.com, 1 lapasticcerianaturale.store, 1 @@ -85637,12 +85589,13 @@ lapinmalin.tk, 1 lapismagico.com, 1 lapix.com.co, 1 -laplace.chat, 0 +laplace.chat, 1 laplace.cn, 1 laplace.live, 1 laplace.network, 1 laplace.properties, 1 lapland.shop, 1 +laplandtouristtroupers.se, 1 laplanificadora.com, 1 laplanquedujoueur.com, 1 laplasadalsol.tk, 1 @@ -85730,7 +85683,6 @@ larimer.gov, 1 larimercolorado.gq, 1 lariver.org, 1 -larkbury.com, 0 larkenshine.com, 1 larkeydesign.com, 1 larkinkerluke.cf, 1 @@ -85749,7 +85701,7 @@ larry.buzz, 1 larryandprisca.it, 1 larryli.cn, 1 -larryshoyfer.com, 1 +larryshoyfer.com, 0 larrywalshe.com, 1 lars-ewald.com, 1 lars-kusch.de, 1 @@ -85800,6 +85752,7 @@ laserena.tk, 1 lasereyess.net, 1 lasergaver.dk, 1 +lasergundesign.nl, 1 laserhealthsolutions.com, 1 laserpigeon.nz, 1 laserplaza.de, 1 @@ -85900,6 +85853,7 @@ latelatetoyshow.ie, 1 lateliercantaldeco.fr, 1 lateliercreationbougie.fr, 1 +latelierdeletice.com, 1 latemarch.com, 1 laten.tk, 1 latenitefilms.com, 0 @@ -85973,7 +85927,6 @@ laudablesites.com, 1 laudlab.de, 1 laudon.nl, 0 -lauerz.online, 1 laufpix.de, 1 lauftreff-himmelgeist.de, 0 laughingelkstudio.com, 1 @@ -85988,6 +85941,7 @@ launchfinderest.ga, 1 launchpad-app2.com, 1 launchpadder2.com, 1 +launchpadwebdesigns.com, 1 launchwithjp.com, 1 laundrylessonsers.ga, 1 laundrylessonsest.ga, 1 @@ -86038,7 +85992,6 @@ lauxincost.cf, 1 lauzon-hitter.com, 1 lava.moe, 1 -lava.ninja, 1 lavabit.com, 1 lavabit.no, 1 lavaggio.it, 1 @@ -86060,7 +86013,6 @@ laventura.tk, 1 laventusdigital.co.uk, 1 lavhire.tk, 1 -laviaregia.com, 1 laviedalex.ovh, 1 lavinaec.com, 1 lavinya.net, 1 @@ -86180,7 +86132,7 @@ lawzana.com, 1 lawzava.com, 1 laxaf.com, 1 -layabe.com, 1 +laxmistudio.art, 1 layalli.bg, 1 layazc.com, 1 laycock.org.uk, 1 @@ -86193,7 +86145,6 @@ laymans911.info, 1 layoutsatzunddruck.de, 1 layt.org, 1 -laythetable.com, 1 layxw.com, 1 lazarev.agency, 1 lazarusalliance.com, 1 @@ -86236,14 +86187,13 @@ lbc.gr, 1 lbi-pg.fr, 1 lbiarchpro-imagery.at, 1 -lbio.nl, 1 +lbio.nl, 0 lbj.tw, 1 lbjlibrary.gov, 1 lblok.pl, 1 lbls.me, 0 lbo.management, 1 lbofrance.com, 1 -lbpc.pro, 0 lbrlh.tk, 1 lbrli.tk, 1 lbrls.tk, 1 @@ -86295,7 +86245,6 @@ lc8c.com, 1 lc8guidance.com, 1 lc9108.com, 1 -lc98.net, 1 lc9852.com, 1 lc9899.com, 1 lc9900.com, 1 @@ -86363,7 +86312,6 @@ lcx.cc, 1 lcy.cat, 1 lcy.moe, 1 -ld-begunjscica.si, 1 lda-design.co.uk, 1 ldcraft.pw, 1 lddr.io, 1 @@ -86431,7 +86379,6 @@ leadgenie.me, 1 leadinforce.com, 1 leadingagile.com, 1 -leadingbytype.com, 1 leadiq.com, 1 leadnxt.co.in, 1 leadnxt.com, 1 @@ -86451,7 +86398,7 @@ leafans.tk, 0 leafbodhi.com, 1 leafcreations.org, 1 -leafext.de, 1 +leafext.de, 0 leafinote.com, 1 leafletdistributionmanchester.com, 1 leafly.ca, 1 @@ -86491,6 +86438,7 @@ leaodarodesia.com.br, 1 leapandjump.co.uk, 1 leapday.us, 1 +leapevent.tech, 1 leapworks.io, 1 leapzonestrategies.com, 1 lear.com.br, 1 @@ -86867,6 +86815,7 @@ legalsearch.nl, 1 legalsoldier.ga, 1 legalsouthbeach.ga, 1 +legalspace.ai, 1 legalsrit.tk, 1 legalsustain.ga, 1 legalthunder.ga, 1 @@ -86906,7 +86855,6 @@ legioiedifrancy.com, 1 legion.ge, 1 legioniv.org, 1 -legionpcservices.uk, 1 legions.tk, 1 legionwood.tk, 1 legiscontabilidade.com.br, 1 @@ -87011,6 +86959,7 @@ lekue.com, 1 lel.lol, 1 leladesign.it, 1 +lele.co.id, 1 lelehei.com, 1 leleimports.store, 1 leleviagens.com.br, 1 @@ -87032,7 +86981,6 @@ lemasdupalus.com, 1 lematelas.fr, 1 lemay.ai, 1 -lemayinfotech.com, 1 lemazol.fr, 1 lemberg.ml, 1 lemco.dk, 1 @@ -87073,7 +87021,6 @@ lenagroben.de, 1 lenalio.fr, 1 lenamorino.net, 1 -lenaneva.ru, 0 lenardoips.tk, 1 lenasophie.net, 1 lence.net, 1 @@ -87147,17 +87094,16 @@ lents.xyz, 1 lentuo.com, 1 lentusaudio.nl, 0 +lentware.com, 1 lenuagebauche.org, 1 lenumerozero.info, 1 lenyip.com, 1 lenyip.works, 1 leo-boutique.fr, 1 leo-music.tk, 1 -leo-translate.com.ua, 1 leo.gov, 1 leoandpeto.com, 1 leob.in, 0 -leoburnett.com, 1 leocollo.com, 1 leodraxler.at, 1 leoj.de, 1 @@ -87222,6 +87168,7 @@ leotrepp.org, 1 leovanna.co.uk, 1 lep.gov, 1 +lepalierjuridique.com, 1 lepartiecomemoracoes.com.br, 1 lepat.es, 1 lepatch.jp, 1 @@ -87331,7 +87278,7 @@ lesminimondes.fr, 1 lesmobiles.com, 1 lesnet.co.uk, 1 -lesnoticiesdensergialarcon.site, 1 +lesnoticiesdensergialarcon.site, 0 lesours.in, 1 lesparqueteurs.xyz, 1 lespasseursdelivres.fr, 1 @@ -87444,6 +87391,7 @@ letsweel.com, 1 lette.tk, 1 letterbox-online.de, 1 +letterlater.org, 1 letterrill.gq, 1 letters.nl, 1 lettersblogatory.com, 1 @@ -87472,6 +87420,7 @@ leuldeaur.ro, 1 leulu.com, 1 leuname.co.uk, 1 +leundt.com, 1 leusemiamusic.tk, 1 leuthardtfamily.com, 1 leutholdgroup.com, 1 @@ -87497,6 +87446,7 @@ levelsoft.ml, 1 levelum.com, 1 levelupdisability.com.au, 1 +levelupgolf.ca, 1 leveluppcasino.com, 1 leveluprankings.com, 1 levelx.team, 1 @@ -87514,6 +87464,7 @@ leviathanstory.tk, 1 levico.tk, 1 levidromelist.com, 1 +levincc.com, 1 levinholidaypark.co.nz, 1 levis.fun, 1 levis.name, 1 @@ -87588,12 +87539,10 @@ lexjunkie.xyz, 1 lexmedia.ro, 1 lexmondcommunications.com, 1 -lexoh.com, 0 lexopen.dk, 1 lexpartsofac.com, 1 lexpert.ca, 1 lexplicite.fr, 1 -lexpredict.com, 1 lexreception.com, 1 lexreporter.com, 1 lexreporter.info, 1 @@ -87620,6 +87569,7 @@ lezdombliss.com, 1 lezdomsm.com, 1 lezen.tk, 1 +leziblog.com, 1 lezzetyurdu.com.tr, 1 lfashion.eu, 1 lfasiallc.com, 1 @@ -87633,7 +87583,6 @@ lfmosqueira.com.br, 1 lfn.moe, 1 lfnaturopathie.com, 1 -lforla.org, 1 lforum.tk, 1 lfrconseil.com, 1 lfyhokk.tk, 1 @@ -87761,7 +87710,6 @@ liberalis.tk, 1 liberals-mauritania.org, 1 liberapay.com, 1 -liberategrace.com, 1 liberatingstructures.nl, 1 liberation2020.com, 1 liberationgroup.com, 1 @@ -87784,6 +87732,7 @@ libertis.ga, 1 liberty-city.tk, 1 liberty-host.tk, 1 +liberty-med.ru, 1 liberty-univers.art, 1 liberty-universe.art, 1 liberty.co.uk, 1 @@ -87795,7 +87744,7 @@ libertyga.tk, 1 libertygrovewi.gov, 1 libertyhillssewer.gov, 1 -libertyhomesavings.com, 1 +libertyhomesavings.com, 0 libertylakewapd.gov, 1 libertyland.tk, 1 libertylondon.com, 1 @@ -87845,7 +87794,6 @@ libravatar.org, 1 librazy.org, 1 libre-innovation.org, 1 -libre-service.de, 1 libre.cr, 1 libre.net.au, 1 libre.university, 1 @@ -87936,6 +87884,7 @@ lide.eu, 1 lidel.org, 1 lidepla.com, 1 +lidergreen.pl, 1 lidernaturascarlettbados.com, 1 liderok.tk, 1 lidhedredovisning.se, 1 @@ -88088,6 +88037,7 @@ liftagacademy.com, 1 liftbleskspb.ru, 1 liftedpixel.net, 1 +liftgiving.com, 1 liftie.info, 1 lig.ink, 0 liga.am, 1 @@ -88140,6 +88090,7 @@ lightsinmotion.nl, 1 lightsouts.com, 1 lightsoverlapland.com, 1 +lightspeedta.co, 1 lightsproject.com, 1 lightstands.xyz, 1 lightupcollective.co.uk, 1 @@ -88217,7 +88168,6 @@ lilicloth.com, 1 lilidarcek.sk, 0 lilie.fr, 1 -lilievabien.fr, 1 lilighazaryan.tk, 1 lilimusic.tk, 1 lilisg.tk, 1 @@ -88299,6 +88249,7 @@ limitbreak.com, 1 limitdropers.ga, 1 limitdropest.ga, 1 +limitedcolombia.co, 1 limitededitioncomputers.com, 1 limitededitionsolutions.com, 1 limitlessbridal.co.uk, 1 @@ -88350,7 +88301,6 @@ lincolncountysheriffok.gov, 1 lincolncountytn.gov, 1 lincolncountywy.gov, 1 -lincolnfinewines.com, 1 lincolnil.gov, 1 lincolnimps.tk, 1 lincolnmoneyman.com, 1 @@ -88429,6 +88379,7 @@ linext.cn, 0 linfamilygc.com, 1 linge-ma.ro, 1 +lingerie-coquine.fr, 1 lingerie.com.br, 1 lingeriebym.nl, 1 lingeriecollect.ga, 1 @@ -88455,6 +88406,7 @@ linhaoyi.com, 0 linherest.tk, 1 linhua.org, 1 +linie1629.nl, 1 linium.duckdns.org, 1 linjerry.tk, 1 link-group.tk, 1 @@ -88465,6 +88417,7 @@ link-medital.com, 1 link-net.ga, 1 link.com, 1 +link.ke, 1 link.mw, 1 link.vg, 1 link24.tk, 1 @@ -88529,7 +88482,6 @@ linksmatrix.tk, 1 linksol-inc.com, 1 linkspace.tk, 1 -linksphotograph.com, 1 linkss.express, 1 linkst.co, 0 linkstaffing.com, 1 @@ -88550,8 +88502,8 @@ linky.tk, 1 linkycat.com, 1 linlemon66.com, 1 -linmago.com, 1 linmania.tk, 1 +linmarka.com, 1 linnaclinic.com, 1 linnaeusgroup.co.uk, 1 linncfs.top, 1 @@ -88711,6 +88663,7 @@ liq.com.br, 1 liqd.net, 1 liqiuyu.com, 1 +liqourltd.com, 1 liqueur.wiki, 1 liquid.cz, 1 liquid.network, 1 @@ -88935,7 +88888,6 @@ littlenicky.org, 1 littlenina.nz, 0 littleorangecookbook.com, 1 -littleorchardpreschool.us, 1 littlepigcreek.com.au, 1 littlepincha.fr, 0 littleqiu.net, 1 @@ -88952,6 +88904,8 @@ littlesouls.ml, 1 littlesouthafrica.co.uk, 1 littlestars.bg, 1 +littlestepsbehaviortherapy.com, 1 +littlesteve.es, 1 littletigerchinese.com, 1 littlewatcher.com, 1 littleyokohamakennel.tk, 1 @@ -89009,6 +88963,7 @@ live8899.net, 1 live9922.com, 1 liveachievers.tk, 1 +liveagent.com, 1 livealarm.com, 1 liveandalucia.es, 1 liveanimations.org, 1 @@ -89087,6 +89042,7 @@ livetilesglobal.com, 1 livetopknigi.gq, 1 livetoride.co.za, 1 +livetouring.org, 0 livetune.jp, 1 livetvuk.uk, 1 liveutifree.com, 1 @@ -89121,7 +89077,6 @@ livingthetech.com, 1 livingtoxfree.com, 1 livingwithchange.org, 1 -livingworduk.org, 1 livinkitchen.tk, 1 livive.com, 1 livli.cz, 1 @@ -89131,6 +89086,7 @@ livnev.xyz, 1 livogeva.dk, 1 livornonellarete.tk, 1 +livornoportopulitoaps.org, 1 livornotoday.it, 1 livrariacoad.com.br, 1 livrariaideak.com.br, 1 @@ -89153,7 +89109,6 @@ lizagalore.tk, 1 lizaminnelli.tk, 1 lizardsystems.com, 1 -lizcarter.com, 1 lizcheney.com, 1 lizeal.tk, 1 lizheng.de, 1 @@ -89196,6 +89151,7 @@ lknw.de, 1 lkp111138.me, 1 lksoft.cz, 1 +lkw-faehren-buchen.de, 1 lkwmodellbau.at, 1 ll-vt.de, 1 ll5197.co, 1 @@ -89220,6 +89176,7 @@ llemoz.com, 1 llinck.fr, 1 llinternational.tk, 1 +llkterraplanagem.com.br, 1 lloretparty.de, 1 lloyd-day.me, 1 lloydrogerspencer.com, 1 @@ -89322,17 +89279,14 @@ loc-gauthier.fr, 1 loca-voiture.fr, 1 locabir.cf, 1 -locadeco.fr, 1 locadoraequiloc.com.br, 1 local-insight.com, 1 local-shop.com, 1 -local360.net, 1 localassocier.tk, 1 localbandz.com, 1 localbiketrader.com, 1 localbitcoins.com, 1 localblitz.com, 1 -localbouncycastle.com, 1 localcdn.org, 1 localcryptos.com, 1 locald.at, 1 @@ -89392,6 +89346,7 @@ locations-casuniv.fr, 1 locations.tk, 1 locationsiledyeu.fr, 1 +locationtech.org, 1 locationvoitureallemagne.com, 1 locationvoitureangleterre.com, 1 locationvoitureaustralie.com, 1 @@ -89541,7 +89496,6 @@ logfile.ch, 1 logfro.de, 1 logfurnitureplace.com, 1 -logheavenvt.com, 1 logic8.ml, 1 logical-invest.com, 1 logicalis.com, 1 @@ -89610,7 +89564,6 @@ logoesun.com, 1 logofiyati.com, 1 logoglo.com, 1 -logohouten.nl, 1 logolabben.cf, 1 logolando.tk, 1 logomarket.jp, 1 @@ -89662,7 +89615,6 @@ lojabeeways.com.br, 1 lojabrandelero.com.br, 1 lojabrother.com, 1 -lojadafloresta.pt, 0 lojadamimo.com.br, 1 lojadanidrea.com.br, 1 lojadarenda.com.br, 1 @@ -89738,7 +89690,7 @@ loli.net, 1 loli.ovh, 1 loli.pet, 1 -loli.sale, 0 +loli.sale, 1 loli.world, 1 loliblogs.cf, 1 loliblogs.ga, 1 @@ -89833,7 +89785,6 @@ londonukbasedvipcloseprotectionbodyguardservices.com, 1 londonvetspecialists.vet, 1 londonwomensclinic.com, 1 -londynka.pl, 1 lone-gunman.be, 1 lone-wolf.tk, 1 lonecesitope.com, 1 @@ -89871,6 +89822,7 @@ long68.net, 0 long688.com, 0 long8032.com, 1 +longb.com.br, 1 longbeachms.gov, 1 longbeachroleplay.de, 1 longbridge.hk, 1 @@ -89932,7 +89884,6 @@ lookagain.co.uk, 1 lookandfin.com, 1 lookasik.eu, 1 -lookastic.es, 1 lookathernow.com, 1 lookatmysco.re, 1 lookflyfares.com, 1 @@ -89953,6 +89904,7 @@ loop.com, 0 loop.us, 1 loopback.kr, 1 +loopbackanalytics.com, 1 loopcore.de, 1 loopgolf.co, 0 loophq.com, 1 @@ -89962,7 +89914,6 @@ loopool.tk, 1 loopseque.com, 1 looseleafsecurity.com, 1 -lootboxy.com, 0 lootboy.com, 1 lootboy.de, 1 lootdog.io, 1 @@ -89997,6 +89948,7 @@ loracheadle.com, 1 loraincountyohio.gov, 1 loraincountyrecorder.gov, 1 +lorasong.com, 1 loratadine10mg.gq, 1 lorbooks.tk, 1 lorcamadrid.tk, 1 @@ -90014,7 +89966,6 @@ lordgeorgeanson.com, 1 lordgrant.tk, 1 lordkrishna.tk, 1 -lordlink.net, 1 lordmusic.tk, 1 lordofcbd.fr, 1 lordofthecraft.tk, 1 @@ -90051,7 +90002,6 @@ lorn.tk, 1 lornabenes.com, 1 lornategeorge.tk, 1 -lornosa.com, 1 lorqui.tk, 1 lorrainehamilton.net, 1 lorucreative.fi, 1 @@ -90107,7 +90057,7 @@ losnervios.tk, 1 loson.cz, 1 losopkos.tk, 1 -lospadillas.com, 1 +lospadillas.com, 0 lospadrinosmagicos.tk, 1 lospegotes.tk, 1 lospozuelos.tk, 1 @@ -90299,6 +90249,7 @@ lovecsnov.tk, 1 lovedaleschool.tk, 1 lovedicas.com.br, 1 +lovedictionary.net, 1 lovedutch.tk, 1 lovefoodhatewaste.com, 1 lovefrankie.co, 1 @@ -90306,6 +90257,7 @@ lovehairstyles.com, 1 loveherass.com, 1 loveholidays.com, 1 +loveholidays.ie, 1 loveinabox.pt, 1 loveincmag.com, 1 loveismore.pl, 0 @@ -90393,6 +90345,7 @@ lowerthetone.com, 1 lowesprotect.com, 1 lowlab.io, 1 +lowlandrp.com, 1 lowlevelmusic.com, 1 lowmagnitude.com, 1 lowndes-al.gov, 1 @@ -90401,7 +90354,6 @@ lowtempind.com, 1 lowthiandesign.com, 1 lowvarates.com, 1 -loyaleco.it, 1 loyaliplaw.com, 1 loyaltech.ch, 1 loyaltech.tk, 1 @@ -90498,7 +90450,6 @@ lspdonline.gq, 1 lsquared.com, 1 lsrm.org, 1 -lstimelapses.com.br, 1 lstma.com, 1 lstu.tk, 1 lsupg.com, 1 @@ -90532,7 +90483,6 @@ ltonlinestore.in, 0 ltransferts.com, 1 ltrickett.com, 1 -ltx-dev.com, 1 ltxhost.org, 1 lty.best, 1 lty.name, 1 @@ -90608,7 +90558,8 @@ lucidlabs.in, 1 lucidoccult.com, 1 lucidplumbing.com.au, 1 -lucidya.com, 1 +lucidseal.org, 1 +lucidya.com, 0 lucie-parizkova.cz, 1 lucielavickova.com, 1 lucieradosinska.cz, 1 @@ -90645,7 +90596,7 @@ luckyemail.ml, 1 luckyfeel.com, 1 luckyfrog.hk, 1 -luckyhours.xyz, 1 +luckyhours.xyz, 0 luckymice.ml, 1 luckynorthcasino.com, 1 luckyrent.tk, 1 @@ -90802,7 +90753,7 @@ luls.tk, 1 lulu960.xyz, 1 luludapomerania.com, 1 -lulugold.ba, 1 +luluwoldtravel.com, 1 lumaesthetic.co.uk, 1 lumafestival.com, 1 lumaistore.com.br, 1 @@ -90858,7 +90809,6 @@ lunaclan.tk, 1 lunacraft.ga, 1 lunadea.tk, 1 -lunafreyaxv.com, 1 lunagrill.com, 1 lunair.fr, 1 lunakit.org, 1 @@ -90884,6 +90834,7 @@ luncfreak.com, 1 lunch-pilot.de, 1 lund.se, 1 +lundax.com, 1 lundchoralfestival.org, 1 lundia.se, 1 lundlist.net, 1 @@ -90895,9 +90846,9 @@ lunenburgva.gov, 1 lunepieters.co.za, 1 lunextd.com, 1 +lungenexperte.at, 1 lungta.pro, 1 lunguflorin.ro, 1 -lungustefan.com, 1 lungustefan.ro, 1 luniak.net, 1 lunight.ml, 1 @@ -90917,6 +90868,7 @@ luoh.me, 1 luohua.im, 1 luojan.com, 1 +luoli.uno, 1 luoliguan10.com, 1 luoliguan11.com, 1 luoliguan12.com, 1 @@ -90972,7 +90924,6 @@ lustgarten.org, 1 lustigetweets.at, 1 lustkar.com, 1 -lustnerd.com, 1 lustrecloud.art, 1 lusynth.com, 0 lutarym-romane.de, 1 @@ -90999,7 +90950,6 @@ luvdress.com, 1 luve-gm.ch, 1 luvey.com, 1 -luviantrade.com.ec, 1 luvmihome.com, 1 luvscent.com, 1 lux-house.tk, 1 @@ -91026,8 +90976,10 @@ luxhome.tk, 1 luxinfine.su, 1 luxmedprotez.com, 0 +luxoestates.com, 1 luxonengineering.com, 1 luxonmx.com, 1 +luxory.ro, 1 luxosemimos.com.br, 1 luxoticlingerieandswimwear.com, 0 luxplay.com.tw, 1 @@ -91162,7 +91114,6 @@ lyngvaer.no, 1 lynho.com.br, 1 lynk.hopto.org, 1 -lynki.eu, 1 lynkmi.com, 1 lynkr.org, 1 lynkrtech.com, 1 @@ -91225,6 +91176,8 @@ lz.lv, 1 lz.sb, 1 lz233.ac.cn, 1 +lzahir.com, 1 +lzahir.net, 1 lzcreation.com, 1 lzqii.cn, 1 lzwwebsite.tk, 1 @@ -91545,6 +91498,7 @@ maderaslamision.com, 1 madethis.site, 1 madetosave.org, 1 +madewellwoodworks.com, 1 madewithcollab.com, 1 madewithopendata.org, 1 madge.tk, 1 @@ -91576,6 +91530,7 @@ madluging.tk, 1 madmasters.tk, 1 madmaxstore.it, 1 +madmbrasil.com.br, 1 madmoizelle.com, 1 madnetwork.org, 1 madobe.tk, 1 @@ -91729,7 +91684,7 @@ mager.org, 1 magesaigon.com, 1 magescobd.com, 1 -magesy.blog, 1 +magesy.blog, 0 magesypro.com, 1 magewell.nl, 1 maggianos.com, 1 @@ -91768,6 +91723,7 @@ magicgrants.org, 1 magiciansofchaos.tk, 1 magicjudges.org, 1 +magickery.com, 1 magickmale.de, 1 magiclen.org, 1 magicline.com, 1 @@ -91797,7 +91753,6 @@ magiskzip.com, 1 magisterjuris.com, 0 magisternegi.tk, 1 -magistralesdigitales.com, 1 maglaw.com, 1 magliner.com, 1 magna-carta.co.za, 1 @@ -91822,6 +91777,10 @@ magneticanvil.com, 1 magneticarrow.com, 1 magneticattraction.com.au, 1 +magneticone.com, 1 +magneticone.org, 1 +magneticonemobile.com, 1 +magneticonemt.com, 1 magneticspringsoh.gov, 1 magnetoai.com, 1 magnetoscopio.tk, 1 @@ -91871,7 +91830,7 @@ magwin.co.uk, 1 magyarepitok.hu, 1 mah-nig.ga, 1 -mah24.com, 0 +mah24.com, 1 mahabharat.tk, 1 mahadhanconnect.com, 1 mahadihasan.cf, 1 @@ -91938,7 +91897,6 @@ maie.ro, 1 maiebanatulfruncea.com, 1 maierteamre.com, 1 -maiet.net, 1 maigesellschaft-lammersdorf.de, 1 maijia800.com, 1 maikendener.com, 1 @@ -91951,6 +91909,7 @@ mail-routing.net, 1 mail-settings.google.com, 1 mail-signatures.com, 1 +mail-usa.com, 1 mail.ch, 1 mail.co.uk, 1 mail.com, 1 @@ -92047,7 +92006,6 @@ mainfrankentheater.de, 1 mainhattan-handwerker.de, 1 mainhuyahan.tk, 1 -mainlandapp.cn, 1 mainlined.org, 1 mainroller.de, 1 mainsec.de, 1 @@ -92089,12 +92047,12 @@ maison-coutin.com, 1 maison-du-mineur.com, 1 maison-eureka.fr, 1 +maison2com-event.fr, 1 maisondelafigue.com, 1 maisondepax.com, 1 maisondidon.com, 1 maisonkobe.fr, 1 maisonmere.group, 1 -maisonpourtous.ca, 1 maisonrouge-musee.fr, 1 maisonsdenfrance-cls.fr, 1 maisonstpaul.fr, 1 @@ -92110,6 +92068,7 @@ maitrelucas.fr, 1 maitrise-orthopedique.com, 1 maitum.de, 1 +maiyuanwei.com, 1 maizeks.gov, 1 maizuru-ongaku-kan.com, 1 majahesjedal.no, 1 @@ -92122,7 +92081,6 @@ majavucic.com, 1 majelisriyadhah.com, 1 majemedia.com, 1 -majesnix.org, 1 majestas.tk, 1 majestic.games, 0 majesticpride.in, 1 @@ -92152,7 +92110,7 @@ makatala.com, 1 make-a-difference-daily.com, 1 make-my-link-longer.ml, 1 -make-tatsuta.co.jp, 1 +make-tatsuta.co.jp, 0 make.org, 1 make50aday.tk, 1 makeacrowd.eu, 1 @@ -92204,6 +92162,7 @@ makeupillusion.com, 1 makeuplove.nl, 1 makeuppleasure.it, 1 +makeupstoremx.com, 1 makeurbiz.com, 1 makeurl.ml, 1 makeus.tk, 1 @@ -92323,15 +92282,16 @@ malibuexteriorlighting.com, 1 malibulingerie.com, 1 malibumodas.com.br, 1 -maliceinnandtavern.com, 1 maliciousdeath.tk, 1 malicis.com, 0 +malik.holdings, 1 malik.id, 1 malik.my.id, 1 malik.web.id, 1 malikcomputers.tk, 1 malikdeenarislamicacademy.tk, 1 malikmobile.com, 1 +malikussa.id, 1 malikussaid.com, 1 malikussaid.my.id, 1 malikussaid.web.id, 1 @@ -92339,6 +92299,7 @@ malinaclub.com, 1 malinheadview.ie, 1 malinmethod.com, 1 +malirstvimh.cz, 1 malisheva-blog.cf, 1 malisheva-blog.ga, 1 maliweb.ml, 1 @@ -92360,8 +92321,6 @@ malletsheetmetal.com, 0 mallgastronomico.com.ar, 1 mallhabana.com, 1 -mallinckrodt.com, 1 -mallofit.com, 1 mallonline.com.br, 1 mallorca.tk, 1 mallorca2024.com, 1 @@ -92384,7 +92343,6 @@ malte.gg, 1 maltegegner.de, 0 malu.style, 1 -malura.de, 1 malvinas-falklands.tk, 1 malvy.kiev.ua, 1 malware.lu, 1 @@ -92395,7 +92353,6 @@ malwarewise.com, 1 malwarez.xyz, 1 malworld.me, 1 -malynovskyi.com, 1 malypiesekzuzi.pl, 1 mamabatataya.com, 1 mamabearbabywear.com, 1 @@ -92437,7 +92394,6 @@ mammooc.org, 1 mammothimaging.com, 1 mammothlakesmls.net, 1 -mammothmtnproperties.com, 1 mammothpublishing.org, 1 mamodsteam.tk, 1 mamohe.de, 1 @@ -92465,6 +92421,8 @@ manageairlinesbooking.com, 1 managed-it.africa, 1 managed-it.co.za, 1 +managed-service-provider.co.uk, 1 +managededv.ch, 1 managedhosting.de, 0 managedserver.it, 1 managedservicesraleighnc.com, 1 @@ -92492,6 +92450,7 @@ manbetx1998.live, 1 manboy.tk, 1 mancaverevolution.com, 1 +manchester.enf.br, 1 manchestermn.gov, 1 manchestermoneyman.com, 1 manchestertechservices.co.uk, 1 @@ -92515,7 +92474,6 @@ mandraravnogor.com, 1 mandraveselie.com, 1 mandynamic.gr, 1 -mandysbeautysupply.com, 1 manegehenriet.tk, 1 manegestalflicka.tk, 1 maneggio.milano.it, 1 @@ -92541,6 +92499,7 @@ manga-passion.de, 1 manga-republic.com, 1 manga168.com, 1 +mangabenim.com, 1 mangabond.tk, 1 mangaboxes.ml, 1 mangacat.ga, 1 @@ -92552,7 +92511,6 @@ manganimefan.tk, 1 mangareactor.tk, 1 mangas.eu.org, 1 -mangator.com, 1 mangaworld.gq, 1 mangelot-hosting.nl, 1 mangeur-de-cigogne.tk, 1 @@ -92609,6 +92567,7 @@ manitasavila.com, 1 manitbd.com, 0 manitcloud.com, 1 +maniththakur.com, 1 manito.kr, 1 manitoba.ca, 1 manitoulinairport.ca, 1 @@ -92692,7 +92651,6 @@ mansurov.tk, 1 mantachiepharmacy.com, 1 mantalak.com, 1 -mantapmedia.com, 1 mantaro.site, 1 manteca.gov, 1 manteena.com.au, 1 @@ -92709,6 +92667,7 @@ mantor.org, 0 mantra.pictures, 1 mantraptownshipmn.gov, 1 +manu.quebec, 1 manual-pdf.com, 1 manual-user-guide.com, 1 manualcert.ie, 1 @@ -92729,6 +92688,7 @@ manuelefior.tk, 1 manuelefysiotherapeut.nl, 1 manueljirado.tk, 1 +manuelmusch.de, 1 manuelnunez.cz, 1 manuelosorio.me, 1 manuelperujo.ch, 1 @@ -92750,7 +92710,6 @@ manutouch.com.cn, 1 manwork.tk, 1 manwv.gov, 1 -manychat.com, 1 manycheap.com, 1 manyetikboya.com, 1 manyhotfiesta.ml, 1 @@ -92849,7 +92808,6 @@ mar-eco.no, 1 mar-zyg.pl, 1 mar.pt, 1 -marabico.com, 1 marabook.fr, 1 marabumadrid.com, 1 maracarlinicourses.com, 1 @@ -92946,6 +92904,7 @@ marco-reitmeier.de, 1 marco-s.net, 1 marco-stankowitz.de, 1 +marco-ziesing.de, 1 marcoaurelio.tk, 1 marcocerulliconsulting.com, 1 marcoduenki.ch, 1 @@ -92987,6 +92946,7 @@ marechal-company.com, 1 mareforfa.com, 1 mareinitalia.com, 1 +marekhonzal.com, 1 marekkohn.tk, 1 marekkorlak.com, 1 mareklecian.cz, 1 @@ -92994,9 +92954,7 @@ marelijah.org, 1 marenbeiner.de, 1 marengomi.gov, 1 -marenostrum.pm, 1 maresencial.com, 1 -maresimone.com, 1 marex.host, 1 marfadelivery.tk, 1 marga-marga.tk, 1 @@ -93043,6 +93001,7 @@ mariahandnasty.com, 1 mariahcareyvenezuela.tk, 1 mariaisabel.tk, 1 +mariaisabelperfumaria.com.br, 1 mariakiniorska.com, 1 marialopez.tk, 1 mariamenounos.tk, 1 @@ -93228,6 +93187,7 @@ marketingstrategy.gq, 1 marketingtrendnews.com, 1 marketingwelt-lipp.de, 1 +marketingwhitefish.com, 1 marketingypublicidaddigital.com.mx, 1 marketio.ai, 1 marketizare.ro, 1 @@ -93243,7 +93203,6 @@ marketsearch.ga, 1 marketsnerd.com, 1 marketsosyali.tk, 1 -marketstips.com, 1 markettailor.io, 0 marketvalue.gq, 1 marketvolume.com, 1 @@ -93310,6 +93269,7 @@ markturner.net, 1 markup-ua.com, 1 markus-blog.de, 1 +markus-dope.de, 1 markus-enzweiler.de, 1 markus-keppeler.de, 1 markus-musiker.de, 1 @@ -93375,7 +93335,6 @@ maroussia.tk, 1 marouviere.fr, 1 marpa-wohnen.de, 1 -marplo.net, 1 marqperso.ch, 1 marquardtgames.com, 1 marquee.tv, 1 @@ -93384,7 +93343,6 @@ marquettewire.org, 1 marquimanagement.com, 1 marquisepools.com, 1 -marrakech-camel-trips.com, 1 marrakechactivite.com, 1 marrakechairporttransfer.com, 1 marrakechauxiliaire.com, 1 @@ -93424,6 +93382,7 @@ marshmallow.co, 1 marshmallow.com, 1 marshmallowchallenge.com, 1 +marshmaloo.ir, 1 marshop.tk, 1 marsicano.tk, 1 marsikelektro.cz, 1 @@ -93438,7 +93397,6 @@ martagoraca.pl, 1 martcms.com, 1 martdev.com, 1 -martechseries.com, 0 martelange.ovh, 1 martelliyaqub.co.nz, 1 martellosecurity.com, 1 @@ -93451,6 +93409,7 @@ martial-arts.tk, 1 martialartsbrownsplains.ga, 1 martialgym.tk, 1 +martialtechlife.com, 1 martian.community, 1 martian.tk, 1 martide.com, 1 @@ -93470,7 +93429,7 @@ martinalonsovega.tk, 1 martinarnold.co.uk, 1 martinassurfdepot.tk, 1 -martinbaileyphotography.com, 1 +martinbaileyphotography.com, 0 martinbiely.com, 1 martinboerhof.nl, 1 martinbrandt.de, 1 @@ -93580,6 +93539,7 @@ marvos.se, 1 marw.org, 1 marwadionline.com, 1 +marxist-club.org, 1 marxist.party, 1 marxists.org, 1 marxmyths.org, 1 @@ -93599,6 +93559,7 @@ maryluzturismo.co, 1 marymagdaleneshrine.org, 1 marymaloney.tk, 1 +marymarcotte.com, 1 marypierce.tk, 1 maryrock.net, 1 marysvilleks.gov, 1 @@ -93613,7 +93574,6 @@ masaki1684.net, 1 masakigarden.com, 1 masalaband.tk, 1 -masalladetumente.lat, 1 masaloku.com.tr, 1 masanke-travel.com, 1 masanteadelavenir.fr, 1 @@ -93657,7 +93617,7 @@ masiavillalonga.com, 1 masiniunelte.store.ro, 1 masinky.tk, 1 -masjidalbayyinah.org, 1 +masiorama.it, 1 masjidalnoorwairarapa.co.nz, 1 mask-skin.tk, 1 maskamuse.com, 1 @@ -93685,7 +93645,6 @@ masoncountywaelections.gov, 1 masoncountywv.gov, 1 masonkysheriff.gov, 1 -masonpelt.com, 1 masonsrestaurant.co.uk, 1 masontuckett.xyz, 1 masotee.com, 1 @@ -93729,6 +93688,7 @@ masshost.tk, 1 masshpc.gov, 1 massimo.com.my, 1 +massimocasa.it, 1 massindia.in, 1 massive.tk, 1 massiveanalyser.com, 1 @@ -93802,10 +93762,9 @@ masterstation.net, 1 mastersthesiswriting.com, 1 masterstouch.co.za, 1 -masterstruckingacademy.com, 1 mastertent.com, 1 masterton.com.au, 1 -mastertutoriales.com, 1 +mastertutoriales.com, 0 mastervision.tk, 1 masterwank.com, 1 masterwayhealth.com, 1 @@ -93836,6 +93795,7 @@ mat99.dk, 1 matacrylic.com, 1 matador-group.eu, 1 +matador.ch, 1 matafonov.tk, 1 mataharischoolsurf.com, 1 mataharitimoer.tk, 1 @@ -93928,7 +93888,6 @@ mathesonsteplock.ca, 1 matheusmacedo.ddns.net, 1 mathewlane.com, 1 -mathfilm.dk, 1 mathias.re, 0 mathiasbynens.be, 1 mathiasgarbe.de, 1 @@ -93945,7 +93904,6 @@ mathleaks.se, 1 mathnet.ru, 1 mathome.spdns.org, 1 -mathomedesign.com, 1 maths.network, 1 mathsource.ga, 1 mathspace.co, 1 @@ -93960,6 +93918,7 @@ matiaskorhonen.fi, 1 maticz.com, 1 matijakolaric.com, 1 +matilde.dog, 1 matildeferreira.co.uk, 1 matillat.ovh, 1 matindustrial.com, 1 @@ -94045,11 +94004,11 @@ mattbsg.xyz, 1 mattchellew.net, 1 mattcoles.io, 1 -mattcollopy.com, 1 mattconstruction.com, 1 mattcorallo.com, 1 mattcorp.com, 1 mattdbarton.com, 1 +mattebert.com, 1 mattelek.com, 1 mattelekharris.com, 1 mattentaart.tk, 1 @@ -94119,7 +94078,6 @@ mattilsynet.no, 1 mattlaks.com, 1 mattle.wtf, 1 -mattmarkel.com, 1 mattmarkelmedia.com, 1 mattmatters.io, 1 mattmccutchen.net, 1 @@ -94176,7 +94134,6 @@ maturetube.tv, 1 maturexthumbs.com, 1 matuslab.net, 1 -matway.com, 1 matway.net, 1 matze.co, 1 matze.org, 0 @@ -94253,11 +94210,11 @@ mawinguhost.co.ke, 1 mawo.olkusz.pl, 1 mawrex.tech, 1 -mawrid.ai, 1 +mawtinii.com, 1 max-anime.tk, 1 max-apk.com, 0 +max-it.tech, 1 max-moeglich.de, 1 -max-thoene.de, 1 max-went.pl, 1 max.com, 1 max.gov, 1 @@ -94296,11 +94253,11 @@ maxclean.ml, 1 maxcleaning.be, 1 maxconstructionmachinery.com, 1 -maxcupons.com.br, 1 maxdargent.com, 1 maxdata.nl, 1 maxdata.pt, 1 maxdespachante.com.br, 1 +maxdilon.com, 1 maxedgymequipment.com, 1 maxgamez.tk, 1 maxh.me.uk, 1 @@ -94338,7 +94295,6 @@ maximosilupu.tk, 1 maximovie.eu, 1 maxims-travel.com, 1 -maximschinese.com.hk, 1 maximumcontrol.nl, 1 maximumphysiotherapy.com, 1 maximusrose.com, 0 @@ -94441,6 +94397,7 @@ maythai.eu, 1 maythai.pl, 1 maytretrungphuong.com, 1 +mayuraakitchens.com, 1 maywood-il.gov, 1 mayx.eu.org, 1 mazartdesign.tk, 1 @@ -94480,7 +94437,7 @@ mbalaw.pl, 1 mbank.kg, 1 mbar.us, 1 -mbardot.com, 0 +mbardot.com, 1 mbasic.facebook.com, 0 mbcars.be, 0 mbci.gov, 1 @@ -94502,11 +94459,12 @@ mbk.net.pl, 1 mblankhorst.nl, 1 mble.mg, 1 +mbm-law.net, 1 mbmassageterapi.se, 1 mbmbuild.com, 1 mbocentre.com, 1 mbong.kr, 1 -mbonlinesolutionsllc.com, 1 +mbonlinesolutionsllc.com, 0 mbpskill.co.id, 1 mbr-net.de, 1 mbr.moe, 1 @@ -94540,13 +94498,12 @@ mc4free.cc, 1 mcagon.tk, 1 mcahm.eu.org, 1 -mcalert.in, 1 mcan.sh, 1 mcaps-mn.gov, 1 mcar5b.com, 1 mcavallo.com, 1 mcaz.nl, 1 -mcb-bank.com, 1 +mcb-bank.com, 0 mcba.com.br, 1 mcbbs.wiki, 1 mcbooks.vn, 0 @@ -94556,7 +94513,6 @@ mccannhealth.com, 1 mccannworldgroup.com, 1 mccarthyprestige.com.au, 1 -mccarthystonefoundation.org, 0 mccinc.ca, 1 mcclaincountyok.gov, 1 mccn.pp.ua, 1 @@ -94659,7 +94615,6 @@ mcl.gg, 1 mclanedirect.com, 1 mclanexpress.com, 1 -mclarens.lk, 1 mclast.de, 1 mclear.in, 1 mcleishandmatthews.com.au, 1 @@ -94712,6 +94667,7 @@ mcsfikirsanat.com, 1 mcsfoundation.org.uk, 0 mcsidan.tk, 1 +mcsmalltian.com, 1 mcsmart.ru, 1 mcsnovatamabayan.com, 1 mcsoneca.tk, 1 @@ -94745,6 +94701,7 @@ md-service.net, 1 md28.in, 1 md5check.com, 1 +mda.gov.br, 1 mdaemon.de, 1 mdaemon.tips, 1 mdangels.org, 1 @@ -94781,11 +94738,12 @@ mdme.co, 1 mdmed.clinic, 1 mdmhukuk.com, 1 -mdmpsicologiaclinica.com, 1 mdns.eu, 1 mdosch.de, 1 +mdpharma.com, 1 mdpp.com.br, 1 mdpparish.com, 1 +mdroo.com, 1 mdrsp.de, 1 mdrthmcs.io, 1 mds-paris.com, 1 @@ -94851,6 +94809,7 @@ meavagas.com, 1 meazurelearning.com, 1 mebel-dnr.ml, 1 +mebel-renessans.ru, 1 mebel-voronezh.cf, 1 mebelconcept.tk, 1 mebelipalitra.ru, 0 @@ -94867,6 +94826,7 @@ meblekorona.pl, 1 meblerymar.pl, 1 mebtall.ru, 1 +mebus.biz, 1 mec.gub.uy, 1 mec0371.com, 0 mec0372.com, 1 @@ -94985,10 +94945,10 @@ mecalux.nl, 1 mecambioamac.com, 1 mecanicoautomotriz.org, 0 -mecanique-casa.com, 1 mecaniquemondor.com, 1 mecanizadostrs.com, 1 mecari.tk, 1 +mecc.nl, 1 meccanico.milano.it, 1 meccano.srl, 1 meccrcog-oh.gov, 1 @@ -95041,10 +95001,12 @@ medcof.com.br, 1 medcorfu.gr, 1 medcorp.pe, 1 +medcrowd.com, 1 medct.com, 1 medd.com.au, 1 meddata.pp.ua, 1 meddatix.com, 1 +meddigital.com, 1 meddin.com, 1 mede-handover.azurewebsites.net, 1 medec.ec, 1 @@ -95147,7 +95109,6 @@ mediationwithmeg.com, 1 mediatrust.org, 1 mediaukkies.nl, 0 -mediawax.be, 1 mediawijzer.net, 0 mediawiki.com, 1 mediawiki.org, 1 @@ -95269,10 +95230,12 @@ medivox.tk, 1 mediweed.tk, 1 mediwish.com, 1 +medizin18.at, 1 mediziner-goettingen.tk, 1 medja.net, 1 medklee.com, 1 medkliniks.ru, 1 +medlaunchconcepts.com, 1 medlemsraadgiveren.no, 1 medlemsradgiveren.no, 1 medline.com.tr, 1 @@ -95304,7 +95267,7 @@ medservis.online, 1 medsi-online.tk, 1 medsister.tk, 1 -medsol.co.za, 0 +medsol.co.za, 1 medsovet.tv, 1 medspecial.tk, 1 medstatix-dev.com, 1 @@ -95337,7 +95300,6 @@ meedoennoordkop.nl, 0 meek.ml, 1 meekhak.com, 1 -meeko.cc, 1 meektech.com, 1 meengan.com, 1 meenzen.net, 1 @@ -95396,16 +95358,16 @@ mega.io, 0 mega.nz, 1 mega.ru, 1 +mega888ios.com, 1 megaar.tk, 1 megabike.tk, 1 megabook.ml, 1 megabouncingcastles.com, 1 +megacash.me, 1 megacek.com, 1 megacek.cz, 1 -megacellenerji.com, 1 megacompany.cz, 1 megadesignecv.com.br, 1 -megadimensao.com.br, 1 megaelettrostimolatore.com, 1 megafilez.tk, 1 megaflix.nl, 1 @@ -95431,7 +95393,6 @@ megalonomia.ml, 1 megam.host, 1 megamarket-russia.ru, 1 -megamarketonline.pl, 1 megamillions.tk, 1 megamov.eu, 1 megamov.fr, 0 @@ -95582,6 +95543,7 @@ meinungsplatz.ch, 1 meinungsplatz.de, 1 meinvermittler.ch, 1 +meioambientepocos.com.br, 1 meis.space, 1 meise.cf, 1 meise.ml, 1 @@ -95743,10 +95705,16 @@ melonhub.com, 1 melonpanda.com, 1 melonstudios.net, 1 +melonwin.gg, 1 melown.com, 1 +melp.ai, 1 melp.co.uk, 1 melp.com, 1 +melp.ee, 1 melp.eu, 1 +melp.lt, 1 +melp.lv, 1 +melp.pl, 1 melpomene.me, 1 melrosemichaels.net, 1 melrosewi.gov, 1 @@ -95795,7 +95763,6 @@ memo.ee, 1 memoire-resistance-ariege.fr, 1 memoireimplicite.com, 1 -memoires-locronan.fr, 1 memoirmedie.dk, 1 memolestas.tk, 1 memolife.de, 1 @@ -95838,7 +95805,6 @@ mendix-apps.com, 1 mendmybackprogram.com, 0 mendocinocounty.gov, 1 -mendomaps.com, 1 mendonvt.gov, 1 mendovoice.com, 0 mendozagenevieve.com, 1 @@ -95913,7 +95879,6 @@ mentalcraft.tk, 1 mentalevolution.tk, 1 mentalhealthmn.org, 1 -mentalhealthriddle.com, 1 mentalhealthtimes.tk, 1 mentaliya.online, 1 mentalizes.tk, 1 @@ -95945,6 +95910,7 @@ menumag.bg, 1 menupay.com, 1 menureader.ml, 1 +menzel.de, 1 menzel4you.tk, 1 menzzo.com.br, 0 meo.cz, 1 @@ -95994,6 +95960,7 @@ mercadoleal.com.br, 1 mercadolibre.cl, 1 mercadolibre.co.cr, 1 +mercadolibre.com, 1 mercadolibre.com.ar, 1 mercadolibre.com.bo, 1 mercadolibre.com.co, 1 @@ -96010,6 +95977,7 @@ mercadolibre.com.uy, 1 mercadolibre.com.ve, 1 mercadolibrefz.tk, 1 +mercadolivre.com, 1 mercadolivre.com.br, 1 mercadopago.cl, 1 mercadopago.com, 1 @@ -96067,15 +96035,14 @@ mercury.photo, 1 mercurycards.com, 1 mercuryfinancial.com, 1 -mercurylodge.com, 1 mercuryproject.ch, 0 mercurysquad.tk, 1 mercyseverity.tk, 1 -mereclay.com, 0 meredithnh.gov, 1 merelaager.ee, 1 merelskleertjes.tk, 1 merenbach.com, 1 +merendonacademy.com, 1 merenita.eu, 1 merenita.net, 1 merezha.ua, 1 @@ -96124,6 +96091,7 @@ merrickcountyne.gov, 1 merrillanwi.gov, 1 merrimacwi.gov, 1 +merry-christmas.co.in, 1 merrychristmas.ml, 1 merryxmas2015.tk, 1 merson.tv, 1 @@ -96151,7 +96119,6 @@ mesalancasterpa.gov, 1 mesappros.com, 1 mesasysillas.site, 1 -mescadeaux.com, 1 mescaline.com, 1 mescaline.org, 1 mescaline.wiki, 1 @@ -96210,9 +96177,12 @@ mestopodvodu.cz, 1 mestriga.com, 1 mesutates.tk, 1 +mesutsahin.net, 1 mesvision.com, 1 mesvt.com, 1 meszlenyiattila.tk, 1 +meta-cdn.net, 1 +meta-coaching.uk, 1 meta-ctglobalboard.uk, 1 meta-db.com, 1 meta-word.com, 1 @@ -96254,7 +96224,6 @@ metalcity.tk, 1 metalcon.az, 1 metalcorenews.ga, 1 -metaldraft.com, 1 metalempire.tk, 1 metaleonsociety.io, 0 metalequipped.com, 1 @@ -96316,7 +96285,6 @@ metasurfforecast.com, 1 metasymbolic.studio, 1 metasysteminfo.com, 1 -metatagmedia.com, 1 metaurl.io, 1 metavr.ru, 1 metaword.co.jp, 1 @@ -96363,7 +96331,6 @@ methodistorthopedics.com, 1 methodprinting.com, 1 methodsofcare.com, 1 -methodwise.pt, 1 methotrexatee.gq, 1 methotrexates.gq, 1 methuen.gov, 1 @@ -96457,6 +96424,7 @@ metu.social, 1 metver.tk, 1 metyweb.ga, 0 +meu-amor.com, 1 meu.re, 1 meubairro360.com.br, 1 meubanco7.com.br, 1 @@ -96474,6 +96442,7 @@ meupix.ai, 1 meuprimeirosite.rio.br, 1 meurisse.org, 1 +meusagendamentos.com.br, 1 meusartis.ca, 1 meuscabeloscacheados.com.br, 1 meuscuidadospessoais.com, 1 @@ -96575,7 +96544,6 @@ mgfgroup.us, 1 mgfpatrimoine.com, 1 mghiorzi.com.ar, 0 -mghr.co.nz, 1 mghw.ch, 1 mgi.gov, 1 mgi.sh, 1 @@ -96627,7 +96595,6 @@ mhg-dev.com, 1 mhg-platform.com, 1 mhg-staging.com, 1 -mhgeay.fr, 1 mhginsurance.com, 1 mhh.de, 0 mhi.com, 1 @@ -96635,6 +96602,7 @@ mhiler.com, 1 mhilger.de, 1 mhjuma.com, 1 +mhmarket.fr, 1 mhmchauffeurs.co.uk, 1 mhmfoundationrepair.com, 1 mhonline.fr, 1 @@ -96658,6 +96626,7 @@ mi-amigo.tk, 1 mi-baks.bg, 1 mi-beratung.de, 1 +mi-magia.com, 1 mi-ras.ru, 1 mi-soul.com, 1 mi.ras.ru, 1 @@ -96756,6 +96725,7 @@ michaelcrane.live, 1 michaeldancot.com, 1 michaeldjoseph.com, 1 +michaeldundas.com, 1 michaeleisen.org, 1 michaelessek.com, 1 michaelfoods.com, 1 @@ -96903,6 +96873,7 @@ microendo.jp, 1 microferma.site, 1 microfinance-crimea.ru, 0 +microgates.net, 1 microgroove.jp, 1 microhydrony.org, 1 microinstrument.com.ua, 1 @@ -96978,7 +96949,6 @@ midmembers.org, 1 midmichiganasphaltpaving.com, 1 midni.gob.es, 1 -midnight-bonnie.xyz, 1 midnight-gaming-community.tk, 1 midnightmechanism.com, 1 mido.ga, 1 @@ -96997,6 +96967,7 @@ midspss.lt, 1 midterm.us, 1 midtownattowncenter.com, 1 +midtowndentist5thave.com, 1 midtownsouthcc.org, 1 midvalleysewer.gov, 1 midville-ga.gov, 1 @@ -97043,13 +97014,10 @@ mig.ee, 1 mig5.net, 1 mig81.com, 1 -migametall.com, 1 -migametall.hu, 1 migg.it, 1 miggy.org, 1 migherworld.com, 1 mighit.ml, 1 -mightybricks.de, 1 mightyfive.tk, 1 mightygadget.com, 1 mightyoakmarketing.ca, 1 @@ -97066,7 +97034,6 @@ migraine-en-werk.nl, 1 migraine.com, 1 migrainecollaborative.org, 1 -migrainedisorders.org, 1 migrainereliefplan.com, 1 migrantskillsregister.org.uk, 1 migrantworker.gov, 1 @@ -97231,6 +97198,7 @@ mikecapson.com, 0 mikecb.org, 1 mikechasejr.tk, 1 +mikedundas.com, 1 mikefrank.ca, 1 mikegerwitz.com, 1 mikeguy.co.uk, 1 @@ -97298,7 +97266,6 @@ miku.party, 1 miku.tips, 1 mikulabeutl.com, 1 -mikumiku.stream, 1 mikunosworld.com, 1 mikuru.me, 1 mikusa.xyz, 1 @@ -97322,7 +97289,6 @@ milannooptical.com, 1 milano-web.it, 1 milano.law, 1 -milanoaccidentlawyers.com, 1 milanoclownfestival.tk, 1 milanolg.com, 1 milanotoday.it, 1 @@ -97359,7 +97325,6 @@ milesdewitt.com, 1 milesforwomenshealth.org, 1 milesquaretechnologygroup.com, 1 -milestonehotel.com, 1 milestoneinternet.com, 1 milestonemachine.com, 1 miletic.net, 1 @@ -97563,6 +97528,7 @@ mindenitt.ga, 1 mindequityinternational.com, 1 mindera.com, 0 +minderrestdatkanbest.nl, 1 mindfab.de, 1 mindfactory.de, 1 mindflowmarketing.com, 0 @@ -97574,6 +97540,7 @@ mindgtc.com, 1 mindingourway.com, 1 mindjee.tk, 1 +mindkrafttech.com, 1 mindleaking.org, 1 mindmatters.social, 1 mindmax.fi, 1 @@ -97606,8 +97573,8 @@ mine-pixl.de, 1 mine-temoin.fr, 1 mine260309.me, 0 -mineads.gg, 0 -minebbs.com, 1 +mineads.gg, 1 +minebbs.com, 0 minebitcoin.tk, 1 minecity.fun, 1 minecraft-game.ga, 1 @@ -97699,6 +97666,7 @@ minibikini.cf, 1 minibomba.pro, 1 minibrewery.cf, 1 +minibus-service.ru, 1 minibusrent.ro, 1 minicampingshalom.nl, 1 minican.net, 1 @@ -97846,7 +97814,6 @@ minucio.co, 1 minul.in, 1 minutamody.cz, 1 -minutashop.ru, 1 minuteflightdeals.com, 1 minuten-drogentests.de, 1 minutepunchline.com, 1 @@ -97857,6 +97824,7 @@ mio-ip.ch, 1 miobeach.nl, 1 miobt.eu.org, 0 +miodun.pl, 1 miodysudnik.pl, 1 miomiojoyeria.com, 0 miomiorun.com, 0 @@ -97953,6 +97921,8 @@ mironi.ml, 1 mironized.com, 1 mironov.tk, 1 +miroslav.ca, 1 +miroslav.id, 1 mirotakampus.com, 0 mirprav.tk, 1 mirri.net, 1 @@ -98101,7 +98071,7 @@ mistinecn.com, 0 mistitservices.in, 1 mistral.shop, 1 -mistralsolutions.com, 1 +mistralsolutions.com, 0 mistreaded.com, 1 mistress-lucia.tk, 1 mistressnadine.tk, 1 @@ -98115,7 +98085,7 @@ mit-sexchat-geld-verdienen.com, 1 mit-uns.org, 1 mit.akita.jp, 1 -mit.dk, 0 +mit.dk, 1 mit.gg, 0 mita-beutel.tk, 1 mita.me, 1 @@ -98155,12 +98125,12 @@ mitik974.me, 1 mitikas.de, 1 mitiko.xyz, 1 -mitindo.it, 1 mitior.net, 1 mitjavila.com, 1 mito-huutou.shop, 1 mito-meishi.shop, 1 mitokashi.ml, 1 +mitometals.lv, 1 mitotalplay.com.mx, 1 mitozen.com, 1 mitragacor.org, 1 @@ -98173,6 +98143,7 @@ mitre10.com.au, 0 mitrecaasd.org, 1 mitremai.org, 1 +mitroo.fun, 1 mitrostudios.com, 1 mitsannapolis.com, 1 mitsign.com, 1 @@ -98211,7 +98182,6 @@ mitzpettel.com, 1 miui-germany.de, 1 miukimodafeminina.com, 1 -mivestuariolaboral.com, 1 mividasecreta.tk, 1 mivm.cn, 1 mivne.co.il, 1 @@ -98256,7 +98226,6 @@ mixnix.tk, 1 mixnmojo.com, 1 mixon.tk, 1 -mixonbrand.com, 1 mixov.net, 1 mixpanel.com, 0 mixposure.com, 1 @@ -98388,7 +98357,6 @@ mkt7.de, 1 mktcoral.com, 1 mktemp.org, 1 -mktzap.com.br, 1 mkultraclean.com.au, 1 mkw.st, 1 mkws.sh, 1 @@ -98445,7 +98413,6 @@ mlq.me, 1 mls.nc, 1 mlshh.pp.ua, 1 -mlsp-art.com, 1 mlstav.sk, 1 mlstverse.org, 1 mltrade.ml, 1 @@ -98510,7 +98477,6 @@ mmrproperty.co.za, 1 mms.is, 1 mmsl.cz, 1 -mmsmotor.com.hk, 1 mmstick.tk, 1 mmstudio.tk, 1 mmtfurnituredesigns.co.uk, 1 @@ -98521,6 +98487,7 @@ mmwb.nl, 1 mmwtrademarks.com.au, 1 mmxblog.com, 1 +mmxmor.ru, 1 mmxx-distribution.com, 1 mn-hootsuite.herokuapp.com, 1 mnartgallery.com, 1 @@ -98548,7 +98515,6 @@ mnium.de, 1 mnjg123.de, 1 mnml.blog, 1 -mnml.top, 1 mnmt.no, 1 mnnknz.de, 1 mno.family, 1 @@ -98607,6 +98573,7 @@ mobil-badwimpfen.de, 1 mobil-bei-uns.de, 1 mobil11.net, 1 +mobila-chisinau.md, 1 mobilab-ooe.at, 1 mobilci.net, 1 mobildeal.id, 1 @@ -98624,19 +98591,18 @@ mobileague.ml, 1 mobilebingoclub.co.uk, 1 mobilebooster.tk, 1 -mobilecareapp.com, 1 mobileciti.com.au, 1 mobilecraftingco.com, 1 mobilefactory.io, 1 mobilefidelity-magazin.de, 1 mobilegoldcoastelectrical.ga, 1 mobilehydraulics.com.au, 1 -mobileit.cz, 1 mobilelaby.com, 1 mobilelobbyers.ga, 1 mobilemechanicdenver.org, 1 mobileone.com.my, 1 mobilepartner.tk, 1 +mobilepricepk.com, 1 mobiler-handel.de, 1 mobileread.com, 1 mobileritelushi.com, 1 @@ -98662,7 +98628,6 @@ mobilificio.roma.it, 1 mobilis.dz, 1 mobilisation-generale.org, 0 -mobilistics.de, 1 mobility-events.ch, 1 mobility-services.eu, 1 mobilityworld.tk, 1 @@ -98687,7 +98652,6 @@ mobistartv.ml, 1 mobius.network, 1 mobix-diskothek.de, 1 -mobizent.com, 1 mobmp4.info, 1 mobobe.com, 1 mobolight.ml, 1 @@ -98703,6 +98667,7 @@ moca-2081.com, 1 moca-2082.com, 1 mocanu.pro, 1 +mocap.co.th, 1 mocasa.com, 1 mocdltraining.com, 1 mocent.de, 1 @@ -98778,6 +98743,7 @@ modellismo.roma.it, 1 models-resource.com, 1 modelspoor-projecten.nl, 1 +modelverse.online, 1 modem.cf, 1 modemchild.net, 1 modenatoday.it, 1 @@ -98786,7 +98752,6 @@ moderatoren.org, 1 modern-gaming.ga, 1 modern-metal-solutions.com, 1 -modernalisa.com, 1 modernapprenticeships.org, 1 modernautorepairs.com, 1 modernbank.com, 1 @@ -98838,7 +98803,6 @@ module.ru, 1 modulebaan.tk, 1 modulex-gmbh.de, 1 -modulkuhni.by, 1 modulo.ee, 1 modulos.com.au, 1 modulos.engineer, 1 @@ -98909,7 +98873,6 @@ moglie.xxx, 1 mogomix.cf, 1 mogradus.com, 1 -mogs.lol, 1 moguchat.ai, 1 mogwailabs.de, 1 mogyuchi.com, 1 @@ -99027,7 +98990,8 @@ molehill.it, 1 molenaagtekerke.tk, 1 molenaar-ricardo.tk, 1 -moletechinternational.com, 1 +moleremovalsandiego.com, 1 +molexces.com, 1 molezzo.com, 1 molinillo.tk, 1 molise.store, 1 @@ -99059,7 +99023,6 @@ moma.co.uk, 1 momentalno.tk, 1 momento.bio, 1 -momentofaware.com, 1 momentosfriko.com, 1 momentum-tech.ca, 1 momentum.photos, 1 @@ -99124,7 +99087,6 @@ monagenceentreprise-caap.fr, 1 monarch.security, 1 monarchairgroup.com, 1 -monarchelectric.com, 1 monarcjuexpo.ch, 1 monaroindustrial.com.au, 1 monasschminkzauber.de, 1 @@ -99135,8 +99097,7 @@ monbebeautrement.fr, 1 monbedou.net, 1 monbento.com, 1 -moncoachdata.com, 1 -monconcoursdgfip.fr, 1 +moncoachdata.com, 0 monday-consulting.com, 1 mondayaftersunday.com, 1 mondaynightbrewing.com, 1 @@ -99166,6 +99127,7 @@ monetag.com, 0 monetenfuchs.de, 1 monetize.ml, 1 +monetizehelper.com, 1 monetizer.co, 1 monetizer.com, 1 monetizzando.it, 1 @@ -99183,6 +99145,7 @@ money-transfers.tk, 1 money-trust.ru, 1 money.bg, 1 +money.it, 1 money4net.tk, 1 moneybill.us, 1 moneybird.com, 1 @@ -99208,6 +99171,7 @@ moneymint.com, 0 moneyniti.com, 0 moneyonchain.com, 1 +moneyratnagroup.co.in, 1 moneyreal.tk, 1 moneyreview.gr, 1 moneysavingpro.com, 0 @@ -99264,6 +99228,7 @@ monitoringanetwork.com, 1 monitoringd.de, 1 monitoringminecraft.ru, 1 +monitz-it.de, 1 monitz.de, 1 monix.io, 1 monjardin.tk, 1 @@ -99303,6 +99268,7 @@ monorail.gq, 1 monordibogue.com, 1 monorthopedagogue.ca, 1 +monosecurity.se, 1 monosis.net, 1 monoskop.org, 1 monospazzole.roma.it, 1 @@ -99332,7 +99298,6 @@ monsitetest.ca, 1 monsonshoney.com.au, 1 monster-ryot.com, 1 -monsterandfox.co.uk, 1 monsterarmsest.ga, 1 monstercurves.com, 1 monstergovt.com, 1 @@ -99355,7 +99320,6 @@ montagnainitalia.com, 1 montagne-vacances.com, 1 montagnicimes.com, 1 -montaguehotel.com, 1 montajtamirmobilya.com, 1 montala.com, 1 montalvofarret.xyz, 1 @@ -99367,7 +99331,6 @@ montanatitlesearch.com, 1 montanawi.gov, 1 montarosa.tk, 1 -montaza-namjestaja.com.hr, 1 montcalmcountymi.gov, 1 montclairca.gov, 1 montco.today, 1 @@ -99429,6 +99392,7 @@ montychristie.com, 1 monukiosk.com, 1 monumental.build, 1 +monumentendagonline.nl, 1 monvalleyphotos.com, 1 monvanityideal.com, 1 monvoyagedentaire.com, 1 @@ -99449,21 +99413,19 @@ moodifiers.com, 0 moodle.gq, 1 moodle.servebbs.com, 1 -moodlecfp.pt, 1 moodlegnr.pt, 1 moodmagicmusic.com, 1 moodsta.com, 1 moodup.team, 1 moodyfssrequest.com, 1 mooglms.com, 1 -mooguire.com, 1 +mooguire.com, 0 mooijwerk.com, 1 mooivoet.nl, 1 moojp.co.jp, 1 mooka.tk, 1 moola.market, 1 moolah.rocks, 1 -moolimusic.ir, 1 moom20101234567890.tk, 1 moon.fish, 1 moonagic.com, 1 @@ -99625,6 +99587,7 @@ morgancountyutah.gov, 1 morgandesort.com, 1 morganeb.be, 1 +morganlaroche.com, 1 morganton.com, 1 morganwilder.com, 1 morgen.so, 1 @@ -99754,7 +99717,6 @@ moshcore.tk, 1 moshegropper.com, 1 moshiach.ru, 1 -moshiachtime.com, 1 moshop.com.vn, 1 moshwire.com, 1 mosin.org, 1 @@ -99798,7 +99760,6 @@ mostlyharmless.at, 1 mostlyoverhead.com, 1 mostmost.tk, 1 -mostquoted.com, 1 mostynlaw.com, 1 mosurist.tk, 1 moswand.nl, 1 @@ -99863,6 +99824,7 @@ motochileneta.tk, 1 motoclubentresemana.tk, 1 motoclubrker.tk, 1 +motoconcho.do, 1 motocrete.gr, 1 motocrosssite.tk, 1 motodb.co.uk, 1 @@ -99889,6 +99851,7 @@ motor-forum.nl, 1 motor-show.cz, 1 motor1.com, 1 +motoramzsport.com, 1 motorbiketourhanoi.com, 1 motorcityalignment.com, 1 motorcitycasino.com, 1 @@ -99905,13 +99868,11 @@ motorparts-online.com, 1 motorrijschool-pitbox8.nl, 1 motorring.ru, 1 -motorsactu.com, 1 motorslopers.tk, 1 motorspeed.de, 1 motorsport-passion.com, 1 -motorsport-wuerttemberg.de, 1 motorst.dk, 1 -motortg.it, 0 +motortg.it, 1 motorways.tk, 1 motorwrappen.nl, 1 motorz.ca, 1 @@ -99919,7 +99880,6 @@ motoselfservices.fr, 1 motospaya.com, 0 motostorie.blog, 1 -motostyle.ua, 1 mototax.ch, 0 mototeam.tk, 1 mototsi.com, 1 @@ -99977,7 +99937,6 @@ mountainspiritinn.com, 1 mountainspringsrentals.ca, 1 mountainstage.org, 1 -mountaintree.net, 1 mountainutilities.eu, 1 mountainvalleygrowers.com, 1 mountainviewgrand.com, 1 @@ -100043,6 +100002,7 @@ movetonewcastle.com, 1 movetonewcastle.com.au, 1 movewellnesslab.com, 1 +movewisemethod.com.au, 1 moveyourass.tk, 1 moveyourhome.de, 1 movfun.ga, 1 @@ -100057,6 +100017,7 @@ movieeveningest.ga, 1 moviefreeze.com, 1 movieglot.ml, 1 +moviego.ch, 1 movieguys.org, 1 moviejack.org, 0 moviemadness.uk, 1 @@ -100065,7 +100026,6 @@ movies-diploma.fun, 1 movies-fan.tk, 1 movies1977.ga, 1 -moviesetc.net, 1 moviesrules.tk, 1 moviestodownload.tk, 1 movietele.it, 1 @@ -100074,6 +100034,7 @@ moviewatchin.tk, 1 movieweb.com, 1 movieworld.com.au, 1 +movik.us, 1 moviko.nz, 1 movil.uno, 1 movilandroide.com, 1 @@ -100141,6 +100102,7 @@ mp3skull.cf, 1 mp4.tf, 1 mpa-pro.fr, 1 +mpa.gov.br, 1 mpac-ng.org, 1 mpadegree.org, 1 mpago.la, 1 @@ -100193,7 +100155,6 @@ mpsi1.fr, 1 mpsoundcraft.com, 1 mpsports.org, 1 -mpssghosp.com, 1 mptdom.com, 1 mptenders.gov.in, 1 mpu-ibbi.de, 1 @@ -100248,13 +100209,13 @@ mrclutch.com, 1 mrcog.tk, 1 mrcomer.tk, 1 -mrcool.com, 1 +mrcool.com, 0 mrcool.store, 1 mrcooldiy.ca, 1 mrcooldiy.com, 1 mrcoolevents.com, 1 -mrcoolfranchise.com, 1 -mrcoolfranchising.com, 1 +mrcoolfranchise.com, 0 +mrcoolfranchising.com, 0 mrcooluniversal.ca, 1 mrcooluniversal.com, 1 mrcyberpixel.tk, 1 @@ -100281,7 +100242,6 @@ mrgusercontent.ru, 1 mrgutternj.com, 1 mrhc.ru, 1 -mrhost.biz, 1 mri.community, 1 mricspatial.com, 1 mrik.jp, 1 @@ -100375,6 +100335,7 @@ msa-aesch.ch, 1 msa-net.ru, 1 msa.bank, 1 +msafa.org, 1 msahebhonar.com, 1 msaludasuhogar.com, 1 msar.eu, 1 @@ -100397,6 +100358,7 @@ msg.org.tr, 1 msgallery.tk, 1 msganka.jp, 1 +msgkiki.com, 1 msgroupitaly.com, 1 msgru.com, 1 msgs.ee, 1 @@ -100464,6 +100426,7 @@ mssm-portal.com, 1 mssora.com, 1 mssys.de, 0 +mst-is.co.jp, 1 mstazakka.com, 1 mstdn.fm, 1 mstdn.fr, 1 @@ -100603,6 +100566,7 @@ muble.tk, 1 muc.space, 1 muceniece.tk, 1 +muchamiel.nl, 1 muchbetterthancash.com, 1 muchisimos.com, 1 muchohentai.com, 1 @@ -100643,6 +100607,7 @@ mueller5.eu, 1 muelthaler.com, 1 muenchberger.com, 0 +muenchen-personal.training, 1 muennich-coll.de, 1 muenzen.tk, 1 muenzenforum.tk, 1 @@ -100676,8 +100641,7 @@ mui.today, 1 muii.com.br, 1 muilties.com, 1 -muir.eu.org, 1 -muir.fun, 0 +muir.fun, 1 muir.pp.ua, 1 muisoft.fi, 1 muizenpagina.tk, 1 @@ -100720,8 +100684,8 @@ mulligangear.com, 0 mullinsfarms.com, 1 mullv.ad, 1 +mullvad.net, 1 muloot.de, 1 -mult.tv, 0 multerer.biz, 1 multi-cryptex.gq, 1 multi-fruit.tk, 1 @@ -100736,7 +100700,6 @@ multibomasm.com.br, 1 multicoin.capital, 0 multicolortv.com, 1 -multicom.ca, 0 multiconsumos.tk, 1 multicore.cl, 1 multicorpbra.com, 1 @@ -100945,6 +100908,7 @@ musaslush.com, 1 muscatinecountyiowa.gov, 1 muscatinejournal.com, 1 +musch.uno, 1 muscle-home.fr, 1 muscle-tg.com, 1 muscleandrecovery.com, 1 @@ -101049,6 +101013,7 @@ musictools.tk, 1 musicvietnam.tk, 1 musicwear.cz, 0 +musicwelltech.es, 1 musicwide.net, 1 musigama.tk, 1 musik-produktiv.com, 1 @@ -101107,6 +101072,7 @@ musthave.tk, 1 musthinsider.com, 1 mustika.cf, 1 +mustikmotel.com, 1 mustketing.com, 1 musttest.com, 1 musttest.email, 1 @@ -101145,7 +101111,6 @@ muunnin.net, 1 muurari.tk, 1 muusika.fun, 1 -muusikatunnid.ee, 1 muusikoiden.net, 1 muv.ac, 1 muv.co.uk, 1 @@ -101249,7 +101214,6 @@ mwu.dk, 1 mwv2wle.club, 1 mww.moe, 1 -mwxjacg.com, 1 mx-moto.fr, 0 mx-qr.com, 1 mx-quad.fr, 0 @@ -101302,9 +101266,12 @@ my-lightning.com, 1 my-meal.nl, 1 my-mediahome.ru, 1 +my-message.co, 1 my-meteo.net, 1 my-monobank-card.com.ua, 1 my-montenegro.tk, 1 +my-msg.ai, 1 +my-msg.co, 1 my-nextcloud.at, 1 my-pawnshop.com.ua, 0 my-pharmacie.com, 1 @@ -101331,6 +101298,7 @@ my-web.xyz, 1 my-webcloud.at, 1 my-website.top, 1 +my-wishes.co, 1 my-woodcraft.com, 1 my.cat, 1 my.com.my, 1 @@ -101338,6 +101306,7 @@ my.tiaa.org, 1 my.urown.cloud, 1 my.usa.gov, 1 +my1health.com, 1 my1login.com, 1 my4g.net, 1 my4thtelco.com.sg, 1 @@ -101355,9 +101324,8 @@ myaggic.com, 1 myaggienation.com, 1 myaicuriosity.com, 1 -myaipayment.com, 1 -myairware.com, 1 myakkatactical.com, 1 +myalchemytechnology.com, 1 myali.net, 1 myalmeria.com, 1 myalpine.shop, 1 @@ -101515,6 +101483,7 @@ mycts.org, 1 mycues.gov, 1 mycumortgage.com, 1 +mycyberspace.tech, 1 mydarkness.cf, 1 mydarksite.tk, 1 mydarkstar.net, 1 @@ -101539,6 +101508,7 @@ mydigitalmarketingempire.com, 1 mydigitalnation.com, 1 mydigitalpublication.com, 1 +mydirectsys.com, 1 mydirtyclub.com, 1 mydirtyhobby.com, 1 mydirtyhobby.de, 1 @@ -101578,7 +101548,6 @@ myeisenbahn.de, 1 myekon.com, 1 myelebest.ga, 1 -myelinalicante.com, 1 myelka.tk, 1 myemailadd.net, 1 myemailsender.tk, 1 @@ -101697,7 +101666,6 @@ mygreatlakes.org, 1 mygreatwebsite.co.uk, 1 mygreencloset.com, 1 -mygretchen.de, 1 mygrodno.tk, 1 mygtcup.co, 1 mygve.com, 1 @@ -101726,7 +101694,6 @@ myhkweb.tk, 1 myhmz.bid, 1 myhoor.ga, 1 -myhostname.net, 1 myhotel.sk, 1 myhotgirls.ml, 1 myhouseofpizza.com, 1 @@ -101892,6 +101859,7 @@ mynewspaper.net, 1 mynext.events, 1 mynextmove.org, 1 +mynextstep.id, 1 mynic.my, 1 mynimo.com, 1 mynissan.ml, 1 @@ -102060,7 +102028,7 @@ myrvang.org, 1 myrvog.net, 1 myrvogna.net, 1 -myrxnote.com, 1 +myrvsolution.com, 1 myrxplans.com, 1 mys.gov.sd, 1 mysa.tk, 1 @@ -102104,7 +102072,6 @@ mysidekick.io, 1 mysignal.com, 1 mysill.gr, 1 -mysilvershield.com, 1 mysimsem.com, 0 mysisterandi.co.za, 1 myslc.gov, 1 @@ -102146,6 +102113,7 @@ mysticmedia.net, 1 mysticmine.shop, 1 mysticrealm.tk, 1 +mysticscannabis.ca, 1 mysticsenses.pt, 1 mystiko.eu, 1 mystinkefinger.de, 1 @@ -102193,6 +102161,7 @@ mytime.gl, 1 mytimer.tk, 1 myting.net, 1 +mytipme.com, 1 mytntware.com, 1 mytoncityut.gov, 1 mytraiteurs.com, 1 @@ -102200,7 +102169,6 @@ mytransmissionexperts.com, 1 mytravelblog.de, 1 mytravelguide.tk, 1 -mytravelresearch.com, 1 mytreasury.gov, 1 mytrendiya.com, 1 mytrewithen.co.uk, 1 @@ -102252,6 +102220,7 @@ myweb360.de, 1 mywebcloud.at, 1 mywebexperience.gq, 1 +mywebhost.co.uk, 1 mywebinar.com, 1 mywebinar.io, 1 mywebpanel.eu, 1 @@ -102597,7 +102566,6 @@ nakim.cf, 1 nakin.tk, 1 nakisa.com, 0 -nakit.eu, 1 nakjadah.ddns.net, 1 nakka.ch, 1 nakkati.tk, 1 @@ -102610,6 +102578,7 @@ nakskov-kropsterapi.dk, 1 nakukata.com, 1 nakupnabytku.sk, 1 +nala.baby, 1 nalanyinyun.top, 1 nalchik-news.net, 1 naldydimpudus.com, 1 @@ -102632,7 +102601,6 @@ namastenaturo.fr, 1 namazon.org, 1 namazvakitleri.com.tr, 0 -namc-um.org, 1 namdu.uz, 1 name.am, 1 name.ax, 1 @@ -102787,6 +102755,7 @@ naprapativast.se, 1 naprawa-bazy-danych.pl, 1 naprawadachupokunie.pl, 1 +naprawapokunie.pl, 1 naprodukcji.xyz, 1 naprosynpainrelief.com, 1 napshome.net, 1 @@ -102829,7 +102798,6 @@ narko-stop.org, 1 narkocenter116.ru, 1 narmafzar.tk, 1 -narmos.ch, 0 naro-oh.jp, 1 narod-sobe.cz, 1 narodnaya-medizina.tk, 1 @@ -102861,6 +102829,7 @@ narutoshippuden.tk, 1 narutoshow.tk, 1 narutouzumaki.tk, 1 +narutowicza47.pl, 1 narvizit.com, 1 narware-testing.com, 1 nary-software.com, 1 @@ -102881,7 +102850,7 @@ nasecasomira.cz, 1 naseehah.ga, 1 nasehyar.ir, 1 -naserron.gr, 1 +naserron.gr, 0 nasetema.cz, 1 nasets-marcusgard.se, 1 nash-dom.tk, 1 @@ -102897,8 +102866,8 @@ nashira.cz, 1 nashjurist.tk, 1 nashkrai.ga, 1 +nashreviewer.com, 1 nashuarpc.gov, 1 -nashvillebasements.com, 1 nashvilledowntown.com, 1 nashvilleplasticsurgery.com, 1 nashvillesheriff.gov, 1 @@ -102943,6 +102912,7 @@ natalia-venezuela.tk, 1 natalia.ovh, 1 nataliapearl.com, 1 +natalie.mu, 1 nataliealba.net, 1 nataliehershlag.tk, 1 nataliiawines.com.ua, 1 @@ -102982,7 +102952,6 @@ nathaliedijkxhoorn.com, 1 nathaliedijkxhoorn.nl, 1 nathaliesadventure.eu, 1 -nathaliesavale.com, 1 nathalieschaos.tk, 1 nathalietaieb.com, 1 nathan.ovh, 1 @@ -103011,7 +102980,7 @@ national-anime.com, 1 national-shitposting.agency, 1 nationalacademic.nl, 1 -nationalafs.com, 1 +nationalafs.com, 0 nationalaustriabank.com, 1 nationalbank.gov, 1 nationalbanken.dk, 1 @@ -103101,7 +103070,6 @@ natur-seele.de, 1 natur-udvar.hu, 1 natur.com, 1 -natura-sense.com, 1 natura2000.nl, 1 natura2000.tk, 1 naturabuy.fr, 1 @@ -103177,6 +103145,7 @@ nauseainthemorning.ml, 1 nausempreendimentos.com, 1 nausicaahotel.it, 1 +nauss.edu.sa, 1 naut.ca, 1 nautadutilh.com, 1 nautholl.is, 1 @@ -103363,7 +103332,6 @@ ncd.moe, 1 ncdc.pt, 1 ncdpi.gov, 1 -ncdwlq.space, 1 ncea.net.au, 1 nceahelp.com, 1 ncedcloud.gov, 1 @@ -103434,8 +103402,6 @@ ndanotaires.ca, 1 ndarayudha.site, 1 ndarville.com, 1 -ndaxue.com, 1 -ndbilje.si, 0 ndcurvemaster.com, 1 ndd.govt.nz, 1 ndeb-bned.ca, 1 @@ -103481,7 +103447,6 @@ nea.gov, 1 nealemorison.com, 1 nealsmead.com, 0 -neaminational.org.au, 1 neanderthalia.tk, 1 neapi.com, 1 nearbees.de, 1 @@ -103564,7 +103529,6 @@ nedimon.gq, 1 nedir.help, 1 nednex.com, 1 -nedviga-pro.com, 1 nedviga.gq, 1 nedviga.tk, 1 nedvizhimost.tk, 1 @@ -103662,7 +103626,6 @@ neilpatel.com, 1 neilrooney.com, 1 neilwynne.com, 1 -neilyanto.com, 1 nein-zu-bayern.de, 1 neiu.edu, 1 nej.cz, 1 @@ -103710,6 +103673,7 @@ nekrylov.ee, 0 nekrylov.org.ru, 0 nekrylov.spb.ru, 0 +nektr.co, 1 nekusoul.de, 1 nele.de, 1 nelebaehre.de, 1 @@ -103755,6 +103719,7 @@ nemirow.tk, 1 nemko.com, 1 nemko.dk, 1 +nemko.no, 1 nemko.org, 1 nemkoff.tk, 1 nemnodes.org, 1 @@ -103783,7 +103748,6 @@ nenflow.com, 1 nenkin-kikin.jp, 1 neno.io, 1 -neo-facade.be, 1 neo-hosting.co.uk, 0 neo-novarion.com, 1 neo.iq, 1 @@ -103831,7 +103795,6 @@ neontemple.net, 1 neontri.com, 1 neoone.art, 0 -neopexel-server.my.id, 1 neophilus.net, 1 neophyt.ch, 1 neoplm.com, 1 @@ -103874,6 +103837,7 @@ nepartypas.tk, 1 nepellion.org, 1 nepezzano13.com, 1 +neph.social, 1 nephelae.eu, 1 nephology.net.au, 1 nephrogo.com, 1 @@ -103914,6 +103878,7 @@ nerdnet.goip.de, 1 nerdoftheherd.com, 1 nerdoutstudios.tv, 1 +nerdplusart.com, 1 nerdpol.ch, 1 nerdpol.org, 1 nerdpress.net, 1 @@ -103928,6 +103893,7 @@ nerdydev.net, 1 nerdyfam.tech, 1 nerdygadgets.org, 1 +nerdyhometech.com, 1 nerdynav.com, 1 nerdyspace.net, 1 nerede360.com, 1 @@ -104034,7 +104000,6 @@ netdiode.net, 1 netdiode.org, 1 netdir.tk, 1 -netdisk.io, 1 netdnstrace1.com, 1 netdox.de, 1 netducks.com, 1 @@ -104129,6 +104094,7 @@ netolice.com, 1 netolink.co.il, 1 netolink.com, 1 +netope.de, 1 netor.ga, 1 netpatient.dk, 1 netpay.mx, 1 @@ -104338,7 +104304,7 @@ neuropsychologisthouston.com, 0 neurosurgeryinmexico.com, 1 neuroticosanonimos.tk, 1 -neurotransconcept.com, 1 +neurotransconcept.com, 0 neurotransmitter.net, 1 neurovicellc.com, 1 neurozentrum-barsinghausen.de, 1 @@ -104380,7 +104346,6 @@ neverle.ss, 1 neverness.tk, 1 nevers.fr, 1 -neversayretired.in, 1 neverwasinparis.com, 1 neveu.tech, 1 nevim-co-varit.cz, 1 @@ -104391,6 +104356,7 @@ nevoxo.com, 0 nevrodiversitet.no, 1 nevski.eu, 1 +nevyziadanevolania.sk, 1 new, 1 new-1xbet.com, 1 new-black-order.com, 1 @@ -104398,7 +104364,6 @@ new-flyer-institute.com, 1 new-flyer.co, 1 new-mexico-sexcams.com, 1 -new-ohtani-dent.com, 1 new-pornvideos.com, 1 new-smile.cf, 1 new-standart.tk, 1 @@ -104473,6 +104438,7 @@ newcityinfo.ch, 0 newcityinfo.info, 1 newcitystudio.ch, 0 +newcold.com, 1 newcombny.gov, 1 newconcept.tk, 1 newconceptelec.be, 1 @@ -104485,7 +104451,6 @@ newdayrecordlabel.com, 1 newdenversurvivors.tk, 1 newdietandexercises.tk, 1 -newdimensioninterlock.com, 0 newdirectionsolar.com.au, 1 newdreamsnashamuktikendra.com, 1 newdronesandquadcopters.com, 1 @@ -104575,7 +104540,6 @@ newnettle.com, 1 newnorthfuels.ca, 1 newnorthfuels.com, 1 -newodesign.com, 1 newoldboughtsold.com, 1 newoldstock.uk, 1 newomnibank.com, 1 @@ -104602,14 +104566,13 @@ newprairiepress.org, 1 newpress24.tk, 1 newquilters.com, 1 -newreality.nl, 1 newreleases.io, 1 newrelic.com, 1 newreligiousmovements.org, 1 newrichlandmn.gov, 1 newrochellearts.org, 1 +newruf.com, 1 news-and-blogs.tk, 1 -news-armenia.com, 1 news-balashiha.ru, 1 news-berdyansk.ru, 1 news-club.tk, 1 @@ -104759,6 +104722,7 @@ newyorkland.forsale, 1 newyorkmyc.org, 1 newyorknews.tk, 1 +newyorkpub.com.br, 1 newyorkreporting.com, 1 newyorkrp.tk, 1 newyorktitlesearch.com, 1 @@ -104823,10 +104787,8 @@ nextcloud-server.spdns.de, 0 nextcloud.com, 1 nextcloud.nerdpol.ovh, 1 -nextcloudblacksecure.fr, 1 nextcloudcn.com, 0 nextclouddarwinkel.nl, 1 -nextdayoff.com, 1 nextdayvapes.co.uk, 1 nextdoorhobby.com, 1 nextdoorhobby.de, 1 @@ -104874,6 +104836,7 @@ nextvibration.com, 1 nextvision.pt, 1 nextwab.com, 1 +nextwo.com, 1 nextworldcoding.ga, 1 nextzen.com.bd, 1 nexus, 1 @@ -104932,6 +104895,7 @@ nfo.co.il, 1 nfobar.com, 1 nforto.com, 1 +nfpib.com.au, 1 nfpors.gov, 1 nfpsa.lv, 1 nfrdoz.com, 1 @@ -104984,6 +104948,7 @@ ngo-online.de, 1 ngo.chat, 1 ngo.luxe, 1 +ngo.xxx, 1 ngobrolgames.com, 1 ngontinhtruyen.com.vn, 1 ngoresan.tk, 1 @@ -104997,7 +104962,6 @@ nguoimuahangmy.com, 1 nguru.net, 1 nguyenanhung.com, 1 -nguyencucthanh.com, 1 nguyenductrong.net, 1 nguyenduythiem.com, 1 nguyenfamily.cc, 1 @@ -105042,6 +105006,7 @@ nhtandem.com, 1 nhtsa.gov, 1 nhv-vintagelemans.com, 1 +nhv24.com, 1 nhvrc.org, 1 ni-dieu-ni-maitre.com, 1 ni-mate.com, 1 @@ -105117,7 +105082,6 @@ nice-germany.tk, 1 nice-links.tk, 1 nice-school.com.ua, 1 -niceactimize.com, 0 niceb5y.net, 0 niceceo.com, 0 nicecockb.ro, 1 @@ -105273,6 +105237,7 @@ nie-wieder-muede.de, 1 niebieska-fala-spokoju.pl, 1 niebieskiorzel.pl, 1 +niebla.com.co, 1 niederalt.com, 1 niedermaier.eu.org, 1 niedermair.bz, 1 @@ -105427,7 +105392,6 @@ nikavandenbos.nl, 1 nikavenus.com, 1 nike-studio.com, 1 -nikeairjordan.cc, 0 nikelunartw.net, 1 nikesoccerbodotoutlet.ga, 1 nikest.cf, 1 @@ -105436,8 +105400,7 @@ nikhilramakrishnan.tk, 1 nikhilsd.com, 1 nikiel.fr, 1 -nikimix.com, 0 -nikinterior2018.com, 1 +nikimix.com, 1 nikitacartes.xyz, 0 nikitagukov.ru, 1 nikitenko.tk, 1 @@ -105461,7 +105424,6 @@ nikolaevnews.ru, 1 nikolahost.tk, 1 nikolai-schmidt.tk, 1 -nikolaiknows.com, 1 nikolaipribylski.tk, 1 nikolaj-platoshkin.cf, 1 nikolajmackowski.dk, 1 @@ -105489,7 +105451,6 @@ nikz.in, 1 nil.com, 1 nil.mx, 1 -nilany.com, 1 niledevelopmentseg.com, 1 nileempire.com, 1 nilefi.cf, 1 @@ -105503,7 +105464,6 @@ niloxy.com, 1 nilpointer.com, 1 nilrem.org, 0 -nils.ch, 1 nils.moe, 1 nilslab.com, 1 nilslandscaping.com.au, 1 @@ -105573,7 +105533,6 @@ ninmegam.gq, 1 ninnen.com, 1 ninofink.com, 1 -ninohaslach.ch, 1 ninoo.nl, 1 ninov.bg, 1 ninovayazilim.com, 1 @@ -105666,8 +105625,6 @@ nitter.net, 0 niu-beton.com, 1 niu.edu.tw, 1 -niuco.com.br, 1 -niugongzuo.com, 1 niunaimilk.cn, 0 niutennici.tk, 1 nivaad.com, 1 @@ -105723,6 +105680,7 @@ njhq.org, 1 njilc.com, 1 njj0121.com, 1 +njjfeducationcenter.com, 1 njleg.gov, 1 njliner.me, 1 njliner.net, 1 @@ -105770,7 +105728,6 @@ nl-ix.net, 1 nl.search.yahoo.com, 0 nl3ehv.nl, 1 -nla.no, 1 nlap.ca, 0 nlazarov.com, 1 nlead.gov, 1 @@ -105884,7 +105841,6 @@ noadi-pixels.tk, 1 noagendahr.org, 1 noah-witt.com, 1 -noahdigital.com.br, 1 noahenco.nl, 1 noahjacobson.com, 1 noahmodas.com.br, 1 @@ -105926,7 +105882,7 @@ nobutwhy.com, 1 nobz.com.br, 0 noc.best, 1 -noc.ly, 1 +noc.ly, 0 noc.wang, 1 nocapplugins.xyz, 1 noccie.com, 1 @@ -105944,7 +105900,7 @@ nocr.net, 1 nocreyentes.org, 1 nocrm.io, 1 -nocti.org, 1 +nocti.org, 0 noctinus.tk, 1 noctiskillbadge.org, 1 noctisphoto.tk, 1 @@ -105980,9 +105936,11 @@ noel.wf, 1 noel.yt, 1 noelblog.ga, 1 +noelle.media, 1 noemax.com, 1 noeontheend.com, 1 noervenich.de, 1 +noetik.ai, 1 noexcusesc.gov, 1 noexec.org, 1 noexpo.org, 1 @@ -106012,7 +105970,6 @@ noihotels.com, 1 noincludesubdomains.preloaded.test, 0 noipro.com, 1 -noirland.co.nz, 1 noirmale.com, 1 noirmalenetwork.com, 1 noirpvp.com, 1 @@ -106217,6 +106174,7 @@ nordictaxirvk.is, 1 nordicway.dk, 1 nordinfo.fi, 1 +nordisglobal.com, 1 nordiskhiss.se, 1 nordiskhissvarmland.se, 1 nordkampen.com, 1 @@ -106233,7 +106191,6 @@ nordsec.com, 1 nordseeblicke.de, 1 nordstarfossils.com, 1 -nordsudcasavacanza.com, 0 nordvestkysten.dk, 1 nordvpn.com, 1 nordwal.de, 1 @@ -106259,7 +106216,6 @@ noritakechina.com, 1 noriva.com.mt, 1 norlink.ca, 1 -normacampbell.com, 1 normaculta.com.br, 1 normalady.com, 0 normalil.gov, 1 @@ -106283,7 +106239,6 @@ noroutine.me, 1 norridgewock.gov, 1 norrisautomotiveinc.com, 1 -norrisfeigum.com, 1 norrishome.tk, 1 norristn.gov, 1 norrkemi.se, 1 @@ -106318,7 +106273,6 @@ northcarolinahealth.tk, 1 northcarolinatitlesearch.com, 1 northcharlestonsc.gov, 1 -northcoastlabs.com, 1 northcoastpsychotherapy.com.au, 1 northcotemanor.co.uk, 1 northcountyfire.gov, 1 @@ -106380,7 +106334,7 @@ northshorevisitor.com, 1 northsidecaravansrepairsandspares.com, 1 northsideeventsindy.com, 1 -northstarasset.com, 0 +northstarasset.com, 1 northstarcommunitytrust.org, 1 northstarcommunitytrust.org.uk, 1 northstaredit.org.uk, 1 @@ -106399,6 +106353,7 @@ northumbria.ac.uk, 1 northwestcareercollege.edu, 1 northwestpharmacy.com, 1 +northwestprimetime.com, 1 northwilkesboronc.gov, 1 northwoodoh.gov, 1 northwoodstudios.org, 1 @@ -106484,6 +106439,7 @@ notar-glagowski.com, 1 notar-glagowski.de, 1 notar-peikert.com, 1 +notar-sibiu.ro, 1 notari.pro, 1 notariatpublic.com, 1 notaries-europe.com, 1 @@ -106508,7 +106464,6 @@ notebleue.com, 1 noteboat.net, 1 notebook-alkatresz.hu, 1 -notebooklm.in, 1 notebooksbilliger.de, 1 notebooksteurer.shop, 1 notebrew.com, 1 @@ -106588,6 +106543,7 @@ notsafefor.work, 1 notsoape.com, 1 nottawatwpisabellami.gov, 1 +nottinghammd.com, 1 nottinghammoneyman.com, 1 nottinghilleditions.com, 1 notube.cc, 1 @@ -106610,7 +106566,6 @@ nouveauhosting.com.au, 1 nouvelatrium.net, 0 nouvelle.net.au, 1 -nov.nl, 1 nova-dess.ch, 0 nova-eq.com, 1 nova-host.ml, 1 @@ -106630,12 +106585,14 @@ novalevante.info, 1 novalite.rs, 0 novalnet.de, 1 +novaltek.pe, 1 novamont.com, 1 novanetwork.ml, 1 novanice.net, 1 novanta.pl, 1 novantaphotonics.com, 1 novaofcalifornia.com, 0 +novaprac.com, 1 novaquantum.com, 1 novaquark.com, 1 novaratoday.it, 1 @@ -106644,7 +106601,6 @@ novasmilecr.net, 1 novasprint.tk, 1 novatech.net, 0 -novatelecom.cl, 1 novavax.com, 0 novavistawindows.com, 1 novaway.ca, 1 @@ -106691,6 +106647,7 @@ novilaw.com, 1 novilidery.com, 1 novilist.hr, 1 +novindustria.pt, 1 novinkihd.tk, 1 novinsource.ir, 1 novinvisa.com, 1 @@ -106839,6 +106796,7 @@ nrdstd.io, 1 nreihofer.de, 1 nrev.ch, 1 +nrityangana.in, 1 nrj-plomberie.com, 1 nrkn.fr, 1 nrla.org.uk, 1 @@ -106943,6 +106901,7 @@ ntags.org, 1 ntangledstate.com, 1 ntarasioannis.gr, 1 +ntauthority.systems, 1 ntcoss.org.au, 1 ntcp.ph, 1 ntcrmezon.ru, 1 @@ -107088,7 +107047,6 @@ nullvoid.me, 1 nullxsec.net, 1 nully.xyz, 1 -nulo.ar, 0 nulook.co.id, 1 nulsc.biz, 1 nulsc.net, 1 @@ -107175,12 +107133,12 @@ nursingconsultant.ca, 1 nursinghero.com, 1 nursingknowledge.in, 1 -nursinglicensemap.com, 1 nursingschool.network, 1 nursunity.ml, 1 nurture-thrive.com, 1 nusabarongmotormalang.com, 1 nusailec.com, 1 +nusanetwork.com, 1 nusantaraku.tk, 1 nusantararom.org, 1 nussadoclub.org, 1 @@ -107230,7 +107188,6 @@ nuvechtdal.nl, 1 nuvibit.com, 1 nuvini.com, 1 -nuvoagency.com, 1 nuvolosicuro.io, 1 nuvotheagency.com, 1 nuvpad.com, 1 @@ -107314,7 +107271,6 @@ nwtparks.ca, 0 nwtrb.gov, 1 nwuss.okinawa, 1 -nwwnetwork.net, 1 nx42.pw, 1 nxcloud.ml, 1 nxdomain.info, 1 @@ -107325,13 +107281,12 @@ nxplinc.com, 1 nxstudios.tk, 1 nxth.io, 1 -nxtlevelprofits.com, 1 nxtport.eu, 1 +nxtrunn.com, 1 nxxcloud.nl, 1 ny-events.club, 1 nya-cloud.com, 1 nya.as, 1 -nya.autos, 1 nya.one, 1 nya.show, 1 nya.work, 1 @@ -107365,7 +107320,6 @@ nycgangland.com, 1 nycoyote.org, 1 nycpac.net, 0 -nycstonecare.com, 1 nycstyleboutique.com, 1 nycu.moe, 1 nycuf.org, 1 @@ -107374,7 +107328,6 @@ nyerjakekszekkel.hu, 1 nyerjazoreoval.hu, 1 nyerjenaheraval.hu, 1 -nyflyguyz.com, 1 nyfurnitureoutlets.com, 1 nygbcomicguide.tk, 1 nygbtourguide.tk, 1 @@ -107385,7 +107338,7 @@ nyheter.oslo.no, 1 nyiaarhus.dk, 1 nyiarlumar.tk, 1 -nyiooc.org, 0 +nyiooc.org, 1 nyirc.gov, 1 nylasercenter.com.pl, 1 nylbdc.gov, 1 @@ -107451,6 +107404,7 @@ nzbfinder.ws, 1 nzbnoob.com, 1 nzbr.de, 1 +nzbs.moe, 1 nzbstars.com, 1 nzcorp.dk, 1 nzdata.org, 1 @@ -107574,6 +107528,7 @@ oanamancu.com, 1 oandgpr.com, 1 oanow.com, 1 +oase-der-ruhe.de, 1 oasegroen.nl, 1 oasis-info.co.uk, 1 oasisautospa.org, 1 @@ -107612,7 +107567,6 @@ obelisco.tk, 1 obelix05.duckdns.org, 1 oberam.de, 1 -obercodosguardas.pt, 1 oberdachstetten.de, 1 obereg.cf, 1 obereg.ga, 1 @@ -107714,6 +107668,7 @@ obuhov.tk, 1 obuvgarmisch.cz, 1 obuysya.tk, 1 +obvansolutions.ru, 1 obwacht.at, 1 obwacht.com, 1 obwacht.de, 1 @@ -107797,7 +107752,6 @@ oceanshaman.ml, 1 oceansidetour.tk, 1 oceanspraymiami.com, 1 -oceanstayandplay.com, 1 oceansurplus.tk, 1 oceanviewde.gov, 1 oceanvisuals.com, 1 @@ -107878,7 +107832,6 @@ octane.co, 1 octane.net.au, 1 octanio.com, 1 -octarine.cc, 1 octarineparrot.com, 1 octav-avocats.fr, 1 octav.name, 1 @@ -107995,6 +107948,7 @@ odyso.org, 1 odyssee-animation.tk, 1 odyssey44.com, 1 +odyssy.tech, 1 odzyskiwanie.biz, 1 odzywianie.info.pl, 1 oe-it.ru, 1 @@ -108102,7 +108056,6 @@ office2s.com, 1 office365.us, 1 officecode.co.uk, 1 -officeconceptdesign.com, 1 officedivvy.co, 1 officedivvy.com, 1 officedivvy.company, 1 @@ -108142,6 +108095,7 @@ offshoot.rentals, 0 offshore-technology.com, 1 offshore.hosting, 1 +offshorealert.com, 1 offshoremoney.tk, 1 offshoretravelsest.ga, 1 offshorewfs.com, 1 @@ -108218,6 +108172,7 @@ ogunquit.gov, 1 ogurishun.tk, 1 ogurus.com, 1 +oguzhanozoglu.com, 1 ogyaa.jp, 0 ogznet.com, 1 oh14.de, 0 @@ -108349,6 +108304,7 @@ okelections.gov, 1 okeliteairpros.com, 1 okemahok.gov, 1 +okgun.co, 1 okhanvatansever.tk, 1 okhelp.org, 1 okhrana.agency, 1 @@ -108368,7 +108324,6 @@ okkur.org, 1 okkur.team, 1 okkurlabs.com, 1 -oklahomabaptists.org, 1 oklahomaced3.gov, 1 oklahomamoversassociation.org, 1 oklahomanotepro.com, 1 @@ -108518,6 +108473,7 @@ oleg.loan, 1 olegchursin.com, 0 olegon.ru, 1 +olejkisklep.pl, 1 olejostores.com, 1 olekotenizavivki.bg, 1 oleksandr-petrusenko.com, 1 @@ -108618,7 +108574,6 @@ olmari.fi, 1 olmc-nutley.org, 1 olmcjc.com, 1 -olmcnewark.com, 1 olmecaaltos.com, 1 olmet.pl, 1 olmik.net, 1 @@ -108666,6 +108621,7 @@ olympionici.cz, 1 olympsec.io, 1 olymptrade.com, 1 +olympuswatch.com, 1 olympusx.co.za, 1 om.yoga, 1 oma-opa-enkel-urlaub.de, 0 @@ -108676,7 +108632,6 @@ omaha.com, 1 omaha.gov, 1 omahachapterone.org, 1 -omaharoofpros.com, 1 omahcoin.com, 1 omal.info, 1 oman-stick.sale, 1 @@ -108709,6 +108664,7 @@ omega-intranet.com, 1 omegaanimalremoval.com, 1 omegachess.tk, 1 +omegaclickinsights.com, 1 omegacode.pl, 1 omegahosting.net, 1 omegamc.ua, 1 @@ -108752,6 +108708,9 @@ omn.cc, 1 omnel.ml, 1 omnepresent.com, 1 +omnergy.au, 1 +omnergy.com.au, 1 +omnergy.net, 1 omngc.gov, 1 omniaaerospace.com, 1 omniaclubs.com, 1 @@ -108769,6 +108728,14 @@ omniconvert.com, 1 omnicourt.jp, 1 omnidiecasting.com, 1 +omniflex.au, 1 +omniflex.cn, 1 +omniflex.co, 1 +omniflex.co.uk, 1 +omniflex.co.za, 1 +omniflex.com.cn, 1 +omniflex.net, 1 +omniflex.uk, 1 omniflora.shop, 0 omnifotoside.tk, 1 omniga.de, 1 @@ -108777,6 +108744,7 @@ omnisiens.se, 1 omnisky.dk, 1 omnissimmo.fr, 1 +omnitaxhelp.com, 1 omnite.ca, 1 omniteck.ca, 1 omniteck.com, 1 @@ -108803,7 +108771,6 @@ omtcloud.jp, 1 omundojornalismo.pt, 1 omva.de, 1 -omwaccountancy.co.uk, 1 omxz8.com, 1 omxz80.com, 1 omxz9.com, 1 @@ -108837,6 +108804,8 @@ onawaymi.com, 1 onbettertech.com, 1 onbley.com.br, 1 +onboardittech.com, 1 +onboat-seminars.com, 1 onbrand.me, 1 oncall.health, 1 oncalldoctor.ae, 1 @@ -108945,7 +108914,6 @@ onegeology.org, 1 oneggiri.com, 1 onegift.bg, 1 -onegroup.ua, 1 onehealthbehaviors.org, 1 oneheartbali.church, 0 onehost.kz, 0 @@ -109061,6 +109029,7 @@ onguardonline.gov, 1 onhistory.co.uk, 1 onhub1.com, 1 +oni-test.nl, 1 oni.nl, 1 onibolt.com, 1 onic.cc, 1 @@ -109078,6 +109047,8 @@ onionyst.com, 1 oniria.ch, 0 oniriamultimedia.com, 1 +oniroproject.com, 1 +oniroproject.org, 1 onisino.com, 1 oniuq.com, 1 onix.eu.com, 1 @@ -109093,7 +109064,6 @@ onlifehealth.com, 1 online-audio-converter.com, 1 online-bookmakers.ru, 1 -online-bouwmaterialen.nl, 1 online-calculator.com, 1 online-carhire.tk, 1 online-casino-pt.com, 1 @@ -109169,8 +109139,8 @@ onlinedapoxetina.gq, 1 onlinedivorce.com, 1 onlinedivorce.lawyer, 1 +onlinedoctornote.com, 1 onlinedoctranslator.com, 1 -onlinedrumminglessons.com, 1 onlineevent.ch, 1 onlinefile.repair, 1 onlinefilerepair.com, 1 @@ -109225,7 +109195,6 @@ onlineseminar.nl, 1 onlineservisprogrami.com, 1 onlineshopsatkhira.tk, 1 -onlinesim.com, 1 onlinesitereviews.com, 1 onlinesloten.nl, 1 onlinesorusor.cf, 1 @@ -109239,6 +109208,7 @@ onlinetextil.cz, 1 onlineth.com, 1 onlinetntj.com, 1 +onlinetraveltechnology.com, 1 onlinevardenafil.gq, 1 onlineveilingmeester.nl, 1 onlineverdienen.tk, 1 @@ -109259,9 +109229,11 @@ only.lc, 1 only3x.com, 1 only4free.tk, 1 +only4u.co, 1 onlybansgame.com, 1 onlybooks.gq, 1 onlychristian.me, 1 +onlycompress.com, 1 onlycrumbsremain.com, 1 onlydust.xyz, 1 onlyesb.net, 1 @@ -109270,6 +109242,7 @@ onlyfans.love, 1 onlyfitgear.com, 1 onlyflutter.com, 1 +onlyimg.com, 1 onlyincentivesest.ga, 1 onlyjedis.com, 1 onlylithiumhere.gq, 1 @@ -109285,14 +109258,13 @@ onlyveg.tk, 1 onlyvintagewatches.com, 1 onlyvips.club, 1 -onmail.no, 1 onmaps.de, 1 onmaru.com, 1 -onmyodev.com, 1 onmyside.com, 1 onnatuurlijk.tk, 1 onnee.ch, 1 ono.ac.il, 1 +onohawaiianbbq.com, 1 onondaga.gov, 1 ononoki.org, 1 onoranze-funebri.biz, 1 @@ -109307,7 +109279,7 @@ onporn.fun, 1 onrampwallet.com, 1 onrangetout.com, 1 -onrealt.ru, 1 +onrealt.ru, 0 onrr.gov, 1 onsatv.com, 1 onscript.study, 1 @@ -109405,7 +109377,6 @@ oooir.ru, 1 ooonja.de, 1 oooo.loan, 1 -oooo.plus, 1 ooooo.cz, 1 ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.ooo, 1 ooove.ru, 1 @@ -109480,9 +109451,11 @@ openai.sb, 0 openalt.org, 1 openarch.nl, 1 +openarchivaris.nl, 1 openargus.org, 1 openaudio.it, 1 openbackdoor.com, 1 +openbank.us, 1 openbayes.network, 1 openbayesstatus.com, 1 openbeecloud.com, 1 @@ -109534,6 +109507,7 @@ openhandhelds.org, 1 openhistory.de, 1 openhousemelbourne.org, 1 +openhwgroup.cn, 1 openhwgroup.org, 1 openinframap.org, 1 openinsieme.com, 1 @@ -109575,7 +109549,6 @@ openrainbow.org, 1 openre.site, 1 openrealestate.co, 1 -openrecognition.org, 1 openremote.io, 1 openreplay.com, 1 openresa.com, 1 @@ -109595,6 +109568,7 @@ opensource.fund, 1 opensourcecombat.com, 1 opensourceecology.de, 1 +opensourceinnovation.eu, 1 opensourcesoftware.rocks, 1 opensourcesurvey.org, 1 opensourcex.tk, 1 @@ -109650,7 +109624,6 @@ operaunica.tk, 1 operd.gob.do, 1 opernball.com, 1 -opfin.com, 1 opforintel.com, 1 opgani7.info, 1 ophelia-escort.de, 1 @@ -109694,6 +109667,7 @@ opomec.com, 1 opop.cz, 1 opopulechki.tk, 1 +oporaua.org, 1 oportunidadeganhos.tk, 1 oportunidadinfinita.tk, 1 opos.cf, 1 @@ -109737,6 +109711,7 @@ opsdis.com, 1 opsecx.com, 1 opsholders.com, 0 +opsiocloud.com, 1 opskins.tk, 1 opskiwi.work, 1 opsmate.com, 0 @@ -109746,6 +109721,7 @@ opspedia.id, 1 opstory.com, 1 opstrengning.tk, 1 +opswat.com, 1 opswill.com, 1 opta-tv.com, 1 optalysys.com, 1 @@ -109759,6 +109735,7 @@ optibelt.com, 1 optic-street.ru, 1 optical-faking.tk, 1 +opticaluxor.ua, 1 opticamasvision.com, 1 opticasocialvision.com, 1 opticiansri.org, 1 @@ -109853,7 +109830,8 @@ opture.ch, 1 optykgill.pl, 1 optymyze.com, 1 -opulentranch.com, 1 +opulentdivision.com, 0 +opulentranch.com, 0 opus-codium.fr, 1 opus-labs.fr, 1 opus4.com, 1 @@ -109869,7 +109847,6 @@ opzich.nl, 1 oqevapimivud.tk, 1 oqgn.om, 1 -oqpo.ru, 1 oqrqtn7ynmgc7qrgwd-ubhdvfiymfbjrh5ethdti8.com, 0 oqwebdesign.com, 1 orablanket.co.nz, 1 @@ -109960,7 +109937,6 @@ orcas.tk, 1 orcasecurity.io, 1 orchardnh.org, 1 -orchestra-ppm.io, 1 orchestra.tk, 1 orchestremetropolitain.com, 1 orchidee-mariage.com, 1 @@ -110144,8 +110120,6 @@ orion-universe.com, 1 orioneclipse.com, 1 orionelement.com, 1 -orionfcu.com, 0 -orionfinancialservices.com, 1 oriongames.eu, 1 orionhermeticinterventions.com, 1 orionintel.es, 1 @@ -110181,7 +110155,6 @@ ornithopter.tk, 1 ornsyn.no, 1 ornua.com, 1 -oro-express.es, 1 oro.milano.it, 1 oro.roma.it, 1 oro97.com, 1 @@ -110195,6 +110168,7 @@ oroshikikin.jp, 1 orpheus.network, 1 orpheus2.com.ec, 1 +orproperties.pt, 1 orquestas.tk, 1 orrs.de, 1 orsal.fr, 1 @@ -110281,7 +110255,6 @@ osamatoon.ml, 1 osandp.com, 1 osankj.tk, 1 -osano.ai, 1 osano.com, 1 osarahealth.com, 1 osateam.tk, 1 @@ -110319,6 +110292,8 @@ osdeployment.com, 0 osdeployments.com, 0 osdfcon.org, 1 +osdforum.com, 1 +osdforum.org, 1 osdgen.com, 1 osdls.gov, 1 osduforum.org, 1 @@ -110336,6 +110311,7 @@ osfpmsa.org, 1 osgcloud.co.uk, 1 osgi.org, 1 +osgiusers.org, 1 osgrm.by, 1 osgroup.tk, 1 oshacademy.com, 1 @@ -110356,9 +110332,9 @@ osirisrp.online, 1 osirium.com, 1 osiriz.xyz, 1 -osk-group.ru, 0 oskarkopra.fi, 1 oskety.com, 1 +oskgroup.com, 1 oskrba.net, 1 oskrba.online, 1 oskuro.net, 1 @@ -110465,6 +110441,7 @@ otakurumi.de, 1 otakuzonefanzine.tk, 1 otariarutiunian.com, 1 +otchet360.ru, 1 otdel16.tk, 1 otdelka56.ml, 1 otdelka76.tk, 1 @@ -110484,11 +110461,9 @@ oticasvisao.net.br, 1 otima.digital, 1 otimismoemrede.tk, 1 -otimo.ro, 1 otinane.eu, 1 otiocafes.com, 1 otipax.ru, 1 -otiumtech.com, 1 otkm-stuttgart.tk, 1 otng.us, 1 otnij.pl, 1 @@ -110549,7 +110524,6 @@ otvaracie-hodiny.sk, 1 otya.me, 1 otzyvy.cc, 1 -otzyvy.ws, 1 ouaibe.qc.ca, 1 ouaie.be, 1 ouaisetalors.fr, 1 @@ -110657,7 +110631,7 @@ outdoorswithmax.com, 1 outdoorsytravel.com, 1 outerface.net, 1 -outerlandstravel.com, 0 +outerlandstravel.com, 1 outerlimitsdigital.com, 1 outernet.tk, 1 outerspace.ga, 1 @@ -110820,6 +110794,7 @@ owensvilleoh.gov, 1 owethecure.win, 1 owfactory.com, 1 +owfroehlich.de, 1 owid.cloud, 1 owise.tk, 1 owl-media.pl, 1 @@ -110846,6 +110821,7 @@ owldevelopers.tk, 1 owlhollowbakery.com, 1 owllee.com, 1 +owlmaster.org, 1 owlnull.me, 1 owlofminerva.net, 1 owlscrap.ru, 1 @@ -110868,7 +110844,6 @@ owntournament.org, 1 ownwolke.de, 1 ownyourfamily.com, 1 -owo.enterprises, 1 owo.rs, 1 owo.vn, 1 owop-filmscoring.com, 1 @@ -110945,6 +110920,7 @@ oxytocin.org, 1 oxytocin.wiki, 1 oxyx.tk, 1 +oy.com.ua, 1 oyakyamacevler.net, 1 oyal.co.uk, 1 oyama-karate.tk, 1 @@ -110960,7 +110936,6 @@ oyoshi.com.my, 1 oyosoft.net, 1 oyr79.tk, 1 -oysterboxhotel.com, 1 oysterlink.com, 1 oysterworldwide.com, 1 oytic.com, 1 @@ -111037,7 +111012,7 @@ p-konto.tk, 1 p-ku.com, 1 p-p.site, 1 -p-pac.com, 0 +p-pac.com, 1 p-pc.de, 1 p-soc.com.br, 1 p.ac, 1 @@ -111148,6 +111123,7 @@ pacasino.com, 1 pacatlantic.com, 1 pacay.id, 1 +pacaya.com, 1 paccar.com, 0 pacch.io, 1 pacco.tk, 1 @@ -111321,6 +111297,7 @@ pagedesignshop.com, 0 pagefulloflies.io, 1 pagehost.one, 1 +pagemedical.co.uk, 1 pagenews.tk, 1 pagenstedt.de, 1 pageonstage.at, 1 @@ -111343,6 +111320,7 @@ paging.blog, 0 pagliucadb.ddns.net, 1 pagodart.com.br, 1 +pagodil.it, 1 pagoonline.com.br, 1 pagtee.com, 1 pagueveloz.com.br, 1 @@ -111359,6 +111337,7 @@ pahui.cf, 1 pahui.ml, 1 pahuudenanatomia.fi, 0 +paid.tools, 1 paide.edu.ee, 1 paidsurveys.tk, 1 paidtocode.com, 1 @@ -111376,6 +111355,7 @@ painesvillemunicipalcourt-ohio.gov, 1 painful.fun, 1 painkiller-tech.com, 1 +painresearchforum.org, 1 paint-it.pink, 1 paint4.life, 1 paintball-ljubljana.si, 1 @@ -111407,7 +111387,7 @@ pajbot.de, 1 pajobsite.com, 1 pajuvuo.fi, 1 -pakalolo.eu, 1 +pakalolo.eu, 0 pakaranggrek.com, 1 pakawal.com, 1 paket.monster, 1 @@ -111440,7 +111420,6 @@ paknetworking.org, 1 pakostane-apartments.tk, 1 pakpak.tk, 1 -pakpedia.pk, 1 pakremit.com, 1 paks.hu, 0 paksui-ne.tk, 1 @@ -111555,6 +111534,7 @@ pamdrew.com, 1 pamelafong.com, 1 pamelastimpson.com, 1 +pamiers-citoyenne.fr, 1 pamirabezmenphotography.com, 1 pamlightdesign.com, 1 pamlims.net, 1 @@ -111654,6 +111634,7 @@ panduan-hamil.tk, 1 pandymic.com, 1 pandys.org, 1 +panel-protv.com, 1 panel-stroy.cf, 1 panelbear.com, 1 paneldewelopera.pl, 1 @@ -111662,14 +111643,12 @@ panele-fotowoltaiczne.pl, 1 paneljobsers.ga, 1 panelsandwich.com, 1 -panetolikos.gr, 1 paneu.de, 1 panezai.tk, 1 pang.ga, 1 pangalactic.io, 1 pangea-it.com, 1 pangea.cloud, 1 -pangge.io, 1 pangoconcierge.com, 1 pangolin.exchange, 0 pangolin.org, 1 @@ -111701,6 +111680,7 @@ panmourovaty.cz, 1 panmuseum.gr, 1 panna-blues.tk, 1 +panneldning.com, 1 pannellisolari.roma.it, 1 panneton.net, 1 pannovate.com, 1 @@ -111735,6 +111715,7 @@ pantallasyescenarios.com, 0 pantera.tk, 1 panthenolplus.co.uk, 1 +panthenolplus.com, 1 pantherage.co.uk, 1 pantherauto.no, 1 panthi.lk, 1 @@ -111744,7 +111725,6 @@ pantryjars.com, 1 pants-off.xyz, 1 pants-on.net, 1 -pantsdirect.shop, 1 pantsu.club, 1 pantsuservice.tk, 1 pantuflas.tk, 1 @@ -111816,7 +111796,6 @@ papieri.dental, 1 papierniak.net, 1 papierniczy.eu, 1 -papierowyrycerz.pl, 1 papillegustative.com, 1 papillon-events.be, 1 papirladen.dk, 1 @@ -111825,15 +111804,13 @@ papotage.net, 1 papouille.ml, 1 pappasappar.se, 1 -pappasus.com, 1 pappu.tk, 1 pappys.kitchen, 1 -papuaekspose.com, 0 +papuaekspose.com, 1 papuaone.com, 0 papuzkija.pl, 1 paqtam.com, 1 par-allel.ru, 1 -para-sports.tokyo, 1 parabellum-barakaldo.tk, 1 parablu.com, 1 parabolaeditorial.com.br, 1 @@ -111848,6 +111825,7 @@ paradex.io, 1 paradies-baar.ch, 1 paradiesgirls.ch, 1 +paradigma-med.ru, 1 paradigmas.tk, 1 paradigmreporting.com, 1 paradigmworldmarketing.com, 1 @@ -111958,7 +111936,6 @@ parentsguidetotheworld.com, 0 parentsupervisa.ca, 1 pareshukuk.com, 1 -pareto-decor.de, 1 pareto.space, 1 paretoit.com, 1 paretorule.cf, 1 @@ -111967,6 +111944,7 @@ parfumer.tk, 1 parfumi-eu.com, 1 parfumi.tk, 1 +parfummobilvip.com, 1 parfumtester-100.ml, 1 parhoonshop.com, 1 pari-match.in, 1 @@ -111981,6 +111959,7 @@ paridurable.com, 1 parikmag-pm.ru, 1 parikmaxeru.tk, 1 +pariksana.cloud, 1 parimatch-best.com, 1 parimatch-chance.com, 1 parimatch-email.com, 1 @@ -111994,7 +111973,6 @@ parimatchsports.com, 1 parimatchtop.com, 1 parina.vn, 1 -parinay.com, 1 pario.li, 1 paripesa.com, 1 paripesa.ng, 1 @@ -112020,7 +111998,7 @@ parisportif.tv, 1 parisshop.com.tr, 1 parissportifs.com, 1 -pariu.online, 0 +pariu.online, 1 parizhanka.tk, 1 park.gd, 1 parkable.com, 1 @@ -112040,6 +112018,8 @@ parkderm.com, 1 parkdworski.pl, 1 parkeer.nl, 1 +parkeergaragesintjan.nl, 1 +parkeergaragestjan.nl, 1 parkeerserviceboxtel.nl, 1 parkefficient.de, 1 parkerco.gov, 1 @@ -112109,7 +112089,6 @@ parmoli.tk, 1 parnassius.name, 1 parnassys.net, 1 -parniplus.com, 1 parnizaziteksasko.cz, 1 paroisses-theix-surzur.com, 1 parokia.hu, 1 @@ -112142,6 +112121,7 @@ parsdev.com, 0 parsec.app, 1 parsemail.org, 1 +parsepipe.com, 1 parser.name, 1 parser.nu, 1 parseur.com, 1 @@ -112169,6 +112149,7 @@ particleslam.com, 1 partido-libertario.tk, 1 partidolibertario.tk, 1 +partidos-de-hoy.com, 1 partigetir.com, 1 partigoldendoodle.com, 1 partii.tk, 1 @@ -112176,6 +112157,7 @@ partijvoordedieren.nl, 1 partik.com.br, 1 partilino.com, 1 +partimalzemelerim.com, 1 partin.nl, 0 partiono.com, 1 partir-en-livre.fr, 1 @@ -112234,6 +112216,7 @@ partyclub.tk, 1 partycoin.ga, 1 partyevents.tk, 1 +partyfess.com, 1 partygangsta.de, 1 partyhireliverpool.co.uk, 1 partykanal.cz, 1 @@ -112318,7 +112301,6 @@ passionatehvaclv.com, 1 passionatelife.com.au, 1 passiondesigns.web.id, 1 -passionebenessere.com, 1 passionecavalli.it, 1 passionegriglia.com, 1 passionmag.fr, 1 @@ -112326,7 +112308,7 @@ passions-art.com, 1 passiton.com, 1 passive-work.gq, 1 -passiveblogger.com, 1 +passiveblogger.com, 0 passivebook.com, 1 passivehousecal.org, 1 passiveseinkommen.tk, 1 @@ -112360,6 +112342,7 @@ passwords.google.com, 1 passwordsapp.org, 1 passwordscon.com, 1 +passwordscon.org, 1 passwordsecurity.info, 1 passwordsecuritycenter.com, 1 passwordsheeters.ga, 1 @@ -112371,6 +112354,7 @@ pastaroomers.ga, 1 pastaroomest.ga, 1 paste.fedoraproject.org, 1 +paste.md, 1 paste.quest, 1 paste.rodeo, 1 paste.to, 1 @@ -112412,14 +112396,12 @@ patagosfm.tk, 1 patanegra-jambon.fr, 1 patanegra-prosciutto.it, 1 -patanegra-schinken.ch, 1 patanegra-schinken.de, 1 patapwn.com, 1 patasolapress.org, 1 pataua.kiwi, 1 patbatesremodeling.com, 0 patchassociates.com, 1 -patchduty.com, 1 patchli.fr, 1 patchofabsence.com, 1 patchstack.com, 0 @@ -112473,6 +112455,7 @@ patlis.com, 1 patmanx.tk, 1 patna-pomosht.eu, 1 +pato114.com, 1 patorganiser.co.uk, 1 patorganiser.com, 1 patorganiser.com.au, 1 @@ -112512,6 +112495,7 @@ patrikjohan.tk, 1 patriksima.cz, 1 patrikx3.com, 1 +patrimoine-neuwiller.fr, 1 patriotbearingsupply.com, 1 patriotcs.tk, 1 patriotinsurancebrokers.com, 0 @@ -112569,6 +112553,7 @@ paulgerberrealtors.com, 1 paulglaser.de, 1 paulgo.io, 1 +paulharrisoncars.com, 1 paulibean.tk, 1 paulinaschubert.net, 1 paulini.ga, 1 @@ -112622,7 +112607,6 @@ paultymoshenko.com, 1 paulus-foto.pl, 1 paulus.cloud, 1 -paulw.io, 1 paulward.net, 1 paulwatabe.com, 1 paulwatler.co.uk, 1 @@ -112661,7 +112645,6 @@ pavlic.se, 1 pavlograd-news.ru, 1 pavlogradnews.ru, 1 -pavlov-ledec.cz, 1 pavlova.es, 1 paw.cloud, 1 paw.net.pl, 1 @@ -112669,7 +112652,6 @@ pawafuru.com, 0 pawapuro.ga, 1 pawapuro.tk, 1 -pawbuddi.com, 1 pawc.cc, 1 pawchewgo.com, 1 pawdecor.com, 1 @@ -112753,7 +112735,6 @@ paycomdfw.com, 0 paycomonline.com, 0 paycrest.io, 1 -paydepot.com, 1 paydollar.com, 1 paye.net, 0 payeasy.tech, 1 @@ -112857,6 +112838,7 @@ pb.ax, 0 pbaby.com, 1 pback.se, 1 +pband.ch, 1 pbbm.com.ph, 1 pbc.gov, 1 pbcables.tk, 1 @@ -112868,7 +112850,6 @@ pbest.tk, 1 pbforestry.net, 1 pbgfl.gov, 1 -pbgkennels.com, 1 pbhs.co.uk, 1 pbiexplorer.com, 1 pbla.biz, 1 @@ -112881,7 +112862,6 @@ pbraunschdash.com, 1 pbrb.gov, 1 pbrumby.com, 1 -pbsbooks.org, 1 pbsrmoto.com.au, 1 pbsuite.com, 1 pbtc.org, 1 @@ -112896,7 +112876,6 @@ pc-reanimator.ru, 1 pc-remont.tk, 1 pc-reparatur.com, 1 -pc-reparatur.me, 1 pc-service.me, 1 pc-servis-brno.com, 1 pc-soft.gq, 1 @@ -112922,7 +112901,6 @@ pcc.iq, 1 pccc.co.za, 1 pccdal.gov, 1 -pccentralservicios.com, 1 pccomc.tk, 1 pcdekegel.nl, 1 pcdocjim.com, 1 @@ -112967,6 +112945,7 @@ pcpasokh.ir, 1 pcpirates.tk, 1 pcplaza.tk, 1 +pcpluftgevaer.dk, 1 pcprkolo.pl, 1 pcproblem.tk, 1 pcptest-api.azurewebsites.net, 1 @@ -113003,6 +112982,7 @@ pcunderground.com.ar, 1 pcvalueservices.com.au, 1 pcvirusclear.com, 1 +pcvw.co.uk, 1 pcwdevtwebsite.azurewebsites.net, 1 pcweb.info, 1 pd1rnt.nl, 1 @@ -113010,7 +112990,6 @@ pdau.edu.ua, 1 pdavislawgroup.com, 1 pdax.ph, 0 -pdaxue.com, 1 pderas.com, 1 pdesinc.org, 1 pdf-archive.com, 0 @@ -113047,6 +113026,7 @@ pdtppfl.gov, 1 pdvault.co, 1 pdxcoinclub.org, 1 +pdxroofingandsiding.com, 1 pdz.net, 1 pe-bank.jp, 1 pe-netz.de, 1 @@ -113063,7 +113043,6 @@ peaceexpoest.ga, 1 peacefulexperiences.com, 1 peacefulrock.com, 1 -peaceispossible.cc, 1 peacekeeper.tk, 1 peacepiperanch.com, 1 peacetourco.cf, 1 @@ -113076,11 +113055,9 @@ peakbrokerageservices.com, 1 peakd.com, 1 peakhillre.ga, 1 -peakperformance.hr, 1 peakrepportal.com, 1 peaksalesrecruiting.com, 1 peakseoservices.co.uk, 1 -peaksix.ch, 1 peaksports.com, 0 peaksupport.io, 1 peaktribe.ro, 1 @@ -113089,7 +113066,9 @@ peanutpay.de, 1 peanutproductionsnyc.com, 1 pearbloom.com, 1 +pearl-cloud.co.uk, 1 pearl-dentalclinic.jp, 1 +pearl-scan.co.uk, 1 pearlchaos.com, 1 pearle.nl, 1 pearlharbordrydockeisopenhouse.org, 0 @@ -113122,7 +113101,6 @@ pecasse.be, 1 pecetowicz.pl, 1 pecheneg.tk, 1 -pechibani.by, 0 pechka.tk, 1 pechonova.com, 1 pecker-johnson.com, 1 @@ -113321,7 +113299,6 @@ pencillab.cn, 1 pencilnecks.com, 1 penconsultants.com, 1 -pendidikan.co.id, 1 pendikeskort.com.tr, 1 pendletoncountyky.gov, 1 pendletoncountywv.gov, 1 @@ -113381,6 +113358,7 @@ penopoly.ml, 1 penopoly.tk, 1 penosa.ga, 1 +penpalworld.com, 1 penril.net, 1 penrite.pl, 1 penrose.edu, 1 @@ -113391,11 +113369,9 @@ pensacolawinterfest.org, 1 pensador.com, 1 pensador.info, 1 -pensago.com, 1 pensatore.tk, 1 pensia.tk, 1 pensieridigitali.tk, 1 -pensierolaterale.tech, 1 pensioenfonds-ey.nl, 0 pension-am-alten-waschhaus.de, 1 pension-chevaux.com, 1 @@ -113545,6 +113521,7 @@ perd.re, 1 perdanabagus.tk, 1 perdita-capelli.tk, 1 +perditumtriumvirate.com, 1 perdolyathlendr.tk, 1 perecraft.com, 1 peredovaya.tk, 1 @@ -113563,7 +113540,6 @@ perevedi.org, 1 perevedut.cf, 1 perevod-kakadu.com, 1 -perevod-tekst-pesni.ru, 1 perewall.tk, 1 perezdecastro.org, 0 perf-b2b.com, 1 @@ -113603,11 +113579,9 @@ perfectworldbot.tk, 1 perfekt-style.com, 1 perfekt.software, 1 -perfekt2004.com, 1 perfektesgewicht.com, 1 perferxprecision.com, 1 perfilesdeopinion.com, 1 -perfios.com, 1 perfmatters.io, 1 perfmed.ro, 1 perforazioni.it, 1 @@ -113625,7 +113599,6 @@ performingdreams.tk, 1 performiptv.com, 1 performive.com, 1 -performpracticesolutions.com, 1 perfumerie.tk, 1 perfumes.com.br, 1 perfumesweb.com.br, 1 @@ -113675,7 +113648,6 @@ permaculture.cf, 1 permaditya.my.id, 1 permajack.com, 1 -permajackofstlouis.com, 1 permajackstlouis.com, 1 permak.com.tr, 1 permak.tk, 1 @@ -113734,10 +113706,10 @@ perscent.com.au, 1 perscore.tk, 1 perseo.tk, 1 -perseusmining.com, 1 persey-ssm.com.ua, 1 persey.tk, 1 persian-clan.tk, 1 +persianasmodernasluxury.com, 1 persiandating.tk, 1 persianmassagetherapy.com, 1 persianpool.ir, 1 @@ -113821,6 +113793,7 @@ pervoklass.cf, 1 pervomaysk-city.ml, 1 perzeidi.hr, 1 +pesamarket.com, 1 pesandansampai.tk, 1 pesar.tk, 1 pesaventofilippo.com, 1 @@ -113908,6 +113881,7 @@ peter.org.ua, 1 peterackermans.tk, 1 peterandjoelle.co.uk, 1 +peterannawedding.us, 1 peterarcherbeyondvision.com, 0 peterbarrett.ca, 1 peterbischof.at, 1 @@ -113947,7 +113921,6 @@ peterrentrop.com, 0 peters-halstenbek.de, 1 peters.consulting, 1 -peters.li, 1 petersburgmi.gov, 1 petersime.com, 1 petersonsbreakingnewsoftrenton.com, 1 @@ -114142,7 +114115,6 @@ pfingstberg.de, 1 pfingstsportfest.de, 1 pfish.zone, 1 -pfk.org.pl, 0 pflanzen-shop.ch, 1 pflanzen-werkstatt.de, 1 pflege.ch, 1 @@ -114191,7 +114163,7 @@ pgp.lol, 1 pgp.net, 1 pgp.network, 1 -pgp.org.au, 1 +pgp.org.au, 0 pgpmail.cc, 1 pgregg.com, 1 pgsec.cz, 1 @@ -114230,6 +114202,7 @@ pharmaabsoluta.com.br, 1 pharmabach.com, 1 pharmaboard.de, 1 +pharmabraille.com, 1 pharmaceutical-technology.com, 1 pharmaceuticalcannabis.org, 1 pharmacie-dufayel.fr, 1 @@ -114277,8 +114250,6 @@ phdsolutions.org, 1 phdwuda.com, 1 pheasantrunpress.com, 1 -phellow.de, 1 -phellowseven.com, 1 phelx.de, 1 phen-garcinia.info, 1 phenergan.ga, 1 @@ -114451,6 +114422,7 @@ phonenumberfind.gq, 1 phonenumberfind.ml, 1 phonenumberfind.tk, 1 +phonenumberwizard.com, 1 phonesbooksest.ga, 1 phonesexchat.com, 1 phonesexnumbers.com, 1 @@ -114464,7 +114436,6 @@ phonex.com.mx, 1 phoneyourselfers.ga, 1 phoneyourselfest.ga, 1 -phongchumienphi.com, 1 phonicarecords.com, 1 phonix-company.fr, 1 phonosynthese.tk, 1 @@ -114566,7 +114537,6 @@ php.watch, 1 phpadmin666.com, 1 phparena.net, 1 -phpartners.org, 1 phpbb-tutorials.cf, 1 phpbbchinese.com, 0 phpcraft.de, 1 @@ -114642,6 +114612,7 @@ phyley.com, 1 phyllis.nl, 1 phyllischerry.com, 1 +phynix-hhu.de, 1 phyrone.de, 1 phyrone.eu, 1 physia.gr, 1 @@ -114717,6 +114688,8 @@ piatika.com, 1 piatika.in, 1 piavonpadberg.com, 1 +pib.gd, 1 +pibgd.fr, 1 piboston.org, 1 piboubes.me, 1 pic-sl.com, 1 @@ -114741,7 +114714,7 @@ piccolospace.com, 1 piccolotrasloco.it, 1 picdefacer.com, 1 -pichainlabs.com, 0 +pichainlabs.com, 1 pichau.com.br, 1 pichlerei.at, 1 pick150.hu, 1 @@ -114772,7 +114745,6 @@ picksygirl.com, 1 picktablet.com, 1 pickupenc.ru, 1 -pickuproutines.com, 1 picloudedge.com, 1 picme.tk, 1 picmediaprod.com, 1 @@ -114825,6 +114797,7 @@ piecestech.com, 0 piechart.ga, 1 pieddebiche-paris.com, 1 +piedraconstruction.ma, 1 piedrahita.tk, 1 piedrasblancas.gov, 1 piedrasconencanto.com, 1 @@ -114868,10 +114841,10 @@ pierrevieville.fr, 0 pierreyvesdick.fr, 1 pierrot-bg.com, 1 -piersmana.com, 1 pierson.tk, 1 pierstone.com, 1 pierugo.ch, 1 +pieseagricole.ro, 1 piesel-piepser.de, 1 pietbrakman.tk, 1 pietechsf.com, 0 @@ -114890,8 +114863,8 @@ pig-breeding.tk, 1 pig333.com, 1 pigb.net, 1 -pigdetector.com, 1 pigeonholelive.com, 1 +pigeonpairstays.com, 1 pigeonracinginformation.com, 1 pigeons-rings.com, 1 pigfox.com, 1 @@ -114979,7 +114952,6 @@ pimastoneaz.com, 1 pimhaarsma.nl, 1 pimhaarsmamedia.nl, 1 -pimichi.com, 1 pimmel.stream, 1 pimoid.fr, 1 pimplelotionest.ga, 1 @@ -115035,7 +115007,6 @@ pinerivermi.gov, 1 pinesol.com, 0 pinetreeadvisors.us, 1 -pineviewlogan.com, 1 pinfong.com, 1 ping-books.cf, 1 pingbandiannao.com, 0 @@ -115044,7 +115015,6 @@ pingodoce.pt, 1 pingperfect.com, 1 pingpongparkinson.at, 1 -pingpongsourcing.com, 1 pingrc.net, 1 pinguinita.tk, 1 pinguinreal.sk, 1 @@ -115150,6 +115120,7 @@ pinterjann.is, 1 pinterst.com, 1 pintrest.com, 1 +pinturacomex.com, 1 pinupbets.gq, 1 pinupsex.com, 1 pinxporn.net, 1 @@ -115221,7 +115192,6 @@ pirxpilot.me, 1 pisaggni.ch, 1 pisanpeikot.tk, 1 -pisaparaasescolas.pt, 1 pisarzowa.tk, 1 pisatoday.it, 1 piscapisca.pt, 1 @@ -115313,7 +115283,9 @@ piw.pw, 0 piwko.co, 1 pix-geeks.com, 1 +pix18.ru, 1 pix5.de, 1 +pixa.co.id, 1 pixalatio.tk, 1 pixallphotography.com, 1 pixbaton.jp, 1 @@ -115333,7 +115305,6 @@ pixelcrayons.com, 1 pixelfed.cr, 1 pixelfiends.tk, 1 -pixelforyourthoughts.com, 1 pixelglance.com, 1 pixelgliders.de, 1 pixelglue.com.au, 1 @@ -115344,7 +115315,6 @@ pixelkraft.net, 1 pixellent.me, 1 pixelmania.se, 1 -pixelmarketing.hu, 0 pixelmattic.com, 1 pixelmedianetwork.com, 1 pixelmonworld.fr, 1 @@ -115436,6 +115406,7 @@ pjsk.cc, 1 pjsk.eu.org, 1 pjv.co.id, 1 +pjweb.co.uk, 1 pk-master.tk, 1 pk-soft.tk, 1 pk.search.yahoo.com, 0 @@ -115458,7 +115429,6 @@ pko.ch, 0 pkov.cz, 1 pkservice.tk, 1 -pkshs.my, 1 pkspskov.tk, 1 pkwebsolutions.cf, 1 pl-beauty.com.ua, 1 @@ -115519,8 +115489,10 @@ plaloo.tk, 1 plamenapanayotova.co.uk, 1 plan-in-architektur.de, 1 +plan4kick.de, 1 planable.io, 1 planafy.com, 1 +planatus.com, 1 planbase.com, 1 planchasvertical.es, 1 plancke.io, 1 @@ -115563,7 +115535,6 @@ planeteroliste.com, 1 planeteroliste.fr, 1 planetevegan.com, 1 -planetexim.net, 1 planetfertilityest.ga, 1 planetgolf.de, 1 planetgrehen.tk, 1 @@ -115576,6 +115547,7 @@ planetmobile.tk, 1 planetmugen.tk, 1 planetnaturopath.com, 1 +planetofwoman.com, 1 planetonline.tk, 1 planetradio.tk, 1 planetromeo.com, 1 @@ -115688,6 +115660,7 @@ plastischechirurgie-linz.at, 1 plastokna.tk, 1 plastovelehatko.cz, 1 +plastrequest.com, 1 plataformascebrian.com, 1 plataformaslms.com, 1 platanakia.tk, 1 @@ -115749,7 +115722,6 @@ plavdoma.com.ua, 1 plavormind.tk, 1 play, 1 -play-asia.com, 1 play-best-games.com, 1 play-charades.com, 1 play-lu.com, 1 @@ -115831,11 +115803,12 @@ playzone.tk, 1 plaza-athenee.com, 1 plaza.ph, 1 -plazacovadonga.com, 1 +plazait.co.id, 1 plazaservicesllc.com, 1 plazasummerlin.com, 1 plcgurus.net, 1 plchardware.com, 1 +pldeyewear.com.ua, 1 pldx.org, 1 ple.jp, 1 ple.llc, 1 @@ -115847,6 +115820,7 @@ pleasantville-nj.org, 1 pleasantvillepd.org, 1 please-uwu.me, 1 +pleasesavemypc.com, 1 pleaseuseansnisupportedbrowser.ml, 1 pleasure-science.com, 1 pleasure.box, 1 @@ -115925,7 +115899,6 @@ ploomber.io, 1 ploppis.org, 1 ploptec.tk, 1 -plothost.com, 1 plotly.com, 0 plotscout.ae, 0 ploulech.fr, 1 @@ -115967,7 +115940,6 @@ plumcreekwinery.com, 1 plumlakewi.gov, 1 plumlocosoft.com, 1 -plumnet.ch, 0 plumperthumbs.com, 1 plumpie.net, 0 plumsail.com, 1 @@ -115987,6 +115959,7 @@ plus15.tk, 1 plus1s.site, 1 plusbot.tk, 1 +plusbus.info, 1 plusdefleurs.com, 1 plusfitness.com.au, 1 plusgrandevilledefrance.com, 1 @@ -115995,7 +115968,6 @@ pluspass.com, 1 plusport-api.com, 1 plusport.com, 1 -plusreed.com, 1 plustwik.com, 1 plutiedev.com, 1 pluto5000.com, 1 @@ -116011,6 +115983,7 @@ plymouthshawneeindians.org, 1 plymouthtownshippa.gov, 1 plymouthwi.gov, 1 +plyuk.site, 1 plz.report, 1 plzen-sadrokarton.cz, 1 plzen.fun, 1 @@ -116042,6 +116015,7 @@ pmcancerclasses.ca, 1 pmcancerrehab.ca, 1 pmcaregiver.ca, 1 +pmcorp.com, 1 pmctcg.com, 1 pmctire.com, 0 pmdealerest.ga, 1 @@ -116054,6 +116028,7 @@ pmgroup-global.com, 0 pmh.codes, 1 pmh.so, 1 +pmhh.com.br, 1 pmi-install.com, 1 pmi.edu, 1 pmi.gov, 1 @@ -116089,6 +116064,7 @@ pneumatici.roma.it, 1 pneumogen.net, 1 pneupro.ma, 1 +pneuscentergilly.be, 1 pnevmo-trade.ru, 1 pnfiles.tk, 1 png.ai, 1 @@ -116288,10 +116264,9 @@ podivilov.net, 1 podivilov.org, 1 podivilov.ru, 1 -podmedia.network, 1 +podmedia.network, 0 podnikatel.cz, 1 podologie-tangstedt.de, 1 -podologolaspezia.it, 1 podologyclinic.gr, 1 podolskaya.tk, 1 podoscop.org, 1 @@ -116345,7 +116320,6 @@ pogodavolgograd.tk, 1 pogodok.tk, 1 pogomate.com, 1 -pogoswine.com, 1 pogotowie-komputerowe.tk, 1 pogotowiekomputeroweolsztyn.pl, 1 pogrebeniq-sofia.com, 1 @@ -116486,6 +116460,7 @@ polar.dk, 1 polarbear.army, 1 polarhome.tk, 1 +polaris-psychology.com, 1 polarisapp.xyz, 1 polarisengineering.com, 1 polarispool.com, 0 @@ -116561,6 +116536,9 @@ polishtranslation.com, 1 polisi.go.tz, 1 polisipati.tk, 1 +polismar.com, 1 +polismar.pt, 1 +polismar.uy, 1 polisport.tk, 1 polisynazycie.com.pl, 1 polit-it.pro, 1 @@ -116589,6 +116567,7 @@ politikainavigator.hu, 1 politique-etrangere.com, 1 politisor.com, 1 +politizen.org, 1 politnews5.tk, 1 politraq.ca, 1 politraq.com, 1 @@ -116607,7 +116586,6 @@ pollet-ghys.be, 1 pollet.tech, 1 pollev-embeds.com, 1 -pollev.com, 1 polleverywhere.com, 1 polliga.tk, 1 pollinators.ie, 1 @@ -116653,7 +116631,6 @@ polygraphi.ae, 1 polymake.org, 1 polymath.pm, 1 -polymathian.com, 1 polymerexpert.biz, 1 polymesh.network, 1 polymics.com, 0 @@ -116667,7 +116644,6 @@ polysfarm.com, 1 polytekniskforening.dk, 1 polyvalents.fr, 1 -pomadgw.xyz, 1 pomba.pl, 1 pombalhome.duckdns.org, 1 pombas.net, 1 @@ -116732,7 +116708,7 @@ ponydesignclub.nl, 1 ponyfoo.com, 1 ponyhof-muensterland.de, 1 -ponytail.fr, 1 +ponytail.fr, 0 ponytailsdesigns.com, 1 poobert.tk, 1 poochpark.tk, 1 @@ -116743,7 +116719,7 @@ pookhaarden.nl, 1 pookl.com, 1 pool-selber-bauen.de, 1 -poolcalculator.net, 1 +poolcalculator.net, 0 pooletranslation.com.au, 1 pools.shop, 1 poolsafely.gov, 1 @@ -116984,6 +116960,7 @@ portalelavoro.org, 1 portaleldense.tk, 1 portalexpressservices.com, 1 +portalhipotecario.mx, 1 portalinmobiliario.com, 1 portall.in, 1 portalm.tk, 1 @@ -117085,6 +117062,7 @@ poseidon-giesing.de, 1 poseidonwaterproofing.info, 1 poseidonworld.tk, 1 +posh.ai, 1 posh.tech, 1 poshasaudi.com, 1 poshcastles.co.uk, 1 @@ -117168,6 +117146,7 @@ postfinance.ch, 1 postimages.org, 1 postimg.cc, 1 +postimpact.com.au, 1 postkassetrimmen.no, 1 postlakeswi.gov, 1 postlifepreps.com, 1 @@ -117205,6 +117184,7 @@ posturography.training, 1 posturologie.info, 1 posturologo.roma.it, 1 +postwave.studio, 1 postzegelontwerpen.nl, 1 posukovskaschola.cz, 1 posutochno.ml, 1 @@ -117222,7 +117202,6 @@ potatosouprecipe.ml, 1 potatotee.com, 1 potatron.tech, 1 -potature.it, 1 potature.rimini.it, 1 potature.roma.it, 1 potbelly.com, 1 @@ -117265,7 +117244,6 @@ potworowski.de, 1 potz.tk, 1 pouchulu.tk, 1 -poudlard.fr, 1 pouets.ovh, 1 pouletrecettes.com, 1 poullis.org, 1 @@ -117356,7 +117334,6 @@ powerplan.com, 1 powerplay.xyz, 0 powerplayer.tk, 1 -powerplusnutrition.com, 1 powerroo.com.au, 1 powersaleskc.com, 1 powerscif.com, 1 @@ -117399,7 +117376,9 @@ powertrike.tk, 1 powertrunk.com, 1 powertuning.com.br, 1 +powerup.aero, 1 poweruser.su, 1 +powerviewcp.com, 1 powervolt.ru, 1 powerwellness-korecki.de, 1 powerwheels.tk, 1 @@ -117591,11 +117570,12 @@ prashantcafe.tk, 1 prasinoscomputers.ml, 1 prasos.fi, 1 -prataus.com, 1 +prataus.com, 0 prateep.io, 1 pratelloshop.tk, 1 pratemarkets.com, 1 prathambooks.org, 1 +pratic.it, 1 praticienmedecinechinoise.be, 1 pratopronto.org, 1 pratorotoli.it, 1 @@ -117635,7 +117615,6 @@ praxis-suchtmedizin.ch, 1 praxis-waedicity.ch, 1 praxis.nl, 1 -praxisamziegetsberg.de, 1 praxisfilms.org, 1 praxisgroup.services, 1 praxistipp24.com, 1 @@ -117687,7 +117666,6 @@ precisionmarketdata.com, 1 precisiontrialsolutions.com, 1 precisionvaccinations.com, 1 -precitaj.si, 0 precoro.com, 1 precoro.us, 1 precure.me, 1 @@ -117759,13 +117737,12 @@ premier-stores.co.uk, 1 premieramerica.com, 1 premieraviation.com, 1 -premierboatrentals.com, 1 premierbouncycastles.co.uk, 1 -premierconveyors.com, 1 premiercountertops.com, 1 premierdisco.co.uk, 1 premieresloges.ca, 1 premierevents.ie, 1 +premierevr.com, 1 premierlacewigs.com, 1 premierleague.gq, 1 premierloto.cm, 1 @@ -117783,6 +117760,7 @@ premiovapozicovna.sk, 1 premiovicentejorgesilva.pt, 0 premised.land, 1 +premium-development.net, 1 premium-leech.com, 1 premium-rum.de, 1 premium-security.com, 1 @@ -117792,7 +117770,6 @@ premiumdesign.hr, 1 premiumkeystore.com, 1 premiumlegalsupport.ga, 1 -premiumlinks.net, 1 premiumpeaches.com, 1 premiumpension.com, 1 premiumpictureframing.com, 1 @@ -117808,7 +117785,6 @@ premkumar.net, 1 premlall.com, 1 premsarswat.me, 1 -premstarinc.com, 1 prenatal.com, 1 prenataldnatesting.com, 1 prendashop.es, 1 @@ -117884,7 +117860,6 @@ presscenter.jp, 1 presscommunity.tk, 1 presscuozzo.com, 0 -pressed.com, 1 pressemeddelelse.dk, 1 pressfreedomtracker.us, 1 pressidium.com, 1 @@ -117899,6 +117874,7 @@ presson.shop, 1 pressreleasecentral.tk, 1 pressreleasepedia.tk, 1 +pressreleasespower.com, 1 pressride.jp, 1 pressrush.com, 1 pressspace2hack.com, 1 @@ -117957,6 +117933,7 @@ prettydecor.store, 1 prettydirtyteens.com, 1 prettygirlcheats.com, 1 +prettygoodai.co, 1 prettykeira.tk, 1 prettynightjob.net, 1 prettyporn.com, 1 @@ -118038,7 +118015,6 @@ prijsvergelijken.ml, 1 prikeshsavla.com, 1 prikolkz.tk, 1 -prim-wash.de, 1 prima-backoefen.de, 1 prima-badezimmermoebel.de, 1 prima-bohrmaschinen.de, 1 @@ -118084,10 +118060,8 @@ primary.health, 1 primarycareconnect.com.au, 1 primarydomain.us, 1 -primaryinvestmentnews.com, 1 primarypetvet.com, 1 primasmartwatches.de, 1 -primatejs.com, 1 primates.com, 1 primaudialrecords.com, 1 primbit.ru, 1 @@ -118095,7 +118069,6 @@ prime-host.ml, 1 prime-likes.com, 1 prime-seo.net, 1 -prime4ktv.com, 1 primeauconsultinggroup.com, 1 primecapsslim.com.br, 1 primechasedata.com, 1 @@ -118141,6 +118114,7 @@ primos-tech.com, 1 primrosehillvets.ie, 1 primrosenyagwaya.online, 1 +primsite.net, 1 princebazawule.com, 1 princedavidlodge.org.uk, 1 princehenrycentre.com.au, 1 @@ -118156,6 +118130,7 @@ princessefoulard.com, 1 princesspawg.tk, 1 princessyachts.com, 1 +princetonbiopartners.com, 1 princetonmn.gov, 1 princetonradiationoncology.com, 1 princetontxcdc.gov, 1 @@ -118180,7 +118155,6 @@ prineville.gov, 1 prinice.org, 1 print-street.tk, 1 -printa.nu, 1 printable-map-az.com, 1 printablemapaz.com, 1 printablemapforyou.com, 1 @@ -118266,7 +118240,6 @@ privacy.ac.cn, 1 privacy.ax, 1 privacy.gov.ph, 1 -privacybydesign.foundation, 1 privacycentermqt.com, 1 privacychick.com, 1 privacychick.io, 1 @@ -118284,7 +118257,6 @@ privacymanatee.com, 1 privacynator.eu, 1 privacynow.eu, 1 -privacypro.io, 1 privacyredirect.com, 1 privacysavvy.com, 1 privacyscore.org, 1 @@ -118465,6 +118437,7 @@ probrewer.com, 1 proc-int-cartogr-assoc.net, 1 procalc.be, 0 +procanvasser.com, 1 procarmanuals.com, 1 procarservices.com, 1 procatinator.com, 1 @@ -118473,6 +118446,7 @@ procens.us, 0 procert.ch, 0 procesadorafenix.com.mx, 1 +procesio.com, 1 processesinmotion.com, 1 processevolution.com.au, 1 processtec.com.br, 1 @@ -118510,7 +118484,6 @@ prodesigntools.com, 1 prodesk.bg, 1 prodiadigital.com, 1 -prodiagnostico.com, 1 prodigibook.com, 1 prodigio.co.uk, 1 prodigyhacking.com, 1 @@ -118520,6 +118493,7 @@ prodottitipicidellatoscana.it, 1 prodpo.com, 1 produc.ro, 1 +producent-sanek.pl, 1 producentbalustrad.pl, 1 producentparapetow.pl, 1 producersnational.com, 1 @@ -118556,6 +118530,7 @@ proemployeeprotection.com, 1 proemployeeprotection.net, 1 proenfar.com, 1 +proengc.com, 1 proesb.net, 1 prof, 1 prof-dr-waldowski.de, 1 @@ -118622,12 +118597,12 @@ profitablewebprojects.com, 1 profitdouble.tk, 1 profitero.com, 1 +profitinta.pt, 1 profitmiracle.tk, 1 profitsunraveled.com, 1 profitwhales.com, 1 profitwithpurposepodcast.com, 1 profix.computer, 1 -profloorstl.com, 1 profmatheus.com, 1 profmetod.com, 1 profondeville-sharks.be, 1 @@ -118744,7 +118719,6 @@ projectalias.com, 1 projectborealisgitlab.site, 1 projectbuild.tk, 1 -projectbusiness.co, 1 projectcares.tk, 1 projectcolonisation.tk, 1 projectdesign.io, 1 @@ -118814,6 +118788,7 @@ prolinehardware.ie, 1 prolocofrascarolo.tk, 1 prolocoregionefvg.it, 1 +prologic.bg, 1 prologicabg.com, 1 prologin.org, 1 prologin.pt, 1 @@ -118827,7 +118802,7 @@ promedentecuador.com, 1 promedlatam.com, 1 promedyczny.pl, 1 -promet.si, 1 +promet.si, 0 prometey.tk, 1 prometheanfire.net, 1 prometheanfire.org, 1 @@ -118848,7 +118823,6 @@ promo.lc, 1 promobit.com.br, 1 promocao.email, 1 -promocaodesconto.com.br, 1 promocion2007.tk, 1 promocionesperrigo.com, 1 promocjedladzieci.pl, 1 @@ -118886,6 +118860,8 @@ promove.be, 1 promovendum.nl, 1 promozioni.it, 1 +prompt.icu, 1 +promptdig.com, 1 promptwars.io, 1 promuovi.tv, 1 promushroom.com, 1 @@ -119007,7 +118983,6 @@ prosperityprojectaz.org, 1 prospernwt.ca, 1 prosperoarts.com.au, 1 -prosperontheweb.com, 1 prosperpeoria.com, 1 prosperstack.com, 1 prospo.co, 1 @@ -119035,12 +119010,14 @@ prostoskidki.ml, 1 prostozaim.ml, 1 prostye-recepty.com, 1 +prosurf.com.hr, 1 prosurveillancegear.com, 1 prosvet.tk, 1 prosveta1901.tk, 1 protanki.ml, 1 protanki.tk, 1 protapnews.tk, 1 +protec-quickit.online, 1 protecaodns.pt, 1 proteccaocivil.com, 1 proteccaocivil.net, 1 @@ -119060,9 +119037,9 @@ protectionformula.com.ua, 1 protectiveinsurance.com, 1 protectoraircare.com.au, 1 +protectsaladokids.org, 1 protectwrap.ml, 1 protege.moi, 1 -proteinfit.com.tr, 1 proteinreport.org, 1 protek.si, 1 protek.tk, 1 @@ -119088,7 +119065,6 @@ protok.tk, 1 proton.ch, 1 proton.me, 1 -protonbg.bg, 1 protonmail.ch, 1 protonmail.com, 1 protonpix.com, 1 @@ -119144,6 +119120,7 @@ provincialrubber.co.uk, 1 provinciaotlavoro.it, 1 provinstyper.com, 1 +provintell.com, 1 provinzblogger.de, 1 provision.ps, 1 provisionevents.co.uk, 1 @@ -119152,7 +119129,6 @@ provo.gov, 1 proweb-design.no, 0 prowebservices.ca, 1 -prowechsel.de, 1 prowi.se, 1 prowindow.sk, 1 prowise.com, 1 @@ -119173,6 +119149,7 @@ proximityradio.fr, 1 proximo.com.uy, 1 proximo.tk, 1 +proximtechnicalservice.com, 1 proxirealtime.com, 1 proxmox-airsonic.tk, 1 proxxy.nl, 1 @@ -119306,6 +119283,7 @@ psicologaigualada.es, 1 psicologajanainapresotto.com.br, 1 psicologamarianaortiz.com, 1 +psicologatatianabayona.com, 1 psicologia.gay, 1 psicologiaparatodos.com.mx, 1 psicologias.rio.br, 1 @@ -119323,7 +119301,6 @@ psihotest.tk, 1 psii.global, 0 psikokoro.com, 1 -psikotest.com, 1 psikoucka.cz, 1 psilly.com, 0 psinergy.info, 1 @@ -119380,7 +119357,6 @@ pssgcsim.org, 1 pssschristchurch.tk, 1 pst.moe, 1 -pstake.finance, 0 pstfoto.no, 1 pstor.fi, 1 pstrozniak.com, 1 @@ -119429,6 +119405,7 @@ psychologydegreeguide.org, 1 psychologyforasafeclimate.org, 0 psychologytests.tk, 1 +psychomedic.online, 1 psychometric.careers, 1 psychometrictest.ca, 1 psychometrictest.co.il, 1 @@ -119480,6 +119457,7 @@ psyt.nl, 1 psytheos.com, 1 psytrance-pro.com, 1 +pszdolfijn.nl, 1 pszinfo.hu, 1 pt-d.ru, 1 pt-server.de, 1 @@ -119566,7 +119544,6 @@ publicagent.com, 1 publicamenucards.com, 1 publicare-gmbh.de, 1 -publicboards.com, 1 publiccarauctionscalifornia.com, 1 publicdatafiles.com, 1 publicdatalibrary.org, 1 @@ -119628,7 +119605,6 @@ puercovalleyfireaz.gov, 1 puertocadiz.com, 1 puertodramaturgia.tk, 1 -puertomalaga.com, 1 puestifiestas.mx, 1 puffinvapes.co, 1 puffverse.pro, 1 @@ -119649,6 +119625,7 @@ puka.cc, 1 puka.edu.ee, 1 pukfalkenberg.dk, 1 +pul-ingenieure.de, 1 pula-site.tk, 1 pulci.it, 1 pulcinella.tk, 1 @@ -119713,6 +119690,7 @@ punikonta.de, 1 punishment.institute, 1 punjabsind.in, 1 +punjwani.be, 1 punk-jazz.tk, 1 punkapoule.fr, 1 punkart.tk, 1 @@ -119724,7 +119702,6 @@ punksway.top, 1 punkt05.de, 1 punktum.dk, 1 -punokio.com, 1 punshjp.com, 1 puntacanabavaro.com, 1 puntacanalink.com, 1 @@ -119754,7 +119731,6 @@ puppyfish.com, 1 puppygirl.ceo, 1 puppygock.ceo, 1 -puppygock.gay, 1 puppyirl.gay, 1 puppykennel.tk, 1 puppylove.hu, 1 @@ -119768,7 +119744,7 @@ pura-ponia.ga, 1 pura-ponia.gq, 1 puragreement.tk, 1 -puraicostarica.com, 1 +puraicostarica.com, 0 puralifesciences.com, 1 puravayalchurch.tk, 1 puravida-estate.com, 1 @@ -119866,8 +119842,6 @@ pursuable.cf, 1 pursuehappiness.tk, 1 pursuingoutdoors.com, 1 -pursuitsafety.org, 1 -pursuitwatch.org, 1 purtahan.tk, 1 purupuru-shibuya.school, 1 purupuru.school, 1 @@ -120000,14 +119974,13 @@ pwddelhi.gov.in, 1 pwdsafe.com, 0 pwe.vision, 1 -pwg-see.de, 0 +pwg-see.de, 1 pwn-all.net, 1 pwn.fi, 1 pwnedpass.tk, 1 pwneytelecom.com, 1 pwoss.xyz, 1 pwr990ay.pl, 1 -pws.my, 1 pwskills.com, 1 pwsplash.com, 1 pwss.gov.au, 0 @@ -120090,7 +120063,6 @@ pyxisfreelance.au, 1 pyxisfreelance.co, 1 pyxisfreelance.com.au, 1 -pyxo.net, 0 pyxyp.com, 1 pzasa.pl, 1 pzc.nl, 1 @@ -120152,7 +120124,6 @@ qalpuch.cc, 1 qanatnews.tk, 1 qani.me, 1 -qanw.com.br, 1 qao.qld.gov.au, 1 qaq.cloud, 1 qaq.icu, 0 @@ -120172,6 +120143,7 @@ qbcorescripts.com, 1 qbiltrade.com, 1 qbits.li, 1 +qbojj.eu, 1 qbrix.dk, 1 qbstores.com, 1 qbug.cf, 1 @@ -120197,6 +120169,7 @@ qdabogados.com, 1 qdcc.cn, 1 qde.com, 1 +qde.info, 1 qde.org, 1 qde.rip, 1 qde.social, 1 @@ -120248,7 +120221,6 @@ qiannews.net, 0 qianqiao.me, 1 qiantuwenlu.com, 1 -qiaowai.com, 1 qiber.org, 1 qibgroup.com.au, 1 qicoder.com, 1 @@ -120263,6 +120235,7 @@ qimingbu.com, 1 qimingceming.com, 1 qin.moe, 1 +qincai.xyz, 1 qingan.ca, 1 qingchuan.cc, 1 qingjie.com, 1 @@ -120270,7 +120243,6 @@ qinglingyu.cn, 1 qingly.me, 1 qingniantuzhai.com, 1 -qingpat.com, 0 qingpei.me, 1 qingran.net, 1 qingshanasd.cn, 1 @@ -120308,6 +120280,7 @@ qldducati.club, 1 qldformulaford.org, 1 qldnetwork.com.au, 1 +qlikmatrix.com, 1 qliving.com, 1 qlmn.vn, 1 qlock.mywire.org, 1 @@ -120315,7 +120288,6 @@ qlrace.com, 0 qm-lebenswert.de, 1 qm-marzahnnordwest.de, 1 -qmang.com, 1 qmarket.tk, 1 qmdcoin.com, 1 qmee.com, 1 @@ -120369,6 +120341,7 @@ qq.ee, 1 qq.wtf, 1 qq201314.com, 0 +qq38.icu, 1 qq5197.co, 1 qq52o.me, 1 qq6177.net, 1 @@ -120378,6 +120351,7 @@ qq9297.co, 1 qq9728.co, 1 qqiao.me, 1 +qqmz.vip, 1 qqq6.com, 0 qqq67.com, 1 qqr.es, 1 @@ -120396,13 +120370,13 @@ qrcodes.tools, 1 qrcodewiz.com, 1 qrcontagion.com, 0 -qrida.qld.gov.au, 1 qrish.live, 1 qristianuli.com, 0 qrlfinancial.com, 0 qrma.com.au, 1 qrmagic.com, 1 qrpatrol.com, 1 +qrplanet.com, 1 qrprincipal.com, 1 qrpth.eu, 1 qrsa.com.au, 1 @@ -120414,6 +120388,7 @@ qseek.cf, 1 qsil.com, 1 qslstudio.tk, 1 +qsm.ae, 1 qsoblog.gq, 1 qspirit.net, 1 qssupplies.co.uk, 1 @@ -120479,7 +120454,6 @@ quality-life.gr, 1 qualitycarbonfiber.com, 1 qualitycesspool.com, 1 -qualitychoiceplan.com, 1 qualitycommerical.com, 1 qualityconcreteleveling.com, 1 qualityconcreterepair.com, 1 @@ -120565,7 +120539,6 @@ quanyin.edu.eu.org, 1 quapawnation.gov, 1 quape.com, 1 -quarantadue.digital, 1 quarantine-system.com, 0 quarep.org, 1 quarim.cz, 1 @@ -120610,7 +120583,7 @@ qubitsandbytes.co.uk, 1 qubyte.codes, 1 quchronicle.com, 1 -qudini.com, 0 +qudini.com, 1 quebec.ca, 1 quebeccat.com, 1 quebeccats.com, 1 @@ -120692,6 +120665,7 @@ queryguard.net, 1 quesecelebra.info, 1 quessinternational.com, 1 +quest-crusaders.de, 1 quest-on-demand.com, 1 quest3.co, 1 quest3.co.uk, 1 @@ -120710,9 +120684,9 @@ questfororgasm.com, 1 questiii.com, 1 question.cf, 1 -question.com, 1 questionandanswer.ml, 1 questionyu.com, 0 +questlawoffice.com, 1 questofaidance.tk, 1 questoj.cn, 1 questsocial.it, 1 @@ -120747,10 +120721,12 @@ quickerticker.tk, 1 quickfitglass.com.au, 1 quickformspro.com, 1 +quickidearecipes.com, 1 quickinfosystem.com, 1 quickjobsfinder.com, 1 quicklinks.tk, 1 quicklinkz.tk, 1 +quickmath.com, 1 quicknode.com, 1 quicko.com, 0 quickq.nu, 1 @@ -120764,7 +120740,6 @@ quicksus.com, 1 quicktapstudios.com, 1 quicktaxinmessina.tk, 1 -quicktree.com, 1 quicktricks.net, 1 quickudpinternetconnections.com, 1 quickvideo.tk, 1 @@ -120793,7 +120768,6 @@ quiksite.com, 1 quillandinkroleplay.com, 1 quillandquire.com, 1 -quillwave.com, 1 quilmo.com, 1 quilteronfire.com, 1 quiltmc.org, 1 @@ -120861,7 +120835,7 @@ qul.link, 1 qulix.by, 1 qulix.ch, 1 -qumin.com, 1 +qumasaitrading.com, 1 qumind.co.uk, 1 qumirezi.tk, 1 qunzi.la, 1 @@ -120885,6 +120859,7 @@ quotesofgta.tk, 1 quotev.com, 1 quotidiani.net, 1 +quotidianolavoce.it, 1 quovadis-worldtour.it, 1 quovadisaustria.com, 1 quoviz.com, 1 @@ -120913,6 +120888,7 @@ qvoicenews.com, 1 qvq.cloud, 1 qvq.one, 1 +qvtrk.com, 1 qwant.com, 1 qwantjunior.com, 1 qwanturank.news, 1 @@ -120967,6 +120943,7 @@ r-rehab.org, 1 r-rwebdesign.com, 1 r-s.one, 1 +r-sec.se, 1 r-service.kz, 1 r-t-b.fr, 1 r-t-n.tk, 1 @@ -121068,7 +121045,6 @@ racasdecachorro.org, 1 racco.com.br, 1 raccoltadifferenziata.it, 1 -raccoltarifiuti.com, 1 raccoltarifiuti.milano.it, 1 raceandecology.ca, 1 racedrop.tk, 1 @@ -121098,7 +121074,6 @@ racing-planet.cz, 1 racingfanclub.tk, 1 racingteameelde.tk, 1 -racius.com, 1 racketlonindia.co.in, 1 racketscore.com, 1 racketscore.nl, 1 @@ -121262,6 +121237,7 @@ radioexpres.cz, 1 radioexpress.cz, 1 radiofmimagen.net, 1 +radiofonico.it, 1 radiofred.tk, 1 radiogabriela.tk, 1 radiogaga.ga, 1 @@ -121349,6 +121325,7 @@ radiosimba.ug, 1 radiosound95.it, 1 radiosterrekijker.tk, 1 +radiostrada.pl, 1 radiosummernight.ch, 1 radiosuperplus.tk, 1 radioszczecin.pl, 1 @@ -121416,6 +121393,7 @@ raewardfresh.co.nz, 1 raf.org, 1 rafaelangelfg.tk, 1 +rafaelmperez.com, 1 rafaeloliva.com.br, 1 rafaelortiz.es, 1 rafaelsobis.tk, 1 @@ -121432,6 +121410,7 @@ raft.pub, 1 rafting-japan.com, 1 raftingbali.net, 1 +rafvorsselmans.com, 1 rafy.com.br, 1 rafy.site, 1 rag-deutsche-steinkohle.de, 1 @@ -121461,6 +121440,7 @@ rahayi.tk, 1 raheel.cf, 1 raheel.tk, 1 +raheem.consulting, 1 raheem.marketing, 1 rahenytennis.tk, 1 rahil-p.com, 1 @@ -121536,6 +121516,7 @@ railwaymen.org, 1 railworks.net, 1 raimi.shop, 1 +raimundoneto.com.br, 1 rain-mag.com, 1 rain.bz, 1 rain.moe, 1 @@ -121651,24 +121632,22 @@ ralaoui.me, 1 raleighadultmedicine.com, 1 raleighboneandjoint.com, 1 -raleighcapitolent.com, 1 raleighinternational.org, 1 raleighmedicalgroup.com, 1 raleighpsych.com, 1 -raleighsinuscenter.com, 1 ralfs-zusizone.de, 1 rallscountymo.gov, 1 rally-base.com, 1 rally-base.cz, 1 rally-base.eu, 1 rally-results.eu, 1 +rally-service.ru, 1 rally-vysledky.cz, 1 rallybase.cz, 1 rallybase.eu, 1 rallycycling.com, 0 rallyekrumlov.cz, 1 rallyfotosaswin.tk, 1 -rallysweden.com, 1 rallytrophy.tk, 1 ralphdeal.com, 1 raltha.com, 1 @@ -121679,6 +121658,7 @@ ram.nl, 1 rama.ovh, 1 ramanujantest.in, 1 +ramapada.com, 1 ramatola.uk, 0 ramblingrf.tech, 1 rambo.codes, 1 @@ -121706,6 +121686,7 @@ ramp.com, 1 rampal.eu, 1 rampal.io, 1 +rampal.net, 1 rampao.org, 1 rampeboreal.ca, 1 rampestyuma.com, 1 @@ -121766,6 +121747,7 @@ randombrainwave.ga, 1 randombrainwave.gq, 1 randombrainwave.ml, 1 +randombyte.com, 0 randomcouples.com, 1 randomdomain.io, 1 randomforestweb.com, 1 @@ -121815,7 +121797,6 @@ ranjeetmehta.tk, 1 rankae.com, 1 rankeco.com, 1 -rankfactor.nl, 1 rankia.ga, 1 ranking-deli.jp, 1 ranking-mensesthe.jp, 1 @@ -121833,6 +121814,7 @@ ranktis.com, 1 rankya.com, 1 rannamoisaaiasalong.ee, 1 +ransomleak.com, 1 ransomspares.co.uk, 1 ranson.com.au, 1 ransonwv.gov, 1 @@ -121976,7 +121958,6 @@ rathmann-couture.de, 0 rathorian.fr, 1 rathsallaghhouseonline.com, 1 -ratingexpertise.com, 1 ratingostar.com, 1 ratinq.co, 1 ratiocinat.ga, 1 @@ -121996,6 +121977,7 @@ ratujemyzwierzaki.net, 1 ratujmydzikiekoty.org, 1 ratusha.ml, 1 +rau-ag.ch, 1 raulmalea.ro, 1 raulrivero.es, 1 raulval.com, 1 @@ -122018,6 +122000,7 @@ ravalement-facade.paris, 1 ravalement-facades.net, 1 ravallirepublic.com, 1 +ravchat.com, 1 rave-archive.com, 1 raveboy.dyndns.org, 1 raveeventsgroup.com, 1 @@ -122067,14 +122050,11 @@ rawlord.ga, 1 rawmarkable.co.uk, 1 rawmathub.gr, 1 -rawpearls.co.uk, 1 -rawpearls.com, 1 rawr.sexy, 1 rawrvixen.com, 1 raxion.cf, 1 raxion.tk, 1 ray-works.de, 1 -rayagroup.pl, 1 rayann.cn, 1 raycarruthersphotography.co.uk, 1 raycast.xyz, 1 @@ -122107,7 +122087,6 @@ rayusradiology.com, 1 raywisdom.tk, 1 rayworks.de, 1 -rayzer.dk, 1 razakhanimazhab.tk, 1 razawitv.com, 1 razberry.kr, 1 @@ -122179,6 +122158,7 @@ rca2015.ru, 1 rcbanger.tk, 1 rccars.info, 1 +rccbpo.com, 1 rcclub.com, 1 rccofeaston.org, 1 rccom.ru, 1 @@ -122219,6 +122199,7 @@ rcslt.org, 1 rcsolutions.nl, 0 rct-chair.com, 1 +rct-uae.com, 1 rct.uk, 1 rctalk.com, 1 rctiads.com, 1 @@ -122229,6 +122210,7 @@ rd0xb.com, 1 rda.run, 1 rdactive.de, 1 +rdap.ss, 1 rdb.vote, 1 rdcdesign.com, 1 rddjapan.info, 1 @@ -122323,7 +122305,6 @@ readable.pw, 1 readapt-nutrition.com, 1 readaster.com, 1 -readbar.com, 1 readcomics.gq, 1 readersfavorite.com, 1 reades.co.uk, 1 @@ -122378,9 +122359,7 @@ real-thailand.tk, 1 real-work.tk, 1 real.in.th, 1 -realacademy.net, 1 realactionslots.com, 1 -realagentsonduty.com, 1 realbiographies.cf, 1 realbiz.ml, 1 realbluesmagazine.com, 1 @@ -122433,7 +122412,6 @@ realizarse-japan.com, 1 realizegov.com, 1 realkeywords.ga, 1 -reall.uk, 1 realliance.net, 1 reallife-it.de, 1 reallifeforums.com, 0 @@ -122543,13 +122521,13 @@ rebsumner.com, 1 rebtoor.com, 0 rebuga.com, 1 +rebuild96.ru, 1 rebull.fr, 1 rebure.com, 0 rebus.support, 1 rebusfarm.net, 1 reby.cf, 1 reby.tk, 1 -rebytes.it, 1 rec5.nl, 1 recalendar.me, 1 recallinsider.com, 1 @@ -122604,6 +122582,7 @@ recipeyak.com, 1 recipiently.com, 1 recipito.tk, 1 +recipni.com, 1 reckers-griesbach.com, 1 recklessly.ga, 1 reckner.com, 1 @@ -122623,9 +122602,6 @@ recoilbox.com, 1 recolic.cc, 1 recolic.net, 1 -recollect.co.nz, 1 -recollect.net.au, 1 -recollectcms.com, 1 recollection.fr, 1 recollective.com, 1 recolor.ml, 1 @@ -122654,6 +122630,7 @@ recoveryunplugged.com, 1 recraftventures.com, 1 recreatiewoningverzekeringen.nl, 1 +recriereciclagem.com.br, 1 recroommasters.com, 1 recruit.net, 1 recruitcrm.io, 0 @@ -122719,12 +122696,12 @@ redaxo.org, 1 redballoonsecurity.com, 1 redbeardplumbing.net, 0 +redbrown.ru, 1 redcabbage.tk, 1 redcanary.co, 1 redcandycane.tk, 1 redcapital.cl, 1 redcardinal.tk, 1 -redcarnationhotels.com, 1 redcarpetmonday.com, 1 redcatrampageforum.com, 1 redcedar.gov, 1 @@ -122797,6 +122774,7 @@ redhillboardriders.tk, 1 redhookchallenge.org, 1 redhookny.gov, 1 +redhotcamgirls.com, 1 redhotmerch.com, 1 redhotmonks.com, 1 redhotmonks.nl, 1 @@ -122928,7 +122906,6 @@ redwoodcounty-mn.gov, 1 redwoodreporting.com, 1 redwoodsgroup.com, 1 -redwoodshop.hu, 1 redwoodtoxicology.com, 1 reebelo.co.nz, 1 reebelo.com.au, 1 @@ -123041,7 +123018,6 @@ refpakrtsb.top, 1 refpakwpsrbm.top, 1 refpalqtdn.top, 1 -refpamjeql.top, 1 refpanjoke.com, 1 refpaqutiu.top, 1 refparrknf.top, 1 @@ -123065,7 +123041,6 @@ refreshmentshop.co.uk, 1 refriamericas.com, 1 refrigeracion2hermanos.com.mx, 1 -refrigeratorrepair-austin.com, 1 refuelcollective.com, 0 refuelcreative.com.au, 0 refuelmcconnell.marketing, 1 @@ -123104,6 +123079,7 @@ regdomain.tk, 1 regele.tk, 1 regelhulpenvoorbedrijven.nl, 1 +regelradet.no, 1 regencytablesandsinks.com, 1 regencywalkinclinic.com, 1 regencywines.ca, 1 @@ -123131,7 +123107,6 @@ regime-anticellulite.com, 1 regimebonheur.com, 1 reginaascanio.es, 1 -reginaclinic.jp, 1 reginalenz.com, 1 reginfo.gov, 1 regio-guide.de, 1 @@ -123154,8 +123129,11 @@ regionmedia.cf, 1 regionstea.net, 1 regioplanverbindt.nl, 1 +regioprint-werbeagentur.de, 1 regiosalland.nl, 1 -regioseguros.com.br, 1 +regiotaxi-s-hertogenbosch.nl, 1 +regiotaxidenbosch.nl, 1 +regiotaxishertogenbosch.nl, 1 regiovertrieb.de, 0 regis.tech, 1 regisearch.co.uk, 1 @@ -123204,6 +123182,7 @@ rehabthailand.org, 1 rehansaeed.com, 1 rehasport-informationen.de, 1 +rehasportwelt.de, 1 rehazonaliftservice.nl, 1 reher.pro, 1 rehive.com, 1 @@ -123240,10 +123219,10 @@ reikimaster.tk, 1 reilly.io, 1 reimagine-education.com, 1 -reimaginebelonging.de, 1 reimaginebelonging.org, 0 reimann.me, 1 reimers.de, 1 +reims-digital.fr, 1 reimsmediaslibres.info, 1 rein.ca, 1 reinaertvandecruys.com, 1 @@ -123262,7 +123241,7 @@ reinierjonker.nl, 1 reinodemurcia.tk, 1 reinoldus.ddns.net, 1 -reinotools.com, 1 +reinotools.com, 0 reinout.nu, 1 reinouthoornweg.nl, 1 reintjens.de, 1 @@ -123328,10 +123307,10 @@ rekmedia.tk, 1 reko.de, 1 rekrydiili.fi, 1 -reksadanapanin.co.id, 1 +reksadanapanin.co.id, 0 rekurasi.com, 1 rekursion.at, 1 -rekurve.co, 1 +rekurve.co, 0 rel-me.cc, 1 relainstitute.com, 1 relais-laguiole.com, 1 @@ -123379,12 +123358,10 @@ reliablewire.com, 1 reliahost.nl, 1 reliancecard.com, 1 -reliancemumbaimetro.com, 1 reliant.com, 1 reliant3sixty.com, 1 reliantpropertygrpri.com, 1 relic.gq, 1 -relieftn.com, 1 religious-life.com, 1 religiya.tk, 1 relikt.tk, 1 @@ -123395,6 +123372,7 @@ relionbattery.com, 1 relishify.com, 1 relisten.nl, 1 +rellek.org, 1 reloading.ml, 1 relocatefeds.gov, 1 relojeriajoyeria.com, 1 @@ -123455,7 +123433,6 @@ remissionclinic.com, 0 remitano.com, 1 remix64.com, 1 -remixperfume.com, 1 remmik.com, 1 remminhdang.com, 1 remo.health, 1 @@ -123502,7 +123479,6 @@ remotewx.com, 1 remotish.com, 1 removalcellulite.com, 1 -removalls.com, 1 removalsandstoragex.com, 1 removalsmanandvan.org, 1 removedrepo.com, 1 @@ -123539,6 +123515,7 @@ renaultzambezi.co.za, 1 rencia.com, 1 rencontredemerde.fr, 1 +renda360.net, 1 rendall.tv, 1 rendatododia.xyz, 1 render.com, 1 @@ -123719,6 +123696,7 @@ reparolineablanca.com, 1 reparteat.com, 1 repartim.fr, 1 +repaservices.fr, 1 repasi.org, 1 repasit.sk, 1 repat.de, 1 @@ -123728,11 +123706,12 @@ repdom.net, 1 repeat.gg, 1 repeatresponse.com.au, 1 +repertuarim.com.tr, 1 repettoshoes.tk, 1 repharmacy.com, 0 repin.in.ua, 1 -repinger.com, 1 repinger.my.id, 1 +repintadoautomotriz.com, 1 repl.ga, 1 replacebase.co.uk, 1 replacebase.com, 1 @@ -123882,6 +123861,7 @@ residency-bond.eu, 1 resident-evil.tk, 1 resident.ngo, 1 +residentcompanyclub.com, 1 residenthome.com, 0 residentialdesignsolutions.com, 1 residentialdesignsolutions.com.au, 1 @@ -123892,7 +123872,6 @@ residenz-wuerzburg.de, 1 residenzaperanziani.it, 1 residualpayments.com, 1 -residualretention.com, 1 resigno.tk, 1 resilience.sh, 1 resiliencebox.com, 1 @@ -124022,6 +124001,7 @@ restoraguard.com, 1 restoran.cf, 1 restoranlibertas.com, 1 +restorationcommercialroofing.com, 1 restorationphotos.tk, 1 restorebodybalance.net, 0 restorehair.com, 1 @@ -124033,6 +124013,7 @@ restoruns.com, 1 restrealitaet.de, 1 restream.fi, 1 +restructurethesystem.us, 1 resultscx.com, 1 resultsdate.news, 1 resultsyoudeserve.com, 1 @@ -124120,7 +124101,6 @@ retrobook.tk, 1 retrocdn.net, 1 retrodunes.com, 1 -retrofitness.com, 1 retrogamenews.tk, 1 retrogarb.co.uk, 1 retroguarda.pt, 1 @@ -124161,7 +124141,7 @@ reusables.org, 1 reuschtools.com, 1 reusesti.ro, 1 -reusorecicla.com.br, 1 +reusorecicla.com.br, 0 reut42.de, 1 reuter-profishop.de, 0 reuter.de, 0 @@ -124223,9 +124203,11 @@ revis-online.gq, 1 revis-online.ml, 1 revis-online.tk, 1 +revision-drone.fr, 1 revisione.it, 1 revisionmedia.pl, 1 revisionnotes.xyz, 1 +revisithome.pl, 1 revisore.it, 1 revisores.pt, 1 revisoronline.cf, 1 @@ -124242,6 +124224,7 @@ revistaligustinus.tk, 1 revitalisierungs-akademie.de, 1 revitcm.com, 1 +revivalinchrist.com, 1 revivalinhisword.com, 1 revivalprayerfellowship.com, 1 revive-me.org, 1 @@ -124395,7 +124378,6 @@ rhees.nl, 1 rheijmans.io, 1 rheijmans.nl, 0 -rheimsandcohen.ltd, 1 rhein-erft-kreis.de, 1 rhein-liebe.de, 1 rhein-main-rna.de, 1 @@ -124481,6 +124463,7 @@ riba-lov.ga, 1 ribafs.tk, 1 ribapo.com, 1 +ribcage.games, 1 ribeirocavalcante.com.br, 1 ribella.net, 1 ribfixation.com, 1 @@ -124490,7 +124473,6 @@ ribron.com, 1 ribtours.co, 1 ric-rac.org, 1 -ric-sb.si, 1 ricarama.com, 1 ricardo.nu, 0 ricardobaptistaleite.pt, 1 @@ -124556,7 +124538,7 @@ richfieldadamscowi.gov, 1 richfieldsean.org, 1 richie.cloud, 0 -richie.fi, 1 +richie.fi, 0 richie.pm, 1 richiebartlett.com, 1 richieheijmans.com, 1 @@ -124609,6 +124591,7 @@ rickyips.tk, 1 rickyromero.com, 1 rickysgames.tk, 1 +rickythewoof.it, 1 rico-brase.de, 1 rico-j.de, 1 rico.ovh, 1 @@ -124637,7 +124620,6 @@ riders.ga, 1 rides-japan.jp, 1 ridetour.ru, 1 -ridewayexpress.com, 1 ridewithloop-url.com, 1 ridgecrestca.gov, 1 ridgefieldct.gov, 1 @@ -124824,7 +124806,6 @@ ripcorddesign.com, 1 ripcordsandbox.com, 1 ripcurl.tk, 1 -ripe.cash, 1 ripenapps.com, 1 ripetizioni.roma.it, 1 ripin.org, 1 @@ -124893,6 +124874,7 @@ riskbase.uk, 1 riskbased-python-qas1.azurewebsites.net, 1 riskconsole.com, 1 +riskgovernor.nl, 1 riskiq.com, 0 riskledger.com, 1 riskmitigation.ch, 1 @@ -125006,7 +124988,7 @@ rivmedia.co.uk, 1 rivolta.tk, 1 rivus.net, 1 -riwaya.co.uk, 1 +riwaya.co.uk, 0 riweco.ga, 1 riwers.io, 1 rix.ninja, 1 @@ -125117,7 +125099,6 @@ rnmkrs.co, 1 rnrrescue.com, 1 rnz3.net, 1 -ro-design.ro, 1 ro.co, 1 ro.search.yahoo.com, 0 ro89.com, 1 @@ -125136,6 +125117,7 @@ roadkeeper.ai, 1 roadkillcustoms.com, 1 roadlamp.com, 1 +roadpaint.pt, 1 roadshow.co.nz, 1 roadshow.com.au, 1 roadtochina.tk, 1 @@ -125145,7 +125127,6 @@ roadtripaustralia.com.au, 1 roadtripnation.com, 1 roadtripusa.tk, 1 -roamadvisors.com, 1 roamfreun.tk, 1 roamroofingco.com, 1 roams.com.co, 1 @@ -125187,7 +125168,6 @@ roberthurlbut.com, 1 robertjkleincpa.com, 1 robertkrueger.de, 1 -robertlkoch.com, 1 robertlowdon.com, 1 robertlysik.com, 1 robertmusil.ml, 1 @@ -125195,7 +125175,6 @@ robertoblake.com, 1 robertocasares.no-ip.biz, 0 robertodegroot.tk, 1 -robertodivirgilio.it, 1 robertoentringer.com, 0 robertof.ovh, 1 robertoggarcia.tk, 1 @@ -125287,7 +125266,6 @@ robspc.repair, 1 robstibal.com, 1 robtatemusic.com, 1 -robtex.com, 1 robu.in, 1 robust.ga, 1 robustac.com, 1 @@ -125334,7 +125312,6 @@ rocketcityts.com, 1 rocketcom.com, 1 rocketdashboard.com, 1 -rocketdoctor.ca, 1 rocketdoctor.us, 1 rocketeer.tk, 1 rocketgnomes.com, 1 @@ -125373,7 +125350,7 @@ rocketsales.sk, 1 rocketsciencerealty.com, 1 rocketsworld.tk, 1 -rockettube.com, 1 +rockettube.com, 0 rockfallsil.gov, 1 rockfax.com, 1 rockfordnetworks.com, 1 @@ -125471,14 +125448,13 @@ rodriguezmontero.com, 1 roeckx.be, 1 roedesonline.nl, 1 -roedl.de, 1 roefja.com, 0 roehrbein.de, 1 roelenscitynews.ml, 1 roelfs.org, 1 roelhollander.eu, 1 roeljoyas.com, 1 -roelkoops.nl, 0 +roelkoops.nl, 1 roelof.io, 1 roelonline.tk, 1 roels.com, 1 @@ -125502,6 +125478,7 @@ rogell.tk, 1 rogerdat.ovh, 1 rogerdeflor.tk, 1 +rogerec.me, 1 rogerfages-peinture.fr, 1 rogerhub.com, 1 rogerkunz.ch, 1 @@ -125534,6 +125511,7 @@ rohedaten.de, 1 rohitagr.com, 1 rohitgupta.xyz, 1 +rohitpatil.com, 1 rohkeakirkko.fi, 1 rohlik.cz, 1 rohrle.com, 1 @@ -125548,7 +125526,6 @@ roishopper.com, 1 roisu.org, 0 rojandaru.com, 1 -rojavainformationcenter.com, 1 rojiblancos.tk, 1 rojotv.tk, 1 rok-pro-dobro.cz, 1 @@ -125571,6 +125548,7 @@ rolandog.com, 1 rolandok.gov, 1 rolandoredi.com, 1 +rolandoshvac.com, 1 rolandozarate.tk, 1 rolandsgrocery.com, 1 rolandszabo.com, 1 @@ -125615,10 +125593,9 @@ rolstoelappartementen.tk, 1 roltech.ru, 1 rolzzandik.cf, 1 -roma-lindenhof.de, 1 +roma-lindenhof.de, 0 roma-servizi.it, 1 romab.com, 1 -romacoffee.co.nz, 1 romadiluna.band, 0 romadprojects.com.au, 1 romagnaoggi.it, 1 @@ -125654,10 +125631,12 @@ romantik.cf, 1 romantik.tk, 1 romantischetuin.nl, 1 +romanusmart.ro, 1 romanywg.com, 1 romanzolotarev.com, 1 romapk.tk, 1 romarin.es, 1 +romaservicegroup.it, 1 romashka.tk, 1 romasko.ml, 1 romastantra.com, 1 @@ -125701,6 +125680,7 @@ ronchonrongeurs.com, 1 roncoutilities.com, 1 ronda.tk, 1 +ronde3.nl, 1 rondekker.nl, 0 rondommen.nl, 1 rondouin.fr, 1 @@ -125717,6 +125697,7 @@ ronnylindner.de, 1 ronomon.com, 1 ronsamazingstories.com, 1 +ronthemonkey.com, 1 ronzertnert.xyz, 1 roobet.com, 1 roodarvasi.ir, 1 @@ -126028,7 +126009,6 @@ roundcube.mayfirst.org, 0 rounder.pics, 1 roundrock-locksmith.com, 1 -roundtablekzn.co.za, 1 roundtechsquare.com, 1 roundtoprealestate.com, 0 roussillon-informatique.fr, 1 @@ -126081,6 +126061,7 @@ roxburytech.tk, 1 roxhillmedia.com, 1 roxiesbouncycastlehire.co.uk, 1 +roxotranslations.com, 1 roxswinery.com, 1 roxville.tk, 1 roy-buehring.de, 1 @@ -126150,7 +126131,6 @@ royalmarine.ie, 1 royalmarinesassociation.org.uk, 1 royalmech.tk, 1 -royalmedicaltrans.com, 1 royaloakcornwall.com, 1 royaloz.ma, 1 royalpainters.co, 1 @@ -126165,8 +126145,7 @@ royaltonvt.gov, 1 royaltube.net, 1 royalty-market.com, 1 -royaltyexchange.com, 1 -royaltyk9.com, 1 +royaltyexchange.com, 0 royalvortex.co, 1 royalworldservice.com.ua, 1 royalyorkhotel.co.uk, 1 @@ -126201,7 +126180,6 @@ rp-murk.tk, 1 rpa.gov, 1 rpadonline.com, 1 -rpatechnologies.es, 1 rpcinmobiliaria.net, 0 rpg-maker.net, 1 rpg-maker.org, 1 @@ -126219,6 +126197,7 @@ rpmdrivingschool.com.au, 1 rpmglobal.com, 1 rpmrecords.dk, 0 +rpn-sfera.ru, 1 rpnewspaper.com, 1 rpora.co, 1 rpower.com, 1 @@ -126238,6 +126217,7 @@ rr9297.co, 1 rr9728.co, 1 rrailto.com, 1 +rrational.com, 1 rray.org, 1 rrbahmedabad.gov.in, 1 rrbpatna.gov.in, 1 @@ -126269,7 +126249,6 @@ rsap.ca, 1 rsauget.fr, 1 rsb.net, 1 -rsbl.or.id, 1 rsblake.com, 1 rsblake.net, 1 rsc-cronenberg.de, 1 @@ -126389,6 +126368,7 @@ rtnewsde.pro, 1 rtpa.es, 1 rtparket.ga, 1 +rtreid.ru, 1 rtsak.com, 1 rtsr.ch, 0 rttechlaw.com, 1 @@ -126441,7 +126421,6 @@ rubens.cloud, 0 rubensalgado.com, 1 rubenschulz.nl, 1 -rubenshotel.com, 1 rubenshuis.be, 1 rubenslikkarchive.com, 1 rubensteinphotography.com, 1 @@ -126532,6 +126511,7 @@ ruflay.ru, 1 ruforce.ml, 1 rugadgets.tk, 1 +rugbloom.com, 1 rugby.tk, 1 rugby.video, 1 rugbynow.com, 1 @@ -126568,6 +126548,7 @@ ruisai.org, 1 ruitersportbak.nl, 1 ruixin.org, 1 +ruja-pass.ddnss.de, 1 rujbin.ddns.net, 1 rukhaiyar.com, 1 ruknguk.tk, 1 @@ -126584,7 +126565,6 @@ rumahbukitpodomoro.com, 1 rumahcodingtest.tk, 1 rumahkristal.tk, 1 -rumahminimalisoi.com, 1 rumahpropertigratis.com, 1 rumahresep.cf, 1 rumaniamilitary.ro, 1 @@ -126628,6 +126608,7 @@ runebet.com, 1 runeblog.ru, 1 runecaster.tk, 1 +runedata.com, 1 runementors.com, 0 runes.cf, 1 runescape.wiki, 1 @@ -126674,6 +126655,7 @@ rupeespeaks.tk, 1 rupeevest.com, 1 rupeezy.in, 1 +rupinga.com, 1 rupom.me, 1 rupool.tk, 1 rupostel.com, 1 @@ -126765,6 +126747,7 @@ russiancrimes.in.ua, 1 russianews.cf, 1 russianews.ga, 1 +russianflora.com, 1 russianpostcalc.ru, 1 russianpunkrock.tk, 1 russianrandom.ru, 1 @@ -126820,7 +126803,6 @@ ruthmarques.com.br, 1 ruthstas.com, 1 ruthstasiniewicz.com, 1 -rutice.love, 1 rutiger.com, 1 rutika.ru, 1 rutlandcountyswac.org, 1 @@ -126969,11 +126951,13 @@ ryu22e.org, 1 ryuanerin.kr, 1 ryumasuematsu.com, 1 +ryunaviblog.com, 1 ryuukei-nf.tk, 1 ryvit.com, 1 ryy.moe, 1 ryzen.cz, 1 ryzhov.me, 1 +rzautoparks.lv, 1 rzeczy-silene.pl, 1 rzero.com, 1 rzero.tk, 1 @@ -127037,6 +127021,7 @@ s2i.ch, 0 s2member.com, 1 s2n.tech, 1 +s2sgroup.fr, 1 s2t.net, 0 s36533.com, 1 s3call.ddns.net, 0 @@ -127096,7 +127081,6 @@ saam.aero, 1 saaminuett.fi, 1 saap.me, 1 -saaral.org, 1 saarehaigla.ee, 1 saaremaa.tk, 1 saaricraft.ml, 1 @@ -127141,6 +127125,7 @@ sablanout.com, 1 sable.gq, 1 saborcaribe.tk, 1 +sabordasmontanhas.com.br, 1 saboresdamontanha.com.br, 1 sabranie.com, 1 sabrina-auer.tk, 1 @@ -127153,7 +127138,6 @@ sabrinazeidan.com, 1 sabrine.tk, 1 sabris.com, 1 -sabriwellness.com, 1 sabtifa.site, 1 sabworldtricks.tk, 1 sac-cu2.org, 1 @@ -127184,6 +127168,7 @@ sackmesser.ch, 1 saco.tech, 1 sacodealegria.com, 1 +sacolaotriangulo.com.br, 1 sacprincesse.com, 1 sacralis.com, 1 sacralrp.com, 1 @@ -127203,7 +127188,6 @@ sacrosanctus.tk, 1 sacscoc.org, 1 sacwellness.com, 1 -sad-berezka.ru, 0 sadecegundem.net, 1 sadeedos.systems, 1 sadeem.space, 1 @@ -127265,7 +127249,6 @@ safearth.training, 1 safeathomeohio.gov, 1 safebase.io, 1 -safebaseflorida.com, 1 safebaseinc.com, 1 safeboard.ml, 1 safeboxx.id, 1 @@ -127428,9 +127411,11 @@ sahinozgenhukuk.com, 1 sahipleniyorum.com, 1 sahkotyot.eu, 1 +sahlico-eg.com, 1 sahovski.com, 1 sahpa.co.za, 1 sai.be, 1 +sai.com.in, 1 saibababirthplace.org, 1 saiber.com, 1 saibotk.de, 0 @@ -127472,7 +127457,6 @@ saimoe.moe, 1 saimoe.org, 1 sainaracademy.com, 1 -sainet.xyz, 1 sainetworks.net, 1 sainokuni-eng.jp, 1 sainsburys.jobs, 1 @@ -127532,7 +127516,6 @@ saipeople.net, 1 saiphhub.com.br, 1 saiputra.com, 1 -saiputra.net, 1 sairadio.net, 1 sairadio.net.in, 1 sairadio.one, 1 @@ -127540,6 +127523,7 @@ sairlerimiz.tk, 1 sairus.fr, 1 saisecure.net, 1 +saiserve.xyz, 1 saisons-fruits-legumes.fr, 1 saisyuusyou-ikebukuro.com, 1 saisyuusyou-omiya.com, 1 @@ -127547,14 +127531,11 @@ saisyuusyou-utsunomiya.com, 1 sait.health, 1 saitapovan.com, 1 -saitas.net, 1 saito-koken.co.jp, 1 saitrance.com, 1 saitschool.ml, 1 -saitv.net, 1 saitv.org.in, 1 saiwebtv.com, 1 -saiyans.com.ve, 1 saiyeh.ir, 0 sajabesaya.tk, 1 sajbersove.rs, 1 @@ -127625,11 +127606,6 @@ salea-anwendung.ch, 1 saleaks.org, 1 salebaba.com, 1 -saleduck.at, 1 -saleduck.ch, 1 -saleduck.dk, 1 -saleduck.fi, 1 -saleduck.se, 1 saledump.nl, 1 saleem.cf, 1 salegor.tk, 1 @@ -127680,6 +127656,8 @@ salfordepc.uk, 1 salfraedingarnir.is, 1 salge.rocks, 1 +salgueirocarlos.com, 1 +salianmod.ir, 1 salibandy.tk, 1 salidaswap.com, 1 salient-dialers.com, 1 @@ -127760,7 +127738,7 @@ saltedfish.network, 1 saltedfishes.com, 1 saltedge.com, 1 -saltedpasta.com, 1 +saltedpasta.com, 0 saltercane.com, 0 saltlakecounty.gov, 1 saltlakehealth.gov, 1 @@ -127923,7 +127901,7 @@ samplefashion.nl, 1 samplehc.com, 1 sampsoncountync.gov, 1 -sampsonplumbing.com, 1 +sampsonplumbing.com, 0 samquick.me.uk, 1 samroelants.com, 1 samsara.nl, 1 @@ -127940,6 +127918,7 @@ samstudios.tk, 1 samsungbiologics.com, 1 samtalen.nl, 1 +samudranesia.id, 1 samuel-brown.com, 1 samuel-philipp.de, 1 samuelbeckett.tk, 1 @@ -127978,11 +127957,10 @@ sana-store.com, 1 sana-store.cz, 1 sana-store.sk, 1 -sanafide.com, 1 +sanafide.com, 0 sanagustin.com, 1 sanalaile.tk, 1 sanalikaforum.tk, 1 -sanalturcu.com, 1 sanandreasstories.com, 1 sanantoniolocksmithtx.com, 1 sanapaino.fi, 1 @@ -128017,7 +127995,7 @@ sand66.cc, 1 sandag.gov, 1 sandairephotography.com, 1 -sandbar.ai, 1 +sandbar.ai, 0 sandbar.money, 1 sandbox-simplevisa.net, 1 sandbox.i.ng, 1 @@ -128033,7 +128011,6 @@ sandersmontalto.com, 1 sandersonfarms.com, 1 sanderspies.com, 1 -sanderstaxpro.com, 1 sandervanderstap.nl, 1 sandesh.tk, 1 sandetailing.ru, 1 @@ -128093,6 +128070,7 @@ sandtondc.co.za, 1 sandtonrubbleremovals.co.za, 1 sandtonsolarsystems.co.za, 1 +sandtro.no, 1 sanduskycountyoh.gov, 1 sandviken.se, 1 sandwichclub.tk, 1 @@ -128142,6 +128120,7 @@ sanitairwinkel.com, 1 sanitairwinkel.nl, 1 sanitaria.it, 1 +sanitation.gr, 1 sanithais.com, 1 sanitix.com, 1 sanity.host, 1 @@ -128175,7 +128154,6 @@ sanmigueldeabona.es, 1 sanmonjiya-kimono.com, 1 sanmuding.com, 1 -sannashops.com, 1 sanne-content.de, 1 sanneburen.nl, 1 sannefoltz.com, 1 @@ -128263,6 +128241,7 @@ santeriabeliefs.com, 1 santewonderland.nl, 1 santhatela.com.br, 1 +santhoffplumbingco.com, 1 santhoshveer.com, 1 santiagogarza.co, 1 santiagoslandscapingservicesinc.com, 1 @@ -128277,7 +128256,6 @@ santmark.net, 1 santmark.org, 1 santo.fi, 1 -santocollection.gr, 1 santodelgiorno.it, 1 santong.tk, 1 santons-fouque.fr, 1 @@ -128291,6 +128269,7 @@ santswebdesign.com, 1 santugon.tk, 1 santv.cc, 0 +sanufreshve.com, 1 sanukarlos.tk, 1 sanvicenteferrer.net, 1 sanweb.info, 1 @@ -128355,7 +128334,6 @@ saqara.com, 1 saracajner.com, 1 saracenmarkets.com, 1 -saradahentai.com, 1 sarafanchik.tk, 1 sarafanchiki.tk, 1 sarafani.tk, 1 @@ -128434,7 +128412,6 @@ sargarmi.tk, 1 sargenttechnologyservices.com, 1 sargepersonaltraining.com, 1 -sargeson.co.uk, 1 sargoi2008.com, 1 sarh.com.au, 1 sarhida.hu, 1 @@ -128565,9 +128542,9 @@ satta-company.tk, 1 sattaresult.net, 1 sattaresult.net.in, 1 +sattoempreendimentos.com.br, 1 satuenergy.com, 0 saturdayenterprises.ga, 1 -saturdaysetc.com, 1 saturn-test.network, 1 saturne.tk, 1 saturnjump.com, 1 @@ -128628,7 +128605,6 @@ savagecore.eu, 1 savagecore.uk, 1 savanna.io, 1 -savanna.vn.ua, 1 savannahgraham.com, 1 savannahhappycats.com, 1 savannapro.vn.ua, 1 @@ -128642,6 +128618,7 @@ savbus.ws, 1 savchenko.net, 1 savchook.com, 1 +savchyshyn.com, 1 savcurv.com, 1 save-home.com.tw, 1 save-me-aachen.de, 1 @@ -128741,8 +128718,6 @@ saxotrader.com, 1 saxynele.tk, 1 saxysensations.com, 1 -say-it-loud.com, 1 -sayansamanta.com, 0 sayany.tk, 1 sayax.com.tr, 1 saybecraft.ru, 1 @@ -128801,6 +128776,7 @@ sbgcred.com, 1 sbgg.sch.id, 1 sbhscotland.org.uk, 1 +sbidah.com, 1 sbiewald.de, 1 sbimtopografos.com, 1 sbin.pt, 1 @@ -128857,6 +128833,7 @@ scag9.com, 1 scala.click, 0 scalable.capital, 1 +scalableb2b.com, 1 scalafactory.io, 1 scalaire.com, 1 scalaire.fr, 1 @@ -129143,6 +129120,7 @@ schnaube.de, 1 schnauzer-dogs.com, 1 schneckenhilfe.de, 1 +schneedustcompany.com, 1 schnegg.name, 0 schneider-dresden.de, 1 schneider-romania.ro, 1 @@ -129223,6 +129201,7 @@ schooldistrictopioidrecoverygrants.com, 1 schooleducationharyana.gov.in, 1 schoolheads.ph, 1 +schoolhouse.world, 1 schoolroom.ga, 1 schoolrumble.tk, 1 schoolsafety.gov, 1 @@ -129347,11 +129326,13 @@ schwub.de, 1 sci-dril.net, 1 sci-internet.tk, 1 +sci-rjb.fr, 1 sci.com, 1 sciagebeton.net, 1 sciartel.ru, 1 scias.com, 1 scib.tk, 1 +scibro.com, 1 sciburg.com, 1 sciclubappiano.it, 1 scicollege.org.sg, 1 @@ -129387,6 +129368,7 @@ scientific-socialism.ga, 1 scientific-socialism.ml, 1 scientificdev.net, 1 +scientificwire.com, 1 scif.com, 1 scifisatellite.com, 1 scifisloth.com, 1 @@ -129468,6 +129450,7 @@ scores24.live, 1 scoresabermemes.com, 1 scoreup.pl, 1 +scoringandsounddesign.com, 1 scoro.com, 1 scorobudem.ru, 1 scorpia.co.uk, 1 @@ -129486,7 +129469,6 @@ scott-lacy.com, 1 scott-smith.us, 1 scott.cm, 1 -scott.st, 1 scott.today, 1 scottainslie.me.uk, 1 scottandtammy.com, 1 @@ -129515,7 +129497,6 @@ scottsboropdal.gov, 1 scottsdalegunclub.com, 1 scottseditaacting.com, 1 -scottsfreightshipping.com, 1 scottshorter.com.au, 1 scottspainting.com, 1 scottsvalley.gov, 1 @@ -129544,7 +129525,7 @@ scoutsanbartolome.tk, 1 scoutsanpieropatti.tk, 1 scoutsdeldesierto.tk, 1 -scoutwired.org, 1 +scoutwired.org, 0 scp-rustenholz-trens.notaires.fr, 1 scpe.eu.org, 1 scpocahontas.nl, 1 @@ -129569,7 +129550,6 @@ scrapbookdecorations.ga, 1 scrapbot.cl, 1 scrapcarbrampton.ca, 1 -scrapcars.net.au, 1 scrapfly.io, 1 scrapmartine.tk, 1 scrapmetals.bg, 1 @@ -129588,7 +129568,6 @@ screenclaim.com, 1 screenfax.de, 1 screenfox.net, 1 -screeningmaster.jp, 1 screeningxchange.com, 1 screenmachine.com, 1 screenpublisher.com, 1 @@ -129635,6 +129614,7 @@ scrumstack.co.uk, 1 scrumteamsurvey.org, 1 scryfall.com, 1 +scrylytics.com, 1 scs-technik.de, 1 scsd.si, 1 scservis.cz, 1 @@ -129689,6 +129669,7 @@ sdb.aero, 1 sdbc.com, 1 sdbehavioralhealth.gov, 1 +sdc-uae.ae, 1 sdcardrecovery.de, 1 sdcargo.net, 1 sdcitytimes.com, 1 @@ -129735,13 +129716,13 @@ sdsite.tk, 1 sdslandscaping.uk, 1 sdsmanagement.me, 0 +sdsmt.engineering, 1 sdstack.com, 1 sdsucollegian.com, 1 sduconnect.nl, 0 sdut.gq, 1 sdvv.nl, 1 sdyzmun.club, 1 -sdzp.com, 1 se-booster.com, 1 se-live.org, 1 se-theories.org, 1 @@ -129765,7 +129746,6 @@ seagrass-salcombe.com, 1 seagull-seafarer.org, 1 seahaweb.org, 1 -seaholmwines.com, 1 seaif.org, 1 seal-tite.eu, 1 sealability.co.uk, 1 @@ -129813,6 +129793,7 @@ search4btc.com, 1 search4stores.com, 1 searchable.ml, 1 +searchablevid.com, 1 searchbin.ca, 1 searchbyimages.com, 1 searchcandy.uk, 1 @@ -129837,7 +129818,6 @@ seark.edu, 1 searlesnorfolklodges.co.uk, 1 searsucker.com, 1 -searx.be, 1 searx.ee, 1 searx.nu, 1 searx.org, 1 @@ -129923,7 +129903,6 @@ sebepoznani.eu, 1 seberika.tk, 1 seberova.cz, 1 -sebetesty.cz, 1 sebgar.ca, 1 sebi.org, 1 sebjacobs.com, 1 @@ -130062,6 +130041,7 @@ securebot.ga, 1 securebuildingaccess.com, 1 securecheck360.com, 1 +securecloud.nz, 1 securecrypto.ai, 1 secured-login.net, 1 secured.vote, 1 @@ -130158,7 +130138,6 @@ securoswiss.ch, 1 securot.eu, 1 securview.ch, 1 -securyblack.com, 1 secutec.fr, 1 secvuln.com, 1 secvuln.info, 1 @@ -130182,6 +130161,10 @@ sedro-woolley.gov, 1 seduxury.com, 1 seduzironline.com.br, 1 +see-me.co, 1 +see-now.co, 1 +see-you.co, 1 +see.you, 1 seearmenia.tk, 1 seebetterlab.com, 1 seecat.biz, 1 @@ -130272,7 +130255,6 @@ segriz.com, 1 segulink.com, 1 segurancaresidencialbh.com.br, 1 -segurancati.com, 1 segurdatacr.com, 1 segurico.cz, 1 seguridad-informacion.com, 1 @@ -130294,7 +130276,7 @@ segv.fi, 1 sehat-solusi-makmur.com, 1 sehati.cafe, 1 -sehatyab.com, 1 +sehatyab.com, 0 sehbasarwar.com, 1 seheyah.me, 1 sei-yu.net, 1 @@ -130501,6 +130483,7 @@ semanarioaqui.tk, 1 semantic-systems.com, 1 semantics.ga, 1 +semaphore-studios.com, 1 semari.or.id, 1 sembosihosting.tk, 1 semboyan35.com, 1 @@ -130545,7 +130528,6 @@ sempersolaris.com, 1 semplicementelight.com, 1 sempoctet.ca, 1 -sempreg.com, 1 sempreupdate.com.br, 1 semps-2fa.de, 1 semps-threema.de, 1 @@ -130593,6 +130575,7 @@ sendaiouji.com, 1 sendbird.com, 1 sendbox.cz, 1 +sendcredit.com, 1 sendengo.com, 1 sender.net, 1 sender.party, 1 @@ -130652,6 +130635,9 @@ senpiper.com, 1 senrj.be, 1 sens2lavie.com, 1 +sensawise.au, 1 +sensawise.com, 1 +sensawise.com.au, 1 sense.eu.com, 1 sense.finance, 1 sense.hamburg, 1 @@ -130687,6 +130673,7 @@ sensualsexyhot.com.br, 1 sensuuri.tk, 1 sentechnology.co, 1 +sentel.net, 1 sentenza.tk, 1 senterada.tk, 1 sentez-cro.com, 1 @@ -130716,7 +130703,6 @@ senzoripresiune.com, 1 seo-analyse.com, 1 seo-blog12.tk, 1 -seo-dr-it.com, 1 seo-dvizh.ru, 1 seo-forum.nu, 0 seo-inc.ru, 1 @@ -130773,6 +130759,7 @@ seoified.com, 1 seoinc.com, 1 seojaguar.tk, 1 +seojuice.it, 1 seokatka.tk, 1 seolabuitest.azurewebsites.net, 1 seoline.cf, 1 @@ -130847,6 +130834,7 @@ seowork.tk, 1 seozel.tk, 1 seozen.top, 1 +seozilla.ai, 1 sep-online.com.pl, 1 sep.cc, 1 sepadental.com.my, 0 @@ -130865,6 +130853,7 @@ septem.cc, 0 septemcapital.ru, 1 septentrionalist.org, 1 +septero.pl, 1 septicrepairspecialists.com, 1 septics.ga, 1 septodont.com.ru, 1 @@ -130892,6 +130881,7 @@ serasaexperian.com.br, 1 seratblog.ga, 1 seratdl.ir, 1 +serban.cv, 1 serban.ro, 1 serbanpaun.ro, 1 serbiaonline.tk, 1 @@ -130941,6 +130931,7 @@ sergiochica21.tk, 1 sergiocv.com, 1 sergioforsanmateo.com, 1 +sergioforse.com, 1 sergiogm.es, 1 sergiogug.tk, 1 sergiomarujo.pt, 1 @@ -131044,7 +131035,9 @@ serverd.de, 1 serverdechile.tk, 1 serverdensity.io, 1 +serverdozen.nl, 1 serverdragon.site, 1 +serveretail.com, 1 serverhost.no, 1 serverhuis.nl, 1 serverhunter.com, 1 @@ -131122,6 +131115,7 @@ servicioskoinonia.org, 1 serviciosprevisionfuneraria.com, 1 serviciotecnicoencomputacion.com.ve, 0 +serviciotecnicosantcugat.es, 1 servier.com, 1 servietten-grosshandel.at, 1 servietten-grosshandel.be, 1 @@ -131255,6 +131249,7 @@ sevengang.tk, 1 sevenicealimentos.com.br, 1 sevenrooms.com, 0 +sevensdragons.de, 1 sevenseasons.bg, 1 sevenstudioconfigurator.ph, 1 sevensymbolsofkwanzaa.com, 1 @@ -131276,7 +131271,6 @@ sevocomm.com, 0 sevsey.ru, 1 sewardcountyne.gov, 1 -sewasafal.com, 1 sewatec.com, 1 sewavillamurah.tk, 1 sewfarsewgood.uk, 1 @@ -131347,7 +131341,6 @@ sextoysproductstore.com, 1 sextpanther.com, 1 sextreffendeutschland.com, 1 -sextubespot.com, 1 sextw.net, 1 sexualdiversity.org, 1 sexualidadcursosvip.com, 1 @@ -131481,6 +131474,7 @@ sfs.buzz, 1 sfslashing.com, 1 sftool.gov, 1 +sfumusic.com, 1 sfvonline.nl, 1 sfweef.gq, 1 sfxmedina.com, 1 @@ -131566,11 +131560,11 @@ shadebarandgrillwindsor.com, 1 shadedesign.cz, 1 shademid.com, 0 +shadesmart.org.au, 1 shadesofgray.law, 1 shadesofgrayadr.com, 1 shadesofgraylaw.com, 1 shadex.net, 1 -shadhoc.com, 1 shadikhan.tk, 1 shadow-forum.tk, 1 shadow-group.org, 1 @@ -131625,7 +131619,6 @@ shahar.cc, 0 shaharklamka.com, 1 shaharyaranjum.com, 1 -shahedpro.com, 1 shaheedirfani.tk, 1 shaheednawazirfani.tk, 1 shahidafkar.tk, 1 @@ -131680,7 +131673,7 @@ shambala.cf, 1 shamed.tk, 1 shamelessboutiquenc.com, 1 -shamelesslysexy.com, 1 +shamelesslysexy.com, 0 shamesofhungary.com, 1 shamil.tech, 1 shamimahmed.tk, 1 @@ -131732,11 +131725,11 @@ shaoxia.xyz, 0 shape.pink, 1 shapediver.com, 1 +shapelab.com.br, 1 shapers-production.fr, 1 shapes-audio.dk, 1 shapesouthcarolina.gov, 1 shapeyourcityhalifax.ca, 1 -shapps.online, 1 sharaf.net, 1 sharanyamunsi.net, 1 sharanyan.com, 1 @@ -131769,7 +131762,6 @@ sharenexus.at, 1 sharenexus.net, 1 sharenotes.tk, 1 -sharenow.click, 1 sharenz.com, 0 sharepointbestpractice.com, 1 sharepointcass.com, 1 @@ -131782,7 +131774,6 @@ sharethe.link, 1 sharethemeal.org, 1 sharetheroad.org, 1 -shareufo.com, 1 shareworks.com, 1 shareworx.net, 1 sharezen.de, 0 @@ -131819,7 +131810,7 @@ sharpe.systems, 1 sharpgalapagos.jp, 1 sharpiesscrubs.tk, 1 -sharpletters.net, 1 +sharpletters.net, 0 sharpmetals.com, 1 sharpsburg-ga.gov, 1 sharptudhope.co.nz, 1 @@ -131901,11 +131892,8 @@ sheet.host, 1 sheetengine.net, 1 sheetflowpro.com, 1 -sheetseeker1486.it, 1 sheezy.art, 1 sheezy.blog, 1 -sheezy.chat, 1 -sheezy.cloud, 1 sheezy.games, 1 sheezy.stream, 1 sheezy.wiki, 1 @@ -131918,6 +131906,7 @@ shefftunes.tk, 1 shehaal.com, 1 shehata.com, 1 +sheilacantone.it, 1 sheilasdrivingschool.com, 1 shek.zone, 1 shelburnepdvt.org, 1 @@ -132001,6 +131990,7 @@ sherpnortheast.com, 1 sherrikelley.com, 0 sherston.com, 1 +shertogenboschtimemachine.nl, 1 sherules.com, 1 shervinbeauty.com, 1 shervinsafineh.com, 1 @@ -132172,6 +132162,7 @@ shirimasen.com, 1 shirley.li, 1 shirlygilad.com, 1 +shiro.love, 1 shiroki-k.net, 1 shiropaev.tk, 1 shirosaki-hana.fun, 1 @@ -132246,6 +132237,7 @@ shoalcreekoutfitters.com, 0 shochikubai.tk, 1 shochufes.jp, 1 +shockbs.com, 1 shockerdragon.tk, 1 shockproof.systems, 1 shoejitsu.co, 1 @@ -132349,7 +132341,6 @@ shopmlr.com, 1 shopmontrose.com, 1 shopnemp.com, 1 -shopnguyenlieumypham.com, 1 shopofturkey.com, 1 shoponlinedeals.tk, 1 shopopop.com, 1 @@ -132357,7 +132348,6 @@ shoposal.com, 1 shopperexpertss.com, 1 shoppersdepuertorico.com, 1 -shoppersvineyard.com, 1 shoppies.tk, 1 shopping-cart-migration.com, 1 shopping-il.org.il, 1 @@ -132540,7 +132530,6 @@ shorewoodil.gov, 1 shorewoodmn.gov, 1 shorewoodwi.gov, 1 -shoreyit.com, 1 shorifhussain.tk, 1 shorinkarate.tk, 1 shornehasim.co.il, 1 @@ -132555,7 +132544,7 @@ shortbreakstudios.com, 1 shortcircuit-online.tk, 1 shortcut-link.ga, 1 -shortcut.com, 0 +shortcut.com, 1 shortcut.pw, 1 shortcutable.com, 1 shorted.one, 1 @@ -132758,7 +132747,6 @@ sialtv.pk, 1 siamdevsqua.re, 1 siamdevsquare.com, 1 -siamega.com, 1 siaminterhost.com, 1 siamnews.net, 1 siamojo.com, 1 @@ -132817,7 +132805,6 @@ sicksadworld.space, 1 sicomasp.com, 1 sicurezza24.info, 1 -sicurezzalavoro24.com, 1 sicurezzasud.it, 1 sid500.com, 1 sidari.tk, 1 @@ -132977,6 +132964,7 @@ signaturerx.co.uk, 1 signaturesmilesstudio.com, 1 signcreative.de, 1 +signdeer.com, 1 signeen.com, 1 signeen.net, 1 signere.com, 1 @@ -133011,17 +132999,16 @@ signupgenius.com, 1 signuponline.events, 1 signwell.com, 1 -signwriting.co.nz, 1 sigparser.com, 0 sigptr.me, 1 sigrid-mair.at, 1 -sigromid-construct.ro, 1 sigsync.com, 1 sigterm.no, 1 sigterm.sh, 1 sigurnost.online, 1 siguza.net, 1 sigvik.ru, 1 +sihealth.es, 1 sihy.uk, 1 siika.solutions, 1 siikaflix.tv, 1 @@ -133042,11 +133029,13 @@ siku-shop.ch, 1 siku.pro, 1 sil.box, 1 +sil.co.id, 1 sila.qa, 1 silagra.ml, 1 silalesa.ml, 1 silasborowy.de, 1 silashes.com, 1 +silatdefense.fr, 1 silbercloud.com, 1 silberkiste.com, 1 silbox.ch, 1 @@ -133225,7 +133214,6 @@ sim4seed.org, 1 simabonnement.nl, 1 simac.fr, 1 -simalis.lt, 1 simaogv.net, 1 simaris.shop, 1 simark.ca, 1 @@ -133244,6 +133232,7 @@ simcoecurlingclub.ca, 1 simcongroup.ir, 1 simdex.org, 1 +simdip.com.tr, 1 sime.am, 1 simeam-frank.de, 1 simeam.cloud, 1 @@ -133269,6 +133258,7 @@ simlog.tk, 1 simmonsbedstore.com, 1 simmonsvoice.com, 1 +simmtech.cloud, 1 simner.com, 1 simocar.fr, 0 simoesgoulart.com.br, 1 @@ -133386,10 +133376,10 @@ simplexwireless.com, 1 simplia.cz, 0 simpliby.com, 1 +simplifiedbackoffice.com, 1 simplifiedlaws.com, 1 simplifixed.com, 1 simplifyem.com, 1 -simplifyingcollege.com, 1 simplifylivelove.com, 1 simplifyvms.com, 1 simplix.info, 1 @@ -133449,7 +133439,6 @@ simscale.com, 1 simsek.biz.tr, 1 simsid-dev-applnchrapi.azurewebsites.net, 1 -simsid-dev-audit.azurewebsites.net, 1 simsid-dev-datamanager.azurewebsites.net, 1 simsid-dev-newsalertsapi.azurewebsites.net, 1 simsid-dev-oneroster.azurewebsites.net, 1 @@ -133461,7 +133450,6 @@ simsid-live-simstimetable.azurewebsites.net, 1 simsid-partner-adpapi.azurewebsites.net, 1 simsid-partner-aplaucherapi.azurewebsites.net, 1 -simsid-partner-audit.azurewebsites.net, 1 simsid-partner-datamanager.azurewebsites.net, 1 simsid-partner-newsalertsapi.azurewebsites.net, 1 simsid-partner-oneroster.azurewebsites.net, 1 @@ -133563,7 +133551,6 @@ singleproduction.com, 1 singles-aus-hamburg.de, 1 singles-berlin.de, 1 -singlespromo.com, 1 singleuse.link, 1 singluten.tk, 1 singolf.com, 1 @@ -133590,6 +133577,7 @@ sinnvoll-online.info, 1 sino.com, 1 sinobrake.com, 1 +sinobrake.org, 1 sinobrake.ru, 1 sinoexpo.com, 1 sinog.si, 1 @@ -133860,7 +133848,6 @@ sivaacademy.net, 1 sivaru.tk, 1 sivizius.eu, 1 -siw.nl, 1 siw64.com, 1 siwa.cf, 1 siwiki.rs, 1 @@ -133891,9 +133878,12 @@ sizebay.com, 1 sizeofvoid.org, 1 sizeunknown.com, 1 +sizeunknown.de, 1 sizeunknown.net, 1 +sizeunknown.org, 1 sizyff.fr, 1 sj-leisure.com, 1 +sj27user.ru, 1 sja-se-training.com, 1 sjaakgilsingfashion.nl, 1 sjaaktrekhaak.nl, 1 @@ -133912,6 +133902,7 @@ sjm-hamburg.de, 1 sjoelen.tk, 1 sjoelsport.nl, 1 +sjok.pl, 1 sjolseth.casa, 1 sjolseth.family, 1 sjolseth.io, 1 @@ -133925,7 +133916,7 @@ sjparanormal.tk, 1 sjrcommercialfinance.co.uk, 1 sjs.org.hk, 1 -sjtpo.org, 0 +sjtpo.org, 1 sjtravel.guru, 1 sjuhawknews.com, 1 sjukom.net, 1 @@ -133998,7 +133989,6 @@ skepticalsports.com, 1 skeptichaven.org, 1 skeptics.org, 1 -skepticsinthepub.org, 1 skeptik.tk, 1 skeptikon.fr, 1 skeptvet.com, 1 @@ -134007,7 +133997,7 @@ sketchbox.tk, 1 sketchmagazine.net, 1 sketchmonk.tk, 1 -sketchnote.co, 1 +sketchnote.co, 0 sketchy.tk, 1 skezi.eu, 1 skgzberichtenbox.nl, 1 @@ -134020,6 +134010,7 @@ skhron.com.ua, 1 skhron.eu, 1 ski-planet.com, 1 +skialpyjakvino.cz, 1 skiaustria.at, 1 skibbereencomhaltas.tk, 1 skibikers.tk, 1 @@ -134081,6 +134072,7 @@ skinboost.ga, 1 skinboost.ml, 1 skincare-note.com, 1 +skincare-znanost.hr, 1 skincareagent.cf, 1 skineducation.eu, 1 skinetic.eu, 1 @@ -134108,7 +134100,9 @@ skinsolutionclinic.com, 1 skinstyleglobal.com, 1 skinsuperstore.tk, 1 +skintdad.co.uk, 1 skintillation.com, 1 +skintime.bg, 1 skio.com, 0 skioakenfull.com, 1 skiozarts.fr, 1 @@ -134143,6 +134137,7 @@ sklepwielobranzowymd.com, 1 sklexpert.ru, 1 sklisen.tk, 1 +sklo24.com.ua, 1 skloposud.com, 1 sklotechnik.cz, 1 sklypas.com, 1 @@ -134237,7 +134232,6 @@ skvot.de, 1 skvot.io, 1 skwile-cafe.com, 1 -skwitko.com, 1 skwlkrs.com, 1 sky-aroma.com, 1 sky-brite.com, 1 @@ -134269,8 +134263,8 @@ skybrary.eu, 1 skybrary.info, 1 skybridge.net, 1 +skybuild-bg.com, 1 skycampusaachen.com, 1 -skycapture.ca, 1 skycert.co.nz, 1 skycert.nz, 1 skychan.org, 1 @@ -134345,7 +134339,6 @@ skypce.net, 1 skype, 1 skype.com, 0 -skypech.com, 1 skypicker.com, 1 skypicshd.com, 1 skyportcloud.com, 1 @@ -134396,7 +134389,7 @@ sl-alarm.ru, 1 sl-bildermacher.de, 1 sl-informatique.ovh, 1 -sl.al, 0 +sl.al, 1 sl0.us, 1 sl41.com.br, 1 sla.pl, 1 @@ -134442,7 +134435,6 @@ slashnroses.nl, 1 slashorg.net, 1 slashrepeat.com, 1 -slashtonic.com, 1 slaskie.pl, 1 slate.fr, 1 slate.to, 1 @@ -134461,7 +134453,6 @@ slavasoloviev.com, 1 slavasveta.info, 1 slaveflash.com, 1 -slaveykov.bg, 1 slavic401k.com, 1 slavira.ru, 1 slavnedny.cz, 1 @@ -134531,12 +134522,14 @@ slgcdn.com, 1 slhn.org, 1 sli.do, 1 +slice.global, 1 slicedpies.com, 1 sliceone.com, 1 slicticka.cz, 1 slide.cz, 1 slidebatch.com, 1 slidefiftyfamily.tk, 1 +slidefy.com.br, 1 slidemembers.com, 1 slideproducts.com, 1 slides.zone, 1 @@ -134619,6 +134612,7 @@ slotenspeciaalzaak.be, 1 slotenspeciaalzaak.nl, 1 sloterplas-management.nl, 1 +slotexperte.de, 1 slotfara.net, 1 slothless.com, 1 sloths.org, 1 @@ -134627,7 +134621,6 @@ slotjava.es, 1 slotjava.it, 1 slotlist.info, 1 -slotmachinesgratisonline.com, 1 slotmad.com, 1 slotsinspector.com, 1 slotsup.com, 1 @@ -134670,7 +134663,6 @@ slunecnice.cz, 1 slunyavchik.tk, 1 sluo.org, 1 -slushat-tekst-pesni.ru, 1 slushe.com, 1 slushpool.com, 1 sluto.co.jp, 1 @@ -134718,8 +134710,8 @@ smalldeveloper.ml, 1 smallfarmersjournal.com, 1 smallfoot.tk, 1 +smallguard.fr, 1 smallingerland.nl, 1 -smallpark.com, 1 smallplanet.com, 0 smalls-world.tk, 1 smallsiri.gq, 1 @@ -134730,7 +134722,6 @@ smallville.tk, 1 smallville25.tk, 1 smallwhitebear.ga, 1 -smaltimento-rifiuti.com, 1 smaltimento.caserta.it, 1 smaltimento.milano.it, 1 smaltimento.napoli.it, 1 @@ -134802,6 +134793,7 @@ smartcheck.gov, 1 smartchezvous.com, 0 smartchoices.ie, 1 +smartcitymedan.com, 1 smartclothing.pl, 1 smartcloudconnect.io, 1 smartcluster.ga, 1 @@ -134837,6 +134829,7 @@ smartguardzone.kr, 1 smarthdd.com, 1 smarthealthinnovationlab.com, 1 +smarthis.com, 1 smarthomegeldermalsen.nl, 1 smarthrms.com, 1 smarthus-elektro.no, 1 @@ -134954,10 +134947,8 @@ smbc.direct, 1 smbcmanubank.com, 1 smbi-gelblasterhq.com.au, 1 -smc.consulting, 1 smcacre.gov, 1 smcconsulting.be, 1 -smcconsulting.eu, 1 smcj.xyz, 1 smcpneumatics.com, 1 smcvote.gov, 1 @@ -134978,7 +134969,6 @@ smelly.cloud, 1 smeloan.sg, 1 smereka-frnt.de, 1 -smereka.ua, 1 smeso.it, 1 smeta.ml, 1 smetak.cz, 1 @@ -135026,7 +135016,7 @@ smime.io, 1 smipty.cn, 1 smipty.com, 1 -smirkhat.org, 0 +smirkhat.org, 1 smirniopoulos.gr, 1 smishnik.tk, 1 smit.com.ua, 1 @@ -135034,6 +135024,7 @@ smith-tech.ga, 1 smith.bz, 1 smithandnephewpensions.co.uk, 1 +smithbarlow.net, 1 smithbarlow.xyz, 1 smithbell.com.ph, 0 smithbrothersfs.com, 1 @@ -135056,6 +135047,7 @@ smits.frl, 1 smitsdesigncenter.nl, 1 smitsmail.net, 1 +smittysfurniture.com, 1 smkn1luragung.sch.id, 0 sml.lc, 1 smlk.org, 1 @@ -135171,7 +135163,6 @@ smtji.com, 1 smtnet.com, 1 smtouseef.com, 1 -smtparish.org, 1 smtpdev.com, 1 smtpserver.dk, 1 smuc-koca.si, 1 @@ -135324,7 +135315,6 @@ snotoppen.nl, 1 snoupon.com, 1 snovinky.cz, 1 -snow-companies.com, 1 snow-flowers.com, 1 snow-service.it, 1 snowalerts.nl, 1 @@ -135356,7 +135346,6 @@ snowplanet.tk, 1 snowplow.forsale, 1 snowpro.tk, 1 -snowprosinc.com, 1 snowrippers.ro, 0 snowschool.tk, 1 snowshoedistrictwv.gov, 1 @@ -135410,7 +135399,6 @@ sobakasite.tk, 1 sobaki.tk, 1 sobakoh-nyc.com, 1 -sobatkaos.biz.id, 1 sobchak.ga, 1 sobieray.dyndns.org, 1 soblaznenie.ru, 1 @@ -135629,7 +135617,6 @@ softblinds.co.uk, 1 softchin.ir, 1 softcleanr.shop, 0 -softcloudone.com, 1 softcompany.tk, 1 softcomplex.com, 1 softconcept.pt, 1 @@ -135639,13 +135626,13 @@ softelectronet.tk, 1 softenger.com, 1 softforge.co.uk, 1 -softfreeplus.com, 1 softfuture.tk, 1 softhints.com, 1 softios.com, 1 softizy.com, 1 softloom.com, 1 softmachine.es, 1 +softmath.com, 1 softnet-consulting.com, 1 softonic-ar.com, 1 softonic.cn, 1 @@ -135712,6 +135699,7 @@ sogutma.com.tr, 1 sohamroy.me, 1 sohanakhan.tk, 1 +soherco.cl, 1 sohka.eu, 1 soho-art.com, 1 soil-journal.net, 1 @@ -135781,7 +135769,6 @@ solarladder.com, 1 solarloon.com, 1 solaronics.tk, 1 -solarpanelquotes.org, 1 solarpanels.tk, 1 solarpanelscentralcoast.com, 1 solarplan-berlin.de, 1 @@ -135808,9 +135795,6 @@ soldarizona.ga, 1 soldaten-genealogie.tk, 1 soldbypatrice.com, 1 -solden.be, 1 -soldesduck.be, 1 -soldesduck.ch, 1 soldierangels.tk, 1 soldiersmg.tk, 1 sole-erdwaermetauscher.de, 1 @@ -135826,6 +135810,7 @@ solfegiator.ch, 0 solfipinformatique.org, 1 solgar.dk, 1 +solgar.se, 1 soli.cafe, 1 solicafe.at, 1 solid-earth.net, 1 @@ -135835,6 +135820,7 @@ solidarita-kosovo.net, 1 solidarityzone.org, 1 solidform.ml, 1 +solidgroup.bg, 1 solidhost.cf, 1 solidimage.com.br, 1 solidincome.ga, 1 @@ -135847,7 +135833,6 @@ solidshield.com, 1 solidsteel.tk, 1 solidtuesday.com, 1 -solidway.co.nz, 1 solifi.com, 1 solihull.ac.uk, 1 solihullinflatables.com, 1 @@ -135857,6 +135842,7 @@ solipsists.tk, 1 solisrey.es, 1 solitaire-game.org, 1 +solitaire.cat, 1 solitairenetwork.com, 1 solitary.social, 1 solitaryride.com, 1 @@ -135865,7 +135851,6 @@ soliujing.ml, 1 solium.com, 1 soliumsolucion.com, 1 -soliver-group.com, 1 soliver.de, 1 soliver.eu, 1 solix.com, 1 @@ -135900,7 +135885,6 @@ soloroboto.com, 0 solosesso.tk, 1 solostocks.com, 1 -solostocks.com.co, 1 solostocks.it, 1 solostocks.ma, 1 solostocks.pl, 1 @@ -135919,7 +135903,6 @@ solumgb.co.uk, 1 solunet.com.ar, 1 solut.ai, 1 -solutico.com, 1 solution.ch, 1 solutionalbum.com, 1 solutionbuilders.com, 1 @@ -135931,6 +135914,7 @@ solutions-visuelles.ch, 1 solutions30.com, 0 solutionshosted.de, 1 +solutionsthrough.tech, 1 solutiontutorials.com, 1 solutys-btp-logistic.com, 1 solutysmultiservices.com, 1 @@ -136123,6 +136107,7 @@ sonraisecurity.com, 1 sons.cf, 1 sons.tk, 1 +sonshi.guru, 1 sonshinephotography.com, 1 sonsight.tk, 1 sonsonate.cf, 1 @@ -136158,6 +136143,8 @@ sophieschoice.net, 1 sophomoric.ga, 1 sophos.com, 1 +sophos.net, 1 +sophosapps.com, 1 sophoswm.com, 1 sopht.li, 1 sophus.com.br, 1 @@ -136174,7 +136161,6 @@ soprovise.fr, 1 sopsop.tk, 1 soquee.net, 0 -sor.so, 1 sorabi.jp, 1 soracamed.com, 1 soraharu.com, 1 @@ -136293,6 +136279,7 @@ soubriquet.org, 1 soudebalsa.com.br, 1 souenfermagem.com.br, 1 +souenfermagem.org.br, 1 soufastnet.com.br, 1 souga.eu.org, 1 sougou.com, 1 @@ -136404,6 +136391,7 @@ sourceproject.ru, 1 sources.tk, 1 sourcesdegarrigue.fr, 1 +sourceweb.com, 1 sourcing4exports.co.uk, 1 sourcitec.com, 1 souria.tk, 1 @@ -136437,6 +136425,7 @@ southcoastlocksmiths.com.au, 0 southdakotahealth.tk, 1 southdakotanet.tk, 1 +southeast-wholesale.com, 1 southeastasianarchaeology.com, 1 southeastattacksquadron.org, 1 southeastwsf.org, 1 @@ -136458,7 +136447,6 @@ southernsecurity.org, 1 southernsurgicalga.com, 1 southernvalve.com, 1 -southessexstatus.co.uk, 1 southfieldtownshipmi.gov, 1 southfloridaopenhousesearch.com, 1 southgatemi.gov, 1 @@ -136479,7 +136467,6 @@ southphoenixair.tk, 1 southportland.gov, 1 southridgeservices.com, 1 -southrock.com, 1 southsands.com, 1 southshoreautowash.com, 1 southside-crew.com, 1 @@ -136490,8 +136477,8 @@ southsideplacetx.gov, 1 southspring.com, 1 southstpaulmn.gov, 1 -southtoowoombahawks.com.au, 0 southwebsterohio.gov, 1 +southwesternrugsdepot.com, 1 southwestkansaslibrarysystem.gov, 1 southwestportraits.com, 1 southwestpremierurology.com, 1 @@ -136543,7 +136530,6 @@ sovryn.com, 1 sovtech.tk, 1 sovxoz.gq, 1 -sowero.com, 1 sowero.de, 1 sowget.com, 1 sowhat.dk, 0 @@ -136584,9 +136570,9 @@ sozon.ca, 1 sp-codes.de, 1 sp-consulting.ch, 1 -sp-dynamo.com, 1 sp-magic.de, 1 sp-moebel.net, 1 +sp-ms.com, 1 sp-pn.com, 1 sp-sites.com.au, 1 sp-stm.ru, 1 @@ -136699,6 +136685,7 @@ spanda.io, 1 spandaubau.de, 1 spandrusyszyn.com, 1 +spanglishls.com, 1 spanien.guide, 1 spanischunterricht.tk, 1 spanishclub.blog, 1 @@ -136713,6 +136700,7 @@ spanmass-portal.org, 1 spanner.tk, 1 spanner.works, 1 +spanningtreenetworks.com, 1 spanpine.gq, 1 spanstindrundt.no, 1 spanyolul.hu, 1 @@ -136766,7 +136754,6 @@ sparksga.gov, 1 sparkweld.biz, 1 sparmedo.de, 1 -sparprofi.at, 1 sparrius.com, 1 sparrowwallet.com, 1 sparta-en.org, 1 @@ -136831,7 +136818,6 @@ speak.software, 1 speakeasy.co, 1 speakermatch.com, 1 -speakersassociates.com, 1 speakersbusiness.com, 1 speakersden.tk, 1 speakertwpmi.gov, 1 @@ -136959,12 +136945,15 @@ spencernc.gov, 1 spencerpauly.com, 0 spend.cloud, 1 +spendable.money, 1 spendd.co, 1 spendebt.com, 1 spendedge.com, 1 +spendelonmusk.money, 1 spenderservice.net, 1 spendesk.com, 1 spendlinq.com, 1 +spendmatters.com, 1 spendo.gq, 1 spenglerei-shop.de, 1 spenny.tf, 1 @@ -136985,6 +136974,7 @@ speycaster.net, 1 speztech.ru, 1 spheraes-amc.it, 1 +spheraes-bme.it, 1 spheraes.com, 1 sphereblur.com, 1 spherefluidics.com, 1 @@ -137151,7 +137141,6 @@ spmf.org.sg, 1 spmfijnmechanica.nl, 1 spmttest.azurewebsites.net, 1 -spn-it.de, 1 spnr.pt, 1 spnsv.com, 1 spocasi.cz, 1 @@ -137269,7 +137258,6 @@ sportsandnews.tk, 1 sportscanada.tk, 1 sportscentreuk.co.uk, 1 -sportscourtsunlimited.com, 1 sportsdans.tk, 1 sportsdeck.tk, 1 sportsdestinations.com, 1 @@ -137323,6 +137311,7 @@ spotpetinsurance.ca, 1 spotsee.io, 0 spotsolutions.com, 1 +spotsponsorblock.org, 1 spotswoodvet.com, 1 spotsy.gov, 1 spotsylvaniacounty-va.gov, 1 @@ -137427,6 +137416,7 @@ sprogress.uz, 1 sprossen-keimlinge.de, 1 sprossenwand.de, 1 +sprotty.net, 1 sprout.ph, 1 sproutdistro.com, 1 sproutsandstems.com, 1 @@ -137514,7 +137504,6 @@ squadco.com, 1 squadcoders.com, 1 squadgames.ru, 1 -squall.freeboxos.fr, 1 squamiferum.net, 1 squardllc.ml, 1 square-gamers.tk, 1 @@ -137661,6 +137650,7 @@ srp.gov, 1 srpcleanenergy.org, 1 srpx.de, 1 +srq.nu, 1 srqpedals.com, 1 srroddy.com, 1 srs.sg, 0 @@ -137677,6 +137667,7 @@ sruthisjewellery.com, 1 srv-4g-test.fr, 1 srv-home.fr, 1 +srv.com.ru, 1 srvhome.sk, 1 srvonfire.com, 1 srvrlss.io, 1 @@ -137719,7 +137710,6 @@ ssdpalermo.it, 1 ssenberg.nl, 1 ssense.co.jp, 0 -ssentinel.com, 1 ssetechnologies.com, 1 ssf.no, 0 ssfca.gov, 1 @@ -137748,6 +137738,7 @@ sslc.gov, 1 sslcertificaten.nl, 1 sslcheck.nl, 1 +sslcheckerpro.com, 1 sslcloud.net, 1 ssld.at, 1 ssldecoder.eu, 1 @@ -137777,7 +137768,6 @@ ssmwebportal.tk, 1 ssnetwork.jp, 1 ssnj.org, 1 -ssone.ee, 1 ssprod.tk, 1 sspu.ml, 1 ssqq.com, 1 @@ -137812,6 +137802,7 @@ st3tailor.com.br, 1 st42.fr, 1 staaldart.tk, 1 +staarwaarsserver.com, 1 staatdesinternets.nl, 1 staatdesnederlandscheninternets.nl, 1 staatdesnederlandseninternets.nl, 1 @@ -137845,6 +137836,7 @@ stacykeifer.com, 1 stacylight.com, 1 stad.gent, 1 +stad.one, 1 stadiamaps.com, 1 stadiaworld.com, 1 stadionmanager.com, 1 @@ -138141,7 +138133,7 @@ staringer.net, 1 starinup.com, 1 starinvestama.co.id, 1 -starinvestingship.com, 1 +starinvestingship.com, 0 starka.st, 1 starken.com, 1 starking.net.cn, 1 @@ -138208,6 +138200,7 @@ startbetter.tk, 1 startbiz.biz.id, 1 startbiz.co.id, 1 +startcare.org, 1 starteesforsale.co.za, 1 starter.social, 1 startersiteweb.com, 1 @@ -138242,6 +138235,7 @@ startupislandtaiwan.com, 1 startupislandtaiwan.net, 1 startupislandtaiwan.org, 1 +startupmadeira.eu, 1 startupmoldova.digital, 1 startupnewstamil.com, 1 startupnow.cz, 1 @@ -138266,8 +138260,6 @@ starworksglobal.com, 1 starx.ink, 1 staryuk.com, 1 -starzbetgir.com, 1 -starzbetmarketing.com, 1 stashbase.org, 1 stashcast.org, 1 stashlocal.com, 1 @@ -138316,7 +138308,6 @@ staticline.de, 0 staticweb.tk, 1 statik.space, 1 -statinfer.com, 1 stationa.ch, 0 stationary-traveller.eu, 1 stationaryengines.tk, 1 @@ -138329,7 +138320,6 @@ statista.com, 1 statistik-online.org, 1 statistik-seminare.de, 1 -statius.co.uk, 1 statnevlajky.sk, 1 statnivlajky.cz, 1 stats-co.eu, 1 @@ -138350,13 +138340,14 @@ statusboard.eu, 1 statuscast.com, 1 statuscode.ch, 0 -statusforward.com, 1 +statusforward.com, 0 statusmachine.com, 1 statusmantra.tk, 1 statusspb.ru, 1 statxperts.com, 1 stavangerliving.no, 1 stavbymilota.cz, 1 +stavgp2.ru, 1 stavinchains.tk, 1 stavnager.net, 1 stavovskystat.cz, 1 @@ -138374,6 +138365,7 @@ stayglam.com, 1 stayhotelwaikiki.com, 1 stayinbusiness.nl, 1 +stayingfitter.com, 1 stayksa.com, 1 staylovely.tk, 1 stayme.cz, 1 @@ -138565,6 +138557,7 @@ steliosmanousakis.gr, 1 stella-base.com, 0 stellacinderella.net, 1 +stellaconnect.net, 1 stellamccartney.com, 1 stellamobilya.com, 1 stellanetworks.io, 1 @@ -138730,7 +138723,6 @@ sterz.io, 1 stestena.eu, 1 stesti.cz, 1 -stethostalk.com, 1 stetson.edu, 1 stetsonrealestate.com, 1 stetten-akm.de, 1 @@ -138755,15 +138747,16 @@ stevegrav.es, 1 steveherlihyphotography.com, 1 stevejobsfollowers.tk, 1 +stevejoneswebdev.co.uk, 1 stevemario.com, 1 stevemason.tk, 1 stevemonteyne.be, 1 steven-klix.de, 0 stevenapate.com, 1 stevenavaldez.tk, 1 +stevenbaxontwerpt.nl, 1 stevenbolgartersnakes.com, 1 stevendearstyne.com, 1 -stevendubner.com.br, 1 stevengoodpaster.com, 1 stevengrech.com, 1 stevenjacobs.be, 1 @@ -138849,7 +138842,6 @@ stickerapp.com, 1 stickerparadise.me, 1 stickers-garage.com, 1 -stickertrade.me, 1 stickies.io, 1 stickmangames.tk, 1 stickme.be, 1 @@ -138884,6 +138876,7 @@ stigaview.com, 1 stihi-na-zakaz.net, 1 stihiya.tk, 1 +stihlshop.co.nz, 1 stiira.com, 1 stijnodink.nl, 1 stikic.me, 1 @@ -139060,9 +139053,9 @@ stoffkontor-wennigsen.de, 1 stohrm.com, 1 stoianlawfirm.com, 1 +stoicadarius.com, 1 stoicatedy.ovh, 1 stoicnotaries.com, 1 -stoicsimple.com, 1 stoicus.com.br, 1 stoinov.com, 1 stoiximatikesetairies.tv, 1 @@ -139079,7 +139072,6 @@ stoll.info, 1 stollen-wurm.de, 1 stollenwurm.de, 1 -stolpe.io, 1 stolpe.tk, 1 stolpe5674.tk, 1 stolpersteine-dithmarschen.tk, 1 @@ -139328,7 +139320,7 @@ stpioparish.com, 1 stpip.com, 1 stpip.net, 1 -stps.dk, 0 +stps.dk, 1 str470s.duckdns.org, 1 str8hd.com, 1 str92.com, 1 @@ -139363,6 +139355,7 @@ strandhaus-claassen.de, 1 strandhousedingle.com, 1 strandkorb-jentzsch.de, 1 +strandls.com, 1 strandschnuppern.de, 0 strange.ga, 1 strangecharmlabs.com, 1 @@ -139373,6 +139366,7 @@ strangelane.com, 1 strangelanerecords.com, 1 strangelittlecovers.tk, 1 +strangeminds.social, 1 strangemusicbox.com, 1 strangemusichollywood.com, 1 strangemusicinc.com, 1 @@ -139395,6 +139389,7 @@ strassberger.tk, 1 strasweb.fr, 1 stratagemlabs.tech, 1 +stratahealth.com, 1 stratcat.com, 1 stratebi.com, 1 strategery.io, 1 @@ -139408,7 +139403,6 @@ strategicstorytelling.co.za, 1 strategie-zone.de, 1 stratego-belgie.tk, 1 -strategosa.com, 1 strategy.it, 1 strategy66.com, 1 strategybusiness.ga, 1 @@ -139436,7 +139430,6 @@ strattonapps.com, 1 strattonhats.com, 1 stratum0.org, 1 -stratuscloud.co.za, 1 stratuscloud.group, 1 stratuscloudconsulting.net, 1 stratuspayments.net, 1 @@ -139478,6 +139471,7 @@ stream-music.cz, 1 stream-network.cz, 1 stream-studio.ovh, 1 +stream-tek.com, 1 stream.gifts, 1 stream.ru, 0 stream10.cz, 1 @@ -139510,6 +139504,7 @@ streams.dyndns.org, 1 streamside.tk, 1 streamsoft.pl, 1 +streamspouredout.com, 1 streamteam.cz, 1 streamurl.link, 1 streamusic.cz, 1 @@ -139542,6 +139537,7 @@ streetdancecenter.com, 1 streetdreamz.tk, 1 streetforceteam.tk, 1 +streetguess.com, 1 streetking.tk, 1 streetliferadio.tk, 1 streetlightdata.com, 1 @@ -139621,7 +139617,6 @@ stroimsami.tk, 1 stroimvse.ml, 1 stroiproect.tk, 1 -strojar.com, 1 strojmaster.tk, 1 strokesb.store, 1 strokesurvivor.nz, 1 @@ -139644,7 +139639,6 @@ strongencryption.org, 1 stronger-communities.org.uk, 1 strongercommunity.org.uk, 1 -strongerfoundationrealestate.com, 1 strongergateway.com, 1 strongestcashoffer.com, 1 strongmind.be, 1 @@ -139656,6 +139650,7 @@ strongsalpinesucculents.com, 1 strongspace.com, 1 strongtomorrow.tk, 1 +strony365.pl, 1 stronyinternetowekoszalin.pl, 1 stronypiotra.pl, 1 stronywww-lodz.pl, 1 @@ -139835,6 +139830,7 @@ studionerisabatini.it, 1 studionorwood.com, 1 studionowystyl.pl, 1 +studioocasp.com.br, 1 studiopanamaitalia.com, 1 studiopirrate.com, 1 studioshiftup.net, 1 @@ -140136,9 +140132,6 @@ sudoku-insight.tk, 1 sudoku.org.ua, 1 sudokuenlinea.com, 1 -sudoless.com, 1 -sudoless.eu, 1 -sudoless.net, 1 sudopoint.com.br, 1 sudosaveclimate.com, 1 sudoschool.com, 1 @@ -140187,6 +140180,7 @@ sugarondemand.com, 1 sugaropencloud.eu, 1 sugaropencloud.uk, 1 +sugaroy.com, 1 sugarpiano.com, 1 sugarroll.ml, 1 sugarsalted.com, 1 @@ -140245,6 +140239,7 @@ sukker-oaxaca.com, 1 sukoyakapp.com, 1 sukrie.net, 1 +sukrithideveloper.in, 1 sukruarslan.tk, 1 suksit.com, 0 sukys.lt, 1 @@ -140261,6 +140256,7 @@ sullivancontractingct.com, 1 sullivancountypa.gov, 1 sulman4paf.tk, 1 +sulminastv.com.br, 1 sulphurspringsar.gov, 1 sultanrecords.com, 1 sultans.tk, 1 @@ -140378,7 +140374,6 @@ sunbusinessnetwork.org, 1 sunby.jp, 1 sunby.org, 1 -suncanakolica.eu, 1 suncanary.tk, 1 suncat.tk, 1 sunchild.ml, 1 @@ -140394,13 +140389,11 @@ suncity8668.com, 1 suncity8998.com, 1 suncloud.ch, 1 -suncoastdisplays.com, 1 suncoastrebuilding.com, 1 suncomegrain.ga, 1 suncrypto.in, 1 sundalandia.pp.ua, 1 sunday.pm, 1 -sundaydesigner.com, 1 sundayfundayjapan.com, 1 sundaysky.com, 1 sundaytansa.com, 1 @@ -140411,6 +140404,7 @@ sundhedsvejen.dk, 1 sundialpowdercoating.com, 1 sundiel.tk, 1 +sundown.fr, 1 sundylinks.com, 1 suneden.com, 1 suneilpatel.com, 1 @@ -140443,7 +140437,6 @@ sunnuntaimargariini.fi, 1 sunnuntaipaasiainen.fi, 1 sunnuntaipiirakka.fi, 1 -sunnuslight.com, 1 sunny.co.uk, 1 sunnyhome.tk, 1 sunnylyx.com, 1 @@ -140478,7 +140471,7 @@ sunsafe.se, 1 sunsandvoids.systems, 1 sunsdesign.net, 1 -sunsetfire.de, 1 +sunsetfire.de, 0 sunsetmusic.tk, 1 sunsetnelson.com, 1 sunsetplumbingutah.com, 1 @@ -140493,7 +140486,7 @@ sunshinelife.tk, 1 sunshinereporting.com, 1 sunshinerequest.com, 1 -sunshinetradingco.com, 1 +sunshinetradingco.com, 0 sunskyview.com, 1 sunsmartnsw.com.au, 1 sunsong.org, 1 @@ -140737,7 +140730,6 @@ supplementaanbiedingen.nl, 1 supplementalconditions.com, 1 supplementpolice.tk, 1 -supplementwarehouseonline.com, 1 supplhi.com, 1 supplierlinkup.com, 1 suppliersession2021.com, 1 @@ -140750,7 +140742,6 @@ support-ticino.ch, 1 support.mayfirst.org, 0 support1448.com, 1 -support1448.org, 1 supportal.one, 1 supportericking.org, 1 supportersupport.co.uk, 1 @@ -140776,6 +140767,7 @@ supremacrypt.com, 1 supreme-council.me, 1 supreme-court.tk, 1 +supreme.com.br, 1 supremecarnage.de, 1 suprememale.tk, 1 suprintbot.xyz, 0 @@ -140847,6 +140839,8 @@ surplusdirectory.ml, 1 surplusrecord.com, 1 surpreem.com, 1 +surprise4u.co, 1 +surprise4u.me, 1 surprisepubliclibrary.gov, 1 surpriz-net.tk, 1 surrattlegal.com, 1 @@ -141013,6 +141007,7 @@ svarka24.com.ua, 1 svarka26.gq, 1 svarmax.com.ua, 1 +svarnainstitute.com, 1 svarovani.tk, 1 svasse.nl, 1 svatba.cf, 1 @@ -141043,7 +141038,6 @@ svenmuller.com, 1 svenmuller.nl, 1 svenska.events, 1 -svenskafoder.se, 1 svenskakyrkansunga.tk, 1 svenskamassan.se, 1 svenskapsalmer.se, 1 @@ -141065,7 +141059,6 @@ svetkuenergija.lv, 1 svetlanamamedova.tk, 1 svetlayarus.tk, 1 -svetlilo.com, 1 svetlograd.tk, 1 svetoch.ga, 1 svetoch.tk, 1 @@ -141155,7 +141148,6 @@ swap.gg, 1 swap.ly, 1 swapbox.tk, 1 -swapcakedrop.com, 1 swapfiets.com, 1 swapfiets.de, 1 swapfiets.nl, 1 @@ -141208,7 +141200,6 @@ sweeppeasweeps.com, 1 sweering.com, 1 sweers.ch, 1 -sweet-quiz.com, 1 sweet-spatula.com, 0 sweet64.fr, 1 sweetair.com, 1 @@ -141401,6 +141392,7 @@ swprowood.com, 1 swqa.hu, 1 swretail.ga, 1 +swtchart.org, 1 swtp-p-appsrv-coordination-backend-businessservices1.azurewebsites.net, 1 swtp-p-appsrv-coordination-platform-businessservices1.azurewebsites.net, 1 swtp-p-appsrv-donorevaluation-api-businessservices1.azurewebsites.net, 1 @@ -141438,6 +141430,7 @@ syd.catholic.edu.au, 1 sydcatholicschools.nsw.edu.au, 1 sydgrabber.tk, 1 +sydneyairsolar.com.au, 1 sydneyaustralia.tk, 1 sydneycakesg.com.au, 1 sydneycityremovalists.com.au, 1 @@ -141485,7 +141478,9 @@ sym8.io, 1 symantec.com.ru, 1 symatrix.co.uk, 1 +symbeo.com, 1 symbility.net, 1 +symbiolife.pl, 1 symbiose-com.ch, 0 symbiose-immobilier.ch, 0 symbiose.com, 1 @@ -141521,7 +141516,6 @@ syna.dev, 1 syna.site, 1 synabi.com, 0 -synackrst.net, 1 synap.ac, 1 synapse.ee, 1 synapse.pe, 1 @@ -141655,6 +141649,7 @@ sysmanagement.it, 1 sysmike.de, 1 sysmike.net, 1 +sysnet.com.sg, 1 sysnet.cz, 1 sysoons.com, 1 sysopworld.cf, 1 @@ -141697,6 +141692,7 @@ systemno.ru, 1 systemofmedicine.com, 1 systemology.com, 1 +systemone.tech, 1 systemonthego.com, 1 systems-thinking.eu, 1 systemsense.com.au, 1 @@ -141715,7 +141711,7 @@ sytenko.org.ua, 1 syuez.com, 1 syunpay.cn, 1 -syupfssy.com, 1 +syupfssy.com, 0 syuumi.eu, 1 syuumi.me, 1 syzygy-tables.info, 1 @@ -141802,6 +141798,7 @@ t-moon.hr, 1 t-network.nl, 1 t-op1.com, 1 +t-op26.com, 1 t-op6.com, 1 t-op7.com, 1 t-op8.com, 1 @@ -141967,7 +141964,7 @@ tabular.tools, 1 tabulartools.com, 1 tabulex.dk, 1 -tabunkatraining.com, 1 +tabunkatraining.com, 0 taburetka.ua, 1 tac-performance.net, 1 tac-sys.net, 1 @@ -142200,10 +142197,10 @@ takko-fashion.com, 1 takkyu-navi.jp, 1 takosuke.net, 1 -takotv.live, 1 taks.nl, 1 taksaft.tk, 1 takshni.com, 1 +taksihesaplama.com, 1 taktak.co.uk, 0 taktika.tk, 1 takuhai12.com, 1 @@ -142243,7 +142240,7 @@ talentlint.com, 1 talentlms.com, 1 talentmill.co, 1 -talento.dev.br, 1 +talento.dev.br, 0 talentoday.com, 1 talentplatform.ca, 1 talentplatform.com, 1 @@ -142254,6 +142251,7 @@ talentwall.io, 1 taler-systems.com, 1 taler.net, 1 +talerakademiet.dk, 1 talesbazaar.com, 1 talesfromthebigpig.com, 0 talesoftenko.tk, 1 @@ -142297,8 +142295,10 @@ tallcraft.net, 1 tallercommercial.com, 1 tallercs.tk, 1 +tallerdesign.co.uk, 1 talleresluse.com, 1 tallest.nl, 1 +talleyrandconsultancy.com, 1 tallgrasslegal.com, 1 tallinnsec.ee, 1 tallinnsex.ee, 1 @@ -142330,7 +142330,6 @@ tamarind.by, 1 tamarpsychotherapy.co.uk, 1 tambahpinter.com, 1 -tambang.in, 1 tambayology.com, 1 tambo.es, 1 tamboa.com, 1 @@ -142418,7 +142417,6 @@ tangentor.gov, 1 tangerangkota.go.id, 1 tangiblesnft.com, 1 -tangier.academy, 1 tangier.tk, 1 tangiertours.ma, 1 tangipahoa.gov, 1 @@ -142444,6 +142442,7 @@ tanie-obraczki-szczecin.tk, 1 tanie-uprawnienia-sep.pl, 1 taniepaleciaki.pl, 1 +tanieserwetki.pl, 1 taniguchi.jp.net, 1 taniguchi.link, 1 taniguchi.osaka.jp, 1 @@ -142454,11 +142453,13 @@ tankdoggear.tk, 1 tankebygga.re, 1 tankersleywine.com, 1 +tanknaplo.hu, 1 tanknology.ca, 1 tankos.tk, 1 tankpassen-vergelijken.nl, 1 tanks.je, 1 tankski.co.uk, 1 +tanming.com.my, 1 tanned.tk, 1 tannenhof-moelln.de, 1 tanner.sh, 1 @@ -142483,7 +142484,6 @@ tanto259.name, 1 tantor.com, 1 tantrabali.tk, 1 -tantrafilms.com, 1 tantravoorlichting.nl, 1 tantrum-rocks.tk, 1 tantso.com, 1 @@ -142616,7 +142616,6 @@ tarot-oracle.com, 0 tarot.vn, 1 tarotcarmenruiz.com, 1 -tarotistayastrologa.com, 1 tarotreadingexplained.com, 1 tarotyvidente.es, 1 tarper24.net, 1 @@ -142717,8 +142716,8 @@ tatoo-shop.ca, 1 tatooine.club, 1 tatort-fanpage.de, 1 +tatortreinigung-365.de, 1 tatra.ca, 1 -tatra.nl, 1 tatsidou.gr, 1 tatsoi.net, 1 tatsumi-air.com, 1 @@ -142770,6 +142769,7 @@ tava.tk, 1 tavanahost.com, 1 tavaresfl.gov, 1 +tavat.xyz, 1 tavda.info, 1 tavelbutiken.com, 0 taverne.tk, 1 @@ -142798,6 +142798,7 @@ tavsys.net, 1 tawzea.com, 0 tax-brain.net, 1 +tax-cpa-usa.com, 1 tax-guard.com, 1 taxandor.com, 1 taxassist.co.uk, 1 @@ -142829,6 +142830,7 @@ taxi24.ml, 1 taxi502.com.ua, 1 taxi7.be, 1 +taxibelgrade.com, 1 taxibiz.ga, 1 taxibruxelles24.be, 0 taxibudapest.com, 1 @@ -142843,7 +142845,6 @@ taximarcaminha.com, 1 taximinvody.ml, 1 taximovies.gq, 1 -taxipool.co.il, 1 taxis-collectifs.ch, 0 taxis-villefontaine.com, 1 taxisafmatosinhos.pt, 1 @@ -142923,7 +142924,6 @@ tbox.net, 1 tbpchan.cz, 1 tbq-s.com, 1 -tbreni.hu, 1 tbrindus.ca, 1 tbs-certificates.co.uk, 1 tbscan.com, 1 @@ -142977,12 +142977,12 @@ tchoukball.ch, 0 tchouktchouk-baroum.fr, 1 tci-style.pl, 1 -tci-thaijo.org, 0 +tci-thaijo.org, 1 +tci-thailand.org, 1 tciit.pl, 1 tcj.ir, 1 tcl.sh, 1 tcmk-tomsk.ru, 1 -tcn.news, 1 tcnapplications.com, 1 tco.zapto.org, 1 tcoa.tk, 1 @@ -143053,7 +143053,6 @@ tea.codes, 1 tea.in.th, 1 teablr.com, 1 -teach.com, 1 teach.gq, 1 teachbase.ru, 1 teachbiz.net, 1 @@ -143105,7 +143104,7 @@ team-io.net, 1 team-royal.tk, 1 team-russia.tk, 1 -team-slicrown.com, 1 +team-slicrown.com, 0 team-swami.com, 1 team-toranomon.com, 1 team-wolf.ch, 1 @@ -143260,7 +143259,6 @@ teardrop.tk, 1 tearihome.com, 1 tearoomlints.be, 1 -teasenetwork.com, 1 teaser-trailer.com, 1 teasers.ga, 1 teaterbristol.se, 1 @@ -143283,11 +143281,11 @@ tebligat.net.tr, 1 tebligattakip.com, 1 tebligattakip.net, 1 -tebodental.com, 1 +tebodental.com, 0 tebodentalgroup.com, 1 tebodentistryatlanta.com, 1 tebodentistryforkids.com, 1 -teboorthodontics.com, 1 +teboorthodontics.com, 0 tebsonati.tk, 1 tebx-1.com, 1 tebx1.com, 1 @@ -143320,7 +143318,6 @@ tech-seminar.jp, 1 tech-seo-summit.com, 1 tech-urdu.tk, 1 -tech-value.eu, 1 tech-zoom.com, 1 tech3599.com, 1 tech3araby.com, 1 @@ -143341,14 +143338,12 @@ techbrawl.org, 1 techbridge.jp, 1 techbuz.net, 1 -techcaresolutions.in, 1 techcavern.ml, 1 techcentral.ml, 1 techcenturion.com, 1 techchip.com, 1 techclan.ga, 1 techcluster.tk, 1 -techcm.com, 1 techcody.com, 1 techcolorado.tk, 1 techcombank.com, 1 @@ -143374,7 +143369,6 @@ teched-creations.com, 1 techexeter.uk, 1 techexpert.tips, 1 -techexplorist.com, 1 techfibian.tk, 1 techfinancials.co.za, 1 techformator.pl, 1 @@ -143399,6 +143393,7 @@ techiehall.com, 1 techieidiots.ml, 1 techiesmart.tk, 1 +techik.nl, 1 techikoma.social, 1 techindiana.tk, 1 techindo.cf, 1 @@ -143431,7 +143426,6 @@ techmammal.de, 1 techmanstan.com, 1 techmatter.tk, 1 -techmatterglobal.com, 1 techmatters.org, 1 techmayhem.net, 1 techmeout.io, 1 @@ -143474,6 +143468,7 @@ techniquetechs.com, 1 techno-utopia.com, 1 technoairlines.com, 0 +technobaboy.com, 1 technocast.dz, 1 technochat.in, 1 technocracy.works, 1 @@ -143511,7 +143506,7 @@ technologyinformation.tk, 1 technologyintergrity.ga, 1 technologyjust.ga, 1 -technologylawdispatch.com, 1 +technologylawdispatch.com, 0 technologylittle.ga, 1 technologymessenger.ga, 1 technologynewss.tk, 1 @@ -143527,6 +143522,7 @@ technolove.ru, 1 technolution.tk, 1 technomagia.tk, 1 +technomium.com, 1 technomix.tk, 1 technopedia.gq, 1 technorthdakota.tk, 1 @@ -143552,7 +143548,6 @@ technoyl.com, 1 technubis.com, 1 techodesign.pro, 1 -techonline.com, 1 techpartes.com.br, 1 techpartneralliance.com, 1 techpeer.al, 1 @@ -143731,7 +143726,6 @@ tee-suche.de, 1 teechu.com, 1 teecketing.com, 1 -teedinsiam.com, 1 teefashionstar.com, 1 teehany.com, 1 teehar.com, 1 @@ -143742,6 +143736,7 @@ teektalk.org, 1 teemill.com, 1 teemo.gg, 1 +teemo.love, 1 teemulintula.fi, 1 teen-club.tk, 1 teen-porno-video.ru, 1 @@ -143807,7 +143802,6 @@ tehpod.com.ua, 1 tehrabbitt.com, 0 tehrankey.ir, 1 -tehransantral.ir, 1 tehranservicekaran.com, 1 teia.art, 1 teichroeb.net, 1 @@ -143820,7 +143814,6 @@ teiron.ml, 1 teiseken.tk, 1 teixobactin.com, 1 -tejasnetworks.com, 1 tejo.tk, 1 tejomaya.net, 1 tek-el.ru, 1 @@ -143860,7 +143853,6 @@ tekpon.com, 1 tekshrek.com, 1 teksnologi.com, 1 -teksol-boat.ru, 1 tekson.com, 1 tekstover.tk, 1 tekstpesni.tk, 1 @@ -143944,7 +143936,6 @@ telegram.org, 1 telegram.poker, 1 telegramlearn.tk, 1 -telegramseen.com, 1 telehealthventures.com, 0 telekollektiv.org, 1 telekom-mms.com, 1 @@ -143976,7 +143967,6 @@ teleradio.tk, 1 teleroute.com, 0 telesales.guru, 1 -telescopi.com, 1 teleshkronja.ml, 1 teleshop.be, 1 teleskell.org, 1 @@ -144031,7 +144021,7 @@ tellja.eu, 1 tellme.tk, 1 tellusaboutus.com, 1 -tellusr.com, 1 +tellusr.com, 0 telly.site, 1 tellygames.com, 1 tellyourtale.com, 1 @@ -144155,7 +144145,6 @@ tenismare.si, 1 tenispopular.com, 1 tenisservis.eu, 1 -tenjav.com, 1 tenjou-tenge.tk, 1 tenken1010.org, 1 tenkuru.moe, 1 @@ -144188,7 +144177,7 @@ tenshoku-hanashi.com, 1 tenshokudo.com, 1 tenshokufair.jp, 1 -tensor.trade, 1 +tensor.trade, 0 tent.io, 1 tenta.com, 1 tentacle.monster, 1 @@ -144208,12 +144197,13 @@ tenyx.de, 1 tenzan.com, 1 tenzer.dk, 1 +tenzorpro.com, 1 teoassessoria.com.br, 1 teodorpravicky.com, 1 teoletextsq.tk, 1 teologia.promo, 0 teomahk.de, 1 -teoria.com, 0 +teoria.com, 1 teoriespiknuti.cz, 1 teoskanta.fi, 1 tep.com, 1 @@ -144226,7 +144216,6 @@ teplohod.kharkov.ua, 1 teplomash24.ru, 1 teplotehnik.tk, 1 -teplovizor.info, 1 teppelin.fr, 1 teppichpracker.at, 1 tepui.io, 1 @@ -144244,11 +144233,13 @@ teradatta.tk, 1 teraflop.it, 1 terahtaylor.com, 1 +teralios.de, 1 teramind.co, 1 teramundi.com, 1 teran.me, 1 teran.pw, 1 teran.ru, 1 +teranautas.com, 1 terapeuticaenalza.es, 1 terapiaradial.tk, 1 terapower.com.tw, 1 @@ -144267,7 +144258,6 @@ terenska-edinica.tk, 1 terentevdesignstudio.com, 1 terento.org, 1 -teresahansen.com, 1 teritwarsj.org, 1 teriva.ua, 1 term-master.ru, 1 @@ -144345,7 +144335,6 @@ terraquercus.tk, 1 terrariatr.tk, 1 terrarium.tk, 1 -terrariumstation.com, 1 terraroc.ro, 1 terrasandcooking.nl, 1 terrasandcookingoutdoor.nl, 1 @@ -144426,6 +144415,7 @@ test-ravkavonline.co, 1 test-regressplattform.ch, 1 test-school.ml, 1 +test-software.net, 1 test-textbooks.com, 1 test-verz.online, 1 test.de, 1 @@ -144464,14 +144454,12 @@ testgroup.nl, 1 testhcai.ca, 1 testheat.org, 1 -testic.com, 1 testikel.be, 1 testimonyiq.com, 1 testimonyiq.info, 1 testimonyiq.net, 1 testimonyiq.org, 1 testing-server.tk, 1 -testingbot.com, 1 testingtask.tk, 1 testingthe.net, 1 testingxperts.com, 1 @@ -144498,6 +144486,7 @@ testpornsite.com, 1 testprep.online, 1 testprepinsight.com, 1 +testprograms.net, 1 testpsicotecnicos.com.es, 1 testq.se, 1 testrack.com, 1 @@ -144515,7 +144504,6 @@ testspeed.it, 1 testspsicotecnicos.org, 1 testsweb.ml, 1 -testtable.com, 1 testthis.cf, 1 testufo.com, 1 testvision.nl, 1 @@ -144547,7 +144535,6 @@ tetsudo.jp.net, 1 tetsumaki.net, 1 tetweb.ir, 1 -teu-fel.com, 1 teufel-cloud.ddns.net, 1 teufel.de, 1 teufelaudio.nl, 1 @@ -144596,10 +144583,8 @@ texasscrapiron.com, 1 texasteam.tk, 1 texastitlesearch.com, 1 -texasultraspirit.com, 1 texasvolunteerattorneys.org, 1 texaswinetrail.com, 1 -texauto.bg, 1 texby.com, 1 texdot.gov, 1 texel.tk, 1 @@ -144607,7 +144592,6 @@ texhfexlabs.de, 1 texicopolicenm.gov, 1 texier.mx, 1 -texkey.com, 1 texkings.com, 1 texlan.lk, 1 texnoguru.tk, 1 @@ -144643,7 +144627,6 @@ textundblog.de, 1 textura.bg, 1 textura.gr, 1 -texturehifi.com, 1 textures-resource.com, 1 textus.com, 1 textzformatter.com, 1 @@ -144691,7 +144674,6 @@ tfok.ml, 1 tfrei.de, 1 tfrei.net, 1 -tfscreener.com, 1 tfsrcymru.org.uk, 1 tfus.co, 1 tfw-a.com, 1 @@ -144724,7 +144706,6 @@ tgui.net, 1 tgw.com, 1 tgx.rs, 0 -th-1x.com, 1 th-1xbet.com, 1 th-expert.be, 1 th-fanlist.tk, 1 @@ -144837,10 +144818,8 @@ the-archive.ml, 1 the-azad.com, 1 the-big-bang-theory.com, 1 -the-bookies.com, 1 the-brandidentity.com, 1 the-burtons.xyz, 1 -the-carshop.com, 1 the-club.fr, 1 the-cryosphere-discuss.net, 1 the-cryosphere.net, 1 @@ -144861,7 +144840,6 @@ the-land-of-nomo.org, 1 the-land-of-nomo.panasonic, 1 the-lfb.tk, 1 -the-mechanics.co.uk, 1 the-mermaid.tk, 1 the-metropolitans.tk, 1 the-muddy-trophy-team.tk, 1 @@ -144871,15 +144849,12 @@ the-pcca.org, 1 the-pequod.com, 1 the-photographer-directory.com, 1 -the-pressoffice.com, 1 the-red.pp.ua, 1 -the-snaglist.com, 1 the-spellcaster.com, 1 the-spoonfeed.club, 1 the-storm.tk, 1 the-tech-trend.com, 1 the-tg.com, 1 -the-toolshop.com, 1 the-top.net, 1 the-wandering-midget.tk, 1 the-winx.tk, 1 @@ -144905,6 +144880,8 @@ theaddresses.com, 1 theadelaideshow.com.au, 1 theadpharm.com, 0 +theads.agency, 1 +theads.net, 1 theadultswiki.com, 1 theadventuresofdaisy.com, 1 theafleo.ga, 1 @@ -144912,6 +144889,7 @@ theagencywithoutaname.com, 1 theaidigitalmarketingblog.com, 1 theaim.ca, 1 +theaiqms.com, 1 theajwatson.com, 1 thealbionrooms.live, 1 thealchemistatelier.com, 1 @@ -145159,7 +145137,6 @@ thechallenge.fit, 1 thechannels.org, 1 thechatlinenumbers.com, 1 -thechauffeur-international.com, 1 thechavs.xyz, 1 thecheapairlinetickets.com, 1 thecheat.tk, 1 @@ -145181,7 +145158,6 @@ thecityscene.com, 0 thecitywarehouse.clothing, 1 theclair.ca, 1 -theclarke.wedding, 1 thecleverhost.co.uk, 1 theclimatebook.org, 1 theclockdepot.com, 1 @@ -145202,7 +145178,6 @@ thecommunityguide.org, 1 thecompany.pl, 1 thecompliancepeople.co.uk, 1 -theconcierge-international.com, 1 theconcordbridge.azurewebsites.net, 1 thecondemned.tk, 1 theconsultant.jp, 1 @@ -145229,6 +145204,7 @@ thecrcconnection.com, 1 thecreditpros.com, 1 thecrew-exchange.com, 1 +thecrewunlimited.ru, 1 thecrimson.tk, 1 thecrimsonwhite.com, 1 thecrite.com, 1 @@ -145322,7 +145298,6 @@ theeffingyogablog.com, 1 theegyptblog.tk, 1 theeifactory.com, 1 -theeighthbit.com, 0 theel0ja.info, 1 theel0ja.ovh, 1 theeldritchhounds.cf, 1 @@ -145338,7 +145313,6 @@ theendpoem.com, 1 theepankar.com, 1 theepicstorm.com, 1 -theerneshot.com, 1 theescapegame.com, 0 theestateplanninggroup.com, 1 theestatesatstgeorge.com, 1 @@ -145399,6 +145373,7 @@ thefountain.eu, 1 thefox.com.fr, 1 thefoxai.com, 1 +thefoxblog.net, 1 thefoxmagazine.com, 1 thefranchiseking.com, 1 thefranklinnewspost.com, 1 @@ -145430,7 +145405,6 @@ thegamecave.co.uk, 1 thegamecollector.tk, 1 thegamekitchen.com, 1 -thegamesroom.tv, 1 thegantars.tk, 1 thegardensmall.com.my, 1 thegarvisgroup.com, 1 @@ -145460,10 +145434,13 @@ thegioinguyenlieuphache.vn, 1 theglencoetorah.com, 1 theglobalwin.com, 1 +theglowclinic.nl, 1 thego2swatking.com, 1 thegoalinc.co.jp, 1 thegolden.com, 1 +thegoldengild.com, 1 thegoldenpreference.com, 1 +thegoodboat.com, 1 thegooddeal.shop, 1 thegoodegg.ie, 1 thegoodinside.com, 1 @@ -145521,6 +145498,7 @@ thehassanmusic.tk, 1 thehasty.com, 1 thehaxbys.co.uk, 1 +thehaystackapp.com, 1 thehaze.org, 1 theheadplug.tk, 1 thehealinghorse.com, 1 @@ -145559,6 +145537,8 @@ thehumanjoint.com, 1 thehumorist.tk, 1 thehustle.co, 1 +theia-ide.com, 1 +theia-ide.eu, 1 theiaglasses.com, 1 theictlab.org, 1 theideaskitchen.com.au, 1 @@ -145620,7 +145600,6 @@ thekitsunesden.com, 1 thekittivibe.com, 1 thekliniquehotdeal.com, 1 -theknittingnetwork.co.uk, 1 theknockout.tk, 1 theknockoutchampionship.com, 1 theknowitguy.com, 1 @@ -145669,6 +145648,7 @@ thelionworksop.co.uk, 1 thelittlepeartree.eu, 1 thelocals.ru, 1 +thelocalsessions.com, 1 thelockerroom.ie, 1 thelocxresearch.tk, 1 thelodgeonlakedetroit.com, 1 @@ -145689,7 +145669,7 @@ theloveequation.com, 1 theloves.com, 1 thelowell.org, 1 -theluxurytraintravelcompany.com, 0 +thelt.org, 1 thelwallrangers.tk, 1 themacateam.com, 1 themacollection.com, 1 @@ -145710,7 +145690,6 @@ themassageguy.capetown, 1 themaster.tk, 1 themasterplan.com.au, 1 -thematchless.de, 1 themathbehindthe.science, 1 themathscentre.com, 1 themattresswarehouse.co.za, 1 @@ -145744,8 +145723,8 @@ themigraineinstitute.com, 1 themilanlife.com, 1 themilfmovies.com, 1 -themilnermethod.co.uk, 1 themindcollection.com, 1 +themindcompany.com, 1 theminimalistentrepreneur.com, 1 themiracle.tk, 1 themirc.tk, 1 @@ -145839,7 +145818,6 @@ theodorahome.co, 1 theodorahome.com.br, 1 theodoreroosevelt.org, 1 -theodorojr.com.br, 1 theofficeofangelascott.com, 1 theoffsetbinary.co.in, 1 theofleck.com, 0 @@ -145855,7 +145833,6 @@ theome.ga, 1 theonethaimassage.de, 1 theonikage.tk, 1 -theonionsites.com, 1 theonlineclarion.com, 1 theonyxzone.com, 1 theoosmetalart.nl, 1 @@ -145920,7 +145897,6 @@ thepenguinstudio.com, 1 thepenmuse.net, 1 thepennyjar.com, 1 -thepeoplesvoice.org, 1 theperformanceblog.com, 1 theperfumespot.com, 1 theperfumestore.bg, 1 @@ -145970,6 +145946,7 @@ thepressurewashingdirectory.com, 1 thepriceisright.tk, 1 thepridefunding.com, 1 +thepriesthouse.co.uk, 1 theprimegroup.ca, 1 theprimepr.in, 1 theprinceshort.tk, 1 @@ -145999,10 +145976,10 @@ thequintessentialcake.com, 1 theracket.club, 1 theradiojudge.com, 1 -theradiologyblog.com, 1 theraklinik.de, 1 theralino.de, 1 therame.de, 1 +theramo.re, 1 therampageonline.com, 1 theranch.com, 1 therandombits.com, 1 @@ -146016,6 +145993,7 @@ therapie-psycho-emotionnelle.fr, 1 therapiepraxis-westbezirk.de, 1 therapyclient.com, 1 +therapyequipment.co.uk, 1 therapyforblackmen.org, 0 therapyglobe.com, 1 therapynotes.com, 1 @@ -146074,7 +146052,6 @@ thermacon.com.au, 0 thermalbad-therme.de, 1 thermalitowsca.gov, 1 -thermannconsult.dk, 1 thermique.ch, 0 thermity.com, 0 thermolamina.nl, 1 @@ -146082,6 +146059,7 @@ thermopoliswy.gov, 1 thermorhythm.com, 1 thermos-cafe.fr, 1 +thermoschied.de, 1 thermostat.gq, 1 thermostatsolutions.com, 1 thermostatupdates.com, 1 @@ -146090,7 +146068,6 @@ theroadrunners.tk, 1 theroams.co.uk, 1 therobertcoffeeshow.com, 1 -therockawaysny.com, 0 theroguestormtrooper.com, 1 therohotel.com, 1 therokasshow.tk, 1 @@ -146202,7 +146179,6 @@ thespiritfm.tk, 1 thespittake.com, 1 thespoiler.co.il, 1 -thesportsroom.tv, 1 thestandards.tk, 1 thestatementjewelry.com, 1 thesteins.org, 0 @@ -146229,10 +146205,10 @@ thesugargirls.com, 1 thesultans.tk, 1 thesunflower.com, 1 +thesuntease.com, 1 thesupersunday.tk, 1 thesuppercircle.com, 1 thesupportplatform.org.uk, 1 -thesupremacyg.com, 0 thesurgeons.sg, 1 theswanstation.tk, 1 theswanwindsor.co.uk, 1 @@ -146392,7 +146368,6 @@ thewolseley.com, 1 thewombatsict.com.au, 1 thewomen.tk, 1 -thewomensbusinesscenter.com, 0 thewoodkid.com.au, 1 thewoodlandsviplimousine.com, 0 thewoodnorton.com, 1 @@ -146419,7 +146394,6 @@ thexalla.tk, 1 thexme.de, 1 thexpert.ml, 1 -they-are-after.us, 1 theyacht.ga, 1 theyachtweek.com, 0 theyakshack.co.uk, 1 @@ -146431,7 +146405,6 @@ theyellow.fish, 1 theyellowsub.org, 1 theyosh.nl, 1 -theyoungok.com, 1 theysocial.tk, 1 thezillersathenshotel.com, 1 thezimbabwean.co, 1 @@ -146509,7 +146482,6 @@ thinkelectric.cf, 1 thinkelectric.gq, 1 thinkelectric.ml, 1 -thinkfortune.com, 1 thinkforyourself.tk, 1 thinkhealing.co.uk, 1 thinkindifferent.net, 1 @@ -146638,7 +146610,6 @@ thomsonbaby.com, 1 thomsonscleaning.co.uk, 1 thomwiggers.nl, 1 -thongnhat.com.vn, 1 thongsokythuat.vn, 1 thongtinthethao.net, 1 thor.edu, 1 @@ -146658,6 +146629,7 @@ thorsteinsson.com, 1 thorsten-schaefer.com, 1 thorstenschaefer.name, 1 +those.jp, 1 thost3.de, 1 thotcomputed.com, 1 thots.org, 1 @@ -146790,10 +146762,11 @@ thriva.co, 1 thrive-gyms.co.za, 1 thrivefostering.com, 1 -thriveondev.com, 1 +thriveondev.com, 0 thriver.com, 1 thrivetours.ca, 0 thrivetracker.com, 1 +thrivewithprofit.com, 1 throckmortoncountytx.gov, 1 throneofmolok.tk, 1 thronia2.ro, 1 @@ -146815,14 +146788,12 @@ thuban.me, 1 thuenhapho.com, 1 thues.eu, 1 -thuexehuyminh.vn, 1 thugcityrecords.tk, 1 thuisverplegingvandermeiren.be, 1 thuiswinkel.org, 1 thumbnail-download.com, 1 thumbnails.jp, 1 thumbsupcandy.com, 1 -thumbtack.com, 1 thumbzilla.com, 1 thummer.net, 1 thunderbase.tk, 1 @@ -146850,7 +146821,7 @@ thuthuatmac.com, 1 thutm.com, 1 thutucxuatnhapkhau.net, 1 -thuyetphapmoi.com, 1 +thuyetphapmoi.com, 0 thw-messenger.de, 1 thwiki.cc, 1 thwitt.de, 1 @@ -146875,7 +146846,6 @@ tiai.cf, 1 tiai.gq, 1 tiai.ml, 1 -tiaki.org, 0 tiamabi.tk, 1 tiamarcia.com.br, 1 tian123.com, 1 @@ -146891,8 +146861,8 @@ tianibeeming.com, 1 tianibeeming.com.au, 1 tianjiaxi.com, 1 -tianjinair.com, 1 tianle.sh, 1 +tianma.com, 1 tianshili.me, 1 tianwen.tk, 1 tianxicaipiao.com, 1 @@ -146980,7 +146950,6 @@ tickit.ca, 0 ticktbox.com, 1 ticnom.com, 1 -ticoartisan.com, 1 tictac.com.tr, 1 tictac.tk, 1 tictail.com, 1 @@ -147032,7 +147001,6 @@ tienic.com, 1 tiens-ib.cz, 1 tiepao.cn, 1 -tier5industries.com, 1 tierarzt-karlsruhe-durlach.de, 1 tierarztpraxis-illerwinkel.de, 1 tieredaccess.com, 1 @@ -147080,7 +147048,6 @@ tigerdownelectronics.ca, 1 tigerengine.com, 1 tigerfm.tk, 1 -tigerfocus.com, 1 tigerforce.tk, 1 tigergraph.com, 1 tigergroup.tk, 1 @@ -147165,7 +147132,6 @@ till.im, 1 tillamook911.gov, 1 tillamookcounty.gov, 1 -tillberg.us, 1 tillehus.frl, 1 tilleysbouncycastles.co.uk, 1 tillinger.sk, 1 @@ -147215,13 +147181,13 @@ time-business.tk, 1 time-hotel.cf, 1 time-killers.tk, 1 +time-pro.de, 1 time.cy, 1 time.gov, 1 time.lk, 1 time.ly, 1 time.sh, 1 time2060.ru, 1 -time2choose.com, 1 timeai.io, 1 timebomb.tk, 1 timebookings.cf, 1 @@ -147269,6 +147235,7 @@ timeserver1.de, 1 timeserver2.de, 1 timeserver3.de, 1 +timesheet.io, 1 timesheetcomics.com, 1 timesloth.io, 1 timesofisrael.com, 1 @@ -147449,6 +147416,7 @@ tipoftheday.tips, 1 tipplist.com, 1 tipranks.com, 1 +tipresentoilcane.com, 1 tips4gamers.com, 1 tips4india.tk, 1 tipsbymoh.tech, 1 @@ -147480,7 +147448,6 @@ tiraspol.tk, 1 tiraspolnews.ru, 1 tirebichon.eu, 1 -tiredsleepy.net, 1 tiremart.com, 1 tirex.media, 0 tirflesia.it, 1 @@ -147507,7 +147474,9 @@ tispayments.com, 1 tissueimmunecellatlas.org, 1 tissuestabilitycellatlas.org, 1 +tissus-de-reve.fr, 1 tissus-paris.com, 1 +tisvapo.it, 1 tit-cdn.de, 1 tit-dev.de, 1 tit-dns.de, 1 @@ -147516,6 +147485,7 @@ titanandco.com, 0 titanchannel.com, 1 titandirect.co.uk, 1 +titanfile.com, 1 titanhst.com, 1 titanicauto.ro, 1 titaniumconsulting.co.uk, 1 @@ -147542,7 +147512,6 @@ titrespresse.com, 1 titser.ph, 1 tittelbach.at, 1 -tittlelawgroup.net, 1 titulares.ar, 0 titularizadora.com, 1 titulosuniversitariosalaventa.com, 1 @@ -147587,7 +147556,6 @@ tk-its.net, 1 tk-its.org, 1 tk2net.com, 1 -tk8813.com, 1 tk88at.net, 1 tkach.in.ua, 1 tkacz.pro, 1 @@ -147696,7 +147664,6 @@ tmj4.com, 1 tmm.cx, 1 tmmapps.com, 1 -tmn.io, 1 tmobilethuis.nl.eu.org, 1 tmora.org, 1 tmp.sx, 1 @@ -147754,6 +147721,7 @@ to.cm, 0 to.gt, 1 to.kg, 1 +to.md, 1 toabaja.com, 1 toad.ga, 1 toadcreekmusic.com, 1 @@ -147850,6 +147818,7 @@ todaysbestinsurance.com, 1 todaysdatenow.com, 1 todaysparent.com, 1 +todaytrailer.com, 1 todayupdates.ga, 1 toddassoc.com, 1 toddcullumresearch.com, 1 @@ -148051,6 +148020,7 @@ tomasmatulevicius.lt, 1 tomasmoberg.org, 1 tomaszdwornicki.net, 1 +tomaszmalka.com, 1 tomatis-nantes.com, 1 tomatis-training.ch, 1 tomatoflyer.com, 1 @@ -148071,13 +148041,12 @@ tombu.xyz, 0 tomco-corporation.tk, 1 tomcort.com, 1 -tomd.ai, 1 +tomd.ai, 0 tomdapice.com, 1 tomdougiamas.com, 1 tomdudfield.com, 1 tomedo.de, 1 tomend.es, 1 -tometjenny.fr, 1 tomfelton.tk, 1 tomff.com, 1 tomfisher.eu, 1 @@ -148096,7 +148065,6 @@ tominysun.com, 1 tomisha.com, 1 tomisha.jobs, 1 -tomislava.com, 1 tomjepp.uk, 1 tomjn.com, 1 tomkempers.nl, 1 @@ -148271,7 +148239,6 @@ tookan.tech, 1 tookhan.tk, 1 tool.lu, 1 -toolano.com, 0 toolbox.ninja, 0 toolboxsoftware.tk, 1 toolecountysheriffmt.gov, 1 @@ -148400,7 +148367,6 @@ topas.tk, 1 topaxi.codes, 0 topazium.site, 1 -topbargains.com.au, 1 topbloc.com, 1 topbookmarking.cf, 1 topbouncycastles.co.uk, 1 @@ -148433,7 +148399,6 @@ topdosug.ml, 1 topdroneusa.com, 1 topeducationhelp.co, 1 -topekafoundationpros.com, 1 topendcamphire.com.au, 1 toperadigital.com, 1 topesdegama.com, 1 @@ -148447,7 +148412,6 @@ topfx.com, 1 topfx.com.sc, 1 topgallant.gq, 1 -topgevelbekleding.nl, 1 topgoogle.com, 1 topgshop.ru, 1 toph.co, 1 @@ -148510,8 +148474,8 @@ toppan-specialityfilms.com, 1 toppdatingportal.com, 1 toppdejtingsidor.com, 1 +toppercan.es, 1 topporn.me, 1 -topppinfo.com, 1 topprice.ua, 1 topprogaragedoor.com, 1 toppsnfts.com, 1 @@ -148738,7 +148702,6 @@ totalabogados.cl, 1 totalaccessnicaragua.co, 1 totalbabble.com, 1 -totalbugdefense.com, 1 totalbyverizon.com, 1 totalcarcheck.co.uk, 1 totalcare.co.nz, 1 @@ -148761,7 +148724,6 @@ totalforcegym.com, 1 totalfoundationpros.com, 1 totalhost.gq, 1 -totalintegratedtherapy.com, 1 totalityservices.co.uk, 1 totallegal.com, 1 totally-dakota.tk, 1 @@ -149234,14 +149196,11 @@ toyshowthemusical.ie, 1 toysperiod.com, 1 toysplace.ml, 1 -toystech.com.ar, 1 toystory3.ga, 1 toyventure.ga, 1 tozawa.site, 1 tozdev.com, 1 tp-genie.com, 1 -tp-shipping.co.uk, 1 -tp-technology.co.uk, 1 tpa.or.th, 0 tpala-pg.fr, 1 tpark.jp, 1 @@ -149320,6 +149279,7 @@ tracery.jp, 1 tracesteps.ga, 1 tracetracker.com, 1 +traceur-france-rhone-alpes.com, 1 traceur-france.fr, 1 traceurdirect.com, 1 traceurlocation.com, 1 @@ -149348,6 +149308,7 @@ trackiq.net.au, 1 trackle.de, 1 tracklist4u.com, 1 +trackman.com, 1 tracknetsports.com, 1 trackntack.com, 1 tracksandbox.io, 1 @@ -149377,6 +149338,7 @@ trade-bot.cf, 1 trade-foods.com, 1 trade-platform.tk, 1 +trade-wires.co.uk, 1 trade.gov, 1 trade.mn, 1 trade247.exchange, 1 @@ -149398,7 +149360,6 @@ traderbobsgeneralstore.com, 1 traderfox.de, 0 traderinside.ga, 1 -traderjobs.com, 1 traderlion.com, 1 tradernet.com, 1 tradernew.pro, 1 @@ -149441,7 +149402,6 @@ tradition.ch, 1 tradition.com, 1 traditional.kz, 1 -traditionalvector.com, 1 traditions.nl, 1 traditionskapperscollege.nl, 1 traditionsvivantesenimages.ch, 1 @@ -149463,7 +149423,7 @@ trafficjunky.com, 1 trafficlaundering.com, 1 trafficmafia.net, 1 -trafficmanager.com, 1 +trafficmanager.com, 0 trafficmanager.xxx, 1 trafficmgr.cn, 1 trafficmgr.net, 1 @@ -149550,6 +149510,7 @@ traitement-punaise.paris, 1 traiteur-laporte.fr, 1 traiteurpapillonevents.be, 1 +traitkeeper.xyz, 1 trajectfoto.nl, 1 trajectvideo.nl, 1 trak74.su, 1 @@ -149563,7 +149524,6 @@ tramadol.ga, 1 tramadolhcl.ga, 1 tramclub-basel.ch, 1 -trames.ch, 1 tramikshop.ml, 1 tramin.in, 1 tramitelegal.com.ar, 1 @@ -149776,7 +149736,6 @@ trashpanda.website, 1 trashwagon.club, 1 trashy-gypsy.com, 1 -trashyaf.com, 1 trashylingerie.ga, 1 traslatio.com, 1 traslocare.roma.it, 1 @@ -149792,8 +149751,8 @@ trasportatori.it, 1 trasportoambulanzaprivata.it, 1 trasteralia.com, 1 -trastornoevitacion.com, 0 -trastornolimite.com, 0 +trastornoevitacion.com, 1 +trastornolimite.com, 1 tratt.net, 1 trattamenti.biz, 1 trattamento-cotto.it, 1 @@ -149806,14 +149765,12 @@ traumfaenger.tk, 1 traumobjekte.com, 1 traumobjekte.info, 1 -traumschwingen.de, 1 traumtrauringe.de, 1 traunimbild.at, 1 traut.cloud, 1 travador.com, 1 trave.africa, 1 travel-cube.ml, 1 -travel-dealz.eu, 1 travel-rus-club.tk, 1 travel-smarter.com, 1 travel-to-cuba.tk, 1 @@ -150011,6 +149968,7 @@ trblwlf.net, 1 trctaborda.com.br, 1 trdepoist.net, 1 +tre-sp.jus.br, 1 treadmillrepair.co.nz, 0 treadwellgordon.co.nz, 0 treaslockbox.gov, 1 @@ -150054,6 +150012,7 @@ treetop.com, 1 treetta.com, 1 treevectors.com, 1 +treexiptv.com, 1 treexy.com, 1 treezone.net, 1 trefpuntdemeent.nl, 1 @@ -150188,6 +150147,7 @@ triangela.com, 1 triangela.se, 1 triangle-energie.com, 0 +trianglebruins.org, 1 trianglecastles.co.uk, 1 trianglelawngames.com, 1 triangletv.rs, 1 @@ -150242,7 +150202,7 @@ tricountybank.com, 1 tricountyhealthut.gov, 1 tricountyheatingcooling.com, 1 -triddybeads.com, 1 +triddybeads.com, 0 trident1000logoi.gr, 1 tridentaquatics.net, 1 tridentdiagnostics.com, 1 @@ -150258,6 +150218,7 @@ triesteprima.it, 1 trieuvy.com, 1 trifiro.it, 1 +trigardon-rg.de, 1 trigate.io, 1 triggeredpaintz.com, 1 triggerskills.com, 1 @@ -150332,6 +150293,7 @@ triomoda.com.br, 1 trionyx.ph, 1 triop.se, 1 +triopsys.nl, 1 triozon.hu, 1 trip.my, 1 tripadvicestore.tk, 1 @@ -150363,7 +150325,6 @@ tripoli.org, 1 tripolinews.tk, 1 tripomanija.tk, 1 -tripout.tech, 1 tripozo.com, 1 tripp.xyz, 1 trippati.com, 1 @@ -150372,7 +150333,7 @@ trippinktattoos.com, 1 trips4foodies.com, 1 tripsfromarrakech.com, 1 -tripstorome.com, 1 +tripstorome.com, 0 triptap.ru, 1 triptravels.tk, 1 triptych.is, 1 @@ -150425,7 +150386,6 @@ trocaire.org, 1 trochoi.net, 1 trockendock.ch, 1 -trockner-fehler.site, 1 trodat-samara.ru, 1 trodat.cf, 1 trodniescis.gq, 1 @@ -150436,7 +150396,6 @@ trogloditas.tk, 1 troi.de, 1 troiaconsultoria.com.br, 1 -troianet.com.br, 1 troisprime.com, 0 trojanchronicles.tk, 1 trojanherring.com, 1 @@ -150471,7 +150430,6 @@ trondelagfylke.no, 1 trondphoto.com, 1 trongkhanh.com, 1 -trongtanvn.com, 1 tronics.eu, 1 tronika.no, 1 tronlaserarena.cz, 1 @@ -150486,6 +150444,7 @@ troonnorthgolf.com, 0 troopaid.info, 1 troopers.de, 1 +trootech.com, 1 trophcomplewin.ml, 1 trophies.de, 1 trophykoi.tk, 1 @@ -150508,7 +150467,6 @@ troplo.com.au, 1 troplo.eu.org, 1 troplo.site, 1 -tropofy.com, 1 troppotogo.it, 1 troqueladoras.online, 1 trosell.net, 1 @@ -150519,6 +150477,7 @@ troubleshooter.xyz, 1 troubleshooting.cz, 1 troubleshooting.support, 1 +troubleshooting.tools, 1 troubleshootyourvehicle.com, 1 troupcountyga.gov, 1 trousers.co.uk, 1 @@ -150596,6 +150555,7 @@ truebluebay.com, 1 truecar.co.il, 1 trueccu.com, 1 +truechangepublishing.com, 1 truecharts.org, 1 truechimer.com, 1 truecircumcision.tk, 1 @@ -150686,7 +150646,6 @@ trufflemonkey.co.uk, 1 trufi-association.org, 1 truhlarstvi-fise.cz, 1 -truimo.com, 0 truklink.cf, 1 truklink.ga, 1 truklink.gq, 1 @@ -150716,7 +150675,6 @@ truong.fi, 1 truonganhdecor.com, 1 truongnguyen.live, 1 -truqu.com, 1 trureg.uk, 1 truromusicteacher.co.uk, 1 trusecurity.gq, 1 @@ -150730,6 +150688,7 @@ trust-ted.co.uk, 1 trust.zone, 1 trust2protect.de, 1 +trustarte.com, 1 trustarts.org, 1 trustauth.cn, 1 trustcert.net, 1 @@ -150742,6 +150701,7 @@ trusted-signatures.com, 1 trustedclothes.com, 1 trustedhost.site, 1 +trustedinstalle.rs, 1 trustednetworks.nl, 1 trustedstack.com, 1 trustedtoolbox.com, 1 @@ -150756,6 +150716,7 @@ trustradi.us, 1 trustreview.tk, 1 trustserv.de, 1 +trustserver.cn, 1 truststamp.ai, 1 truststvincent.com, 1 trustswiftly.com, 1 @@ -150871,7 +150832,6 @@ tsgbcs.org, 1 tsgbit.net, 1 tshirai.work, 1 -tshirtatlowprice.com, 1 tshirtgenerator.ga, 1 tshirtmemoryquilts.com, 0 tshirts.durban, 1 @@ -150973,6 +150933,7 @@ ttb.gov, 0 ttb.me, 1 ttbonline.gov, 1 +ttc-me.com, 1 ttcak.ddns.net, 1 ttcf.ca, 1 ttchan.org, 1 @@ -151038,15 +150999,18 @@ tubeview.ga, 1 tubexxxone.com, 1 tubing.cf, 1 +tublat.com, 1 tubs4fun.co.uk, 1 tubsof.fun, 1 tubul.net, 1 tubuscador.tk, 1 tucarora.tk, 1 tucarro.com, 1 +tucarro.com.co, 1 tucidi.net, 1 tuck2000.com, 1 tuckerman.com.au, 1 +tuckettlab.xyz, 1 tuckmeintebo.com, 1 tucny.com, 1 tucson.com, 1 @@ -151054,6 +151018,7 @@ tucsonpcrepair.com, 1 tucsonsewerscopes.com, 1 tucuatro.com, 1 +tucuxi.org, 1 tudatosantejmentesen.hu, 1 tudatosdori.hu, 1 tudinerito.tk, 1 @@ -151100,7 +151065,6 @@ tukan.fr, 1 tukan.hu, 1 tukangroup.com, 1 -tuketicihaklari.net, 1 tukiart.tk, 1 tukihenkilotyo.fi, 1 tula-city.tk, 1 @@ -151192,7 +151156,6 @@ tunneltracker.com, 1 tunnelventilation.pro, 1 tunnelwatch.com, 1 -tunneymunney.io, 1 tunningcars.tk, 1 tunochebuena.com, 1 tunombre.tk, 1 @@ -151210,6 +151173,7 @@ tuportaldelempleado.es, 1 tuppenceworth.ie, 1 tuppennysfireplace.com, 1 +tuppersexmadrid.com.es, 1 tupperwaresalamanca.com, 1 tupsicoayuda.com, 0 tupugoya.org, 1 @@ -151235,6 +151199,7 @@ turbo24.com, 1 turboconcept.com, 1 turbocore.com.br, 1 +turboda.com, 1 turbodata.no, 1 turbodata.org, 1 turbohitlerxxx.in, 1 @@ -151321,6 +151286,7 @@ turkup.ml, 1 turkuradyo.tk, 1 turkutitans.tk, 1 +turleo.me, 1 turlewicz.pl, 1 turlockca.gov, 1 turm-umzuege.de, 1 @@ -151352,6 +151318,7 @@ turquoise.health, 1 turquoisetassel.com, 1 turretlabs.io, 1 +tursiae.org, 1 turtle.ai, 0 turtleduckstudios.com, 1 turtlehead.tk, 1 @@ -151438,6 +151405,7 @@ tuvankinhdoanhonline.com, 1 tuvanmat.com, 1 tuwaner.com, 1 +tuwima48.pl, 1 tuxamca.com, 1 tuxcare.com, 1 tuxcloud.net, 1 @@ -151538,6 +151506,7 @@ tvoyaknighka.ga, 1 tvpes.cz, 1 tvpn.co.za, 1 +tvpocos.com.br, 1 tvquot.es, 1 tvregion.com, 1 tvrestyler.eu, 1 @@ -151624,7 +151593,6 @@ twinlakeswi.gov, 1 twinlimousine.com, 1 twinningstore.com, 1 -twinstore.com.ar, 1 twinstudiosparis.com, 1 twinztech.com, 1 twist.com, 1 @@ -151668,6 +151636,8 @@ twobitbusker.com, 1 twobridges.co.uk, 1 twobrothersbbq.com, 0 +twobrothersinn.com, 1 +twocantalk.ca, 1 twoconnect.com, 0 twocornertiming.com, 1 twodadsgames.com, 1 @@ -151709,7 +151679,6 @@ txguess.com, 1 txhb.gov, 1 txlocksmiththewoodlands.com, 1 -txlrs.org, 1 txokachat.cc, 1 txryan.com, 1 txsgmemorial.org, 1 @@ -151741,20 +151710,20 @@ ty935.com, 1 ty962.com, 0 ty965.com, 1 -ty980.com, 1 +ty980.com, 0 tyan.com, 1 tybox.ca, 1 tyc001.cc, 0 tyc009.cc, 1 tycaa.org, 1 -tycatering.com, 1 +tycho-station.net, 1 tycho.org, 1 tycho.tk, 1 tycom.at, 1 tycyc88.com, 1 -tydige.com, 1 tyentitaly.com, 1 tyger-mind.com, 1 +tygner.com, 1 tygochrum.se, 0 tygr.cz, 1 tyinnovations.com, 1 @@ -151768,6 +151737,7 @@ tylerharcourt.com, 1 tylerharcourt.net, 1 tylerharcourt.org, 1 +tylerkunz.net, 1 tylermn.gov, 1 tylerobrien.com, 1 tylerobrien.org, 1 @@ -151818,7 +151788,6 @@ typingcheck.ga, 1 typinglounge.com, 1 typist.tech, 1 -typo3.com, 1 typosphere.fr, 1 typr.com, 1 tyr0wl.com, 1 @@ -151831,6 +151800,7 @@ tyresales.com.au, 1 tyrkey.tk, 1 tyrocity.com, 1 +tyrolit-abrasivegrains.com, 1 tyronega.gov, 1 tyroola.co.id, 1 tyroola.co.nz, 1 @@ -151912,11 +151882,11 @@ u15p8.com, 1 u15x.com, 1 u29dc.com, 1 -u2b.eu, 1 u2co.de, 1 u2croatia.tk, 1 u2fanlife.com, 1 u2galicia.tk, 1 +u2hosting.net, 1 u2y.io, 1 u32i64.cf, 1 u36533.com, 1 @@ -151962,6 +151932,7 @@ uartpastelpaper.com, 1 uasaumur.com, 1 uash.tk, 1 +uasidekick.com, 1 uasmi.com, 1 uasonics.tk, 1 uat-mypfp.co.uk, 1 @@ -152056,6 +152027,7 @@ uchicagomedicine.org, 0 uchwytyozdobne.pl, 1 ucibt.com, 1 +ucinvest.com.au, 0 uck.i.ng, 1 uckg.org, 0 uclan.sk, 1 @@ -152104,7 +152076,6 @@ udiffy.ru, 1 udik.tk, 1 udinetoday.it, 1 -udiparfum.com.br, 1 udla.edu.ec, 1 udmarbella.tk, 1 udmurt-news.net, 1 @@ -152162,6 +152133,7 @@ ufos.tk, 1 ufplanets.com, 1 ufst.dk, 1 +ug.edu.ec, 1 ug.gg, 1 ugarte-zestoa.com, 1 ugbusiness.com, 1 @@ -152187,7 +152159,6 @@ ugsonline.tk, 1 uguragdas.com.tr, 1 ugurkorkmazyurek.com, 1 -ugurnakliyat.com.tr, 1 uguu.se, 1 ugx-mods.com, 1 ugy.es, 1 @@ -152334,7 +152305,7 @@ ulm-eurofox.fr, 1 ulmer-schneesport.de, 1 ulnesshealth.com, 1 -ulobby.eu, 1 +ulobby.eu, 0 ulog.ba, 1 uloztoasdilej.cz, 1 ulprospector.com, 1 @@ -152360,6 +152331,7 @@ ultimateconnector.com, 1 ultimatefilmpromotion.com, 0 ultimategaming.tk, 1 +ultimategift.nl, 1 ultimatehalo.tk, 1 ultimatelifesupport.ga, 1 ultimatemapping.tk, 1 @@ -152391,7 +152363,6 @@ ultrasbet.com, 1 ultrasite.tk, 1 ultrasocial.ml, 1 -ultrasoundblinds.co.uk, 1 ultrastar-es.org, 1 ultrasvargon.tk, 1 ultratechlp.com, 1 @@ -152443,6 +152414,7 @@ umenlisam.com, 1 umetro.ru, 1 umhcc.org.au, 1 +umindup.com, 1 umirt.com, 1 umisonoda.com, 1 umitribe.gov, 1 @@ -152768,13 +152740,11 @@ unis-pour-le-climat.com, 1 uniselectweb.com, 1 uniserve.com, 1 -unisg.ch, 1 unisight.com, 1 unisnu.ac.id, 1 unison-d.com, 1 unisonglobal.com, 1 unisontech.org, 1 -unisplendour.com, 1 unisul.br, 1 unit-linked.ru, 1 unit7jazz.org, 1 @@ -152806,7 +152776,7 @@ unitedstables.tk, 1 unitedstudents.tk, 1 unitedstudios.ru, 1 -unitedtechops.com, 1 +unitedtechops.com, 0 unitedtractors.com, 1 unitedvalve.com, 1 unitedweb.com, 1 @@ -152820,7 +152790,6 @@ unitencup.tk, 1 unither.com, 1 unitil.com, 1 -unitimed.com, 1 unitingwa.org.au, 0 unitir.gq, 1 unitizer.com, 1 @@ -152853,6 +152822,7 @@ universalbackground.com, 1 universalcircus.tk, 1 universalecology.tk, 1 +universalhouse.it, 1 universalmedia.tk, 1 universalmusic.nl, 1 universalmusic.pl, 1 @@ -152874,6 +152844,7 @@ universen.tk, 1 universeodon.com, 1 universereligion.com, 1 +universeventures.de, 1 universevision.com, 1 universidadperu.com, 1 universiteplatformu.com, 1 @@ -152956,6 +152927,7 @@ unminutomami.com, 1 unmo.com, 1 unmoneye.com, 1 +unmul.ac.id, 1 unnamed.games, 1 unnamed.tk, 1 unnas.ca, 1 @@ -153014,7 +152986,6 @@ unser-gartenbauverein.de, 1 unser-gartenforum.de, 1 unsigcrazy.art, 1 -unsiteweb.fr, 1 unsourirealecole.fr, 1 unstable.systems, 1 unstablewormhole.ltd, 1 @@ -153105,6 +153076,7 @@ updata.com, 1 update-linthdcp-567app1.com, 1 updatecli.io, 1 +updatedrecipes.com, 1 updating.social, 1 updefense.io, 1 updoze.com, 1 @@ -153204,7 +153176,6 @@ upressonline.com, 1 uprh.edu, 1 uprighttrades.com, 1 -uprint.it, 1 uprisehigh.com, 1 uprizenow.com, 1 uprooting.co.uk, 1 @@ -153213,12 +153184,12 @@ upsettunnel.com, 1 upshurda.com, 1 upsidelearning.com, 1 +upsilonsigmaphi.us, 1 upskill.cl, 1 upskilllearning.ml, 1 upskirtmania.tk, 1 upsocial.ga, 1 upsocial.pp.ua, 1 -upsook.com, 1 upstaff.com, 1 upstairs.one, 1 upstart.com, 1 @@ -153307,7 +153278,6 @@ urbanhub.lt, 1 urbanietz-immobilien.de, 1 urbanindustriecoiffure-auray.fr, 1 -urbanism.xyz, 1 urbanized.tk, 1 urbanizedrecords.tk, 1 urbankurator.com, 1 @@ -153363,6 +153333,7 @@ urgentcaresouthaven.com, 1 urgrafix.com, 1 urikon.ch, 1 +urinow.com, 1 urion.com.br, 1 uriport.com, 1 uriports.com, 1 @@ -153391,7 +153362,6 @@ urljournal.tk, 1 urlparse.com, 1 urlr.me, 1 -urlrating.com, 1 urlrewriting.net, 1 urlscan.io, 1 urlsimple.tk, 1 @@ -153485,7 +153455,6 @@ usapel.com.br, 1 usaprimecredit.org, 1 usapublicrecords.com, 1 -usascripthelpers.com, 1 usaseanconnect.gov, 1 usastaffing.gov, 1 usatales.com, 0 @@ -153519,7 +153488,6 @@ usdrugtestcenters.com, 1 usds.gov, 1 usdstandard.com, 1 -use.be, 1 use1.net, 1 usebosin.gq, 1 usebubbles.com, 1 @@ -153574,7 +153542,6 @@ usintimate.com.br, 1 usishield.com, 1 usius.com, 1 -usjobmarket24.com, 1 usjt.br, 1 usk-clan.tk, 1 uskaonline.tk, 1 @@ -153605,6 +153572,7 @@ usoog.com, 1 usoptical.com, 1 uspaacc.com, 1 +usparceldelivery.com, 1 usparklodging.com, 1 uspasecurity.com, 1 uspeh62.tk, 1 @@ -153616,6 +153584,7 @@ uspon.tk, 1 usportsgo.com, 1 uspory.cz, 1 +uspower.us, 1 uspsblog.com, 0 uspsoig.gov, 1 uspsolutions.at, 1 @@ -153632,7 +153601,7 @@ ust-idnummer.to, 1 ust.space, 1 ustabor.uz, 1 -ustaflorida.com, 1 +ustaflorida.com, 0 ustaywell.com, 1 ustc.fun, 1 ustc.run, 1 @@ -153660,6 +153629,7 @@ utafutbol.tk, 1 utagawavtt.com, 1 utageno.jp, 1 +utahattorneys.com, 1 utahblackplate.com, 1 utahblackplates.com, 1 utahcanyons.org, 1 @@ -153745,7 +153715,6 @@ uu9297.co, 1 uu9728.co, 1 uubb.top, 1 -uubilng.com, 0 uuin.top, 1 uuit.nl, 1 uuksu.fi, 1 @@ -153944,6 +153913,7 @@ vaclavambroz.eu, 1 vacorps.com, 1 vacpackmedical.net, 1 +vacsafe.cc, 1 vacu.store, 1 vacuna.gov, 1 vacunas.gov, 1 @@ -154016,6 +153986,7 @@ valariejenkins.com, 1 valasskyregion.cz, 1 valberg.com, 1 +valblanche.com, 1 valbon.pl, 1 valbruna.com.tr, 1 valcano-krd.ru, 1 @@ -154048,7 +154019,7 @@ valentin-weibel.com, 1 valentin.app, 1 valentinarosamilia.com, 1 -valentinberclaz.com, 0 +valentinberclaz.com, 1 valentinemom.cf, 1 valentinemom.ga, 1 valentinemom.gq, 1 @@ -154067,7 +154038,6 @@ valeriansaliou.name, 1 valeriapanarina.com, 0 valerieadolff.com, 0 -valerieorsoni.com, 1 valeriya.life, 1 valeriymaleev.com, 1 valeryvenom.net, 1 @@ -154097,7 +154067,6 @@ valigrama.ro, 1 valimail.com, 1 valimised.ee, 0 -valinor.onl, 1 valionhealth.com.au, 1 valisevoyage.fr, 0 valitsus.ee, 0 @@ -154192,6 +154161,7 @@ values.com, 1 valueseed.net, 1 valuetree.in, 1 +valuewayllc.com, 1 valunet.co.za, 1 valuoo-legal.com, 1 valuskills.co.za, 1 @@ -154378,6 +154348,7 @@ vapify.pl, 1 vaplantatlas.org, 1 vapocial.com, 1 +vapogang.cz, 1 vapolik.fr, 1 vapoo.de, 1 vapor.cloud, 0 @@ -154417,8 +154388,6 @@ varlin.tk, 1 varney.tk, 1 varnish.ga, 1 -varoscak.de, 1 -varshathacker.com, 1 varun-rajeshwari.tk, 1 varunagw.com, 1 varvitra20mg.ga, 1 @@ -154463,7 +154432,6 @@ vasilisa-volodina.ga, 1 vasilisa-volodina.gq, 1 vasilisa-volodina.ml, 1 -vasiliska.com.ua, 1 vaskulitis-info.de, 1 vassalengine.org, 1 vassourassaojoao.com.br, 1 @@ -154491,6 +154459,7 @@ vats.im, 1 vauban-ip.com, 1 vauceri.hr, 1 +vaughanchiropractic.com, 1 vaughanrisher.com, 1 vaulavalpola.tk, 1 vault-am.lu, 1 @@ -154676,7 +154645,6 @@ veganism.com, 1 veganismo.tk, 1 veganitos.tk, 1 -veganku.id, 1 veganmainstream.com, 1 veganplace.it, 1 veganrecipereviews.com, 1 @@ -154871,7 +154839,6 @@ veniceinsiderguide.com, 1 veniceoarsman.com, 1 venicerealdeal.com, 1 -venida.com, 1 venlafaxine.gq, 1 venndor.eu, 1 venndordiagram.com, 1 @@ -154934,6 +154901,7 @@ vepein.ga, 1 vepein.gq, 1 veply.com, 1 +ver-me.com, 1 ver.ma, 0 ver.re, 1 vera-1.ru, 1 @@ -154975,7 +154943,6 @@ vercel.org, 1 vercel.sh, 1 vercountyil.gov, 1 -verdantis.com, 1 verdantnature.com, 1 verdensflag.dk, 1 verdeplus.net, 1 @@ -155010,15 +154977,15 @@ verhave.net, 1 verhoog.xyz, 1 veri2.com, 1 -veriage.io, 1 verif-docs.com, 1 verifalia.com, 1 +verificajudicial.com, 1 verificationguild.com, 1 verificationlink.ga, 1 verified.lu, 1 verifiedchat.co, 1 verifiedcliq.com, 1 -verifiedfirst.com, 1 +verifiedfirst.com, 0 verifiedhandles.org, 1 verifiedjoseph.com, 0 verifiedsol.com, 1 @@ -155061,7 +155028,6 @@ veritextreporting.com, 1 veritxt.ca, 1 veritxt.com, 1 -verix.com, 1 verizonconnect.com, 0 verkada.com, 1 verkami.com, 1 @@ -155090,7 +155056,6 @@ vermageringsdieetpillen.tk, 1 vermellcollection.com, 1 vermilionsheriff.gov, 1 -vermilonce.net, 1 vermogeninkaart.nl, 1 vermont.builders, 1 vermontvilletownshipmi.gov, 1 @@ -155131,7 +155096,7 @@ versatilestructures.com.au, 1 versbesteld.nl, 1 verschil.info, 1 -verschoren.com, 0 +verschoren.com, 1 verschurendegroot.nl, 1 verse.eu.org, 1 versfin.net, 1 @@ -155173,12 +155138,13 @@ verticalmindventures.com, 1 verticals.tk, 1 verticalstructure.com, 1 +verticalvoyages.com, 1 verticecloud.com, 1 verticeonline.com, 1 vertichost.com, 1 vertichost.ro, 1 vertigo.name, 0 -vertigomassage.com, 1 +vertigomassage.com, 0 vertikal.tk, 1 vertinext.com, 1 vertispro.com, 1 @@ -155219,6 +155185,7 @@ verzekerdbijhema.nl, 1 verzekeringsacties.nl, 1 verzekerjebeter.nl, 1 +verzo.com.br, 1 vesaviljanen.fi, 1 vescudero.net, 1 veselka.tk, 1 @@ -155229,6 +155196,7 @@ veski.hr, 0 vesmail.biz, 1 vesmail.email, 1 +vesmirmy.cz, 1 vesna2011.tk, 1 vespacascadia.com, 1 vespe.it, 1 @@ -155358,10 +155326,10 @@ vgorcum.com, 1 vgoru.org, 1 vgpu.vladimir.ru, 1 +vgrd-fleet-kunden.de, 1 vgropp.de, 1 vgyse.hu, 1 vgywm.com, 1 -vheda.com, 1 vhelio.org, 1 vhg.org, 1 vhiweb.com, 1 @@ -155385,7 +155353,6 @@ viaenginfeed.com, 1 viaeth.io, 1 viafoura.com, 1 -viaggioincoppia.com, 1 viagra-siparis.com, 1 viagra911.com.ua, 1 viagramarketim.com, 1 @@ -155417,6 +155384,7 @@ vibecodescaler.com, 1 vibehire.co.uk, 1 vibeonline.tk, 1 +vibesstudiobd.com, 1 vibgyyor.com, 1 vibioh.fr, 1 vibraagenciadigital.com.br, 1 @@ -155493,7 +155461,6 @@ victoriait.com.au, 1 victoriamn.gov, 1 victorianosaez.tk, 1 -victoriapremiumauto.com, 1 victoriareporting.com, 1 victoriareporting.net, 1 victoriastudio.ru, 1 @@ -155556,7 +155523,6 @@ videoconverter.com, 1 videoebook.tk, 1 videoenglish.net, 1 -videogamer.com, 1 videogamerreader.tk, 1 videogamers.com.ar, 1 videogamesartwork.com, 1 @@ -155679,6 +155645,7 @@ viespirkiai.top, 1 vietconghackz.tk, 1 vietdungit.vn, 0 +vietecotex.com, 0 vietfes.asia, 1 vietforum.ml, 1 vietnam-fishing.com, 1 @@ -155686,6 +155653,7 @@ vietnam-melbet.mobi, 1 vietnam-tours.tk, 1 vietnameselove.com, 1 +vietnamhairs.com, 1 vietnamhost.vn, 0 vietnammonpaysnatal.fr, 1 vietnamphotoblog.com, 0 @@ -155716,7 +155684,7 @@ vifsoft.com, 1 viggio.com.br, 0 vigiaviesaitaly.com, 1 -vigil.com, 1 +vigil.com, 0 vigilance.ca, 1 vigilanciaysalud.com, 1 vigilantesporcolombia.org, 1 @@ -155829,7 +155797,6 @@ villa-olivari.it, 1 villa-ottone.net, 1 villa-toscana.berlin, 1 -villaandmansionarchitects.com, 1 villablancaluarca.es, 1 villablino.tk, 1 villaboavida.nl, 1 @@ -155944,6 +155911,7 @@ villawirz.it, 1 ville-gennevilliers.fr, 1 ville-ideale.fr, 1 +ville-mayenne.fr, 1 ville-nesle.fr, 1 ville-rognes.fr, 1 ville-saintemarguerite.fr, 1 @@ -156045,7 +156013,6 @@ vingt.me, 1 vingtsuncoach.tk, 1 vingugaas.ee, 0 -vinhomes.tv, 1 vinicius.sl, 1 viniciuscosta.tk, 1 vinigas.com, 1 @@ -156055,7 +156022,6 @@ vinistas.com, 1 vinit.tk, 1 vinnellarabia.com, 1 -vinner.com.au, 0 vinnie.gq, 1 vinnitsa-news.ru, 1 vinny.tk, 1 @@ -156174,12 +156140,10 @@ viralinsurance.ga, 1 viraljobs.ga, 1 viraloffer.ga, 1 -viralpagi.com, 1 viralsv.com, 1 viraltech.cf, 1 viralted.ml, 1 viraltobuzz.tk, 1 -viraltui.com, 1 viralvids.gq, 1 viraly.me, 1 viralytydne.cz, 1 @@ -156309,12 +156273,12 @@ visaynou.com, 1 visceralsound.ca, 1 viscondedemaua.com.br, 1 -viscountwines.com, 1 visdetech.com, 1 vise.com, 0 visecoach.com, 1 visegradieskuvo.hu, 1 visegradtours.hu, 1 +viseomail.fr, 1 viseum.co.uk, 1 visforvaccinated.gov, 1 vishenka.tk, 1 @@ -156363,7 +156327,6 @@ visionzeroreporting.com, 1 visiquate.com, 1 visit-chiyoda.tokyo, 1 -visit-haifa.org, 1 visit-ro.com, 1 visit-sanbenedettodeltronto.it, 1 visit-thailand.tk, 1 @@ -156488,6 +156451,7 @@ vitallispsy.de, 1 vitallispsy.eu, 1 vitallispsy.nl, 1 +vitalmobility.ca, 1 vitalpartnerships.com, 1 vitalpraxis-lietz.de, 1 vitalshop.tk, 1 @@ -156744,6 +156708,7 @@ vladimirkarpets.tk, 1 vladimirovka.ml, 1 vladimirpenev.tk, 1 +vladimirpetrosyan.net, 1 vladionescu.eu, 1 vladionescu.me, 1 vladivostok-city.tk, 1 @@ -156771,7 +156736,6 @@ vleesbesteld.nl, 1 vleij.com, 0 vleij.family, 1 -vleij.se, 1 vleo.me, 1 vlfcu.org, 1 vlh.dk, 1 @@ -156783,6 +156747,7 @@ vloeck.de, 1 vloggerfaire.com, 1 vloggerspace.tk, 1 +vlogmusic.io, 1 vlos.com.pl, 1 vlovgr.se, 1 vltx.gr, 1 @@ -156807,10 +156772,10 @@ vmninja.io, 1 vmoagents.com, 0 vmock.com, 1 -vmoe.info, 1 vmpf.nl, 1 vmsengineering.com, 1 vmst.io, 1 +vmsunergy.com, 1 vmsurgery.org, 1 vmttitlesearch.com, 1 vmug.pl, 1 @@ -156921,7 +156886,7 @@ vogue.ph, 1 voguefabricsstore.com, 1 voguefrontier.tk, 1 -voi.ch, 1 +voi.ch, 0 voi.com, 1 voice-of-design.com, 1 voice-pic.com, 1 @@ -157069,22 +157034,66 @@ volshebniki.ua, 1 volstatebank.com, 1 volt.fm, 1 +volt.link, 1 volt.social, 1 +volt.team, 1 volta.io, 1 voltacircuit.com, 1 voltageelectricity.tk, 1 voltagevb.com, 1 voltainsite.com, 1 +voltalbania.org, 1 voltarengelprice.tk, 1 voltarengeneric.tk, 1 +voltbelgie.org, 1 +voltbelgien.org, 1 +voltbelgique.org, 1 +voltbelgium.org, 1 +voltcesko.org, 1 voltcloud.net, 1 +voltcyprus.org, 1 +voltdanmark.org, 1 +voltdeutschland.org, 1 voltebyk.com, 1 voltebyk.in, 1 +volteesti.org, 1 +voltespana.org, 1 +voltespanya.org, 1 +volteuropa.org, 1 voltfloyd.com, 1 +voltgreece.org, 1 +volthrvatska.org, 1 +volthungary.org, 1 voltiac.ml, 1 +voltireland.org, 1 voltiumlab.es, 1 +voltkosova.org, 1 +voltkosovo.org, 1 +voltletzebuerg.org, 1 +voltluxembourg.org, 1 +voltluxemburg.org, 1 +voltmagyarorszag.org, 1 +voltmalta.org, 1 voltnederland.org, 1 +voltnorway.org, 1 volto.io, 1 +voltoesterreich.org, 1 +voltpoland.org, 1 +voltpolska.org, 1 +voltportugal.org, 1 +voltromania.org, 1 +voltschweiz.org, 1 +voltshqiperi.org, 1 +voltslovakia.org, 1 +voltslovenia.org, 1 +voltslovenija.org, 1 +voltslovensko.org, 1 +voltsuisse.org, 1 +voltsverige.org, 1 +voltsvizzera.org, 1 +voltswitzerland.org, 1 +voltuk.org, 1 +voltukraine.org, 1 volubilisplus.fr, 1 volunka.ml, 1 volunteerham.com, 1 @@ -157099,6 +157108,7 @@ volusiavotes.gov, 1 volvo-klub.cz, 1 volvo1800es.tk, 1 +volvoconnect.com, 1 volvoklub.cz, 1 volyn-news.ru, 1 vomitoxin.ga, 1 @@ -157493,7 +157503,6 @@ vreemdetante.com, 1 vreemdetante.eu, 1 vreemdetante.nl, 1 -vreestyle.de, 1 vreklame.ml, 1 vremyachko.tk, 1 vremyapervyih-hd.tk, 1 @@ -157632,10 +157641,11 @@ vsevolod.tk, 1 vsgcommunity.nl, 1 vsgsilenus.nl, 1 -vshipit.com, 1 +vshipit.com, 0 vshop.ir, 1 vsl-defi.ch, 0 vsl.de, 1 +vsmsk.ru, 1 vsnfoto.com, 1 vsoflavors.com, 1 vsource-rsdv.azurewebsites.net, 1 @@ -157665,6 +157675,7 @@ vtech.com, 1 vtechda.com, 1 vtechhealthcare.com, 1 +vtechsolution.com, 1 vtescebu.com, 1 vtexpayments.com.br, 1 vtipe-vylez.cz, 0 @@ -157829,6 +157840,7 @@ vytvorsipotisk.cz, 1 vytvorsitricko.cz, 1 vyzner.cz, 1 +vyzrd.com, 1 vzducho-klima.cz, 1 vzemiseo.com, 1 vzr-garant.nl, 1 @@ -157847,6 +157859,7 @@ w-architectes.com, 1 w-graj.net, 1 w-hub.ru, 1 +w-o-o.nl, 1 w-oasis.co.jp, 1 w-p-k.de, 1 w-permission.com, 1 @@ -157941,7 +157954,6 @@ waays.fr, 1 waayz.eu, 1 waayz.fr, 1 -wabbel.sa.com, 1 wabco-auto.com, 1 wabifoggynuts.com, 1 wabtec.com, 0 @@ -157980,6 +157992,7 @@ wafflehacks.org, 1 waffleindex.com, 1 wafflemakers.ca, 1 +wafreight.com, 1 wage-feeg.gc.ca, 1 wagener-gmbh.com, 1 wagesweldandfab.com, 1 @@ -157995,7 +158008,6 @@ wagyudelicatessen.com, 1 waha-market.top, 1 wahana.cloud, 1 -wahana.top, 1 wahana.web.id, 1 wahay.org, 1 wahine.gq, 1 @@ -158003,6 +158015,7 @@ wahlcco.com, 1 wahminda.tk, 1 wahoo-ashland-waverly.com, 1 +wahrerweinstock.at, 1 wahrnehmungswelt.de, 1 wahrnehmungswelten.de, 1 wai-in.com, 1 @@ -158152,7 +158165,6 @@ walnutvalleywater.gov, 1 walpu.ski, 1 walpuski.com, 1 -walruscode.com, 1 walrusntiny.com, 1 walsermedia.com, 1 walset.eu, 1 @@ -158194,6 +158206,7 @@ wander.al, 1 wander.tk, 1 wanderaura.com, 1 +wanderclub.eu, 1 wanderersfc.tk, 1 wanderfost.com, 1 wanderfullcoven.tk, 1 @@ -158324,7 +158337,6 @@ warfighters.de, 1 wargov.tk, 1 wargun.ml, 1 -wargxp.com, 1 warhaggis.com, 1 warhistoryonline.com, 0 warid.ga, 1 @@ -158368,6 +158380,7 @@ warringtonkidsbouncycastles.co.uk, 1 warringtonsownbuses.co.uk, 1 warriorofmars.com, 1 +warrnamboolaero.club, 1 warrock-es.tk, 1 warrs.com, 1 wars.aw, 1 @@ -158418,7 +158431,6 @@ washcowi.gov, 1 washcowisco.gov, 1 washdata.org, 1 -washerrepairaustin.com, 1 washifyapi.com, 1 washifyapp.com, 1 washifytest.com, 1 @@ -158444,7 +158456,6 @@ washoecounty.gov, 1 washroomcubicles.co.uk, 1 washtenaw.gov, 1 -washub.org.uk, 1 washup.tk, 1 wasilewskicourtreporting.com, 1 wasilewskicourtreporting.info, 1 @@ -158533,7 +158544,6 @@ waterhouse.tk, 1 waterjet.com.ru, 1 waterjets.jp, 1 -waterjetsale.com, 1 waterlanders.tk, 1 waterlandsarchief.nl, 1 waterlandtuinen.be, 1 @@ -158585,7 +158595,6 @@ watismijnbandenspanning.nl, 1 watmar.com.au, 1 watnongpangtru.com, 1 -watobi.jp, 1 watongaok.gov, 1 watoo.tech, 1 watrd.com, 1 @@ -158623,7 +158632,6 @@ waverlypa.gov, 1 waverlytn.gov, 1 wavesite.tk, 1 -wavycat.ru, 1 waw-werbeagentur.de, 1 wawak.pl, 1 wawapuquy.com, 1 @@ -158766,7 +158774,6 @@ wdmpa.org, 1 wdnmd.org, 1 wdntcr.com, 1 -wdo.org, 1 wdodelta.nl, 0 wdol.gov, 1 wdophoto.com, 1 @@ -158796,7 +158803,6 @@ wealthprojector.com, 1 wealthprojector.com.au, 1 wealthsimple.com, 1 -wealthwatchglobal.com, 1 wealthx.com, 1 wear-largesizes.tk, 1 wear-referrals.co.uk, 1 @@ -158830,7 +158836,6 @@ wearesilverbullet.com, 1 wearesolomon.com, 1 wearesuma.com, 1 -wearethecultureclub.co.uk, 1 wearetravellers.nl, 1 wearetuzag.com, 1 wearewithyou.org, 1 @@ -158851,7 +158856,6 @@ weathermelon.io, 1 weathernet.co.uk, 1 weatherproduct.ga, 1 -weatherstylist.co.uk, 1 weavabel.com, 0 weaveral.gov, 1 weavers.space, 1 @@ -158942,6 +158946,7 @@ webadicto.net, 1 webadish.co.uk, 1 webadmit.org, 1 +webadvisorhub.com, 1 webagenturschmid.ch, 1 webaholic.co.in, 1 webal.co.uk, 1 @@ -159165,6 +159170,7 @@ weblate.com, 1 weblate.cz, 1 weblate.org, 1 +weblax.fr, 1 weblead.vip, 1 weblegion.tk, 1 weblian.ml, 1 @@ -159182,7 +159188,6 @@ webm.tf, 1 webmachine.co.za, 1 webmad.me, 1 -webmagnetism.com, 1 webmail.ee, 1 webmail.gigahost.dk, 0 webmail.info, 1 @@ -159236,7 +159241,6 @@ webperformance.io, 1 webpiar.tk, 1 webpitarque.tk, 1 -webpixelia.com, 1 webpkgcache.com, 1 webplace4u.nl, 0 webportail.tk, 1 @@ -159285,13 +159289,13 @@ webserverindia.com, 0 webshipper.com, 1 webshop.nl, 1 +webshovel.net, 1 website-engineering.co.za, 1 website-prototyp.de, 1 website-traffic.shop, 1 website.builders, 1 website999.in, 1 websiteadvisor.co.uk, 1 -websitebakers.eu, 1 websiteboost.nl, 1 websitecalifornia.cf, 1 websitecenter.tk, 1 @@ -159377,10 +159381,8 @@ webtrend.ch, 1 webtrh.cz, 1 webtronic.ie, 1 -webtronusa.net, 1 webtropia.com, 0 webuildsite.ga, 1 -webullreview.co, 1 webuniverse.ml, 1 webunix.ga, 1 webuyloansfast.com, 1 @@ -159484,11 +159486,11 @@ weekendinitaly.com, 1 weekendplayers.tk, 1 weekendstartup.ml, 1 -weekendtradingco.com, 1 weekly-app.com, 0 weekly-news.pl, 1 weekly-residence.com, 1 weeklydcoupgen.com, 1 +weelam.ca, 1 weelzbahamas.com, 1 weemakers.fr, 0 weepycat.com, 1 @@ -159550,6 +159552,7 @@ weiltoast.de, 1 weimaranerdogcare.com, 1 weimaranerpedigrees.com, 1 +weimark.com, 1 weimeicleaning.com, 0 weiming.ddns.net, 1 weimingsci.cn, 1 @@ -159580,6 +159583,7 @@ weis.bz, 1 weis.duckdns.org, 1 weispfenning.net, 1 +weiss-sophrologie.fr, 1 weisskircher.tk, 1 weissman.agency, 1 weisstech.com, 1 @@ -159617,7 +159621,6 @@ wella-download-center.de, 1 wellbalancedhealth.ie, 1 wellbe.co, 1 -wellbe.com, 0 wellbeing360.com.au, 1 wellbutrinxlgeneric.cf, 1 wellcarehealthsurvey.com, 1 @@ -159644,6 +159647,7 @@ wellness-spa-suedtirol.com, 1 wellnessandco.com.au, 1 wellnesscheck.net, 1 +wellnesscoaches.org, 1 wellnesscreatives.com, 1 wellnessmassage-eitorf.de, 1 wellnesstravelhub.com, 1 @@ -159666,6 +159670,7 @@ weloveliving.it, 1 welovelowcarb.co.za, 1 welovemail.com, 1 +welovestage.com, 1 welovestrawberries.com, 1 welpen-rucphen.tk, 1 welpo.me, 1 @@ -159762,7 +159767,6 @@ werhatunsverraten.eu, 1 werk32.net, 1 werkannwas.org, 1 -werkcentrumgroningennoorddrenthe.nl, 1 werken-bij-inwork.nl, 1 werken-in-de-techniek.nl, 1 werkenbijbakkerbedrijfswagens.nl, 1 @@ -159781,7 +159785,6 @@ werkenbijrexel.nl, 1 werkenbijsanitairwinkel.be, 1 werkenbijsanitairwinkel.nl, 1 -werkenbijsherpa.nl, 0 werkenbijvanderventions.com, 1 werkenbijvanderventions.nl, 1 werkeninwesterveld.nl, 1 @@ -159814,6 +159817,7 @@ wesecom.com, 1 weserv.nl, 1 weservice.pro, 1 +weserwebworks.de, 1 weshopy.com, 1 wesl.cc, 1 wesleyanbank.co.uk, 1 @@ -159853,7 +159857,6 @@ westcentralmls.com, 1 westchester-il.gov, 1 westchesteranxietytreatment.com, 1 -westchesterwine.com, 1 westcoastaggregate.com, 1 westcoastcastles.com, 1 westcoastdrones.net, 1 @@ -159881,6 +159884,7 @@ westernskydental.com, 0 westernsydney.com.au, 1 westernwaterca.gov, 1 +westerwald-esport.de, 1 westexec.com, 1 westfairleevt.gov, 1 westfieldpensions.com, 1 @@ -159980,6 +159984,7 @@ wetu.com, 1 wetumpkaal.gov, 1 wevah.com, 0 +wevape.online, 1 weviral.org, 1 wevolver.com, 0 wew881.com, 1 @@ -160011,6 +160016,7 @@ wfgukasha.club, 1 wfh.ovh, 1 wfh.se, 1 +wfigueiredo.com.br, 1 wforum.nl, 1 wfuogb.com, 1 wfxs.com.tw, 1 @@ -160020,6 +160026,7 @@ wgal.com, 1 wgauthier.com, 1 wgauthier.net, 1 +wgauthier.one, 1 wgcaobgyn.com, 1 wgdp.gov, 1 wge-feg.gc.ca, 1 @@ -160037,7 +160044,6 @@ wgrfoods.co.uk, 0 wgrlc.vic.gov.au, 1 wgrstudio.com, 1 -wgs.co.id, 1 wgsh.de, 1 wgsuyi.cf, 1 wgtrm.com, 1 @@ -160115,13 +160121,13 @@ whattimedoiwork.com, 1 whatusb.com, 1 whatwaytoday.com, 1 -whatwebcando.today, 1 whatwedo.ch, 1 whatwg.org, 1 whatzelink.com, 1 whawtheme.fr, 1 whd-guide.de, 1 whdpc.gov, 1 +whe-eg.com, 1 wheatfieldtwpmi.gov, 1 wheatgra.in, 1 wheatland.com, 1 @@ -160196,6 +160202,7 @@ whiskeytech.org, 1 whisky.com.my, 1 whisky.money, 1 +whisky.my, 1 whiskydb.de, 1 whiskydrivers.tk, 1 whiskymy.com, 1 @@ -160220,7 +160227,6 @@ whitdoit.tk, 1 white-articles.site, 1 white-hell.tk, 1 -white-ibiza.com, 1 white-info.tk, 1 white-noise.tk, 1 white-rabbit.tk, 1 @@ -160229,7 +160235,6 @@ whitealps.at, 0 whitealps.be, 0 whitealps.ch, 0 -whitealps.de, 0 whitealps.fr, 0 whitealps.net, 0 whiteantelopeinteriors.com, 1 @@ -160373,7 +160378,6 @@ whosneo.com, 1 whosoldmyemail.ca, 1 whosoldmyemail.com, 1 -whosts.cn, 1 whosyourdaddy.ml, 1 whowherewhen.net, 1 whpctx.com, 1 @@ -160418,7 +160422,6 @@ wiccansupplies.ga, 1 wiccasima.fr, 1 wiche.edu, 1 -wichitafoundationpros.com, 1 wichm.de, 1 wichtel-lager.de, 1 wichtel-umzuege.de, 1 @@ -160503,7 +160506,6 @@ wigmore-hall.org.uk, 0 wigsalon.ga, 1 wigwam.design, 1 -wihainvitation.com, 1 wihiki.org, 1 wiiaam.com, 1 wiidatabase.de, 1 @@ -160532,6 +160534,7 @@ wiki-play.ru, 1 wiki.berlin, 1 wiki.gallery, 1 +wiki.gg, 1 wiki.python.org, 1 wiki.voyage, 1 wiki24.ru, 1 @@ -160714,6 +160717,8 @@ wildfireseomarketing.com, 1 wildflowers5.com, 1 wildfoerster.org, 1 +wildfortune8.io, 1 +wildglass.nl, 1 wildhealth.lu, 1 wildheavenbeer.com, 1 wildhorsesaloon.com, 1 @@ -160730,7 +160735,6 @@ wildsafety.com, 1 wildschuetz-gmbh.de, 1 wildsense.tk, 1 -wildstrait.com, 1 wildstrait.nz, 1 wildtrip.blog, 0 wildvicky.net, 1 @@ -160822,6 +160826,7 @@ willowchild.de, 1 willowcundy.com, 1 willowdalechurch.ca, 1 +willowink.com.au, 1 willowparktx.gov, 1 willowpassdentalcare.com, 1 willowpf.com, 1 @@ -160914,12 +160919,12 @@ windhamct.gov, 1 windhamvillageoh.gov, 1 windice1.io, 1 -windictus.net, 1 windirect.tk, 1 windjetboats.com, 1 windmillart.net, 1 windmusic.org, 1 windota.com, 1 +windowbuilderpro.com, 1 windowcleaningexperts.net, 1 windows, 1 windows11.com.br, 1 @@ -160960,7 +160965,6 @@ wine-route.net, 1 wine.com.my, 1 wine.my, 1 -wineandcheeseplace.com, 1 winebrasil.com.br, 1 winechapter.be, 1 winedineunwind.org, 1 @@ -160974,8 +160978,6 @@ wineparis.com, 1 winerytoursanfrancisco.com, 1 winetable.se, 1 -winewisegreenwich.com, 1 -wineworksonline.com, 1 winfieldchen.me, 1 winfieldpa.gov, 1 winfieldtownshipmi.gov, 1 @@ -160987,6 +160989,7 @@ wing-tsun.tk, 1 wingchun.edu.au, 1 wingchunboxtribe.com, 1 +wingie.com, 1 wingify.com, 1 wingmin.net, 1 wingover.su, 1 @@ -161049,7 +161052,6 @@ winter.ae, 1 winterarbitrationcenter.com, 1 winterbergwebcams.com, 1 -winterco.org, 1 wintercorn.com, 1 winterdetective.ga, 1 winterfeldt.de, 0 @@ -161082,7 +161084,6 @@ wipers-nz.co.nz, 1 wiphcai.ca, 1 wipp.bayern, 1 -wippie.se, 1 wippler.at, 1 wippy.tk, 1 wiproccs.com, 1 @@ -161111,6 +161112,7 @@ wirelesslogic.com, 0 wirelesslogicnordic.com, 1 wirelessthief.ga, 1 +wires.co.uk, 1 wireshark.org, 1 wireshocks.com, 1 wiretap.cf, 1 @@ -161157,7 +161159,6 @@ wisdomise.com, 1 wisdomise.io, 1 wisdomize.me, 1 -wisdomofhealthylife.com, 1 wisdomteethonly.com, 1 wisdomteethsydney.com.au, 1 wisdotplans.gov, 1 @@ -161177,12 +161178,14 @@ wisers.com.tw, 1 wisersp.com, 1 wisertp.com, 1 +wisetechglobal.cn, 1 wisetechglobal.com, 1 wisetoken.net, 1 wiseup.com, 1 wiseupcorp.com, 1 wiseuplive.com.br, 1 wisewaynutrition.com, 1 +wish2025.com, 1 wishedu.com, 1 wishing3.com, 1 wishingyou.co.uk, 1 @@ -161271,6 +161274,7 @@ wivcfinancialservices.com, 1 wivoc.nl, 1 wiwi.nl, 1 +wiwn.pl, 1 wixadvertising.com, 1 wixboo.com.gt, 1 wixel.tk, 1 @@ -161314,6 +161318,7 @@ wkho.io, 1 wkitu-test.tk, 1 wko.at, 1 +wkoecg.at, 0 wkola.tk, 1 wkshp.link, 1 wkuherald.com, 1 @@ -161457,6 +161462,7 @@ wokfilms.pt, 1 wokinghammotorhomes.com, 1 wokkamokka.be, 1 +wolczanska13.pl, 1 wolf-haven.tk, 1 wolf-hunter.pl, 1 wolf333.com, 1 @@ -161472,7 +161478,7 @@ wolfeye.de, 1 wolfflabs.com, 1 wolffolins.com, 1 -wolffproperties.com, 1 +wolffproperties.com, 0 wolfgang-kerschbaumer.at, 1 wolfgang-kerschbaumer.com, 1 wolfgang-kerschbaumer.net, 1 @@ -161643,6 +161649,7 @@ woodvillemspolice.gov, 1 woodward-vets.co.uk, 1 woodwicker.cl, 1 +woodwing.cloud, 1 woodwo.se, 1 woodworkcare.com, 1 woodworkingforabeginner.com, 1 @@ -161678,6 +161685,7 @@ woorkup.com, 1 woorocket.com, 1 woosk.de, 1 +wootality.com, 1 woothemesplugins.net, 1 wootkit.tk, 1 wootware.co.za, 1 @@ -161704,6 +161712,7 @@ wordnietvindbaar.nl, 1 wordops.io, 1 wordops.net, 1 +wordotron.com, 1 wordpress-crm-plugin.com, 1 wordpress-crm.pl, 1 wordpress-inc.ru, 1 @@ -161782,6 +161791,7 @@ workingreporter.com, 1 workingtalent.nl, 1 workinit.com.au, 1 +workinitiatives.com.au, 1 workinnorway.no, 1 workiva.com, 1 workjustice.com.au, 0 @@ -161797,6 +161807,7 @@ workonit.cf, 1 workoutdigital.com, 1 workpass.co.uk, 1 +workperfect.com.au, 1 workplace.com, 1 workplace.tools, 1 workreap.tk, 1 @@ -162092,7 +162103,6 @@ wpcastle.com, 1 wpcc.edu, 1 wpcepat.com, 0 -wpcheck.io, 1 wpckraft.ro, 1 wpco.se, 1 wpcodeus.com, 1 @@ -162175,7 +162185,6 @@ wpuse.ru, 1 wpwebshop.com, 1 wpwebtools.com, 1 -wq.ro, 1 wqaw3.tk, 1 wqed.org, 1 wr.su, 0 @@ -162204,14 +162213,13 @@ wrentham.gov, 1 wrenthamfire.gov, 1 wrenthampolice.gov, 1 -wrestlefanent.com, 1 wresttmb.tk, 1 wrfalimentos.com.br, 1 wrglzd.com, 1 wrhomedecor.com.br, 1 wrightbrand.com, 1 wrightcountymo911.gov, 1 -wrighthassall.co.uk, 1 +wrighthassall.co.uk, 0 wrightsecurity.co, 1 wrightslawfirm.com, 0 wrighttownshipottawami.gov, 1 @@ -162267,7 +162275,7 @@ wsadek.ovh, 1 wsave.be, 1 wsb.pl, 1 -wsballc.com, 1 +wsc.rip, 1 wscad.com, 1 wscauth.de, 1 wscf.ch, 1 @@ -162333,7 +162341,6 @@ wuerfelmail.de, 1 wuergler-consulting.ch, 1 wuermlitaucher.ch, 1 -wuerttemberg-historic.de, 1 wuestenbergs.tk, 1 wuevahosting.com, 1 wuff.gay, 1 @@ -162531,6 +162538,7 @@ www.rme.li, 0 www.sb, 1 www.simbolo.co.uk, 0 +www.simple.com, 0 www.techrepublic.com, 1 www.theguardian.com, 1 www.therapynotes.com, 1 @@ -162597,7 +162605,6 @@ wynajemautkrakow.cf, 1 wynajemautkrakow.ga, 1 wynajempaleciakow.pl, 1 -wynajmijkontener.pl, 1 wyndham.vic.gov.au, 1 wyndhamcapital.com, 1 wyngatepta.com, 1 @@ -162667,7 +162674,6 @@ x0e.nl, 1 x0r.be, 1 x0r.link, 1 -x0rg.org, 1 x1616.tk, 1 x17.cafe, 1 x17.ink, 0 @@ -162685,7 +162691,6 @@ x500658.com, 1 x5197.co, 1 x52.org, 1 -x58f.com, 1 x58p.com, 1 x58t.com, 1 x58v.com, 1 @@ -162706,7 +162711,7 @@ x98v.com, 1 x98y.com, 1 xa.search.yahoo.com, 0 -xaasid.com, 0 +xaasid.com, 1 xab199.com, 1 xaba.tk, 1 xabifk.com, 1 @@ -162811,7 +162816,6 @@ xbertschy.com, 1 xbet104.com, 1 xbet106.com, 1 -xbetkr.com, 1 xbh.cc, 1 xbigzmedia.tk, 1 xbjt11.com, 1 @@ -162839,7 +162843,6 @@ xbyl18.com, 1 xbyl23.com, 1 xbyl26.com, 1 -xbyl28.com, 1 xbyl39.com, 1 xbyl60.com, 1 xbyl62.com, 1 @@ -162994,9 +162997,9 @@ xho.me, 1 xhochy.org, 1 xhtml.club, 1 +xhtmljunction.com, 1 xhy.ch, 1 xia.com, 1 -xia.de, 1 xia100.xyz, 1 xiahdeh.com, 1 xiai.cf, 1 @@ -163033,8 +163036,6 @@ xiaoniaoyou.com, 0 xiaoseai.com, 1 xiaoshijt.com, 1 -xiaoshou.com, 1 -xiaotong.com, 1 xiaowangshen.com, 1 xiaoxia.li, 1 xiarain.com, 1 @@ -163221,6 +163222,7 @@ xjjzp.com, 1 xjjzp.net, 1 xjpvictor.info, 1 +xjr-forum.de, 1 xjtu.love, 1 xjtu.men, 1 xkblog.xyz, 1 @@ -163240,6 +163242,7 @@ xldl.ml, 1 xleech.to, 1 xlem.cn, 1 +xler8r.com, 1 xlhalliance.org, 1 xlink.com.pl, 1 xlnaudio.com, 1 @@ -163267,6 +163270,7 @@ xmlchartsdev.com, 1 xmnr.net, 1 xmodels.com, 1 +xmpp.party, 1 xmv.cz, 1 xmyy.com, 1 xmzq.com, 1 @@ -163295,7 +163299,7 @@ xn----7sbbgbr0arxb4a4exa.com.ua, 1 xn----7sbbhzfbdo6dnf.tk, 1 xn----7sbbncaddj9a9b6am9p.tk, 1 -xn----7sbbq5b0a1c.com, 1 +xn----7sbbq5b0a1c.com, 0 xn----7sbddc9an3aethjp.xn--p1ai, 1 xn----7sbedlbhv2azb6a.xn--j1amh, 1 xn----7sbfl2alf8a.xn--p1ai, 1 @@ -163421,6 +163425,7 @@ xn--80affa6ai0a.tk, 1 xn--80afvgfgb0aa.xn--p1ai, 1 xn--80ahclcaoccacrhfebi0dcn5c1jh.xn--p1ai, 1 +xn--80ahcnkhbwik.xn--p1ai, 1 xn--80ahjdhy.tk, 1 xn--80ahmohdapg.xn--80asehdb, 1 xn--80ahnefiifo0g.xn--p1ai, 1 @@ -163456,7 +163461,6 @@ xn--95qy23o.xn--fiqs8s, 1 xn--95qy23o.xn--fiqz9s, 1 xn--98jm6m.jp, 1 -xn--9iqy04a7fi01l.com, 1 xn--9kq.eu.org, 1 xn--9kqw7o.com, 1 xn--9xa.fun, 1 @@ -163575,8 +163579,6 @@ xn--e1tvpw18d.com, 1 xn--e1tx9l9xc.xn--6qq986b3xl, 1 xn--ecki0cd0bu9a4nsjb.com, 1 -xn--eckok2bi6jzkpc.com, 1 -xn--eckok2bi6jzkpc.jp, 1 xn--ee-zja.de, 1 xn--eglujemy-23b.net, 1 xn--ehqw04eq6e.jp, 1 @@ -163672,6 +163674,7 @@ xn--l8js6h476m.xn--q9jyb4c, 1 xn--l8jyc6ar96aya5ppm966vz8xamsb210deq5bcj9c.jp, 1 xn--labanskllermark-ftb.se, 1 +xn--lbaa.ws, 1 xn--lfv405c.com, 1 xn--ljyakatemia-qfb.fi, 1 xn--lk1a.moe, 1 @@ -163695,7 +163698,6 @@ xn--marn-8ra.eu, 1 xn--martnvillalba-zib.com, 1 xn--martnvillalba-zib.net, 1 -xn--mbius-jua.band, 1 xn--mein-kchenhelfer-ozb.de, 1 xn--mensenges-o1a8c.gq, 1 xn--mensengesss-t8a.gq, 1 @@ -163718,12 +163720,14 @@ xn--monvlogratuit-ehb.fr, 1 xn--morrhret-e0a.se, 1 xn--mrtelfuger-0cb.dk, 1 +xn--myprmienportal-8hb.de, 1 xn--myrepubic-wub.net, 1 xn--myrepublc-x5a.net, 1 xn--naade-dta.com, 1 xn--nbetcieczane-4ib.gen.tr, 1 xn--ncentfit-11a.com, 1 xn--ncentft-yyag.com, 1 +xn--nh8hrc.ws, 1 xn--nicieri-b4a.ro, 1 xn--nidar-tib.org, 1 xn--nide-loa.ee, 1 @@ -163838,6 +163842,7 @@ xn--vhqd939aoqhf4c785d.com, 1 xn--vihrekeino-u5a.fi, 1 xn--vjqp6xkwblzeyv2h.cn, 1 +xn--votoespaa-s6a.es, 1 xn--vt3a.jp, 1 xn--vwsv89g.xn--fiqz9s, 1 xn--vwsw0b.xn--fiqs8s, 1 @@ -163868,10 +163873,8 @@ xn--wzkipodnonikowe-vrb09o.eu, 1 xn--wzkiwidowe-gbb86g.pl, 1 xn--xft85up3jca.ga, 1 -xn--xwqa8512b.eu.org, 1 xn--xz1a.jp, 1 xn--y3cac7d1d.xn--o3cw4h, 1 -xn--y3cri.com, 1 xn--y8j148r.xn--q9jyb4c, 0 xn--y8j2eb5631a4qf5n0h.com, 1 xn--y8ja6lb.xn--q9jyb4c, 1 @@ -163912,8 +163915,10 @@ xobot.su, 1 xobotun.com, 1 xoda.pw, 1 +xoddiel.me, 1 xoddiel.net, 1 xode.net, 1 +xokaiv.com, 1 xolotto.com, 1 xolphin.nl, 1 xombitgames.com, 1 @@ -163934,6 +163939,7 @@ xotaku.com, 1 xotictrends.com, 1 xotika.tv, 1 +xoue.com, 1 xoutpost.com, 1 xoxo.news, 1 xp-ochrona.pl, 1 @@ -163968,7 +163974,6 @@ xponance.com, 1 xportxpert.com, 1 xpreflect.co.uk, 1 -xpress-vpn.com, 1 xpressive.ca, 1 xpressmagazine.org, 1 xps-auto.com, 1 @@ -164142,7 +164147,6 @@ xueaiai.cf, 1 xueaiai.ml, 1 xueanquan.com, 1 -xuecheng.com, 1 xuedianshang.com, 1 xuehuang666.cn, 1 xuelangapp.com, 1 @@ -164224,7 +164228,7 @@ xy369.cc, 0 xy6161.com, 1 xy6957.com, 1 -xy7272.com, 1 +xy7272.com, 0 xy7373.com, 1 xy96.top, 1 xyactive.com.au, 1 @@ -164375,7 +164379,6 @@ ya-radio.tk, 1 ya-stroynaya.tk, 1 ya-zdorova.tk, 1 -yaamava.com, 1 yaateens.org, 1 yaaw.de, 1 yaay.com.br, 1 @@ -164405,12 +164408,14 @@ yacktman.com, 1 yacostasolutions.com, 1 yadaeditrice.com, 0 +yadayahu.com, 1 yadnameh.ga, 1 yado-vinyl.fr, 1 yaebus.tk, 1 yaencontre.com, 1 yafuoku.ru, 1 yagami-ryu.de, 1 +yagamiryu.de, 1 yaghoobi.tk, 1 yagihiro.tech, 1 yagisanatode.com, 1 @@ -164550,10 +164555,8 @@ yapan9.com, 1 yapan99.com, 1 yapanwang.com, 1 -yapatriot.com, 1 yapaytech.com, 1 yapdentalsurgery.com, 1 -yapeal.ch, 1 yapmaz.com, 1 yapper.fr, 1 yappledapple.net, 1 @@ -164640,6 +164643,8 @@ yavip8088.com, 1 yavorivanov.com, 1 yavuzatasoy.tk, 1 +yaware.com, 1 +yaware.com.ua, 1 yawnbox.eu, 1 yawnbox.is, 1 yaws.cf, 1 @@ -164778,6 +164783,7 @@ yenpape.com, 1 yenphat.vn, 1 yeoldemagicmag.com, 1 +yeonsuchoi.ca, 1 yep-pro.ch, 0 yepu.cc, 1 yepu.ga, 1 @@ -164864,7 +164870,6 @@ yiai.gq, 1 yiai.ml, 1 yiai.tk, 1 -yianniswine.com, 1 yiannopoulos.edu.gr, 1 yibaoweilong.top, 1 yibin0831.com, 0 @@ -164935,7 +164940,6 @@ yl8.com, 1 ylanan.tk, 1 ylde.de, 1 -yler.us, 1 yliarb.ru, 1 ylilauta.org, 1 ylivemusic.com, 1 @@ -164984,7 +164988,7 @@ yodelmobile.com, 1 yodocon.com, 1 yoga-bien-etre.com, 1 -yoga-erde.de, 1 +yoga-erde.de, 0 yoga-good.fr, 1 yoga-in-aying.de, 1 yoga-prive.de, 1 @@ -164994,6 +164998,7 @@ yogaangels.ga, 1 yogaanswered.com, 1 yogachina.com, 1 +yogaeastwest.com, 1 yogaecology.org, 1 yogagadgets.ga, 1 yogahealsinc.org, 1 @@ -165004,7 +165009,6 @@ yogamarlene.ch, 1 yogamea.school, 1 yogaovelser.dk, 1 -yogaportalen.dk, 1 yogasirsasana.com, 1 yogasolution.tk, 1 yogatherapykosha.com, 1 @@ -165066,7 +165070,6 @@ yoonas.com, 1 yooneunhye.com, 0 yooooex.com, 1 -yoopies.fr, 1 yopers.com, 0 yopmail.com, 1 yopmail.net, 1 @@ -165169,13 +165172,14 @@ youiv20.com, 1 youiv4k.com, 1 youiv4k.net, 1 -youiv99.com, 1 +youiv99.com, 0 youivh.com, 1 youivt.com, 1 youkaryote.com, 1 youkaryote.org, 1 youked.com, 1 youkube.cf, 1 +youkyi.fr, 1 youla.gq, 1 youla.ru, 1 youlayla.com, 1 @@ -165235,7 +165239,6 @@ your-storageshare.de, 1 your-sussex.wedding, 1 your28days.com, 1 -youradmincavalry.com, 1 youran.me, 1 yourantiquarian.com, 1 youraudiobooks.xyz, 1 @@ -165309,9 +165312,9 @@ yourhrworld.com, 1 yourhumandesign.ch, 1 yourkent.wedding, 1 -yourkeystoneinsurance.com, 1 yourkit.com, 1 yourkrabivilla.com, 1 +yourlegacy.team, 1 yourlgpd.com, 1 yourlifespirit.de, 1 yourloan.gq, 1 @@ -165465,7 +165468,6 @@ ysuna.xyz, 1 yt-downloader.xyz, 0 yt.kg, 1 -yt129.com, 1 yt605.com, 1 yt629.com, 1 yt675.com, 1 @@ -165518,7 +165520,6 @@ yuengling.com, 1 yuer.sytes.net, 1 yuezhang.com, 1 -yufes.com, 1 yugasun.com, 1 yugege.cf, 1 yugioh-duelodefinitivo.tk, 1 @@ -165553,6 +165554,7 @@ yukoslibrary.ga, 1 yula.cf, 1 yulaiz.com, 1 +yulamerola.com.br, 1 yule.hk, 1 yuleyule88game.com, 1 yuliana-hotel.com, 1 @@ -165707,7 +165709,6 @@ z-konzept-nutrition.ru, 1 z-pc.net, 1 z-rejstejna.cz, 1 -z-vector.com, 0 z.ee, 1 z.md, 1 z.sh, 1 @@ -165829,6 +165830,7 @@ zacks.eu, 1 zackzack.at, 1 zaclys.com, 0 +zacnaoliwka.pl, 1 zad-academy.com, 1 zadania.wiki, 1 zadm.de, 1 @@ -165911,6 +165913,7 @@ zakachat-brauzer.gq, 1 zakachat-temi.gq, 1 zakaria.website, 1 +zakarialegal.cz, 1 zakariya.blog, 1 zakariya.org, 1 zakarotta.ga, 1 @@ -165930,7 +165933,6 @@ zakmccrac.de, 1 zakojifarm.jp, 1 zakononline.cf, 1 -zakonu.net.ru, 1 zakpex.com, 1 zakr.es, 1 zakratheme.com, 1 @@ -165947,12 +165949,12 @@ zalihvoch.ga, 1 zaloghaz.ro, 1 zalohovaniburian.cz, 1 +zalow.com, 1 zaltv.com, 1 zalvus.com, 1 zam0th.tk, 1 zamadaftar.com, 1 zamalektoday.com, 1 -zamarax.com, 1 zambianewsforum.tk, 1 zambranopublicidadvideo.com, 1 zamenim.tk, 1 @@ -165971,6 +165973,7 @@ zander.dk, 1 zandersgroup.com, 1 zandmhomes.com, 1 +zandoodle.me.uk, 1 zandra.cf, 1 zandro.fit, 1 zandro.nl, 1 @@ -165984,7 +165987,6 @@ zankevich.net, 1 zanotti.io, 1 zanquan.net, 1 -zanreal.com, 1 zanshin-sailing.com, 1 zanshinkankarate.com, 1 zanthed.xyz, 1 @@ -166028,6 +166030,7 @@ zaptorg.xyz, 1 zapzockt.de, 1 zar-kripto.tk, 1 +zar.za.net, 1 zarabiaj.com, 1 zarabianiewsieci.tk, 1 zarabotai-doma.ml, 1 @@ -166055,7 +166058,6 @@ zarjadnik.tk, 1 zarla.com, 1 zarnitsa.eu, 1 -zarnu.com, 1 zarobotok-forum.ga, 1 zarobotok-forum.gq, 1 zarobotok-forum.ml, 1 @@ -166128,6 +166130,7 @@ zcarrot.com, 1 zcb.fr, 1 zcdtk.com, 1 +zcode-digital-solutions.fr, 1 zcode.tk, 1 zcompany.ga, 1 zcompany.tk, 1 @@ -166185,11 +166188,11 @@ zdcs.com, 1 zdebelak.pl, 1 zdeneklavicky.cz, 1 -zdenekpasek.com, 1 zdenekspacek.cz, 1 zdenekvecera.cz, 1 zdev.me, 1 zdg.md, 1 +zdnet.com, 1 zdomu.eu, 1 zdomu.sk, 1 zdorov-blog.gq, 1 @@ -166226,6 +166229,7 @@ zeblog.tk, 1 zebra-serwis.pl, 1 zebrabyte.co.uk, 1 +zebrabyte.ro, 1 zebraguide.com, 1 zebravinken.tk, 1 zebspeech.tk, 1 @@ -166298,6 +166302,7 @@ zelina.eu, 1 zelkinezis.ru, 1 zelkor.ml, 1 +zelle.com, 1 zellusservices.com.br, 1 zelong.tk, 1 zeloz.xyz, 1 @@ -166306,7 +166311,6 @@ zemanta.com, 1 zemli.tk, 1 zemlova.cz, 1 -zemlya.com.ua, 1 zemlyaki.ga, 1 zemlyaki.ml, 1 zemlyaki.tk, 1 @@ -166314,6 +166318,7 @@ zen-garden.org, 1 zen-solutions.io, 1 zen-zone.tk, 1 +zenaliva.com, 1 zenassociates.com, 1 zenbalans.nl, 1 zenbox.pl, 1 @@ -166333,14 +166338,15 @@ zengdong.ren, 1 zenghuanmin.cn, 0 zengold.com, 1 +zenial.net, 1 zenideen.com, 1 zenidees.com, 1 zeniran.com, 1 -zenit505.com, 1 zenitchik.org, 0 zenithappliance.co.uk, 1 zenithmanagement.net, 1 zenithmedia.ca, 0 +zenithpv.ca, 1 zenithvitalcare.com.au, 1 zenitkft.hu, 1 zenitnetwork.com, 1 @@ -166421,7 +166427,7 @@ zerodhacapital.com, 1 zerodhareview.co, 1 zerodoubtclub.com, 1 -zerodrytimefarnham.co.uk, 1 +zerodrytimefarnham.co.uk, 0 zeroed.com.au, 1 zerofox.gq, 1 zerofy.de, 0 @@ -166593,6 +166599,7 @@ zhonghongshunlian.com, 1 zhongxia.me, 1 zhongzicili.ws, 1 +zhongzilou.com, 1 zhorizon.jp, 1 zhouba.cz, 1 zhoujianghan.com, 0 @@ -166635,7 +166642,6 @@ ziarajoias.com.br, 1 ziarsm.ro, 1 ziaulnmonzur.tk, 1 -ziddea.com, 1 ziegler-heizung-frankfurt.de, 1 ziemlich-zackig.de, 1 ziemlichzackig.de, 1 @@ -166688,6 +166694,7 @@ zimmo.be, 1 zimperium.com, 0 zimpler.com, 1 +zimt.gay, 1 zinabnews.tk, 1 zinchenko.gq, 1 zindagilive.tk, 1 @@ -166701,10 +166708,10 @@ zingpetfood.com, 1 zingst.de, 1 zingtree.com, 1 -zingyawesome.com, 1 zinhar.tk, 1 zinio.com, 1 zinkmetselwerken.nl, 1 +zinnia.com, 1 zinniazorgverlening.nl, 1 zinnowitzer-ferienwohnung.de, 1 zinsserplasticsurgery.com, 1 @@ -166757,7 +166764,6 @@ zivotsdietou.cz, 1 zivotvluxusu.cz, 1 zixiao.wang, 1 -zixin.com, 1 ziz.exchange, 0 ziz.nl, 1 zizcollections.com, 1 @@ -166976,6 +166982,7 @@ zohosurvey.com, 1 zohothrive.com, 1 zohovault.com, 1 +zohowebstatic.com, 1 zohoworkplace.com, 1 zohowriter.com, 1 zohra.ninja, 1 @@ -167022,7 +167029,6 @@ zomiac.pp.ua, 1 zona-bellepop.tk, 1 zona-japonesa.tk, 1 -zonaardebasisschool.nl, 1 zonadepinturas.com, 1 zonadetestes.com, 1 zonadigital.pt, 1 @@ -167093,7 +167099,6 @@ zoomerhost.com, 1 zoomgov.com, 1 zoomlikenew.com, 1 -zoomsite.net, 1 zoomsphere.com, 0 zoon-editor.com, 1 zoones.net, 1 @@ -167206,6 +167211,7 @@ zse.hr, 1 zseartcc.org, 1 zselicivt.hu, 1 +zsemito.hu, 1 zshmvp.com, 1 zsien.cn, 1 zsinep.hu, 1 @@ -167222,6 +167228,7 @@ zt360.net, 1 zta.training, 1 ztable.io, 1 +ztalk.org, 1 ztctarrin.com, 1 zten.org, 1 ztickerz.nl, 1 @@ -167240,7 +167247,6 @@ zudomc.me, 1 zuefle.net, 1 zuehlcke.de, 1 -zuffel.com, 1 zufuribita.tk, 1 zug-anwalt.de, 0 zugarkovi.cz, 1 @@ -167306,8 +167312,9 @@ zverovod.info, 1 zverskij-site.tk, 1 zvezdy-porno.ml, 1 +zvo.me, 1 zvps.uk, 1 -zvukipro.com, 1 +zvukipro.com, 0 zvvtheboys.tk, 1 zvxr.net, 1 zwalm.be, 1 @@ -167378,7 +167385,7 @@ zyner.org, 1 zynga.com, 1 zyno.space, 1 -zynqit.com, 1 +zynqit.com, 0 zypern-und-ich.de, 1 zypernreisen.com, 1 zypr.pw, 1 diff -Nru thunderbird-140.5.0esr/security/manager/tools/log_list.json thunderbird-140.6.0esr/security/manager/tools/log_list.json --- thunderbird-140.5.0esr/security/manager/tools/log_list.json 2025-11-08 04:45:04.000000000 +0000 +++ thunderbird-140.6.0esr/security/manager/tools/log_list.json 2025-12-09 01:27:21.000000000 +0000 @@ -1,6 +1,6 @@ { - "version": "74.17", - "log_list_timestamp": "2025-11-06T12:53:45Z", + "version": "76.4", + "log_list_timestamp": "2025-11-30T12:54:31Z", "operators": [ { "name": "Google", @@ -184,8 +184,8 @@ "url": "https://ct.cloudflare.com/logs/nimbus2027/", "mmd": 86400, "state": { - "qualified": { - "timestamp": "2025-09-05T00:00:00Z" + "usable": { + "timestamp": "2025-11-15T00:00:00Z" } }, "temporal_interval": { @@ -750,8 +750,8 @@ "monitoring_url": "https://mon.sycamore.ct.letsencrypt.org/2025h2d/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -767,8 +767,8 @@ "monitoring_url": "https://mon.sycamore.ct.letsencrypt.org/2026h1/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -784,8 +784,8 @@ "monitoring_url": "https://mon.sycamore.ct.letsencrypt.org/2026h2/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -801,8 +801,8 @@ "monitoring_url": "https://mon.sycamore.ct.letsencrypt.org/2027h1/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -818,8 +818,8 @@ "monitoring_url": "https://mon.sycamore.ct.letsencrypt.org/2027h2/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -835,8 +835,8 @@ "monitoring_url": "https://mon.willow.ct.letsencrypt.org/2025h2d/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -852,8 +852,8 @@ "monitoring_url": "https://mon.willow.ct.letsencrypt.org/2026h1/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -869,8 +869,8 @@ "monitoring_url": "https://mon.willow.ct.letsencrypt.org/2026h2/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -886,8 +886,8 @@ "monitoring_url": "https://mon.willow.ct.letsencrypt.org/2027h1/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -903,8 +903,8 @@ "monitoring_url": "https://mon.willow.ct.letsencrypt.org/2027h2/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -1231,8 +1231,8 @@ "monitoring_url": "https://gouda2025h2.mon.ct.ipng.ch/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -1248,8 +1248,8 @@ "monitoring_url": "https://gouda2026h1.mon.ct.ipng.ch/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -1265,8 +1265,8 @@ "monitoring_url": "https://gouda2026h2.mon.ct.ipng.ch/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -1282,8 +1282,8 @@ "monitoring_url": "https://gouda2027h1.mon.ct.ipng.ch/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { @@ -1299,8 +1299,8 @@ "monitoring_url": "https://gouda2027h2.mon.ct.ipng.ch/", "mmd": 60, "state": { - "qualified": { - "timestamp": "2025-09-17T03:00:00Z" + "usable": { + "timestamp": "2025-11-27T03:00:00Z" } }, "temporal_interval": { diff -Nru thunderbird-140.5.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json thunderbird-140.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json --- thunderbird-140.5.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2025-12-09 01:27:21.000000000 +0000 @@ -5,6 +5,2915 @@ "blocked": [], "unblocked": [], "softblocked": [ + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.7.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.8.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.9.1130", + "MUC3-Dashboard-Pack@example.com:1.1", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.1201", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.6.1130", + "musicplayer@extension.org:0.1", + "{93bbfa08-7772-457b-be7d-b0cdb0f53564}:1.5.1", + "seer-ratings-overlay-gk@example.com:1.0.0", + "{6683972e-10d4-44a4-90f8-ce51722cc1cd}:1.5.27.2", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.1.1201", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.2.1201", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.4.1201", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.3.1201", + "@traceq-browser-extension.invictolabs:1.0" + ] + }, + "schema": 1764555357486, + "key_format": "{guid}:{version}", + "stash_time": 1764570906433, + "id": "3969e33a-b900-493c-a5c2-5fcf631afa88", + "last_modified": 1764570990070 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "cybernotes-sidebar@0xbasinas:0.3.0", + "@grip.security.internal:0.0.2", + "{90e41842-755d-40e0-9136-3224ee21b36d}:0.1", + "mosa.albedre3@gmail.com:2.1", + "{a8f133d7-f5a5-4041-9fa0-56b1eeaa844e}:1.0.0", + "{a8f133d7-f5a5-4041-9fa0-56b1eeaa844e}:1.1.0", + "{a8f133d7-f5a5-4041-9fa0-56b1eeaa844e}:1.1.3", + "{a8f133d7-f5a5-4041-9fa0-56b1eeaa844e}:1.1.4", + "mosa.albedre9@gmail.com:2.0", + "mosa.albedre9@gmail.com:2.1", + "mosa.albedre9@gmail.com:2.2", + "{a8f133d7-f5a5-4041-9fa0-56b1eeaa844e}:1.1.5", + "luminous-ttv@dvdandroid:0.9.0.0", + "ip-decrement-tool-final@zynek.net:1.3", + "ip-decrement-tool-final@zynek.net:1.2", + "ip-decrement-tool-final@zynek.net:1.1" + ] + }, + "schema": 1764527792475, + "key_format": "{guid}:{version}", + "stash_time": 1764549305549, + "id": "7f202470-9589-4e71-968a-ff3cbb5f7bc3", + "last_modified": 1764549379668 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "linkedin-focus@nhrdev.com:1.1", + "linkedin-focus@nhrdev.com:1.0.0", + "koszyk-wspoldzielony-allegro@nicramu:1.5", + "{9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d}:2.3" + ] + }, + "schema": 1764506194358, + "key_format": "{guid}:{version}", + "stash_time": 1764527706180, + "id": "9ce257ab-427f-4c13-b320-4b98e8baa7a9", + "last_modified": 1764527792169 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.2.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.3.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.4.1130", + "{5384b886-08a8-11f0-9f4f-af7f4c6512f7}:1.0.0", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.1.1130", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.5.1130", + "castify@example.com:1.0.0", + "{61666688-dbb8-4d1f-8df6-65d76960a788}:0.1", + "offline-2fa-generator@agentie.marketing:1.1.0" + ] + }, + "schema": 1764484591554, + "key_format": "{guid}:{version}", + "stash_time": 1764506106460, + "id": "efde9278-47bc-413b-8404-266d9c46a6e5", + "last_modified": 1764506194257 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{68ef0948-5c86-49f8-8161-dd4082ad9607}:1.0", + "{68ef0948-5c86-49f8-8161-dd4082ad9607}:4.2", + "@kudos-reminder:1.0", + "bypass-redirect@example.com:1.0" + ] + }, + "schema": 1764468938917, + "key_format": "{guid}:{version}", + "stash_time": 1764484507159, + "id": "bb89f001-7306-4ec7-8675-f1768ce6a50a", + "last_modified": 1764484591323 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hysec-fleet-parser@hysec.org:3.0.0", + "linkshare@example.com:1.0.0", + "youtube-scheduler@yourdomain.com:1.0", + "youtube-scheduler@yourdomain.com:1.1", + "youtube-scheduler@yourdomain.com:1.2", + "Android@bravenhancer.com:20.4.5", + "yt-dlp-sender@example.com:0.2", + "enhancer@goldenfox.com:20.4.5", + "Android@bravenhancer.com:20.4.7", + "enhancer@goldenfox.com:20.4.7", + "kinozal-template@yourdomain:1.0", + "kinozal-template@yourdomain:1.1", + "kinozal-template@yourdomain:1.2", + "{82c31999-6f24-4c2c-a9ce-4afe9b1e4a6c}:1.0", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.12.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.17.1129" + ] + }, + "schema": 1764441384369, + "key_format": "{guid}:{version}", + "stash_time": 1764462906841, + "id": "7cd35189-072c-4019-b814-07dbd614761e", + "last_modified": 1764462988045 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.14.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.15.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.16.1129", + "dashboardplus@starlight-symposium.neocities.org:1.9.2", + "messenger.tabpop@fluke667.me:0.1", + "tabpop@fluke667.me:0.2", + "tabpop@fluke667.me:0.4", + "track-package@example.com:1.0.3", + "{95decd0f-9660-4820-90a4-46400c25d2dd}:1.0", + "{95decd0f-9660-4820-90a4-46400c25d2dd}:2.0" + ] + }, + "schema": 1764419781181, + "key_format": "{guid}:{version}", + "stash_time": 1764441306580, + "id": "9be75452-6ee0-4d47-93c4-f1fe069440f6", + "last_modified": 1764441384204 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{da8b830c-53dd-4d0e-88c7-522fcc0f6bc1}:4.0", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.11.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.7.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.8.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.9.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.10.1129", + "{5cc1d8c1-e443-4816-bd41-4da2c6760088}:1.0", + "{c2c88180-2036-496d-855e-4248ac18c8f8}:1.0", + "{15320dea-72e0-4817-97a5-ce7c785da9fe}:1.0", + "{db516bc3-963f-45ef-886f-8f3896dc8a94}:1.0", + "{36117922-a298-46f1-aa20-3ba4ca8cd81f}:1.0", + "{bc918d90-d8b4-4e4b-ae01-7637223abd00}:1.0", + "{cd762133-0135-41d7-9e36-d4c7ebc3884a}:1.0", + "{cd762133-0135-41d7-9e36-d4c7ebc3884a}:2.0", + "{f6076090-0f37-4ffa-a237-49ae4197b755}:1.0", + "{f7fc0e48-557a-4eaf-9ea9-f8bd781481eb}:1.0", + "{b0c463a3-d77c-485e-8c38-c57d3978e94a}:1.0", + "{d81d243d-d115-467b-b5ea-fe97146d323a}:1.0", + "{d81d243d-d115-467b-b5ea-fe97146d323a}:2.0", + "{d81d243d-d115-467b-b5ea-fe97146d323a}:3.0", + "{d81d243d-d115-467b-b5ea-fe97146d323a}:4.0", + "{80c0ecff-1625-4d2a-a26b-fcae20c0f737}:1.3.2", + "{03b9bb3e-5a01-439c-ab4a-58f0e30bc236}:3.6.1", + "Android@bravenhancer.com:20.4.3", + "enhancer@goldenfox.com:20.4.3", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.13.1129", + "modify-http-headers-2@devu:1.0.0", + "modify-http-headers-2@devu:1.0.1", + "modify-cookie-expiration@devu:1.0.0", + "modify-cookie-expiration@devu:1.1.0" + ] + }, + "schema": 1764398185121, + "key_format": "{guid}:{version}", + "stash_time": 1764419705597, + "id": "15543df9-723f-4550-9ddb-f2f568798b88", + "last_modified": 1764419780977 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.1", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.4", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.5", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.1128", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.11280", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.11281", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.11283", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.1.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.2.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.3.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.5.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.4.1129", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.6.1129", + "copy-address-as-markdown-link-extension@swierk.me:1.0.0", + "{32aaa43c-2884-40af-af82-3220d100547e}:1.2", + "etsy-scraper@tinnguyendev.com:1.0", + "{a8c047e2-ca24-40df-9ae7-0c6321e84c50}:1.0", + "{a8c047e2-ca24-40df-9ae7-0c6321e84c50}:1.0.1", + "{a8c047e2-ca24-40df-9ae7-0c6321e84c50}:1.0.2", + "{a8c047e2-ca24-40df-9ae7-0c6321e84c50}:1.0.3", + "dashboardplus@starlight-symposium.neocities.org:1.9.0", + "dashboardplus@starlight-symposium.neocities.org:1.8.4", + "dashboardplus@starlight-symposium.neocities.org:1.8.3", + "dashboardplus@starlight-symposium.neocities.org:1.8.2", + "dashboardplus@starlight-symposium.neocities.org:1.8.1", + "dashboardplus@starlight-symposium.neocities.org:1.9.1", + "dashboardplus@starlight-symposium.neocities.org:1.8.0", + "dashboardplus@starlight-symposium.neocities.org:1.7.3", + "dashboardplus@starlight-symposium.neocities.org:1.7.2", + "dashboardplus@starlight-symposium.neocities.org:1.7.0", + "dashboardplus@starlight-symposium.neocities.org:1.6.0", + "dashboardplus@starlight-symposium.neocities.org:1.5.3", + "dashboardplus@starlight-symposium.neocities.org:1.7.1", + "dashboardplus@starlight-symposium.neocities.org:1.5.2", + "dashboardplus@starlight-symposium.neocities.org:1.5.1", + "dashboardplus@starlight-symposium.neocities.org:1.5.0", + "dashboardplus@starlight-symposium.neocities.org:1.4.4", + "dashboardplus@starlight-symposium.neocities.org:1.4.3", + "dashboardplus@starlight-symposium.neocities.org:1.4.2", + "dashboardplus@starlight-symposium.neocities.org:1.4.1", + "dashboardplus@starlight-symposium.neocities.org:1.4.0", + "dashboardplus@starlight-symposium.neocities.org:1.3.3", + "dashboardplus@starlight-symposium.neocities.org:1.3.2", + "dashboardplus@starlight-symposium.neocities.org:1.3.1", + "dashboardplus@starlight-symposium.neocities.org:1.2.3", + "dashboardplus@starlight-symposium.neocities.org:1.2.4", + "dashboardplus@starlight-symposium.neocities.org:1.2.2", + "dashboardplus@starlight-symposium.neocities.org:1.2.1", + "dashboardplus@starlight-symposium.neocities.org:1.2.0", + "dashboardplus@starlight-symposium.neocities.org:1.1.0", + "dashboardplus@starlight-symposium.neocities.org:1.0.1", + "dashboardplus@starlight-symposium.neocities.org:1.0", + "dashboardplus@starlight-symposium.neocities.org:1.3.0" + ] + }, + "schema": 1764382538733, + "key_format": "{guid}:{version}", + "stash_time": 1764398105973, + "id": "18be5ff1-950e-4a51-8149-0eb95440e70b", + "last_modified": 1764398184829 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "nlfgmdembofgodcemomfeimamihoknip@chrome-store-foxified--1895366015:18.1.17.2203", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.4", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.5", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.0", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.3", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.4", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.5", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.6", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.7", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.8", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.2.9", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.1", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.2", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.3", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.7", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.8", + "{bb4108bb-c106-417d-b1ac-f9d58daa6c38}:1.3.9", + "jellyfin-imdb-folder-namer@agroqirax.io:1.1", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.0" + ] + }, + "schema": 1764354980106, + "key_format": "{guid}:{version}", + "stash_time": 1764376508425, + "id": "93e0b854-0855-4679-b61d-41d266581372", + "last_modified": 1764376599958 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "product-price-sorter@example.com:1.0.0", + "product-price-sorter@example.com:1.0.1", + "{0d31c76b-ac9d-43d8-9438-e98895e9b208}:1.0", + "@insightshub_sinrefresh:1.0", + "@insightshub:1.0", + "{21582b0f-8441-4108-89ae-7ea688f905e5}:1.0" + ] + }, + "schema": 1764333393975, + "key_format": "{guid}:{version}", + "stash_time": 1764354905516, + "id": "d1174336-33ff-4c13-b0df-2f0b3def9898", + "last_modified": 1764354979919 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "worklogcreator@bujacek.sk:0.1", + "worklogcreator@bujacek.sk:0.1.1", + "worklogcreator@bujacek.sk:0.1.2", + "worklogcreator@bujacek.sk:0.1.3", + "worklogcreator@bujacek.sk:0.1.4", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.0", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.1", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.2", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.3", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.4", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.5", + "{ff967d43-43fc-48d0-9048-173d6041bfd1}:1.0.6", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.2", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.3", + "{0b4c096d-ffdd-40c6-822d-cb0e62f07108}:1.0.0", + "{ff40d649-ffc9-49ee-bed7-24144d2ed0b2}:0.0.2", + "{0f1948f1-0165-461e-bacd-db2fae5f5bee}:1.0", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.1", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.2alpha1", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.2alpha2", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.2alpha3", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.3alpha1", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.3alpha2", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.3", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.4", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.5", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.6", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.6local", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.7", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.8", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.9", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.10", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.11", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.12", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.13", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.14", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.15", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.16", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.17", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.18", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.21", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.22", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.23", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.24", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.25", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.26", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.27", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.28", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.29", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.30", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.31", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.32", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.33", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.34", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.35", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.36", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.37", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.38", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.39", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.40", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.41", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.42", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.43", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.44", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.45", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.46", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.47", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.48", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.49", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.50", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.51", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.0.52", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.0", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.1", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.2", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.3", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.4", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.5", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.6", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.7", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.8", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.9", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.10", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.11", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.12", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.13", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.14", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.15", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.16", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.17", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.18", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.19", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.20", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.1.21", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.163", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.164", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.165", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.166", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.167", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.168", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.169", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.170", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.171", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.172", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.173", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.174", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.175", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.176", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.1", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.2", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:0.2.3", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.4", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.5", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.6", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.7", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.8", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.9", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.10", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.11", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.12", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.13", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.14", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.15", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.16", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.17", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.21", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.22", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.23", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.24", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.25", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.26", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.27", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.28", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.29", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.30", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.31", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.32", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.33", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.34", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.35", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.36", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.37", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.38", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.39", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.40", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.41", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.42", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.43", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.44", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.45", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.46", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.47", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.48", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.49", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.50", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.51", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.52", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.53", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.54", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.55", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.56", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.57", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.58", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.59", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.60", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.61", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.62", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.63", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.0", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.73", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.79", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.81", + "{30a330bd-39ee-4479-8b17-54ae7a7eb42f}:2.0.82", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:0.1.2", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:0.1.6", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:0.1.17", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.0.0", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.1.2", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.1.3", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.1.4", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.2.1", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.2.6", + "{3bd180da-2e97-409c-8ecc-ad59c9f1754e}:2.3.0", + "sergiu@graphlings.co:1.0", + "sergiu@graphlings.co:1.1" + ] + }, + "schema": 1764311792360, + "key_format": "{guid}:{version}", + "stash_time": 1764333306297, + "id": "83a08916-42f8-4a6b-9518-f3790e49398b", + "last_modified": 1764333393796 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{8bf611c0-379e-4580-b2c9-935a52a426b4}:1.0", + "timer-open@example.com:1.0", + "@Youtube-Playlist-Save-Button:1.0" + ] + }, + "schema": 1764296145305, + "key_format": "{guid}:{version}", + "stash_time": 1764311707141, + "id": "f17ba3eb-ad83-4f32-b9ac-dd847ca01830", + "last_modified": 1764311792191 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ragbot@jsteurer.de:1.0", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.0", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.1", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.2", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.3", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.4", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.5", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b70}:1.0.6", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.1", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.2", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.3", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.4", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.5", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.6", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.7", + "faster-pull-request-gotestingspace@gmail.com:0.0.0.8", + "videoframecapture@example.com:1.0", + "transaction@guardianchain.app:3.1", + "transaction@guardianchain.app:5.0", + "transaction@guardianchain.app:6.0", + "transaction-v7@guardianchain.app:7.0", + "transaction-v5@guardianchain.app:6.4", + "transaction-v4@guardianchain.app:6.2", + "transaction-debug@guardianchain.app:6.1", + "transaction@guardianchain:2.9", + "guardianchain@crazy.com:6.2", + "tmo-cascade-redirect@personal-use.com:1.0", + "Android@bravenhancer.com:20.4.0", + "enhancer@goldenfox.com:20.4.0", + "tabpocket@mechanikadesign.com:0.1.3", + "{a38d6aab-d0c7-4a0f-8dae-388a72de389c}:0.1.3", + "feedback@mechanikadesign.com:0.1.2", + "Android@bravenhancer.com:20.4.2", + "enhancer@goldenfox.com:20.4.2" + ] + }, + "schema": 1764268595567, + "key_format": "{guid}:{version}", + "stash_time": 1764290105228, + "id": "49412d5c-9211-4ec4-a3f0-d2eb71a620ff", + "last_modified": 1764290182588 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "nobody@nobody.nb:1.0", + "nobody@nobody.nb:1.1", + "myfasttheme@local.test:1.0", + "{753c8baf-ca01-48ba-80ca-371aec8a034a}:0.0.1", + "@Auto-Refresh-Extension:1.4", + "405984679@qq.com:2.0", + "93bc012a-dedd-4e40-bb34-b5888524346c@ac2000:1.1", + "93bc012a-dedd-4e40-bb34-b5888524346c@ac2000:1.0", + "93bc002a-dedd-4e40-bb24-b5888524346c@ac2000:1.0", + "93bc002a-dedd-4e40-bb24-b5888524346c@ac2000:1.1", + "{57bd0ce0-30ba-4507-afde-4780c4e47c11}:1.0", + "support@mechanikadesign.com:0.1.1", + "support@mechanikadesign.com:0.1.0", + "support@mechanikadesign.com:1.0.0" + ] + }, + "schema": 1764246994468, + "key_format": "{guid}:{version}", + "stash_time": 1764268506620, + "id": "2426f005-855c-45f8-99d0-4fa48248f879", + "last_modified": 1764268595453 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{5e594c8b-f823-4c11-bc83-b1cf4ec79a07}:2.2", + "{5e594c8b-f823-4c11-bc83-b1cf4ec79a07}:12.0", + "{5e594c8b-f823-4c11-bc83-b1cf4ec79a07}:13", + "{a08e22d5-4675-48bc-8efa-6d0c39e8e001}:13.0", + "{a08e22d5-4675-48bc-8efa-6d0c39e8e001}:12.0", + "{a08e22d5-4675-48bc-8efa-6d0c39e8e001}:13.1", + "{a08e22d5-4675-48bc-8efa-6d0c39e8e001}:13.2", + "timer-open-page@example.com:1.0", + "{ea2ad5bc-e458-414d-8565-5cfe9f7cf1b3}:1.20.1.23", + "{ea2ad5bc-e458-414d-8565-5cfe9f7cf1b3}:1.20.1.30", + "{c452ae16-8cd7-4cde-8f40-3183f3894b71}:1.0", + "chronio-url-saver@chronioapp.com:1.1.0", + "chronio-url-saver@chronioapp.com:1.0", + "table-copy-ff@example.com:1.0", + "areumsec@pranaywajjala.com:1.0.1" + ] + }, + "schema": 1764225396658, + "key_format": "{guid}:{version}", + "stash_time": 1764246907060, + "id": "fa47de9c-eb95-43b8-874c-36286c6b3050", + "last_modified": 1764246994245 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3e5960dc-ad94-418f-9361-9a7b3c73e673}:1.0", + "{86bc8e20-4af2-4b0f-90a5-687b38b85507}:1.0.0", + "{4aaca136-fc9d-4854-9067-a92aabeccd0f}:1.0", + "{41b0127b-c011-48a9-9972-fd604e871352}:1.0", + "yt-twitch-chat-toggle@mkeefeus.github.io:1.0.0", + "{5d0a58cd-5832-495f-b7ac-c01c6616711b}:1.0", + "{455aed2e-eb0a-488d-8596-f5519bfb1de0}:1.0", + "{8a267792-1b0f-484a-a20f-8f8da4e55762}:1.0", + "{59f27ff8-ae64-4bac-bffa-3d23eb37cc72}:1.0", + "{2a105022-8940-4d1b-bf54-5436f65be5bd}:1.0", + "readinshort@example.com:1.0", + "readinshort@example.com:1.0.1", + "readinshort@example.com:1.0.2", + "readinshort@example.com:1.1.3", + "{9a038b53-2e56-4d03-b7d6-39238c63a78e}:1.0", + "@giseo-helper:1.0", + "{0b3e6b2d-e11a-43b3-8d01-bc6faaca7133}:2.2.6" + ] + }, + "schema": 1764209743671, + "key_format": "{guid}:{version}", + "stash_time": 1764225307037, + "id": "fcdba844-e8eb-485d-ab66-b5762d6f827d", + "last_modified": 1764225396546 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{e2d103a3-e83f-4124-96d3-136174ef8186}:1.0", + "bigecpfecdjhlpajhopjadjdhaimabfi@chrome-store-foxified--1958145764:1.0.2", + "{1c4f3789-c316-47a9-8c08-4550697f9e71}:1.0.0", + "{1c4f3789-c316-47a9-8c08-4550697f9e71}:1.0.1", + "{1c4f3789-c316-47a9-8c08-4550697f9e71}:1.0.2", + "{1c4f3789-c316-47a9-8c08-4550697f9e71}:1.0.3", + "nlfgmdembofgodcemomfeimamihoknip@chrome-store-foxified--1958145764:18.2.16.2048", + "{7f3a9c2b-4d8e-4f1a-b5c6-9e2d1a8f4b7c}:1.0.0", + "makusi-quiz@example.com:0.2.0", + "{1e0c178e-4df0-47cc-854a-09a182359494}:3.9.1", + "{1e0c178e-4df0-47cc-854a-09a182359494}:1.0", + "enhancementsuite@e926.net:0.1", + "enhancementsuite@e926.net:0.2", + "enhancementsuite@e926.net:1.0", + "enhancementsuite@e926.net:2.0", + "enhancementsuite@e926.net:3.0", + "tabmaster@yourdomain.com:1.0.0", + "{2222b75f-a2c4-436e-9fe3-2781b986b864}:1.0.0", + "hide-blur-overlay@my-site:3.0" + ] + }, + "schema": 1764182192875, + "key_format": "{guid}:{version}", + "stash_time": 1764203705613, + "id": "2ecb0a26-1867-4d7c-947d-71df46ca33d6", + "last_modified": 1764203779770 + }, + { + "stash": { + "blocked": [ + "mark.carter20111960ds@outlook.com:1.0.1" + ], + "unblocked": [], + "softblocked": [ + "@duplicate_tab_button:0.4", + "comment-lesson@theller.posteo.de:1.4.2", + "{a7da4615-2637-4ab1-87df-5399c6b80857}:1.0", + "ItsTits@PeppaPig.knorr:1.0", + "ItsTits@PeppaPig.knorr:1.1", + "{c32bffe6-165c-462e-b33c-9b3de2eb0fdc}:1.0", + "{c32bffe6-165c-462e-b33c-9b3de2eb0fdc}:1.1resigned1", + "{e2b544cd-537a-458a-89c4-6048839be2aa}:1.0", + "{fab5e35f-f80e-4ab9-b473-a0a4093a9031}:1.1", + "addontest918@testexample.com:0.0.1", + "magnolia@12.34:4.2.5.2", + "mosa.albedre3@gmail.com:2.0" + ] + }, + "schema": 1764160592167, + "key_format": "{guid}:{version}", + "stash_time": 1764182107747, + "id": "302e31ab-98e3-4860-ae7f-4f7fba8ba550", + "last_modified": 1764182192367 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "cardinal@codeword.info:1.0.0", + "youtube-link-extractor@fast.com:1.0", + "info@cdn0x12.dev:1.1.0", + "info@cdn0x12.dev:1.0.1", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.1.0", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.9", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.8", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.7", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.6", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.5", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.1", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.2", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.3", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.0.4", + "Android@bravenhancer.com:20.3.7", + "enhancer@goldenfox.com:20.3.7", + "93bc002a-dddd-4e40-bb24-b5888524346c@ac2000:1.0", + "93bb002a-dddd-4e40-bb24-b5888524346c@ac2000:1.0", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.1.1", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.1.2", + "{a3e0b7bc-fba7-4451-a380-bee22a7254c9}:1.1.3", + "cloudtalk-click-to-call@cloudtalk.io:5.1.4", + "{9243aeff-7a72-4abe-a7a7-2c547b32b2dd}:5.33" + ] + }, + "schema": 1764138980253, + "key_format": "{guid}:{version}", + "stash_time": 1764160505430, + "id": "5292a077-558a-412b-a683-fd9f8fba1d50", + "last_modified": 1764160583657 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ltvpn@org:1.0.3", + "ltvpn@org:1.0.3.1", + "ltvpn@org:1.0.3.2" + ] + }, + "schema": 1764123343024, + "key_format": "{guid}:{version}", + "stash_time": 1764138905096, + "id": "f3e788de-c0ee-417e-8867-954f0b113e4d", + "last_modified": 1764138980024 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{d6f8c7e0-9a1b-4c3d-8e2f-5a6b7c8d9e0f}:0.8.0", + "aws-role-switcher@example.com:0.2.0", + "@utilitator:0.0.2", + "dangs-youtube-advert-blocker@example.com:6", + "dangs-youtube-advert-blocker@example.com:51", + "prompt-pilot@example.com:1.0", + "conrep-content-capture@conrep.com:1.0.0", + "tubearchivist-hr@srinivas.gs:1.0.0", + "tubearchivist-hr@srinivas.gs:2.0.0", + "tubearchivist-hr@srinivas.gs:3.0.0" + ] + }, + "schema": 1764095785506, + "key_format": "{guid}:{version}", + "stash_time": 1764117305614, + "id": "4f3418ff-fb0b-41e7-93c4-426c9efa1ca4", + "last_modified": 1764117384224 + }, + { + "stash": { + "blocked": [ + "{d94ea2b2-c7ca-4f15-8912-f9fb294e4203}:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "google-hk-blocker@your-email.com:1.0", + "google-hk-blocker@your-email.com:1.1", + "@yt-declutterer:1.0", + "Android@bravenhancer.com:20.2.5", + "enhancer@goldenfox.com:20.2.5", + "Android@bravenhancer.com:20.3.2", + "enhancer@goldenfox.com:20.3.2", + "enhancer@goldenfox.com:20.3.3", + "Android@bravenhancer.com:20.3.3", + "Android@bravenhancer.com:20.3.5", + "enhancer@goldenfox.com:20.3.5", + "calmness@lazarrew.dev:1.1" + ] + }, + "schema": 1764083616514, + "key_format": "{guid}:{version}", + "stash_time": 1764095705569, + "id": "18f70ee2-f6a6-489f-b299-22da488aa6fc", + "last_modified": 1764095785352 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "mbniclmhobmnbdlbpiphghaielnnpgdp@chrome-store-foxified--36396496:6.2.4", + "{916b0889-b6a3-4b30-9d68-ae6b8f7347bf}:1.0", + "{76dad2bc-1688-49c8-b155-c4fc1f7ac3ea}:1.0", + "{3c0083f5-a41a-49f7-9741-8ce675bc9b5e}:1.0.2", + "voicepresso-password-manager@voicepresso.com:1.4.2", + "k6341332@gmail.com:1.4", + "{d20e6c2b-801f-41bb-916f-1070afa26c36}:1.0" + ] + }, + "schema": 1764036945560, + "key_format": "{guid}:{version}", + "stash_time": 1764074106250, + "id": "0b6af3d2-ef62-4a74-abfc-cd7c6765696b", + "last_modified": 1764074189669 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "text-expander@yourdomain.com:3.2.2", + "text-expander@yourdomain.com:3.2.0" + ] + }, + "schema": 1764017147571, + "key_format": "{guid}:{version}", + "stash_time": 1764030906369, + "id": "47ad3917-7fac-42ec-8751-7f6b5b519ac5", + "last_modified": 1764030987393 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{a6d48860-51cf-42e4-9c63-6c2469ad66b0}:1.0", + "{7f174d0f-3352-43cf-b1e1-e18ca697b44c}:0.0.2", + "{7f174d0f-3352-43cf-b1e1-e18ca697b44c}:0.0.2.1", + "{7f174d0f-3352-43cf-b1e1-e18ca697b44c}:0.0.3", + "{7f174d0f-3352-43cf-b1e1-e18ca697b44c}:0.0.4", + "snigelmailen@snigelmailen.se:1.0", + "snigelmailen@snigelmailen.se:1.1", + "{e6691303-419f-4a63-b2c0-e446a0fc5b69}:1.1", + "bulletbase@pushbullet.extension:1.0.2", + "{88a8281f-b6a4-45f3-bc63-3e1b9d352e46}:1.2.4", + "homepage-personalizzata@user.xpi:5.2" + ] + }, + "schema": 1764000964038, + "key_format": "{guid}:{version}", + "stash_time": 1764009307478, + "id": "f7726510-ab71-4e86-b73b-e2190ab61a7b", + "last_modified": 1764009397357 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lurkandloiter@github.com:1.0", + "lurkandloiter@github.com:1.1", + "lurkandloiter@github.com:2.0", + "bb6ab812-6c86-4791-a115-44c1cb3ccc90@ac2000:1.0", + "93bb002a-dddd-4e40-bb24-b5888524346b@ac2000:1.0", + "zero@zero.com:1.0", + "zero@zero.com:1.0.1", + "zero@zero.com:1.0.2", + "zero@zero.com:1.0.3", + "zero@zero.com:1.0.4", + "zero@zero.com:1.0.5", + "zero@zero.com:1.0.6", + "zero@zero.com:1.0.7", + "zero@zero.com:1.0.8", + "zero@zero.com:1.0.9", + "zero@zero.com:1.0.10", + "zero@zero.com:1.0.11", + "zero@zero.com:1.0.12", + "zero@zero.com:1.0.13", + "zero@zero.com:1.0.14", + "zero@zero.com:1.0.15", + "zero@zero.com:1.0.16", + "zero@zero.com:1.0.17", + "zero@zero.com:1.0.18", + "zero@zero.com:1.1.0", + "zero@zero.com:1.1.1", + "zero@zero.com:1.1.2", + "zero@zero.com:1.1.3", + "zero@zero.com:1.1.4", + "zero@zero.com:1.1.5", + "mymoviedb@zero.com:1.0", + "mymoviedb@zero.com:1.0.1", + "mymoviedb@zero.com:1.0.2", + "mymoviedb@zero.com:1.0.3", + "mymoviedb@zero.com:1.0.4", + "mymoviedb@zero.com:2.0.0", + "mymoviedb@zero.com:2.0.1", + "mymoviedb@zero.com:2.0.2", + "mymoviedb@zero.com:2.0.3", + "mymoviedb@zero.com:2.1.1", + "mymoviedb@zero.com:2.1.2", + "mymoviedb@zero.com:2.1.4", + "mymoviedb@zero.com:2.1.5", + "mymoviedb@zero.com:2.1.6", + "mymoviedb@zero.com:2.1.7", + "{42d8bc8a-1a4f-4bd3-97dc-bc3282093f60}:1.0", + "@alea-sesame-time-enhanced:2.8.0", + "{97b42b04-a5b4-4323-95ed-b40b78bb0ab7}:2.2.1", + "propsync@propverse:1.0.3", + "propsync@propverse:1.0.0", + "propsync@propverse:1.0.1", + "propsync@propverse-live:1.0.2" + ] + }, + "schema": 1763966194762, + "key_format": "{guid}:{version}", + "stash_time": 1763987705301, + "id": "b6dfb10c-775e-4bbe-adc6-c208f3c74377", + "last_modified": 1763987781981 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "strava-feed-filter-inc21@github.com:2.3.2", + "@calm-media-downloader:1.0", + "@calm-media-downloader:1.1", + "@calm-media-downloader:1.1.1", + "{0f0f343a-f745-4aec-bc04-632d07becfb4}:1.0" + ] + }, + "schema": 1763950542381, + "key_format": "{guid}:{version}", + "stash_time": 1763966106883, + "id": "5317be85-10b1-4db1-a33b-a78639e3c4ba", + "last_modified": 1763966194407 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "autofullscreen-v2@bruno.tv:2.1", + "autofullscreen@bruno.tv:1.0", + "{36b7f7b8-92cd-4fe0-a53e-3f86d90a6c3c}:12.8.1", + "@basketfi-ppg-column:1.0", + "{665608c0-9d3a-4cfe-a5b6-1740104c952b}:1.0", + "rickroll@unknown.com:1.0", + "minimal-snippet-runner@example:3.1.0", + "youtube-levelup@tn3w:1.0.1", + "{a8f4c9e2-7b3d-4f1a-9c8e-2d5f6a1b3c4e}:2.3.2", + "rms-addon@micromax.com.au:1.0.8" + ] + }, + "schema": 1763922987816, + "key_format": "{guid}:{version}", + "stash_time": 1763944505369, + "id": "a46b84a7-0cb1-4bf3-92c1-5e968e3b20e4", + "last_modified": 1763944579488 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:20.2.0", + "enhancer@goldenfox.com:20.1.8", + "k6341332@gmail.com:1.6", + "send-to-qbittorrent@example.com:1.3.0", + "send-to-qbittorrent-dynamicpaths@dareeo.hu:1.3.0", + "msp2-extension@cbkdz:1.0.13", + "msp2-extension@cbkdz:1.0.17", + "msp2-extension@cbkdz:1.0.14", + "msp2-extension@cbkdz:1.0.11", + "msp2-extension@cbkdz:1.0.12", + "msp2-extension@cbkdz:1.0.6", + "msp2-extension@cbkdz:1.0.5", + "msp2-extension@cbkdz:1.0.8", + "msp2-extension@cbkdz:1.0.4", + "msp2-extension@cbkdz:1.0.18", + "msp2-extension@cbkdz:1.0.15", + "msp2-extension@cbkdz:1.0.3", + "msp2-extension@cbkdz:1.0.19", + "msp2-extension@cbkdz:1.0.20", + "k6341332@gmail.com:1.1", + "insta-auto@veromento.com:2.1", + "magrid-startpage@magrid.com:1.7.3", + "k6341332@gmail.com:1.2", + "k6341332@gmail.com:1.3", + "msp2-extension@cbkdz:1.0.21", + "minimal-snippet-runner@example:2.4.5", + "msp2-extension@cbkdz:1.0.1", + "msp2-extension@cbkdz:1.0.23", + "msp2-extension@cbkdz:1.0.22", + "msp2-extension@cbkdz:1.0.24", + "instagram-progressbar@example.com:1.0" + ] + }, + "schema": 1763901381271, + "key_format": "{guid}:{version}", + "stash_time": 1763922905973, + "id": "50fdcf24-fc43-42c7-b3c1-6a0fce3ff640", + "last_modified": 1763922987622 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "positionner-rouleau@sid.dev:1.0", + "@cuRRyX:1.0.1", + "play-on-house-system@example.com:0.4", + "rg@fmaes.com:1.3", + "Android@bravenhancer.com:20.1.9" + ] + }, + "schema": 1763879789801, + "key_format": "{guid}:{version}", + "stash_time": 1763901304946, + "id": "fdd482f2-cb5d-4f44-92e5-da2301b58b6a", + "last_modified": 1763901381014 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "easyvista-login-addon@luma.local:1.4.0", + "{8f3a6c2d-9b4e-4f7a-b8d1-3c5e9a2f6b7d}:1.0.0" + ] + }, + "schema": 1763864140577, + "key_format": "{guid}:{version}", + "stash_time": 1763879706312, + "id": "4a461e74-2015-408c-ae25-69079ba06582", + "last_modified": 1763879789595 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{0fe7b3a9-18c9-4aca-8dfb-3c39b521b0f8}:1.0", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:5.9.9.8", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.7", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.6", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.5", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.4", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.3", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.2", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:6.0.0.1", + "{e78ea5c1-6253-4ae2-bbb6-dc4ee5aa0054}:5.9.9.9", + "Android@bravenhancer.com:20.1.7", + "enhancer@goldenfox.com:20.1.7", + "Android@bravenhancer.com:20.1.8", + "itsreal-free@jouwdomein.com:2.5.0", + "itsreal-free@jouwdomein.com:1.0", + "itsreal-free@jouwdomein.com:1.2", + "itsreal-free@jouwdomein.com:1.5", + "itsreal-free@jouwdomein.com:1.7", + "itsreal-free@jouwdomein.com:1.8", + "itsreal-free@jouwdomein.com:1.9", + "itsreal-free@jouwdomein.com:1.10", + "itsreal-free@jouwdomein.com:1.11", + "itsreal-free@jouwdomein.com:2.0.0", + "itsreal-free@jouwdomein.com:2.2.0", + "itsreal-free@jouwdomein.com:2.3.0", + "itsreal-free@jouwdomein.com:2.4.0", + "itsreal-free@jouwdomein.com:2.4.1", + "itsreal-free@jouwdomein.com:2.4.2", + "instagram-media-downloader@accounts.firefox.com.kitten217.simplelogin.com:1.0.0", + "instagram-media-downloader@accounts.firefox.com.kitten217.simplelogin.com:1.1.0", + "instagram-media-downloader@accounts.firefox.com.kitten217.simplelogin.com:1.2.0", + "noreplygcheater@gmail.com:1.25.11.2", + "{96b8aaaf-61c1-47e2-8221-5423896b8721}:1.0", + "{7fd68200-300f-480b-8244-8437e57ef58f}:1.0", + "{7fd68200-300f-480b-8244-8437e57ef58f}:1.1", + "chinesepod-filter-mobile@example.com:1.2" + ] + }, + "schema": 1763836588333, + "key_format": "{guid}:{version}", + "stash_time": 1763858106053, + "id": "8a39a523-24dd-4e67-8e53-009887be5c0a", + "last_modified": 1763858191942 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{413e73f4-7407-4948-b6be-e2d7c0daaaf6}:1.0", + "my-prompt-jumper@local-user:1.5", + "autofill-cesi@exemple.com:1.0", + "Android@bravenhancer.com:20.1.5", + "enhancer@goldenfox.com:20.1.5", + "@M-Plugin.Fx-test:4.0.0", + "@M-Plugin.Fx-test:4.0.1" + ] + }, + "schema": 1763814992307, + "key_format": "{guid}:{version}", + "stash_time": 1763836506601, + "id": "fa23c462-586f-4cff-996d-17f16f14ea09", + "last_modified": 1763836588106 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{8d09f69e-4796-4286-b792-f575dc72be7c}:0.1.0", + "matt-pro-translations@extension:1.0", + "{e1141423-b1b6-4358-b7a5-06f61703bf8e}:1.0", + "{e1141423-b1b6-4358-b7a5-06f61703bf8e}:1.1", + "hoaxchecker@dontbehoaxed.net:1.0", + "hoaxchecker@dontbehoaxed.net:1.1", + "hoaxchecker@dontbehoaxed.net:1.2", + "{4137fa1a-958c-436d-bdad-ab7e4373f777}:1.0", + "tab-unloader-fork@js:2025.1.2", + "{042349e9-a9c1-418f-999e-8ffa69725767}:1.0" + ] + }, + "schema": 1763793390507, + "key_format": "{guid}:{version}", + "stash_time": 1763814906515, + "id": "11a61ccb-c299-4fd4-9a59-60eff68bef00", + "last_modified": 1763814992130 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "chatgpt-diagram-renderer@enzo:1.0.1", + "{6216583e-537f-4eec-b8fe-51373a4daf87}:1.0", + "v2tabsalpha@soulhotel.net:0.1", + "v2tabsalpha@soulhotel.net:0.1.1" + ] + }, + "schema": 1763777742631, + "key_format": "{guid}:{version}", + "stash_time": 1763793306393, + "id": "18bef4bb-f8e1-4499-a6a9-c534667b5523", + "last_modified": 1763793390316 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jackett@local:1.4", + "jackett@local:1.0", + "jackett@local:1.2", + "jackett@local:1.5", + "Android@bravenhancer.com:20.1.4", + "enhancer@goldenfox.com:20.1.4", + "{df1bc263-b49b-4f70-912b-86f513379ab5}:1.0" + ] + }, + "schema": 1763750189766, + "key_format": "{guid}:{version}", + "stash_time": 1763771706014, + "id": "a221b255-06bd-4670-b3a8-1e16623d245e", + "last_modified": 1763771787376 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "dreamflore-protection@votreemail.com:1.0", + "dreamflore-protection@votreemail.com:1.2", + "dreamflore-protection@votreemail.com:1.3", + "alldebrid-magnet-uploader@test.com:2.1", + "alldebrid-magnet-uploader@test.com:2.0", + "admin@pepeizqdeals.com:0.2", + "admin@pepeizqdeals.com:0.3", + "admin@pepeizqdeals.com:0.6", + "admin@pepeizqdeals.com:0.10", + "yahoo-realtime-filter@example.com:2.1", + "digg-toolbar-noamo@giggity:1.4.1", + "jackett@local:1.1" + ] + }, + "schema": 1763746842355, + "key_format": "{guid}:{version}", + "stash_time": 1763750106417, + "id": "9e0b40f4-740c-455d-bf51-8e6070c6272e", + "last_modified": 1763750189516 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{0ce913ad-da64-4b44-b611-92eeb822608b}:1.0", + "case-analyzer@ibm:1.0.0", + "abwlfazl.musavi@gmail.com:2.3.5", + "{c07d6030-854c-4789-a605-1234567890ab}:3.4.0", + "wykop-anty-ciotodron@dodatek:1.3", + "{c07d6030-854c-4789-a605-1234567890ab}:3.3.0" + ] + }, + "schema": 1763706980555, + "key_format": "{guid}:{version}", + "stash_time": 1763728506951, + "id": "ed8fff72-7074-408e-a47e-2debaa402c45", + "last_modified": 1763728590860 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{d91fd58f-32fc-463e-95b9-a01babac6173}:1.0", + "abwlfazl.musavi@gmail.com:2.2", + "abwlfazl.musavi@gmail.com:2.3", + "abwlfazl.musavi@gmail.com:2.0", + "abwlfazl.musavi@gmail.com:2.3.1", + "{d397d53a-5a91-4a30-8de4-bc8613396637}:1.0", + "abwlfazl.musavi@gmail.com:2.3.2", + "color_code_tab_groups@luascfl:1.0.0", + "color_code_tab_groups@luascfl:1.0.1", + "color_code_tab_groups@luascfl:1.0.2", + "{28eaaf58-0e26-468f-9ae1-a8f1016ef95b}:1.0", + "tab-group-shortcut@luascfl:1.0.0", + "{61896442-aaba-403f-954e-7535cdd47e3b}:1.0" + ] + }, + "schema": 1763691341863, + "key_format": "{guid}:{version}", + "stash_time": 1763706905292, + "id": "1868d680-884e-4289-86b1-c32e49253d43", + "last_modified": 1763706980337 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "g-like-hotkey@private-dev.org:1.0", + "g-like-hotkey@private-dev.org:1.1", + "browse@bgrove.com:4.3.1.8", + "browse@bgrove.com:4.3.1.9", + "multi-autocomplete-helper@example.com:1.0.0", + "{67cabb1a-818f-498a-9271-956cb4b4dc63}:1.0.4", + "{67cabb1a-818f-498a-9271-956cb4b4dc63}:1.0.3", + "@tab-archive.hasanemre.ayyildiz:1.0.0", + "@tab-archive.hasanemre.ayyildiz:1.0.1", + "thisis.kashakov@gmail.com:3.3.23" + ] + }, + "schema": 1763663788949, + "key_format": "{guid}:{version}", + "stash_time": 1763685305370, + "id": "6fef790c-08ba-45b0-a0da-e8db12582cff", + "last_modified": 1763685379170 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "kinozalhelper@elektrikis.id.lv:3.5.2", + "procure@integrate.com:1.4", + "procure@integrate.com:1.4.1", + "webclipper@0xbasinas.dev:0.1.0", + "y05@yuqidata.com:1.0", + "y05@yuqidata.com:1.22", + "y05@yuqidata.com:1.41", + "y05@yuqidata.com:1.43", + "y05@yuqidata.com:1.44", + "y05@yuqidata.com:1.45", + "y05@yuqidata.com:1.46", + "y05@yuqidata.com:1.47", + "y05@yuqidata.com:1.48", + "y05@yuqidata.com:1.49", + "alldebrid-magnet-uploader@example.com:1.2", + "wdssss@bgegeg:1.0", + "{7954b6c0-1595-4d16-96c7-93a738fdaa02}:5.0.0", + "{61366c2b-37db-4311-ac04-96554462b0a5}:5.0.0", + "antyciotodron@wykop.pl:2.0", + "ydiaz@hiredexperts.com:1.0", + "ydiaz@hiredexperts.com:1.0.1", + "antyciotodron@wykop.pl:2.1", + "{10C91BAC-3FC5-11EE-91D1-9D987634574E}:4.3.6", + "magnolia@12.34:4.2.4.8" + ] + }, + "schema": 1763642179605, + "key_format": "{guid}:{version}", + "stash_time": 1763663705811, + "id": "5812f821-7c14-4f02-b8c8-04776f218906", + "last_modified": 1763663788689 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "bubblepop@developer:0.3", + "Android@bravenhancer.com:20.1.2", + "enhancer@goldenfox.com:20.1.2", + "Android@bravenhancer.com:20.1.3", + "enhancer@goldenfox.com:20.1.3", + "{c8fbfe20-5905-4de2-8500-8a19a3b9c59b}:0.0.1", + "{57c3f4e7-dab1-4ede-b695-92d9cea05b8f}:1.0.0", + "{5da1a17d-44e3-4d64-964c-5c1b3f3b01f7}:4.0" + ] + }, + "schema": 1763620580000, + "key_format": "{guid}:{version}", + "stash_time": 1763642105285, + "id": "a4216467-1dec-45d3-af16-ede8ea81b743", + "last_modified": 1763642179399 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "google-classic-search@example.com:1.3", + "pubpeer-cookie-injector@example.com:1.0.1", + "studpidaddon@jmenbalance.fr:0.1" + ] + }, + "schema": 1763604943597, + "key_format": "{guid}:{version}", + "stash_time": 1763620505625, + "id": "f1bcc80e-e73c-41f7-96df-926e2d151642", + "last_modified": 1763620579779 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{eb6884bd-baa3-46c9-8638-57dede47b8c8}:2.8", + "diy-youtube-not-interested@example.com:0.1", + "diy-youtube-not-interested@example.com:0.2", + "{317b5ed3-5e76-46d6-999c-dc10520f3eea}:1.0", + "{51bbbf12-d259-4019-82ee-1ef5b7b85288}:1.0", + "{81404bfd-4b89-4b61-bd67-d7cd9d5f3b90}:1.0", + "{c53432bc-a88b-4671-ba7b-ef1254e7bf13}:1.0", + "{df8b8708-4ccd-4064-b98b-db5ecd2e88c0}:1.0", + "{0d0730fa-0706-47f8-8cec-834f0a708ba9}:1.0", + "{44a7902b-f6c1-483f-b4df-6c9e9cd18e84}:1.0", + "{6a53583b-f0ba-4779-a503-ef74c4bb9970}:1.0", + "alldebrid-magnet-uploader@example.com:1.0", + "alldebrid-magnet-uploader@example.com:1.1", + "page-drawing-extension@mete:1.1", + "page-drawing-extension@mete:1.2" + ] + }, + "schema": 1763577397762, + "key_format": "{guid}:{version}", + "stash_time": 1763598905171, + "id": "df2e4e21-a3de-4bf5-9a1a-e85716420ffa", + "last_modified": 1763598981134 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{e6290c04-fee7-4bce-ba4e-efa9fed1c73e}:1.0", + "{c6547964-46d5-4a0d-900b-b50aa2600d57}:0.1.2", + "{66a0b77f-7080-4a2f-aa4d-a4ab49723c20}:2.0.0", + "{cfd3c5c2-31ec-55ff-a28e-df38357d02d9}:2.5", + "mynotes@example.com:2.0.0", + "{c6547964-46d5-4a0d-900b-b50aa2600d57}:0.2.0", + "notes@notes.notes:3.0.0", + "hidesuggestions@example.com:1.0", + "{6a2a4738-8654-450b-b068-801e909d052e}:1.0", + "firepage@example.com:1.1", + "x-to-fixvx@example.com:1.1", + "msp2-userscript-manager@dolo.local:1.0.1", + "plutotwo-2025@dolo.local:2025.2.2", + "plutotwo-2025@dolo.local:2025.2.7" + ] + }, + "schema": 1763555781416, + "key_format": "{guid}:{version}", + "stash_time": 1763577306313, + "id": "1399f935-31f7-4fba-807c-4bc0b2b6b25c", + "last_modified": 1763577397495 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "VueCrack-Firefox-2025@Niemi.com:1.4", + "VueCrack-Firefox-2025@Niemi.com:1.4.1", + "{3e944c0a-2e3b-4d82-b144-7f022b67ef50}:1.0.0", + "{3e944c0a-2e3b-4d82-b144-7f022b67ef50}:1.1.0", + "@Extension.HotPocket.BTHLabs:25.11.19.0", + "@Extension.HotPocket.BTHLabs:25.9.12", + "@Extension.HotPocket.BTHLabs:25.11.12", + "@Extension.HotPocket.BTHLabs:25.11.18", + "anydesk-connect@example:1.1.0", + "booth-searcher@cosmoluv.dev:4.0.0", + "booth-searcher@cosmoluv.dev:4.0.1", + "booth-searcher@cosmoluv.dev:4.0.2", + "booth-searcher@cosmoluv.dev:4.0.4", + "booth-searcher@cosmoluv.dev:4.1.3", + "booth-searcher@cosmoluv.dev:4.1.4", + "booth-searcher@cosmoluv.dev:4.1.5" + ] + }, + "schema": 1763534190496, + "key_format": "{guid}:{version}", + "stash_time": 1763555705239, + "id": "53a56cca-1d7d-44ea-a348-b59e507e6173", + "last_modified": 1763555781245 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "favory@sp4ce.pw:1.1.6", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.7", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.8", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.9", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.10", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.11", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.12", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.13", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.14", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.15", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.17", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.18", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:1.1.19", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.0.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.1.2", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.2.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.3.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.4.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.5.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.6.0", + "{d783f67c-4dea-4d64-bfc2-1d4a6057babe}:2.6.1", + "ntfy-monitor@benkhouya.com:1.0", + "ntfy-monitor@benkhouya.com:1.1", + "ntfy-monitor@benkhouya.com:1.2", + "ntfy-monitor@benkhouya.com:1.3", + "multiopen@example.com:3.8" + ] + }, + "schema": 1763518541233, + "key_format": "{guid}:{version}", + "stash_time": 1763534106238, + "id": "71a439b1-ac92-40f6-93fd-4c0218dc1bc7", + "last_modified": 1763534190313 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "audio-speed-pitch@castledking.com:1.0.1", + "{0e744615-ab4e-429a-917c-ec4b1399ac60}:1.0", + "{425cb0d4-c395-46ef-a226-a440a4a814fd}:1.0", + "{425cb0d4-c395-46ef-a226-a440a4a814fd}:1.0.1", + "{86f539bd-bd1e-49c3-8de0-f1ce87edead1}:1.0" + ] + }, + "schema": 1763490979616, + "key_format": "{guid}:{version}", + "stash_time": 1763512505361, + "id": "22aa9a55-3d26-4a47-b211-1935eccc20c3", + "last_modified": 1763512579172 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{b0c8f7b1-3015-4bcf-6159-97b1855cc1d9}:13.3.0", + "download-filter@ilfa.local:1.0.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.9", + "logzio-validator@form3.tech:1.0.1.0", + "{2b925d8d-404d-488c-8369-17ca6628c771}:1.0.6" + ] + }, + "schema": 1763469386492, + "key_format": "{guid}:{version}", + "stash_time": 1763490905661, + "id": "2bc9df5a-e3d6-4db0-954b-64663fd035c2", + "last_modified": 1763490979451 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "vidmoldsa@local:1.2", + "moodle-interceptor@example.com:2.0", + "u8061@example.jp:1.0", + "u8061@example.jp:1.0.1", + "{888e71e2-eb4d-4d74-a82c-6ae72291f6d6}:1.9.4", + "{c7cc7ff5-7b3b-41be-bcf4-10490c2e6c8f}:8.2.4", + "{295f26bd-f3b1-4746-98b3-71de626e29bb}:8.2.4", + "{5654a40f-b055-411e-a667-9231a33a1ee0}:8.2.3", + "{e88942a7-0e4d-4620-95fd-b394c07d0fd4}:8.2.3", + "rezervasyon@local.addon:1.0.0", + "{bdb69adc-1b60-4bc5-a59e-c6f3bad5553c}:8.2.2", + "{43038b21-76ee-4e85-b970-50cab769a6db}:8.2.4", + "@adwaita:1.0", + "{cdf9c9e3-50fe-4056-a0c6-4df438ce0e04}:1.0", + "{036eb51a-613b-4a1f-8c4f-5344b3bcd539}:1.0", + "{a3c2f04d-bbc6-47e6-be41-86c3c74c9841}:1.0", + "{ecbbce55-68a7-45cf-a82d-5cb5d212da08}:1.0", + "{fdccb55d-4b45-4706-90d2-1501397725cd}:1.0", + "{351764ab-45f9-49e3-b4dd-416a4797867f}:1.0", + "{5e9e93c6-d37d-49af-ba2e-aa4d7833a518}:1.0", + "{1f7a4640-fba0-4df6-bd30-015487f7547c}:1.0", + "{942d64bd-2f8e-4776-a0dc-669df66ab0fc}:1.0", + "{4768bd5c-41a6-4708-8942-1394b68855b6}:1.0", + "{6c35f942-2536-4a81-adc3-291af179a70f}:1.0", + "{f4e2879e-a91b-4709-a320-932d2d2ec059}:1.0", + "{6a8cf876-26ff-471a-b2fd-15836f3a7f06}:1.0", + "search-trakt@example.com:1.0", + "stockmanager@gmx.de:2024.1014", + "stockmanager@gmx.de:2025.1000", + "stockmanager@gmx.de:2025.1001", + "stockmanager@gmx.de:2025.1002", + "stockmanager@gmx.de:2025.1003", + "stockmanager@gmx.de:2025.1004", + "cronometro-icono@example.com:1.6", + "open-selected-url@local:1.0", + "{ee3d5c7c-da48-418e-904b-b363b122b354}:3" + ] + }, + "schema": 1763432147484, + "key_format": "{guid}:{version}", + "stash_time": 1763469305627, + "id": "204fcdba-5034-4590-9477-2fba312ccfbc", + "last_modified": 1763469386060 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f78142df-87db-4eab-8c7a-39835597174d}:1.0", + "asus-router-button@hellwig.me:1.5", + "{8a6a7ac6-9681-414e-b423-6dac03100e08}:1.0" + ] + }, + "schema": 1763404579814, + "key_format": "{guid}:{version}", + "stash_time": 1763426107309, + "id": "73b4b1bb-1d1f-4f52-bab7-f8e32e81fb28", + "last_modified": 1763426194927 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{d0b40768-bc5a-4621-9c4f-6bb8c0a6f7dd}:1.0", + "epsonprinter-button@hellwig.me:1.3", + "epsonprinter-button@hellwig.me:1.2", + "{290a6948-1b8f-44ad-aa1a-576a60069482}:2.8.0.1", + "{290a6948-1b8f-44ad-aa1a-576a60069482}:2.8.0.2", + "{9d5d842c-55eb-4e34-a71e-f41c38daef24}:1.0.0", + "{edfc63b3-fc9b-4b6b-b9bf-4561ad548044}:2.2.0", + "luisfdzlatofski@gmail.com:5.1", + "zero-homepage@tuemail.com:1.1", + "{9d7b266a-9484-42d3-a1ef-ec87ee4fa0e1}:1.3.6", + "{c55e7447-eb41-400b-8b22-6bb01a662444}:1.0", + "{c55e7447-eb41-400b-8b22-6bb01a662444}:2.0", + "{5b30c63c-fa83-4c6f-b588-318c1b3962c7}:1.0", + "{12de4081-11c3-4eb0-93ec-fc577b33b1e4}:1.1", + "{0f130809-3203-4ef4-885d-e5d1da906bbb}:1.0", + "{7c8e0b42-6c46-46dd-81d3-b92f022f297f}:1.0", + "{5cb7a47b-6dc3-45f4-a010-274847f3f85f}:1.0", + "{c779c854-100e-475c-804d-f43c3c28656f}:5.33", + "{670483ed-98cc-4f4a-8710-8b8305a615ad}:5.33", + "oabphaconndgibllomdcjbfdghcmenci@chrome-store-foxified-527448872:1.2.15" + ] + }, + "schema": 1763382987234, + "key_format": "{guid}:{version}", + "stash_time": 1763404505139, + "id": "c7740301-f565-4cd2-97c7-963e72945aed", + "last_modified": 1763404579537 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Butaaa.inbox@gmail.com:1.1.0", + "Butaaa.inbox@gmail.com:1.2.2", + "Butaaa.inbox@gmail.com:1.2.3", + "brouf@example.com:1.2", + "{2d2d2c57-39c9-48bb-b8ae-b7656296b12d}:1.0", + "Butaaa.inbox@gmail.com:1.2.4", + "r9gvj86m0s@Manual_CRXInstaller:5.3.0", + "r9gvj86m0s@Manual_CRXInstaller:5.3.1", + "r9gvj86m0s@Manual_CRXInstaller:5.3.2", + "r9gvj86m0s@Manual_CRXInstaller:5.3.3", + "magnetar@wanxing.com:5.3.0", + "magnetar@example.com:5.3.0", + "magnetar@yourdomain.com:5.3.0", + "container-782-warning@logistik3.local:1.0", + "{8f9c9f60-4d4a-4c6b-9b3c-2d7a9f6b1e23}:2.1.0", + "{51c0848e-9d21-4587-9f88-c14eacd5ff9a}:1.2.1.7", + "site-time-limit@hasizume.local:1.0" + ] + }, + "schema": 1763361380297, + "key_format": "{guid}:{version}", + "stash_time": 1763382905714, + "id": "7e7cf991-e037-46e9-8ca4-4d4252ae36f8", + "last_modified": 1763382987052 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{0769574b-9140-4c7e-a239-0733619d3819}:1.0", + "{d1a75c5d-0961-41ff-8212-f72056233ab9}:2.0", + "{d1a75c5d-0961-41ff-8212-f72056233ab9}:1.0", + "{d1a75c5d-0961-41ff-8212-f72056233ab9}:3.0", + "{11f0065a-3664-4380-82a3-db944b6f090d}:1.0", + "twitch-vod-unmute@example.com:1.1.4", + "{db272844-ce14-4416-8e70-cc2a7360c299}:1.0", + "{815d24fc-4654-42d9-bcbc-1d39f3985e1d}:1.0", + "{815d24fc-4654-42d9-bcbc-1d39f3985e1d}:2.0", + "{815d24fc-4654-42d9-bcbc-1d39f3985e1d}:3.0", + "{815d24fc-4654-42d9-bcbc-1d39f3985e1d}:4.0", + "vidmoly-helpera54fed@local:1.2", + "vidmoly-dsa@local:1.2", + "multiopen@example.com:3.3", + "multiopen@example.com:3.7" + ] + }, + "schema": 1763345743233, + "key_format": "{guid}:{version}", + "stash_time": 1763361305255, + "id": "ec39eb6c-43e4-4da6-a123-f70fc96fc7ce", + "last_modified": 1763361380116 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "brouf@example.com:1.1", + "muc3-dashboard@example.com:1.0", + "muc3-dashboard@example.com:1.1", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.1", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.2", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.1", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.2", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.3", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.4", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.5", + "{702a8852-33bf-4a11-aed0-b76437c3ae2b}:0.3.6", + "favory@sp4ce.pw:1.1.5", + "{6102d8aa-4450-474a-8aaa-a2980ee0492b}:1.0" + ] + }, + "schema": 1763318178876, + "key_format": "{guid}:{version}", + "stash_time": 1763339707956, + "id": "7294d09a-f9a8-44a4-afc1-2f0856ee336f", + "last_modified": 1763339794926 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "f0xss@example.com:1.1", + "f0xss@example.com:1.0", + "f0xss@example.com:1", + "autofill-modern@example.com:1.3", + "{64346286-3e63-48bc-a80b-5f1d00c9da3b}:1.0", + "{c5f5c4ac-8b37-49a3-9687-f86859324544}:1.0", + "{c5f5c4ac-8b37-49a3-9687-f86859324544}:1.0.1", + "{c5f5c4ac-8b37-49a3-9687-f86859324544}:1.0.2", + "{c5f5c4ac-8b37-49a3-9687-f86859324544}:1.0.3" + ] + }, + "schema": 1763296579722, + "key_format": "{guid}:{version}", + "stash_time": 1763318105210, + "id": "3de9626e-492d-40ce-be09-16fd7b1d746c", + "last_modified": 1763318178708 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{7fa78dfb-aad9-4cf6-9804-ae4dd759a252}:1.0", + "{c4bf14c6-bc23-4803-8306-155a0295dce5}:1.0", + "addon-e9e52831@local:1.0", + "favory@sp4ce.pw:1.0.9", + "favory@sp4ce.pw:1.1.0", + "favory@sp4ce.pw:1.1.1", + "favory@sp4ce.pw:1.1.2", + "favory@sp4ce.pw:1.1.3", + "favory@sp4ce.pw:1.1.4" + ] + }, + "schema": 1763274982644, + "key_format": "{guid}:{version}", + "stash_time": 1763296505171, + "id": "ec74b17c-b1bc-4bc8-b33b-64b0bc770665", + "last_modified": 1763296579419 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f37944d2-0050-4e10-a36b-e573ebfb8800}:1.0.7", + "manhuaseriesdownloader.python@example.com:7.0", + "manhuaseriesdownloader.python@example.com:7.1", + "manhuaseriesdownloader.python@example.com:7.2", + "astian-privacy@astian.org:1.1.0.1", + "astian-privacy@astian.org:2.0", + "astian-privacy@astian.org:2.0.1", + "astian-privacy@astian.org:2.0.2", + "astian-privacy@astian.org:2.0.3", + "manhuaseriesdownloader.python@example.com:7.3", + "multiopen@example.com:3.5", + "multiopen@example.com:3.6" + ] + }, + "schema": 1763259345837, + "key_format": "{guid}:{version}", + "stash_time": 1763274904946, + "id": "068066c1-7af1-4ee3-bac3-a7761747153f", + "last_modified": 1763274982480 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:20.0.5", + "enhancer@goldenfox.com:20.0.5", + "{8aaee12b-5764-4012-a93b-cdee7fb1136e}:1.7", + "yt-long-playlist@example.com:1.0.0", + "yt-long-playlist@example.com:1.9.0", + "coin-counter@example:1.1.1", + "{bbb0df11-b3d0-4423-8100-393ed4458ce3}:1.2.4resigned1", + "antiusonly@extension:1.1.0" + ] + }, + "schema": 1763231779104, + "key_format": "{guid}:{version}", + "stash_time": 1763253304864, + "id": "630bcc25-aa51-4b6c-9358-5aade2051945", + "last_modified": 1763253379167 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{86022c6f-35b6-4542-ac2d-739566632970}:0.8.2", + "{f9f70ceb-7676-42c5-9b71-08e1512796bb}:0.8.2", + "eklv@example.com:1.0", + "i-just-want-to-install-new-version-of-extension@pleasework.com:1.9.12", + "ff-tabunloader@smell.flowers:2" + ] + }, + "schema": 1763210189424, + "key_format": "{guid}:{version}", + "stash_time": 1763231705357, + "id": "5bd226e7-ae1a-4f9f-8942-6ff50b1e2a41", + "last_modified": 1763231778846 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3682952e-46db-469a-82a1-3102296766da}:1.0", + "playlist-viewer-fix@your-username.com:1.0", + "playlist-viewer-fix@your-username.com:1.1", + "{1830e313-1cb6-4b77-8a50-26a25b88dccc}:1.0", + "playlist-viewer-fix@your-username.com:1.2" + ] + }, + "schema": 1763188583383, + "key_format": "{guid}:{version}", + "stash_time": 1763210106286, + "id": "6ed0e9e8-f928-4efd-890d-7720fe61e004", + "last_modified": 1763210189208 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "calculator@digitalvoivode.com:1.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.8" + ] + }, + "schema": 1763172957207, + "key_format": "{guid}:{version}", + "stash_time": 1763188505407, + "id": "128e9953-04d3-4826-9388-ee4f94e37e2d", + "last_modified": 1763188583205 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "easyform@example.com:1.1.1", + "easyform@example.com:1.0.0", + "easyform@example.com:1.1.0", + "easyform@example.com:1.1.2", + "asus-router-button@example.com:1.0", + "remove-container-piano@example.com:1.0.0", + "@lenti-ff:0.0.9", + "@lenti-ff:0.0.7-fix", + "{3f08b2a9-9d17-4c42-9a2f-92a207bbd001}:1.1", + "{4bff6036-064e-4903-bcfc-5ef4001f4cae}:2.1.1" + ] + }, + "schema": 1763145380190, + "key_format": "{guid}:{version}", + "stash_time": 1763166905238, + "id": "9194c170-0a5b-4e5b-9ab4-a6e5ee4d4e73", + "last_modified": 1763166981903 + }, + { + "stash": { + "blocked": [ + "{4f309a6b-6b94-46dd-b787-570b2278e8cd}:1.0", + "{4b0eaee9-bcbf-46d0-be5e-3e7527815cd6}:1.0", + "{182ace6e-df11-462e-b015-7a1647281503}:1.0" + ], + "unblocked": [], + "softblocked": [ + "bitbucket-diff-scanner@newfold.com:1.0", + "{3b476c81-ee34-4c7c-9aeb-8b1dd4f4e97c}:1.0", + "qrtracker@qrtracker.io:1.1.4", + "qrtracker@qrtracker.io:1.1.5", + "qrtracker@qrtracker.io:1.1.6", + "intellidraft@example.com:1.0.0", + "{8C23CBC2-EB21-4075-99F5-8F548C1927B2}:2.1", + "{8C23CBC2-EB21-4075-99F5-8F548C1927B2}:2.2", + "{8C23CBC2-EB21-4075-99F5-8F548C1927B2}:3.0", + "{8C23CBC2-EB21-4075-99F5-8F548C1927B2}:2.0", + "{8C23CBC2-EB21-4075-99F5-8F548C1927B2}:1.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.7", + "{ea5d9ee8-8e36-42bf-b325-5d7c549f35f2}:1.0", + "{81dce488-6b41-4754-ae71-ff1f7854119a}:1.0" + ] + }, + "schema": 1763123788106, + "key_format": "{guid}:{version}", + "stash_time": 1763145305728, + "id": "25d37504-1170-4a5f-b1b6-9dc168146dc9", + "last_modified": 1763145379980 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@ublacklist.local:8.12.0", + "@ublacklist.local:9.0.2", + "oci-ocid-redirector@OneViewSearch:1.0.0" + ] + }, + "schema": 1763102193154, + "key_format": "{guid}:{version}", + "stash_time": 1763123706088, + "id": "258d5c5e-b247-4ce8-bde6-a4e0838ba08f", + "last_modified": 1763123787993 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "alfonsodaniello@blu.it:0.1.3", + "alfonsodaniello@blu.it:0.1.2", + "alfonsodaniello@blu.it:0.1.1", + "alfonsodaniello@blu.it:0.1.0", + "jira-gitlab-mr-links@limonkufu.com:1.1", + "remove-tweet-view-count@murilocarrijosilva.com:1.0", + "tensor-art-downloader-a3eb989bf6544ba5@local:2.0", + "tensor-art-downloader-4db542ff@local:2.0", + "tensor-art-downloader@example.com:2.0" + ] + }, + "schema": 1763086546752, + "key_format": "{guid}:{version}", + "stash_time": 1763102106300, + "id": "5c4a8f60-6290-4e60-b27d-78587dc02128", + "last_modified": 1763102192943 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "kinozalhelper@elektrikis.id.lv:3.4.0", + "customtab@deividcode.com:3.0.8", + "kinozalhelper@elektrikis.id.lv:3.3.0", + "{05089092-ac99-419b-9b5c-94940cc6197e}:1.2", + "{05089092-ac99-419b-9b5c-94940cc6197e}:1.31", + "hide-collection-only-ebay@firefox.ecc.im:1.5.2.1" + ] + }, + "schema": 1763058989668, + "key_format": "{guid}:{version}", + "stash_time": 1763080505211, + "id": "5c738569-0bb2-4461-b278-f0ef648130f7", + "last_modified": 1763080579887 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "novel-downloader@RighteousW.com:1.0.0", + "derpi-numbers@example.com:1.0", + "derpi-numbers@example.com:1.1", + "epreuveSantorin@santorin.com:1.1", + "netskope-isolation-management@yourdomain.com:1.0", + "{52c96c2c-df1a-45c3-b5e5-ec5d4111ce8d}:241029.1", + "visibilityblocker@example.com:1.0", + "egas.torres@gmail.com:2.2" + ] + }, + "schema": 1763037391746, + "key_format": "{guid}:{version}", + "stash_time": 1763058906327, + "id": "f9deef85-a8b4-4069-91dd-dc28c585556e", + "last_modified": 1763058989481 + }, + { + "stash": { + "blocked": [ + "{f350fb55-0f0f-455b-a250-84ecd8e9c1c2}:1.0.5", + "{f350fb55-0f0f-455b-a250-84ecd8e9c1c2}:1.5", + "{f350fb55-0f0f-455b-a250-84ecd8e9c1c2}:1.6", + "{f350fb55-0f0f-455b-a250-84ecd8e9c1c2}:1.7" + ], + "unblocked": [], + "softblocked": [ + "{7ace9190-33ca-4ebe-bd61-6bca5ddf4cb5}:0.1", + "jiojiojohn@gmail.com:3.0.2" + ] + }, + "schema": 1763015790096, + "key_format": "{guid}:{version}", + "stash_time": 1763037306207, + "id": "b1aa0939-6a5f-434a-8836-0da13a368cd4", + "last_modified": 1763037391626 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "elpump99-photo@elpump.xyz:1.0", + "{79bff8f6-3b47-498b-b3f9-e38fa3a298aa}:1.0.1", + "{79bff8f6-3b47-498b-b3f9-e38fa3a298aa}:1.0.2", + "Android@bravenhancer.com:20.0.3", + "Android@bravenhancer.com:20.0.2", + "Android@bravenhancer.com:20.0.4A", + "enhancer@goldenfox.com:20.0.2", + "alqrt@angel.lab:3.1", + "alqrt@angel.lab:2.3", + "alqrt@angel.lab:2.1", + "alqrt@angel.lab:2.4", + "pdf-coretax-hanim@local:3.0", + "pdf-coretax-hanim@local:3.1", + "pdf-coretax-hanim@local:3.2", + "pdf-coretax-hanim@local:3.3", + "pdf-coretax-hanim@local:3.4", + "pdf-coretax-hanim@local:3.6", + "addon-manager@luascfl:1.51" + ] + }, + "schema": 1763000149841, + "key_format": "{guid}:{version}", + "stash_time": 1763015706319, + "id": "62686962-9329-490a-a749-4714ecef371b", + "last_modified": 1763015789873 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jajca-jajca-jajca@fuckyou.com:2.3", + "ai-text-firefox@someguy.com:1.0.7", + "ai-text-firefox@someguy.com:1.0.8", + "session-grid-manager-fork@local:7.1.1", + "session-grid-manager-fork@local:7.1.1.2", + "session-grid-manager-fork@local:7.1.1.4", + "session-grid-manager-fork@local:7.1.1.6", + "@Soluna.Sytonic:1.0", + "@Soluna.Sytonic:1.1", + "addon-manager@luascfl:1.49", + "addon-manager@luascfl:1.48", + "lastfm-artwork-helper@chr1sx:1.0.9", + "addon-manager@luascfl:1.50" + ] + }, + "schema": 1762972591329, + "key_format": "{guid}:{version}", + "stash_time": 1762994106450, + "id": "196932a5-7ffa-4564-ba2a-eb0798e059b1", + "last_modified": 1762994193413 + }, + { + "stash": { + "blocked": [ + "{9df92641-0061-4227-aaa7-e4c6febaa798}:2.3.1", + "{af1e9aff-ca42-4ce3-a7fd-e6e84ca2cee7}:1.8.2", + "{335e1052-ed10-4edd-a811-6c6698ee598d}:1.7" + ], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:20.0.1", + "enhancer@goldenfox.com:20.0.1", + "{3cb0155f-44ef-4c3d-954f-f15c24ddb4fc}:0.6.90", + "{f8d65c88-f4b7-4fd3-8ad8-b4d06093dc99}:1.8.2", + "{cd3cc4a9-4555-4b4d-945b-d807a2c879c4}:1.6.4", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.0", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.1", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.2", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.7", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.8", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.3.9", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.1", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.2", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.3", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.4", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.5", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.6", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.7", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.8", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.4.9", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.0", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.1", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.2", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.3", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.4", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.5", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.6", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.7", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.5.8", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.6.0", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.6.1", + "{4cc31d29-6afb-4ab2-bf48-2fed7d5463a8}:1.6.2", + "{d0b936ab-1790-421b-90f6-e4dba22de87f}:1.1", + "{d0b936ab-1790-421b-90f6-e4dba22de87f}:1.0", + "{947b4bbf-939a-4977-94f0-7ea2c62c0dff}:1.0", + "{498f3c92-4207-4e8d-af20-269a9cbcc3eb}:0.1", + "{9f8cb3b3-93ff-418e-8064-ccbd57ab935d}:0.1", + "{79bff8f6-3b47-498b-b3f9-e38fa3a298aa}:1.0.0", + "edfjfgjklednkencfhnokmkajbgfhpon@chrome-store-foxified--520432627:0.0.4", + "{a64b02c2-169e-438b-bcd2-6f3a0897c0e8}:3.6", + "bcefgmhpbmghjcenbklchobmogjhaagl@chrome-store-foxified--520432627:0.3.5", + "gbbnddjfcllebfcnihfgmdplgaiejepc@chrome-store-foxified--520432627:1.0", + "ifmhoabcaeehkljcfclfiieohkohdgbb@chrome-store-foxified--520432627:21.1.0", + "gmbgaklkmjakoegficnlkhebmhkjfich@chrome-store-foxified--520432627:2.11", + "ndhinffkekpekljifjkkkkkhopnjodja@chrome-store-foxified--520432627:35", + "nicokganngdkmjiejngaacdlllkdpikn@chrome-store-foxified--520432627:0.1.1", + "kbhfoiaobflocffnclkigpkeoagheimn@chrome-store-foxified--520432627:2.1.1", + "mgijmajocgfcbeboacabfgobmjgjcoja@chrome-store-foxified--520432627:4.0.8", + "kdfieneakcjfaiglcfcgkidlkmlijjnh@chrome-store-foxified--520432627:2.0.7", + "pjnfggphgdjblhfjaphkjhfpiiekbbej@chrome-store-foxified--520432627:0.6.6.2", + "kjacjjdnoddnpbbcjilcajfhhbdhkpgk@chrome-store-foxified--520432627:3.8.2", + "nolijncfnkgaikbjbdaogikpmpbdcdef@chrome-store-foxified--520432627:2.6.1", + "likjafohlgffamccflcidmedfongmkee@chrome-store-foxified--520432627:0.1.2", + "oopaipoegcoodhcemiefhoeaneholpfj@chrome-store-foxified--520432627:2.1.2", + "kmmpkhpajpecmpdmmbpjmkmcmfdahkcj@chrome-store-foxified--520432627:2.9.44", + "emalgedpdlghbkikiaeocoblajamonoh@chrome-store-foxified--520432627:1.8.6", + "mclkkofklkfljcocdinagocijmpgbhab@chrome-store-foxified--520432627:5.7.0.0", + "eimadpbcbfnmbkopoojfekhnkhdbieeh@chrome-store-foxified--520432627:3.5.2", + "gfenjblodoldnbiddmggcbkcapiolbig@chrome-store-foxified--520432627:2.2.1", + "jomlpcliajpokkmgjloanlbhcmkcceoo@chrome-store-foxified--520432627:3.0.0.3", + "pfgfgjlejbbpfmcfjhdmikihihddeeji@chrome-store-foxified--520432627:1.20", + "fedimamkpgiemhacbdhkkaihgofncola@chrome-store-foxified--520432627:1.7", + "iedfcbkaanfabmfmndgnogeghbellanl@chrome-store-foxified--520432627:1.3.3", + "iimcimpbdndjaidollhipbkjilpnmfnh@chrome-store-foxified--520432627:1.0.8", + "{78a52e48-f966-42f0-a126-77007ac77429}:2.0", + "{efbcef5b-811e-4558-ba04-944d8bc3a630}:1.24", + "ahdmkklclpffcjgfllibcojofffgdagd@chrome-store-foxified--520432627:1.1.6", + "generated-sa21g2l4l2tihfln5elahu@chrome-store-foxified--520432627:0.99.9", + "dlapbpopbcangbnjdhajdlanbfokjaja@chrome-store-foxified--520432627:2.1.0", + "hinkmcnegnkncphhncbiohnomfgdegce@chrome-store-foxified--520432627:0.9.86", + "hgmhmanijnjhaffoampdlllchpolkdnj@chrome-store-foxified--520432627:1.16.9", + "bmhcbmnbenmcecpmpepghooflbehcack@chrome-store-foxified--520432627:4.0.5", + "odpdkefpnfejbfnmdilmfhephfffmfoh@chrome-store-foxified--520432627:0.6.2", + "{79bff8f6-3b47-498b-b3f9-e38fa3a298aa}:1.0.3" + ] + }, + "schema": 1762950990807, + "key_format": "{guid}:{version}", + "stash_time": 1762972505899, + "id": "e8634dbf-974e-4a8a-8b5d-fe6fbe762c97", + "last_modified": 1762972591122 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "persona@example.com:0.3.18", + "persona@example.com:0.3.17", + "persona@example.com:0.3.16", + "persona@example.com:0.3.15", + "persona@example.com:0.3.14", + "persona@example.com:0.3.12", + "persona@example.com:0.3.9", + "@keywordbasedhistorycleaner.burakkurkcu:1.0.0", + "hoverzoomport@burakkurkcu.com:1.0", + "{abd1d2a3-aed6-4b9f-9ae8-fbc29769c18e}:1.0", + "{82dcdbe7-70c2-47f1-aba5-4a34f33c1785}:1.0", + "tiktok-live-share-like@example.com:1.3", + "{e17416dd-3b13-41d0-a79d-7ce3a05fc5f7}:0.1", + "{df7eff7a-d7ce-468e-bbaf-e1054782d802}:1.0", + "pingpt@devendrapratap.dev:1.1.1", + "pingpt@devendrapratap.dev:2.0.0", + "pingpt@devendrapratap.dev:2.0.1", + "pingpt@devendrapratap.dev:2.1.0", + "pingpt@devendrapratap.dev:2.1.1", + "{1196c8be-79fd-4317-95dc-e195da12be86}:1.0" + ] + }, + "schema": 1762929392129, + "key_format": "{guid}:{version}", + "stash_time": 1762950905878, + "id": "0c30deb5-f132-451a-8229-6bad4d4bb4be", + "last_modified": 1762950990616 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3d6459f3-e9fd-4d8c-963f-ba4623f5ff4b}:1.1", + "rapid-collector@example.com:1.0.2", + "ozon-price-tracker@local:1.3", + "{2f2997f3-d6b8-4882-8c44-4f66c8a337c0}:1.0", + "{2f2997f3-d6b8-4882-8c44-4f66c8a337c0}:1.1", + "{2f2997f3-d6b8-4882-8c44-4f66c8a337c0}:1.2", + "focus-input-indicator@ofmineofmine.org:1.0", + "{324505fd-5472-473a-b436-065d554eb5b5}:0.1" + ] + }, + "schema": 1762913746079, + "key_format": "{guid}:{version}", + "stash_time": 1762929306093, + "id": "9f9032c5-282c-474d-b865-534afa6a9a2b", + "last_modified": 1762929391815 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "persona@example.com:0.4.0", + "{04dab7e3-ece0-4c4f-9796-dae3ea78aadd}:1.0", + "chzzk-blocker@example.com:1.4", + "chzzk-blocker@example.com:1.3", + "{da3e2c5f-8f73-43ce-a9e6-bee1f0b0f695}:1.0", + "ai-text-firefox@adifferentone.com:1.0.5", + "ai-text-firefox@adifferentone.com:1.0.6", + "persona@example.com:0.3.10", + "persona@example.com:0.3.2", + "persona@example.com:0.3.3", + "persona@example.com:0.3.4", + "persona@example.com:0.3.5", + "{0af42203-a16a-4572-a420-4c24dc18b121}:1.0.5", + "Android@bravenhancer.com:20.0.0", + "enhancer@goldenfox.com:20.0.0" + ] + }, + "schema": 1762886214860, + "key_format": "{guid}:{version}", + "stash_time": 1762907705802, + "id": "df974ac4-9105-4f22-90bf-79fdf4893e68", + "last_modified": 1762907799605 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "browsing-enhancer@example.com:1.0", + "{7a3b6b13-50d8-4acc-92ff-75953b5f1a24}:0.1", + "b2verde@janneschulz.net:19.4.1103", + "b2verde@janneschulz.net:24.7.312", + "b2verde@janneschulz.net:25.6.417", + "b2verde@janneschulz.net:24.7.216", + "egas.torres@gmail.com:1.0", + "egas.torres@gmail.com:2.0", + "b2verde@janneschulz.net:25.6.418", + "b2verde@janneschulz.net:24.6.415", + "b2verde@janneschulz.net:24.7.215", + "b2verde@janneschulz.net:23.8.3123", + "egas.torres@gmail.com:2.1", + "someone@example.com:1.0.1", + "{c53cf9ad-a056-4a25-9184-5401844377dc}:1.0", + "{47b55401-47cb-4973-981c-e75ea6f61c74}:1.0", + "{47b55401-47cb-4973-981c-e75ea6f61c74}:1.1" + ] + }, + "schema": 1762864593594, + "key_format": "{guid}:{version}", + "stash_time": 1762886105590, + "id": "409e42f8-812c-4491-9f31-31f79a2c12c7", + "last_modified": 1762886214655 + }, + { + "stash": { + "blocked": [ + "binyanamelnik@yanamelnik.com:3.54", + "binyanamelnik@yanamelnik.com:3.55", + "binyanamelnik@yanamelnik.com:3.56", + "binyanamelnik@yanamelnik.com:3.57", + "binyanamelnik@yanamelnik.com:3.58" + ], + "unblocked": [], + "softblocked": [ + "addon2@cradinguescorp:1.2.3", + "{9d9a154a-a6f6-4339-81a0-96b387021469}:1.4.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.7", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.6", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:4.0.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.8.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.8.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.8.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.8.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.8.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.7.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.6", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.6.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.7", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.6", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.5.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.7", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.6", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.4.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.3.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.3.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.3.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.3.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.3.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.11", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.10", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.9", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.8", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.7", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.6", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.5", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.2.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.1.4", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.1.3", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.1.2", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.1.1", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.1.0", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.35", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.34", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.33", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.32", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.31", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.30", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.29", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.28", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.27", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.26", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.25", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.24", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.23", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.22", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.21", + "{98fcdaee-2b58-4f71-8a3c-f0c66f24dede}:3.0.20", + "skipper@yourdomain.com:1.1", + "popup-blocker@example.com:1.0" + ] + }, + "schema": 1762842989291, + "key_format": "{guid}:{version}", + "stash_time": 1762864506049, + "id": "52988e3d-4716-4e2a-9f33-8165ba052645", + "last_modified": 1762864593400 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "saveit@airteam.com.au:0.5.3", + "saveit@airteam.com.au:0.5.5", + "saveit@airteam.com.au:0.11.4", + "saveit@airteam.com.au:0.11.2", + "saveit@airteam.com.au:0.11.1", + "saveit@airteam.com.au:0.11.0", + "saveit@airteam.com.au:0.11.3", + "saveit@airteam.com.au:0.9.1", + "saveit@airteam.com.au:0.10.0", + "saveit@airteam.com.au:0.7.2", + "saveit@airteam.com.au:0.7.0", + "saveit@airteam.com.au:0.7.1", + "saveit@airteam.com.au:0.9.0", + "saveit@airteam.com.au:0.6.0", + "{df4e86ee-6077-4fd0-a898-a66285e0770e}:1.0", + "{df4e86ee-6077-4fd0-a898-a66285e0770e}:2.0", + "{df4e86ee-6077-4fd0-a898-a66285e0770e}:3.0", + "@ps-extension-staging:1.0", + "{b8bf2547-2974-4744-a198-12080036487f}:1.0.0", + "focus-input-indicator@ofmineof.org:1.0", + "{d21be747-cc0e-43e0-b481-4620cedf51aa}:1.0", + "{73711d67-f8fb-4a47-8d17-d09b634564ad}:1.0" + ] + }, + "schema": 1762827347119, + "key_format": "{guid}:{version}", + "stash_time": 1762842905537, + "id": "afbe9e22-c550-42e8-8c8c-3ec0f2526345", + "last_modified": 1762842989059 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{bf4efa18-6bfc-4a92-ab7c-298dc4d23de7}:1.5", + "{bf4efa18-6bfc-4a92-ab7c-298dc4d23de7}:1.1", + "{bf4efa18-6bfc-4a92-ab7c-298dc4d23de7}:1.2", + "{bf4efa18-6bfc-4a92-ab7c-298dc4d23de7}:1.3", + "{bf4efa18-6bfc-4a92-ab7c-298dc4d23de7}:1.4", + "@tabsnap:1.2.9", + "@tabsnap:1.3.0", + "g5-docusign-click-assist@g5partners.com:1.0.0", + "{71d25593-af97-4077-ac05-8dfe6020d8db}:1.0.0" + ] + }, + "schema": 1762799795022, + "key_format": "{guid}:{version}", + "stash_time": 1762821304833, + "id": "ae347f11-73f2-43ca-ae28-d90514b1be89", + "last_modified": 1762821380485 + }, + { + "stash": { + "blocked": [ + "{a4049b12-9e03-46a8-9508-caf4c4f53e9a}:12.8.1", + "{bfe41b7a-4268-4b3c-a9e5-0a5212adf610}:12.23.1", + "{25dcccbe-b3b6-4c47-bdb3-255a45b0352a}:12.8.1", + "{79434247-7fc8-46bd-9135-5fd24b3bdc67}:12.8.1", + "{f17113cd-8be5-49ae-9fbb-9cde649b8d5e}:12.8.1", + "{a92c9415-fc79-418b-9a35-f00795472500}:12.8.1", + "{478ce5d4-0294-4a59-a241-c889267b3a08}:12.8.1", + "{49b77950-a292-44cf-8251-2fa145110abe}:12.8.1", + "{43b35958-e3c2-4e62-88d5-2ebbab701193}:12.23.1", + "{d33f7b96-9b5a-4da4-ae5e-57cb69f661b3}:12.8.1", + "{bb6e9753-2772-4139-aefa-7610f60ff430}:12.8.1", + "{8ad2c0be-ec3e-4312-a9e8-50ff087bf444}:12.8.1", + "{26b39d71-9ecf-434f-a702-f617ba345083}:12.8.1", + "{a0e97784-9fed-48b8-8d44-67b30679948d}:12.8.1", + "{ad31a786-e35d-45d3-9576-7fd3210438ac}:1.0", + "{ad31a786-e35d-45d3-9576-7fd3210438ac}:12.8.1", + "{74e18493-8303-4046-80c8-54c6f88b49eb}:1.0", + "{74e18493-8303-4046-80c8-54c6f88b49eb}:12.8.1", + "{11dbb2da-7e55-4fb7-91f6-5b63e46638a6}:1.0", + "{11dbb2da-7e55-4fb7-91f6-5b63e46638a6}:3.7.1", + "{4c4d31c6-bae2-42f4-a332-7463c98f7c73}:1.0", + "{4c4d31c6-bae2-42f4-a332-7463c98f7c73}:30002.6.16" + ], + "unblocked": [], + "softblocked": [ + "context-translator@example.com:1.5.0", + "context-translator@example.com:1.5.1", + "context-translator@example.com:1.5.2", + "dropzoneau-myer-atc-dev2@jordza:2.2.2", + "info@whotargets.me:0.1.1", + "info@whotargets.me:0.1.11", + "info@whotargets.me:1.2.6", + "info@whotargets.me:1.2.12", + "info@whotargets.me:0.1.12resigned1", + "dropzoneau-myer-atc-dev2@jordza:2.2.3", + "dropzoneau-myer-atc-dev2@jordza:2.2.4", + "dropzoneau-myer-atc-dev2@jordza:2.2.5", + "{e3c7a1f9-4d2b-45c6-9f8d-1a7b3e5c2d9f}:123.12.70", + "{995c9ebe-4602-4aa1-95a9-92052447a6c1}:1.0.0", + "{995c9ebe-4602-4aa1-95a9-92052447a6c1}:1.1.0", + "{0fa96508-9e47-4321-8458-2f758e1de0dc}:1.0.0", + "kinozalhelper@elektrikis.id.lv:3.2.0" + ] + }, + "schema": 1762778192031, + "key_format": "{guid}:{version}", + "stash_time": 1762799706184, + "id": "3a86fc8b-8bef-44c5-a696-437758d74ebf", + "last_modified": 1762799794787 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "na-ogawa-1@sfvoltapp-web-ext:0.9.10f", + "zen-xget@xi-xu.me:2.0.5", + "gpextension4ff@gp.su:1.0.2", + "kinozalhelper@elektrikis.id.lv:2.32.0", + "kinozalhelper@elektrikis.id.lv:3.0.0", + "kinozalhelper@elektrikis.id.lv:3.1.0", + "quick-tab-toolkit-bdfd3eb0-52d2-4f18-98df-13d47aa8dee7@example.com:1.0.0", + "{d7c73fab-1b8a-4050-b226-fd5781b44dcd}:1.0", + "{d7c73fab-1b8a-4050-b226-fd5781b44dcd}:1.1", + "{d7c73fab-1b8a-4050-b226-fd5781b44dcd}:1.2", + "{35194ffd-38ac-4133-bef0-666bce27d31b}:1.0", + "transpose@pitchshifter:0.1.0" + ] + }, + "schema": 1762756580632, + "key_format": "{guid}:{version}", + "stash_time": 1762778106232, + "id": "94bc4828-c3e7-49d3-8a5e-ca6204841d2c", + "last_modified": 1762778191792 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "flexeet-bot-scraper@gmail.com:2.0.0", + "{dd3db273-9825-4419-b6ff-8380e1081867}:1.0.3", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.6", + "gitzip-fixed-firefox-addons@gitzip.org:1.0.2", + "gitzip-fixed-firefox-addons@gitzip.org:1.0.3", + "magnolia94564@12.34:4.1.3.6" + ] + }, + "schema": 1762740947966, + "key_format": "{guid}:{version}", + "stash_time": 1762756504976, + "id": "8181e13a-77ca-48f2-bdb4-0c767995ecd4", + "last_modified": 1762756580450 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@twitch-vod-downloader-kurokoji:3.21", + "helloworld@gmail.com:1.62", + "trisadmeslek@trisadmeslek:2.2", + "com.persepolis.pdmchromewrapper@persepolisdmtrisadmeslek.github.io:2.4.0", + "zen-tidy-up@adamkahl.com:1.0.0", + "{e075bea8-9e91-4090-a3f2-34d46095f74d}:1.0", + "{52485919-091a-4aae-9472-444b68a6bdb4}:1.3" + ] + }, + "schema": 1762713388597, + "key_format": "{guid}:{version}", + "stash_time": 1762734906207, + "id": "98b72e43-9dab-42cc-8aa5-a3fa9abe680b", + "last_modified": 1762734994712 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{2ef374c5-3f42-449c-b317-1c1269078c18}:1.0", + "{9d4aae91-accd-40e7-a282-f4c9414fbcc2}:1.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.4", + "focus-input-indicator@mine.org:1.0", + "absolute-wallpaper-ultra@local:3.0.0", + "focus-input-indicator@ofmine.org:1.0", + "Android@bravenhancer.com:18.3.0", + "enhancer@goldenfox.com:18.3.0", + "good-thoughts@tobtobxx.net:1.0.0", + "kinozalhelper@elektrikis.id.lv:2.35.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.5", + "{f16324b2-f405-469a-b61f-b7c437de37a7}:0.0.1", + "support@screenlapse.io:1.0", + "support@screenlapse.io:1.1", + "support@screenlapse.io:1.2", + "support@screenlapse.io:1.3", + "zolver@shubawasj:1.0.0" + ] + }, + "schema": 1762691779427, + "key_format": "{guid}:{version}", + "stash_time": 1762713306262, + "id": "54495440-ca87-476e-889c-bf30db7b51c9", + "last_modified": 1762713388385 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "focus-input-indicator@i.org:5.0", + "{89eb8a21-6311-4e15-a388-fef93fa61f66}:1.0.0", + "{9a9daf87-0665-4946-b0e5-f75c3c87a524}:1.0", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.3" + ] + }, + "schema": 1762670189867, + "key_format": "{guid}:{version}", + "stash_time": 1762691704939, + "id": "9caea96f-1bd7-4d56-b924-f5f27a500125", + "last_modified": 1762691779245 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:18.0.3", + "enhancer@goldenfox.com:18.0.3", + "absolute-wallpaper@local:1.0.2", + "absolute-wallpaper-pro@local:1.2.0", + "absolute-wallpaper-mono@local:2.0.0" + ] + }, + "schema": 1762654548618, + "key_format": "{guid}:{version}", + "stash_time": 1762670105776, + "id": "c18e31a0-4c5c-494f-86b2-c09ac784b599", + "last_modified": 1762670189688 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@demodal-adblock:1.0", + "{f54b384d-4de8-4dfb-8212-b3735c48ac18}:1.0", + "netafraz-user@extension:1.2", + "{5a2c031a-f3c9-4675-9f42-19edf52d823a}:2.0", + "{5a2c031a-f3c9-4675-9f42-19edf52d823a}:2.1", + "{5a2c031a-f3c9-4675-9f42-19edf52d823a}:2.2", + "{5a2c031a-f3c9-4675-9f42-19edf52d823a}:2.3", + "{5a2c031a-f3c9-4675-9f42-19edf52d823a}:2.4", + "Bazaar@nchoremiot.com:1.49.1", + "Bazaar@nchoremiot.com:2.1.14", + "Bazaar@nchoremiot.com:2.1.11", + "Bazaar@nchoremiot.com:2.1.8", + "Bazaar@nchoremiot.com:2.1.5", + "Bazaar@nchoremiot.com:2.1.4", + "Bazaar@nchoremiot.com:2.1.3", + "Bazaar@nchoremiot.com:2.1.6", + "Bazaar@nchoremiot.com:2.1.9", + "Bazaar@nchoremiot.com:2.1.12", + "Bazaar@nchoremiot.com:2.1.7", + "Bazaar@nchoremiot.com:2.0.14", + "Bazaar@nchoremiot.com:2.0.13", + "Bazaar@nchoremiot.com:2.0.12", + "Bazaar@nchoremiot.com:2.0.16", + "Bazaar@nchoremiot.com:2.0.9", + "Bazaar@nchoremiot.com:2.0.15", + "Bazaar@nchoremiot.com:2.0.10", + "Bazaar@nchoremiot.com:2.0.11", + "Bazaar@nchoremiot.com:2.1.13", + "Bazaar@nchoremiot.com:2.0.5", + "Bazaar@nchoremiot.com:2.0.6", + "Bazaar@nchoremiot.com:2.0", + "Bazaar@nchoremiot.com:2.0.3", + "Bazaar@nchoremiot.com:1.49.2", + "Bazaar@nchoremiot.com:2.0.2", + "Bazaar@nchoremiot.com:2.0.8", + "Bazaar@nchoremiot.com:2.0.1", + "Bazaar@nchoremiot.com:2.0.7", + "Bazaar@nchoremiot.com:2.0.4", + "Bazaar@nchoremiot.com:2.1", + "Bazaar@nchoremiot.com:2.1.16", + "Bazaar@nchoremiot.com:2.1.17", + "Bazaar@nchoremiot.com:2.5.3", + "Bazaar@nchoremiot.com:2.5", + "Bazaar@nchoremiot.com:2.1.1", + "Bazaar@nchoremiot.com:2.1.10", + "Bazaar@nchoremiot.com:2.1.15", + "Bazaar@nchoremiot.com:2.5.4", + "Bazaar@nchoremiot.com:2.5.5", + "closeright-de@example:0.1.1", + "offline-2fa@agentie.marketing:1.0.0", + "offline-2fa@agentie.marketing:1.0.1", + "closeright-de@photogregor:0.1.2" + ] + }, + "schema": 1762626990949, + "key_format": "{guid}:{version}", + "stash_time": 1762648505729, + "id": "93011ee0-35c5-43f8-ad85-b5237362f50c", + "last_modified": 1762648591021 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "context-translator@example.com:1.4.4", + "context-translator@example.com:1.4.5", + "{a10e4d00-de50-40fd-80d1-0d220b2cded7}:1.6.1.0", + "distraction-curtain@jonesotens.com:2.1.3", + "distraction-curtain@jonesotens.com:2.1.4", + "distraction-curtain@jonesotens.com:2.2.1", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.2", + "{303047eb-712b-4836-957d-3a7c4182e664}:1.1.6", + "uwx@local.fennec:1.0.0", + "uwx-strong@local.fennec:1.2.0", + "spoock@netinfo.bg:1.0.3", + "spoock@netinfo.bg:2.0.5.3", + "neopaste-showdown@izyawastaken:4.0", + "{dd3db273-9825-4419-b6ff-8380e1081867}:1.0.2" + ] + }, + "schema": 1762605391211, + "key_format": "{guid}:{version}", + "stash_time": 1762626905911, + "id": "a77b71a7-71b3-481d-a0dd-312bd0b618bf", + "last_modified": 1762626990733 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f123eb95-b878-440e-88ea-91784d1136d3}:1.0.0", + "proxy-toggle-two@example.com:1.0.0", + "{45478ac0-52de-4cd5-9c28-26b123853d22}:1.0", + "{dd3db273-9825-4419-b6ff-8380e1081867}:1.0.1", + "saveit@airteam.com.au:0.5.0" + ] + }, + "schema": 1762583789278, + "key_format": "{guid}:{version}", + "stash_time": 1762605306071, + "id": "ef18aaa3-e789-4a50-95dc-af51258c6e30", + "last_modified": 1762605391022 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "csfloat-auto-refresh@example.com:1.0.0", + "uwp-pro@example.com:2.0.0", + "context-translator@example.com:1.3.0", + "context-translator@example.com:1.4.0", + "context-translator@example.com:1.4.1", + "context-translator@example.com:1.4.2", + "context-translator@example.com:1.4.3", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.1", + "{dd3db273-9825-4419-b6ff-8380e1081867}:1.0.0", + "free-auto-roll@dc:1.0" + ] + }, + "schema": 1762568146890, + "key_format": "{guid}:{version}", + "stash_time": 1762583705971, + "id": "55f8e2e6-cc70-4287-a2e4-42f454d9683f", + "last_modified": 1762583788926 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3689563f-e28d-4349-804a-5536646a514d}:1.0", + "tabspace@local:1.1.5", + "tabspace@local:1.1.11", + "tabspace@local:1.1.8", + "tabspace@local:1.1.6", + "{9c40f7e1-7190-440f-9141-3c216ed2d3fb}:1.0", + "ficlab-helper@mozilla.org:1.0.109", + "ficlab-helper@mozilla.org:1.0.110", + "@artemis-string-cloner:1.0", + "@artemis-string-cloner:1.1", + "{5f6955d3-3705-4496-8ad7-ea89da66ddc6}:1.0", + "{5f6955d3-3705-4496-8ad7-ea89da66ddc6}:1.1", + "{5f6955d3-3705-4496-8ad7-ea89da66ddc6}:1.1a", + "{5f6955d3-3705-4496-8ad7-ea89da66ddc6}:1.1b", + "{9c81a572-7b31-4439-bf97-c31715b422b3}:25.8.325" + ] + }, + "schema": 1762540578527, + "key_format": "{guid}:{version}", + "stash_time": 1762562105688, + "id": "88353630-d8db-48fc-9453-f2e3c70b486c", + "last_modified": 1762562189986 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "clash-proxy-addon@example.com:1.0.0", + "clash-proxy-addon@example.com:1.0.1", + "{f883e079-d768-4c17-8629-ed3bdee736b5}:1.0", + "n8n-article-submitter@yourdomain.com:1.0", + "context-translator@example.com:1.2.0", + "context-translator@example.com:1.2.1", + "{bcbd15b8-3bad-4200-90cd-218ad2340538}:1.0", + "{bcbd15b8-3bad-4200-90cd-218ad2340538}:2.0", + "{a6d26ce8-1a49-41a4-9db2-636afff5201b}:7.1", + "{a6d26ce8-1a49-41a4-9db2-636afff5201b}:5.0", + "{64d0f6b6-bc96-4c94-8800-97de64458094}:1.0", + "save-resources-automatically@shuhun56:0.1.0", + "save-by-ext@example:0.1.0", + "mooniedove123@gmail.com:1.3.0.0", + "mooniedove123@gmail.com:1.2.0.0", + "mooniedove123@gmail.com:1.1.0.0", + "mooniedove123@gmail.com:1.0.0.0", + "Android@bravenhancer.com:18.0.2", + "enhancer@goldenfox.com:18.0.2", + "{cde5ebda-c11f-413d-8789-1fba3e21d7f7}:0.1", + "{1e428d73-e958-4701-be59-a8ac9dc6c968}:0.2", + "{19321c4f-a39e-4578-b7a8-5093355ab3a1}:1.0.0", + "{c942938d-e533-4794-80fe-74793a32faf0}:1.0" + ] + }, + "schema": 1762518983559, + "key_format": "{guid}:{version}", + "stash_time": 1762540504771, + "id": "3c748f05-2cc2-40f6-8b51-756d06f23b17", + "last_modified": 1762540578289 + }, + { + "stash": { + "blocked": [ + "{cf4857be-8aab-4503-a5c2-b4cec5b6e0af}:1.0", + "{cf4857be-8aab-4503-a5c2-b4cec5b6e0af}:302.6.16", + "{c055d65b-d66c-4a1b-a161-8e917d113434}:1.0", + "{c055d65b-d66c-4a1b-a161-8e917d113434}:3.7.1", + "{41367af9-390c-4257-8ffd-e0495a031db3}:1.0", + "{41367af9-390c-4257-8ffd-e0495a031db3}:302.6.16", + "{566de2db-6a55-4a33-813c-f8895a640597}:1.0", + "{566de2db-6a55-4a33-813c-f8895a640597}:3.7.1", + "{0c6e67e9-dbd0-46b0-bdc7-bca615cec21c}:1.0", + "{0c6e67e9-dbd0-46b0-bdc7-bca615cec21c}:302.6.16", + "{5895627c-ceba-43de-8c86-9484f98df5a6}:1.0", + "{5895627c-ceba-43de-8c86-9484f98df5a6}:302.6.16", + "{305daefd-fe12-4440-80e9-f75d74ea1727}:1.0", + "{305daefd-fe12-4440-80e9-f75d74ea1727}:3.7.1", + "{a002ca5f-c368-4001-ab64-1c5bbf3aacb9}:1.0", + "{09220c7c-ad24-49c9-9ea3-247aae6ef8e4}:1.0", + "{09220c7c-ad24-49c9-9ea3-247aae6ef8e4}:9.3.6", + "{a07fa223-0991-4629-a9c0-f97ec5c544b4}:1.0", + "{a07fa223-0991-4629-a9c0-f97ec5c544b4}:9.3.6", + "{b78ba141-8bcc-4ff4-86ad-3f3674d94278}:1.0", + "{b78ba141-8bcc-4ff4-86ad-3f3674d94278}:9.3.6", + "{a085bf22-55b3-40cc-b366-42d4b31759c1}:1.0", + "{a085bf22-55b3-40cc-b366-42d4b31759c1}:9.3.6", + "{87351afd-d45a-41a0-b4ae-b9f6cc16b929}:1.0", + "{87351afd-d45a-41a0-b4ae-b9f6cc16b929}:2.2" + ], + "unblocked": [], + "softblocked": [ + "chess-assistant@mohammad:2.8", + "shopee-variant-extractor@dwikifebrians.dev:1.1.2", + "mouse-to-touch-converter@extension.local:1.0", + "drstrange29@example-data-collection-with-fallback:1.0", + "@clickup-quick-add-gnprojects:1.0.4", + "tothgabor4100@gmail.com:1.5", + "favory@sp4ce.pw:1.0.8" + ] + }, + "schema": 1762497388144, + "key_format": "{guid}:{version}", + "stash_time": 1762518904992, + "id": "784d5076-eceb-4806-991a-e103c282975c", + "last_modified": 1762518983365 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "myer-cart-helper@jordza.com:1.0", + "myer-cart-helper@dropzoneau:1.4.0", + "myer-cart-helper@dropzoneau:1.4.2", + "myer-cart-helper@dropzoneau:1.4.4", + "myer-cart-helper@dropzoneau:1.4.5", + "myer-cart-helper@dropzoneau:1.4.6", + "myer-cart-helper@dropzoneau:1.4.7", + "myer-cart-helper@dropzoneau:1.4.8", + "myer-cart-helper@dropzoneau:1.6.0", + "favory@sp4ce.pw:1.0.6", + "favory@sp4ce.pw:1.0.7", + "{0b485fc4-1f06-476c-96d4-c7538e338b43}:1.0", + "{0b485fc4-1f06-476c-96d4-c7538e338b43}:2.0", + "{0b485fc4-1f06-476c-96d4-c7538e338b43}:2.1", + "{0b485fc4-1f06-476c-96d4-c7538e338b43}:2.2" + ] + }, + "schema": 1762481755896, + "key_format": "{guid}:{version}", + "stash_time": 1762497306196, + "id": "5e0c6c21-5bff-4321-a3e8-8d736ceee196", + "last_modified": 1762497387978 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{046a55b4-5e72-4d05-a06c-cba2d2c2134a}:2.1.1", + "{046a55b4-5e72-4d05-a06c-cba2d2c2134a}:2.9.9", + "{c2b1a7e9-3d42-4f7b-8a6c-9e1f2d3c4b5a}:3.7", + "instagram-auto-expander@exemplo.com:1.2", + "issdcac-pub@l.martin7:1.1.4", + "issdcac-pub@l.martin7:1.1.5", + "issdcac-pub@l.martin7:1.1.6", + "porua@example.com:0.2.0.1", + "Android@bravenhancer.com:18.0.0", + "enhancer@goldenfox.com:18.0.0", + "{e773c708-b364-4b8b-a1b1-91ed159cfe2f}:1.0", + "{e9a511cf-538f-4944-a954-4a41318365df}:1.0", + "{adde9446-58bd-4b6b-98d2-de74059cf0fa}:1.0", + "c1o-sorter@kour.consulting:2.0.6", + "{06b572de-2d44-4a68-9a01-217b239c9602}:1.0" + ] + }, + "schema": 1762454189705, + "key_format": "{guid}:{version}", + "stash_time": 1762475705595, + "id": "1df325d2-a7d6-4494-8cd2-17f7d778a1ea", + "last_modified": 1762475792034 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ "{5a6b27d1-62a6-4088-a807-f0e7ebae2fff}:1.0", "{1254388d-c1b2-47f3-813e-83b05ee4861c}:1.0", "favory@sp4ce.pw:1.0.3", @@ -1958,5 +4867,5 @@ "last_modified": 1761136764909 } ], - "timestamp": 1762454189506 + "timestamp": 1764570990070 } diff -Nru thunderbird-140.5.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json thunderbird-140.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json --- thunderbird-140.5.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2025-12-09 01:27:20.000000000 +0000 @@ -1,6 +1,87 @@ { "data": [ { + "name": "Bun", + "schema": 1762992304400, + "status": "current", + "version": "1.3.2", + "browserid": "bun", + "id": "5034aa5c-d78a-4a4a-ade2-d9aaef93a941", + "last_modified": 1763038623318 + }, + { + "name": "Firefox", + "schema": 1762992304751, + "status": "planned", + "version": "148", + "browserid": "firefox", + "id": "4ebdb515-56c0-4aae-bf80-631df396b3c5", + "last_modified": 1763038623314 + }, + { + "name": "Firefox for Android", + "schema": 1762992305101, + "status": "planned", + "version": "148", + "browserid": "firefox_android", + "id": "5e1afc2d-b301-49b8-9052-0d0ceed8d7a3", + "last_modified": 1763038623310 + }, + { + "name": "Firefox for Android", + "schema": 1762992305037, + "status": "nightly", + "version": "147", + "browserid": "firefox_android", + "id": "6d4ac1b5-fae6-4cf0-8966-3833c78d2d6d", + "last_modified": 1763038623304 + }, + { + "name": "Firefox", + "schema": 1762992304683, + "status": "nightly", + "version": "147", + "browserid": "firefox", + "id": "da813114-57b4-435c-831e-4fc28589a55c", + "last_modified": 1763038623300 + }, + { + "name": "Firefox for Android", + "schema": 1762992304970, + "status": "beta", + "version": "146", + "browserid": "firefox_android", + "id": "b8de7d68-78f0-49a8-ae02-2b807c2a40d0", + "last_modified": 1763038623295 + }, + { + "name": "Firefox", + "schema": 1762992304614, + "status": "beta", + "version": "146", + "browserid": "firefox", + "id": "db1e42f6-cbd7-4a17-a388-2190ad554abf", + "last_modified": 1763038623291 + }, + { + "name": "Firefox for Android", + "schema": 1762992304900, + "status": "current", + "version": "145", + "browserid": "firefox_android", + "id": "546eaac9-d444-4f9f-a403-b97a76646211", + "last_modified": 1763038623283 + }, + { + "name": "Firefox", + "schema": 1762992304541, + "status": "current", + "version": "145", + "browserid": "firefox", + "id": "04fc0708-9123-4914-a491-ca13f20285e6", + "last_modified": 1763038623278 + }, + { "name": "Safari on iOS", "schema": 1762387504104, "status": "beta", @@ -235,87 +316,6 @@ "last_modified": 1761724372834 }, { - "name": "Bun", - "schema": 1761350704013, - "status": "current", - "version": "1.3.1", - "browserid": "bun", - "id": "5b1d3f1a-7b74-41f4-abaa-1e79f400adf3", - "last_modified": 1761551445786 - }, - { - "name": "Firefox for Android", - "schema": 1760745904292, - "status": "planned", - "version": "147", - "browserid": "firefox_android", - "id": "6d4ac1b5-fae6-4cf0-8966-3833c78d2d6d", - "last_modified": 1760945408222 - }, - { - "name": "Firefox", - "schema": 1760745903942, - "status": "planned", - "version": "147", - "browserid": "firefox", - "id": "da813114-57b4-435c-831e-4fc28589a55c", - "last_modified": 1760945408218 - }, - { - "name": "Firefox for Android", - "schema": 1760745904221, - "status": "nightly", - "version": "146", - "browserid": "firefox_android", - "id": "b8de7d68-78f0-49a8-ae02-2b807c2a40d0", - "last_modified": 1760945408213 - }, - { - "name": "Firefox", - "schema": 1760745903877, - "status": "nightly", - "version": "146", - "browserid": "firefox", - "id": "db1e42f6-cbd7-4a17-a388-2190ad554abf", - "last_modified": 1760945408209 - }, - { - "name": "Firefox for Android", - "schema": 1760745904153, - "status": "beta", - "version": "145", - "browserid": "firefox_android", - "id": "546eaac9-d444-4f9f-a403-b97a76646211", - "last_modified": 1760945408205 - }, - { - "name": "Firefox", - "schema": 1760745903812, - "status": "beta", - "version": "145", - "browserid": "firefox", - "id": "04fc0708-9123-4914-a491-ca13f20285e6", - "last_modified": 1760945408201 - }, - { - "name": "Firefox for Android", - "schema": 1760745904085, - "status": "current", - "version": "144", - "browserid": "firefox_android", - "id": "6e20e090-5795-4f55-bfe3-b202305eedee", - "last_modified": 1760945408197 - }, - { - "name": "Firefox", - "schema": 1760745903745, - "status": "current", - "version": "144", - "browserid": "firefox", - "id": "759d8212-1e45-4ccc-ac65-75ecfc260633", - "last_modified": 1760945408193 - }, - { "name": "Opera Android", "schema": 1760141104124, "status": "current", @@ -388,5 +388,5 @@ "last_modified": 1665656484764 } ], - "timestamp": 1762424892978 + "timestamp": 1763038623318 } diff -Nru thunderbird-140.5.0esr/services/settings/dumps/main/search-config-icons.json thunderbird-140.6.0esr/services/settings/dumps/main/search-config-icons.json --- thunderbird-140.5.0esr/services/settings/dumps/main/search-config-icons.json 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/services/settings/dumps/main/search-config-icons.json 2025-12-09 01:27:20.000000000 +0000 @@ -1,6 +1,23 @@ { "data": [ { + "schema": 1762992360903, + "imageSize": 16, + "attachment": { + "hash": "69e0131f3e85657f827eb4ad3f01c25cf17540fe2db15c7e756f4dcfc1853dd2", + "size": 5733, + "filename": "perplexity-16.pdf", + "location": "main-workspace/search-config-icons/15ae2412-8d7e-4086-b94b-9fa9ea6934f5.pdf", + "mimetype": "application/pdf" + }, + "engineIdentifiers": [ + "perplexity" + ], + "filter_expression": "env.appinfo.OS == \"iOS\"", + "id": "f943d7bc-872e-4a81-810f-94d26465da69", + "last_modified": 1763049497744 + }, + { "schema": 1746437702969, "imageSize": 16, "attachment": { @@ -1189,5 +1206,5 @@ "last_modified": 1744118264825 } ], - "timestamp": 1746562822691 + "timestamp": 1763049497744 } diff -Nru thunderbird-140.5.0esr/services/settings/dumps/main/search-config-v2.json thunderbird-140.6.0esr/services/settings/dumps/main/search-config-v2.json --- thunderbird-140.5.0esr/services/settings/dumps/main/search-config-v2.json 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/services/settings/dumps/main/search-config-v2.json 2025-12-09 01:27:20.000000000 +0000 @@ -319,32 +319,6 @@ }, { "base": { - "classification": "unknown", - "name": "Azerdict", - "urls": { - "search": { - "base": "https://azerdict.com/english/", - "searchTermParamName": "word" - } - } - }, - "id": "786aa916-a331-4b0c-8099-85927dd87be8", - "identifier": "azerdict", - "last_modified": 1702906502323, - "recordType": "engine", - "schema": 1702901819798, - "variants": [ - { - "environment": { - "locales": [ - "az" - ] - } - } - ] - }, - { - "base": { "aliases": [ "百度", "baidu" @@ -3457,21 +3431,25 @@ }, "id": "bb836721-7be9-4de6-ac18-520189a69076", "identifier": "perplexity", - "last_modified": 1760466845276, + "last_modified": 1763654608996, "recordType": "engine", - "schema": 1760449157753, + "schema": 1763604941875, "variants": [ { "environment": { "allRegionsAndLocales": true, "applications": [ - "firefox" + "firefox", + "firefox-ios" ] }, "isNewUntil": "2025-10-21", "subVariants": [ { "environment": { + "applications": [ + "firefox" + ], "minVersion": "143.0a1" }, "urls": { @@ -3487,6 +3465,15 @@ } } ] + }, + { + "environment": { + "allRegionsAndLocales": true, + "applications": [ + "firefox-android" + ], + "minVersion": "145.0.1" + } } ] }, @@ -8422,5 +8409,5 @@ "schema": 1707824831520 } ], - "timestamp": 1761573989454 + "timestamp": 1764082724032 } diff -Nru thunderbird-140.5.0esr/services/settings/dumps/security-state/intermediates.json thunderbird-140.6.0esr/services/settings/dumps/security-state/intermediates.json --- thunderbird-140.5.0esr/services/settings/dumps/security-state/intermediates.json 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/services/settings/dumps/security-state/intermediates.json 2025-12-09 01:27:21.000000000 +0000 @@ -1,6 +1,227 @@ { "data": [ { + "schema": 1764079149622, + "derHash": "Vx5SHl4igQ0zuxo5mRFD6eZM2NrpfWWTGxlOGa7oHoY=", + "attachment": { + "hash": "5f8bde8d708ed5ee811bb7daf1e290961cdf0bd58c32691748dc2a2f2bb9c50d", + "size": 2377, + "filename": "qmq-IeHhR6HY99Hqh08a3g8BhKna44jZ911OLTU6mN8=.pem", + "location": "security-state-staging/intermediates/390e5a79-53a1-4b31-8bd6-8f2850e5210c.pem", + "mimetype": "application/x-pem-file" + }, + "id": "833a1f06-a99c-4b65-88d2-385ad0b06035", + "last_modified": 1764082622611 + }, + { + "schema": 1763560748876, + "derHash": "4QdH1Np7qwnLqZUvAZ01NMufugcL8T2HkbFpnNL/Wd0=", + "attachment": { + "hash": "c7c54698f6621ba5405138590b51bee5a3b8c451dc7b385f0dae3be2d93d8fa9", + "size": 2353, + "filename": "VySCTZ2BRhPeZrgzhlh-rvwM55mARSwJKAcVBEtalj8=.pem", + "location": "security-state-staging/intermediates/b68cb963-a078-459c-9321-876909b56d6d.pem", + "mimetype": "application/x-pem-file" + }, + "id": "67e5cea5-e2cd-45a7-bd92-d951c3c7ef24", + "last_modified": 1763564222572 + }, + { + "schema": 1763042349189, + "derHash": "N6e8rzmcpsJPOrtuCvnd4yru66HTauzJWMdjFgn+Aak=", + "attachment": { + "hash": "04b0b0d2b57843114bc2e91cea8e1c653d693dda2b5e39e68e3e2d5d750710c5", + "size": 2207, + "filename": "2NLb63FCVuJytGtEglaSvvLY-Dytm66-uA-5hRq8bxE=.pem", + "location": "security-state-staging/intermediates/2c2ecfe5-27fa-4e44-9004-163cb5c03be7.pem", + "mimetype": "application/x-pem-file" + }, + "id": "77805380-6361-484f-9ed3-0f75a54d97dc", + "last_modified": 1763045822827 + }, + { + "schema": 1763042348789, + "derHash": "fH2k4oGvJP7zWmcR7KVdv/HGMzcJ38Z5Rw8yXRy9lGA=", + "attachment": { + "hash": "a036266f903c188ab61e80d81a0b173dda7f37a03afad06f727ee5a781135a3d", + "size": 2207, + "filename": "OR91kAI_4OTxudY4Wl4C-uXihZJ5DhGYRNA-T6E5Tw8=.pem", + "location": "security-state-staging/intermediates/83abd3c0-7024-4806-9ca3-602aa510a928.pem", + "mimetype": "application/x-pem-file" + }, + "id": "50f118e6-558c-4104-a679-079d5ce4620f", + "last_modified": 1763045822822 + }, + { + "schema": 1762567154273, + "derHash": "cky0UGfFf2s+ZUri3XGM97UyCaBMLEas98wblgsa2Ic=", + "attachment": { + "hash": "333801d164fe9c94a6cb0a47a59bf12592e94489eb0470880e5e20c20a69b4ec", + "size": 1211, + "filename": "q3HEl0t8WGvcKc8ZL0_kp8zVlBUNw-3w499a7ZsHJ2Q=.pem", + "location": "security-state-staging/intermediates/4dc1d321-529d-40d0-8c37-31011273f44c.pem", + "mimetype": "application/x-pem-file" + }, + "id": "30d435c4-990d-4c66-b015-7b8968731da6", + "last_modified": 1762570622810 + }, + { + "schema": 1762567153522, + "derHash": "kPcYHL5uxTax3ZrJSs5R/VQzOdijGn2rwu6PqEIQPxM=", + "attachment": { + "hash": "8115332948a4fc3ec125b22a6209f0d651b466e56eae643da266d983557baea5", + "size": 2170, + "filename": "6ZH_5R6nQQR7e7wnW2TDFtvIS5lqRM_r9uG_egJQQpU=.pem", + "location": "security-state-staging/intermediates/9b9ce40a-6505-4437-97b4-0437396c9216.pem", + "mimetype": "application/x-pem-file" + }, + "id": "b55f266a-12e7-4710-b4bf-51e9c2e97bcf", + "last_modified": 1762570622806 + }, + { + "schema": 1762567155023, + "derHash": "ON7E22BrTtx+8vRUJGAzbEBqW1Zwd02gX0n5fr0gBxo=", + "attachment": { + "hash": "1bb0fa60667cfb2fbaf4c6a7b6bdf43f4422f94eeb078562c64f117db104704c", + "size": 1163, + "filename": "zAapL0Pdak7Psp8wzFwZdLaSAHqvXda8mjYxX-jRD4s=.pem", + "location": "security-state-staging/intermediates/59905aab-51ce-4024-b3ed-37042d865cd2.pem", + "mimetype": "application/x-pem-file" + }, + "id": "87f3fbf8-d77f-410f-92c4-4d9392af84d7", + "last_modified": 1762570622803 + }, + { + "schema": 1762567153890, + "derHash": "DaepVQkjcfUX2KjbBQgQnsnHgcBlTluzvZuPZyTQCU4=", + "attachment": { + "hash": "f360c12db193b925f3a8ffb976e94b352ab40c5462a7d3c90a2c7a748ce920dd", + "size": 2170, + "filename": "gVziA3gLRBdKmpb_2jcDgCkl6iXDe6RvI4JBZ7VUvuk=.pem", + "location": "security-state-staging/intermediates/e8f09197-548c-45c4-ae4f-d219654d296b.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7240cb62-1706-46b2-8e39-f2a297833508", + "last_modified": 1762570622800 + }, + { + "schema": 1762567155413, + "derHash": "DUYaOzuP+m5B9dRu5wzpxr0J66doxQ25pVN9bfBQUIs=", + "attachment": { + "hash": "dfc9c6b0459467f05562e7a0afbf58abd56029f417013f3b4257d903796fad9e", + "size": 2227, + "filename": "1O81sLtHbwIXC5QVjai4fngmhyEok53ZuaawcDFW6gg=.pem", + "location": "security-state-staging/intermediates/3c622488-d1c5-4869-9cb0-f1c4a1b94636.pem", + "mimetype": "application/x-pem-file" + }, + "id": "e5595829-3533-4538-8053-c5db40c7f5fb", + "last_modified": 1762570622797 + }, + { + "schema": 1762567152727, + "derHash": "KrUqzpgUI1D2ojAvCfU3esWDe3FsrenFomKztGfqKZI=", + "attachment": { + "hash": "21075f1ccedcadcbcd7bbfdd90fcf63e5f294eca3a14bf6f55e12c1fb423be4a", + "size": 1158, + "filename": "KeMXA7j8UDafIgEB0Amf1QjCa24Tn-v3q9z6E3lRPgA=.pem", + "location": "security-state-staging/intermediates/46c30628-cb0c-4b2e-91d3-2607e7747c2a.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7637ac35-c046-4cd3-8768-14c6af6d78c2", + "last_modified": 1762570622794 + }, + { + "schema": 1762567152335, + "derHash": "5yXOvPBN3I+X9c38mvknBY/0f9+CoDMKrXIx6A65wQo=", + "attachment": { + "hash": "0ae132255b2d28a32e56775e1cea3bfdef13f160d97772bef4ba5b0ae8af3716", + "size": 1158, + "filename": "mNwjQopDrwPw-EeC7zhGl8k8vLMF9_cmVrlMsu0Wc0I=.pem", + "location": "security-state-staging/intermediates/8aca577d-c53e-461d-8d97-5e536681b86e.pem", + "mimetype": "application/x-pem-file" + }, + "id": "f18ca907-1a05-4630-b03d-9dbd6c616033", + "last_modified": 1762570622790 + }, + { + "schema": 1762567154642, + "derHash": "O0HWxKJqghs1pkhvpiyFI8FegEqfr3gD0kaYMvcjKKY=", + "attachment": { + "hash": "0d2955ea080380f67d840bbb1ced31c8102f0df7e644bfbef66f88ee73fedcc2", + "size": 2170, + "filename": "sGwwY8zm17m9uJoe3vBjedndbm7ojRiFjnSxOi8ByYg=.pem", + "location": "security-state-staging/intermediates/fe03f305-88f7-4742-b0b4-24fd490d40d5.pem", + "mimetype": "application/x-pem-file" + }, + "id": "545818df-5ac6-4684-adb1-bbc69e086b36", + "last_modified": 1762570622786 + }, + { + "schema": 1762567153133, + "derHash": "nA8ojqq7cUBXAQIMly+BWURilgeNOFkcaEmbEs43lEQ=", + "attachment": { + "hash": "e1ebdf543b2bc4251251a3776968fd28a170639f9d4a59dcf2ac544860e2ee9e", + "size": 2186, + "filename": "DfCQMnBF8q00TMyQbIF-IlSnxWVan6n247G_b_fpmZE=.pem", + "location": "security-state-staging/intermediates/5817edbd-9e9a-454f-8eab-c9f1c81f8865.pem", + "mimetype": "application/x-pem-file" + }, + "id": "80572dd4-2a77-462f-a572-33169e35daff", + "last_modified": 1762570622783 + }, + { + "schema": 1762567151923, + "derHash": "Inth5T8THO/LgeiJntmCn354BYZkfz+Y3yq+whZ/QFs=", + "attachment": { + "hash": "16da6447aa4cb10d3f8f12887c015811a8ad88eb0ddab427fac6bbc195e96b84", + "size": 1175, + "filename": "IxljKvMO0_JVfu5YUb3d4Gtvua9MNxJCqPXsU6nr4hg=.pem", + "location": "security-state-staging/intermediates/6e5d7f14-0270-40cc-ba49-9518b39dd081.pem", + "mimetype": "application/x-pem-file" + }, + "id": "58eaadb6-53dd-4004-bf70-bb6969238878", + "last_modified": 1762570622779 + }, + { + "schema": 1762480759501, + "derHash": "6AJhE6eyXTf2LKAu1HCi6dBX+1hvcLEJvrmrbDir+r4=", + "attachment": { + "hash": "330b80dd2ea9b031ab75c365afedd754d4c74c1ec951ef00e40503000dc052a1", + "size": 2259, + "filename": "QSChdw4_SuOhZVN8qJbZYY2vlPC43a1P4_Yzy-gwCk4=.pem", + "location": "security-state-staging/intermediates/4a02de74-6d77-4a12-b8ca-1a6c65ae3467.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c321d0d5-27d4-4ca8-b57a-a8de67bdd23a", + "last_modified": 1762484222710 + }, + { + "schema": 1762480759877, + "derHash": "vY+DVf7cisKN2JTCAWuYgL2W6cvh0ZCJ0Gu+tShg/fI=", + "attachment": { + "hash": "2113bcb4c8d8e2a89120517104f1ac7eb327822c8b8c4095975153e7e15ade37", + "size": 2255, + "filename": "CObHWszewteGmvP14WVKhtU8Ba1QdYOmShGuqTQJSWE=.pem", + "location": "security-state-staging/intermediates/0c093c28-f284-4366-895e-024bab48cc34.pem", + "mimetype": "application/x-pem-file" + }, + "id": "aeeac4e4-a0fa-46fd-a77b-0a2ce696b8fb", + "last_modified": 1762484222707 + }, + { + "schema": 1762480759086, + "derHash": "2gjFpXYszKoccKKdfA0Ml4j/uFryPJbStnXaTK1DstI=", + "attachment": { + "hash": "a1a53e717423c4ac1b116c7c859e8f641a534a3b34cc37e46570331785527d3b", + "size": 2255, + "filename": "AbuqEmLKY7z-Nvdv1GPIAhLT0gHwpQf595DttZoQowY=.pem", + "location": "security-state-staging/intermediates/99265665-9327-4259-803e-e6fc67da39e7.pem", + "mimetype": "application/x-pem-file" + }, + "id": "11279773-3809-47aa-b8ce-f8a6a64bbba6", + "last_modified": 1762484222702 + }, + { "schema": 1761616754901, "derHash": "N4h1oXnGog7NLiAvIbsszvXwV/zXRe1Elc/4KGs90es=", "attachment": { @@ -2250,45 +2471,6 @@ "last_modified": 1752591422546 }, { - "schema": 1752155863326, - "derHash": "dx59bC13t7kOG0/32/6j4a19JJ0Ncp7QRVZ7XBZAknY=", - "attachment": { - "hash": "1ae45b7b0ceef35190fcbaf30c8b0442d2f2caa0a5519ffff89b9a5152bb84c0", - "size": 1305, - "filename": "wyPygwouDrmZ9JjrHsSya44hCIbHB0O1i3IMIeU20FE=.pem", - "location": "security-state-staging/intermediates/befc0f92-2e21-4ed1-900b-8947f01e7372.pem", - "mimetype": "application/x-pem-file" - }, - "id": "85d03609-d84b-4554-a164-7d75746b959d", - "last_modified": 1752159422751 - }, - { - "schema": 1752155862293, - "derHash": "mAWUbNRs0vIidtRj9YLU6BHuJAJdjBfW7QrOOPc2Z0w=", - "attachment": { - "hash": "f1280eef8ebc2ff612458b2798279e95d5172d8883a5b646a68b352fbed96f4b", - "size": 2109, - "filename": "83xSo8lPiDB3NfbtH8Sf6nnd6a_5lf9oOooQ86ca04I=.pem", - "location": "security-state-staging/intermediates/74958bc5-8cdf-4aaa-a74a-5f74bcd32b6d.pem", - "mimetype": "application/x-pem-file" - }, - "id": "77a5b5de-9cfa-4d8b-8f6d-570f0afa4d3c", - "last_modified": 1752159422748 - }, - { - "schema": 1752155864301, - "derHash": "Rud26nxsD5HxzeMXVfhkxFphgS8cN47VWU4Tu03mM8M=", - "attachment": { - "hash": "43be86a2c15a4438f0f6135b49ef56ea9d5ecc5688c3744dddd47258fb6116c1", - "size": 2450, - "filename": "2PetmpDyIF3lqvSYiYQyKHCHGnW0P7DdIC1MnDREeHc=.pem", - "location": "security-state-staging/intermediates/42f7aee8-d33a-445f-871c-affdc0cb6809.pem", - "mimetype": "application/x-pem-file" - }, - "id": "f9b2d933-0eae-46e6-942a-41244569963a", - "last_modified": 1752159422744 - }, - { "schema": 1751896661778, "derHash": "EflXHDDC3iMnU9WxWMVPd7CgLf9BcTV1LTLpi4m8lxk=", "attachment": { @@ -15852,60 +16034,6 @@ "last_modified": 1666727872784 }, { - "schema": 1666727413032, - "derHash": "IR8wg7nnegHQgoVliXoc6UXuquBJQszDaQh9gIDJ5KY=", - "subject": "CN=Certigna Wild CA,OU=0002 48146308100036,O=DHIMYOTIS,C=FR", - "subjectDN": "MHkxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlESElNWU9USVMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxHTAbBgNVBGEMFE5UUkZSLTQ4MTQ2MzA4MTAwMDM2MRkwFwYDVQQDDBBDZXJ0aWduYSBXaWxkIENB", - "whitelist": false, - "attachment": { - "hash": "5496347e4439fb545ba2bee7caa37b999d7fbae9c05425339345faf2c1e52d1f", - "size": 2166, - "filename": "6PsBH2V6vxU_w6DnSyY4EpqQYeF8QrYgohY-fWMfhmE=.pem", - "location": "security-state-staging/intermediates/fc3270ce-2a3b-48cd-9a3c-dba02a58d9a5.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "6PsBH2V6vxU/w6DnSyY4EpqQYeF8QrYgohY+fWMfhmE=", - "crlite_enrolled": false, - "id": "fc74dd7b-d279-49bc-8b15-430100d07015", - "last_modified": 1666727872770 - }, - { - "schema": 1666727367232, - "derHash": "ceZTv79eclFbQJm71eyIcoErR8bsH6mt0yfhySyeoW0=", - "subject": "CN=Certigna Services CA,OU=0002 48146308100036,O=DHIMYOTIS,C=FR", - "subjectDN": "MH0xCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlESElNWU9USVMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxHTAbBgNVBGEMFE5UUkZSLTQ4MTQ2MzA4MTAwMDM2MR0wGwYDVQQDDBRDZXJ0aWduYSBTZXJ2aWNlcyBDQQ==", - "whitelist": false, - "attachment": { - "hash": "1e69d697d43d9ba8bb5bef41ca322d6effdfa8f6fb680b6b8c84759cb9c7151f", - "size": 2170, - "filename": "Vvyvg4-bOEbI6aO7K28ioVsUfckLqCSKqlIqZTEB_uE=.pem", - "location": "security-state-staging/intermediates/fd277823-b07c-41b0-bff8-0cdb90cd2145.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "Vvyvg4+bOEbI6aO7K28ioVsUfckLqCSKqlIqZTEB/uE=", - "crlite_enrolled": false, - "id": "e83a378a-19a8-4110-bf0b-0f49b8965b01", - "last_modified": 1666727872757 - }, - { - "schema": 1666727418712, - "derHash": "679NxgDBfaBDgd79z8EZw/NO+0oE0IYJELgTx3ktdYU=", - "subject": "CN=Certigna Entity CA,OU=0002 48146308100036,O=DHIMYOTIS,C=FR", - "subjectDN": "MHsxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlESElNWU9USVMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxHTAbBgNVBGEMFE5UUkZSLTQ4MTQ2MzA4MTAwMDM2MRswGQYDVQQDDBJDZXJ0aWduYSBFbnRpdHkgQ0E=", - "whitelist": false, - "attachment": { - "hash": "ada86b610b9f472f00e1921d532cf509f6692c87cb45580cbdd6cdb13bc4ffbd", - "size": 2170, - "filename": "0Eiyrr-wFIp1JqShtXzNCtJt2yUU0-j_mDnLwk1-AHk=.pem", - "location": "security-state-staging/intermediates/f1c34a68-978a-4f12-85f8-06564ca3f194.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "0Eiyrr+wFIp1JqShtXzNCtJt2yUU0+j/mDnLwk1+AHk=", - "crlite_enrolled": false, - "id": "b641a082-df69-4132-a8a8-a1a801f83c2c", - "last_modified": 1666727872743 - }, - { "schema": 1666727400274, "derHash": "HMNYpt+gp2u1RwZg1487JfI8zWOVZn5JzPyCAdo9GS0=", "subject": "CN=Certigna Entity CA,OU=0002 48146308100036,O=DHIMYOTIS,C=FR", @@ -19344,24 +19472,6 @@ "last_modified": 1666727868415 }, { - "schema": 1666727355063, - "derHash": "ci1Qh02kVJbQKZYnQJd3YDqHNBpflDuInDLnuSgKj3E=", - "subject": "CN=MarketWare - Soluções para Mercados Digitais\\, Lda. RSA DV CA,O=MarketWare - Soluções para Mercados Digitais\\, Lda.,L=Lisboa,ST=Lisboa,C=PT", - "subjectDN": "MIG3MQswCQYDVQQGEwJQVDEPMA0GA1UECBMGTGlzYm9hMQ8wDQYDVQQHEwZMaXNib2ExPTA7BgNVBAoMNE1hcmtldFdhcmUgLSBTb2x1w6fDtWVzIHBhcmEgTWVyY2Fkb3MgRGlnaXRhaXMsIExkYS4xRzBFBgNVBAMMPk1hcmtldFdhcmUgLSBTb2x1w6fDtWVzIHBhcmEgTWVyY2Fkb3MgRGlnaXRhaXMsIExkYS4gUlNBIERWIENB", - "whitelist": false, - "attachment": { - "hash": "364dc7ff0e34c494eeb6b74e5af48417d3bee36a3a3bc88c306402095454997e", - "size": 2231, - "filename": "0xvEIcXteNs-TYPZ7GyhN_WFNSBPpaBsyCLFCdhQQY0=.pem", - "location": "security-state-staging/intermediates/a9a16ec4-e9a6-4fc5-8368-10f052892a0b.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "0xvEIcXteNs+TYPZ7GyhN/WFNSBPpaBsyCLFCdhQQY0=", - "crlite_enrolled": false, - "id": "700dbfd1-9940-430d-bac5-80f5adaf4fcd", - "last_modified": 1666727868402 - }, - { "schema": 1666727356765, "derHash": "KAu8NKmMx5YGqJaQ5Sq3L9xf/yddw2bEgnsWVjE+l5A=", "subject": "CN=Don Dominio / MrDomain RSA DV CA,O=Soluciones Corporativas IP\\, SL,L=Manacor,ST=Illes Balears,C=ES", @@ -19920,24 +20030,6 @@ "last_modified": 1666727867716 }, { - "schema": 1666727354531, - "derHash": "SytyugviemNHjCc6DFtS9puJ42marU86Gg6v5muZUmU=", - "subject": "CN=MarketWare - Soluções para Mercados Digitais\\, Lda. RSA EV CA,OU=Controlled by COMODO exclusively for MarketWare,O=MarketWare - Soluções para Mercados Digitais\\, Lda.,L=Lisboa,ST=Lisboa,C=PT", - "subjectDN": "MIHxMQswCQYDVQQGEwJQVDEPMA0GA1UECBMGTGlzYm9hMQ8wDQYDVQQHEwZMaXNib2ExPTA7BgNVBAoMNE1hcmtldFdhcmUgLSBTb2x1w6fDtWVzIHBhcmEgTWVyY2Fkb3MgRGlnaXRhaXMsIExkYS4xODA2BgNVBAsTL0NvbnRyb2xsZWQgYnkgQ09NT0RPIGV4Y2x1c2l2ZWx5IGZvciBNYXJrZXRXYXJlMUcwRQYDVQQDDD5NYXJrZXRXYXJlIC0gU29sdcOnw7VlcyBwYXJhIE1lcmNhZG9zIERpZ2l0YWlzLCBMZGEuIFJTQSBFViBDQQ==", - "whitelist": false, - "attachment": { - "hash": "125446714e5452ed7280f9fe6cdc58e5963958feba36a8bd600c991fabb83e58", - "size": 2341, - "filename": "qCF-PPuByTYruFr6MIeAiLpr2ebZPZHBVpg73sPCJwI=.pem", - "location": "security-state-staging/intermediates/f2bbec94-183e-4537-bc0a-f49e5e7afbb1.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "qCF+PPuByTYruFr6MIeAiLpr2ebZPZHBVpg73sPCJwI=", - "crlite_enrolled": false, - "id": "4e1c2e5f-7a2e-4e96-b564-224f85d2097a", - "last_modified": 1666727867703 - }, - { "schema": 1666727349915, "derHash": "FD3+ZYMuID5NKOww+2C6c77jru4wij+NGUu2Hn0dm8A=", "subject": "CN=FujiSSL ECC Extended Validation Secure Site CA,OU=Controlled by Sectigo exclusively for Nijimo K.K.,O=Nijimo K.K.,L=Shibuya-ku,ST=Tokyo,C=JP", @@ -28128,24 +28220,6 @@ "last_modified": 1637614674594 }, { - "schema": 1637331030153, - "derHash": "8A5ha1ntBubMlxfQOfehpwyz0I4LatdGU2cMzkSMYfM=", - "subject": "CN=TeleSec Business TLS-CA 21,O=Deutsche Telekom Security GmbH,C=DE", - "subjectDN": "MFsxCzAJBgNVBAYTAkRFMScwJQYDVQQKEx5EZXV0c2NoZSBUZWxla29tIFNlY3VyaXR5IEdtYkgxIzAhBgNVBAMTGlRlbGVTZWMgQnVzaW5lc3MgVExTLUNBIDIx", - "whitelist": false, - "attachment": { - "hash": "5af51fb639abc7ecb3215b9fc5e15ae466f544ef15726b5ceaa0ab6da9b6d935", - "size": 2093, - "filename": "HwN-XWTswr50M_-6ArVXfcQin_00zYvWNeebDkP2YVI=.pem", - "location": "security-state-staging/intermediates/bf2aacbd-643a-4dc2-8720-b5f2241d2ad8.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "HwN+XWTswr50M/+6ArVXfcQin/00zYvWNeebDkP2YVI=", - "crlite_enrolled": false, - "id": "087d2225-53d6-4103-b228-7a7c44753024", - "last_modified": 1637333968854 - }, - { "schema": 1635365174803, "derHash": "GQmO/5wMtG4fBq363R89pXEjcPcXMzRZgTfUpVX/8Ec=", "subject": "CN=E-SAFER DOMAIN SSL CA [Run by the Issuer],O=E-SAFER CONSULTORIA EM TECNOLOGIA DA INFORMACAO LTDA,C=BR", @@ -29244,24 +29318,6 @@ "last_modified": 1576536532726 }, { - "schema": 1576535458597, - "derHash": "AsSjAKCcG4k7EflWdlmvlbu5u+eVOJPjbFuvF7VVzuM=", - "subject": "CN=Certigna Identity Plus CA,OU=0002 48146308100036,O=DHIMYOTIS,C=FR", - "subjectDN": "MIGCMQswCQYDVQQGEwJGUjESMBAGA1UECgwJREhJTVlPVElTMRwwGgYDVQQLDBMwMDAyIDQ4MTQ2MzA4MTAwMDM2MR0wGwYDVQRhDBROVFJGUi00ODE0NjMwODEwMDAzNjEiMCAGA1UEAwwZQ2VydGlnbmEgSWRlbnRpdHkgUGx1cyBDQQ==", - "whitelist": false, - "attachment": { - "hash": "4f9b8c5d9910a9c5057de2bdaa15c263ccc9194055f0f6d438f7dd65e0000884", - "size": 2178, - "filename": "ywhSp1oF34bfFheBzKO3KqbsXi-qQbyfXu94SMYBxwg=.pem", - "location": "security-state-staging/intermediates/a9861ffb-3a18-416a-b622-b2317ad102ed.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "ywhSp1oF34bfFheBzKO3KqbsXi+qQbyfXu94SMYBxwg=", - "crlite_enrolled": false, - "id": "cd3a316e-5ab3-425f-9bd1-f6ef6ab8e077", - "last_modified": 1576536532530 - }, - { "schema": 1576536109129, "derHash": "ehQrGl4WIVGDoT6ECoYqQ34pPZNmkh2wfttU8TisDXg=", "subject": "CN=TrustAsia OV SSL CA - C3,O=TrustAsia Technologies Inc.,C=CN", @@ -30612,5 +30668,5 @@ "last_modified": 1559865884636 } ], - "timestamp": 1761922623184 + "timestamp": 1764082622611 } diff -Nru thunderbird-140.5.0esr/sourcestamp.txt thunderbird-140.6.0esr/sourcestamp.txt --- thunderbird-140.5.0esr/sourcestamp.txt 2025-11-08 04:45:47.000000000 +0000 +++ thunderbird-140.6.0esr/sourcestamp.txt 2025-12-09 01:28:03.000000000 +0000 @@ -1,3 +1,3 @@ -20251108022659 -https://hg.mozilla.org/releases/comm-esr140/rev/6a3011b7161c6f3a36d5116f2608d51b19fb4d58 -https://hg.mozilla.org/releases/mozilla-esr140/rev/558705980ca9db16de0564b5a6031b5d6e0a7efe +20251208204945 +https://hg.mozilla.org/releases/comm-esr140/rev/a9fbb23767a6f5f6b6c07a0b713b18b86a9a169c +https://hg.mozilla.org/releases/mozilla-esr140/rev/18556c0b079c839f4d15597a57b0f048fdadcedd diff -Nru thunderbird-140.5.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml --- thunderbird-140.5.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml 2025-12-09 01:27:20.000000000 +0000 @@ -26,6 +26,7 @@ treeherder: kind: test tier: 1 + run-on-projects: [] tasks: fenix: diff -Nru thunderbird-140.5.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml --- thunderbird-140.5.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml 2025-11-08 04:45:05.000000000 +0000 +++ thunderbird-140.6.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml 2025-12-09 01:27:20.000000000 +0000 @@ -22,6 +22,7 @@ - linux64-android-sdk-linux-repack - linux64-jdk-repack - linux64-node + run-on-projects: [] run: using: gradlew treeherder: diff -Nru thunderbird-140.5.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html thunderbird-140.6.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html --- thunderbird-140.5.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html 2025-12-09 01:27:25.000000000 +0000 @@ -0,0 +1,40 @@ + + + + +Restyle text control at `beforeinput` + + + + + + + + + + + + + diff -Nru thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html --- thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html 2025-12-09 01:27:26.000000000 +0000 @@ -0,0 +1,32 @@ + +javascript: URL in form submission, initial src is not about:blank + + + + + + + diff -Nru thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html --- thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html 2025-12-09 01:27:25.000000000 +0000 @@ -0,0 +1,84 @@ + +javascript: URL triggers sync xhr + + + + + + + + diff -Nru thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html --- thunderbird-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html 2025-12-09 01:27:25.000000000 +0000 @@ -0,0 +1,3 @@ + + +
\ No newline at end of file diff -Nru thunderbird-140.5.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html thunderbird-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html --- thunderbird-140.5.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html 2025-11-08 04:45:10.000000000 +0000 +++ thunderbird-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html 2025-12-09 01:27:27.000000000 +0000 @@ -1,6 +1,7 @@ + RTCRtpScriptTransform Insertable Streams - Worker diff -Nru thunderbird-140.5.0esr/third_party/moz.build thunderbird-140.6.0esr/third_party/moz.build --- thunderbird-140.5.0esr/third_party/moz.build 2025-11-08 04:45:12.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/moz.build 2025-12-09 01:27:28.000000000 +0000 @@ -108,3 +108,6 @@ with Files("fmt"): BUG_COMPONENT = ("Core", "MFBT") + +with Files("zucchini/**"): + BUG_COMPONENT = ("Toolkit", "Application Update") diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/LICENSE thunderbird-140.6.0esr/third_party/zucchini/chromium/LICENSE --- thunderbird-140.5.0esr/third_party/zucchini/chromium/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/LICENSE 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,27 @@ +// Copyright 2015 The Chromium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ + +// Extensions for PA's copy of `//base/compiler_specific.h`. + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" + +// PA_ATTRIBUTE_RETURNS_NONNULL +// +// Tells the compiler that a function never returns a null pointer. +// Sourced from Abseil's `attributes.h`. +#if PA_HAS_ATTRIBUTE(returns_nonnull) +#define PA_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) +#else +#define PA_ATTRIBUTE_RETURNS_NONNULL +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,235 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ + +#include "build/build_config.h" + +// A wrapper around `__has_attribute`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_attribute) +#define PA_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +#define PA_HAS_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_builtin`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_builtin) +#define PA_HAS_BUILTIN(x) __has_builtin(x) +#else +#define PA_HAS_BUILTIN(x) 0 +#endif + +// Annotate a function indicating it should not be inlined. +// Use like: +// NOINLINE void DoStuff() { ... } +#if defined(__clang__) && PA_HAS_ATTRIBUTE(noinline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define PA_NOINLINE [[clang::noinline]] +#elif defined(COMPILER_GCC) && PA_HAS_ATTRIBUTE(noinline) +#define PA_NOINLINE __attribute__((noinline)) +#elif defined(COMPILER_MSVC) +#define PA_NOINLINE __declspec(noinline) +#else +#define PA_NOINLINE +#endif + +#if defined(__clang__) && defined(NDEBUG) && PA_HAS_ATTRIBUTE(always_inline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define PA_ALWAYS_INLINE [[clang::always_inline]] inline +#elif defined(COMPILER_GCC) && defined(NDEBUG) && \ + PA_HAS_ATTRIBUTE(always_inline) +#define PA_ALWAYS_INLINE inline __attribute__((__always_inline__)) +#elif defined(COMPILER_MSVC) && defined(NDEBUG) +#define PA_ALWAYS_INLINE __forceinline +#else +#define PA_ALWAYS_INLINE inline +#endif + +// Annotate a function indicating it should never be tail called. Useful to make +// sure callers of the annotated function are never omitted from call-stacks. +// To provide the complementary behavior (prevent the annotated function from +// being omitted) look at NOINLINE. Also note that this doesn't prevent code +// folding of multiple identical caller functions into a single signature. To +// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h. +// Use like: +// void NOT_TAIL_CALLED FooBar(); +#if defined(__clang__) && PA_HAS_ATTRIBUTE(not_tail_called) +#define PA_NOT_TAIL_CALLED [[clang::not_tail_called]] +#else +#define PA_NOT_TAIL_CALLED +#endif + +// Specify memory alignment for structs, classes, etc. +// Use like: +// class PA_ALIGNAS(16) MyClass { ... } +// PA_ALIGNAS(16) int array[4]; +// +// In most places you can use the C++11 keyword "alignas", which is preferred. +// +// Historically, compilers had trouble mixing __attribute__((...)) syntax with +// alignas(...) syntax. However, at least Clang is very accepting nowadays. It +// may be that this macro can be removed entirely. +#if defined(__clang__) +#define PA_ALIGNAS(byte_alignment) alignas(byte_alignment) +#elif defined(COMPILER_MSVC) +#define PA_ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) +#elif defined(COMPILER_GCC) && PA_HAS_ATTRIBUTE(aligned) +#define PA_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#endif + +// Tells the compiler a function is using a printf-style format string. +// |format_param| is the one-based index of the format string parameter; +// |dots_param| is the one-based index of the "..." parameter. +// For v*printf functions (which take a va_list), pass 0 for dots_param. +// (This is undocumented but matches what the system C headers do.) +// For member functions, the implicit this parameter counts as index 1. +#if (defined(COMPILER_GCC) || defined(__clang__)) && PA_HAS_ATTRIBUTE(format) +#define PA_PRINTF_FORMAT(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#else +#define PA_PRINTF_FORMAT(format_param, dots_param) +#endif + +// Sanitizers annotations. +#if PA_HAS_ATTRIBUTE(no_sanitize) +#define PA_NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#if !defined(PA_NO_SANITIZE) +#define PA_NO_SANITIZE(what) +#endif + +// MemorySanitizer annotations. +#if defined(MEMORY_SANITIZER) +#include + +// Mark a memory region fully initialized. +// Use this to annotate code that deliberately reads uninitialized data, for +// example a GC scavenging root set pointers from the stack. +#define PA_MSAN_UNPOISON(p, size) __msan_unpoison(p, size) +#else // MEMORY_SANITIZER +#define PA_MSAN_UNPOISON(p, size) +#endif // MEMORY_SANITIZER + +// Macro for hinting that an expression is likely to be false. +#if !defined(PA_UNLIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define PA_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define PA_UNLIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(PA_UNLIKELY) + +#if !defined(PA_LIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define PA_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define PA_LIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(PA_LIKELY) + +#if !defined(PA_CPU_ARM_NEON) +#if defined(__arm__) +#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \ + !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID) +#error Chromium does not support middle endian architecture +#endif +#if defined(__ARM_NEON__) +#define PA_CPU_ARM_NEON 1 +#endif +#endif // defined(__arm__) +#endif // !defined(CPU_ARM_NEON) + +#if !defined(PA_HAVE_MIPS_MSA_INTRINSICS) +#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) +#define PA_HAVE_MIPS_MSA_INTRINSICS 1 +#endif +#endif + +// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints +// to Clang which control what code paths are statically analyzed, +// and is meant to be used in conjunction with assert & assert-like functions. +// The expression is passed straight through if analysis isn't enabled. +// +// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current +// codepath and any other branching codepaths that might follow. +#if defined(__clang_analyzer__) + +namespace partition_alloc::internal { + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +inline constexpr bool AnalyzerAssumeTrue(bool arg) { + // PartitionAllocAnalyzerNoReturn() is invoked and analysis is terminated if + // |arg| is false. + return arg || AnalyzerNoReturn(); +} + +} // namespace partition_alloc::internal + +#define PA_ANALYZER_ASSUME_TRUE(arg) \ + ::partition_alloc::internal::AnalyzerAssumeTrue(!!(arg)) +#define PA_ANALYZER_SKIP_THIS_PATH() \ + static_cast(::partition_alloc::internal::AnalyzerNoReturn()) + +#else // !defined(__clang_analyzer__) + +#define PA_ANALYZER_ASSUME_TRUE(arg) (arg) +#define PA_ANALYZER_SKIP_THIS_PATH() + +#endif // defined(__clang_analyzer__) + +// Use nomerge attribute to disable optimization of merging multiple same calls. +#if defined(__clang__) && PA_HAS_ATTRIBUTE(nomerge) +#define PA_NOMERGE [[clang::nomerge]] +#else +#define PA_NOMERGE +#endif + +// Marks a type as being eligible for the "trivial" ABI despite having a +// non-trivial destructor or copy/move constructor. Such types can be relocated +// after construction by simply copying their memory, which makes them eligible +// to be passed in registers. The canonical example is std::unique_ptr. +// +// Use with caution; this has some subtle effects on constructor/destructor +// ordering and will be very incorrect if the type relies on its address +// remaining constant. When used as a function argument (by value), the value +// may be constructed in the caller's stack frame, passed in a register, and +// then used and destructed in the callee's stack frame. A similar thing can +// occur when values are returned. +// +// TRIVIAL_ABI is not needed for types which have a trivial destructor and +// copy/move constructors, such as base::TimeTicks and other POD. +// +// It is also not likely to be effective on types too large to be passed in one +// or two registers on typical target ABIs. +// +// See also: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html +#if defined(__clang__) && PA_HAS_ATTRIBUTE(trivial_abi) +#define PA_TRIVIAL_ABI [[clang::trivial_abi]] +#else +#define PA_TRIVIAL_ABI +#endif + +// Requires constant initialization. See constinit in C++20. Allows to rely on a +// variable being initialized before execution, and not requiring a global +// constructor. +#if PA_HAS_ATTRIBUTE(require_constant_initialization) +#define PA_CONSTINIT __attribute__((require_constant_initialization)) +#endif +#if !defined(PA_CONSTINIT) +#define PA_CONSTINIT +#endif + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 13) +#define PA_GSL_POINTER [[gsl::Pointer]] +#else +#define PA_GSL_POINTER +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,80 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ + +// Used to annotate symbols which are exported by the component named +// |component|. Note that this only does the right thing if the corresponding +// component target's sources are compiled with |IS_$component_IMPL| defined +// as 1. For example: +// +// class PA_COMPONENT_EXPORT(FOO) Bar {}; +// +// If IS_FOO_IMPL=1 at compile time, then Bar will be annotated using the +// PA_COMPONENT_EXPORT_ANNOTATION macro defined below. Otherwise it will be +// annotated using the PA_COMPONENT_IMPORT_ANNOTATION macro. +#define PA_COMPONENT_EXPORT(component) \ + PA_COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, \ + PA_COMPONENT_EXPORT_ANNOTATION, \ + PA_COMPONENT_IMPORT_ANNOTATION) + +// Indicates whether the current compilation unit is being compiled as part of +// the implementation of the component named |component|. Expands to |1| if +// |IS_$component_IMPL| is defined as |1|; expands to |0| otherwise. +// +// Note in particular that if |IS_$component_IMPL| is not defined at all, it is +// still fine to test PA_INSIDE_COMPONENT_IMPL(component), which expands to |0| +// as expected. +#define PA_INSIDE_COMPONENT_IMPL(component) \ + PA_COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, 1, 0) + +// Compiler-specific macros to annotate for export or import of a symbol. No-op +// in non-component builds. These should not see much if any direct use. +// Instead use the PA_COMPONENT_EXPORT macro defined above. +#if defined(COMPONENT_BUILD) +#if defined(WIN32) +#define PA_COMPONENT_EXPORT_ANNOTATION __declspec(dllexport) +#define PA_COMPONENT_IMPORT_ANNOTATION __declspec(dllimport) +#else // defined(WIN32) +#define PA_COMPONENT_EXPORT_ANNOTATION __attribute__((visibility("default"))) +#define PA_COMPONENT_IMPORT_ANNOTATION +#endif // defined(WIN32) +#else // defined(COMPONENT_BUILD) +#define PA_COMPONENT_EXPORT_ANNOTATION +#define PA_COMPONENT_IMPORT_ANNOTATION +#endif // defined(COMPONENT_BUILD) + +// Below this point are several internal utility macros used for the +// implementation of the above macros. Not intended for external use. + +// Helper for conditional expansion to one of two token strings. If |condition| +// expands to |1| then this macro expands to |consequent|; otherwise it expands +// to |alternate|. +#define PA_COMPONENT_MACRO_CONDITIONAL_(condition, consequent, alternate) \ + PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_( \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate) + +// MSVC workaround for __VA_ARGS__ expanding into one expression. +#define PA_MSVC_EXPAND_ARG(arg) arg + +// Expands to a comma (,) iff its first argument expands to |1|. Used in +// conjunction with |PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_()|, as the +// presence or absense of an extra comma can be used to conditionally shift +// subsequent argument positions and thus influence which argument is selected. +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_(...) \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__, ) +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_##x##_ +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_1_ , + +// Helper which simply selects its third argument. Used in conjunction with +// |PA_COMPONENT_MACRO_CONDITIONAL_COMMA_()| above to implement conditional +// macro expansion. +#define PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_(...) \ + PA_MSVC_EXPAND_ARG( \ + PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__)) +#define PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ + +namespace partition_alloc::internal::base { + +// std::is_constant_evaluated was introduced in C++20. PartitionAlloc's minimum +// supported C++ version is C++17. +#if defined(__cpp_lib_is_constant_evaluated) && \ + __cpp_lib_is_constant_evaluated >= 201811L + +#include +using std::is_constant_evaluated; + +#else + +#if defined(MOZ_ZUCCHINI) +#include "base/compiler_specific.h" +#endif // defined(MOZ_ZUCCHINI) + +// Implementation of C++20's std::is_constant_evaluated. +// +// References: +// - https://en.cppreference.com/w/cpp/types/is_constant_evaluated +// - https://wg21.link/meta.const.eval +constexpr bool is_constant_evaluated() noexcept { +#if !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) + return __builtin_is_constant_evaluated(); +#else + return false; +#endif // !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) +} + +#endif + +} // namespace partition_alloc::internal::base + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,264 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This header file contains macro definitions for thread safety annotations +// that allow developers to document the locking policies of multi-threaded +// code. The annotations can also help program analysis tools to identify +// potential thread safety issues. +// +// Note that no analysis is done inside constructors and destructors, +// regardless of what attributes are used. See +// https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#no-checking-inside-constructors-and-destructors +// for details. +// +// Note that the annotations we use are described as deprecated in the Clang +// documentation, linked below. E.g. we use PA_EXCLUSIVE_LOCKS_REQUIRED where +// the Clang docs use REQUIRES. +// +// http://clang.llvm.org/docs/ThreadSafetyAnalysis.html +// +// We use the deprecated Clang annotations to match Abseil (relevant header +// linked below) and its ecosystem of libraries. We will follow Abseil with +// respect to upgrading to more modern annotations. +// +// https://github.com/abseil/abseil-cpp/blob/master/absl/base/thread_annotations.h +// +// These annotations are implemented using compiler attributes. Using the macros +// defined here instead of raw attributes allow for portability and future +// compatibility. +// +// When referring to mutexes in the arguments of the attributes, you should +// use variable names or more complex expressions (e.g. my_object->mutex_) +// that evaluate to a concrete mutex object whenever possible. If the mutex +// you want to refer to is not in scope, you may use a member pointer +// (e.g. &MyClass::mutex_) to refer to a mutex in some (unknown) object. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ + +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "build/build_config.h" + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 9) +#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) +#else +#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op +#endif + +// PA_GUARDED_BY() +// +// Documents if a shared field or global variable needs to be protected by a +// mutex. PA_GUARDED_BY() allows the user to specify a particular mutex that +// should be held when accessing the annotated variable. +// +// Example: +// +// Mutex mu; +// int p1 PA_GUARDED_BY(mu); +#define PA_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) + +// PA_PT_GUARDED_BY() +// +// Documents if the memory location pointed to by a pointer should be guarded +// by a mutex when dereferencing the pointer. +// +// Example: +// Mutex mu; +// int *p1 PA_PT_GUARDED_BY(mu); +// +// Note that a pointer variable to a shared memory location could itself be a +// shared variable. +// +// Example: +// +// // `q`, guarded by `mu1`, points to a shared memory location that is +// // guarded by `mu2`: +// int *q PA_GUARDED_BY(mu1) PA_PT_GUARDED_BY(mu2); +#define PA_PT_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) + +// PA_ACQUIRED_AFTER() / PA_ACQUIRED_BEFORE() +// +// Documents the acquisition order between locks that can be held +// simultaneously by a thread. For any two locks that need to be annotated +// to establish an acquisition order, only one of them needs the annotation. +// (i.e. You don't have to annotate both locks with both PA_ACQUIRED_AFTER +// and PA_ACQUIRED_BEFORE.) +// +// Example: +// +// Mutex m1; +// Mutex m2 PA_ACQUIRED_AFTER(m1); +#define PA_ACQUIRED_AFTER(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) + +#define PA_ACQUIRED_BEFORE(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) + +// PA_EXCLUSIVE_LOCKS_REQUIRED() / PA_SHARED_LOCKS_REQUIRED() +// +// Documents a function that expects a mutex to be held prior to entry. +// The mutex is expected to be held both on entry to, and exit from, the +// function. +// +// Example: +// +// Mutex mu1, mu2; +// int a PA_GUARDED_BY(mu1); +// int b PA_GUARDED_BY(mu2); +// +// void foo() PA_EXCLUSIVE_LOCKS_REQUIRED(mu1, mu2) { ... }; +#define PA_EXCLUSIVE_LOCKS_REQUIRED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) + +#define PA_SHARED_LOCKS_REQUIRED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) + +// PA_LOCKS_EXCLUDED() +// +// Documents the locks acquired in the body of the function. These locks +// cannot be held when calling this function (as Abseil's `Mutex` locks are +// non-reentrant). +#define PA_LOCKS_EXCLUDED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) + +// PA_LOCK_RETURNED() +// +// Documents a function that returns a mutex without acquiring it. For example, +// a public getter method that returns a pointer to a private mutex should +// be annotated with PA_LOCK_RETURNED. +#define PA_LOCK_RETURNED(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) + +// PA_LOCKABLE +// +// Documents if a class/type is a lockable type (such as the `Mutex` class). +#define PA_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(lockable) + +// PA_SCOPED_LOCKABLE +// +// Documents if a class does RAII locking (such as the `MutexLock` class). +// The constructor should use `PA_*_LOCK_FUNCTION()` to specify the mutex that +// is acquired, and the destructor should use `PA_UNLOCK_FUNCTION()` with no +// arguments; the analysis will assume that the destructor unlocks whatever the +// constructor locked. +#define PA_SCOPED_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) + +// PA_EXCLUSIVE_LOCK_FUNCTION() +// +// Documents functions that acquire a lock in the body of a function, and do +// not release it. +#define PA_EXCLUSIVE_LOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) + +// PA_SHARED_LOCK_FUNCTION() +// +// Documents functions that acquire a shared (reader) lock in the body of a +// function, and do not release it. +#define PA_SHARED_LOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) + +// PA_UNLOCK_FUNCTION() +// +// Documents functions that expect a lock to be held on entry to the function, +// and release it in the body of the function. +#define PA_UNLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) + +// PA_EXCLUSIVE_TRYLOCK_FUNCTION() / PA_SHARED_TRYLOCK_FUNCTION() +// +// Documents functions that try to acquire a lock, and return success or failure +// (or a non-boolean value that can be interpreted as a boolean). +// The first argument should be `true` for functions that return `true` on +// success, or `false` for functions that return `false` on success. The second +// argument specifies the mutex that is locked on success. If unspecified, this +// mutex is assumed to be `this`. +#define PA_EXCLUSIVE_TRYLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) + +#define PA_SHARED_TRYLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) + +// PA_ASSERT_EXCLUSIVE_LOCK() / PA_ASSERT_SHARED_LOCK() +// +// Documents functions that dynamically check to see if a lock is held, and fail +// if it is not held. +#define PA_ASSERT_EXCLUSIVE_LOCK(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) + +#define PA_ASSERT_SHARED_LOCK(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) + +// PA_NO_THREAD_SAFETY_ANALYSIS +// +// Turns off thread safety checking within the body of a particular function. +// This annotation is used to mark functions that are known to be correct, but +// the locking behavior is more complicated than the analyzer can handle. +#define PA_NO_THREAD_SAFETY_ANALYSIS \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) + +//------------------------------------------------------------------------------ +// Tool-Supplied Annotations +//------------------------------------------------------------------------------ + +// PA_TS_UNCHECKED should be placed around lock expressions that are not valid +// C++ syntax, but which are present for documentation purposes. These +// annotations will be ignored by the analysis. +#define PA_TS_UNCHECKED(x) "" + +// PA_TS_FIXME is used to mark lock expressions that are not valid C++ syntax. +// It is used by automated tools to mark and disable invalid expressions. +// The annotation should either be fixed, or changed to PA_TS_UNCHECKED. +#define PA_TS_FIXME(x) "" + +// Like PA_NO_THREAD_SAFETY_ANALYSIS, this turns off checking within the body of +// a particular function. However, this attribute is used to mark functions +// that are incorrect and need to be fixed. It is used by automated tools to +// avoid breaking the build when the analysis is updated. +// Code owners are expected to eventually fix the routine. +#define PA_NO_THREAD_SAFETY_ANALYSIS_FIXME PA_NO_THREAD_SAFETY_ANALYSIS + +// Similar to PA_NO_THREAD_SAFETY_ANALYSIS_FIXME, this macro marks a +// PA_GUARDED_BY annotation that needs to be fixed, because it is producing +// thread safety warning. It disables the PA_GUARDED_BY. +#define PA_GUARDED_BY_FIXME(x) + +// Disables warnings for a single read operation. This can be used to avoid +// warnings when it is known that the read is not actually involved in a race, +// but the compiler cannot confirm that. +#define PA_TS_UNCHECKED_READ(x) \ + partition_alloc::internal::thread_safety_analysis::ts_unchecked_read(x) + +namespace partition_alloc::internal::thread_safety_analysis { + +// Takes a reference to a guarded data member, and returns an unguarded +// reference. +template +inline const T& ts_unchecked_read(const T& v) PA_NO_THREAD_SAFETY_ANALYSIS { + return v; +} + +template +inline T& ts_unchecked_read(T& v) PA_NO_THREAD_SAFETY_ANALYSIS { + return v; +} + +} // namespace partition_alloc::internal::thread_safety_analysis + +// The above is imported as-is from abseil-cpp. The following Chromium-specific +// synonyms are added for Chromium concepts (SequenceChecker/ThreadChecker). +#if BUILDFLAG(PA_DCHECK_IS_ON) + +// Equivalent to PA_GUARDED_BY for SequenceChecker/ThreadChecker. Currently, +#define PA_GUARDED_BY_CONTEXT(name) PA_GUARDED_BY(name) + +// Equivalent to PA_EXCLUSIVE_LOCKS_REQUIRED for SequenceChecker/ThreadChecker. +#define PA_VALID_CONTEXT_REQUIRED(name) PA_EXCLUSIVE_LOCKS_REQUIRED(name) + +#else // BUILDFLAG(PA_DCHECK_IS_ON) + +#define PA_GUARDED_BY_CONTEXT(name) +#define PA_VALID_CONTEXT_REQUIRED(name) + +#endif // BUILDFLAG(PA_DCHECK_IS_ON) + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,16 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ + +// Forward declare Windows compatible handles. + +#define PA_WINDOWS_HANDLE_TYPE(name) \ + struct name##__; \ + typedef struct name##__* name; +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc" +#undef PA_WINDOWS_HANDLE_TYPE + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,25 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file intentionally does not have header guards, it's included +// inside a macro to generate enum values. The following line silences a +// presubmit and Tricium warning that would otherwise be triggered by this: +// no-include-guard-because-multiply-included +// NOLINT(build/header_guard) + +// This file contains the list of Windows handle types that can be recognized +// via specific pointee types declared in //base/win/windows_types.h +// (e.g. `HDC` points to a fake/forward-declared `HDC__` struct). + +PA_WINDOWS_HANDLE_TYPE(HDC) +PA_WINDOWS_HANDLE_TYPE(HDESK) +PA_WINDOWS_HANDLE_TYPE(HGLRC) +PA_WINDOWS_HANDLE_TYPE(HICON) +PA_WINDOWS_HANDLE_TYPE(HINSTANCE) +PA_WINDOWS_HANDLE_TYPE(HKEY) +PA_WINDOWS_HANDLE_TYPE(HKL) +PA_WINDOWS_HANDLE_TYPE(HMENU) +PA_WINDOWS_HANDLE_TYPE(HWINSTA) +PA_WINDOWS_HANDLE_TYPE(HWND) +PA_WINDOWS_HANDLE_TYPE(HMONITOR) diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,333 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ + +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "build/build_config.h" + +// PA_CONFIG() uses a similar trick as BUILDFLAG() to allow the compiler catch +// typos or a missing #include. +// +// ----------------------------------------------------------------------------- +// Housekeeping Rules +// ----------------------------------------------------------------------------- +// 1. Prefix all config macros in this file with PA_CONFIG_ and define them in +// a function-like manner, e.g. PA_CONFIG_MY_SETTING(). +// 2. Both positive and negative cases must be defined. +// 3. Don't use PA_CONFIG_MY_SETTING() directly outside of this file, use +// PA_CONFIG(flag-without-PA_CONFIG_) instead, e.g. PA_CONFIG(MY_SETTING). +// 4. Do not use PA_CONFIG() when defining config macros, or it will lead to +// recursion. Either use #if/#else, or PA_CONFIG_MY_SETTING() directly. +// 5. Try to use constexpr instead of macros wherever possible. +// TODO(bartekn): Convert macros to constexpr or BUILDFLAG as much as possible. +#define PA_CONFIG(flag) (PA_CONFIG_##flag()) + +// Assert that the heuristic in partition_alloc.gni is accurate on supported +// configurations. +#if BUILDFLAG(HAS_64_BIT_POINTERS) +static_assert(sizeof(void*) == 8, ""); +#else +static_assert(sizeof(void*) != 8, ""); +#endif // PA_CONFIG(HAS_64_BITS_POINTERS) + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && \ + (defined(__ARM_NEON) || defined(__ARM_NEON__)) && defined(__ARM_FP) +#define PA_CONFIG_STARSCAN_NEON_SUPPORTED() 1 +#else +#define PA_CONFIG_STARSCAN_NEON_SUPPORTED() 0 +#endif + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && BUILDFLAG(IS_IOS) +// Allow PA to select an alternate pool size at run-time before initialization, +// rather than using a single constexpr value. +// +// This is needed on iOS because iOS test processes can't handle large pools +// (see crbug.com/1250788). +// +// This setting is specific to 64-bit, as 32-bit has a different implementation. +#define PA_CONFIG_DYNAMICALLY_SELECT_POOL_SIZE() 1 +#else +#define PA_CONFIG_DYNAMICALLY_SELECT_POOL_SIZE() 0 +#endif // BUILDFLAG(HAS_64_BIT_POINTERS) && BUILDFLAG(IS_IOS) + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) +#include +// TODO(bikineev): Enable for ChromeOS. +#define PA_CONFIG_STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED() \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) +#else +#define PA_CONFIG_STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED() 0 +#endif // BUILDFLAG(HAS_64_BIT_POINTERS) && + // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) + +#if BUILDFLAG(USE_STARSCAN) +// Use card table to avoid races for PCScan configuration without safepoints. +// The card table provides the guaranteee that for a marked card the underling +// super-page is fully initialized. +#define PA_CONFIG_STARSCAN_USE_CARD_TABLE() 1 +#else +// The card table is permanently disabled for 32-bit. +#define PA_CONFIG_STARSCAN_USE_CARD_TABLE() 0 +#endif // BUILDFLAG(USE_STARSCAN) + +// Use batched freeing when sweeping pages. This builds up a freelist in the +// scanner thread and appends to the slot-span's freelist only once. +#define PA_CONFIG_STARSCAN_BATCHED_FREE() 1 + +// TODO(bikineev): Temporarily disable inlining in *Scan to get clearer +// stacktraces. +#define PA_CONFIG_STARSCAN_NOINLINE_SCAN_FUNCTIONS() 1 + +// TODO(bikineev): Temporarily disable *Scan in MemoryReclaimer as it seems to +// cause significant jank. +#define PA_CONFIG_STARSCAN_ENABLE_STARSCAN_ON_RECLAIM() 0 + +// Double free detection comes with expensive cmpxchg (with the loop around it). +// We currently disable it to improve the runtime. +#define PA_CONFIG_STARSCAN_EAGER_DOUBLE_FREE_DETECTION_ENABLED() 0 + +// POSIX is not only UNIX, e.g. macOS and other OSes. We do use Linux-specific +// features such as futex(2). +#define PA_CONFIG_HAS_LINUX_KERNEL() \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)) + +// On some platforms, we implement locking by spinning in userspace, then going +// into the kernel only if there is contention. This requires platform support, +// namely: +// - On Linux, futex(2) +// - On Windows, a fast userspace "try" operation which is available with +// SRWLock +// - On macOS, pthread_mutex_trylock() is fast by default starting with macOS +// 10.14. Chromium targets an earlier version, so it cannot be known at +// compile-time. So we use something different. +// TODO(https://crbug.com/1459032): macOS 10.15 is now required; switch to +// better locking. +// - Otherwise, on POSIX we assume that a fast userspace pthread_mutex_trylock() +// is available. +// +// Otherwise, a userspace spinlock implementation is used. +#if PA_CONFIG(HAS_LINUX_KERNEL) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || \ + BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define PA_CONFIG_HAS_FAST_MUTEX() 1 +#else +#define PA_CONFIG_HAS_FAST_MUTEX() 0 +#endif + +// If defined, enables zeroing memory on Free() with roughly 1% probability. +// This applies only to normal buckets, as direct-map allocations are always +// decommitted. +// TODO(bartekn): Re-enable once PartitionAlloc-Everywhere evaluation is done. +#define PA_CONFIG_ZERO_RANDOMLY_ON_FREE() 0 + +// Need TLS support. +#define PA_CONFIG_THREAD_CACHE_SUPPORTED() \ + (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)) + +// Too expensive for official builds, as it adds cache misses to all +// allocations. On the other hand, we want wide metrics coverage to get +// realistic profiles. +#define PA_CONFIG_THREAD_CACHE_ALLOC_STATS() \ + (BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && !defined(OFFICIAL_BUILD)) + +// Optional statistics collection. Lightweight, contrary to the ones above, +// hence enabled by default. +#define PA_CONFIG_THREAD_CACHE_ENABLE_STATISTICS() 1 + +// Enable free list shadow entry to strengthen hardening as much as possible. +// The shadow entry is an inversion (bitwise-NOT) of the encoded `next` pointer. +// +// Disabled when ref-count is placed in the previous slot, as it will overlap +// with the shadow for the smallest slots. +// +// Disabled on Big Endian CPUs, because encoding is also a bitwise-NOT there, +// making the shadow entry equal to the original, valid pointer to the next +// slot. In case Use-after-Free happens, we'd rather not hand out a valid, +// ready-to-use pointer. +#define PA_CONFIG_HAS_FREELIST_SHADOW_ENTRY() \ + (!BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) && \ + defined(ARCH_CPU_LITTLE_ENDIAN)) + +#define PA_CONFIG_HAS_MEMORY_TAGGING() \ + (defined(ARCH_CPU_ARM64) && defined(__clang__) && \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID))) + +#if PA_CONFIG(HAS_MEMORY_TAGGING) +static_assert(sizeof(void*) == 8); +#endif + +// If memory tagging is enabled with BRP previous slot, the MTE tag and BRP ref +// count will cause a race (crbug.com/1445816). To prevent this, the +// ref_count_size is increased to the MTE granule size and the ref count is not +// tagged. +#if PA_CONFIG(HAS_MEMORY_TAGGING) && \ + BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) && \ + BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) +#define PA_CONFIG_INCREASE_REF_COUNT_SIZE_FOR_MTE() 1 +#else +#define PA_CONFIG_INCREASE_REF_COUNT_SIZE_FOR_MTE() 0 +#endif + +// Specifies whether allocation extras need to be added. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +#define PA_CONFIG_EXTRAS_REQUIRED() 1 +#else +#define PA_CONFIG_EXTRAS_REQUIRED() 0 +#endif + +// Count and total wall clock time spent in memory related system calls. This +// doesn't cover all system calls, in particular the ones related to locking. +// +// Not enabled by default, as it has a runtime cost, and causes issues with some +// builds (e.g. Windows). +// However the total count is collected on all platforms. +#define PA_CONFIG_COUNT_SYSCALL_TIME() 0 + +// On Windows, |thread_local| variables cannot be marked "dllexport", see +// compiler error C2492 at +// https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2492?view=msvc-160. +// Don't use it there. +// +// On macOS and iOS: +// - With PartitionAlloc-Everywhere, thread_local allocates, reentering the +// allocator. +// - Component builds triggered a clang bug: crbug.com/1243375 +// +// Regardless, the "normal" TLS access is fast on x86_64 (see partition_tls.h), +// so don't bother with thread_local anywhere. +#define PA_CONFIG_THREAD_LOCAL_TLS() \ + (!(BUILDFLAG(IS_WIN) && defined(COMPONENT_BUILD)) && !BUILDFLAG(IS_APPLE)) + +// When PartitionAlloc is malloc(), detect malloc() becoming re-entrant by +// calling malloc() again. +// +// Limitations: +// - BUILDFLAG(PA_DCHECK_IS_ON) due to runtime cost +// - thread_local TLS to simplify the implementation +// - Not on Android due to bot failures +#if BUILDFLAG(PA_DCHECK_IS_ON) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \ + PA_CONFIG(THREAD_LOCAL_TLS) && !BUILDFLAG(IS_ANDROID) +#define PA_CONFIG_HAS_ALLOCATION_GUARD() 1 +#else +#define PA_CONFIG_HAS_ALLOCATION_GUARD() 0 +#endif + +// On Android, we have to go through emutls, since this is always a shared +// library, so don't bother. +#if PA_CONFIG(THREAD_LOCAL_TLS) && !BUILDFLAG(IS_ANDROID) +#define PA_CONFIG_THREAD_CACHE_FAST_TLS() 1 +#else +#define PA_CONFIG_THREAD_CACHE_FAST_TLS() 0 +#endif + +// Lazy commit should only be enabled on Windows, because commit charge is +// only meaningful and limited on Windows. It affects performance on other +// platforms and is simply not needed there due to OS supporting overcommit. +#if BUILDFLAG(IS_WIN) +constexpr bool kUseLazyCommit = true; +#else +constexpr bool kUseLazyCommit = false; +#endif + +// On these platforms, lock all the partitions before fork(), and unlock after. +// This may be required on more platforms in the future. +#define PA_CONFIG_HAS_ATFORK_HANDLER() \ + (BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) + +// PartitionAlloc uses PartitionRootEnumerator to acquire all +// PartitionRoots at BeforeFork and to release at AfterFork. +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && PA_CONFIG(HAS_ATFORK_HANDLER) +#define PA_CONFIG_USE_PARTITION_ROOT_ENUMERATOR() 1 +#else +#define PA_CONFIG_USE_PARTITION_ROOT_ENUMERATOR() 0 +#endif + +// Due to potential conflict with the free list pointer in the "previous slot" +// mode in the smallest bucket, we can't check both the cookie and the dangling +// raw_ptr at the same time. +#define PA_CONFIG_REF_COUNT_CHECK_COOKIE() \ + (!(BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS) && \ + BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT)) && \ + (BUILDFLAG(PA_DCHECK_IS_ON) || \ + BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS))) + +// Use available space in the reference count to store the initially requested +// size from the application. This is used for debugging. +#if !PA_CONFIG(REF_COUNT_CHECK_COOKIE) && \ + !BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS) +// Set to 1 when needed. +#define PA_CONFIG_REF_COUNT_STORE_REQUESTED_SIZE() 0 +#else +// You probably want it at 0, outside of local testing, or else +// PartitionRefCount will grow past 8B. +#define PA_CONFIG_REF_COUNT_STORE_REQUESTED_SIZE() 0 +#endif + +#if PA_CONFIG(REF_COUNT_STORE_REQUESTED_SIZE) && \ + PA_CONFIG(REF_COUNT_CHECK_COOKIE) +#error "Cannot use a cookie *and* store the allocation size" +#endif + +// Prefer smaller slot spans. +// +// Smaller slot spans may improve dirty memory fragmentation, but may also +// increase address space usage. +// +// This is intended to roll out more broadly, but only enabled on Linux for now +// to get performance bot and real-world data pre-A/B experiment. +// +// Also enabled on ARM64 macOS, as the 16kiB pages on this platform lead to +// larger slot spans. +#define PA_CONFIG_PREFER_SMALLER_SLOT_SPANS() \ + (BUILDFLAG(IS_LINUX) || (BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64))) + +// Enable shadow metadata. +// +// With this flag, shadow pools will be mapped, on which writable shadow +// metadatas are placed, and the real metadatas are set to read-only instead. +// This feature is only enabled with 64-bit environment because pools work +// differently with 32-bits pointers (see glossary). +#if BUILDFLAG(ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS) && \ + BUILDFLAG(HAS_64_BIT_POINTERS) +#define PA_CONFIG_ENABLE_SHADOW_METADATA() 1 +#else +#define PA_CONFIG_ENABLE_SHADOW_METADATA() 0 +#endif + +// According to crbug.com/1349955#c24, macOS 11 has a bug where they asset that +// malloc_size() of an allocation is equal to the requested size. This is +// generally not true. The assert passed only because it happened to be true for +// the sizes they requested. BRP changes that, hence can't be deployed without a +// workaround. +// +// The bug has been fixed in macOS 12. Here we can only check the platform, and +// the version is checked dynamically later. +#define PA_CONFIG_ENABLE_MAC11_MALLOC_SIZE_HACK() \ + (BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) && BUILDFLAG(IS_MAC)) + +#if BUILDFLAG(ENABLE_POINTER_COMPRESSION) + +#if PA_CONFIG(DYNAMICALLY_SELECT_POOL_SIZE) +#error "Dynamically selected pool size is currently not supported" +#endif +#if PA_CONFIG(HAS_MEMORY_TAGGING) +// TODO(1376980): Address MTE once it's enabled. +#error "Compressed pointers don't support tag in the upper bits" +#endif + +#endif // BUILDFLAG(ENABLE_POINTER_COMPRESSION) + +// PA_CONFIG(IS_NONCLANG_MSVC): mimics the compound condition used by +// Chromium's `//base/compiler_specific.h` to detect true (non-Clang) +// MSVC. +#if defined(COMPILER_MSVC) && !defined(__clang__) +#define PA_CONFIG_IS_NONCLANG_MSVC() 1 +#else +#define PA_CONFIG_IS_NONCLANG_MSVC() 0 +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,94 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ + +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" + +namespace partition_alloc { + +namespace internal { + +// Alignment has two constraints: +// - Alignment requirement for scalar types: alignof(std::max_align_t) +// - Alignment requirement for operator new(). +// +// The two are separate on Windows 64 bits, where the first one is 8 bytes, and +// the second one 16. We could technically return something different for +// malloc() and operator new(), but this would complicate things, and most of +// our allocations are presumably coming from operator new() anyway. +#if !defined(MOZ_ZUCCHINI) +constexpr size_t kAlignment = + std::max(alignof(max_align_t), + static_cast(__STDCPP_DEFAULT_NEW_ALIGNMENT__)); +static_assert(kAlignment <= 16, + "PartitionAlloc doesn't support a fundamental alignment larger " + "than 16 bytes."); +#endif // !defined(MOZ_ZUCCHINI) + +struct SlotSpanMetadata; +class PA_LOCKABLE Lock; + +// This type trait verifies a type can be used as a pointer offset. +// +// We support pointer offsets in signed (ptrdiff_t) or unsigned (size_t) values. +// Smaller types are also allowed. +template +static constexpr bool is_offset_type = + std::is_integral_v && sizeof(Z) <= sizeof(ptrdiff_t); + +} // namespace internal + +class PartitionStatsDumper; + +struct PartitionRoot; + +namespace internal { +// Declare PartitionRootLock() for thread analysis. Its implementation +// is defined in partition_root.h. +Lock& PartitionRootLock(PartitionRoot*); +} // namespace internal + +} // namespace partition_alloc + +// From https://clang.llvm.org/docs/AttributeReference.html#malloc: +// +// The malloc attribute indicates that the function acts like a system memory +// allocation function, returning a pointer to allocated storage disjoint from +// the storage for any other object accessible to the caller. +// +// Note that it doesn't apply to realloc()-type functions, as they can return +// the same pointer as the one passed as a parameter, as noted in e.g. stdlib.h +// on Linux systems. +#if PA_HAS_ATTRIBUTE(malloc) +#define PA_MALLOC_FN __attribute__((malloc)) +#endif + +// Allows the compiler to assume that the return value is aligned on a +// kAlignment boundary. This is useful for e.g. using aligned vector +// instructions in the constructor for zeroing. +#if PA_HAS_ATTRIBUTE(assume_aligned) +#define PA_MALLOC_ALIGNED \ + __attribute__((assume_aligned(::partition_alloc::internal::kAlignment))) +#endif + +#if !defined(PA_MALLOC_FN) +#define PA_MALLOC_FN +#endif + +#if !defined(PA_MALLOC_ALIGNED) +#define PA_MALLOC_ALIGNED +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,1049 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ + +#include +#include + +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" +#include "base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h" +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/partition_alloc_forward.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h" +#include "build/build_config.h" +#include "build/buildflag.h" + +#if BUILDFLAG(IS_WIN) +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h" +#endif + +#if BUILDFLAG(USE_PARTITION_ALLOC) +#include "base/allocator/partition_allocator/partition_alloc_base/check.h" +// Live implementation of MiraclePtr being built. +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || \ + BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) +#define PA_RAW_PTR_CHECK(condition) PA_BASE_CHECK(condition) +#else +// No-op implementation of MiraclePtr being built. +// Note that `PA_BASE_DCHECK()` evaporates from non-DCHECK builds, +// minimizing impact of generated code. +#define PA_RAW_PTR_CHECK(condition) PA_BASE_DCHECK(condition) +#endif // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) +#else // BUILDFLAG(USE_PARTITION_ALLOC) +// Without PartitionAlloc, there's no `PA_BASE_D?CHECK()` implementation +// available. +#define PA_RAW_PTR_CHECK(condition) +#endif // BUILDFLAG(USE_PARTITION_ALLOC) + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +#include "base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h" +#elif BUILDFLAG(USE_ASAN_UNOWNED_PTR) +#include "base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h" +#elif BUILDFLAG(USE_HOOKABLE_RAW_PTR) +#include "base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h" +#else +#include "base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h" +#endif + +namespace cc { +class Scheduler; +} +namespace base::internal { +class DelayTimerBase; +} +namespace content::responsiveness { +class Calculator; +} + +namespace base { + +// NOTE: All methods should be `PA_ALWAYS_INLINE`. raw_ptr is meant to be a +// lightweight replacement of a raw pointer, hence performance is critical. + +// This is a bitfield representing the different flags that can be applied to a +// raw_ptr. +// +// Internal use only: Developers shouldn't use those values directly. +// +// Housekeeping rules: Try not to change trait values, so that numeric trait +// values stay constant across builds (could be useful e.g. when analyzing stack +// traces). A reasonable exception to this rule are `*ForTest` traits. As a +// matter of fact, we propose that new non-test traits are added before the +// `*ForTest` traits. +enum class RawPtrTraits : unsigned { + kEmpty = 0, + + // Disables dangling pointer detection, but keeps other raw_ptr protections. + // + // Don't use directly, use DisableDanglingPtrDetection or DanglingUntriaged + // instead. + kMayDangle = (1 << 0), + + // Disables any hooks, when building with BUILDFLAG(USE_HOOKABLE_RAW_PTR). + // + // Internal use only. + kDisableHooks = (1 << 2), + + // Pointer arithmetic is discouraged and disabled by default. + // + // Don't use directly, use AllowPtrArithmetic instead. + kAllowPtrArithmetic = (1 << 3), + + // This pointer is evaluated by a separate, Ash-related experiment. + // + // Don't use directly, use ExperimentalAsh instead. + kExperimentalAsh = (1 << 4), + + // *** ForTest traits below *** + + // Adds accounting, on top of the chosen implementation, for test purposes. + // raw_ptr/raw_ref with this trait perform extra bookkeeping, e.g. to track + // the number of times the raw_ptr is wrapped, unwrapped, etc. + // + // Test only. Include raw_ptr_counting_wrapper_impl_for_test.h in your test + // files when using this trait. + kUseCountingWrapperForTest = (1 << 10), + + // Helper trait that can be used to test raw_ptr's behaviour or conversions. + // + // Test only. + kDummyForTest = (1 << 11), +}; + +// Used to combine RawPtrTraits: +constexpr RawPtrTraits operator|(RawPtrTraits a, RawPtrTraits b) { + return static_cast(static_cast(a) | + static_cast(b)); +} +constexpr RawPtrTraits operator&(RawPtrTraits a, RawPtrTraits b) { + return static_cast(static_cast(a) & + static_cast(b)); +} +constexpr RawPtrTraits operator~(RawPtrTraits a) { + return static_cast(~static_cast(a)); +} + +namespace raw_ptr_traits { + +constexpr bool Contains(RawPtrTraits a, RawPtrTraits b) { + return (a & b) != RawPtrTraits::kEmpty; +} + +constexpr RawPtrTraits Remove(RawPtrTraits a, RawPtrTraits b) { + return a & ~b; +} + +constexpr bool AreValid(RawPtrTraits traits) { + return Remove(traits, RawPtrTraits::kMayDangle | RawPtrTraits::kDisableHooks | + RawPtrTraits::kAllowPtrArithmetic | + RawPtrTraits::kExperimentalAsh | + RawPtrTraits::kUseCountingWrapperForTest | + RawPtrTraits::kDummyForTest) == + RawPtrTraits::kEmpty; +} + +// IsSupportedType::value answers whether raw_ptr 1) compiles and 2) is +// always safe at runtime. Templates that may end up using `raw_ptr` should +// use IsSupportedType to ensure that raw_ptr is not used with unsupported +// types. As an example, see how base::internal::StorageTraits uses +// IsSupportedType as a condition for using base::internal::UnretainedWrapper +// (which has a `ptr_` field that will become `raw_ptr` after the Big +// Rewrite). +template +struct IsSupportedType { + static constexpr bool value = true; +}; + +// raw_ptr is not compatible with function pointer types. Also, they don't +// even need the raw_ptr protection, because they don't point on heap. +template +struct IsSupportedType::value>> { + static constexpr bool value = false; +}; + +// This section excludes some types from raw_ptr to avoid them from being +// used inside base::Unretained in performance sensitive places. These were +// identified from sampling profiler data. See crbug.com/1287151 for more info. +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; + +#if __OBJC__ +// raw_ptr is not compatible with pointers to Objective-C classes for a +// multitude of reasons. They may fail to compile in many cases, and wouldn't +// work well with tagged pointers. Anyway, Objective-C objects have their own +// way of tracking lifespan, hence don't need the raw_ptr protection as much. +// +// Such pointers are detected by checking if they're convertible to |id| type. +template +struct IsSupportedType::value>> { + static constexpr bool value = false; +}; +#endif // __OBJC__ + +#if BUILDFLAG(IS_WIN) +// raw_ptr is unsafe at runtime - if the handle happens to also +// represent a valid pointer into a PartitionAlloc-managed region then it can +// lead to manipulating random memory when treating it as BackupRefPtr +// ref-count. See also https://crbug.com/1262017. +// +// TODO(https://crbug.com/1262017): Cover other handle types like HANDLE, +// HLOCAL, HINTERNET, or HDEVINFO. Maybe we should avoid using raw_ptr when +// T=void (as is the case in these handle types). OTOH, explicit, +// non-template-based raw_ptr should be allowed. Maybe this can be solved +// by having 2 traits: IsPointeeAlwaysSafe (to be used in templates) and +// IsPointeeUsuallySafe (to be used in the static_assert in raw_ptr). The +// upside of this approach is that it will safely handle base::Bind closing over +// HANDLE. The downside of this approach is that base::Bind closing over a +// void* pointer will not get UaF protection. +#define PA_WINDOWS_HANDLE_TYPE(name) \ + template <> \ + struct IsSupportedType { \ + static constexpr bool value = false; \ + }; +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc" +#undef PA_WINDOWS_HANDLE_TYPE +#endif + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +template +using UnderlyingImplForTraits = internal::RawPtrBackupRefImpl< + /*AllowDangling=*/Contains(Traits, RawPtrTraits::kMayDangle), + /*ExperimentalAsh=*/Contains(Traits, RawPtrTraits::kExperimentalAsh)>; + +#elif BUILDFLAG(USE_ASAN_UNOWNED_PTR) +template +using UnderlyingImplForTraits = + internal::RawPtrAsanUnownedImpl; + +#elif BUILDFLAG(USE_HOOKABLE_RAW_PTR) +template +using UnderlyingImplForTraits = internal::RawPtrHookableImpl< + /*EnableHooks=*/!Contains(Traits, RawPtrTraits::kDisableHooks)>; + +#else +template +using UnderlyingImplForTraits = internal::RawPtrNoOpImpl; +#endif + +} // namespace raw_ptr_traits + +namespace test { + +template +struct RawPtrCountingImplWrapperForTest; + +} // namespace test + +namespace raw_ptr_traits { + +// ImplForTraits is the struct that implements raw_ptr functions. Think of +// raw_ptr as a thin wrapper, that directs calls to ImplForTraits. ImplForTraits +// may be different from UnderlyingImplForTraits, because it may include a +// wrapper. +template +using ImplForTraits = std::conditional_t< + Contains(Traits, RawPtrTraits::kUseCountingWrapperForTest), + test::RawPtrCountingImplWrapperForTest< + Remove(Traits, RawPtrTraits::kUseCountingWrapperForTest)>, + UnderlyingImplForTraits>; + +} // namespace raw_ptr_traits + +// `raw_ptr` is a non-owning smart pointer that has improved memory-safety +// over raw pointers. It behaves just like a raw pointer on platforms where +// USE_BACKUP_REF_PTR is off, and almost like one when it's on (the main +// difference is that it's zero-initialized and cleared on destruction and +// move). Unlike `std::unique_ptr`, `base::scoped_refptr`, etc., it +// doesn’t manage ownership or lifetime of an allocated object - you are still +// responsible for freeing the object when no longer used, just as you would +// with a raw C++ pointer. +// +// Compared to a raw C++ pointer, on platforms where USE_BACKUP_REF_PTR is on, +// `raw_ptr` incurs additional performance overhead for initialization, +// destruction, and assignment (including `ptr++` and `ptr += ...`). There is +// no overhead when dereferencing a pointer. +// +// `raw_ptr` is beneficial for security, because it can prevent a significant +// percentage of Use-after-Free (UaF) bugs from being exploitable. `raw_ptr` +// has limited impact on stability - dereferencing a dangling pointer remains +// Undefined Behavior. Note that the security protection is not yet enabled by +// default. +// +// raw_ptr is marked as [[gsl::Pointer]] which allows the compiler to catch +// some bugs where the raw_ptr holds a dangling pointer to a temporary object. +// However the [[gsl::Pointer]] analysis expects that such types do not have a +// non-default move constructor/assignment. Thus, it's possible to get an error +// where the pointer is not actually dangling, and have to work around the +// compiler. We have not managed to construct such an example in Chromium yet. +template +class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { + public: + using Impl = typename raw_ptr_traits::ImplForTraits; + // Needed to make gtest Pointee matcher work with raw_ptr. + using element_type = T; + using DanglingType = raw_ptr; + +#if !BUILDFLAG(USE_PARTITION_ALLOC) + // See comment at top about `PA_RAW_PTR_CHECK()`. + static_assert(std::is_same_v); +#endif // !BUILDFLAG(USE_PARTITION_ALLOC) + + static_assert(raw_ptr_traits::AreValid(Traits), "Unknown raw_ptr trait(s)"); + static_assert(raw_ptr_traits::IsSupportedType::value, + "raw_ptr doesn't work with this kind of pointee type T"); + + // TODO(bartekn): Turn on zeroing as much as possible, to reduce + // pointer-related UBs. In the current implementation we do it only when the + // underlying implementation needs it for correctness, for performance + // reasons. There are two secnarios where it's important: + // 1. When rewriting renderer, we don't want extra overhead get in the way of + // our perf evaluation. + // 2. The same applies to rewriting 3rd party libraries, but also we want + // RawPtrNoOpImpl to be a true no-op, in case the library is linked with + // a product other than Chromium (this can be mitigated using + // `build_with_chromium` GN variable). + static constexpr bool kZeroOnInit = Impl::kMustZeroOnInit; + static constexpr bool kZeroOnMove = Impl::kMustZeroOnMove; + static constexpr bool kZeroOnDestruct = Impl::kMustZeroOnDestruct; + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || \ + BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + // BackupRefPtr requires a non-trivial default constructor, destructor, etc. + PA_ALWAYS_INLINE constexpr raw_ptr() noexcept { + if constexpr (kZeroOnInit) { + wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr(const raw_ptr& p) noexcept + : wrapped_ptr_(Impl::Duplicate(p.wrapped_ptr_)) {} + + PA_ALWAYS_INLINE constexpr raw_ptr(raw_ptr&& p) noexcept { + wrapped_ptr_ = p.wrapped_ptr_; + if constexpr (kZeroOnMove) { + p.wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(const raw_ptr& p) noexcept { + // Duplicate before releasing, in case the pointer is assigned to itself. + // + // Unlike the move version of this operator, don't add |this != &p| branch, + // for performance reasons. Even though Duplicate() is not cheap, we + // practically never assign a raw_ptr to itself. We suspect that a + // cumulative cost of a conditional branch, even if always correctly + // predicted, would exceed that. + T* new_ptr = Impl::Duplicate(p.wrapped_ptr_); + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = new_ptr; + return *this; + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(raw_ptr&& p) noexcept { + // Unlike the the copy version of this operator, this branch is necessaty + // for correctness. + if (PA_LIKELY(this != &p)) { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = p.wrapped_ptr_; + if constexpr (kZeroOnMove) { + p.wrapped_ptr_ = nullptr; + } + } + return *this; + } + +// Constexpr destructors were introduced in C++20. PartitionAlloc's minimum +// supported C++ version is C++17. +#if defined(__cpp_constexpr) && __cpp_constexpr >= 201907L + PA_ALWAYS_INLINE constexpr ~raw_ptr() noexcept { +#else + PA_ALWAYS_INLINE ~raw_ptr() noexcept { +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + // Work around external issues where raw_ptr is used after destruction. + if constexpr (kZeroOnDestruct) { + wrapped_ptr_ = nullptr; + } + } + +#else // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + + // raw_ptr can be trivially default constructed (leaving |wrapped_ptr_| + // uninitialized). + PA_ALWAYS_INLINE constexpr raw_ptr() noexcept = default; + + // In addition to nullptr_t ctor above, raw_ptr needs to have these + // as |=default| or |constexpr| to avoid hitting -Wglobal-constructors in + // cases like this: + // struct SomeStruct { int int_field; raw_ptr ptr_field; }; + // SomeStruct g_global_var = { 123, nullptr }; + PA_ALWAYS_INLINE raw_ptr(const raw_ptr&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr(raw_ptr&&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr& operator=(const raw_ptr&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr& operator=(raw_ptr&&) noexcept = default; + + PA_ALWAYS_INLINE ~raw_ptr() noexcept = default; + + // With default constructor, destructor and move operations, we don't have an + // opportunity to zero the underlying pointer, so ensure this isn't expected. + static_assert(!kZeroOnInit); + static_assert(!kZeroOnMove); + static_assert(!kZeroOnDestruct); +#endif // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + + // Cross-kind copy constructor. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. + template > + PA_ALWAYS_INLINE constexpr explicit raw_ptr( + const raw_ptr& p) noexcept + : wrapped_ptr_(Impl::WrapRawPtrForDuplication( + raw_ptr_traits::ImplForTraits:: + UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_))) { + // Limit cross-kind conversions only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + } + + // Cross-kind assignment. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. + template > + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + const raw_ptr& p) noexcept { + // Limit cross-kind assignments only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::WrapRawPtrForDuplication( + raw_ptr_traits::ImplForTraits< + PassedTraits>::UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_)); + return *this; + } + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // Ignore kZeroOnInit, because here the caller explicitly wishes to initialize + // with nullptr. NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(std::nullptr_t) noexcept + : wrapped_ptr_(nullptr) {} + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(T* p) noexcept + : wrapped_ptr_(Impl::WrapRawPtr(p)) {} + + // Deliberately implicit in order to support implicit upcast. + template ::value && + !std::is_void::type>::value>> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(const raw_ptr& ptr) noexcept + : wrapped_ptr_( + Impl::Duplicate(Impl::template Upcast(ptr.wrapped_ptr_))) {} + // Deliberately implicit in order to support implicit upcast. + template ::value && + !std::is_void::type>::value>> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(raw_ptr&& ptr) noexcept + : wrapped_ptr_(Impl::template Upcast(ptr.wrapped_ptr_)) { + if constexpr (kZeroOnMove) { + ptr.wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(std::nullptr_t) noexcept { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = nullptr; + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(T* p) noexcept { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::WrapRawPtr(p); + return *this; + } + + // Upcast assignment + template ::value && + !std::is_void::type>::value>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + const raw_ptr& ptr) noexcept { + // Make sure that pointer isn't assigned to itself (look at raw_ptr address, + // not its contained pointer value). The comparison is only needed when they + // are the same type, otherwise they can't be the same raw_ptr object. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS) + if constexpr (std::is_same_v>) { + PA_RAW_PTR_CHECK(this != &ptr); + } +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = + Impl::Duplicate(Impl::template Upcast(ptr.wrapped_ptr_)); + return *this; + } + template ::value && + !std::is_void::type>::value>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + raw_ptr&& ptr) noexcept { + // Make sure that pointer isn't assigned to itself (look at raw_ptr address, + // not its contained pointer value). The comparison is only needed when they + // are the same type, otherwise they can't be the same raw_ptr object. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS) + if constexpr (std::is_same_v>) { + PA_RAW_PTR_CHECK(this != &ptr); + } +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::template Upcast(ptr.wrapped_ptr_); + if constexpr (kZeroOnMove) { + ptr.wrapped_ptr_ = nullptr; + } + return *this; + } + + // Avoid using. The goal of raw_ptr is to be as close to raw pointer as + // possible, so use it only if absolutely necessary (e.g. for const_cast). + PA_ALWAYS_INLINE constexpr T* get() const { return GetForExtraction(); } + + PA_ALWAYS_INLINE constexpr explicit operator bool() const { + return !!wrapped_ptr_; + } + + template ::type>::value>> + PA_ALWAYS_INLINE constexpr U& operator*() const { + return *GetForDereference(); + } + PA_ALWAYS_INLINE constexpr T* operator->() const { + return GetForDereference(); + } + + // Disables `(my_raw_ptr->*pmf)(...)` as a workaround for + // the ICE in GCC parsing the code, reported at + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103455 + template + void operator->*(PMF) const = delete; + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr operator T*() const { return GetForExtraction(); } + template + PA_ALWAYS_INLINE constexpr explicit operator U*() const { + // This operator may be invoked from static_cast, meaning the types may not + // be implicitly convertible, hence the need for static_cast here. + return static_cast(GetForExtraction()); + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator++() { + wrapped_ptr_ = Impl::Advance(wrapped_ptr_, 1); + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr& operator--() { + wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, 1); + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr operator++(int /* post_increment */) { + raw_ptr result = *this; + ++(*this); + return result; + } + PA_ALWAYS_INLINE constexpr raw_ptr operator--(int /* post_decrement */) { + raw_ptr result = *this; + --(*this); + return result; + } + template < + typename Z, + typename = std::enable_if_t>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator+=(Z delta_elems) { + wrapped_ptr_ = Impl::Advance(wrapped_ptr_, delta_elems); + return *this; + } + template < + typename Z, + typename = std::enable_if_t>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator-=(Z delta_elems) { + wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, delta_elems); + return *this; + } + + // Do not disable operator+() and operator-(). + // They provide OOB checks, which prevent from assigning an arbitrary value to + // raw_ptr, leading BRP to modifying arbitrary memory thinking it's ref-count. + // Keep them enabled, which may be blocked later when attempting to apply the + // += or -= operation, when disabled. In the absence of operators +/-, the + // compiler is free to implicitly convert to the underlying T* representation + // and perform ordinary pointer arithmetic, thus invalidating the purpose + // behind disabling them. + template + PA_ALWAYS_INLINE friend constexpr raw_ptr operator+(const raw_ptr& p, + Z delta_elems) { + raw_ptr result = p; + return result += delta_elems; + } + template + PA_ALWAYS_INLINE friend constexpr raw_ptr operator-(const raw_ptr& p, + Z delta_elems) { + raw_ptr result = p; + return result -= delta_elems; + } + + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(const raw_ptr& p1, + const raw_ptr& p2) { + return Impl::GetDeltaElems(p1.wrapped_ptr_, p2.wrapped_ptr_); + } + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(T* p1, + const raw_ptr& p2) { + return Impl::GetDeltaElems(p1, p2.wrapped_ptr_); + } + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(const raw_ptr& p1, + T* p2) { + return Impl::GetDeltaElems(p1.wrapped_ptr_, p2); + } + + // Stop referencing the underlying pointer and free its memory. Compared to + // raw delete calls, this avoids the raw_ptr to be temporarily dangling + // during the free operation, which will lead to taking the slower path that + // involves quarantine. + PA_ALWAYS_INLINE constexpr void ClearAndDelete() noexcept { + delete GetForExtractionAndReset(); + } + PA_ALWAYS_INLINE constexpr void ClearAndDeleteArray() noexcept { + delete[] GetForExtractionAndReset(); + } + + // Clear the underlying pointer and return another raw_ptr instance + // that is allowed to dangle. + // This can be useful in cases such as: + // ``` + // ptr.ExtractAsDangling()->SelfDestroy(); + // ``` + // ``` + // c_style_api_do_something_and_destroy(ptr.ExtractAsDangling()); + // ``` + // NOTE, avoid using this method as it indicates an error-prone memory + // ownership pattern. If possible, use smart pointers like std::unique_ptr<> + // instead of raw_ptr<>. + // If you have to use it, avoid saving the return value in a long-lived + // variable (or worse, a field)! It's meant to be used as a temporary, to be + // passed into a cleanup & freeing function, and destructed at the end of the + // statement. + PA_ALWAYS_INLINE constexpr DanglingType ExtractAsDangling() noexcept { + DanglingType res(std::move(*this)); + // Not all implementation clear the source pointer on move. Furthermore, + // even for implemtantions that do, cross-kind conversions (that add + // kMayDangle) fall back to a copy, instead of move. So do it here just in + // case. Should be cheap. + operator=(nullptr); + return res; + } + + // Comparison operators between raw_ptr and raw_ptr/U*/std::nullptr_t. + // Strictly speaking, it is not necessary to provide these: the compiler can + // use the conversion operator implicitly to allow comparisons to fall back to + // comparisons between raw pointers. However, `operator T*`/`operator U*` may + // perform safety checks with a higher runtime cost, so to avoid this, provide + // explicit comparison operators for all combinations of parameters. + + // Comparisons between `raw_ptr`s. This unusual declaration and separate + // definition below is because `GetForComparison()` is a private method. The + // more conventional approach of defining a comparison operator between + // `raw_ptr` and `raw_ptr` in the friend declaration itself does not work, + // because a comparison operator defined inline would not be allowed to call + // `raw_ptr`'s private `GetForComparison()` method. + template + friend bool operator==(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator!=(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator<(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator>(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator<=(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator>=(const raw_ptr& lhs, const raw_ptr& rhs); + + // Comparisons with U*. These operators also handle the case where the RHS is + // T*. + template + PA_ALWAYS_INLINE friend bool operator==(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() == rhs; + } + template + PA_ALWAYS_INLINE friend bool operator!=(const raw_ptr& lhs, U* rhs) { + return !(lhs == rhs); + } + template + PA_ALWAYS_INLINE friend bool operator==(U* lhs, const raw_ptr& rhs) { + return rhs == lhs; // Reverse order to call the operator above. + } + template + PA_ALWAYS_INLINE friend bool operator!=(U* lhs, const raw_ptr& rhs) { + return rhs != lhs; // Reverse order to call the operator above. + } + template + PA_ALWAYS_INLINE friend bool operator<(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() < rhs; + } + template + PA_ALWAYS_INLINE friend bool operator<=(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() <= rhs; + } + template + PA_ALWAYS_INLINE friend bool operator>(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() > rhs; + } + template + PA_ALWAYS_INLINE friend bool operator>=(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() >= rhs; + } + template + PA_ALWAYS_INLINE friend bool operator<(U* lhs, const raw_ptr& rhs) { + return lhs < rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator<=(U* lhs, const raw_ptr& rhs) { + return lhs <= rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator>(U* lhs, const raw_ptr& rhs) { + return lhs > rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator>=(U* lhs, const raw_ptr& rhs) { + return lhs >= rhs.GetForComparison(); + } + + // Comparisons with `std::nullptr_t`. + PA_ALWAYS_INLINE friend bool operator==(const raw_ptr& lhs, std::nullptr_t) { + return !lhs; + } + PA_ALWAYS_INLINE friend bool operator!=(const raw_ptr& lhs, std::nullptr_t) { + return !!lhs; // Use !! otherwise the costly implicit cast will be used. + } + PA_ALWAYS_INLINE friend bool operator==(std::nullptr_t, const raw_ptr& rhs) { + return !rhs; + } + PA_ALWAYS_INLINE friend bool operator!=(std::nullptr_t, const raw_ptr& rhs) { + return !!rhs; // Use !! otherwise the costly implicit cast will be used. + } + + PA_ALWAYS_INLINE friend constexpr void swap(raw_ptr& lhs, + raw_ptr& rhs) noexcept { + Impl::IncrementSwapCountForTest(); + std::swap(lhs.wrapped_ptr_, rhs.wrapped_ptr_); + } + + PA_ALWAYS_INLINE void ReportIfDangling() const noexcept { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + Impl::ReportIfDangling(wrapped_ptr_); +#endif + } + + private: + // This getter is meant for situations where the pointer is meant to be + // dereferenced. It is allowed to crash on nullptr (it may or may not), + // because it knows that the caller will crash on nullptr. + PA_ALWAYS_INLINE constexpr T* GetForDereference() const { + return Impl::SafelyUnwrapPtrForDereference(wrapped_ptr_); + } + // This getter is meant for situations where the raw pointer is meant to be + // extracted outside of this class, but not necessarily with an intention to + // dereference. It mustn't crash on nullptr. + PA_ALWAYS_INLINE constexpr T* GetForExtraction() const { + return Impl::SafelyUnwrapPtrForExtraction(wrapped_ptr_); + } + // This getter is meant *only* for situations where the pointer is meant to be + // compared (guaranteeing no dereference or extraction outside of this class). + // Any verifications can and should be skipped for performance reasons. + PA_ALWAYS_INLINE constexpr T* GetForComparison() const { + return Impl::UnsafelyUnwrapPtrForComparison(wrapped_ptr_); + } + + PA_ALWAYS_INLINE constexpr T* GetForExtractionAndReset() { + T* ptr = GetForExtraction(); + operator=(nullptr); + return ptr; + } + + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #global-scope, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION T* wrapped_ptr_; + + template + friend class raw_ptr; +}; + +template +PA_ALWAYS_INLINE bool operator==(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() == rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator!=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return !(lhs == rhs); +} + +template +PA_ALWAYS_INLINE bool operator<(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() < rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator>(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() > rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator<=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() <= rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator>=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() >= rhs.GetForComparison(); +} + +template +struct IsRawPtr : std::false_type {}; + +template +struct IsRawPtr> : std::true_type {}; + +template +inline constexpr bool IsRawPtrV = IsRawPtr::value; + +template +inline constexpr bool IsRawPtrMayDangleV = false; + +template +inline constexpr bool IsRawPtrMayDangleV> = + raw_ptr_traits::Contains(Traits, RawPtrTraits::kMayDangle); + +// Template helpers for working with T* or raw_ptr. +template +struct IsPointer : std::false_type {}; + +template +struct IsPointer : std::true_type {}; + +template +struct IsPointer> : std::true_type {}; + +template +inline constexpr bool IsPointerV = IsPointer::value; + +template +struct RemovePointer { + using type = T; +}; + +template +struct RemovePointer { + using type = T; +}; + +template +struct RemovePointer> { + using type = T; +}; + +template +using RemovePointerT = typename RemovePointer::type; + +struct RawPtrGlobalSettings { + static void EnableExperimentalAsh() { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + internal::BackupRefPtrGlobalSettings::EnableExperimentalAsh(); +#endif + } + + static void DisableExperimentalAshForTest() { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + internal::BackupRefPtrGlobalSettings::DisableExperimentalAshForTest(); +#endif + } +}; + +} // namespace base + +using base::raw_ptr; + +// DisableDanglingPtrDetection option for raw_ptr annotates +// "intentional-and-safe" dangling pointers. It is meant to be used at the +// margin, only if there is no better way to re-architecture the code. +// +// Usage: +// raw_ptr dangling_ptr; +// +// When using it, please provide a justification about what guarantees that it +// will never be dereferenced after becoming dangling. +constexpr auto DisableDanglingPtrDetection = base::RawPtrTraits::kMayDangle; + +// See `docs/dangling_ptr.md` +// Annotates known dangling raw_ptr. Those haven't been triaged yet. All the +// occurrences are meant to be removed. See https://crbug.com/1291138. +constexpr auto DanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Unlike DanglingUntriaged, this annotates raw_ptrs that are known to +// dangle only occasionally on the CQ. +// +// These were found from CQ runs and analysed in this dashboard: +// https://docs.google.com/spreadsheets/d/1k12PQOG4y1-UEV9xDfP1F8FSk4cVFywafEYHmzFubJ8/ +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto FlakyDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Dangling raw_ptr that is more likely to cause UAF: its memory was freed in +// one task, and the raw_ptr was released in a different one. +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto AcrossTasksDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// The use of pointer arithmetic with raw_ptr is strongly discouraged and +// disabled by default. Usually a container like span<> should be used +// instead of the raw_ptr. +constexpr auto AllowPtrArithmetic = base::RawPtrTraits::kAllowPtrArithmetic; + +// Temporary flag for `raw_ptr` / `raw_ref`. This is used by finch experiments +// to differentiate pointers added recently for the ChromeOS ash rewrite. +// +// See launch plan: +// https://docs.google.com/document/d/105OVhNl-2lrfWElQSk5BXYv-nLynfxUrbC4l8cZ0CoU/edit +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto ExperimentalAsh = base::RawPtrTraits::kExperimentalAsh; + +// This flag is used to tag a subset of dangling pointers. Similarly to +// DanglingUntriaged, those pointers are known to be dangling. However, we also +// detected that those raw_ptr's were never released (either by calling +// raw_ptr's destructor or by resetting its value), which can ultimately put +// pressure on the BRP quarantine. +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto LeakedDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Public verson used in callbacks arguments when it is known that they might +// receive dangling pointers. In any other cases, please +// use one of: +// - raw_ptr +// - raw_ptr +template +using MayBeDangling = base::raw_ptr; + +namespace std { + +// Override so set/map lookups do not create extra raw_ptr. This also allows +// dangling pointers to be used for lookup. +template +struct less> { + using Impl = typename raw_ptr::Impl; + using is_transparent = void; + + bool operator()(const raw_ptr& lhs, + const raw_ptr& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(T* lhs, const raw_ptr& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(const raw_ptr& lhs, T* rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } +}; + +// Define for cases where raw_ptr holds a pointer to an array of type T. +// This is consistent with definition of std::iterator_traits. +// Algorithms like std::binary_search need that. +template +struct iterator_traits> { + using difference_type = ptrdiff_t; + using value_type = std::remove_cv_t; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; +}; + +// Specialize std::pointer_traits. The latter is required to obtain the +// underlying raw pointer in the std::to_address(pointer) overload. +// Implementing the pointer_traits is the standard blessed way to customize +// `std::to_address(pointer)` in C++20 [3]. +// +// [1] https://wg21.link/pointer.traits.optmem + +template +struct pointer_traits<::raw_ptr> { + using pointer = ::raw_ptr; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::raw_ptr; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(&r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + return p.get(); + } +}; + +} // namespace std + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ + +// This header will be leakily included even when +// `!use_partition_alloc`, which is okay because it's a leaf header. +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" // nogncheck +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "build/build_config.h" + +#if PA_HAS_ATTRIBUTE(annotate) +#if defined(OFFICIAL_BUILD) && !BUILDFLAG(FORCE_ENABLE_RAW_PTR_EXCLUSION) +// The annotation changed compiler output and increased binary size so disable +// for official builds. +// TODO(crbug.com/1320670): Remove when issue is resolved. +#define RAW_PTR_EXCLUSION +#else +// Marks a field as excluded from the `raw_ptr` usage enforcement via +// Chromium Clang plugin. +// +// Example: +// RAW_PTR_EXCLUSION Foo* foo_; +// +// `RAW_PTR_EXCLUSION` should be avoided, as exclusions makes it significantly +// easier for any bug involving the pointer to become a security vulnerability. +// For additional guidance please see the "When to use raw_ptr" section of +// `//base/memory/raw_ptr.md`. +#define RAW_PTR_EXCLUSION __attribute__((annotate("raw_ptr_exclusion"))) +#endif +#else +#define RAW_PTR_EXCLUSION +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,120 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ + +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_forward.h" + +namespace base::internal { + +struct RawPtrNoOpImpl { + static constexpr bool kMustZeroOnInit = false; + static constexpr bool kMustZeroOnMove = false; + static constexpr bool kMustZeroOnDestruct = false; + + // Wraps a pointer. + template + PA_ALWAYS_INLINE static constexpr T* WrapRawPtr(T* ptr) { + return ptr; + } + + // Notifies the allocator when a wrapped pointer is being removed or + // replaced. + template + PA_ALWAYS_INLINE static constexpr void ReleaseWrappedPtr(T*) {} + + // Unwraps the pointer, while asserting that memory hasn't been freed. The + // function is allowed to crash on nullptr. + template + PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForDereference( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Unwraps the pointer, while asserting that memory hasn't been freed. The + // function must handle nullptr gracefully. + template + PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForExtraction( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Unwraps the pointer, without making an assertion on whether memory was + // freed or not. + template + PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForComparison( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Upcasts the wrapped pointer. + template + PA_ALWAYS_INLINE static constexpr To* Upcast(From* wrapped_ptr) { + static_assert(std::is_convertible::value, + "From must be convertible to To."); + // Note, this cast may change the address if upcasting to base that lies + // in the middle of the derived object. + return wrapped_ptr; + } + + // Advance the wrapped pointer by `delta_elems`. + template < + typename T, + typename Z, + typename = + std::enable_if_t, void>> + PA_ALWAYS_INLINE static constexpr T* Advance(T* wrapped_ptr, Z delta_elems) { + return wrapped_ptr + delta_elems; + } + + // Retreat the wrapped pointer by `delta_elems`. + template < + typename T, + typename Z, + typename = + std::enable_if_t, void>> + PA_ALWAYS_INLINE static constexpr T* Retreat(T* wrapped_ptr, Z delta_elems) { + return wrapped_ptr - delta_elems; + } + + template + PA_ALWAYS_INLINE static constexpr ptrdiff_t GetDeltaElems(T* wrapped_ptr1, + T* wrapped_ptr2) { + return wrapped_ptr1 - wrapped_ptr2; + } + + // Returns a copy of a wrapped pointer, without making an assertion on + // whether memory was freed or not. + template + PA_ALWAYS_INLINE static constexpr T* Duplicate(T* wrapped_ptr) { + return wrapped_ptr; + } + + // `WrapRawPtrForDuplication` and `UnsafelyUnwrapPtrForDuplication` are used + // to create a new raw_ptr from another raw_ptr of a different flavor. + template + PA_ALWAYS_INLINE static constexpr T* WrapRawPtrForDuplication(T* ptr) { + return ptr; + } + + template + PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForDuplication( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // This is for accounting only, used by unit tests. + PA_ALWAYS_INLINE constexpr static void IncrementSwapCountForTest() {} + PA_ALWAYS_INLINE constexpr static void IncrementLessCountForTest() {} + PA_ALWAYS_INLINE constexpr static void + IncrementPointerToMemberOperatorCountForTest() {} +}; + +} // namespace base::internal + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,444 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ + +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr.h" + +namespace base { + +template +class raw_ref; + +namespace internal { + +template +struct is_raw_ref : std::false_type {}; + +template +struct is_raw_ref<::base::raw_ref> : std::true_type {}; + +template +constexpr inline bool is_raw_ref_v = is_raw_ref::value; + +} // namespace internal + +// A smart pointer for a pointer which can not be null, and which provides +// Use-after-Free protection in the same ways as raw_ptr. This class acts like a +// combination of std::reference_wrapper and raw_ptr. +// +// See raw_ptr and //base/memory/raw_ptr.md for more details on the +// Use-after-Free protection. +// +// # Use after move +// +// The raw_ref type will abort if used after being moved. +// +// # Constness +// +// Use a `const raw_ref` when the smart pointer should not be able to rebind +// to a new reference. Use a `const raw_ref` do the same for a const +// reference, which is like `const T&`. +// +// Unlike a native `T&` reference, a mutable `raw_ref` can be changed +// independent of the underlying `T`, similar to `std::reference_wrapper`. That +// means the reference inside it can be moved and reassigned. +template +class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ref { + // operator* is used with the expectation of GetForExtraction semantics: + // + // raw_ref foo_raw_ref = something; + // Foo& foo_ref = *foo_raw_ref; + // + // The implementation of operator* provides GetForDereference semantics, and + // this results in spurious crashes in BRP-ASan builds, so we need to disable + // hooks that provide BRP-ASan instrumentation for raw_ref. + using Inner = raw_ptr; + + // Some underlying implementations do not clear on move, which produces an + // inconsistent behaviour. We want consistent behaviour such that using a + // raw_ref after move is caught and aborts, so do it when the underlying + // implementation doesn't. Failure to clear would be indicated by the related + // death tests not CHECKing appropriately. + static constexpr bool kNeedClearAfterMove = !Inner::kZeroOnMove; + + public: + using Impl = typename Inner::Impl; + + // Construct a raw_ref from a pointer, which must not be null. + // + // This function is safe to use with any pointer, as it will CHECK and + // terminate the process if the pointer is null. Avoid dereferencing a pointer + // to avoid this CHECK as you may be dereferencing null. + PA_ALWAYS_INLINE constexpr static raw_ref from_ptr(T* ptr) noexcept { + PA_RAW_PTR_CHECK(ptr); + return raw_ref(*ptr); + } + + // Construct a raw_ref from a reference. + PA_ALWAYS_INLINE constexpr explicit raw_ref(T& p) noexcept + : inner_(std::addressof(p)) {} + + // Assign a new reference to the raw_ref, replacing the existing reference. + PA_ALWAYS_INLINE constexpr raw_ref& operator=(T& p) noexcept { + inner_.operator=(&p); + return *this; + } + + // Disallow holding references to temporaries. + raw_ref(const T&& p) = delete; + raw_ref& operator=(const T&& p) = delete; + + PA_ALWAYS_INLINE constexpr raw_ref(const raw_ref& p) noexcept + : inner_(p.inner_) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + } + + PA_ALWAYS_INLINE constexpr raw_ref(raw_ref&& p) noexcept + : inner_(std::move(p.inner_)) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ref& operator=(const raw_ref& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(p.inner_); + return *this; + } + + PA_ALWAYS_INLINE constexpr raw_ref& operator=(raw_ref&& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(std::move(p.inner_)); + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + return *this; + } + + // Deliberately implicit in order to support implicit upcast. + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ref(const raw_ref& p) noexcept + : inner_(p.inner_) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + } + // Deliberately implicit in order to support implicit upcast. + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ref(raw_ref&& p) noexcept + : inner_(std::move(p.inner_)) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + } + + // Upcast assignment + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + PA_ALWAYS_INLINE constexpr raw_ref& operator=( + const raw_ref& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(p.inner_); + return *this; + } + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + PA_ALWAYS_INLINE constexpr raw_ref& operator=( + raw_ref&& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(std::move(p.inner_)); + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + return *this; + } + + PA_ALWAYS_INLINE constexpr T& operator*() const { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return inner_.operator*(); + } + + // This is an equivalent to operator*() that provides GetForExtraction rather + // rather than GetForDereference semantics (see raw_ptr.h). This should be + // used in place of operator*() when the memory referred to by the reference + // is not immediately going to be accessed. + PA_ALWAYS_INLINE constexpr T& get() const { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return *inner_.get(); + } + + PA_ALWAYS_INLINE constexpr T* operator->() const + PA_ATTRIBUTE_RETURNS_NONNULL { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return inner_.operator->(); + } + + // This is used to verify callbacks are not invoked with dangling references. + // If the `raw_ref` references a deleted object, it will trigger an error. + // Depending on the PartitionAllocUnretainedDanglingPtr feature, this is + // either a DumpWithoutCrashing, a crash, or ignored. + PA_ALWAYS_INLINE void ReportIfDangling() const noexcept { + inner_.ReportIfDangling(); + } + + PA_ALWAYS_INLINE friend constexpr void swap(raw_ref& lhs, + raw_ref& rhs) noexcept { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + swap(lhs.inner_, rhs.inner_); + } + + template + friend bool operator==(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator!=(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator<(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator>(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator<=(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator>=(const raw_ref& lhs, + const raw_ref& rhs); + + template , void>> + PA_ALWAYS_INLINE friend bool operator==(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ == &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator!=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ != &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ < &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ > &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ <= &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ >= &rhs; + } + + template , void>> + PA_ALWAYS_INLINE friend bool operator==(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs == rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator!=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs != rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs < rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs > rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs <= rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs >= rhs.inner_; + } + + private: + template + friend class raw_ref; + + Inner inner_; +}; + +template +PA_ALWAYS_INLINE bool operator==(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ == rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator!=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ != rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator<(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ < rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator>(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ > rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator<=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ <= rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator>=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ >= rhs.inner_; +} + +// CTAD deduction guide. +template +raw_ref(T&) -> raw_ref; +template +raw_ref(const T&) -> raw_ref; + +// Template helpers for working with raw_ref. +template +struct IsRawRef : std::false_type {}; + +template +struct IsRawRef> : std::true_type {}; + +template +inline constexpr bool IsRawRefV = IsRawRef::value; + +template +struct RemoveRawRef { + using type = T; +}; + +template +struct RemoveRawRef> { + using type = T; +}; + +template +using RemoveRawRefT = typename RemoveRawRef::type; + +} // namespace base + +using base::raw_ref; + +template +auto ToRawRef(T& ref) { + return raw_ref(ref); +} + +namespace std { + +// Override so set/map lookups do not create extra raw_ref. This also +// allows C++ references to be used for lookup. +template +struct less> { + using Impl = typename raw_ref::Impl; + using is_transparent = void; + + bool operator()(const raw_ref& lhs, + const raw_ref& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(T& lhs, const raw_ref& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(const raw_ref& lhs, T& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } +}; + +// Specialize std::pointer_traits. The latter is required to obtain the +// underlying raw pointer in the std::to_address(pointer) overload. +// Implementing the pointer_traits is the standard blessed way to customize +// `std::to_address(pointer)` in C++20 [3]. +// +// [1] https://wg21.link/pointer.traits.optmem + +template +struct pointer_traits<::raw_ref> { + using pointer = ::raw_ref; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::raw_ref; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + // `raw_ref::get` is used instead of raw_ref::operator*`. It provides + // GetForExtraction rather rather than GetForDereference semantics (see + // raw_ptr.h). This should be used when we we don't know the memory will be + // accessed. + return &(p.get()); + } +}; + +} // namespace std + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_APPLE_BUNDLE_LOCATIONS_H_ +#define BASE_APPLE_BUNDLE_LOCATIONS_H_ + +#include "base/base_export.h" +#include "base/files/file_path.h" + +#if defined(__OBJC__) +#import +#endif // __OBJC__ + +namespace base { +class FilePath; +} + +// NSBundle isn't thread-safe; all functions in this file must be called on the +// main thread. + +namespace base::apple { + +// This file provides several functions to explicitly request the various +// component bundles of Chrome. Please use these methods rather than calling +// `+[NSBundle mainBundle]` or `CFBundleGetMainBundle()`. +// +// Terminology +// - "Outer Bundle" - This is the main bundle for Chrome; it's what +// `+[NSBundle mainBundle]` returns when Chrome is launched normally. +// +// - "Main Bundle" - This is the bundle from which Chrome was launched. +// This will be the same as the outer bundle except when Chrome is launched +// via an app shortcut, in which case this will return the app shortcut's +// bundle rather than the main Chrome bundle. +// +// - "Framework Bundle" - This is the bundle corresponding to the Chrome +// framework. +// +// Guidelines for use: +// - To access a resource, the Framework bundle should be used. +// - If the choice is between the Outer or Main bundles then please choose +// carefully. Most often the Outer bundle will be the right choice, but for +// cases such as adding an app to the "launch on startup" list, the Main +// bundle is probably the one to use. + +// Methods for retrieving the various bundles. +BASE_EXPORT FilePath MainBundlePath(); +BASE_EXPORT FilePath OuterBundlePath(); +BASE_EXPORT FilePath FrameworkBundlePath(); +#if defined(__OBJC__) +BASE_EXPORT NSBundle* MainBundle(); +BASE_EXPORT NSURL* MainBundleURL(); +BASE_EXPORT NSBundle* OuterBundle(); +BASE_EXPORT NSURL* OuterBundleURL(); +BASE_EXPORT NSBundle* FrameworkBundle(); +#endif // __OBJC__ + +// Set the bundle that the preceding functions will return, overriding the +// default values. Restore the default by passing in `nil` or an empty +// `FilePath`. +BASE_EXPORT void SetOverrideOuterBundlePath(const FilePath& file_path); +BASE_EXPORT void SetOverrideFrameworkBundlePath(const FilePath& file_path); +#if defined(__OBJC__) +BASE_EXPORT void SetOverrideOuterBundle(NSBundle* bundle); +BASE_EXPORT void SetOverrideFrameworkBundle(NSBundle* bundle); +#endif // __OBJC__ + +} // namespace base::apple + +#endif // BASE_APPLE_BUNDLE_LOCATIONS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,75 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a low level implementation of atomic semantics for reference +// counting. Please use base/memory/ref_counted.h directly instead. + +#ifndef BASE_ATOMIC_REF_COUNT_H_ +#define BASE_ATOMIC_REF_COUNT_H_ + +#include + +namespace base { + +namespace subtle { +class RefCountedOverflowTest; +} // namespace subtle + +class AtomicRefCount { + public: + constexpr AtomicRefCount() : ref_count_(0) {} + explicit constexpr AtomicRefCount(int initial_value) + : ref_count_(initial_value) {} + + // Increment a reference count. + // Returns the previous value of the count. + int Increment() { return Increment(1); } + + // Increment a reference count by "increment", which must exceed 0. + // Returns the previous value of the count. + int Increment(int increment) { + return ref_count_.fetch_add(increment, std::memory_order_relaxed); + } + + // Decrement a reference count, and return whether the result is non-zero. + // Insert barriers to ensure that state written before the reference count + // became zero will be visible to a thread that has just made the count zero. + bool Decrement() { + // TODO(jbroman): Technically this doesn't need to be an acquire operation + // unless the result is 1 (i.e., the ref count did indeed reach zero). + // However, there are toolchain issues that make that not work as well at + // present (notably TSAN doesn't like it). + return ref_count_.fetch_sub(1, std::memory_order_acq_rel) != 1; + } + + // Return whether the reference count is one. If the reference count is used + // in the conventional way, a refrerence count of 1 implies that the current + // thread owns the reference and no other thread shares it. This call + // performs the test for a reference count of one, and performs the memory + // barrier needed for the owning thread to act on the object, knowing that it + // has exclusive access to the object. + bool IsOne() const { return ref_count_.load(std::memory_order_acquire) == 1; } + + // Return whether the reference count is zero. With conventional object + // referencing counting, the object will be destroyed, so the reference count + // should never be zero. Hence this is generally used for a debug check. + bool IsZero() const { + return ref_count_.load(std::memory_order_acquire) == 0; + } + + // Returns the current reference count (with no barriers). This is subtle, and + // should be used only for debugging. + int SubtleRefCountForDebug() const { + return ref_count_.load(std::memory_order_relaxed); + } + + private: + friend subtle::RefCountedOverflowTest; + + std::atomic_int ref_count_; +}; + +} // namespace base + +#endif // BASE_ATOMIC_REF_COUNT_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,153 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// IMPORTANT NOTE: deprecated. Use std::atomic instead. +// +// Rationale: +// - Uniformity: most of the code uses std::atomic, and the underlying +// implementation is the same. Use the STL one. +// - Clearer code: return values from some operations (e.g. CompareAndSwap) +// differ from the equivalent ones in std::atomic, leading to confusion. +// - Richer semantics: can use actual types, rather than e.g. Atomic32 for a +// boolean flag, or AtomicWord for T*. Bitwise operations (e.g. fetch_or()) +// are only in std::atomic. +// - Harder to misuse: base::subtle::Atomic32 is just an int, making it possible +// to accidentally manipulate, not realizing that there are no atomic +// semantics attached to it. For instance, "Atomic32 a; a++;" is almost +// certainly incorrect. + +// For atomic operations on reference counts, see atomic_refcount.h. +// For atomic operations on sequence numbers, see atomic_sequence_num.h. + +// The routines exported by this module are subtle. If you use them, even if +// you get the code right, it will depend on careful reasoning about atomicity +// and memory ordering; it will be less readable, and harder to maintain. If +// you plan to use these routines, you should have a good reason, such as solid +// evidence that performance would otherwise suffer, or there being no +// alternative. You should assume only properties explicitly guaranteed by the +// specifications in this file. You are almost certainly _not_ writing code +// just for the x86; if you assume x86 semantics, x86 hardware bugs and +// implementations on other archtectures will cause your code to break. If you +// do not know what you are doing, avoid these routines, and use a Mutex. +// +// It is incorrect to make direct assignments to/from an atomic variable. +// You should use one of the Load or Store routines. The NoBarrier +// versions are provided when no barriers are needed: +// NoBarrier_Store() +// NoBarrier_Load() +// Although there are currently no compiler enforcement, you are encouraged +// to use these. +// + +#ifndef BASE_ATOMICOPS_H_ +#define BASE_ATOMICOPS_H_ + +#include + +// Small C++ header which defines implementation specific macros used to +// identify the STL implementation. +// - libc++: captures __config for _LIBCPP_VERSION +// - libstdc++: captures bits/c++config.h for __GLIBCXX__ +#include + +#include "build/build_config.h" + +namespace base { +namespace subtle { + +typedef int32_t Atomic32; +#ifdef ARCH_CPU_64_BITS +// We need to be able to go between Atomic64 and AtomicWord implicitly. This +// means Atomic64 and AtomicWord should be the same type on 64-bit. +#if defined(__ILP32__) || BUILDFLAG(IS_NACL) +// NaCl's intptr_t is not actually 64-bits on 64-bit! +// http://code.google.com/p/nativeclient/issues/detail?id=1162 +typedef int64_t Atomic64; +#else +typedef intptr_t Atomic64; +#endif +#endif + +// Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or +// Atomic64 routines below, depending on your architecture. +typedef intptr_t AtomicWord; + +// Atomically execute: +// result = *ptr; +// if (*ptr == old_value) +// *ptr = new_value; +// return result; +// +// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". +// Always return the old value of "*ptr" +// +// This routine implies no memory barriers. +Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +// Atomically store new_value into *ptr, returning the previous value held in +// *ptr. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value); + +// Atomically increment *ptr by "increment". Returns the new value of +// *ptr with the increment applied. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); + +Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment); + +// These following lower-level operations are typically useful only to people +// implementing higher-level synchronization operations like spinlocks, +// mutexes, and condition-variables. They combine CompareAndSwap(), a load, or +// a store with appropriate memory-ordering instructions. "Acquire" operations +// ensure that no later memory access can be reordered ahead of the operation. +// "Release" operations ensure that no previous memory access can be reordered +// after the operation. "Barrier" operations have both "Acquire" and "Release" +// semantics. +Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); +Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value); +void Release_Store(volatile Atomic32* ptr, Atomic32 value); + +Atomic32 NoBarrier_Load(volatile const Atomic32* ptr); +Atomic32 Acquire_Load(volatile const Atomic32* ptr); + +// 64-bit atomic operations (only available on 64-bit processors). +#ifdef ARCH_CPU_64_BITS +Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value); +Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); +Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); + +Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +void Release_Store(volatile Atomic64* ptr, Atomic64 value); +Atomic64 NoBarrier_Load(volatile const Atomic64* ptr); +Atomic64 Acquire_Load(volatile const Atomic64* ptr); +#endif // ARCH_CPU_64_BITS + +} // namespace subtle +} // namespace base + +#include "base/atomicops_internals_portable.h" + +// On some platforms we need additional declarations to make +// AtomicWord compatible with our other Atomic* types. +#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_OPENBSD) +#include "base/atomicops_internals_atomicword_compat.h" +#endif + +#endif // BASE_ATOMICOPS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,94 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is an internal atomic implementation, use base/atomicops.h instead. + +#ifndef BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ +#define BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ + +#include + +#include "build/build_config.h" + +// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32_t, +// which in turn means int. On some LP32 platforms, intptr_t is an int, but +// on others, it's a long. When AtomicWord and Atomic32 are based on different +// fundamental types, their pointers are incompatible. +// +// This file defines function overloads to allow both AtomicWord and Atomic32 +// data to be used with this interface. +// +// On LP64 platforms, AtomicWord and Atomic64 are both always long, +// so this problem doesn't occur. + +#if !defined(ARCH_CPU_64_BITS) + +namespace base { +namespace subtle { + +inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return NoBarrier_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, + AtomicWord new_value) { + return NoBarrier_AtomicExchange( + reinterpret_cast(ptr), new_value); +} + +inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return NoBarrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return Barrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return base::subtle::Acquire_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return base::subtle::Release_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { + NoBarrier_Store( + reinterpret_cast(ptr), value); +} + +inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { + return base::subtle::Release_Store( + reinterpret_cast(ptr), value); +} + +inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { + return NoBarrier_Load( + reinterpret_cast(ptr)); +} + +inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { + return base::subtle::Acquire_Load( + reinterpret_cast(ptr)); +} + +} // namespace subtle +} // namespace base + +#endif // !defined(ARCH_CPU_64_BITS) + +#endif // BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,190 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is an internal atomic implementation, use atomicops.h instead. +// +// This implementation uses C++11 atomics' member functions. The code base is +// currently written assuming atomicity revolves around accesses instead of +// C++11's memory locations. The burden is on the programmer to ensure that all +// memory locations accessed atomically are never accessed non-atomically (tsan +// should help with this). +// +// TODO(jfb) Modify the atomicops.h API and user code to declare atomic +// locations as truly atomic. See the static_assert below. +// +// Of note in this implementation: +// * All NoBarrier variants are implemented as relaxed. +// * All Barrier variants are implemented as sequentially-consistent. +// * Compare exchange's failure ordering is always the same as the success one +// (except for release, which fails as relaxed): using a weaker ordering is +// only valid under certain uses of compare exchange. +// * Atomic increment is expected to return the post-incremented value, whereas +// C11 fetch add returns the previous value. The implementation therefore +// needs to increment twice (which the compiler should be able to detect and +// optimize). + +#ifndef BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ +#define BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ + +#include + +#include "build/build_config.h" + +namespace base { +namespace subtle { + +// This implementation is transitional and maintains the original API for +// atomicops.h. This requires casting memory locations to the atomic types, and +// assumes that the API and the C++11 implementation are layout-compatible, +// which isn't true for all implementations or hardware platforms. The static +// assertion should detect this issue, were it to fire then this header +// shouldn't be used. +// +// TODO(jfb) If this header manages to stay committed then the API should be +// modified, and all call sites updated. +typedef volatile std::atomic* AtomicLocation32; +static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32), + "incompatible 32-bit atomic layout"); + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_relaxed, + std::memory_order_relaxed); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + return ((AtomicLocation32)ptr) + ->exchange(new_value, std::memory_order_relaxed); +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return increment + + ((AtomicLocation32)ptr) + ->fetch_add(increment, std::memory_order_relaxed); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return increment + ((AtomicLocation32)ptr)->fetch_add(increment); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_acquire, + std::memory_order_acquire); + return old_value; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_release, + std::memory_order_relaxed); + return old_value; +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + ((AtomicLocation32)ptr)->store(value, std::memory_order_release); +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + return ((AtomicLocation32)ptr)->load(std::memory_order_acquire); +} + +#if defined(ARCH_CPU_64_BITS) + +typedef volatile std::atomic* AtomicLocation64; +static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64), + "incompatible 64-bit atomic layout"); + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_relaxed, + std::memory_order_relaxed); + return old_value; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + return ((AtomicLocation64)ptr) + ->exchange(new_value, std::memory_order_relaxed); +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return increment + + ((AtomicLocation64)ptr) + ->fetch_add(increment, std::memory_order_relaxed); +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return increment + ((AtomicLocation64)ptr)->fetch_add(increment); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_acquire, + std::memory_order_acquire); + return old_value; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_release, + std::memory_order_relaxed); + return old_value; +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + ((AtomicLocation64)ptr)->store(value, std::memory_order_release); +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + return ((AtomicLocation64)ptr)->load(std::memory_order_acquire); +} + +#endif // defined(ARCH_CPU_64_BITS) +} // namespace subtle +} // namespace base + +#endif // BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/auto_reset.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/auto_reset.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,69 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_AUTO_RESET_H_ +#define BASE_AUTO_RESET_H_ + +#include + +#include "base/check_op.h" +#include "base/memory/raw_ptr_exclusion.h" + +// base::AutoReset<> is useful for setting a variable to a new value only within +// a particular scope. An base::AutoReset<> object resets a variable to its +// original value upon destruction, making it an alternative to writing +// "var = false;" or "var = old_val;" at all of a block's exit points. +// +// This should be obvious, but note that an base::AutoReset<> instance should +// have a shorter lifetime than its scoped_variable, to prevent invalid memory +// writes when the base::AutoReset<> object is destroyed. + +namespace base { + +template +class [[maybe_unused, nodiscard]] AutoReset { + public: + template + AutoReset(T* scoped_variable, U&& new_value) + : scoped_variable_(scoped_variable), + original_value_( + std::exchange(*scoped_variable_, std::forward(new_value))) {} + + // A constructor that's useful for asserting the old value of + // `scoped_variable`, especially when it's inconvenient to check this before + // constructing the AutoReset object (e.g. in a class member initializer + // list). + template + AutoReset(T* scoped_variable, U&& new_value, const T& expected_old_value) + : AutoReset(scoped_variable, new_value) { + DCHECK_EQ(original_value_, expected_old_value); + } + + AutoReset(AutoReset&& other) + : scoped_variable_(std::exchange(other.scoped_variable_, nullptr)), + original_value_(std::move(other.original_value_)) {} + + AutoReset& operator=(AutoReset&& rhs) { + scoped_variable_ = std::exchange(rhs.scoped_variable_, nullptr); + original_value_ = std::move(rhs.original_value_); + return *this; + } + + ~AutoReset() { + if (scoped_variable_) + *scoped_variable_ = std::move(original_value_); + } + + private: + // `scoped_variable_` is not a raw_ptr for performance reasons: Large + // number of non-PartitionAlloc pointees + AutoReset is typically short-lived + // (e.g. allocated on the stack). + RAW_PTR_EXCLUSION T* scoped_variable_; + + T original_value_; +}; + +} // namespace base + +#endif // BASE_AUTO_RESET_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_export.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_export.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_export.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_export.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,29 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_EXPORT_H_ +#define BASE_BASE_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(BASE_IMPLEMENTATION) +#define BASE_EXPORT __declspec(dllexport) +#else +#define BASE_EXPORT __declspec(dllimport) +#endif // defined(BASE_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(BASE_IMPLEMENTATION) +#define BASE_EXPORT __attribute__((visibility("default"))) +#else +#define BASE_EXPORT +#endif // defined(BASE_IMPLEMENTATION) +#endif + +#else // defined(COMPONENT_BUILD) +#define BASE_EXPORT +#endif + +#endif // BASE_BASE_EXPORT_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,73 @@ +// Copyright 2006-2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_paths.h" + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "build/build_config.h" + +namespace base { + +bool PathProvider(int key, FilePath* result) { + // NOTE: DIR_CURRENT is a special case in PathService::Get + + switch (key) { + case DIR_EXE: + if (!PathService::Get(FILE_EXE, result)) + return false; + *result = result->DirName(); + return true; +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_MODULE: + if (!PathService::Get(FILE_MODULE, result)) + return false; + *result = result->DirName(); + return true; +#if !defined(MOZ_ZUCCHINI) + case DIR_ASSETS: + return PathService::Get(DIR_MODULE, result); +#endif // !defined(MOZ_ZUCCHINI) +#endif // !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_TEMP: + return GetTempDir(result); + case DIR_HOME: + *result = GetHomeDir(); + return true; + case base::DIR_SRC_TEST_DATA_ROOT: + // This is only used by tests and overridden by each platform. + NOTREACHED(); + return false; +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_OUT_TEST_DATA_ROOT: + // On most platforms test binaries are run directly from the build-output + // directory, so return the directory containing the executable. + return PathService::Get(DIR_MODULE, result); +#endif // !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_GEN_TEST_DATA_ROOT: + if (!PathService::Get(DIR_OUT_TEST_DATA_ROOT, result)) { + return false; + } + *result = result->Append(FILE_PATH_LITERAL("gen")); + return true; + case DIR_TEST_DATA: { + FilePath test_data_path; + if (!PathService::Get(DIR_SRC_TEST_DATA_ROOT, &test_data_path)) { + return false; + } + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("base")); + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("test")); + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("data")); + if (!PathExists(test_data_path)) // We don't want to create this. + return false; + *result = test_data_path; + return true; + } + } + + return false; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,102 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_H_ +#define BASE_BASE_PATHS_H_ + +// This file declares path keys for the base module. These can be used with +// the PathService to access various special directories and files. + +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/base_paths_win.h" +#elif BUILDFLAG(IS_MAC) +#include "base/base_paths_mac.h" +#elif BUILDFLAG(IS_IOS) +#include "base/base_paths_ios.h" +#elif BUILDFLAG(IS_ANDROID) +#include "base/base_paths_android.h" +#endif + +#if BUILDFLAG(IS_POSIX) +#include "base/base_paths_posix.h" +#endif + +namespace base { + +enum BasePathKey { + PATH_START = 0, + + // The following refer to the current application. + FILE_EXE, // Path and filename of the current executable. +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + // Prefer keys (e.g., DIR_ASSETS) that are specific to the use case as the + // module location may not work as expected on some platforms. For this + // reason, this key is not defined on Fuchsia. See crbug.com/1263691 for + // details. + FILE_MODULE, // Path and filename of the module containing the code for + // the PathService (which could differ from FILE_EXE if the + // PathService were compiled into a shared object, for + // example). +#endif + DIR_EXE, // Directory containing FILE_EXE. +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + // Prefer keys (e.g., DIR_ASSETS) that are specific to the use case as the + // module location may not work as expected on some platforms. For this + // reason, this key is not defined on Fuchsia. See crbug.com/1263691 for + // details. + DIR_MODULE, // Directory containing FILE_MODULE. +#endif +#if !defined(MOZ_ZUCCHINI) + DIR_ASSETS, // Directory that contains application assets. +#endif // !defined(MOZ_ZUCCHINI) + + // The following refer to system and system user directories. + DIR_TEMP, // Temporary directory for the system and/or user. + DIR_HOME, // User's root home directory. On Windows this will look + // like "C:\Users\" which isn't necessarily a great + // place to put files. +#if !BUILDFLAG(IS_IOS) +#if !defined(MOZ_ZUCCHINI) + DIR_USER_DESKTOP, // The current user's Desktop. +#endif // !defined(MOZ_ZUCCHINI) +#endif + + // The following refer to the applications current environment. + DIR_CURRENT, // Current directory. + + // The following are only for use in tests. + // On some platforms, such as Android and Fuchsia, tests do not have access to + // the build file system so the necessary files are bundled with the test + // binary. On such platforms, these will return an appropriate path inside the + // bundle. + DIR_SRC_TEST_DATA_ROOT, // The root of files in the source tree that are + // made available to tests. Useful for tests that use + // resources that exist in the source tree. + DIR_SOURCE_ROOT = DIR_SRC_TEST_DATA_ROOT, // Legacy name still widely used. + // TODO(crbug.com/1264897): Replace + // all instances and remove alias. + DIR_OUT_TEST_DATA_ROOT, // Path of build outputs available to tests. Build + // output files are normally placed directly in the + // build output directory on platforms that do not + // "package" tests. On platforms that "package" + // tests this will instead return a package-local + // path to copies of the relevant files. + DIR_GEN_TEST_DATA_ROOT, // Path of generated intermediate files available to + // tests. Build-intermediate files are normally + // placed in the "gen" sub-directory of the build + // output directory. On platforms that "package" + // tests this will instead return a package-local + // path to copies of the relevant files. + DIR_TEST_DATA, // Directory containing test data for //base tests. + // Only for use in base_unittests. Equivalent to + // DIR_SRC_TEST_DATA_ROOT + "/base/test/data". + + PATH_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_paths_apple.h" + +#include +#include +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/strings/string_util.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/threading/thread_restrictions.h" +#endif // !defined(MOZ_ZUCCHINI) + +namespace base::apple::internal { + +base::FilePath GetExecutablePath() { + // Executable path can have relative references ("..") depending on + // how the app was launched. + uint32_t executable_length = 0; + _NSGetExecutablePath(NULL, &executable_length); + DCHECK_GT(executable_length, 1u); + std::string executable_path; + int rv = _NSGetExecutablePath( + base::WriteInto(&executable_path, executable_length), &executable_length); + DCHECK_EQ(rv, 0); + + // _NSGetExecutablePath may return paths containing ./ or ../ which makes + // FilePath::DirName() work incorrectly, convert it to absolute path so that + // paths such as DIR_SRC_TEST_DATA_ROOT can work, since we expect absolute + // paths to be returned here. + // TODO(bauerb): http://crbug.com/259796, http://crbug.com/373477 +#if !defined(MOZ_ZUCCHINI) + base::ScopedAllowBlocking allow_blocking; +#endif // !defined(MOZ_ZUCCHINI) + return base::MakeAbsoluteFilePath(base::FilePath(executable_path)); +} + +bool GetModulePathForAddress(base::FilePath* path, const void* address) { + Dl_info info; + if (dladdr(address, &info) == 0) { + return false; + } + *path = base::FilePath(info.dli_fname); + return true; +} + +} // namespace base::apple::internal diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_APPLE_H_ +#define BASE_BASE_PATHS_APPLE_H_ + +#include "base/files/file_path.h" + +namespace base::apple::internal { + +// Returns the absolute path to the executable. +base::FilePath GetExecutablePath(); + +// Returns true if the module for |address| is found. |path| will contain +// the path to the module. Note that |path| may not be absolute. +[[nodiscard]] bool GetModulePathForAddress(base::FilePath* path, + const void* address); + +} // namespace base::apple::internal + +#endif // BASE_BASE_PATHS_APPLE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,25 @@ +// Copyright 2006-2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_MAC_H_ +#define BASE_BASE_PATHS_MAC_H_ + +// This file declares Mac-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_MAC_START = 200, + + DIR_APP_DATA, // ~/Library/Application Support + // Data for specific applications is stored in subdirectories. + + PATH_MAC_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_MAC_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,82 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Defines base::PathProviderMac which replaces base::PathProviderPosix for Mac +// in base/path_service.cc. + +#import + +#include "base/apple/bundle_locations.h" +#include "base/base_paths.h" +#include "base/base_paths_apple.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/mac/foundation_util.h" +#include "base/notreached.h" +#include "base/path_service.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace base { + +bool PathProviderMac(int key, base::FilePath* result) { + switch (key) { + case base::FILE_EXE: + *result = base::apple::internal::GetExecutablePath(); + return true; + case base::FILE_MODULE: + return base::apple::internal::GetModulePathForAddress( + result, reinterpret_cast(&base::PathProviderMac)); + case base::DIR_APP_DATA: { + bool success = + base::mac::GetUserDirectory(NSApplicationSupportDirectory, result); + return success; + } + case base::DIR_SRC_TEST_DATA_ROOT: + // Go through PathService to catch overrides. + if (!PathService::Get(base::FILE_EXE, result)) { + return false; + } + + // Start with the executable's directory. + *result = result->DirName(); + +#if !defined(MOZ_ZUCCHINI) + if (base::mac::AmIBundled()) { + // The bundled app executables (Chromium, TestShell, etc) live five + // levels down, eg: + // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium + *result = result->DirName().DirName().DirName().DirName().DirName(); + } else { + // Unit tests execute two levels deep from the source root, eg: + // src/xcodebuild/{Debug|Release}/base_unittests + *result = result->DirName().DirName(); + } +#else + // Firefox unit tests execute three levels deep from the source root, eg: + // ./obj-aarch64-apple-darwin24.5.0/dist/bin/zucchini-gtest + *result = result->DirName().DirName().DirName(); +#endif // !defined(MOZ_ZUCCHINI) + return true; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_USER_DESKTOP: + return base::mac::GetUserDirectory(NSDesktopDirectory, result); + case base::DIR_ASSETS: + if (!base::mac::AmIBundled()) { + return PathService::Get(base::DIR_MODULE, result); + } + *result = base::apple::FrameworkBundlePath().Append( + FILE_PATH_LITERAL("Resources")); + return true; + case base::DIR_CACHE: + return base::mac::GetUserDirectory(NSCachesDirectory, result); +#endif // !defined(MOZ_ZUCCHINI) + default: + return false; + } +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,139 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Defines base::PathProviderPosix, default path provider on POSIX OSes that +// don't have their own base_paths_OS.cc implementation (i.e. all but Mac and +// Android). + +#include "base/base_paths.h" + +#include +#include + +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/logging.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/nix/xdg_util.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/path_service.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/process/process_metrics.h" +#else +#define kProcSelfExe "/proc/self/exe" +#endif // !defined(MOZ_ZUCCHINI) +#include "build/build_config.h" + +#if BUILDFLAG(IS_FREEBSD) +#include +#include +#elif BUILDFLAG(IS_SOLARIS) || BUILDFLAG(IS_AIX) +#include +#endif + +namespace base { + +bool PathProviderPosix(int key, FilePath* result) { + switch (key) { + case FILE_EXE: + case FILE_MODULE: { // TODO(evanm): is this correct? +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + FilePath bin_dir; + if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) { + NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; + return false; + } + *result = bin_dir; + return true; +#elif BUILDFLAG(IS_FREEBSD) + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + char bin_dir[PATH_MAX + 1]; + size_t length = sizeof(bin_dir); + // Upon return, |length| is the number of bytes written to |bin_dir| + // including the string terminator. + int error = sysctl(name, 4, bin_dir, &length, NULL, 0); + if (error < 0 || length <= 1) { + NOTREACHED() << "Unable to resolve path."; + return false; + } + *result = FilePath(FilePath::StringType(bin_dir, length - 1)); + return true; +#elif BUILDFLAG(IS_SOLARIS) + char bin_dir[PATH_MAX + 1]; + if (realpath(getexecname(), bin_dir) == NULL) { + NOTREACHED() << "Unable to resolve " << getexecname() << "."; + return false; + } + *result = FilePath(bin_dir); + return true; +#elif BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_AIX) + // There is currently no way to get the executable path on OpenBSD + char* cpath; + if ((cpath = getenv("CHROME_EXE_PATH")) != NULL) + *result = FilePath(cpath); + else + *result = FilePath("/usr/local/chrome/chrome"); + return true; +#endif + } + case DIR_SRC_TEST_DATA_ROOT: { +#if !defined(MOZ_ZUCCHINI) + // Allow passing this in the environment, for more flexibility in build + // tree configurations (sub-project builds, gyp --output_dir, etc.) + std::unique_ptr env(Environment::Create()); + std::string cr_source_root; + FilePath path; + if (env->GetVar("CR_SOURCE_ROOT", &cr_source_root)) { + path = FilePath(cr_source_root); + if (PathExists(path)) { + *result = path; + return true; + } + DLOG(WARNING) << "CR_SOURCE_ROOT is set, but it appears to not " + << "point to a directory."; + } + // On POSIX, unit tests execute two levels deep from the source root. + // For example: out/{Debug|Release}/net_unittest + if (PathService::Get(DIR_EXE, &path)) { + *result = path.DirName().DirName(); + return true; + } +#else + FilePath path; + // On POSIX, Firefox unit tests execute three levels deep from the source root. + // For example: ./obj-x86_64-pc-linux-gnu/dist/bin/zucchini-gtest + if (PathService::Get(DIR_EXE, &path)) { + *result = path.DirName().DirName().DirName(); + return true; + } +#endif // !defined(MOZ_ZUCCHINI) + DLOG(ERROR) << "Couldn't find your source root. " + << "Try running from your chromium/src directory."; + return false; + } +#if !defined(MOZ_ZUCCHINI) + case DIR_USER_DESKTOP: + *result = nix::GetXDGUserDirectory("DESKTOP", "Desktop"); + return true; + case DIR_CACHE: { + std::unique_ptr env(Environment::Create()); + FilePath cache_dir( + nix::GetXDGDirectory(env.get(), "XDG_CACHE_HOME", ".cache")); + *result = cache_dir; + return true; + } +#endif // !defined(MOZ_ZUCCHINI) + } + return false; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,28 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_POSIX_H_ +#define BASE_BASE_PATHS_POSIX_H_ + +// This file declares windows-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_POSIX_START = 400, + + DIR_CACHE, // Directory for the system users where applications store cache + // data in subdirectories. Note this is *not* where the browser + // cache lives, but the browser cache can be a subdirectory. This + // is $XDG_CACHE_HOME on Linux and + // ~/Library/Caches on Mac. + + PATH_POSIX_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_POSIX_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,236 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include +#include + +#include "base/base_paths.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_path.h" +#if defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#endif // defined(MOZ_ZUCCHINI) +#include "base/path_service.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/win/current_module.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/win/scoped_co_mem.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/win/windows_version.h" + +using base::FilePath; + +namespace base { + +bool PathProviderWin(int key, FilePath* result) { + // We need to go compute the value. It would be nice to support paths with + // names longer than MAX_PATH, but the system functions don't seem to be + // designed for it either, with the exception of GetTempPath (but other + // things will surely break if the temp path is too long, so we don't bother + // handling it. + wchar_t system_buffer[MAX_PATH]; + system_buffer[0] = 0; + + FilePath cur; + switch (key) { + case base::FILE_EXE: + if (GetModuleFileName(NULL, system_buffer, MAX_PATH) == 0) + return false; + cur = FilePath(system_buffer); + break; + case base::FILE_MODULE: { + // the resource containing module is assumed to be the one that + // this code lives in, whether that's a dll or exe + if (GetModuleFileName(CURRENT_MODULE(), system_buffer, MAX_PATH) == 0) + return false; + cur = FilePath(system_buffer); + break; + } + case base::DIR_WINDOWS: + GetWindowsDirectory(system_buffer, MAX_PATH); + cur = FilePath(system_buffer); + break; + case base::DIR_SYSTEM: + GetSystemDirectory(system_buffer, MAX_PATH); + cur = FilePath(system_buffer); + break; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILESX86: + if (win::OSInfo::GetArchitecture() != win::OSInfo::X86_ARCHITECTURE) { + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + } + // Fall through to base::DIR_PROGRAM_FILES if we're on an X86 machine. + [[fallthrough]]; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILES: + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILES6432: +#if !defined(_WIN64) + if (base::win::OSInfo::GetInstance()->IsWowX86OnAMD64()) { + std::unique_ptr env(base::Environment::Create()); + std::string programfiles_w6432; + // 32-bit process running in WOW64 sets ProgramW6432 environment + // variable. See + // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx. + if (!env->GetVar("ProgramW6432", &programfiles_w6432)) + return false; + // GetVar returns UTF8 - convert back to Wide. + cur = FilePath(UTF8ToWide(programfiles_w6432)); + break; + } +#endif + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_IE_INTERNET_CACHE: + if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_START_MENU: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_START_MENU: + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_STARTUP: + if (FAILED(SHGetFolderPath(nullptr, CSIDL_COMMON_STARTUP, nullptr, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_USER_STARTUP: + if (FAILED(SHGetFolderPath(nullptr, CSIDL_STARTUP, nullptr, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_ROAMING_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_LOCAL_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_SRC_TEST_DATA_ROOT: { + FilePath executableDir; + // On Windows, unit tests execute two levels deep from the source root. + // For example: chrome/{Debug|Release}/ui_tests.exe + PathService::Get(base::DIR_EXE, &executableDir); +#if !defined(MOZ_ZUCCHINI) + cur = executableDir.DirName().DirName(); +#else + // On Windows, for Firefox, we are thre levels deep. + // For example: ./obj-x86_64-pc-windows-msvc/dist/bin/zucchini-gtest.exe + cur = executableDir.DirName().DirName().DirName(); +#endif // !defined(MOZ_ZUCCHINI) + break; + } + case base::DIR_APP_SHORTCUTS: { +#if !defined(MOZ_ZUCCHINI) + base::win::ScopedCoMem path_buf; + if (FAILED(SHGetKnownFolderPath(FOLDERID_ApplicationShortcuts, 0, NULL, + &path_buf))) + return false; + + cur = FilePath(path_buf.get()); + break; +#else + NOTREACHED(); + return false; +#endif // !defined(MOZ_ZUCCHINI) + } +#if !defined(MOZ_ZUCCHINI) + case base::DIR_USER_DESKTOP: + if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_COMMON_DESKTOP: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; + case base::DIR_USER_QUICK_LAUNCH: + if (!PathService::Get(base::DIR_ROAMING_APP_DATA, &cur)) + return false; + // According to various sources, appending + // "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only + // reliable way to get the quick launch folder across all versions of + // Windows. + // http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick- + // http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx + cur = cur.Append(FILE_PATH_LITERAL("Microsoft")) + .Append(FILE_PATH_LITERAL("Internet Explorer")) + .Append(FILE_PATH_LITERAL("Quick Launch")); + break; + case base::DIR_TASKBAR_PINS: { + if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) + return false; + cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) + .Append(FILE_PATH_LITERAL("TaskBar")); + break; + } + case base::DIR_IMPLICIT_APP_SHORTCUTS: + if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) + return false; + cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) + .Append(FILE_PATH_LITERAL("ImplicitAppShortcuts")); + break; + case base::DIR_WINDOWS_FONTS: + if (FAILED(SHGetFolderPath(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; + default: + return false; + } + + *result = cur; + return true; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,66 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_WIN_H_ +#define BASE_BASE_PATHS_WIN_H_ + +// This file declares windows-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_WIN_START = 100, + + DIR_WINDOWS, // Windows directory, usually "c:\windows" + DIR_SYSTEM, // Usually c:\windows\system32" + // 32-bit 32-bit on 64-bit 64-bit on 64-bit + // DIR_PROGRAM_FILES 1 2 1 + // DIR_PROGRAM_FILESX86 1 2 2 + // DIR_PROGRAM_FILES6432 1 1 1 + // 1 - C:\Program Files 2 - C:\Program Files (x86) + DIR_PROGRAM_FILES, // See table above. +#if !defined(MOZ_ZUCCHINI) + DIR_PROGRAM_FILESX86, // See table above. + DIR_PROGRAM_FILES6432, // See table above. +#endif // !defined(MOZ_ZUCCHINI) + + DIR_IE_INTERNET_CACHE, // Temporary Internet Files directory. + DIR_COMMON_START_MENU, // Usually "C:\ProgramData\Microsoft\Windows\ + // Start Menu\Programs" + DIR_START_MENU, // Usually "C:\Users\\AppData\Roaming\ + // Microsoft\Windows\Start Menu\Programs" + DIR_COMMON_STARTUP, // Usually "C:\ProgramData\Microsoft\Windows\ + // Start Menu\Programs\Startup" + DIR_USER_STARTUP, // Usually "C:\Users\\AppData\Roaming\ + // Microsoft\Windows\Start Menu\Programs\Startup" + DIR_ROAMING_APP_DATA, // Roaming Application Data directory under the + // user profile. + // Usually "C:\Users\\AppData\Roaming". + // Data for specific applications is stored in + // subdirectories. + DIR_LOCAL_APP_DATA, // Local Application Data directory under the + // user profile. + // Usually "C:\Users\\AppData\Local". + // Data for specific applications is stored in + // subdirectories. + DIR_COMMON_APP_DATA, // Usually "C:\ProgramData". Data for specific + // applications is stored in subdirectories. + DIR_APP_SHORTCUTS, // Where tiles on the start screen are stored, + // only for Windows 8. Maps to "Local\AppData\ + // Microsoft\Windows\Application Shortcuts\". + DIR_COMMON_DESKTOP, // Directory for the common desktop (visible + // on all user's Desktop). + DIR_USER_QUICK_LAUNCH, // Directory for the quick launch shortcuts. + DIR_TASKBAR_PINS, // Directory for the shortcuts pinned to taskbar. + DIR_IMPLICIT_APP_SHORTCUTS, // The implicit user pinned shortcut directory. + DIR_WINDOWS_FONTS, // Usually C:\Windows\Fonts. + + PATH_WIN_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_WIN_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/bit_cast.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/bit_cast.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,48 @@ +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BIT_CAST_H_ +#define BASE_BIT_CAST_H_ + +#include + +#include "base/compiler_specific.h" + +#if !HAS_BUILTIN(__builtin_bit_cast) +#include // memcpy +#endif + +namespace base { + +// This is C++20's std::bit_cast<>(). It morally does what +// `*reinterpret_cast(&source)` does, but the cast/deref pair is +// undefined behavior, while bit_cast<>() isn't. +template +#if HAS_BUILTIN(__builtin_bit_cast) +constexpr +#else +inline +#endif + Dest + bit_cast(const Source& source) { +#if HAS_BUILTIN(__builtin_bit_cast) + // TODO(thakis): Keep only this codepath once nacl is gone or updated. + return __builtin_bit_cast(Dest, source); +#else + static_assert(sizeof(Dest) == sizeof(Source), + "bit_cast requires source and destination to be the same size"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the destination type to be copyable"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the source type to be copyable"); + + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +#endif +} + +} // namespace base + +#endif // BASE_BIT_CAST_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/bits.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bits.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/bits.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/bits.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,142 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file defines some bit utilities. + +#ifndef BASE_BITS_H_ +#define BASE_BITS_H_ + +#include +#include + +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "build/build_config.h" + +namespace base { +namespace bits { + +// Returns true iff |value| is a power of 2. +// +// TODO(pkasting): When C++20 is available, replace with std::has_single_bit(). +template ::value>> +constexpr bool IsPowerOfTwo(T value) { + // From "Hacker's Delight": Section 2.1 Manipulating Rightmost Bits. + // + // Only positive integers with a single bit set are powers of two. If only one + // bit is set in x (e.g. 0b00000100000000) then |x-1| will have that bit set + // to zero and all bits to its right set to 1 (e.g. 0b00000011111111). Hence + // |x & (x-1)| is 0 iff x is a power of two. + return value > 0 && (value & (value - 1)) == 0; +} + +// Round down |size| to a multiple of alignment, which must be a power of two. +template >> +constexpr T AlignDown(T size, T alignment) { + DCHECK(IsPowerOfTwo(alignment)); + return size & ~(alignment - 1); +} + +// Move |ptr| back to the previous multiple of alignment, which must be a power +// of two. Defined for types where sizeof(T) is one byte. +template ::type> +inline T* AlignDown(T* ptr, uintptr_t alignment) { + return reinterpret_cast( + AlignDown(reinterpret_cast(ptr), alignment)); +} + +// Round up |size| to a multiple of alignment, which must be a power of two. +template >> +constexpr T AlignUp(T size, T alignment) { + DCHECK(IsPowerOfTwo(alignment)); + return (size + alignment - 1) & ~(alignment - 1); +} + +// Advance |ptr| to the next multiple of alignment, which must be a power of +// two. Defined for types where sizeof(T) is one byte. +template ::type> +inline T* AlignUp(T* ptr, uintptr_t alignment) { + return reinterpret_cast( + AlignUp(reinterpret_cast(ptr), alignment)); +} + +// CountLeadingZeroBits(value) returns the number of zero bits following the +// most significant 1 bit in |value| if |value| is non-zero, otherwise it +// returns {sizeof(T) * 8}. +// Example: 00100010 -> 2 +// +// CountTrailingZeroBits(value) returns the number of zero bits preceding the +// least significant 1 bit in |value| if |value| is non-zero, otherwise it +// returns {sizeof(T) * 8}. +// Example: 00100010 -> 1 +// +// C does not have an operator to do this, but fortunately the various +// compilers have built-ins that map to fast underlying processor instructions. +// +// TODO(pkasting): When C++20 is available, replace with std::countl_zero() and +// similar. + +// __builtin_clz has undefined behaviour for an input of 0, even though there's +// clearly a return value that makes sense, and even though some processor clz +// instructions have defined behaviour for 0. We could drop to raw __asm__ to +// do better, but we'll avoid doing that unless we see proof that we need to. +template +ALWAYS_INLINE constexpr + typename std::enable_if::value && sizeof(T) <= 8, + int>::type + CountLeadingZeroBits(T value) { + static_assert(bits > 0, "invalid instantiation"); + return LIKELY(value) + ? bits == 64 + ? __builtin_clzll(static_cast(value)) + : __builtin_clz(static_cast(value)) - (32 - bits) + : bits; +} + +template +ALWAYS_INLINE constexpr + typename std::enable_if::value && sizeof(T) <= 8, + int>::type + CountTrailingZeroBits(T value) { + return LIKELY(value) ? bits == 64 + ? __builtin_ctzll(static_cast(value)) + : __builtin_ctz(static_cast(value)) + : bits; +} + +// Returns the integer i such as 2^i <= n < 2^(i+1). +// +// There is a common `BitLength` function, which returns the number of bits +// required to represent a value. Rather than implement that function, +// use `Log2Floor` and add 1 to the result. +// +// TODO(pkasting): When C++20 is available, replace with std::bit_xxx(). +constexpr int Log2Floor(uint32_t n) { + return 31 - CountLeadingZeroBits(n); +} + +// Returns the integer i such as 2^(i-1) < n <= 2^i. +constexpr int Log2Ceiling(uint32_t n) { + // When n == 0, we want the function to return -1. + // When n == 0, (n - 1) will underflow to 0xFFFFFFFF, which is + // why the statement below starts with (n ? 32 : -1). + return (n ? 32 : -1) - CountLeadingZeroBits(n - 1); +} + +// Returns a value of type T with a single bit set in the left-most position. +// Can be used instead of manually shifting a 1 to the left. +template +constexpr T LeftmostBit() { + static_assert(std::is_integral::value, + "This function can only be used with integral types."); + T one(1u); + return one << (8 * sizeof(T) - 1); +} + +} // namespace bits +} // namespace base + +#endif // BASE_BITS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.cc 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,347 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/check.h" + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/debug/alias.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/debug/debugging_buildflags.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/debug/dump_without_crashing.h" +#include "base/feature_list.h" +#include "base/features.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/logging.h" +#include "base/thread_annotations.h" +#include "build/build_config.h" + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) +#include "base/debug/crash_logging.h" +#endif // !BUILDFLAG(IS_NACL) +#endif // !defined(MOZ_ZUCCHINI) + +namespace logging { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +void DumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { + // Copy the LogMessage message to stack memory to make sure it can be + // recovered in crash dumps. This is easier to recover in minidumps than crash + // keys during local debugging. + DEBUG_ALIAS_FOR_CSTR(log_message_str, log_message->BuildCrashString().c_str(), + 1024); + + // Report from the same location at most once every 30 days (unless the + // process has died). This attempts to prevent us from flooding ourselves with + // repeat reports for the same bug. + base::debug::DumpWithoutCrashing(location, base::Days(30)); +} +#endif // !defined(MOZ_ZUCCHINI) + +void NotReachedDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "NOTREACHED_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +void DCheckDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "DCHECK_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +void DumpWillBeCheckDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "DUMP_WILL_BE_CHECK_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +class NotReachedLogMessage : public LogMessage { + public: + NotReachedLogMessage(const base::Location& location, LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~NotReachedLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + NotReachedDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +class DCheckLogMessage : public LogMessage { + public: + using LogMessage::LogMessage; + DCheckLogMessage(const base::Location& location, LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~DCheckLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +class DumpWillBeCheckLogMessage : public LogMessage { + public: + using LogMessage::LogMessage; + DumpWillBeCheckLogMessage(const base::Location& location, + LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~DumpWillBeCheckLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DumpWillBeCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +#if BUILDFLAG(IS_WIN) +class DCheckWin32ErrorLogMessage : public Win32ErrorLogMessage { + public: + DCheckWin32ErrorLogMessage(const base::Location& location, + LogSeverity severity, + SystemErrorCode err) + : Win32ErrorLogMessage(location.file_name(), + location.line_number(), + severity, + err), + location_(location) {} + ~DCheckWin32ErrorLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +class DCheckErrnoLogMessage : public ErrnoLogMessage { + public: + DCheckErrnoLogMessage(const base::Location& location, + LogSeverity severity, + SystemErrorCode err) + : ErrnoLogMessage(location.file_name(), + location.line_number(), + severity, + err), + location_(location) {} + ~DCheckErrnoLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; +#endif // BUILDFLAG(IS_WIN) + +} // namespace + +CheckError CheckError::Check(const char* condition, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::CheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::DCheck(const char* condition, + const base::Location& location) { + auto* const log_message = new DCheckLogMessage(location, LOGGING_DCHECK); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DCheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new DCheckLogMessage( + location.file_name(), location.line_number(), LOGGING_DCHECK); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeCheck(const char* condition, + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeCheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::PCheck(const char* condition, + const base::Location& location) { + SystemErrorCode err_code = logging::GetLastSystemErrorCode(); +#if BUILDFLAG(IS_WIN) + auto* const log_message = new Win32ErrorLogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL, err_code); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + auto* const log_message = new ErrnoLogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL, err_code); +#endif + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::PCheck(const base::Location& location) { + return PCheck("", location); +} + +CheckError CheckError::DPCheck(const char* condition, + const base::Location& location) { + SystemErrorCode err_code = logging::GetLastSystemErrorCode(); +#if BUILDFLAG(IS_WIN) + auto* const log_message = + new DCheckWin32ErrorLogMessage(location, LOGGING_DCHECK, err_code); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + auto* const log_message = + new DCheckErrnoLogMessage(location, LOGGING_DCHECK, err_code); +#endif + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeNotReachedNoreturn( + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << "NOTREACHED hit. "; + return CheckError(log_message); +} + +CheckError CheckError::NotImplemented(const char* function, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_ERROR); + log_message->stream() << "Not implemented reached in " << function; + return CheckError(log_message); +} + +std::ostream& CheckError::stream() { + return log_message_->stream(); +} + +CheckError::~CheckError() { + // TODO(crbug.com/1409729): Consider splitting out CHECK from DCHECK so that + // the destructor can be marked [[noreturn]] and we don't need to check + // severity in the destructor. + const bool is_fatal = log_message_->severity() == LOGGING_FATAL; + // Note: This function ends up in crash stack traces. If its full name + // changes, the crash server's magic signature logic needs to be updated. + // See cl/306632920. + delete log_message_; + + // Make sure we crash even if LOG(FATAL) has been overridden. + // TODO(crbug.com/1409729): Remove severity checking in the destructor when + // LOG(FATAL) is [[noreturn]] and can't be overridden. + if (is_fatal) { + base::ImmediateCrash(); + } +} + +NotReachedError NotReachedError::NotReached(const base::Location& location) { + const LogSeverity severity = []() { + // NOTREACHED() instances may be hit before base::FeatureList is enabled. +#if !defined(MOZ_ZUCCHINI) + if (base::FeatureList::GetInstance() && + base::FeatureList::IsEnabled(base::features::kNotReachedIsFatal)) { + return LOGGING_FATAL; + } +#endif // !defined(MOZ_ZUCCHINI) + return DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR; + }(); + auto* const log_message = new NotReachedLogMessage(location, severity); + + // TODO(pbos): Consider a better message for NotReached(), this is here to + // match existing behavior + test expectations. + log_message->stream() << "Check failed: false. "; + return NotReachedError(log_message); +} + +void NotReachedError::TriggerNotReached() { + // This triggers a NOTREACHED() error as the returned NotReachedError goes out + // of scope. + NotReached() + << "NOTREACHED log messages are omitted in official builds. Sorry!"; +} + +NotReachedError::~NotReachedError() = default; + +NotReachedNoreturnError::NotReachedNoreturnError(const base::Location& location) + : CheckError([location]() { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << "NOTREACHED hit. "; + return log_message; + }()) {} + +// Note: This function ends up in crash stack traces. If its full name changes, +// the crash server's magic signature logic needs to be updated. See +// cl/306632920. +NotReachedNoreturnError::~NotReachedNoreturnError() { + delete log_message_; + + // Make sure we die if we haven't. + // TODO(crbug.com/1409729): Replace this with NOTREACHED_NORETURN() once + // LOG(FATAL) is [[noreturn]]. + base::ImmediateCrash(); +} + +#if !defined(MOZ_ZUCCHINI) +void RawCheckFailure(const char* message) { + RawLog(LOGGING_FATAL, message); + __builtin_unreachable(); +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace logging diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,279 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CHECK_H_ +#define BASE_CHECK_H_ + +#include + +#include "base/base_export.h" +#include "base/compiler_specific.h" +#include "base/dcheck_is_on.h" +#include "base/debug/debugging_buildflags.h" +#include "base/immediate_crash.h" +#include "base/location.h" + +// This header defines the CHECK, DCHECK, and DPCHECK macros. +// +// CHECK dies with a fatal error if its condition is not true. It is not +// controlled by NDEBUG, so the check will be executed regardless of compilation +// mode. +// +// DCHECK, the "debug mode" check, is enabled depending on NDEBUG and +// DCHECK_ALWAYS_ON, and its severity depends on DCHECK_IS_CONFIGURABLE. +// +// (D)PCHECK is like (D)CHECK, but includes the system error code (c.f. +// perror(3)). +// +// Additional information can be streamed to these macros and will be included +// in the log output if the condition doesn't hold (you may need to include +// ): +// +// CHECK(condition) << "Additional info."; +// +// The condition is evaluated exactly once. Even in build modes where e.g. +// DCHECK is disabled, the condition and any stream arguments are still +// referenced to avoid warnings about unused variables and functions. +// +// For the (D)CHECK_EQ, etc. macros, see base/check_op.h. However, that header +// is *significantly* larger than check.h, so try to avoid including it in +// header files. + +namespace logging { + +// Class used to explicitly ignore an ostream, and optionally a boolean value. +class VoidifyStream { + public: + VoidifyStream() = default; + explicit VoidifyStream(bool) {} + + // This operator has lower precedence than << but higher than ?: + void operator&(std::ostream&) {} +}; + +// Macro which uses but does not evaluate expr and any stream parameters. +#define EAT_CHECK_STREAM_PARAMS(expr) \ + true ? (void)0 \ + : ::logging::VoidifyStream(expr) & (*::logging::g_swallow_stream) +BASE_EXPORT extern std::ostream* g_swallow_stream; + +class LogMessage; + +// Class used for raising a check error upon destruction. +class BASE_EXPORT CheckError { + public: + static CheckError Check( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // CHECK_op macros. + static CheckError CheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError DCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // DCHECK_op macros. + static CheckError DCheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError DumpWillBeCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // DUMP_WILL_BE_CHECK_op macros. + static CheckError DumpWillBeCheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError PCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + static CheckError PCheck( + const base::Location& location = base::Location::Current()); + + static CheckError DPCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + + static CheckError DumpWillBeNotReachedNoreturn( + const base::Location& location = base::Location::Current()); + + static CheckError NotImplemented( + const char* function, + const base::Location& location = base::Location::Current()); + + // Stream for adding optional details to the error message. + std::ostream& stream(); + + // Try really hard to get the call site and callee as separate stack frames in + // crash reports. + NOMERGE NOINLINE NOT_TAIL_CALLED ~CheckError(); + + CheckError(const CheckError&) = delete; + CheckError& operator=(const CheckError&) = delete; + + template + std::ostream& operator<<(T&& streamed_type) { + return stream() << streamed_type; + } + + protected: + // Takes ownership of `log_message`. + explicit CheckError(LogMessage* log_message) : log_message_(log_message) {} + + LogMessage* const log_message_; +}; + +class BASE_EXPORT NotReachedError : public CheckError { + public: + static NotReachedError NotReached( + const base::Location& location = base::Location::Current()); + + // Used to trigger a NOTREACHED() without providing file or line while also + // discarding log-stream arguments. See base/notreached.h. + NOMERGE NOINLINE NOT_TAIL_CALLED static void TriggerNotReached(); + + // TODO(crbug.com/851128): Mark [[noreturn]] once this is CHECK-fatal on all + // builds. + NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedError(); + + private: + using CheckError::CheckError; +}; + +// TODO(crbug.com/851128): This should take the name of the above class once all +// callers of NOTREACHED() have migrated to the CHECK-fatal version. +class BASE_EXPORT NotReachedNoreturnError : public CheckError { + public: + explicit NotReachedNoreturnError( + const base::Location& location = base::Location::Current()); + + [[noreturn]] NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedNoreturnError(); +}; + +// A helper macro for checks that log to streams that makes it easier for the +// compiler to identify and warn about dead code, e.g.: +// +// return 2; +// NOTREACHED(); +// +// The 'switch' is used to prevent the 'else' from being ambiguous when the +// macro is used in an 'if' clause such as: +// if (a == 1) +// CHECK(Foo()); +// +// TODO(crbug.com/1380930): Remove the const bool when the blink-gc plugin has +// been updated to accept `if (LIKELY(!field_))` as well as `if (!field_)`. +#define LOGGING_CHECK_FUNCTION_IMPL(check_stream, condition) \ + switch (0) \ + case 0: \ + default: \ + /* Hint to the optimizer that `condition` is unlikely to be false. */ \ + /* The optimizer can use this as a hint to place the failure path */ \ + /* out-of-line, e.g. at the tail of the function. */ \ + if (const bool probably_true = static_cast(condition); \ + LIKELY(ANALYZER_ASSUME_TRUE(probably_true))) \ + ; \ + else \ + (check_stream) + +#if defined(OFFICIAL_BUILD) && !defined(NDEBUG) +#error "Debug builds are not expected to be optimized as official builds." +#endif // defined(OFFICIAL_BUILD) && !defined(NDEBUG) + +#if defined(OFFICIAL_BUILD) && !DCHECK_IS_ON() +// Note that this uses IMMEDIATE_CRASH_ALWAYS_INLINE to force-inline in debug +// mode as well. See LoggingTest.CheckCausesDistinctBreakpoints. +[[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void CheckFailure() { + base::ImmediateCrash(); +} + +// Discard log strings to reduce code bloat. +// +// This is not calling BreakDebugger since this is called frequently, and +// calling an out-of-line function instead of a noreturn inline macro prevents +// compiler optimizations. Unlike the other check macros, this one does not use +// LOGGING_CHECK_FUNCTION_IMPL(), since it is incompatible with +// EAT_CHECK_STREAM_PARAMETERS(). +#define CHECK(condition) \ + UNLIKELY(!(condition)) ? logging::CheckFailure() : EAT_CHECK_STREAM_PARAMS() + +#define CHECK_WILL_STREAM() false + +// Strip the conditional string from official builds. +#define PCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::PCheck(), condition) + +#else + +#define CHECK_WILL_STREAM() true + +#define CHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::Check(#condition), \ + condition) + +#define PCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::PCheck(#condition), \ + condition) + +#endif + +#if DCHECK_IS_ON() + +#define DCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::DCheck(#condition), \ + condition) +#define DPCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::DPCheck(#condition), \ + condition) + +#else + +#define DCHECK(condition) EAT_CHECK_STREAM_PARAMS(!(condition)) +#define DPCHECK(condition) EAT_CHECK_STREAM_PARAMS(!(condition)) + +#endif // DCHECK_IS_ON() + +// The DUMP_WILL_BE_CHECK() macro provides a convenient way to non-fatally dump +// in official builds if a condition is false. This is used to more cautiously +// roll out a new CHECK() (or upgrade a DCHECK) where the caller isn't entirely +// sure that something holds true in practice (but asserts that it should). This +// is especially useful for platforms that have a low pre-stable population and +// code areas that are rarely exercised. +// +// On DCHECK builds this macro matches DCHECK behavior. +// +// This macro isn't optimized (preserves filename, line number and log messages +// in official builds), as they are expected to be in product temporarily. When +// using this macro, leave a TODO(crbug.com/nnnn) entry referring to a bug +// related to its rollout. Then put a NextAction on the bug to come back and +// clean this up (replace with a CHECK). A DUMP_WILL_BE_CHECK() that's been left +// untouched for a long time without bug updates suggests that issues that +// would've prevented enabling this CHECK have either not been discovered or +// have been resolved. +// +// Using this macro is preferred over direct base::debug::DumpWithoutCrashing() +// invocations as it communicates intent to eventually end up as a CHECK. It +// also preserves the log message so setting crash keys to get additional debug +// info isn't required as often. +#define DUMP_WILL_BE_CHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL( \ + ::logging::CheckError::DumpWillBeCheck(#condition), condition) + +// Async signal safe checking mechanism. +[[noreturn]] BASE_EXPORT void RawCheckFailure(const char* message); +#define RAW_CHECK(condition) \ + do { \ + if (UNLIKELY(!(condition))) { \ + ::logging::RawCheckFailure("Check failed: " #condition "\n"); \ + } \ + } while (0) + +} // namespace logging + +#endif // BASE_CHECK_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check_op.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check_op.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,101 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/check_op.h" + +#include + +#include +#include +#include + +#include "base/logging.h" + +namespace logging { + +char* CheckOpValueStr(int v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%d", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%u", v); + return strdup(buf); +} + +char* CheckOpValueStr(long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%ld", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%lu", v); + return strdup(buf); +} + +char* CheckOpValueStr(long long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%lld", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned long long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%llu", v); + return strdup(buf); +} + +char* CheckOpValueStr(const void* v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%p", v); + return strdup(buf); +} + +char* CheckOpValueStr(std::nullptr_t v) { + return strdup("nullptr"); +} + +char* CheckOpValueStr(const std::string& v) { + return strdup(v.c_str()); +} + +char* CheckOpValueStr(std::string_view v) { + // Ideally this would be `strndup`, but `strndup` is not portable. + char* ret = static_cast(malloc(v.size() + 1)); + if (ret) { + std::copy(v.begin(), v.end(), ret); + ret[v.size()] = 0; + } + return ret; +} + +char* CheckOpValueStr(double v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%.6lf", v); + return strdup(buf); +} + +char* StreamValToStr(const void* v, + void (*stream_func)(std::ostream&, const void*)) { + std::stringstream ss; + stream_func(ss, v); + return strdup(ss.str().c_str()); +} + +char* CreateCheckOpLogMessageString(const char* expr_str, + char* v1_str, + char* v2_str) { + std::stringstream ss; + ss << "Check failed: " << expr_str << " (" << v1_str << " vs. " << v2_str + << ")"; + free(v1_str); + free(v2_str); + return strdup(ss.str().c_str()); +} + +} // namespace logging diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check_op.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/check_op.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/check_op.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,254 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CHECK_OP_H_ +#define BASE_CHECK_OP_H_ + +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/check.h" +#include "base/dcheck_is_on.h" +#include "base/debug/debugging_buildflags.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/strings/to_string.h" +#include "base/types/supports_ostream_operator.h" + +// This header defines the (DP)CHECK_EQ etc. macros. +// +// (DP)CHECK_EQ(x, y) is similar to (DP)CHECK(x == y) but will also log the +// values of x and y if the condition doesn't hold. This works for basic types +// and types with an operator<< or .ToString() method. +// +// The operands are evaluated exactly once, and even in build modes where e.g. +// DCHECK is disabled, the operands and their stringification methods are still +// referenced to avoid warnings about unused variables or functions. +// +// To support the stringification of the check operands, this header is +// *significantly* larger than base/check.h, so it should be avoided in common +// headers. +// +// This header also provides the (DP)CHECK macros (by including check.h), so if +// you use e.g. both CHECK_EQ and CHECK, including this header is enough. If you +// only use CHECK however, please include the smaller check.h instead. + +namespace logging { + +// Functions for turning check operand values into NUL-terminated C strings. +// Caller takes ownership of the result and must release it with `free`. +// This would normally be defined by , but this header tries to avoid +// including to reduce compile-time. See https://crrev.com/c/2128112. +BASE_EXPORT char* CheckOpValueStr(int v); +BASE_EXPORT char* CheckOpValueStr(unsigned v); +BASE_EXPORT char* CheckOpValueStr(long v); +BASE_EXPORT char* CheckOpValueStr(unsigned long v); +BASE_EXPORT char* CheckOpValueStr(long long v); +BASE_EXPORT char* CheckOpValueStr(unsigned long long v); +BASE_EXPORT char* CheckOpValueStr(const void* v); +BASE_EXPORT char* CheckOpValueStr(std::nullptr_t v); +BASE_EXPORT char* CheckOpValueStr(double v); +// Although the standard defines operator<< for std::string and std::string_view +// in their respective headers, libc++ requires for them. See +// https://github.com/llvm/llvm-project/issues/61070. So we define non- +// versions here too. +BASE_EXPORT char* CheckOpValueStr(const std::string& v); +BASE_EXPORT char* CheckOpValueStr(std::string_view v); + +// Convert a streamable value to string out-of-line to avoid . +BASE_EXPORT char* StreamValToStr(const void* v, + void (*stream_func)(std::ostream&, + const void*)); + +#ifdef __has_builtin +#define SUPPORTS_BUILTIN_ADDRESSOF (__has_builtin(__builtin_addressof)) +#else +#define SUPPORTS_BUILTIN_ADDRESSOF 0 +#endif + +template +inline typename std::enable_if< + base::internal::SupportsOstreamOperator::value && + !std::is_function::type>::value, + char*>::type +CheckOpValueStr(const T& v) { + auto f = [](std::ostream& s, const void* p) { + s << *reinterpret_cast(p); + }; + + // operator& might be overloaded, so do the std::addressof dance. + // __builtin_addressof is preferred since it also handles Obj-C ARC pointers. + // Some casting is still needed, because T might be volatile. +#if SUPPORTS_BUILTIN_ADDRESSOF + const void* vp = const_cast( + reinterpret_cast(__builtin_addressof(v))); +#else + const void* vp = reinterpret_cast( + const_cast(&reinterpret_cast(v))); +#endif + return StreamValToStr(vp, f); +} + +#undef SUPPORTS_BUILTIN_ADDRESSOF + +// Overload for types that have no operator<< but do have .ToString() defined. +template +inline typename std::enable_if< + !base::internal::SupportsOstreamOperator::value && + base::internal::SupportsToString::value, + char*>::type +CheckOpValueStr(const T& v) { + // .ToString() may not return a std::string, e.g. blink::WTF::String. + return CheckOpValueStr(v.ToString()); +} + +// Provide an overload for functions and function pointers. Function pointers +// don't implicitly convert to void* but do implicitly convert to bool, so +// without this function pointers are always printed as 1 or 0. (MSVC isn't +// standards-conforming here and converts function pointers to regular +// pointers, so this is a no-op for MSVC.) +template +inline typename std::enable_if< + std::is_function::type>::value, + char*>::type +CheckOpValueStr(const T& v) { + return CheckOpValueStr(reinterpret_cast(v)); +} + +// We need overloads for enums that don't support operator<<. +// (i.e. scoped enums where no operator<< overload was declared). +template +inline typename std::enable_if< + !base::internal::SupportsOstreamOperator::value && + std::is_enum::value, + char*>::type +CheckOpValueStr(const T& v) { + return CheckOpValueStr( + static_cast::type>(v)); +} + +// Takes ownership of `v1_str` and `v2_str`, destroying them with free(). For +// use with CheckOpValueStr() which allocates these strings using strdup(). +// Returns allocated string (with strdup) for passing into +// ::logging::CheckError::(D)CheckOp methods. +// TODO(pbos): Annotate this ABSL_ATTRIBUTE_RETURNS_NONNULL after solving +// compile failure. +BASE_EXPORT char* CreateCheckOpLogMessageString(const char* expr_str, + char* v1_str, + char* v2_str); + +// Helper macro for binary operators. +// The 'switch' is used to prevent the 'else' from being ambiguous when the +// macro is used in an 'if' clause such as: +// if (a == 1) +// CHECK_EQ(2, a); +#define CHECK_OP_FUNCTION_IMPL(check_failure_function, name, op, val1, val2) \ + switch (0) \ + case 0: \ + default: \ + if (char* const message_on_fail = ::logging::Check##name##Impl( \ + (val1), (val2), #val1 " " #op " " #val2); \ + !message_on_fail) \ + ; \ + else \ + check_failure_function(message_on_fail) + +#if !CHECK_WILL_STREAM() + +// Discard log strings to reduce code bloat. +#define CHECK_OP(name, op, val1, val2) CHECK((val1)op(val2)) + +#else + +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::CheckOp, name, op, val1, val2) + +#endif + +// The second overload avoids address-taking of static members for +// fundamental types. +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template ::value || \ + !std::is_fundamental::value, \ + int> = 0> \ + constexpr char* Check##name##Impl(const T& v1, const U& v2, \ + const char* expr_str) { \ + if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2))) \ + return nullptr; \ + return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \ + CheckOpValueStr(v2)); \ + } \ + template ::value && \ + std::is_fundamental::value, \ + int> = 0> \ + constexpr char* Check##name##Impl(T v1, U v2, const char* expr_str) { \ + if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2))) \ + return nullptr; \ + return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \ + CheckOpValueStr(v2)); \ + } + +// clang-format off +DEFINE_CHECK_OP_IMPL(EQ, ==) +DEFINE_CHECK_OP_IMPL(NE, !=) +DEFINE_CHECK_OP_IMPL(LE, <=) +DEFINE_CHECK_OP_IMPL(LT, < ) +DEFINE_CHECK_OP_IMPL(GE, >=) +DEFINE_CHECK_OP_IMPL(GT, > ) +#undef DEFINE_CHECK_OP_IMPL +#define CHECK_EQ(val1, val2) CHECK_OP(EQ, ==, val1, val2) +#define CHECK_NE(val1, val2) CHECK_OP(NE, !=, val1, val2) +#define CHECK_LE(val1, val2) CHECK_OP(LE, <=, val1, val2) +#define CHECK_LT(val1, val2) CHECK_OP(LT, < , val1, val2) +#define CHECK_GE(val1, val2) CHECK_OP(GE, >=, val1, val2) +#define CHECK_GT(val1, val2) CHECK_OP(GT, > , val1, val2) +// clang-format on + +#if DCHECK_IS_ON() + +#define DCHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DCheckOp, name, op, val1, val2) + +#else + +// Don't do any evaluation but still reference the same stuff as when enabled. +#define DCHECK_OP(name, op, val1, val2) \ + EAT_CHECK_STREAM_PARAMS((::logging::CheckOpValueStr(val1), \ + ::logging::CheckOpValueStr(val2), (val1)op(val2))) + +#endif + +// clang-format off +#define DCHECK_EQ(val1, val2) DCHECK_OP(EQ, ==, val1, val2) +#define DCHECK_NE(val1, val2) DCHECK_OP(NE, !=, val1, val2) +#define DCHECK_LE(val1, val2) DCHECK_OP(LE, <=, val1, val2) +#define DCHECK_LT(val1, val2) DCHECK_OP(LT, < , val1, val2) +#define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2) +#define DCHECK_GT(val1, val2) DCHECK_OP(GT, > , val1, val2) +// clang-format on + +#define DUMP_WILL_BE_CHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DumpWillBeCheckOp, name, op, \ + val1, val2) + +#define DUMP_WILL_BE_CHECK_EQ(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(EQ, ==, val1, val2) +#define DUMP_WILL_BE_CHECK_NE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(NE, !=, val1, val2) +#define DUMP_WILL_BE_CHECK_LE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(LE, <=, val1, val2) +#define DUMP_WILL_BE_CHECK_LT(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(LT, <, val1, val2) +#define DUMP_WILL_BE_CHECK_GE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(GE, >=, val1, val2) +#define DUMP_WILL_BE_CHECK_GT(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(GT, >, val1, val2) + +} // namespace logging + +#endif // BASE_CHECK_OP_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/command_line.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/command_line.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,706 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" + +#include + +#include "base/check_op.h" +#include "base/containers/contains.h" +#include "base/containers/span.h" +#include "base/debug/debugging_buildflags.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/numerics/checked_math.h" +#include "base/ranges/algorithm.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_tokenizer.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include + +#include + +#include "base/strings/string_util_win.h" +#endif // BUILDFLAG(IS_WIN) + +namespace base { + +CommandLine* CommandLine::current_process_commandline_ = nullptr; + +namespace { + +DuplicateSwitchHandler* g_duplicate_switch_handler = nullptr; + +constexpr CommandLine::CharType kSwitchTerminator[] = FILE_PATH_LITERAL("--"); +constexpr CommandLine::CharType kSwitchValueSeparator[] = + FILE_PATH_LITERAL("="); + +// Since we use a lazy match, make sure that longer versions (like "--") are +// listed before shorter versions (like "-") of similar prefixes. +#if BUILDFLAG(IS_WIN) +// By putting slash last, we can control whether it is treaded as a switch +// value by changing the value of switch_prefix_count to be one less than +// the array size. +constexpr CommandLine::StringPieceType kSwitchPrefixes[] = {L"--", L"-", L"/"}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Unixes don't use slash as a switch. +constexpr CommandLine::StringPieceType kSwitchPrefixes[] = {"--", "-"}; +#endif +size_t switch_prefix_count = std::size(kSwitchPrefixes); + +#if BUILDFLAG(IS_WIN) +// Switch string that specifies the single argument to the command line. +// If present, everything after this switch is interpreted as a single +// argument regardless of whitespace, quotes, etc. Used for launches from the +// Windows shell, which may have arguments with unencoded quotes that could +// otherwise unexpectedly be split into multiple arguments +// (https://crbug.com/937179). +constexpr CommandLine::CharType kSingleArgument[] = + FILE_PATH_LITERAL("single-argument"); +#endif // BUILDFLAG(IS_WIN) + +size_t GetSwitchPrefixLength(CommandLine::StringPieceType string) { + for (size_t i = 0; i < switch_prefix_count; ++i) { + CommandLine::StringType prefix(kSwitchPrefixes[i]); + if (string.substr(0, prefix.length()) == prefix) + return prefix.length(); + } + return 0; +} + +// Fills in |switch_string| and |switch_value| if |string| is a switch. +// This will preserve the input switch prefix in the output |switch_string|. +bool IsSwitch(const CommandLine::StringType& string, + CommandLine::StringType* switch_string, + CommandLine::StringType* switch_value) { + switch_string->clear(); + switch_value->clear(); + size_t prefix_length = GetSwitchPrefixLength(string); + if (prefix_length == 0 || prefix_length == string.length()) + return false; + + const size_t equals_position = string.find(kSwitchValueSeparator); + *switch_string = string.substr(0, equals_position); + if (equals_position != CommandLine::StringType::npos) + *switch_value = string.substr(equals_position + 1); + return true; +} + +// Returns true iff |string| represents a switch with key +// |switch_key_without_prefix|, regardless of value. +bool IsSwitchWithKey(CommandLine::StringPieceType string, + CommandLine::StringPieceType switch_key_without_prefix) { + size_t prefix_length = GetSwitchPrefixLength(string); + if (prefix_length == 0 || prefix_length == string.length()) + return false; + + const size_t equals_position = string.find(kSwitchValueSeparator); + return string.substr(prefix_length, equals_position - prefix_length) == + switch_key_without_prefix; +} + +#if BUILDFLAG(IS_WIN) +// Quotes a string as necessary for CommandLineToArgvW compatibility *on +// Windows*. +// http://msdn.microsoft.com/en-us/library/17w5ykft.aspx#parsing-c-command-line-arguments. +std::wstring QuoteForCommandLineToArgvWInternal( + const std::wstring& arg, + bool allow_unsafe_insert_sequences) { + // Ensures that GetCommandLineString isn't used to generate command-line + // strings for the Windows shell by checking for Windows insert sequences like + // "%1". GetCommandLineStringForShell should be used instead to get a string + // with the correct placeholder format for the shell. + DCHECK(arg.size() != 2 || arg[0] != L'%' || allow_unsafe_insert_sequences); + + constexpr wchar_t kQuotableCharacters[] = L" \t\\\""; + if (arg.find_first_of(kQuotableCharacters) == std::wstring::npos) { + return arg; + } + + std::wstring out(1, L'"'); + for (size_t i = 0; i < arg.size(); ++i) { + if (arg[i] == L'\\') { + // Finds the extent of this run of backslashes. + size_t end = i + 1; + while (end < arg.size() && arg[end] == L'\\') { + ++end; + } + + const size_t backslash_count = end - i; + + // Backslashes are escaped only if the run is followed by a double quote. + // Since we also will end the string with a double quote, we escape for + // either a double quote or the end of the string. + const size_t backslash_multiplier = + (end == arg.size() || arg[end] == L'"') ? 2 : 1; + + out.append(std::wstring(backslash_count * backslash_multiplier, L'\\')); + + // Advances `i` to one before `end` to balance `++i` in loop. + i = end - 1; + } else if (arg[i] == L'"') { + out.append(LR"(\")"); + } else { + out.push_back(arg[i]); + } + } + + out.push_back(L'"'); + + return out; +} +#endif // BUILDFLAG(IS_WIN) + +} // namespace + +// static +void CommandLine::SetDuplicateSwitchHandler( + std::unique_ptr new_duplicate_switch_handler) { + delete g_duplicate_switch_handler; + g_duplicate_switch_handler = new_duplicate_switch_handler.release(); +} + +CommandLine::CommandLine(NoProgram no_program) : argv_(1), begin_args_(1) {} + +CommandLine::CommandLine(const FilePath& program) + : argv_(1), + begin_args_(1) { + SetProgram(program); +} + +CommandLine::CommandLine(int argc, const CommandLine::CharType* const* argv) + : argv_(1), begin_args_(1) { + InitFromArgv(argc, argv); +} + +CommandLine::CommandLine(const StringVector& argv) + : argv_(1), + begin_args_(1) { + InitFromArgv(argv); +} + +CommandLine::CommandLine(const CommandLine& other) = default; + +CommandLine& CommandLine::operator=(const CommandLine& other) = default; + +CommandLine::~CommandLine() = default; + +#if BUILDFLAG(IS_WIN) +// static +void CommandLine::set_slash_is_not_a_switch() { + // The last switch prefix should be slash, so adjust the size to skip it. + static_assert(base::make_span(kSwitchPrefixes).back() == L"/", + "Error: Last switch prefix is not a slash."); + switch_prefix_count = std::size(kSwitchPrefixes) - 1; +} + +// static +void CommandLine::InitUsingArgvForTesting(int argc, const char* const* argv) { + DCHECK(!current_process_commandline_); + current_process_commandline_ = new CommandLine(NO_PROGRAM); + // On Windows we need to convert the command line arguments to std::wstring. + CommandLine::StringVector argv_vector; + for (int i = 0; i < argc; ++i) + argv_vector.push_back(UTF8ToWide(argv[i])); + current_process_commandline_->InitFromArgv(argv_vector); +} +#endif // BUILDFLAG(IS_WIN) + +// static +bool CommandLine::Init(int argc, const char* const* argv) { + if (current_process_commandline_) { + // If this is intentional, Reset() must be called first. If we are using + // the shared build mode, we have to share a single object across multiple + // shared libraries. + return false; + } + + current_process_commandline_ = new CommandLine(NO_PROGRAM); +#if BUILDFLAG(IS_WIN) + current_process_commandline_->ParseFromString(::GetCommandLineW()); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + current_process_commandline_->InitFromArgv(argc, argv); +#else +#error Unsupported platform +#endif + + return true; +} + +// static +void CommandLine::Reset() { + DCHECK(current_process_commandline_); + delete current_process_commandline_; + current_process_commandline_ = nullptr; +} + +// static +CommandLine* CommandLine::ForCurrentProcess() { + DCHECK(current_process_commandline_); + return current_process_commandline_; +} + +// static +bool CommandLine::InitializedForCurrentProcess() { + return !!current_process_commandline_; +} + +#if BUILDFLAG(IS_WIN) +// static +CommandLine CommandLine::FromString(StringPieceType command_line) { + CommandLine cmd(NO_PROGRAM); + cmd.ParseFromString(command_line); + return cmd; +} +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::InitFromArgv(int argc, + const CommandLine::CharType* const* argv) { + StringVector new_argv; + for (int i = 0; i < argc; ++i) + new_argv.push_back(argv[i]); + InitFromArgv(new_argv); +} + +void CommandLine::InitFromArgv(const StringVector& argv) { + argv_ = StringVector(1); + switches_.clear(); + begin_args_ = 1; + SetProgram(argv.empty() ? FilePath() : FilePath(argv[0])); + AppendSwitchesAndArguments(argv); +} + +FilePath CommandLine::GetProgram() const { + return FilePath(argv_[0]); +} + +void CommandLine::SetProgram(const FilePath& program) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + argv_[0] = StringType(TrimWhitespace(program.value(), TRIM_ALL)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + TrimWhitespaceASCII(program.value(), TRIM_ALL, &argv_[0]); +#else +#error Unsupported platform +#endif +} + +bool CommandLine::HasSwitch(StringPiece switch_string) const { + DCHECK_EQ(ToLowerASCII(switch_string), switch_string); + return Contains(switches_, switch_string); +} + +bool CommandLine::HasSwitch(const char switch_constant[]) const { + return HasSwitch(StringPiece(switch_constant)); +} + +std::string CommandLine::GetSwitchValueASCII(StringPiece switch_string) const { + StringType value = GetSwitchValueNative(switch_string); +#if BUILDFLAG(IS_WIN) + if (!IsStringASCII(base::AsStringPiece16(value))) { +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + if (!IsStringASCII(value)) { +#endif + DLOG(WARNING) << "Value of switch (" << switch_string << ") must be ASCII."; + return std::string(); + } +#if BUILDFLAG(IS_WIN) + return WideToUTF8(value); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return value; +#endif +} + +FilePath CommandLine::GetSwitchValuePath(StringPiece switch_string) const { + return FilePath(GetSwitchValueNative(switch_string)); +} + +CommandLine::StringType CommandLine::GetSwitchValueNative( + StringPiece switch_string) const { + DCHECK_EQ(ToLowerASCII(switch_string), switch_string); + auto result = switches_.find(switch_string); + return result == switches_.end() ? StringType() : result->second; +} + +void CommandLine::AppendSwitch(StringPiece switch_string) { + AppendSwitchNative(switch_string, StringType()); +} + +void CommandLine::AppendSwitchPath(StringPiece switch_string, + const FilePath& path) { + AppendSwitchNative(switch_string, path.value()); +} + +void CommandLine::AppendSwitchNative(StringPiece switch_string, + CommandLine::StringPieceType value) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + const std::string switch_key = ToLowerASCII(switch_string); + StringType combined_switch_string(UTF8ToWide(switch_key)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + StringPiece switch_key = switch_string; + StringType combined_switch_string(switch_key); +#endif + size_t prefix_length = GetSwitchPrefixLength(combined_switch_string); + auto key = switch_key.substr(prefix_length); + if (g_duplicate_switch_handler) { + g_duplicate_switch_handler->ResolveDuplicate(key, value, + switches_[std::string(key)]); + } else { + switches_[std::string(key)] = StringType(value); + } + + // Preserve existing switch prefixes in |argv_|; only append one if necessary. + if (prefix_length == 0) { + combined_switch_string.insert(0, kSwitchPrefixes[0].data(), + kSwitchPrefixes[0].size()); + } + if (!value.empty()) + base::StrAppend(&combined_switch_string, {kSwitchValueSeparator, value}); + // Append the switch and update the switches/arguments divider |begin_args_|. + argv_.insert(argv_.begin() + begin_args_, combined_switch_string); + begin_args_ = (CheckedNumeric(begin_args_) + 1).ValueOrDie(); +} + +void CommandLine::AppendSwitchASCII(StringPiece switch_string, + StringPiece value_string) { +#if BUILDFLAG(IS_WIN) + AppendSwitchNative(switch_string, UTF8ToWide(value_string)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendSwitchNative(switch_string, value_string); +#else +#error Unsupported platform +#endif +} + +void CommandLine::RemoveSwitch(base::StringPiece switch_key_without_prefix) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + StringType switch_key_native = UTF8ToWide(switch_key_without_prefix); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + StringType switch_key_native(switch_key_without_prefix); +#endif + + DCHECK_EQ(ToLowerASCII(switch_key_without_prefix), switch_key_without_prefix); + DCHECK_EQ(0u, GetSwitchPrefixLength(switch_key_native)); + auto it = switches_.find(switch_key_without_prefix); + if (it == switches_.end()) + return; + switches_.erase(it); + // Also erase from the switches section of |argv_| and update |begin_args_| + // accordingly. + // Switches in |argv_| have indices [1, begin_args_). + auto argv_switches_begin = argv_.begin() + 1; + auto argv_switches_end = argv_.begin() + begin_args_; + DCHECK(argv_switches_begin <= argv_switches_end); + DCHECK(argv_switches_end <= argv_.end()); + auto expell = std::remove_if(argv_switches_begin, argv_switches_end, + [&switch_key_native](const StringType& arg) { + return IsSwitchWithKey(arg, switch_key_native); + }); + if (expell == argv_switches_end) { + NOTREACHED(); + return; + } + begin_args_ -= argv_switches_end - expell; + argv_.erase(expell, argv_switches_end); +} + +void CommandLine::CopySwitchesFrom(const CommandLine& source, + span switches) { + for (const char* entry : switches) { + if (source.HasSwitch(entry)) { + AppendSwitchNative(entry, source.GetSwitchValueNative(entry)); + } + } +} + +CommandLine::StringVector CommandLine::GetArgs() const { + // Gather all arguments after the last switch (may include kSwitchTerminator). + StringVector args(argv_.begin() + begin_args_, argv_.end()); + // Erase only the first kSwitchTerminator (maybe "--" is a legitimate page?) + auto switch_terminator = ranges::find(args, kSwitchTerminator); + if (switch_terminator != args.end()) + args.erase(switch_terminator); + return args; +} + +void CommandLine::AppendArg(StringPiece value) { +#if BUILDFLAG(IS_WIN) + DCHECK(IsStringUTF8(value)); + AppendArgNative(UTF8ToWide(value)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendArgNative(value); +#else +#error Unsupported platform +#endif +} + +void CommandLine::AppendArgPath(const FilePath& path) { + AppendArgNative(path.value()); +} + +void CommandLine::AppendArgNative(StringPieceType value) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif + argv_.push_back(StringType(value)); +} + +void CommandLine::AppendArguments(const CommandLine& other, + bool include_program) { + if (include_program) + SetProgram(other.GetProgram()); + AppendSwitchesAndArguments(other.argv()); +} + +void CommandLine::PrependWrapper(StringPieceType wrapper) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif + if (wrapper.empty()) + return; + // Split the wrapper command based on whitespace (with quoting). + // StringPieceType does not currently work directly with StringTokenizerT. + using CommandLineTokenizer = + StringTokenizerT; + StringType wrapper_string(wrapper); + CommandLineTokenizer tokenizer(wrapper_string, FILE_PATH_LITERAL(" ")); + tokenizer.set_quote_chars(FILE_PATH_LITERAL("'\"")); + std::vector wrapper_argv; + while (tokenizer.GetNext()) + wrapper_argv.emplace_back(tokenizer.token()); + + // Prepend the wrapper and update the switches/arguments |begin_args_|. + argv_.insert(argv_.begin(), wrapper_argv.begin(), wrapper_argv.end()); + begin_args_ += wrapper_argv.size(); +} + +#if BUILDFLAG(IS_WIN) +void CommandLine::ParseFromString(StringPieceType command_line) { + command_line = TrimWhitespace(command_line, TRIM_ALL); + if (command_line.empty()) + return; + raw_command_line_string_ = command_line; + + int num_args = 0; + wchar_t** args = NULL; + // When calling CommandLineToArgvW, use the apiset if available. + // Doing so will bypass loading shell32.dll on Windows. + HMODULE downlevel_shell32_dll = + ::LoadLibraryEx(L"api-ms-win-downlevel-shell32-l1-1-0.dll", nullptr, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (downlevel_shell32_dll) { + auto command_line_to_argv_w_proc = + reinterpret_cast( + ::GetProcAddress(downlevel_shell32_dll, "CommandLineToArgvW")); + if (command_line_to_argv_w_proc) + args = command_line_to_argv_w_proc(command_line.data(), &num_args); + } else { + // Since the apiset is not available, allow the delayload of shell32.dll + // to take place. + args = ::CommandLineToArgvW(command_line.data(), &num_args); + } + + DPLOG_IF(FATAL, !args) << "CommandLineToArgvW failed on command line: " + << command_line; + StringVector argv(args, args + num_args); + InitFromArgv(argv); + raw_command_line_string_ = StringPieceType(); + LocalFree(args); + + if (downlevel_shell32_dll) + ::FreeLibrary(downlevel_shell32_dll); +} + +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::AppendSwitchesAndArguments( + const CommandLine::StringVector& argv) { + bool parse_switches = true; +#if BUILDFLAG(IS_WIN) + const bool is_parsed_from_string = !raw_command_line_string_.empty(); +#endif + for (size_t i = 1; i < argv.size(); ++i) { + CommandLine::StringType arg = argv[i]; +#if BUILDFLAG(IS_WIN) + arg = CommandLine::StringType(TrimWhitespace(arg, TRIM_ALL)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + TrimWhitespaceASCII(arg, TRIM_ALL, &arg); +#endif + + CommandLine::StringType switch_string; + CommandLine::StringType switch_value; + parse_switches &= (arg != kSwitchTerminator); + if (parse_switches && IsSwitch(arg, &switch_string, &switch_value)) { +#if BUILDFLAG(IS_WIN) + if (is_parsed_from_string && + IsSwitchWithKey(switch_string, kSingleArgument)) { + ParseAsSingleArgument(switch_string); + return; + } + AppendSwitchNative(WideToUTF8(switch_string), switch_value); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendSwitchNative(switch_string, switch_value); +#else +#error Unsupported platform +#endif + } else { + AppendArgNative(arg); + } + } +} + +CommandLine::StringType CommandLine::GetArgumentsStringInternal( + bool allow_unsafe_insert_sequences) const { + StringType params; + // Append switches and arguments. + bool parse_switches = true; +#if BUILDFLAG(IS_WIN) + bool appended_single_argument_switch = false; +#endif + + for (size_t i = 1; i < argv_.size(); ++i) { + StringType arg = argv_[i]; + StringType switch_string; + StringType switch_value; + parse_switches &= arg != kSwitchTerminator; + if (i > 1) + params.append(FILE_PATH_LITERAL(" ")); + if (parse_switches && IsSwitch(arg, &switch_string, &switch_value)) { + params.append(switch_string); + if (!switch_value.empty()) { +#if BUILDFLAG(IS_WIN) + switch_value = QuoteForCommandLineToArgvWInternal( + switch_value, allow_unsafe_insert_sequences); +#endif + params.append(kSwitchValueSeparator + switch_value); + } + } else { +#if BUILDFLAG(IS_WIN) + if (has_single_argument_switch_) { + // Check that we don't have multiple arguments when + // `has_single_argument_switch_` is true. + DCHECK(!appended_single_argument_switch); + appended_single_argument_switch = true; + params.append(base::StrCat( + {kSwitchPrefixes[0], kSingleArgument, FILE_PATH_LITERAL(" ")})); + } else { + arg = QuoteForCommandLineToArgvWInternal(arg, + allow_unsafe_insert_sequences); + } +#endif + params.append(arg); + } + } + return params; +} + +CommandLine::StringType CommandLine::GetCommandLineString() const { + StringType string(argv_[0]); +#if BUILDFLAG(IS_WIN) + string = QuoteForCommandLineToArgvWInternal( + string, + /*allow_unsafe_insert_sequences=*/false); +#endif + StringType params(GetArgumentsString()); + if (!params.empty()) { + string.append(FILE_PATH_LITERAL(" ")); + string.append(params); + } + return string; +} + +#if BUILDFLAG(IS_WIN) +// static +std::wstring CommandLine::QuoteForCommandLineToArgvW(const std::wstring& arg) { + return QuoteForCommandLineToArgvWInternal( + arg, /*allow_unsafe_insert_sequences=*/false); +} + +// NOTE: this function is used to set Chrome's open command in the registry +// during update. Any change to the syntax must be compatible with the prior +// version (i.e., any new syntax must be understood by older browsers expecting +// the old syntax, and the new browser must still handle the old syntax), as +// old versions are likely to persist, e.g., immediately after background +// update, when parsing command lines for other channels, when uninstalling web +// applications installed using the old syntax, etc. +CommandLine::StringType CommandLine::GetCommandLineStringForShell() const { + DCHECK(GetArgs().empty()); + StringType command_line_string = GetCommandLineString(); + return command_line_string + FILE_PATH_LITERAL(" ") + + StringType(kSwitchPrefixes[0]) + kSingleArgument + + FILE_PATH_LITERAL(" %1"); +} + +CommandLine::StringType +CommandLine::GetCommandLineStringWithUnsafeInsertSequences() const { + StringType string(argv_[0]); + string = QuoteForCommandLineToArgvWInternal( + string, + /*allow_unsafe_insert_sequences=*/true); + StringType params( + GetArgumentsStringInternal(/*allow_unsafe_insert_sequences=*/true)); + if (!params.empty()) { + string.append(FILE_PATH_LITERAL(" ")); + string.append(params); + } + return string; +} +#endif // BUILDFLAG(IS_WIN) + +CommandLine::StringType CommandLine::GetArgumentsString() const { + return GetArgumentsStringInternal(/*allow_unsafe_insert_sequences=*/false); +} + +#if BUILDFLAG(IS_WIN) +void CommandLine::ParseAsSingleArgument( + const CommandLine::StringType& single_arg_switch) { + DCHECK(!raw_command_line_string_.empty()); + + // Remove any previously parsed arguments. + argv_.resize(static_cast(begin_args_)); + + // Locate "--single-argument" in the process's raw command line. Results are + // unpredictable if "--single-argument" appears as part of a previous + // argument or switch. + const size_t single_arg_switch_position = + raw_command_line_string_.find(single_arg_switch); + DCHECK_NE(single_arg_switch_position, StringType::npos); + + // Append the portion of the raw command line that starts one character past + // "--single-argument" as the one and only argument, or return if no + // argument is present. + const size_t arg_position = + single_arg_switch_position + single_arg_switch.length() + 1; + if (arg_position >= raw_command_line_string_.length()) + return; + has_single_argument_switch_ = true; + const StringPieceType arg = raw_command_line_string_.substr(arg_position); + if (!arg.empty()) { + AppendArgNative(arg); + } +} +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::DetachFromCurrentSequence() { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Detach(); +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/command_line.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/command_line.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/command_line.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,342 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This class works with command lines: building and parsing. +// Arguments with prefixes ('--', '-', and on Windows, '/') are switches. +// Switches will precede all other arguments without switch prefixes. +// Switches can optionally have values, delimited by '=', e.g., "-switch=value". +// If a switch is specified multiple times, only the last value is used. +// An argument of "--" will terminate switch parsing during initialization, +// interpreting subsequent tokens as non-switch arguments, regardless of prefix. + +// There is a singleton read-only CommandLine that represents the command line +// that the current process was started with. It must be initialized in main(). + +#ifndef BASE_COMMAND_LINE_H_ +#define BASE_COMMAND_LINE_H_ + +#include +#include +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/debug/debugging_buildflags.h" +#include "base/strings/string_piece.h" +#include "build/build_config.h" + +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) +#include "base/sequence_checker.h" +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + +namespace base { + +class DuplicateSwitchHandler; +class FilePath; + +class BASE_EXPORT CommandLine { + public: +#if BUILDFLAG(IS_WIN) + // The native command line string type. + using StringType = std::wstring; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + using StringType = std::string; +#endif + + using CharType = StringType::value_type; + using StringPieceType = base::BasicStringPiece; + using StringVector = std::vector; + using SwitchMap = std::map>; + + // A constructor for CommandLines that only carry switches and arguments. + enum NoProgram { NO_PROGRAM }; + explicit CommandLine(NoProgram no_program); + + // Construct a new command line with |program| as argv[0]. + explicit CommandLine(const FilePath& program); + + // Construct a new command line from an argument list. + CommandLine(int argc, const CharType* const* argv); + explicit CommandLine(const StringVector& argv); + + // Allow the copy constructor. A common pattern is to copy of the current + // process's command line and then add some flags to it. For example: + // CommandLine cl(*CommandLine::ForCurrentProcess()); + // cl.AppendSwitch(...); + CommandLine(const CommandLine& other); + CommandLine& operator=(const CommandLine& other); + + ~CommandLine(); + +#if BUILDFLAG(IS_WIN) + // By default this class will treat command-line arguments beginning with + // slashes as switches on Windows, but not other platforms. + // + // If this behavior is inappropriate for your application, you can call this + // function BEFORE initializing the current process' global command line + // object and the behavior will be the same as Posix systems (only hyphens + // begin switches, everything else will be an arg). + static void set_slash_is_not_a_switch(); + + // Normally when the CommandLine singleton is initialized it gets the command + // line via the GetCommandLineW API and then uses the shell32 API + // CommandLineToArgvW to parse the command line and convert it back to + // argc and argv. Tests who don't want this dependency on shell32 and need + // to honor the arguments passed in should use this function. + static void InitUsingArgvForTesting(int argc, const char* const* argv); +#endif + + // Initialize the current process CommandLine singleton. On Windows, ignores + // its arguments (we instead parse GetCommandLineW() directly) because we + // don't trust the CRT's parsing of the command line, but it still must be + // called to set up the command line. Returns false if initialization has + // already occurred, and true otherwise. Only the caller receiving a 'true' + // return value should take responsibility for calling Reset. + static bool Init(int argc, const char* const* argv); + + // Destroys the current process CommandLine singleton. This is necessary if + // you want to reset the base library to its initial state (for example, in an + // outer library that needs to be able to terminate, and be re-initialized). + // If Init is called only once, as in main(), Reset() is not necessary. + // Do not call this in tests. Use base::test::ScopedCommandLine instead. + static void Reset(); + + // Get the singleton CommandLine representing the current process's + // command line. Note: returned value is mutable, but not thread safe; + // only mutate if you know what you're doing! + static CommandLine* ForCurrentProcess(); + + // Returns true if the CommandLine has been initialized for the given process. + static bool InitializedForCurrentProcess(); + +#if BUILDFLAG(IS_WIN) + static CommandLine FromString(StringPieceType command_line); +#endif + + // Initialize from an argv vector. + void InitFromArgv(int argc, const CharType* const* argv); + void InitFromArgv(const StringVector& argv); + + // Constructs and returns the represented command line string. + // CAUTION! This should be avoided on POSIX because quoting behavior is + // unclear. + // CAUTION! If writing a command line to the Windows registry, use + // GetCommandLineStringForShell() instead. + StringType GetCommandLineString() const; + +#if BUILDFLAG(IS_WIN) + // Quotes and escapes `arg` if necessary so that it will be interpreted as a + // single command-line parameter according to the following rules in line with + // `::CommandLineToArgvW` and C++ `main`: + // * Returns `arg` unchanged if `arg` does not include any characters that may + // need encoding, which is spaces, tabs, backslashes, and double-quotes. + // * Otherwise, double-quotes `arg` and in addition: + // * Escapes any double-quotes in `arg` with backslashes. + // * Escapes backslashes in `arg` if: + // * `arg` ends with backslashes , or + // * the backslashes end in a pre-existing double quote. + // + // https://learn.microsoft.com/en-us/search/?terms=CommandLineToArgvW and + // http://msdn.microsoft.com/en-us/library/17w5ykft.aspx#parsing-c-command-line-arguments. + static std::wstring QuoteForCommandLineToArgvW(const std::wstring& arg); + + // Returns the command-line string in the proper format for the Windows shell, + // ending with the argument placeholder "--single-argument %1". The single- + // argument switch prevents unexpected parsing of arguments from other + // software that cannot be trusted to escape double quotes when substituting + // into a placeholder (e.g., "%1" insert sequences populated by the Windows + // shell). + // NOTE: this must be used to generate the command-line string for the shell + // even if this command line was parsed from a string with the proper syntax, + // because the --single-argument switch is not preserved during parsing. + StringType GetCommandLineStringForShell() const; + + // Returns the represented command-line string. Allows the use of unsafe + // Windows insert sequences like "%1". Only use this method if + // GetCommandLineStringForShell() is not adequate AND the processor inserting + // the arguments is known to do so securely (i.e., is not the Windows shell). + // If in doubt, do not use. + StringType GetCommandLineStringWithUnsafeInsertSequences() const; +#endif + + // Constructs and returns the represented arguments string. + // CAUTION! This should be avoided on POSIX because quoting behavior is + // unclear. + StringType GetArgumentsString() const; + + // Returns the original command line string as a vector of strings. + const StringVector& argv() const { return argv_; } + + // Get and Set the program part of the command line string (the first item). + FilePath GetProgram() const; + void SetProgram(const FilePath& program); + + // Returns true if this command line contains the given switch. + // Switch names must be lowercase. + // The second override provides an optimized version to avoid inlining codegen + // at every callsite to find the length of the constant and construct a + // StringPiece. + bool HasSwitch(StringPiece switch_string) const; + bool HasSwitch(const char switch_constant[]) const; + + // Returns the value associated with the given switch. If the switch has no + // value or isn't present, this method returns the empty string. + // Switch names must be lowercase. + std::string GetSwitchValueASCII(StringPiece switch_string) const; + FilePath GetSwitchValuePath(StringPiece switch_string) const; + StringType GetSwitchValueNative(StringPiece switch_string) const; + + // Get a copy of all switches, along with their values. + const SwitchMap& GetSwitches() const { return switches_; } + + // Append a switch [with optional value] to the command line. + // Note: Switches will precede arguments regardless of appending order. + void AppendSwitch(StringPiece switch_string); + void AppendSwitchPath(StringPiece switch_string, const FilePath& path); + void AppendSwitchNative(StringPiece switch_string, StringPieceType value); + void AppendSwitchASCII(StringPiece switch_string, StringPiece value); + + // Removes the switch that matches |switch_key_without_prefix|, regardless of + // prefix and value. If no such switch is present, this has no effect. + void RemoveSwitch(const base::StringPiece switch_key_without_prefix); + + // Copies a set of switches (and any values) from another command line. + // Commonly used when launching a subprocess. + // If an entry in `switches` does not exist in `source`, then it is ignored. + void CopySwitchesFrom(const CommandLine& source, + span switches); + + // Get the remaining arguments to the command. + StringVector GetArgs() const; + + // Append an argument to the command line. Note that the argument is quoted + // properly such that it is interpreted as one argument to the target command. + // AppendArg is primarily for ASCII; non-ASCII input is interpreted as UTF-8. + // Note: Switches will precede arguments regardless of appending order. + void AppendArg(StringPiece value); + void AppendArgPath(const FilePath& value); + void AppendArgNative(StringPieceType value); + + // Append the switches and arguments from another command line to this one. + // If |include_program| is true, include |other|'s program as well. + void AppendArguments(const CommandLine& other, bool include_program); + + // Insert a command before the current command. + // Common for debuggers, like "gdb --args". + void PrependWrapper(StringPieceType wrapper); + +#if BUILDFLAG(IS_WIN) + // Initialize by parsing the given command line string. + // The program name is assumed to be the first item in the string. + void ParseFromString(StringPieceType command_line); + + // Returns true if the command line had the --single-argument switch, and + // thus likely came from a Windows shell registration. This is only set if the + // command line is parsed, and is not changed after it is parsed. + bool HasSingleArgumentSwitch() const { return has_single_argument_switch_; } +#endif + + // Detaches this object from the current sequence in preparation for a move to + // a different sequence. + void DetachFromCurrentSequence(); + + // Sets a delegate that's called when we encounter a duplicate switch + static void SetDuplicateSwitchHandler( + std::unique_ptr); + + private: +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + // A helper class that encapsulates a SEQUENCE_CHECKER but allows copy. + // Copying this class will detach the sequence checker from the owning object. + class InstanceBoundSequenceChecker { + public: + InstanceBoundSequenceChecker() = default; + + InstanceBoundSequenceChecker(const InstanceBoundSequenceChecker& other) {} + + InstanceBoundSequenceChecker& operator=( + const InstanceBoundSequenceChecker& other) { + return *this; + } + + // Disallow move. + InstanceBoundSequenceChecker(InstanceBoundSequenceChecker&&) = delete; + InstanceBoundSequenceChecker& operator=(InstanceBoundSequenceChecker&&) = + delete; + + void Detach() { DETACH_FROM_SEQUENCE(sequence_checker_); } + void Check() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } + + private: + SEQUENCE_CHECKER(sequence_checker_); + }; +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + + // Disallow default constructor; a program name must be explicitly specified. + CommandLine() = delete; + + // Append switches and arguments, keeping switches before arguments. + void AppendSwitchesAndArguments(const StringVector& argv); + + // Internal version of GetArgumentsString to support allowing unsafe insert + // sequences in rare cases (see + // GetCommandLineStringWithUnsafeInsertSequences). + StringType GetArgumentsStringInternal( + bool allow_unsafe_insert_sequences) const; + +#if BUILDFLAG(IS_WIN) + // Initializes by parsing |raw_command_line_string_|, treating everything + // after |single_arg_switch_string| + as the command + // line's single argument, and dropping any arguments previously parsed. The + // command line must contain |single_arg_switch_string|, and the argument, if + // present, must be separated from |single_arg_switch_string| by one + // character. + // NOTE: the single-argument switch is not preserved after parsing; + // GetCommandLineStringForShell() must be used to reproduce the original + // command-line string with single-argument switch. + void ParseAsSingleArgument(const StringType& single_arg_switch_string); + + // The string returned by GetCommandLineW(), to be parsed via + // ParseFromString(). Empty if this command line was not parsed from a string, + // or if ParseFromString() has finished executing. + StringPieceType raw_command_line_string_; + + // Set to true if the command line had --single-argument when initially + // parsed. It does not change if the command line mutates after initial + // parsing. + bool has_single_argument_switch_ = false; +#endif + + // The singleton CommandLine representing the current process's command line. + static CommandLine* current_process_commandline_; + + // The argv array: { program, [(--|-|/)switch[=value]]*, [--], [argument]* } + StringVector argv_; + + // Parsed-out switch keys and values. + SwitchMap switches_; + + // The index after the program and switches, any arguments start here. + ptrdiff_t begin_args_; + +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + InstanceBoundSequenceChecker sequence_checker_; +#endif +}; + +class BASE_EXPORT DuplicateSwitchHandler { + public: + // out_value contains the existing value of the switch + virtual void ResolveDuplicate(base::StringPiece key, + CommandLine::StringPieceType new_value, + CommandLine::StringType& out_value) = 0; + virtual ~DuplicateSwitchHandler() = default; +}; + +} // namespace base + +#endif // BASE_COMMAND_LINE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/compiler_specific.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,441 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_COMPILER_SPECIFIC_H_ +#define BASE_COMPILER_SPECIFIC_H_ + +#include "build/build_config.h" + +#if defined(COMPILER_MSVC) && !defined(__clang__) +#error "Only clang-cl is supported on Windows, see https://crbug.com/988071" +#endif + +// This is a wrapper around `__has_cpp_attribute`, which can be used to test for +// the presence of an attribute. In case the compiler does not support this +// macro it will simply evaluate to 0. +// +// References: +// https://wg21.link/sd6#testing-for-the-presence-of-an-attribute-__has_cpp_attribute +// https://wg21.link/cpp.cond#:__has_cpp_attribute +#if defined(__has_cpp_attribute) +#define HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +#define HAS_CPP_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_attribute`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_attribute) +#define HAS_ATTRIBUTE(x) __has_attribute(x) +#else +#define HAS_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_builtin`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_builtin) +#define HAS_BUILTIN(x) __has_builtin(x) +#else +#define HAS_BUILTIN(x) 0 +#endif + +// Annotate a function indicating it should not be inlined. +// Use like: +// NOINLINE void DoStuff() { ... } +#if defined(__clang__) && HAS_ATTRIBUTE(noinline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define NOINLINE [[clang::noinline]] +#elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(noinline) +#define NOINLINE __attribute__((noinline)) +#elif defined(COMPILER_MSVC) +#define NOINLINE __declspec(noinline) +#else +#define NOINLINE +#endif + +#if defined(__clang__) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define ALWAYS_INLINE [[clang::always_inline]] inline +#elif defined(COMPILER_GCC) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline) +#define ALWAYS_INLINE inline __attribute__((__always_inline__)) +#elif defined(COMPILER_MSVC) && defined(NDEBUG) +#define ALWAYS_INLINE __forceinline +#else +#define ALWAYS_INLINE inline +#endif + +// Annotate a function indicating it should never be tail called. Useful to make +// sure callers of the annotated function are never omitted from call-stacks. +// To provide the complementary behavior (prevent the annotated function from +// being omitted) look at NOINLINE. Also note that this doesn't prevent code +// folding of multiple identical caller functions into a single signature. To +// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h. +// Use like: +// NOT_TAIL_CALLED void FooBar(); +#if defined(__clang__) && HAS_ATTRIBUTE(not_tail_called) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define NOT_TAIL_CALLED [[clang::not_tail_called]] +#else +#define NOT_TAIL_CALLED +#endif + +// Specify memory alignment for structs, classes, etc. +// Use like: +// class ALIGNAS(16) MyClass { ... } +// ALIGNAS(16) int array[4]; +// +// In most places you can use the C++11 keyword "alignas", which is preferred. +// +// Historically, compilers had trouble mixing __attribute__((...)) syntax with +// alignas(...) syntax. However, at least Clang is very accepting nowadays. It +// may be that this macro can be removed entirely. +#if defined(__clang__) +#define ALIGNAS(byte_alignment) alignas(byte_alignment) +#elif defined(COMPILER_MSVC) +#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) +#elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(aligned) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#endif + +// In case the compiler supports it NO_UNIQUE_ADDRESS evaluates to the C++20 +// attribute [[no_unique_address]]. This allows annotating data members so that +// they need not have an address distinct from all other non-static data members +// of its class. +// +// References: +// * https://en.cppreference.com/w/cpp/language/attributes/no_unique_address +// * https://wg21.link/dcl.attr.nouniqueaddr +#if HAS_CPP_ATTRIBUTE(no_unique_address) +#define NO_UNIQUE_ADDRESS [[no_unique_address]] +#else +#define NO_UNIQUE_ADDRESS +#endif + +// Tells the compiler a function is using a printf-style format string. +// |format_param| is the one-based index of the format string parameter; +// |dots_param| is the one-based index of the "..." parameter. +// For v*printf functions (which take a va_list), pass 0 for dots_param. +// (This is undocumented but matches what the system C headers do.) +// For member functions, the implicit this parameter counts as index 1. +#if (defined(COMPILER_GCC) || defined(__clang__)) && HAS_ATTRIBUTE(format) +#define PRINTF_FORMAT(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#else +#define PRINTF_FORMAT(format_param, dots_param) +#endif + +// WPRINTF_FORMAT is the same, but for wide format strings. +// This doesn't appear to yet be implemented in any compiler. +// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 . +#define WPRINTF_FORMAT(format_param, dots_param) +// If available, it would look like: +// __attribute__((format(wprintf, format_param, dots_param))) + +// Sanitizers annotations. +#if HAS_ATTRIBUTE(no_sanitize) +#define NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#if !defined(NO_SANITIZE) +#define NO_SANITIZE(what) +#endif + +// MemorySanitizer annotations. +#if defined(MEMORY_SANITIZER) && !BUILDFLAG(IS_NACL) +#include + +// Mark a memory region fully initialized. +// Use this to annotate code that deliberately reads uninitialized data, for +// example a GC scavenging root set pointers from the stack. +#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size) + +// Check a memory region for initializedness, as if it was being used here. +// If any bits are uninitialized, crash with an MSan report. +// Use this to sanitize data which MSan won't be able to track, e.g. before +// passing data to another process via shared memory. +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \ + __msan_check_mem_is_initialized(p, size) +#else // MEMORY_SANITIZER +#define MSAN_UNPOISON(p, size) +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) +#endif // MEMORY_SANITIZER + +// DISABLE_CFI_PERF -- Disable Control Flow Integrity for perf reasons. +#if !defined(DISABLE_CFI_PERF) +#if defined(__clang__) && defined(OFFICIAL_BUILD) +#define DISABLE_CFI_PERF NO_SANITIZE("cfi") +#else +#define DISABLE_CFI_PERF +#endif +#endif + +// DISABLE_CFI_ICALL -- Disable Control Flow Integrity indirect call checks. +// Security Note: if you just need to allow calling of dlsym functions use +// DISABLE_CFI_DLSYM. +#if !defined(DISABLE_CFI_ICALL) +#if BUILDFLAG(IS_WIN) +// Windows also needs __declspec(guard(nocf)). +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") __declspec(guard(nocf)) +#else +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") +#endif +#endif +#if !defined(DISABLE_CFI_ICALL) +#define DISABLE_CFI_ICALL +#endif + +// DISABLE_CFI_DLSYM -- applies DISABLE_CFI_ICALL on platforms where dlsym +// functions must be called. Retains CFI checks on platforms where loaded +// modules participate in CFI (e.g. Windows). +#if !defined(DISABLE_CFI_DLSYM) +#if BUILDFLAG(IS_WIN) +// Windows modules register functions when loaded so can be checked by CFG. +#define DISABLE_CFI_DLSYM +#else +#define DISABLE_CFI_DLSYM DISABLE_CFI_ICALL +#endif +#endif +#if !defined(DISABLE_CFI_DLSYM) +#define DISABLE_CFI_DLSYM +#endif + +// Macro useful for writing cross-platform function pointers. +#if !defined(CDECL) +#if BUILDFLAG(IS_WIN) +#define CDECL __cdecl +#else // BUILDFLAG(IS_WIN) +#define CDECL +#endif // BUILDFLAG(IS_WIN) +#endif // !defined(CDECL) + +// Macro for hinting that an expression is likely to be false. +#if !defined(UNLIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define UNLIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(UNLIKELY) + +#if !defined(LIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define LIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(LIKELY) + +// Compiler feature-detection. +// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension +#if defined(__has_feature) +#define HAS_FEATURE(FEATURE) __has_feature(FEATURE) +#else +#define HAS_FEATURE(FEATURE) 0 +#endif + +#if defined(COMPILER_GCC) +#define PRETTY_FUNCTION __PRETTY_FUNCTION__ +#elif defined(COMPILER_MSVC) +#define PRETTY_FUNCTION __FUNCSIG__ +#else +// See https://en.cppreference.com/w/c/language/function_definition#func +#define PRETTY_FUNCTION __func__ +#endif + +#if !defined(CPU_ARM_NEON) +#if defined(__arm__) +#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \ + !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID) +#error Chromium does not support middle endian architecture +#endif +#if defined(__ARM_NEON__) +#define CPU_ARM_NEON 1 +#endif +#endif // defined(__arm__) +#endif // !defined(CPU_ARM_NEON) + +#if !defined(HAVE_MIPS_MSA_INTRINSICS) +#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) +#define HAVE_MIPS_MSA_INTRINSICS 1 +#endif +#endif + +#if defined(__clang__) && HAS_ATTRIBUTE(uninitialized) +// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for +// the specified variable. +// Library-wide alternative is +// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn +// file. +// +// See "init_stack_vars" in build/config/compiler/BUILD.gn and +// http://crbug.com/977230 +// "init_stack_vars" is enabled for non-official builds and we hope to enable it +// in official build in 2020 as well. The flag writes fixed pattern into +// uninitialized parts of all local variables. In rare cases such initialization +// is undesirable and attribute can be used: +// 1. Degraded performance +// In most cases compiler is able to remove additional stores. E.g. if memory is +// never accessed or properly initialized later. Preserved stores mostly will +// not affect program performance. However if compiler failed on some +// performance critical code we can get a visible regression in a benchmark. +// 2. memset, memcpy calls +// Compiler may replaces some memory writes with memset or memcpy calls. This is +// not -ftrivial-auto-var-init specific, but it can happen more likely with the +// flag. It can be a problem if code is not linked with C run-time library. +// +// Note: The flag is security risk mitigation feature. So in future the +// attribute uses should be avoided when possible. However to enable this +// mitigation on the most of the code we need to be less strict now and minimize +// number of exceptions later. So if in doubt feel free to use attribute, but +// please document the problem for someone who is going to cleanup it later. +// E.g. platform, bot, benchmark or test name in patch description or next to +// the attribute. +#define STACK_UNINITIALIZED [[clang::uninitialized]] +#else +#define STACK_UNINITIALIZED +#endif + +// Attribute "no_stack_protector" disables -fstack-protector for the specified +// function. +// +// "stack_protector" is enabled on most POSIX builds. The flag adds a canary +// to each stack frame, which on function return is checked against a reference +// canary. If the canaries do not match, it's likely that a stack buffer +// overflow has occurred, so immediately crashing will prevent exploitation in +// many cases. +// +// In some cases it's desirable to remove this, e.g. on hot functions, or if +// we have purposely changed the reference canary. +#if defined(COMPILER_GCC) || defined(__clang__) +#if HAS_ATTRIBUTE(__no_stack_protector__) +#define NO_STACK_PROTECTOR __attribute__((__no_stack_protector__)) +#else +#define NO_STACK_PROTECTOR __attribute__((__optimize__("-fno-stack-protector"))) +#endif +#else +#define NO_STACK_PROTECTOR +#endif + +// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints +// to Clang which control what code paths are statically analyzed, +// and is meant to be used in conjunction with assert & assert-like functions. +// The expression is passed straight through if analysis isn't enabled. +// +// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current +// codepath and any other branching codepaths that might follow. +#if defined(__clang_analyzer__) + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +inline constexpr bool AnalyzerAssumeTrue(bool arg) { + // AnalyzerNoReturn() is invoked and analysis is terminated if |arg| is + // false. + return arg || AnalyzerNoReturn(); +} + +#define ANALYZER_ASSUME_TRUE(arg) ::AnalyzerAssumeTrue(!!(arg)) +#define ANALYZER_SKIP_THIS_PATH() static_cast(::AnalyzerNoReturn()) + +#else // !defined(__clang_analyzer__) + +#define ANALYZER_ASSUME_TRUE(arg) (arg) +#define ANALYZER_SKIP_THIS_PATH() + +#endif // defined(__clang_analyzer__) + +// Use nomerge attribute to disable optimization of merging multiple same calls. +#if defined(__clang__) && HAS_ATTRIBUTE(nomerge) +#define NOMERGE [[clang::nomerge]] +#else +#define NOMERGE +#endif + +// Marks a type as being eligible for the "trivial" ABI despite having a +// non-trivial destructor or copy/move constructor. Such types can be relocated +// after construction by simply copying their memory, which makes them eligible +// to be passed in registers. The canonical example is std::unique_ptr. +// +// Use with caution; this has some subtle effects on constructor/destructor +// ordering and will be very incorrect if the type relies on its address +// remaining constant. When used as a function argument (by value), the value +// may be constructed in the caller's stack frame, passed in a register, and +// then used and destructed in the callee's stack frame. A similar thing can +// occur when values are returned. +// +// TRIVIAL_ABI is not needed for types which have a trivial destructor and +// copy/move constructors, such as base::TimeTicks and other POD. +// +// It is also not likely to be effective on types too large to be passed in one +// or two registers on typical target ABIs. +// +// See also: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html +#if defined(__clang__) && HAS_ATTRIBUTE(trivial_abi) +#define TRIVIAL_ABI [[clang::trivial_abi]] +#else +#define TRIVIAL_ABI +#endif + +// Marks a member function as reinitializing a moved-from variable. +// See also +// https://clang.llvm.org/extra/clang-tidy/checks/bugprone-use-after-move.html#reinitialization +#if defined(__clang__) && HAS_ATTRIBUTE(reinitializes) +#define REINITIALIZES_AFTER_MOVE [[clang::reinitializes]] +#else +#define REINITIALIZES_AFTER_MOVE +#endif + +// Requires constant initialization. See constinit in C++20. Allows to rely on a +// variable being initialized before execution, and not requiring a global +// constructor. +#if HAS_ATTRIBUTE(require_constant_initialization) +#define CONSTINIT __attribute__((require_constant_initialization)) +#endif +#if !defined(CONSTINIT) +#define CONSTINIT +#endif + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 13) +#define GSL_OWNER [[gsl::Owner]] +#define GSL_POINTER [[gsl::Pointer]] +#else +#define GSL_OWNER +#define GSL_POINTER +#endif + +// Adds the "logically_const" tag to a symbol's mangled name. The "Mutable +// Constants" check [1] detects instances of constants that aren't in .rodata, +// e.g. due to a missing `const`. Using this tag suppresses the check for this +// symbol, allowing it to live outside .rodata without a warning. +// +// [1]: +// https://crsrc.org/c/docs/speed/binary_size/android_binary_size_trybot.md#Mutable-Constants +#if defined(COMPILER_GCC) || defined(__clang__) +#define LOGICALLY_CONST [[gnu::abi_tag("logically_const")]] +#else +#define LOGICALLY_CONST +#endif + +// preserve_most clang's calling convention. Reduces register pressure for the +// caller and as such can be used for cold calls. Support for the +// "preserve_most" attribute is limited: +// - 32-bit platforms do not implement it, +// - component builds fail because _dl_runtime_resolve() clobbers registers, +// - there are crashes on arm64 on Windows (https://crbug.com/v8/14065), which +// can hopefully be fixed in the future. +// Additionally, the initial implementation in clang <= 16 overwrote the return +// register(s) in the epilogue of a preserve_most function, so we only use +// preserve_most in clang >= 17 (see https://reviews.llvm.org/D143425). +// See https://clang.llvm.org/docs/AttributeReference.html#preserve-most for +// more details. +#if defined(ARCH_CPU_64_BITS) && \ + !(BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)) && \ + !defined(COMPONENT_BUILD) && defined(__clang__) && \ + __clang_major__ >= 17 && HAS_ATTRIBUTE(preserve_most) +#define PRESERVE_MOST __attribute__((preserve_most)) +#else +#define PRESERVE_MOST +#endif + +#endif // BASE_COMPILER_SPECIFIC_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/adapters.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/adapters.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_ADAPTERS_H_ +#define BASE_CONTAINERS_ADAPTERS_H_ + +#include + +#include +#include + +#include "base/memory/raw_ptr_exclusion.h" + +namespace base { + +namespace internal { + +// Internal adapter class for implementing base::Reversed. +template +class ReversedAdapter { + public: + using Iterator = decltype(std::rbegin(std::declval())); + + explicit ReversedAdapter(T& t) : t_(t) {} + ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} + ReversedAdapter& operator=(const ReversedAdapter&) = delete; + + Iterator begin() const { return std::rbegin(t_); } + Iterator end() const { return std::rend(t_); } + + private: + // Not a raw_ref<...> for performance reasons: on-stack pointer. + // It is only used inside for loops. Ideally, the container being iterated + // over should be the one held via a raw_ref/raw_ptrs. + RAW_PTR_EXCLUSION T& t_; +}; + +} // namespace internal + +// Reversed returns a container adapter usable in a range-based "for" statement +// for iterating a reversible container in reverse order. +// +// Example: +// +// std::vector v = ...; +// for (int i : base::Reversed(v)) { +// // iterates through v from back to front +// } +template +internal::ReversedAdapter Reversed(T& t) { + return internal::ReversedAdapter(t); +} + +} // namespace base + +#endif // BASE_CONTAINERS_ADAPTERS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,299 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CHECKED_ITERATORS_H_ +#define BASE_CONTAINERS_CHECKED_ITERATORS_H_ + +#include +#include +#include + +#include "base/check_op.h" +#include "base/containers/util.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "build/build_config.h" + +namespace base { + +template +class CheckedContiguousIterator { + public: + using difference_type = std::ptrdiff_t; + using value_type = std::remove_cv_t; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; +#if defined(__cpp_lib_ranges) + using iterator_concept = std::contiguous_iterator_tag; +#endif + + // Required for converting constructor below. + template + friend class CheckedContiguousIterator; + + // Required for certain libc++ algorithm optimizations that are not available + // for NaCl. + template + friend struct std::pointer_traits; + + constexpr CheckedContiguousIterator() = default; + + constexpr CheckedContiguousIterator(T* start, const T* end) + : CheckedContiguousIterator(start, start, end) {} + + constexpr CheckedContiguousIterator(const T* start, T* current, const T* end) + : start_(start), current_(current), end_(end) { + CHECK_LE(start, current); + CHECK_LE(current, end); + } + + constexpr CheckedContiguousIterator(const CheckedContiguousIterator& other) = + default; + + // Converting constructor allowing conversions like CCI to CCI, + // but disallowing CCI to CCI or CCI to CCI, which + // are unsafe. Furthermore, this is the same condition as used by the + // converting constructors of std::span and std::unique_ptr. + // See https://wg21.link/n4042 for details. + template < + typename U, + std::enable_if_t::value>* = nullptr> + constexpr CheckedContiguousIterator(const CheckedContiguousIterator& other) + : start_(other.start_), current_(other.current_), end_(other.end_) { + // We explicitly don't delegate to the 3-argument constructor here. Its + // CHECKs would be redundant, since we expect |other| to maintain its own + // invariant. However, DCHECKs never hurt anybody. Presumably. + DCHECK_LE(other.start_, other.current_); + DCHECK_LE(other.current_, other.end_); + } + + ~CheckedContiguousIterator() = default; + + constexpr CheckedContiguousIterator& operator=( + const CheckedContiguousIterator& other) = default; + + friend constexpr bool operator==(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ == rhs.current_; + } + + friend constexpr bool operator!=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ != rhs.current_; + } + + friend constexpr bool operator<(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ < rhs.current_; + } + + friend constexpr bool operator<=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ <= rhs.current_; + } + friend constexpr bool operator>(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ > rhs.current_; + } + + friend constexpr bool operator>=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ >= rhs.current_; + } + + constexpr CheckedContiguousIterator& operator++() { + CHECK_NE(current_, end_); + ++current_; + return *this; + } + + constexpr CheckedContiguousIterator operator++(int) { + CheckedContiguousIterator old = *this; + ++*this; + return old; + } + + constexpr CheckedContiguousIterator& operator--() { + CHECK_NE(current_, start_); + --current_; + return *this; + } + + constexpr CheckedContiguousIterator operator--(int) { + CheckedContiguousIterator old = *this; + --*this; + return old; + } + + constexpr CheckedContiguousIterator& operator+=(difference_type rhs) { + if (rhs > 0) { + CHECK_LE(rhs, end_ - current_); + } else { + CHECK_LE(-rhs, current_ - start_); + } + current_ += rhs; + return *this; + } + + constexpr CheckedContiguousIterator operator+(difference_type rhs) const { + CheckedContiguousIterator it = *this; + it += rhs; + return it; + } + + constexpr friend CheckedContiguousIterator operator+( + difference_type lhs, + const CheckedContiguousIterator& rhs) { + return rhs + lhs; + } + + constexpr CheckedContiguousIterator& operator-=(difference_type rhs) { + if (rhs < 0) { + CHECK_LE(-rhs, end_ - current_); + } else { + CHECK_LE(rhs, current_ - start_); + } + current_ -= rhs; + return *this; + } + + constexpr CheckedContiguousIterator operator-(difference_type rhs) const { + CheckedContiguousIterator it = *this; + it -= rhs; + return it; + } + + constexpr friend difference_type operator-( + const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ - rhs.current_; + } + + constexpr reference operator*() const { + CHECK_NE(current_, end_); + return *current_; + } + + constexpr pointer operator->() const { + CHECK_NE(current_, end_); + return current_; + } + + constexpr reference operator[](difference_type rhs) const { + CHECK_GE(rhs, 0); + CHECK_LT(rhs, end_ - current_); + return current_[rhs]; + } + + [[nodiscard]] static bool IsRangeMoveSafe( + const CheckedContiguousIterator& from_begin, + const CheckedContiguousIterator& from_end, + const CheckedContiguousIterator& to) { + if (from_end < from_begin) + return false; + const auto from_begin_uintptr = get_uintptr(from_begin.current_); + const auto from_end_uintptr = get_uintptr(from_end.current_); + const auto to_begin_uintptr = get_uintptr(to.current_); + const auto to_end_uintptr = + get_uintptr((to + std::distance(from_begin, from_end)).current_); + + return to_begin_uintptr >= from_end_uintptr || + to_end_uintptr <= from_begin_uintptr; + } + + private: + constexpr void CheckComparable(const CheckedContiguousIterator& other) const { + CHECK_EQ(start_, other.start_); + CHECK_EQ(end_, other.end_); + } + + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION const T* start_ = nullptr; + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION T* current_ = nullptr; + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION const T* end_ = nullptr; +}; + +template +using CheckedContiguousConstIterator = CheckedContiguousIterator; + +} // namespace base + +// Specialize both std::__is_cpp17_contiguous_iterator and std::pointer_traits +// for CCI in case we compile with libc++ outside of NaCl. The former is +// required to enable certain algorithm optimizations (e.g. std::copy can be a +// simple std::memmove under certain circumstances), and is a precursor to +// C++20's std::contiguous_iterator concept [1]. Once we actually use C++20 it +// will be enough to add `using iterator_concept = std::contiguous_iterator_tag` +// to the iterator class [2], and we can get rid of this non-standard +// specialization. +// +// The latter is required to obtain the underlying raw pointer without resulting +// in CHECK failures. The important bit is the `to_address(pointer)` overload, +// which is the standard blessed way to customize `std::to_address(pointer)` in +// C++20 [3]. +// +// [1] https://wg21.link/iterator.concept.contiguous +// [2] https://wg21.link/std.iterator.tags +// [3] https://wg21.link/pointer.traits.optmem + +#if defined(_LIBCPP_VERSION) + +// TODO(crbug.com/1284275): Remove when C++20 is on by default, as the use +// of `iterator_concept` above should suffice. +_LIBCPP_BEGIN_NAMESPACE_STD + +// TODO(crbug.com/1449299): https://reviews.llvm.org/D150801 renamed this from +// `__is_cpp17_contiguous_iterator` to `__libcpp_is_contiguous_iterator`. Clean +// up the old spelling after libc++ rolls. +template +struct __is_cpp17_contiguous_iterator; +template +struct __is_cpp17_contiguous_iterator<::base::CheckedContiguousIterator> + : true_type {}; + +template +struct __libcpp_is_contiguous_iterator; +template +struct __libcpp_is_contiguous_iterator<::base::CheckedContiguousIterator> + : true_type {}; + +_LIBCPP_END_NAMESPACE_STD + +#endif + +namespace std { + +template +struct pointer_traits<::base::CheckedContiguousIterator> { + using pointer = ::base::CheckedContiguousIterator; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::base::CheckedContiguousIterator; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(&r, &r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + return p.current_; + } +}; + +} // namespace std + +#endif // BASE_CONTAINERS_CHECKED_ITERATORS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,1130 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CIRCULAR_DEQUE_H_ +#define BASE_CONTAINERS_CIRCULAR_DEQUE_H_ + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/containers/vector_buffer.h" +#include "base/dcheck_is_on.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/ranges/algorithm.h" +#include "base/template_util.h" + +#if DCHECK_IS_ON() +#include +#endif + +// base::circular_deque is similar to std::deque. Unlike std::deque, the +// storage is provided in a flat circular buffer conceptually similar to a +// vector. The beginning and end will wrap around as necessary so that +// pushes and pops will be constant time as long as a capacity expansion is +// not required. +// +// The API should be identical to std::deque with the following differences: +// +// - ITERATORS ARE NOT STABLE. Mutating the container will invalidate all +// iterators. +// +// - Insertions may resize the vector and so are not constant time (std::deque +// guarantees constant time for insertions at the ends). +// +// - Container-wide comparisons are not implemented. If you want to compare +// two containers, use an algorithm so the expensive iteration is explicit. +// +// If you want a similar container with only a queue API, use base::queue in +// base/containers/queue.h. +// +// Constructors: +// circular_deque(); +// circular_deque(size_t count); +// circular_deque(size_t count, const T& value); +// circular_deque(InputIterator first, InputIterator last); +// circular_deque(const circular_deque&); +// circular_deque(circular_deque&&); +// circular_deque(std::initializer_list); +// +// Assignment functions: +// circular_deque& operator=(const circular_deque&); +// circular_deque& operator=(circular_deque&&); +// circular_deque& operator=(std::initializer_list); +// void assign(size_t count, const T& value); +// void assign(InputIterator first, InputIterator last); +// void assign(std::initializer_list value); +// +// Random accessors: +// T& at(size_t); +// const T& at(size_t) const; +// T& operator[](size_t); +// const T& operator[](size_t) const; +// +// End accessors: +// T& front(); +// const T& front() const; +// T& back(); +// const T& back() const; +// +// Iterator functions: +// iterator begin(); +// const_iterator begin() const; +// const_iterator cbegin() const; +// iterator end(); +// const_iterator end() const; +// const_iterator cend() const; +// reverse_iterator rbegin(); +// const_reverse_iterator rbegin() const; +// const_reverse_iterator crbegin() const; +// reverse_iterator rend(); +// const_reverse_iterator rend() const; +// const_reverse_iterator crend() const; +// +// Memory management: +// void reserve(size_t); // SEE IMPLEMENTATION FOR SOME GOTCHAS. +// size_t capacity() const; +// void shrink_to_fit(); +// +// Size management: +// void clear(); +// bool empty() const; +// size_t size() const; +// void resize(size_t); +// void resize(size_t count, const T& value); +// +// Positional insert and erase: +// void insert(const_iterator pos, size_type count, const T& value); +// void insert(const_iterator pos, +// InputIterator first, InputIterator last); +// iterator insert(const_iterator pos, const T& value); +// iterator insert(const_iterator pos, T&& value); +// iterator emplace(const_iterator pos, Args&&... args); +// iterator erase(const_iterator pos); +// iterator erase(const_iterator first, const_iterator last); +// +// End insert and erase: +// void push_front(const T&); +// void push_front(T&&); +// void push_back(const T&); +// void push_back(T&&); +// T& emplace_front(Args&&...); +// T& emplace_back(Args&&...); +// void pop_front(); +// void pop_back(); +// +// General: +// void swap(circular_deque&); + +namespace base { + +template +class circular_deque; + +namespace internal { + +// Start allocating nonempty buffers with this many entries. This is the +// external capacity so the internal buffer will be one larger (= 4) which is +// more even for the allocator. See the descriptions of internal vs. external +// capacity on the comment above the buffer_ variable below. +constexpr size_t kCircularBufferInitialCapacity = 3; + +template +class circular_deque_const_iterator { + public: + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = const T*; + using reference = const T&; + using iterator_category = std::random_access_iterator_tag; + + circular_deque_const_iterator() : parent_deque_(nullptr), index_(0) { +#if DCHECK_IS_ON() + created_generation_ = 0; +#endif // DCHECK_IS_ON() + } + + // Dereferencing. + const T& operator*() const { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + return parent_deque_->buffer_[index_]; + } + const T* operator->() const { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + return &parent_deque_->buffer_[index_]; + } + const value_type& operator[](difference_type i) const { return *(*this + i); } + + // Increment and decrement. + circular_deque_const_iterator& operator++() { + Increment(); + return *this; + } + circular_deque_const_iterator operator++(int) { + circular_deque_const_iterator ret = *this; + Increment(); + return ret; + } + circular_deque_const_iterator& operator--() { + Decrement(); + return *this; + } + circular_deque_const_iterator operator--(int) { + circular_deque_const_iterator ret = *this; + Decrement(); + return ret; + } + + // Random access mutation. + friend circular_deque_const_iterator operator+( + const circular_deque_const_iterator& iter, + difference_type offset) { + circular_deque_const_iterator ret = iter; + ret.Add(offset); + return ret; + } + circular_deque_const_iterator& operator+=(difference_type offset) { + Add(offset); + return *this; + } + friend circular_deque_const_iterator operator-( + const circular_deque_const_iterator& iter, + difference_type offset) { + circular_deque_const_iterator ret = iter; + ret.Add(-offset); + return ret; + } + circular_deque_const_iterator& operator-=(difference_type offset) { + Add(-offset); + return *this; + } + + friend std::ptrdiff_t operator-(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return static_cast(lhs.OffsetFromBegin() - + rhs.OffsetFromBegin()); + } + + // Comparisons. + friend bool operator==(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.index_ == rhs.index_; + } + friend bool operator!=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs == rhs); + } + friend bool operator<(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.OffsetFromBegin() < rhs.OffsetFromBegin(); + } + friend bool operator<=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs > rhs); + } + friend bool operator>(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.OffsetFromBegin() > rhs.OffsetFromBegin(); + } + friend bool operator>=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs < rhs); + } + + protected: + friend class circular_deque; + + circular_deque_const_iterator(const circular_deque* parent, size_t index) + : parent_deque_(parent), index_(index) { +#if DCHECK_IS_ON() + created_generation_ = parent->generation_; +#endif // DCHECK_IS_ON() + } + + // Returns the offset from the beginning index of the buffer to the current + // item. + size_t OffsetFromBegin() const { + if (index_ >= parent_deque_->begin_) + return index_ - parent_deque_->begin_; // On the same side as begin. + return parent_deque_->buffer_.capacity() - parent_deque_->begin_ + index_; + } + + // Most uses will be ++ and -- so use a simplified implementation. + void Increment() { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + index_++; + if (index_ == parent_deque_->buffer_.capacity()) + index_ = 0; + } + void Decrement() { + CheckUnstableUsage(); + parent_deque_->CheckValidIndexOrEnd(index_); + if (index_ == 0) + index_ = parent_deque_->buffer_.capacity() - 1; + else + index_--; + } + void Add(difference_type delta) { + CheckUnstableUsage(); +#if DCHECK_IS_ON() + if (delta <= 0) + parent_deque_->CheckValidIndexOrEnd(index_); + else + parent_deque_->CheckValidIndex(index_); +#endif + // It should be valid to add 0 to any iterator, even if the container is + // empty and the iterator points to end(). The modulo below will divide + // by 0 if the buffer capacity is empty, so it's important to check for + // this case explicitly. + if (delta == 0) + return; + + difference_type new_offset = OffsetFromBegin() + delta; + DCHECK(new_offset >= 0 && + new_offset <= static_cast(parent_deque_->size())); + index_ = (new_offset + parent_deque_->begin_) % + parent_deque_->buffer_.capacity(); + } + +#if DCHECK_IS_ON() + void CheckUnstableUsage() const { + DCHECK(parent_deque_); + // Since circular_deque doesn't guarantee stability, any attempt to + // dereference this iterator after a mutation (i.e. the generation doesn't + // match the original) in the container is illegal. + DCHECK(created_generation_ == parent_deque_->generation_) + << "circular_deque iterator dereferenced after mutation."; + } + void CheckComparable(const circular_deque_const_iterator& other) const { + DCHECK(parent_deque_ == other.parent_deque_); + // Since circular_deque doesn't guarantee stability, two iterators that + // are compared must have been generated without mutating the container. + // If this fires, the container was mutated between generating the two + // iterators being compared. + DCHECK(created_generation_ == other.created_generation_); + } +#else + inline void CheckUnstableUsage() const {} + inline void CheckComparable(const circular_deque_const_iterator&) const {} +#endif // DCHECK_IS_ON() + + // `parent_deque_` is not a raw_ptr<...> for performance reasons: Usually + // on-stack pointer, pointing back to the collection being iterated, owned by + // object that iterates over it. Additionally this is supported by the + // analysis of sampling profiler data and tab_search:top100:2020. + RAW_PTR_EXCLUSION const circular_deque* parent_deque_; + + size_t index_; + +#if DCHECK_IS_ON() + // The generation of the parent deque when this iterator was created. The + // container will update the generation for every modification so we can + // test if the container was modified by comparing them. + uint64_t created_generation_; +#endif // DCHECK_IS_ON() +}; + +template +class circular_deque_iterator : public circular_deque_const_iterator { + using base = circular_deque_const_iterator; + + public: + friend class circular_deque; + + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; + + // Expose the base class' constructor. + circular_deque_iterator() : circular_deque_const_iterator() {} + + // Dereferencing. + T& operator*() const { return const_cast(base::operator*()); } + T* operator->() const { return const_cast(base::operator->()); } + T& operator[](difference_type i) { + return const_cast(base::operator[](i)); + } + + // Random access mutation. + friend circular_deque_iterator operator+(const circular_deque_iterator& iter, + difference_type offset) { + circular_deque_iterator ret = iter; + ret.Add(offset); + return ret; + } + circular_deque_iterator& operator+=(difference_type offset) { + base::Add(offset); + return *this; + } + friend circular_deque_iterator operator-(const circular_deque_iterator& iter, + difference_type offset) { + circular_deque_iterator ret = iter; + ret.Add(-offset); + return ret; + } + circular_deque_iterator& operator-=(difference_type offset) { + base::Add(-offset); + return *this; + } + + // Increment and decrement. + circular_deque_iterator& operator++() { + base::Increment(); + return *this; + } + circular_deque_iterator operator++(int) { + circular_deque_iterator ret = *this; + base::Increment(); + return ret; + } + circular_deque_iterator& operator--() { + base::Decrement(); + return *this; + } + circular_deque_iterator operator--(int) { + circular_deque_iterator ret = *this; + base::Decrement(); + return ret; + } + + private: + circular_deque_iterator(const circular_deque* parent, size_t index) + : circular_deque_const_iterator(parent, index) {} +}; + +} // namespace internal + +template +class circular_deque { + private: + using VectorBuffer = internal::VectorBuffer; + + public: + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + + using iterator = internal::circular_deque_iterator; + using const_iterator = internal::circular_deque_const_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + // --------------------------------------------------------------------------- + // Constructor + + constexpr circular_deque() = default; + + // Constructs with |count| copies of |value| or default constructed version. + explicit circular_deque(size_type count) { resize(count); } + circular_deque(size_type count, const T& value) { resize(count, value); } + + // Range constructor. + template + circular_deque(InputIterator first, InputIterator last) { + assign(first, last); + } + + // Copy/move. + circular_deque(const circular_deque& other) : buffer_(other.size() + 1) { + assign(other.begin(), other.end()); + } + circular_deque(circular_deque&& other) noexcept + : buffer_(std::move(other.buffer_)), + begin_(other.begin_), + end_(other.end_) { + other.begin_ = 0; + other.end_ = 0; + } + + circular_deque(std::initializer_list init) { assign(init); } + + ~circular_deque() { DestructRange(begin_, end_); } + + // --------------------------------------------------------------------------- + // Assignments. + // + // All of these may invalidate iterators and references. + + circular_deque& operator=(const circular_deque& other) { + if (&other == this) + return *this; + + reserve(other.size()); + assign(other.begin(), other.end()); + return *this; + } + circular_deque& operator=(circular_deque&& other) noexcept { + if (&other == this) + return *this; + + // We're about to overwrite the buffer, so don't free it in clear to + // avoid doing it twice. + ClearRetainCapacity(); + buffer_ = std::move(other.buffer_); + begin_ = other.begin_; + end_ = other.end_; + + other.begin_ = 0; + other.end_ = 0; + + IncrementGeneration(); + return *this; + } + circular_deque& operator=(std::initializer_list ilist) { + reserve(ilist.size()); + assign(std::begin(ilist), std::end(ilist)); + return *this; + } + + void assign(size_type count, const value_type& value) { + ClearRetainCapacity(); + reserve(count); + for (size_t i = 0; i < count; i++) + emplace_back(value); + IncrementGeneration(); + } + + // This variant should be enabled only when InputIterator is an iterator. + template + typename std::enable_if<::base::internal::is_iterator::value, + void>::type + assign(InputIterator first, InputIterator last) { + // Possible future enhancement, dispatch on iterator tag type. For forward + // iterators we can use std::difference to preallocate the space required + // and only do one copy. + ClearRetainCapacity(); + for (; first != last; ++first) + emplace_back(*first); + IncrementGeneration(); + } + + void assign(std::initializer_list value) { + reserve(std::distance(value.begin(), value.end())); + assign(value.begin(), value.end()); + } + + // --------------------------------------------------------------------------- + // Accessors. + // + // Since this class assumes no exceptions, at() and operator[] are equivalent. + + const value_type& at(size_type i) const { + DCHECK(i < size()); + size_t right_size = buffer_.capacity() - begin_; + if (begin_ <= end_ || i < right_size) + return buffer_[begin_ + i]; + return buffer_[i - right_size]; + } + value_type& at(size_type i) { + return const_cast(std::as_const(*this).at(i)); + } + + value_type& operator[](size_type i) { + return const_cast(std::as_const(*this)[i]); + } + + const value_type& operator[](size_type i) const { return at(i); } + + value_type& front() { + DCHECK(!empty()); + return buffer_[begin_]; + } + const value_type& front() const { + DCHECK(!empty()); + return buffer_[begin_]; + } + + value_type& back() { + DCHECK(!empty()); + return *(--end()); + } + const value_type& back() const { + DCHECK(!empty()); + return *(--end()); + } + + // --------------------------------------------------------------------------- + // Iterators. + + iterator begin() { return iterator(this, begin_); } + const_iterator begin() const { return const_iterator(this, begin_); } + const_iterator cbegin() const { return const_iterator(this, begin_); } + + iterator end() { return iterator(this, end_); } + const_iterator end() const { return const_iterator(this, end_); } + const_iterator cend() const { return const_iterator(this, end_); } + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator crbegin() const { return rbegin(); } + + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crend() const { return rend(); } + + // --------------------------------------------------------------------------- + // Memory management. + + // IMPORTANT NOTE ON reserve(...): This class implements auto-shrinking of + // the buffer when elements are deleted and there is "too much" wasted space. + // So if you call reserve() with a large size in anticipation of pushing many + // elements, but pop an element before the queue is full, the capacity you + // reserved may be lost. + // + // As a result, it's only worthwhile to call reserve() when you're adding + // many things at once with no intermediate operations. + void reserve(size_type new_capacity) { + if (new_capacity > capacity()) + SetCapacityTo(new_capacity); + } + + size_type capacity() const { + // One item is wasted to indicate end(). + return buffer_.capacity() == 0 ? 0 : buffer_.capacity() - 1; + } + + void shrink_to_fit() { + if (empty()) { + // Optimize empty case to really delete everything if there was + // something. + if (buffer_.capacity()) + buffer_ = VectorBuffer(); + } else { + SetCapacityTo(size()); + } + } + + // --------------------------------------------------------------------------- + // Size management. + + // This will additionally reset the capacity() to 0. + void clear() { + // This can't resize(0) because that requires a default constructor to + // compile, which not all contained classes may implement. + ClearRetainCapacity(); + buffer_ = VectorBuffer(); + } + + bool empty() const { return begin_ == end_; } + + size_type size() const { + if (begin_ <= end_) + return end_ - begin_; + return buffer_.capacity() - begin_ + end_; + } + + // When reducing size, the elements are deleted from the end. When expanding + // size, elements are added to the end with |value| or the default + // constructed version. Even when using resize(count) to shrink, a default + // constructor is required for the code to compile, even though it will not + // be called. + // + // There are two versions rather than using a default value to avoid + // creating a temporary when shrinking (when it's not needed). Plus if + // the default constructor is desired when expanding usually just calling it + // for each element is faster than making a default-constructed temporary and + // copying it. + void resize(size_type count) { + // SEE BELOW VERSION if you change this. The code is mostly the same. + if (count > size()) { + // This could be slighly more efficient but expanding a queue with + // identical elements is unusual and the extra computations of emplacing + // one-by-one will typically be small relative to calling the constructor + // for every item. + ExpandCapacityIfNecessary(count - size()); + while (size() < count) + emplace_back(); + } else if (count < size()) { + size_t new_end = (begin_ + count) % buffer_.capacity(); + DestructRange(new_end, end_); + end_ = new_end; + + ShrinkCapacityIfNecessary(); + } + IncrementGeneration(); + } + void resize(size_type count, const value_type& value) { + // SEE ABOVE VERSION if you change this. The code is mostly the same. + if (count > size()) { + ExpandCapacityIfNecessary(count - size()); + while (size() < count) + emplace_back(value); + } else if (count < size()) { + size_t new_end = (begin_ + count) % buffer_.capacity(); + DestructRange(new_end, end_); + end_ = new_end; + + ShrinkCapacityIfNecessary(); + } + IncrementGeneration(); + } + + // --------------------------------------------------------------------------- + // Insert and erase. + // + // Insertion and deletion in the middle is O(n) and invalidates all existing + // iterators. + // + // The implementation of insert isn't optimized as much as it could be. If + // the insertion requires that the buffer be grown, it will first be grown + // and everything moved, and then the items will be inserted, potentially + // moving some items twice. This simplifies the implemntation substantially + // and means less generated templatized code. Since this is an uncommon + // operation for deques, and already relatively slow, it doesn't seem worth + // the benefit to optimize this. + + void insert(const_iterator pos, size_type count, const T& value) { + ValidateIterator(pos); + + // Optimize insert at the beginning. + if (pos == begin()) { + ExpandCapacityIfNecessary(count); + for (size_t i = 0; i < count; i++) + push_front(value); + return; + } + + iterator insert_cur(this, pos.index_); + iterator insert_end; + MakeRoomFor(count, &insert_cur, &insert_end); + while (insert_cur < insert_end) { + new (&buffer_[insert_cur.index_]) T(value); + ++insert_cur; + } + + IncrementGeneration(); + } + + // This enable_if keeps this call from getting confused with the (pos, count, + // value) version when value is an integer. + template + typename std::enable_if<::base::internal::is_iterator::value, + void>::type + insert(const_iterator pos, InputIterator first, InputIterator last) { + ValidateIterator(pos); + + const difference_type inserted_items_signed = std::distance(first, last); + if (inserted_items_signed == 0) + return; // Can divide by 0 when doing modulo below, so return early. + CHECK(inserted_items_signed > 0); + const size_type inserted_items = + static_cast(inserted_items_signed); + + // Make a hole to copy the items into. + iterator insert_cur; + iterator insert_end; + if (pos == begin()) { + // Optimize insert at the beginning, nothing needs to be shifted and the + // hole is the |inserted_items| block immediately before |begin_|. + ExpandCapacityIfNecessary(inserted_items); + insert_end = begin(); + begin_ = + (begin_ + buffer_.capacity() - inserted_items) % buffer_.capacity(); + insert_cur = begin(); + } else { + insert_cur = iterator(this, pos.index_); + MakeRoomFor(inserted_items, &insert_cur, &insert_end); + } + + // Copy the items. + while (insert_cur < insert_end) { + new (&buffer_[insert_cur.index_]) T(*first); + ++insert_cur; + ++first; + } + + IncrementGeneration(); + } + + // These all return an iterator to the inserted item. Existing iterators will + // be invalidated. + iterator insert(const_iterator pos, const T& value) { + return emplace(pos, value); + } + iterator insert(const_iterator pos, T&& value) { + return emplace(pos, std::move(value)); + } + template + iterator emplace(const_iterator pos, Args&&... args) { + ValidateIterator(pos); + + // Optimize insert at beginning which doesn't require shifting. + if (pos == cbegin()) { + emplace_front(std::forward(args)...); + return begin(); + } + + // Do this before we make the new iterators we return. + IncrementGeneration(); + + iterator insert_begin(this, pos.index_); + iterator insert_end; + MakeRoomFor(1, &insert_begin, &insert_end); + new (&buffer_[insert_begin.index_]) T(std::forward(args)...); + + return insert_begin; + } + + // Calling erase() won't automatically resize the buffer smaller like resize + // or the pop functions. Erase is slow and relatively uncommon, and for + // normal deque usage a pop will normally be done on a regular basis that + // will prevent excessive buffer usage over long periods of time. It's not + // worth having the extra code for every template instantiation of erase() + // to resize capacity downward to a new buffer. + iterator erase(const_iterator pos) { return erase(pos, pos + 1); } + iterator erase(const_iterator first, const_iterator last) { + ValidateIterator(first); + ValidateIterator(last); + + IncrementGeneration(); + + // First, call the destructor on the deleted items. + if (first.index_ == last.index_) { + // Nothing deleted. Need to return early to avoid falling through to + // moving items on top of themselves. + return iterator(this, first.index_); + } else if (first.index_ < last.index_) { + // Contiguous range. + buffer_.DestructRange(&buffer_[first.index_], &buffer_[last.index_]); + } else { + // Deleted range wraps around. + buffer_.DestructRange(&buffer_[first.index_], + &buffer_[buffer_.capacity()]); + buffer_.DestructRange(&buffer_[0], &buffer_[last.index_]); + } + + if (first.index_ == begin_) { + // This deletion is from the beginning. Nothing needs to be copied, only + // begin_ needs to be updated. + begin_ = last.index_; + return iterator(this, last.index_); + } + + // In an erase operation, the shifted items all move logically to the left, + // so move them from left-to-right. + iterator move_src(this, last.index_); + iterator move_src_end = end(); + iterator move_dest(this, first.index_); + for (; move_src < move_src_end; move_src++, move_dest++) { + buffer_.MoveRange(&buffer_[move_src.index_], + &buffer_[move_src.index_ + 1], + &buffer_[move_dest.index_]); + } + + end_ = move_dest.index_; + + // Since we did not reallocate and only changed things after the erase + // element(s), the input iterator's index points to the thing following the + // deletion. + return iterator(this, first.index_); + } + + // --------------------------------------------------------------------------- + // Begin/end operations. + + void push_front(const T& value) { emplace_front(value); } + void push_front(T&& value) { emplace_front(std::move(value)); } + + void push_back(const T& value) { emplace_back(value); } + void push_back(T&& value) { emplace_back(std::move(value)); } + + template + reference emplace_front(Args&&... args) { + ExpandCapacityIfNecessary(1); + if (begin_ == 0) + begin_ = buffer_.capacity() - 1; + else + begin_--; + IncrementGeneration(); + new (&buffer_[begin_]) T(std::forward(args)...); + return front(); + } + + template + reference emplace_back(Args&&... args) { + ExpandCapacityIfNecessary(1); + new (&buffer_[end_]) T(std::forward(args)...); + if (end_ == buffer_.capacity() - 1) + end_ = 0; + else + end_++; + IncrementGeneration(); + return back(); + } + + void pop_front() { + DCHECK(size()); + buffer_.DestructRange(&buffer_[begin_], &buffer_[begin_ + 1]); + begin_++; + if (begin_ == buffer_.capacity()) + begin_ = 0; + + ShrinkCapacityIfNecessary(); + + // Technically popping will not invalidate any iterators since the + // underlying buffer will be stable. But in the future we may want to add a + // feature that resizes the buffer smaller if there is too much wasted + // space. This ensures we can make such a change safely. + IncrementGeneration(); + } + void pop_back() { + DCHECK(size()); + if (end_ == 0) + end_ = buffer_.capacity() - 1; + else + end_--; + buffer_.DestructRange(&buffer_[end_], &buffer_[end_ + 1]); + + ShrinkCapacityIfNecessary(); + + // See pop_front comment about why this is here. + IncrementGeneration(); + } + + // --------------------------------------------------------------------------- + // General operations. + + void swap(circular_deque& other) { + std::swap(buffer_, other.buffer_); + std::swap(begin_, other.begin_); + std::swap(end_, other.end_); + IncrementGeneration(); + } + + friend void swap(circular_deque& lhs, circular_deque& rhs) { lhs.swap(rhs); } + + private: + friend internal::circular_deque_iterator; + friend internal::circular_deque_const_iterator; + + // Moves the items in the given circular buffer to the current one. The + // source is moved from so will become invalid. The destination buffer must + // have already been allocated with enough size. + static void MoveBuffer(VectorBuffer& from_buf, + size_t from_begin, + size_t from_end, + VectorBuffer* to_buf, + size_t* to_begin, + size_t* to_end) { + size_t from_capacity = from_buf.capacity(); + + *to_begin = 0; + if (from_begin < from_end) { + // Contiguous. + from_buf.MoveRange(&from_buf[from_begin], &from_buf[from_end], + to_buf->begin()); + *to_end = from_end - from_begin; + } else if (from_begin > from_end) { + // Discontiguous, copy the right side to the beginning of the new buffer. + from_buf.MoveRange(&from_buf[from_begin], &from_buf[from_capacity], + to_buf->begin()); + size_t right_size = from_capacity - from_begin; + // Append the left side. + from_buf.MoveRange(&from_buf[0], &from_buf[from_end], + &(*to_buf)[right_size]); + *to_end = right_size + from_end; + } else { + // No items. + *to_end = 0; + } + } + + // Expands the buffer size. This assumes the size is larger than the + // number of elements in the vector (it won't call delete on anything). + void SetCapacityTo(size_t new_capacity) { + // Use the capacity + 1 as the internal buffer size to differentiate + // empty and full (see definition of buffer_ below). + VectorBuffer new_buffer(new_capacity + 1); + MoveBuffer(buffer_, begin_, end_, &new_buffer, &begin_, &end_); + buffer_ = std::move(new_buffer); + } + void ExpandCapacityIfNecessary(size_t additional_elts) { + size_t min_new_capacity = size() + additional_elts; + if (capacity() >= min_new_capacity) + return; // Already enough room. + + min_new_capacity = + std::max(min_new_capacity, internal::kCircularBufferInitialCapacity); + + // std::vector always grows by at least 50%. WTF::Deque grows by at least + // 25%. We expect queue workloads to generally stay at a similar size and + // grow less than a vector might, so use 25%. + size_t new_capacity = + std::max(min_new_capacity, capacity() + capacity() / 4); + SetCapacityTo(new_capacity); + } + + void ShrinkCapacityIfNecessary() { + // Don't auto-shrink below this size. + if (capacity() <= internal::kCircularBufferInitialCapacity) + return; + + // Shrink when 100% of the size() is wasted. + size_t sz = size(); + size_t empty_spaces = capacity() - sz; + if (empty_spaces < sz) + return; + + // Leave 1/4 the size as free capacity, not going below the initial + // capacity. + size_t new_capacity = + std::max(internal::kCircularBufferInitialCapacity, sz + sz / 4); + if (new_capacity < capacity()) { + // Count extra item to convert to internal capacity. + SetCapacityTo(new_capacity); + } + } + + // Backend for clear() but does not resize the internal buffer. + void ClearRetainCapacity() { + // This can't resize(0) because that requires a default constructor to + // compile, which not all contained classes may implement. + DestructRange(begin_, end_); + begin_ = 0; + end_ = 0; + IncrementGeneration(); + } + + // Calls destructors for the given begin->end indices. The indices may wrap + // around. The buffer is not resized, and the begin_ and end_ members are + // not changed. + void DestructRange(size_t begin, size_t end) { + if (end == begin) { + return; + } else if (end > begin) { + buffer_.DestructRange(&buffer_[begin], &buffer_[end]); + } else { + buffer_.DestructRange(&buffer_[begin], &buffer_[buffer_.capacity()]); + buffer_.DestructRange(&buffer_[0], &buffer_[end]); + } + } + + // Makes room for |count| items starting at |*insert_begin|. Since iterators + // are not stable across buffer resizes, |*insert_begin| will be updated to + // point to the beginning of the newly opened position in the new array (it's + // in/out), and the end of the newly opened position (it's out-only). + void MakeRoomFor(size_t count, iterator* insert_begin, iterator* insert_end) { + if (count == 0) { + *insert_end = *insert_begin; + return; + } + + // The offset from the beginning will be stable across reallocations. + size_t begin_offset = insert_begin->OffsetFromBegin(); + ExpandCapacityIfNecessary(count); + + insert_begin->index_ = (begin_ + begin_offset) % buffer_.capacity(); + *insert_end = + iterator(this, (insert_begin->index_ + count) % buffer_.capacity()); + + // Update the new end and prepare the iterators for copying. + iterator src = end(); + end_ = (end_ + count) % buffer_.capacity(); + iterator dest = end(); + + // Move the elements. This will always involve shifting logically to the + // right, so move in a right-to-left order. + while (true) { + if (src == *insert_begin) + break; + --src; + --dest; + buffer_.MoveRange(&buffer_[src.index_], &buffer_[src.index_ + 1], + &buffer_[dest.index_]); + } + } + +#if DCHECK_IS_ON() + // Asserts the given index is dereferencable. The index is an index into the + // buffer, not an index used by operator[] or at() which will be offsets from + // begin. + void CheckValidIndex(size_t i) const { + if (begin_ <= end_) + DCHECK(i >= begin_ && i < end_); + else + DCHECK((i >= begin_ && i < buffer_.capacity()) || i < end_); + } + + // Asserts the given index is either dereferencable or points to end(). + void CheckValidIndexOrEnd(size_t i) const { + if (i != end_) + CheckValidIndex(i); + } + + void ValidateIterator(const const_iterator& i) const { + DCHECK(i.parent_deque_ == this); + i.CheckUnstableUsage(); + } + + // See generation_ below. + void IncrementGeneration() { generation_++; } +#else + // No-op versions of these functions for release builds. + void CheckValidIndex(size_t) const {} + void CheckValidIndexOrEnd(size_t) const {} + void ValidateIterator(const const_iterator& i) const {} + void IncrementGeneration() {} +#endif + + // Danger, the buffer_.capacity() is the "internal capacity" which is + // capacity() + 1 since there is an extra item to indicate the end. Otherwise + // being completely empty and completely full are indistinguishable (begin == + // end). We could add a separate flag to avoid it, but that adds significant + // extra complexity since every computation will have to check for it. Always + // keeping one extra unused element in the buffer makes iterator computations + // much simpler. + // + // Container internal code will want to use buffer_.capacity() for offset + // computations rather than capacity(). + VectorBuffer buffer_; + size_type begin_ = 0; + size_type end_ = 0; + +#if DCHECK_IS_ON() + // Incremented every time a modification is made that could affect iterator + // invalidations. + uint64_t generation_ = 0; +#endif +}; + +// Implementations of base::Erase[If] (see base/stl_util.h). +template +size_t Erase(circular_deque& container, const Value& value) { + auto it = ranges::remove(container, value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(circular_deque& container, Predicate pred) { + auto it = ranges::remove_if(container, pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CIRCULAR_DEQUE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/contains.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/contains.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,97 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CONTAINS_H_ +#define BASE_CONTAINERS_CONTAINS_H_ + +#include +#include + +#include "base/ranges/algorithm.h" +#include "base/ranges/ranges.h" + +namespace base { + +namespace internal { + +// Small helper to detect whether a given type has a nested `key_type` typedef. +// Used below to catch misuses of the API for associative containers. +template +struct HasKeyType : std::false_type {}; + +template +struct HasKeyType> : std::true_type {}; + +// Probe whether a `contains` member function exists and return the result of +// `container.contains(value)` if this is a valid expression. This is the +// highest priority option. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<2>) + -> decltype(container.contains(value)) { + return container.contains(value); +} + +// Probe whether a `find` member function exists and whether its return value +// can be compared with `container.end()`. Intended for STL style maps and sets +// that lack a `contains` member function. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<1>) + -> decltype(container.find(value) != container.end()) { + return container.find(value) != container.end(); +} + +// Probe whether a `find` member function exists and whether its return value +// can be compared with `Container::npos`. Intended for STL style strings that +// lack a `contains` member function. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<1>) + -> decltype(container.find(value) != Container::npos) { + return container.find(value) != Container::npos; +} + +// Generic fallback option, using a linear search over `container` to find +// `value`. Has the lowest priority. This will not compile for associative +// containers, as this likely is a performance bug. +template +constexpr bool ContainsImpl(const Container& container, + const Value& value, + priority_tag<0>) { + static_assert( + !HasKeyType::value, + "Error: About to perform linear search on an associative container. " + "Either use a more generic comparator (e.g. std::less<>) or, if a linear " + "search is desired, provide an explicit projection parameter."); + return ranges::find(container, value) != ranges::end(container); +} + +} // namespace internal + +// A general purpose utility to check whether `container` contains `value`. This +// will probe whether a `contains` or `find` member function on `container` +// exists, and fall back to a generic linear search over `container`. +template +constexpr bool Contains(const Container& container, const Value& value) { + return internal::ContainsImpl(container, value, internal::priority_tag<2>()); +} + +// Overload that allows to provide an additional projection invocable. This +// projection will be applied to every element in `container` before comparing +// it with `value`. This will always perform a linear search. +template +constexpr bool Contains(const Container& container, + const Value& value, + Proj proj) { + return ranges::find(container, value, std::move(proj)) != + ranges::end(container); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CONTAINS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,108 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ +#define BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ + +#include +#include +#include +#include +#include + +#include "base/containers/checked_iterators.h" + +namespace base { + +namespace internal { + +template +struct PointsToObject : std::true_type {}; +// std::iter_value_t is not defined for `T*` where T is not an object type. +template +struct PointsToObject : std::is_object {}; + +// A pointer is a contiguous iterator. +// Reference: https://wg21.link/iterator.traits#5 +template +struct IsPointer : std::is_pointer {}; + +template >> +struct IsStringIterImpl + : std::disjunction, + std::is_same> {}; + +// An iterator to std::basic_string is contiguous. +// Reference: https://wg21.link/basic.string.general#2 +// +// Note: Requires indirection via `IsStringIterImpl` to avoid triggering a +// `static_assert(is_trivial_v)` inside libc++'s std::basic_string. +template +struct IsStringIter + : std::conjunction>, IsStringIterImpl> { +}; + +// An iterator to std::array is contiguous. +// Reference: https://wg21.link/array.overview#1 +template , 1>> +struct IsArrayIter + : std::disjunction, + std::is_same> {}; + +// An iterator to a non-bool std::vector is contiguous. +// Reference: https://wg21.link/vector.overview#2 +template >> +struct IsVectorIter + : std::conjunction< + std::negation, bool>>, + std::disjunction, + std::is_same>> {}; + +// The result of passing a std::valarray to std::begin is a contiguous iterator. +// Note: Since all common standard library implementations (i.e. libc++, +// stdlibc++ and MSVC's STL) just use a pointer here, we perform a similar +// optimization. The corresponding unittest still ensures that this is working +// as intended. +// Reference: https://wg21.link/valarray.range#1 +template +struct IsValueArrayIter : std::is_pointer {}; + +// base's CheckedContiguousIterator is a contiguous iterator. +template > +struct IsCheckedContiguousIter + : std::disjunction< + std::is_same>, + std::is_same>> {}; + +// Check that the iterator points to an actual object, and is one of the +// iterator types mentioned above. +template ::value> +struct IsContiguousIteratorImpl : std::false_type {}; +template +struct IsContiguousIteratorImpl + : std::disjunction, + IsStringIter, + IsArrayIter, + IsVectorIter, + IsValueArrayIter, + IsCheckedContiguousIter> {}; + +} // namespace internal + +// IsContiguousIterator is a type trait that determines whether a given type is +// a contiguous iterator. It is similar to C++20's contiguous_iterator concept, +// but due to a lack of the corresponding contiguous_iterator_tag relies on +// explicitly instantiating the type with iterators that are supposed to be +// contiguous iterators. +// References: +// - https://wg21.link/iterator.concept.contiguous +// - https://wg21.link/std.iterator.tags#lib:contiguous_iterator_tag +// - https://wg21.link/n4284 +template +struct IsContiguousIterator + : internal::IsContiguousIteratorImpl> {}; + +} // namespace base + +#endif // BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_H_ +#define BASE_CONTAINERS_CXX20_ERASE_H_ + +#include "base/containers/cxx20_erase_deque.h" +#include "base/containers/cxx20_erase_forward_list.h" +#include "base/containers/cxx20_erase_list.h" +#include "base/containers/cxx20_erase_map.h" +#include "base/containers/cxx20_erase_set.h" +#include "base/containers/cxx20_erase_string.h" +#include "base/containers/cxx20_erase_unordered_map.h" +#include "base/containers/cxx20_erase_unordered_set.h" +#include "base/containers/cxx20_erase_vector.h" + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +// This header is provided for convenience, so callers to Erase/EraseIf can just +// include this in their .cc file without thinking about which Erase/EraseIf +// specialization header to include. For uncommon cases where Erase/EraseIf are +// used in .h files, please include the specialization header to avoid bloating +// the header. + +#endif // BASE_CONTAINERS_CXX20_ERASE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ +#define BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::deque& container, const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::deque& container, Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,42 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ +#define BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ + +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::forward_list& container, Predicate pred) { + // Note: std::forward_list does not have a size() API, thus we need to use the + // O(n) std::distance work-around. However, given that EraseIf is O(n) + // already, this should not make a big difference. + size_t old_size = std::distance(container.begin(), container.end()); + container.remove_if(pred); + return old_size - std::distance(container.begin(), container.end()); +} + +template +size_t Erase(std::forward_list& container, const Value& value) { + // Unlike std::forward_list::remove, this function template accepts + // heterogeneous types and does not force a conversion to the container's + // value type before invoking the == operator. + return EraseIf(container, [&](const T& cur) { return cur == value; }); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ +#define BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ + +// Internal portion of base/containers/cxx20_erase_*.h. Please include those +// headers instead of including this directly. + +namespace base { + +namespace internal { + +// Calls erase on iterators of matching elements and returns the number of +// removed elements. +template +size_t IterateAndEraseIf(Container& container, Predicate pred) { + size_t old_size = container.size(); + for (auto it = container.begin(), last = container.end(); it != last;) { + if (pred(*it)) + it = container.erase(it); + else + ++it; + } + return old_size - container.size(); +} + +} // namespace internal + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_LIST_H_ +#define BASE_CONTAINERS_CXX20_ERASE_LIST_H_ + +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::list& container, Predicate pred) { + size_t old_size = container.size(); + container.remove_if(pred); + return old_size - container.size(); +} + +template +size_t Erase(std::list& container, const Value& value) { + // Unlike std::list::remove, this function template accepts heterogeneous + // types and does not force a conversion to the container's value type before + // invoking the == operator. + return EraseIf(container, [&](const T& cur) { return cur == value; }); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_LIST_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_MAP_H_ +#define BASE_CONTAINERS_CXX20_ERASE_MAP_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::map& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf(std::multimap& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_MAP_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_SET_H_ +#define BASE_CONTAINERS_CXX20_ERASE_SET_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::set& container, Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf(std::multiset& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_SET_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_STRING_H_ +#define BASE_CONTAINERS_CXX20_ERASE_STRING_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::basic_string& container, + const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::basic_string& container, + Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_STRING_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,48 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ +#define BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::unordered_map& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf( + std::unordered_multimap& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,46 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ +#define BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::unordered_set& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf( + std::unordered_multiset& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ +#define BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::vector& container, const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = static_cast(std::distance(it, container.end())); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::vector& container, Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = static_cast(std::distance(it, container.end())); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/span.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/span.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,553 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_SPAN_H_ +#define BASE_CONTAINERS_SPAN_H_ + +#include +#include + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "base/containers/checked_iterators.h" +#include "base/containers/contiguous_iterator.h" +#include "base/cxx20_to_address.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/numerics/safe_math.h" + +namespace base { + +// [views.constants] +constexpr size_t dynamic_extent = std::numeric_limits::max(); + +template +class span; + +namespace internal { + +template +using size_constant = std::integral_constant; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +using Extent = ExtentImpl>; + +template +struct IsSpanImpl : std::false_type {}; + +template +struct IsSpanImpl> : std::true_type {}; + +template +using IsNotSpan = std::negation>>; + +template +struct IsStdArrayImpl : std::false_type {}; + +template +struct IsStdArrayImpl> : std::true_type {}; + +template +using IsNotStdArray = std::negation>>; + +template +using IsNotCArray = std::negation>>; + +template +using IsLegalDataConversion = std::is_convertible; + +template +using IteratorHasConvertibleReferenceType = + IsLegalDataConversion>, T>; + +template +using EnableIfCompatibleContiguousIterator = std::enable_if_t< + std::conjunction, + IteratorHasConvertibleReferenceType>::value>; + +template +using ContainerHasConvertibleData = IsLegalDataConversion< + std::remove_pointer_t()))>, + T>; + +template +using ContainerHasIntegralSize = + std::is_integral()))>; + +template +using EnableIfLegalSpanConversion = + std::enable_if_t<(ToExtent == dynamic_extent || ToExtent == FromExtent) && + IsLegalDataConversion::value>; + +// SFINAE check if Array can be converted to a span. +template +using EnableIfSpanCompatibleArray = + std::enable_if_t<(Extent == dynamic_extent || + Extent == internal::Extent::value) && + ContainerHasConvertibleData::value>; + +// SFINAE check if Container can be converted to a span. +template +using IsSpanCompatibleContainer = + std::conjunction, + IsNotStdArray, + IsNotCArray, + ContainerHasConvertibleData, + ContainerHasIntegralSize>; + +template +using EnableIfSpanCompatibleContainer = + std::enable_if_t::value>; + +template +using EnableIfSpanCompatibleContainerAndSpanIsDynamic = + std::enable_if_t::value && + Extent == dynamic_extent>; + +// A helper template for storing the size of a span. Spans with static extents +// don't require additional storage, since the extent itself is specified in the +// template parameter. +template +class ExtentStorage { + public: + constexpr explicit ExtentStorage(size_t size) noexcept {} + constexpr size_t size() const noexcept { return Extent; } +}; + +// Specialization of ExtentStorage for dynamic extents, which do require +// explicit storage for the size. +template <> +struct ExtentStorage { + constexpr explicit ExtentStorage(size_t size) noexcept : size_(size) {} + constexpr size_t size() const noexcept { return size_; } + + private: + size_t size_; +}; + +// must_not_be_dynamic_extent prevents |dynamic_extent| from being returned in a +// constexpr context. +template +constexpr size_t must_not_be_dynamic_extent() { + static_assert( + kExtent != dynamic_extent, + "EXTENT should only be used for containers with a static extent."); + return kExtent; +} + +} // namespace internal + +// A span is a value type that represents an array of elements of type T. Since +// it only consists of a pointer to memory with an associated size, it is very +// light-weight. It is cheap to construct, copy, move and use spans, so that +// users are encouraged to use it as a pass-by-value parameter. A span does not +// own the underlying memory, so care must be taken to ensure that a span does +// not outlive the backing store. +// +// span is somewhat analogous to StringPiece, but with arbitrary element types, +// allowing mutation if T is non-const. +// +// span is implicitly convertible from C++ arrays, as well as most [1] +// container-like types that provide a data() and size() method (such as +// std::vector). A mutable span can also be implicitly converted to an +// immutable span. +// +// Consider using a span for functions that take a data pointer and size +// parameter: it allows the function to still act on an array-like type, while +// allowing the caller code to be a bit more concise. +// +// For read-only data access pass a span: the caller can supply either +// a span or a span, while the callee will have a read-only view. +// For read-write access a mutable span is required. +// +// Without span: +// Read-Only: +// // std::string HexEncode(const uint8_t* data, size_t size); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer.data(), data_buffer.size()); +// +// Mutable: +// // ssize_t SafeSNPrintf(char* buf, size_t N, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, sizeof(str_buffer), "Pi ~= %lf", 3.14); +// +// With span: +// Read-Only: +// // std::string HexEncode(base::span data); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer); +// +// Mutable: +// // ssize_t SafeSNPrintf(base::span, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, "Pi ~= %lf", 3.14); +// +// Spans with "const" and pointers +// ------------------------------- +// +// Const and pointers can get confusing. Here are vectors of pointers and their +// corresponding spans: +// +// const std::vector => base::span +// std::vector => base::span +// const std::vector => base::span +// +// Differences from the C++20 draft +// -------------------------------- +// +// http://eel.is/c++draft/views contains the latest C++20 draft of std::span. +// Chromium tries to follow the draft as close as possible. Differences between +// the draft and the implementation are documented in subsections below. +// +// Differences from [span.objectrep]: +// - as_bytes() and as_writable_bytes() return spans of uint8_t instead of +// std::byte (std::byte is a C++17 feature) +// +// Differences from [span.cons]: +// - Constructing a static span (i.e. Extent != dynamic_extent) from a dynamic +// sized container (e.g. std::vector) requires an explicit conversion (in the +// C++20 draft this is simply UB) +// +// Furthermore, all constructors and methods are marked noexcept due to the lack +// of exceptions in Chromium. +// +// Due to the lack of class template argument deduction guides in C++14 +// appropriate make_span() utility functions are provided. + +// [span], class template span +template +class GSL_POINTER span : public internal::ExtentStorage { + private: + using ExtentStorage = internal::ExtentStorage; + + public: + using element_type = T; + using value_type = std::remove_cv_t; + using size_type = size_t; + using difference_type = ptrdiff_t; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using iterator = CheckedContiguousIterator; + // TODO(https://crbug.com/828324): Drop the const_iterator typedef once gMock + // supports containers without this nested type. + using const_iterator = iterator; + using reverse_iterator = std::reverse_iterator; + static constexpr size_t extent = Extent; + + // [span.cons], span constructors, copy, assignment, and destructor + constexpr span() noexcept : ExtentStorage(0), data_(nullptr) { + static_assert(Extent == dynamic_extent || Extent == 0, "Invalid Extent"); + } + + template > + constexpr span(It first, StrictNumeric count) noexcept + : ExtentStorage(count), + // The use of to_address() here is to handle the case where the iterator + // `first` is pointing to the container's `end()`. In that case we can + // not use the address returned from the iterator, or dereference it + // through the iterator's `operator*`, but we can store it. We must + // assume in this case that `count` is 0, since the iterator does not + // point to valid data. Future hardening of iterators may disallow + // pulling the address from `end()`, as demonstrated by asserts() in + // libstdc++: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93960. + // + // The span API dictates that the `data()` is accessible when size is 0, + // since the pointer may be valid, so we cannot prevent storing and + // giving out an invalid pointer here without breaking API compatibility + // and our unit tests. Thus protecting against this can likely only be + // successful from inside iterators themselves, where the context about + // the pointer is known. + // + // We can not protect here generally against an invalid iterator/count + // being passed in, since we have no context to determine if the + // iterator or count are valid. + data_(base::to_address(first)) { + CHECK(Extent == dynamic_extent || Extent == count); + } + + template < + typename It, + typename End, + typename = internal::EnableIfCompatibleContiguousIterator, + typename = std::enable_if_t::value>> + constexpr span(It begin, End end) noexcept + // Subtracting two iterators gives a ptrdiff_t, but the result should be + // non-negative: see CHECK below. + : span(begin, static_cast(end - begin)) { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(begin <= end); + } + + template < + size_t N, + typename = internal::EnableIfSpanCompatibleArray> + constexpr span(T (&array)[N]) noexcept : span(std::data(array), N) {} + + template < + typename U, + size_t N, + typename = + internal::EnableIfSpanCompatibleArray&, T, Extent>> + constexpr span(std::array& array) noexcept + : span(std::data(array), N) {} + + template &, T, Extent>> + constexpr span(const std::array& array) noexcept + : span(std::data(array), N) {} + + // Conversion from a container that has compatible std::data() and integral + // std::size(). + template < + typename Container, + typename = + internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic> + constexpr span(Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + template < + typename Container, + typename = internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic< + const Container&, + T, + Extent>> + constexpr span(const Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + constexpr span(const span& other) noexcept = default; + + // Conversions from spans of compatible types and extents: this allows a + // span to be seamlessly used as a span, but not the other way + // around. If extent is not dynamic, OtherExtent has to be equal to Extent. + template < + typename U, + size_t OtherExtent, + typename = + internal::EnableIfLegalSpanConversion> + constexpr span(const span& other) + : span(other.data(), other.size()) {} + + constexpr span& operator=(const span& other) noexcept = default; + ~span() noexcept = default; + + // [span.sub], span subviews + template + constexpr span first() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data(), Count}; + } + + template + constexpr span last() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data() + (size() - Count), Count}; + } + + template + constexpr span + subspan() const noexcept { + static_assert(Offset <= Extent, "Offset must not exceed Extent"); + static_assert(Count == dynamic_extent || Count <= Extent - Offset, + "Count must not exceed Extent - Offset"); + CHECK(Extent != dynamic_extent || Offset <= size()); + CHECK(Extent != dynamic_extent || Count == dynamic_extent || + Count <= size() - Offset); + return {data() + Offset, Count != dynamic_extent ? Count : size() - Offset}; + } + + constexpr span first(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data(), count}; + } + + constexpr span last(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data() + (size() - count), count}; + } + + constexpr span subspan(size_t offset, + size_t count = dynamic_extent) const + noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(offset <= size()); + CHECK(count == dynamic_extent || count <= size() - offset); + return {data() + offset, count != dynamic_extent ? count : size() - offset}; + } + + // [span.obs], span observers + constexpr size_t size() const noexcept { return ExtentStorage::size(); } + constexpr size_t size_bytes() const noexcept { return size() * sizeof(T); } + [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; } + + // [span.elem], span element access + constexpr T& operator[](size_t idx) const noexcept { + // Note: CHECK_LT is not constexpr, hence regular CHECK must be used. + CHECK(idx < size()); + return *(data() + idx); + } + + constexpr T& front() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *data(); + } + + constexpr T& back() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *(data() + size() - 1); + } + + constexpr T* data() const noexcept { return data_; } + + // [span.iter], span iterator support + constexpr iterator begin() const noexcept { + return iterator(data_, data_ + size()); + } + + constexpr iterator end() const noexcept { + return iterator(data_, data_ + size(), data_ + size()); + } + + constexpr reverse_iterator rbegin() const noexcept { + return reverse_iterator(end()); + } + + constexpr reverse_iterator rend() const noexcept { + return reverse_iterator(begin()); + } + + private: + // This field is not a raw_ptr<> because it was filtered by the rewriter + // for: #constexpr-ctor-field-initializer, #global-scope, #union + RAW_PTR_EXCLUSION T* data_; +}; + +// span::extent can not be declared inline prior to C++17, hence this +// definition is required. +template +constexpr size_t span::extent; + +// [span.objectrep], views of object representation +template +span +as_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +template ::value>> +span +as_writable_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +// Type-deducing helpers for constructing a span. +template +constexpr auto make_span(It it, StrictNumeric size) noexcept { + using T = std::remove_reference_t>; + return span(it, size); +} + +template >> +constexpr auto make_span(It it, End end) noexcept { + using T = std::remove_reference_t>; + return span(it, end); +} + +// make_span utility function that deduces both the span's value_type and extent +// from the passed in argument. +// +// Usage: auto span = base::make_span(...); +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + using Extent = internal::Extent; + return span(std::forward(container)); +} + +// make_span utility functions that allow callers to explicit specify the span's +// extent, the value_type is deduced automatically. This is useful when passing +// a dynamically sized container to a method expecting static spans, when the +// container is known to have the correct size. +// +// Note: This will CHECK that N indeed matches size(container). +// +// Usage: auto static_span = base::make_span(...); +template +constexpr auto make_span(It it, StrictNumeric size) noexcept { + using T = std::remove_reference_t>; + return span(it, size); +} + +template >> +constexpr auto make_span(It it, End end) noexcept { + using T = std::remove_reference_t>; + return span(it, end); +} + +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + return span(std::data(container), std::size(container)); +} + +} // namespace base + +// EXTENT returns the size of any type that can be converted to a |base::span| +// with definite extent, i.e. everything that is a contiguous storage of some +// sort with static size. Specifically, this works for std::array in a constexpr +// context. Note: +// * |std::size| should be preferred for plain arrays. +// * In run-time contexts, functions such as |std::array::size| should be +// preferred. +#define EXTENT(x) \ + ::base::internal::must_not_be_dynamic_extent() + +#endif // BASE_CONTAINERS_SPAN_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/stack.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/stack.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,23 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_STACK_H_ +#define BASE_CONTAINERS_STACK_H_ + +#include + +#include "base/containers/circular_deque.h" + +namespace base { + +// Provides a definition of base::stack that's like std::stack but uses a +// base::circular_deque instead of std::deque. Since std::stack is just a +// wrapper for an underlying type, we can just provide a typedef for it that +// defaults to the base circular_deque. +template > +using stack = std::stack; + +} // namespace base + +#endif // BASE_CONTAINERS_STACK_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/util.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/util.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,21 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_UTIL_H_ +#define BASE_CONTAINERS_UTIL_H_ + +#include + +namespace base { + +// TODO(crbug.com/817982): What we really need is for checked_math.h to be +// able to do checked arithmetic on pointers. +template +inline uintptr_t get_uintptr(const T* t) { + return reinterpret_cast(t); +} + +} // namespace base + +#endif // BASE_CONTAINERS_UTIL_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,193 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_VECTOR_BUFFER_H_ +#define BASE_CONTAINERS_VECTOR_BUFFER_H_ + +#include +#include + +#include +#include + +#include "base/check.h" +#include "base/check_op.h" +#include "base/containers/util.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/numerics/checked_math.h" + +namespace base { +namespace internal { + +// Internal implementation detail of base/containers. +// +// Implements a vector-like buffer that holds a certain capacity of T. Unlike +// std::vector, VectorBuffer never constructs or destructs its arguments, and +// can't change sizes. But it does implement templates to assist in efficient +// moving and destruction of those items manually. +// +// In particular, the destructor function does not iterate over the items if +// there is no destructor. Moves should be implemented as a memcpy/memmove for +// trivially copyable objects (POD) otherwise, it should be a std::move if +// possible, and as a last resort it falls back to a copy. This behavior is +// similar to std::vector. +// +// No special consideration is done for noexcept move constructors since +// we compile without exceptions. +// +// The current API does not support moving overlapping ranges. +template +class VectorBuffer { + public: + constexpr VectorBuffer() = default; + +#if defined(__clang__) && !defined(__native_client__) + // This constructor converts an uninitialized void* to a T* which triggers + // clang Control Flow Integrity. Since this is as-designed, disable. + __attribute__((no_sanitize("cfi-unrelated-cast", "vptr"))) +#endif + VectorBuffer(size_t count) + : buffer_(reinterpret_cast( + malloc(CheckMul(sizeof(T), count).ValueOrDie()))), + capacity_(count) { + } + VectorBuffer(VectorBuffer&& other) noexcept + : buffer_(other.buffer_), capacity_(other.capacity_) { + other.buffer_ = nullptr; + other.capacity_ = 0; + } + + VectorBuffer(const VectorBuffer&) = delete; + VectorBuffer& operator=(const VectorBuffer&) = delete; + + ~VectorBuffer() { free(buffer_); } + + VectorBuffer& operator=(VectorBuffer&& other) { + free(buffer_); + buffer_ = other.buffer_; + capacity_ = other.capacity_; + + other.buffer_ = nullptr; + other.capacity_ = 0; + return *this; + } + + size_t capacity() const { return capacity_; } + + T& operator[](size_t i) { + // TODO(crbug.com/817982): Some call sites (at least circular_deque.h) are + // calling this with `i == capacity_` as a way of getting `end()`. Therefore + // we have to allow this for now (`i <= capacity_`), until we fix those call + // sites to use real iterators. This comment applies here and to `const T& + // operator[]`, below. + CHECK_LE(i, capacity_); + return buffer_[i]; + } + + const T& operator[](size_t i) const { + CHECK_LE(i, capacity_); + return buffer_[i]; + } + + T* begin() { return buffer_; } + T* end() { return &buffer_[capacity_]; } + + // DestructRange ------------------------------------------------------------ + + // Trivially destructible objects need not have their destructors called. + template ::value, + int>::type = 0> + void DestructRange(T* begin, T* end) {} + + // Non-trivially destructible objects must have their destructors called + // individually. + template ::value, + int>::type = 0> + void DestructRange(T* begin, T* end) { + CHECK_LE(begin, end); + while (begin != end) { + begin->~T(); + begin++; + } + } + + // MoveRange ---------------------------------------------------------------- + // + // The destructor will be called (as necessary) for all moved types. The + // ranges must not overlap. + // + // The parameters and begin and end (one past the last) of the input buffer, + // and the address of the first element to copy to. There must be sufficient + // room in the destination for all items in the range [begin, end). + + // Trivially copyable types can use memcpy. trivially copyable implies + // that there is a trivial destructor as we don't have to call it. + template < + typename T2 = T, + typename std::enable_if, int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + + memcpy( + to, from_begin, + CheckSub(get_uintptr(from_end), get_uintptr(from_begin)).ValueOrDie()); + } + + // Not trivially copyable, but movable: call the move constructor and + // destruct the original. + template ::value && + !std::is_trivially_copyable_v, + int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + while (from_begin != from_end) { + new (to) T(std::move(*from_begin)); + from_begin->~T(); + from_begin++; + to++; + } + } + + // Not movable, not trivially copyable: call the copy constructor and + // destruct the original. + template ::value && + !std::is_trivially_copyable_v, + int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + while (from_begin != from_end) { + new (to) T(*from_begin); + from_begin->~T(); + from_begin++; + to++; + } + } + + private: + static bool RangesOverlap(const T* from_begin, + const T* from_end, + const T* to) { + const auto from_begin_uintptr = get_uintptr(from_begin); + const auto from_end_uintptr = get_uintptr(from_end); + const auto to_uintptr = get_uintptr(to); + return !( + to >= from_end || + CheckAdd(to_uintptr, CheckSub(from_end_uintptr, from_begin_uintptr)) + .ValueOrDie() <= from_begin_uintptr); + } + + // `buffer_` is not a raw_ptr<...> for performance reasons (based on analysis + // of sampling profiler data and tab_search:top100:2020). + RAW_PTR_EXCLUSION T* buffer_ = nullptr; + size_t capacity_ = 0; +}; + +} // namespace internal +} // namespace base + +#endif // BASE_CONTAINERS_VECTOR_BUFFER_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cpu.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cpu.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,387 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/cpu.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "base/no_destructor.h" +#include "build/build_config.h" + +#if defined(ARCH_CPU_ARM_FAMILY) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) +#include +#include + +#include "base/files/file_util.h" +#include "base/numerics/checked_math.h" +#include "base/ranges/algorithm.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" + +// Temporary definitions until a new hwcap.h is pulled in everywhere. +// https://crbug.com/1265965 +#ifndef HWCAP2_MTE +#define HWCAP2_MTE (1 << 18) +#define HWCAP2_BTI (1 << 17) +#endif + +struct ProcCpuInfo { + std::string brand; + uint8_t implementer = 0; + uint32_t part_number = 0; +}; +#endif + +#if defined(ARCH_CPU_X86_FAMILY) +#if defined(COMPILER_MSVC) +#include +#include // For _xgetbv() +#endif +#endif + +namespace base { + +#if defined(ARCH_CPU_X86_FAMILY) +namespace internal { + +X86ModelInfo ComputeX86FamilyAndModel(const std::string& vendor, + int signature) { + X86ModelInfo results; + results.family = (signature >> 8) & 0xf; + results.model = (signature >> 4) & 0xf; + results.ext_family = 0; + results.ext_model = 0; + + // The "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 2A" + // specifies the Extended Model is defined only when the Base Family is + // 06h or 0Fh. + // The "AMD CPUID Specification" specifies that the Extended Model is + // defined only when Base Family is 0Fh. + // Both manuals define the display model as + // {ExtendedModel[3:0],BaseModel[3:0]} in that case. + if (results.family == 0xf || + (results.family == 0x6 && vendor == "GenuineIntel")) { + results.ext_model = (signature >> 16) & 0xf; + results.model += results.ext_model << 4; + } + // Both the "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 2A" + // and the "AMD CPUID Specification" specify that the Extended Family is + // defined only when the Base Family is 0Fh. + // Both manuals define the display family as {0000b,BaseFamily[3:0]} + + // ExtendedFamily[7:0] in that case. + if (results.family == 0xf) { + results.ext_family = (signature >> 20) & 0xff; + results.family += results.ext_family; + } + + return results; +} + +} // namespace internal +#endif // defined(ARCH_CPU_X86_FAMILY) + +CPU::CPU(bool require_branding) { + Initialize(require_branding); +} +CPU::CPU() : CPU(true) {} +CPU::CPU(CPU&&) = default; + +namespace { + +#if defined(ARCH_CPU_X86_FAMILY) +#if !defined(COMPILER_MSVC) + +#if defined(__pic__) && defined(__i386__) + +void __cpuid(int cpu_info[4], int info_type) { + __asm__ volatile( + "mov %%ebx, %%edi\n" + "cpuid\n" + "xchg %%edi, %%ebx\n" + : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), + "=d"(cpu_info[3]) + : "a"(info_type), "c"(0)); +} + +#else + +void __cpuid(int cpu_info[4], int info_type) { + __asm__ volatile("cpuid\n" + : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), + "=d"(cpu_info[3]) + : "a"(info_type), "c"(0)); +} + +#endif +#endif // !defined(COMPILER_MSVC) + +// xgetbv returns the value of an Intel Extended Control Register (XCR). +// Currently only XCR0 is defined by Intel so |xcr| should always be zero. +uint64_t xgetbv(uint32_t xcr) { +#if defined(COMPILER_MSVC) + return _xgetbv(xcr); +#else + uint32_t eax, edx; + + __asm__ volatile ( + "xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr)); + return (static_cast(edx) << 32) | eax; +#endif // defined(COMPILER_MSVC) +} + +#endif // ARCH_CPU_X86_FAMILY + +#if defined(ARCH_CPU_ARM_FAMILY) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) +StringPairs::const_iterator FindFirstProcCpuKey(const StringPairs& pairs, + StringPiece key) { + return ranges::find_if(pairs, [key](const StringPairs::value_type& pair) { + return TrimWhitespaceASCII(pair.first, base::TRIM_ALL) == key; + }); +} + +// Parses information about the ARM processor. Note that depending on the CPU +// package, processor configuration, and/or kernel version, this may only +// report information about the processor on which this thread is running. This +// can happen on heterogeneous-processor SoCs like Snapdragon 808, which has 4 +// Cortex-A53 and 2 Cortex-A57. Unfortunately there is not a universally +// reliable way to examine the CPU part information for all cores. +const ProcCpuInfo& ParseProcCpu() { + static const NoDestructor info([]() { + // This function finds the value from /proc/cpuinfo under the key "model + // name" or "Processor". "model name" is used in Linux 3.8 and later (3.7 + // and later for arm64) and is shown once per CPU. "Processor" is used in + // earler versions and is shown only once at the top of /proc/cpuinfo + // regardless of the number CPUs. + const char kModelNamePrefix[] = "model name"; + const char kProcessorPrefix[] = "Processor"; + + std::string cpuinfo; + ReadFileToString(FilePath("/proc/cpuinfo"), &cpuinfo); + DCHECK(!cpuinfo.empty()); + + ProcCpuInfo info; + + StringPairs pairs; + if (!SplitStringIntoKeyValuePairs(cpuinfo, ':', '\n', &pairs)) { + NOTREACHED(); + return info; + } + + auto model_name = FindFirstProcCpuKey(pairs, kModelNamePrefix); + if (model_name == pairs.end()) + model_name = FindFirstProcCpuKey(pairs, kProcessorPrefix); + if (model_name != pairs.end()) { + info.brand = + std::string(TrimWhitespaceASCII(model_name->second, TRIM_ALL)); + } + + auto implementer_string = FindFirstProcCpuKey(pairs, "CPU implementer"); + if (implementer_string != pairs.end()) { + // HexStringToUInt() handles the leading whitespace on the value. + uint32_t implementer; + HexStringToUInt(implementer_string->second, &implementer); + if (!CheckedNumeric(implementer) + .AssignIfValid(&info.implementer)) { + info.implementer = 0; + } + } + + auto part_number_string = FindFirstProcCpuKey(pairs, "CPU part"); + if (part_number_string != pairs.end()) + HexStringToUInt(part_number_string->second, &info.part_number); + + return info; + }()); + + return *info; +} +#endif // defined(ARCH_CPU_ARM_FAMILY) && (BUILDFLAG(IS_ANDROID) || + // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) + +} // namespace + +void CPU::Initialize(bool require_branding) { +#if defined(ARCH_CPU_X86_FAMILY) + int cpu_info[4] = {-1}; + // This array is used to temporarily hold the vendor name and then the brand + // name. Thus it has to be big enough for both use cases. There are + // static_asserts below for each of the use cases to make sure this array is + // big enough. + char cpu_string[sizeof(cpu_info) * 3 + 1]; + + // __cpuid with an InfoType argument of 0 returns the number of + // valid Ids in CPUInfo[0] and the CPU identification string in + // the other three array elements. The CPU identification string is + // not in linear order. The code below arranges the information + // in a human readable form. The human readable order is CPUInfo[1] | + // CPUInfo[3] | CPUInfo[2]. CPUInfo[2] and CPUInfo[3] are swapped + // before using memcpy() to copy these three array elements to |cpu_string|. + __cpuid(cpu_info, 0); + int num_ids = cpu_info[0]; + std::swap(cpu_info[2], cpu_info[3]); + static constexpr size_t kVendorNameSize = 3 * sizeof(cpu_info[1]); + static_assert(kVendorNameSize < std::size(cpu_string), + "cpu_string too small"); + memcpy(cpu_string, &cpu_info[1], kVendorNameSize); + cpu_string[kVendorNameSize] = '\0'; + cpu_vendor_ = cpu_string; + + // Interpret CPU feature information. + if (num_ids > 0) { + int cpu_info7[4] = {0}; + __cpuid(cpu_info, 1); + if (num_ids >= 7) { + __cpuid(cpu_info7, 7); + } + signature_ = cpu_info[0]; + stepping_ = cpu_info[0] & 0xf; + type_ = (cpu_info[0] >> 12) & 0x3; + internal::X86ModelInfo results = + internal::ComputeX86FamilyAndModel(cpu_vendor_, signature_); + family_ = results.family; + model_ = results.model; + ext_family_ = results.ext_family; + ext_model_ = results.ext_model; + has_mmx_ = (cpu_info[3] & 0x00800000) != 0; + has_sse_ = (cpu_info[3] & 0x02000000) != 0; + has_sse2_ = (cpu_info[3] & 0x04000000) != 0; + has_sse3_ = (cpu_info[2] & 0x00000001) != 0; + has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; + has_sse41_ = (cpu_info[2] & 0x00080000) != 0; + has_sse42_ = (cpu_info[2] & 0x00100000) != 0; + has_popcnt_ = (cpu_info[2] & 0x00800000) != 0; + + // "Hypervisor Present Bit: Bit 31 of ECX of CPUID leaf 0x1." + // See https://lwn.net/Articles/301888/ + // This is checking for any hypervisor. Hypervisors may choose not to + // announce themselves. Hypervisors trap CPUID and sometimes return + // different results to underlying hardware. + is_running_in_vm_ = (static_cast(cpu_info[2]) & 0x80000000) != 0; + + // AVX instructions will generate an illegal instruction exception unless + // a) they are supported by the CPU, + // b) XSAVE is supported by the CPU and + // c) XSAVE is enabled by the kernel. + // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled + // + // In addition, we have observed some crashes with the xgetbv instruction + // even after following Intel's example code. (See crbug.com/375968.) + // Because of that, we also test the XSAVE bit because its description in + // the CPUID documentation suggests that it signals xgetbv support. + has_avx_ = + (cpu_info[2] & 0x10000000) != 0 && + (cpu_info[2] & 0x04000000) != 0 /* XSAVE */ && + (cpu_info[2] & 0x08000000) != 0 /* OSXSAVE */ && + (xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */; + has_aesni_ = (cpu_info[2] & 0x02000000) != 0; + has_fma3_ = (cpu_info[2] & 0x00001000) != 0; + has_avx2_ = has_avx_ && (cpu_info7[1] & 0x00000020) != 0; + + has_pku_ = (cpu_info7[2] & 0x00000010) != 0; + } + + // Get the brand string of the cpu. + __cpuid(cpu_info, static_cast(0x80000000)); + const uint32_t max_parameter = static_cast(cpu_info[0]); + + static constexpr uint32_t kParameterStart = 0x80000002; + static constexpr uint32_t kParameterEnd = 0x80000004; + static constexpr uint32_t kParameterSize = + kParameterEnd - kParameterStart + 1; + static_assert(kParameterSize * sizeof(cpu_info) + 1 == std::size(cpu_string), + "cpu_string has wrong size"); + + if (max_parameter >= kParameterEnd) { + size_t i = 0; + for (uint32_t parameter = kParameterStart; parameter <= kParameterEnd; + ++parameter) { + __cpuid(cpu_info, static_cast(parameter)); + memcpy(&cpu_string[i], cpu_info, sizeof(cpu_info)); + i += sizeof(cpu_info); + } + cpu_string[i] = '\0'; + cpu_brand_ = cpu_string; + } + + static constexpr uint32_t kParameterContainingNonStopTimeStampCounter = + 0x80000007; + if (max_parameter >= kParameterContainingNonStopTimeStampCounter) { + __cpuid(cpu_info, + static_cast(kParameterContainingNonStopTimeStampCounter)); + has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0; + } + + if (!has_non_stop_time_stamp_counter_ && is_running_in_vm_) { + int cpu_info_hv[4] = {}; + __cpuid(cpu_info_hv, 0x40000000); + if (cpu_info_hv[1] == 0x7263694D && // Micr + cpu_info_hv[2] == 0x666F736F && // osof + cpu_info_hv[3] == 0x76482074) { // t Hv + // If CPUID says we have a variant TSC and a hypervisor has identified + // itself and the hypervisor says it is Microsoft Hyper-V, then treat + // TSC as invariant. + // + // Microsoft Hyper-V hypervisor reports variant TSC as there are some + // scenarios (eg. VM live migration) where the TSC is variant, but for + // our purposes we can treat it as invariant. + has_non_stop_time_stamp_counter_ = true; + } + } +#elif defined(ARCH_CPU_ARM_FAMILY) +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + if (require_branding) { + const ProcCpuInfo& info = ParseProcCpu(); + cpu_brand_ = info.brand; + implementer_ = info.implementer; + part_number_ = info.part_number; + } + +#if defined(ARCH_CPU_ARM64) + // Check for Armv8.5-A BTI/MTE support, exposed via HWCAP2 + unsigned long hwcap2 = getauxval(AT_HWCAP2); + has_mte_ = hwcap2 & HWCAP2_MTE; + has_bti_ = hwcap2 & HWCAP2_BTI; +#endif + +#elif BUILDFLAG(IS_WIN) + // Windows makes high-resolution thread timing information available in + // user-space. + has_non_stop_time_stamp_counter_ = true; +#endif +#endif +} + +#if defined(ARCH_CPU_X86_FAMILY) +CPU::IntelMicroArchitecture CPU::GetIntelMicroArchitecture() const { + if (has_avx2()) return AVX2; + if (has_fma3()) return FMA3; + if (has_avx()) return AVX; + if (has_sse42()) return SSE42; + if (has_sse41()) return SSE41; + if (has_ssse3()) return SSSE3; + if (has_sse3()) return SSE3; + if (has_sse2()) return SSE2; + if (has_sse()) return SSE; + return PENTIUM; +} +#endif + +const CPU& CPU::GetInstanceNoAllocation() { + static const base::NoDestructor cpu(CPU(false)); + + return *cpu; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cpu.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cpu.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cpu.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,159 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CPU_H_ +#define BASE_CPU_H_ + +#include +#include + +#include "base/base_export.h" +#include "build/build_config.h" + +namespace base { + +#if defined(ARCH_CPU_X86_FAMILY) +namespace internal { + +struct X86ModelInfo { + int family; + int model; + int ext_family; + int ext_model; +}; + +// Compute the CPU family and model based on the vendor and CPUID signature. +BASE_EXPORT X86ModelInfo ComputeX86FamilyAndModel(const std::string& vendor, + int signature); + +} // namespace internal +#endif // defined(ARCH_CPU_X86_FAMILY) + +// Query information about the processor. +class BASE_EXPORT CPU final { + public: + CPU(); + CPU(CPU&&); + CPU(const CPU&) = delete; + + // Get a preallocated instance of CPU. + // This can be used in very early application startup. The instance of CPU is + // created without branding, see CPU(bool requires_branding) for details and + // implications. + static const CPU& GetInstanceNoAllocation(); + + enum IntelMicroArchitecture { + PENTIUM = 0, + SSE = 1, + SSE2 = 2, + SSE3 = 3, + SSSE3 = 4, + SSE41 = 5, + SSE42 = 6, + AVX = 7, + AVX2 = 8, + FMA3 = 9, + MAX_INTEL_MICRO_ARCHITECTURE = 10 + }; + + // Accessors for CPU information. + const std::string& vendor_name() const { return cpu_vendor_; } + int signature() const { return signature_; } + int stepping() const { return stepping_; } + int model() const { return model_; } + int family() const { return family_; } + int type() const { return type_; } + int extended_model() const { return ext_model_; } + int extended_family() const { return ext_family_; } + bool has_mmx() const { return has_mmx_; } + bool has_sse() const { return has_sse_; } + bool has_sse2() const { return has_sse2_; } + bool has_sse3() const { return has_sse3_; } + bool has_ssse3() const { return has_ssse3_; } + bool has_sse41() const { return has_sse41_; } + bool has_sse42() const { return has_sse42_; } + bool has_popcnt() const { return has_popcnt_; } + bool has_avx() const { return has_avx_; } + bool has_fma3() const { return has_fma3_; } + bool has_avx2() const { return has_avx2_; } + bool has_aesni() const { return has_aesni_; } + bool has_non_stop_time_stamp_counter() const { + return has_non_stop_time_stamp_counter_; + } + bool is_running_in_vm() const { return is_running_in_vm_; } + +#if defined(ARCH_CPU_ARM_FAMILY) + // The cpuinfo values for ARM cores are from the MIDR_EL1 register, a + // bitfield whose format is described in the core-specific manuals. E.g., + // ARM Cortex-A57: + // https://developer.arm.com/documentation/ddi0488/h/system-control/aarch64-register-descriptions/main-id-register--el1. + uint8_t implementer() const { return implementer_; } + uint32_t part_number() const { return part_number_; } +#endif + + // Armv8.5-A extensions for control flow and memory safety. +#if defined(ARCH_CPU_ARM_FAMILY) + bool has_mte() const { return has_mte_; } + bool has_bti() const { return has_bti_; } +#else + constexpr bool has_mte() const { return false; } + constexpr bool has_bti() const { return false; } +#endif + +#if defined(ARCH_CPU_X86_FAMILY) + // Memory protection key support for user-mode pages + bool has_pku() const { return has_pku_; } +#else + constexpr bool has_pku() const { return false; } +#endif + +#if defined(ARCH_CPU_X86_FAMILY) + IntelMicroArchitecture GetIntelMicroArchitecture() const; +#endif + const std::string& cpu_brand() const { return cpu_brand_; } + + private: + // Query the processor for CPUID information. + void Initialize(bool requires_branding); + explicit CPU(bool requires_branding); + + int signature_ = 0; // raw form of type, family, model, and stepping + int type_ = 0; // process type + int family_ = 0; // family of the processor + int model_ = 0; // model of processor + int stepping_ = 0; // processor revision number + int ext_model_ = 0; + int ext_family_ = 0; +#if defined(ARCH_CPU_ARM_FAMILY) + uint32_t part_number_ = 0; // ARM MIDR part number + uint8_t implementer_ = 0; // ARM MIDR implementer identifier +#endif + bool has_mmx_ = false; + bool has_sse_ = false; + bool has_sse2_ = false; + bool has_sse3_ = false; + bool has_ssse3_ = false; + bool has_sse41_ = false; + bool has_sse42_ = false; + bool has_popcnt_ = false; + bool has_avx_ = false; + bool has_fma3_ = false; + bool has_avx2_ = false; + bool has_aesni_ = false; +#if defined(ARCH_CPU_ARM_FAMILY) + bool has_mte_ = false; // Armv8.5-A MTE (Memory Taggging Extension) + bool has_bti_ = false; // Armv8.5-A BTI (Branch Target Identification) +#endif +#if defined(ARCH_CPU_X86_FAMILY) + bool has_pku_ = false; +#endif + bool has_non_stop_time_stamp_counter_ = false; + bool is_running_in_vm_ = false; + std::string cpu_vendor_ = "unknown"; + std::string cpu_brand_; +}; + +} // namespace base + +#endif // BASE_CPU_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CXX20_IS_CONSTANT_EVALUATED_H_ +#define BASE_CXX20_IS_CONSTANT_EVALUATED_H_ + +#if defined(MOZ_ZUCCHINI) +#include "base/compiler_specific.h" +#endif // defined(MOZ_ZUCCHINI) + +namespace base { + +// Implementation of C++20's std::is_constant_evaluated. +// +// References: +// - https://en.cppreference.com/w/cpp/types/is_constant_evaluated +// - https://wg21.link/meta.const.eval +constexpr bool is_constant_evaluated() noexcept { +#if !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) + return __builtin_is_constant_evaluated(); +#else + return false; +#endif // !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) +} + +} // namespace base + +#endif // BASE_CXX20_IS_CONSTANT_EVALUATED_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CXX20_TO_ADDRESS_H_ +#define BASE_CXX20_TO_ADDRESS_H_ + +#include +#include + +namespace base { + +namespace { + +template +struct has_std_to_address : std::false_type {}; + +template +struct has_std_to_address< + Ptr, + std::void_t::to_address( + std::declval()))>> : std::true_type {}; + +} // namespace + +// Implementation of C++20's std::to_address. +// Note: This does consider specializations of pointer_traits<>::to_address, +// even though it's a C++20 member function, because CheckedContiguousIterator +// specializes pointer_traits<> with a to_address() member. +// +// Reference: https://wg21.link/pointer.conversion#lib:to_address +template +constexpr T* to_address(T* p) noexcept { + static_assert(!std::is_function::value, + "Error: T must not be a function type."); + return p; +} + +template +constexpr auto to_address(const Ptr& p) noexcept { + if constexpr (has_std_to_address::value) { + return std::pointer_traits::to_address(p); + } else { + return base::to_address(p.operator->()); + } +} + +} // namespace base + +#endif // BASE_CXX20_TO_ADDRESS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_DCHECK_IS_ON_H_ +#define BASE_DCHECK_IS_ON_H_ + +#include "base/debug/debugging_buildflags.h" + +#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) +#define DCHECK_IS_ON() false +#else +#define DCHECK_IS_ON() true +#endif + +#if BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON) +#define EXPENSIVE_DCHECKS_ARE_ON() true +#else +#define EXPENSIVE_DCHECKS_ARE_ON() false +#endif + +#endif // BASE_DCHECK_IS_ON_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,181 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/files/file_tracing.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/metrics/histogram.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/timer/elapsed_timer.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/trace_event/base_tracing.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#endif + +namespace base { + +File::Info::Info() = default; + +File::Info::~Info() = default; + +File::File() = default; + +#if !BUILDFLAG(IS_NACL) +File::File(const FilePath& path, uint32_t flags) : error_details_(FILE_OK) { + Initialize(path, flags); +} +#endif + +File::File(ScopedPlatformFile platform_file) + : File(std::move(platform_file), false) {} + +File::File(PlatformFile platform_file) : File(platform_file, false) {} + +File::File(ScopedPlatformFile platform_file, bool async) + : file_(std::move(platform_file)), error_details_(FILE_OK), async_(async) { +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + DCHECK_GE(file_.get(), -1); +#endif +} + +File::File(PlatformFile platform_file, bool async) + : file_(platform_file), + error_details_(FILE_OK), + async_(async) { +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + DCHECK_GE(platform_file, -1); +#endif +} + +File::File(Error error_details) : error_details_(error_details) {} + +File::File(File&& other) + : file_(other.TakePlatformFile()), + tracing_path_(other.tracing_path_), + error_details_(other.error_details()), + created_(other.created()), + async_(other.async_) {} + +File::~File() { + // Go through the AssertIOAllowed logic. + Close(); +} + +File& File::operator=(File&& other) { + Close(); + SetPlatformFile(other.TakePlatformFile()); + tracing_path_ = other.tracing_path_; + error_details_ = other.error_details(); + created_ = other.created(); + async_ = other.async_; + return *this; +} + +#if !BUILDFLAG(IS_NACL) +void File::Initialize(const FilePath& path, uint32_t flags) { + if (path.ReferencesParent()) { +#if BUILDFLAG(IS_WIN) + ::SetLastError(ERROR_ACCESS_DENIED); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + errno = EACCES; +#else +#error Unsupported platform +#endif + error_details_ = FILE_ERROR_ACCESS_DENIED; + return; + } + if (FileTracing::IsCategoryEnabled()) + tracing_path_ = path; + SCOPED_FILE_TRACE("Initialize"); + DoInitialize(path, flags); +} +#endif + +bool File::ReadAndCheck(int64_t offset, span data) { + int size = checked_cast(data.size()); + return Read(offset, reinterpret_cast(data.data()), size) == size; +} + +bool File::ReadAtCurrentPosAndCheck(span data) { + int size = checked_cast(data.size()); + return ReadAtCurrentPos(reinterpret_cast(data.data()), size) == size; +} + +bool File::WriteAndCheck(int64_t offset, span data) { + int size = checked_cast(data.size()); + return Write(offset, reinterpret_cast(data.data()), size) == + size; +} + +bool File::WriteAtCurrentPosAndCheck(span data) { + int size = checked_cast(data.size()); + return WriteAtCurrentPos(reinterpret_cast(data.data()), size) == + size; +} + +// static +std::string File::ErrorToString(Error error) { + switch (error) { + case FILE_OK: + return "FILE_OK"; + case FILE_ERROR_FAILED: + return "FILE_ERROR_FAILED"; + case FILE_ERROR_IN_USE: + return "FILE_ERROR_IN_USE"; + case FILE_ERROR_EXISTS: + return "FILE_ERROR_EXISTS"; + case FILE_ERROR_NOT_FOUND: + return "FILE_ERROR_NOT_FOUND"; + case FILE_ERROR_ACCESS_DENIED: + return "FILE_ERROR_ACCESS_DENIED"; + case FILE_ERROR_TOO_MANY_OPENED: + return "FILE_ERROR_TOO_MANY_OPENED"; + case FILE_ERROR_NO_MEMORY: + return "FILE_ERROR_NO_MEMORY"; + case FILE_ERROR_NO_SPACE: + return "FILE_ERROR_NO_SPACE"; + case FILE_ERROR_NOT_A_DIRECTORY: + return "FILE_ERROR_NOT_A_DIRECTORY"; + case FILE_ERROR_INVALID_OPERATION: + return "FILE_ERROR_INVALID_OPERATION"; + case FILE_ERROR_SECURITY: + return "FILE_ERROR_SECURITY"; + case FILE_ERROR_ABORT: + return "FILE_ERROR_ABORT"; + case FILE_ERROR_NOT_A_FILE: + return "FILE_ERROR_NOT_A_FILE"; + case FILE_ERROR_NOT_EMPTY: + return "FILE_ERROR_NOT_EMPTY"; + case FILE_ERROR_INVALID_URL: + return "FILE_ERROR_INVALID_URL"; + case FILE_ERROR_IO: + return "FILE_ERROR_IO"; + case FILE_ERROR_MAX: + break; + } + + NOTREACHED(); + return ""; +} + +void File::WriteIntoTrace(perfetto::TracedValue context) const { + auto dict = std::move(context).WriteDictionary(); + dict.Add("is_valid", IsValid()); + dict.Add("created", created_); + dict.Add("async", async_); + dict.Add("error_details", ErrorToString(error_details_)); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,426 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_H_ +#define BASE_FILES_FILE_H_ + +#include + +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/files/file_path.h" +#include "base/files/file_tracing.h" +#include "base/files/platform_file.h" +#include "base/time/time.h" +#include "base/trace_event/base_tracing_forward.h" +#include "build/build_config.h" + +struct stat; + +namespace base { + +using stat_wrapper_t = struct stat; + +// Thin wrapper around an OS-level file. +// Note that this class does not provide any support for asynchronous IO, other +// than the ability to create asynchronous handles on Windows. +// +// Note about const: this class does not attempt to determine if the underlying +// file system object is affected by a particular method in order to consider +// that method const or not. Only methods that deal with member variables in an +// obvious non-modifying way are marked as const. Any method that forward calls +// to the OS is not considered const, even if there is no apparent change to +// member variables. +// +// On POSIX, if the given file is a symbolic link, most of the methods apply to +// the file that the symbolic link resolves to. +class BASE_EXPORT File { + public: + // FLAG_(OPEN|CREATE).* are mutually exclusive. You should specify exactly one + // of the five (possibly combining with other flags) when opening or creating + // a file. + // FLAG_(WRITE|APPEND) are mutually exclusive. This is so that APPEND behavior + // will be consistent with O_APPEND on POSIX. + enum Flags : uint32_t { + FLAG_OPEN = 1 << 0, // Opens a file, only if it exists. + FLAG_CREATE = 1 << 1, // Creates a new file, only if it does not + // already exist. + FLAG_OPEN_ALWAYS = 1 << 2, // May create a new file. + FLAG_CREATE_ALWAYS = 1 << 3, // May overwrite an old file. + FLAG_OPEN_TRUNCATED = 1 << 4, // Opens a file and truncates it, only if it + // exists. + FLAG_READ = 1 << 5, + FLAG_WRITE = 1 << 6, + FLAG_APPEND = 1 << 7, + FLAG_WIN_EXCLUSIVE_READ = 1 << 8, // Windows only. Opposite of SHARE. + FLAG_WIN_EXCLUSIVE_WRITE = 1 << 9, // Windows only. Opposite of SHARE. + FLAG_ASYNC = 1 << 10, + FLAG_WIN_TEMPORARY = 1 << 11, // Windows only. + FLAG_WIN_HIDDEN = 1 << 12, // Windows only. + FLAG_DELETE_ON_CLOSE = 1 << 13, + FLAG_WRITE_ATTRIBUTES = 1 << 14, // File opened in a mode allowing writing + // attributes, such as with SetTimes(). + FLAG_WIN_SHARE_DELETE = 1 << 15, // Windows only. + FLAG_TERMINAL_DEVICE = 1 << 16, // Serial port flags. + FLAG_WIN_BACKUP_SEMANTICS = 1 << 17, // Windows only. + FLAG_WIN_EXECUTE = 1 << 18, // Windows only. + FLAG_WIN_SEQUENTIAL_SCAN = 1 << 19, // Windows only. + FLAG_CAN_DELETE_ON_CLOSE = 1 << 20, // Requests permission to delete a file + // via DeleteOnClose() (Windows only). + // See DeleteOnClose() for details. +#if !defined(MOZ_ZUCCHINI) + FLAG_WIN_NO_EXECUTE = + 1 << 21, // Windows only. Marks the file with a deny ACE that prevents + // opening the file with EXECUTE access. Cannot be used with + // FILE_WIN_EXECUTE flag. See also PreventExecuteMapping. +#endif // !defined(MOZ_ZUCCHINI) + }; + + // This enum has been recorded in multiple histograms using PlatformFileError + // enum. If the order of the fields needs to change, please ensure that those + // histograms are obsolete or have been moved to a different enum. + // + // FILE_ERROR_ACCESS_DENIED is returned when a call fails because of a + // filesystem restriction. FILE_ERROR_SECURITY is returned when a browser + // policy doesn't allow the operation to be executed. + enum Error { + FILE_OK = 0, + FILE_ERROR_FAILED = -1, + FILE_ERROR_IN_USE = -2, + FILE_ERROR_EXISTS = -3, + FILE_ERROR_NOT_FOUND = -4, + FILE_ERROR_ACCESS_DENIED = -5, + FILE_ERROR_TOO_MANY_OPENED = -6, + FILE_ERROR_NO_MEMORY = -7, + FILE_ERROR_NO_SPACE = -8, + FILE_ERROR_NOT_A_DIRECTORY = -9, + FILE_ERROR_INVALID_OPERATION = -10, + FILE_ERROR_SECURITY = -11, + FILE_ERROR_ABORT = -12, + FILE_ERROR_NOT_A_FILE = -13, + FILE_ERROR_NOT_EMPTY = -14, + FILE_ERROR_INVALID_URL = -15, + FILE_ERROR_IO = -16, + // Put new entries here and increment FILE_ERROR_MAX. + FILE_ERROR_MAX = -17 + }; + + // This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux. + enum Whence { + FROM_BEGIN = 0, + FROM_CURRENT = 1, + FROM_END = 2 + }; + + // Used to hold information about a given file. + // If you add more fields to this structure (platform-specific fields are OK), + // make sure to update all functions that use it in file_util_{win|posix}.cc, + // too, and the ParamTraits implementation in + // ipc/ipc_message_utils.cc. + struct BASE_EXPORT Info { + Info(); + ~Info(); +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // Fills this struct with values from |stat_info|. + void FromStat(const stat_wrapper_t& stat_info); +#endif + + // The size of the file in bytes. Undefined when is_directory is true. + int64_t size = 0; + + // True if the file corresponds to a directory. + bool is_directory = false; + + // True if the file corresponds to a symbolic link. For Windows currently + // not supported and thus always false. + bool is_symbolic_link = false; + + // The last modified time of a file. + Time last_modified; + + // The last accessed time of a file. + Time last_accessed; + + // The creation time of a file. + Time creation_time; + }; + + File(); + + // Creates or opens the given file. This will fail with 'access denied' if the + // |path| contains path traversal ('..') components. + File(const FilePath& path, uint32_t flags); + + // Takes ownership of |platform_file| and sets async to false. + explicit File(ScopedPlatformFile platform_file); + explicit File(PlatformFile platform_file); + + // Takes ownership of |platform_file| and sets async to the given value. + // This constructor exists because on Windows you can't check if platform_file + // is async or not. + File(ScopedPlatformFile platform_file, bool async); + File(PlatformFile platform_file, bool async); + + // Creates an object with a specific error_details code. + explicit File(Error error_details); + + File(File&& other); + + File(const File&) = delete; + File& operator=(const File&) = delete; + + ~File(); + + File& operator=(File&& other); + + // Creates or opens the given file. + void Initialize(const FilePath& path, uint32_t flags); + + // Returns |true| if the handle / fd wrapped by this object is valid. This + // method doesn't interact with the file system and is thus safe to be called + // from threads that disallow blocking. + bool IsValid() const; + + // Returns true if a new file was created (or an old one truncated to zero + // length to simulate a new file, which can happen with + // FLAG_CREATE_ALWAYS), and false otherwise. + bool created() const { return created_; } + + // Returns the OS result of opening this file. Note that the way to verify + // the success of the operation is to use IsValid(), not this method: + // File file(path, flags); + // if (!file.IsValid()) + // return; + Error error_details() const { return error_details_; } + + PlatformFile GetPlatformFile() const; + PlatformFile TakePlatformFile(); + + // Destroying this object closes the file automatically. + void Close(); + + // Changes current position in the file to an |offset| relative to an origin + // defined by |whence|. Returns the resultant current position in the file + // (relative to the start) or -1 in case of error. + int64_t Seek(Whence whence, int64_t offset); + + // Simplified versions of Read() and friends (see below) that check the int + // return value and just return a boolean. They return true if and only if + // the function read in / wrote out exactly |data.size()| bytes of data. + bool ReadAndCheck(int64_t offset, span data); + bool ReadAtCurrentPosAndCheck(span data); + bool WriteAndCheck(int64_t offset, span data); + bool WriteAtCurrentPosAndCheck(span data); + + // Reads the given number of bytes (or until EOF is reached) starting with the + // given offset. Returns the number of bytes read, or -1 on error. Note that + // this function makes a best effort to read all data on all platforms, so it + // is not intended for stream oriented files but instead for cases when the + // normal expectation is that actually |size| bytes are read unless there is + // an error. + int Read(int64_t offset, char* data, int size); + + // Same as above but without seek. + int ReadAtCurrentPos(char* data, int size); + + // Reads the given number of bytes (or until EOF is reached) starting with the + // given offset, but does not make any effort to read all data on all + // platforms. Returns the number of bytes read, or -1 on error. + int ReadNoBestEffort(int64_t offset, char* data, int size); + + // Same as above but without seek. + int ReadAtCurrentPosNoBestEffort(char* data, int size); + + // Writes the given buffer into the file at the given offset, overwritting any + // data that was previously there. Returns the number of bytes written, or -1 + // on error. Note that this function makes a best effort to write all data on + // all platforms. |data| can be nullptr when |size| is 0. + // Ignores the offset and writes to the end of the file if the file was opened + // with FLAG_APPEND. + int Write(int64_t offset, const char* data, int size); + + // Save as above but without seek. + int WriteAtCurrentPos(const char* data, int size); + + // Save as above but does not make any effort to write all data on all + // platforms. Returns the number of bytes written, or -1 on error. + int WriteAtCurrentPosNoBestEffort(const char* data, int size); + + // Returns the current size of this file, or a negative number on failure. + int64_t GetLength(); + + // Truncates the file to the given length. If |length| is greater than the + // current size of the file, the file is extended with zeros. If the file + // doesn't exist, |false| is returned. + bool SetLength(int64_t length); + + // Instructs the filesystem to flush the file to disk. (POSIX: fsync, Windows: + // FlushFileBuffers). + // Calling Flush() does not guarantee file integrity and thus is not a valid + // substitute for file integrity checks and recovery codepaths for malformed + // files. It can also be *really* slow, so avoid blocking on Flush(), + // especially please don't block shutdown on Flush(). + // Latency percentiles of Flush() across all platforms as of July 2016: + // 50 % > 5 ms + // 10 % > 58 ms + // 1 % > 357 ms + // 0.1 % > 1.8 seconds + // 0.01 % > 7.6 seconds + bool Flush(); + + // Updates the file times. + bool SetTimes(Time last_access_time, Time last_modified_time); + + // Returns some basic information for the given file. + bool GetInfo(Info* info); + +#if !BUILDFLAG( \ + IS_FUCHSIA) // Fuchsia's POSIX API does not support file locking. + enum class LockMode { + kShared, + kExclusive, + }; + + // Attempts to take an exclusive write lock on the file. Returns immediately + // (i.e. does not wait for another process to unlock the file). If the lock + // was obtained, the result will be FILE_OK. A lock only guarantees + // that other processes may not also take a lock on the same file with the + // same API - it may still be opened, renamed, unlinked, etc. + // + // Common semantics: + // * Locks are held by processes, but not inherited by child processes. + // * Locks are released by the OS on file close or process termination. + // * Locks are reliable only on local filesystems. + // * Duplicated file handles may also write to locked files. + // Windows-specific semantics: + // * Locks are mandatory for read/write APIs, advisory for mapping APIs. + // * Within a process, locking the same file (by the same or new handle) + // will fail. + // POSIX-specific semantics: + // * Locks are advisory only. + // * Within a process, locking the same file (by the same or new handle) + // will succeed. The new lock replaces the old lock. + // * Closing any descriptor on a given file releases the lock. + Error Lock(LockMode mode); + + // Unlock a file previously locked. + Error Unlock(); + +#endif // !BUILDFLAG(IS_FUCHSIA) + + // Returns a new object referencing this file for use within the current + // process. Handling of FLAG_DELETE_ON_CLOSE varies by OS. On POSIX, the File + // object that was created or initialized with this flag will have unlinked + // the underlying file when it was created or opened. On Windows, the + // underlying file is deleted when the last handle to it is closed. + File Duplicate() const; + + bool async() const { return async_; } + + // Serialise this object into a trace. + void WriteIntoTrace(perfetto::TracedValue context) const; + +#if BUILDFLAG(IS_WIN) + // Sets or clears the DeleteFile disposition on the file. Returns true if + // the disposition was set or cleared, as indicated by |delete_on_close|. + // + // Microsoft Windows deletes a file only when the DeleteFile disposition is + // set on a file when the last handle to the last underlying kernel File + // object is closed. This disposition is be set by: + // - Calling the Win32 DeleteFile function with the path to a file. + // - Opening/creating a file with FLAG_DELETE_ON_CLOSE and then closing all + // handles to that File object. + // - Opening/creating a file with FLAG_CAN_DELETE_ON_CLOSE and subsequently + // calling DeleteOnClose(true). + // + // In all cases, all pre-existing handles to the file must have been opened + // with FLAG_WIN_SHARE_DELETE. Once the disposition has been set by any of the + // above means, no new File objects can be created for the file. + // + // So: + // - Use FLAG_WIN_SHARE_DELETE when creating/opening a file to allow another + // entity on the system to cause it to be deleted when it is closed. (Note: + // another entity can delete the file the moment after it is closed, so not + // using this permission doesn't provide any protections.) + // - Use FLAG_DELETE_ON_CLOSE for any file that is to be deleted after use. + // The OS will ensure it is deleted even in the face of process termination. + // Note that it's possible for deletion to be cancelled via another File + // object referencing the same file using DeleteOnClose(false) to clear the + // DeleteFile disposition after the original File is closed. + // - Use FLAG_CAN_DELETE_ON_CLOSE in conjunction with DeleteOnClose() to alter + // the DeleteFile disposition on an open handle. This fine-grained control + // allows for marking a file for deletion during processing so that it is + // deleted in the event of untimely process termination, and then clearing + // this state once the file is suitable for persistence. + bool DeleteOnClose(bool delete_on_close); +#endif + +#if BUILDFLAG(IS_WIN) + static Error OSErrorToFileError(DWORD last_error); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + static Error OSErrorToFileError(int saved_errno); +#endif + + // Gets the last global error (errno or GetLastError()) and converts it to the + // closest base::File::Error equivalent via OSErrorToFileError(). The returned + // value is only trustworthy immediately after another base::File method + // fails. base::File never resets the global error to zero. + static Error GetLastFileError(); + + // Converts an error value to a human-readable form. Used for logging. + static std::string ErrorToString(Error error); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // Wrapper for stat(). + static int Stat(const char* path, stat_wrapper_t* sb); + // Wrapper for fstat(). + static int Fstat(int fd, stat_wrapper_t* sb); + // Wrapper for lstat(). + static int Lstat(const char* path, stat_wrapper_t* sb); +#endif + +#if !defined(MOZ_ZUCCHINI) + // This function can be used to augment `flags` with the correct flags + // required to create a File that can be safely passed to an untrusted + // process. It must be called if the File is intended to be transferred to an + // untrusted process, but can still be safely called even if the File is not + // intended to be transferred. + static constexpr uint32_t AddFlagsForPassingToUntrustedProcess( + uint32_t flags) { + if (flags & File::FLAG_WRITE || flags & File::FLAG_APPEND || + flags & File::FLAG_WRITE_ATTRIBUTES) { + flags |= File::FLAG_WIN_NO_EXECUTE; + } + return flags; + } +#endif // !defined(MOZ_ZUCCHINI) + + private: + friend class FileTracing::ScopedTrace; + + // Creates or opens the given file. Only called if |path| has no + // traversal ('..') components. + void DoInitialize(const FilePath& path, uint32_t flags); + + void SetPlatformFile(PlatformFile file); + + ScopedPlatformFile file_; + + // A path to use for tracing purposes. Set if file tracing is enabled during + // |Initialize()|. + FilePath tracing_path_; + + // Object tied to the lifetime of |this| that enables/disables tracing. + FileTracing::ScopedEnabler trace_enabler_; + + Error error_details_ = FILE_ERROR_FAILED; + bool created_ = false; + bool async_ = false; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,32 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include "base/files/file_util.h" +#include "base/functional/function_ref.h" + +namespace base { + +FileEnumerator::FileInfo::~FileInfo() = default; + +bool FileEnumerator::ShouldSkip(const FilePath& path) { + FilePath::StringType basename = path.BaseName().value(); + return basename == FILE_PATH_LITERAL(".") || + (basename == FILE_PATH_LITERAL("..") && + !(INCLUDE_DOT_DOT & file_type_)); +} + +bool FileEnumerator::IsTypeMatched(bool is_dir) const { + return (file_type_ & + (is_dir ? FileEnumerator::DIRECTORIES : FileEnumerator::FILES)) != 0; +} + +void FileEnumerator::ForEach(FunctionRef ref) { + for (FilePath name = Next(); !name.empty(); name = Next()) { + ref(name); + } +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,246 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_ENUMERATOR_H_ +#define BASE_FILES_FILE_ENUMERATOR_H_ + +#include +#include + +#include + +#include "base/base_export.h" +#include "base/containers/stack.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/functional/function_ref.h" +#include "base/time/time.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_types.h" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include +#include +#endif + +namespace base { + +// A class for enumerating the files in a provided path. The order of the +// results is not guaranteed. +// +// This is blocking. Do not use on critical threads. +// +// Example: +// +// base::FileEnumerator e(my_dir, false, base::FileEnumerator::FILES, +// FILE_PATH_LITERAL("*.txt")); +// Using `ForEach` with a lambda: +// e.ForEach([](const base::FilePath& item) {...}); +// Using a `for` loop: +// for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) +// ... +class BASE_EXPORT FileEnumerator { + public: + // Note: copy & assign supported. + class BASE_EXPORT FileInfo { + public: + FileInfo(); + ~FileInfo(); + + bool IsDirectory() const; + + // The name of the file. This will not include any path information. This + // is in constrast to the value returned by FileEnumerator.Next() which + // includes the |root_path| passed into the FileEnumerator constructor. + FilePath GetName() const; + + int64_t GetSize() const; + + // On POSIX systems, this is rounded down to the second. + Time GetLastModifiedTime() const; + +#if BUILDFLAG(IS_WIN) + // Note that the cAlternateFileName (used to hold the "short" 8.3 name) + // of the WIN32_FIND_DATA will be empty. Since we don't use short file + // names, we tell Windows to omit it which speeds up the query slightly. + const WIN32_FIND_DATA& find_data() const { + return *ChromeToWindowsType(&find_data_); + } +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + const stat_wrapper_t& stat() const { return stat_; } +#endif + + private: + friend class FileEnumerator; + +#if BUILDFLAG(IS_WIN) + CHROME_WIN32_FIND_DATA find_data_; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + stat_wrapper_t stat_; + FilePath filename_; +#endif + }; + + enum FileType { + FILES = 1 << 0, + DIRECTORIES = 1 << 1, + INCLUDE_DOT_DOT = 1 << 2, + + // Report only the names of entries and not their type, size, or + // last-modified time. May only be used for non-recursive enumerations, and + // implicitly includes both files and directories (neither of which may be + // specified). When used, an enumerator's `GetInfo()` method must not be + // called. + NAMES_ONLY = 1 << 3, + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + SHOW_SYM_LINKS = 1 << 4, +#endif + }; + + // Search policy for intermediate folders. + enum class FolderSearchPolicy { + // Recursive search will pass through folders whose names match the + // pattern. Inside each one, all files will be returned. Folders with names + // that do not match the pattern will be ignored within their interior. + MATCH_ONLY, + // Recursive search will pass through every folder and perform pattern + // matching inside each one. + ALL, + }; + + // Determines how a FileEnumerator handles errors encountered during + // enumeration. When no ErrorPolicy is explicitly set, FileEnumerator defaults + // to IGNORE_ERRORS. + enum class ErrorPolicy { + // Errors are ignored if possible and FileEnumerator returns as many files + // as it is able to enumerate. + IGNORE_ERRORS, + + // Any error encountered during enumeration will terminate the enumeration + // immediately. An error code indicating the nature of a failure can be + // retrieved from |GetError()|. + STOP_ENUMERATION, + }; + + // |root_path| is the starting directory to search for. It may or may not end + // in a slash. + // + // If |recursive| is true, this will enumerate all matches in any + // subdirectories matched as well. It does a breadth-first search, so all + // files in one directory will be returned before any files in a + // subdirectory. + // + // |file_type|, a bit mask of FileType, specifies whether the enumerator + // should match files, directories, or both. + // + // |pattern| is an optional pattern for which files to match. This + // works like shell globbing. For example, "*.txt" or "Foo???.doc". + // However, be careful in specifying patterns that aren't cross platform + // since the underlying code uses OS-specific matching routines. In general, + // Windows matching is less featureful than others, so test there first. + // If unspecified, this will match all files. + // + // |folder_search_policy| optionally specifies a search behavior. Refer to + // |FolderSearchPolicy| for a list of folder search policies and the meaning + // of them. If |recursive| is false, this parameter has no effect. + // + // |error_policy| optionally specifies the behavior when an error occurs. + // Refer to |ErrorPolicy| for a list of error policies and the meaning of + // them. + FileEnumerator(const FilePath& root_path, bool recursive, int file_type); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy); + FileEnumerator(const FileEnumerator&) = delete; + FileEnumerator& operator=(const FileEnumerator&) = delete; + ~FileEnumerator(); + + // Calls `ref` synchronously for each path found by the `FileEnumerator`. Each + // path will incorporate the `root_path` passed in the constructor: + // "/file_name.txt". If the `root_path` is absolute, then so will + // be the paths provided in the `ref` invocations. + void ForEach(FunctionRef ref); + + // Returns the next file or an empty string if there are no more results. + // + // The returned path will incorporate the |root_path| passed in the + // constructor: "/file_name.txt". If the |root_path| is absolute, + // then so will be the result of Next(). + FilePath Next(); + + // Returns info about the file last returned by Next(). Note that on Windows + // and Fuchsia, GetInfo() does not play well with INCLUDE_DOT_DOT. In + // particular, the GetLastModifiedTime() for the .. directory is 1601-01-01 + // on Fuchsia (https://crbug.com/1106172) and is equal to the last modified + // time of the current directory on Windows (https://crbug.com/1119546). + // Must not be used with FileType::NAMES_ONLY. + FileInfo GetInfo() const; + + // Once |Next()| returns an empty path, enumeration has been terminated. If + // termination was normal (i.e. no more results to enumerate) or ErrorPolicy + // is set to IGNORE_ERRORS, this returns FILE_OK. Otherwise it returns an + // error code reflecting why enumeration was stopped early. + File::Error GetError() const { return error_; } + + private: + // Returns true if the given path should be skipped in enumeration. + bool ShouldSkip(const FilePath& path); + + bool IsTypeMatched(bool is_dir) const; + + bool IsPatternMatched(const FilePath& src) const; + +#if BUILDFLAG(IS_WIN) + const WIN32_FIND_DATA& find_data() const { + return *ChromeToWindowsType(&find_data_); + } + + // True when find_data_ is valid. + bool has_find_data_ = false; + CHROME_WIN32_FIND_DATA find_data_; + HANDLE find_handle_ = INVALID_HANDLE_VALUE; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // The files in the current directory + std::vector directory_entries_; + + // Set of visited directories. Used to prevent infinite looping along + // circular symlinks. + // The Android NDK (r23) does not declare `st_ino` as an `ino_t`, hence the + // need for the ugly decltype. + std::unordered_set visited_directories_; + + // The next entry to use from the directory_entries_ vector + size_t current_directory_entry_; +#endif + FilePath root_path_; + const bool recursive_; + int file_type_; + FilePath::StringType pattern_; + const FolderSearchPolicy folder_search_policy_; + const ErrorPolicy error_policy_; + File::Error error_ = File::FILE_OK; + + // A stack that keeps track of which subdirectories we still need to + // enumerate in the breadth-first search. + base::stack pending_paths_; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_ENUMERATOR_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,265 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include +#include +#include +#include +#include + +#include "base/logging.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" + +namespace base { +namespace { + +void GetStat(const FilePath& path, bool show_links, stat_wrapper_t* st) { + DCHECK(st); + const int res = show_links ? File::Lstat(path.value().c_str(), st) + : File::Stat(path.value().c_str(), st); + if (res < 0) { + // Print the stat() error message unless it was ENOENT and we're following + // symlinks. + DPLOG_IF(ERROR, errno != ENOENT || show_links) + << "Cannot stat '" << path << "'"; + memset(st, 0, sizeof(*st)); + } +} + +#if BUILDFLAG(IS_FUCHSIA) +bool ShouldShowSymLinks(int file_type) { + return false; +} +#else +bool ShouldShowSymLinks(int file_type) { + return file_type & FileEnumerator::SHOW_SYM_LINKS; +} +#endif // BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_FUCHSIA) +bool ShouldTrackVisitedDirectories(int file_type) { + return false; +} +#else +bool ShouldTrackVisitedDirectories(int file_type) { + return !(file_type & FileEnumerator::SHOW_SYM_LINKS); +} +#endif // BUILDFLAG(IS_FUCHSIA) + +} // namespace + +// FileEnumerator::FileInfo ---------------------------------------------------- + +FileEnumerator::FileInfo::FileInfo() { + memset(&stat_, 0, sizeof(stat_)); +} + +bool FileEnumerator::FileInfo::IsDirectory() const { + return S_ISDIR(stat_.st_mode); +} + +FilePath FileEnumerator::FileInfo::GetName() const { + return filename_; +} + +int64_t FileEnumerator::FileInfo::GetSize() const { + return stat_.st_size; +} + +base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const { + return base::Time::FromTimeT(stat_.st_mtime); +} + +// FileEnumerator -------------------------------------------------------------- + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type) + : FileEnumerator(root_path, + recursive, + file_type, + FilePath::StringType(), + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + folder_search_policy, + ErrorPolicy::IGNORE_ERRORS) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy) + : current_directory_entry_(0), + root_path_(root_path), + recursive_(recursive), + file_type_(file_type), + pattern_(pattern), + folder_search_policy_(folder_search_policy), + error_policy_(error_policy) { + // INCLUDE_DOT_DOT must not be specified if recursive. + DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); + + if (file_type_ & FileType::NAMES_ONLY) { + DCHECK(!recursive_); + DCHECK_EQ(file_type_ & ~(FileType::NAMES_ONLY | FileType::INCLUDE_DOT_DOT), + 0); + file_type_ |= (FileType::FILES | FileType::DIRECTORIES); + } + + if (recursive && ShouldTrackVisitedDirectories(file_type_)) { + stat_wrapper_t st; + GetStat(root_path, false, &st); + visited_directories_.insert(st.st_ino); + } + + pending_paths_.push(root_path); +} + +FileEnumerator::~FileEnumerator() = default; + +FilePath FileEnumerator::Next() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + ++current_directory_entry_; + + // While we've exhausted the entries in the current directory, do the next + while (current_directory_entry_ >= directory_entries_.size()) { + if (pending_paths_.empty()) + return FilePath(); + + root_path_ = pending_paths_.top(); + root_path_ = root_path_.StripTrailingSeparators(); + pending_paths_.pop(); + + DIR* dir = opendir(root_path_.value().c_str()); + if (!dir) { + if (errno == 0 || error_policy_ == ErrorPolicy::IGNORE_ERRORS) + continue; + error_ = File::OSErrorToFileError(errno); + return FilePath(); + } + + directory_entries_.clear(); + +#if BUILDFLAG(IS_FUCHSIA) + // Fuchsia does not support .. on the file system server side, see + // https://fuchsia.googlesource.com/docs/+/master/dotdot.md and + // https://crbug.com/735540. However, for UI purposes, having the parent + // directory show up in directory listings makes sense, so we add it here to + // match the expectation on other operating systems. In cases where this + // is useful it should be resolvable locally. + FileInfo dotdot; + dotdot.stat_.st_mode = S_IFDIR; + dotdot.filename_ = FilePath(".."); + if (!ShouldSkip(dotdot.filename_)) { + directory_entries_.push_back(std::move(dotdot)); + } +#endif // BUILDFLAG(IS_FUCHSIA) + + current_directory_entry_ = 0; + struct dirent* dent; + // NOTE: Per the readdir() documentation, when the end of the directory is + // reached with no errors, null is returned and errno is not changed. + // Therefore we must reset errno to zero before calling readdir() if we + // wish to know whether a null result indicates an error condition. +#if !defined(MOZ_ZUCCHINI) + while (errno = 0, dent = readdir(dir)) { +#else + while ((void)(errno = 0), dent = readdir(dir)) { +#endif // !defined(MOZ_ZUCCHINI) + FileInfo info; + info.filename_ = FilePath(dent->d_name); + + if (ShouldSkip(info.filename_)) + continue; + + const bool is_pattern_matched = IsPatternMatched(info.filename_); + + // MATCH_ONLY policy enumerates files and directories which matching + // pattern only. So we can early skip further checks. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY && + !is_pattern_matched) + continue; + + // Do not call OS stat/lstat if there is no sense to do it. If pattern is + // not matched (file will not appear in results) and search is not + // recursive (possible directory will not be added to pending paths) - + // there is no sense to obtain item below. + if (!recursive_ && !is_pattern_matched) + continue; + + // If the caller only wants the names of files and directories, then + // continue without populating `info` further. + if (file_type_ & FileType::NAMES_ONLY) { + directory_entries_.push_back(std::move(info)); + continue; + } + + const FilePath full_path = root_path_.Append(info.filename_); + GetStat(full_path, ShouldShowSymLinks(file_type_), &info.stat_); + + const bool is_dir = info.IsDirectory(); + + // Recursive mode: schedule traversal of a directory if either + // SHOW_SYM_LINKS is on or we haven't visited the directory yet. + if (recursive_ && is_dir && + (!ShouldTrackVisitedDirectories(file_type_) || + visited_directories_.insert(info.stat_.st_ino).second)) { + pending_paths_.push(full_path); + } + + if (is_pattern_matched && IsTypeMatched(is_dir)) + directory_entries_.push_back(std::move(info)); + } + int readdir_errno = errno; + closedir(dir); + if (readdir_errno != 0 && error_policy_ != ErrorPolicy::IGNORE_ERRORS) { + error_ = File::OSErrorToFileError(readdir_errno); + return FilePath(); + } + + // MATCH_ONLY policy enumerates files in matched subfolders by "*" pattern. + // ALL policy enumerates files in all subfolders by origin pattern. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY) + pattern_.clear(); + } + + return root_path_.Append( + directory_entries_[current_directory_entry_].filename_); +} + +FileEnumerator::FileInfo FileEnumerator::GetInfo() const { + DCHECK(!(file_type_ & FileType::NAMES_ONLY)); + return directory_entries_[current_directory_entry_]; +} + +bool FileEnumerator::IsPatternMatched(const FilePath& path) const { + return pattern_.empty() || + !fnmatch(pattern_.c_str(), path.value().c_str(), FNM_NOESCAPE); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,228 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include +#include + +#include "base/check_op.h" +#include "base/notreached.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" +#include "base/win/shlwapi.h" + +namespace base { + +namespace { + +FilePath BuildSearchFilter(FileEnumerator::FolderSearchPolicy policy, + const FilePath& root_path, + const FilePath::StringType& pattern) { + // MATCH_ONLY policy filters incoming files by pattern on OS side. ALL policy + // collects all files and filters them manually. + switch (policy) { + case FileEnumerator::FolderSearchPolicy::MATCH_ONLY: + return root_path.Append(pattern); + case FileEnumerator::FolderSearchPolicy::ALL: + return root_path.Append(FILE_PATH_LITERAL("*")); + } + NOTREACHED(); + return {}; +} + +} // namespace + +// FileEnumerator::FileInfo ---------------------------------------------------- + +FileEnumerator::FileInfo::FileInfo() { + memset(&find_data_, 0, sizeof(find_data_)); +} + +bool FileEnumerator::FileInfo::IsDirectory() const { + return (find_data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; +} + +FilePath FileEnumerator::FileInfo::GetName() const { + return FilePath(find_data().cFileName); +} + +int64_t FileEnumerator::FileInfo::GetSize() const { + ULARGE_INTEGER size; + size.HighPart = find_data().nFileSizeHigh; + size.LowPart = find_data().nFileSizeLow; + DCHECK_LE(size.QuadPart, + static_cast(std::numeric_limits::max())); + return static_cast(size.QuadPart); +} + +Time FileEnumerator::FileInfo::GetLastModifiedTime() const { + return Time::FromFileTime(find_data().ftLastWriteTime); +} + +// FileEnumerator -------------------------------------------------------------- + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type) + : FileEnumerator(root_path, + recursive, + file_type, + FilePath::StringType(), + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + folder_search_policy, + ErrorPolicy::IGNORE_ERRORS) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy) + : recursive_(recursive), + file_type_(file_type), + pattern_(!pattern.empty() ? pattern : FILE_PATH_LITERAL("*")), + folder_search_policy_(folder_search_policy), + error_policy_(error_policy) { + // INCLUDE_DOT_DOT must not be specified if recursive. + DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); + + if (file_type_ & FileType::NAMES_ONLY) { + DCHECK(!recursive_); + DCHECK_EQ(file_type_ & ~(FileType::NAMES_ONLY | FileType::INCLUDE_DOT_DOT), + 0); + file_type_ |= (FileType::FILES | FileType::DIRECTORIES); + } + + memset(&find_data_, 0, sizeof(find_data_)); + pending_paths_.push(root_path); +} + +FileEnumerator::~FileEnumerator() { + if (find_handle_ != INVALID_HANDLE_VALUE) + FindClose(find_handle_); +} + +FileEnumerator::FileInfo FileEnumerator::GetInfo() const { + DCHECK(!(file_type_ & FileType::NAMES_ONLY)); + if (!has_find_data_) { + NOTREACHED(); + return FileInfo(); + } + FileInfo ret; + memcpy(&ret.find_data_, &find_data_, sizeof(find_data_)); + return ret; +} + +FilePath FileEnumerator::Next() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + while (has_find_data_ || !pending_paths_.empty()) { + if (!has_find_data_) { + // The last find FindFirstFile operation is done, prepare a new one. + root_path_ = pending_paths_.top(); + pending_paths_.pop(); + + // Start a new find operation. + const FilePath src = + BuildSearchFilter(folder_search_policy_, root_path_, pattern_); + find_handle_ = FindFirstFileEx(src.value().c_str(), + FindExInfoBasic, // Omit short name. + ChromeToWindowsType(&find_data_), + FindExSearchNameMatch, nullptr, + FIND_FIRST_EX_LARGE_FETCH); + has_find_data_ = true; + } else { + // Search for the next file/directory. + if (!FindNextFile(find_handle_, ChromeToWindowsType(&find_data_))) { + FindClose(find_handle_); + find_handle_ = INVALID_HANDLE_VALUE; + } + } + + DWORD last_error = GetLastError(); + if (INVALID_HANDLE_VALUE == find_handle_) { + has_find_data_ = false; + + // MATCH_ONLY policy clears pattern for matched subfolders. ALL policy + // applies pattern for all subfolders. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY) { + // This is reached when we have finished a directory and are advancing + // to the next one in the queue. We applied the pattern (if any) to the + // files in the root search directory, but for those directories which + // were matched, we want to enumerate all files inside them. This will + // happen when the handle is empty. + pattern_ = FILE_PATH_LITERAL("*"); + } + + if (last_error == ERROR_NO_MORE_FILES || + error_policy_ == ErrorPolicy::IGNORE_ERRORS) { + continue; + } + + error_ = File::OSErrorToFileError(last_error); + return FilePath(); + } + + const FilePath filename(find_data().cFileName); + if (ShouldSkip(filename)) + continue; + + const bool is_dir = + (find_data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + const FilePath abs_path = root_path_.Append(filename); + + // Check if directory should be processed recursive. + if (is_dir && recursive_) { + // If |cur_file| is a directory, and we are doing recursive searching, + // add it to pending_paths_ so we scan it after we finish scanning this + // directory. However, don't do recursion through reparse points or we + // may end up with an infinite cycle. + DWORD attributes = GetFileAttributes(abs_path.value().c_str()); + if (!(attributes & FILE_ATTRIBUTE_REPARSE_POINT)) + pending_paths_.push(abs_path); + } + + if (IsTypeMatched(is_dir) && IsPatternMatched(filename)) + return abs_path; + } + return FilePath(); +} + +bool FileEnumerator::IsPatternMatched(const FilePath& src) const { + switch (folder_search_policy_) { + case FolderSearchPolicy::MATCH_ONLY: + // MATCH_ONLY policy filters by pattern on search request, so all found + // files already fits to pattern. + return true; + case FolderSearchPolicy::ALL: + // ALL policy enumerates all files, we need to check pattern match + // manually. + return PathMatchSpec(src.value().c_str(), pattern_.c_str()) == TRUE; + } + NOTREACHED(); + return false; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,1420 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_path.h" + +#include + +#include + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/safe_base_name.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/numerics/safe_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/pickle.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/ranges/algorithm.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/trace_event/base_tracing.h" + +#if BUILDFLAG(IS_APPLE) +#include "base/mac/scoped_cftyperef.h" +#include "base/third_party/icu/icu_utf.h" +#endif + +#if BUILDFLAG(IS_WIN) +#include +#include "base/win/win_util.h" +#elif BUILDFLAG(IS_APPLE) +#include +#endif + +namespace base { + +using StringType = FilePath::StringType; +using StringPieceType = FilePath::StringPieceType; + +namespace { + +const char* const kCommonDoubleExtensionSuffixes[] = { + "bz", "bz2", "gz", "lz", "lzma", "lzo", "xz", "z", "zst"}; +const char* const kCommonDoubleExtensions[] = {"user.js"}; + +const FilePath::CharType kStringTerminator = FILE_PATH_LITERAL('\0'); + +// If this FilePath contains a drive letter specification, returns the +// position of the last character of the drive letter specification, +// otherwise returns npos. This can only be true on Windows, when a pathname +// begins with a letter followed by a colon. On other platforms, this always +// returns npos. +StringPieceType::size_type FindDriveLetter(StringPieceType path) { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + // This is dependent on an ASCII-based character set, but that's a + // reasonable assumption. iswalpha can be too inclusive here. + if (path.length() >= 2 && path[1] == L':' && + ((path[0] >= L'A' && path[0] <= L'Z') || + (path[0] >= L'a' && path[0] <= L'z'))) { + return 1; + } +#endif // FILE_PATH_USES_DRIVE_LETTERS + return StringType::npos; +} + +#if defined(FILE_PATH_USES_DRIVE_LETTERS) +bool EqualDriveLetterCaseInsensitive(StringPieceType a, StringPieceType b) { + size_t a_letter_pos = FindDriveLetter(a); + size_t b_letter_pos = FindDriveLetter(b); + + if (a_letter_pos == StringType::npos || b_letter_pos == StringType::npos) + return a == b; + + StringPieceType a_letter(a.substr(0, a_letter_pos + 1)); + StringPieceType b_letter(b.substr(0, b_letter_pos + 1)); + if (!StartsWith(a_letter, b_letter, CompareCase::INSENSITIVE_ASCII)) + return false; + + StringPieceType a_rest(a.substr(a_letter_pos + 1)); + StringPieceType b_rest(b.substr(b_letter_pos + 1)); + return a_rest == b_rest; +} +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) + +bool IsPathAbsolute(StringPieceType path) { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + StringType::size_type letter = FindDriveLetter(path); + if (letter != StringType::npos) { + // Look for a separator right after the drive specification. + return path.length() > letter + 1 && + FilePath::IsSeparator(path[letter + 1]); + } + // Look for a pair of leading separators. + return path.length() > 1 && + FilePath::IsSeparator(path[0]) && FilePath::IsSeparator(path[1]); +#else // FILE_PATH_USES_DRIVE_LETTERS + // Look for a separator in the first position. + return path.length() > 0 && FilePath::IsSeparator(path[0]); +#endif // FILE_PATH_USES_DRIVE_LETTERS +} + +bool AreAllSeparators(const StringType& input) { + for (auto it : input) { + if (!FilePath::IsSeparator(it)) + return false; + } + + return true; +} + +// Find the position of the '.' that separates the extension from the rest +// of the file name. The position is relative to BaseName(), not value(). +// Returns npos if it can't find an extension. +StringType::size_type FinalExtensionSeparatorPosition(const StringType& path) { + // Special case "." and ".." + if (path == FilePath::kCurrentDirectory || path == FilePath::kParentDirectory) + return StringType::npos; + + return path.rfind(FilePath::kExtensionSeparator); +} + +// Same as above, but allow a second extension component of up to 4 +// characters when the rightmost extension component is a common double +// extension (gz, bz2, Z). For example, foo.tar.gz or foo.tar.Z would have +// extension components of '.tar.gz' and '.tar.Z' respectively. +StringType::size_type ExtensionSeparatorPosition(const StringType& path) { + const StringType::size_type last_dot = FinalExtensionSeparatorPosition(path); + + // No extension, or the extension is the whole filename. + if (last_dot == StringType::npos || last_dot == 0U) + return last_dot; + + const StringType::size_type penultimate_dot = + path.rfind(FilePath::kExtensionSeparator, last_dot - 1); + const StringType::size_type last_separator = + path.find_last_of(FilePath::kSeparators, last_dot - 1, + FilePath::kSeparatorsLength - 1); + + if (penultimate_dot == StringType::npos || + (last_separator != StringType::npos && + penultimate_dot < last_separator)) { + return last_dot; + } + + for (auto* i : kCommonDoubleExtensions) { + StringType extension(path, penultimate_dot + 1); + if (EqualsCaseInsensitiveASCII(extension, i)) + return penultimate_dot; + } + + StringType extension(path, last_dot + 1); + for (auto* i : kCommonDoubleExtensionSuffixes) { + if (EqualsCaseInsensitiveASCII(extension, i)) { + if ((last_dot - penultimate_dot) <= 5U && + (last_dot - penultimate_dot) > 1U) { + return penultimate_dot; + } + } + } + + return last_dot; +} + +// Returns true if path is "", ".", or "..". +bool IsEmptyOrSpecialCase(const StringType& path) { + // Special cases "", ".", and ".." + if (path.empty() || path == FilePath::kCurrentDirectory || + path == FilePath::kParentDirectory) { + return true; + } + + return false; +} + +} // namespace + +FilePath::FilePath() = default; + +FilePath::FilePath(const FilePath& that) = default; +FilePath::FilePath(FilePath&& that) noexcept = default; + +FilePath::FilePath(StringPieceType path) : path_(path) { + StringType::size_type nul_pos = path_.find(kStringTerminator); + if (nul_pos != StringType::npos) + path_.erase(nul_pos, StringType::npos); +} + +FilePath::~FilePath() = default; + +FilePath& FilePath::operator=(const FilePath& that) = default; + +#if !defined(MOZ_ZUCCHINI) +FilePath& FilePath::operator=(FilePath&& that) noexcept = default; +#else +FilePath& FilePath::operator=(FilePath&& that) = default; +#endif // !defined(MOZ_ZUCCHINI) + +bool FilePath::operator==(const FilePath& that) const { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + return EqualDriveLetterCaseInsensitive(this->path_, that.path_); +#else // defined(FILE_PATH_USES_DRIVE_LETTERS) + return path_ == that.path_; +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) +} + +bool FilePath::operator!=(const FilePath& that) const { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + return !EqualDriveLetterCaseInsensitive(this->path_, that.path_); +#else // defined(FILE_PATH_USES_DRIVE_LETTERS) + return path_ != that.path_; +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) +} + +std::ostream& operator<<(std::ostream& out, const FilePath& file_path) { + return out << file_path.value(); +} + +// static +bool FilePath::IsSeparator(CharType character) { + for (size_t i = 0; i < kSeparatorsLength - 1; ++i) { + if (character == kSeparators[i]) { + return true; + } + } + + return false; +} + +std::vector FilePath::GetComponents() const { + std::vector ret_val; + if (value().empty()) + return ret_val; + + FilePath current = *this; + FilePath base; + + // Capture path components. + while (current != current.DirName()) { + base = current.BaseName(); + if (!AreAllSeparators(base.value())) + ret_val.push_back(base.value()); + current = current.DirName(); + } + + // Capture root, if any. + base = current.BaseName(); + if (!base.value().empty() && base.value() != kCurrentDirectory) + ret_val.push_back(current.BaseName().value()); + + // Capture drive letter, if any. + FilePath dir = current.DirName(); + StringType::size_type letter = FindDriveLetter(dir.value()); + if (letter != StringType::npos) + ret_val.emplace_back(dir.value(), 0, letter + 1); + + ranges::reverse(ret_val); + return ret_val; +} + +bool FilePath::IsParent(const FilePath& child) const { + return AppendRelativePath(child, nullptr); +} + +bool FilePath::AppendRelativePath(const FilePath& child, + FilePath* path) const { + std::vector parent_components = GetComponents(); + std::vector child_components = child.GetComponents(); + + if (parent_components.empty() || + parent_components.size() >= child_components.size()) + return false; + + std::vector::const_iterator parent_comp = + parent_components.begin(); + std::vector::const_iterator child_comp = + child_components.begin(); + +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + // Windows can access case sensitive filesystems, so component + // comparisions must be case sensitive, but drive letters are + // never case sensitive. + if ((FindDriveLetter(*parent_comp) != StringType::npos) && + (FindDriveLetter(*child_comp) != StringType::npos)) { + if (!StartsWith(*parent_comp, *child_comp, CompareCase::INSENSITIVE_ASCII)) + return false; + ++parent_comp; + ++child_comp; + } +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) + + // The first 2 components for network paths are [<2-Separators>, ]. + // Use case-insensitive comparison for the hostname. + // https://tools.ietf.org/html/rfc3986#section-3.2.2 + if (IsNetwork() && parent_components.size() > 1) { + if (*parent_comp++ != *child_comp++ || + !base::EqualsCaseInsensitiveASCII(*parent_comp++, *child_comp++)) { + return false; + } + } + + while (parent_comp != parent_components.end()) { + if (*parent_comp != *child_comp) + return false; + ++parent_comp; + ++child_comp; + } + + if (path != nullptr) { + for (; child_comp != child_components.end(); ++child_comp) { + *path = path->Append(*child_comp); + } + } + return true; +} + +// libgen's dirname and basename aren't guaranteed to be thread-safe and aren't +// guaranteed to not modify their input strings, and in fact are implemented +// differently in this regard on different platforms. Don't use them, but +// adhere to their behavior. +FilePath FilePath::DirName() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // The drive letter, if any, always needs to remain in the output. If there + // is no drive letter, as will always be the case on platforms which do not + // support drive letters, letter will be npos, or -1, so the comparisons and + // resizes below using letter will still be valid. + StringType::size_type letter = FindDriveLetter(new_path.path_); + + StringType::size_type last_separator = + new_path.path_.find_last_of(kSeparators, StringType::npos, + kSeparatorsLength - 1); + if (last_separator == StringType::npos) { + // path_ is in the current directory. + new_path.path_.resize(letter + 1); + } else if (last_separator == letter + 1) { + // path_ is in the root directory. + new_path.path_.resize(letter + 2); + } else if (last_separator == letter + 2 && + IsSeparator(new_path.path_[letter + 1])) { + // path_ is in "//" (possibly with a drive letter); leave the double + // separator intact indicating alternate root. + new_path.path_.resize(letter + 3); + } else if (last_separator != 0) { + bool trim_to_basename = true; +#if BUILDFLAG(IS_POSIX) + // On Posix, more than two leading separators are always collapsed to one. + // See + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13 + // So, do not strip any of the separators, let + // StripTrailingSeparatorsInternal() take care of the extra. + if (AreAllSeparators(new_path.path_.substr(0, last_separator + 1))) { + new_path.path_.resize(last_separator + 1); + trim_to_basename = false; + } +#endif // BUILDFLAG(IS_POSIX) + if (trim_to_basename) { + // path_ is somewhere else, trim the basename. + new_path.path_.resize(last_separator); + } + } + + new_path.StripTrailingSeparatorsInternal(); + if (!new_path.path_.length()) + new_path.path_ = kCurrentDirectory; + + return new_path; +} + +FilePath FilePath::BaseName() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // The drive letter, if any, is always stripped. + StringType::size_type letter = FindDriveLetter(new_path.path_); + if (letter != StringType::npos) { + new_path.path_.erase(0, letter + 1); + } + + // Keep everything after the final separator, but if the pathname is only + // one character and it's a separator, leave it alone. + StringType::size_type last_separator = + new_path.path_.find_last_of(kSeparators, StringType::npos, + kSeparatorsLength - 1); + if (last_separator != StringType::npos && + last_separator < new_path.path_.length() - 1) { + new_path.path_.erase(0, last_separator + 1); + } + + return new_path; +} + +StringType FilePath::Extension() const { + FilePath base(BaseName()); + const StringType::size_type dot = ExtensionSeparatorPosition(base.path_); + if (dot == StringType::npos) + return StringType(); + + return base.path_.substr(dot, StringType::npos); +} + +StringType FilePath::FinalExtension() const { + FilePath base(BaseName()); + const StringType::size_type dot = FinalExtensionSeparatorPosition(base.path_); + if (dot == StringType::npos) + return StringType(); + + return base.path_.substr(dot, StringType::npos); +} + +FilePath FilePath::RemoveExtension() const { + if (Extension().empty()) + return *this; + + const StringType::size_type dot = ExtensionSeparatorPosition(path_); + if (dot == StringType::npos) + return *this; + + return FilePath(path_.substr(0, dot)); +} + +FilePath FilePath::RemoveFinalExtension() const { + if (FinalExtension().empty()) + return *this; + + const StringType::size_type dot = FinalExtensionSeparatorPosition(path_); + if (dot == StringType::npos) + return *this; + + return FilePath(path_.substr(0, dot)); +} + +FilePath FilePath::InsertBeforeExtension(StringPieceType suffix) const { + if (suffix.empty()) + return FilePath(path_); + + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + return FilePath( + base::StrCat({RemoveExtension().value(), suffix, Extension()})); +} + +FilePath FilePath::InsertBeforeExtensionASCII(StringPiece suffix) + const { + DCHECK(IsStringASCII(suffix)); +#if BUILDFLAG(IS_WIN) + return InsertBeforeExtension(UTF8ToWide(suffix)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return InsertBeforeExtension(suffix); +#endif +} + +FilePath FilePath::AddExtension(StringPieceType extension) const { + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + // If the new extension is "" or ".", then just return the current FilePath. + if (extension.empty() || + (extension.size() == 1 && extension[0] == kExtensionSeparator)) + return *this; + + StringType str = path_; + if (extension[0] != kExtensionSeparator && + *(str.end() - 1) != kExtensionSeparator) { + str.append(1, kExtensionSeparator); + } + str.append(extension); + return FilePath(str); +} + +FilePath FilePath::AddExtensionASCII(StringPiece extension) const { + DCHECK(IsStringASCII(extension)); +#if BUILDFLAG(IS_WIN) + return AddExtension(UTF8ToWide(extension)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return AddExtension(extension); +#endif +} + +FilePath FilePath::ReplaceExtension(StringPieceType extension) const { + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + FilePath no_ext = RemoveExtension(); + // If the new extension is "" or ".", then just remove the current extension. + if (extension.empty() || + (extension.size() == 1 && extension[0] == kExtensionSeparator)) + return no_ext; + + StringType str = no_ext.value(); + if (extension[0] != kExtensionSeparator) + str.append(1, kExtensionSeparator); + str.append(extension); + return FilePath(str); +} + +bool FilePath::MatchesExtension(StringPieceType extension) const { + DCHECK(extension.empty() || extension[0] == kExtensionSeparator); + + StringType current_extension = Extension(); + + if (current_extension.length() != extension.length()) + return false; + + return FilePath::CompareEqualIgnoreCase(extension, current_extension); +} + +bool FilePath::MatchesFinalExtension(StringPieceType extension) const { + DCHECK(extension.empty() || extension[0] == kExtensionSeparator); + + StringType current_final_extension = FinalExtension(); + + if (current_final_extension.length() != extension.length()) + return false; + + return FilePath::CompareEqualIgnoreCase(extension, current_final_extension); +} + +FilePath FilePath::Append(StringPieceType component) const { + StringPieceType appended = component; + StringType without_nuls; + + StringType::size_type nul_pos = component.find(kStringTerminator); + if (nul_pos != StringPieceType::npos) { + without_nuls = StringType(component.substr(0, nul_pos)); + appended = StringPieceType(without_nuls); + } + + DCHECK(!IsPathAbsolute(appended)); + + if (path_.compare(kCurrentDirectory) == 0 && !appended.empty()) { + // Append normally doesn't do any normalization, but as a special case, + // when appending to kCurrentDirectory, just return a new path for the + // component argument. Appending component to kCurrentDirectory would + // serve no purpose other than needlessly lengthening the path, and + // it's likely in practice to wind up with FilePath objects containing + // only kCurrentDirectory when calling DirName on a single relative path + // component. + return FilePath(appended); + } + + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // Don't append a separator if the path is empty (indicating the current + // directory) or if the path component is empty (indicating nothing to + // append). + if (!appended.empty() && !new_path.path_.empty()) { + // Don't append a separator if the path still ends with a trailing + // separator after stripping (indicating the root directory). + if (!IsSeparator(new_path.path_.back())) { + // Don't append a separator if the path is just a drive letter. + if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) { + new_path.path_.append(1, kSeparators[0]); + } + } + } + + new_path.path_.append(appended); + return new_path; +} + +FilePath FilePath::Append(const FilePath& component) const { + return Append(component.value()); +} + +#if !defined(MOZ_ZUCCHINI) +FilePath FilePath::Append(const SafeBaseName& component) const { + return Append(component.path().value()); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath FilePath::AppendASCII(StringPiece component) const { + DCHECK(base::IsStringASCII(component)); +#if BUILDFLAG(IS_WIN) + return Append(UTF8ToWide(component)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return Append(component); +#endif +} + +bool FilePath::IsAbsolute() const { + return IsPathAbsolute(path_); +} + +bool FilePath::IsNetwork() const { + return path_.length() > 1 && FilePath::IsSeparator(path_[0]) && + FilePath::IsSeparator(path_[1]); +} + +bool FilePath::EndsWithSeparator() const { + if (empty()) + return false; + return IsSeparator(path_.back()); +} + +FilePath FilePath::AsEndingWithSeparator() const { + if (EndsWithSeparator() || path_.empty()) + return *this; + + StringType path_str; + path_str.reserve(path_.length() + 1); // Only allocate string once. + + path_str = path_; + path_str.append(&kSeparators[0], 1); + return FilePath(path_str); +} + +FilePath FilePath::StripTrailingSeparators() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + return new_path; +} + +bool FilePath::ReferencesParent() const { + if (path_.find(kParentDirectory) == StringType::npos) { + // GetComponents is quite expensive, so avoid calling it in the majority + // of cases where there isn't a kParentDirectory anywhere in the path. + return false; + } + + std::vector components = GetComponents(); + std::vector::const_iterator it = components.begin(); + for (; it != components.end(); ++it) { + const StringType& component = *it; + // Windows has odd, undocumented behavior with path components containing + // only whitespace and . characters. So, if all we see is . and + // whitespace, then we treat any .. sequence as referencing parent. + // For simplicity we enforce this on all platforms. + if (component.find_first_not_of(FILE_PATH_LITERAL(". \n\r\t")) == + std::string::npos && + component.find(kParentDirectory) != std::string::npos) { + return true; + } + } + return false; +} + +#if BUILDFLAG(IS_WIN) + +std::u16string FilePath::LossyDisplayName() const { + return AsString16(path_); +} + +std::string FilePath::MaybeAsASCII() const { + return base::IsStringASCII(path_) ? WideToASCII(path_) : std::string(); +} + +std::string FilePath::AsUTF8Unsafe() const { + return WideToUTF8(value()); +} + +std::u16string FilePath::AsUTF16Unsafe() const { + return WideToUTF16(value()); +} + +// static +FilePath FilePath::FromASCII(StringPiece ascii) { + DCHECK(base::IsStringASCII(ascii)); + return FilePath(ASCIIToWide(ascii)); +} + +// static +FilePath FilePath::FromUTF8Unsafe(StringPiece utf8) { + return FilePath(UTF8ToWide(utf8)); +} + +// static +FilePath FilePath::FromUTF16Unsafe(StringPiece16 utf16) { + return FilePath(AsWStringPiece(utf16)); +} + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// See file_path.h for a discussion of the encoding of paths on POSIX +// platforms. These encoding conversion functions are not quite correct. + +std::u16string FilePath::LossyDisplayName() const { + return WideToUTF16(SysNativeMBToWide(path_)); +} + +std::string FilePath::MaybeAsASCII() const { + if (base::IsStringASCII(path_)) + return path_; + return std::string(); +} + +std::string FilePath::AsUTF8Unsafe() const { +#if defined(SYSTEM_NATIVE_UTF8) + return value(); +#else + return WideToUTF8(SysNativeMBToWide(value())); +#endif +} + +std::u16string FilePath::AsUTF16Unsafe() const { +#if defined(SYSTEM_NATIVE_UTF8) + return UTF8ToUTF16(value()); +#else + return WideToUTF16(SysNativeMBToWide(value())); +#endif +} + +// static +FilePath FilePath::FromASCII(StringPiece ascii) { + DCHECK(base::IsStringASCII(ascii)); + return FilePath(ascii); +} + +// static +FilePath FilePath::FromUTF8Unsafe(StringPiece utf8) { +#if defined(SYSTEM_NATIVE_UTF8) + return FilePath(utf8); +#else + return FilePath(SysWideToNativeMB(UTF8ToWide(utf8))); +#endif +} + +// static +FilePath FilePath::FromUTF16Unsafe(StringPiece16 utf16) { +#if defined(SYSTEM_NATIVE_UTF8) + return FilePath(UTF16ToUTF8(utf16)); +#else + return FilePath(SysWideToNativeMB(UTF16ToWide(utf16))); +#endif +} + +#endif // BUILDFLAG(IS_WIN) + +#if !defined(MOZ_ZUCCHINI) +void FilePath::WriteToPickle(Pickle* pickle) const { +#if BUILDFLAG(IS_WIN) + pickle->WriteString16(AsStringPiece16(path_)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + pickle->WriteString(path_); +#else +#error Unsupported platform +#endif +} + +bool FilePath::ReadFromPickle(PickleIterator* iter) { +#if BUILDFLAG(IS_WIN) + std::u16string path; + if (!iter->ReadString16(&path)) + return false; + path_ = UTF16ToWide(path); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + if (!iter->ReadString(&path_)) + return false; +#else +#error Unsupported platform +#endif + + if (path_.find(kStringTerminator) != StringType::npos) + return false; + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +#if BUILDFLAG(IS_WIN) +// Windows specific implementation of file string comparisons. + +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + // CharUpperW within user32 is used here because it will provide unicode + // conversions regardless of locale. The STL alternative, towupper, has a + // locale consideration that prevents it from converting all characters by + // default. + CHECK(win::IsUser32AndGdi32Available()); + // Perform character-wise upper case comparison rather than using the + // fully Unicode-aware CompareString(). For details see: + // http://blogs.msdn.com/michkap/archive/2005/10/17/481600.aspx + StringPieceType::const_iterator i1 = string1.begin(); + StringPieceType::const_iterator i2 = string2.begin(); + StringPieceType::const_iterator string1end = string1.end(); + StringPieceType::const_iterator string2end = string2.end(); + for ( ; i1 != string1end && i2 != string2end; ++i1, ++i2) { + wchar_t c1 = + (wchar_t)LOWORD(::CharUpperW((LPWSTR)(DWORD_PTR)MAKELONG(*i1, 0))); + wchar_t c2 = + (wchar_t)LOWORD(::CharUpperW((LPWSTR)(DWORD_PTR)MAKELONG(*i2, 0))); + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + } + if (i1 != string1end) + return 1; + if (i2 != string2end) + return -1; + return 0; +} + +#elif BUILDFLAG(IS_APPLE) +// Mac OS X specific implementation of file string comparisons. + +// cf. https://developer.apple.com/library/archive/technotes/tn/tn1150.html#UnicodeSubtleties +// +// "When using CreateTextEncoding to create a text encoding, you should set +// the TextEncodingBase to kTextEncodingUnicodeV2_0, set the +// TextEncodingVariant to kUnicodeCanonicalDecompVariant, and set the +// TextEncodingFormat to kUnicode16BitFormat. Using these values ensures that +// the Unicode will be in the same form as on an HFS Plus volume, even as the +// Unicode standard evolves." +// +// Another technical article for X 10.4 updates this: one should use +// the new (unambiguous) kUnicodeHFSPlusDecompVariant. +// cf. http://developer.apple.com/mac/library/releasenotes/TextFonts/RN-TEC/index.html +// +// This implementation uses CFStringGetFileSystemRepresentation() to get the +// decomposed form, and an adapted version of the FastUnicodeCompare as +// described in the tech note to compare the strings. + +// Character conversion table for FastUnicodeCompare() +// +// The lower case table consists of a 256-entry high-byte table followed by +// some number of 256-entry subtables. The high-byte table contains either an +// offset to the subtable for characters with that high byte or zero, which +// means that there are no case mappings or ignored characters in that block. +// Ignored characters are mapped to zero. +// +// cf. downloadable file linked in +// https://developer.apple.com/library/archive/technotes/tn/tn1150.html#Downloads + +namespace { + +// clang-format off +const UInt16 lower_case_table[11 * 256] = { + // High-byte indices ( == 0 iff no case mapping and no ignorables ) + + /* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 1 */ 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 2 */ 0x0700, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 7 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* A */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* B */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* C */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* D */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* E */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* F */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0A00, + + // Table 1 (for high byte 0x00) + + /* 0 */ 0xFFFF, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + /* 1 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + /* 2 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + /* 3 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + /* 4 */ 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + /* 5 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + /* 6 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + /* 7 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + /* 8 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + /* 9 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + /* A */ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + /* B */ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + /* C */ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00E6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + /* D */ 0x00F0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00F8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00FE, 0x00DF, + /* E */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + /* F */ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + + // Table 2 (for high byte 0x01) + + /* 0 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, + 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, + /* 1 */ 0x0111, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, + 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, + /* 2 */ 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0127, 0x0127, + 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, + /* 3 */ 0x0130, 0x0131, 0x0133, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, + 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x0140, + /* 4 */ 0x0140, 0x0142, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, + 0x0148, 0x0149, 0x014B, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, + /* 5 */ 0x0150, 0x0151, 0x0153, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, + 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, + /* 6 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0167, 0x0167, + 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, + /* 7 */ 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, + 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, + /* 8 */ 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, + 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, + /* 9 */ 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, + 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, + /* A */ 0x01A0, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A6, 0x01A8, + 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01AF, + /* B */ 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, + 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, + /* C */ 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, + 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC, 0x01CD, 0x01CE, 0x01CF, + /* D */ 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, + 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, + /* E */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E5, 0x01E5, 0x01E6, 0x01E7, + 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, + /* F */ 0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, + 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, + + // Table 3 (for high byte 0x03) + + /* 0 */ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, + /* 1 */ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, + /* 2 */ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, + /* 3 */ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, + /* 4 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, + /* 5 */ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, + /* 6 */ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, + /* 7 */ 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, + /* 8 */ 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, + 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, + /* 9 */ 0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + /* A */ 0x03C0, 0x03C1, 0x03A2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + /* B */ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + /* C */ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, + /* D */ 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, + 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, + /* E */ 0x03E0, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, + 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF, + /* F */ 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, + 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, + + // Table 4 (for high byte 0x04) + + /* 0 */ 0x0400, 0x0401, 0x0452, 0x0403, 0x0454, 0x0455, 0x0456, 0x0407, + 0x0458, 0x0459, 0x045A, 0x045B, 0x040C, 0x040D, 0x040E, 0x045F, + /* 1 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0419, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + /* 2 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + /* 3 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + /* 4 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + /* 5 */ 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045D, 0x045E, 0x045F, + /* 6 */ 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, + 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, + /* 7 */ 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0476, 0x0477, + 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, + /* 8 */ 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048A, 0x048B, 0x048C, 0x048D, 0x048E, 0x048F, + /* 9 */ 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, + 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, + /* A */ 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, + 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, + /* B */ 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, + 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, + /* C */ 0x04C0, 0x04C1, 0x04C2, 0x04C4, 0x04C4, 0x04C5, 0x04C6, 0x04C8, + 0x04C8, 0x04C9, 0x04CA, 0x04CC, 0x04CC, 0x04CD, 0x04CE, 0x04CF, + /* D */ 0x04D0, 0x04D1, 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, + 0x04D8, 0x04D9, 0x04DA, 0x04DB, 0x04DC, 0x04DD, 0x04DE, 0x04DF, + /* E */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7, + 0x04E8, 0x04E9, 0x04EA, 0x04EB, 0x04EC, 0x04ED, 0x04EE, 0x04EF, + /* F */ 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5, 0x04F6, 0x04F7, + 0x04F8, 0x04F9, 0x04FA, 0x04FB, 0x04FC, 0x04FD, 0x04FE, 0x04FF, + + // Table 5 (for high byte 0x05) + + /* 0 */ 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, + 0x0508, 0x0509, 0x050A, 0x050B, 0x050C, 0x050D, 0x050E, 0x050F, + /* 1 */ 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, + 0x0518, 0x0519, 0x051A, 0x051B, 0x051C, 0x051D, 0x051E, 0x051F, + /* 2 */ 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, + 0x0528, 0x0529, 0x052A, 0x052B, 0x052C, 0x052D, 0x052E, 0x052F, + /* 3 */ 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, + /* 4 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, + /* 5 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, + 0x0558, 0x0559, 0x055A, 0x055B, 0x055C, 0x055D, 0x055E, 0x055F, + /* 6 */ 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, + /* 7 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, + /* 8 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, + 0x0588, 0x0589, 0x058A, 0x058B, 0x058C, 0x058D, 0x058E, 0x058F, + /* 9 */ 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, + 0x0598, 0x0599, 0x059A, 0x059B, 0x059C, 0x059D, 0x059E, 0x059F, + /* A */ 0x05A0, 0x05A1, 0x05A2, 0x05A3, 0x05A4, 0x05A5, 0x05A6, 0x05A7, + 0x05A8, 0x05A9, 0x05AA, 0x05AB, 0x05AC, 0x05AD, 0x05AE, 0x05AF, + /* B */ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + /* C */ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05C4, 0x05C5, 0x05C6, 0x05C7, + 0x05C8, 0x05C9, 0x05CA, 0x05CB, 0x05CC, 0x05CD, 0x05CE, 0x05CF, + /* D */ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + /* E */ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x05EB, 0x05EC, 0x05ED, 0x05EE, 0x05EF, + /* F */ 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x05F5, 0x05F6, 0x05F7, + 0x05F8, 0x05F9, 0x05FA, 0x05FB, 0x05FC, 0x05FD, 0x05FE, 0x05FF, + + // Table 6 (for high byte 0x10) + + /* 0 */ 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, + 0x1008, 0x1009, 0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F, + /* 1 */ 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, + 0x1018, 0x1019, 0x101A, 0x101B, 0x101C, 0x101D, 0x101E, 0x101F, + /* 2 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, + 0x1028, 0x1029, 0x102A, 0x102B, 0x102C, 0x102D, 0x102E, 0x102F, + /* 3 */ 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, + 0x1038, 0x1039, 0x103A, 0x103B, 0x103C, 0x103D, 0x103E, 0x103F, + /* 4 */ 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, + 0x1048, 0x1049, 0x104A, 0x104B, 0x104C, 0x104D, 0x104E, 0x104F, + /* 5 */ 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, + 0x1058, 0x1059, 0x105A, 0x105B, 0x105C, 0x105D, 0x105E, 0x105F, + /* 6 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, + 0x1068, 0x1069, 0x106A, 0x106B, 0x106C, 0x106D, 0x106E, 0x106F, + /* 7 */ 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, + 0x1078, 0x1079, 0x107A, 0x107B, 0x107C, 0x107D, 0x107E, 0x107F, + /* 8 */ 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, + 0x1088, 0x1089, 0x108A, 0x108B, 0x108C, 0x108D, 0x108E, 0x108F, + /* 9 */ 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, + 0x1098, 0x1099, 0x109A, 0x109B, 0x109C, 0x109D, 0x109E, 0x109F, + /* A */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, + 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, + /* B */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, + 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, + /* C */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10C6, 0x10C7, + 0x10C8, 0x10C9, 0x10CA, 0x10CB, 0x10CC, 0x10CD, 0x10CE, 0x10CF, + /* D */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, + 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, + /* E */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, + 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, + /* F */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10F6, 0x10F7, + 0x10F8, 0x10F9, 0x10FA, 0x10FB, 0x10FC, 0x10FD, 0x10FE, 0x10FF, + + // Table 7 (for high byte 0x20) + + /* 0 */ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, + 0x2008, 0x2009, 0x200A, 0x200B, 0x0000, 0x0000, 0x0000, 0x0000, + /* 1 */ 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, + 0x2018, 0x2019, 0x201A, 0x201B, 0x201C, 0x201D, 0x201E, 0x201F, + /* 2 */ 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, + 0x2028, 0x2029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202F, + /* 3 */ 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, + 0x2038, 0x2039, 0x203A, 0x203B, 0x203C, 0x203D, 0x203E, 0x203F, + /* 4 */ 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, + 0x2048, 0x2049, 0x204A, 0x204B, 0x204C, 0x204D, 0x204E, 0x204F, + /* 5 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, + 0x2058, 0x2059, 0x205A, 0x205B, 0x205C, 0x205D, 0x205E, 0x205F, + /* 6 */ 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, + 0x2068, 0x2069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 7 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, + 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, + /* 8 */ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, + 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x208F, + /* 9 */ 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, + 0x2098, 0x2099, 0x209A, 0x209B, 0x209C, 0x209D, 0x209E, 0x209F, + /* A */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, + 0x20A8, 0x20A9, 0x20AA, 0x20AB, 0x20AC, 0x20AD, 0x20AE, 0x20AF, + /* B */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7, + 0x20B8, 0x20B9, 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE, 0x20BF, + /* C */ 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5, 0x20C6, 0x20C7, + 0x20C8, 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD, 0x20CE, 0x20CF, + /* D */ 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, + 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20DD, 0x20DE, 0x20DF, + /* E */ 0x20E0, 0x20E1, 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, + 0x20E8, 0x20E9, 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 0x20EF, + /* F */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7, + 0x20F8, 0x20F9, 0x20FA, 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF, + + // Table 8 (for high byte 0x21) + + /* 0 */ 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, + 0x2108, 0x2109, 0x210A, 0x210B, 0x210C, 0x210D, 0x210E, 0x210F, + /* 1 */ 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, + 0x2118, 0x2119, 0x211A, 0x211B, 0x211C, 0x211D, 0x211E, 0x211F, + /* 2 */ 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, + 0x2128, 0x2129, 0x212A, 0x212B, 0x212C, 0x212D, 0x212E, 0x212F, + /* 3 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2138, 0x2139, 0x213A, 0x213B, 0x213C, 0x213D, 0x213E, 0x213F, + /* 4 */ 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, + 0x2148, 0x2149, 0x214A, 0x214B, 0x214C, 0x214D, 0x214E, 0x214F, + /* 5 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215A, 0x215B, 0x215C, 0x215D, 0x215E, 0x215F, + /* 6 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, + /* 7 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, + /* 8 */ 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, + 0x2188, 0x2189, 0x218A, 0x218B, 0x218C, 0x218D, 0x218E, 0x218F, + /* 9 */ 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, + 0x2198, 0x2199, 0x219A, 0x219B, 0x219C, 0x219D, 0x219E, 0x219F, + /* A */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, + 0x21A8, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, 0x21AF, + /* B */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, + 0x21B8, 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, 0x21BE, 0x21BF, + /* C */ 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, + 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, 0x21CD, 0x21CE, 0x21CF, + /* D */ 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, 0x21D7, + 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21DE, 0x21DF, + /* E */ 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, + 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF, + /* F */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, + 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, 0x21FF, + + // Table 9 (for high byte 0xFE) + + /* 0 */ 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, + 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, + /* 1 */ 0xFE10, 0xFE11, 0xFE12, 0xFE13, 0xFE14, 0xFE15, 0xFE16, 0xFE17, + 0xFE18, 0xFE19, 0xFE1A, 0xFE1B, 0xFE1C, 0xFE1D, 0xFE1E, 0xFE1F, + /* 2 */ 0xFE20, 0xFE21, 0xFE22, 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, + 0xFE28, 0xFE29, 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, + /* 3 */ 0xFE30, 0xFE31, 0xFE32, 0xFE33, 0xFE34, 0xFE35, 0xFE36, 0xFE37, + 0xFE38, 0xFE39, 0xFE3A, 0xFE3B, 0xFE3C, 0xFE3D, 0xFE3E, 0xFE3F, + /* 4 */ 0xFE40, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE45, 0xFE46, 0xFE47, + 0xFE48, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, + /* 5 */ 0xFE50, 0xFE51, 0xFE52, 0xFE53, 0xFE54, 0xFE55, 0xFE56, 0xFE57, + 0xFE58, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, + /* 6 */ 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE67, + 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F, + /* 7 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE75, 0xFE76, 0xFE77, + 0xFE78, 0xFE79, 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, + /* 8 */ 0xFE80, 0xFE81, 0xFE82, 0xFE83, 0xFE84, 0xFE85, 0xFE86, 0xFE87, + 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D, 0xFE8E, 0xFE8F, + /* 9 */ 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97, + 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E, 0xFE9F, + /* A */ 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7, + 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, + /* B */ 0xFEB0, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, + 0xFEB8, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, + /* C */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, + 0xFEC8, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE, 0xFECF, + /* D */ 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4, 0xFED5, 0xFED6, 0xFED7, + 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, 0xFEDE, 0xFEDF, + /* E */ 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7, + 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF, + /* F */ 0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, + 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0xFEFD, 0xFEFE, 0x0000, + + // Table 10 (for high byte 0xFF) + + /* 0 */ 0xFF00, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + /* 1 */ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + /* 2 */ 0xFF20, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + /* 3 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + /* 4 */ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + /* 5 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0xFF5F, + /* 6 */ 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, + 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, + /* 7 */ 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, + 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, + /* 8 */ 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, + 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, + /* 9 */ 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, + 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, + /* A */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6, 0xFFA7, + 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, + /* B */ 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, + 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, 0xFFBE, 0xFFBF, + /* C */ 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, + 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF, + /* D */ 0xFFD0, 0xFFD1, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7, + 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, + /* E */ 0xFFE0, 0xFFE1, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, + 0xFFE8, 0xFFE9, 0xFFEA, 0xFFEB, 0xFFEC, 0xFFED, 0xFFEE, 0xFFEF, + /* F */ 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3, 0xFFF4, 0xFFF5, 0xFFF6, 0xFFF7, + 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, +}; +// clang-format on + +// Returns the next non-ignorable codepoint within `string` starting from the +// position indicated by `index`, or zero if there are no more. +// The passed-in `index` is automatically advanced as the characters in the +// input HFS-decomposed UTF-8 strings are read. +inline base_icu::UChar32 HFSReadNextNonIgnorableCodepoint(const char* string, + size_t length, + size_t* index) { + base_icu::UChar32 codepoint = 0; + while (*index < length && codepoint == 0) { + // CBU8_NEXT returns a value < 0 in error cases. For purposes of string + // comparison, we just use that value and flag it with DCHECK. + CBU8_NEXT(reinterpret_cast(string), *index, length, + codepoint); + DCHECK_GT(codepoint, 0); + + // Note: Here, there are no lower case conversion implemented in the + // Supplementary Multilingual Plane (codepoint > 0xFFFF). + + if (codepoint > 0 && codepoint <= 0xFFFF) { + // Check if there is a subtable for this upper byte. + int lookup_offset = lower_case_table[codepoint >> 8]; + if (lookup_offset != 0) + codepoint = lower_case_table[lookup_offset + (codepoint & 0x00FF)]; + // Note: `codepoint` may be again 0 at this point if the character was + // an ignorable. + } + } + return codepoint; +} + +} // namespace + +// Special UTF-8 version of FastUnicodeCompare. Cf: +// http://developer.apple.com/mac/library/technotes/tn/tn1150.html#StringComparisonAlgorithm +// The input strings must be in the special HFS decomposed form. +int FilePath::HFSFastUnicodeCompare(StringPieceType string1, + StringPieceType string2) { + size_t length1 = string1.length(); + size_t length2 = string2.length(); + size_t index1 = 0; + size_t index2 = 0; + + for (;;) { + base_icu::UChar32 codepoint1 = + HFSReadNextNonIgnorableCodepoint(string1.data(), length1, &index1); + base_icu::UChar32 codepoint2 = + HFSReadNextNonIgnorableCodepoint(string2.data(), length2, &index2); + if (codepoint1 != codepoint2) + return (codepoint1 < codepoint2) ? -1 : 1; + if (codepoint1 == 0) { + DCHECK_EQ(index1, length1); + DCHECK_EQ(index2, length2); + return 0; + } + } +} + +StringType FilePath::GetHFSDecomposedForm(StringPieceType string) { + StringType result; + ScopedCFTypeRef cfstring(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string.data()), + checked_cast(string.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + if (cfstring) { + // Query the maximum length needed to store the result. In most cases this + // will overestimate the required space. The return value also already + // includes the space needed for a terminating 0. + CFIndex length = CFStringGetMaximumSizeOfFileSystemRepresentation(cfstring); + DCHECK_GT(length, 0); // should be at least 1 for the 0-terminator. + // Reserve enough space for CFStringGetFileSystemRepresentation to write + // into. Also set the length to the maximum so that we can shrink it later. + // (Increasing rather than decreasing it would clobber the string contents!) + result.reserve(static_cast(length)); + result.resize(static_cast(length) - 1); + Boolean success = CFStringGetFileSystemRepresentation(cfstring, + &result[0], + length); + if (success) { + // Reduce result.length() to actual string length. + result.resize(strlen(result.c_str())); + } else { + // An error occurred -> clear result. + result.clear(); + } + } + return result; +} + +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + // Quick checks for empty strings - these speed things up a bit and make the + // following code cleaner. + if (string1.empty()) + return string2.empty() ? 0 : -1; + if (string2.empty()) + return 1; + + StringType hfs1 = GetHFSDecomposedForm(string1); + StringType hfs2 = GetHFSDecomposedForm(string2); + + // GetHFSDecomposedForm() returns an empty string in an error case. + if (hfs1.empty() || hfs2.empty()) { + ScopedCFTypeRef cfstring1(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string1.data()), + checked_cast(string1.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + ScopedCFTypeRef cfstring2(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string2.data()), + checked_cast(string2.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + // If neither GetHFSDecomposedForm nor CFStringCreateWithBytesNoCopy + // succeed, fall back to strcmp. This can occur when the input string is + // invalid UTF-8. + if (!cfstring1 || !cfstring2) { + int comparison = memcmp(string1.data(), string2.data(), + std::min(string1.length(), string2.length())); + if (comparison < 0) + return -1; + if (comparison > 0) + return 1; + return 0; + } + + return static_cast( + CFStringCompare(cfstring1, cfstring2, kCFCompareCaseInsensitive)); + } + + return HFSFastUnicodeCompare(hfs1, hfs2); +} + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Generic Posix system comparisons. +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + size_t rlen = std::min(string1.size(), string2.size()); + int comparison = strncasecmp(string1.data(), string2.data(), rlen); + if (comparison < 0 || (comparison == 0 && string1.size() < string2.size())) + return -1; + if (comparison > 0 || (comparison == 0 && string1.size() > string2.size())) + return 1; + return 0; +} + +#endif // OS versions of CompareIgnoreCase() + + +void FilePath::StripTrailingSeparatorsInternal() { + // If there is no drive letter, start will be 1, which will prevent stripping + // the leading separator if there is only one separator. If there is a drive + // letter, start will be set appropriately to prevent stripping the first + // separator following the drive letter, if a separator immediately follows + // the drive letter. + StringType::size_type start = FindDriveLetter(path_) + 2; + + StringType::size_type last_stripped = StringType::npos; + for (StringType::size_type pos = path_.length(); + pos > start && IsSeparator(path_[pos - 1]); + --pos) { + // If the string only has two separators and they're at the beginning, + // don't strip them, unless the string began with more than two separators. + if (pos != start + 1 || last_stripped == start + 2 || + !IsSeparator(path_[start - 1])) { + path_.resize(pos - 1); + last_stripped = pos; + } + } +} + +FilePath FilePath::NormalizePathSeparators() const { + return NormalizePathSeparatorsTo(kSeparators[0]); +} + +void FilePath::WriteIntoTrace(perfetto::TracedValue context) const { + perfetto::WriteIntoTracedValue(std::move(context), value()); +} + +FilePath FilePath::NormalizePathSeparatorsTo(CharType separator) const { +#if defined(FILE_PATH_USES_WIN_SEPARATORS) + DCHECK_NE(kSeparators + kSeparatorsLength, + std::find(kSeparators, kSeparators + kSeparatorsLength, separator)); + StringType copy = path_; + for (size_t i = 0; i < kSeparatorsLength; ++i) { + std::replace(copy.begin(), copy.end(), kSeparators[i], separator); + } + return FilePath(copy); +#else + return *this; +#endif +} + +#if BUILDFLAG(IS_ANDROID) +bool FilePath::IsContentUri() const { + return StartsWith(path_, "content://", base::CompareCase::INSENSITIVE_ASCII); +} +#endif + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,532 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// FilePath is a container for pathnames stored in a platform's native string +// type, providing containers for manipulation in according with the +// platform's conventions for pathnames. It supports the following path +// types: +// +// POSIX Windows +// --------------- ---------------------------------- +// Fundamental type char[] wchar_t[] +// Encoding unspecified* UTF-16 +// Separator / \, tolerant of / +// Drive letters no case-insensitive A-Z followed by : +// Alternate root // (surprise!) \\ (2 Separators), for UNC paths +// +// * The encoding need not be specified on POSIX systems, although some +// POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. +// Chrome OS also uses UTF-8. +// Linux does not specify an encoding, but in practice, the locale's +// character set may be used. +// +// For more arcane bits of path trivia, see below. +// +// FilePath objects are intended to be used anywhere paths are. An +// application may pass FilePath objects around internally, masking the +// underlying differences between systems, only differing in implementation +// where interfacing directly with the system. For example, a single +// OpenFile(const FilePath &) function may be made available, allowing all +// callers to operate without regard to the underlying implementation. On +// POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might +// wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This +// allows each platform to pass pathnames around without requiring conversions +// between encodings, which has an impact on performance, but more imporantly, +// has an impact on correctness on platforms that do not have well-defined +// encodings for pathnames. +// +// Several methods are available to perform common operations on a FilePath +// object, such as determining the parent directory (DirName), isolating the +// final path component (BaseName), and appending a relative pathname string +// to an existing FilePath object (Append). These methods are highly +// recommended over attempting to split and concatenate strings directly. +// These methods are based purely on string manipulation and knowledge of +// platform-specific pathname conventions, and do not consult the filesystem +// at all, making them safe to use without fear of blocking on I/O operations. +// These methods do not function as mutators but instead return distinct +// instances of FilePath objects, and are therefore safe to use on const +// objects. The objects themselves are safe to share between threads. +// +// To aid in initialization of FilePath objects from string literals, a +// FILE_PATH_LITERAL macro is provided, which accounts for the difference +// between char[]-based pathnames on POSIX systems and wchar_t[]-based +// pathnames on Windows. +// +// As a precaution against premature truncation, paths can't contain NULs. +// +// Because a FilePath object should not be instantiated at the global scope, +// instead, use a FilePath::CharType[] and initialize it with +// FILE_PATH_LITERAL. At runtime, a FilePath object can be created from the +// character array. Example: +// +// | const FilePath::CharType kLogFileName[] = FILE_PATH_LITERAL("log.txt"); +// | +// | void Function() { +// | FilePath log_file_path(kLogFileName); +// | [...] +// | } +// +// WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even +// when the UI language is RTL. This means you always need to pass filepaths +// through base::i18n::WrapPathWithLTRFormatting() before displaying it in the +// RTL UI. +// +// This is a very common source of bugs, please try to keep this in mind. +// +// ARCANE BITS OF PATH TRIVIA +// +// - A double leading slash is actually part of the POSIX standard. Systems +// are allowed to treat // as an alternate root, as Windows does for UNC +// (network share) paths. Most POSIX systems don't do anything special +// with two leading slashes, but FilePath handles this case properly +// in case it ever comes across such a system. FilePath needs this support +// for Windows UNC paths, anyway. +// References: +// The Open Group Base Specifications Issue 7, sections 3.267 ("Pathname") +// and 4.12 ("Pathname Resolution"), available at: +// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_267 +// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_12 +// +// - Windows treats c:\\ the same way it treats \\. This was intended to +// allow older applications that require drive letters to support UNC paths +// like \\server\share\path, by permitting c:\\server\share\path as an +// equivalent. Since the OS treats these paths specially, FilePath needs +// to do the same. Since Windows can use either / or \ as the separator, +// FilePath treats c://, c:\\, //, and \\ all equivalently. +// Reference: +// The Old New Thing, "Why is a drive letter permitted in front of UNC +// paths (sometimes)?", available at: +// http://blogs.msdn.com/oldnewthing/archive/2005/11/22/495740.aspx + +#ifndef BASE_FILES_FILE_PATH_H_ +#define BASE_FILES_FILE_PATH_H_ + +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/strings/string_piece.h" +#include "base/trace_event/base_tracing_forward.h" +#include "build/build_config.h" + +// Windows-style drive letter support and pathname separator characters can be +// enabled and disabled independently, to aid testing. These #defines are +// here so that the same setting can be used in both the implementation and +// in the unit test. +#if BUILDFLAG(IS_WIN) +#define FILE_PATH_USES_DRIVE_LETTERS +#define FILE_PATH_USES_WIN_SEPARATORS +#endif // BUILDFLAG(IS_WIN) + +// To print path names portably use PRFilePath (based on PRIuS and friends from +// C99 and format_macros.h) like this: +// base::StringPrintf("Path is %" PRFilePath ".\n", path.value().c_str()); +#if BUILDFLAG(IS_WIN) +#define PRFilePath "ls" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define PRFilePath "s" +#endif // BUILDFLAG(IS_WIN) + +// Macros for string literal initialization of FilePath::CharType[]. +#if BUILDFLAG(IS_WIN) + +// The `FILE_PATH_LITERAL_INTERNAL` indirection allows `FILE_PATH_LITERAL` to +// work correctly with macro parameters, for example +// `FILE_PATH_LITERAL(TEST_FILE)` where `TEST_FILE` is a macro #defined as +// "TestFile". +#define FILE_PATH_LITERAL_INTERNAL(x) L##x +#define FILE_PATH_LITERAL(x) FILE_PATH_LITERAL_INTERNAL(x) + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define FILE_PATH_LITERAL(x) x +#endif // BUILDFLAG(IS_WIN) + +namespace base { + +class SafeBaseName; +class Pickle; +class PickleIterator; + +// An abstraction to isolate users from the differences between native +// pathnames on different platforms. +class BASE_EXPORT FilePath { + public: +#if BUILDFLAG(IS_WIN) + // On Windows, for Unicode-aware applications, native pathnames are wchar_t + // arrays encoded in UTF-16. + typedef std::wstring StringType; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // On most platforms, native pathnames are char arrays, and the encoding + // may or may not be specified. On Mac OS X, native pathnames are encoded + // in UTF-8. + typedef std::string StringType; +#endif // BUILDFLAG(IS_WIN) + + typedef StringType::value_type CharType; + typedef BasicStringPiece StringPieceType; + + // Null-terminated array of separators used to separate components in paths. + // Each character in this array is a valid separator, but kSeparators[0] is + // treated as the canonical separator and is used when composing pathnames. + static constexpr CharType kSeparators[] = +#if defined(FILE_PATH_USES_WIN_SEPARATORS) + FILE_PATH_LITERAL("\\/"); +#else // FILE_PATH_USES_WIN_SEPARATORS + FILE_PATH_LITERAL("/"); +#endif // FILE_PATH_USES_WIN_SEPARATORS + + // std::size(kSeparators), i.e., the number of separators in kSeparators plus + // one (the null terminator at the end of kSeparators). + static constexpr size_t kSeparatorsLength = std::size(kSeparators); + + // The special path component meaning "this directory." + static constexpr CharType kCurrentDirectory[] = FILE_PATH_LITERAL("."); + + // The special path component meaning "the parent directory." + static constexpr CharType kParentDirectory[] = FILE_PATH_LITERAL(".."); + + // The character used to identify a file extension. + static constexpr CharType kExtensionSeparator = FILE_PATH_LITERAL('.'); + + FilePath(); + FilePath(const FilePath& that); + explicit FilePath(StringPieceType path); + ~FilePath(); + FilePath& operator=(const FilePath& that); + + // Constructs FilePath with the contents of |that|, which is left in valid but + // unspecified state. + FilePath(FilePath&& that) noexcept; + // Replaces the contents with those of |that|, which is left in valid but + // unspecified state. +#if !defined(MOZ_ZUCCHINI) + FilePath& operator=(FilePath&& that) noexcept; +#else + FilePath& operator=(FilePath&& that); +#endif // !defined(MOZ_ZUCCHINI) + + bool operator==(const FilePath& that) const; + + bool operator!=(const FilePath& that) const; + + // Required for some STL containers and operations + bool operator<(const FilePath& that) const { + return path_ < that.path_; + } + + const StringType& value() const { return path_; } + + [[nodiscard]] bool empty() const { return path_.empty(); } + + void clear() { path_.clear(); } + + // Returns true if |character| is in kSeparators. + static bool IsSeparator(CharType character); + + // Returns a vector of all of the components of the provided path. It is + // equivalent to calling DirName().value() on the path's root component, + // and BaseName().value() on each child component. + // + // To make sure this is lossless so we can differentiate absolute and + // relative paths, the root slash will be included even though no other + // slashes will be. The precise behavior is: + // + // Posix: "/foo/bar" -> [ "/", "foo", "bar" ] + // Windows: "C:\foo\bar" -> [ "C:", "\\", "foo", "bar" ] + std::vector GetComponents() const; + + // Returns true if this FilePath is a parent or ancestor of the |child|. + // Absolute and relative paths are accepted i.e. /foo is a parent to /foo/bar, + // and foo is a parent to foo/bar. Any ancestor is considered a parent i.e. /a + // is a parent to both /a/b and /a/b/c. Does not convert paths to absolute, + // follow symlinks or directory navigation (e.g. ".."). A path is *NOT* its + // own parent. + bool IsParent(const FilePath& child) const; + + // If IsParent(child) holds, appends to path (if non-NULL) the + // relative path to child and returns true. For example, if parent + // holds "/Users/johndoe/Library/Application Support", child holds + // "/Users/johndoe/Library/Application Support/Google/Chrome/Default", and + // *path holds "/Users/johndoe/Library/Caches", then after + // parent.AppendRelativePath(child, path) is called *path will hold + // "/Users/johndoe/Library/Caches/Google/Chrome/Default". Otherwise, + // returns false. + bool AppendRelativePath(const FilePath& child, FilePath* path) const; + + // Returns a FilePath corresponding to the directory containing the path + // named by this object, stripping away the file component. If this object + // only contains one component, returns a FilePath identifying + // kCurrentDirectory. If this object already refers to the root directory, + // returns a FilePath identifying the root directory. Please note that this + // doesn't resolve directory navigation, e.g. the result for "../a" is "..". + [[nodiscard]] FilePath DirName() const; + + // Returns a FilePath corresponding to the last path component of this + // object, either a file or a directory. If this object already refers to + // the root directory, returns a FilePath identifying the root directory; + // this is the only situation in which BaseName will return an absolute path. + [[nodiscard]] FilePath BaseName() const; + + // Returns the extension of a file path. This method works very similarly to + // FinalExtension(), except when the file path ends with a common + // double-extension. For common double-extensions like ".tar.gz" and + // ".user.js", this method returns the combined extension. + // + // Common means that detecting double-extensions is based on a hard-coded + // allow-list (including but not limited to ".*.gz" and ".user.js") and isn't + // solely dependent on the number of dots. Specifically, even if somebody + // invents a new Blah compression algorithm: + // - calling this function with "foo.tar.bz2" will return ".tar.bz2", but + // - calling this function with "foo.tar.blah" will return just ".blah" + // until ".*.blah" is added to the hard-coded allow-list. + // + // That hard-coded allow-list is case-insensitive: ".GZ" and ".gz" are + // equivalent. However, the StringType returned is not canonicalized for + // case: "foo.TAR.bz2" input will produce ".TAR.bz2", not ".tar.bz2", and + // "bar.EXT", which is not a double-extension, will produce ".EXT". + // + // The following code should always work regardless of the value of path. + // new_path = path.RemoveExtension().value().append(path.Extension()); + // ASSERT(new_path == path.value()); + // + // NOTE: this is different from the original file_util implementation which + // returned the extension without a leading "." ("jpg" instead of ".jpg"). + [[nodiscard]] StringType Extension() const; + + // Returns the final extension of a file path, or an empty string if the file + // path has no extension. In most cases, the final extension of a file path + // refers to the part of the file path from the last dot to the end (including + // the dot itself). For example, this method applied to "/pics/jojo.jpg" + // and "/pics/jojo." returns ".jpg" and ".", respectively. However, if the + // base name of the file path is either "." or "..", this method returns an + // empty string. + // + // TODO(davidben): Check all our extension-sensitive code to see if + // we can rename this to Extension() and the other to something like + // LongExtension(), defaulting to short extensions and leaving the + // long "extensions" to logic like base::GetUniquePathNumber(). + [[nodiscard]] StringType FinalExtension() const; + + // Returns "C:\pics\jojo" for path "C:\pics\jojo.jpg" + // NOTE: this is slightly different from the similar file_util implementation + // which returned simply 'jojo'. + [[nodiscard]] FilePath RemoveExtension() const; + + // Removes the path's file extension, as in RemoveExtension(), but + // ignores double extensions. + [[nodiscard]] FilePath RemoveFinalExtension() const; + + // Inserts |suffix| after the file name portion of |path| but before the + // extension. Returns "" if BaseName() == "." or "..". + // Examples: + // path == "C:\pics\jojo.jpg" suffix == " (1)", returns "C:\pics\jojo (1).jpg" + // path == "jojo.jpg" suffix == " (1)", returns "jojo (1).jpg" + // path == "C:\pics\jojo" suffix == " (1)", returns "C:\pics\jojo (1)" + // path == "C:\pics.old\jojo" suffix == " (1)", returns "C:\pics.old\jojo (1)" + [[nodiscard]] FilePath InsertBeforeExtension(StringPieceType suffix) const; + [[nodiscard]] FilePath InsertBeforeExtensionASCII(StringPiece suffix) const; + + // Adds |extension| to |file_name|. Returns the current FilePath if + // |extension| is empty. Returns "" if BaseName() == "." or "..". + [[nodiscard]] FilePath AddExtension(StringPieceType extension) const; + + // Like above, but takes the extension as an ASCII string. See AppendASCII for + // details on how this is handled. + [[nodiscard]] FilePath AddExtensionASCII(StringPiece extension) const; + + // Replaces the extension of |file_name| with |extension|. If |file_name| + // does not have an extension, then |extension| is added. If |extension| is + // empty, then the extension is removed from |file_name|. + // Returns "" if BaseName() == "." or "..". + [[nodiscard]] FilePath ReplaceExtension(StringPieceType extension) const; + + // Returns true if file path's Extension() matches `extension`. The test is + // case insensitive. Don't forget the leading period if appropriate. + bool MatchesExtension(StringPieceType extension) const; + + // Returns true if file path's FinalExtension() matches `extension`. The + // test is case insensitive. Don't forget the leading period if appropriate. + bool MatchesFinalExtension(StringPieceType extension) const; + + // Returns a FilePath by appending a separator and the supplied path + // component to this object's path. Append takes care to avoid adding + // excessive separators if this object's path already ends with a separator. + // If this object's path is kCurrentDirectory ('.'), a new FilePath + // corresponding only to |component| is returned. |component| must be a + // relative path; it is an error to pass an absolute path. + [[nodiscard]] FilePath Append(StringPieceType component) const; + [[nodiscard]] FilePath Append(const FilePath& component) const; + [[nodiscard]] FilePath Append(const SafeBaseName& component) const; + + // Although Windows StringType is std::wstring, since the encoding it uses for + // paths is well defined, it can handle ASCII path components as well. + // Mac uses UTF8, and since ASCII is a subset of that, it works there as well. + // On Linux, although it can use any 8-bit encoding for paths, we assume that + // ASCII is a valid subset, regardless of the encoding, since many operating + // system paths will always be ASCII. + [[nodiscard]] FilePath AppendASCII(StringPiece component) const; + + // Returns true if this FilePath contains an absolute path. On Windows, an + // absolute path begins with either a drive letter specification followed by + // a separator character, or with two separator characters. On POSIX + // platforms, an absolute path begins with a separator character. + bool IsAbsolute() const; + + // Returns true if this FilePath is a network path which starts with 2 path + // separators. See class documentation for 'Alternate root'. + bool IsNetwork() const; + + // Returns true if the patch ends with a path separator character. + [[nodiscard]] bool EndsWithSeparator() const; + + // Returns a copy of this FilePath that ends with a trailing separator. If + // the input path is empty, an empty FilePath will be returned. + [[nodiscard]] FilePath AsEndingWithSeparator() const; + + // Returns a copy of this FilePath that does not end with a trailing + // separator. + [[nodiscard]] FilePath StripTrailingSeparators() const; + + // Returns true if this FilePath contains an attempt to reference a parent + // directory (e.g. has a path component that is ".."). + bool ReferencesParent() const; + + // Return a Unicode human-readable version of this path. + // Warning: you can *not*, in general, go from a display name back to a real + // path. Only use this when displaying paths to users, not just when you + // want to stuff a std::u16string into some other API. + std::u16string LossyDisplayName() const; + + // Return the path as ASCII, or the empty string if the path is not ASCII. + // This should only be used for cases where the FilePath is representing a + // known-ASCII filename. + std::string MaybeAsASCII() const; + + // Return the path as UTF-8. + // + // This function is *unsafe* as there is no way to tell what encoding is + // used in file names on POSIX systems other than Mac and Chrome OS, + // although UTF-8 is practically used everywhere these days. To mitigate + // the encoding issue, this function internally calls + // SysNativeMBToWide() on POSIX systems other than Mac and Chrome OS, + // per assumption that the current locale's encoding is used in file + // names, but this isn't a perfect solution. + // + // Once it becomes safe to to stop caring about non-UTF-8 file names, + // the SysNativeMBToWide() hack will be removed from the code, along + // with "Unsafe" in the function name. + std::string AsUTF8Unsafe() const; + + // Similar to AsUTF8Unsafe, but returns UTF-16 instead. + std::u16string AsUTF16Unsafe() const; + + // Returns a FilePath object from a path name in ASCII. + static FilePath FromASCII(StringPiece ascii); + + // Returns a FilePath object from a path name in UTF-8. This function + // should only be used for cases where you are sure that the input + // string is UTF-8. + // + // Like AsUTF8Unsafe(), this function is unsafe. This function + // internally calls SysWideToNativeMB() on POSIX systems other than Mac + // and Chrome OS, to mitigate the encoding issue. See the comment at + // AsUTF8Unsafe() for details. + static FilePath FromUTF8Unsafe(StringPiece utf8); + + // Similar to FromUTF8Unsafe, but accepts UTF-16 instead. + static FilePath FromUTF16Unsafe(StringPiece16 utf16); + + void WriteToPickle(Pickle* pickle) const; + bool ReadFromPickle(PickleIterator* iter); + + // Normalize all path separators to backslash on Windows + // (if FILE_PATH_USES_WIN_SEPARATORS is true), or do nothing on POSIX systems. + [[nodiscard]] FilePath NormalizePathSeparators() const; + + // Normalize all path separattors to given type on Windows + // (if FILE_PATH_USES_WIN_SEPARATORS is true), or do nothing on POSIX systems. + [[nodiscard]] FilePath NormalizePathSeparatorsTo(CharType separator) const; + + // Compare two strings in the same way the file system does. + // Note that these always ignore case, even on file systems that are case- + // sensitive. If case-sensitive comparison is ever needed, add corresponding + // methods here. + // The methods are written as a static method so that they can also be used + // on parts of a file path, e.g., just the extension. + // CompareIgnoreCase() returns -1, 0 or 1 for less-than, equal-to and + // greater-than respectively. + static int CompareIgnoreCase(StringPieceType string1, + StringPieceType string2); + static bool CompareEqualIgnoreCase(StringPieceType string1, + StringPieceType string2) { + return CompareIgnoreCase(string1, string2) == 0; + } + static bool CompareLessIgnoreCase(StringPieceType string1, + StringPieceType string2) { + return CompareIgnoreCase(string1, string2) < 0; + } + + // Serialise this object into a trace. + void WriteIntoTrace(perfetto::TracedValue context) const; + +#if BUILDFLAG(IS_APPLE) + // Returns the string in the special canonical decomposed form as defined for + // HFS, which is close to, but not quite, decomposition form D. See + // http://developer.apple.com/mac/library/technotes/tn/tn1150.html#UnicodeSubtleties + // for further comments. + // Returns the epmty string if the conversion failed. + static StringType GetHFSDecomposedForm(StringPieceType string); + + // Special UTF-8 version of FastUnicodeCompare. Cf: + // http://developer.apple.com/mac/library/technotes/tn/tn1150.html#StringComparisonAlgorithm + // IMPORTANT: The input strings must be in the special HFS decomposed form! + // (cf. above GetHFSDecomposedForm method) + static int HFSFastUnicodeCompare(StringPieceType string1, + StringPieceType string2); +#endif + +#if BUILDFLAG(IS_ANDROID) + // On android, file selection dialog can return a file with content uri + // scheme(starting with content://). Content uri needs to be opened with + // ContentResolver to guarantee that the app has appropriate permissions + // to access it. + // Returns true if the path is a content uri, or false otherwise. + bool IsContentUri() const; +#endif + + // NOTE: When adding a new public method, consider adding it to + // file_path_fuzzer.cc as well. + + private: + // Remove trailing separators from this object. If the path is absolute, it + // will never be stripped any more than to refer to the absolute root + // directory, so "////" will become "/", not "". A leading pair of + // separators is never stripped, to support alternate roots. This is used to + // support UNC paths on Windows. + void StripTrailingSeparatorsInternal(); + + StringType path_; +}; + +BASE_EXPORT std::ostream& operator<<(std::ostream& out, + const FilePath& file_path); + +} // namespace base + +namespace std { + +template <> +struct hash { + typedef base::FilePath argument_type; + typedef std::size_t result_type; + result_type operator()(argument_type const& f) const { + return hash()(f.value()); + } +}; + +} // namespace std + +#endif // BASE_FILES_FILE_PATH_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_posix.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,625 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +// The only 32-bit platform that uses this file is Android. On Android APIs +// >= 21, this standard define is the right way to express that you want a +// 64-bit offset in struct stat, and the stat64 struct and functions aren't +// useful. +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include + +static_assert(sizeof(base::stat_wrapper_t::st_size) >= 8); + +#include "base/check_op.h" +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +#if BUILDFLAG(IS_ANDROID) +#include "base/os_compat_android.h" +#endif + +namespace base { + +// Make sure our Whence mappings match the system headers. +static_assert(File::FROM_BEGIN == SEEK_SET && File::FROM_CURRENT == SEEK_CUR && + File::FROM_END == SEEK_END, + "whence mapping must match the system headers"); + +namespace { + +// NaCl doesn't provide the following system calls, so either simulate them or +// wrap them in order to minimize the number of #ifdef's in this file. +#if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_AIX) +bool IsOpenAppend(PlatformFile file) { + return (fcntl(file, F_GETFL) & O_APPEND) != 0; +} + +int CallFtruncate(PlatformFile file, int64_t length) { +#if BUILDFLAG(IS_BSD) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA) + static_assert(sizeof(off_t) >= sizeof(int64_t), + "off_t is not a 64-bit integer"); + return HANDLE_EINTR(ftruncate(file, length)); +#else + return HANDLE_EINTR(ftruncate64(file, length)); +#endif +} + +#if !defined(MOZ_ZUCCHINI) +int CallFutimes(PlatformFile file, const struct timeval times[2]) { +#ifdef __USE_XOPEN2K8 + // futimens should be available, but futimes might not be + // http://pubs.opengroup.org/onlinepubs/9699919799/ + + timespec ts_times[2]; + ts_times[0].tv_sec = times[0].tv_sec; + ts_times[0].tv_nsec = times[0].tv_usec * 1000; + ts_times[1].tv_sec = times[1].tv_sec; + ts_times[1].tv_nsec = times[1].tv_usec * 1000; + + return futimens(file, ts_times); +#else + return futimes(file, times); +#endif +} +#endif // !defined(MOZ_ZUCCHINI) + +#if !BUILDFLAG(IS_FUCHSIA) +short FcntlFlockType(absl::optional mode) { + if (!mode.has_value()) + return F_UNLCK; + switch (mode.value()) { + case File::LockMode::kShared: + return F_RDLCK; + case File::LockMode::kExclusive: + return F_WRLCK; + } + NOTREACHED(); +#if defined(MOZ_ZUCCHINI) + return F_RDLCK; +#endif // defined(MOZ_ZUCCHINI) +} + +File::Error CallFcntlFlock(PlatformFile file, + absl::optional mode) { + struct flock lock; + lock.l_type = FcntlFlockType(std::move(mode)); + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; // Lock entire file. + if (HANDLE_EINTR(fcntl(file, F_SETLK, &lock)) == -1) + return File::GetLastFileError(); + return File::FILE_OK; +} +#endif + +#else // BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_AIX) + +bool IsOpenAppend(PlatformFile file) { + // NaCl doesn't implement fcntl. Since NaCl's write conforms to the POSIX + // standard and always appends if the file is opened with O_APPEND, just + // return false here. + return false; +} + +int CallFtruncate(PlatformFile file, int64_t length) { + NOTIMPLEMENTED(); // NaCl doesn't implement ftruncate. + return 0; +} + +int CallFutimes(PlatformFile file, const struct timeval times[2]) { + NOTIMPLEMENTED(); // NaCl doesn't implement futimes. + return 0; +} + +File::Error CallFcntlFlock(PlatformFile file, + absl::optional mode) { + NOTIMPLEMENTED(); // NaCl doesn't implement flock struct. + return File::FILE_ERROR_INVALID_OPERATION; +} +#endif // BUILDFLAG(IS_NACL) + +} // namespace + +void File::Info::FromStat(const stat_wrapper_t& stat_info) { + is_directory = S_ISDIR(stat_info.st_mode); + is_symbolic_link = S_ISLNK(stat_info.st_mode); + size = stat_info.st_size; + + // Get last modification time, last access time, and creation time from + // |stat_info|. + // Note: st_ctime is actually last status change time when the inode was last + // updated, which happens on any metadata change. It is not the file's + // creation time. However, other than on Mac & iOS where the actual file + // creation time is included as st_birthtime, the rest of POSIX platforms have + // no portable way to get the creation time. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) + time_t last_modified_sec = stat_info.st_mtim.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtim.tv_nsec; + time_t last_accessed_sec = stat_info.st_atim.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atim.tv_nsec; + time_t creation_time_sec = stat_info.st_ctim.tv_sec; + int64_t creation_time_nsec = stat_info.st_ctim.tv_nsec; +#elif BUILDFLAG(IS_ANDROID) + time_t last_modified_sec = stat_info.st_mtime; + int64_t last_modified_nsec = stat_info.st_mtime_nsec; + time_t last_accessed_sec = stat_info.st_atime; + int64_t last_accessed_nsec = stat_info.st_atime_nsec; + time_t creation_time_sec = stat_info.st_ctime; + int64_t creation_time_nsec = stat_info.st_ctime_nsec; +#elif BUILDFLAG(IS_APPLE) + time_t last_modified_sec = stat_info.st_mtimespec.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtimespec.tv_nsec; + time_t last_accessed_sec = stat_info.st_atimespec.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atimespec.tv_nsec; + time_t creation_time_sec = stat_info.st_birthtimespec.tv_sec; + int64_t creation_time_nsec = stat_info.st_birthtimespec.tv_nsec; +#elif BUILDFLAG(IS_BSD) + time_t last_modified_sec = stat_info.st_mtimespec.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtimespec.tv_nsec; + time_t last_accessed_sec = stat_info.st_atimespec.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atimespec.tv_nsec; + time_t creation_time_sec = stat_info.st_ctimespec.tv_sec; + int64_t creation_time_nsec = stat_info.st_ctimespec.tv_nsec; +#else + time_t last_modified_sec = stat_info.st_mtime; + int64_t last_modified_nsec = 0; + time_t last_accessed_sec = stat_info.st_atime; + int64_t last_accessed_nsec = 0; + time_t creation_time_sec = stat_info.st_ctime; + int64_t creation_time_nsec = 0; +#endif + + last_modified = + Time::FromTimeT(last_modified_sec) + + Microseconds(last_modified_nsec / Time::kNanosecondsPerMicrosecond); + + last_accessed = + Time::FromTimeT(last_accessed_sec) + + Microseconds(last_accessed_nsec / Time::kNanosecondsPerMicrosecond); + + creation_time = + Time::FromTimeT(creation_time_sec) + + Microseconds(creation_time_nsec / Time::kNanosecondsPerMicrosecond); +} + +bool File::IsValid() const { + return file_.is_valid(); +} + +PlatformFile File::GetPlatformFile() const { + return file_.get(); +} + +PlatformFile File::TakePlatformFile() { + return file_.release(); +} + +void File::Close() { + if (!IsValid()) + return; + + SCOPED_FILE_TRACE("Close"); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + file_.reset(); +} + +int64_t File::Seek(Whence whence, int64_t offset) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("Seek", offset); + +#if BUILDFLAG(IS_ANDROID) + static_assert(sizeof(int64_t) == sizeof(off64_t), "off64_t must be 64 bits"); + return lseek64(file_.get(), static_cast(offset), + static_cast(whence)); +#else + static_assert(sizeof(int64_t) == sizeof(off_t), "off_t must be 64 bits"); + return lseek(file_.get(), static_cast(offset), + static_cast(whence)); +#endif +} + +int File::Read(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0 || !IsValueInRangeForNumericType(offset + size - 1)) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Read", size); + + int bytes_read = 0; + long rv; + do { + rv = HANDLE_EINTR(pread(file_.get(), data + bytes_read, + static_cast(size - bytes_read), + static_cast(offset + bytes_read))); + if (rv <= 0) + break; + + bytes_read += rv; + } while (bytes_read < size); + + return bytes_read ? bytes_read : checked_cast(rv); +} + +int File::ReadAtCurrentPos(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPos", size); + + int bytes_read = 0; + long rv; + do { + rv = HANDLE_EINTR(read(file_.get(), data + bytes_read, + static_cast(size - bytes_read))); + if (rv <= 0) + break; + + bytes_read += rv; + } while (bytes_read < size); + + return bytes_read ? bytes_read : checked_cast(rv); +} + +int File::ReadNoBestEffort(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0 || !IsValueInRangeForNumericType(offset)) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(pread(file_.get(), data, static_cast(size), + static_cast(offset)))); +} + +int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPosNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(read(file_.get(), data, static_cast(size)))); +} + +int File::Write(int64_t offset, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (IsOpenAppend(file_.get())) + return WriteAtCurrentPos(data, size); + + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Write", size); + + int bytes_written = 0; + long rv; + do { +#if BUILDFLAG(IS_ANDROID) + // In case __USE_FILE_OFFSET64 is not used, we need to call pwrite64() + // instead of pwrite(). + static_assert(sizeof(int64_t) == sizeof(off64_t), + "off64_t must be 64 bits"); + rv = HANDLE_EINTR(pwrite64(file_.get(), data + bytes_written, + static_cast(size - bytes_written), + offset + bytes_written)); +#else + rv = HANDLE_EINTR(pwrite(file_.get(), data + bytes_written, + static_cast(size - bytes_written), + offset + bytes_written)); +#endif + if (rv <= 0) + break; + + bytes_written += rv; + } while (bytes_written < size); + + return bytes_written ? bytes_written : checked_cast(rv); +} + +int File::WriteAtCurrentPos(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPos", size); + + int bytes_written = 0; + long rv; + do { + rv = HANDLE_EINTR(write(file_.get(), data + bytes_written, + static_cast(size - bytes_written))); + if (rv <= 0) + break; + + bytes_written += rv; + } while (bytes_written < size); + + return bytes_written ? bytes_written : checked_cast(rv); +} + +int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPosNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(write(file_.get(), data, static_cast(size)))); +} + +int64_t File::GetLength() { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetLength"); + + stat_wrapper_t file_info; + if (Fstat(file_.get(), &file_info)) + return -1; + + return file_info.st_size; +} + +bool File::SetLength(int64_t length) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("SetLength", length); + return !CallFtruncate(file_.get(), length); +} + +#if !defined(MOZ_ZUCCHINI) +bool File::SetTimes(Time last_access_time, Time last_modified_time) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("SetTimes"); + + timeval times[2]; + times[0] = last_access_time.ToTimeVal(); + times[1] = last_modified_time.ToTimeVal(); + + return !CallFutimes(file_.get(), times); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool File::GetInfo(Info* info) { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetInfo"); + + stat_wrapper_t file_info; + if (Fstat(file_.get(), &file_info)) + return false; + + info->FromStat(file_info); + return true; +} + +#if !BUILDFLAG(IS_FUCHSIA) +File::Error File::Lock(File::LockMode mode) { + SCOPED_FILE_TRACE("Lock"); + return CallFcntlFlock(file_.get(), mode); +} + +File::Error File::Unlock() { + SCOPED_FILE_TRACE("Unlock"); + return CallFcntlFlock(file_.get(), absl::optional()); +} +#endif + +File File::Duplicate() const { + if (!IsValid()) + return File(); + + SCOPED_FILE_TRACE("Duplicate"); + + ScopedPlatformFile other_fd(HANDLE_EINTR(dup(GetPlatformFile()))); + if (!other_fd.is_valid()) + return File(File::GetLastFileError()); + + return File(std::move(other_fd), async()); +} + +// Static. +File::Error File::OSErrorToFileError(int saved_errno) { + switch (saved_errno) { + case EACCES: + case EISDIR: + case EROFS: + case EPERM: + return FILE_ERROR_ACCESS_DENIED; + case EBUSY: +#if !BUILDFLAG(IS_NACL) // ETXTBSY not defined by NaCl. + case ETXTBSY: +#endif + return FILE_ERROR_IN_USE; + case EEXIST: + return FILE_ERROR_EXISTS; + case EIO: + return FILE_ERROR_IO; + case ENOENT: + return FILE_ERROR_NOT_FOUND; + case ENFILE: // fallthrough + case EMFILE: + return FILE_ERROR_TOO_MANY_OPENED; + case ENOMEM: + return FILE_ERROR_NO_MEMORY; + case ENOSPC: + return FILE_ERROR_NO_SPACE; + case ENOTDIR: + return FILE_ERROR_NOT_A_DIRECTORY; + default: + // This function should only be called for errors. + DCHECK_NE(0, saved_errno); + return FILE_ERROR_FAILED; + } +} + +// NaCl doesn't implement system calls to open files directly. +#if !BUILDFLAG(IS_NACL) +// TODO(erikkay): does it make sense to support FLAG_EXCLUSIVE_* here? +void File::DoInitialize(const FilePath& path, uint32_t flags) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(!IsValid()); + + int open_flags = 0; + if (flags & FLAG_CREATE) + open_flags = O_CREAT | O_EXCL; + + created_ = false; + + if (flags & FLAG_CREATE_ALWAYS) { + DCHECK(!open_flags); + DCHECK(flags & FLAG_WRITE); + open_flags = O_CREAT | O_TRUNC; + } + + if (flags & FLAG_OPEN_TRUNCATED) { + DCHECK(!open_flags); + DCHECK(flags & FLAG_WRITE); + open_flags = O_TRUNC; + } + + if (!open_flags && !(flags & FLAG_OPEN) && !(flags & FLAG_OPEN_ALWAYS)) { + NOTREACHED(); + errno = EOPNOTSUPP; + error_details_ = FILE_ERROR_FAILED; + return; + } + + if (flags & FLAG_WRITE && flags & FLAG_READ) { + open_flags |= O_RDWR; + } else if (flags & FLAG_WRITE) { + open_flags |= O_WRONLY; + } else if (!(flags & FLAG_READ) && !(flags & FLAG_WRITE_ATTRIBUTES) && + !(flags & FLAG_APPEND) && !(flags & FLAG_OPEN_ALWAYS)) { + // Note: For FLAG_WRITE_ATTRIBUTES and no other read/write flags, we'll + // open the file in O_RDONLY mode (== 0, see static_assert below), so that + // we get a fd that can be used for SetTimes(). + NOTREACHED(); + } + + if (flags & FLAG_TERMINAL_DEVICE) + open_flags |= O_NOCTTY | O_NDELAY; + + if (flags & FLAG_APPEND && flags & FLAG_READ) + open_flags |= O_APPEND | O_RDWR; + else if (flags & FLAG_APPEND) + open_flags |= O_APPEND | O_WRONLY; + + static_assert(O_RDONLY == 0, "O_RDONLY must equal zero"); + + mode_t mode = S_IRUSR | S_IWUSR; +#if BUILDFLAG(IS_CHROMEOS) + mode |= S_IRGRP | S_IROTH; +#endif + + int descriptor = HANDLE_EINTR(open(path.value().c_str(), open_flags, mode)); + + if (flags & FLAG_OPEN_ALWAYS) { + if (descriptor < 0) { + open_flags |= O_CREAT; + descriptor = HANDLE_EINTR(open(path.value().c_str(), open_flags, mode)); + if (descriptor >= 0) + created_ = true; + } + } + + if (descriptor < 0) { + error_details_ = File::GetLastFileError(); + return; + } + + if (flags & (FLAG_CREATE_ALWAYS | FLAG_CREATE)) + created_ = true; + + if (flags & FLAG_DELETE_ON_CLOSE) + unlink(path.value().c_str()); + + async_ = ((flags & FLAG_ASYNC) == FLAG_ASYNC); + error_details_ = FILE_OK; + file_.reset(descriptor); +} +#endif // !BUILDFLAG(IS_NACL) + +bool File::Flush() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + SCOPED_FILE_TRACE("Flush"); + +#if BUILDFLAG(IS_NACL) + NOTIMPLEMENTED(); // NaCl doesn't implement fsync. + return true; +#elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) + return !HANDLE_EINTR(fdatasync(file_.get())); +#elif BUILDFLAG(IS_APPLE) + // On macOS and iOS, fsync() is guaranteed to send the file's data to the + // underlying storage device, but may return before the device actually writes + // the data to the medium. When used by database systems, this may result in + // unexpected data loss. + // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html + if (!HANDLE_EINTR(fcntl(file_.get(), F_FULLFSYNC))) + return true; + + // Some filesystms do not support fcntl(F_FULLFSYNC). We handle these cases by + // falling back to fsync(). Unfortunately, lack of F_FULLFSYNC support results + // in various error codes, so we cannot use the error code as a definitive + // indicator that F_FULLFSYNC was not supported. So, if fcntl() errors out for + // any reason, we may end up making an unnecessary system call. + // + // See the CL description at https://crrev.com/c/1400159 for details. + return !HANDLE_EINTR(fsync(file_.get())); +#else + return !HANDLE_EINTR(fsync(file_.get())); +#endif +} + +void File::SetPlatformFile(PlatformFile file) { + DCHECK(!file_.is_valid()); + file_.reset(file); +} + +// static +File::Error File::GetLastFileError() { + return base::File::OSErrorToFileError(errno); +} + +int File::Stat(const char* path, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return stat(path, sb); +} +int File::Fstat(int fd, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return fstat(fd, sb); +} +int File::Lstat(const char* path, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return lstat(path, sb); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,63 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_tracing.h" + +#include + +#include "base/files/file.h" +#include "base/trace_event/base_tracing.h" + +namespace base { + +namespace { +std::atomic g_provider; +} + +FileTracing::Provider* GetProvider() { + return g_provider.load(std::memory_order_acquire); +} + +// static +bool FileTracing::IsCategoryEnabled() { + FileTracing::Provider* provider = GetProvider(); + return provider && provider->FileTracingCategoryIsEnabled(); +} + +// static +void FileTracing::SetProvider(FileTracing::Provider* provider) { + g_provider.store(provider, std::memory_order_release); +} + +FileTracing::ScopedEnabler::ScopedEnabler() { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingEnable(this); +} + +FileTracing::ScopedEnabler::~ScopedEnabler() { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingDisable(this); + // TODO(crbug.com/1021571): Remove this once fixed. + PERFETTO_INTERNAL_ADD_EMPTY_EVENT(); +} + +FileTracing::ScopedTrace::~ScopedTrace() { + if (id_) { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingEventEnd(name_, id_); + } +} + +void FileTracing::ScopedTrace::Initialize(const char* name, + const File* file, + int64_t size) { + id_ = &file->trace_enabler_; + name_ = name; + GetProvider()->FileTracingEventBegin(name_, id_, file->tracing_path_, size); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,96 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_TRACING_H_ +#define BASE_FILES_FILE_TRACING_H_ + +#include + +#include "base/base_export.h" +#include "base/memory/raw_ptr.h" + +#define FILE_TRACING_PREFIX "File" + +#define SCOPED_FILE_TRACE_WITH_SIZE(name, size) \ + FileTracing::ScopedTrace scoped_file_trace; \ + if (FileTracing::IsCategoryEnabled()) \ + scoped_file_trace.Initialize(FILE_TRACING_PREFIX "::" name, this, size) + +#define SCOPED_FILE_TRACE(name) SCOPED_FILE_TRACE_WITH_SIZE(name, 0) + +namespace base { + +class File; +class FilePath; + +class BASE_EXPORT FileTracing { + public: + // Whether the file tracing category is enabled. + static bool IsCategoryEnabled(); + + class Provider { + public: + virtual ~Provider() = default; + + // Whether the file tracing category is currently enabled. + virtual bool FileTracingCategoryIsEnabled() const = 0; + + // Enables file tracing for |id|. Must be called before recording events. + virtual void FileTracingEnable(const void* id) = 0; + + // Disables file tracing for |id|. + virtual void FileTracingDisable(const void* id) = 0; + + // Begins an event for |id| with |name|. |path| tells where in the directory + // structure the event is happening (and may be blank). |size| is the number + // of bytes involved in the event. + virtual void FileTracingEventBegin(const char* name, + const void* id, + const FilePath& path, + int64_t size) = 0; + + // Ends an event for |id| with |name|. + virtual void FileTracingEventEnd(const char* name, const void* id) = 0; + }; + + // Sets a global file tracing provider to query categories and record events. + static void SetProvider(Provider* provider); + + // Enables file tracing while in scope. + class ScopedEnabler { + public: + ScopedEnabler(); + ~ScopedEnabler(); + }; + + class ScopedTrace { + public: + ScopedTrace() = default; + ScopedTrace(const ScopedTrace&) = delete; + ScopedTrace& operator=(const ScopedTrace&) = delete; + ~ScopedTrace(); + + // Called only if the tracing category is enabled. |name| is the name of the + // event to trace (e.g. "Read", "Write") and must have an application + // lifetime (e.g. static or literal). |file| is the file being traced; must + // outlive this class. |size| is the size (in bytes) of this event. + void Initialize(const char* name, const File* file, int64_t size); + + private: + // The ID of this trace. Based on the |file| passed to |Initialize()|. Must + // outlive this class. + raw_ptr id_ = nullptr; + + // The name of the event to trace (e.g. "Read", "Write"). Prefixed with + // "File". + const char* name_; + }; + + FileTracing(const FileTracing&) = delete; + FileTracing& operator=(const FileTracing&) = delete; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_TRACING_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,533 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#if !defined(MOZ_ZUCCHINI) +#include "base/task/sequenced_task_runner.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include +#endif +#include + +#include +#include +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/bit_cast.h" +#include "base/check_op.h" +#include "base/containers/span.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/functional/function_ref.h" +#include "base/notreached.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/posix/eintr_wrapper.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/bind_post_task.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_blocking_call.h" + +#if BUILDFLAG(IS_WIN) +#include +#endif + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_WIN) + +void RunAndReply(OnceCallback action_callback, + OnceCallback reply_callback) { + bool result = std::move(action_callback).Run(); + if (!reply_callback.is_null()) + std::move(reply_callback).Run(result); +} + +#endif // !BUILDFLAG(IS_WIN) +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadStreamToSpanWithMaxSize( + FILE* stream, + size_t max_size, + FunctionRef(size_t)> resize_span) { + if (!stream) { + return false; + } + + // Seeking to the beginning is best-effort -- it is expected to fail for + // certain non-file stream (e.g., pipes). + HANDLE_EINTR(fseek(stream, 0, SEEK_SET)); + + // Many files have incorrect size (proc files etc). Hence, the file is read + // sequentially as opposed to a one-shot read, using file size as a hint for + // chunk size if available. + constexpr size_t kDefaultChunkSize = 1 << 16; + size_t chunk_size = kDefaultChunkSize - 1; + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); +#if BUILDFLAG(IS_WIN) + BY_HANDLE_FILE_INFORMATION file_info = {}; + if (::GetFileInformationByHandle( + reinterpret_cast(_get_osfhandle(_fileno(stream))), + &file_info)) { + LARGE_INTEGER size; + size.HighPart = static_cast(file_info.nFileSizeHigh); + size.LowPart = file_info.nFileSizeLow; + if (size.QuadPart > 0) + chunk_size = static_cast(size.QuadPart); + } +#else // BUILDFLAG(IS_WIN) + // In cases where the reported file size is 0, use a smaller chunk size to + // minimize memory allocated and cost of string::resize() in case the read + // size is small (i.e. proc files). If the file is larger than this, the read + // loop will reset |chunk_size| to kDefaultChunkSize. + constexpr size_t kSmallChunkSize = 4096; + chunk_size = kSmallChunkSize - 1; + stat_wrapper_t file_info = {}; + if (!File::Fstat(fileno(stream), &file_info) && file_info.st_size > 0) + chunk_size = static_cast(file_info.st_size); +#endif // BUILDFLAG(IS_WIN) + + // We need to attempt to read at EOF for feof flag to be set so here we use + // |chunk_size| + 1. + chunk_size = std::min(chunk_size, max_size) + 1; + size_t bytes_read_this_pass; + size_t bytes_read_so_far = 0; + bool read_status = true; + span bytes_span = resize_span(chunk_size); + DCHECK_EQ(bytes_span.size(), chunk_size); + + while ((bytes_read_this_pass = fread(bytes_span.data() + bytes_read_so_far, 1, + chunk_size, stream)) > 0) { + if ((max_size - bytes_read_so_far) < bytes_read_this_pass) { + // Read more than max_size bytes, bail out. + bytes_read_so_far = max_size; + read_status = false; + break; + } + // In case EOF was not reached, iterate again but revert to the default + // chunk size. + if (bytes_read_so_far == 0) + chunk_size = kDefaultChunkSize; + + bytes_read_so_far += bytes_read_this_pass; + // Last fread syscall (after EOF) can be avoided via feof, which is just a + // flag check. + if (feof(stream)) + break; + bytes_span = resize_span(bytes_read_so_far + chunk_size); + DCHECK_EQ(bytes_span.size(), bytes_read_so_far + chunk_size); + } + read_status = read_status && !ferror(stream); + + // Trim the container down to the number of bytes that were actually read. + bytes_span = resize_span(bytes_read_so_far); + DCHECK_EQ(bytes_span.size(), bytes_read_so_far); + + return read_status; +} + +} // namespace + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_WIN) + +OnceClosure GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback) { + return BindOnce(&RunAndReply, BindOnce(&DeleteFile, path), + reply_callback.is_null() + ? std::move(reply_callback) + : BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback))); +} + +OnceClosure GetDeletePathRecursivelyCallback( + const FilePath& path, + OnceCallback reply_callback) { + return BindOnce(&RunAndReply, BindOnce(&DeletePathRecursively, path), + reply_callback.is_null() + ? std::move(reply_callback) + : BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback))); +} + +#endif // !BUILDFLAG(IS_WIN) + +int64_t ComputeDirectorySize(const FilePath& root_path) { + int64_t running_size = 0; + FileEnumerator file_iter(root_path, true, FileEnumerator::FILES); + while (!file_iter.Next().empty()) + running_size += file_iter.GetInfo().GetSize(); + return running_size; +} + +bool Move(const FilePath& from_path, const FilePath& to_path) { + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + return internal::MoveUnsafe(from_path, to_path); +} + +bool CopyFileContents(File& infile, File& outfile) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + bool retry_slow = false; + bool res = + internal::CopyFileContentsWithSendfile(infile, outfile, retry_slow); + if (res || !retry_slow) { + return res; + } + // Any failures which allow retrying using read/write will not have modified + // either file offset or size. +#endif + + static constexpr size_t kBufferSize = 32768; + std::vector buffer(kBufferSize); + + for (;;) { + int bytes_read = + infile.ReadAtCurrentPos(buffer.data(), static_cast(buffer.size())); + if (bytes_read < 0) { + return false; + } + if (bytes_read == 0) { + return true; + } + // Allow for partial writes + int bytes_written_per_read = 0; + do { + int bytes_written_partial = outfile.WriteAtCurrentPos( + &buffer[static_cast(bytes_written_per_read)], + bytes_read - bytes_written_per_read); + if (bytes_written_partial < 0) { + return false; + } + + bytes_written_per_read += bytes_written_partial; + } while (bytes_written_per_read < bytes_read); + } + + NOTREACHED(); + return false; +} + +bool ContentsEqual(const FilePath& filename1, const FilePath& filename2) { + // We open the file in binary format even if they are text files because + // we are just comparing that bytes are exactly same in both files and not + // doing anything smart with text formatting. +#if BUILDFLAG(IS_WIN) + std::ifstream file1(filename1.value().c_str(), + std::ios::in | std::ios::binary); + std::ifstream file2(filename2.value().c_str(), + std::ios::in | std::ios::binary); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + std::ifstream file1(filename1.value(), std::ios::in | std::ios::binary); + std::ifstream file2(filename2.value(), std::ios::in | std::ios::binary); +#endif // BUILDFLAG(IS_WIN) + + // Even if both files aren't openable (and thus, in some sense, "equal"), + // any unusable file yields a result of "false". + if (!file1.is_open() || !file2.is_open()) + return false; + + const int BUFFER_SIZE = 2056; + char buffer1[BUFFER_SIZE], buffer2[BUFFER_SIZE]; + do { + file1.read(buffer1, BUFFER_SIZE); + file2.read(buffer2, BUFFER_SIZE); + + if ((file1.eof() != file2.eof()) || + (file1.gcount() != file2.gcount()) || + (memcmp(buffer1, buffer2, static_cast(file1.gcount())))) { + file1.close(); + file2.close(); + return false; + } + } while (!file1.eof() || !file2.eof()); + + file1.close(); + file2.close(); + return true; +} + +bool TextContentsEqual(const FilePath& filename1, const FilePath& filename2) { +#if BUILDFLAG(IS_WIN) + std::ifstream file1(filename1.value().c_str(), std::ios::in); + std::ifstream file2(filename2.value().c_str(), std::ios::in); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + std::ifstream file1(filename1.value(), std::ios::in); + std::ifstream file2(filename2.value(), std::ios::in); +#endif // BUILDFLAG(IS_WIN) + + // Even if both files aren't openable (and thus, in some sense, "equal"), + // any unusable file yields a result of "false". + if (!file1.is_open() || !file2.is_open()) + return false; + + do { + std::string line1, line2; + getline(file1, line1); + getline(file2, line2); + + // Check for mismatched EOF states, or any error state. + if ((file1.eof() != file2.eof()) || + file1.bad() || file2.bad()) { + return false; + } + + // Trim all '\r' and '\n' characters from the end of the line. + std::string::size_type end1 = line1.find_last_not_of("\r\n"); + if (end1 == std::string::npos) + line1.clear(); + else if (end1 + 1 < line1.length()) + line1.erase(end1 + 1); + + std::string::size_type end2 = line2.find_last_not_of("\r\n"); + if (end2 == std::string::npos) + line2.clear(); + else if (end2 + 1 < line2.length()) + line2.erase(end2 + 1); + + if (line1 != line2) + return false; + } while (!file1.eof() || !file2.eof()); + + return true; +} + +bool ReadStreamToString(FILE* stream, std::string* contents) { + return ReadStreamToStringWithMaxSize( + stream, std::numeric_limits::max(), contents); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadStreamToStringWithMaxSize(FILE* stream, + size_t max_size, + std::string* contents) { + if (contents) { + contents->clear(); + } + + std::string content_string; + bool read_successs = ReadStreamToSpanWithMaxSize( + stream, max_size, [&content_string](size_t size) { + content_string.resize(size); + return as_writable_bytes(make_span(content_string)); + }); + + if (contents) { + contents->swap(content_string); + } + return read_successs; +} + +#if !defined(MOZ_ZUCCHINI) +absl::optional> ReadFileToBytes(const FilePath& path) { + if (path.ReferencesParent()) { + return absl::nullopt; + } + + ScopedFILE file_stream(OpenFile(path, "rb")); + if (!file_stream) { + return absl::nullopt; + } + + std::vector bytes; + if (!ReadStreamToSpanWithMaxSize(file_stream.get(), + std::numeric_limits::max(), + [&bytes](size_t size) { + bytes.resize(size); + return make_span(bytes); + })) { + return absl::nullopt; + } + return bytes; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadFileToString(const FilePath& path, std::string* contents) { + return ReadFileToStringWithMaxSize(path, contents, + std::numeric_limits::max()); +} + +bool ReadFileToStringWithMaxSize(const FilePath& path, + std::string* contents, + size_t max_size) { + if (contents) + contents->clear(); + if (path.ReferencesParent()) + return false; + ScopedFILE file_stream(OpenFile(path, "rb")); + if (!file_stream) + return false; + return ReadStreamToStringWithMaxSize(file_stream.get(), max_size, contents); +} + +#if !defined(MOZ_ZUCCHINI) +bool IsDirectoryEmpty(const FilePath& dir_path) { + FileEnumerator files(dir_path, false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES); + if (files.Next().empty()) + return true; + return false; +} + +bool CreateTemporaryFile(FilePath* path) { + FilePath temp_dir; + return GetTempDir(&temp_dir) && CreateTemporaryFileInDir(temp_dir, path); +} + +ScopedFILE CreateAndOpenTemporaryStream(FilePath* path) { + FilePath directory; + if (!GetTempDir(&directory)) + return nullptr; + + return CreateAndOpenTemporaryStreamInDir(directory, path); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool CreateDirectory(const FilePath& full_path) { + return CreateDirectoryAndGetError(full_path, nullptr); +} + +#if !defined(MOZ_ZUCCHINI) +bool GetFileSize(const FilePath& file_path, int64_t* file_size) { + File::Info info; + if (!GetFileInfo(file_path, &info)) + return false; + *file_size = info.size; + return true; +} + +bool TouchFile(const FilePath& path, + const Time& last_accessed, + const Time& last_modified) { + uint32_t flags = File::FLAG_OPEN | File::FLAG_WRITE_ATTRIBUTES; + +#if BUILDFLAG(IS_WIN) + // On Windows, FILE_FLAG_BACKUP_SEMANTICS is needed to open a directory. + if (DirectoryExists(path)) + flags |= File::FLAG_WIN_BACKUP_SEMANTICS; +#elif BUILDFLAG(IS_FUCHSIA) + // On Fuchsia, we need O_RDONLY for directories, or O_WRONLY for files. + // TODO(https://crbug.com/947802): Find a cleaner workaround for this. + flags |= (DirectoryExists(path) ? File::FLAG_READ : File::FLAG_WRITE); +#endif + + File file(path, flags); + if (!file.IsValid()) + return false; + + return file.SetTimes(last_accessed, last_modified); +} + +bool CloseFile(FILE* file) { + if (file == nullptr) + return true; + return fclose(file) == 0; +} + +bool TruncateFile(FILE* file) { + if (file == nullptr) + return false; + long current_offset = ftell(file); + if (current_offset == -1) + return false; +#if BUILDFLAG(IS_WIN) + int fd = _fileno(file); + if (_chsize(fd, current_offset) != 0) + return false; +#else + int fd = fileno(file); + if (ftruncate(fd, current_offset) != 0) + return false; +#endif + return true; +} + +bool WriteFile(const FilePath& filename, span data) { + int size = checked_cast(data.size()); + return WriteFile(filename, reinterpret_cast(data.data()), + size) == size; +} + +bool WriteFile(const FilePath& filename, StringPiece data) { + int size = checked_cast(data.size()); + return WriteFile(filename, data.data(), size) == size; +} + +int GetUniquePathNumber(const FilePath& path) { + DCHECK(!path.empty()); + if (!PathExists(path)) + return 0; + + std::string number; + for (int count = 1; count <= kMaxUniqueFiles; ++count) { + StringAppendF(&number, " (%d)", count); + if (!PathExists(path.InsertBeforeExtensionASCII(number))) + return count; + number.clear(); + } + + return -1; +} + +FilePath GetUniquePath(const FilePath& path) { + DCHECK(!path.empty()); + const int uniquifier = GetUniquePathNumber(path); + if (uniquifier > 0) + return path.InsertBeforeExtensionASCII(StringPrintf(" (%d)", uniquifier)); + return uniquifier == 0 ? path : FilePath(); +} + +namespace internal { + +bool PreReadFileSlow(const FilePath& file_path, int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + File file(file_path, File::FLAG_OPEN | File::FLAG_READ | + File::FLAG_WIN_SEQUENTIAL_SCAN | + File::FLAG_WIN_SHARE_DELETE); + if (!file.IsValid()) + return false; + + constexpr int kBufferSize = 1024 * 1024; + // Ensures the buffer is deallocated at function exit. + std::unique_ptr buffer_deleter(new char[kBufferSize]); + char* const buffer = buffer_deleter.get(); + + while (max_bytes > 0) { + // The static_cast is safe because kBufferSize is int, and both values + // are non-negative. So, the minimum is guaranteed to fit in int. + const int read_size = + static_cast(std::min(max_bytes, kBufferSize)); + DCHECK_GE(read_size, 0); + DCHECK_LE(read_size, kBufferSize); + + const int read_bytes = file.ReadAtCurrentPos(buffer, read_size); + if (read_bytes < 0) + return false; + if (read_bytes == 0) + break; + + max_bytes -= read_bytes; + } + + return true; +} + +} // namespace internal +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,724 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains utility functions for dealing with the local +// filesystem. + +#ifndef BASE_FILES_FILE_UTIL_H_ +#define BASE_FILES_FILE_UTIL_H_ + +#include +#include +#include + +#include +#include +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/functional/callback.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_types.h" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include +#include "base/posix/eintr_wrapper.h" +#endif + +namespace base { + +class Environment; +class Time; + +//----------------------------------------------------------------------------- +// Functions that involve filesystem access or modification: + +// Returns an absolute version of a relative path. Returns an empty path on +// error. This function can result in I/O so it can be slow. +// +// On POSIX, this function calls realpath(), so: +// 1) it fails if the path does not exist. +// 2) it expands all symlink components of the path. +// 3) it removes "." and ".." directory components. +BASE_EXPORT FilePath MakeAbsoluteFilePath(const FilePath& input); + +#if BUILDFLAG(IS_POSIX) +// Prepends the current working directory if `input` is not already absolute, +// and removes "/./" and "/../" This is similar to MakeAbsoluteFilePath(), but +// MakeAbsoluteFilePath() expands all symlinks in the path and this does not. +// +// This may block if `input` is a relative path, when calling +// GetCurrentDirectory(). +// +// This doesn't return absl::nullopt unless (1) `input` is empty, or (2) +// `input` is a relative path and GetCurrentDirectory() fails. +[[nodiscard]] BASE_EXPORT absl::optional +MakeAbsoluteFilePathNoResolveSymbolicLinks(const FilePath& input); +#endif + +// Returns the total number of bytes used by all the files under |root_path|. +// If the path does not exist the function returns 0. +// +// This function is implemented using the FileEnumerator class so it is not +// particularly speedy on any platform. +BASE_EXPORT int64_t ComputeDirectorySize(const FilePath& root_path); + +// Deletes the given path, whether it's a file or a directory. +// If it's a directory, it's perfectly happy to delete all of the directory's +// contents, but it will not recursively delete subdirectories and their +// contents. +// Returns true if successful, false otherwise. It is considered successful to +// attempt to delete a file that does not exist. +// +// In POSIX environment and if |path| is a symbolic link, this deletes only +// the symlink. (even if the symlink points to a non-existent file) +BASE_EXPORT bool DeleteFile(const FilePath& path); + +// Deletes the given path, whether it's a file or a directory. +// If it's a directory, it's perfectly happy to delete all of the +// directory's contents, including subdirectories and their contents. +// Returns true if successful, false otherwise. It is considered successful +// to attempt to delete a file that does not exist. +// +// In POSIX environment and if |path| is a symbolic link, this deletes only +// the symlink. (even if the symlink points to a non-existent file) +// +// WARNING: USING THIS EQUIVALENT TO "rm -rf", SO USE WITH CAUTION. +BASE_EXPORT bool DeletePathRecursively(const FilePath& path); + +// Returns a closure that, when run on any sequence that allows blocking calls, +// will kick off a potentially asynchronous operation to delete `path`, whose +// behavior is similar to `DeleteFile()` and `DeletePathRecursively()` +// respectively. +// +// In contrast to `DeleteFile()` and `DeletePathRecursively()`, the thread pool +// may be used in case retries are needed. On Windows, in particular, retries +// will be attempted for some time to allow other programs (e.g., anti-virus +// scanners or malware) to close any open handles to `path` or its contents. If +// `reply_callback` is not null, it will be posted to the caller's sequence with +// true if `path` was fully deleted or false otherwise. +// +// WARNING: It is NOT safe to use `path` until `reply_callback` is run, as the +// retry task may still be actively trying to delete it. +BASE_EXPORT OnceClosure +GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback = {}); +BASE_EXPORT OnceClosure +GetDeletePathRecursivelyCallback(const FilePath& path, + OnceCallback reply_callback = {}); + +#if BUILDFLAG(IS_WIN) +// Schedules to delete the given path, whether it's a file or a directory, until +// the operating system is restarted. +// Note: +// 1) The file/directory to be deleted should exist in a temp folder. +// 2) The directory to be deleted must be empty. +BASE_EXPORT bool DeleteFileAfterReboot(const FilePath& path); + +// Prevents opening the file at `path` with EXECUTE access by adding a deny ACE +// on the filesystem. This allows the file handle to be safely passed to an +// untrusted process. See also `File::FLAG_WIN_NO_EXECUTE`. +BASE_EXPORT bool PreventExecuteMapping(const FilePath& path); + +// Set `path_key` to the second of two valid paths that support safely marking a +// file as non-execute. The first allowed path is always PATH_TEMP. This is +// needed to avoid layering violations, as the user data dir is an embedder +// concept and only known later at runtime. +BASE_EXPORT void SetExtraNoExecuteAllowedPath(int path_key); +#endif // BUILDFLAG(IS_WIN) + +// Moves the given path, whether it's a file or a directory. +// If a simple rename is not possible, such as in the case where the paths are +// on different volumes, this will attempt to copy and delete. Returns +// true for success. +// This function fails if either path contains traversal components ('..'). +BASE_EXPORT bool Move(const FilePath& from_path, const FilePath& to_path); + +// Renames file |from_path| to |to_path|. Both paths must be on the same +// volume, or the function will fail. Destination file will be created +// if it doesn't exist. Prefer this function over Move when dealing with +// temporary files. On Windows it preserves attributes of the target file. +// Returns true on success, leaving *error unchanged. +// Returns false on failure and sets *error appropriately, if it is non-NULL. +BASE_EXPORT bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error); + +// Copies a single file. Use CopyDirectory() to copy directories. +// This function fails if either path contains traversal components ('..'). +// This function also fails if |to_path| is a directory. +// +// On POSIX, if |to_path| is a symlink, CopyFile() will follow the symlink. This +// may have security implications. Use with care. +// +// If |to_path| already exists and is a regular file, it will be overwritten, +// though its permissions will stay the same. +// +// If |to_path| does not exist, it will be created. The new file's permissions +// varies per platform: +// +// - This function keeps the metadata on Windows. The read only bit is not kept. +// - On Mac and iOS, |to_path| retains |from_path|'s permissions, except user +// read/write permissions are always set. +// - On Linux and Android, |to_path| has user read/write permissions only. i.e. +// Always 0600. +// - On ChromeOS, |to_path| has user read/write permissions and group/others +// read permissions. i.e. Always 0644. +BASE_EXPORT bool CopyFile(const FilePath& from_path, const FilePath& to_path); + +// Copies the contents of one file into another. +// The files are taken as is: the copy is done starting from the current offset +// of |infile| until the end of |infile| is reached, into the current offset of +// |outfile|. +BASE_EXPORT bool CopyFileContents(File& infile, File& outfile); + +// Copies the given path, and optionally all subdirectories and their contents +// as well. +// +// If there are files existing under to_path, always overwrite. Returns true +// if successful, false otherwise. Wildcards on the names are not supported. +// +// This function has the same metadata behavior as CopyFile(). +// +// If you only need to copy a file use CopyFile, it's faster. +BASE_EXPORT bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive); + +// Like CopyDirectory() except trying to overwrite an existing file will not +// work and will return false. +BASE_EXPORT bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive); + +// Returns true if the given path exists on the local filesystem, +// false otherwise. +BASE_EXPORT bool PathExists(const FilePath& path); + +// Returns true if the given path is readable by the user, false otherwise. +BASE_EXPORT bool PathIsReadable(const FilePath& path); + +// Returns true if the given path is writable by the user, false otherwise. +BASE_EXPORT bool PathIsWritable(const FilePath& path); + +// Returns true if the given path exists and is a directory, false otherwise. +BASE_EXPORT bool DirectoryExists(const FilePath& path); + +// Returns true if the contents of the two files given are equal, false +// otherwise. If either file can't be read, returns false. +BASE_EXPORT bool ContentsEqual(const FilePath& filename1, + const FilePath& filename2); + +// Returns true if the contents of the two text files given are equal, false +// otherwise. This routine treats "\r\n" and "\n" as equivalent. +BASE_EXPORT bool TextContentsEqual(const FilePath& filename1, + const FilePath& filename2); + +// Reads the file at |path| and returns a vector of bytes on success, and +// nullopt on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error, returning nullopt. +BASE_EXPORT absl::optional> ReadFileToBytes( + const FilePath& path); + +// Reads the file at |path| into |contents| and returns true on success and +// false on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error and |contents| is set to empty. +// In case of I/O error, |contents| holds the data that could be read from the +// file before the error occurred. +// |contents| may be NULL, in which case this function is useful for its side +// effect of priming the disk cache (could be used for unit tests). +BASE_EXPORT bool ReadFileToString(const FilePath& path, std::string* contents); + +// Reads the file at |path| into |contents| and returns true on success and +// false on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error and |contents| is set to empty. +// In case of I/O error, |contents| holds the data that could be read from the +// file before the error occurred. When the file size exceeds |max_size|, the +// function returns false with |contents| holding the file truncated to +// |max_size|. +// |contents| may be NULL, in which case this function is useful for its side +// effect of priming the disk cache (could be used for unit tests). +BASE_EXPORT bool ReadFileToStringWithMaxSize(const FilePath& path, + std::string* contents, + size_t max_size); + +// As ReadFileToString, but reading from an open stream after seeking to its +// start (if supported by the stream). This can also be used to read the whole +// file from a file descriptor by converting the file descriptor into a stream +// by using base::FileToFILE() before calling this function. +BASE_EXPORT bool ReadStreamToString(FILE* stream, std::string* contents); + +// As ReadFileToStringWithMaxSize, but reading from an open stream after seeking +// to its start (if supported by the stream). +BASE_EXPORT bool ReadStreamToStringWithMaxSize(FILE* stream, + size_t max_size, + std::string* contents); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Read exactly |bytes| bytes from file descriptor |fd|, storing the result +// in |buffer|. This function is protected against EINTR and partial reads. +// Returns true iff |bytes| bytes have been successfully read from |fd|. +BASE_EXPORT bool ReadFromFD(int fd, char* buffer, size_t bytes); + +// Performs the same function as CreateAndOpenTemporaryStreamInDir(), but +// returns the file-descriptor wrapped in a ScopedFD, rather than the stream +// wrapped in a ScopedFILE. +// The caller is responsible for deleting the file `path` points to, if +// appropriate. +BASE_EXPORT ScopedFD CreateAndOpenFdForTemporaryFileInDir(const FilePath& dir, + FilePath* path); + +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_POSIX) + +// ReadFileToStringNonBlocking is identical to ReadFileToString except it +// guarantees that it will not block. This guarantee is provided on POSIX by +// opening the file as O_NONBLOCK. This variant should only be used on files +// which are guaranteed not to block (such as kernel files). Or in situations +// where a partial read would be acceptable because the backing store returned +// EWOULDBLOCK. +BASE_EXPORT bool ReadFileToStringNonBlocking(const base::FilePath& file, + std::string* ret); + +// Creates a symbolic link at |symlink| pointing to |target|. Returns +// false on failure. +BASE_EXPORT bool CreateSymbolicLink(const FilePath& target, + const FilePath& symlink); + +// Reads the given |symlink| and returns the raw string in |target|. +// Returns false upon failure. +// IMPORTANT NOTE: if the string stored in the symlink is a relative file path, +// it should be interpreted relative to the symlink's directory, NOT the current +// working directory. ReadSymbolicLinkAbsolute() may be the better choice. +BASE_EXPORT bool ReadSymbolicLink(const FilePath& symlink, FilePath* target); + +// Same as ReadSymbolicLink(), but properly converts it into an absolute path if +// the link is relative. +// Can fail if readlink() fails, or if +// MakeAbsoluteFilePathNoResolveSymbolicLinks() fails on the resulting absolute +// path. +BASE_EXPORT absl::optional ReadSymbolicLinkAbsolute( + const FilePath& symlink); + +// Bits and masks of the file permission. +enum FilePermissionBits { + FILE_PERMISSION_MASK = S_IRWXU | S_IRWXG | S_IRWXO, + FILE_PERMISSION_USER_MASK = S_IRWXU, + FILE_PERMISSION_GROUP_MASK = S_IRWXG, + FILE_PERMISSION_OTHERS_MASK = S_IRWXO, + + FILE_PERMISSION_READ_BY_USER = S_IRUSR, + FILE_PERMISSION_WRITE_BY_USER = S_IWUSR, + FILE_PERMISSION_EXECUTE_BY_USER = S_IXUSR, + FILE_PERMISSION_READ_BY_GROUP = S_IRGRP, + FILE_PERMISSION_WRITE_BY_GROUP = S_IWGRP, + FILE_PERMISSION_EXECUTE_BY_GROUP = S_IXGRP, + FILE_PERMISSION_READ_BY_OTHERS = S_IROTH, + FILE_PERMISSION_WRITE_BY_OTHERS = S_IWOTH, + FILE_PERMISSION_EXECUTE_BY_OTHERS = S_IXOTH, +}; + +// Reads the permission of the given |path|, storing the file permission +// bits in |mode|. If |path| is symbolic link, |mode| is the permission of +// a file which the symlink points to. +BASE_EXPORT bool GetPosixFilePermissions(const FilePath& path, int* mode); +// Sets the permission of the given |path|. If |path| is symbolic link, sets +// the permission of a file which the symlink points to. +BASE_EXPORT bool SetPosixFilePermissions(const FilePath& path, int mode); + +// Returns true iff |executable| can be found in any directory specified by the +// environment variable in |env|. +BASE_EXPORT bool ExecutableExistsInPath(Environment* env, + const FilePath::StringType& executable); + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +// Determine if files under a given |path| can be mapped and then mprotect'd +// PROT_EXEC. This depends on the mount options used for |path|, which vary +// among different Linux distributions and possibly local configuration. It also +// depends on details of kernel--ChromeOS uses the noexec option for /dev/shm +// but its kernel allows mprotect with PROT_EXEC anyway. +BASE_EXPORT bool IsPathExecutable(const FilePath& path); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + +#endif // BUILDFLAG(IS_POSIX) + +// Returns true if the given directory is empty +BASE_EXPORT bool IsDirectoryEmpty(const FilePath& dir_path); + +// Get the temporary directory provided by the system. +// +// WARNING: In general, you should use CreateTemporaryFile variants below +// instead of this function. Those variants will ensure that the proper +// permissions are set so that other users on the system can't edit them while +// they're open (which can lead to security issues). +BASE_EXPORT bool GetTempDir(FilePath* path); + +// Get the home directory. This is more complicated than just getenv("HOME") +// as it knows to fall back on getpwent() etc. +// +// You should not generally call this directly. Instead use DIR_HOME with the +// path service which will use this function but cache the value. +// Path service may also override DIR_HOME. +BASE_EXPORT FilePath GetHomeDir(); + +// Returns a new temporary file in |dir| with a unique name. The file is opened +// for exclusive read, write, and delete access. +// On success, |temp_file| is populated with the full path to the created file. +// +// NOTE: Exclusivity is unique to Windows. On Windows, the returned file +// supports File::DeleteOnClose. On other platforms, the caller is responsible +// for deleting the file `temp_file` points to, if appropriate. +BASE_EXPORT File CreateAndOpenTemporaryFileInDir(const FilePath& dir, + FilePath* temp_file); + +// Creates a temporary file. The full path is placed in `path`, and the +// function returns true if was successful in creating the file. The file will +// be empty and all handles closed after this function returns. +// The caller is responsible for deleting the file `path` points to, if +// appropriate. +BASE_EXPORT bool CreateTemporaryFile(FilePath* path); + +// Same as CreateTemporaryFile() but the file is created in `dir`. +// The caller is responsible for deleting the file `temp_file` points to, if +// appropriate. +BASE_EXPORT bool CreateTemporaryFileInDir(const FilePath& dir, + FilePath* temp_file); + +// Returns the file name for a temporary file by using a platform-specific +// naming scheme that incorporates |identifier|. +BASE_EXPORT FilePath +FormatTemporaryFileName(FilePath::StringPieceType identifier); + +// Create and open a temporary file stream for exclusive read, write, and delete +// access. The full path is placed in `path`. Returns the opened file stream, or +// null in case of error. +// NOTE: Exclusivity is unique to Windows. On Windows, the returned file +// supports File::DeleteOnClose. On other platforms, the caller is responsible +// for deleting the file `path` points to, if appropriate. +BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStream(FilePath* path); + +// Similar to CreateAndOpenTemporaryStream(), but the file is created in `dir`. +BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path); + +#if BUILDFLAG(IS_WIN) +// Retrieves the path `%systemroot%\SystemTemp`, if available, else retrieves +// `%programfiles%`. +// Returns the path in `temp` and `true` if the path is writable by the caller, +// which is usually only when the caller is running as admin or system. +// Returns `false` otherwise. +// Both paths are only accessible to admin and system processes, and are +// therefore secure. +BASE_EXPORT bool GetSecureSystemTemp(FilePath* temp); +#endif // BUILDFLAG(IS_WIN) + +// Do NOT USE in new code. Use ScopedTempDir instead. +// TODO(crbug.com/561597) Remove existing usage and make this an implementation +// detail inside ScopedTempDir. +// +// Create a new directory. If prefix is provided, the new directory name is in +// the format of prefixyyyy. +// NOTE: prefix is ignored in the POSIX implementation. +// If success, return true and output the full path of the directory created. +// +// For Windows, this directory is usually created in a secure location if the +// caller is admin. This is because the default %TEMP% folder for Windows is +// insecure, since low privilege users can get the path of folders under %TEMP% +// after creation and are able to create subfolders and files within these +// folders which can lead to privilege escalation. +BASE_EXPORT bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path); + +// Create a directory within another directory. +// Extra characters will be appended to |prefix| to ensure that the +// new directory does not have the same name as an existing directory. +BASE_EXPORT bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir); + +// Creates a directory, as well as creating any parent directories, if they +// don't exist. Returns 'true' on successful creation, or if the directory +// already exists. The directory is only readable by the current user. +// Returns true on success, leaving *error unchanged. +// Returns false on failure and sets *error appropriately, if it is non-NULL. +BASE_EXPORT bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error); + +// Backward-compatible convenience method for the above. +BASE_EXPORT bool CreateDirectory(const FilePath& full_path); + +// Returns the file size. Returns true on success. +BASE_EXPORT bool GetFileSize(const FilePath& file_path, int64_t* file_size); + +// Sets |real_path| to |path| with symbolic links and junctions expanded. +// On windows, make sure the path starts with a lettered drive. +// |path| must reference a file. Function will fail if |path| points to +// a directory or to a nonexistent path. On windows, this function will +// fail if |real_path| would be longer than MAX_PATH characters. +BASE_EXPORT bool NormalizeFilePath(const FilePath& path, FilePath* real_path); + +#if BUILDFLAG(IS_WIN) + +// Given a path in NT native form ("\Device\HarddiskVolumeXX\..."), +// return in |drive_letter_path| the equivalent path that starts with +// a drive letter ("C:\..."). Return false if no such path exists. +BASE_EXPORT bool DevicePathToDriveLetterPath(const FilePath& device_path, + FilePath* drive_letter_path); + +// Method that wraps the win32 GetLongPathName API, normalizing the specified +// path to its long form. An example where this is needed is when comparing +// temp file paths. If a username isn't a valid 8.3 short file name (even just a +// lengthy name like "user with long name"), Windows will set the TMP and TEMP +// environment variables to be 8.3 paths. ::GetTempPath (called in +// base::GetTempDir) just uses the value specified by TMP or TEMP, and so can +// return a short path. Returns an empty path on error. +BASE_EXPORT FilePath MakeLongFilePath(const FilePath& input); + +// Creates a hard link named |to_file| to the file |from_file|. Both paths +// must be on the same volume, and |from_file| may not name a directory. +// Returns true if the hard link is created, false if it fails. +BASE_EXPORT bool CreateWinHardLink(const FilePath& to_file, + const FilePath& from_file); +#endif + +// This function will return if the given file is a symlink or not. +BASE_EXPORT bool IsLink(const FilePath& file_path); + +// Returns information about the given file path. Also see |File::GetInfo|. +BASE_EXPORT bool GetFileInfo(const FilePath& file_path, File::Info* info); + +// Sets the time of the last access and the time of the last modification. +BASE_EXPORT bool TouchFile(const FilePath& path, + const Time& last_accessed, + const Time& last_modified); + +// Wrapper for fopen-like calls. Returns non-NULL FILE* on success. The +// underlying file descriptor (POSIX) or handle (Windows) is unconditionally +// configured to not be propagated to child processes. +BASE_EXPORT FILE* OpenFile(const FilePath& filename, const char* mode); + +// Closes file opened by OpenFile. Returns true on success. +BASE_EXPORT bool CloseFile(FILE* file); + +// Associates a standard FILE stream with an existing File. Note that this +// functions take ownership of the existing File. +BASE_EXPORT FILE* FileToFILE(File file, const char* mode); + +// Returns a new handle to the file underlying |file_stream|. +BASE_EXPORT File FILEToFile(FILE* file_stream); + +// Truncates an open file to end at the location of the current file pointer. +// This is a cross-platform analog to Windows' SetEndOfFile() function. +BASE_EXPORT bool TruncateFile(FILE* file); + +// Reads at most the given number of bytes from the file into the buffer. +// Returns the number of read bytes, or -1 on error. +BASE_EXPORT int ReadFile(const FilePath& filename, char* data, int max_size); + +// Writes the given buffer into the file, overwriting any data that was +// previously there. Returns the number of bytes written, or -1 on error. +// If file doesn't exist, it gets created with read/write permissions for all. +// Note that the other variants of WriteFile() below may be easier to use. +BASE_EXPORT int WriteFile(const FilePath& filename, const char* data, + int size); + +// Writes |data| into the file, overwriting any data that was previously there. +// Returns true if and only if all of |data| was written. If the file does not +// exist, it gets created with read/write permissions for all. +BASE_EXPORT bool WriteFile(const FilePath& filename, span data); + +// Another WriteFile() variant that takes a StringPiece so callers don't have to +// do manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool WriteFile(const FilePath& filename, StringPiece data); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Appends |data| to |fd|. Does not close |fd| when done. Returns true iff all +// of |data| were written to |fd|. +BASE_EXPORT bool WriteFileDescriptor(int fd, span data); + +// WriteFileDescriptor() variant that takes a StringPiece so callers don't have +// to do manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool WriteFileDescriptor(int fd, StringPiece data); + +// Allocates disk space for the file referred to by |fd| for the byte range +// starting at |offset| and continuing for |size| bytes. The file size will be +// changed if |offset|+|len| is greater than the file size. Zeros will fill the +// new space. +// After a successful call, subsequent writes into the specified range are +// guaranteed not to fail because of lack of disk space. +BASE_EXPORT bool AllocateFileRegion(File* file, int64_t offset, size_t size); +#endif + +// Appends |data| to |filename|. Returns true iff |data| were written to +// |filename|. +BASE_EXPORT bool AppendToFile(const FilePath& filename, + span data); + +// AppendToFile() variant that takes a StringPiece so callers don't have to do +// manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool AppendToFile(const FilePath& filename, StringPiece data); + +// Gets the current working directory for the process. +BASE_EXPORT bool GetCurrentDirectory(FilePath* path); + +// Sets the current working directory for the process. +BASE_EXPORT bool SetCurrentDirectory(const FilePath& path); + +// The largest value attempted by GetUniquePath{Number,}. +enum { kMaxUniqueFiles = 100 }; + +// Returns the number N that makes |path| unique when formatted as " (N)" in a +// suffix to its basename before any file extension, where N is a number between +// 1 and 100 (inclusive). Returns 0 if |path| does not exist (meaning that it is +// unique as-is), or -1 if no such number can be found. +BASE_EXPORT int GetUniquePathNumber(const FilePath& path); + +// Returns |path| if it does not exist. Otherwise, returns |path| with the +// suffix " (N)" appended to its basename before any file extension, where N is +// a number between 1 and 100 (inclusive). Returns an empty path if no such +// number can be found. +BASE_EXPORT FilePath GetUniquePath(const FilePath& path); + +// Sets the given |fd| to non-blocking mode. +// Returns true if it was able to set it in the non-blocking mode, otherwise +// false. +BASE_EXPORT bool SetNonBlocking(int fd); + +// Hints the OS to prefetch the first |max_bytes| of |file_path| into its cache. +// +// If called at the appropriate time, this can reduce the latency incurred by +// feature code that needs to read the file. +// +// |max_bytes| specifies how many bytes should be pre-fetched. It may exceed the +// file's size. Passing in std::numeric_limits::max() is a convenient +// way to get the entire file pre-fetched. +// +// |is_executable| specifies whether the file is to be prefetched as +// executable code or as data. Windows treats the file backed pages in RAM +// differently, and specifying the wrong value results in two copies in RAM. +// +// Returns true if at least part of the requested range was successfully +// prefetched. +// +// Calling this before using ::LoadLibrary() on Windows is more efficient memory +// wise, but we must be sure no other threads try to LoadLibrary() the file +// while we are doing the mapping and prefetching, or the process will get a +// private copy of the DLL via COW. +BASE_EXPORT bool PreReadFile( + const FilePath& file_path, + bool is_executable, + int64_t max_bytes = std::numeric_limits::max()); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Creates a pipe. Returns true on success, otherwise false. +// On success, |read_fd| will be set to the fd of the read side, and +// |write_fd| will be set to the one of write side. If |non_blocking| +// is set the pipe will be created with O_NONBLOCK|O_CLOEXEC flags set +// otherwise flag is set to zero (default). +BASE_EXPORT bool CreatePipe(ScopedFD* read_fd, + ScopedFD* write_fd, + bool non_blocking = false); + +// Creates a non-blocking, close-on-exec pipe. +// This creates a non-blocking pipe that is not intended to be shared with any +// child process. This will be done atomically if the operating system supports +// it. Returns true if it was able to create the pipe, otherwise false. +BASE_EXPORT bool CreateLocalNonBlockingPipe(int fds[2]); + +// Sets the given |fd| to close-on-exec mode. +// Returns true if it was able to set it in the close-on-exec mode, otherwise +// false. +BASE_EXPORT bool SetCloseOnExec(int fd); +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_MAC) +// Test that |path| can only be changed by a given user and members of +// a given set of groups. +// Specifically, test that all parts of |path| under (and including) |base|: +// * Exist. +// * Are owned by a specific user. +// * Are not writable by all users. +// * Are owned by a member of a given set of groups, or are not writable by +// their group. +// * Are not symbolic links. +// This is useful for checking that a config file is administrator-controlled. +// |base| must contain |path|. +BASE_EXPORT bool VerifyPathControlledByUser(const base::FilePath& base, + const base::FilePath& path, + uid_t owner_uid, + const std::set& group_gids); + +// Is |path| writable only by a user with administrator privileges? +// This function uses Mac OS conventions. The super user is assumed to have +// uid 0, and the administrator group is assumed to be named "admin". +// Testing that |path|, and every parent directory including the root of +// the filesystem, are owned by the superuser, controlled by the group +// "admin", are not writable by all users, and contain no symbolic links. +// Will return false if |path| does not exist. +BASE_EXPORT bool VerifyPathControlledByAdmin(const base::FilePath& path); +#endif // BUILDFLAG(IS_MAC) + +// Returns the maximum length of path component on the volume containing +// the directory |path|, in the number of FilePath::CharType, or -1 on failure. +BASE_EXPORT int GetMaximumPathComponentLength(const base::FilePath& path); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Get a temporary directory for shared memory files. The directory may depend +// on whether the destination is intended for executable files, which in turn +// depends on how /dev/shmem was mounted. As a result, you must supply whether +// you intend to create executable shmem segments so this function can find +// an appropriate location. +BASE_EXPORT bool GetShmemTempDir(bool executable, FilePath* path); +#endif + +// Internal -------------------------------------------------------------------- + +namespace internal { + +// Same as Move but allows paths with traversal components. +// Use only with extreme care. +BASE_EXPORT bool MoveUnsafe(const FilePath& from_path, + const FilePath& to_path); + +#if BUILDFLAG(IS_WIN) +// Copy from_path to to_path recursively and then delete from_path recursively. +// Returns true if all operations succeed. +// This function simulates Move(), but unlike Move() it works across volumes. +// This function is not transactional. +BASE_EXPORT bool CopyAndDeleteDirectory(const FilePath& from_path, + const FilePath& to_path); +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +// CopyFileContentsWithSendfile will use the sendfile(2) syscall to perform a +// file copy without moving the data between kernel and userspace. This is much +// more efficient than sequences of read(2)/write(2) calls. The |retry_slow| +// parameter instructs the caller that it should try to fall back to a normal +// sequences of read(2)/write(2) syscalls. +// +// The input file |infile| must be opened for reading and the output file +// |outfile| must be opened for writing. +BASE_EXPORT bool CopyFileContentsWithSendfile(File& infile, + File& outfile, + bool& retry_slow); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID) + +// Used by PreReadFile() when no kernel support for prefetching is available. +bool PreReadFileSlow(const FilePath& file_path, int64_t max_bytes); + +} // namespace internal +} // namespace base + +#endif // BASE_FILES_FILE_UTIL_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#import +#include +#include +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/mac/foundation_util.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace base { + +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + return (copyfile(from_path.value().c_str(), to_path.value().c_str(), + /*state=*/nullptr, COPYFILE_DATA) == 0); +} + +bool GetTempDir(base::FilePath* path) { + // In order to facilitate hermetic runs on macOS, first check + // MAC_CHROMIUM_TMPDIR. This is used instead of TMPDIR for historical reasons. + // This was originally done for https://crbug.com/698759 (TMPDIR too long for + // process singleton socket path), but is hopefully obsolete as of + // https://crbug.com/1266817 (allows a longer process singleton socket path). + // Continue tracking MAC_CHROMIUM_TMPDIR as that's what build infrastructure + // sets on macOS. + const char* env_tmpdir = getenv("MAC_CHROMIUM_TMPDIR"); + if (env_tmpdir) { + *path = base::FilePath(env_tmpdir); + return true; + } + + // If we didn't find it, fall back to the native function. + NSString* tmp = NSTemporaryDirectory(); + if (tmp == nil) + return false; + *path = base::mac::NSStringToFilePath(tmp); + return true; +} + +FilePath GetHomeDir() { + NSString* tmp = NSHomeDirectory(); + if (tmp != nil) { + FilePath mac_home_dir = base::mac::NSStringToFilePath(tmp); + if (!mac_home_dir.empty()) + return mac_home_dir; + } + + // Fall back on temp dir if no home directory is defined. + FilePath rv; + if (GetTempDir(&rv)) + return rv; + + // Last resort. + return FilePath("/tmp"); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,1393 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "base/base_export.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/base_switches.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/bits.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/command_line.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/containers/adapters.h" +#include "base/containers/contains.h" +#include "base/containers/stack.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/logging.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/memory/singleton.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#include "base/path_service.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/system/sys_info.h" +#include "base/threading/scoped_blocking_call.h" +#include "base/time/time.h" +#include "build/branding_buildflags.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_APPLE) +#include +#include "base/mac/foundation_util.h" +#endif + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#include +#endif + +#if BUILDFLAG(IS_ANDROID) +#include "base/android/content_uri_utils.h" +#include "base/os_compat_android.h" +#endif + +#if !BUILDFLAG(IS_IOS) +#include +#endif + +// We need to do this on AIX due to some inconsistencies in how AIX +// handles XOPEN_SOURCE and ALL_SOURCE. +#if BUILDFLAG(IS_AIX) +extern "C" char* mkdtemp(char* path); +#endif + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_MAC) +// Helper for VerifyPathControlledByUser. +bool VerifySpecificPathControlledByUser(const FilePath& path, + uid_t owner_uid, + const std::set& group_gids) { + stat_wrapper_t stat_info; + if (File::Lstat(path.value().c_str(), &stat_info) != 0) { + DPLOG(ERROR) << "Failed to get information on path " + << path.value(); + return false; + } + + if (S_ISLNK(stat_info.st_mode)) { + DLOG(ERROR) << "Path " << path.value() << " is a symbolic link."; + return false; + } + + if (stat_info.st_uid != owner_uid) { + DLOG(ERROR) << "Path " << path.value() << " is owned by the wrong user."; + return false; + } + + if ((stat_info.st_mode & S_IWGRP) && + !Contains(group_gids, stat_info.st_gid)) { + DLOG(ERROR) << "Path " << path.value() + << " is writable by an unprivileged group."; + return false; + } + + if (stat_info.st_mode & S_IWOTH) { + DLOG(ERROR) << "Path " << path.value() << " is writable by any user."; + return false; + } + + return true; +} +#endif +#endif // !defined(MOZ_ZUCCHINI) + +base::FilePath GetTempTemplate() { + return FormatTemporaryFileName("XXXXXX"); +} + +#if !defined(MOZ_ZUCCHINI) +bool AdvanceEnumeratorWithStat(FileEnumerator* traversal, + FilePath* out_next_path, + stat_wrapper_t* out_next_stat) { + DCHECK(out_next_path); + DCHECK(out_next_stat); + *out_next_path = traversal->Next(); + if (out_next_path->empty()) + return false; + + *out_next_stat = traversal->GetInfo().stat(); + return true; +} + +bool DoCopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive, + bool open_exclusive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + // Some old callers of CopyDirectory want it to support wildcards. + // After some discussion, we decided to fix those callers. + // Break loudly here if anyone tries to do this. + DCHECK(to_path.value().find('*') == std::string::npos); + DCHECK(from_path.value().find('*') == std::string::npos); + + if (from_path.value().size() >= PATH_MAX) { + return false; + } + + // This function does not properly handle destinations within the source + FilePath real_to_path = to_path; + if (PathExists(real_to_path)) + real_to_path = MakeAbsoluteFilePath(real_to_path); + else + real_to_path = MakeAbsoluteFilePath(real_to_path.DirName()); + if (real_to_path.empty()) + return false; + + FilePath real_from_path = MakeAbsoluteFilePath(from_path); + if (real_from_path.empty()) + return false; + if (real_to_path == real_from_path || real_from_path.IsParent(real_to_path)) + return false; + + int traverse_type = FileEnumerator::FILES | FileEnumerator::SHOW_SYM_LINKS; + if (recursive) + traverse_type |= FileEnumerator::DIRECTORIES; + FileEnumerator traversal(from_path, recursive, traverse_type); + + // We have to mimic windows behavior here. |to_path| may not exist yet, + // start the loop with |to_path|. + stat_wrapper_t from_stat; + FilePath current = from_path; + if (File::Stat(from_path.value().c_str(), &from_stat) < 0) { + DPLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " + << from_path.value(); + return false; + } + FilePath from_path_base = from_path; + if (recursive && DirectoryExists(to_path)) { + // If the destination already exists and is a directory, then the + // top level of source needs to be copied. + from_path_base = from_path.DirName(); + } + + // The Windows version of this function assumes that non-recursive calls + // will always have a directory for from_path. + // TODO(maruel): This is not necessary anymore. + DCHECK(recursive || S_ISDIR(from_stat.st_mode)); + + do { + // current is the source path, including from_path, so append + // the suffix after from_path to to_path to create the target_path. + FilePath target_path(to_path); + if (from_path_base != current && + !from_path_base.AppendRelativePath(current, &target_path)) { + return false; + } + + if (S_ISDIR(from_stat.st_mode)) { + mode_t mode = (from_stat.st_mode & 01777) | S_IRUSR | S_IXUSR | S_IWUSR; + if (mkdir(target_path.value().c_str(), mode) == 0) + continue; + if (errno == EEXIST && !open_exclusive) + continue; + + DPLOG(ERROR) << "CopyDirectory() couldn't create directory: " + << target_path.value(); + return false; + } + + if (!S_ISREG(from_stat.st_mode)) { + DLOG(WARNING) << "CopyDirectory() skipping non-regular file: " + << current.value(); + continue; + } + + // Add O_NONBLOCK so we can't block opening a pipe. + File infile(open(current.value().c_str(), O_RDONLY | O_NONBLOCK)); + if (!infile.IsValid()) { + DPLOG(ERROR) << "CopyDirectory() couldn't open file: " << current.value(); + return false; + } + + stat_wrapper_t stat_at_use; + if (File::Fstat(infile.GetPlatformFile(), &stat_at_use) < 0) { + DPLOG(ERROR) << "CopyDirectory() couldn't stat file: " << current.value(); + return false; + } + + if (!S_ISREG(stat_at_use.st_mode)) { + DLOG(WARNING) << "CopyDirectory() skipping non-regular file: " + << current.value(); + continue; + } + + int open_flags = O_WRONLY | O_CREAT; + // If |open_exclusive| is set then we should always create the destination + // file, so O_NONBLOCK is not necessary to ensure we don't block on the + // open call for the target file below, and since the destination will + // always be a regular file it wouldn't affect the behavior of the + // subsequent write calls anyway. + if (open_exclusive) + open_flags |= O_EXCL; + else + open_flags |= O_TRUNC | O_NONBLOCK; + // Each platform has different default file opening modes for CopyFile which + // we want to replicate here. On OS X, we use copyfile(3) which takes the + // source file's permissions into account. On the other platforms, we just + // use the base::File constructor. On Chrome OS, base::File uses a different + // set of permissions than it does on other POSIX platforms. +#if BUILDFLAG(IS_APPLE) + mode_t mode = 0600 | (stat_at_use.st_mode & 0177); +#elif BUILDFLAG(IS_CHROMEOS) + mode_t mode = 0644; +#else + mode_t mode = 0600; +#endif + File outfile(open(target_path.value().c_str(), open_flags, mode)); + if (!outfile.IsValid()) { + DPLOG(ERROR) << "CopyDirectory() couldn't create file: " + << target_path.value(); + return false; + } + + if (!CopyFileContents(infile, outfile)) { + DLOG(ERROR) << "CopyDirectory() couldn't copy file: " << current.value(); + return false; + } + } while (AdvanceEnumeratorWithStat(&traversal, ¤t, &from_stat)); + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +// TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*" +// which works both with and without the recursive flag. I'm not sure we need +// that functionality. If not, remove from file_util_win.cc, otherwise add it +// here. +bool DoDeleteFile(const FilePath& path, bool recursive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + +#if BUILDFLAG(IS_ANDROID) + if (path.IsContentUri()) + return DeleteContentUri(path); +#endif // BUILDFLAG(IS_ANDROID) + + const char* path_str = path.value().c_str(); + stat_wrapper_t file_info; + if (File::Lstat(path_str, &file_info) != 0) { + // The Windows version defines this condition as success. + return (errno == ENOENT); + } + if (!S_ISDIR(file_info.st_mode)) + return (unlink(path_str) == 0) || (errno == ENOENT); + if (!recursive) + return (rmdir(path_str) == 0) || (errno == ENOENT); + + bool success = true; + stack directories; + directories.push(path.value()); + FileEnumerator traversal(path, true, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES | + FileEnumerator::SHOW_SYM_LINKS); + for (FilePath current = traversal.Next(); !current.empty(); + current = traversal.Next()) { + if (traversal.GetInfo().IsDirectory()) + directories.push(current.value()); + else + success &= (unlink(current.value().c_str()) == 0) || (errno == ENOENT); + } + + while (!directories.empty()) { + FilePath dir = FilePath(directories.top()); + directories.pop(); + success &= (rmdir(dir.value().c_str()) == 0) || (errno == ENOENT); + } + return success; +} + +#if !BUILDFLAG(IS_APPLE) +// Appends |mode_char| to |mode| before the optional character set encoding; see +// https://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html for +// details. +std::string AppendModeCharacter(StringPiece mode, char mode_char) { + std::string result(mode); + size_t comma_pos = result.find(','); + result.insert(comma_pos == std::string::npos ? result.length() : comma_pos, 1, + mode_char); + return result; +} +#endif + +} // namespace + +FilePath MakeAbsoluteFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + char full_path[PATH_MAX]; + if (realpath(input.value().c_str(), full_path) == nullptr) + return FilePath(); + return FilePath(full_path); +} + +absl::optional MakeAbsoluteFilePathNoResolveSymbolicLinks( + const FilePath& input) { + if (input.empty()) { + return absl::nullopt; + } + + FilePath collapsed_path; + std::vector components = input.GetComponents(); + base::span components_span(components); + // Start with root for absolute |input| and the current working directory for + // a relative |input|. + if (input.IsAbsolute()) { + collapsed_path = FilePath(components_span[0]); + components_span = components_span.subspan(1); + } else { + if (!GetCurrentDirectory(&collapsed_path)) { + return absl::nullopt; + } + } + + for (const auto& component : components_span) { + if (component == FilePath::kCurrentDirectory) { + continue; + } + + if (component == FilePath::kParentDirectory) { + // Pop the most recent component off the FilePath. Works correctly when + // the FilePath is root. + collapsed_path = collapsed_path.DirName(); + continue; + } + + // This is just a regular component. Append it. + collapsed_path = collapsed_path.Append(component); + } + + return collapsed_path; +} + +bool DeleteFile(const FilePath& path) { + return DoDeleteFile(path, /*recursive=*/false); +} + +bool DeletePathRecursively(const FilePath& path) { + return DoDeleteFile(path, /*recursive=*/true); +} + +#if !defined(MOZ_ZUCCHINI) +bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0) + return true; + if (error) + *error = File::GetLastFileError(); + return false; +} + +bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, false); +} + +bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, true); +} + +bool CreatePipe(ScopedFD* read_fd, ScopedFD* write_fd, bool non_blocking) { + int fds[2]; + bool created = + non_blocking ? CreateLocalNonBlockingPipe(fds) : (0 == pipe(fds)); + if (!created) + return false; + read_fd->reset(fds[0]); + write_fd->reset(fds[1]); + return true; +} + +bool CreateLocalNonBlockingPipe(int fds[2]) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + return pipe2(fds, O_CLOEXEC | O_NONBLOCK) == 0; +#else + int raw_fds[2]; + if (pipe(raw_fds) != 0) + return false; + ScopedFD fd_out(raw_fds[0]); + ScopedFD fd_in(raw_fds[1]); + if (!SetCloseOnExec(fd_out.get())) + return false; + if (!SetCloseOnExec(fd_in.get())) + return false; + if (!SetNonBlocking(fd_out.get())) + return false; + if (!SetNonBlocking(fd_in.get())) + return false; + fds[0] = fd_out.release(); + fds[1] = fd_in.release(); + return true; +#endif +} + +bool SetNonBlocking(int fd) { + const int flags = fcntl(fd, F_GETFL); + if (flags == -1) + return false; + if (flags & O_NONBLOCK) + return true; + if (HANDLE_EINTR(fcntl(fd, F_SETFL, flags | O_NONBLOCK)) == -1) + return false; + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool SetCloseOnExec(int fd) { + const int flags = fcntl(fd, F_GETFD); + if (flags == -1) + return false; + if (flags & FD_CLOEXEC) + return true; + if (HANDLE_EINTR(fcntl(fd, F_SETFD, flags | FD_CLOEXEC)) == -1) + return false; + return true; +} + +bool PathExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); +#if BUILDFLAG(IS_ANDROID) + if (path.IsContentUri()) { + return ContentUriExists(path); + } +#endif + return access(path.value().c_str(), F_OK) == 0; +} + +bool PathIsReadable(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return access(path.value().c_str(), R_OK) == 0; +} + +bool PathIsWritable(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return access(path.value().c_str(), W_OK) == 0; +} + +bool DirectoryExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + stat_wrapper_t file_info; + if (File::Stat(path.value().c_str(), &file_info) != 0) + return false; + return S_ISDIR(file_info.st_mode); +} + +bool ReadFromFD(int fd, char* buffer, size_t bytes) { + size_t total_read = 0; + while (total_read < bytes) { + ssize_t bytes_read = + HANDLE_EINTR(read(fd, buffer + total_read, bytes - total_read)); + if (bytes_read <= 0) + break; + total_read += static_cast(bytes_read); + } + return total_read == bytes; +} + +ScopedFD CreateAndOpenFdForTemporaryFileInDir(const FilePath& directory, + FilePath* path) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, + BlockingType::MAY_BLOCK); // For call to mkstemp(). + *path = directory.Append(GetTempTemplate()); + const std::string& tmpdir_string = path->value(); + // this should be OK since mkstemp just replaces characters in place + char* buffer = const_cast(tmpdir_string.c_str()); + + return ScopedFD(HANDLE_EINTR(mkstemp(buffer))); +} + +#if !BUILDFLAG(IS_FUCHSIA) +bool CreateSymbolicLink(const FilePath& target_path, + const FilePath& symlink_path) { + DCHECK(!symlink_path.empty()); + DCHECK(!target_path.empty()); + return ::symlink(target_path.value().c_str(), + symlink_path.value().c_str()) != -1; +} + +bool ReadSymbolicLink(const FilePath& symlink_path, FilePath* target_path) { + DCHECK(!symlink_path.empty()); + DCHECK(target_path); + char buf[PATH_MAX]; + ssize_t count = ::readlink(symlink_path.value().c_str(), buf, std::size(buf)); + +#if BUILDFLAG(IS_ANDROID) && defined(__LP64__) + // A few 64-bit Android L/M devices return INT_MAX instead of -1 here for + // errors; this is related to bionic's (incorrect) definition of ssize_t as + // being long int instead of int. Cast it so the compiler generates the + // comparison we want here. https://crbug.com/1101940 + bool error = static_cast(count) <= 0; +#else + bool error = count <= 0; +#endif + + if (error) { + target_path->clear(); + return false; + } + + *target_path = + FilePath(FilePath::StringType(buf, static_cast(count))); + return true; +} + +absl::optional ReadSymbolicLinkAbsolute( + const FilePath& symlink_path) { + FilePath target_path; + if (!ReadSymbolicLink(symlink_path, &target_path)) { + return absl::nullopt; + } + + // Relative symbolic links are relative to the symlink's directory. + if (!target_path.IsAbsolute()) { + target_path = symlink_path.DirName().Append(target_path); + } + + // Remove "/./" and "/../" to make this more friendly to path-allowlist-based + // sandboxes. + return MakeAbsoluteFilePathNoResolveSymbolicLinks(target_path); +} + +bool GetPosixFilePermissions(const FilePath& path, int* mode) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(mode); + + stat_wrapper_t file_info; + // Uses stat(), because on symbolic link, lstat() does not return valid + // permission bits in st_mode + if (File::Stat(path.value().c_str(), &file_info) != 0) + return false; + + *mode = file_info.st_mode & FILE_PERMISSION_MASK; + return true; +} + +bool SetPosixFilePermissions(const FilePath& path, + int mode) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK_EQ(mode & ~FILE_PERMISSION_MASK, 0); + + // Calls stat() so that we can preserve the higher bits like S_ISGID. + stat_wrapper_t stat_buf; + if (File::Stat(path.value().c_str(), &stat_buf) != 0) + return false; + + // Clears the existing permission bits, and adds the new ones. + // The casting here is because the Android NDK does not declare `st_mode` as a + // `mode_t`. + mode_t updated_mode_bits = static_cast(stat_buf.st_mode); + updated_mode_bits &= static_cast(~FILE_PERMISSION_MASK); + updated_mode_bits |= mode & FILE_PERMISSION_MASK; + + if (HANDLE_EINTR(chmod(path.value().c_str(), updated_mode_bits)) != 0) + return false; + + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool ExecutableExistsInPath(Environment* env, + const FilePath::StringType& executable) { + std::string path; + if (!env->GetVar("PATH", &path)) { + LOG(ERROR) << "No $PATH variable. Assuming no " << executable << "."; + return false; + } + + for (const StringPiece& cur_path : + SplitStringPiece(path, ":", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) { + FilePath file(cur_path); + int permissions; + if (GetPosixFilePermissions(file.Append(executable), &permissions) && + (permissions & FILE_PERMISSION_EXECUTE_BY_USER)) + return true; + } + return false; +} +#endif // !defined(MOZ_ZUCCHINI) + +#endif // !BUILDFLAG(IS_FUCHSIA) + +#if !BUILDFLAG(IS_APPLE) +// This is implemented in file_util_mac.mm for Mac. +bool GetTempDir(FilePath* path) { + const char* tmp = getenv("TMPDIR"); + if (tmp) { + *path = FilePath(tmp); + return true; + } + +#if BUILDFLAG(IS_ANDROID) + return PathService::Get(DIR_CACHE, path); +#else + *path = FilePath("/tmp"); + return true; +#endif +} +#endif // !BUILDFLAG(IS_APPLE) + +#if !BUILDFLAG(IS_APPLE) // Mac implementation is in file_util_mac.mm. +FilePath GetHomeDir() { +#if BUILDFLAG(IS_CHROMEOS) + if (SysInfo::IsRunningOnChromeOS()) { + // On Chrome OS chrome::DIR_USER_DATA is overridden with a primary user + // homedir once it becomes available. Return / as the safe option. + return FilePath("/"); + } +#endif + + const char* home_dir = getenv("HOME"); + if (home_dir && home_dir[0]) + return FilePath(home_dir); + +#if BUILDFLAG(IS_ANDROID) + DLOG(WARNING) << "OS_ANDROID: Home directory lookup not yet implemented."; +#endif + + FilePath rv; + if (GetTempDir(&rv)) + return rv; + + // Last resort. + return FilePath("/tmp"); +} +#endif // !BUILDFLAG(IS_APPLE) + +#if !defined(MOZ_ZUCCHINI) +File CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + // For call to close() inside ScopedFD. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(dir, temp_file); + return fd.is_valid() ? File(std::move(fd)) : File(File::GetLastFileError()); +} + +bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + // For call to close() inside ScopedFD. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(dir, temp_file); + return fd.is_valid(); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath FormatTemporaryFileName(FilePath::StringPieceType identifier) { +#if BUILDFLAG(IS_APPLE) + StringPiece prefix = base::mac::BaseBundleID(); +#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) + StringPiece prefix = "com.google.Chrome"; +#else + StringPiece prefix = "org.chromium.Chromium"; +#endif + return FilePath(StrCat({".", prefix, ".", identifier})); +} + +#if !defined(MOZ_ZUCCHINI) +ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path) { + ScopedFD scoped_fd = CreateAndOpenFdForTemporaryFileInDir(dir, path); + if (!scoped_fd.is_valid()) + return nullptr; + + int fd = scoped_fd.release(); + FILE* file = fdopen(fd, "a+"); + if (!file) + close(fd); + return ScopedFILE(file); +} +#endif // !defined(MOZ_ZUCCHINI) + +static bool CreateTemporaryDirInDirImpl(const FilePath& base_dir, + const FilePath& name_tmpl, + FilePath* new_dir) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, BlockingType::MAY_BLOCK); // For call to mkdtemp(). + DCHECK(EndsWith(name_tmpl.value(), "XXXXXX")) + << "Directory name template must end with \"XXXXXX\"."; + + FilePath sub_dir = base_dir.Append(name_tmpl); + std::string sub_dir_string = sub_dir.value(); + + // this should be OK since mkdtemp just replaces characters in place + char* buffer = const_cast(sub_dir_string.c_str()); + char* dtemp = mkdtemp(buffer); + if (!dtemp) { + DPLOG(ERROR) << "mkdtemp"; + return false; + } + *new_dir = FilePath(dtemp); + return true; +} + +bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir) { + FilePath::StringType mkdtemp_template = prefix; + mkdtemp_template.append("XXXXXX"); + return CreateTemporaryDirInDirImpl(base_dir, FilePath(mkdtemp_template), + new_dir); +} + +bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path) { + FilePath tmpdir; + if (!GetTempDir(&tmpdir)) + return false; + + return CreateTemporaryDirInDirImpl(tmpdir, GetTempTemplate(), new_temp_path); +} + +bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, BlockingType::MAY_BLOCK); // For call to mkdir(). + std::vector subpaths; + + // Collect a list of all parent directories. + FilePath last_path = full_path; + subpaths.push_back(full_path); + for (FilePath path = full_path.DirName(); + path.value() != last_path.value(); path = path.DirName()) { + subpaths.push_back(path); + last_path = path; + } + + // Iterate through the parents and create the missing ones. + for (const FilePath& subpath : base::Reversed(subpaths)) { + if (DirectoryExists(subpath)) + continue; + if (mkdir(subpath.value().c_str(), 0700) == 0) + continue; + // Mkdir failed, but it might have failed with EEXIST, or some other error + // due to the directory appearing out of thin air. This can occur if + // two processes are trying to create the same file system tree at the same + // time. Check to see if it exists and make sure it is a directory. + int saved_errno = errno; + if (!DirectoryExists(subpath)) { + if (error) + *error = File::OSErrorToFileError(saved_errno); + return false; + } + } + return true; +} + +#if !defined(MOZ_ZUCCHINI) +// ReadFileToStringNonBlockingNonBlocking will read a file to a string. This +// method should only be used on files which are known to be non-blocking such +// as procfs or sysfs nodes. Additionally, the file is opened as O_NONBLOCK so +// it WILL NOT block even if opened on a blocking file. It will return true if +// the file read until EOF and it will return false otherwise, errno will remain +// set on error conditions. |ret| will be populated with the contents of the +// file. +bool ReadFileToStringNonBlocking(const base::FilePath& file, std::string* ret) { + DCHECK(ret); + ret->clear(); + + base::ScopedFD fd(HANDLE_EINTR( + open(file.MaybeAsASCII().c_str(), O_CLOEXEC | O_NONBLOCK | O_RDONLY))); + if (!fd.is_valid()) { + return false; + } + + ssize_t bytes_read = 0; + do { + char buf[4096]; + bytes_read = HANDLE_EINTR(read(fd.get(), buf, sizeof(buf))); + if (bytes_read < 0) + return false; + if (bytes_read > 0) + ret->append(buf, static_cast(bytes_read)); + } while (bytes_read > 0); + + return true; +} + +bool NormalizeFilePath(const FilePath& path, FilePath* normalized_path) { + FilePath real_path_result = MakeAbsoluteFilePath(path); + if (real_path_result.empty()) + return false; + + // To be consistant with windows, fail if |real_path_result| is a + // directory. + if (DirectoryExists(real_path_result)) + return false; + + *normalized_path = real_path_result; + return true; +} + +// TODO(rkc): Refactor GetFileInfo and FileEnumerator to handle symlinks +// correctly. http://code.google.com/p/chromium-os/issues/detail?id=15948 +bool IsLink(const FilePath& file_path) { + stat_wrapper_t st; + // If we can't lstat the file, it's safe to assume that the file won't at + // least be a 'followable' link. + if (File::Lstat(file_path.value().c_str(), &st) != 0) + return false; + return S_ISLNK(st.st_mode); +} + +bool GetFileInfo(const FilePath& file_path, File::Info* results) { + stat_wrapper_t file_info; +#if BUILDFLAG(IS_ANDROID) + if (file_path.IsContentUri()) { + File file = OpenContentUriForRead(file_path); + if (!file.IsValid()) + return false; + return file.GetInfo(results); + } else { +#endif // BUILDFLAG(IS_ANDROID) + if (File::Stat(file_path.value().c_str(), &file_info) != 0) + return false; +#if BUILDFLAG(IS_ANDROID) + } +#endif // BUILDFLAG(IS_ANDROID) + + results->FromStat(file_info); + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +FILE* OpenFile(const FilePath& filename, const char* mode) { + // 'e' is unconditionally added below, so be sure there is not one already + // present before a comma in |mode|. + DCHECK( + strchr(mode, 'e') == nullptr || + (strchr(mode, ',') != nullptr && strchr(mode, 'e') > strchr(mode, ','))); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + FILE* result = nullptr; +#if BUILDFLAG(IS_APPLE) + // macOS does not provide a mode character to set O_CLOEXEC; see + // https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/fopen.3.html. + const char* the_mode = mode; +#else + std::string mode_with_e(AppendModeCharacter(mode, 'e')); + const char* the_mode = mode_with_e.c_str(); +#endif + do { + result = fopen(filename.value().c_str(), the_mode); + } while (!result && errno == EINTR); +#if BUILDFLAG(IS_APPLE) + // Mark the descriptor as close-on-exec. + if (result) + SetCloseOnExec(fileno(result)); +#endif + return result; +} + +// NaCl doesn't implement system calls to open files directly. +#if !BUILDFLAG(IS_NACL) +FILE* FileToFILE(File file, const char* mode) { + PlatformFile unowned = file.GetPlatformFile(); + FILE* stream = fdopen(file.TakePlatformFile(), mode); + if (!stream) + ScopedFD to_be_closed(unowned); + return stream; +} + +File FILEToFile(FILE* file_stream) { + if (!file_stream) + return File(); + + PlatformFile fd = fileno(file_stream); + DCHECK_NE(fd, -1); + ScopedPlatformFile other_fd(HANDLE_EINTR(dup(fd))); + if (!other_fd.is_valid()) + return File(File::GetLastFileError()); + return File(std::move(other_fd)); +} +#endif // !BUILDFLAG(IS_NACL) + +#if !defined(MOZ_ZUCCHINI) +int ReadFile(const FilePath& filename, char* data, int max_size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (max_size < 0) + return -1; + int fd = HANDLE_EINTR(open(filename.value().c_str(), O_RDONLY)); + if (fd < 0) + return -1; + + long bytes_read = HANDLE_EINTR(read(fd, data, static_cast(max_size))); + if (IGNORE_EINTR(close(fd)) < 0) + return -1; + return checked_cast(bytes_read); +} + +int WriteFile(const FilePath& filename, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (size < 0) + return -1; + int fd = HANDLE_EINTR(creat(filename.value().c_str(), 0666)); + if (fd < 0) + return -1; + + int bytes_written = + WriteFileDescriptor(fd, StringPiece(data, static_cast(size))) + ? size + : -1; + if (IGNORE_EINTR(close(fd)) < 0) + return -1; + return bytes_written; +} + +bool WriteFileDescriptor(int fd, span data) { + // Allow for partial writes. + ssize_t bytes_written_total = 0; + ssize_t size = checked_cast(data.size()); + for (ssize_t bytes_written_partial = 0; bytes_written_total < size; + bytes_written_total += bytes_written_partial) { + bytes_written_partial = + HANDLE_EINTR(write(fd, data.data() + bytes_written_total, + static_cast(size - bytes_written_total))); + if (bytes_written_partial < 0) + return false; + } + + return true; +} + +bool WriteFileDescriptor(int fd, StringPiece data) { + return WriteFileDescriptor(fd, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool AllocateFileRegion(File* file, int64_t offset, size_t size) { + DCHECK(file); + + // Explicitly extend |file| to the maximum size. Zeros will fill the new + // space. It is assumed that the existing file is fully realized as + // otherwise the entire file would have to be read and possibly written. + const int64_t original_file_len = file->GetLength(); + if (original_file_len < 0) { + DPLOG(ERROR) << "fstat " << file->GetPlatformFile(); + return false; + } + + // Increase the actual length of the file, if necessary. This can fail if + // the disk is full and the OS doesn't support sparse files. + const int64_t new_file_len = offset + static_cast(size); + // If the first condition fails, the cast on the previous line was invalid + // (though not UB). + if (!IsValueInRangeForNumericType(size) || + !IsValueInRangeForNumericType(size) || + !IsValueInRangeForNumericType(new_file_len) || + !file->SetLength(std::max(original_file_len, new_file_len))) { + DPLOG(ERROR) << "ftruncate " << file->GetPlatformFile(); + return false; + } + + // Realize the extent of the file so that it can't fail (and crash) later + // when trying to write to a memory page that can't be created. This can + // fail if the disk is full and the file is sparse. + + // First try the more effective platform-specific way of allocating the disk + // space. It can fail because the filesystem doesn't support it. In that case, + // use the manual method below. + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + if (HANDLE_EINTR(fallocate(file->GetPlatformFile(), 0, offset, + static_cast(size))) != -1) + return true; + DPLOG(ERROR) << "fallocate"; +#elif BUILDFLAG(IS_APPLE) + // MacOS doesn't support fallocate even though their new APFS filesystem + // does support sparse files. It does, however, have the functionality + // available via fcntl. + // See also: https://openradar.appspot.com/32720223 + fstore_t params = {F_ALLOCATEALL, F_PEOFPOSMODE, offset, + static_cast(size), 0}; + if (fcntl(file->GetPlatformFile(), F_PREALLOCATE, ¶ms) != -1) + return true; + DPLOG(ERROR) << "F_PREALLOCATE"; +#endif + + // Manually realize the extended file by writing bytes to it at intervals. + blksize_t block_size = 512; // Start with something safe. + stat_wrapper_t statbuf; + if (File::Fstat(file->GetPlatformFile(), &statbuf) == 0 && + statbuf.st_blksize > 0 && base::bits::IsPowerOfTwo(statbuf.st_blksize)) { + block_size = static_cast(statbuf.st_blksize); + } + + // Write starting at the next block boundary after the old file length. + const int64_t extension_start = checked_cast(base::bits::AlignUp( + static_cast(original_file_len), static_cast(block_size))); + for (int64_t i = extension_start; i < new_file_len; i += block_size) { + char existing_byte; + if (HANDLE_EINTR(pread(file->GetPlatformFile(), &existing_byte, 1, + static_cast(i))) != 1) { + return false; // Can't read? Not viable. + } + if (existing_byte != 0) { + continue; // Block has data so must already exist. + } + if (HANDLE_EINTR(pwrite(file->GetPlatformFile(), &existing_byte, 1, + static_cast(i))) != 1) { + return false; // Can't write? Not viable. + } + } + + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool AppendToFile(const FilePath& filename, span data) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + bool ret = true; + int fd = HANDLE_EINTR(open(filename.value().c_str(), O_WRONLY | O_APPEND)); + if (fd < 0) { + VPLOG(1) << "Unable to create file " << filename.value(); + return false; + } + + // This call will either write all of the data or return false. + if (!WriteFileDescriptor(fd, data)) { + VPLOG(1) << "Error while writing to file " << filename.value(); + ret = false; + } + + if (IGNORE_EINTR(close(fd)) < 0) { + VPLOG(1) << "Error while closing file " << filename.value(); + return false; + } + + return ret; +} + +bool AppendToFile(const FilePath& filename, StringPiece data) { + return AppendToFile(filename, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool GetCurrentDirectory(FilePath* dir) { + // getcwd can return ENOENT, which implies it checks against the disk. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + char system_buffer[PATH_MAX] = ""; + if (!getcwd(system_buffer, sizeof(system_buffer))) { + return false; + } + *dir = FilePath(system_buffer); + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool SetCurrentDirectory(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return chdir(path.value().c_str()) == 0; +} + +#if BUILDFLAG(IS_MAC) +bool VerifyPathControlledByUser(const FilePath& base, + const FilePath& path, + uid_t owner_uid, + const std::set& group_gids) { + if (base != path && !base.IsParent(path)) { + DLOG(ERROR) << "|base| must be a subdirectory of |path|. base = \"" + << base.value() << "\", path = \"" << path.value() << "\""; + return false; + } + + std::vector base_components = base.GetComponents(); + std::vector path_components = path.GetComponents(); + std::vector::const_iterator ib, ip; + for (ib = base_components.begin(), ip = path_components.begin(); + ib != base_components.end(); ++ib, ++ip) { + // |base| must be a subpath of |path|, so all components should match. + // If these CHECKs fail, look at the test that base is a parent of + // path at the top of this function. + DCHECK(ip != path_components.end()); + DCHECK(*ip == *ib); + } + + FilePath current_path = base; + if (!VerifySpecificPathControlledByUser(current_path, owner_uid, group_gids)) + return false; + + for (; ip != path_components.end(); ++ip) { + current_path = current_path.Append(*ip); + if (!VerifySpecificPathControlledByUser( + current_path, owner_uid, group_gids)) + return false; + } + return true; +} + +bool VerifyPathControlledByAdmin(const FilePath& path) { + const unsigned kRootUid = 0; + const FilePath kFileSystemRoot("/"); + + // The name of the administrator group on mac os. + const char* const kAdminGroupNames[] = { + "admin", + "wheel" + }; + + // Reading the groups database may touch the file system. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + std::set allowed_group_ids; + for (int i = 0, ie = std::size(kAdminGroupNames); i < ie; ++i) { + struct group *group_record = getgrnam(kAdminGroupNames[i]); + if (!group_record) { + DPLOG(ERROR) << "Could not get the group ID of group \"" + << kAdminGroupNames[i] << "\"."; + continue; + } + + allowed_group_ids.insert(group_record->gr_gid); + } + + return VerifyPathControlledByUser( + kFileSystemRoot, path, kRootUid, allowed_group_ids); +} +#endif // BUILDFLAG(IS_MAC) + +int GetMaximumPathComponentLength(const FilePath& path) { +#if BUILDFLAG(IS_FUCHSIA) + // Return a value we do not expect anyone ever to reach, but which is small + // enough to guard against e.g. bugs causing multi-megabyte paths. + return 1024; +#else + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return saturated_cast(pathconf(path.value().c_str(), _PC_NAME_MAX)); +#endif +} + +#if !BUILDFLAG(IS_ANDROID) +// This is implemented in file_util_android.cc for that platform. +bool GetShmemTempDir(bool executable, FilePath* path) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + bool disable_dev_shm = false; +#if !BUILDFLAG(IS_CHROMEOS) + disable_dev_shm = CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableDevShmUsage); +#endif + bool use_dev_shm = true; + if (executable) { + static const bool s_dev_shm_executable = + IsPathExecutable(FilePath("/dev/shm")); + use_dev_shm = s_dev_shm_executable; + } + if (use_dev_shm && !disable_dev_shm) { + *path = FilePath("/dev/shm"); + return true; + } +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + return GetTempDir(path); +} +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_APPLE) +// Mac has its own implementation, this is for all other Posix systems. +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + File infile; +#if BUILDFLAG(IS_ANDROID) + if (from_path.IsContentUri()) { + infile = OpenContentUriForRead(from_path); + } else { + infile = File(from_path, File::FLAG_OPEN | File::FLAG_READ); + } +#else + infile = File(from_path, File::FLAG_OPEN | File::FLAG_READ); +#endif + if (!infile.IsValid()) + return false; + + File outfile(to_path, File::FLAG_WRITE | File::FLAG_CREATE_ALWAYS); + if (!outfile.IsValid()) + return false; + + return CopyFileContents(infile, outfile); +} +#endif // !BUILDFLAG(IS_APPLE) + +bool PreReadFile(const FilePath& file_path, + bool is_executable, + int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + // posix_fadvise() is only available in the Android NDK in API 21+. Older + // versions may have the required kernel support, but don't have enough usage + // to justify backporting. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ + (BUILDFLAG(IS_ANDROID) && __ANDROID_API__ >= 21) + File file(file_path, File::FLAG_OPEN | File::FLAG_READ); + if (!file.IsValid()) + return false; + + if (max_bytes == 0) { + // fadvise() pre-fetches the entire file when given a zero length. + return true; + } + + const PlatformFile fd = file.GetPlatformFile(); + const ::off_t len = base::saturated_cast<::off_t>(max_bytes); + return posix_fadvise(fd, /*offset=*/0, len, POSIX_FADV_WILLNEED) == 0; +#elif BUILDFLAG(IS_APPLE) + File file(file_path, File::FLAG_OPEN | File::FLAG_READ); + if (!file.IsValid()) + return false; + + if (max_bytes == 0) { + // fcntl(F_RDADVISE) fails when given a zero length. + return true; + } + + const PlatformFile fd = file.GetPlatformFile(); + ::radvisory read_advise_data = { + .ra_offset = 0, .ra_count = base::saturated_cast(max_bytes)}; + return fcntl(fd, F_RDADVISE, &read_advise_data) != -1; +#else + return internal::PreReadFileSlow(file_path, max_bytes); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // (BUILDFLAG(IS_ANDROID) && + // __ANDROID_API__ >= 21) +} + +// ----------------------------------------------------------------------------- + +namespace internal { + +bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + // Windows compatibility: if |to_path| exists, |from_path| and |to_path| + // must be the same type, either both files, or both directories. + stat_wrapper_t to_file_info; + if (File::Stat(to_path.value().c_str(), &to_file_info) == 0) { + stat_wrapper_t from_file_info; + if (File::Stat(from_path.value().c_str(), &from_file_info) != 0) + return false; + if (S_ISDIR(to_file_info.st_mode) != S_ISDIR(from_file_info.st_mode)) + return false; + } + + if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0) + return true; + + if (!CopyDirectory(from_path, to_path, true)) + return false; + + DeletePathRecursively(from_path); + return true; +} + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +bool CopyFileContentsWithSendfile(File& infile, + File& outfile, + bool& retry_slow) { + DCHECK(infile.IsValid()); + stat_wrapper_t in_file_info; + retry_slow = false; + + if (base::File::Fstat(infile.GetPlatformFile(), &in_file_info)) { + return false; + } + + int64_t file_size = in_file_info.st_size; + if (file_size < 0) + return false; + if (file_size == 0) { + // Non-regular files can return a file size of 0, things such as pipes, + // sockets, etc. Additionally, kernel seq_files(most procfs files) will also + // return 0 while still reporting as a regular file. Unfortunately, in some + // of these situations there are easy ways to detect them, in others there + // are not. No extra syscalls are needed if it's not a regular file. + // + // Because any attempt to detect it would likely require another syscall, + // let's just fall back to a slow copy which will invoke a single read(2) to + // determine if the file has contents or if it's really a zero length file. + retry_slow = true; + return false; + } + + size_t copied = 0; + ssize_t res = 0; + do { + // Don't specify an offset and the kernel will begin reading/writing to the + // current file offsets. + res = HANDLE_EINTR(sendfile( + outfile.GetPlatformFile(), infile.GetPlatformFile(), /*offset=*/nullptr, + /*length=*/static_cast(file_size) - copied)); + if (res <= 0) { + break; + } + + copied += static_cast(res); + } while (copied < static_cast(file_size)); + + // Fallback on non-fatal error cases. None of these errors can happen after + // data has started copying, a check is included for good measure. As a result + // file sizes and file offsets will not have changed. A slow fallback and + // proceed without issues. + retry_slow = (copied == 0 && res < 0 && + (errno == EINVAL || errno == ENOSYS || errno == EPERM)); + + return res >= 0; +} +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID) + +} // namespace internal + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +BASE_EXPORT bool IsPathExecutable(const FilePath& path) { + bool result = false; + FilePath tmp_file_path; + + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(path, &tmp_file_path); + if (fd.is_valid()) { + DeleteFile(tmp_file_path); + long sysconf_result = sysconf(_SC_PAGESIZE); + CHECK_GE(sysconf_result, 0); + size_t pagesize = static_cast(sysconf_result); + CHECK_GE(sizeof(pagesize), sizeof(sysconf_result)); + void* mapping = mmap(nullptr, pagesize, PROT_READ, MAP_SHARED, fd.get(), 0); + if (mapping != MAP_FAILED) { + if (HANDLE_EINTR(mprotect(mapping, pagesize, PROT_READ | PROT_EXEC)) == 0) + result = true; + munmap(mapping, pagesize); + } + } + return result; +} +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +#endif // !defined(MOZ_ZUCCHINI) +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,1291 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/check.h" +#include "base/clang_profiling_buildflags.h" +#include "base/debug/alias.h" +#include "base/feature_list.h" +#include "base/features.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/memory_mapped_file.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/location.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/path_service.h" +#include "base/process/process_handle.h" +#include "base/rand_util.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/strcat.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/strings/string_number_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/string_piece.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/strings/string_util.h" +#include "base/strings/string_util_win.h" +#include "base/strings/utf_string_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/task/bind_post_task.h" +#include "base/task/sequenced_task_runner.h" +#include "base/task/thread_pool.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_blocking_call.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_thread_priority.h" +#include "base/time/time.h" +#include "base/uuid.h" +#include "base/win/scoped_handle.h" +#include "base/win/security_util.h" +#include "base/win/sid.h" +#include "base/win/windows_types.h" +#include "base/win/windows_version.h" +#endif // !defined(MOZ_ZUCCHINI) + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +int g_extra_allowed_path_for_no_execute = 0; +#endif // !defined(MOZ_ZUCCHINI) + +const DWORD kFileShareAll = + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; +const wchar_t kDefaultTempDirPrefix[] = L"ChromiumTemp"; + +// Returns the Win32 last error code or ERROR_SUCCESS if the last error code is +// ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND. This is useful in cases where +// the absence of a file or path is a success condition (e.g., when attempting +// to delete an item in the filesystem). +DWORD ReturnLastErrorOrSuccessOnNotFound() { + const DWORD error_code = ::GetLastError(); + return (error_code == ERROR_FILE_NOT_FOUND || + error_code == ERROR_PATH_NOT_FOUND) + ? ERROR_SUCCESS + : error_code; +} + +// Deletes all files and directories in a path. +// Returns ERROR_SUCCESS on success or the Windows error code corresponding to +// the first error encountered. ERROR_FILE_NOT_FOUND and ERROR_PATH_NOT_FOUND +// are considered success conditions, and are therefore never returned. +DWORD DeleteFileRecursive(const FilePath& path, + const FilePath::StringType& pattern, + bool recursive) { + FileEnumerator traversal(path, false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES, + pattern); + DWORD result = ERROR_SUCCESS; + for (FilePath current = traversal.Next(); !current.empty(); + current = traversal.Next()) { + // Try to clear the read-only bit if we find it. + FileEnumerator::FileInfo info = traversal.GetInfo(); + if ((info.find_data().dwFileAttributes & FILE_ATTRIBUTE_READONLY) && + (recursive || !info.IsDirectory())) { + ::SetFileAttributes( + current.value().c_str(), + info.find_data().dwFileAttributes & ~DWORD{FILE_ATTRIBUTE_READONLY}); + } + + DWORD this_result = ERROR_SUCCESS; + if (info.IsDirectory()) { + if (recursive) { + this_result = DeleteFileRecursive(current, pattern, true); + DCHECK_NE(static_cast(this_result), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(this_result), ERROR_PATH_NOT_FOUND); + if (this_result == ERROR_SUCCESS && + !::RemoveDirectory(current.value().c_str())) { + this_result = ReturnLastErrorOrSuccessOnNotFound(); + } + } + } else if (!::DeleteFile(current.value().c_str())) { + this_result = ReturnLastErrorOrSuccessOnNotFound(); + } + if (result == ERROR_SUCCESS) + result = this_result; + } + return result; +} + +// Appends |mode_char| to |mode| before the optional character set encoding; see +// https://msdn.microsoft.com/library/yeby3zcb.aspx for details. +void AppendModeCharacter(wchar_t mode_char, std::wstring* mode) { + size_t comma_pos = mode->find(L','); + mode->insert(comma_pos == std::wstring::npos ? mode->length() : comma_pos, 1, + mode_char); +} + +#if !defined(MOZ_ZUCCHINI) +bool DoCopyFile(const FilePath& from_path, + const FilePath& to_path, + bool fail_if_exists) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + + // Mitigate the issues caused by loading DLLs on a background thread + // (http://crbug/973868). + SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY(); + + // Unlike the posix implementation that copies the file manually and discards + // the ACL bits, CopyFile() copies the complete SECURITY_DESCRIPTOR and access + // bits, which is usually not what we want. We can't do much about the + // SECURITY_DESCRIPTOR but at least remove the read only bit. + const wchar_t* dest = to_path.value().c_str(); + if (!::CopyFile(from_path.value().c_str(), dest, fail_if_exists)) { + // Copy failed. + return false; + } + DWORD attrs = GetFileAttributes(dest); + if (attrs == INVALID_FILE_ATTRIBUTES) { + return false; + } + if (attrs & FILE_ATTRIBUTE_READONLY) { + SetFileAttributes(dest, attrs & ~DWORD{FILE_ATTRIBUTE_READONLY}); + } + return true; +} + +bool DoCopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive, + bool fail_if_exists) { + // NOTE(maruel): Previous version of this function used to call + // SHFileOperation(). This used to copy the file attributes and extended + // attributes, OLE structured storage, NTFS file system alternate data + // streams, SECURITY_DESCRIPTOR. In practice, this is not what we want, we + // want the containing directory to propagate its SECURITY_DESCRIPTOR. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + + // This function does not properly handle destinations within the source. + FilePath real_to_path = to_path; + if (PathExists(real_to_path)) { + real_to_path = MakeAbsoluteFilePath(real_to_path); + if (real_to_path.empty()) + return false; + } else { + real_to_path = MakeAbsoluteFilePath(real_to_path.DirName()); + if (real_to_path.empty()) + return false; + } + FilePath real_from_path = MakeAbsoluteFilePath(from_path); + if (real_from_path.empty()) + return false; + if (real_to_path == real_from_path || real_from_path.IsParent(real_to_path)) + return false; + + int traverse_type = FileEnumerator::FILES; + if (recursive) + traverse_type |= FileEnumerator::DIRECTORIES; + FileEnumerator traversal(from_path, recursive, traverse_type); + + if (!PathExists(from_path)) { + DLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " + << from_path.value().c_str(); + return false; + } + // TODO(maruel): This is not necessary anymore. + DCHECK(recursive || DirectoryExists(from_path)); + + FilePath current = from_path; + bool from_is_dir = DirectoryExists(from_path); + bool success = true; + FilePath from_path_base = from_path; + if (recursive && DirectoryExists(to_path)) { + // If the destination already exists and is a directory, then the + // top level of source needs to be copied. + from_path_base = from_path.DirName(); + } + + while (success && !current.empty()) { + // current is the source path, including from_path, so append + // the suffix after from_path to to_path to create the target_path. + FilePath target_path(to_path); + if (from_path_base != current) { + if (!from_path_base.AppendRelativePath(current, &target_path)) { + success = false; + break; + } + } + + if (from_is_dir) { + if (!DirectoryExists(target_path) && + !::CreateDirectory(target_path.value().c_str(), NULL)) { + DLOG(ERROR) << "CopyDirectory() couldn't create directory: " + << target_path.value().c_str(); + success = false; + } + } else if (!DoCopyFile(current, target_path, fail_if_exists)) { + DLOG(ERROR) << "CopyDirectory() couldn't create file: " + << target_path.value().c_str(); + success = false; + } + + current = traversal.Next(); + if (!current.empty()) + from_is_dir = traversal.GetInfo().IsDirectory(); + } + + return success; +} +#endif // !defined(MOZ_ZUCCHINI) + +// Returns ERROR_SUCCESS on success, or a Windows error code on failure. +DWORD DoDeleteFile(const FilePath& path, bool recursive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (path.empty()) + return ERROR_SUCCESS; + + if (path.value().length() >= MAX_PATH) + return ERROR_BAD_PATHNAME; + + // Handle any path with wildcards. + if (path.BaseName().value().find_first_of(FILE_PATH_LITERAL("*?")) != + FilePath::StringType::npos) { + const DWORD error_code = + DeleteFileRecursive(path.DirName(), path.BaseName().value(), recursive); + DCHECK_NE(static_cast(error_code), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(error_code), ERROR_PATH_NOT_FOUND); + return error_code; + } + + // Report success if the file or path does not exist. + const DWORD attr = ::GetFileAttributes(path.value().c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) + return ReturnLastErrorOrSuccessOnNotFound(); + + // Clear the read-only bit if it is set. + if ((attr & FILE_ATTRIBUTE_READONLY) && + !::SetFileAttributes(path.value().c_str(), + attr & ~DWORD{FILE_ATTRIBUTE_READONLY})) { + // It's possible for |path| to be gone now under a race with other deleters. + return ReturnLastErrorOrSuccessOnNotFound(); + } + + // Perform a simple delete on anything that isn't a directory. + if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) { + return ::DeleteFile(path.value().c_str()) + ? ERROR_SUCCESS + : ReturnLastErrorOrSuccessOnNotFound(); + } + + if (recursive) { + const DWORD error_code = + DeleteFileRecursive(path, FILE_PATH_LITERAL("*"), true); + DCHECK_NE(static_cast(error_code), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(error_code), ERROR_PATH_NOT_FOUND); + if (error_code != ERROR_SUCCESS) + return error_code; + } + return ::RemoveDirectory(path.value().c_str()) + ? ERROR_SUCCESS + : ReturnLastErrorOrSuccessOnNotFound(); +} + +// Deletes the file/directory at |path| (recursively if |recursive| and |path| +// names a directory), returning true on success. Sets the Windows last-error +// code and returns false on failure. +bool DeleteFileOrSetLastError(const FilePath& path, bool recursive) { + const DWORD error = DoDeleteFile(path, recursive); + if (error == ERROR_SUCCESS) + return true; + + ::SetLastError(error); + return false; +} + +#if !defined(MOZ_ZUCCHINI) +constexpr int kMaxDeleteAttempts = 9; + +void DeleteFileWithRetry(const FilePath& path, + bool recursive, + int attempt, + OnceCallback reply_callback) { + // Retry every 250ms for up to two seconds. These values were pulled out of + // thin air, and may be adjusted in the future based on the metrics collected. + static constexpr TimeDelta kDeleteFileRetryDelay = Milliseconds(250); + + if (DeleteFileOrSetLastError(path, recursive)) { + // Consider introducing further retries until the item has been removed from + // the filesystem and its name is ready for reuse; see the comments in + // chrome/installer/mini_installer/delete_with_retry.cc for details. + if (!reply_callback.is_null()) + std::move(reply_callback).Run(true); + return; + } + + ++attempt; + DCHECK_LE(attempt, kMaxDeleteAttempts); + if (attempt == kMaxDeleteAttempts) { + if (!reply_callback.is_null()) + std::move(reply_callback).Run(false); + return; + } + + ThreadPool::PostDelayedTask(FROM_HERE, + {TaskPriority::BEST_EFFORT, MayBlock()}, + BindOnce(&DeleteFileWithRetry, path, recursive, + attempt, std::move(reply_callback)), + kDeleteFileRetryDelay); +} + +OnceClosure GetDeleteFileCallbackInternal( + const FilePath& path, + bool recursive, + OnceCallback reply_callback) { + OnceCallback bound_callback; + if (!reply_callback.is_null()) { + bound_callback = BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback)); + } + return BindOnce(&DeleteFileWithRetry, path, recursive, /*attempt=*/0, + std::move(bound_callback)); +} + +// This function verifies that no code is attempting to set an ACL on a file +// that is outside of 'safe' paths. A 'safe' path is defined as one that is +// within the user data dir, or the temporary directory. This is explicitly to +// prevent code from trying to pass a writeable handle to a file outside of +// these directories to an untrusted process. E.g. if some future code created a +// writeable handle to a file in c:\users\user\sensitive.dat, this DCHECK would +// hit. Setting an ACL on a file outside of these chrome-controlled directories +// might cause the browser or operating system to fail in unexpected ways. +bool IsPathSafeToSetAclOn(const FilePath& path) { +#if BUILDFLAG(CLANG_PROFILING) + // Ignore .profraw profiling files, as they can occur anywhere, and only occur + // during testing. + if (path.Extension() == FILE_PATH_LITERAL(".profraw")) { + return true; + } +#endif // BUILDFLAG(CLANG_PROFILING) + std::vector valid_path_keys({DIR_TEMP}); + if (g_extra_allowed_path_for_no_execute) { + valid_path_keys.push_back(g_extra_allowed_path_for_no_execute); + } + + // MakeLongFilePath is needed here because temp files can have an 8.3 path + // under certain conditions. See comments in base::MakeLongFilePath. + FilePath long_path = MakeLongFilePath(path); + DCHECK(!long_path.empty()) << "Cannot get long path for " << path; + + std::vector valid_paths; + for (const auto path_key : valid_path_keys) { + FilePath valid_path; + if (!PathService::Get(path_key, &valid_path)) { + DLOG(FATAL) << "Cannot get path for pathservice key " << path_key; + continue; + } + valid_paths.push_back(valid_path); + } + + // Admin users create temporary files in `GetSecureSystemTemp`, see + // `CreateNewTempDirectory` below. + FilePath secure_system_temp; + if (::IsUserAnAdmin() && GetSecureSystemTemp(&secure_system_temp)) { + valid_paths.push_back(secure_system_temp); + } + + for (const auto& valid_path : valid_paths) { + // Temp files can sometimes have an 8.3 path. See comments in + // `MakeLongFilePath`. + FilePath full_path = MakeLongFilePath(valid_path); + DCHECK(!full_path.empty()) << "Cannot get long path for " << valid_path; + if (full_path.IsParent(long_path)) { + return true; + } + } + + return false; +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace + +#if !defined(MOZ_ZUCCHINI) +OnceClosure GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback) { + return GetDeleteFileCallbackInternal(path, /*recursive=*/false, + std::move(reply_callback)); +} + +OnceClosure GetDeletePathRecursivelyCallback( + const FilePath& path, + OnceCallback reply_callback) { + return GetDeleteFileCallbackInternal(path, /*recursive=*/true, + std::move(reply_callback)); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath MakeAbsoluteFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + wchar_t file_path[MAX_PATH]; + if (!_wfullpath(file_path, input.value().c_str(), MAX_PATH)) + return FilePath(); + return FilePath(file_path); +} + +bool DeleteFile(const FilePath& path) { + return DeleteFileOrSetLastError(path, /*recursive=*/false); +} + +bool DeletePathRecursively(const FilePath& path) { + return DeleteFileOrSetLastError(path, /*recursive=*/true); +} + +#if !defined(MOZ_ZUCCHINI) +bool DeleteFileAfterReboot(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (path.value().length() >= MAX_PATH) + return false; + + return ::MoveFileEx(path.value().c_str(), nullptr, + MOVEFILE_DELAY_UNTIL_REBOOT); +} + +bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Alias paths for investigation of shutdown hangs. crbug.com/1054164 + FilePath::CharType from_path_str[MAX_PATH]; + base::wcslcpy(from_path_str, from_path.value().c_str(), + std::size(from_path_str)); + base::debug::Alias(from_path_str); + FilePath::CharType to_path_str[MAX_PATH]; + base::wcslcpy(to_path_str, to_path.value().c_str(), std::size(to_path_str)); + base::debug::Alias(to_path_str); + + // Assume that |to_path| already exists and try the normal replace. This will + // fail with ERROR_FILE_NOT_FOUND if |to_path| does not exist. When writing to + // a network share, we may not be able to change the ACLs. Ignore ACL errors + // then (REPLACEFILE_IGNORE_MERGE_ERRORS). + if (::ReplaceFile(to_path.value().c_str(), from_path.value().c_str(), NULL, + REPLACEFILE_IGNORE_MERGE_ERRORS, NULL, NULL)) { + return true; + } + + File::Error replace_error = File::OSErrorToFileError(GetLastError()); + + // Try a simple move next. It will only succeed when |to_path| doesn't already + // exist. + if (::MoveFile(from_path.value().c_str(), to_path.value().c_str())) + return true; + + // In the case of FILE_ERROR_NOT_FOUND from ReplaceFile, it is likely that + // |to_path| does not exist. In this case, the more relevant error comes + // from the call to MoveFile. + if (error) { + *error = replace_error == File::FILE_ERROR_NOT_FOUND + ? File::GetLastFileError() + : replace_error; + } + return false; +} + +bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, false); +} + +bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, true); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool PathExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return (GetFileAttributes(path.value().c_str()) != INVALID_FILE_ATTRIBUTES); +} + +namespace { + +bool PathHasAccess(const FilePath& path, + DWORD dir_desired_access, + DWORD file_desired_access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + const wchar_t* const path_str = path.value().c_str(); + DWORD fileattr = GetFileAttributes(path_str); + if (fileattr == INVALID_FILE_ATTRIBUTES) + return false; + + bool is_directory = fileattr & FILE_ATTRIBUTE_DIRECTORY; + DWORD desired_access = + is_directory ? dir_desired_access : file_desired_access; + DWORD flags_and_attrs = + is_directory ? FILE_FLAG_BACKUP_SEMANTICS : FILE_ATTRIBUTE_NORMAL; + + win::ScopedHandle file(CreateFile(path_str, desired_access, kFileShareAll, + nullptr, OPEN_EXISTING, flags_and_attrs, + nullptr)); + + return file.is_valid(); +} + +} // namespace + +bool PathIsReadable(const FilePath& path) { + return PathHasAccess(path, FILE_LIST_DIRECTORY, GENERIC_READ); +} + +bool PathIsWritable(const FilePath& path) { + return PathHasAccess(path, FILE_ADD_FILE, GENERIC_WRITE); +} + +bool DirectoryExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DWORD fileattr = GetFileAttributes(path.value().c_str()); + if (fileattr != INVALID_FILE_ATTRIBUTES) + return (fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0; + return false; +} + +bool GetTempDir(FilePath* path) { + wchar_t temp_path[MAX_PATH + 1]; + DWORD path_len = ::GetTempPath(MAX_PATH, temp_path); + if (path_len >= MAX_PATH || path_len <= 0) + return false; + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + *path = FilePath(temp_path).StripTrailingSeparators(); + return true; +} + +FilePath GetHomeDir() { + wchar_t result[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, + result)) && + result[0]) { + return FilePath(result); + } + + // Fall back to the temporary directory on failure. + FilePath temp; + if (GetTempDir(&temp)) + return temp; + + // Last resort. + return FilePath(FILE_PATH_LITERAL("C:\\")); +} + +#if !defined(MOZ_ZUCCHINI) +File CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Open the file with exclusive r/w/d access, and allow the caller to decide + // to mark it for deletion upon close after the fact. + constexpr uint32_t kFlags = File::FLAG_CREATE | File::FLAG_READ | + File::FLAG_WRITE | File::FLAG_WIN_EXCLUSIVE_READ | + File::FLAG_WIN_EXCLUSIVE_WRITE | + File::FLAG_CAN_DELETE_ON_CLOSE; + + // Use GUID instead of ::GetTempFileName() to generate unique file names. + // "Due to the algorithm used to generate file names, GetTempFileName can + // perform poorly when creating a large number of files with the same prefix. + // In such cases, it is recommended that you construct unique file names based + // on GUIDs." + // https://msdn.microsoft.com/library/windows/desktop/aa364991.aspx + + FilePath temp_name; + File file; + + // Although it is nearly impossible to get a duplicate name with GUID, we + // still use a loop here in case it happens. + for (int i = 0; i < 100; ++i) { + temp_name = dir.Append(FormatTemporaryFileName( + UTF8ToWide(Uuid::GenerateRandomV4().AsLowercaseString()))); + file.Initialize(temp_name, kFlags); + if (file.IsValid()) + break; + } + + if (!file.IsValid()) { + DPLOG(WARNING) << "Failed to get temporary file name in " << dir.value(); + return file; + } + + wchar_t long_temp_name[MAX_PATH + 1]; + const DWORD long_name_len = + GetLongPathName(temp_name.value().c_str(), long_temp_name, MAX_PATH); + if (long_name_len != 0 && long_name_len <= MAX_PATH) { + *temp_file = + FilePath(FilePath::StringPieceType(long_temp_name, long_name_len)); + } else { + // GetLongPathName() failed, but we still have a temporary file. + *temp_file = std::move(temp_name); + } + + return file; +} + +bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + return CreateAndOpenTemporaryFileInDir(dir, temp_file).IsValid(); +} + +FilePath FormatTemporaryFileName(FilePath::StringPieceType identifier) { + return FilePath(StrCat({identifier, FILE_PATH_LITERAL(".tmp")})); +} + +ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path) { + // Open file in binary mode, to avoid problems with fwrite. On Windows + // it replaces \n's with \r\n's, which may surprise you. + // Reference: http://msdn.microsoft.com/en-us/library/h9t88zwz(VS.71).aspx + return ScopedFILE( + FileToFILE(CreateAndOpenTemporaryFileInDir(dir, path), "wb+")); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + FilePath path_to_create; + + for (int count = 0; count < 50; ++count) { + // Try create a new temporary directory with random generated name. If + // the one exists, keep trying another path name until we reach some limit. + std::wstring new_dir_name; + new_dir_name.assign(prefix); + new_dir_name.append(AsWString(NumberToString16(GetCurrentProcId()))); + new_dir_name.push_back('_'); + new_dir_name.append(AsWString( + NumberToString16(RandInt(0, std::numeric_limits::max())))); + + path_to_create = base_dir.Append(new_dir_name); + if (::CreateDirectory(path_to_create.value().c_str(), NULL)) { + *new_dir = path_to_create; + return true; + } + } + + return false; +} + +bool GetSecureSystemTemp(FilePath* temp) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + CHECK(temp); + + for (const auto key : {DIR_WINDOWS, DIR_PROGRAM_FILES}) { + FilePath secure_system_temp; + if (!PathService::Get(key, &secure_system_temp)) { + continue; + } + + if (key == DIR_WINDOWS) { + secure_system_temp = secure_system_temp.AppendASCII("SystemTemp"); + } + + if (PathExists(secure_system_temp) && PathIsWritable(secure_system_temp)) { + *temp = secure_system_temp; + return true; + } + } + + return false; +} + +// The directory is created under `GetSecureSystemTemp` for security reasons if +// the caller is admin to avoid attacks from lower privilege processes. +// +// If unable to create a dir under `GetSecureSystemTemp`, the dir is created +// under %TEMP%. The reasons for not being able to create a dir under +// `GetSecureSystemTemp` could be because `%systemroot%\SystemTemp` does not +// exist, or unable to resolve `DIR_WINDOWS` or `DIR_PROGRAM_FILES`, say due to +// registry redirection, or unable to create a directory due to +// `GetSecureSystemTemp` being read-only or having atypical ACLs. +bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + DCHECK(new_temp_path); + + FilePath parent_dir; + if (::IsUserAnAdmin() && GetSecureSystemTemp(&parent_dir) && + CreateTemporaryDirInDir(parent_dir, + prefix.empty() ? kDefaultTempDirPrefix : prefix, + new_temp_path)) { + return true; + } + + if (!GetTempDir(&parent_dir)) + return false; + + return CreateTemporaryDirInDir(parent_dir, prefix, new_temp_path); +} + +bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // If the path exists, we've succeeded if it's a directory, failed otherwise. + const wchar_t* const full_path_str = full_path.value().c_str(); + const DWORD fileattr = ::GetFileAttributes(full_path_str); + if (fileattr != INVALID_FILE_ATTRIBUTES) { + if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0) { + return true; + } + DLOG(WARNING) << "CreateDirectory(" << full_path_str << "), " + << "conflicts with existing file."; + if (error) + *error = File::FILE_ERROR_NOT_A_DIRECTORY; + ::SetLastError(ERROR_FILE_EXISTS); + return false; + } + + // Invariant: Path does not exist as file or directory. + + // Attempt to create the parent recursively. This will immediately return + // true if it already exists, otherwise will create all required parent + // directories starting with the highest-level missing parent. + FilePath parent_path(full_path.DirName()); + if (parent_path.value() == full_path.value()) { + if (error) + *error = File::FILE_ERROR_NOT_FOUND; + ::SetLastError(ERROR_FILE_NOT_FOUND); + return false; + } + if (!CreateDirectoryAndGetError(parent_path, error)) { + DLOG(WARNING) << "Failed to create one of the parent directories."; + DCHECK(!error || *error != File::FILE_OK); + return false; + } + + if (::CreateDirectory(full_path_str, NULL)) + return true; + + const DWORD error_code = ::GetLastError(); + if (error_code == ERROR_ALREADY_EXISTS && DirectoryExists(full_path)) { + // This error code ERROR_ALREADY_EXISTS doesn't indicate whether we were + // racing with someone creating the same directory, or a file with the same + // path. If DirectoryExists() returns true, we lost the race to create the + // same directory. + return true; + } + if (error) + *error = File::OSErrorToFileError(error_code); + ::SetLastError(error_code); + DPLOG(WARNING) << "Failed to create directory " << full_path_str; + return false; +} + +#if !defined(MOZ_ZUCCHINI) +bool NormalizeFilePath(const FilePath& path, FilePath* real_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + File file(path, + File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WIN_SHARE_DELETE); + if (!file.IsValid()) + return false; + + // The expansion of |path| into a full path may make it longer. + constexpr int kMaxPathLength = MAX_PATH + 10; + wchar_t native_file_path[kMaxPathLength]; + // kMaxPathLength includes space for trailing '\0' so we subtract 1. + // Returned length, used_wchars, does not include trailing '\0'. + // Failure is indicated by returning 0 or >= kMaxPathLength. + DWORD used_wchars = ::GetFinalPathNameByHandle( + file.GetPlatformFile(), native_file_path, kMaxPathLength - 1, + FILE_NAME_NORMALIZED | VOLUME_NAME_NT); + + if (used_wchars >= kMaxPathLength || used_wchars == 0) + return false; + + // GetFinalPathNameByHandle() returns the \\?\ syntax for file names and + // existing code expects we return a path starting 'X:\' so we call + // DevicePathToDriveLetterPath rather than using VOLUME_NAME_DOS above. + return DevicePathToDriveLetterPath( + FilePath(FilePath::StringPieceType(native_file_path, used_wchars)), + real_path); +} + +bool DevicePathToDriveLetterPath(const FilePath& nt_device_path, + FilePath* out_drive_letter_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Get the mapping of drive letters to device paths. + const int kDriveMappingSize = 1024; + wchar_t drive_mapping[kDriveMappingSize] = {'\0'}; + if (!::GetLogicalDriveStrings(kDriveMappingSize - 1, drive_mapping)) { + DLOG(ERROR) << "Failed to get drive mapping."; + return false; + } + + // The drive mapping is a sequence of null terminated strings. + // The last string is empty. + wchar_t* drive_map_ptr = drive_mapping; + wchar_t device_path_as_string[MAX_PATH]; + wchar_t drive[] = FILE_PATH_LITERAL(" :"); + + // For each string in the drive mapping, get the junction that links + // to it. If that junction is a prefix of |device_path|, then we + // know that |drive| is the real path prefix. + while (*drive_map_ptr) { + drive[0] = drive_map_ptr[0]; // Copy the drive letter. + + if (QueryDosDevice(drive, device_path_as_string, MAX_PATH)) { + FilePath device_path(device_path_as_string); + if (device_path == nt_device_path || + device_path.IsParent(nt_device_path)) { + *out_drive_letter_path = + FilePath(drive + nt_device_path.value().substr( + wcslen(device_path_as_string))); + return true; + } + } + // Move to the next drive letter string, which starts one + // increment after the '\0' that terminates the current string. + while (*drive_map_ptr++) {} + } + + // No drive matched. The path does not start with a device junction + // that is mounted as a drive letter. This means there is no drive + // letter path to the volume that holds |device_path|, so fail. + return false; +} + +FilePath MakeLongFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + DWORD path_long_len = ::GetLongPathName(input.value().c_str(), nullptr, 0); + if (path_long_len == 0UL) + return FilePath(); + + std::wstring path_long_str; + path_long_len = ::GetLongPathName(input.value().c_str(), + WriteInto(&path_long_str, path_long_len), + path_long_len); + if (path_long_len == 0UL) + return FilePath(); + + return FilePath(path_long_str); +} + +bool CreateWinHardLink(const FilePath& to_file, const FilePath& from_file) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return ::CreateHardLink(to_file.value().c_str(), from_file.value().c_str(), + nullptr); +} + +// TODO(rkc): Work out if we want to handle NTFS junctions here or not, handle +// them if we do decide to. +bool IsLink(const FilePath& file_path) { + return false; +} + +bool GetFileInfo(const FilePath& file_path, File::Info* results) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + WIN32_FILE_ATTRIBUTE_DATA attr; + if (!GetFileAttributesEx(file_path.value().c_str(), GetFileExInfoStandard, + &attr)) { + return false; + } + + ULARGE_INTEGER size; + size.HighPart = attr.nFileSizeHigh; + size.LowPart = attr.nFileSizeLow; + // TODO(crbug.com/1333521): Change Info::size to uint64_t and eliminate this + // cast. + results->size = checked_cast(size.QuadPart); + + results->is_directory = + (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + results->last_modified = Time::FromFileTime(attr.ftLastWriteTime); + results->last_accessed = Time::FromFileTime(attr.ftLastAccessTime); + results->creation_time = Time::FromFileTime(attr.ftCreationTime); + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +FILE* OpenFile(const FilePath& filename, const char* mode) { + // 'N' is unconditionally added below, so be sure there is not one already + // present before a comma in |mode|. + DCHECK( + strchr(mode, 'N') == nullptr || + (strchr(mode, ',') != nullptr && strchr(mode, 'N') > strchr(mode, ','))); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + std::wstring w_mode = UTF8ToWide(mode); + AppendModeCharacter(L'N', &w_mode); + return _wfsopen(filename.value().c_str(), w_mode.c_str(), _SH_DENYNO); +} + +FILE* FileToFILE(File file, const char* mode) { + DCHECK(!file.async()); + if (!file.IsValid()) + return NULL; + int fd = + _open_osfhandle(reinterpret_cast(file.GetPlatformFile()), 0); + if (fd < 0) + return NULL; + file.TakePlatformFile(); + FILE* stream = _fdopen(fd, mode); + if (!stream) + _close(fd); + return stream; +} + +File FILEToFile(FILE* file_stream) { + if (!file_stream) + return File(); + + int fd = _fileno(file_stream); + DCHECK_GE(fd, 0); + intptr_t file_handle = _get_osfhandle(fd); + DCHECK_NE(file_handle, reinterpret_cast(INVALID_HANDLE_VALUE)); + + HANDLE other_handle = nullptr; + if (!::DuplicateHandle( + /*hSourceProcessHandle=*/GetCurrentProcess(), + reinterpret_cast(file_handle), + /*hTargetProcessHandle=*/GetCurrentProcess(), &other_handle, + /*dwDesiredAccess=*/0, + /*bInheritHandle=*/FALSE, + /*dwOptions=*/DUPLICATE_SAME_ACCESS)) { + return File(File::GetLastFileError()); + } + + return File(ScopedPlatformFile(other_handle)); +} + +#if !defined(MOZ_ZUCCHINI) +int ReadFile(const FilePath& filename, char* data, int max_size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, + NULL)); + if (!file.is_valid() || max_size < 0) + return -1; + + DWORD read; + if (::ReadFile(file.get(), data, static_cast(max_size), &read, NULL)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(read); + } + + return -1; +} + +int WriteFile(const FilePath& filename, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), GENERIC_WRITE, 0, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, + NULL)); + if (!file.is_valid() || size < 0) { + DPLOG(WARNING) << "WriteFile failed for path " << filename.value(); + return -1; + } + + DWORD written; + BOOL result = + ::WriteFile(file.get(), data, static_cast(size), &written, NULL); + if (result && static_cast(written) == size) + return static_cast(written); + + if (!result) { + // WriteFile failed. + DPLOG(WARNING) << "writing file " << filename.value() << " failed"; + } else { + // Didn't write all the bytes. + DLOG(WARNING) << "wrote" << written << " bytes to " << filename.value() + << " expected " << size; + } + return -1; +} + +bool AppendToFile(const FilePath& filename, span data) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), FILE_APPEND_DATA, + 0, nullptr, OPEN_EXISTING, 0, nullptr)); + if (!file.is_valid()) { + VPLOG(1) << "CreateFile failed for path " << filename.value(); + return false; + } + + DWORD written; + DWORD size = checked_cast(data.size()); + BOOL result = ::WriteFile(file.get(), data.data(), size, &written, nullptr); + if (result && written == size) + return true; + + if (!result) { + // WriteFile failed. + VPLOG(1) << "Writing file " << filename.value() << " failed"; + } else { + // Didn't write all the bytes. + VPLOG(1) << "Only wrote " << written << " out of " << size << " byte(s) to " + << filename.value(); + } + return false; +} + +bool AppendToFile(const FilePath& filename, StringPiece data) { + return AppendToFile(filename, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool GetCurrentDirectory(FilePath* dir) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + wchar_t system_buffer[MAX_PATH]; + system_buffer[0] = 0; + DWORD len = ::GetCurrentDirectory(MAX_PATH, system_buffer); + if (len == 0 || len > MAX_PATH) + return false; + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + *dir = FilePath(FilePath::StringPieceType(system_buffer)) + .StripTrailingSeparators(); + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool SetCurrentDirectory(const FilePath& directory) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return ::SetCurrentDirectory(directory.value().c_str()) != 0; +} + +int GetMaximumPathComponentLength(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + wchar_t volume_path[MAX_PATH]; + if (!GetVolumePathNameW(path.NormalizePathSeparators().value().c_str(), + volume_path, std::size(volume_path))) { + return -1; + } + + DWORD max_length = 0; + if (!GetVolumeInformationW(volume_path, NULL, 0, NULL, &max_length, NULL, + NULL, 0)) { + return -1; + } + + // Length of |path| with path separator appended. + size_t prefix = path.StripTrailingSeparators().value().size() + 1; + // The whole path string must be shorter than MAX_PATH. That is, it must be + // prefix + component_length < MAX_PATH (or equivalently, <= MAX_PATH - 1). + int whole_path_limit = std::max(0, MAX_PATH - 1 - static_cast(prefix)); + return std::min(whole_path_limit, static_cast(max_length)); +} + +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + return DoCopyFile(from_path, to_path, false); +} + +bool SetNonBlocking(int fd) { + unsigned long nonblocking = 1; + if (ioctlsocket(static_cast(fd), static_cast(FIONBIO), + &nonblocking) == 0) + return true; + return false; +} + +bool PreReadFile(const FilePath& file_path, + bool is_executable, + int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + if (max_bytes == 0) { + // ::PrefetchVirtualMemory() fails when asked to read zero bytes. + // base::MemoryMappedFile::Initialize() fails on an empty file. + return true; + } + + // ::PrefetchVirtualMemory() fails if the file is opened with write access. + MemoryMappedFile::Access access = is_executable + ? MemoryMappedFile::READ_CODE_IMAGE + : MemoryMappedFile::READ_ONLY; + MemoryMappedFile mapped_file; + if (!mapped_file.Initialize(file_path, access)) + return internal::PreReadFileSlow(file_path, max_bytes); + + const ::SIZE_T length = + std::min(base::saturated_cast<::SIZE_T>(max_bytes), + base::saturated_cast<::SIZE_T>(mapped_file.length())); + ::_WIN32_MEMORY_RANGE_ENTRY address_range = {mapped_file.data(), length}; + // Use ::PrefetchVirtualMemory(). This is better than a + // simple data file read, more from a RAM perspective than CPU. This is + // because reading the file as data results in double mapping to + // Image/executable pages for all pages of code executed. + if (!::PrefetchVirtualMemory(::GetCurrentProcess(), + /*NumberOfEntries=*/1, &address_range, + /*Flags=*/0)) { + return internal::PreReadFileSlow(file_path, max_bytes); + } + return true; +} + +bool PreventExecuteMapping(const FilePath& path) { + if (!base::FeatureList::IsEnabled( + features::kEnforceNoExecutableFileHandles)) { + return true; + } + + bool is_path_safe = IsPathSafeToSetAclOn(path); + + if (!is_path_safe) { + // To mitigate the effect of past OS bugs where attackers are able to use + // writeable handles to create malicious executable images which can be + // later mapped into unsandboxed processes, file handles that permit writing + // that are passed to untrusted processes, e.g. renderers, should be marked + // with a deny execute ACE. This prevents re-opening the file for execute + // later on. + // + // To accomplish this, code that needs to pass writable file handles to a + // renderer should open the file with the flags added by + // `AddFlagsForPassingToUntrustedProcess()` (explicitly + // FLAG_WIN_NO_EXECUTE). This results in this PreventExecuteMapping being + // called by base::File. + // + // However, simply using this universally on all files that are opened + // writeable is also undesirable: things can and will randomly break if they + // are marked no-exec (e.g. marking an exe that the user downloads as + // no-exec will prevent the user from running it). There are also + // performance implications of doing this for all files unnecessarily. + // + // Code that passes writable files to the renderer is also expected to + // reference files in places like the user data dir (e.g. for the filesystem + // API) or temp files. Any attempt to pass a writeable handle to a path + // outside these areas is likely its own security issue as an untrusted + // renderer process should never have write access to e.g. system files or + // downloads. + // + // This check aims to catch misuse of + // `AddFlagsForPassingToUntrustedProcess()` on paths outside these + // locations. Any time it hits it is also likely that a handle to a + // dangerous path is being passed to a renderer, which is inherently unsafe. + // + // If this check hits, please do not ignore it but consult security team. + DLOG(FATAL) << "Unsafe to deny execute access to path : " << path; + + return false; + } + + static constexpr wchar_t kEveryoneSid[] = L"WD"; + auto sids = win::Sid::FromSddlStringVector({kEveryoneSid}); + + // Remove executable access from the file. The API does not add a duplicate + // ACE if it already exists. + return win::DenyAccessToPath(path, *sids, FILE_EXECUTE, /*NO_INHERITANCE=*/0, + /*recursive=*/false); +} + +void SetExtraNoExecuteAllowedPath(int path_key) { + DCHECK(!g_extra_allowed_path_for_no_execute || + g_extra_allowed_path_for_no_execute == path_key); + g_extra_allowed_path_for_no_execute = path_key; + base::FilePath valid_path; + DCHECK( + base::PathService::Get(g_extra_allowed_path_for_no_execute, &valid_path)); +} + +// ----------------------------------------------------------------------------- + +namespace internal { + +bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + if (MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), + MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0) + return true; + + // Keep the last error value from MoveFileEx around in case the below + // fails. + bool ret = false; + DWORD last_error = ::GetLastError(); + + if (DirectoryExists(from_path)) { + // MoveFileEx fails if moving directory across volumes. We will simulate + // the move by using Copy and Delete. Ideally we could check whether + // from_path and to_path are indeed in different volumes. + ret = internal::CopyAndDeleteDirectory(from_path, to_path); + } + + if (!ret) { + // Leave a clue about what went wrong so that it can be (at least) picked + // up by a PLOG entry. + ::SetLastError(last_error); + } + + return ret; +} + +bool CopyAndDeleteDirectory(const FilePath& from_path, + const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (CopyDirectory(from_path, to_path, true)) { + if (DeletePathRecursively(from_path)) + return true; + + // Like Move, this function is not transactional, so we just + // leave the copied bits behind if deleting from_path fails. + // If to_path exists previously then we have already overwritten + // it by now, we don't get better off by deleting the new bits. + } + return false; +} + +} // namespace internal +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_win.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/file_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,508 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +#include +#include + +#include + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/file_util.h" +#include "base/immediate_crash.h" +#include "base/metrics/histogram_functions.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" + +#include + +namespace base { + +// Make sure our Whence mappings match the system headers. +static_assert(File::FROM_BEGIN == FILE_BEGIN && + File::FROM_CURRENT == FILE_CURRENT && + File::FROM_END == FILE_END, + "whence mapping must match the system headers"); + +bool File::IsValid() const { + return file_.is_valid(); +} + +PlatformFile File::GetPlatformFile() const { + return file_.get(); +} + +PlatformFile File::TakePlatformFile() { + return file_.release(); +} + +void File::Close() { + if (!file_.is_valid()) + return; + + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + SCOPED_FILE_TRACE("Close"); + file_.Close(); +} + +int64_t File::Seek(Whence whence, int64_t offset) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("Seek", offset); + + LARGE_INTEGER distance, res; + distance.QuadPart = offset; + DWORD move_method = static_cast(whence); + if (!SetFilePointerEx(file_.get(), distance, &res, move_method)) + return -1; + return res.QuadPart; +} + +int File::Read(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0 || offset < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Read", size); + + ULARGE_INTEGER offset_li; + offset_li.QuadPart = static_cast(offset); + + OVERLAPPED overlapped = {}; + overlapped.Offset = offset_li.LowPart; + overlapped.OffsetHigh = offset_li.HighPart; + + DWORD bytes_read; + if (::ReadFile(file_.get(), data, static_cast(size), &bytes_read, + &overlapped)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(bytes_read); + } + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + + return -1; +} + +int File::ReadAtCurrentPos(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPos", size); + + DWORD bytes_read; + if (::ReadFile(file_.get(), data, static_cast(size), &bytes_read, + NULL)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(bytes_read); + } + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + + return -1; +} + +int File::ReadNoBestEffort(int64_t offset, char* data, int size) { + // TODO(dbeam): trace this separately? + return Read(offset, data, size); +} + +int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { + // TODO(dbeam): trace this separately? + return ReadAtCurrentPos(data, size); +} + +int File::Write(int64_t offset, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0 || offset < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Write", size); + + ULARGE_INTEGER offset_li; + offset_li.QuadPart = static_cast(offset); + + OVERLAPPED overlapped = {}; + overlapped.Offset = offset_li.LowPart; + overlapped.OffsetHigh = offset_li.HighPart; + + DWORD bytes_written; + if (::WriteFile(file_.get(), data, static_cast(size), &bytes_written, + &overlapped)) + return static_cast(bytes_written); + + return -1; +} + +int File::WriteAtCurrentPos(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPos", size); + + DWORD bytes_written; + if (::WriteFile(file_.get(), data, static_cast(size), &bytes_written, + NULL)) + return static_cast(bytes_written); + + return -1; +} + +int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { + return WriteAtCurrentPos(data, size); +} + +int64_t File::GetLength() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetLength"); + + LARGE_INTEGER size; + if (!::GetFileSizeEx(file_.get(), &size)) + return -1; + + return static_cast(size.QuadPart); +} + +bool File::SetLength(int64_t length) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("SetLength", length); + + // Get the current file pointer. + LARGE_INTEGER file_pointer; + LARGE_INTEGER zero; + zero.QuadPart = 0; + if (!::SetFilePointerEx(file_.get(), zero, &file_pointer, FILE_CURRENT)) + return false; + + LARGE_INTEGER length_li; + length_li.QuadPart = length; + // If length > file size, SetFilePointerEx() should extend the file + // with zeroes on all Windows standard file systems (NTFS, FATxx). + if (!::SetFilePointerEx(file_.get(), length_li, NULL, FILE_BEGIN)) + return false; + + // Set the new file length and move the file pointer to its old position. + // This is consistent with ftruncate()'s behavior, even when the file + // pointer points to a location beyond the end of the file. + // TODO(rvargas): Emulating ftruncate details seem suspicious and it is not + // promised by the interface (nor was promised by PlatformFile). See if this + // implementation detail can be removed. + return ((::SetEndOfFile(file_.get()) != FALSE) && + (::SetFilePointerEx(file_.get(), file_pointer, NULL, FILE_BEGIN) != + FALSE)); +} + +#if !defined(MOZ_ZUCCHINI) +bool File::SetTimes(Time last_access_time, Time last_modified_time) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("SetTimes"); + + FILETIME last_access_filetime = last_access_time.ToFileTime(); + FILETIME last_modified_filetime = last_modified_time.ToFileTime(); + return (::SetFileTime(file_.get(), NULL, &last_access_filetime, + &last_modified_filetime) != FALSE); +} + +bool File::GetInfo(Info* info) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetInfo"); + + BY_HANDLE_FILE_INFORMATION file_info; + if (!GetFileInformationByHandle(file_.get(), &file_info)) + return false; + + ULARGE_INTEGER size; + size.HighPart = file_info.nFileSizeHigh; + size.LowPart = file_info.nFileSizeLow; + // TODO(crbug.com/1333521): Change Info::size to uint64_t and eliminate this + // cast. + info->size = checked_cast(size.QuadPart); + info->is_directory = + (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + info->is_symbolic_link = false; // Windows doesn't have symbolic links. + info->last_modified = Time::FromFileTime(file_info.ftLastWriteTime); + info->last_accessed = Time::FromFileTime(file_info.ftLastAccessTime); + info->creation_time = Time::FromFileTime(file_info.ftCreationTime); + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +namespace { + +DWORD LockFileFlagsForMode(File::LockMode mode) { + DWORD flags = LOCKFILE_FAIL_IMMEDIATELY; + switch (mode) { + case File::LockMode::kShared: + return flags; + case File::LockMode::kExclusive: + return flags | LOCKFILE_EXCLUSIVE_LOCK; + } + NOTREACHED(); +} + +} // namespace + +File::Error File::Lock(File::LockMode mode) { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("Lock"); + + OVERLAPPED overlapped = {}; + BOOL result = + LockFileEx(file_.get(), LockFileFlagsForMode(mode), /*dwReserved=*/0, + /*nNumberOfBytesToLockLow=*/MAXDWORD, + /*nNumberOfBytesToLockHigh=*/MAXDWORD, &overlapped); + if (!result) + return GetLastFileError(); + return FILE_OK; +} + +File::Error File::Unlock() { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("Unlock"); + + OVERLAPPED overlapped = {}; + BOOL result = + UnlockFileEx(file_.get(), /*dwReserved=*/0, + /*nNumberOfBytesToLockLow=*/MAXDWORD, + /*nNumberOfBytesToLockHigh=*/MAXDWORD, &overlapped); + if (!result) + return GetLastFileError(); + return FILE_OK; +} + +File File::Duplicate() const { + if (!IsValid()) + return File(); + + SCOPED_FILE_TRACE("Duplicate"); + + HANDLE other_handle = nullptr; + + if (!::DuplicateHandle(GetCurrentProcess(), // hSourceProcessHandle + GetPlatformFile(), + GetCurrentProcess(), // hTargetProcessHandle + &other_handle, + 0, // dwDesiredAccess ignored due to SAME_ACCESS + FALSE, // !bInheritHandle + DUPLICATE_SAME_ACCESS)) { + return File(GetLastFileError()); + } + + return File(ScopedPlatformFile(other_handle), async()); +} + +bool File::DeleteOnClose(bool delete_on_close) { + FILE_DISPOSITION_INFO disposition = {delete_on_close}; + return ::SetFileInformationByHandle(GetPlatformFile(), FileDispositionInfo, + &disposition, sizeof(disposition)) != 0; +} + +// Static. +File::Error File::OSErrorToFileError(DWORD last_error) { + switch (last_error) { + case ERROR_SHARING_VIOLATION: + case ERROR_UNABLE_TO_REMOVE_REPLACED: // ReplaceFile failure cases. + case ERROR_UNABLE_TO_MOVE_REPLACEMENT: + case ERROR_UNABLE_TO_MOVE_REPLACEMENT_2: + return FILE_ERROR_IN_USE; + case ERROR_ALREADY_EXISTS: + case ERROR_FILE_EXISTS: + return FILE_ERROR_EXISTS; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return FILE_ERROR_NOT_FOUND; + case ERROR_ACCESS_DENIED: + case ERROR_LOCK_VIOLATION: + return FILE_ERROR_ACCESS_DENIED; + case ERROR_TOO_MANY_OPEN_FILES: + return FILE_ERROR_TOO_MANY_OPENED; + case ERROR_OUTOFMEMORY: + case ERROR_NOT_ENOUGH_MEMORY: + return FILE_ERROR_NO_MEMORY; + case ERROR_HANDLE_DISK_FULL: + case ERROR_DISK_FULL: + case ERROR_DISK_RESOURCES_EXHAUSTED: + return FILE_ERROR_NO_SPACE; + case ERROR_USER_MAPPED_FILE: + return FILE_ERROR_INVALID_OPERATION; + case ERROR_NOT_READY: // The device is not ready. + case ERROR_SECTOR_NOT_FOUND: // The drive cannot find the sector requested. + case ERROR_GEN_FAILURE: // A device ... is not functioning. + case ERROR_DEV_NOT_EXIST: // Net resource or device is no longer available. + case ERROR_IO_DEVICE: + case ERROR_DISK_OPERATION_FAILED: + case ERROR_FILE_CORRUPT: // File or directory is corrupted and unreadable. + case ERROR_DISK_CORRUPT: // The disk structure is corrupted and unreadable. + return FILE_ERROR_IO; + default: + // This function should only be called for errors. + DCHECK_NE(static_cast(ERROR_SUCCESS), last_error); + return FILE_ERROR_FAILED; + } +} + +void File::DoInitialize(const FilePath& path, uint32_t flags) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(!IsValid()); + + DWORD disposition = 0; + + if (flags & FLAG_OPEN) + disposition = OPEN_EXISTING; + + if (flags & FLAG_CREATE) { + DCHECK(!disposition); + disposition = CREATE_NEW; + } + + if (flags & FLAG_OPEN_ALWAYS) { + DCHECK(!disposition); + disposition = OPEN_ALWAYS; + } + + if (flags & FLAG_CREATE_ALWAYS) { + DCHECK(!disposition); + DCHECK(flags & FLAG_WRITE); + disposition = CREATE_ALWAYS; + } + + if (flags & FLAG_OPEN_TRUNCATED) { + DCHECK(!disposition); + DCHECK(flags & FLAG_WRITE); + disposition = TRUNCATE_EXISTING; + } + + if (!disposition) { + ::SetLastError(ERROR_INVALID_PARAMETER); + error_details_ = FILE_ERROR_FAILED; + NOTREACHED(); + return; + } + + DWORD access = 0; + if (flags & FLAG_WRITE) + access = GENERIC_WRITE; + if (flags & FLAG_APPEND) { + DCHECK(!access); + access = FILE_APPEND_DATA; + } + if (flags & FLAG_READ) + access |= GENERIC_READ; + if (flags & FLAG_WRITE_ATTRIBUTES) + access |= FILE_WRITE_ATTRIBUTES; + if (flags & FLAG_WIN_EXECUTE) { +#if !defined(MOZ_ZUCCHINI) + // Specifying both FLAG_WIN_EXECUTE and FLAG_WIN_NO_EXECUTE would + // constitute a security risk, so deny the access here. + CHECK_EQ(flags & FLAG_WIN_NO_EXECUTE, 0U); +#endif // !defined(MOZ_ZUCCHINI) + access |= GENERIC_EXECUTE; + } + if (flags & FLAG_CAN_DELETE_ON_CLOSE) + access |= DELETE; + + DWORD sharing = (flags & FLAG_WIN_EXCLUSIVE_READ) ? 0 : FILE_SHARE_READ; + if (!(flags & FLAG_WIN_EXCLUSIVE_WRITE)) + sharing |= FILE_SHARE_WRITE; + if (flags & FLAG_WIN_SHARE_DELETE) + sharing |= FILE_SHARE_DELETE; + + DWORD create_flags = 0; + if (flags & FLAG_ASYNC) + create_flags |= FILE_FLAG_OVERLAPPED; + if (flags & FLAG_WIN_TEMPORARY) + create_flags |= FILE_ATTRIBUTE_TEMPORARY; + if (flags & FLAG_WIN_HIDDEN) + create_flags |= FILE_ATTRIBUTE_HIDDEN; + if (flags & FLAG_DELETE_ON_CLOSE) + create_flags |= FILE_FLAG_DELETE_ON_CLOSE; + if (flags & FLAG_WIN_BACKUP_SEMANTICS) + create_flags |= FILE_FLAG_BACKUP_SEMANTICS; + if (flags & FLAG_WIN_SEQUENTIAL_SCAN) + create_flags |= FILE_FLAG_SEQUENTIAL_SCAN; + + file_.Set(CreateFile(path.value().c_str(), access, sharing, NULL, disposition, + create_flags, NULL)); + + if (file_.is_valid()) { + error_details_ = FILE_OK; + async_ = ((flags & FLAG_ASYNC) == FLAG_ASYNC); + + if (flags & (FLAG_OPEN_ALWAYS)) + created_ = (ERROR_ALREADY_EXISTS != GetLastError()); + else if (flags & (FLAG_CREATE_ALWAYS | FLAG_CREATE)) + created_ = true; +#if !defined(MOZ_ZUCCHINI) + if (flags & FLAG_WIN_NO_EXECUTE) { + // These two DCHECKs make sure that no callers are trying to remove + // execute permission from a file that might need to be mapped executable + // later. If they hit in code then the file should not have + // FLAG_WIN_NO_EXECUTE flag, but this will mean that the file cannot be + // passed to renderers. + DCHECK(!base::FilePath::CompareEqualIgnoreCase(FILE_PATH_LITERAL(".exe"), + path.Extension())); + DCHECK(!base::FilePath::CompareEqualIgnoreCase(FILE_PATH_LITERAL(".dll"), + path.Extension())); + + // It is possible that the ACE could not be added if the file was created + // in a path for which the caller does not have WRITE_DAC access. In this + // case, ignore the error since if this is occurring then it's likely the + // file cannot be opened for write and more serious I/O failures are + // occurring or about to occur. + std::ignore = PreventExecuteMapping(path); + } +#endif // defined(MOZ_ZUCCHINI) + } else { + error_details_ = GetLastFileError(); + } +} + +bool File::Flush() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + SCOPED_FILE_TRACE("Flush"); + + // On Windows 8 and above, FlushFileBuffers is guaranteed to flush the storage + // device's internal buffers (if they exist) before returning. + // https://blogs.msdn.microsoft.com/oldnewthing/20170510-00/?p=95505 + return ::FlushFileBuffers(file_.get()) != FALSE; +} + +void File::SetPlatformFile(PlatformFile file) { + file_.Set(file); +} + +// static +File::Error File::GetLastFileError() { + return File::OSErrorToFileError(GetLastError()); +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,158 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/numerics/safe_math.h" +#include "base/system/sys_info.h" +#include "build/build_config.h" + +namespace base { + +const MemoryMappedFile::Region MemoryMappedFile::Region::kWholeFile = {0, 0}; + +bool MemoryMappedFile::Region::operator==( + const MemoryMappedFile::Region& other) const { + return other.offset == offset && other.size == size; +} + +bool MemoryMappedFile::Region::operator!=( + const MemoryMappedFile::Region& other) const { + return other.offset != offset || other.size != size; +} + +MemoryMappedFile::~MemoryMappedFile() { + CloseHandles(); +} + +#if !BUILDFLAG(IS_NACL) +bool MemoryMappedFile::Initialize(const FilePath& file_name, Access access) { + if (IsValid()) + return false; + + uint32_t flags = 0; + switch (access) { + case READ_ONLY: + flags = File::FLAG_OPEN | File::FLAG_READ; + break; + case READ_WRITE: + flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; + break; + case READ_WRITE_EXTEND: + // Can't open with "extend" because no maximum size is known. + NOTREACHED(); + break; +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + case READ_CODE_IMAGE: + flags |= File::FLAG_OPEN | File::FLAG_READ | + File::FLAG_WIN_EXCLUSIVE_WRITE | File::FLAG_WIN_EXECUTE; + break; +#endif +#endif // !defined(MOZ_ZUCCHINI) + } + file_.Initialize(file_name, flags); + + if (!file_.IsValid()) { + DLOG(ERROR) << "Couldn't open " << file_name.AsUTF8Unsafe(); + return false; + } + + if (!MapFileRegionToMemory(Region::kWholeFile, access)) { + CloseHandles(); + return false; + } + + return true; +} + +bool MemoryMappedFile::Initialize(File file, Access access) { + DCHECK_NE(READ_WRITE_EXTEND, access); + return Initialize(std::move(file), Region::kWholeFile, access); +} + +bool MemoryMappedFile::Initialize(File file, + const Region& region, + Access access) { + switch (access) { + case READ_WRITE_EXTEND: + DCHECK(Region::kWholeFile != region); + { + CheckedNumeric region_end(region.offset); + region_end += region.size; + if (!region_end.IsValid()) { + DLOG(ERROR) << "Region bounds exceed maximum for base::File."; + return false; + } + } + [[fallthrough]]; + case READ_ONLY: + case READ_WRITE: + // Ensure that the region values are valid. + if (region.offset < 0) { + DLOG(ERROR) << "Region bounds are not valid."; + return false; + } + break; +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + case READ_CODE_IMAGE: + // Can't open with "READ_CODE_IMAGE", not supported outside Windows + // or with a |region|. + NOTREACHED(); + break; +#endif +#endif // !defined(MOZ_ZUCCHINI) + } + + if (IsValid()) + return false; + + if (region != Region::kWholeFile) +#if defined(MOZ_ZUCCHINI) + { +#endif // defined(MOZ_ZUCCHINI) + DCHECK_GE(region.offset, 0); +#if defined(MOZ_ZUCCHINI) + } +#endif // defined(MOZ_ZUCCHINI) + + file_ = std::move(file); + + if (!MapFileRegionToMemory(region, access)) { + CloseHandles(); + return false; + } + + return true; +} + +bool MemoryMappedFile::IsValid() const { + return data_ != nullptr; +} + +// static +void MemoryMappedFile::CalculateVMAlignedBoundaries(int64_t start, + size_t size, + int64_t* aligned_start, + size_t* aligned_size, + int32_t* offset) { + // Sadly, on Windows, the mmap alignment is not just equal to the page size. + uint64_t mask = SysInfo::VMAllocationGranularity() - 1; + CHECK(IsValueInRangeForNumericType(mask)); + *offset = static_cast(static_cast(start) & mask); + *aligned_start = static_cast(static_cast(start) & ~mask); + // The DCHECK above means bit 31 is not set in `mask`, which in turn means + // *offset is positive. Therefore casting it to a size_t is safe. + *aligned_size = + (size + static_cast(*offset) + static_cast(mask)) & ~mask; +} +#endif // !BUILDFLAG(IS_NACL) + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,155 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_MEMORY_MAPPED_FILE_H_ +#define BASE_FILES_MEMORY_MAPPED_FILE_H_ + +#include +#include + +#include + +#include "base/base_export.h" +#include "base/files/file.h" +#include "base/memory/raw_ptr.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/scoped_handle.h" +#endif + +namespace base { + +class FilePath; + +class BASE_EXPORT MemoryMappedFile { + public: + enum Access { + // Mapping a file into memory effectively allows for file I/O on any thread. + // The accessing thread could be paused while data from the file is paged + // into memory. Worse, a corrupted filesystem could cause a SEGV within the + // program instead of just an I/O error. + READ_ONLY, + + // This provides read/write access to a file and must be used with care of + // the additional subtleties involved in doing so. Though the OS will do + // the writing of data on its own time, too many dirty pages can cause + // the OS to pause the thread while it writes them out. The pause can + // be as much as 1s on some systems. + READ_WRITE, + + // This provides read/write access but with the ability to write beyond + // the end of the existing file up to a maximum size specified as the + // "region". Depending on the OS, the file may or may not be immediately + // extended to the maximum size though it won't be loaded in RAM until + // needed. Note, however, that the maximum size will still be reserved + // in the process address space. + READ_WRITE_EXTEND, + +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + // This provides read access, but as executable code used for prefetching + // DLLs into RAM to avoid inefficient hard fault patterns such as during + // process startup. The accessing thread could be paused while data from + // the file is read into memory (if needed). + READ_CODE_IMAGE, +#endif +#endif // !defined(MOZ_ZUCCHINI) + }; + + // The default constructor sets all members to invalid/null values. + MemoryMappedFile(); + MemoryMappedFile(const MemoryMappedFile&) = delete; + MemoryMappedFile& operator=(const MemoryMappedFile&) = delete; + ~MemoryMappedFile(); + + // Used to hold information about a region [offset + size] of a file. + struct BASE_EXPORT Region { + static const Region kWholeFile; + + bool operator==(const Region& other) const; + bool operator!=(const Region& other) const; + + // Start of the region (measured in bytes from the beginning of the file). + int64_t offset; + + // Length of the region in bytes. + size_t size; + }; + + // Opens an existing file and maps it into memory. |access| can be read-only + // or read/write but not read/write+extend. If this object already points + // to a valid memory mapped file then this method will fail and return + // false. If it cannot open the file, the file does not exist, or the + // memory mapping fails, it will return false. + [[nodiscard]] bool Initialize(const FilePath& file_name, Access access); + [[nodiscard]] bool Initialize(const FilePath& file_name) { + return Initialize(file_name, READ_ONLY); + } + + // As above, but works with an already-opened file. |access| can be read-only + // or read/write but not read/write+extend. MemoryMappedFile takes ownership + // of |file| and closes it when done. |file| must have been opened with + // permissions suitable for |access|. If the memory mapping fails, it will + // return false. + [[nodiscard]] bool Initialize(File file, Access access); + [[nodiscard]] bool Initialize(File file) { + return Initialize(std::move(file), READ_ONLY); + } + + // As above, but works with a region of an already-opened file. |access| + // must not be READ_CODE_IMAGE. If READ_WRITE_EXTEND is specified then + // |region| provides the maximum size of the file. If the memory mapping + // fails, it return false. + [[nodiscard]] bool Initialize(File file, const Region& region, Access access); + [[nodiscard]] bool Initialize(File file, const Region& region) { + return Initialize(std::move(file), region, READ_ONLY); + } + + const uint8_t* data() const { return data_; } + uint8_t* data() { return data_; } + size_t length() const { return length_; } + + // Is file_ a valid file handle that points to an open, memory mapped file? + bool IsValid() const; + + private: + // Given the arbitrarily aligned memory region [start, size], returns the + // boundaries of the region aligned to the granularity specified by the OS, + // (a page on Linux, ~32k on Windows) as follows: + // - |aligned_start| is page aligned and <= |start|. + // - |aligned_size| is a multiple of the VM granularity and >= |size|. + // - |offset| is the displacement of |start| w.r.t |aligned_start|. + static void CalculateVMAlignedBoundaries(int64_t start, + size_t size, + int64_t* aligned_start, + size_t* aligned_size, + int32_t* offset); + +#if BUILDFLAG(IS_WIN) + // Maps the executable file to memory, set |data_| to that memory address. + // Return true on success. + bool MapImageToMemory(Access access); +#endif + + // Map the file to memory, set data_ to that memory address. Return true on + // success, false on any kind of failure. This is a helper for Initialize(). + bool MapFileRegionToMemory(const Region& region, Access access); + + // Closes all open handles. + void CloseHandles(); + + File file_; + + raw_ptr data_ = nullptr; + size_t length_ = 0; + +#if BUILDFLAG(IS_WIN) + win::ScopedHandle file_mapping_; +#endif +}; + +} // namespace base + +#endif // BASE_FILES_MEMORY_MAPPED_FILE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,110 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include +#include +#include +#include +#include +#include + +#include "base/files/file_util.h" +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" + +namespace base { + +MemoryMappedFile::MemoryMappedFile() = default; + +#if !BUILDFLAG(IS_NACL) +bool MemoryMappedFile::MapFileRegionToMemory( + const MemoryMappedFile::Region& region, + Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + off_t map_start = 0; + size_t map_size = 0; + int32_t data_offset = 0; + + if (region == MemoryMappedFile::Region::kWholeFile) { + int64_t file_len = file_.GetLength(); + if (file_len < 0) { + DPLOG(ERROR) << "fstat " << file_.GetPlatformFile(); + return false; + } + if (!IsValueInRangeForNumericType(file_len)) + return false; + map_size = static_cast(file_len); + length_ = map_size; + } else { + // The region can be arbitrarily aligned. mmap, instead, requires both the + // start and size to be page-aligned. Hence, we map here the page-aligned + // outer region [|aligned_start|, |aligned_start| + |size|] which contains + // |region| and then add up the |data_offset| displacement. + int64_t aligned_start = 0; + size_t aligned_size = 0; + CalculateVMAlignedBoundaries(region.offset, + region.size, + &aligned_start, + &aligned_size, + &data_offset); + + // Ensure that the casts in the mmap call below are sane. + if (aligned_start < 0 || + !IsValueInRangeForNumericType(aligned_start)) { + DLOG(ERROR) << "Region bounds are not valid for mmap"; + return false; + } + + map_start = static_cast(aligned_start); + map_size = aligned_size; + length_ = region.size; + } + + int flags = 0; + switch (access) { + case READ_ONLY: + flags |= PROT_READ; + break; + + case READ_WRITE: + flags |= PROT_READ | PROT_WRITE; + break; + + case READ_WRITE_EXTEND: + flags |= PROT_READ | PROT_WRITE; + + if (!AllocateFileRegion(&file_, region.offset, region.size)) + return false; + + break; + } + + data_ = static_cast(mmap(nullptr, map_size, flags, MAP_SHARED, + file_.GetPlatformFile(), map_start)); + if (data_ == MAP_FAILED) { + DPLOG(ERROR) << "mmap " << file_.GetPlatformFile(); + return false; + } + + data_ += data_offset; + return true; +} +#endif + +void MemoryMappedFile::CloseHandles() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (data_ != nullptr) { + munmap(data_.ExtractAsDangling(), length_); + } + file_.Close(); + length_ = 0; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,152 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include +#include + +#include +#include + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/numerics/checked_math.h" +#include "base/threading/scoped_blocking_call.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/win/pe_image.h" +#endif // !defined(MOZ_ZUCCHINI) + +#include +#include // NOLINT(build/include_order) + +namespace base { + +MemoryMappedFile::MemoryMappedFile() = default; + +#if !defined(MOZ_ZUCCHINI) +bool MemoryMappedFile::MapImageToMemory(Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // The arguments to the calls of ::CreateFile(), ::CreateFileMapping(), and + // ::MapViewOfFile() need to be self consistent as far as access rights and + // type of mapping or one or more of them will fail in non-obvious ways. + + if (!file_.IsValid()) + return false; + + file_mapping_.Set(::CreateFileMapping(file_.GetPlatformFile(), nullptr, + PAGE_READONLY | SEC_IMAGE_NO_EXECUTE, 0, + 0, NULL)); + if (!file_mapping_.is_valid()) + return false; + + data_ = static_cast( + ::MapViewOfFile(file_mapping_.get(), FILE_MAP_READ, 0, 0, 0)); + if (!data_) + return false; + + // We need to know how large the mapped file is in some cases + + base::win::PEImage pe_image(data_); + length_ = pe_image.GetNTHeaders()->OptionalHeader.SizeOfImage; + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool MemoryMappedFile::MapFileRegionToMemory( + const MemoryMappedFile::Region& region, + Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + +#if !defined(MOZ_ZUCCHINI) + DCHECK(access != READ_CODE_IMAGE || region == Region::kWholeFile); +#endif // !defined(MOZ_ZUCCHINI) + + if (!file_.IsValid()) + return false; + + DWORD flags = 0; + ULARGE_INTEGER size = {}; + switch (access) { + case READ_ONLY: + flags |= PAGE_READONLY; + break; + case READ_WRITE: + flags |= PAGE_READWRITE; + break; + case READ_WRITE_EXTEND: + flags |= PAGE_READWRITE; + size.QuadPart = region.size; + break; +#if !defined(MOZ_ZUCCHINI) + case READ_CODE_IMAGE: + return MapImageToMemory(access); +#endif // !defined(MOZ_ZUCCHINI) + } + + file_mapping_.Set(::CreateFileMapping(file_.GetPlatformFile(), NULL, flags, + size.HighPart, size.LowPart, NULL)); + if (!file_mapping_.is_valid()) + return false; + + ULARGE_INTEGER map_start = {}; + SIZE_T map_size = 0; + int32_t data_offset = 0; + + if (region == MemoryMappedFile::Region::kWholeFile) { + DCHECK_NE(READ_WRITE_EXTEND, access); + int64_t file_len = file_.GetLength(); + if (file_len <= 0 || !IsValueInRangeForNumericType(file_len)) + return false; + length_ = static_cast(file_len); + } else { + // The region can be arbitrarily aligned. MapViewOfFile, instead, requires + // that the start address is aligned to the VM granularity (which is + // typically larger than a page size, for instance 32k). + // Also, conversely to POSIX's mmap, the |map_size| doesn't have to be + // aligned and must be less than or equal the mapped file size. + // We map here the outer region [|aligned_start|, |aligned_start+size|] + // which contains |region| and then add up the |data_offset| displacement. + int64_t aligned_start = 0; + size_t ignored = 0U; + CalculateVMAlignedBoundaries(region.offset, region.size, &aligned_start, + &ignored, &data_offset); + base::CheckedNumeric full_map_size = region.size; + full_map_size += data_offset; + + // Ensure that the casts below in the MapViewOfFile call are sane. + if (aligned_start < 0 || !full_map_size.IsValid()) { + DLOG(ERROR) << "Region bounds are not valid for MapViewOfFile"; + return false; + } + map_start.QuadPart = static_cast(aligned_start); + map_size = full_map_size.ValueOrDie(); + length_ = region.size; + } + + data_ = static_cast( + ::MapViewOfFile(file_mapping_.get(), + (flags & PAGE_READONLY) ? FILE_MAP_READ : FILE_MAP_WRITE, + map_start.HighPart, map_start.LowPart, map_size)); + if (data_ == nullptr) + return false; + data_ += data_offset; + return true; +} + +void MemoryMappedFile::CloseHandles() { + if (data_) + ::UnmapViewOfFile(data_); + if (file_mapping_.is_valid()) + file_mapping_.Close(); + if (file_.IsValid()) + file_.Close(); + + data_ = nullptr; + length_ = 0; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/platform_file.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/platform_file.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_PLATFORM_FILE_H_ +#define BASE_FILES_PLATFORM_FILE_H_ + +#include "base/files/scoped_file.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/scoped_handle.h" +#include "base/win/windows_types.h" +#endif + +// This file defines platform-independent types for dealing with +// platform-dependent files. If possible, use the higher-level base::File class +// rather than these primitives. + +namespace base { + +#if BUILDFLAG(IS_WIN) + +using PlatformFile = HANDLE; +using ScopedPlatformFile = ::base::win::ScopedHandle; + +// It would be nice to make this constexpr but INVALID_HANDLE_VALUE is a +// ((void*)(-1)) which Clang rejects since reinterpret_cast is technically +// disallowed in constexpr. Visual Studio accepts this, however. +const PlatformFile kInvalidPlatformFile = INVALID_HANDLE_VALUE; + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +using PlatformFile = int; +using ScopedPlatformFile = ::base::ScopedFD; + +constexpr PlatformFile kInvalidPlatformFile = -1; + +#endif + +} // namespace base + +#endif // BASE_FILES_PLATFORM_FILE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,49 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_file.h" + +#include "base/check.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include + +#include "base/posix/eintr_wrapper.h" +#endif + +namespace base { +namespace internal { + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// static +void ScopedFDCloseTraits::Free(int fd) { + // It's important to crash here. + // There are security implications to not closing a file descriptor + // properly. As file descriptors are "capabilities", keeping them open + // would make the current process keep access to a resource. Much of + // Chrome relies on being able to "drop" such access. + // It's especially problematic on Linux with the setuid sandbox, where + // a single open directory would bypass the entire security model. + int ret = IGNORE_EINTR(close(fd)); + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_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 + // Fuchsia's POSIX layer, errors from close other than EBADF do not indicate + // failure to actually close the fd. + if (ret != 0 && errno != EBADF) + ret = 0; +#endif + + PCHECK(0 == ret); +} + +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +} // namespace internal +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,115 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_SCOPED_FILE_H_ +#define BASE_FILES_SCOPED_FILE_H_ + +#include + +#include + +#include "base/base_export.h" +#include "base/scoped_generic.h" +#include "build/build_config.h" + +namespace base { + +namespace internal { + +#if BUILDFLAG(IS_ANDROID) +// Use fdsan on android. +struct BASE_EXPORT ScopedFDCloseTraits : public ScopedGenericOwnershipTracking { + static int InvalidValue() { return -1; } + static void Free(int); + static void Acquire(const ScopedGeneric&, int); + static void Release(const ScopedGeneric&, int); +}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +// On ChromeOS and Linux we guard FD lifetime with a global table and hook into +// libc close() to perform checks. +struct BASE_EXPORT ScopedFDCloseTraits : public ScopedGenericOwnershipTracking { +#else +struct BASE_EXPORT ScopedFDCloseTraits { +#endif + static int InvalidValue() { + return -1; + } + static void Free(int fd); +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + static void Acquire(const ScopedGeneric&, int); + static void Release(const ScopedGeneric&, int); +#endif +}; +#endif + +// Functor for |ScopedFILE| (below). +struct ScopedFILECloser { + inline void operator()(FILE* x) const { + if (x) + fclose(x); + } +}; + +} // namespace internal + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +namespace subtle { + +// Enables or disables enforcement of FD ownership as tracked by ScopedFD +// objects. Enforcement is disabled by default since it proves unwieldy in some +// test environments, but tracking is always done. It's best to enable this as +// early as possible in a process's lifetime. +void BASE_EXPORT EnableFDOwnershipEnforcement(bool enabled); + +// Resets ownership state of all FDs. The only permissible use of this API is +// in a forked child process between the fork() and a subsequent exec() call. +// +// For one issue, it is common to mass-close most open FDs before calling +// exec(), to avoid leaking FDs into the new executable's environment. For +// processes which have enabled FD ownership enforcement, this reset operation +// is necessary before performing such closures. +// +// Furthermore, fork()+exec() may be used in a multithreaded context, and +// because fork() is not atomic, the FD ownership state in the child process may +// be inconsistent with the actual set of opened file descriptors once fork() +// returns in the child process. +// +// It is therefore especially important to call this ASAP after fork() in the +// child process if any FD manipulation will be done prior to the subsequent +// exec call. +void BASE_EXPORT ResetFDOwnership(); + +} // namespace subtle +#endif + +// ----------------------------------------------------------------------------- + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// A low-level Posix file descriptor closer class. Use this when writing +// platform-specific code, especially that does non-file-like things with the +// FD (like sockets). +// +// If you're writing low-level Windows code, see base/win/scoped_handle.h +// which provides some additional functionality. +// +// If you're writing cross-platform code that deals with actual files, you +// should generally use base::File instead which can be constructed with a +// handle, and in addition to handling ownership, has convenient cross-platform +// file manipulation functions on it. +typedef ScopedGeneric ScopedFD; +#endif + +// Automatically closes |FILE*|s. +typedef std::unique_ptr ScopedFILE; + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +// Queries the ownership status of an FD, i.e. whether it is currently owned by +// a ScopedFD in the calling process. +bool BASE_EXPORT IsFDOwned(int fd); +#endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + +} // namespace base + +#endif // BASE_FILES_SCOPED_FILE_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,122 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_file.h" + +#if !defined(MOZ_ZUCCHINI) +#include + +#include +#include +#include + +#include "base/compiler_specific.h" +#include "base/debug/stack_trace.h" +#include "base/immediate_crash.h" +#include "base/logging.h" +#include "base/strings/string_piece.h" + +namespace { + +// We want to avoid any kind of allocations in our close() implementation, so we +// use a fixed-size table. Given our common FD limits and the preference for new +// FD allocations to use the lowest available descriptor, this should be +// sufficient to guard most FD lifetimes. The worst case scenario if someone +// attempts to own a higher FD is that we don't track it. +const int kMaxTrackedFds = 4096; + +std::atomic_bool g_is_ownership_enforced{false}; +std::array g_is_fd_owned; + +NOINLINE void CrashOnFdOwnershipViolation() { + RAW_LOG(ERROR, "Crashing due to FD ownership violation:\n"); + base::debug::StackTrace().Print(); + base::ImmediateCrash(); +} + +bool CanTrack(int fd) { + return fd >= 0 && fd < kMaxTrackedFds; +} + +void UpdateAndCheckFdOwnership(int fd, bool owned) { + if (CanTrack(fd) && + g_is_fd_owned[static_cast(fd)].exchange(owned) == owned && + g_is_ownership_enforced) { + CrashOnFdOwnershipViolation(); + } +} + +} // namespace +#endif // !defined(MOZ_ZUCCHINI) + +namespace base { +namespace internal { + +// static +void ScopedFDCloseTraits::Acquire(const ScopedFD& owner, int fd) { +#if !defined(MOZ_ZUCCHINI) + UpdateAndCheckFdOwnership(fd, /*owned=*/true); +#endif // !defined(MOZ_ZUCCHINI) +} + +// static +void ScopedFDCloseTraits::Release(const ScopedFD& owner, int fd) { +#if !defined(MOZ_ZUCCHINI) + UpdateAndCheckFdOwnership(fd, /*owned=*/false); +#endif // !defined(MOZ_ZUCCHINI) +} + +} // namespace internal + +#if !defined(MOZ_ZUCCHINI) +namespace subtle { + +void EnableFDOwnershipEnforcement(bool enabled) { + g_is_ownership_enforced = enabled; +} + +void ResetFDOwnership() { + std::fill(g_is_fd_owned.begin(), g_is_fd_owned.end(), false); +} + +} // namespace subtle + +bool IsFDOwned(int fd) { + return CanTrack(fd) && g_is_fd_owned[static_cast(fd)]; +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base + +#if !defined(MOZ_ZUCCHINI) +using LibcCloseFuncPtr = int (*)(int); + +// Load the libc close symbol to forward to from the close wrapper. +LibcCloseFuncPtr LoadCloseSymbol() { +#if defined(THREAD_SANITIZER) + // If TSAN is enabled use __interceptor___close first to make sure the TSAN + // wrapper gets called. + return reinterpret_cast( + dlsym(RTLD_DEFAULT, "__interceptor___close")); +#else + return reinterpret_cast(dlsym(RTLD_NEXT, "close")); +#endif +} + +extern "C" { + +NO_SANITIZE("cfi-icall") +__attribute__((visibility("default"), noinline)) int close(int fd) { + static LibcCloseFuncPtr libc_close = LoadCloseSymbol(); + if (base::IsFDOwned(fd) && g_is_ownership_enforced) + CrashOnFdOwnershipViolation(); + if (libc_close == nullptr) { + RAW_LOG(ERROR, "close symbol missing\n"); + base::ImmediateCrash(); + } + return libc_close(fd); +} + +} // extern "C" +#endif // !defined(MOZ_ZUCCHINI) diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc 2025-12-09 01:27:30.000000000 +0000 @@ -0,0 +1,105 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_temp_dir.h" + +#include "base/files/file_util.h" +#include "base/logging.h" + +namespace base { + +namespace { + +constexpr FilePath::CharType kScopedDirPrefix[] = + FILE_PATH_LITERAL("scoped_dir"); + +} // namespace + +ScopedTempDir::ScopedTempDir() = default; + +ScopedTempDir::ScopedTempDir(ScopedTempDir&& other) noexcept + : path_(other.Take()) {} + +ScopedTempDir& ScopedTempDir::operator=(ScopedTempDir&& other) { + if (!path_.empty() && !Delete()) + DLOG(WARNING) << "Could not delete temp dir in operator=()."; + path_ = other.Take(); + return *this; +} + +ScopedTempDir::~ScopedTempDir() { + if (!path_.empty() && !Delete()) + DLOG(WARNING) << "Could not delete temp dir in dtor."; +} + +bool ScopedTempDir::CreateUniqueTempDir() { + if (!path_.empty()) + return false; + + // This "scoped_dir" prefix is only used on Windows and serves as a template + // for the unique name. + if (!CreateNewTempDirectory(kScopedDirPrefix, &path_)) + return false; + + return true; +} + +bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { + if (!path_.empty()) + return false; + + // If |base_path| does not exist, create it. + if (!CreateDirectory(base_path)) + return false; + + // Create a new, uniquely named directory under |base_path|. + if (!CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) + return false; + + return true; +} + +bool ScopedTempDir::Set(const FilePath& path) { + if (!path_.empty()) + return false; + + if (!DirectoryExists(path) && !CreateDirectory(path)) + return false; + + path_ = path; + return true; +} + +bool ScopedTempDir::Delete() { + if (path_.empty()) + return false; + + bool ret = DeletePathRecursively(path_); + if (ret) { + // We only clear the path if deleted the directory. + path_.clear(); + } + + return ret; +} + +FilePath ScopedTempDir::Take() { + return std::exchange(path_, FilePath()); +} + +const FilePath& ScopedTempDir::GetPath() const { + DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; + return path_; +} + +bool ScopedTempDir::IsValid() const { + return !path_.empty() && DirectoryExists(path_); +} + +// static +const FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { + return kScopedDirPrefix; +} + +} // namespace base diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_SCOPED_TEMP_DIR_H_ +#define BASE_FILES_SCOPED_TEMP_DIR_H_ + +// An object representing a temporary / scratch directory that should be +// cleaned up (recursively) when this object goes out of scope. Since deletion +// occurs during the destructor, no further error handling is possible if the +// directory fails to be deleted. As a result, deletion is not guaranteed by +// this class. (However note that, whenever possible, by default +// CreateUniqueTempDir creates the directory in a location that is +// automatically cleaned up on reboot, or at other appropriate times.) +// +// Multiple calls to the methods which establish a temporary directory +// (CreateUniqueTempDir, CreateUniqueTempDirUnderPath, and Set) must have +// intervening calls to Delete or Take, or the calls will fail. + +#include "base/base_export.h" +#include "base/files/file_path.h" + +namespace base { + +class BASE_EXPORT ScopedTempDir { + public: + // No directory is owned/created initially. + ScopedTempDir(); + + ScopedTempDir(ScopedTempDir&&) noexcept; + ScopedTempDir& operator=(ScopedTempDir&&); + + // Recursively delete path. + ~ScopedTempDir(); + + // Creates a unique directory in TempPath, and takes ownership of it. + // See file_util::CreateNewTemporaryDirectory. + [[nodiscard]] bool CreateUniqueTempDir(); + + // Creates a unique directory under a given path, and takes ownership of it. + [[nodiscard]] bool CreateUniqueTempDirUnderPath(const FilePath& path); + + // Takes ownership of directory at |path|, creating it if necessary. + // Don't call multiple times unless Take() has been called first. + [[nodiscard]] bool Set(const FilePath& path); + + // Deletes the temporary directory wrapped by this object. + [[nodiscard]] bool Delete(); + + // Caller takes ownership of the temporary directory so it won't be destroyed + // when this object goes out of scope. + FilePath Take(); + + // Returns the path to the created directory. Call one of the + // CreateUniqueTempDir* methods before getting the path. + const FilePath& GetPath() const; + + // Returns true if path_ is non-empty and exists. + bool IsValid() const; + + // Returns the prefix used for temp directory names generated by + // ScopedTempDirs. + static const FilePath::CharType* GetTempDirPrefix(); + + private: + FilePath path_; +}; + +} // namespace base + +#endif // BASE_FILES_SCOPED_TEMP_DIR_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/format_macros.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/format_macros.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,98 @@ +// Copyright 2009 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FORMAT_MACROS_H_ +#define BASE_FORMAT_MACROS_H_ + +// This file defines the format macros for some integer types. + +// To print a 64-bit value in a portable way: +// int64_t value; +// printf("xyz:%" PRId64, value); +// The "d" in the macro corresponds to %d; you can also use PRIu64 etc. +// +// For wide strings, prepend "Wide" to the macro: +// int64_t value; +// StringPrintf(L"xyz: %" WidePRId64, value); +// +// To print a size_t value in a portable way: +// size_t size; +// printf("xyz: %" PRIuS, size); +// The "u" in the macro corresponds to %u, and S is for "size". + +#include +#include + +#include "build/build_config.h" + +#if (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)) && \ + (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) +#error "inttypes.h has already been included before this header file, but " +#error "without __STDC_FORMAT_MACROS defined." +#endif + +#if (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)) && \ + !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS +#endif + +#include + +#if BUILDFLAG(IS_WIN) + +#if !defined(PRId64) || !defined(PRIu64) || !defined(PRIx64) +#error "inttypes.h provided by win toolchain should define these." +#endif + +#define WidePRId64 L"I64d" +#define WidePRIu64 L"I64u" +#define WidePRIx64 L"I64x" + +#if !defined(PRIuS) +#define PRIuS "Iu" +#endif + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// GCC will concatenate wide and narrow strings correctly, so nothing needs to +// be done here. +#define WidePRId64 PRId64 +#define WidePRIu64 PRIu64 +#define WidePRIx64 PRIx64 + +#if !defined(PRIuS) +#define PRIuS "zu" +#endif + +#endif // BUILDFLAG(IS_WIN) + +// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit +// architectures and Apple does not provides standard format macros and +// recommends casting. This has many drawbacks, so instead define macros +// for formatting those types. +#if BUILDFLAG(IS_APPLE) +#if defined(ARCH_CPU_64_BITS) +#if !defined(PRIdNS) +#define PRIdNS "ld" +#endif +#if !defined(PRIuNS) +#define PRIuNS "lu" +#endif +#if !defined(PRIxNS) +#define PRIxNS "lx" +#endif +#else // defined(ARCH_CPU_64_BITS) +#if !defined(PRIdNS) +#define PRIdNS "d" +#endif +#if !defined(PRIuNS) +#define PRIuNS "u" +#endif +#if !defined(PRIxNS) +#define PRIxNS "x" +#endif +#endif +#endif // BUILDFLAG(IS_APPLE) + +#endif // BASE_FORMAT_MACROS_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/functional/bind.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/functional/bind.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h 2025-12-09 01:27:29.000000000 +0000 @@ -0,0 +1,459 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FUNCTIONAL_BIND_H_ +#define BASE_FUNCTIONAL_BIND_H_ + +#include +#include +#include +#include + +#include "base/compiler_specific.h" +#include "base/functional/bind_internal.h" +#include "base/memory/raw_ptr.h" +#include "build/build_config.h" + +// ----------------------------------------------------------------------------- +// Usage documentation +// ----------------------------------------------------------------------------- +// +// Overview: +// base::BindOnce() and base::BindRepeating() are helpers for creating +// base::OnceCallback and base::RepeatingCallback objects respectively. +// +// For a runnable object of n-arity, the base::Bind*() family allows partial +// application of the first m arguments. The remaining n - m arguments must be +// passed when invoking the callback with Run(). +// +// // The first argument is bound at callback creation; the remaining +// // two must be passed when calling Run() on the callback object. +// base::OnceCallback cb = base::BindOnce( +// [](short x, int y, long z) { return x * y * z; }, 42); +// +// When binding to a method, the receiver object must also be specified at +// callback creation time. When Run() is invoked, the method will be invoked on +// the specified receiver object. +// +// class C : public base::RefCounted { void F(); }; +// auto instance = base::MakeRefCounted(); +// auto cb = base::BindOnce(&C::F, instance); +// std::move(cb).Run(); // Identical to instance->F() +// +// See //docs/callback.md for the full documentation. +// +// ----------------------------------------------------------------------------- +// Implementation notes +// ----------------------------------------------------------------------------- +// +// If you're reading the implementation, before proceeding further, you should +// read the top comment of base/functional/bind_internal.h for a definition of +// common terms and concepts. + +namespace base { + +// Bind as OnceCallback. +template +inline OnceCallback> BindOnce( + Functor&& functor, + Args&&... args) { + static_assert(!internal::IsOnceCallback>() || + (std::is_rvalue_reference() && + !std::is_const>()), + "BindOnce requires non-const rvalue for OnceCallback binding." + " I.e.: base::BindOnce(std::move(callback))."); + static_assert( + std::conjunction< + internal::AssertBindArgIsNotBasePassed>...>::value, + "Use std::move() instead of base::Passed() with base::BindOnce()"); + + return internal::BindImpl(std::forward(functor), + std::forward(args)...); +} + +// Bind as RepeatingCallback. +template +inline RepeatingCallback> +BindRepeating(Functor&& functor, Args&&... args) { + static_assert( + !internal::IsOnceCallback>(), + "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move()."); + + return internal::BindImpl(std::forward(functor), + std::forward(args)...); +} + +// Overloads to allow nicer compile errors when attempting to pass the address +// an overloaded function to `BindOnce()` or `BindRepeating()`. Otherwise, clang +// provides only the error message "no matching function [...] candidate +// template ignored: couldn't infer template argument 'Functor'", with no +// reference to the fact that `&` is being used on an overloaded function. +// +// These overloads to provide better error messages will never be selected +// unless template type deduction fails because of how overload resolution +// works; per [over.ics.rank/2.2]: +// +// When comparing the basic forms of implicit conversion sequences (as defined +// in [over.best.ics]) +// - a standard conversion sequence is a better conversion sequence than a +// user-defined conversion sequence or an ellipsis conversion sequence, and +// - a user-defined conversion sequence is a better conversion sequence than +// an ellipsis conversion sequence. +// +// So these overloads will only be selected as a last resort iff template type +// deduction fails. +// +// These overloads also intentionally do not return `void`, as this prevents +// clang from emitting spurious errors such as "variable has incomplete type +// 'void'" when assigning the result of `BindOnce()`/`BindRepeating()` to a +// variable with type `auto` or `decltype(auto)`. +struct BindFailedCheckPreviousErrors {}; +BindFailedCheckPreviousErrors BindOnce(...); +BindFailedCheckPreviousErrors BindRepeating(...); + +// Unretained(), UnsafeDangling() and UnsafeDanglingUntriaged() allow binding a +// non-refcounted class, and to disable refcounting on arguments that are +// refcounted. The main difference is whether or not the raw pointers will be +// checked for dangling references (e.g. a pointer that points to an already +// destroyed object) when the callback is run. +// +// It is _required_ to use one of Unretained(), UnsafeDangling() or +// UnsafeDanglingUntriaged() for raw pointer receivers now. For other arguments, +// it remains optional. If not specified, default behavior is Unretained(). + +// Unretained() pointers will be checked for dangling pointers when the +// callback is run, *if* the callback has not been cancelled. +// +// Example of Unretained() usage: +// +// class Foo { +// public: +// void func() { cout << "Foo:f" << endl; } +// }; +// +// // In some function somewhere. +// Foo foo; +// OnceClosure foo_callback = +// BindOnce(&Foo::func, Unretained(&foo)); +// std::move(foo_callback).Run(); // Prints "Foo:f". +// +// Without the Unretained() wrapper on |&foo|, the above call would fail +// to compile because Foo does not support the AddRef() and Release() methods. +// +// Unretained() does not allow dangling pointers, e.g.: +// class MyClass { +// public: +// OnError(int error); +// private: +// scoped_refptr runner_; +// std::unique_ptr obj_; +// }; +// +// void MyClass::OnError(int error) { +// // the pointer (which is also the receiver here) to `AnotherClass` +// // might dangle depending on when the task is invoked. +// runner_->PostTask(FROM_HERE, base::BindOnce(&AnotherClass::OnError, +// base::Unretained(obj_.get()), error)); +// // one of the way to solve this issue here would be: +// // runner_->PostTask(FROM_HERE, +// // base::BindOnce(&AnotherClass::OnError, +// // base::Owned(std::move(obj_)), error)); +// delete this; +// } +// +// the above example is a BAD USAGE of Unretained(), which might result in a +// use-after-free, as `AnotherClass::OnError` might be invoked with a dangling +// pointer as receiver. +template +inline auto Unretained(T* o) { + return internal::UnretainedWrapper(o); +} + +template +inline auto Unretained(const raw_ptr& o) { + return internal::UnretainedWrapper(o); +} + +template +inline auto Unretained(raw_ptr&& o) { + return internal::UnretainedWrapper(std::move(o)); +} + +template +inline auto Unretained(const raw_ref& o) { + return internal::UnretainedRefWrapper(o); +} + +template +inline auto Unretained(raw_ref&& o) { + return internal::UnretainedRefWrapper(std::move(o)); +} + +// Similar to `Unretained()`, but allows dangling pointers, e.g.: +// +// class MyClass { +// public: +// DoSomething(HandlerClass* handler); +// private: +// void MyClass::DoSomethingInternal(HandlerClass::Id id, +// HandlerClass* handler); +// +// std::unordered_map handlers_; +// scoped_refptr runner_; +// base::Lock lock_; +// }; +// void MyClass::DoSomething(HandlerClass* handler) { +// runner_->PostTask(FROM_HERE, +// base::BindOnce(&MyClass::DoSomethingInternal, +// base::Unretained(this), +// handler->id(), +// base::Unretained(handler))); +// } +// void MyClass::DoSomethingInternal(HandlerClass::Id id, +// HandlerClass* handler) { +// base::AutoLock locker(lock_); +// if (handlers_.find(id) == std::end(handlers_)) return; +// // Now we can use `handler`. +// } +// +// As `DoSomethingInternal` is run on a sequence (and we can imagine +// `handlers_` being modified on it as well), we protect the function from +// using a dangling `handler` by making sure it is still contained in the +// map. +// +// Strongly prefer `Unretained()`. This is useful in limited situations such as +// the one above. +// +// When using `UnsafeDangling()`, the receiver must be of type MayBeDangling<>. +template +inline auto UnsafeDangling(T* o) { + return internal::UnretainedWrapper(o); +} + +template +auto UnsafeDangling(const raw_ptr& o) { + return internal::UnretainedWrapper( + o); +} + +template +auto UnsafeDangling(raw_ptr&& o) { + return internal::UnretainedWrapper( + std::move(o)); +} + +template +auto UnsafeDangling(const raw_ref& o) { + return internal::UnretainedRefWrapper(o); +} + +template +auto UnsafeDangling(raw_ref&& o) { + return internal::UnretainedRefWrapper(std::move(o)); +} + +// Like `UnsafeDangling()`, but used to annotate places that still need to be +// triaged and either migrated to `Unretained()` and safer ownership patterns +// (preferred) or `UnsafeDangling()` if the correct pattern to use is the one +// in the `UnsafeDangling()` example above for example. +// +// Unlike `UnsafeDangling()`, the receiver doesn't have to be MayBeDangling<>. +template +inline auto UnsafeDanglingUntriaged(T* o) { + return internal::UnretainedWrapper( + o); +} + +template +auto UnsafeDanglingUntriaged(const raw_ptr& o) { + return internal::UnretainedWrapper(o); +} + +template +auto UnsafeDanglingUntriaged(raw_ptr&& o) { + return internal::UnretainedWrapper(std::move(o)); +} + +template +auto UnsafeDanglingUntriaged(const raw_ref& o) { + return internal::UnretainedRefWrapper< + T, unretained_traits::MayDangleUntriaged, Traits>(o); +} + +template +auto UnsafeDanglingUntriaged(raw_ref&& o) { + return internal::UnretainedRefWrapper< + T, unretained_traits::MayDangleUntriaged, Traits>(std::move(o)); +} + +// RetainedRef() accepts a ref counted object and retains a reference to it. +// When the callback is called, the object is passed as a raw pointer. +// +// EXAMPLE OF RetainedRef(): +// +// void foo(RefCountedBytes* bytes) {} +// +// scoped_refptr bytes = ...; +// OnceClosure callback = BindOnce(&foo, base::RetainedRef(bytes)); +// std::move(callback).Run(); +// +// Without RetainedRef, the scoped_refptr would try to implicitly convert to +// a raw pointer and fail compilation: +// +// OnceClosure callback = BindOnce(&foo, bytes); // ERROR! +template +inline internal::RetainedRefWrapper RetainedRef(T* o) { + return internal::RetainedRefWrapper(o); +} +template +inline internal::RetainedRefWrapper RetainedRef(scoped_refptr o) { + return internal::RetainedRefWrapper(std::move(o)); +} + +// Owned() transfers ownership of an object to the callback resulting from +// bind; the object will be deleted when the callback is deleted. +// +// EXAMPLE OF Owned(): +// +// void foo(int* arg) { cout << *arg << endl } +// +// int* pn = new int(1); +// RepeatingClosure foo_callback = BindRepeating(&foo, Owned(pn)); +// +// foo_callback.Run(); // Prints "1" +// foo_callback.Run(); // Prints "1" +// *pn = 2; +// foo_callback.Run(); // Prints "2" +// +// foo_callback.Reset(); // |pn| is deleted. Also will happen when +// // |foo_callback| goes out of scope. +// +// Without Owned(), someone would have to know to delete |pn| when the last +// reference to the callback is deleted. +template +inline internal::OwnedWrapper Owned(T* o) { + return internal::OwnedWrapper(o); +} + +template +inline internal::OwnedWrapper Owned( + std::unique_ptr&& ptr) { + return internal::OwnedWrapper(std::move(ptr)); +} + +// OwnedRef() stores an object in the callback resulting from +// bind and passes a reference to the object to the bound function. +// +// EXAMPLE OF OwnedRef(): +// +// void foo(int& arg) { cout << ++arg << endl } +// +// int counter = 0; +// RepeatingClosure foo_callback = BindRepeating(&foo, OwnedRef(counter)); +// +// foo_callback.Run(); // Prints "1" +// foo_callback.Run(); // Prints "2" +// foo_callback.Run(); // Prints "3" +// +// cout << counter; // Prints "0", OwnedRef creates a copy of counter. +// +// Supports OnceCallbacks as well, useful to pass placeholder arguments: +// +// void bar(int& ignore, const std::string& s) { cout << s << endl } +// +// OnceClosure bar_callback = BindOnce(&bar, OwnedRef(0), "Hello"); +// +// std::move(bar_callback).Run(); // Prints "Hello" +// +// Without OwnedRef() it would not be possible to pass a mutable reference to an +// object owned by the callback. +template +internal::OwnedRefWrapper> OwnedRef(T&& t) { + return internal::OwnedRefWrapper>(std::forward(t)); +} + +// Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr) +// through a RepeatingCallback. Logically, this signifies a destructive transfer +// of the state of the argument into the target function. Invoking +// RepeatingCallback::Run() twice on a callback that was created with a Passed() +// argument will CHECK() because the first invocation would have already +// transferred ownership to the target function. +// +// Note that Passed() is not necessary with BindOnce(), as std::move() does the +// same thing. Avoid Passed() in favor of std::move() with BindOnce(). +// +// EXAMPLE OF Passed(): +// +// void TakesOwnership(std::unique_ptr arg) { } +// std::unique_ptr CreateFoo() { return std::make_unique(); +// } +// +// auto f = std::make_unique(); +// +// // |cb| is given ownership of Foo(). |f| is now NULL. +// // You can use std::move(f) in place of &f, but it's more verbose. +// RepeatingClosure cb = BindRepeating(&TakesOwnership, Passed(&f)); +// +// // Run was never called so |cb| still owns Foo() and deletes +// // it on Reset(). +// cb.Reset(); +// +// // |cb| is given a new Foo created by CreateFoo(). +// cb = BindRepeating(&TakesOwnership, Passed(CreateFoo())); +// +// // |arg| in TakesOwnership() is given ownership of Foo(). |cb| +// // no longer owns Foo() and, if reset, would not delete Foo(). +// cb.Run(); // Foo() is now transferred to |arg| and deleted. +// cb.Run(); // This CHECK()s since Foo() already been used once. +// +// We offer 2 syntaxes for calling Passed(). The first takes an rvalue and is +// best suited for use with the return value of a function or other temporary +// rvalues. The second takes a pointer to the scoper and is just syntactic sugar +// to avoid having to write Passed(std::move(scoper)). +// +// Both versions of Passed() prevent T from being an lvalue reference. The first +// via use of enable_if, and the second takes a T* which will not bind to T&. +// +// DEPRECATED - Do not use in new code. See https://crbug.com/1326449 +template >* = nullptr> +inline internal::PassedWrapper Passed(T&& scoper) { + return internal::PassedWrapper(std::move(scoper)); +} +template +inline internal::PassedWrapper Passed(T* scoper) { + return internal::PassedWrapper(std::move(*scoper)); +} + +// IgnoreResult() is used to adapt a function or callback with a return type to +// one with a void return. This is most useful if you have a function with, +// say, a pesky ignorable bool return that you want to use with PostTask or +// something else that expect a callback with a void return. +// +// EXAMPLE OF IgnoreResult(): +// +// int DoSomething(int arg) { cout << arg << endl; } +// +// // Assign to a callback with a void return type. +// OnceCallback cb = BindOnce(IgnoreResult(&DoSomething)); +// std::move(cb).Run(1); // Prints "1". +// +// // Prints "2" on |ml|. +// ml->PostTask(FROM_HERE, BindOnce(IgnoreResult(&DoSomething), 2); +template +inline internal::IgnoreResultHelper IgnoreResult(T data) { + return internal::IgnoreResultHelper(std::move(data)); +} + +} // namespace base + +#endif // BASE_FUNCTIONAL_BIND_H_ diff -Nru thunderbird-140.5.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h --- thunderbird-140.5.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h 2025-12-09 01:27:28.000000000 +0000 @@ -0,0 +1,1826 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FUNCTIONAL_BIND_INTERNAL_H_ +#define BASE_FUNCTIONAL_BIND_INTERNAL_H_ + +#include + +#include +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr.h" +#include "base/check.h" +#include "base/compiler_specific.h" +#include "base/functional/callback_internal.h" +#include "base/functional/disallow_unretained.h" +#include "base/functional/unretained_traits.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_asan_bound_arg_tracker.h" +#include "base/memory/raw_ptr_asan_service.h" +#include "base/memory/raw_ref.h" +#include "base/memory/raw_scoped_refptr_mismatch_checker.h" +#include "base/memory/weak_ptr.h" +#include "base/notreached.h" +#include "base/types/always_false.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/functional/function_ref.h" + +// See base/functional/callback.h for user documentation. +// +// +// CONCEPTS: +// Functor -- A movable type representing something that should be called. +// All function pointers and Callback<> are functors even if the +// invocation syntax differs. +// RunType -- A function type (as opposed to function _pointer_ type) for +// a Callback<>::Run(). Usually just a convenience typedef. +// (Bound)Args -- A set of types that stores the arguments. +// +// Types: +// ForceVoidReturn<> -- Helper class for translating function signatures to +// equivalent forms with a "void" return type. +// FunctorTraits<> -- Type traits used to determine the correct RunType and +// invocation manner for a Functor. This is where function +// signature adapters are applied. +// StorageTraits<> -- Type traits that determine how a bound argument is +// stored in BindState. +// InvokeHelper<> -- Take a Functor + arguments and actually invokes it. +// Handle the differing syntaxes needed for WeakPtr<> +// support. This is separate from Invoker to avoid creating +// multiple version of Invoker<>. +// Invoker<> -- Unwraps the curried parameters and executes the Functor. +// BindState<> -- Stores the curried parameters, and is the main entry point +// into the Bind() system. + +#if BUILDFLAG(IS_WIN) +namespace Microsoft { +namespace WRL { +template +class ComPtr; +} // namespace WRL +} // namespace Microsoft +#endif + +namespace base { + +template +struct IsWeakReceiver; + +template +struct BindUnwrapTraits; + +template +struct CallbackCancellationTraits; + +template +class FunctionRef; + +namespace unretained_traits { + +// UnretainedWrapper will check and report if pointer is dangling upon +// invocation. +struct MayNotDangle {}; +// UnretainedWrapper won't check if pointer is dangling upon invocation. For +// extra safety, the receiver must be of type MayBeDangling<>. +struct MayDangle {}; +// UnretainedWrapper won't check if pointer is dangling upon invocation. The +// receiver doesn't have to be a raw_ptr<>. This is just a temporary state, to +// allow dangling pointers that would otherwise crash if MayNotDangle was used. +// It should be replaced ASAP with MayNotDangle (after fixing the dangling +// pointers) or with MayDangle if there is really no other way (after making +// receivers MayBeDangling<>). +struct MayDangleUntriaged {}; + +} // namespace unretained_traits + +namespace internal { + +template +struct FunctorTraits; + +template +class UnretainedWrapper { + // Note that if PtrTraits already includes MayDangle, DanglingRawPtrType + // will be identical to `raw_ptr`. + using DanglingRawPtrType = MayBeDangling; + + public: + // We want the getter type to match the receiver parameter that it is passed + // into, to minimize `raw_ptr` <-> `T*` conversions. We also would like to + // match `StorageType`, but sometimes we can't have both, as shown in + // https://docs.google.com/document/d/1dLM34aKqbNBfRdOYxxV_T-zQU4J5wjmXwIBJZr7JvZM/edit + // When we can't have both, prefer the former, mostly because + // `GetPtrType`=`raw_ptr` would break if e.g. UnretainedWrapper() is + // constructed using `char*`, but the receiver is of type `std::string&`. + // This is enforced by static_asserts in base::internal::AssertConstructible. + using GetPtrType = std::conditional_t< + raw_ptr_traits::IsSupportedType::value && + std::is_same_v, + DanglingRawPtrType, + T*>; + + static_assert(TypeSupportsUnretainedV, + "Callback cannot capture an unprotected C++ pointer since this " + "Type is annotated with DISALLOW_UNRETAINED(). Please see " + "base/functional/disallow_unretained.h for alternatives."); + + // Raw pointer makes sense only if there are no PtrTraits. If there are, + // it means that a `raw_ptr` is being passed, so use the ctors below instead. + template > + explicit UnretainedWrapper(T* o) : ptr_(o) {} + + // Trick to only instantiate these constructors if they are used. Otherwise, + // instantiating UnretainedWrapper with a T that is not supported by + // raw_ptr would trigger raw_ptr's static_assert. + template + explicit UnretainedWrapper(const raw_ptr& o) : ptr_(o) {} + template + explicit UnretainedWrapper(raw_ptr&& o) : ptr_(std::move(o)) {} + + GetPtrType get() const { return GetInternal(ptr_); } + + private: + // `ptr_` is either a `raw_ptr` or a regular C++ pointer. + template + static GetPtrType GetInternal(U* ptr) { + static_assert(std::is_same_v); + return ptr; + } + template + static GetPtrType GetInternal(const raw_ptr& ptr) { + static_assert(std::is_same_v); + if constexpr (std::is_same_v) { + ptr.ReportIfDangling(); + } + return ptr; + } + + // `Unretained()` arguments often dangle by design (a common design pattern + // is to manage an object's lifetime inside the callback itself, using + // stateful information), so disable direct dangling pointer detection + // of `ptr_`. + // + // If the callback is invoked, dangling pointer detection will be triggered + // before invoking the bound functor (unless stated otherwise, see + // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the + // pointer value via `get()` above. + using StorageType = + std::conditional_t::value, + DanglingRawPtrType, + T*>; + // Avoid converting between different `raw_ptr` types when calling `get()`. + // It is allowable to convert `raw_ptr` -> `T*`, but not in the other + // direction. See the comment by `GetPtrType` describing for more details. + static_assert(std::is_pointer_v || + std::is_same_v); + StorageType ptr_; +}; + +// Storage type for std::reference_wrapper so `BindState` can internally store +// unprotected references using raw_ref. +// +// std::reference_wrapper and T& do not work, since the reference lifetime is +// not safely protected by MiraclePtr. +// +// UnretainedWrapper and raw_ptr do not work, since BindUnwrapTraits would +// try to pass by T* rather than T&. +template +class UnretainedRefWrapper { + public: + static_assert( + TypeSupportsUnretainedV, + "Callback cannot capture an unprotected C++ reference since this " + "type is annotated with DISALLOW_UNRETAINED(). Please see " + "base/functional/disallow_unretained.h for alternatives."); + + // Raw reference makes sense only if there are no PtrTraits. If there are, + // it means that a `raw_ref` is being passed, so use the ctors below instead. + template > + explicit UnretainedRefWrapper(T& o) : ref_(o) {} + + // Trick to only instantiate these constructors if they are used. Otherwise, + // instantiating UnretainedWrapper with a T that is not supported by + // raw_ref would trigger raw_ref's static_assert. + template + explicit UnretainedRefWrapper(const raw_ref& o) : ref_(o) {} + template + explicit UnretainedRefWrapper(raw_ref&& o) + : ref_(std::move(o)) {} + + T& get() const { return GetInternal(ref_); } + + private: + // `ref_` is either a `raw_ref` or a regular C++ reference. + template + static T& GetInternal(U& ref) { + static_assert(std::is_same_v); + return ref; + } + template + static T& GetInternal(const raw_ref& ref) { + static_assert(std::is_same_v); + // The ultimate goal is to crash when a callback is invoked with a + // dangling pointer. This is checked here. For now, it is configured to + // either crash, DumpWithoutCrashing or be ignored. This depends on the + // PartitionAllocUnretainedDanglingPtr feature. + if constexpr (std::is_same_v) { + ref.ReportIfDangling(); + } + // We can't use operator* here, we need to use raw_ptr's GetForExtraction + // instead of GetForDereference. If we did use GetForDereference then we'd + // crash in ASAN builds on calling a bound callback with a dangling + // reference parameter even if that parameter is not used. This could hide + // a later unprotected issue that would be reached in release builds. + return ref.get(); + } + + // `Unretained()` arguments often dangle by design (a common design pattern + // is to manage an object's lifetime inside the callback itself, using + // stateful information), so disable direct dangling pointer detection + // of `ref_`. + // + // If the callback is invoked, dangling pointer detection will be triggered + // before invoking the bound functor (unless stated otherwise, see + // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the + // pointer value via `get()` above. + using StorageType = + std::conditional_t::value, + raw_ref, + T&>; + + StorageType ref_; +}; + +// The class is used to wrap `UnretainedRefWrapper` when the latter is used as +// a method receiver (a reference on `this` argument). This is needed because +// the internal callback mechanism expects the receiver to have the type +// `MyClass*` and to have `operator*`. +// This is used as storage. +template +class UnretainedRefWrapperReceiver { + public: + // NOLINTNEXTLINE(google-explicit-constructor) + UnretainedRefWrapperReceiver( + UnretainedRefWrapper&& o) + : obj_(std::move(o)) {} + // NOLINTNEXTLINE(google-explicit-constructor) + T& operator*() const { return obj_.get(); } + + private: + UnretainedRefWrapper obj_; +}; + +// MethodReceiverStorageType converts the current receiver type to its stored +// type. For instance, it converts pointers to `scoped_refptr`, and wraps +// `UnretainedRefWrapper` to make it compliant with the internal callback +// invocation mechanism. +template +struct MethodReceiverStorageType { + using Type = + std::conditional_t, scoped_refptr>, T>; +}; + +template +struct MethodReceiverStorageType< + UnretainedRefWrapper> { + // We can't use UnretainedRefWrapper as a receiver directly (see + // UnretainedRefWrapperReceiver for why). + using Type = UnretainedRefWrapperReceiver; +}; + +template +class RetainedRefWrapper { + public: + explicit RetainedRefWrapper(T* o) : ptr_(o) {} + explicit RetainedRefWrapper(scoped_refptr o) : ptr_(std::move(o)) {} + T* get() const { return ptr_.get(); } + + private: + scoped_refptr ptr_; +}; + +template +struct IgnoreResultHelper { + explicit IgnoreResultHelper(T functor) : functor_(std::move(functor)) {} + explicit operator bool() const { return !!functor_; } + + T functor_; +}; + +template > +class OwnedWrapper { + public: + explicit OwnedWrapper(T* o) : ptr_(o) {} + explicit OwnedWrapper(std::unique_ptr&& ptr) + : ptr_(std::move(ptr)) {} + T* get() const { return ptr_.get(); } + + private: + std::unique_ptr ptr_; +}; + +template +class OwnedRefWrapper { + public: + explicit OwnedRefWrapper(const T& t) : t_(t) {} + explicit OwnedRefWrapper(T&& t) : t_(std::move(t)) {} + T& get() const { return t_; } + + private: + mutable T t_; +}; + +// PassedWrapper is a copyable adapter for a scoper that ignores const. +// +// It is needed to get around the fact that Bind() takes a const reference to +// all its arguments. Because Bind() takes a const reference to avoid +// unnecessary copies, it is incompatible with movable-but-not-copyable +// types; doing a destructive "move" of the type into Bind() would violate +// the const correctness. +// +// This conundrum cannot be solved without either C++11 rvalue references or +// a O(2^n) blowup of Bind() templates to handle each combination of regular +// types and movable-but-not-copyable types. Thus we introduce a wrapper type +// that is copyable to transmit the correct type information down into +// BindState<>. Ignoring const in this type makes sense because it is only +// created when we are explicitly trying to do a destructive move. +// +// Two notes: +// 1) PassedWrapper supports any type that has a move constructor, however +// the type will need to be specifically allowed in order for it to be +// bound to a Callback. We guard this explicitly at the call of Passed() +// to make for clear errors. Things not given to Passed() will be forwarded +// and stored by value which will not work for general move-only types. +// 2) is_valid_ is distinct from NULL because it is valid to bind a "NULL" +// scoper to a Callback and allow the Callback to execute once. +template +class PassedWrapper { + public: + explicit PassedWrapper(T&& scoper) : scoper_(std::move(scoper)) {} + PassedWrapper(PassedWrapper&& other) + : is_valid_(other.is_valid_), scoper_(std::move(other.scoper_)) {} + T Take() const { + CHECK(is_valid_); + is_valid_ = false; + return std::move(scoper_); + } + + private: + mutable bool is_valid_ = true; + mutable T scoper_; +}; + +template +using Unwrapper = BindUnwrapTraits>; + +template +decltype(auto) Unwrap(T&& o) { + return Unwrapper::Unwrap(std::forward(o)); +} + +// IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a +// method. It is used internally by Bind() to select the correct +// InvokeHelper that will no-op itself in the event the WeakPtr<> for +// the target object is invalidated. +// +// The first argument should be the type of the object that will be received by +// the method. +template +struct IsWeakMethod : std::false_type {}; + +template +struct IsWeakMethod : IsWeakReceiver {}; + +// Packs a list of types to hold them in a single type. +template +struct TypeList {}; + +// Used for DropTypeListItem implementation. +template +struct DropTypeListItemImpl; + +// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure. +template +struct DropTypeListItemImpl> + : DropTypeListItemImpl> {}; + +template +struct DropTypeListItemImpl<0, TypeList> { + using Type = TypeList; +}; + +template <> +struct DropTypeListItemImpl<0, TypeList<>> { + using Type = TypeList<>; +}; + +// A type-level function that drops |n| list item from given TypeList. +template +using DropTypeListItem = typename DropTypeListItemImpl::Type; + +// Used for TakeTypeListItem implementation. +template +struct TakeTypeListItemImpl; + +// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure. +template +struct TakeTypeListItemImpl, Accum...> + : TakeTypeListItemImpl, Accum..., T> {}; + +template +struct TakeTypeListItemImpl<0, TypeList, Accum...> { + using Type = TypeList; +}; + +template +struct TakeTypeListItemImpl<0, TypeList<>, Accum...> { + using Type = TypeList; +}; + +// A type-level function that takes first |n| list item from given TypeList. +// E.g. TakeTypeListItem<3, TypeList> is evaluated to +// TypeList. +template +using TakeTypeListItem = typename TakeTypeListItemImpl::Type; + +// Used for ConcatTypeLists implementation. +template +struct ConcatTypeListsImpl; + +template +struct ConcatTypeListsImpl, TypeList> { + using Type = TypeList; +}; + +// A type-level function that concats two TypeLists. +template +using ConcatTypeLists = typename ConcatTypeListsImpl::Type; + +// Used for MakeFunctionType implementation. +template +struct MakeFunctionTypeImpl; + +template +struct MakeFunctionTypeImpl> { + // MSVC 2013 doesn't support Type Alias of function types. + // Revisit this after we update it to newer version. + typedef R Type(Args...); +}; + +// A type-level function that constructs a function type that has |R| as its +// return type and has TypeLists items as its arguments. +template +using MakeFunctionType = typename MakeFunctionTypeImpl::Type; + +// Used for ExtractArgs and ExtractReturnType. +template +struct ExtractArgsImpl; + +template +struct ExtractArgsImpl { + using ReturnType = R; + using ArgsList = TypeList; +}; + +// A type-level function that extracts function arguments into a TypeList. +// E.g. ExtractArgs is evaluated to TypeList. +template +using ExtractArgs = typename ExtractArgsImpl::ArgsList; + +// A type-level function that extracts the return type of a function. +// E.g. ExtractReturnType is evaluated to R. +template +using ExtractReturnType = typename ExtractArgsImpl::ReturnType; + +template +struct ExtractCallableRunTypeImpl; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +// Evaluated to RunType of the given callable type. +// Example: +// auto f = [](int, char*) { return 0.1; }; +// ExtractCallableRunType +// is evaluated to +// double(int, char*); +template +using ExtractCallableRunType = + typename ExtractCallableRunTypeImpl::Type; + +// IsCallableObject is std::true_type if |Functor| has operator(). +// Otherwise, it's std::false_type. +// Example: +// IsCallableObject::value is false. +// +// struct Foo {}; +// IsCallableObject::value is false. +// +// int i = 0; +// auto f = [i]() {}; +// IsCallableObject::value is false. +template +struct IsCallableObject : std::false_type {}; + +template +struct IsCallableObject> + : std::true_type {}; + +// HasRefCountedTypeAsRawPtr inherits from true_type when any of the |Args| is a +// raw pointer to a RefCounted type. +template +struct HasRefCountedTypeAsRawPtr + : std::disjunction...> {}; + +// ForceVoidReturn<> +// +// Set of templates that support forcing the function return type to void. +template +struct ForceVoidReturn; + +template +struct ForceVoidReturn { + using RunType = void(Args...); +}; + +// FunctorTraits<> +// +// See description at top of file. +template +struct FunctorTraits; + +// For callable types. +// This specialization handles lambdas (captureless and capturing) and functors +// with a call operator. Capturing lambdas and stateful functors are explicitly +// disallowed by BindImpl(). +// +// Example: +// +// // Captureless lambdas are allowed. +// []() {return 42;}; +// +// // Capturing lambdas are *not* allowed. +// int x; +// [x]() {return x;}; +// +// // Any empty class with operator() is allowed. +// struct Foo { +// void operator()() const {} +// // No non-static member variable and no virtual functions. +// }; +template +struct FunctorTraits::value>> { + using RunType = ExtractCallableRunType; + static constexpr bool is_method = false; + static constexpr bool is_nullable = false; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = std::is_empty_v; + + template + static ExtractReturnType Invoke(RunFunctor&& functor, + RunArgs&&... args) { + return std::forward(functor)(std::forward(args)...); + } +}; + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Function&& function, RunArgs&&... args) { + return std::forward(function)(std::forward(args)...); + } +}; + +#if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(R(__stdcall* function)(Args...), RunArgs&&... args) { + return function(std::forward(args)...); + } +}; + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(R(__fastcall* function)(Args...), RunArgs&&... args) { + return function(std::forward(args)...); + } +}; + +#endif // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +#if __OBJC__ + +// Support for Objective-C blocks. Blocks can be bound as the compiler will +// ensure their lifetimes will be correctly managed. + +#if HAS_FEATURE(objc_arc) + +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(BlockType&& block, RunArgs&&... args) { + // According to LLVM documentation (§ 6.3), "local variables of automatic + // storage duration do not have precise lifetime." Use objc_precise_lifetime + // to ensure that the Objective-C block is not deallocated until it has + // finished executing even if the Callback<> is destroyed during the block + // execution. + // https://clang.llvm.org/docs/AutomaticReferenceCounting.html#precise-lifetime-semantics + __attribute__((objc_precise_lifetime)) R (^scoped_block)(Args...) = block; + return scoped_block(std::forward(args)...); + } +}; + +#endif // HAS_FEATURE(objc_arc) +#endif // __OBJC__ + +// For methods. +template +struct FunctorTraits { + using RunType = R(Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +// For const methods. +template +struct FunctorTraits { + using RunType = R(const Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +#if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +// For __stdcall methods. +template +struct FunctorTraits { + using RunType = R(Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +// For __stdcall const methods. +template +struct FunctorTraits { + using RunType = R(const Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +#endif // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +#ifdef __cpp_noexcept_function_type +// noexcept makes a distinct function type in C++17. +// I.e. `void(*)()` and `void(*)() noexcept` are same in pre-C++17, and +// different in C++17. +template +struct FunctorTraits : FunctorTraits { +}; + +template +struct FunctorTraits + : FunctorTraits {}; + +template +struct FunctorTraits + : FunctorTraits {}; +#endif + +// For IgnoreResults. +template +struct FunctorTraits> : FunctorTraits { + using RunType = + typename ForceVoidReturn::RunType>::RunType; + + template + static void Invoke(IgnoreResultType&& ignore_result_helper, + RunArgs&&... args) { + FunctorTraits::Invoke( + std::forward(ignore_result_helper).functor_, + std::forward(args)...); + } +}; + +// For OnceCallbacks. +template +struct FunctorTraits> { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = true; + static constexpr bool is_stateless = true; + + template + static R Invoke(CallbackType&& callback, RunArgs&&... args) { + DCHECK(!callback.is_null()); + return std::forward(callback).Run( + std::forward(args)...); + } +}; + +// For RepeatingCallbacks. +template +struct FunctorTraits> { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = true; + static constexpr bool is_stateless = true; + + template + static R Invoke(CallbackType&& callback, RunArgs&&... args) { + DCHECK(!callback.is_null()); + return std::forward(callback).Run( + std::forward(args)...); + } +}; + +template +using MakeFunctorTraits = FunctorTraits>; + +// StorageTraits<> +// +// See description at top of file. +template +struct StorageTraits { + using Type = T; +}; + +// For T*, store as UnretainedWrapper for safety, as it internally uses +// raw_ptr (when possible). +template +struct StorageTraits { + using Type = UnretainedWrapper; +}; + +// For raw_ptr, store as UnretainedWrapper for safety. This may seem +// contradictory, but this ensures guaranteed protection for the pointer even +// during execution of callbacks with parameters of type raw_ptr. +template +struct StorageTraits> { + using Type = UnretainedWrapper; +}; + +// Unwrap std::reference_wrapper and store it in a custom wrapper so that +// references are also protected with raw_ptr. +template +struct StorageTraits> { + using Type = UnretainedRefWrapper; +}; + +template +using MakeStorageType = typename StorageTraits>::Type; + +// InvokeHelper<> +// +// There are 2 logical InvokeHelper<> specializations: normal, WeakCalls. +// +// The normal type just calls the underlying runnable. +// +// WeakCalls need special syntax that is applied to the first argument to check +// if they should no-op themselves. +template +struct InvokeHelper; + +template +struct InvokeHelper { + template + static inline ReturnType MakeItSo(Functor&& functor, + BoundArgsTuple&& bound, + RunArgs&&... args) { + using Traits = MakeFunctorTraits; + return Traits::Invoke( + std::forward(functor), + Unwrap(std::get(std::forward(bound)))..., + std::forward(args)...); + } +}; + +template +struct InvokeHelper { + // WeakCalls are only supported for functions with a void return type. + // Otherwise, the function result would be undefined if the WeakPtr<> + // is invalidated. + static_assert(std::is_void_v, + "weak_ptrs can only bind to methods without return values"); + + template + static inline void MakeItSo(Functor&& functor, + BoundArgsTuple&& bound, + RunArgs&&... args) { + static_assert(index_target == 0); + // Note the validity of the weak pointer should be tested _after_ it is + // unwrapped, otherwise it creates a race for weak pointer implementations + // that allow cross-thread usage and perform `Lock()` in Unwrap() traits. + const auto& target = Unwrap(std::get<0>(bound)); + if (!target) { + return; + } + using Traits = MakeFunctorTraits; + Traits::Invoke( + std::forward(functor), target, + Unwrap(std::get(std::forward(bound)))..., + std::forward(args)...); + } +}; + +// Invoker<> +// +// See description at the top of the file. +template +struct Invoker; + +template +struct Invoker { + static R RunOnce(BindStateBase* base, + PassingType... unbound_args) { + // Local references to make debugger stepping easier. If in a debugger, + // you really want to warp ahead and step through the + // InvokeHelper<>::MakeItSo() call below. + StorageType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return RunImpl(std::move(storage->functor_), + std::move(storage->bound_args_), + std::make_index_sequence(), + std::forward(unbound_args)...); + } + + static R Run(BindStateBase* base, PassingType... unbound_args) { + // Local references to make debugger stepping easier. If in a debugger, + // you really want to warp ahead and step through the + // InvokeHelper<>::MakeItSo() call below. + const StorageType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return RunImpl(storage->functor_, storage->bound_args_, + std::make_index_sequence(), + std::forward(unbound_args)...); + } + + private: + template + static inline R RunImpl(Functor&& functor, + BoundArgsTuple&& bound, + std::index_sequence seq, + UnboundArgs&&... unbound_args) { + static constexpr bool is_method = MakeFunctorTraits::is_method; + + using DecayedArgsTuple = std::decay_t; + +#if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) + RawPtrAsanBoundArgTracker raw_ptr_asan_bound_arg_tracker; + raw_ptr_asan_bound_arg_tracker.AddArgs( + std::get(std::forward(bound))..., + std::forward(unbound_args)...); +#endif // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) + + static constexpr bool is_weak_call = + IsWeakMethod...>(); + + // Do not `Unwrap()` here, as that immediately triggers dangling pointer + // detection. Dangling pointer detection should only be triggered if the + // callback is not cancelled, but cancellation status is not determined + // until later inside the InvokeHelper::MakeItSo specialization for weak + // calls. + // + // Dangling pointers when invoking a cancelled callback are not considered + // a memory safety error because protecting raw pointers usage with weak + // receivers (where the weak receiver usually own the pointed objects) is a + // common and broadly used pattern in the codebase. + return InvokeHelper::MakeItSo( + std::forward(functor), std::forward(bound), + std::forward(unbound_args)...); + } +}; + +// Extracts necessary type info from Functor and BoundArgs. +// Used to implement MakeUnboundRunType, BindOnce and BindRepeating. +template +struct BindTypeHelper { + static constexpr size_t num_bounds = sizeof...(BoundArgs); + using FunctorTraits = MakeFunctorTraits; + + // Example: + // When Functor is `double (Foo::*)(int, const std::string&)`, and BoundArgs + // is a template pack of `Foo*` and `int16_t`: + // - RunType is `double(Foo*, int, const std::string&)`, + // - ReturnType is `double`, + // - RunParamsList is `TypeList`, + // - BoundParamsList is `TypeList`, + // - UnboundParamsList is `TypeList`, + // - BoundArgsList is `TypeList`, + // - UnboundRunType is `double(const std::string&)`. + using RunType = typename FunctorTraits::RunType; + using ReturnType = ExtractReturnType; + + using RunParamsList = ExtractArgs; + using BoundParamsList = TakeTypeListItem; + using UnboundParamsList = DropTypeListItem; + + using BoundArgsList = TypeList; + + using UnboundRunType = MakeFunctionType; +}; + +template +std::enable_if_t::is_nullable, bool> IsNull( + const Functor& functor) { + return !functor; +} + +template +std::enable_if_t::is_nullable, bool> IsNull( + const Functor&) { + return false; +} + +// Used by QueryCancellationTraits below. +template +bool QueryCancellationTraitsImpl(BindStateBase::CancellationQueryMode mode, + const Functor& functor, + const BoundArgsTuple& bound_args, + std::index_sequence) { + switch (mode) { + case BindStateBase::IS_CANCELLED: + return CallbackCancellationTraits::IsCancelled( + functor, std::get(bound_args)...); + case BindStateBase::MAYBE_VALID: + return CallbackCancellationTraits::MaybeValid( + functor, std::get(bound_args)...); + } + NOTREACHED(); + return false; +} + +// Relays |base| to corresponding CallbackCancellationTraits<>::Run(). Returns +// true if the callback |base| represents is canceled. +template +bool QueryCancellationTraits(const BindStateBase* base, + BindStateBase::CancellationQueryMode mode) { + const BindStateType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return QueryCancellationTraitsImpl( + mode, storage->functor_, storage->bound_args_, + std::make_index_sequence()); +} + +// The base case of BanUnconstructedRefCountedReceiver that checks nothing. +template +std::enable_if_t< + !(MakeFunctorTraits::is_method && + IsPointerV> && + IsRefCountedType>>::value)> +BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {} + +template +void BanUnconstructedRefCountedReceiver() {} + +// Asserts that Callback is not the first owner of a ref-counted receiver. +template +std::enable_if_t< + MakeFunctorTraits::is_method && + IsPointerV> && + IsRefCountedType>>::value> +BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) { + DCHECK(receiver); + + // It's error prone to make the implicit first reference to ref-counted types. + // In the example below, base::BindOnce() would make the implicit first + // reference to the ref-counted Foo. If PostTask() failed or the posted task + // ran fast enough, the newly created instance could be destroyed before `oo` + // makes another reference. + // Foo::Foo() { + // base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, this)); + // } + // + // scoped_refptr oo = new Foo(); + // + // Hence, base::Bind{Once,Repeating}() refuses to create the first reference + // to ref-counted objects, and DCHECK()s otherwise. As above, that typically + // happens around PostTask() in their constructor, and such objects can be + // destroyed before `new` returns if the task resolves fast enough. + // + // Instead of doing the above, please consider adding a static constructor, + // and keep the first reference alive explicitly. + // // static + // scoped_refptr Foo::Create() { + // auto foo = base::WrapRefCounted(new Foo()); + // base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, foo)); + // return foo; + // } + // + // Foo::Foo() {} + // + // scoped_refptr oo = Foo::Create(); + // + DCHECK(receiver->HasAtLeastOneRef()); +} + +// BindState<> +// +// This stores all the state passed into Bind(). +template +struct BindState final : BindStateBase { + using IsCancellable = std::bool_constant< + CallbackCancellationTraits>::is_cancellable>; + template + static BindState* Create(BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) { + // Ban ref counted receivers that were not yet fully constructed to avoid + // a common pattern of racy situation. + BanUnconstructedRefCountedReceiver(bound_args...); + + // IsCancellable is std::false_type if + // CallbackCancellationTraits<>::IsCancelled returns always false. + // Otherwise, it's std::true_type. + return new BindState(IsCancellable{}, invoke_func, + std::forward(functor), + std::forward(bound_args)...); + } + + Functor functor_; + std::tuple bound_args_; + + private: + static constexpr bool is_nested_callback = + MakeFunctorTraits::is_callback; + + template + explicit BindState(std::true_type, + BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) + : BindStateBase(invoke_func, + &Destroy, + &QueryCancellationTraits), + functor_(std::forward(functor)), + bound_args_(std::forward(bound_args)...) { + // We check the validity of nested callbacks (e.g., Bind(callback, ...)) in + // release builds to avoid null pointers from ending up in posted tasks, + // causing hard-to-diagnose crashes. Ideally we'd do this for all functors + // here, but that would have a large binary size impact. + if (is_nested_callback) { + CHECK(!IsNull(functor_)); + } else { + DCHECK(!IsNull(functor_)); + } + } + + template + explicit BindState(std::false_type, + BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) + : BindStateBase(invoke_func, &Destroy), + functor_(std::forward(functor)), + bound_args_(std::forward(bound_args)...) { + // See above for CHECK/DCHECK rationale. + if (is_nested_callback) { + CHECK(!IsNull(functor_)); + } else { + DCHECK(!IsNull(functor_)); + } + } + + ~BindState() = default; + + static void Destroy(const BindStateBase* self) { + delete static_cast(self); + } +}; + +// Used to implement MakeBindStateType. +template +struct MakeBindStateTypeImpl; + +template +struct MakeBindStateTypeImpl { + static_assert(!HasRefCountedTypeAsRawPtr...>::value, + "A parameter is a refcounted type and needs scoped_refptr."); + using Type = BindState, MakeStorageType...>; +}; + +template +struct MakeBindStateTypeImpl { + using Type = BindState>; +}; + +template +struct MakeBindStateTypeImpl { + private: + using DecayedReceiver = std::decay_t; + static_assert(!std::is_array_v>, + "First bound argument to a method cannot be an array."); + static_assert( + !IsRawRefV, + "Receivers may not be raw_ref. If using a raw_ref here is safe" + " and has no lifetime concerns, use base::Unretained() and document why" + " it's safe."); + static_assert( + !IsPointerV || + IsRefCountedType>::value, + "Receivers may not be raw pointers. If using a raw pointer here is safe" + " and has no lifetime concerns, use base::Unretained() and document why" + " it's safe."); + + static_assert(!HasRefCountedTypeAsRawPtr...>::value, + "A parameter is a refcounted type and needs scoped_refptr."); + + using ReceiverStorageType = + typename MethodReceiverStorageType::Type; + + public: + using Type = BindState, + ReceiverStorageType, + MakeStorageType...>; +}; + +template +using MakeBindStateType = + typename MakeBindStateTypeImpl::is_method, + Functor, + BoundArgs...>::Type; + +// Returns a RunType of bound functor. +// E.g. MakeUnboundRunType is evaluated to R(C). +template +using MakeUnboundRunType = + typename BindTypeHelper::UnboundRunType; + +// The implementation of TransformToUnwrappedType below. +template +struct TransformToUnwrappedTypeImpl; + +template +struct TransformToUnwrappedTypeImpl { + using StoredType = std::decay_t; + using ForwardType = StoredType&&; + using Unwrapped = decltype(Unwrap(std::declval())); +}; + +template +struct TransformToUnwrappedTypeImpl { + using StoredType = std::decay_t; + using ForwardType = const StoredType&; + using Unwrapped = decltype(Unwrap(std::declval())); +}; + +// Transform |T| into `Unwrapped` type, which is passed to the target function. +// Example: +// In is_once == true case, +// `int&&` -> `int&&`, +// `const int&` -> `int&&`, +// `OwnedWrapper&` -> `int*&&`. +// In is_once == false case, +// `int&&` -> `const int&`, +// `const int&` -> `const int&`, +// `OwnedWrapper&` -> `int* const &`. +template +using TransformToUnwrappedType = + typename TransformToUnwrappedTypeImpl::Unwrapped; + +// Transforms |Args| into `Unwrapped` types, and packs them into a TypeList. +// If |is_method| is true, tries to dereference the first argument to support +// smart pointers. +template +struct MakeUnwrappedTypeListImpl { + using Type = TypeList...>; +}; + +// Performs special handling for this pointers. +// Example: +// int* -> int*, +// std::unique_ptr -> int*. +template +struct MakeUnwrappedTypeListImpl { + using ReceiverStorageType = + typename MethodReceiverStorageType>::Type; + using UnwrappedReceiver = + TransformToUnwrappedType; + using Type = TypeList()), + TransformToUnwrappedType...>; +}; + +template +using MakeUnwrappedTypeList = + typename MakeUnwrappedTypeListImpl::Type; + +// IsOnceCallback is a std::true_type if |T| is a OnceCallback. +template +struct IsOnceCallback : std::false_type {}; + +template +struct IsOnceCallback> : std::true_type {}; + +// IsUnretainedMayDangle is true if StorageType is of type +// `UnretainedWrapper. +// Note that it is false for unretained_traits::MayDangleUntriaged. +template +inline constexpr bool IsUnretainedMayDangle = false; +template +inline constexpr bool IsUnretainedMayDangle< + UnretainedWrapper> = true; + +// UnretainedAndRawPtrHaveCompatibleTraits is true if StorageType is of type +// `UnretainedWrapper` and +// FunctionParamType is of type `raw_ptr`, and the former's +// ::GetPtrType is the same type as the latter. +template +inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits = false; +template +inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits< + UnretainedWrapper, + raw_ptr> = + std::is_same_v< + typename UnretainedWrapper::GetPtrType, + raw_ptr>; + +// Helpers to make error messages slightly more readable. +template +struct BindArgument { + template + struct ForwardedAs { + template + struct ToParamWithType { + static constexpr bool kNotARawPtr = !IsRawPtrV; + + static constexpr bool kCanBeForwardedToBoundFunctor = + std::is_constructible_v; + + // If the bound type can't be forwarded then test if `FunctorParamType` is + // a non-const lvalue reference and a reference to the unwrapped type + // *could* have been successfully forwarded. + static constexpr bool kNonConstRefParamMustBeWrapped = + kCanBeForwardedToBoundFunctor || + !(std::is_lvalue_reference_v && + !std::is_const_v> && + std::is_convertible_v&, + FunctorParamType>); + + // Note that this intentionally drops the const qualifier from + // `ForwardingType`, to test if it *could* have been successfully + // forwarded if `Passed()` had been used. + static constexpr bool kMoveOnlyTypeMustUseBasePassed = + kCanBeForwardedToBoundFunctor || + !std::is_constructible_v&&>; + }; + }; + + template + struct BoundAs { + template + struct StoredAs { + static constexpr bool kBindArgumentCanBeCaptured = + std::is_constructible_v; + // Note that this intentionally drops the const qualifier from + // `BoundAsType`, to test if it *could* have been successfully bound if + // `std::move()` had been used. + static constexpr bool kMoveOnlyTypeMustUseStdMove = + kBindArgumentCanBeCaptured || + !std::is_constructible_v&&>; + }; + }; + + template + struct ToParamWithType { + template + struct StoredAs { + template + // true if we are handling `this` parameter. + static constexpr bool kParamIsThisPointer = is_method && i == 0; + // true if the current parameter is of type `raw_ptr` with + // `RawPtrTraits::kMayDangle` trait (e.g. `MayBeDangling`). + static constexpr bool kParamIsDanglingRawPtr = + IsRawPtrMayDangleV; + // true if the bound parameter is of type + // `UnretainedWrapper`. + static constexpr bool kBoundPtrMayDangle = + IsUnretainedMayDangle; + // true if bound parameter of type `UnretainedWrapper` and parameter of + // type `raw_ptr` have compatible `RawPtrTraits`. + static constexpr bool kMayBeDanglingTraitsCorrectness = + UnretainedAndRawPtrHaveCompatibleTraits; + // true if the receiver argument **must** be of type `MayBeDangling`. + static constexpr bool kMayBeDanglingMustBeUsed = + kBoundPtrMayDangle && kParamIsDanglingRawPtr; + + // true iff: + // - bound parameter is of type + // `UnretainedWrapper` + // - the receiving argument is of type `MayBeDangling` + template + static constexpr bool kMayBeDanglingPtrPassedCorrectly = + kParamIsThisPointer || + kBoundPtrMayDangle == kParamIsDanglingRawPtr; + + // true if: + // - MayBeDangling must not be used as receiver parameter. + // OR + // - MayBeDangling must be used as receiver parameter and its traits + // are matching Unretained traits. + static constexpr bool kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits = + !kMayBeDanglingMustBeUsed || kMayBeDanglingTraitsCorrectness; + }; + }; +}; + +// Helper to assert that parameter |i| of type |Arg| can be bound, which means: +// - |Arg| can be retained internally as |Storage|. +// - |Arg| can be forwarded as |Unwrapped| to |Param|. +template +struct AssertConstructible { + private: + // With `BindRepeating`, there are two decision points for how to handle a + // move-only type: + // + // 1. Whether the move-only argument should be moved into the internal + // `BindState`. Either `std::move()` or `Passed` is sufficient to trigger + // move-only semantics. + // 2. Whether or not the bound, move-only argument should be moved to the + // bound functor when invoked. When the argument is bound with `Passed`, + // invoking the callback will destructively move the bound, move-only + // argument to the bound functor. In contrast, if the argument is bound + // with `std::move()`, `RepeatingCallback` will attempt to call the bound + // functor with a constant reference to the bound, move-only argument. This + // will fail if the bound functor accepts that argument by value, since the + // argument cannot be copied. It is this latter case that this + // static_assert aims to catch. + // + // In contrast, `BindOnce()` only has one decision point. Once a move-only + // type is captured by value into the internal `BindState`, the bound, + // move-only argument will always be moved to the functor when invoked. + // Failure to use std::move will simply fail the `kMoveOnlyTypeMustUseStdMove` + // assert below instead. + // + // Note: `Passed()` is a legacy of supporting move-only types when repeating + // callbacks were the only callback type. A `RepeatingCallback` with a + // `Passed()` argument is really a `OnceCallback` and should eventually be + // migrated. + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kMoveOnlyTypeMustUseBasePassed, + "base::BindRepeating() argument is a move-only type. Use base::Passed() " + "instead of std::move() to transfer ownership from the callback to the " + "bound functor."); + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kNonConstRefParamMustBeWrapped, + "Bound argument for non-const reference parameter must be wrapped in " + "std::ref() or base::OwnedRef()."); + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kCanBeForwardedToBoundFunctor, + "Type mismatch between bound argument and bound functor's parameter."); + + static_assert(BindArgument::template BoundAs::template StoredAs< + Storage>::kMoveOnlyTypeMustUseStdMove, + "Attempting to bind a move-only type. Use std::move() to " + "transfer ownership to the created callback."); + // In practice, this static_assert should be quite rare as the storage type + // is deduced from the arguments passed to `BindOnce()`/`BindRepeating()`. + static_assert( + BindArgument::template BoundAs::template StoredAs< + Storage>::kBindArgumentCanBeCaptured, + "Cannot capture argument: is the argument copyable or movable?"); + + // We forbid callbacks to use raw_ptr as a parameter. However, we allow + // MayBeDangling iff the callback argument was created using + // `base::UnsafeDangling`. + static_assert( + BindArgument::template ForwardedAs< + Unwrapped>::template ToParamWithType::kNotARawPtr || + BindArgument::template ToParamWithType::template StoredAs< + Storage>::kMayBeDanglingMustBeUsed, + "base::Bind() target functor has a parameter of type raw_ptr. " + "raw_ptr should not be used for function parameters, please use T* or " + "T& instead."); + + // A bound functor must take a dangling pointer argument (e.g. bound using the + // UnsafeDangling helper) as a MayBeDangling, to make it clear that the + // pointee's lifetime must be externally validated before using it. For + // methods, exempt a bound receiver (i.e. the this pointer) as it is not + // passed as a regular function argument. + static_assert( + BindArgument::template ToParamWithType::template StoredAs< + Storage>::template kMayBeDanglingPtrPassedCorrectly, + "base::UnsafeDangling() pointers must be received by functors with " + "MayBeDangling as parameter."); + + static_assert( + BindArgument::template ToParamWithType::template StoredAs< + Storage>::kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits, + "MayBeDangling parameter must receive the same RawPtrTraits as the " + "one passed to the corresponding base::UnsafeDangling() call."); +}; + +// Takes three same-length TypeLists, and applies AssertConstructible for each +// triples. +template +struct AssertBindArgsValidity; + +template +struct AssertBindArgsValidity, + TypeList, + TypeList, + TypeList> + : AssertConstructible, + Unwrapped, + Params>... { + static constexpr bool ok = true; +}; + +template +struct AssertBindArgIsNotBasePassed : public std::true_type {}; + +template +struct AssertBindArgIsNotBasePassed> : public std::false_type { +}; + +template