diff --git a/MozillaThunderbird.changes b/MozillaThunderbird.changes index 90d85cb..d466e36 100644 --- a/MozillaThunderbird.changes +++ b/MozillaThunderbird.changes @@ -1,3 +1,233 @@ +------------------------------------------------------------------- +Tue Aug 5 19:36:55 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 140.1.1 + Fixed + * Users with attachments open in tabs saw an error on Thunderbird restart + * Sending from unified or local folder failed if no default account was set + * Delete button could remove attachment instead of message + * Message list scrolled back when returning to mail tab after opening a message + +------------------------------------------------------------------- +Sat Jul 26 08:58:28 UTC 2025 - Andreas Schwab + +- Update memory constraints + +------------------------------------------------------------------- +Sat Jul 19 06:05:52 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 140.1.0 + * New folders were not added alphabetically if folders manually + reordered beforehand + * Message archive folder creation could silently stop during async + folder creation + MFSA 2025-63 (bsc#1246664) + * CVE-2025-8027 (bmo#1968423) + JavaScript engine only wrote partial return value to stack + * CVE-2025-8028 (bmo#1971581) + Large branch table could lead to truncated instruction + * CVE-2025-8029 (bmo#1928021) + javascript: URLs executed on object and embed tags + * CVE-2025-8036 (bmo#1960834) + DNS rebinding circumvents CORS + * CVE-2025-8037 (bmo#1964767) + Nameless cookies shadow secure cookies + * CVE-2025-8030 (bmo#1968414) + Potential user-assisted code execution in “Copy as cURL” command + * CVE-2025-8031 (bmo#1971719) + Incorrect URL stripping in CSP reports + * CVE-2025-8032 (bmo#1974407) + XSLT documents could bypass CSP + * CVE-2025-8038 (bmo#1808979) + CSP frame-src was not correctly enforced for paths + * CVE-2025-8039 (bmo#1970997) + Search terms persisted in URL bar + * CVE-2025-8033 (bmo#1973990) + Incorrect JavaScript state machine for generators + * CVE-2025-8034 (bmo#1970422, bmo#1970422, bmo#1970422, bmo#1970422) + Memory safety bugs fixed in Firefox ESR 115.26, Firefox ESR + 128.13, Thunderbird ESR 128.13, Firefox ESR 140.1, + Thunderbird ESR 140.1, Firefox 141 and Thunderbird 141 + * CVE-2025-8040 (bmo#1975058, bmo#1975058, bmo#1975998, bmo#1975998) + Memory safety bugs fixed in Firefox ESR 140.1, Thunderbird + ESR 140.1, Firefox 141 and Thunderbird 141 + * CVE-2025-8035 (bmo#1975961, bmo#1975961, bmo#1975961) + Memory safety bugs fixed in Firefox ESR 128.13, Thunderbird + ESR 128.13, Firefox ESR 140.1, Thunderbird ESR 140.1, Firefox + 141 and Thunderbird 141 + +------------------------------------------------------------------- +Mon Jul 15 04:38:05 UTC 2025 - Tristan Miller + +- Mozilla Thunderbird ESR 140.0.1 + MFSA 2025-54 + * CVE-2025-6424 (bmo#1966423) + Use-after-free in FontFaceSet + * CVE-2025-6425 (bmo#1717672) + The WebCompat WebExtension shipped exposed a persistent UUID + * CVE-2025-6426 (bmo#1964385) + No warning when opening executable terminal files on macOS + * CVE-2025-6427 (bmo#1966927) + connect-src Content Security Policy restriction could be + bypassed + * CVE-2025-6429 (bmo#1970658) + Incorrect parsing of URLs could have allowed embedding of + youtube.com + * CVE-2025-6430 (bmo#1971140) + Content-Disposition header ignored when a file is included in + an embed or object tag + * CVE-2025-6432 (bmo#1943804) + DNS Requests leaked outside of a configured SOCKS proxy + * CVE-2025-6433 (bmo#1954033) + WebAuthn would allow a user to sign a challenge on a webpage + with an invalid TLS certificate + * CVE-2025-6434 (bmo#1955182) + HTTPS-Only exception screen lacked anti-clickjacking delay + * CVE-2025-6435 (bmo#1961777 bmo#1950056) + Save as in Devtools could download files without sanitizing + the extension + * CVE-2025-6436 (bmo#1941377 bmo#1960948 bmo#1966187 bmo#1966505 + bmo#1970764) + Memory safety bugs fixed in Firefox 140 and Thunderbird 140 +- adapt mozilla-ntlm-full-path.patch for Thunderbird 140.0.1 +- adapt mozilla-silence-no-return-type.patch for Thunderbird + 140.0.1 + +------------------------------------------------------------------- +Sun Jun 29 06:49:01 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 128.12.0 + MFSA 2025-55 (bsc#1244670) + * CVE-2025-6424 (bmo#1966423) + Use-after-free in FontFaceSet + * CVE-2025-6425 (bmo#1717672) + The WebCompat WebExtension shipped exposed a persistent UUID + * CVE-2025-6426 (bmo#1964385) + No warning when opening executable terminal files on macOS + * CVE-2025-6429 (bmo#1970658) + Incorrect parsing of URLs could have allowed embedding of + youtube.com + * CVE-2025-6430 (bmo#1971140) + Content-Disposition header ignored when a file is included in + an embed or object tag + +------------------------------------------------------------------- +Tue Jun 17 08:18:37 UTC 2025 - Manfred Hollstein + +- Use these tools/versions unconditionally, package won't build on + Tumbleweed with new gcc15 otherwise: + gcc14, gcc14-c++, cargo1.84, rust1.84 + +------------------------------------------------------------------- +Mon Jun 9 11:46:34 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 128.11.1 + MFSA 2025-49 + * CVE-2025-5986 (bmo#1958580, bmo#1968012) + Unsolicited File Download, Disk Space Exhaustion, and Credential + Leakage via mailbox:/// Links + +------------------------------------------------------------------- +Sun Jun 8 14:58:03 UTC 2025 - Bernhard Wiedemann + +- Replace usage of %jobs for reproducible builds (boo#1237231) + +------------------------------------------------------------------- +Mon May 26 16:54:33 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 128.11.0 + MFSA 2025-46 (boo#1243353) + * CVE-2025-5262 (bmo#1962421) + Double-free in libvpx encoder + * CVE-2025-5263 (bmo#1960745) + Error handling for script execution was incorrectly isolated + from web content + * CVE-2025-5264 (bmo#1950001) + Potential local code execution in “Copy as cURL” command + * CVE-2025-5265 (bmo#1962301) + Potential local code execution in “Copy as cURL” command + * CVE-2025-5266 (bmo#1965628) + Script element events leaked cross-origin resource status + * CVE-2025-5267 (bmo#1954137) + Clickjacking vulnerability could have led to leaking saved + payment card details + * CVE-2025-5268 (bmo#1950136, bmo#1958121, bmo#1960499, + bmo#1962634) + Memory safety bugs fixed in Firefox 139, Thunderbird 139, + Firefox ESR 128.11, and Thunderbird 128.11 + * CVE-2025-5269 (bmo#1924108) + Memory safety bug fixed in Firefox ESR 128.11 and Thunderbird + 128.11 + * fixed: Thunderbird could crash if message copying to Sent + folder was interrupted (bmo#1965304) + +------------------------------------------------------------------- +Wed May 21 05:23:25 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 128.10.2 + MFSA 2025-40 (boo#1243303) + * CVE-2025-4918 (bmo#1966612) + Out-of-bounds access when resolving Promise objects + * CVE-2025-4919 (bmo#1966614) + Out-of-bounds access when optimizing linear sums + * Messages could not be viewed if the profile used a UNC path + * Visual and UX improvements + +------------------------------------------------------------------- +Thu May 15 17:11:50 UTC 2025 - Andreas Stieger + +- Mozilla Thunderbird ESR 128.10.1: + MFSA 2025-34 (boo#1243216) + * CVE-2025-3875 (bmo#1950629) + Sender Spoofing via Malformed From Header in Thunderbird + * CVE-2025-3877 (bmo#1958580) + Unsolicited File Download, Disk Space Exhaustion, and + Credential Leakage via mailbox:/// Links + * CVE-2025-3909 (bmo#1958376) + JavaScript Execution via Spoofed PDF Attachment and file:/// + Link + * CVE-2025-3932 (bmo#1960412) + Tracking Links in Attachments Bypassed Remote Content + Blocking + * fixed: Standalone message windows/tabs no longer responded + after folder compaction (bmo#1960349) + * fixed: Thunderbird could crash when importing Outlook + messages (bmo#1851297) + * fixed: Visual and UX improvements (bmo#1960861) + +------------------------------------------------------------------- +Sun May 11 09:44:51 UTC 2025 - Christian Boltz + +- build on s390x needs 17G memory - adjust _constraints + +------------------------------------------------------------------- +Tue Apr 29 20:33:16 UTC 2025 - Wolfgang Rosenauer + +- Mozilla Thunderbird ESR 128.10.0 + * Changed color override defaults with high contrast mode on + macOS and Linux + * Using Delete column in "Search Messages..." window could delete + other messages + MFSA 2025-32 (bsc#1241621) + * CVE-2025-2817 (bmo#1917536) + Privilege escalation in Thunderbird Updater + * CVE-2025-4082 (bmo#1937097) + WebGL shader attribute memory corruption in Thunderbird for + macOS + * CVE-2025-4083 (bmo#1958350) + Process isolation bypass using "javascript:" URI links in + cross-origin frames + * CVE-2025-4084 (bmo#1949994, bmo#1956698, bmo#1960198) + Potential local code execution in "copy as cURL" command + * CVE-2025-4087 (bmo#1952465) + Unsafe attribute access during XPath parsing + * CVE-2025-4091 (bmo#1951161, bmo#1952105) + Memory safety bugs fixed in Firefox 138, Thunderbird 138, + Firefox ESR 128.10, and Thunderbird 128.10 + * CVE-2025-4093 (bmo#1894100) + Memory safety bug fixed in Firefox ESR 128.10 and Thunderbird + 128.10 + ------------------------------------------------------------------- Tue Apr 15 20:16:38 UTC 2025 - Wolfgang Rosenauer diff --git a/MozillaThunderbird.spec b/MozillaThunderbird.spec index 186c705..608b8f3 100644 --- a/MozillaThunderbird.spec +++ b/MozillaThunderbird.spec @@ -1,8 +1,9 @@ # # spec file for package MozillaThunderbird # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # Copyright (c) 2006-2025 Wolfgang Rosenauer +# Copyright (c) 2025 Tristan Miller # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -28,9 +29,9 @@ # orig_suffix b3 (or esr) # major 69 # mainver %%major.99 -%define major 128 -%define mainver %major.9.2 -%define orig_version 128.9.2 +%define major 140 +%define mainver %major.1.1 +%define orig_version 140.1.1 %define orig_suffix esr %define update_channel esr %define source_prefix thunderbird-%{orig_version} @@ -92,18 +93,14 @@ Name: %{pkgname} BuildRequires: Mesa-devel BuildRequires: alsa-devel BuildRequires: autoconf213 +BuildRequires: cargo1.84 BuildRequires: dbus-1-glib-devel BuildRequires: dejavu-fonts BuildRequires: fdupes +BuildRequires: gcc14 +BuildRequires: gcc14-c++ BuildRequires: memory-constraints -%if 0%{?suse_version} < 1550 && 0%{?sle_version} <= 150600 -BuildRequires: gcc13 -BuildRequires: gcc13-c++ -%else -BuildRequires: gcc-c++ -%endif -BuildRequires: cargo1.78 -BuildRequires: rust1.78 +BuildRequires: rust1.84 %if 0%{useccache} != 0 BuildRequires: ccache %endif @@ -133,7 +130,7 @@ BuildRequires: python3-curses BuildRequires: python3-devel %endif %endif -BuildRequires: rust-cbindgen >= 0.26 +BuildRequires: rust-cbindgen >= 0.27 BuildRequires: unzip BuildRequires: update-desktop-files BuildRequires: xorg-x11-libXt-devel @@ -312,7 +309,7 @@ echo "" > .obsenv.sh cat >> .obsenv.sh < $MOZCONFIG mk_add_options MOZILLA_OFFICIAL=1 mk_add_options BUILD_OFFICIAL=1 -mk_add_options MOZ_MAKE_FLAGS=%{?jobs:-j%jobs} +mk_add_options MOZ_MAKE_FLAGS=%{?_smp_mflags} mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj ac_add_options --disable-bootstrap ac_add_options --prefix=%{_prefix} @@ -470,7 +462,7 @@ ac_add_options --without-wasm-sandboxed-libraries ac_add_options --enable-official-branding EOF -#%%define njobs 0%{?jobs:%jobs} +#%%define njobs 0%{?jobs:%%jobs} # Weird race condition when building langpacks which comes and goes in OBS/IBS is hitting heavy with TB 128 # so we have to build it sequentially, sadly. %define njobs 1 @@ -617,8 +609,9 @@ exit 0 %{progdir}/thunderbird-bin # crashreporter files %if %crashreporter +%{progdir}/crashhelper %{progdir}/crashreporter -%{progdir}/minidump-analyzer +#%%{progdir}/minidump-analyzer %endif %dir %{progdir}/chrome/ %{progdir}/chrome/icons/ diff --git a/_constraints b/_constraints index 6f6a063..8878174 100644 --- a/_constraints +++ b/_constraints @@ -47,6 +47,16 @@ + + + s390x + + + + 17 + + + x86_64 @@ -57,4 +67,14 @@ + + + riscv64 + + + + 28 + + + diff --git a/l10n-128.9.2esr.tar.xz b/l10n-128.9.2esr.tar.xz deleted file mode 100644 index d48aa60..0000000 --- a/l10n-128.9.2esr.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c51b9bbfb8b29d31b42475bb6db78742f3afdd1c31085621ffea909320e8f23c -size 30352232 diff --git a/l10n-140.1.1esr.tar.xz b/l10n-140.1.1esr.tar.xz new file mode 100644 index 0000000..ddeb27f --- /dev/null +++ b/l10n-140.1.1esr.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d1d482a383d9349a05e261282be243872f2097edb5d45b235651e6180ce65e2 +size 33282056 diff --git a/mozilla-ntlm-full-path.patch b/mozilla-ntlm-full-path.patch index dc8bb4e..778dc3e 100644 --- a/mozilla-ntlm-full-path.patch +++ b/mozilla-ntlm-full-path.patch @@ -1,18 +1,14 @@ -# HG changeset patch -# User Petr Cerny -# Parent 7308e4a7c1f769f4bbbc90870b849cadd99495a6 -# Parent 1c6a565013e4c5f3494f964269783939cd5ed0b8 Bug 634334 - call to the ntlm_auth helper fails -diff --git a/extensions/auth/nsAuthSambaNTLM.cpp b/extensions/auth/nsAuthSambaNTLM.cpp ---- a/extensions/auth/nsAuthSambaNTLM.cpp -+++ b/extensions/auth/nsAuthSambaNTLM.cpp -@@ -160,7 +160,7 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH - const char* username = PR_GetEnv("USER"); - if (!username) return NS_ERROR_FAILURE; +diff -ru thunderbird-140.0.1.old/extensions/auth/nsAuthSambaNTLM.cpp thunderbird-140.0.1/extensions/auth/nsAuthSambaNTLM.cpp +--- thunderbird-140.0.1.old/extensions/auth/nsAuthSambaNTLM.cpp 2025-07-09 19:15:12.000000000 -0500 ++++ thunderbird-140.0.1/extensions/auth/nsAuthSambaNTLM.cpp 2025-07-14 23:33:57.065780950 -0500 +@@ -153,7 +153,7 @@ + options.fds_to_remap.push_back( + std::pair{fromChildPipeWrite.get(), STDOUT_FILENO}); + +- std::vector argvVec{"ntlm_auth", "--helper-protocol", ++ std::vector argvVec{"/usr/bin/ntlm_auth", "--helper-protocol", + "ntlmssp-client-1", "--use-cached-creds", + "--username", username}; -- const char* const args[] = {"ntlm_auth", -+ const char* const args[] = {"/usr/bin/ntlm_auth", - "--helper-protocol", - "ntlmssp-client-1", - "--use-cached-creds", diff --git a/mozilla-silence-no-return-type.patch b/mozilla-silence-no-return-type.patch index 6bbf5d1..06a9357 100644 --- a/mozilla-silence-no-return-type.patch +++ b/mozilla-silence-no-return-type.patch @@ -1,11 +1,15 @@ # HG changeset patch -# Parent af0655f894a27ef60aa8438af7939a5ebc498df0 +# Parent 4fbe42370941f5652d0735686debee5f4b0d6e0e -Index: firefox-128.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/include/codec/SkEncodedOrigin.h -+++ firefox-128.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h -@@ -41,6 +41,7 @@ static inline SkMatrix SkEncodedOriginTo +diff --git a/gfx/skia/skia/include/codec/SkEncodedOrigin.h b/gfx/skia/skia/include/codec/SkEncodedOrigin.h +--- a/gfx/skia/skia/include/codec/SkEncodedOrigin.h ++++ b/gfx/skia/skia/include/codec/SkEncodedOrigin.h +@@ -36,16 +36,17 @@ static inline SkMatrix SkEncodedOriginTo + case kBottomRight_SkEncodedOrigin: return SkMatrix::MakeAll(-1, 0, w, 0, -1, h, 0, 0, 1); + case kBottomLeft_SkEncodedOrigin: return SkMatrix::MakeAll( 1, 0, 0, 0, -1, h, 0, 0, 1); + case kLeftTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, 1, 0, 1, 0, 0, 0, 0, 1); + case kRightTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w, 1, 0, 0, 0, 0, 1); + case kRightBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w, -1, 0, h, 0, 0, 1); case kLeftBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, 1, 0, -1, 0, h, 0, 0, 1); } SK_ABORT("Unexpected origin"); @@ -13,11 +17,20 @@ Index: firefox-128.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h } /** -Index: firefox-128.0/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h -+++ firefox-128.0/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h -@@ -301,6 +301,7 @@ static inline bool GrTextureTypeHasRestr + * Return true if the encoded origin includes a 90 degree rotation, in which case the width + * and height of the source data are swapped relative to a correctly oriented destination. + */ + static inline bool SkEncodedOriginSwapsWidthHeight(SkEncodedOrigin origin) { + return origin >= kLeftTop_SkEncodedOrigin; +diff --git a/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h b/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h +--- a/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h ++++ b/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h +@@ -296,16 +296,17 @@ static inline bool GrTextureTypeHasRestr + return false; + case GrTextureType::kRectangle: + return true; + case GrTextureType::kExternal: + return true; default: SK_ABORT("Unexpected texture type"); } @@ -25,11 +38,20 @@ Index: firefox-128.0/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h } ////////////////////////////////////////////////////////////////////////////// -Index: firefox-128.0/gfx/skia/skia/src/core/SkDescriptor.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/core/SkDescriptor.cpp -+++ firefox-128.0/gfx/skia/skia/src/core/SkDescriptor.cpp -@@ -26,6 +26,7 @@ std::unique_ptr SkDescript + + /** + * Types used to describe format of vertices in arrays. + */ + enum GrVertexAttribType { +diff --git a/gfx/skia/skia/src/core/SkDescriptor.cpp b/gfx/skia/skia/src/core/SkDescriptor.cpp +--- a/gfx/skia/skia/src/core/SkDescriptor.cpp ++++ b/gfx/skia/skia/src/core/SkDescriptor.cpp +@@ -21,16 +21,17 @@ std::unique_ptr SkDescript + SkASSERT(length >= sizeof(SkDescriptor) && SkAlign4(length) == length); + void* allocation = ::operator new(length); + return std::unique_ptr(new (allocation) SkDescriptor{}); + } + void SkDescriptor::operator delete(void* p) { ::operator delete(p); } void* SkDescriptor::operator new(size_t) { SK_ABORT("Descriptors are created with placement new."); @@ -37,11 +59,20 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkDescriptor.cpp } void SkDescriptor::flatten(SkWriteBuffer& buffer) const { -Index: firefox-128.0/gfx/skia/skia/src/core/SkGeometry.h -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/core/SkGeometry.h -+++ firefox-128.0/gfx/skia/skia/src/core/SkGeometry.h -@@ -281,6 +281,7 @@ static inline bool SkCubicIsDegenerate(S + buffer.writePad32(static_cast(this), this->fLength); + } + + void* SkDescriptor::addEntry(uint32_t tag, size_t length, const void* data) { + SkASSERT(tag); +diff --git a/gfx/skia/skia/src/core/SkGeometry.h b/gfx/skia/skia/src/core/SkGeometry.h +--- a/gfx/skia/skia/src/core/SkGeometry.h ++++ b/gfx/skia/skia/src/core/SkGeometry.h +@@ -277,28 +277,30 @@ static inline bool SkCubicIsDegenerate(S + case SkCubicType::kLocalCusp: + case SkCubicType::kCuspAtInfinity: + return false; + case SkCubicType::kQuadratic: + case SkCubicType::kLineOrPoint: return true; } SK_ABORT("Invalid SkCubicType"); @@ -49,7 +80,12 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkGeometry.h } static inline const char* SkCubicTypeName(SkCubicType type) { -@@ -293,6 +294,7 @@ static inline const char* SkCubicTypeNam + switch (type) { + case SkCubicType::kSerpentine: return "kSerpentine"; + case SkCubicType::kLoop: return "kLoop"; + case SkCubicType::kLocalCusp: return "kLocalCusp"; + case SkCubicType::kCuspAtInfinity: return "kCuspAtInfinity"; + case SkCubicType::kQuadratic: return "kQuadratic"; case SkCubicType::kLineOrPoint: return "kLineOrPoint"; } SK_ABORT("Invalid SkCubicType"); @@ -57,11 +93,20 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkGeometry.h } /** Returns the cubic classification. -Index: firefox-128.0/gfx/skia/skia/src/core/SkTextBlob.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/core/SkTextBlob.cpp -+++ firefox-128.0/gfx/skia/skia/src/core/SkTextBlob.cpp -@@ -213,6 +213,7 @@ void SkTextBlob::operator delete(void* p + + t[],s[] are set to the two homogeneous parameter values at which points the lines L & M + intersect with K, sorted from smallest to largest and oriented so positive values of the + implicit are on the "left" side. For a serpentine curve they are the inflection points. For a + loop they are the double point. For a local cusp, they are both equal and denote the cusp point. +diff --git a/gfx/skia/skia/src/core/SkTextBlob.cpp b/gfx/skia/skia/src/core/SkTextBlob.cpp +--- a/gfx/skia/skia/src/core/SkTextBlob.cpp ++++ b/gfx/skia/skia/src/core/SkTextBlob.cpp +@@ -208,16 +208,17 @@ unsigned SkTextBlob::ScalarsPerGlyph(Gly + } + + void SkTextBlob::operator delete(void* p) { + sk_free(p); + } void* SkTextBlob::operator new(size_t) { SK_ABORT("All blobs are created by placement new."); @@ -69,11 +114,20 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTextBlob.cpp } void* SkTextBlob::operator new(size_t, void* p) { -Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/core/SkTypeface_remote.h -+++ firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h -@@ -108,12 +108,14 @@ public: + return p; + } + + SkTextBlobRunIterator::SkTextBlobRunIterator(const SkTextBlob* blob) + : fCurrentRun(SkTextBlob::RunRecord::First(blob)) { +diff --git a/gfx/skia/skia/src/core/SkTypeface_remote.h b/gfx/skia/skia/src/core/SkTypeface_remote.h +--- a/gfx/skia/skia/src/core/SkTypeface_remote.h ++++ b/gfx/skia/skia/src/core/SkTypeface_remote.h +@@ -103,83 +103,97 @@ public: + + SkTypefaceID remoteTypefaceID() const {return fTypefaceID;} + + int glyphCount() const {return fGlyphCount;} + bool isLogging() const {return fIsLogging;} protected: @@ -89,7 +143,7 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h } bool onGlyphMaskNeedsCurrentColor() const override { return fGlyphMaskNeedsCurrentColor; -@@ -121,10 +123,12 @@ protected: + } int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override { SK_ABORT("Should never be called."); @@ -102,7 +156,7 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h } void onGetFamilyName(SkString* familyName) const override { // Used by SkStrikeCache::DumpMemoryStatistics. -@@ -132,15 +136,19 @@ protected: + *familyName = ""; } bool onGetPostScriptName(SkString*) const override { SK_ABORT("Should never be called."); @@ -122,7 +176,13 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h } std::unique_ptr onCreateScalerContext( const SkScalerContextEffects& effects, const SkDescriptor* desc) const override -@@ -154,20 +162,25 @@ protected: + { + return std::make_unique( + *const_cast(this), effects, desc, fDiscardableManager); + } + void onFilterRec(SkScalerContextRec* rec) const override { + // The rec filtering is already applied by the server when generating + // the glyphs. } void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { SK_ABORT("Should never be called."); @@ -148,7 +208,7 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h } int onCountGlyphs() const override { return this->glyphCount(); -@@ -175,6 +188,7 @@ protected: + } void* onGetCTFontRef() const override { SK_ABORT("Should never be called."); @@ -156,35 +216,20 @@ Index: firefox-128.0/gfx/skia/skia/src/core/SkTypeface_remote.h } private: -Index: firefox-128.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp -+++ firefox-128.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp -@@ -799,6 +799,7 @@ sk_sp cpu_blur(const ski - return maker; - } - SK_ABORT("Sigma is out of range."); -+ SkUNREACHABLE; - }; - - PassMaker* makerX = makeMaker(sigma.width()); -Index: firefox-128.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp -+++ firefox-128.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp -@@ -69,6 +69,7 @@ void SkFontMgr_Indirect::onGetFamilyName - - sk_sp SkFontMgr_Indirect::onCreateStyleSet(int index) const { - SK_ABORT("Not implemented"); -+ SkUNREACHABLE; - } - - sk_sp SkFontMgr_Indirect::onMatchFamily(const char familyName[]) const { -Index: firefox-128.0/gfx/skia/skia/src/sksl/SkSLOperator.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/sksl/SkSLOperator.cpp -+++ firefox-128.0/gfx/skia/skia/src/sksl/SkSLOperator.cpp -@@ -51,7 +51,7 @@ OperatorPrecedence Operator::getBinaryPr + const SkTypefaceID fTypefaceID; + const int fGlyphCount; + const bool fIsLogging; + const bool fGlyphMaskNeedsCurrentColor; + sk_sp fDiscardableManager; +diff --git a/gfx/skia/skia/src/sksl/SkSLOperator.cpp b/gfx/skia/skia/src/sksl/SkSLOperator.cpp +--- a/gfx/skia/skia/src/sksl/SkSLOperator.cpp ++++ b/gfx/skia/skia/src/sksl/SkSLOperator.cpp +@@ -46,17 +46,17 @@ OperatorPrecedence Operator::getBinaryPr + case Kind::SLASHEQ: // fall through + case Kind::PERCENTEQ: // fall through + case Kind::SHLEQ: // fall through + case Kind::SHREQ: // fall through + case Kind::BITWISEANDEQ: // fall through case Kind::BITWISEXOREQ: // fall through case Kind::BITWISEOREQ: return OperatorPrecedence::kAssignment; case Kind::COMMA: return OperatorPrecedence::kSequence; @@ -193,11 +238,20 @@ Index: firefox-128.0/gfx/skia/skia/src/sksl/SkSLOperator.cpp } } -Index: firefox-128.0/gfx/skia/skia/src/sksl/ir/SkSLType.h -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/sksl/ir/SkSLType.h -+++ firefox-128.0/gfx/skia/skia/src/sksl/ir/SkSLType.h -@@ -468,6 +468,7 @@ public: + const char* Operator::operatorName() const { + switch (this->kind()) { + case Kind::PLUS: return " + "; + case Kind::MINUS: return " - "; + case Kind::STAR: return " * "; +diff --git a/gfx/skia/skia/src/sksl/ir/SkSLType.h b/gfx/skia/skia/src/sksl/ir/SkSLType.h +--- a/gfx/skia/skia/src/sksl/ir/SkSLType.h ++++ b/gfx/skia/skia/src/sksl/ir/SkSLType.h +@@ -463,16 +463,17 @@ public: + * always match `componentType()`. + */ + virtual const Type& slotType(size_t) const { + return *this; + } virtual SkSpan fields() const { SK_ABORT("Internal error: not a struct"); @@ -205,11 +259,20 @@ Index: firefox-128.0/gfx/skia/skia/src/sksl/ir/SkSLType.h } /** -Index: firefox-128.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp -=================================================================== ---- firefox-128.0.orig/gfx/skia/skia/src/utils/SkShadowUtils.cpp -+++ firefox-128.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp -@@ -140,6 +140,7 @@ struct SpotVerticesFactory { + * For generic types, returns the types that this generic type can substitute for. + */ + virtual SkSpan coercibleTypes() const { + SkDEBUGFAIL("Internal error: not a generic type"); + return {}; +diff --git a/gfx/skia/skia/src/utils/SkShadowUtils.cpp b/gfx/skia/skia/src/utils/SkShadowUtils.cpp +--- a/gfx/skia/skia/src/utils/SkShadowUtils.cpp ++++ b/gfx/skia/skia/src/utils/SkShadowUtils.cpp +@@ -137,16 +137,17 @@ struct SpotVerticesFactory { + } + return false; + case OccluderType::kDirectional: + case OccluderType::kDirectionalTransparent: + *translate = that.fOffset - fOffset; return true; } SK_ABORT("Uninitialized occluder type?"); @@ -217,31 +280,53 @@ Index: firefox-128.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp } sk_sp makeVertices(const SkPath& path, const SkMatrix& ctm, -Index: firefox-128.0/intl/icu/source/i18n/number_rounding.cpp -=================================================================== ---- firefox-128.0.orig/intl/icu/source/i18n/number_rounding.cpp -+++ firefox-128.0/intl/icu/source/i18n/number_rounding.cpp -@@ -287,6 +287,7 @@ FractionPrecision Precision::constructFr + SkVector* translate) const { + bool transparent = fOccluderType == OccluderType::kPointTransparent || + fOccluderType == OccluderType::kDirectionalTransparent; + bool directional = fOccluderType == OccluderType::kDirectional || + fOccluderType == OccluderType::kDirectionalTransparent; +diff --git a/intl/icu/source/i18n/number_rounding.cpp b/intl/icu/source/i18n/number_rounding.cpp +--- a/intl/icu/source/i18n/number_rounding.cpp ++++ b/intl/icu/source/i18n/number_rounding.cpp +@@ -282,27 +282,29 @@ Precision IncrementPrecision::withMinFra + } + + FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) { + FractionSignificantSettings settings{}; + settings.fMinFrac = static_cast(minFrac); settings.fMaxFrac = static_cast(maxFrac); settings.fMinSig = -1; settings.fMaxSig = -1; + settings.fPriority = UNUM_ROUNDING_PRIORITY_RELAXED; - PrecisionUnion union_; + PrecisionUnion union_{}; union_.fracSig = settings; return {RND_FRACTION, union_}; -@@ -298,6 +299,7 @@ Precision Precision::constructSignifican + } + + Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) { + FractionSignificantSettings settings{}; + settings.fMinFrac = -1; settings.fMaxFrac = -1; settings.fMinSig = static_cast(minSig); settings.fMaxSig = static_cast(maxSig); + settings.fPriority = UNUM_ROUNDING_PRIORITY_RELAXED; - PrecisionUnion union_; + PrecisionUnion union_{}; union_.fracSig = settings; return {RND_SIGNIFICANT, union_}; -Index: firefox-128.0/js/src/irregexp/imported/regexp-parser.cc -=================================================================== ---- firefox-128.0.orig/js/src/irregexp/imported/regexp-parser.cc -+++ firefox-128.0/js/src/irregexp/imported/regexp-parser.cc -@@ -2781,6 +2781,7 @@ bool MayContainStrings(ClassSetOperandTy + } + + Precision + Precision::constructFractionSignificant( + const FractionPrecision &base, +diff --git a/js/src/irregexp/imported/regexp-parser.cc b/js/src/irregexp/imported/regexp-parser.cc +--- a/js/src/irregexp/imported/regexp-parser.cc ++++ b/js/src/irregexp/imported/regexp-parser.cc +@@ -2785,16 +2785,17 @@ bool MayContainStrings(ClassSetOperandTy + return false; + case ClassSetOperandType::kCharacterClassEscape: + case ClassSetOperandType::kClassStringDisjunction: + return operand->AsClassSetOperand()->has_strings(); + case ClassSetOperandType::kNestedClass: if (operand->IsClassRanges()) return false; return operand->AsClassSetExpression()->may_contain_strings(); } @@ -249,11 +334,20 @@ Index: firefox-128.0/js/src/irregexp/imported/regexp-parser.cc } } // namespace -Index: firefox-128.0/third_party/libwebrtc/api/adaptation/resource.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/api/adaptation/resource.cc -+++ firefox-128.0/third_party/libwebrtc/api/adaptation/resource.cc -@@ -22,6 +22,7 @@ const char* ResourceUsageStateToString(R + + template + void RegExpParserImpl::AddMaybeSimpleCaseFoldedRange( + ZoneList* ranges, CharacterRange new_range) { + DCHECK(unicode_sets()); +diff --git a/third_party/libwebrtc/api/adaptation/resource.cc b/third_party/libwebrtc/api/adaptation/resource.cc +--- a/third_party/libwebrtc/api/adaptation/resource.cc ++++ b/third_party/libwebrtc/api/adaptation/resource.cc +@@ -17,16 +17,17 @@ namespace webrtc { + const char* ResourceUsageStateToString(ResourceUsageState usage_state) { + switch (usage_state) { + case ResourceUsageState::kOveruse: + return "kOveruse"; + case ResourceUsageState::kUnderuse: return "kUnderuse"; } RTC_CHECK_NOTREACHED(); @@ -261,11 +355,20 @@ Index: firefox-128.0/third_party/libwebrtc/api/adaptation/resource.cc } ResourceListener::~ResourceListener() {} -Index: firefox-128.0/third_party/libwebrtc/api/rtp_parameters.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/api/rtp_parameters.cc -+++ firefox-128.0/third_party/libwebrtc/api/rtp_parameters.cc -@@ -33,6 +33,7 @@ const char* DegradationPreferenceToStrin + + Resource::Resource() {} + + Resource::~Resource() {} + +diff --git a/third_party/libwebrtc/api/rtp_parameters.cc b/third_party/libwebrtc/api/rtp_parameters.cc +--- a/third_party/libwebrtc/api/rtp_parameters.cc ++++ b/third_party/libwebrtc/api/rtp_parameters.cc +@@ -32,16 +32,17 @@ const char* DegradationPreferenceToStrin + case DegradationPreference::MAINTAIN_FRAMERATE: + return "maintain-framerate"; + case DegradationPreference::MAINTAIN_RESOLUTION: + return "maintain-resolution"; + case DegradationPreference::BALANCED: return "balanced"; } RTC_CHECK_NOTREACHED(); @@ -273,11 +376,20 @@ Index: firefox-128.0/third_party/libwebrtc/api/rtp_parameters.cc } const double kDefaultBitratePriority = 1.0; -Index: firefox-128.0/third_party/libwebrtc/api/video/video_frame_buffer.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/api/video/video_frame_buffer.cc -+++ firefox-128.0/third_party/libwebrtc/api/video/video_frame_buffer.cc -@@ -106,6 +106,8 @@ const char* VideoFrameBufferTypeToString + + RtcpFeedback::RtcpFeedback() = default; + RtcpFeedback::RtcpFeedback(RtcpFeedbackType type) : type(type) {} + RtcpFeedback::RtcpFeedback(RtcpFeedbackType type, + RtcpFeedbackMessageType message_type) +diff --git a/third_party/libwebrtc/api/video/video_frame_buffer.cc b/third_party/libwebrtc/api/video/video_frame_buffer.cc +--- a/third_party/libwebrtc/api/video/video_frame_buffer.cc ++++ b/third_party/libwebrtc/api/video/video_frame_buffer.cc +@@ -109,16 +109,18 @@ const char* VideoFrameBufferTypeToString + return "kI210"; + case VideoFrameBuffer::Type::kI410: + return "kI410"; + case VideoFrameBuffer::Type::kNV12: + return "kNV12"; default: RTC_DCHECK_NOTREACHED(); } @@ -286,11 +398,20 @@ Index: firefox-128.0/third_party/libwebrtc/api/video/video_frame_buffer.cc } int I420BufferInterface::ChromaWidth() const { -Index: firefox-128.0/third_party/libwebrtc/api/video_codecs/video_codec.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/api/video_codecs/video_codec.cc -+++ firefox-128.0/third_party/libwebrtc/api/video_codecs/video_codec.cc -@@ -162,6 +162,7 @@ const char* CodecTypeToPayloadString(Vid + return (width() + 1) / 2; + } + + int I420BufferInterface::ChromaHeight() const { + return (height() + 1) / 2; +diff --git a/third_party/libwebrtc/api/video_codecs/video_codec.cc b/third_party/libwebrtc/api/video_codecs/video_codec.cc +--- a/third_party/libwebrtc/api/video_codecs/video_codec.cc ++++ b/third_party/libwebrtc/api/video_codecs/video_codec.cc +@@ -161,16 +161,17 @@ const char* CodecTypeToPayloadString(Vid + case kVideoCodecH264: + return kPayloadNameH264; + case kVideoCodecGeneric: + return kPayloadNameGeneric; + case kVideoCodecH265: return kPayloadNameH265; } RTC_CHECK_NOTREACHED(); @@ -298,11 +419,20 @@ Index: firefox-128.0/third_party/libwebrtc/api/video_codecs/video_codec.cc } VideoCodecType PayloadStringToCodecType(const std::string& name) { -Index: firefox-128.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc -+++ firefox-128.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc -@@ -189,6 +189,7 @@ class VideoEncoderSoftwareFallbackWrappe + if (absl::EqualsIgnoreCase(name, kPayloadNameVp8)) + return kVideoCodecVP8; + if (absl::EqualsIgnoreCase(name, kPayloadNameVp9)) + return kVideoCodecVP9; + if (absl::EqualsIgnoreCase(name, kPayloadNameAv1) || +diff --git a/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc b/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc +--- a/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc ++++ b/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc +@@ -189,16 +189,17 @@ class VideoEncoderSoftwareFallbackWrappe + [[fallthrough]]; + case EncoderState::kMainEncoderUsed: + return encoder_.get(); + case EncoderState::kFallbackDueToFailure: + case EncoderState::kForcedFallback: return fallback_encoder_.get(); } RTC_CHECK_NOTREACHED(); @@ -310,7 +440,17 @@ Index: firefox-128.0/third_party/libwebrtc/api/video_codecs/video_encoder_softwa } // Updates encoder with last observed parameters, such as callbacks, rates, -@@ -382,6 +383,7 @@ int32_t VideoEncoderSoftwareFallbackWrap + // etc. + void PrimeEncoder(VideoEncoder* encoder) const; + + // Settings used in the last InitEncode call and used if a dynamic fallback to + // software is required. +@@ -387,16 +388,17 @@ int32_t VideoEncoderSoftwareFallbackWrap + case EncoderState::kMainEncoderUsed: { + return EncodeWithMainEncoder(frame, frame_types); + } + case EncoderState::kFallbackDueToFailure: + case EncoderState::kForcedFallback: return fallback_encoder_->Encode(frame, frame_types); } RTC_CHECK_NOTREACHED(); @@ -318,11 +458,20 @@ Index: firefox-128.0/third_party/libwebrtc/api/video_codecs/video_encoder_softwa } int32_t VideoEncoderSoftwareFallbackWrapper::EncodeWithMainEncoder( -Index: firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc -+++ firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc -@@ -169,6 +169,7 @@ const char* Adaptation::StatusToString(A + const VideoFrame& frame, + const std::vector* frame_types) { + int32_t ret = encoder_->Encode(frame, frame_types); + // If requested, try a software fallback. + bool fallback_requested = (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE); +diff --git a/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc b/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc +--- a/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc ++++ b/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc +@@ -163,16 +163,17 @@ const char* Adaptation::StatusToString(A + case Status::kInsufficientInput: + return "kInsufficientInput"; + case Status::kAdaptationDisabled: + return "kAdaptationDisabled"; + case Status::kRejectedByConstraint: return "kRejectedByConstraint"; } RTC_CHECK_NOTREACHED(); @@ -330,7 +479,17 @@ Index: firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter. } Adaptation::Adaptation(int validation_id, -@@ -391,6 +392,7 @@ VideoStreamAdapter::RestrictionsOrState + VideoSourceRestrictions restrictions, + VideoAdaptationCounters counters, + VideoStreamInputState input_state) + : validation_id_(validation_id), + status_(Status::kValid), +@@ -385,16 +386,17 @@ VideoStreamAdapter::RestrictionsOrState + case DegradationPreference::MAINTAIN_RESOLUTION: { + // Scale up framerate. + return IncreaseFramerate(input_state, current_restrictions_); + } + case DegradationPreference::DISABLED: return Adaptation::Status::kAdaptationDisabled; } RTC_CHECK_NOTREACHED(); @@ -338,7 +497,17 @@ Index: firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter. } Adaptation VideoStreamAdapter::GetAdaptationDown() { -@@ -473,6 +475,7 @@ VideoStreamAdapter::GetAdaptationDownSte + RTC_DCHECK_RUN_ON(&sequence_checker_); + VideoStreamInputState input_state = input_state_provider_->InputState(); + ++adaptation_validation_id_; + RestrictionsOrState restrictions_or_state = + GetAdaptationDownStep(input_state, current_restrictions_); +@@ -467,16 +469,17 @@ VideoStreamAdapter::GetAdaptationDownSte + } + case DegradationPreference::MAINTAIN_RESOLUTION: { + return DecreaseFramerate(input_state, current_restrictions); + } + case DegradationPreference::DISABLED: return Adaptation::Status::kAdaptationDisabled; } RTC_CHECK_NOTREACHED(); @@ -346,7 +515,17 @@ Index: firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter. } VideoStreamAdapter::RestrictionsOrState VideoStreamAdapter::DecreaseResolution( -@@ -626,6 +629,8 @@ Adaptation VideoStreamAdapter::GetAdaptD + const VideoStreamInputState& input_state, + const RestrictionsWithCounters& current_restrictions) { + int target_pixels = + GetLowerResolutionThan(input_state.frame_size_pixels().value()); + // Use single active stream if set, this stream could be lower than the input. +@@ -620,16 +623,18 @@ Adaptation VideoStreamAdapter::GetAdaptD + case DegradationPreference::MAINTAIN_FRAMERATE: + return GetAdaptationDown(); + case DegradationPreference::BALANCED: { + return RestrictionsOrStateToAdaptation( + GetAdaptDownResolutionStepForBalanced(input_state), input_state); } } RTC_CHECK_NOTREACHED(); @@ -355,24 +534,43 @@ Index: firefox-128.0/third_party/libwebrtc/call/adaptation/video_stream_adapter. } VideoStreamAdapter::RestrictionsOrState -Index: firefox-128.0/third_party/libwebrtc/call/rtp_payload_params.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/call/rtp_payload_params.cc -+++ firefox-128.0/third_party/libwebrtc/call/rtp_payload_params.cc -@@ -406,7 +406,7 @@ absl::optional + VideoStreamAdapter::GetAdaptDownResolutionStepForBalanced( + const VideoStreamInputState& input_state) const { + // Adapt twice if the first adaptation did not decrease resolution. + auto first_step = GetAdaptationDownStep(input_state, current_restrictions_); + if (!absl::holds_alternative(first_step)) { +diff --git a/third_party/libwebrtc/call/rtp_payload_params.cc b/third_party/libwebrtc/call/rtp_payload_params.cc +--- a/third_party/libwebrtc/call/rtp_payload_params.cc ++++ b/third_party/libwebrtc/call/rtp_payload_params.cc +@@ -426,17 +426,18 @@ std::optional + case VideoCodecType::kVideoCodecH264: + return MinimalisticStructure( + /*num_spatial_layers=*/1, + /*num_temporal_layers=*/kMaxTemporalStreams); + case VideoCodecType::kVideoCodecAV1: case VideoCodecType::kVideoCodecH265: - return absl::nullopt; + return std::nullopt; } - RTC_DCHECK_NOTREACHED() << "Unsupported codec."; ++ //RTC_DCHECK_NOTREACHED() << "Unsupported codec."; + RTC_CHECK_NOTREACHED(); } - void RtpPayloadParams::GenericToGeneric(int64_t shared_frame_id, -Index: firefox-128.0/third_party/libwebrtc/call/video_send_stream.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/call/video_send_stream.cc -+++ firefox-128.0/third_party/libwebrtc/call/video_send_stream.cc -@@ -30,6 +30,7 @@ const char* StreamTypeToString(VideoSend + void RtpPayloadParams::GenericToGeneric(int64_t frame_id, + bool is_keyframe, + RTPVideoHeader* rtp_video_header) { + RTPVideoHeader::GenericDescriptorInfo& generic = + rtp_video_header->generic.emplace(); + +diff --git a/third_party/libwebrtc/call/video_send_stream.cc b/third_party/libwebrtc/call/video_send_stream.cc +--- a/third_party/libwebrtc/call/video_send_stream.cc ++++ b/third_party/libwebrtc/call/video_send_stream.cc +@@ -29,16 +29,17 @@ const char* StreamTypeToString(VideoSend + case VideoSendStream::StreamStats::StreamType::kMedia: + return "media"; + case VideoSendStream::StreamStats::StreamType::kRtx: + return "rtx"; + case VideoSendStream::StreamStats::StreamType::kFlexfec: return "flexfec"; } RTC_CHECK_NOTREACHED(); @@ -380,23 +578,41 @@ Index: firefox-128.0/third_party/libwebrtc/call/video_send_stream.cc } } // namespace -Index: firefox-128.0/third_party/libwebrtc/media/base/codec.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/media/base/codec.cc -+++ firefox-128.0/third_party/libwebrtc/media/base/codec.cc -@@ -262,6 +262,7 @@ bool Codec::Matches(const Codec& codec) - case Type::kVideo: - return IsSameCodecSpecific(name, params, codec.name, codec.params); + + VideoSendStream::StreamStats::StreamStats() = default; + VideoSendStream::StreamStats::~StreamStats() = default; + + std::string VideoSendStream::StreamStats::ToString() const { +diff --git a/third_party/libwebrtc/media/base/codec_comparators.cc b/third_party/libwebrtc/media/base/codec_comparators.cc +--- a/third_party/libwebrtc/media/base/codec_comparators.cc ++++ b/third_party/libwebrtc/media/base/codec_comparators.cc +@@ -334,16 +334,17 @@ bool MatchesWithCodecRules(const Codec& + left_codec.bitrate == right_codec.bitrate) && + ((right_codec.channels < 2 && left_codec.channels < 2) || + left_codec.channels == right_codec.channels); + + case Codec::Type::kVideo: + return IsSameCodecSpecific(left_codec.name, left_codec.params, + right_codec.name, right_codec.params); } -+ return false; // unreached ++ return false; }; return matches_id && matches_type_specific(); -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc -@@ -378,7 +378,7 @@ std::unique_ptr Creat + } + + bool MatchesWithReferenceAttributes(const Codec& codec1, const Codec& codec2) { + return MatchesWithReferenceAttributesAndComparator( + codec1, codec2, [](int a, int b) { return a == b; }); +diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc +--- a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc ++++ b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc +@@ -373,12 +373,12 @@ std::unique_ptr Creat + config.reference_window_delay, config.clipping_threshold, + /*adaptive_step_estimation=*/true); + case ClippingPredictorMode::kFixedStepClippingPeakPrediction: + return std::make_unique( + num_channels, config.window_length, config.reference_window_length, config.reference_window_delay, config.clipping_threshold, /*adaptive_step_estimation=*/false); } @@ -405,11 +621,15 @@ Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/clippin } } // namespace webrtc -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc -@@ -48,6 +48,7 @@ constexpr absl::string_view MetricNamePr +diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc b/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc +--- a/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc ++++ b/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc +@@ -43,16 +43,17 @@ int ComputeAverageUpdate(int sum_updates + constexpr absl::string_view MetricNamePrefix( + InputVolumeType input_volume_type) { + switch (input_volume_type) { + case InputVolumeType::kApplied: + return "WebRTC.Audio.Apm.AppliedInputVolume."; case InputVolumeType::kRecommended: return "WebRTC.Audio.Apm.RecommendedInputVolume."; } @@ -417,11 +637,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/input_v } metrics::Histogram* CreateVolumeHistogram(InputVolumeType input_volume_type) { -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc -@@ -60,6 +60,8 @@ rtc::FunctionView GetActiv + char buffer[64]; + SimpleStringBuilder builder(buffer); + builder << MetricNamePrefix(input_volume_type) << "OnChange"; + return metrics::HistogramFactoryGetCountsLinear(/*name=*/builder.str(), + /*min=*/1, +diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc +--- a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc ++++ b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc +@@ -55,16 +55,18 @@ std::vector PreprocessWeights(rtc + rtc::FunctionView GetActivationFunction( + ActivationFunction activation_function) { + switch (activation_function) { + case ActivationFunction::kTansigApproximated: + return ::rnnoise::TansigApproximated; case ActivationFunction::kSigmoidApproximated: return ::rnnoise::SigmoidApproximated; } @@ -430,19 +659,38 @@ Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad } } // namespace -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc -@@ -101,6 +101,7 @@ GainControl::Mode Agc1ConfigModeToInterf + + FullyConnectedLayer::FullyConnectedLayer( + const int input_size, + const int output_size, + const rtc::ArrayView bias, +diff --git a/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc b/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc +--- a/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc ++++ b/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc +@@ -94,16 +94,17 @@ GainControl::Mode Agc1ConfigModeToInterf + case Agc1Config::kAdaptiveAnalog: + return GainControl::kAdaptiveAnalog; + case Agc1Config::kAdaptiveDigital: + return GainControl::kAdaptiveDigital; + case Agc1Config::kFixedDigital: return GainControl::kFixedDigital; } RTC_CHECK_NOTREACHED(); + return GainControl::kAdaptiveAnalog; } - bool MinimizeProcessingForUnusedOutput() { -@@ -168,7 +169,7 @@ int AudioFormatValidityToErrorCode(Audio + bool MinimizeProcessingForUnusedOutput(const FieldTrialsView& field_trials) { + return !field_trials.IsEnabled("WebRTC-MutedStateKillSwitch"); + } + + // Maximum lengths that frame of samples being passed from the render side to + // the capture side can have (does not apply to AEC3). +@@ -161,17 +162,17 @@ int AudioFormatValidityToErrorCode(Audio + case AudioFormatValidity::kValidAndSupported: + return AudioProcessing::kNoError; + case AudioFormatValidity::kValidButUnsupportedSampleRate: // fall-through + case AudioFormatValidity::kInvalidSampleRate: + return AudioProcessing::kBadSampleRateError; case AudioFormatValidity::kInvalidChannelCount: return AudioProcessing::kBadNumberChannelsError; } @@ -451,7 +699,17 @@ Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/audio_proces } // Returns an AudioProcessing::Error together with the best possible option for -@@ -2425,6 +2426,7 @@ void AudioProcessingImpl::InitializeNois + // output audio content. + std::pair ChooseErrorOutputOption( + const StreamConfig& input_config, + const StreamConfig& output_config) { + AudioFormatValidity input_validity = ValidateAudioFormat(input_config); +@@ -2062,16 +2063,17 @@ void AudioProcessingImpl::InitializeNois + case NoiseSuppresionConfig::kModerate: + return NsConfig::SuppressionLevel::k12dB; + case NoiseSuppresionConfig::kHigh: + return NsConfig::SuppressionLevel::k18dB; + case NoiseSuppresionConfig::kVeryHigh: return NsConfig::SuppressionLevel::k21dB; } RTC_CHECK_NOTREACHED(); @@ -459,43 +717,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/audio_proces }; NsConfig cfg; -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc -@@ -32,6 +32,7 @@ std::string NoiseSuppressionLevelToStrin - return "VeryHigh"; + cfg.target_level = map_level(config_.noise_suppression.level); + submodules_.noise_suppressor = std::make_unique( + cfg, proc_sample_rate_hz(), num_proc_channels()); } - RTC_CHECK_NOTREACHED(); -+ return ""; } - - std::string GainController1ModeToString(const Agc1Config::Mode& mode) { -@@ -44,6 +45,7 @@ std::string GainController1ModeToString( - return "FixedDigital"; - } - RTC_CHECK_NOTREACHED(); -+ return ""; - } - - } // namespace -Index: firefox-128.0/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc -+++ firefox-128.0/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc -@@ -53,6 +53,7 @@ std::string GetVadModeLabel(TransientSup - case TransientSuppressor::VadMode::kNoVad: - return "no VAD"; - } -+ RTC_CHECK_NOTREACHED(); - } - - } // namespace -Index: firefox-128.0/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc -+++ firefox-128.0/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc -@@ -95,6 +95,8 @@ BandwidthLimitedCause GetBandwidthLimite +diff --git a/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc b/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc +--- a/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc ++++ b/third_party/libwebrtc/modules/congestion_controller/goog_cc/goog_cc_network_control.cc +@@ -81,16 +81,18 @@ BandwidthLimitedCause GetBandwidthLimite + // Probes may not be sent in this state. + return BandwidthLimitedCause::kLossLimitedBwe; + case LossBasedState::kIncreasing: + // Probes may be sent in this state. + return BandwidthLimitedCause::kLossLimitedBweIncreasing; case LossBasedState::kDelayBasedEstimate: return BandwidthLimitedCause::kDelayBasedLimited; } @@ -504,11 +739,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/congestion_controller/goog_cc } } // namespace -Index: firefox-128.0/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc -+++ firefox-128.0/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc -@@ -44,6 +44,7 @@ ScreenCastPortal::CaptureSourceType Scre + + GoogCcNetworkController::GoogCcNetworkController(NetworkControllerConfig config, + GoogCcConfig goog_cc_config) + : env_(config.env), + packet_feedback_only_(goog_cc_config.feedback_only), +diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc +--- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc ++++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc +@@ -39,16 +39,17 @@ ScreenCastPortal::CaptureSourceType Scre + switch (type) { + case CaptureType::kScreen: + return ScreenCastPortal::CaptureSourceType::kScreen; + case CaptureType::kWindow: + return ScreenCastPortal::CaptureSourceType::kWindow; case CaptureType::kAnyScreenContent: return ScreenCastPortal::CaptureSourceType::kAnyScreenContent; } @@ -516,11 +760,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/desktop_capture/linux/wayland } ScreenCastPortal::ScreenCastPortal(CaptureType type, PortalNotifier* notifier) -Index: firefox-128.0/third_party/libwebrtc/modules/pacing/bitrate_prober.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/pacing/bitrate_prober.cc -+++ firefox-128.0/third_party/libwebrtc/modules/pacing/bitrate_prober.cc -@@ -84,6 +84,7 @@ bool BitrateProber::ReadyToSetActiveStat + : ScreenCastPortal(type, + notifier, + OnProxyRequested, + OnSourcesRequestResponseSignal, + this) {} +diff --git a/third_party/libwebrtc/modules/pacing/bitrate_prober.cc b/third_party/libwebrtc/modules/pacing/bitrate_prober.cc +--- a/third_party/libwebrtc/modules/pacing/bitrate_prober.cc ++++ b/third_party/libwebrtc/modules/pacing/bitrate_prober.cc +@@ -86,16 +86,17 @@ bool BitrateProber::ReadyToSetActiveStat + return true; + } + // If config_.min_packet_size > 0, a "large enough" packet must be + // sent first, before a probe can be generated and sent. Otherwise, + // send the probe asap. return packet_size >= std::min(RecommendedMinProbeSize(), config_.min_packet_size.Get()); } @@ -528,11 +781,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/pacing/bitrate_prober.cc } void BitrateProber::OnIncomingPacket(DataSize packet_size) { -Index: firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc -+++ firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc -@@ -46,6 +46,7 @@ std::unique_ptr Cr + MaybeSetActiveState(packet_size); + } + + void BitrateProber::CreateProbeCluster( + const ProbeClusterConfig& cluster_config) { +diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc +--- a/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc ++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc +@@ -41,11 +41,12 @@ std::unique_ptr Cr + return std::make_unique(); + #else + return nullptr; + #endif + case kVideoCodecGeneric: return std::make_unique(); } RTC_CHECK_NOTREACHED(); @@ -540,11 +802,36 @@ Index: firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_ } } // namespace webrtc -Index: firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc -+++ firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc -@@ -138,6 +138,7 @@ bool IsNonVolatile(RTPExtensionType type +diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.cc +--- a/third_party/libwebrtc/modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.cc ++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.cc +@@ -108,16 +108,17 @@ uint16_t To2BitEcn(rtc::EcnMarking ecn_m + return 0; + case rtc::EcnMarking::kEct1: + return kEcnEct1 << 13; + case rtc::EcnMarking::kEct0: + return kEcnEct0 << 13; + case rtc::EcnMarking::kCe: + return kEcnCe << 13; + } ++ return 0; // should not be reached + } + + rtc::EcnMarking ToEcnMarking(uint16_t receive_info) { + const uint16_t ecn = (receive_info >> 13) & 0b11; + if (ecn == kEcnEct1) { + return rtc::EcnMarking::kEct1; + } + if (ecn == kEcnEct0) { +diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc +--- a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc ++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc +@@ -145,16 +145,17 @@ bool IsNonVolatile(RTPExtensionType type + #if defined(WEBRTC_MOZILLA_BUILD) + case kRtpExtensionCsrcAudioLevel: + // TODO: Mozilla implement for CsrcAudioLevel + RTC_CHECK(false); + return false; #endif } RTC_CHECK_NOTREACHED(); @@ -552,11 +839,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc } bool HasBweExtension(const RtpHeaderExtensionMap& extensions_map) { -Index: firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc -+++ firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc -@@ -110,6 +110,7 @@ size_t BufferToIndex(Vp8BufferReference + return extensions_map.IsRegistered(kRtpExtensionTransportSequenceNumber) || + extensions_map.IsRegistered(kRtpExtensionTransportSequenceNumber02) || + extensions_map.IsRegistered(kRtpExtensionAbsoluteSendTime) || + extensions_map.IsRegistered(kRtpExtensionTransmissionTimeOffset); + } +diff --git a/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc +--- a/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc ++++ b/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc +@@ -104,16 +104,17 @@ size_t BufferToIndex(Vp8BufferReference + return 0; + case Vp8FrameConfig::Vp8BufferReference::kGolden: + return 1; + case Vp8FrameConfig::Vp8BufferReference::kAltref: + return 2; case Vp8FrameConfig::Vp8BufferReference::kNone: RTC_CHECK_NOTREACHED(); } @@ -564,11 +860,20 @@ Index: firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/defau } } // namespace -Index: firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc -+++ firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc -@@ -30,6 +30,7 @@ TemporalLayersChecker::CreateTemporalLay + + constexpr size_t DefaultTemporalLayers::kNumReferenceBuffers; + + std::vector + DefaultTemporalLayers::GetDependencyInfo(size_t num_layers) { +diff --git a/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc b/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc +--- a/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc ++++ b/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc +@@ -25,16 +25,17 @@ TemporalLayersChecker::CreateTemporalLay + case Vp8TemporalLayersType::kFixedPattern: + return std::make_unique( + num_temporal_layers); + case Vp8TemporalLayersType::kBitrateDynamic: + // Conference mode temporal layering for screen content in base stream. return std::make_unique(num_temporal_layers); } RTC_CHECK_NOTREACHED(); @@ -576,11 +881,197 @@ Index: firefox-128.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/tempo } TemporalLayersChecker::TemporalLayersChecker(int num_temporal_layers) -Index: firefox-128.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc -=================================================================== ---- firefox-128.0.orig/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc -+++ firefox-128.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc -@@ -64,6 +64,7 @@ std::string ToString(VideoAdaptationReas + : num_temporal_layers_(num_temporal_layers), + sequence_number_(0), + last_sync_sequence_number_(0), + last_tl0_sequence_number_(0) {} + +diff --git a/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc b/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc +--- a/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc ++++ b/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc +@@ -58,16 +58,17 @@ bool BeginningOfIdr(const H26xPacketBuff + case kH264StapA: + case kH264SingleNalu: { + return contains_idr_nalu; + } + case kH264FuA: { + return contains_idr_nalu && IsFirstPacketOfFragment(h264_header); + } + } ++ return false; + } + + bool HasSps(const H26xPacketBuffer::Packet& packet) { + auto& h264_header = + absl::get(packet.video_header.video_type_header); + return absl::c_any_of(h264_header.nalus, [](const auto& nalu_info) { + return nalu_info.type == H264::NaluType::kSps; + }); +diff --git a/third_party/libwebrtc/net/dcsctp/packet/parameter/reconfiguration_response_parameter.cc b/third_party/libwebrtc/net/dcsctp/packet/parameter/reconfiguration_response_parameter.cc +--- a/third_party/libwebrtc/net/dcsctp/packet/parameter/reconfiguration_response_parameter.cc ++++ b/third_party/libwebrtc/net/dcsctp/packet/parameter/reconfiguration_response_parameter.cc +@@ -57,16 +57,17 @@ absl::string_view ToString(Reconfigurati + case ReconfigurationResponseParameter::Result:: + kErrorRequestAlreadyInProgress: + return "Error: request already in progress"; + case ReconfigurationResponseParameter::Result::kErrorBadSequenceNumber: + return "Error: bad sequence number"; + case ReconfigurationResponseParameter::Result::kInProgress: + return "In progress"; + } ++ return "Should never be reached"; + } + + std::optional + ReconfigurationResponseParameter::Parse(rtc::ArrayView data) { + std::optional> reader = ParseTLV(data); + if (!reader.has_value()) { + return std::nullopt; + } +diff --git a/third_party/libwebrtc/net/dcsctp/public/dcsctp_handover_state.cc b/third_party/libwebrtc/net/dcsctp/public/dcsctp_handover_state.cc +--- a/third_party/libwebrtc/net/dcsctp/public/dcsctp_handover_state.cc ++++ b/third_party/libwebrtc/net/dcsctp/public/dcsctp_handover_state.cc +@@ -38,16 +38,17 @@ constexpr absl::string_view HandoverUnre + return "RETRANSMISSION_QUEUE_FAST_RECOVERY"; + case HandoverUnreadinessReason::kRetransmissionQueueNotEmpty: + return "RETRANSMISSION_QUEUE_NOT_EMPTY"; + case HandoverUnreadinessReason::kPendingStreamReset: + return "PENDING_STREAM_RESET"; + case HandoverUnreadinessReason::kPendingStreamResetRequest: + return "PENDING_STREAM_RESET_REQUEST"; + } ++ return "NOTREACHED"; + } + } // namespace + + std::string HandoverReadinessStatus::ToString() const { + std::string result; + for (uint32_t bit = 1; + bit <= static_cast(HandoverUnreadinessReason::kMax); + bit *= 2) { +diff --git a/third_party/libwebrtc/net/dcsctp/rx/data_tracker.cc b/third_party/libwebrtc/net/dcsctp/rx/data_tracker.cc +--- a/third_party/libwebrtc/net/dcsctp/rx/data_tracker.cc ++++ b/third_party/libwebrtc/net/dcsctp/rx/data_tracker.cc +@@ -354,16 +354,17 @@ absl::string_view DataTracker::ToString( + return "IDLE"; + case AckState::kBecomingDelayed: + return "BECOMING_DELAYED"; + case AckState::kDelayed: + return "DELAYED"; + case AckState::kImmediate: + return "IMMEDIATE"; + } ++ return "NOTREACHED"; + } + + HandoverReadinessStatus DataTracker::GetHandoverReadiness() const { + HandoverReadinessStatus status; + if (!additional_tsn_blocks_.empty()) { + status.Add(HandoverUnreadinessReason::kDataTrackerTsnBlocksPending); + } + return status; +diff --git a/third_party/libwebrtc/net/dcsctp/socket/dcsctp_socket.cc b/third_party/libwebrtc/net/dcsctp/socket/dcsctp_socket.cc +--- a/third_party/libwebrtc/net/dcsctp/socket/dcsctp_socket.cc ++++ b/third_party/libwebrtc/net/dcsctp/socket/dcsctp_socket.cc +@@ -249,16 +249,17 @@ bool DcSctpSocket::IsConsistent() const + !t1_cookie_->is_running() && t2_shutdown_->is_running()); + case State::kShutdownReceived: + return (tcb_ != nullptr && !t1_init_->is_running() && + !t1_cookie_->is_running() && !t2_shutdown_->is_running()); + case State::kShutdownAckSent: + return (tcb_ != nullptr && !t1_init_->is_running() && + !t1_cookie_->is_running() && t2_shutdown_->is_running()); + } ++ return false; // notreached + } + + constexpr absl::string_view DcSctpSocket::ToString(DcSctpSocket::State state) { + switch (state) { + case DcSctpSocket::State::kClosed: + return "CLOSED"; + case DcSctpSocket::State::kCookieWait: + return "COOKIE_WAIT"; +@@ -270,16 +271,17 @@ constexpr absl::string_view DcSctpSocket + return "SHUTDOWN_PENDING"; + case DcSctpSocket::State::kShutdownSent: + return "SHUTDOWN_SENT"; + case DcSctpSocket::State::kShutdownReceived: + return "SHUTDOWN_RECEIVED"; + case DcSctpSocket::State::kShutdownAckSent: + return "SHUTDOWN_ACK_SENT"; + } ++ return "NOTREACHED"; + } + + void DcSctpSocket::SetState(State state, absl::string_view reason) { + if (state_ != state) { + RTC_DLOG(LS_VERBOSE) << log_prefix_ << "Socket state changed from " + << ToString(state_) << " to " << ToString(state) + << " due to " << reason; + state_ = state; +@@ -588,16 +590,17 @@ SocketState DcSctpSocket::state() const + case State::kEstablished: + return SocketState::kConnected; + case State::kShutdownPending: + case State::kShutdownSent: + case State::kShutdownReceived: + case State::kShutdownAckSent: + return SocketState::kShuttingDown; + } ++ return SocketState::kShuttingDown; // notreached + } + + void DcSctpSocket::SetMaxMessageSize(size_t max_message_size) { + options_.max_message_size = max_message_size; + } + + size_t DcSctpSocket::buffered_amount(StreamID stream_id) const { + return send_queue_.buffered_amount(stream_id); +diff --git a/third_party/libwebrtc/net/dcsctp/socket/packet_sender.cc b/third_party/libwebrtc/net/dcsctp/socket/packet_sender.cc +--- a/third_party/libwebrtc/net/dcsctp/socket/packet_sender.cc ++++ b/third_party/libwebrtc/net/dcsctp/socket/packet_sender.cc +@@ -39,10 +39,11 @@ bool PacketSender::Send(SctpPacket::Buil + return false; + } + + case SendPacketStatus::kError: { + // Nothing that can be done. + return false; + } + } ++ return false; // not reached + } + } // namespace dcsctp +diff --git a/third_party/libwebrtc/net/dcsctp/timer/timer.cc b/third_party/libwebrtc/net/dcsctp/timer/timer.cc +--- a/third_party/libwebrtc/net/dcsctp/timer/timer.cc ++++ b/third_party/libwebrtc/net/dcsctp/timer/timer.cc +@@ -44,16 +44,17 @@ TimeDelta GetBackoffDuration(const Timer + if (duration > options.max_backoff_duration) { + return options.max_backoff_duration; + } + } + + return TimeDelta(std::min(duration, Timer::kMaxTimerDuration)); + } + } ++ return base_duration; // fake nonreached + } + } // namespace + + constexpr TimeDelta Timer::kMaxTimerDuration; + + Timer::Timer(TimerID id, + absl::string_view name, + OnExpired on_expired, +diff --git a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc b/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc +--- a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc ++++ b/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc +@@ -59,16 +59,17 @@ bool IsFramerateScalingEnabled(Degradati + std::string ToString(VideoAdaptationReason reason) { + switch (reason) { + case VideoAdaptationReason::kQuality: + return "quality"; + case VideoAdaptationReason::kCpu: return "cpu"; } RTC_CHECK_NOTREACHED(); @@ -588,3 +1079,29 @@ Index: firefox-128.0/third_party/libwebrtc/video/adaptation/video_stream_encoder } std::vector GetActiveLayersFlags(const VideoCodec& codec) { + std::vector flags; + if (codec.codecType == VideoCodecType::kVideoCodecVP9) { + flags.resize(codec.VP9().numberOfSpatialLayers); + for (size_t i = 0; i < flags.size(); ++i) { + flags[i] = codec.spatialLayers[i].active; +diff --git a/third_party/libwebrtc/video/config/encoder_stream_factory.cc b/third_party/libwebrtc/video/config/encoder_stream_factory.cc +--- a/third_party/libwebrtc/video/config/encoder_stream_factory.cc ++++ b/third_party/libwebrtc/video/config/encoder_stream_factory.cc +@@ -105,16 +105,17 @@ int GetDefaultMaxQp(VideoCodecType codec + return cricket::kDefaultVideoMaxQpH26x; + case webrtc::kVideoCodecVP8: + case webrtc::kVideoCodecVP9: + case webrtc::kVideoCodecGeneric: + return cricket::kDefaultVideoMaxQpVpx; + case webrtc::kVideoCodecAV1: + return cricket::kDefaultVideoMaxQpAv1; + } ++ return cricket::kDefaultVideoMaxQpAv1; // fake return for hopefully not reached + } + + // Round size to nearest simulcast-friendly size. + // Simulcast stream width and height must both be dividable by + // |2 ^ (simulcast_layers - 1)|. + int NormalizeSimulcastSize(const FieldTrialsView& field_trials, + int size, + size_t simulcast_layers) { diff --git a/mozilla.keyring b/mozilla.keyring index 7588492..d6ea632 100644 --- a/mozilla.keyring +++ b/mozilla.keyring @@ -2,19 +2,20 @@ This file contains the public PGP key that is used to sign builds and artifacts of Mozilla projects (such as Firefox and Thunderbird). Please realize that this file itself or the public key servers may be -compromised. You are encouraged to validate the authenticity of these keys in -an out-of-band manner. +compromised. You are encouraged to validate the authenticity of these +keys in an out-of-band manner. -Mozilla users: pgp < KEY +gpg --show-keys < KEY pub rsa4096 2015-07-17 [SC] 14F26682D0916CDD81E37B6D61B7B526D98F0353 -uid [ full ] Mozilla Software Releases +uid Mozilla Software Releases +sub rsa4096 2021-05-17 [S] [expired: 2023-05-17] sub rsa4096 2015-07-17 [S] [expired: 2017-07-16] sub rsa4096 2017-06-22 [S] [expired: 2019-06-22] sub rsa4096 2019-05-30 [S] [expired: 2021-05-29] -sub rsa4096 2021-05-17 [S] [expired: 2023-05-17] sub rsa4096 2023-05-05 [S] [expires: 2025-05-04] +sub rsa4096 2025-03-13 [S] [expires: 2027-03-13] -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -400,6 +401,41 @@ W81ABx4ASBktXAf1IweRbbxqW8OgMhG6xHTeiEjjav7SmlD0XVOxjhI+qBoNPovW lChqONxablBkuh0Jd6kdNiaSEM9cd60kK3GT/dBMyv0yVhhLci6HQZ+Mf4cbn0Kt ayzuQLOcdRCN3FF/JNQH3v6LA1MdRfmJlgC4UdiepBb1uCgtVIPizRuXWDjyjzeP ZRN/AqaUbEoNBHhIz0nKhQGDbst4ugIzJWIX+6UokwPC3jvJqQQttccjAy6kXBmx -fxyRMB5BEeLY0+qVPyvOxpXEGnlSHYmdIS4= -=ZEQW +fxyRMB5BEeLY0+qVPyvOxpXEGnlSHYmdIS65Ag0EZ9KQfQEQAOVIyh0sZPPFLWxo +FT0WhPzHw8BhgnCBNdZAh9+SM0Apq2VcQKSjBjKiterOTtc6EVh0K2ikbGKHQ1Sv +wNdsYL01cSkJSJORig/1Du1eh+2nlo8nut7xT//V+2FQyWFCLDeQvLlAs3QHMrMY +xTcwNk3qi/z1Z5Q4e6Re2aKRU00LtSomD6CKWy9nAaqTRNzzdndJwIyCyshX4bbU +zAzE7Wbgh/E0/FgBGw87LYITqyU6US4lvoUXB+89XxwMxO9I74L118gXEyybz+JN +0/w87hXAKnaKjasSvobKE4mau8SXqmOO66MxiMaF4Xsmr3oIwo8q9W5d+hA+t225 +ipq2rZZErmPL44deMCeKmepjLTa9CoxX2oVpDWGOYFRyJRkLDyyH4O3gCo/5qv4r +OTJqPFfKPtrjWFJKGf4P4UD0GSBX2Q+mOf2XHWsMJE4t8T7jxQCSAQUMwt6M18h1 +auIqcfkuNvdJhcl2GvJyCMIbkA3AoiuKaSPgoVCmJdbc6Ao9ydmMUB5Q1rYpMNKC +MsuVP9OcX8FoHEVMXOvr0f6Wfj+iHytfO2VTqrw/cqoCyuPoSrgxjs1/cRSz5g9f +Z0zrOtQyNB5yJ3YPTG3va1/XLflrjPcT4ZUkej9nkFpCNWdEZVWD/z3vXBGSV11N +9Cdy60QbD4yZvDjV2GQ+dwAF1o1BABEBAAGJBHIEGAEKACYWIQQU8maC0JFs3YHj +e21ht7Um2Y8DUwUCZ9KQfQIbAgUJA8JnAAJACRBht7Um2Y8DU8F0IAQZAQoAHRYh +BAm+7WPzRiot/6s7h17LZJfBogJWBQJn0pB9AAoJEF7LZJfBogJW9I4QAJbv4Rhb +4x6Jl75x2Lfp46/e3fZVDhzUdLjK8A/acRF7JRBuJVJRaijJ5tngdknmlmbzfqly +zsMWUciAwVJRvijNFDeicet5zJpBRsXEUAug3iVCD1KlVvLzjCi9Eb9s6xCQjSJ8 +DZE020s41wdqtb1nziDASAkg+YH2DzpTEaZVNM39uNDKbaJLYIjKA9MV1YHArqUl +dFsoofBe4zIZRFyvMD7Gmr7Xm0IWYLrfmnenm1JJYIkvGUeVoP8dEonAVhLVwvww +ufobV0qdtMfhZsgFwf1XSHI9MtD4yAVtBqBTkfFeRLnBjJK/ywYxGqbadt1b57I4 +ywTQ16oXNrlTF1Su0I8i/fo0i/9ohNl3opN3LbaEbhT37M4xpy4MgL2Fthddc2gW +vF/8TFRaXw7LaLSR7HwO+Y0CpOtV/Ct4RzKEulY5DpV9b1JQJhpLcjMz+pBDAM3K +JuiV6Bcfoz5PZowFy74UmE02Vzk/oyuI/o4KMihy0UzWQVkOZTTu4eONktgGiZOn +RFdiLKVgeLEDXTLdhbuwGS2+wX3I7lLP9AWpK8Ahc81eUwU6MwdbfwfJ1ELtKaa/ +JmMjaWkr5aGrp88d8ePR9jYA47Z2q0esB67pRJVe0McVJlu9GQGq05S7lZKs6mi9 +dHTzeHwua//IXHMK0s3WhMU7vGwJ3E2+pTstf8AQALSwkezD3QchPV+5CAUYY7Cm +MXB6zzIU18wCS61Y8QdDvqmtWHdMVTp4xT14fS6cvB4uFzacGQJ7CVIWeZgwEFzZ +iev3dKpnUOGg0WQSwmQQA0JCg6/qS0AeUPINjhWtNcR7voCqAYeRcjo47UJclD/K +KNTCn27btHRaEmpTdTtC6sxiVElFObb3a9tHXqwLWp8gJ+NZ+6mlrvvH2hm1CAyQ +TDRYC7nN69QJrKHR8HA3AeR5figQHLwvmfQlV2erZE17GT+L5t0HxX/HKZCim91P +Apqa+7iY0eKPAG5iacABrBi9zzh/ex0ovvuxsBDKUFCSu7HIivnAVrdS/kbO1qJ5 +I3MBMp0dlQ6PS6LeZIRhxts0aPPZedsXytoL7kFLISfJ55AuhJpskz+55uviJhp/ +H3zNBYtQ+dmFmp4RRk/Nvu0zv6OGtaZy6M5X24Pbzb/OApBML84cEmb3iZie9J2Z +YW68/D96sP09x6GItCJlCIdQZkRcwmkQwgtq9sJDw92/vSGeYdRn+oCAxJ14eObC +sVwcfJARLt45btEnx+zRCAHAHQHpV6qTGT6nqg57XuM9iNNdyTGKRU+Iklgb9LRx +VAQfbn5uXYb5j2ox5pjxtbXTf9Lbo7RkygcWSKZPWmYgGsKS6jmXkDa/TyOlPxkb +aknpPbYMBztRT4Ju0VU4 +=4Dnl -----END PGP PUBLIC KEY BLOCK----- diff --git a/tar_stamps b/tar_stamps index a77897f..cbd5aa2 100644 --- a/tar_stamps +++ b/tar_stamps @@ -1,10 +1,10 @@ PRODUCT="thunderbird" -CHANNEL="esr128" -VERSION="128.9.2" +CHANNEL="esr140" +VERSION="140.1.1" VERSION_SUFFIX="esr" -REV_VERSION="128.9.1" +REV_VERSION="140.1.0" PREV_VERSION_SUFFIX="esr" #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation -RELEASE_REPO="https://hg.mozilla.org/releases/comm-esr128" -RELEASE_TAG="3dc116e792891bdcfaaa36232ed71fb2a79ed570" -RELEASE_TIMESTAMP="20250415075302" +RELEASE_REPO="https://hg.mozilla.org/releases/comm-esr140" +RELEASE_TAG="c2cef707a311a491572603b9902681f654964f08" +RELEASE_TIMESTAMP="20250805025534" diff --git a/thunderbird-128.9.2esr.source.tar.xz b/thunderbird-128.9.2esr.source.tar.xz deleted file mode 100644 index 9982961..0000000 --- a/thunderbird-128.9.2esr.source.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21cbdc12fd2a5c79ce3ae3f23b5c334160b4380858aaa8a92fc1d9c9acfdd5fb -size 674861236 diff --git a/thunderbird-128.9.2esr.source.tar.xz.asc b/thunderbird-128.9.2esr.source.tar.xz.asc deleted file mode 100644 index afd1212..0000000 --- a/thunderbird-128.9.2esr.source.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEErdcHlHlwDcrf3VM34207E/PZMnQFAmf+NL8ACgkQ4207E/PZ -MnQC3xAAnuM8XgSk1ntr6xuPTs0PtiOVn4SsM3i47Cfdi/ZbOye3Gr4FeW2KcHLO -I9jpFZv84lxCAi7IOG01tHIGehmKMBIl+y31oh+ECTxftghtlYtE2FR4s00rAkdt -1n6Vrht/R0HPW1Shi6pf/qK01pOL8OQG1bGvOtJdZWCiQv3BZPGJblOC32d8E5Tg -3nBl2YEO2l01G6J3cNxQRgGnWW2UM8n61Uha/5LKWU/yvv9390Pj1BItziOBD5L4 -52xmQKyGcNUOZ2br7wO4nGf05er2aOFJPyYPuRLpuTd85MMA1yL99gjEoROXqo2o -fxS8se/otNNMujdfFwoyGldg0PJpWCCW54WGTeT7aRVP0+jhC0S/HD+At0NeABhL -a1B74NqP5O/v9KjOQpUNPGBmoCbq/+VqIkfmDZF2D7wTLyVHfGySLi5sTuNjvpNj -Vq1XyGty2hGXMmJ2rHshVCK1MphEwibK4f2P3pBYWblEuN/tcYZaO2KQPh0GlH3I -/UhzV5Iv+6mL2H78qOkBsWwjxHeSCd64UZi0BdemtFjVOXYCXenRC7ywnG/q+xxD -N+jlhAqiMvWyZLVMhPASK+ih8ascUMTOifV48xh6s0WYzzgc810wwUiH5XLl+8Oh -oXmxT2R4wgsq3pw10eDCbjMl8tqOVyfA97y3HmGkO2x89OqyIGk= -=pPx+ ------END PGP SIGNATURE----- diff --git a/thunderbird-140.1.1esr.source.tar.xz b/thunderbird-140.1.1esr.source.tar.xz new file mode 100644 index 0000000..ad04194 --- /dev/null +++ b/thunderbird-140.1.1esr.source.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:136b160954abe2426ab26e46d35d946207ab5e217ac72d3ff5cb1b87680d4fcd +size 753445400 diff --git a/thunderbird-140.1.1esr.source.tar.xz.asc b/thunderbird-140.1.1esr.source.tar.xz.asc new file mode 100644 index 0000000..8299656 --- /dev/null +++ b/thunderbird-140.1.1esr.source.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEECb7tY/NGKi3/qzuHXstkl8GiAlYFAmiRqcYACgkQXstkl8Gi +AlZscRAAuYghAziF92noBbHIfY1LZ21FdYuZuq058k8sgWkd6gdQ/Q+Vk4nfOFIn +zrl76a2o8qRzkhhOPkRDQoYkdy2cmVTMANqF8mp3hE+LLOTmb9x5G9BgUDsWbIUd +E3mcGRJ6LAfZeBjFJNKMTw94Vr4TOSWgS4KqEwo2RnL+1w65eCWTMnIRvcs1mYJD +iLtZUvdLACx499ZY0vvzraCtVQFJ6+m8uzf+FXfIgJDL6XRV3H4rDPSjamgBuIKv +QfL/toEGW+ZtqAr88u5gCLOfXNXziIk0TgLm5Wd0rnseGODQTSr/wLdEr6BROBle +HU0CtxN15PVTTwZV1KH0mSgvEMlfi461Ii3Ct+HdF6i6HAbMORsfKlQPPn4JGiZT +B4QXIohr0FTp73PH83nDCk1YvRl0kSHCUMjrTdchFVkOXTIW58eWTUA2zT6sFaMQ ++NLA0xaKGVFBTD7NWgSbMGIgsZPDhnhJlpnGR4K9YuE1+F5hL7AMmAqkb/tGslAz +LMOL6CiOSuOYckOan6uGtxCmb2h3FbCyjfRMtQbvT3V116ZBDle462gDo79pAJwC +1CyF9RGnvDx9m4+N2NR8b9YZxyBdyVciEnzmf+KqOlj6hGPR4dPeizEzEIQK2ZXD +ixScReBjDyyaTLivq7RBha4nHPVfWzYicA5CmWUxMGXmibW3NfM= +=ccda +-----END PGP SIGNATURE-----