From 94a98f2c63926c5eafe12a717f3eef38f05fe99e Mon Sep 17 00:00:00 2001
From: Derick Rethans <github@derickrethans.nl>
Date: Fri, 12 Oct 2018 11:41:05 +0100
Subject: [PATCH] Upgrade timelib to 2017.08, to fix bug #77007

---
 NEWS                               |   3 +
 ext/date/lib/parse_date.c          | 104 ++++++++++++++---------------
 ext/date/lib/parse_iso_intervals.c |  22 +++---
 ext/date/lib/timelib.h             |   6 +-
 ext/date/lib/tm2unixtime.c         |   3 +-
 5 files changed, 71 insertions(+), 67 deletions(-)

diff --git a/NEWS b/NEWS
index f3cff388ab..779ba6be5d 100644
--- a/NEWS
+++ b/NEWS
@@ -8,8 +8,11 @@ PHP                                                                        NEWS
   . Fixed bug #76946 (Cyclic reference in generator not detected). (Nikita)
 
 - Date:
+  . Upgraded timelib to 2017.08. (Derick)
   . Fixed bug #75851 (Year component overflow with date formats "c", "o", "r"
     and "y"). (Adam Saponara)
+  . Fixed bug #77007 (fractions in `diff()` are not correctly normalized).
+    (Derick)
 
 - FCGI:
   . Fixed #76948 (Failed shutdown/reboot or end session in Windows). (Anatol)
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index c0f6b96d9c..e2f9cb822f 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -1,5 +1,5 @@
-/* Generated by re2c 0.15.3 on Wed Jan 31 11:51:51 2018 */
-#line 1 "ext/date/lib/parse_date.re"
+/* Generated by re2c 0.15.3 on Fri Oct 12 10:49:04 2018 */
+#line 1 "parse_date.re"
 /*
  * The MIT License (MIT)
  *
@@ -854,7 +854,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 std:
 	s->tok = cursor;
 	s->len = 0;
-#line 981 "ext/date/lib/parse_date.re"
+#line 981 "parse_date.re"
 
 
 
@@ -996,7 +996,7 @@ yy2:
 	}
 yy3:
 	YYDEBUG(3, *YYCURSOR);
-#line 1689 "ext/date/lib/parse_date.re"
+#line 1689 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("tzcorrection | tz");
@@ -1318,7 +1318,7 @@ yy11:
 	if (yych <= '9') goto yy1377;
 yy12:
 	YYDEBUG(12, *YYCURSOR);
-#line 1784 "ext/date/lib/parse_date.re"
+#line 1784 "parse_date.re"
 	{
 		add_error(s, TIMELIB_ERR_UNEXPECTED_CHARACTER, "Unexpected character");
 		goto std;
@@ -2567,7 +2567,7 @@ yy48:
 	if (yych <= '9') goto yy54;
 yy49:
 	YYDEBUG(49, *YYCURSOR);
-#line 1773 "ext/date/lib/parse_date.re"
+#line 1773 "parse_date.re"
 	{
 		goto std;
 	}
@@ -2580,7 +2580,7 @@ yy51:
 	YYDEBUG(51, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(52, *YYCURSOR);
-#line 1778 "ext/date/lib/parse_date.re"
+#line 1778 "parse_date.re"
 	{
 		s->pos = cursor; s->line++;
 		goto std;
@@ -3021,7 +3021,7 @@ yy73:
 	if (yych == 's') goto yy75;
 yy74:
 	YYDEBUG(74, *YYCURSOR);
-#line 1757 "ext/date/lib/parse_date.re"
+#line 1757 "parse_date.re"
 	{
 		timelib_ull i;
 		DEBUG_OUTPUT("relative");
@@ -3939,7 +3939,7 @@ yy190:
 	}
 yy191:
 	YYDEBUG(191, *YYCURSOR);
-#line 1620 "ext/date/lib/parse_date.re"
+#line 1620 "parse_date.re"
 	{
 		const timelib_relunit* relunit;
 		DEBUG_OUTPUT("daytext");
@@ -4476,7 +4476,7 @@ yy217:
 	}
 yy218:
 	YYDEBUG(218, *YYCURSOR);
-#line 1679 "ext/date/lib/parse_date.re"
+#line 1679 "parse_date.re"
 	{
 		DEBUG_OUTPUT("monthtext");
 		TIMELIB_INIT;
@@ -4734,7 +4734,7 @@ yy231:
 	goto yy237;
 yy232:
 	YYDEBUG(232, *YYCURSOR);
-#line 1425 "ext/date/lib/parse_date.re"
+#line 1425 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datetextual | datenoyear");
@@ -4874,7 +4874,7 @@ yy245:
 	}
 yy246:
 	YYDEBUG(246, *YYCURSOR);
-#line 1727 "ext/date/lib/parse_date.re"
+#line 1727 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
@@ -5201,7 +5201,7 @@ yy270:
 	YYDEBUG(270, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(271, *YYCURSOR);
-#line 1703 "ext/date/lib/parse_date.re"
+#line 1703 "parse_date.re"
 	{
 		DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12");
 		TIMELIB_INIT;
@@ -5831,7 +5831,7 @@ yy320:
 	YYDEBUG(321, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(322, *YYCURSOR);
-#line 1397 "ext/date/lib/parse_date.re"
+#line 1397 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datenoday");
@@ -6075,7 +6075,7 @@ yy327:
 	if (yych <= '9') goto yy331;
 yy330:
 	YYDEBUG(330, *YYCURSOR);
-#line 1541 "ext/date/lib/parse_date.re"
+#line 1541 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgtextshort");
@@ -6670,7 +6670,7 @@ yy356:
 	}
 yy357:
 	YYDEBUG(357, *YYCURSOR);
-#line 1599 "ext/date/lib/parse_date.re"
+#line 1599 "parse_date.re"
 	{
 		DEBUG_OUTPUT("ago");
 		TIMELIB_INIT;
@@ -8473,7 +8473,7 @@ yy418:
 	++YYCURSOR;
 yy419:
 	YYDEBUG(419, *YYCURSOR);
-#line 1302 "ext/date/lib/parse_date.re"
+#line 1302 "parse_date.re"
 	{
 		DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash");
 		TIMELIB_INIT;
@@ -9128,7 +9128,7 @@ yy439:
 	}
 yy440:
 	YYDEBUG(440, *YYCURSOR);
-#line 1439 "ext/date/lib/parse_date.re"
+#line 1439 "parse_date.re"
 	{
 		DEBUG_OUTPUT("datenoyearrev");
 		TIMELIB_INIT;
@@ -9280,7 +9280,7 @@ yy452:
 	YYDEBUG(452, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(453, *YYCURSOR);
-#line 1157 "ext/date/lib/parse_date.re"
+#line 1157 "parse_date.re"
 	{
 		DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12");
 		TIMELIB_INIT;
@@ -9309,7 +9309,7 @@ yy454:
 	}
 yy455:
 	YYDEBUG(455, *YYCURSOR);
-#line 1194 "ext/date/lib/parse_date.re"
+#line 1194 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
@@ -9644,7 +9644,7 @@ yy487:
 	YYDEBUG(487, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(488, *YYCURSOR);
-#line 1174 "ext/date/lib/parse_date.re"
+#line 1174 "parse_date.re"
 	{
 		DEBUG_OUTPUT("mssqltime");
 		TIMELIB_INIT;
@@ -9769,7 +9769,7 @@ yy498:
 	if (yych <= '9') goto yy505;
 yy499:
 	YYDEBUG(499, *YYCURSOR);
-#line 1356 "ext/date/lib/parse_date.re"
+#line 1356 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datefull");
@@ -10519,7 +10519,7 @@ yy569:
 	YYDEBUG(570, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(571, *YYCURSOR);
-#line 1371 "ext/date/lib/parse_date.re"
+#line 1371 "parse_date.re"
 	{
 		DEBUG_OUTPUT("pointed date YYYY");
 		TIMELIB_INIT;
@@ -10566,7 +10566,7 @@ yy575:
 	if (yych <= '9') goto yy569;
 yy576:
 	YYDEBUG(576, *YYCURSOR);
-#line 1383 "ext/date/lib/parse_date.re"
+#line 1383 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pointed date YY");
@@ -11220,7 +11220,7 @@ yy620:
 	}
 yy621:
 	YYDEBUG(621, *YYCURSOR);
-#line 1342 "ext/date/lib/parse_date.re"
+#line 1342 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("gnudateshort");
@@ -11339,7 +11339,7 @@ yy630:
 	}
 yy631:
 	YYDEBUG(631, *YYCURSOR);
-#line 1286 "ext/date/lib/parse_date.re"
+#line 1286 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("americanshort | american");
@@ -11587,7 +11587,7 @@ yy664:
 	if (yych <= ':') goto yy668;
 yy665:
 	YYDEBUG(665, *YYCURSOR);
-#line 1569 "ext/date/lib/parse_date.re"
+#line 1569 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("clf");
@@ -12157,7 +12157,7 @@ yy727:
 	}
 yy728:
 	YYDEBUG(728, *YYCURSOR);
-#line 1314 "ext/date/lib/parse_date.re"
+#line 1314 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("iso8601date2");
@@ -12209,7 +12209,7 @@ yy735:
 	YYDEBUG(735, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(736, *YYCURSOR);
-#line 1555 "ext/date/lib/parse_date.re"
+#line 1555 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgtextreverse");
@@ -12387,7 +12387,7 @@ yy747:
 	}
 yy748:
 	YYDEBUG(748, *YYCURSOR);
-#line 1590 "ext/date/lib/parse_date.re"
+#line 1590 "parse_date.re"
 	{
 		DEBUG_OUTPUT("year4");
 		TIMELIB_INIT;
@@ -12600,7 +12600,7 @@ yy757:
 	}
 yy758:
 	YYDEBUG(758, *YYCURSOR);
-#line 1411 "ext/date/lib/parse_date.re"
+#line 1411 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datenodayrev");
@@ -12834,7 +12834,7 @@ yy778:
 	if (yych <= '7') goto yy781;
 yy779:
 	YYDEBUG(779, *YYCURSOR);
-#line 1522 "ext/date/lib/parse_date.re"
+#line 1522 "parse_date.re"
 	{
 		timelib_sll w, d;
 		DEBUG_OUTPUT("isoweek");
@@ -12862,7 +12862,7 @@ yy781:
 	YYDEBUG(781, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(782, *YYCURSOR);
-#line 1503 "ext/date/lib/parse_date.re"
+#line 1503 "parse_date.re"
 	{
 		timelib_sll w, d;
 		DEBUG_OUTPUT("isoweekday");
@@ -12950,7 +12950,7 @@ yy785:
 	}
 yy786:
 	YYDEBUG(786, *YYCURSOR);
-#line 1489 "ext/date/lib/parse_date.re"
+#line 1489 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgydotd");
@@ -13066,7 +13066,7 @@ yy806:
 	++YYCURSOR;
 yy807:
 	YYDEBUG(807, *YYCURSOR);
-#line 1463 "ext/date/lib/parse_date.re"
+#line 1463 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif");
@@ -13386,7 +13386,7 @@ yy812:
 	}
 yy813:
 	YYDEBUG(813, *YYCURSOR);
-#line 1451 "ext/date/lib/parse_date.re"
+#line 1451 "parse_date.re"
 	{
 		DEBUG_OUTPUT("datenocolon");
 		TIMELIB_INIT;
@@ -14316,7 +14316,7 @@ yy937:
 	if (yych <= '9') goto yy960;
 yy938:
 	YYDEBUG(938, *YYCURSOR);
-#line 1328 "ext/date/lib/parse_date.re"
+#line 1328 "parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("gnudateshorter");
@@ -15422,7 +15422,7 @@ yy1030:
 	}
 yy1032:
 	YYDEBUG(1032, *YYCURSOR);
-#line 1220 "ext/date/lib/parse_date.re"
+#line 1220 "parse_date.re"
 	{
 		DEBUG_OUTPUT("gnunocolon");
 		TIMELIB_INIT;
@@ -15542,7 +15542,7 @@ yy1039:
 	}
 yy1040:
 	YYDEBUG(1040, *YYCURSOR);
-#line 1266 "ext/date/lib/parse_date.re"
+#line 1266 "parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("iso8601nocolon");
@@ -16537,7 +16537,7 @@ yy1083:
 	}
 yy1084:
 	YYDEBUG(1084, *YYCURSOR);
-#line 1662 "ext/date/lib/parse_date.re"
+#line 1662 "parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -16604,7 +16604,7 @@ yy1092:
 	YYDEBUG(1092, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1093, *YYCURSOR);
-#line 1135 "ext/date/lib/parse_date.re"
+#line 1135 "parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -16733,7 +16733,7 @@ yy1107:
 	}
 yy1108:
 	YYDEBUG(1108, *YYCURSOR);
-#line 1638 "ext/date/lib/parse_date.re"
+#line 1638 "parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -19605,7 +19605,7 @@ yy1283:
 	}
 yy1284:
 	YYDEBUG(1284, *YYCURSOR);
-#line 1112 "ext/date/lib/parse_date.re"
+#line 1112 "parse_date.re"
 	{
 		DEBUG_OUTPUT("backof | frontof");
 		TIMELIB_INIT;
@@ -19926,7 +19926,7 @@ yy1306:
 	YYDEBUG(1306, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1307, *YYCURSOR);
-#line 1095 "ext/date/lib/parse_date.re"
+#line 1095 "parse_date.re"
 	{
 		DEBUG_OUTPUT("firstdayof | lastdayof");
 		TIMELIB_INIT;
@@ -21431,7 +21431,7 @@ yy1377:
 	if (yych <= '9') goto yy1377;
 yy1379:
 	YYDEBUG(1379, *YYCURSOR);
-#line 1041 "ext/date/lib/parse_date.re"
+#line 1041 "parse_date.re"
 	{
 		timelib_ull i;
 
@@ -21485,7 +21485,7 @@ yy1380:
 	YYDEBUG(1386, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1387, *YYCURSOR);
-#line 1067 "ext/date/lib/parse_date.re"
+#line 1067 "parse_date.re"
 	{
 		timelib_ull i, us;
 
@@ -21948,7 +21948,7 @@ yy1416:
 	++YYCURSOR;
 yy1417:
 	YYDEBUG(1417, *YYCURSOR);
-#line 1029 "ext/date/lib/parse_date.re"
+#line 1029 "parse_date.re"
 	{
 		DEBUG_OUTPUT("tomorrow");
 		TIMELIB_INIT;
@@ -21994,7 +21994,7 @@ yy1419:
 	}
 yy1420:
 	YYDEBUG(1420, *YYCURSOR);
-#line 1019 "ext/date/lib/parse_date.re"
+#line 1019 "parse_date.re"
 	{
 		DEBUG_OUTPUT("midnight | today");
 		TIMELIB_INIT;
@@ -24015,7 +24015,7 @@ yy1499:
 	}
 yy1500:
 	YYDEBUG(1500, *YYCURSOR);
-#line 998 "ext/date/lib/parse_date.re"
+#line 998 "parse_date.re"
 	{
 		DEBUG_OUTPUT("now");
 		TIMELIB_INIT;
@@ -24162,7 +24162,7 @@ yy1507:
 	}
 yy1508:
 	YYDEBUG(1508, *YYCURSOR);
-#line 1007 "ext/date/lib/parse_date.re"
+#line 1007 "parse_date.re"
 	{
 		DEBUG_OUTPUT("noon");
 		TIMELIB_INIT;
@@ -24706,7 +24706,7 @@ yy1530:
 	++YYCURSOR;
 yy1531:
 	YYDEBUG(1531, *YYCURSOR);
-#line 986 "ext/date/lib/parse_date.re"
+#line 986 "parse_date.re"
 	{
 		DEBUG_OUTPUT("yesterday");
 		TIMELIB_INIT;
@@ -24890,7 +24890,7 @@ yy1537:
 		goto yy1531;
 	}
 }
-#line 1788 "ext/date/lib/parse_date.re"
+#line 1788 "parse_date.re"
 
 }
 
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
index 17d09c17ff..7b55ce78d7 100644
--- a/ext/date/lib/parse_iso_intervals.c
+++ b/ext/date/lib/parse_iso_intervals.c
@@ -1,5 +1,5 @@
-/* Generated by re2c 0.15.3 on Wed Jan 31 11:51:44 2018 */
-#line 1 "ext/date/lib/parse_iso_intervals.re"
+/* Generated by re2c 0.15.3 on Tue Oct  9 11:04:12 2018 */
+#line 1 "parse_iso_intervals.re"
 /*
  * The MIT License (MIT)
  *
@@ -176,7 +176,7 @@ static int scan(Scanner *s)
 std:
 	s->tok = cursor;
 	s->len = 0;
-#line 204 "ext/date/lib/parse_iso_intervals.re"
+#line 204 "parse_iso_intervals.re"
 
 
 
@@ -249,7 +249,7 @@ std:
 	if (yych <= '9') goto yy98;
 yy3:
 	YYDEBUG(3, *YYCURSOR);
-#line 317 "ext/date/lib/parse_iso_intervals.re"
+#line 317 "parse_iso_intervals.re"
 	{
 		add_error(s, "Unexpected character");
 		goto std;
@@ -271,7 +271,7 @@ yy5:
 	if (yych == 'T') goto yy14;
 yy6:
 	YYDEBUG(6, *YYCURSOR);
-#line 244 "ext/date/lib/parse_iso_intervals.re"
+#line 244 "parse_iso_intervals.re"
 	{
 		timelib_sll nr;
 		int         in_time = 0;
@@ -317,7 +317,7 @@ yy7:
 	YYDEBUG(7, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(8, *YYCURSOR);
-#line 306 "ext/date/lib/parse_iso_intervals.re"
+#line 306 "parse_iso_intervals.re"
 	{
 		goto std;
 	}
@@ -326,7 +326,7 @@ yy9:
 	YYDEBUG(9, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(10, *YYCURSOR);
-#line 311 "ext/date/lib/parse_iso_intervals.re"
+#line 311 "parse_iso_intervals.re"
 	{
 		s->pos = cursor; s->line++;
 		goto std;
@@ -661,7 +661,7 @@ yy51:
 	YYDEBUG(57, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(58, *YYCURSOR);
-#line 286 "ext/date/lib/parse_iso_intervals.re"
+#line 286 "parse_iso_intervals.re"
 	{
 		DEBUG_OUTPUT("combinedrep");
 		TIMELIB_INIT;
@@ -809,7 +809,7 @@ yy83:
 	YYDEBUG(83, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(84, *YYCURSOR);
-#line 220 "ext/date/lib/parse_iso_intervals.re"
+#line 220 "parse_iso_intervals.re"
 	{
 		timelib_time *current;
 
@@ -910,7 +910,7 @@ yy98:
 	if (yych <= '9') goto yy98;
 yy100:
 	YYDEBUG(100, *YYCURSOR);
-#line 209 "ext/date/lib/parse_iso_intervals.re"
+#line 209 "parse_iso_intervals.re"
 	{
 		DEBUG_OUTPUT("recurrences");
 		TIMELIB_INIT;
@@ -922,7 +922,7 @@ yy100:
 	}
 #line 924 "<stdout>"
 }
-#line 321 "ext/date/lib/parse_iso_intervals.re"
+#line 321 "parse_iso_intervals.re"
 
 }
 #ifdef PHP_WIN32
diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h
index 3eb39a5569..20fbb7cb14 100644
--- a/ext/date/lib/timelib.h
+++ b/ext/date/lib/timelib.h
@@ -310,9 +310,9 @@ typedef struct _timelib_tzdb {
 # define timelib_free    free
 #endif
 
-#define TIMELIB_VERSION 201706
-#define TIMELIB_EXTENDED_VERSION 20170600
-#define TIMELIB_ASCII_VERSION "2017.06"
+#define TIMELIB_VERSION 201708
+#define TIMELIB_EXTENDED_VERSION 20170800
+#define TIMELIB_ASCII_VERSION "2017.08"
 
 #define TIMELIB_NONE             0x00
 #define TIMELIB_OVERRIDE_TIME    0x01
diff --git a/ext/date/lib/tm2unixtime.c b/ext/date/lib/tm2unixtime.c
index 42a59cfaa6..bfb9ba1d2b 100644
--- a/ext/date/lib/tm2unixtime.c
+++ b/ext/date/lib/tm2unixtime.c
@@ -39,7 +39,7 @@ static void do_range_limit_fraction(timelib_sll *fraction, timelib_sll *seconds)
 		*fraction += 1000000;
 		*seconds -= 1;
 	}
-	if (*fraction > 1000000) {
+	if (*fraction >= 1000000) {
 		*fraction -= 1000000;
 		*seconds += 1;
 	}
@@ -194,6 +194,7 @@ static void do_adjust_for_weekday(timelib_time* time)
 
 void timelib_do_rel_normalize(timelib_time *base, timelib_rel_time *rt)
 {
+	do_range_limit_fraction(&rt->us, &rt->s);
 	do_range_limit(0, 60, 60, &rt->s, &rt->i);
 	do_range_limit(0, 60, 60, &rt->i, &rt->h);
 	do_range_limit(0, 24, 24, &rt->h, &rt->d);
-- 
2.40.0