Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRaX3-002UfR-2C for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 19:00:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRaX1-001tgc-23 for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 19:00:08 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRaX0-001tgU-2t for pgsql-hackers@lists.postgresql.org; Mon, 25 May 2026 19:00:08 +0000 Received: from mail-ej1-x62c.google.com ([2a00:1450:4864:20::62c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wRaWx-00000000k66-0XME for pgsql-hackers@lists.postgresql.org; Mon, 25 May 2026 19:00:06 +0000 Received: by mail-ej1-x62c.google.com with SMTP id a640c23a62f3a-bcd3c190f71so1592630866b.0 for ; Mon, 25 May 2026 12:00:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779735602; cv=none; d=google.com; s=arc-20240605; b=NIyew76cKfqbcglUkP3yxTMoTm7LMOLTGRb3D4z9zjyxc8ibZAO/4aeBQmrbM5SPOv iFe3j4tFjvJlVzBC6gsFRBBPL8n3+FMx2P6DiSIEE67QYXR5sTmlQZn0TK/2sbyv/+9S CSm5JBornO/+gSAMsptkWbabkPHtDvMpdzzh2DEHCwsQhp0C3EsI8SPDfe4cnaP1Q+kZ Kgk7JR0ZwBs4TeKavXjXpVusyZcx11GrsBw7N8pj9P5Vlt6n/UH++JBCegNsBZ4Dsb2w B65MwQFAtPqOfNKh4QLI+a/jDbZfNqdyL2HGXcVLbcdX1yk4vKT3fmcvwzheQCk/DjIT CmQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=7HGaKZii5AVSEDE387hhOAOK/fnKJTpPj0Jnov6y6X4=; fh=3tua0wcn/C5Dc0XLiSlYBp5wNTtNAOyIii2digY4lCM=; b=NsNiYtxgBmRMZjC/Q2Mrtpr1kStMmkXYc04gn2RYi9Ks9SItEiRcBhpO1nqh1w2CGl +JwbN68Kxic1HlQ6CmZ+OxYycL7HJVxIAjDXX918B4C32OcKb+/3P+SHdtR8hcmMy3QW +i4Er5gK2uhZFhSXR4v/4fvGEOFvfQhiBvpMIgt8jGRUifxxMuRge5WjbHcDmqlWA8Bc Pw0YH7IIXdUWbjRHHKz1feWocznPWw7wBHc+Ytf6/G7GRmhS8VCVdalfYJEkYyXXpUgw 1kqJqVBlfcp9lnitXFpvY/iF0y+kom7SucenweGS3gSZsW2Lnxz+lCxK2arHEn2IfFMA FstA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779735601; x=1780340401; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=7HGaKZii5AVSEDE387hhOAOK/fnKJTpPj0Jnov6y6X4=; b=Z+osg+YYtBjIaLYhnKFKSzpwe8jCXglShsh+CHzSaqdRv3wOgSVPl6umTXOv5KKBeB WpGJjtzlWKGh20edzcj6T4AKiYkt0LD3LtZvm1vVCEs801dkjwgFmAyCWf6vWAvxxyuA k+lV6jwy3C/C90jq/8zr2tGMS11rBatg3LFxwc35Dybg1DKsLKd++hNnJCloaTohM3Z5 j4skLSDYAj2l2vZimgJxpPq8Dk6ajI9zYjW9WHQLI+wzTodsguXm+W3L6YuOFWuQeGoG xl7MGPup3sQRDqeK+3u5C02xkXWjJ3F879Ed00KbYDOvVKoAEodyR0EPQtFXi0GtZL/g /VPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779735601; x=1780340401; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=7HGaKZii5AVSEDE387hhOAOK/fnKJTpPj0Jnov6y6X4=; b=U/sUl+w8drZrcI8tzCkRaqLIDQaPC/aFJuWh57U5Jhfauzb1tSoqppjB3uTsKq4d3b M/IggtMeIf7sdEqEojdFdDe52G+iNZ/eGZqPAcTw+s7JNcqEEVOjT1msjgJhK+vATZPX 0HoMTnPQxsNhlNTZeYsu1lP6oWt6rxvsT42byF0a1Q+XKVhRNdlGKpX9yFReOpmcJ4o3 GR47KvLdJ5lfJNLtQ3kFUHcnOAk4RSdeqAUjV+C1JDbaFAFnSnIyxJYhhPeqAwaDyS5l eSuwJDHaRMERpsN2SYI6WV/GJE0vcegjR3m9QLs7cOllnhcktxSSO6LMYAGrA0ecHzX1 8dbg== X-Forwarded-Encrypted: i=1; AFNElJ/gyU0JZeUN48LF6DAkBaDipVrJ2/qk/uGy2COOWF8KZvDpLntmDfpDh16NEfx86IpHIkYqwmSqUfpiq9Vk@lists.postgresql.org X-Gm-Message-State: AOJu0YzmKtiAN/K7O8UW9dGYDc7tzaJDX597sNDXBrMERIXoL9HtrCSn w7suUWQ/wlVEowpaR7QiDbgdLHWTKN4A2Wyvms+RSgLHeteDXxtiFJhLz3SMUX8dqNcvZQKD0Oq kxETa6w7fa9F+48h++CC824sEOCnRIEk= X-Gm-Gg: Acq92OEH+xNXWm8OfSVziPqZcMx+PDZSmZhQV2W9MGrIlDnIEIUbUEYPLj2i3Rhf2vp B2cwht51KqXNERhrrbmoJsNQbryp1de+JoBfT9xKdEbrjqfAFjg68NZn0BCzBYnPBvPilUk8CdL tknAomh7hBOfjVB+N6JGRfV+hXLdGOJ6IJEW0+iBCLylkRdsCr9S2H6TdZmBC1+U22Nfl7VsZN0 r8RwrYMYh3OEZt55q9i1xC3XJX4tbExO3G9dUMF9J/je4BDRs1AA2yS8RnBQO4/6Iwrk7t8JAdS jx2yJ3Q= X-Received: by 2002:a17:907:960a:b0:bcd:c899:904e with SMTP id a640c23a62f3a-bdd23cfd87dmr820815766b.7.1779735601242; Mon, 25 May 2026 12:00:01 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Mats Kindahl Date: Mon, 25 May 2026 20:59:47 +0200 X-Gm-Features: AVHnY4IYk5QqQH0gmkWygXGrNfIMNDzPRe0hs5OL37t-RM9c7cAd7ta0_tYmBbo Message-ID: Subject: Re: pg_rewind does not rewind diverging timelines To: Japin Li Cc: surya poondla , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000004ea5410652a8fc31" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000004ea5410652a8fc31 Content-Type: multipart/alternative; boundary="0000000000004ea53f0652a8fc2f" --0000000000004ea53f0652a8fc2f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Japin, On Mon, May 25, 2026 at 7:21=E2=80=AFAM Japin Li wrot= e: > > Hi, Mats > > On Sun, 24 May 2026 at 20:30, Mats Kindahl wrote= : > > On Fri, May 22, 2026 at 12:09=E2=80=AFAM surya poondla > wrote: > > > > Hi Mats, > > > > Thanks for picking this up -- the scenario is a real one and I think > the UUID-tagging approach is a clean way to > > solve it. v2 applies and builds without trouble, and the core algorith= m > reads well to me. > > I have a handful of observations that I'd love your thoughts. > > > > Hi Surya, > > > > Thank you for the review. It is a quite rare scenario, but it is real > and the fix is simple. > > > > Regarding Correctness I have the below thoughts > > > > 1. UUIDv7 timestamp epoch. > > In StartupXLOG(): > > TimestampTz now =3D GetCurrentTimestamp(); > > generate_uuidv7_r(&uuid_buf, (uint64)(now / 1000), > > (uint32)(now % 1000) * 1000); > > > > I think there might be a small mismatch here: GetCurrentTimestamp() > returns microseconds since the Postgres epoch > > (2000-01-01), > > whereas generate_uuidv7_r describes its first argument as milliseconds > since the Unix epoch. > > As written that 30-year offset would land in the UUID's timestamp > field, so the resulting UUID wouldn't be a > > conformant UUIDv7 and wouldn't > > time-order against UUIDv7s generated through the SQL functions. > > > > > > > > Uniqueness is preserved either way, so the rewind logic still works as > intended but it seemed worth flagging. > > > > I see conversion that's used elsewhere as: > > us =3D ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) > > * SECS_PER_DAY * USECS_PER_SEC; > > > > Or, since promotion isn't on a hot path, gettimeofday() / time(NULL) > directly would also be fine. > > > > Yes, the intention was to use a proper timestamp to allow debugging > servers if necessary. Switched to gettimeofday() and > > used 0 for sub-ms since this is not going to be critical. (We could use > ns here as well, but that would only solve a race > > if you have two servers being promoted in the same ms, which I find > unlikely, and there is a random number added for that > > situation.) > > > > 2. EOR-record path, the intent is unclear. > > > > The comment above generate_uuidv7_r() at says: > > > > "The same UUID is written into the history file and later into the > XLOG_END_OF_RECOVERY record so that pg_rewind can > > distinguish two servers..." > > > > But from what I can see only the history-file part actually lands. > > xl_end_of_recovery is unchanged, CreateEndOfRecoveryRecord() doesn't > add the UUID, and XLogCtl->ThisTimeLineUUID is > > written under info_lck without a > > reader (I couldn't grep it). > > > > The xlog_redo() memset() + Min(rec_len, sizeof(...)) change reads like > preparation for an EOR-struct extension that > > ended up not being part of the patch. > > > > Was the EOR-record piece something you intended to keep for a > follow-up, or has it been superseded by the > > history-file approach? > > > > No, the EOR changes are not needed for the promotion, contrary to what = I > originally thought. Cleaned up the comment and > > the code and removed all traces of changes to the EOR (I hope). > > > > > > > > 3. Malformed UUID handling in readTimeLineHistory(). > > > > The optional field-4 path is: > > > > if (nfields =3D=3D 4 && strlen(uuid_str) =3D=3D UUID_STR_LEN) > > { > > Datum datum =3D DirectFunctionCall1(uuid_in, > > > CStringGetDatum(uuid_str)); > > ... > > } > > > > uuid_in() raises ereport(ERROR) on a malformed input, while the > surrounding syntax-error paths in readTimeLineHistory > > () use FATAL deliberately. > > In practice an ERROR during startup ends up being fatal too, so this > isn't strictly a bug but it would be nicer to > > stay consistent. > > > > Agree. I added code to capture the error and raise a FATAL instead (wit= h > the error message from the uuid_in, in case it > > is modified it makes sense to show this). > > > > Regarding the Tests I have the following thoughts > > > > The two new cases are nice, a few extensions that I think would > strengthen them: > > 1. A mixed-version case where one side has a zero UUID. That's the pat= h > we're claiming is graceful, but nothing > > currently exercises it > > > > Yes, that should work regardless of whether the source or the target ha= s > the zero UUID. > > > > I realized one thing: if two timelines have identical TLI but one has > zero UUID and one has not, it seems they could not > > come from the same promotion (one promotion happened on an old server > and the other one on a new server), that is, they > > should be treated as different. Does that make sense? I made the > necessary changes in the attached patches for testing. > > Please have a look. > > > > 2. A deeper-divergence case (e.g. TLI1->2->3 vs TLI1->2->3') so that > findCommonAncestorTimeline's loop walks past > > matching entries > > before hitting the mismatch. The 0002 test puts the divergence at > depth 1. > > > > I was unsure if this test was necessary or interesting, hence a separat= e > commit. Since you thought it was useful, it's > > now rolled into the patch and I extended the tests with the scenarios > you suggested. > > > > I also did some refactorings of the tests to avoid duplication. More > below. > > > > 3. A small assertion against the on-disk 00000002.history contents, to > pin down the file format. > > 4. On 0002 the dependency on restore_command pointing at node_x's > pg_wal is the kind of thing that tends to break > > under > > environment changes. A CHECKPOINT on node_x before the backup, or > wal_keep_size as in 0001, would let the test > > stand on its own. > > > > Good point. > > > > I refactored the code to avoid some duplication and make the test flow > self-explanatory and as part of that I set the > > wal_keep_size for all nodes. > > > > In the process I noticed that many of the functions in RewindTest.pm do > the same job as the primitives I wrote, but have > > hard-coded variable names. I could rewrite them to take parameters, but > that would be quite a big patch to add additional > > changes to each call site, so I did not do that and rather added small > wrappers specific for the tests in > > 005_same_timeline.pl=E2=9A=A0=EF=B8=8F. > > > > Attached a new version of the now single patch. > > > > I'm happy to keep reviewing/contributing, thanks again for working on > it. > > > > Thank you for reviewing it. > > Thank you for your work. I have one comment. > > + a =3D &tlh->source[tlh->sourceNentries - 2].tluuid; > + b =3D &tlh->target[tlh->targetNentries - 2].tluuid; > + > + if (memcmp(a, &zero, UUID_LEN) =3D=3D 0 && memcmp(b, &zero, UUID_= LEN) > =3D=3D 0) > + return true; > + > + return memcmp(a, b, UUID_LEN) =3D=3D 0; > > Since we already have matchingTimelineUUID(), the above code can be > simplified > using it. > Thank you for the review. I switched to using the matchingTimelineUUID() for this part of the code and made some other minor improvements as well. -- Best wishes, Mats Kindahl, Multigres Developer, Supabase --0000000000004ea53f0652a8fc2f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Japin,

On Mon, May 25, 2026 at 7:21=E2=80=AFAM Japin Li <japinli@hotmail.com> wrote:
=

Hi, Mats

On Sun, 24 May 2026 at 20:30, Mats Kindahl <mats.kindahl@gmail.com> wrote:
> On Fri, May 22, 2026 at 12:09=E2=80=AFAM surya poondla <suryapoondla4@gmail.com> wrote:
>
>=C2=A0 Hi Mats,
>
>=C2=A0 Thanks for picking this up -- the scenario is a real one and I t= hink the UUID-tagging approach is a clean way to
>=C2=A0 solve it. v2 applies and builds without trouble, and the core al= gorithm reads well to me.
>=C2=A0 I have a handful of observations that I'd love your thoughts= .
>
> Hi Surya,
>
> Thank you for the review. It is a quite rare scenario, but it is real = and the fix is simple.
>=C2=A0
>=C2=A0 Regarding Correctness I have the below thoughts
>
>=C2=A0 1. UUIDv7 timestamp epoch.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0In StartupXLOG():
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TimestampTz now =3D GetCurrent= Timestamp();
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0generate_uuidv7_r(&uuid_bu= f, (uint64)(now / 1000),
>=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 =C2=A0 =C2=A0 =C2=A0 (uint= 32)(now % 1000) * 1000);
>
>=C2=A0 I think there might be a small mismatch here: GetCurrentTimestam= p() returns microseconds since the Postgres epoch
>=C2=A0 (2000-01-01),
>=C2=A0 whereas generate_uuidv7_r describes its first argument as millis= econds since the Unix epoch.
>=C2=A0 As written that 30-year offset would land in the UUID's time= stamp field, so the resulting UUID wouldn't be a
>=C2=A0 conformant UUIDv7 and wouldn't
>=C2=A0 time-order against UUIDv7s generated through the SQL functions.<= br> >
>=C2=A0
>=C2=A0
>=C2=A0 Uniqueness is preserved either way, so the rewind logic still wo= rks as intended but it seemed worth flagging.
>
>=C2=A0 I see conversion that's used elsewhere as:
>=C2=A0 us =3D ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0* SECS_PER_DAY * USECS_PER_SEC;
>
>=C2=A0 Or, since promotion isn't on a hot path, gettimeofday() / ti= me(NULL) directly would also be fine.
>
> Yes, the intention was to use a proper timestamp to allow debugging se= rvers if necessary. Switched to gettimeofday() and
> used 0 for sub-ms since this is not going to be critical. (We could us= e ns here as well, but that would only solve a race
> if you have two servers being promoted in the same ms, which I find un= likely, and there is a random number added for that
> situation.)
>=C2=A0
>=C2=A0 2. EOR-record path, the intent is unclear.
>
>=C2=A0 The comment above generate_uuidv7_r() at says:
>
>=C2=A0 "The same UUID is written into the history file and later i= nto the XLOG_END_OF_RECOVERY record so that pg_rewind can
>=C2=A0 distinguish two servers..."
>
>=C2=A0 But from what I can see only the history-file part actually land= s.
>=C2=A0 xl_end_of_recovery is unchanged, CreateEndOfRecoveryRecord() doe= sn't add the UUID, and XLogCtl->ThisTimeLineUUID is
>=C2=A0 written under info_lck without a
>=C2=A0 reader (I couldn't grep it).
>
>=C2=A0 The xlog_redo() memset() + Min(rec_len, sizeof(...)) change read= s like preparation for an EOR-struct extension that
>=C2=A0 ended up not being part of the patch.
>
>=C2=A0 Was the EOR-record piece something you intended to keep for a fo= llow-up, or has it been superseded by the
>=C2=A0 history-file approach?
>
> No, the EOR changes are not needed for the promotion, contrary to what= I originally thought. Cleaned up the comment and
> the code and removed all traces of changes to the EOR (I hope).
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0
>
>=C2=A0 3. Malformed UUID handling in readTimeLineHistory().
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0The optional field-4 path is:
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (nfields =3D=3D 4 &&= ; strlen(uuid_str) =3D=3D UUID_STR_LEN)
>=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=A0Datum datum =3D = DirectFunctionCall1(uuid_in,
>=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 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CStringGetDatum(uuid_str));
>=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 uuid_in() raises ereport(ERROR) on a malformed input, while the = surrounding syntax-error paths in readTimeLineHistory
>=C2=A0 () use FATAL deliberately.
>=C2=A0 In practice an ERROR during startup ends up being fatal too, so = this isn't strictly a bug but it would be nicer to
>=C2=A0 stay consistent.
>
> Agree. I added code to capture the error and raise a FATAL instead (wi= th the error message from the uuid_in, in case it
> is modified it makes sense to show this).
>=C2=A0
>=C2=A0 Regarding the Tests I have the following thoughts
>
>=C2=A0 The two new cases are nice, a few extensions that I think would = strengthen them:
>=C2=A0 1. A mixed-version case where one side has a zero UUID. That'= ;s the path we're claiming is graceful, but nothing
>=C2=A0 currently exercises it
>
> Yes, that should work regardless of whether the source or the target h= as the zero UUID.
>
> I realized one thing: if two timelines have identical TLI but one has = zero UUID and one has not, it seems they could not
> come from the same promotion (one promotion happened on an old server = and the other one on a new server), that is, they
> should be treated as different. Does that make sense? I made the neces= sary changes in the attached patches for testing.
> Please have a look.
>=C2=A0
>=C2=A0 2. A deeper-divergence case (e.g. TLI1->2->3 vs TLI1->2= ->3') so that findCommonAncestorTimeline's loop walks past
>=C2=A0 matching entries
>=C2=A0 =C2=A0 =C2=A0 =C2=A0before hitting the mismatch. The 0002 test p= uts the divergence at depth 1.
>
> I was unsure if this test was necessary or interesting, hence a separa= te commit. Since you thought it was useful, it's
> now rolled into the patch and I extended the tests with the scenarios = you suggested.
>
> I also did some refactorings of the tests to avoid duplication. More b= elow.
>=C2=A0
>=C2=A0 3. A small assertion against the on-disk 00000002.history conten= ts, to pin down the file format.
>=C2=A0 4. On 0002 the dependency on restore_command pointing at node_x&= #39;s pg_wal is the kind of thing that tends to break
>=C2=A0 under
>=C2=A0 =C2=A0 =C2=A0 =C2=A0environment changes. A CHECKPOINT on node_x = before the backup, or wal_keep_size as in 0001, would let the test
>=C2=A0 stand on its own.
>
> Good point.
>
> I refactored the code to avoid some duplication and make the test flow= self-explanatory and as part of that I set the
> wal_keep_size for all nodes.
>
> In the process I noticed that many of the functions in RewindTest.pm d= o the same job as the primitives I wrote, but have
> hard-coded variable names. I could rewrite them to take parameters, bu= t that would be quite a big patch to add additional
> changes to each call site, so I did not do that and rather added small= wrappers specific for the tests in
>
005_same_timeline.pl=E2=9A=A0=EF=B8=8F.
>=C2=A0
> Attached a new version of the now single patch.
>
>=C2=A0 I'm happy to keep reviewing/contributing, thanks again for w= orking on it.
>
> Thank you for reviewing it.

Thank you for your work.=C2=A0 I have one comment.

+=C2=A0 =C2=A0 =C2=A0 =C2=A0a =3D &tlh->source[tlh->sourceNentrie= s - 2].tluuid;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0b =3D &tlh->target[tlh->targetNentrie= s - 2].tluuid;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (memcmp(a, &zero, UUID_LEN) =3D=3D 0 &am= p;& memcmp(b, &zero, UUID_LEN) =3D=3D 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return true;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return memcmp(a, b, UUID_LEN) =3D=3D 0;

Since we already have matchingTimelineUUID(), the above code can be simplif= ied
using it.

Thank you for the review. I s= witched to using the matchingTimelineUUID() for this part of the code and m= ade some other minor improvements as well.
--
Best wishes,
Mats K= indahl, Multigres Developer, Supabase
--0000000000004ea53f0652a8fc2f-- --0000000000004ea5410652a8fc31 Content-Type: text/x-patch; charset="US-ASCII"; name="v4.0001-pg_rewind-use-UUIDs-to-detect-independent-same-TLI-p.patch" Content-Disposition: attachment; filename="v4.0001-pg_rewind-use-UUIDs-to-detect-independent-same-TLI-p.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mplkllq60 RnJvbSA4ZTI3MjYzZmM3NzY5ZTUwZGJmNjgyYjI2OWQ5ZGY3OGRiZjFjODVlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRzIEtpbmRhaGwgPG1hdHNAa2luZGFobC5uZXQ+CkRhdGU6 IFNhdCwgMjMgTWF5IDIwMjYgMTY6MDk6NDQgKzAyMDAKU3ViamVjdDogcGdfcmV3aW5kOiB1c2Ug VVVJRHMgdG8gZGV0ZWN0IGluZGVwZW5kZW50IHNhbWUtVExJIHByb21vdGlvbnMKClR3byBQb3N0 Z3JlU1FMIHN0YW5kYnlzIGNhbiBpbmRlcGVuZGVudGx5IHByb21vdGUgdG8gdGhlIHNhbWUgdGlt ZWxpbmUKSUQgaWYgdGhlaXIgcHJpbWFyeSBzdG9wcGVkIGJlZm9yZSBlaXRoZXIgaGFkIGEgY2hh bmNlIHRvIHByb21vdGUuICBJbgp0aGF0IHNpdHVhdGlvbiBib3RoIGNsdXN0ZXJzIHNoYXJlIGEg dGltZWxpbmUgaGlzdG9yeSBwcmVmaXggdGhhdCBsb29rcwppZGVudGljYWwgdG8gcGdfcmV3aW5k OiBzYW1lIFRMSSBudW1iZXJzIGFuZCBzYW1lIGJlZ2luL2VuZCBMU05zLiAgVGhlCmV4aXN0aW5n IHNhbWUtVExJIHNob3J0Y3V0IHRoZXJlZm9yZSB0cmVhdGVkIHRoZSBzb3VyY2UgYXMgYSB2YWxp ZApyZXdpbmQgdGFyZ2V0IGFuZCBza2lwcGVkIHRoZSByZXdpbmQgZW50aXJlbHksIGxlYXZpbmcg dGhlIHRhcmdldCdzCmRpdmVyZ2VkIFdBTCBpbnRhY3QuCgpGaXggdGhpcyBieSBlbWJlZGRpbmcg YSBVVUlEdjcgdmFsdWUgaW4gZXZlcnkgdGltZWxpbmUgaGlzdG9yeSBmaWxlCmVudHJ5IGF0IHBy b21vdGlvbiB0aW1lLiAgRWFjaCBwcm9tb3Rpb24gZ2VuZXJhdGVzIGEgZnJlc2ggVVVJRCwgc28g dHdvCmluZGVwZW5kZW50IHByb21vdGlvbnMgdG8gdGhlIHNhbWUgVExJIHdpbGwgY2FycnkgZGlm ZmVyZW50IFVVSURzIGV2ZW4KdGhvdWdoIHRoZSBUTEkgbnVtYmVyIGFuZCBiZWdpbiBMU04gYXJl IGlkZW50aWNhbC4KCldoZW4gbG9hZGluZyB0aGUgdGltZWxpbmUgaGlzdG9yeSwgcGdfcmV3aW5k IHVzZXMgdGhlc2UgVVVJRHMgaW4gdHdvCnBsYWNlczoKCjEuIGZpbmRDb21tb25BbmNlc3RvclRp bWVsaW5lIGNoZWNrcyB0aGF0IHRoZSBUTEkgYW5kIFVVSUQgaW4gZWFjaCBlbnRyeQogICBtYXRj aC4gIEEgbWlzbWF0Y2ggc2lnbmFscyBpbmRlcGVuZGVudCBwcm9tb3Rpb25zIGFuZCB0aGUgc2Vh cmNoCiAgIGNvbnRpbnVlcyB0byBlYXJsaWVyIGVudHJpZXMgdG8gZmluZCB0aGUgdHJ1ZSBjb21t b24gYW5jZXN0b3IuCgoyLiBUaGUgc2FtZS1UTEkgc2hvcnRjdXQgKHNvdXJjZSBhbmQgdGFyZ2V0 IG9uIHRoZSBzYW1lIGN1cnJlbnQgVExJKQogICBjb21wYXJlcyB0aGUgVVVJRCBzdG9yZWQgaW4g dGhlIGxhc3QgY29tcGxldGVkIGhpc3RvcnkgZW50cnkgYW5kIGEKICAgbWlzbWF0Y2ggZm9yY2Vz IGEgZnVsbCByZXdpbmQgaW5zdGVhZCBvZiBhIG5vLW9wLgoKVVVJRHMgYXJlIHplcm8gZm9yIGNs dXN0ZXJzIHRoYXQgcHJlZGF0ZSB0aGlzIGNoYW5nZSwgYW5kIHRoZSBjb21wYXJpc29uCmZ1bmN0 aW9uIHRyZWF0cyBhIHplcm8gVVVJRCBvbiBlaXRoZXIgc2lkZSBhcyBkaWZmZXJlbnQgZnJvbSBh IFVVSUQKc2luY2UgdGhhdCBwcm9tb3Rpb24gaGFzIHRvIGJlIGZyb20gYSBkaWZmZXJlbnQgc2Vy dmVyIChpdCBoYWQgYQpwcmUtY2hhbmdlIHZlcnNpb24gc2VydmVyIHRoYXQgd2FzIHByb21vdGVk LCBzbyBpdCBjYW5ub3QgYmUgdGhlIHNhbWUgYXMKYSBwb3N0LWNoYW5nZSB2ZXJzaW9uIHNlcnZl ciB0aGF0IHdhcyBwcm9tb3RlZCkuCgpUd28gbmV3IHRlc3RzIGluIHQvMDA1X3NhbWVfdGltZWxp bmUucGwgY292ZXIgYm90aCBkZXRlY3Rpb24gcGF0aHMuCgpUaGUgZmlyc3QgY292ZXJzIHRoZSBz YW1lLVRMSSBzaG9ydGN1dDogdHdvIHN0YW5kYnlzIGluZGVwZW5kZW50bHkKcHJvbW90ZSB0byBU TEkyIGFuZCBUTEkyJywgZWFjaCB3aXRoIGEgZGlzdGluY3QgVVVJRC4KClRoZSBzZWNvbmQgY292 ZXJzIHRoZSBhbmNlc3RvciBzZWFyY2g6IHRoZSB0YXJnZXQgZ29lcyB0aHJvdWdoIFRMSTEgLT4K VExJMiAtPiBUTEkzIHdoaWxlIHRoZSBzb3VyY2UgaW5kZXBlbmRlbnRseSBwcm9tb3RlZCBzbyB0 aGF0IGl0IGhhcyBhCnRpbWVsaW5lIHdpdGggVExJMSAtPiBUTEkyJyAtPiBUTEkzJy4gVGhlIHRl c3QgZW5zdXJlcyB0aGF0CmZpbmRDb21tb25BbmNlc3RvclRpbWVsaW5lIGJhY2tzIHVwIHRvIFRM STEgYXMgdGhlIHRydWUgY29tbW9uIGFuY2VzdG9yCnJhdGhlciB0aGFuIGFjY2VwdGluZyB0aGUg bnVtZXJpY2FsbHkgbWF0Y2hpbmcgVExJMiBlbnRyeS4KLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3Mv dHJhbnNhbS90aW1lbGluZS5jICAgIHwgIDc5ICsrKystCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS94bG9nLmMgICAgICAgIHwgIDE1ICsKIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMg ICAgICAgICAgICAgfCAgMTUgKy0KIHNyYy9iaW4vcGdfcmV3aW5kL3BnX3Jld2luZC5jICAgICAg ICAgICAgfCAxMDQgKysrKysrLQogc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVfc2FtZV90aW1lbGlu ZS5wbCB8IDM1MyArKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2Jpbi9wZ19yZXdpbmQvdGlt ZWxpbmUuYyAgICAgICAgICAgICB8ICA0NyArKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy90aW1lbGlu ZS5oICAgICAgICAgICAgfCAgIDUgKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy94bG9nX2ludGVybmFs LmggICAgICAgfCAgIDEgKwogc3JjL2luY2x1ZGUvdXRpbHMvdXVpZC5oICAgICAgICAgICAgICAg ICB8ICAxMCArLQogOSBmaWxlcyBjaGFuZ2VkLCA2MDYgaW5zZXJ0aW9ucygrKSwgMjMgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdGltZWxpbmUu YyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMKaW5kZXggNjhlNWY2OTJk MjYuLmRmMTYxZGNjMGQ1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90 aW1lbGluZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMKQEAg LTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2Zk LmgiCiAjaW5jbHVkZSAidXRpbHMvd2FpdF9ldmVudC5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3Jw cm90b3MuaCIKKyNpbmNsdWRlICJ1dGlscy91dWlkLmgiCiAKIC8qCiAgKiBDb3BpZXMgYWxsIHRp bWVsaW5lIGhpc3RvcnkgZmlsZXMgd2l0aCBpZCdzIGJldHdlZW4gJ2JlZ2luJyBhbmQgJ2VuZCcK QEAgLTExMCw4ICsxMTIsMTIgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShUaW1lTGluZUlEIHRhcmdl dFRMSSkKIAkJCWVyZXBvcnQoRkFUQUwsCiAJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vzcygp LAogCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIjogJW0iLCBwYXRoKSkp OwotCQkvKiBOb3QgdGhlcmUsIHNvIGFzc3VtZSBubyBwYXJlbnRzICovCi0JCWVudHJ5ID0gcGFs bG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisKKwkJLyoKKwkJICogTm90IHRoZXJl LCBzbyBhc3N1bWUgbm8gcGFyZW50cy4gV2UgdXNlIHBhbGxvYzBfb2JqZWN0IHRvIGVuc3VyZQor CQkgKiB0aGF0IHRsdXVpZCBpcyBhbGwtemVyby4KKwkJICovCisJCWVudHJ5ID0gcGFsbG9jMF9v YmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOwogCQllbnRyeS0+dGxpID0gdGFyZ2V0VExJOwog CQllbnRyeS0+YmVnaW4gPSBlbnRyeS0+ZW5kID0gSW52YWxpZFhMb2dSZWNQdHI7CiAJCXJldHVy biBsaXN0X21ha2UxKGVudHJ5KTsKQEAgLTEyNSw2ICsxMzEsNyBAQCByZWFkVGltZUxpbmVIaXN0 b3J5KFRpbWVMaW5lSUQgdGFyZ2V0VExJKQogCXByZXZlbmQgPSBJbnZhbGlkWExvZ1JlY1B0cjsK IAlmb3IgKDs7KQogCXsKKwkJY2hhcgkJdXVpZF9zdHJbVVVJRF9TVFJfTEVOICsgMV0gPSB7MH07 CiAJCWNoYXIJCWZsaW5lW01BWFBHUEFUSF07CiAJCWNoYXIJICAgKnJlczsKIAkJY2hhcgkgICAq cHRyOwpAQCAtMTU1LDcgKzE2Miw4IEBAIHJlYWRUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCB0 YXJnZXRUTEkpCiAJCWlmICgqcHRyID09ICdcMCcgfHwgKnB0ciA9PSAnIycpCiAJCQljb250aW51 ZTsKIAotCQluZmllbGRzID0gc3NjYW5mKGZsaW5lLCAiJXVcdCVYLyUwOFgiLCAmdGxpLCAmc3dp dGNocG9pbnRfaGksICZzd2l0Y2hwb2ludF9sbyk7CisJCW5maWVsZHMgPQorCQkJc3NjYW5mKGZs aW5lLCAiJXVcdCVYLyUwOFhcdCUzNnMiLCAmdGxpLCAmc3dpdGNocG9pbnRfaGksICZzd2l0Y2hw b2ludF9sbywgdXVpZF9zdHIpOwogCiAJCWlmIChuZmllbGRzIDwgMSkKIAkJewpAQCAtMTY0LDcg KzE3Miw3IEBAIHJlYWRUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCB0YXJnZXRUTEkpCiAJCQkJ CShlcnJtc2coInN5bnRheCBlcnJvciBpbiBoaXN0b3J5IGZpbGU6ICVzIiwgZmxpbmUpLAogCQkJ CQkgZXJyaGludCgiRXhwZWN0ZWQgYSBudW1lcmljIHRpbWVsaW5lIElELiIpKSk7CiAJCX0KLQkJ aWYgKG5maWVsZHMgIT0gMykKKwkJaWYgKG5maWVsZHMgPCAzKQogCQkJZXJlcG9ydChGQVRBTCwK IAkJCQkJKGVycm1zZygic3ludGF4IGVycm9yIGluIGhpc3RvcnkgZmlsZTogJXMiLCBmbGluZSks CiAJCQkJCSBlcnJoaW50KCJFeHBlY3RlZCBhIHdyaXRlLWFoZWFkIGxvZyBzd2l0Y2hwb2ludCBs b2NhdGlvbi4iKSkpOwpAQCAtMTc2LDEyICsxODQsNDUgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShU aW1lTGluZUlEIHRhcmdldFRMSSkKIAogCQlsYXN0dGxpID0gdGxpOwogCi0JCWVudHJ5ID0gcGFs bG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisJCS8qCisJCSAqIFdlIHVzZSBwYWxs b2MwX29iamVjdCB0byBlbnN1cmUgdGhhdCB0bHV1aWQgaXMgYWxsLXplcm8sIHdoaWNoIGlzCisJ CSAqIGltcG9ydGFudCBmb3IgcGdfcmV3aW5kIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBoaXN0b3J5 IGZpbGUgaXMKKwkJICogbWlzc2luZyBvciBub3QuCisJCSAqLworCQllbnRyeSA9IHBhbGxvYzBf b2JqZWN0KFRpbWVMaW5lSGlzdG9yeUVudHJ5KTsKIAkJZW50cnktPnRsaSA9IHRsaTsKIAkJZW50 cnktPmJlZ2luID0gcHJldmVuZDsKIAkJZW50cnktPmVuZCA9ICgodWludDY0KSAoc3dpdGNocG9p bnRfaGkpKSA8PCAzMiB8ICh1aW50NjQpIHN3aXRjaHBvaW50X2xvOwogCQlwcmV2ZW5kID0gZW50 cnktPmVuZDsKIAorCQkvKgorCQkgKiBQYXJzZSB0aGUgb3B0aW9uYWwgVVVJRCBmaWVsZC4gT2xk IGhpc3RvcnkgZmlsZXMgaGF2ZSB0aGUgcmVhc29uCisJCSAqIHN0cmluZyBpbiBmaWVsZCA0LiBJ dCBpcyBpbiB0aGVvcnkgcG9zc2libGUgdGhhdCB0aGUgcmVhc29uIHN0cmluZworCQkgKiBzdGFy dHMgd2l0aCBhIFVVSUQsIGJ1dCB0aGUgY3VycmVudCB1c2FnZSBkbyBub3Qgc3RvcmUgYSBVVUlE LiBUaGlzCisJCSAqIGFsbG93cyB1cyB0byBzdXBwb3J0IGJvdGggb2xkIGFuZCBuZXcgZm9ybWF0 cyBvZiBoaXN0b3J5IGZpbGVzCisJCSAqIHdpdGhvdXQgYnJlYWtpbmcgY29tcGF0aWJpbGl0eSBi eSBjaGVja2luZyBpZiB0aGUgZmllbGQgY29udGFpbnMgYQorCQkgKiB2YWxpZCBVVUlELgorCQkg Ki8KKwkJaWYgKG5maWVsZHMgPT0gNCAmJiBzdHJsZW4odXVpZF9zdHIpID09IFVVSURfU1RSX0xF TikKKwkJeworCQkJUEdfVFJZKCk7CisJCQl7CisJCQkJRGF0dW0JCWRhdHVtID0gRGlyZWN0RnVu Y3Rpb25DYWxsMSh1dWlkX2luLCBDU3RyaW5nR2V0RGF0dW0odXVpZF9zdHIpKTsKKworCQkJCW1l bWNweSgmZW50cnktPnRsdXVpZCwgRGF0dW1HZXRVVUlEUChkYXR1bSksIHNpemVvZihwZ191dWlk X3QpKTsKKwkJCX0KKwkJCVBHX0NBVENIKCk7CisJCQl7CisJCQkJRXJyb3JEYXRhICAqZWRhdGEg PSBDb3B5RXJyb3JEYXRhKCk7CisKKwkJCQlGbHVzaEVycm9yU3RhdGUoKTsKKwkJCQllcmVwb3J0 KEZBVEFMLAorCQkJCQkJZXJybXNnKCJpbnZhbGlkIFVVSUQgaW4gaGlzdG9yeSBmaWxlIFwiJXNc IiIsIHBhdGgpLAorCQkJCQkJZXJyZGV0YWlsKCIlcyIsIGVkYXRhLT5tZXNzYWdlKSk7CisJCQl9 CisJCQlQR19FTkRfVFJZKCk7CisJCX0KKwogCQkvKiBCdWlsZCBsaXN0IHdpdGggbmV3ZXN0IGl0 ZW0gZmlyc3QgKi8KIAkJcmVzdWx0ID0gbGNvbnMoZW50cnksIHJlc3VsdCk7CiAKQEAgLTE5Nyw5 ICsyMzgsMTEgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShUaW1lTGluZUlEIHRhcmdldFRMSSkKIAog CS8qCiAJICogQ3JlYXRlIG9uZSBtb3JlIGVudHJ5IGZvciB0aGUgInRpcCIgb2YgdGhlIHRpbWVs aW5lLCB3aGljaCBoYXMgbm8gZW50cnkKLQkgKiBpbiB0aGUgaGlzdG9yeSBmaWxlLgorCSAqIGlu IHRoZSBoaXN0b3J5IGZpbGUuIFdlIHVzZSBwYWxsb2MwX29iamVjdCB0byBlbnN1cmUgdGhhdCB0 bHV1aWQgaXMKKwkgKiBhbGwtemVybywgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBwZ19yZXdpbmQg dG8gZGV0ZWN0IHdoZXRoZXIgdGhlCisJICogaGlzdG9yeSBmaWxlIGlzIG1pc3Npbmcgb3Igbm90 LgogCSAqLwotCWVudHJ5ID0gcGFsbG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisJ ZW50cnkgPSBwYWxsb2MwX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CiAJZW50cnktPnRs aSA9IHRhcmdldFRMSTsKIAllbnRyeS0+YmVnaW4gPSBwcmV2ZW5kOwogCWVudHJ5LT5lbmQgPSBJ bnZhbGlkWExvZ1JlY1B0cjsKQEAgLTI5NCwyMSArMzM3LDMzIEBAIGZpbmROZXdlc3RUaW1lTGlu ZShUaW1lTGluZUlEIHN0YXJ0VExJKQogICoKICAqCW5ld1RMSTogSUQgb2YgdGhlIG5ldyB0aW1l bGluZQogICoJcGFyZW50VExJOiBJRCBvZiBpdHMgaW1tZWRpYXRlIHBhcmVudAorICoJbmV3VExV VUlEOiBVVUlEIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgcHJvbW90aW9uIGluc3RhbmNlCiAg Kglzd2l0Y2hwb2ludDogV0FMIGxvY2F0aW9uIHdoZXJlIHRoZSBzeXN0ZW0gc3dpdGNoZWQgdG8g dGhlIG5ldyB0aW1lbGluZQogICoJcmVhc29uOiBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBv ZiB3aHkgdGhlIHRpbWVsaW5lIHdhcyBzd2l0Y2hlZAogICoKLSAqIEN1cnJlbnRseSB0aGlzIGlz IG9ubHkgdXNlZCBhdCB0aGUgZW5kIHJlY292ZXJ5LCBhbmQgc28gdGhlcmUgYXJlIG5vIGxvY2tp bmcKKyAqIFRoZSBvdXRwdXQgZmlsZSBpcyBuYW1lZCA8bmV3VExJPi5oaXN0b3J5IChlLmcuIDAw MDAwMDAzLmhpc3RvcnkpLiAgSWYgdHdvCisgKiBzZXJ2ZXJzIGluZGVwZW5kZW50bHkgcHJvbW90 ZSB0byB0aGUgc2FtZSB0aW1lbGluZSBJRCwgdGhlaXIgaGlzdG9yeSBmaWxlcworICogc2hhcmUg dGhlIHNhbWUgbmFtZS4gSW4gYSBzaGFyZWQgV0FMIGFyY2hpdmUgdGhlIHNlY29uZCBmaWxlIHRv IGFycml2ZQorICogc2lsZW50bHkgb3ZlcndyaXRlcyB0aGUgZmlyc3QuICBUaGUgbmV3VExVVUlE IHdyaXR0ZW4gaW50byB0aGUgZmlsZSBjb250ZW50CisgKiBsZXRzIHBnX3Jld2luZCBkZXRlY3Qg dGhpcyBjb2xsaXNpb246IGl0IGZldGNoZXMgZWFjaCBzZXJ2ZXIncyBoaXN0b3J5IGZpbGUKKyAq IGRpcmVjdGx5IGZyb20gdGhhdCBzZXJ2ZXIsIGNvbXBhcmVzIHRoZSBVVUlEcyBmb3IgZXZlcnkg c2hhcmVkIFRMSSwgYW5kCisgKiB0cmVhdHMgYSBVVUlEIG1pc21hdGNoIGFzIGV2aWRlbmNlIG9m IGluZGVwZW5kZW50IHByb21vdGlvbiBldmVuIHdoZW4gdGhlCisgKiBUTEkgbnVtYmVycyBhZ3Jl ZS4KKyAqCisgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgYXQgZW5kIG9mIHJlY292ZXJ5 LCBhbmQgc28gdGhlcmUgYXJlIG5vIGxvY2tpbmcKICAqIGNvbnNpZGVyYXRpb25zLiAgQnV0IHdl IHNob3VsZCBiZSBqdXN0IGFzIHRlbnNlIGFzIFhMb2dGaWxlSW5pdCB0byBhdm9pZAogICogZW1w bGFjaW5nIGEgYm9ndXMgZmlsZS4KICAqLwogdm9pZAogd3JpdGVUaW1lTGluZUhpc3RvcnkoVGlt ZUxpbmVJRCBuZXdUTEksIFRpbWVMaW5lSUQgcGFyZW50VExJLAorCQkJCQkgY29uc3QgcGdfdXVp ZF90ICpuZXdUTFVVSUQsCiAJCQkJCSBYTG9nUmVjUHRyIHN3aXRjaHBvaW50LCBjaGFyICpyZWFz b24pCiB7CiAJY2hhcgkJcGF0aFtNQVhQR1BBVEhdOwogCWNoYXIJCXRtcHBhdGhbTUFYUEdQQVRI XTsKIAljaGFyCQloaXN0Zm5hbWVbTUFYRk5BTUVMRU5dOwogCWNoYXIJCWJ1ZmZlcltCTENLU1pd OworCWNoYXIJICAgKnV1aWRfc3RyOwogCWludAkJCXNyY2ZkOwogCWludAkJCWZkOwogCWludAkJ CW5ieXRlczsKQEAgLTM5OCwxMyArNDUzLDE5IEBAIHdyaXRlVGltZUxpbmVIaXN0b3J5KFRpbWVM aW5lSUQgbmV3VExJLCBUaW1lTGluZUlEIHBhcmVudFRMSSwKIAkgKgogCSAqIElmIHdlIGRpZCBo YXZlIGEgcGFyZW50IGZpbGUsIGluc2VydCBhbiBleHRyYSBuZXdsaW5lIGp1c3QgaW4gY2FzZSB0 aGUKIAkgKiBwYXJlbnQgZmlsZSBmYWlsZWQgdG8gZW5kIHdpdGggb25lLgorCSAqCisJICogRm9y bWF0OiA8cGFyZW50VExJPlx0PHN3aXRjaHBvaW50Plx0PFRoaXNUaW1lTGluZVVVSUQ+XHQ8cmVh c29uPlxuCiAJICovCisJdXVpZF9zdHIgPSBEYXR1bUdldENTdHJpbmcoRGlyZWN0RnVuY3Rpb25D YWxsMSh1dWlkX291dCwgVVVJRFBHZXREYXR1bShuZXdUTFVVSUQpKSk7CisKIAlzbnByaW50Zihi dWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICIlcyV1XHQlWC8lMDhYXHQlc1xuIiwKKwkJCSAi JXMldVx0JVgvJTA4WFx0JXNcdCVzXG4iLAogCQkJIChzcmNmZCA8IDApID8gIiIgOiAiXG4iLAog CQkJIHBhcmVudFRMSSwKIAkJCSBMU05fRk9STUFUX0FSR1Moc3dpdGNocG9pbnQpLAorCQkJIHV1 aWRfc3RyLAogCQkJIHJlYXNvbik7CisJcGZyZWUodXVpZF9zdHIpOwogCiAJbmJ5dGVzID0gc3Ry bGVuKGJ1ZmZlcik7CiAJZXJybm8gPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4 IGJlZGRjYjU1MmQ2Li44NzQ4NmVjNmExYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpA QCAtOTksNiArOTksNyBAQAogI2luY2x1ZGUgInN0b3JhZ2Uvc3Vic3lzdGVtcy5oIgogI2luY2x1 ZGUgInN0b3JhZ2Uvc3luYy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgorI2luY2x1 ZGUgInV0aWxzL3V1aWQuaCIKICNpbmNsdWRlICJ1dGlscy9ndWNfdGFibGVzLmgiCiAjaW5jbHVk ZSAidXRpbHMvaW5qZWN0aW9uX3BvaW50LmgiCiAjaW5jbHVkZSAidXRpbHMvcGdzdGF0X2ludGVy bmFsLmgiCkBAIC02Mzc4LDYgKzYzNzksOSBAQCBTdGFydHVwWExPRyh2b2lkKQogCW5ld1RMSSA9 IGVuZE9mUmVjb3ZlcnlJbmZvLT5sYXN0UmVjVExJOwogCWlmIChBcmNoaXZlUmVjb3ZlcnlSZXF1 ZXN0ZWQpCiAJeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJcGdfdXVpZF90CXV1aWRfYnVmOwor CiAJCW5ld1RMSSA9IGZpbmROZXdlc3RUaW1lTGluZShyZWNvdmVyeVRhcmdldFRMSSkgKyAxOwog CQllcmVwb3J0KExPRywKIAkJCQkoZXJybXNnKCJzZWxlY3RlZCBuZXcgdGltZWxpbmUgSUQ6ICV1 IiwgbmV3VExJKSkpOwpAQCAtNjQwOCw4ICs2NDEyLDE5IEBAIFN0YXJ0dXBYTE9HKHZvaWQpCiAJ CSAqIHRvIHRoZSBuZXcgdGltZWxpbmUsIGFuZCB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBu ZXcgdGltZWxpbmUuCiAJCSAqIFRvIG1pbmltaXplIHRoZSB3aW5kb3cgZm9yIHRoYXQsIHRyeSB0 byBkbyBhcyBsaXR0bGUgYXMgcG9zc2libGUKIAkJICogYmV0d2VlbiBoZXJlIGFuZCB3cml0aW5n IHRoZSBlbmQtb2YtcmVjb3ZlcnkgcmVjb3JkLgorCQkgKgorCQkgKiBHZW5lcmF0ZSBhIFVVSUR2 NyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBwcm9tb3Rpb24uICBUaGUKKwkJICogc2Ft ZSBVVUlEIGlzIHdyaXR0ZW4gaW50byB0aGUgaGlzdG9yeSBmaWxlIHNvIHRoYXQgcGdfcmV3aW5k IGNhbgorCQkgKiBkaXN0aW5ndWlzaCB0d28gc2VydmVycyB0aGF0IGluZGVwZW5kZW50bHkgcHJv bW90ZWQgdG8gdGhlIHNhbWUKKwkJICogdGltZWxpbmUgSUQuICBVc2UgZ2V0dGltZW9mZGF5KCkg c2luY2Ugd2UgYXJlIG5vdCBvbiBhIGhvdCBwYXRoOworCQkgKiBnZW5lcmF0ZV91dWlkdjcgd2Fu dHMgbWlsbGlzZWNvbmRzIGFuZCB3ZSBwYXNzIDAgZm9yIHN1Yi1tcyBzaW5jZQorCQkgKiB0aGUg cmFuZG9tIGJpdHMgYWxyZWFkeSBkaXN0aW5ndWlzaCBVVUlEcyBnZW5lcmF0ZWQgd2l0aGluIHRo ZSBzYW1lCisJCSAqIG1pbGxpc2Vjb25kLgogCQkgKi8KKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVM TCk7CisJCWdlbmVyYXRlX3V1aWR2N19yKCZ1dWlkX2J1ZiwgdHYudHZfc2VjICogMTAwMCArIHR2 LnR2X3VzZWMgLyAxMDAwLCAwKTsKIAkJd3JpdGVUaW1lTGluZUhpc3RvcnkobmV3VExJLCByZWNv dmVyeVRhcmdldFRMSSwKKwkJCQkJCQkgJnV1aWRfYnVmLAogCQkJCQkJCSBFbmRPZkxvZywgZW5k T2ZSZWNvdmVyeUluZm8tPnJlY292ZXJ5U3RvcFJlYXNvbik7CiAKIAkJZXJlcG9ydChMT0csCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvdXVpZC5jIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3V1aWQuYwppbmRleCA2ZWUzNzUyYWM3OC4uZjFkYzAxOTZjZDggMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3V1aWQuYwpAQCAtNzIsNyArNzIsNyBAQCBzdGF0aWMgYm9vbCB1dWlkX2FiYnJldl9hYm9ydChp bnQgbWVtdHVwY291bnQsIFNvcnRTdXBwb3J0IHNzdXApOwogc3RhdGljIERhdHVtIHV1aWRfYWJi cmV2X2NvbnZlcnQoRGF0dW0gb3JpZ2luYWwsIFNvcnRTdXBwb3J0IHNzdXApOwogc3RhdGljIGlu bGluZSB2b2lkIHV1aWRfc2V0X3ZlcnNpb24ocGdfdXVpZF90ICp1dWlkLCB1bnNpZ25lZCBjaGFy IHZlcnNpb24pOwogc3RhdGljIGlubGluZSBpbnQ2NCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGlu Zyh2b2lkKTsKLXN0YXRpYyBwZ191dWlkX3QgKmdlbmVyYXRlX3V1aWR2Nyh1aW50NjQgdW5peF90 c19tcywgdWludDMyIHN1Yl9tcyk7CitwZ191dWlkX3QgICpnZW5lcmF0ZV91dWlkdjcodWludDY0 IHVuaXhfdHNfbXMsIHVpbnQzMiBzdWJfbXMpOwogCiBEYXR1bQogdXVpZF9pbihQR19GVU5DVElP Tl9BUkdTKQpAQCAtNTgxLDYgKzU4MSwxNCBAQCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGluZyh2 b2lkKQogCXJldHVybiBuczsKIH0KIAorcGdfdXVpZF90ICoKK2dlbmVyYXRlX3V1aWR2Nyh1aW50 NjQgdW5peF90c19tcywgdWludDMyIHN1Yl9tcykKK3sKKwlwZ191dWlkX3QgICp1dWlkID0gcGFs bG9jKFVVSURfTEVOKTsKKworCXJldHVybiBnZW5lcmF0ZV91dWlkdjdfcih1dWlkLCB1bml4X3Rz X21zLCBzdWJfbXMpOworfQorCiAvKgogICogR2VuZXJhdGUgVVVJRCB2ZXJzaW9uIDcgcGVyIFJG QyA5NTYyLCB3aXRoIHRoZSBnaXZlbiB0aW1lc3RhbXAuCiAgKgpAQCAtNTk3LDEwICs2MDUsOSBA QCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGluZyh2b2lkKQogICoKICAqIE5COiBhbGwgbnVtYmVy cyBoZXJlIGFyZSB1bnNpZ25lZCwgdW5peF90c19tcyBjYW5ub3QgYmUgbmVnYXRpdmUgcGVyIFJG Qy4KICAqLwotc3RhdGljIHBnX3V1aWRfdCAqCi1nZW5lcmF0ZV91dWlkdjcodWludDY0IHVuaXhf dHNfbXMsIHVpbnQzMiBzdWJfbXMpCitwZ191dWlkX3QgKgorZ2VuZXJhdGVfdXVpZHY3X3IocGdf dXVpZF90ICp1dWlkLCB1aW50NjQgdW5peF90c19tcywgdWludDMyIHN1Yl9tcykKIHsKLQlwZ191 dWlkX3QgICp1dWlkID0gcGFsbG9jKFVVSURfTEVOKTsKIAl1aW50MzIJCWluY3JlYXNlZF9jbG9j a19wcmVjaXNpb247CiAKIAkvKiBGaWxsIGluIHRpbWUgcGFydCAqLwpkaWZmIC0tZ2l0IGEvc3Jj L2Jpbi9wZ19yZXdpbmQvcGdfcmV3aW5kLmMgYi9zcmMvYmluL3BnX3Jld2luZC9wZ19yZXdpbmQu YwppbmRleCA5ZDc0NWQ0YjI1Yi4uOTU4N2NmZDU3OTIgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdf cmV3aW5kL3BnX3Jld2luZC5jCisrKyBiL3NyYy9iaW4vcGdfcmV3aW5kL3BnX3Jld2luZC5jCkBA IC0zMiw2ICszMiwxOSBAQAogI2luY2x1ZGUgInJld2luZF9zb3VyY2UuaCIKICNpbmNsdWRlICJz dG9yYWdlL2J1ZnBhZ2UuaCIKIAorLyoKKyAqIFRpbWVsaW5lIGhpc3RvcmllcyBmb3IgYm90aCBj bHVzdGVycywgcG9wdWxhdGVkIGJ5IHRpbWVsaW5lc19tYXRjaCgpLgorICovCit0eXBlZGVmIHN0 cnVjdCBUaW1lbGluZUhpc3Rvcmllc0RhdGEKK3sKKwlUaW1lTGluZUhpc3RvcnlFbnRyeSAqc291 cmNlLAorCQkJICAgKnRhcmdldDsKKwlpbnQJCQlzb3VyY2VOZW50cmllcywKKwkJCQl0YXJnZXRO ZW50cmllczsKK30JCQlUaW1lbGluZUhpc3Rvcmllc0RhdGE7CisKK3R5cGVkZWYgVGltZWxpbmVI aXN0b3JpZXNEYXRhICogVGltZWxpbmVIaXN0b3JpZXM7CisKIHN0YXRpYyB2b2lkIHVzYWdlKGNv bnN0IGNoYXIgKnByb2duYW1lKTsKIAogc3RhdGljIHZvaWQgcGVyZm9ybV9yZXdpbmQoZmlsZW1h cF90ICpmaWxlbWFwLCByZXdpbmRfc291cmNlICpzb3VyY2UsCkBAIC01Myw2ICs2Niw5IEBAIHN0 YXRpYyB2b2lkIGZpbmRDb21tb25BbmNlc3RvclRpbWVsaW5lKFRpbWVMaW5lSGlzdG9yeUVudHJ5 ICphX2hpc3RvcnksCiAJCQkJCQkJCQkgICBUaW1lTGluZUhpc3RvcnlFbnRyeSAqYl9oaXN0b3J5 LAogCQkJCQkJCQkJICAgaW50IGJfbmVudHJpZXMsCiAJCQkJCQkJCQkgICBYTG9nUmVjUHRyICpy ZWNwdHIsIGludCAqdGxpSW5kZXgpOworc3RhdGljIGlubGluZSBib29sIG1hdGNoaW5nVGltZWxp bmVVVUlEKFRpbWVMaW5lSGlzdG9yeUVudHJ5ICphLCBUaW1lTGluZUhpc3RvcnlFbnRyeSAqYik7 CitzdGF0aWMgYm9vbCBtYXRjaEFuZEZldGNoVGltZWxpbmVzKFRpbWVMaW5lSUQgc291cmNlX3Rs aSwgVGltZUxpbmVJRCB0YXJnZXRfdGxpLAorCQkJCQkJCQkgICBUaW1lbGluZUhpc3RvcmllcyB0 aW1lbGluZUhpc3Rvcmllcyk7CiBzdGF0aWMgdm9pZCBlbnN1cmVDbGVhblNodXRkb3duKGNvbnN0 IGNoYXIgKmFyZ3YwKTsKIHN0YXRpYyB2b2lkIGRpc2Nvbm5lY3RfYXRleGl0KHZvaWQpOwogCkBA IC0xNDEsNiArMTU3LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaW50CQkJYzsK IAlYTG9nUmVjUHRyCWRpdmVyZ2VyZWM7CiAJaW50CQkJbGFzdGNvbW1vbnRsaUluZGV4OworCVRp bWVsaW5lSGlzdG9yaWVzRGF0YSB0aW1lbGluZUhpc3RvcmllczsKIAlYTG9nUmVjUHRyCWNoa3B0 cmVjOwogCVRpbWVMaW5lSUQJY2hrcHR0bGk7CiAJWExvZ1JlY1B0cgljaGtwdHJlZG87CkBAIC0z NzIsMTAgKzM4OSwyMSBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkgKgogCSAqIElm IGJvdGggY2x1c3RlcnMgYXJlIGFscmVhZHkgb24gdGhlIHNhbWUgdGltZWxpbmUsIHRoZXJlJ3Mg bm90aGluZyB0bwogCSAqIGRvLgorCSAqCisJICogVGhpcyBhbHNvIGhhbmRsZXMgdGhlIGNhc2Ug d2hlbiB0d28gc2VydmVycyBpbmRlcGVuZGVudGx5IHByb21vdGVkIHRvCisJICogdGhlIHNhbWUg dGltZWxpbmUgSUQ6IG9uZSBjcmFzaGVkIGFmdGVyIHdyaXRpbmcgdGhlIGhpc3RvcnkgZmlsZSBi dXQKKwkgKiBiZWZvcmUgaXRzIEVPUiBXQUwgcmVjb3JkIHdhcyBkaXN0cmlidXRlZCwgc28gYSBz ZWNvbmQgc3RhbmRieSBwcm9tb3RlZAorCSAqIGluZGVwZW5kZW50bHkuICBUaGUgaGlzdG9yeSBm aWxlcyBwcm9kdWNlZCBieSB0aG9zZSB0d28gcHJvbW90aW9ucworCSAqIGNhcnJ5IGRpZmZlcmVu dCBVVUlEcy4KKwkgKgorCSAqIFdoZW4gdGhlIGNsdXN0ZXJzIGFyZSBvbiBkaWZmZXJlbnQgdGlt ZWxpbmVzIHdlIGxvY2F0ZSB0aGUgZm9yayBwb2ludAorCSAqIHZpYSBmaW5kQ29tbW9uQW5jZXN0 b3JUaW1lbGluZS4KIAkgKi8KLQlpZiAodGFyZ2V0X3RsaSA9PSBzb3VyY2VfdGxpKQorCWlmICht YXRjaEFuZEZldGNoVGltZWxpbmVzKHNvdXJjZV90bGksIHRhcmdldF90bGksICZ0aW1lbGluZUhp c3RvcmllcykpCiAJewogCQlwZ19sb2dfaW5mbygic291cmNlIGFuZCB0YXJnZXQgY2x1c3RlciBh cmUgb24gdGhlIHNhbWUgdGltZWxpbmUiKTsKKwkJcGZyZWUodGltZWxpbmVIaXN0b3JpZXMuc291 cmNlKTsKKwkJcGZyZWUodGltZWxpbmVIaXN0b3JpZXMudGFyZ2V0KTsKIAkJcmV3aW5kX25lZWRl ZCA9IGZhbHNlOwogCQl0YXJnZXRfd2FsX2VuZHJlYyA9IEludmFsaWRYTG9nUmVjUHRyOwogCX0K QEAgLTM4OSw4ICs0MTcsMTAgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCSAqIFJl dHJpZXZlIHRpbWVsaW5lcyBmb3IgYm90aCBzb3VyY2UgYW5kIHRhcmdldCwgYW5kIGZpbmQgdGhl IHBvaW50CiAJCSAqIHdoZXJlIHRoZXkgZGl2ZXJnZWQuCiAJCSAqLwotCQlzb3VyY2VIaXN0b3J5 ID0gZ2V0VGltZWxpbmVIaXN0b3J5KHNvdXJjZV90bGksIHRydWUsICZzb3VyY2VOZW50cmllcyk7 Ci0JCXRhcmdldEhpc3RvcnkgPSBnZXRUaW1lbGluZUhpc3RvcnkodGFyZ2V0X3RsaSwgZmFsc2Us ICZ0YXJnZXROZW50cmllcyk7CisJCXRhcmdldEhpc3RvcnkgPSB0aW1lbGluZUhpc3Rvcmllcy50 YXJnZXQ7CisJCXRhcmdldE5lbnRyaWVzID0gdGltZWxpbmVIaXN0b3JpZXMudGFyZ2V0TmVudHJp ZXM7CisJCXNvdXJjZUhpc3RvcnkgPSB0aW1lbGluZUhpc3Rvcmllcy5zb3VyY2U7CisJCXNvdXJj ZU5lbnRyaWVzID0gdGltZWxpbmVIaXN0b3JpZXMuc291cmNlTmVudHJpZXM7CiAKIAkJZmluZENv bW1vbkFuY2VzdG9yVGltZWxpbmUoc291cmNlSGlzdG9yeSwgc291cmNlTmVudHJpZXMsCiAJCQkJ CQkJCSAgIHRhcmdldEhpc3RvcnksIHRhcmdldE5lbnRyaWVzLApAQCAtODc0LDcgKzkwNCw3IEBA IGdldFRpbWVsaW5lSGlzdG9yeShUaW1lTGluZUlEIHRsaSwgYm9vbCBpc19zb3VyY2UsIGludCAq bmVudHJpZXMpCiAJICovCiAJaWYgKHRsaSA9PSAxKQogCXsKLQkJaGlzdG9yeSA9IHBnX21hbGxv Y19vYmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOworCQloaXN0b3J5ID0gcGdfbWFsbG9jMF9v YmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOwogCQloaXN0b3J5LT50bGkgPSB0bGk7CiAJCWhp c3RvcnktPmJlZ2luID0gaGlzdG9yeS0+ZW5kID0gSW52YWxpZFhMb2dSZWNQdHI7CiAJCSpuZW50 cmllcyA9IDE7CkBAIC05MjAsNiArOTUwLDU2IEBAIGdldFRpbWVsaW5lSGlzdG9yeShUaW1lTGlu ZUlEIHRsaSwgYm9vbCBpc19zb3VyY2UsIGludCAqbmVudHJpZXMpCiAJcmV0dXJuIGhpc3Rvcnk7 CiB9CiAKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGVyLWVudHJ5IHByb21vdGlvbiBVVUlE cyBhcmUgY29tcGF0aWJsZS4KKyAqCisgKiBBIHplcm8gVVVJRCBtZWFucyB0aGUgaGlzdG9yeSBm aWxlIHByZWRhdGVzIHRoaXMgZml4IChvciB0aGUgZW50cnkgaXMKKyAqIHN5bnRoZXRpYykuICBJ ZiBib3RoIHNpZGVzIGFyZSB6ZXJvIHdlIGhhdmUgbm8gVVVJRCBpbmZvcm1hdGlvbiBhbmQgZmFs bAorICogYmFjayB0byBUTEktbnVtYmVyLW9ubHkgbWF0Y2hpbmcgKGJhY2t3YXJkIGNvbXBhdGli aWxpdHkgd2l0aCBvbGQgc2VydmVycykuCisgKiBJZiBvbmUgc2lkZSBjYXJyaWVzIGEgVVVJRCBh bmQgdGhlIG90aGVyIGRvZXMgbm90LCB0aGV5IGNhbm5vdCBvcmlnaW5hdGUKKyAqIGZyb20gdGhl IHNhbWUgcHJvbW90aW9uIGFuZCBhcmUgdHJlYXRlZCBhcyBpbmNvbXBhdGlibGUuCisgKi8KK3N0 YXRpYyBpbmxpbmUgYm9vbAorbWF0Y2hpbmdUaW1lbGluZVVVSUQoVGltZUxpbmVIaXN0b3J5RW50 cnkgKmEsIFRpbWVMaW5lSGlzdG9yeUVudHJ5ICpiKQoreworCXN0YXRpYyBjb25zdCBwZ191dWlk X3QgemVybyA9IHt7MH19OworCisJaWYgKG1lbWNtcCgmYS0+dGx1dWlkLCAmemVybywgVVVJRF9M RU4pID09IDAgJiYgbWVtY21wKCZiLT50bHV1aWQsICZ6ZXJvLCBVVUlEX0xFTikgPT0gMCkKKwkJ cmV0dXJuIHRydWU7CisJcmV0dXJuIG1lbWNtcCgmYS0+dGx1dWlkLCAmYi0+dGx1dWlkLCBVVUlE X0xFTikgPT0gMDsKK30KKworLyoKKyAqIEZldGNoIHRoZSB0aW1lbGluZSBoaXN0b3J5IGZvciBi b3RoIGNsdXN0ZXJzLCBzdG9yZSB0aGVtIGluIHRsaCwgYW5kIHJldHVybgorICogdHJ1ZSBpZiB0 aGUgY2x1c3RlcnMgYXJlIG9uIHRoZSBzYW1lIHRpbWVsaW5lIChubyByZXdpbmQgbmVlZGVkKS4K KyAqCisgKiB0bGggaXMgYWx3YXlzIGZ1bGx5IHBvcHVsYXRlZCBvbiByZXR1cm4gcmVnYXJkbGVz cyBvZiB0aGUgcmVzdWx0LCBzbyB0aGUKKyAqIGNhbGxlciBjYW4gcGFzcyB0bGgtPnNvdXJjZSAv IHRsaC0+dGFyZ2V0IGRpcmVjdGx5IHRvCisgKiBmaW5kQ29tbW9uQW5jZXN0b3JUaW1lbGluZSgp IHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBmYWxzZS4KKyAqCisgKiBUTEkgMSBhbHdheXMgcmV0 dXJucyB0cnVlOiBpdCBpcyB0aGUgb3JpZ2luYWwgdGltZWxpbmUgYW5kIGhhcyBubyBwcm9tb3Rp b24KKyAqIFVVSUQuICBGb3IgVExJID49IDIsIHRoZSBVVUlEIGluIGVudHJ5W05lbnRyaWVzIC0g Ml0gaWRlbnRpZmllcyB0aGUKKyAqIHByb21vdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGN1cnJlbnQg VExJLiAgQm90aC16ZXJvIFVVSURzIChvbGQgaGlzdG9yeSBmaWxlcykKKyAqIGFyZSB0cmVhdGVk IGFzIGNvbXBhdGlibGU7IHplcm8tdnMtbm9uemVybyBpcyB0cmVhdGVkIGFzIGEgbWlzbWF0Y2gg YmVjYXVzZQorICogb25lIHNpZGUgY2FycmllcyBhIHByb21vdGlvbiBVVUlEIGFuZCB0aGV5IGNh bm5vdCBiZSB0aGUgc2FtZSBwcm9tb3Rpb24uCisgKi8KK3N0YXRpYyBib29sCittYXRjaEFuZEZl dGNoVGltZWxpbmVzKFRpbWVMaW5lSUQgc291cmNlX3RsaSwgVGltZUxpbmVJRCB0YXJnZXRfdGxp LCBUaW1lbGluZUhpc3RvcmllcyB0bGgpCit7CisJdGxoLT5zb3VyY2UgPSBnZXRUaW1lbGluZUhp c3Rvcnkoc291cmNlX3RsaSwgdHJ1ZSwgJnRsaC0+c291cmNlTmVudHJpZXMpOworCXRsaC0+dGFy Z2V0ID0gZ2V0VGltZWxpbmVIaXN0b3J5KHRhcmdldF90bGksIGZhbHNlLCAmdGxoLT50YXJnZXRO ZW50cmllcyk7CisKKwlpZiAoc291cmNlX3RsaSAhPSB0YXJnZXRfdGxpKQorCQlyZXR1cm4gZmFs c2U7CisKKwkvKiBUTEkgMSBoYXMgbm8gcHJvbW90aW9uIFVVSUQ7IGFsd2F5cyB0cmVhdCBhcyB0 aGUgc2FtZSB0aW1lbGluZS4gKi8KKwlpZiAodGxoLT5zb3VyY2VOZW50cmllcyA8IDIgfHwgdGxo LT50YXJnZXROZW50cmllcyA8IDIpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIG1hdGNoaW5n VGltZWxpbmVVVUlEKCZ0bGgtPnNvdXJjZVt0bGgtPnNvdXJjZU5lbnRyaWVzIC0gMl0sCisJCQkJ CQkJCSZ0bGgtPnRhcmdldFt0bGgtPnRhcmdldE5lbnRyaWVzIC0gMl0pOworfQorCiAvKgogICog RGV0ZXJtaW5lIHRoZSBUTEkgb2YgdGhlIGxhc3QgY29tbW9uIHRpbWVsaW5lIGluIHRoZSB0aW1l bGluZSBoaXN0b3J5IG9mCiAgKiB0d28gY2x1c3RlcnMuICp0bGlJbmRleCBpcyBzZXQgdG8gdGhl IGluZGV4IG9mIGxhc3QgY29tbW9uIHRpbWVsaW5lIGluCkBAIC05NDEsMTIgKzEwMjEsMjYgQEAg ZmluZENvbW1vbkFuY2VzdG9yVGltZWxpbmUoVGltZUxpbmVIaXN0b3J5RW50cnkgKmFfaGlzdG9y eSwgaW50IGFfbmVudHJpZXMsCiAJICogZGVwZW5kaW5nIG9uIHRoZSBoaXN0b3J5IGZpbGVzIHRo YXQgZWFjaCBub2RlIGhhcyBmZXRjaGVkIGluIHByZXZpb3VzCiAJICogcmVjb3ZlcnkgcHJvY2Vz c2VzLiBIZW5jZSBjaGVjayB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5ldyB0aW1lbGluZQog CSAqIGFzIHdlbGwgYW5kIG1vdmUgZG93biBieSBvbmUgZXh0cmEgdGltZWxpbmUgZW50cnkgaWYg dGhleSBkbyBub3QgbWF0Y2guCisJICoKKwkgKiBXZSBhbHNvIGNvbXBhcmUgdGltZWxpbmUgVVVJ RHMgd2hlbiBib3RoIHNpZGVzIGNhcnJ5IG9uZS4gIFR3byBzZXJ2ZXJzCisJICogdGhhdCBpbmRl cGVuZGVudGx5IHByb21vdGVkIHRvIHRoZSBzYW1lIHRpbWVsaW5lIElEIHByb2R1Y2UgaGlzdG9y eQorCSAqIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSAoZS5nLiAwMDAwMDAwMy5oaXN0b3J5KTsg aW4gYSBzaGFyZWQgV0FMCisJICogYXJjaGl2ZSB0aGUgc2Vjb25kIGZpbGUgc2lsZW50bHkgb3Zl cndyaXRlcyB0aGUgZmlyc3QuICBwZ19yZXdpbmQKKwkgKiBmZXRjaGVzIGVhY2ggc2VydmVyJ3Mg aGlzdG9yeSBmaWxlIGRpcmVjdGx5IGZyb20gdGhhdCBzZXJ2ZXIsIHNvIGl0CisJICogc2VlcyBi b3RoIFVVSURzLgorCSAqCisJICogVGhlIHRpbWVsaW5lIFVVSUQgc3RvcmVkIGluIGhpc3Rvcnkg ZW50cnlbaV0gaXMgdGhlIFVVSUQgb2YgdGhlCisJICogcHJvbW90aW9uIHRoYXQgY3JlYXRlZCBl bnRyeVtpKzFdLCBpLmUuIHRoZSBVVUlEIG9mIFRMSSBlbnRyeVtpKzFdLnRsaS4KKwkgKiBTbyB0 byBjaGVjayB3aGV0aGVyIGVudHJ5W2ldIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzYW1lIHRpbWVs aW5lIG9uCisJICogYm90aCBzaWRlcyB3ZSBsb29rIGF0IGVudHJ5W2ktMV0udGx1dWlkIChmb3Ig aSA+IDApLiAgVExJIDEgKGkgPT0gMCkgaXMKKwkgKiBhbHdheXMgdGhlIHNhbWU6IGl0IGlzIHRo ZSBvcmlnaW5hbCB0aW1lbGluZSBhbmQgaGFzIG5vIHByb21vdGlvbiBVVUlELgogCSAqLwogCW4g PSBNaW4oYV9uZW50cmllcywgYl9uZW50cmllcyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykK IAl7CiAJCWlmIChhX2hpc3RvcnlbaV0udGxpICE9IGJfaGlzdG9yeVtpXS50bGkgfHwKLQkJCWFf aGlzdG9yeVtpXS5iZWdpbiAhPSBiX2hpc3RvcnlbaV0uYmVnaW4pCisJCQlhX2hpc3RvcnlbaV0u YmVnaW4gIT0gYl9oaXN0b3J5W2ldLmJlZ2luIHx8CisJCQkoaSA+IDAgJiYgIW1hdGNoaW5nVGlt ZWxpbmVVVUlEKCZhX2hpc3RvcnlbaSAtIDFdLCAmYl9oaXN0b3J5W2kgLSAxXSkpKQogCQkJYnJl YWs7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX3Jld2luZC90LzAwNV9zYW1lX3RpbWVs aW5lLnBsIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVfc2FtZV90aW1lbGluZS5wbAppbmRleCA5 NWE0MGMzYjI3MC4uNTI5NjNmMjllMDAgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfcmV3aW5kL3Qv MDA1X3NhbWVfdGltZWxpbmUucGwKKysrIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVfc2FtZV90 aW1lbGluZS5wbApAQCAtNyw2ICs3LDggQEAKICMKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3Mg RkFUQUwgPT4gJ2FsbCc7Cit1c2UgRmlsZTo6Q29weTsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpD bHVzdGVyOwogdXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwogdXNlIFRlc3Q6Ok1vcmU7CiAK QEAgLTIxLDQgKzIzLDM1NSBAQCBSZXdpbmRUZXN0OjpjcmVhdGVfc3RhbmRieSgpOwogUmV3aW5k VGVzdDo6cnVuX3BnX3Jld2luZCgnbG9jYWwnKTsKIFJld2luZFRlc3Q6OmNsZWFuX3Jld2luZF90 ZXN0KCk7CiAKKyMgSGVscGVyIGZ1bmN0aW9uIHRvIHJ1biBwZ19yZXdpbmQgaW4gbG9jYWwgbW9k ZSB3aXRoIHRoZSBnaXZlbiBzb3VyY2UgYW5kCisjIHRhcmdldCBub2RlcyBhbmQgZXh0cmEgYXJn dW1lbnRzLgorIworIyBUaGUgdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXMgYXJlIHN0b3BwZWQgYmVm b3JlIHRoZSBjYWxsIGFuZCB0aGUgdGFyZ2V0IGlzCisjIHJlc3RhcnRlZCBhZnRlcndhcmQuICBU aGUgdGFyZ2V0J3MgcG9zdGdyZXNxbC5jb25mIGlzIGNvcGllZCB0byBhIHRlbXBvcmFyeQorIyBs b2NhdGlvbiBhbmQgcGFzc2VkIHRvIHBnX3Jld2luZCB3aXRoIC0tY29uZmlnLWZpbGUsIHNvIHRo YXQgcGdfcmV3aW5kIGNhbgorIyB1cGRhdGUgdGhlIHRhcmdldCdzIGNvbmZpZyBmaWxlIGluIHBs YWNlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZmlsZQorIyBwZXJtaXNzaW9ucy4gIFRoZSB0ZW1w b3JhcnkgY29uZmlnIGZpbGUgaXMgbW92ZWQgYmFjayB0byB0aGUgdGFyZ2V0J3MgZGF0YQorIyBk aXJlY3RvcnkgYW5kIHBlcm1pc3Npb25zIGZpeGVkIGFmdGVyIHBnX3Jld2luZCBmaW5pc2hlcy4K K3N1YiByZXdpbmRfbm9kZQoreworCW15ICgkdGFyZ2V0LCAkc291cmNlLCAkbGFiZWwsIEBleHRy YV9hcmdzKSA9IEBfOworCSRzb3VyY2UtPnN0b3A7CisJJHRhcmdldC0+c3RvcDsKKworCW15ICR0 cGdkYXRhID0gJHRhcmdldC0+ZGF0YV9kaXI7CisJbXkgJHRtcCA9IFBvc3RncmVTUUw6OlRlc3Q6 OlV0aWxzOjp0ZW1wZGlyOworCWNvcHkoIiR0cGdkYXRhL3Bvc3RncmVzcWwuY29uZiIsICIkdG1w L3RhcmdldC1wb3N0Z3Jlc3FsLmNvbmYudG1wIik7CisKKwljb21tYW5kX29rKAorCQlbCisJCQkn cGdfcmV3aW5kJywKKwkJCSctLWRlYnVnJywKKwkJCSctLXNvdXJjZS1wZ2RhdGEnID0+ICRzb3Vy Y2UtPmRhdGFfZGlyLAorCQkJJy0tdGFyZ2V0LXBnZGF0YScgPT4gJHRhcmdldC0+ZGF0YV9kaXIs CisJCQknLS1uby1zeW5jJywKKwkJCSctLWNvbmZpZy1maWxlJyA9PiAiJHRtcC90YXJnZXQtcG9z dGdyZXNxbC5jb25mLnRtcCIsCisJCQlAZXh0cmFfYXJncywKKwkJXSwKKwkJJGxhYmVsKTsKKwor CW1vdmUoIiR0bXAvdGFyZ2V0LXBvc3RncmVzcWwuY29uZi50bXAiLCAiJHRwZ2RhdGEvcG9zdGdy ZXNxbC5jb25mIik7CisJY2htb2QoJHRhcmdldC0+Z3JvdXBfYWNjZXNzKCkgPyAwNjQwIDogMDYw MCwgIiR0cGdkYXRhL3Bvc3RncmVzcWwuY29uZiIpCisJICBvciBCQUlMX09VVCgidW5hYmxlIHRv IHNldCBwZXJtaXNzaW9ucyBmb3IgJHRwZ2RhdGEvcG9zdGdyZXNxbC5jb25mIik7CisKKwkkdGFy Z2V0LT5zdGFydDsKK30KKworIyBSZXdyaXRlIGEgbm9kZSdzIFRMSSBoaXN0b3J5IGZpbGUgaW4g dGhlIG9sZCAzLWZpZWxkIGZvcm1hdCAobm8gVVVJRCksIHNvCisjIHRoYXQgcGdfcmV3aW5kIHNl ZXMgYSB6ZXJvIFVVSUQgZm9yIHRoYXQgc2lkZSwgYXMgaWYgdGhlIG5vZGUgaGFkIGJlZW4KKyMg cHJvbW90ZWQgYnkgYSBzZXJ2ZXIgdGhhdCBwcmVkYXRlcyB0aGUgVVVJRCBmZWF0dXJlLgorc3Vi IHN0cmlwX3RsaV91dWlkCit7CisJbXkgKCRub2RlLCAkdGxpKSA9IEBfOworCW15ICRoaXN0Zmls ZSA9IHNwcmludGYoIiVzL3BnX3dhbC8lMDhYLmhpc3RvcnkiLCAkbm9kZS0+ZGF0YV9kaXIsICR0 bGkpOworCW9wZW4obXkgJGZoLCAnPCcsICRoaXN0ZmlsZSkgb3IgZGllICJjYW5ub3Qgb3BlbiAk aGlzdGZpbGU6ICQhIjsKKwlteSBAbGluZXMgPSA8JGZoPjsKKwljbG9zZSAkZmg7CisJb3Blbigk ZmgsICc+JywgJGhpc3RmaWxlKSBvciBkaWUgImNhbm5vdCB3cml0ZSAkaGlzdGZpbGU6ICQhIjsK Kwlmb3IgbXkgJGxpbmUgKEBsaW5lcykKKwl7CisJCWNob21wICRsaW5lOworCQlteSBAZiA9IHNw bGl0KC9cdC8sICRsaW5lLCA0KTsKKwkJaWYgKEBmID09IDQpCisJCXsKKwkJCSMgRHJvcCB0aGUg VVVJRCBmaWVsZCAoaW5kZXggMik7IGtlZXAgcGFyZW50VExJLCBzd2l0Y2hwb2ludCwgcmVhc29u LgorCQkJcHJpbnQgJGZoIGpvaW4oIlx0IiwgJGZbMF0sICRmWzFdLCAkZlszXSkgLiAiXG4iOwor CQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnQgJGZoICIkbGluZVxuIjsKKwkJfQorCX0KKwljbG9z ZSAkZmg7Cit9CisKKyMgSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBvcmlnaW4gbm9kZSB3 aXRoIGEgdGVzdCB0YWJsZSBhbmQgYSByb3cgY29udGFpbmluZworIyB0aGUgZ2l2ZW4gbGFiZWwu ICBUaGUgbm9kZSBpcyBzdGFydGVkIGFuZCByZWFkeSBmb3IgdXNlIGFzIGEgc291cmNlIGZvcgor IyBzdGFuZGJ5cy4KK3N1YiBzZXR1cF9vcmlnaW4KK3sKKwlteSAoJGxhYmVsKSA9IEBfOworCW15 ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCRsYWJlbCk7CisJJG5vZGUt PmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsKKwkkbm9kZS0+YXBwZW5kX2NvbmYoJ3Bvc3Rn cmVzcWwuY29uZicsICJ3YWxfa2VlcF9zaXplID0gMzIwTUJcbiIpOworCSRub2RlLT5zdGFydDsK Kwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgVEFCTEUgdGJsICh2YWwgdGV4 dCkiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJTlNFUlQgSU5UTyB0YmwgVkFM VUVTICgnJGxhYmVsJykiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdDSEVDS1BP SU5UJyk7CisJcmV0dXJuICRub2RlOworfQorCisjIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUg bXVsdGlwbGUgc3RhbmRieSBub2RlcyBmcm9tIHRoZSBzYW1lIG9yaWdpbiBub2RlLgorIyBFYWNo IHN0YW5kYnkgZ2V0cyBpdHMgb3duIGJhY2t1cCBhbmQgZGF0YSBkaXJlY3RvcnksIHNvIHRoYXQg dGhleSB3aWxsCisjIGdlbmVyYXRlIGluZGVwZW5kZW50IFVVSURzIG9uIHByb21vdGlvbiBldmVu IHRob3VnaCB0aGV5IHNoYXJlIHRoZSBzYW1lCisjIHRpbWVsaW5lIGhpc3RvcnkgdXAgdG8gdGhl IHBvaW50IG9mIHByb21vdGlvbi4KK3N1YiBzZXR1cF9zdGFuZGJ5c19mcm9tX29yaWdpbgorewor CW15ICgkb3JpZ2luLCBAbmFtZXMpID0gQF87CisJbXkgQHN0YW5kYnlzOworCWZvciBteSAkbmFt ZSAoQG5hbWVzKQorCXsKKwkJbXkgJHN0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVy LT5uZXcoJG5hbWUpOworCQkkb3JpZ2luLT5iYWNrdXAoJHN0YW5kYnktPm5hbWUpOworCQkkc3Rh bmRieS0+aW5pdF9mcm9tX2JhY2t1cCgkb3JpZ2luLCAkc3RhbmRieS0+bmFtZSwKKwkJCWhhc19z dHJlYW1pbmcgPT4gMSk7CisJCSRzdGFuZGJ5LT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25m JywgIndhbF9rZWVwX3NpemUgPSAzMjBNQlxuIik7CisJCSRzdGFuZGJ5LT5zZXRfc3RhbmRieV9t b2RlKCk7CisJCSRzdGFuZGJ5LT5zdGFydDsKKwkJcHVzaCBAc3RhbmRieXMsICRzdGFuZGJ5Owor CX0KKwlyZXR1cm4gQHN0YW5kYnlzOworfQorCisjIEhlbHBlciBmdW5jdGlvbiB0byB3YWl0IGZv ciBtdWx0aXBsZSBzdGFuZGJ5IG5vZGVzIHRvIGNhdGNoIHVwIHRvIHRoZSBvcmlnaW4uCitzdWIg c3luY19zdGFuZGJ5c193aXRoX29yaWdpbgoreworCW15ICgkb3JpZ2luLCBAc3RhbmRieXMpID0g QF87CisJJG9yaWdpbi0+d2FpdF9mb3JfY2F0Y2h1cCgkXykgZm9yIEBzdGFuZGJ5czsKK30KKwor IyBIZWxwZXIgZnVuY3Rpb24gdG8gaW5zZXJ0IGEgcm93IHdpdGggdGhlIGdpdmVuIGxhYmVsIGlu dG8gYSBub2RlJ3MgdGVzdCB0YWJsZS4KK3N1YiB3cml0ZV9yZWNvcmQKK3sKKwlteSAoJG5vZGUs ICRsYWJlbCkgPSBAXzsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJTlNFUlQgSU5U TyB0YmwgVkFMVUVTICgnJGxhYmVsJykiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs ICdDSEVDS1BPSU5UJyk7Cit9CisKKyMgVGVzdCB0aGF0IHBnX3Jld2luZCBkZXRlY3RzIGFuZCBo YW5kbGVzIHR3byBzdGFuZGJ5cyB0aGF0IGluZGVwZW5kZW50bHkKKyMgcHJvbW90ZWQgdG8gdGhl IHNhbWUgdGltZWxpbmUgSUQuICBCZWZvcmUgdGhlIFVVSUQtYmFzZWQgZGl2ZXJnZW5jZSBjaGVj aywKKyMgcGdfcmV3aW5kJ3Mgc2FtZS1UTEkgc2hvcnRjdXQgd291bGQgaW5jb3JyZWN0bHkgc2tp cCB0aGUgcmV3aW5kIGluIHRoaXMKKyMgY2FzZSwgbGVhdmluZyB0aGUgdGFyZ2V0J3MgZGl2ZXJn ZWQgV0FMIGludGFjdC4KKyMKKyMgICBvcmlnaW4gKFRMSSAxKQorIyAgICAgICB8CisjICAgICAg ICstLS0gbm9kZV9hIChUTEkgMSkgLS1wcm9tb3RlLS0+IFRMSSAyLCBVVUlELUEgICh0YXJnZXQp CisjICAgICAgIHwKKyMgICAgICAgKy0tLSBub2RlX2IgKFRMSSAxKSAtLXByb21vdGUtLT4gVExJ IDIsIFVVSUQtQiAgKHNvdXJjZSkKKyMKKyMgcGdfcmV3aW5kIG11c3QgZGV0ZWN0IHRoZSBVVUlE IG1pc21hdGNoIGFuZCByZXdpbmQgbm9kZV9hIHRvIG1hdGNoIG5vZGVfYi4KKworbXkgJG5vZGVf b3JpZ2luID0gc2V0dXBfb3JpZ2luKCdvcmlnaW4nKTsKKworIyBDcmVhdGUgbm9kZV9hIGFuZCBu b2RlX2IgZnJvbSBzZXBhcmF0ZSBiYWNrdXBzIG9mIG9yaWdpbiBzbyB0aGF0IGVhY2gKKyMgaGFz IGl0cyBvd24gZGF0YSBkaXJlY3RvcnkgYW5kIHdpbGwgZ2VuZXJhdGUgYW4gaW5kZXBlbmRlbnQg VVVJRCBvbiBwcm9tb3Rpb24uCitteSAoJG5vZGVfYSwgJG5vZGVfYikgPQorICBzZXR1cF9zdGFu ZGJ5c19mcm9tX29yaWdpbigkbm9kZV9vcmlnaW4sICdub2RlX2EnLCAnbm9kZV9iJyk7CisKKyMg V2FpdCBmb3IgYm90aCBzdGFuZGJ5cyB0byBjYXRjaCB1cCB0byBvcmlnaW4sIHRoZW4gc3RvcCBv cmlnaW4uICBBZnRlcgorIyB0aGlzIHBvaW50IHRoZSB0d28gc3RhbmRieXMgYXJlIGlzb2xhdGVk IGFuZCB3aWxsIHByb21vdGUgaW5kZXBlbmRlbnRseS4KK3N5bmNfc3RhbmRieXNfd2l0aF9vcmln aW4oJG5vZGVfb3JpZ2luLCAkbm9kZV9hLCAkbm9kZV9iKTsKKyRub2RlX29yaWdpbi0+c3RvcDsK KworIyBQcm9tb3RlIGJvdGggc3RhbmRieXMuICBFYWNoIGxhbmRzIG9uIFRMSSAyIGJ1dCBnZW5l cmF0ZXMgYSBkaXN0aW5jdCBVVUlELAorIyBzbyB0aGUgcmVzdWx0aW5nIGNsdXN0ZXJzIGFyZSBk aXZlcmdlZCBldmVuIHRob3VnaCB0aGV5IHNoYXJlIGEgdGltZWxpbmUgSUQuCiskbm9kZV9hLT5w cm9tb3RlOworJG5vZGVfYi0+cHJvbW90ZTsKKworIyBJbnNlcnQgYSBkaXZlcmdlbnQgcm93IG9u IGVhY2ggc28gdGhlIHJld2luZCBoYXMgdmlzaWJsZSB3b3JrIHRvIGRvLgord3JpdGVfcmVjb3Jk KCRub2RlX2EsICdpbiBBJyk7Cit3cml0ZV9yZWNvcmQoJG5vZGVfYiwgJ2luIEInKTsKKworcmV3 aW5kX25vZGUoJG5vZGVfYSwgJG5vZGVfYiwKKwkncGdfcmV3aW5kIGRldGVjdHMgaW5kZXBlbmRl bnQgc2FtZS1UTEkgcHJvbW90aW9ucycpOworCitteSAkcmVzdWx0ID0KKyAgJG5vZGVfYS0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgdmFsIEZST00gdGJsIE9SREVSIEJZIHZhbCIpOwor aXMoJHJlc3VsdCwgImluIEJcbm9yaWdpbiIsCisJJ3Jld291bmQgbm9kZSBoYXMgc291cmNlIGRh dGEsIG5vdCBpdHMgb3duIGRpdmVyZ2VudCBkYXRhJyk7CisKKyRub2RlX2EtPnRlYXJkb3duX25v ZGU7Ciskbm9kZV9iLT50ZWFyZG93bl9ub2RlOworJG5vZGVfb3JpZ2luLT50ZWFyZG93bl9ub2Rl OworCisjIFRlc3QgdGhhdCBwZ19yZXdpbmQgY29ycmVjdGx5IHJld2luZHMgYWNyb3NzIGEgVExJ IG1pc21hdGNoIGJ1cmllZCBpbiBhIHNoYXJlZAorIyBwcmVmaXggb2YgdGhlIHRpbWVsaW5lIGhp c3RvcnkuICBUaGUgdGFyZ2V0IGhhcyBnb25lIHRocm91Z2ggdGhyZWUgdGltZWxpbmVzCisjIChU TEkgMSAtPiBUTEkgMiAtPiBUTEkgMykgd2hpbGUgdGhlIHNvdXJjZSBpbmRlcGVuZGVudGx5IHBy b21vdGVkIGZyb20gVExJIDEKKyMgdG8gd2hhdCBpcyBudW1lcmljYWxseSBUTEkgMiBidXQgd2l0 aCBhIGRpZmZlcmVudCBVVUlEIChUTEkgMicpLiAgVGhlIGRlZXBlc3QKKyMgY29tbW9uIGFuY2Vz dG9yIGlzIHRoZXJlZm9yZSBUTEkgMSwgYW5kIHBnX3Jld2luZCBtdXN0IHJld2luZCB0aGUgdGFy Z2V0IGFsbAorIyB0aGUgd2F5IGJhY2sgdG8gdGhlIGVuZCBvZiBUTEkgMS4KKyMKKyMgICBvcmln aW4gKFRMSSAxKSAtLSstLSBub2RlX3ggLS1wcm9tb3RlLS0+IFRMSSAyIC0tIG5vZGVfYSAtLXBy b21vdGUtLT4gVExJIDMKKyMgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKHRhcmdldDogVExJIDEtPlRMSSAyLT5UTEkgMykKKyMgICAgICAgICAg ICAgICAgICAgICstLSBub2RlX2IgLS1wcm9tb3RlLS0+IFRMSSAyJworIyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZTogVExJIDEtPlRMSSAyJykKKyMK KyMgZmluZENvbW1vbkFuY2VzdG9yVGltZWxpbmUgd2Fsa3MgZm9yd2FyZDogVExJIDEgZW50cmll cyBtYXRjaCAoVVVJRD0wIG9uCisjIGJvdGggc2lkZXMpLCB0aGVuIFRMSSAyIHZzIFRMSSAyJyBt YXRjaCBvbiB0bGkgYW5kIGJlZ2luIGJ1dCBkaWZmZXIgb24KKyMgVVVJRCwgc2lnbmFsbGluZyBp bmRlcGVuZGVudCBwcm9tb3Rpb25zLiAgVGhlIGFsZ29yaXRobSB0aGVyZWZvcmUgYmFja3MgdXAK KyMgdG8gVExJIDEgYXMgdGhlIGNvbW1vbiBhbmNlc3RvciBhbmQgc2V0cyB0aGUgZGl2ZXJnZW5j ZSBwb2ludCB0byB0aGUgZW5kCisjIG9mIFRMSSAxLgorCitteSAkbm9kZV9vcmlnaW4yID0gc2V0 dXBfb3JpZ2luKCdvcmlnaW4yJyk7CisKKyMgbm9kZV94IGFuZCBub2RlX2IgYm90aCBzdGFydCBm cm9tIHRoZSBzYW1lIFRMSSAxIGJhc2VsaW5lLgorbXkgKCRub2RlX3gsICRub2RlX2IyKSA9Cisg IHNldHVwX3N0YW5kYnlzX2Zyb21fb3JpZ2luKCRub2RlX29yaWdpbjIsICdub2RlX3gnLCAnbm9k ZV9iMicpOworCisjIEJvdGggc3RhbmRieXMgbXVzdCBiZSBjYXVnaHQgdXAgdG8gdGhlIHNhbWUg TFNOIGJlZm9yZSBvcmlnaW4gc3RvcHMsIHNvCisjIHRoYXQgVExJIDIgYW5kIFRMSSAyJyBib3Ro IGJlZ2luIGF0IHRoZSBzYW1lIFdBTCBwb3NpdGlvbi4KK3N5bmNfc3RhbmRieXNfd2l0aF9vcmln aW4oJG5vZGVfb3JpZ2luMiwgJG5vZGVfeCwgJG5vZGVfYjIpOworJG5vZGVfb3JpZ2luMi0+c3Rv cDsKKworIyBQcm9tb3RlIG5vZGVfeCB0byBUTEkgMiAoVVVJRC1YKSBhbmQgaW5zZXJ0IGEgcm93 LiAgbm9kZV9iMiBpcyBzdGlsbCBvbgorIyBUTEkgMSBhbmQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkg VExJIDIgV0FMLgorJG5vZGVfeC0+cHJvbW90ZTsKK3dyaXRlX3JlY29yZCgkbm9kZV94LCAneCcp OworCisjIEJ1aWxkIG5vZGVfYTIgYXMgYSBzdGFuZGJ5IG9mIG5vZGVfeCwgdGhlbiBwcm9tb3Rl IGl0IHRvIFRMSSAzLgorbXkgKCRub2RlX2EyKSA9IHNldHVwX3N0YW5kYnlzX2Zyb21fb3JpZ2lu KCRub2RlX3gsICdub2RlX2EyJyk7CisKK3N5bmNfc3RhbmRieXNfd2l0aF9vcmlnaW4oJG5vZGVf eCwgJG5vZGVfYTIpOworJG5vZGVfeC0+c3RvcDsKKworJG5vZGVfYTItPnByb21vdGU7CisKKyMg Tm93IHByb21vdGUgbm9kZV9iMiBpbmRlcGVuZGVudGx5IGZyb20gVExJIDEgdG8gVExJIDInIChV VUlELUIsICE9IFVVSUQtWCkuCiskbm9kZV9iMi0+cHJvbW90ZTsKK3dyaXRlX3JlY29yZCgkbm9k ZV9iMiwgJ2InKTsKKworIyBSZXdpbmQgbm9kZV9hMiAoVExJIDEtPlRMSSAyLT5UTEkgMykgZnJv bSBub2RlX2IyIChUTEkgMS0+VExJIDInKSBpbgorIyBsb2NhbCBtb2RlLiAgVGhlIHJld2luZCBt dXN0IHJlYWNoIGJhY2sgdG8gdGhlIGVuZCBvZiBUTEkgMS4KKyMKKyMgbm9kZV9hMiB3YXMgaW5p dGlhbGlzZWQgZnJvbSBhIHN0cmVhbWluZyBiYWNrdXAgb2Ygbm9kZV94IHRha2VuIGFmdGVyCisj IG5vZGVfeCBoYWQgYWxyZWFkeSBjb21wbGV0ZWQgc2VnbWVudCA0IG9mIFRMSSAyOyB0aGF0IHNl Z21lbnQgdGhlcmVmb3JlCisjIGRvZXMgbm90IGFwcGVhciBpbiBub2RlX2EyJ3MgcGdfd2FsLiAg cGdfcmV3aW5kJ3MgYmFja3dhcmQgc2NhbiBmb3IgdGhlCisjIGxhc3QgY2hlY2twb2ludCBiZWZv cmUgdGhlIGRpdmVyZ2VuY2UgcG9pbnQgbmVlZHMgdGhhdCBzZWdtZW50LCBzbyB3ZQorIyBwb2lu dCByZXN0b3JlX2NvbW1hbmQgYXQgbm9kZV94J3MgcGdfd2FsIGFuZCB1c2UgLS1yZXN0b3JlLXRh cmdldC13YWwuCisjCisjIE5vdGU6IG5vIHJvdyBpcyBpbnNlcnRlZCBvbiBUTEkgMy4gIFRoaXMg aXMgaW50ZW50aW9uYWw6IHRoZSBvbmx5CisjIHBvc3QtZGl2ZXJnZW5jZSB0YWJsZSBtb2RpZmlj YXRpb24gaW4gdGhlIHRhcmdldCdzIFdBTCBpcyB0aGUgJ3gnIElOU0VSVAorIyBvbiBUTEkgMi4g IE9uIHVucGF0Y2hlZCBjb2RlIHRoZSBXQUwgc2NhbiB3b3VsZCBzdGFydCBmcm9tIHRoZSBUTEkg MgorIyBzaHV0ZG93biBjaGVja3BvaW50IChqdXN0IGJlZm9yZSBUTEkgMyksIG1pc3MgdGhhdCBl YXJsaWVyIGluc2VydCwgYW5kCisjIGxlYXZlICd4JyBpbiBwbGFjZSBpbnN0ZWFkIG9mIHJlcGxh Y2luZyBpdCB3aXRoICdiJy4KK215ICRub2RlX3hfd2FsZGlyID0gJG5vZGVfeC0+ZGF0YV9kaXIg LiAiL3BnX3dhbCI7Ciskbm9kZV9hMi0+YXBwZW5kX2NvbmYoJ3Bvc3RncmVzcWwuY29uZicsCisJ InJlc3RvcmVfY29tbWFuZCA9ICdjcCBcIiRub2RlX3hfd2FsZGlyLyVmXCIgXCIlcFwiJ1xuIik7 CisKK3Jld2luZF9ub2RlKCRub2RlX2EyLCAkbm9kZV9iMiwKKwkncGdfcmV3aW5kIHJld2luZHMg YWNyb3NzIG1pc21hdGNoZWQgVExJIDIgLyBUTEkgMi1wcmltZSB0byBUTEkgMScsCisJJy0tcmVz dG9yZS10YXJnZXQtd2FsJyk7CitteSAkcmVzdWx0MiA9CisgICRub2RlX2EyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgIlNFTEVDVCB2YWwgRlJPTSB0YmwgT1JERVIgQlkgdmFsIik7CitpcygkcmVz dWx0MiwgImJcbm9yaWdpbjIiLAorCSdyZXdvdW5kIG5vZGUgcmVmbGVjdHMgc291cmNlIGhpc3Rv cnksIG5vdCB0YXJnZXQgVExJIDIvVExJIDMgZGF0YScpOworCiskbm9kZV9hMi0+dGVhcmRvd25f bm9kZTsKKyRub2RlX2IyLT50ZWFyZG93bl9ub2RlOworJG5vZGVfeC0+dGVhcmRvd25fbm9kZTsK KyRub2RlX29yaWdpbjItPnRlYXJkb3duX25vZGU7CisKKyMgVGVzdCB0aGF0IHBnX3Jld2luZCBj b3JyZWN0bHkgZGV0ZWN0cyBhIG1pc21hdGNoIHdoZW4gb25lIGNsdXN0ZXIncyBUTEkgMgorIyBo aXN0b3J5IGVudHJ5IGNhcnJpZXMgYSB6ZXJvIFVVSUQgKG9sZC1mb3JtYXQgaGlzdG9yeSBmaWxl KSB3aGlsZSB0aGUgb3RoZXIKKyMgY2FycmllcyBhIHJlYWwgVVVJRC4gIFRoZSB0d28gY2x1c3Rl cnMgbXVzdCBoYXZlIHByb21vdGVkIGluZGVwZW5kZW50bHksIHNvCisjIHBnX3Jld2luZCBtdXN0 IHJld2luZCB0byBUTEkgMSByYXRoZXIgdGhhbiBhY2NlcHRpbmcgdGhlIHNhbWUtVExJIHNob3J0 Y3V0LgorIworIyBSdW4gYm90aCBvcmllbnRhdGlvbnM6CisjICAgKGEpIHRhcmdldCBoYXMgemVy byBVVUlELCBzb3VyY2UgaGFzIHJlYWwgVVVJRAorIyAgIChiKSB0YXJnZXQgaGFzIHJlYWwgVVVJ RCwgc291cmNlIGhhcyB6ZXJvIFVVSUQKKyMKKyMgSW4gYm90aCBjYXNlcyB0aGUgc2V0dXAgaXM6 CisjCisjICAgb3JpZ2luIChUTEkgMSkgLS0rLS0gbm9kZV9wIC0tcHJvbW90ZS0tPiBUTEkgMiwg VVVJRC1QICAodGFyZ2V0KQorIyAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgICAgICAgICAg ICAgICAgKy0tIG5vZGVfcSAtLXByb21vdGUtLT4gVExJIDIsIFVVSUQtUSAgKHNvdXJjZSkKKyMK KyMgT25lIHNpZGUgdGhlbiBoYXMgaXRzIGhpc3RvcnkgZmlsZSByZXdyaXR0ZW4gdG8gdGhlIG9s ZCAzLWZpZWxkIGZvcm1hdCBzbworIyB0aGF0IGl0cyBVVUlEIHJlYWRzIGFzIHplcm8uICBwZ19y ZXdpbmQgbXVzdCB0cmVhdCB6ZXJvLXZzLW5vbnplcm8gYXMKKyMgaW5jb21wYXRpYmxlICh0aGV5 IGNhbm5vdCBiZSB0aGUgc2FtZSBwcm9tb3Rpb24pIGFuZCByZXdpbmQgdG8gVExJIDEuCisKK2Zv ciBteSAkc3RyaXBfdGFyZ2V0ICgxLCAwKQoreworCW15ICR6ZXJvX3NpZGUgPSAkc3RyaXBfdGFy Z2V0ID8gJ3RhcmdldCcgOiAnc291cmNlJzsKKwlteSAkcmVhbF9zaWRlID0gJHN0cmlwX3Rhcmdl dCA/ICdzb3VyY2UnIDogJ3RhcmdldCc7CisJbXkgJHNmeCA9ICRzdHJpcF90YXJnZXQgPyAnenQn IDogJ3pzJzsKKwlteSAkbGFiZWwgPQorCSAgInBnX3Jld2luZCByZXdpbmRzIHdoZW4gJHplcm9f c2lkZSBoYXMgemVybyBVVUlEIGFuZCAkcmVhbF9zaWRlIGhhcyByZWFsIFVVSUQiOworCisJbXkg JG5vZGVfb3JpZ2luMyA9IHNldHVwX29yaWdpbigib3JpZ2luM18kc2Z4Iik7CisJbXkgKCRub2Rl X3AsICRub2RlX3EpID0KKwkgIHNldHVwX3N0YW5kYnlzX2Zyb21fb3JpZ2luKCRub2RlX29yaWdp bjMsICJub2RlX3BfJHNmeCIsICJub2RlX3FfJHNmeCIpOworCisJc3luY19zdGFuZGJ5c193aXRo X29yaWdpbigkbm9kZV9vcmlnaW4zLCAkbm9kZV9wLCAkbm9kZV9xKTsKKwkkbm9kZV9vcmlnaW4z LT5zdG9wOworCisJJG5vZGVfcC0+cHJvbW90ZTsKKwkkbm9kZV9xLT5wcm9tb3RlOworCisJd3Jp dGVfcmVjb3JkKCRub2RlX3AsICdpbiBQJyk7CisJd3JpdGVfcmVjb3JkKCRub2RlX3EsICdpbiBR Jyk7CisKKwkjIFN0cmlwIFVVSUQgZnJvbSB0aGUgY2hvc2VuIHNpZGUgdG8gc2ltdWxhdGUgYSBw cmUtVVVJRCBzZXJ2ZXIuCisJc3RyaXBfdGxpX3V1aWQoJHN0cmlwX3RhcmdldCA/ICRub2RlX3Ag OiAkbm9kZV9xLCAyKTsKKworCXJld2luZF9ub2RlKCRub2RlX3AsICRub2RlX3EsICRsYWJlbCk7 CisJbXkgJHJlc3VsdDMgPQorCSAgJG5vZGVfcC0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxF Q1QgdmFsIEZST00gdGJsIE9SREVSIEJZIHZhbCIpOworCWlzKCAkcmVzdWx0MywKKwkJImluIFFc bm9yaWdpbjNfJHNmeCIsCisJCSdyZXdvdW5kIG5vZGUgaGFzIHNvdXJjZSBkYXRhLCBub3QgaXRz IG93biBkaXZlcmdlbnQgcm93Jyk7CisKKwkkbm9kZV9wLT50ZWFyZG93bl9ub2RlOworCSRub2Rl X3EtPnRlYXJkb3duX25vZGU7CisJJG5vZGVfb3JpZ2luMy0+dGVhcmRvd25fbm9kZTsKK30KKwor IyBUZXN0IHRoYXQgcGdfcmV3aW5kIGRldGVjdHMgaW5kZXBlbmRlbnQgcHJvbW90aW9ucyB0byBU TEkgMyB3aGVuIGJvdGgKKyMgY2x1c3RlcnMgc2hhcmUgYSBjb21tb24gVExJIDEgLT4gVExJIDIg aGlzdG9yeSAoc2FtZSBVVUlEKSBidXQgaW5kZXBlbmRlbnRseQorIyBwcm9tb3RlZCBmcm9tIFRM SSAyIHRvIFRMSSAzLCBwcm9kdWNpbmcgZGlmZmVyZW50IFRMSSAzIFVVSURzLgorIworIyAgIG9y aWdpbiAoVExJIDEpIC0tLSBub2RlX21pZCAtLXByb21vdGUtLT4gVExJIDIsIFVVSUQtTQorIyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIG5vZGVfYyAt LXByb21vdGUtLT4gVExJIDMsIFVVSUQtQyAgKHRhcmdldCkKKyMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLSBub2RlX2QgLS1wcm9tb3RlLS0+IFRMSSAz JywgVVVJRC1EICAoc291cmNlKQorIworIyBUaGUgc2FtZS1UTEkgc2hvcnRjdXQgY29tcGFyZXMg ZW50cnlbTmVudHJpZXMtMl0udGx1dWlkIG9uIGVhY2ggc2lkZTsgdGhhdAorIyBpcyB0aGUgVVVJ RCBvZiB0aGUgVExJIDMgcHJvbW90aW9uLCB3aGljaCBkaWZmZXJzLiAgVGhlIGZ1bGwgcmV3aW5k IHBhdGgKKyMgdGhlbiB3YWxrcyB0aGUgaGlzdG9yeSBmb3J3YXJkOiBUTEkgMSBtYXRjaGVzIChz YW1lIHRsaS9iZWdpbi9VVUlELU0gYXQKKyMgZW50cnlbMF0pLCBUTEkgMiBhbHNvIG1hdGNoZXMg KHNhbWUgdGxpL2JlZ2luOyBVVUlELU0gaXMgdGhlIHNhbWUgb24gYm90aAorIyBzaWRlcyBhdCBl bnRyeVswXSksIGJ1dCBUTEkgMyB2cyBUTEkgMycgZGlmZmVyIGF0IGVudHJ5WzFdIChVVUlELUMg IT0gVVVJRC1EKSwKKyMgc28gdGhlIGRpdmVyZ2VuY2UgcG9pbnQgaXMgc2V0IHRvIHRoZSBlbmQg b2YgVExJIDIuCisKK215ICRub2RlX29yaWdpbjQgPSBzZXR1cF9vcmlnaW4oJ29yaWdpbjQnKTsK K215ICgkbm9kZV9taWQpID0gc2V0dXBfc3RhbmRieXNfZnJvbV9vcmlnaW4oJG5vZGVfb3JpZ2lu NCwgJ25vZGVfbWlkJyk7CisKK3N5bmNfc3RhbmRieXNfd2l0aF9vcmlnaW4oJG5vZGVfb3JpZ2lu NCwgJG5vZGVfbWlkKTsKKyRub2RlX29yaWdpbjQtPnN0b3A7CisKKyMgUHJvbW90ZSBub2RlX21p ZCB0byBUTEkgMiBhbmQgaW5zZXJ0IGEgcm93IHRoYXQgYm90aCBUTEkgMyBub2RlcyB3aWxsIHNo YXJlLgorJG5vZGVfbWlkLT5wcm9tb3RlOword3JpdGVfcmVjb3JkKCRub2RlX21pZCwgJ21pZCcp OworCisjIG5vZGVfYyBhbmQgbm9kZV9kIGJvdGggc3RhcnQgYXMgc3RhbmRieXMgb2Ygbm9kZV9t aWQgc28gdGhleSBzaGFyZSB0aGUgc2FtZQorIyBUTEkgMiBwcm9tb3Rpb24gVVVJRCAoVVVJRC1N KS4KK215ICgkbm9kZV9jLCAkbm9kZV9kKSA9CisgIHNldHVwX3N0YW5kYnlzX2Zyb21fb3JpZ2lu KCRub2RlX21pZCwgJ25vZGVfYycsICdub2RlX2QnKTsKK3N5bmNfc3RhbmRieXNfd2l0aF9vcmln aW4oJG5vZGVfbWlkLCAkbm9kZV9jLCAkbm9kZV9kKTsKKyRub2RlX21pZC0+c3RvcDsKKworIyBQ cm9tb3RlIGJvdGggaW5kZXBlbmRlbnRseTsgZWFjaCBnZW5lcmF0ZXMgYSBkaXN0aW5jdCBUTEkg MyBVVUlELgorJG5vZGVfYy0+cHJvbW90ZTsKKyRub2RlX2QtPnByb21vdGU7CisKK3dyaXRlX3Jl Y29yZCgkbm9kZV9jLCAnYycpOword3JpdGVfcmVjb3JkKCRub2RlX2QsICdkJyk7CisKK3Jld2lu ZF9ub2RlKCRub2RlX2MsICRub2RlX2QsCisJJ3BnX3Jld2luZCBkZXRlY3RzIGluZGVwZW5kZW50 IFRMSSAzIC8gVExJIDMtcHJpbWUgcHJvbW90aW9ucyBzaGFyaW5nIFRMSSAyJworKTsKK215ICRy ZXN1bHQ0ID0KKyAgJG5vZGVfYy0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgdmFsIEZS T00gdGJsIE9SREVSIEJZIHZhbCIpOworaXMoJHJlc3VsdDQsICJkXG5taWRcbm9yaWdpbjQiLAor CSdyZXdvdW5kIG5vZGUgaGFzIHNvdXJjZSBUTEkgMy1wcmltZSBkYXRhLCBub3QgaXRzIG93biBU TEkgMyBkYXRhJyk7CisKKyRub2RlX2MtPnRlYXJkb3duX25vZGU7Ciskbm9kZV9kLT50ZWFyZG93 bl9ub2RlOworJG5vZGVfbWlkLT50ZWFyZG93bl9ub2RlOworJG5vZGVfb3JpZ2luNC0+dGVhcmRv d25fbm9kZTsKKwogZG9uZV90ZXN0aW5nKCk7CmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX3Jld2lu ZC90aW1lbGluZS5jIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdGltZWxpbmUuYwppbmRleCBkZGEwNmVh YTBiYy4uYjY1MDA2MDZiMjcgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfcmV3aW5kL3RpbWVsaW5l LmMKKysrIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdGltZWxpbmUuYwpAQCAtOSw5ICs5LDQwIEBACiAg Ki8KICNpbmNsdWRlICJwb3N0Z3Jlc19mZS5oIgogCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNs dWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgImFjY2Vzcy90aW1lbGluZS5oIgogI2luY2x1ZGUg InBnX3Jld2luZC5oIgogCisvKgorICogUGFyc2UgYSBVVUlEIHN0cmluZyBpbiBzdGFuZGFyZCBk YXNoZWQgZm9ybSBpbnRvIGEgcGdfdXVpZF90LgorICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3Ms IGZhbHNlIGlmIHN0ciBpcyBub3QgYSB2YWxpZCBVVUlEIHN0cmluZy4KKyAqLworc3RhdGljIGJv b2wKK3Jld2luZF9wYXJzZV91dWlkKGNvbnN0IGNoYXIgKnN0ciwgcGdfdXVpZF90ICp1dWlkKQor eworCWNvbnN0IGNoYXIgKnNyYyA9IHN0cjsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgVVVJRF9M RU47IGkrKykKKwl7CisJCWNoYXIJCWJ1ZlszXTsKKworCQlpZiAoIWlzeGRpZ2l0KCh1bnNpZ25l ZCBjaGFyKSBzcmNbMF0pIHx8CisJCQkhaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIHNyY1sxXSkp CisJCQlyZXR1cm4gZmFsc2U7CisJCWJ1ZlswXSA9IHNyY1swXTsKKwkJYnVmWzFdID0gc3JjWzFd OworCQlidWZbMl0gPSAnXDAnOworCQl1dWlkLT5kYXRhW2ldID0gKHVuc2lnbmVkIGNoYXIpIHN0 cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJCXNyYyArPSAyOworCQkvKiBza2lwIGRhc2ggYXQgcG9z aXRpb25zIGFmdGVyIGJ5dGVzIDMsIDUsIDcsIDkgKGkgPT0gMyw1LDcsOSkgKi8KKwkJaWYgKHNy Y1swXSA9PSAnLScgJiYgKGkgPT0gMyB8fCBpID09IDUgfHwgaSA9PSA3IHx8IGkgPT0gOSkpCisJ CQlzcmMrKzsKKwl9CisJcmV0dXJuICgqc3JjID09ICdcMCcpOworfQorCiAvKgogICogVGhpcyBp cyBjb3B5LXBhc3RlZCBmcm9tIHRoZSBiYWNrZW5kIHJlYWRUaW1lTGluZUhpc3RvcnksIG1vZGlm aWVkIHRvCiAgKiByZXR1cm4gYSBtYWxsb2MnZCBhcnJheSBhbmQgdG8gd29yayB3aXRob3V0IGJh Y2tlbmQgZnVuY3Rpb25zLgpAQCAtNDgsNiArNzksNyBAQCByZXdpbmRfcGFyc2VUaW1lTGluZUhp c3RvcnkoY2hhciAqYnVmZmVyLCBUaW1lTGluZUlEIHRhcmdldFRMSSwgaW50ICpuZW50cmllcykK IAkJdWludDMyCQlzd2l0Y2hwb2ludF9oaTsKIAkJdWludDMyCQlzd2l0Y2hwb2ludF9sbzsKIAkJ aW50CQkJbmZpZWxkczsKKwkJY2hhcgkJdXVpZF9zdHJbVVVJRF9TVFJfTEVOICsgMV0gPSB7MH07 CiAKIAkJZmxpbmUgPSBidWZwdHI7CiAJCXdoaWxlICgqYnVmcHRyICYmICpidWZwdHIgIT0gJ1xu JykKQEAgLTY2LDcgKzk4LDggQEAgcmV3aW5kX3BhcnNlVGltZUxpbmVIaXN0b3J5KGNoYXIgKmJ1 ZmZlciwgVGltZUxpbmVJRCB0YXJnZXRUTEksIGludCAqbmVudHJpZXMpCiAJCWlmICgqcHRyID09 ICdcMCcgfHwgKnB0ciA9PSAnIycpCiAJCQljb250aW51ZTsKIAotCQluZmllbGRzID0gc3NjYW5m KGZsaW5lLCAiJXVcdCVYLyUwOFgiLCAmdGxpLCAmc3dpdGNocG9pbnRfaGksICZzd2l0Y2hwb2lu dF9sbyk7CisJCW5maWVsZHMgPSBzc2NhbmYoZmxpbmUsICIldVx0JVgvJTA4WFx0JTM2cyIsICZ0 bGksICZzd2l0Y2hwb2ludF9oaSwKKwkJCQkJCSAmc3dpdGNocG9pbnRfbG8sIHV1aWRfc3RyKTsK IAogCQlpZiAobmZpZWxkcyA8IDEpCiAJCXsKQEAgLTc1LDcgKzEwOCw3IEBAIHJld2luZF9wYXJz ZVRpbWVMaW5lSGlzdG9yeShjaGFyICpidWZmZXIsIFRpbWVMaW5lSUQgdGFyZ2V0VExJLCBpbnQg Km5lbnRyaWVzKQogCQkJcGdfbG9nX2Vycm9yX2RldGFpbCgiRXhwZWN0ZWQgYSBudW1lcmljIHRp bWVsaW5lIElELiIpOwogCQkJZXhpdCgxKTsKIAkJfQotCQlpZiAobmZpZWxkcyAhPSAzKQorCQlp ZiAobmZpZWxkcyA8IDMpCiAJCXsKIAkJCXBnX2xvZ19lcnJvcigic3ludGF4IGVycm9yIGluIGhp c3RvcnkgZmlsZTogJXMiLCBmbGluZSk7CiAJCQlwZ19sb2dfZXJyb3JfZGV0YWlsKCJFeHBlY3Rl ZCBhIHdyaXRlLWFoZWFkIGxvZyBzd2l0Y2hwb2ludCBsb2NhdGlvbi4iKTsKQEAgLTk5LDcgKzEz MiwxNCBAQCByZXdpbmRfcGFyc2VUaW1lTGluZUhpc3RvcnkoY2hhciAqYnVmZmVyLCBUaW1lTGlu ZUlEIHRhcmdldFRMSSwgaW50ICpuZW50cmllcykKIAkJZW50cnktPmVuZCA9ICgodWludDY0KSAo c3dpdGNocG9pbnRfaGkpKSA8PCAzMiB8ICh1aW50NjQpIHN3aXRjaHBvaW50X2xvOwogCQlwcmV2 ZW5kID0gZW50cnktPmVuZDsKIAotCQkvKiB3ZSBpZ25vcmUgdGhlIHJlbWFpbmRlciBvZiBlYWNo IGxpbmUgKi8KKwkJLyoKKwkJICogUGFyc2UgdGhlIG9wdGlvbmFsIFVVSUQgZmllbGQuICBPbGQg aGlzdG9yeSBmaWxlcyBoYXZlIHRoZSByZWFzb24KKwkJICogc3RyaW5nIGluIGZpZWxkIDQ7IGl0 cyBmaXJzdCB3b3JkIGlzIG11Y2ggc2hvcnRlciB0aGFuIFVVSURfU1RSX0xFTgorCQkgKiBzbyB0 aGUgbGVuZ3RoIGNoZWNrIHNhZmVseSBkaXN0aW5ndWlzaGVzIG9sZCBmcm9tIG5ldyBmb3JtYXQu CisJCSAqLworCQltZW1zZXQoJmVudHJ5LT50bHV1aWQsIDAsIHNpemVvZihwZ191dWlkX3QpKTsK KwkJaWYgKG5maWVsZHMgPT0gNCAmJiBzdHJsZW4odXVpZF9zdHIpID09IFVVSURfU1RSX0xFTikK KwkJCXJld2luZF9wYXJzZV91dWlkKHV1aWRfc3RyLCAmZW50cnktPnRsdXVpZCk7CiAJfQogCiAJ aWYgKGVudHJpZXMgJiYgdGFyZ2V0VExJIDw9IGxhc3R0bGkpCkBAIC0xMjMsNiArMTYzLDcgQEAg cmV3aW5kX3BhcnNlVGltZUxpbmVIaXN0b3J5KGNoYXIgKmJ1ZmZlciwgVGltZUxpbmVJRCB0YXJn ZXRUTEksIGludCAqbmVudHJpZXMpCiAJZW50cnktPnRsaSA9IHRhcmdldFRMSTsKIAllbnRyeS0+ YmVnaW4gPSBwcmV2ZW5kOwogCWVudHJ5LT5lbmQgPSBJbnZhbGlkWExvZ1JlY1B0cjsKKwltZW1z ZXQoJmVudHJ5LT50bHV1aWQsIDAsIHNpemVvZihwZ191dWlkX3QpKTsKIAogCSpuZW50cmllcyA9 IG5saW5lczsKIAlyZXR1cm4gZW50cmllczsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vz cy90aW1lbGluZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3RpbWVsaW5lLmgKaW5kZXggOTdmMWQ2 MTljMzUuLmNkZDY0MmM5NGYwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvdGltZWxp bmUuaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvdGltZWxpbmUuaApAQCAtMTMsNiArMTMsNyBA QAogCiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dkZWZzLmgiCiAjaW5jbHVkZSAibm9kZXMvcGdfbGlz dC5oIgorI2luY2x1ZGUgInV0aWxzL3V1aWQuaCIKIAogLyoKICAqIEEgbGlzdCBvZiB0aGVzZSBz dHJ1Y3RzIGRlc2NyaWJlcyB0aGUgdGltZWxpbmUgaGlzdG9yeSBvZiB0aGUgc2VydmVyLiBFYWNo CkBAIC0yMiw5ICsyMywxMCBAQAogICogcG9pbnRlcnMgb2YgYWxsIHRoZSBlbnRyaWVzIGZvcm0g YSBjb250aWd1b3VzIGxpbmUgZnJvbSBiZWdpbm5pbmcgb2YgdGltZQogICogdG8gaW5maW5pdHku CiAgKi8KLXR5cGVkZWYgc3RydWN0Cit0eXBlZGVmIHN0cnVjdCBUaW1lTGluZUhpc3RvcnlFbnRy eQogewogCVRpbWVMaW5lSUQJdGxpOworCXBnX3V1aWRfdAl0bHV1aWQ7CQkJLyogZnJvbSBoaXN0 b3J5IGZpbGU7IHplcm8gaWYgdW5rbm93biAqLwogCVhMb2dSZWNQdHIJYmVnaW47CQkJLyogaW5j bHVzaXZlICovCiAJWExvZ1JlY1B0cgllbmQ7CQkJLyogZXhjbHVzaXZlLCBJbnZhbGlkWExvZ1Jl Y1B0ciBtZWFucyBpbmZpbml0eSAqLwogfSBUaW1lTGluZUhpc3RvcnlFbnRyeTsKQEAgLTMzLDYg KzM1LDcgQEAgZXh0ZXJuIExpc3QgKnJlYWRUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCB0YXJn ZXRUTEkpOwogZXh0ZXJuIGJvb2wgZXhpc3RzVGltZUxpbmVIaXN0b3J5KFRpbWVMaW5lSUQgcHJv YmVUTEkpOwogZXh0ZXJuIFRpbWVMaW5lSUQgZmluZE5ld2VzdFRpbWVMaW5lKFRpbWVMaW5lSUQg c3RhcnRUTEkpOwogZXh0ZXJuIHZvaWQgd3JpdGVUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCBu ZXdUTEksIFRpbWVMaW5lSUQgcGFyZW50VExJLAorCQkJCQkJCQkgY29uc3QgcGdfdXVpZF90ICpu ZXdUTFVVSUQsCiAJCQkJCQkJCSBYTG9nUmVjUHRyIHN3aXRjaHBvaW50LCBjaGFyICpyZWFzb24p OwogZXh0ZXJuIHZvaWQgd3JpdGVUaW1lTGluZUhpc3RvcnlGaWxlKFRpbWVMaW5lSUQgdGxpLCBj aGFyICpjb250ZW50LCBpbnQgc2l6ZSk7CiBleHRlcm4gdm9pZCByZXN0b3JlVGltZUxpbmVIaXN0 b3J5RmlsZXMoVGltZUxpbmVJRCBiZWdpbiwgVGltZUxpbmVJRCBlbmQpOwpkaWZmIC0tZ2l0IGEv c3JjL2luY2x1ZGUvYWNjZXNzL3hsb2dfaW50ZXJuYWwuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy94 bG9nX2ludGVybmFsLmgKaW5kZXggNTU2NjNlNmY0YWYuLjIwYTJmMzQ1ZmQzIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ19pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy94bG9nX2ludGVybmFsLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJhY2Nlc3Mv eGxvZ2RlZnMuaCIKICNpbmNsdWRlICJhY2Nlc3MveGxvZ3JlYWRlci5oIgogI2luY2x1ZGUgImRh dGF0eXBlL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgInV0aWxzL3V1aWQuaCIKICNpbmNsdWRlICJs aWIvc3RyaW5naW5mby5oIgogI2luY2x1ZGUgInBndGltZS5oIgogI2luY2x1ZGUgInN0b3JhZ2Uv YmxvY2suaCIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3V1aWQuaCBiL3NyYy9pbmNs dWRlL3V0aWxzL3V1aWQuaAppbmRleCA1NzJkOGNmNGMzNi4uNjgzOWRlMmUwYjIgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL3V0aWxzL3V1aWQuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy91dWlk LmgKQEAgLTE3LDEyICsxNywxNiBAQAogLyogdXVpZCBzaXplIGluIGJ5dGVzICovCiAjZGVmaW5l IFVVSURfTEVOIDE2CiAKKy8qIGxlbmd0aCBvZiBhIFVVSUQgc3RyaW5nICh3aXRob3V0IG51bGwg dGVybWluYXRvcik6IHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCAqLworI2Rl ZmluZSBVVUlEX1NUUl9MRU4gMzYKKwogdHlwZWRlZiBzdHJ1Y3QgcGdfdXVpZF90CiB7CiAJdW5z aWduZWQgY2hhciBkYXRhW1VVSURfTEVOXTsKIH0gcGdfdXVpZF90OwogCi0vKiBmbWdyIGludGVy ZmFjZSBtYWNyb3MgKi8KKy8qIGZtZ3IgaW50ZXJmYWNlIG1hY3JvcyAoYmFja2VuZCBvbmx5KSAq LworI2lmbmRlZiBGUk9OVEVORAogc3RhdGljIGlubGluZSBEYXR1bQogVVVJRFBHZXREYXR1bShj b25zdCBwZ191dWlkX3QgKlgpCiB7CkBAIC0zOCw1ICs0Miw5IEBAIERhdHVtR2V0VVVJRFAoRGF0 dW0gWCkKIH0KIAogI2RlZmluZSBQR19HRVRBUkdfVVVJRF9QKFgpCQlEYXR1bUdldFVVSURQKFBH X0dFVEFSR19EQVRVTShYKSkKKyNlbmRpZgkJCQkJCQkvKiAhRlJPTlRFTkQgKi8KKworZXh0ZXJu IHBnX3V1aWRfdCAqZ2VuZXJhdGVfdXVpZHY3KHVpbnQ2NCB1bml4X3RzX21zLCB1aW50MzIgc3Vi X21zKTsKK2V4dGVybiBwZ191dWlkX3QgKmdlbmVyYXRlX3V1aWR2N19yKHBnX3V1aWRfdCAqdXVp ZCwgdWludDY0IHVuaXhfdHNfbXMsIHVpbnQzMiBzdWJfbXMpOwogCiAjZW5kaWYJCQkJCQkJLyog VVVJRF9IICovCi0tIAoyLjQzLjAKCg== --0000000000004ea5410652a8fc31--