From 85c684937e821c8742af86c8e7001e46e5e2f625 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Tue, 22 Nov 2022 16:02:43 -0500 Subject: [PATCH] Update from Fedora 11.3.1-4 Resolves: #2117632 --- .gitignore | 1 + gcc.spec | 71 ++++++-- gcc11-pr105331.patch | 33 ---- gcc11-rh2106262.patch | 388 ------------------------------------------ sources | 2 +- 5 files changed, 63 insertions(+), 432 deletions(-) delete mode 100644 gcc11-pr105331.patch delete mode 100644 gcc11-rh2106262.patch diff --git a/.gitignore b/.gitignore index 6fa3f10..7e22e80 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ /gcc-11.2.1-20220127.tar.xz /gcc-11.2.1-20220401.tar.xz /gcc-11.3.1-20220421.tar.xz +/gcc-11.3.1-20221121.tar.xz diff --git a/gcc.spec b/gcc.spec index 0fbbd36..847480d 100644 --- a/gcc.spec +++ b/gcc.spec @@ -1,10 +1,10 @@ -%global DATE 20220421 -%global gitrev 1d3172725999deb0dca93ac70393ed9a0ad0da3f +%global DATE 20221121 +%global gitrev 643e61c61b308f9c572da4ccd5f730fb %global gcc_version 11.3.1 %global gcc_major 11 # Note, gcc_release must be integer, if you want to add suffixes to # %%{release}, append them after %%{gcc_release} on Release: line. -%global gcc_release 2 +%global gcc_release 4 %global nvptx_tools_gitrev 5f6f343a302d620b0868edab376c00b15741e39e %global newlib_cygwin_gitrev 50e2a63b04bdd018484605fbb954fd1bd5147fa0 %global _unpackaged_files_terminate_build 0 @@ -42,7 +42,7 @@ %else %global build_go 0 %endif -%ifarch %{ix86} x86_64 %{arm} %{mips} s390 s390x riscv64 +%ifarch %{ix86} x86_64 %{arm} aarch64 %{mips} s390 s390x riscv64 %global build_d 1 %else %global build_d 0 @@ -116,7 +116,7 @@ Summary: Various compilers (C, C++, Objective-C, ...) Name: gcc Version: %{gcc_version} -Release: %{gcc_release}.1%{?dist} +Release: %{gcc_release}%{?dist} # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -273,9 +273,6 @@ Patch20: gcc11-relocatable-pch.patch Patch21: gcc11-dejagnu-multiline.patch Patch23: gcc11-pie.patch Patch24: gcc11-bind-now.patch -Patch25: gcc11-pr105331.patch -# This can go once we rebase from GCC 11. -Patch26: gcc11-rh2106262.patch Patch100: gcc11-fortran-fdec-duplicates.patch Patch101: gcc11-fortran-flogical-as-integer.patch @@ -827,8 +824,6 @@ so that there cannot be any synchronization problems. %patch21 -p1 -b .dejagnu-multiline~ %patch23 -p1 -b .pie~ %patch24 -p1 -b .now~ -%patch25 -p0 -b .pr105331~ -%patch26 -p1 -b .rh2106262~ %if 0%{?rhel} >= 9 %patch100 -p1 -b .fortran-fdec-duplicates~ @@ -3274,6 +3269,62 @@ end %{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0.0.0 %changelog +* Tue Nov 22 2022 Marek Polacek 11.3.1-4 +- update from releases/gcc-11-branch (#2117632) + - PRs analyzer/105252, analyzer/105365, analyzer/105366, c++/65211, + c++/82980, c++/86193, c++/90107, c++/97296, c++/101442, c++/101698, + c++/102071, c++/102177, c++/102300, c++/102307, c++/102479, + c++/102629, c++/104066, c++/104142, c++/104646, c++/104669, + c++/105245, c++/105265, c++/105289, c++/105304, c++/105321, + c++/105386, c++/105398, c++/105725, c++/105761, c++/105774, + c++/105795, c++/105852, c++/105925, c++/106024, c++/106361, + c++/107358, c/41041, c/106016, c/106981, c/107001, d/106139, + d/106638, debug/106261, fortran/82868, fortran/100029, fortran/100040, + fortran/100097, fortran/100098, fortran/100132, fortran/100136, + fortran/100245, fortran/103413, fortran/103504, fortran/103693, + fortran/103694, fortran/104313, fortran/104849, fortran/105012, + fortran/105230, fortran/105243, fortran/105310, fortran/105633, + fortran/105691, fortran/105813, fortran/105954, fortran/106121, + fortran/106817, fortran/106857, fortran/106985, fortran/106986, + fortran/107054, ipa/100413, ipa/105600, ipa/105739, libgomp/106045, + libstdc++/65018, libstdc++/84110, libstdc++/93602, libstdc++/96592, + libstdc++/99290, libstdc++/100823, libstdc++/101709, libstdc++/102447, + libstdc++/103664, libstdc++/103848, libstdc++/103853, + libstdc++/103911, libstdc++/103992, libstdc++/104217, + libstdc++/104443, libstdc++/104602, libstdc++/104731, + libstdc++/105128, libstdc++/105284, libstdc++/105375, + libstdc++/105502, libstdc++/105671, libstdc++/105915, + libstdc++/106162, libstdc++/106248, libstdc++/106320, + libstdc++/106607, libstdc++/106695, lto/106334, lto/106540, + middle-end/103193, middle-end/104869, middle-end/104966, + middle-end/105140, middle-end/105998, middle-end/106027, + middle-end/106030, middle-end/106144, middle-end/106331, + middle-end/106492, preprocessor/97498, preprocessor/105732, + rtl-optimization/104637, rtl-optimization/105041, + rtl-optimization/105333, rtl-optimization/105559, + rtl-optimization/106032, rtl-optimization/106187, sanitizer/105396, + sanitizer/105729, target/96072, target/99184, target/99685, + target/101322, target/101891, target/102059, target/102146, + target/103197, target/103353, target/104257, target/104829, + target/105147, target/105162, target/105209, target/105292, + target/105339, target/105349, target/105463, target/105472, + target/105854, target/105879, target/105970, target/105981, + target/106017, target/106091, target/106355, target/106491, + target/106721, target/107061, target/107064, target/107183, + target/107248, target/107304, target/107364, target/107748, + testsuite/105095, testsuite/105266, testsuite/105433, + testsuite/106345, tree-optimization/103116, tree-optimization/105148, + tree-optimization/105163, tree-optimization/105173, + tree-optimization/105250, tree-optimization/105263, + tree-optimization/105312, tree-optimization/105368, + tree-optimization/105431, tree-optimization/105437, + tree-optimization/105528, tree-optimization/105618, + tree-optimization/105726, tree-optimization/105860, + tree-optimization/106112, tree-optimization/106131, + tree-optimization/106189, tree-optimization/106513, + tree-optimization/106892, tree-optimization/106934 + + * Tue Jul 12 2022 Marek Polacek 11.3.1-2.1 - fix handling of invalid ranges in std::regex (#2106262) diff --git a/gcc11-pr105331.patch b/gcc11-pr105331.patch deleted file mode 100644 index fa1a9d3..0000000 --- a/gcc11-pr105331.patch +++ /dev/null @@ -1,33 +0,0 @@ -2022-04-21 Jakub Jelinek - - PR target/105331 - * config/i386/i386.c (ix86_gimplify_va_arg): Mark va_arg_tmp - temporary TREE_ADDRESSABLE before trying to gimplify ADDR_EXPR - of it. - - * gcc.dg/pr105331.c: New test. - ---- gcc/config/i386/i386.c.jj 2022-04-12 09:20:07.566662842 +0200 -+++ gcc/config/i386/i386.c 2022-04-21 12:03:32.201951522 +0200 -@@ -4891,6 +4891,7 @@ ix86_gimplify_va_arg (tree valist, tree - { - int i, prev_size = 0; - tree temp = create_tmp_var (type, "va_arg_tmp"); -+ TREE_ADDRESSABLE (temp) = 1; - - /* addr = &temp; */ - t = build1 (ADDR_EXPR, build_pointer_type (type), temp); ---- gcc/testsuite/gcc.dg/pr105331.c.jj 2022-04-21 12:09:34.398906718 +0200 -+++ gcc/testsuite/gcc.dg/pr105331.c 2022-04-21 12:09:07.304283903 +0200 -@@ -0,0 +1,11 @@ -+/* PR target/105331 */ -+/* { dg-do compile } */ -+/* { dg-options "-O -Wuninitialized" } */ -+ -+#include -+ -+int -+foo (va_list *va) -+{ -+ return va_arg (*va, double _Complex); /* { dg-bogus "may be used uninitialized" } */ -+} diff --git a/gcc11-rh2106262.patch b/gcc11-rh2106262.patch deleted file mode 100644 index 34e9c5b..0000000 --- a/gcc11-rh2106262.patch +++ /dev/null @@ -1,388 +0,0 @@ -commit c725028a8bb9478ec84332641147ad12b9236922 -Author: Jonathan Wakely -Date: Tue Dec 14 14:32:35 2021 +0000 - - libstdc++: Fix handling of invalid ranges in std::regex [PR102447] - - std::regex currently allows invalid bracket ranges such as [\w-a] which - are only allowed by ECMAScript when in web browser compatibility mode. - It should be an error, because the start of the range is a character - class, not a single character. The current implementation of - _Compiler::_M_expression_term does not provide a way to reject this, - because we only remember a previous character, not whether we just - processed a character class (or collating symbol etc.) - - This patch replaces the pair used to emulate - optional with a custom class closer to pair. That - allows us to track three states, so that we can tell when we've just - seen a character class. - - With this additional state the code in _M_expression_term for processing - the _S_token_bracket_dash can be improved to correctly reject the [\w-a] - case, without regressing for valid cases such as [\w-] and [----]. - - libstdc++-v3/ChangeLog: - - PR libstdc++/102447 - * include/bits/regex_compiler.h (_Compiler::_BracketState): New - class. - (_Compiler::_BrackeyMatcher): New alias template. - (_Compiler::_M_expression_term): Change pair - parameter to _BracketState. Process first character for - ECMAScript syntax as well as POSIX. - * include/bits/regex_compiler.tcc - (_Compiler::_M_insert_bracket_matcher): Pass _BracketState. - (_Compiler::_M_expression_term): Use _BracketState to store - state between calls. Improve handling of dashes in ranges. - * testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc: - Add more tests for ranges containing dashes. Check invalid - ranges with character class at the beginning. - - (cherry picked from commit 7ce3c230edf6e498e125c805a6dd313bf87dc439) - -diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h -index f224fcb06e0..aa19df2bf9a 100644 ---- a/libstdc++-v3/include/bits/regex_compiler.h -+++ b/libstdc++-v3/include/bits/regex_compiler.h -@@ -122,13 +122,45 @@ namespace __detail - void - _M_insert_bracket_matcher(bool __neg); - -- // Returns true if successfully matched one term and should continue. -+ // Cache of the last atom seen in a bracketed range expression. -+ struct _BracketState -+ { -+ enum class _Type : char { _None, _Char, _Class } _M_type = _Type::_None; -+ _CharT _M_char; -+ -+ void -+ set(_CharT __c) noexcept { _M_type = _Type::_Char; _M_char = __c; } -+ -+ _GLIBCXX_NODISCARD _CharT -+ get() const noexcept { return _M_char; } -+ -+ void -+ reset(_Type __t = _Type::_None) noexcept { _M_type = __t; } -+ -+ explicit operator bool() const noexcept -+ { return _M_type != _Type::_None; } -+ -+ // Previous token was a single character. -+ _GLIBCXX_NODISCARD bool -+ _M_is_char() const noexcept { return _M_type == _Type::_Char; } -+ -+ // Previous token was a character class, equivalent class, -+ // collating symbol etc. -+ _GLIBCXX_NODISCARD bool -+ _M_is_class() const noexcept { return _M_type == _Type::_Class; } -+ }; -+ -+ template -+ using _BracketMatcher -+ = std::__detail::_BracketMatcher<_TraitsT, __icase, __collate>; -+ -+ // Returns true if successfully parsed one term and should continue -+ // compiling a bracket expression. - // Returns false if the compiler should move on. - template - bool -- _M_expression_term(pair& __last_char, -- _BracketMatcher<_TraitsT, __icase, __collate>& -- __matcher); -+ _M_expression_term(_BracketState& __last_char, -+ _BracketMatcher<__icase, __collate>& __matcher); - - int - _M_cur_int_value(int __radix); -diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc -index ea07bc2428e..7769a9e63a3 100644 ---- a/libstdc++-v3/include/bits/regex_compiler.tcc -+++ b/libstdc++-v3/include/bits/regex_compiler.tcc -@@ -403,7 +403,7 @@ namespace __detail - _M_insert_character_class_matcher() - { - __glibcxx_assert(_M_value.size() == 1); -- _BracketMatcher<_TraitsT, __icase, __collate> __matcher -+ _BracketMatcher<__icase, __collate> __matcher - (_M_ctype.is(_CtypeT::upper, _M_value[0]), _M_traits); - __matcher._M_add_character_class(_M_value, false); - __matcher._M_ready(); -@@ -424,25 +424,17 @@ namespace __detail - _Compiler<_TraitsT>:: - _M_insert_bracket_matcher(bool __neg) - { -- _BracketMatcher<_TraitsT, __icase, __collate> __matcher(__neg, _M_traits); -- pair __last_char; // Optional<_CharT> -- __last_char.first = false; -- if (!(_M_flags & regex_constants::ECMAScript)) -- { -- if (_M_try_char()) -- { -- __last_char.first = true; -- __last_char.second = _M_value[0]; -- } -- else if (_M_match_token(_ScannerT::_S_token_bracket_dash)) -- { -- __last_char.first = true; -- __last_char.second = '-'; -- } -- } -- while (_M_expression_term(__last_char, __matcher)); -- if (__last_char.first) -- __matcher._M_add_char(__last_char.second); -+ _BracketMatcher<__icase, __collate> __matcher(__neg, _M_traits); -+ _BracketState __last_char; -+ if (_M_try_char()) -+ __last_char.set(_M_value[0]); -+ else if (_M_match_token(_ScannerT::_S_token_bracket_dash)) -+ // Dash as first character is a normal character. -+ __last_char.set('-'); -+ while (_M_expression_term(__last_char, __matcher)) -+ ; -+ if (__last_char._M_is_char()) -+ __matcher._M_add_char(__last_char.get()); - __matcher._M_ready(); - _M_stack.push(_StateSeqT( - *_M_nfa, -@@ -447,27 +438,27 @@ namespace __detail - template - bool - _Compiler<_TraitsT>:: -- _M_expression_term(pair& __last_char, -- _BracketMatcher<_TraitsT, __icase, __collate>& __matcher) -+ _M_expression_term(_BracketState& __last_char, -+ _BracketMatcher<__icase, __collate>& __matcher) - { - if (_M_match_token(_ScannerT::_S_token_bracket_end)) - return false; - -+ // Add any previously cached char into the matcher and update cache. - const auto __push_char = [&](_CharT __ch) - { -- if (__last_char.first) -- __matcher._M_add_char(__last_char.second); -- else -- __last_char.first = true; -- __last_char.second = __ch; -+ if (__last_char._M_is_char()) -+ __matcher._M_add_char(__last_char.get()); -+ __last_char.set(__ch); - }; -- const auto __flush = [&] -+ // Add any previously cached char into the matcher and update cache. -+ const auto __push_class = [&] - { -- if (__last_char.first) -- { -- __matcher._M_add_char(__last_char.second); -- __last_char.first = false; -- } -+ if (__last_char._M_is_char()) -+ __matcher._M_add_char(__last_char.get()); -+ // We don't cache anything here, just record that the last thing -+ // processed was a character class (or similar). -+ __last_char.reset(_BracketState::_Type::_Class); - }; - - if (_M_match_token(_ScannerT::_S_token_collsymbol)) -@@ -476,16 +467,16 @@ namespace __detail - if (__symbol.size() == 1) - __push_char(__symbol[0]); - else -- __flush(); -+ __push_class(); - } - else if (_M_match_token(_ScannerT::_S_token_equiv_class_name)) - { -- __flush(); -+ __push_class(); - __matcher._M_add_equivalence_class(_M_value); - } - else if (_M_match_token(_ScannerT::_S_token_char_class_name)) - { -- __flush(); -+ __push_class(); - __matcher._M_add_character_class(_M_value, false); - } - else if (_M_try_char()) -@@ -502,49 +493,50 @@ namespace __detail - // It turns out that no one reads BNFs ;) - else if (_M_match_token(_ScannerT::_S_token_bracket_dash)) - { -- if (!__last_char.first) -+ if (_M_match_token(_ScannerT::_S_token_bracket_end)) - { -- if (!(_M_flags & regex_constants::ECMAScript)) -- { -- if (_M_match_token(_ScannerT::_S_token_bracket_end)) -- { -- __push_char('-'); -- return false; -- } -- __throw_regex_error( -- regex_constants::error_range, -- "Unexpected dash in bracket expression. For POSIX syntax, " -- "a dash is not treated literally only when it is at " -- "beginning or end."); -- } -+ // For "-]" the dash is a literal character. - __push_char('-'); -+ return false; - } -- else -+ else if (__last_char._M_is_class()) -+ { -+ // "\\w-" is invalid, start of range must be a single char. -+ __throw_regex_error(regex_constants::error_range, -+ "Invalid start of range in bracket expression."); -+ } -+ else if (__last_char._M_is_char()) - { - if (_M_try_char()) - { -- __matcher._M_make_range(__last_char.second, _M_value[0]); -- __last_char.first = false; -+ // "x-y" -+ __matcher._M_make_range(__last_char.get(), _M_value[0]); -+ __last_char.reset(); - } - else if (_M_match_token(_ScannerT::_S_token_bracket_dash)) - { -- __matcher._M_make_range(__last_char.second, '-'); -- __last_char.first = false; -+ // "x--" -+ __matcher._M_make_range(__last_char.get(), '-'); -+ __last_char.reset(); - } - else -- { -- if (_M_scanner._M_get_token() -- != _ScannerT::_S_token_bracket_end) -- __throw_regex_error( -- regex_constants::error_range, -- "Character is expected after a dash."); -- __push_char('-'); -- } -+ __throw_regex_error(regex_constants::error_range, -+ "Invalid end of range in bracket expression."); - } -+ else if (_M_flags & regex_constants::ECMAScript) -+ { -+ // A dash that is not part of an existing range. Might be the -+ // start of a new range, or might just be a literal '-' char. -+ // Only ECMAScript allows that in the middle of a bracket expr. -+ __push_char('-'); -+ } -+ else -+ __throw_regex_error(regex_constants::error_range, -+ "Invalid dash in bracket expression."); - } - else if (_M_match_token(_ScannerT::_S_token_quoted_class)) - { -- __flush(); -+ __push_class(); - __matcher._M_add_character_class(_M_value, - _M_ctype.is(_CtypeT::upper, - _M_value[0])); -diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc -index 7df70604ea6..0d76e63da7b 100644 ---- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc -+++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc -@@ -69,6 +69,16 @@ test01() - void - test02() - { -+ VERIFY(regex_match("-", regex("[-]", regex_constants::ECMAScript))); -+ VERIFY(regex_match("-", regex("[--]", regex_constants::ECMAScript))); -+ VERIFY(regex_match("-", regex("[---]", regex_constants::ECMAScript))); -+ VERIFY(regex_match("-", regex("[----]", regex_constants::ECMAScript))); -+ VERIFY(regex_match("-", regex("[-----]", regex_constants::ECMAScript))); -+ -+ VERIFY(regex_match("-", regex("[-]", regex_constants::extended))); -+ VERIFY(regex_match("-", regex("[--]", regex_constants::extended))); -+ VERIFY(regex_match("-", regex("[---]", regex_constants::extended))); -+ VERIFY(regex_match("-", regex("[----]", regex_constants::extended))); - try - { - std::regex re("[-----]", std::regex::extended); -@@ -78,7 +88,6 @@ test02() - { - VERIFY(e.code() == std::regex_constants::error_range); - } -- std::regex re("[-----]", std::regex::ECMAScript); - - VERIFY(!regex_match("b", regex("[-ac]", regex_constants::extended))); - VERIFY(!regex_match("b", regex("[ac-]", regex_constants::extended))); -@@ -93,7 +102,27 @@ test02() - } - catch (const std::regex_error& e) - { -+ VERIFY(e.code() == std::regex_constants::error_range); -+ } -+ try -+ { -+ regex("[@--]", regex_constants::extended); -+ VERIFY(false); - } -+ catch (const std::regex_error& e) -+ { -+ VERIFY(e.code() == std::regex_constants::error_range); -+ } -+ try -+ { -+ regex("[--%]", regex_constants::extended); -+ VERIFY(false); -+ } -+ catch (const std::regex_error& e) -+ { -+ VERIFY(e.code() == std::regex_constants::error_range); -+ } -+ - VERIFY(regex_match("].", regex("[][.hyphen.]-0]*", regex_constants::extended))); - } - -@@ -158,6 +187,36 @@ test06() - VERIFY(regex_match("a-", debian_cron_namespace_ok)); - } - -+// libstdc++/102447 -+void -+test07() -+{ -+ VERIFY(regex_match("-", std::regex("[\\w-]", std::regex::ECMAScript))); -+ VERIFY(regex_match("a", std::regex("[\\w-]", std::regex::ECMAScript))); -+ VERIFY(regex_match("-", std::regex("[a-]", std::regex::ECMAScript))); -+ VERIFY(regex_match("a", std::regex("[a-]", std::regex::ECMAScript))); -+ -+ try -+ { -+ std::regex re("[\\w-a]", std::regex::ECMAScript); -+ VERIFY(false); -+ } -+ catch (const std::regex_error& e) -+ { -+ VERIFY(e.code() == std::regex_constants::error_range); -+ } -+ -+ try -+ { -+ std::regex re("[\\w--]", std::regex::ECMAScript); -+ VERIFY(false); -+ } -+ catch (const std::regex_error& e) -+ { -+ VERIFY(e.code() == std::regex_constants::error_range); -+ } -+} -+ - int - main() - { -@@ -167,6 +226,7 @@ main() - test04(); - test05(); - test06(); -+ test07(); - - return 0; - } diff --git a/sources b/sources index 5ba9a7a..32aa971 100644 --- a/sources +++ b/sources @@ -1,4 +1,4 @@ -SHA512 (gcc-11.3.1-20220421.tar.xz) = c631a8a990a6977b70a878c34a69c64dd49387edae0931ef64433cbf5f361ecec6a4118a9a5b1eab57b354eecea125297f721ddd25daebc2290749a7eae17af2 +SHA512 (gcc-11.3.1-20221121.tar.xz) = c4e484b7cd8b54925cd420aa9d4a22d27ad1557b481c882e952ed65e7709cfc9c044111f2d194f06349d6510672e23b9d8c8da9f1ec070f453bb4ce74f885095 SHA512 (isl-0.18.tar.bz2) = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f351025370e57448b63b2b8a8cf8a0843a089c3263f9baee1542d5c2e1cb37ed39d94 SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 002a48a7b689a81abbf16161bcaec001a842e67dfbe372e9e109092703bfc666675f16198f60ca429370e8850d564547dc505df81bc3aaca4ce6defbc014ad6c SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7