[PATCH] c++: fix %define api.value.automove false to actually disable automove
"Z. Majeed" <[email protected]> Sat, 12 Jul 2025 23:38:37 +0000 (UTC)
| Newsgroups | gmane.comp.parsers.bison.patches |
|---|---|
| Message-ID | <[email protected]> |
------=_Part_540848_1298401476.1752363517591 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable [PATCH] c++: fix %define api.value.automove false to actually disable=C2=A0= automove * Fixes bug reported in https://lists.gnu.org/archive/html/bug-bison/2025-0= 7/msg00002.html * Previously a false value still applied std::move to semantic values on =C2=A0 the right-hand sides of a rule. * Added tests for all 5 possible settings for api.value.automove. * Added NEWS entry. --- =C2=A0NEWS=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 |=C2=A0 =C2=A08 ++++ =C2=A0data/skeletons/c++.m4=C2=A0 =C2=A0|=C2=A0 =C2=A02 + =C2=A0data/skeletons/lalr1.cc |=C2=A0 =C2=A07 ++- =C2=A0tests/c++.at=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 103 +++++++++= +++++++++++++++++++++++++++++++ =C2=A04 files changed, 116 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index cdef3238..8c7dd6bc 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,14 @@ GNU Bison NEWS =C2=A0 =C2=A0* Noteworthy changes in release ?.? (????-??-??) [?] =C2=A0 +** Bug fixes + +*** Bug fixes in lalr1.cc + +=C2=A0 The `api.value.automove` %define variable did not honor an explicit +=C2=A0 false value. Now `%define api.value.automove false` doesn't generat= e +=C2=A0 automatic moves of semantic values on the right-hand sides of a rul= e. + =C2=A0 =C2=A0The `cex.timeout` %define variable allows to control when we g= ive up =C2=A0 =C2=A0finding a unifying counterexample.=C2=A0 For instance `bison -= Wcex =C2=A0 =C2=A0-Dcex.timeout=3D.5 gram.y` to limit to 1/2s. diff --git a/data/skeletons/c++.m4 b/data/skeletons/c++.m4 index fa26b069..61a49041 100644 --- a/data/skeletons/c++.m4 +++ b/data/skeletons/c++.m4 @@ -113,6 +113,8 @@ b4_percent_define_default([[define_location_comparison]= ], =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0[m4_if(b4_percent_define_get([[filename_type]]), =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [std::string], [[true]], [[fa= lse]])]) =C2=A0 +# api.value.automove boolean default value false +b4_percent_define_default([[api.value.automove]], [[false]]) =C2=A0 =C2=A0 =C2=A0## ----------- ## diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc index 9f60d2b4..c000a062 100644 --- a/data/skeletons/lalr1.cc +++ b/data/skeletons/lalr1.cc @@ -111,10 +111,9 @@ m4_define([_b4_rhs_value], =C2=A0[b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3], [$4])]) =C2=A0 =C2=A0m4_define([b4_rhs_value], -[b4_percent_define_ifdef([api.value.automove], -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[YY_MOVE (_b4_rhs_value($@))], -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[_b4_rhs_value($@)])]) - +[b4_percent_define_flag_if([api.value.automove], +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0[YY_MOVE (_b4_rhs_value($@))], +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0[_b4_rhs_value($@)])]) =C2=A0 =C2=A0# b4_rhs_location(RULE-LENGTH, POS) =C2=A0# --------------------------------- diff --git a/tests/c++.at b/tests/c++.at index 3a60fea4..b37724a3 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -240,6 +240,109 @@ AT_FOR_EACH_CXX([ =C2=A0AT_BISON_OPTION_POPDEFS =C2=A0AT_CLEANUP =C2=A0 +## --------------------------------------------------- ## +## All possible settings for api.value.automove.=C2=A0 =C2=A0 =C2=A0 =C2= =A0## +## --------------------------------------------------- ## + +AT_SETUP([Check omitted api.value.automove default value]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) + +AT_DATA_GRAMMAR([input.yy], +[[%skeleton "lalr1.cc" +%language "c++" +%token <int> VAL +%nterm <int> exp +%% +exp: VAL +]]) + +AT_BISON_CHECK([-o input.cc input.yy]) +AT_CHECK([grep 'yylhs\.value\.int.*YY_MOVE *' input.cc], 1, [ignore]) + +AT_BISON_OPTION_POPDEFS +AT_CLEANUP + +AT_SETUP([Check api.value.automove defined with no value]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) + +AT_DATA_GRAMMAR([input.yy], +[[%skeleton "lalr1.cc" +%language "c++" +%define api.value.automove +%token <int> VAL +%nterm <int> exp +%% +exp: VAL +]]) + +AT_BISON_CHECK([-o input.cc input.yy]) +AT_CHECK([grep 'yylhs\.value\.int.*YY_MOVE *' input.cc], 0, [ignore]) + +AT_BISON_OPTION_POPDEFS +AT_CLEANUP + +AT_SETUP([Check api.value.automove true value]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) + +AT_DATA_GRAMMAR([input.yy], +[[%skeleton "lalr1.cc" +%language "c++" +%define api.value.automove true +%token <int> VAL +%nterm <int> exp +%% +exp: VAL +]]) + +AT_BISON_CHECK([-o input.cc input.yy]) +AT_CHECK([grep 'yylhs\.value\.int.*YY_MOVE *' input.cc], 0, [ignore]) + +AT_BISON_OPTION_POPDEFS +AT_CLEANUP + +AT_SETUP([Check api.value.automove false value]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) + +AT_DATA_GRAMMAR([input.yy], +[[%skeleton "lalr1.cc" +%language "c++" +%define api.value.automove false +%token <int> VAL +%nterm <int> exp +%% +exp: VAL +]]) + +AT_BISON_CHECK([-o input.cc input.yy]) +AT_CHECK([grep 'yylhs\.value\.int.*YY_MOVE *' input.cc], 1, [ignore]) + +AT_BISON_OPTION_POPDEFS +AT_CLEANUP + +AT_SETUP([Check api.value.automove empty string value]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) + +AT_DATA_GRAMMAR([input.yy], +[[%skeleton "lalr1.cc" +%language "c++" +%define api.value.automove "" +%token <int> VAL +%nterm <int> exp +%% +exp: VAL +]]) + +AT_BISON_CHECK([-o input.cc input.yy]) +AT_CHECK([grep 'yylhs\.value\.int.*YY_MOVE *' input.cc], 0, [ignore]) + +AT_BISON_OPTION_POPDEFS +AT_CLEANUP + =C2=A0## --------------------------------------------------- ## =C2=A0## Multiple occurrences of $n and api.value.automove.=C2=A0 ## =C2=A0## --------------------------------------------------- ## --=C2=A0 2.45.1 ------=_Part_540848_1298401476.1752363517591 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?UTF-8?b?em1hamVlZF9maXhfYXV0b21vdmVfZmFsc2VfZGlyZWN0aXZlLnBhdGNo?=" Content-ID: <[email protected]> RnJvbSA1NjNhOTBhY2NjZjYxMmNkNzVmNDYzYTQwN2UxN2NiYjgzYzFiNjkwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBaYXJ0YWogTWFqZWVkIDx6bWFqZWVkQHVzZXJzLm5vcmVwbHku Z2l0aHViLmNvbT4KRGF0ZTogU2F0LCAxMiBKdWwgMjAyNSAxNzo1MToyMSAtMDUwMApTdWJqZWN0 OiBbUEFUQ0hdIGMrKzogZml4ICVkZWZpbmUgYXBpLnZhbHVlLmF1dG9tb3ZlIGZhbHNlIHRvIGFj dHVhbGx5IGRpc2FibGUKIGF1dG9tb3ZlCgoqIEZpeGVzIGJ1ZyByZXBvcnRlZCBpbiBodHRwczov L2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1iaXNvbi8yMDI1LTA3L21zZzAwMDAyLmh0 bWwKKiBQcmV2aW91c2x5IGEgZmFsc2UgdmFsdWUgc3RpbGwgYXBwbGllZCBzdGQ6Om1vdmUgdG8g c2VtYW50aWMgdmFsdWVzIG9uCiAgdGhlIHJpZ2h0LWhhbmQgc2lkZXMgb2YgYSBydWxlLgoqIEFk ZGVkIHRlc3RzIGZvciBhbGwgNSBwb3NzaWJsZSBzZXR0aW5ncyBmb3IgYXBpLnZhbHVlLmF1dG9t b3ZlLgoqIEFkZGVkIE5FV1MgZW50cnkuCi0tLQogTkVXUyAgICAgICAgICAgICAgICAgICAgfCAg IDggKysrKwogZGF0YS9za2VsZXRvbnMvYysrLm00ICAgfCAgIDIgKwogZGF0YS9za2VsZXRvbnMv bGFscjEuY2MgfCAgIDcgKystCiB0ZXN0cy9jKysuYXQgICAgICAgICAgICB8IDEwMyArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDExNiBp bnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL05FV1MgYi9ORVdTCmlu ZGV4IGNkZWYzMjM4Li44YzdkZDZiYyAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBAIC0y LDYgKzIsMTQgQEAgR05VIEJpc29uIE5FV1MKIAogKiBOb3Rld29ydGh5IGNoYW5nZXMgaW4gcmVs ZWFzZSA/Lj8gKD8/Pz8tPz8tPz8pIFs/XQogCisqKiBCdWcgZml4ZXMKKworKioqIEJ1ZyBmaXhl cyBpbiBsYWxyMS5jYworCisgIFRoZSBgYXBpLnZhbHVlLmF1dG9tb3ZlYCAlZGVmaW5lIHZhcmlh YmxlIGRpZCBub3QgaG9ub3IgYW4gZXhwbGljaXQKKyAgZmFsc2UgdmFsdWUuIE5vdyBgJWRlZmlu ZSBhcGkudmFsdWUuYXV0b21vdmUgZmFsc2VgIGRvZXNuJ3QgZ2VuZXJhdGUKKyAgYXV0b21hdGlj IG1vdmVzIG9mIHNlbWFudGljIHZhbHVlcyBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlcyBvZiBhIHJ1 bGUuCisKICAgVGhlIGBjZXgudGltZW91dGAgJWRlZmluZSB2YXJpYWJsZSBhbGxvd3MgdG8gY29u dHJvbCB3aGVuIHdlIGdpdmUgdXAKICAgZmluZGluZyBhIHVuaWZ5aW5nIGNvdW50ZXJleGFtcGxl LiAgRm9yIGluc3RhbmNlIGBiaXNvbiAtV2NleAogICAtRGNleC50aW1lb3V0PS41IGdyYW0ueWAg dG8gbGltaXQgdG8gMS8ycy4KZGlmZiAtLWdpdCBhL2RhdGEvc2tlbGV0b25zL2MrKy5tNCBiL2Rh dGEvc2tlbGV0b25zL2MrKy5tNAppbmRleCBmYTI2YjA2OS4uNjFhNDkwNDEgMTAwNjQ0Ci0tLSBh L2RhdGEvc2tlbGV0b25zL2MrKy5tNAorKysgYi9kYXRhL3NrZWxldG9ucy9jKysubTQKQEAgLTEx Myw2ICsxMTMsOCBAQCBiNF9wZXJjZW50X2RlZmluZV9kZWZhdWx0KFtbZGVmaW5lX2xvY2F0aW9u X2NvbXBhcmlzb25dXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgW200X2lmKGI0X3BlcmNl bnRfZGVmaW5lX2dldChbW2ZpbGVuYW1lX3R5cGVdXSksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBbc3RkOjpzdHJpbmddLCBbW3RydWVdXSwgW1tmYWxzZV1dKV0pCiAKKyMgYXBp LnZhbHVlLmF1dG9tb3ZlIGJvb2xlYW4gZGVmYXVsdCB2YWx1ZSBmYWxzZQorYjRfcGVyY2VudF9k ZWZpbmVfZGVmYXVsdChbW2FwaS52YWx1ZS5hdXRvbW92ZV1dLCBbW2ZhbHNlXV0pCiAKIAogIyMg LS0tLS0tLS0tLS0gIyMKZGlmZiAtLWdpdCBhL2RhdGEvc2tlbGV0b25zL2xhbHIxLmNjIGIvZGF0 YS9za2VsZXRvbnMvbGFscjEuY2MKaW5kZXggOWY2MGQyYjQuLmMwMDBhMDYyIDEwMDY0NAotLS0g YS9kYXRhL3NrZWxldG9ucy9sYWxyMS5jYworKysgYi9kYXRhL3NrZWxldG9ucy9sYWxyMS5jYwpA QCAtMTExLDEwICsxMTEsOSBAQCBtNF9kZWZpbmUoW19iNF9yaHNfdmFsdWVdLAogW2I0X3N5bWJv bF92YWx1ZShbYjRfcmhzX2RhdGEoWyQxXSwgWyQyXSkudmFsdWVdLCBbJDNdLCBbJDRdKV0pCiAK IG00X2RlZmluZShbYjRfcmhzX3ZhbHVlXSwKLVtiNF9wZXJjZW50X2RlZmluZV9pZmRlZihbYXBp LnZhbHVlLmF1dG9tb3ZlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbWVlfTU9WRSAoX2I0 X3Joc192YWx1ZSgkQCkpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbX2I0X3Joc192YWx1 ZSgkQCldKV0pCi0KK1tiNF9wZXJjZW50X2RlZmluZV9mbGFnX2lmKFthcGkudmFsdWUuYXV0b21v dmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW1lZX01PVkUgKF9iNF9yaHNfdmFsdWUo JEApKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbX2I0X3Joc192YWx1ZSgkQCldKV0p CiAKICMgYjRfcmhzX2xvY2F0aW9uKFJVTEUtTEVOR1RILCBQT1MpCiAjIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvYysrLmF0IGIvdGVzdHMvYysr LmF0CmluZGV4IDNhNjBmZWE0Li5iMzc3MjRhMyAxMDA2NDQKLS0tIGEvdGVzdHMvYysrLmF0Cisr KyBiL3Rlc3RzL2MrKy5hdApAQCAtMjQwLDYgKzI0MCwxMDkgQEAgQVRfRk9SX0VBQ0hfQ1hYKFsK IEFUX0JJU09OX09QVElPTl9QT1BERUZTCiBBVF9DTEVBTlVQCiAKKyMjIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQWxsIHBvc3NpYmxl IHNldHRpbmdzIGZvciBhcGkudmFsdWUuYXV0b21vdmUuICAgICAgICMjCisjIyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworQVRfU0VUVVAo W0NoZWNrIG9taXR0ZWQgYXBpLnZhbHVlLmF1dG9tb3ZlIGRlZmF1bHQgdmFsdWVdKQorCitBVF9C SVNPTl9PUFRJT05fUFVTSERFRlMoWyVza2VsZXRvbiAibGFscjEuY2MiXSkKKworQVRfREFUQV9H UkFNTUFSKFtpbnB1dC55eV0sCitbWyVza2VsZXRvbiAibGFscjEuY2MiCislbGFuZ3VhZ2UgImMr KyIKKyV0b2tlbiA8aW50PiBWQUwKKyVudGVybSA8aW50PiBleHAKKyUlCitleHA6IFZBTAorXV0p CisKK0FUX0JJU09OX0NIRUNLKFstbyBpbnB1dC5jYyBpbnB1dC55eV0pCitBVF9DSEVDSyhbZ3Jl cCAneXlsaHNcLnZhbHVlXC5pbnQuKllZX01PVkUgKicgaW5wdXQuY2NdLCAxLCBbaWdub3JlXSkK KworQVRfQklTT05fT1BUSU9OX1BPUERFRlMKK0FUX0NMRUFOVVAKKworQVRfU0VUVVAoW0NoZWNr IGFwaS52YWx1ZS5hdXRvbW92ZSBkZWZpbmVkIHdpdGggbm8gdmFsdWVdKQorCitBVF9CSVNPTl9P UFRJT05fUFVTSERFRlMoWyVza2VsZXRvbiAibGFscjEuY2MiXSkKKworQVRfREFUQV9HUkFNTUFS KFtpbnB1dC55eV0sCitbWyVza2VsZXRvbiAibGFscjEuY2MiCislbGFuZ3VhZ2UgImMrKyIKKyVk ZWZpbmUgYXBpLnZhbHVlLmF1dG9tb3ZlCisldG9rZW4gPGludD4gVkFMCislbnRlcm0gPGludD4g ZXhwCislJQorZXhwOiBWQUwKK11dKQorCitBVF9CSVNPTl9DSEVDSyhbLW8gaW5wdXQuY2MgaW5w dXQueXldKQorQVRfQ0hFQ0soW2dyZXAgJ3l5bGhzXC52YWx1ZVwuaW50LipZWV9NT1ZFIConIGlu cHV0LmNjXSwgMCwgW2lnbm9yZV0pCisKK0FUX0JJU09OX09QVElPTl9QT1BERUZTCitBVF9DTEVB TlVQCisKK0FUX1NFVFVQKFtDaGVjayBhcGkudmFsdWUuYXV0b21vdmUgdHJ1ZSB2YWx1ZV0pCisK K0FUX0JJU09OX09QVElPTl9QVVNIREVGUyhbJXNrZWxldG9uICJsYWxyMS5jYyJdKQorCitBVF9E QVRBX0dSQU1NQVIoW2lucHV0Lnl5XSwKK1tbJXNrZWxldG9uICJsYWxyMS5jYyIKKyVsYW5ndWFn ZSAiYysrIgorJWRlZmluZSBhcGkudmFsdWUuYXV0b21vdmUgdHJ1ZQorJXRva2VuIDxpbnQ+IFZB TAorJW50ZXJtIDxpbnQ+IGV4cAorJSUKK2V4cDogVkFMCitdXSkKKworQVRfQklTT05fQ0hFQ0so Wy1vIGlucHV0LmNjIGlucHV0Lnl5XSkKK0FUX0NIRUNLKFtncmVwICd5eWxoc1wudmFsdWVcLmlu dC4qWVlfTU9WRSAqJyBpbnB1dC5jY10sIDAsIFtpZ25vcmVdKQorCitBVF9CSVNPTl9PUFRJT05f UE9QREVGUworQVRfQ0xFQU5VUAorCitBVF9TRVRVUChbQ2hlY2sgYXBpLnZhbHVlLmF1dG9tb3Zl IGZhbHNlIHZhbHVlXSkKKworQVRfQklTT05fT1BUSU9OX1BVU0hERUZTKFslc2tlbGV0b24gImxh bHIxLmNjIl0pCisKK0FUX0RBVEFfR1JBTU1BUihbaW5wdXQueXldLAorW1slc2tlbGV0b24gImxh bHIxLmNjIgorJWxhbmd1YWdlICJjKysiCislZGVmaW5lIGFwaS52YWx1ZS5hdXRvbW92ZSBmYWxz ZQorJXRva2VuIDxpbnQ+IFZBTAorJW50ZXJtIDxpbnQ+IGV4cAorJSUKK2V4cDogVkFMCitdXSkK KworQVRfQklTT05fQ0hFQ0soWy1vIGlucHV0LmNjIGlucHV0Lnl5XSkKK0FUX0NIRUNLKFtncmVw ICd5eWxoc1wudmFsdWVcLmludC4qWVlfTU9WRSAqJyBpbnB1dC5jY10sIDEsIFtpZ25vcmVdKQor CitBVF9CSVNPTl9PUFRJT05fUE9QREVGUworQVRfQ0xFQU5VUAorCitBVF9TRVRVUChbQ2hlY2sg YXBpLnZhbHVlLmF1dG9tb3ZlIGVtcHR5IHN0cmluZyB2YWx1ZV0pCisKK0FUX0JJU09OX09QVElP Tl9QVVNIREVGUyhbJXNrZWxldG9uICJsYWxyMS5jYyJdKQorCitBVF9EQVRBX0dSQU1NQVIoW2lu cHV0Lnl5XSwKK1tbJXNrZWxldG9uICJsYWxyMS5jYyIKKyVsYW5ndWFnZSAiYysrIgorJWRlZmlu ZSBhcGkudmFsdWUuYXV0b21vdmUgIiIKKyV0b2tlbiA8aW50PiBWQUwKKyVudGVybSA8aW50PiBl eHAKKyUlCitleHA6IFZBTAorXV0pCisKK0FUX0JJU09OX0NIRUNLKFstbyBpbnB1dC5jYyBpbnB1 dC55eV0pCitBVF9DSEVDSyhbZ3JlcCAneXlsaHNcLnZhbHVlXC5pbnQuKllZX01PVkUgKicgaW5w dXQuY2NdLCAwLCBbaWdub3JlXSkKKworQVRfQklTT05fT1BUSU9OX1BPUERFRlMKK0FUX0NMRUFO VVAKKwogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tICMjCiAjIyBNdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAkbiBhbmQgYXBpLnZhbHVlLmF1dG9t b3ZlLiAgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSAjIwotLSAKMi40NS4xCgo= ------=_Part_540848_1298401476.1752363517591--