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 1wD17g-002WTe-2b for pgpool-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 14:21:45 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wD17e-00HLNI-39 for pgpool-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 14:21:43 +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 1wD13k-00GiMK-38 for pgpool-hackers@lists.postgresql.org; Wed, 15 Apr 2026 14:17:42 +0000 Received: from mail-yx1-xb12b.google.com ([2607:f8b0:4864:20::b12b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wCzBS-000000018Su-1vu1 for pgpool-hackers@lists.postgresql.org; Wed, 15 Apr 2026 12:17:32 +0000 Received: by mail-yx1-xb12b.google.com with SMTP id 956f58d0204a3-651c3212b0bso2002196d50.1 for ; Wed, 15 Apr 2026 05:17:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776255450; cv=none; d=google.com; s=arc-20240605; b=MMnz3fkGpa5QQzqiXaMGxAjAL5VB5gP2nWMHKFCl322hDUul3FrZBDcQZPvZsp5dqi tMZrV9GCjaBT2QK6okY15Cd5kbQn+11CFrabYRlpCoG+rtKkeRNMg4Vyt4QRI/zyDUHN p99s6zedZlw0JpEaHjoMzefmjIZ9dN2NooTgOFIh2AwJU0KxxtYUcxqlB0yOKmeEcPfm dCFOiGyuw9Y7uJlm5bCOONr3RqGn/DYcriDqjKFHJl+YKIF6ZXIQcpoH4Uyh4lxAvGxg uFdpOjnXRv82Q9Ab+nHA+tnJztwRaMNLmsnq7oJxgsmcEKjgdjTdBWOqcK++RlhTU4YZ K/ig== 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=wVXzL/RKcl7+AeaaCJWRW0qI4OlKiG1xEd8mngenCJk=; fh=m3oiE62fRN5J1XaE+5vpHZRIgCyFefxVI0mFw3d8yxA=; b=iK8wE5+PlTwAavH2MUFmj4rHDacy9yuv/qxXwWbWl2hwDYQndlVH8zoWDeTO49fdGV HF0e/JaDKr6OA+dRLNv426I9csMVeIYqNVML40Qcc+yRBf+6H2vZpDx3WqlgWtj9OXac VAlStt8CrIQ9Ee2nWwepCx9NwuAALRQG8/z7Ouy8Pmj0Wamjwrx/Lmd0VFy9eukvNvpH y+fiMxMObG7cdK+axwp3moovlTYryrbwSU7HkCHS/ri/eUxC3oc2e817Rzr/otc9NEpE Yn9Vn/nqyOcqvpxWW81RgAv+GS9KBVU/xulKjBU/ZaBqnt8izW7wtpCe+wGYu9CAxfKW 3Urg==; 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=tailorbrands.com; s=google; t=1776255450; x=1776860250; 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=wVXzL/RKcl7+AeaaCJWRW0qI4OlKiG1xEd8mngenCJk=; b=W9mmSG0MTnbw5cWOdx80Ve9EVbaE4TZNwCITgKwBMKAcUJuwqbvDS6+/kdiVSZSqa3 32AMccU1GYAdy/xlaSl9MADoWTHxd0ylyWJCjapG5dFkh4cOHCgegCcYpAfH8wf7yAmB iyErv34WS9tS7A4KcHheAyAtlzkxWChUA09gvWvpPiB39gTPzkG4eRtLzo3KDAeZ8o0j sO1fA6TqYd72p7lJNWLcmE81X8QZHcjPyPJmJl+BbhPzyTCnhU6Nan11oVIjXz6ZPP7f jZRKswBw/y8hcuo0qZM7OOjy/OCk6Hh+k3u7kGcVL4gkWpG/0KRDbyb0twQCI3VuAv+v KEHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776255450; x=1776860250; 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=wVXzL/RKcl7+AeaaCJWRW0qI4OlKiG1xEd8mngenCJk=; b=b1XCr4KoNJc/mCFfArsRgqJjVq8nCAEhL7/6pXRNfug1vNdNkV47qUUq3PEm0lo1aq Ra7+EevVPcT3PbFfNdoY5+cwwHUHDZSJNZqrp+9jZxcoc8hNFKrUcUZhzQuUaKdttX8o CHAncrKndOoF0Bo/l56f+F4MwLer6i6pI4O+dIgcTTxvS2Oy1rTPIAOQEZi1BWqm+HkI UdXbXmY/tG6D3/UJ/UUKKJk9L0Ihm/hb60Ft7wcUr2wTWND9bgEXXh9uB6ra6d1hXRmr FEB8i1WHBIngchFNlvvCfq9kg3px5419G5U6EV7RSscucwSuQfi9z8/XxdtY1l2wdBHu UzBQ== X-Gm-Message-State: AOJu0Yxy8uS9vs5ZY4n/mfM+0B/Lvq3FtKb/R5E2A0w2ZRsCvV4WY+Jr /pQgRoWllhqewKH5wCzc0zxIK4Nx4FUn7Y5ZK2FISAosQ8/Cvk/p9hd9i8I6qsCtZopL1y/LKXg iTdMQyQkXcPWqP5kM9xoGZts6FygOJ/agxfj5S5rVOwcMz4JhB9+kjJkHeNoS X-Gm-Gg: AeBDietxCxZ0baGVNeCpaTdI2818XdloKSliYFMuyFUtx3P7ll00mJqWrfUq2ittjDx dBgNvhtR1SkBJ1ITVCNra1Np0wIBmdMg3y3zPiekLXrduNL8f6jkftDAIrQmPHno+mNP4BH+pyP SPtaeDZWYDFbeZ1W0BOKj6RNexq7BExb7JUnRyMxIu6QKNjUIMh4ofvukU3KsZei8df/vFAx3Qz Zcnp3aaIV+4qx+cRJnWGul8ZFE4K9gAA3vLVC2BR/m6adtmC+nq7KbRcekWoK6RHhcKyQb8mvy8 Wl1DtS7rmyOkFN5otEyfJVwe3FGBkDzyFFAAQZgjkBw4PCc6ssbO8GVS5/ry8N1448Dx9T1S7gJ 3bgtq7CE6psOv6L95WcbkuvkD/JxFmmcrheAv7jNgVgZxfEI= X-Received: by 2002:a05:690c:e6f7:b0:798:e281:a4f3 with SMTP id 00721157ae682-7af7213ef05mr179513207b3.40.1776255449601; Wed, 15 Apr 2026 05:17:29 -0700 (PDT) MIME-Version: 1.0 References: <20260407.181009.1762204033074164841.ishii@postgresql.org> <20260407.184348.71921003141910652.ishii@postgresql.org> <20260415.074316.165236259583247685.ishii@postgresql.org> In-Reply-To: <20260415.074316.165236259583247685.ishii@postgresql.org> From: Nadav Shatz Date: Wed, 15 Apr 2026 15:17:17 +0300 X-Gm-Features: AQROBzBFV8QbYnwSBCjLg23pJu96VzxbRhzaikEuMLzby5ksqBvFFuQmw93ByQM Message-ID: Subject: Re: Proposal: Recent mutated table tracking in memory To: Tatsuo Ishii Cc: pgpool-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000001b2400064f7eb3d7" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001b2400064f7eb3d7 Content-Type: multipart/alternative; boundary="0000000000001b23fe064f7eb3d5" --0000000000001b23fe064f7eb3d5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Tatsuo, hank you for the detailed review. Attached patch addresses all items. memqcache bug fix ----------------- Good catch. The root cause: pool_set_writing_transaction() was explicitly skipping dml_adaptive_global, so pool_is_writing_transaction() always returned false in this mode. The query cache fetch guard at pool_proto_modules.c:270 (!pool_is_writing_transaction()) then served stale cached results after DML in the same transaction. Fix: pool_set_writing_transaction() now sets the flag for dml_adaptive_global (only 'off' and 'dml_adaptive' skip it). This ensures the query cache is properly bypassed after writes within the same transaction. Removed dead query parse cache code (~700 lines) ------------------------------------------------- You're right -- pool_track_table_mutation_get_cached_parse, pool_track_table_mutation_cache_parse, and pool_track_table_mutation_normalize_and_hash were never called. These were leftover from an earlier design where we planned to cache SQL parse results in shared memory. The feature ended up using pgpool's existing parser directly, and this code was never wired up. Removed: QueryParseCache and QueryParseEntry structs, all related static functions, the TRACK_TABLE_MUTATION_QUERY_SEM semaphore, and the track_table_mutation_query_buckets / track_table_mutation_query_parse_cache_size configuration parameters. This also reduces shared memory usage from ~6.4 MB to ~80 KB with default settings. check_object_relationship_list scope ------------------------------------- You're correct -- dml_adaptive_global does not use dml_adaptive_object_relationship_list. Changed check_object_relationship_list() to check for DLBOW_DML_ADAPTIVE only, not DLBOW_IS_DML_ADAPTIVE (which includes global). Documentation fixes ------------------- - Removed "(Lagless Replica Reads)" from section title and "lagless" language from description. - Described fallback behavior when neither replication_delay_source_cmd nor delay_threshold_by_time is configured (TTL stays at 100ms default minimum). - "query cache" references removed (the query parse cache is gone). - Added 128-table-per-SELECT limit to Limitations section (uses POOL_MAX_SELECT_OIDS). Code style fixes ---------------- - DLBOW_IS_DML_ADAPTIVE() calls no longer split across lines. - Split the long errmsg line in is_select_object_in_temp_write_list. - Removed redundant is_adaptive variable in is_select_object_in_temp_write_list (the check at function entry already guarantees it). Thanks! On Wed, Apr 15, 2026 at 1:43=E2=80=AFAM Tatsuo Ishii = wrote: > Hi Nadav, > > > Hi Tatsuo, > > > > Looks good to me thanks! > > > > Please go ahead with your review. waiting to hear back from you. > > Here are the code review results. > > diff --git a/doc/src/sgml/loadbalance.sgml b/doc/src/sgml/loadbalance.sgm= l > index 9e1e7b39b..7384ce81a 100644 > --- a/doc/src/sgml/loadbalance.sgml > +++ b/doc/src/sgml/loadbalance.sgml > : > + > + Table Mutation Map Configuration (Lagless Replica Reads)</title= > > > "(Lagless Replica Reads)" sounds like an advertisement to me. It > should be removed. > > + <para> > + These parameters configure the track table mutation feature, which is > activated by setting > + <xref linkend=3D"guc-disable-load-balance-on-write"> to > <literal>dml_adaptive_global</literal>. > + The feature tracks recently written tables to prevent stale reads fro= m > replica nodes during > + replication lag, implementing the "lagless" architecture pattern for > distributed systems > + with read replicas. > > I think the feature does not guarantee "lagless" anytime, in all cases. > > + <para> > + This feature requires time-based replication delay monitoring. This > can be provided by either > + <xref linkend=3D"guc-replication-delay-source-cmd"> (external command > mode) or by setting > + <xref linkend=3D"guc-delay-threshold-by-time"> (which uses > <literal>pg_stat_replication.replay_lag</literal> > + from PostgreSQL 10+). At least one of these must be configured for th= e > TTL calculation to work. > > If one of these is not set, what happens? Error? Need to describe it. > > + </para> > + > + <warning> > + <para> > + Enabling <literal>dml_adaptive_global</literal> increases shared > memory consumption. With default settings, > + the feature requires approximately 6.4 MB of shared memory (0.1 MB > for table tracking + 6.3 MB for query cache). > > "query cache" should be "query parse cache". > > + Memory usage scales with configuration parameters: > + </para> > + <itemizedlist> > + <listitem> > + <para> > + Table tracking: <literal>track_table_mutation_table_size * 40 > bytes</literal> (default: 2048 * 40 =3D ~80 KB) > + </para> > + </listitem> > + <listitem> > + <para> > + Query cache: <literal>track_table_mutation_query_parse_cache_size = * > 640 bytes</literal> (default: 10000 * 640 =3D ~6.3 MB) > > "query cache" should be "query parse cache". > > + <title>Limitations > > I think number of tables tacked in a SELECT is limited to 8. It should > be mentioned. > > diff --git a/src/context/pool_query_context.c > b/src/context/pool_query_context.c > index a056ac596..0190d3673 100644 > --- a/src/context/pool_query_context.c > +++ b/src/context/pool_query_context.c > @@ -1828,15 +1829,23 @@ is_in_list(char *name, List *list) > static bool > is_select_object_in_temp_write_list(Node *node, void *context) > { > - if (node =3D=3D NULL || pool_config->disable_load_balance_on_writ= e !=3D > DLBOW_DML_ADAPTIVE) > + if (node =3D=3D NULL || > + !DLBOW_IS_DML_ADAPTIVE( > + > pool_config->disable_load_balance_on_write)) > > You don't need to split the line. > > + is_adaptive =3D DLBOW_IS_DML_ADAPTIVE( > + > pool_config->disable_load_balance_on_write); > > You don't need to split the line. > > - if (pool_config->disable_load_balance_on_write =3D=3D > DLBOW_DML_ADAPTIVE && session_context->is_in_transaction) > + if (is_adaptive && > + session_context->is_in_transaction) > { > ereport(DEBUG1, > > (errmsg("is_select_object_in_temp_write_list: \"%s\", found relation > \"%s\"", (char *) context, rgv->relname))); > This line is too long. Please split. > > @@ -1880,7 +1889,13 @@ static char > *get_associated_object_from_dml_adaptive_relations > void > check_object_relationship_list(char *name, bool is_func_name) > { > - if (pool_config->disable_load_balance_on_write =3D=3D > DLBOW_DML_ADAPTIVE && > pool_config->parsed_dml_adaptive_object_relationship_list) > + bool is_adaptive; > + > + is_adaptive =3D DLBOW_IS_DML_ADAPTIVE( > + > pool_config->disable_load_balance_on_write); > > I wrote in the commit message: > > modifications are only detected in the same transaction). Note, > however, you cannot use dml_adaptive_object_relationship_list to track > dependency among table and other objects. > > In my understanding the feature does not use > dml_adaptive_object_relationship_list. If this is correct, why > check_object_relationship_list() is called here in case > dml_adaptive_global? If the feature uses > dml_adaptive_object_relationship_list, test cases should be included. > > diff --git a/src/utils/pool_track_table_mutation.c > b/src/utils/pool_track_table_mutation.c > new file mode 100644 > index 000000000..9be46b28f > --- /dev/null > +++ b/src/utils/pool_track_table_mutation.c > > It seems following functions are not used anywhere. I wonder if this > feature actually use "query parse cache". > > pool_track_table_mutation_get_cached_parse > pool_track_table_mutation_cache_parse > pool_track_table_mutation_normalize_and_hash > > Besides the code review, I mutated one of regression tests to check > whether the feature co exists with in the existing memory query cache > feature. After attached patch applied, I ran 006.memqcache and got the > following result. > > cd src/test/regression > ./regress.sh 006 > creating pgpool-II temporary installation ... > moving pgpool_setup to temporary installation path ... > moving watchdog_setup to temporary installation path ... > using pgpool-II at > /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/temp/ins= talled > ************************* > REGRESSION MODE : install > Pgpool-II version : pgpool-II version 4.8devel (mitsukakeboshi) > Pgpool-II install path : > /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/temp/ins= talled > PostgreSQL bin : /usr/local/pgsql/bin > PostgreSQL Major version : 18 > pgbench : /usr/local/pgsql/bin/pgbench > PostgreSQL jdbc : > /usr/local/pgsql/share/postgresql-9.2-1003.jdbc4.jar > ************************* > testing 006.memqcache...failed. > out of 1 ok:0 failed:1 timeout:0 > > log/006.memqcache shows: > > ../expected.txt result.txt differ: char 1, line 1 > > So I checked the test script and found the error was generated by a > Java program test. > > java jdbctest > result.txt 2>&1 > cmp ../expected.txt result.txt > if [ $? !=3D 0 ];then > ./shutdownall > exit 1 > fi > > In jdbctest.java: > > /* > * Cache test in an explicit transaction > */ > conn.setAutoCommit(false); > // execute DML. This should prevent SELECTs from using > query cache in the transaction. > sql =3D "UPDATE t1 SET i =3D 2;"; > pst =3D conn.createStatement(); > pst.executeUpdate(sql); > pst.close(); > // should not use the cache and should return "2", rather > than "1" > prest =3D conn.prepareStatement("SELECT * FROM t1"); > rs =3D prest.executeQuery(); > > The expected file (expected.txt) has "2" but the result file > (testdir/result.txt) was "1". This is the reason why the test > failed. I wonder if there's something wrong with the feature when the > query cache is enabled. Can you look into this? > > Regards, > -- > Tatsuo Ishii > SRA OSS K.K. > English: http://www.sraoss.co.jp/index_en/ > Japanese:http://www.sraoss.co.jp > --=20 Nadav Shatz Tailor Brands | CTO --0000000000001b23fe064f7eb3d5 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Tatsuo,

hank you for the detailed re= view. Attached patch addresses all items.

memqcache bug fix
-----= ------------

Good catch. The root cause: pool_set_writing_transactio= n() was
explicitly skipping dml_adaptive_global, so
pool_is_writing_t= ransaction() always returned false in this mode.
The query cache fetch g= uard at pool_proto_modules.c:270
(!pool_is_writing_transaction()) then s= erved stale cached results
after DML in the same transaction.

Fix= : pool_set_writing_transaction() now sets the flag for
dml_adaptive_glob= al (only 'off' and 'dml_adaptive' skip it). This
ensures= the query cache is properly bypassed after writes within
the same trans= action.

Removed dead query parse cache code (~700 lines)
--------= -----------------------------------------

You're right -- pool_t= rack_table_mutation_get_cached_parse,
pool_track_table_mutation_cache_pa= rse, and
pool_track_table_mutation_normalize_and_hash were never called.=
These were leftover from an earlier design where we planned to
cache= SQL parse results in shared memory. The feature ended up
using pgpool&#= 39;s existing parser directly, and this code was never
wired up.

= Removed: QueryParseCache and QueryParseEntry structs, all related
static= functions, the TRACK_TABLE_MUTATION_QUERY_SEM semaphore,
and the track_= table_mutation_query_buckets /
track_table_mutation_query_parse_cache_si= ze configuration
parameters. This also reduces shared memory usage from = ~6.4 MB
to ~80 KB with default settings.

check_object_relationshi= p_list scope
-------------------------------------

You're cor= rect -- dml_adaptive_global does not use
dml_adaptive_object_relationshi= p_list. Changed
check_object_relationship_list() to check for DLBOW_DML_= ADAPTIVE
only, not DLBOW_IS_DML_ADAPTIVE (which includes global).
Documentation fixes
-------------------

- Removed "(Lagless= Replica Reads)" from section title and
=C2=A0 "lagless" = language from description.

- Described fallback behavior when neithe= r
=C2=A0 replication_delay_source_cmd nor delay_threshold_by_time is
= =C2=A0 configured (TTL stays at 100ms default minimum).

- "quer= y cache" references removed (the query parse cache is gone).

- = Added 128-table-per-SELECT limit to Limitations section
=C2=A0 (uses POO= L_MAX_SELECT_OIDS).

Code style fixes
----------------

- DL= BOW_IS_DML_ADAPTIVE() calls no longer split across lines.

- Split th= e long errmsg line in
=C2=A0 is_select_object_in_temp_write_list.
- Removed redundant is_adaptive variable in
=C2=A0 is_select_object_in_= temp_write_list (the check at function
=C2=A0 entry already guarantees i= t).

Thanks!

On Wed, Apr 15, 2026 at 1:43= =E2=80=AFAM Tatsuo Ishii <ishii@= postgresql.org> wrote:
Hi Nadav,

> Hi Tatsuo,
>
> Looks good to me thanks!
>
> Please go ahead with your review. waiting to hear back from you.

Here are the code review results.

diff --git a/doc/src/sgml/loadbalance.sgml b/doc/src/sgml/loadbalance.sgml<= br> index 9e1e7b39b..7384ce81a 100644
--- a/doc/src/sgml/loadbalance.sgml
+++ b/doc/src/sgml/loadbalance.sgml
:
+ <sect2 id=3D"runtime-config-table-mutation-map">
+=C2=A0 <title>Table Mutation Map Configuration (Lagless Replica Read= s)</title>

"(Lagless Replica Reads)" sounds like an advertisement to me. It<= br> should be removed.

+=C2=A0 <para>
+=C2=A0 =C2=A0These parameters configure the track table mutation feature, = which is activated by setting
+=C2=A0 =C2=A0<xref linkend=3D"guc-disable-load-balance-on-write&qu= ot;> to <literal>dml_adaptive_global</literal>.
+=C2=A0 =C2=A0The feature tracks recently written tables to prevent stale r= eads from replica nodes during
+=C2=A0 =C2=A0replication lag, implementing the "lagless" archite= cture pattern for distributed systems
+=C2=A0 =C2=A0with read replicas.

I think the feature does not guarantee "lagless" anytime, in all = cases.

+=C2=A0 <para>
+=C2=A0 =C2=A0This feature requires time-based replication delay monitoring= . This can be provided by either
+=C2=A0 =C2=A0<xref linkend=3D"guc-replication-delay-source-cmd&quo= t;> (external command mode) or by setting
+=C2=A0 =C2=A0<xref linkend=3D"guc-delay-threshold-by-time">= ; (which uses <literal>pg_stat_replication.replay_lag</literal>=
+=C2=A0 =C2=A0from PostgreSQL 10+). At least one of these must be configure= d for the TTL calculation to work.

If one of these is not set, what happens? Error? Need to describe it.

+=C2=A0 </para>
+
+=C2=A0 <warning>
+=C2=A0 =C2=A0<para>
+=C2=A0 =C2=A0 Enabling <literal>dml_adaptive_global</literal> = increases shared memory consumption. With default settings,
+=C2=A0 =C2=A0 the feature requires approximately 6.4 MB of shared memory (= 0.1 MB for table tracking + 6.3 MB for query cache).

"query cache" should be "query parse cache".

+=C2=A0 =C2=A0 Memory usage scales with configuration parameters:
+=C2=A0 =C2=A0</para>
+=C2=A0 =C2=A0<itemizedlist>
+=C2=A0 =C2=A0 <listitem>
+=C2=A0 =C2=A0 =C2=A0<para>
+=C2=A0 =C2=A0 =C2=A0 Table tracking: <literal>track_table_mutation_t= able_size * 40 bytes</literal> (default: 2048 * 40 =3D ~80 KB)
+=C2=A0 =C2=A0 =C2=A0</para>
+=C2=A0 =C2=A0 </listitem>
+=C2=A0 =C2=A0 <listitem>
+=C2=A0 =C2=A0 =C2=A0<para>
+=C2=A0 =C2=A0 =C2=A0 Query cache: <literal>track_table_mutation_quer= y_parse_cache_size * 640 bytes</literal> (default: 10000 * 640 =3D ~6= .3 MB)

"query cache" should be "query parse cache".

+=C2=A0 =C2=A0<title>Limitations</title>

I think number of tables tacked in a SELECT is limited to 8. It should
be mentioned.

diff --git a/src/context/pool_query_context.c b/src/context/pool_query_cont= ext.c
index a056ac596..0190d3673 100644
--- a/src/context/pool_query_context.c
+++ b/src/context/pool_query_context.c
@@ -1828,15 +1829,23 @@ is_in_list(char *name, List *list)
=C2=A0static bool
=C2=A0is_select_object_in_temp_write_list(Node *node, void *context)
=C2=A0{
-=C2=A0 =C2=A0 =C2=A0 =C2=A0if (node =3D=3D NULL || pool_config->disable= _load_balance_on_write !=3D DLBOW_DML_ADAPTIVE)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (node =3D=3D NULL ||
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0!DLBOW_IS_DML_ADAPT= IVE(
+=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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pool_config->dis= able_load_balance_on_write))

You don't need to split the line.

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0is_adaptive =3D DLB= OW_IS_DML_ADAPTIVE(
+=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=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=A0pool_config->disable_load_balance_on_write);

You don't need to split the line.

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (pool_config->= ;disable_load_balance_on_write =3D=3D DLBOW_DML_ADAPTIVE && session= _context->is_in_transaction)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (is_adaptive &am= p;&
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0session_context->is_in_transaction)
=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 ereport(DEBUG1,
=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 (errmsg(= "is_select_object_in_temp_write_list: \"%s\", found relation= \"%s\"", (char *) context, rgv->relname)));
This line is too long. Please split.

@@ -1880,7 +1889,13 @@ static char *get_associated_object_from_dml_adaptive= _relations
=C2=A0void
=C2=A0check_object_relationship_list(char *name, bool is_func_name)
=C2=A0{
-=C2=A0 =C2=A0 =C2=A0 =C2=A0if (pool_config->disable_load_balance_on_wri= te =3D=3D DLBOW_DML_ADAPTIVE && pool_config->parsed_dml_adaptive= _object_relationship_list)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 i= s_adaptive;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0is_adaptive =3D DLBOW_IS_DML_ADAPTIVE(
+=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=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=A0pool_config->= disable_load_balance_on_write);

I wrote in the commit message:

modifications are only detected in the same transaction). Note,
however, you cannot use dml_adaptive_object_relationship_list to track
dependency among table and other objects.

In my understanding the feature does not use
dml_adaptive_object_relationship_list. If this is correct, why
check_object_relationship_list() is called here in case
dml_adaptive_global?=C2=A0 If the feature uses
dml_adaptive_object_relationship_list, test cases should be included.

diff --git a/src/utils/pool_track_table_mutation.c b/src/utils/pool_track_t= able_mutation.c
new file mode 100644
index 000000000..9be46b28f
--- /dev/null
+++ b/src/utils/pool_track_table_mutation.c

It seems following functions are not used anywhere. I wonder if this
feature actually use "query parse cache".

pool_track_table_mutation_get_cached_parse
pool_track_table_mutation_cache_parse
pool_track_table_mutation_normalize_and_hash

Besides the code review, I mutated one of regression tests to check
whether the feature co exists with in the existing memory query cache
feature. After attached patch applied, I ran 006.memqcache and got the
following result.

cd src/test/regression
./regress.sh 006
creating pgpool-II temporary installation ...
moving pgpool_setup to temporary installation path ...
moving watchdog_setup to temporary installation path ...
using pgpool-II at /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/re= gression/temp/installed
*************************
REGRESSION MODE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : install
Pgpool-II version=C2=A0 =C2=A0 =C2=A0 =C2=A0 : pgpool-II version 4.8devel (= mitsukakeboshi)
Pgpool-II install path=C2=A0 =C2=A0: /home/t-ishii/work/Pgpool-II/current/p= gpool2/src/test/regression/temp/installed
PostgreSQL bin=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0: /usr/local/pgsql/b= in
PostgreSQL Major version : 18
pgbench=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : /us= r/local/pgsql/bin/pgbench
PostgreSQL jdbc=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : /usr/local/pgsql/share/= postgresql-9.2-1003.jdbc4.jar
*************************
testing 006.memqcache...failed.
out of 1 ok:0 failed:1 timeout:0

log/006.memqcache shows:

../expected.txt result.txt differ: char 1, line 1

So I checked the test script and found the error was generated by a
Java program test.

=C2=A0 =C2=A0 =C2=A0 =C2=A0 java jdbctest > result.txt 2>&1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 cmp ../expected.txt result.txt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if [ $? !=3D 0 ];then
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ./shutdownall
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit 1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 fi

In jdbctest.java:

=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* Cache test = in an explicit transaction
=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 conn.setAutoCommit(= false);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // execute DML. Thi= s should prevent SELECTs from using query cache in the transaction.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sql =3D "UPDAT= E t1 SET i =3D 2;";
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pst =3D conn.create= Statement();
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pst.executeUpdate(s= ql);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pst.close();
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // should not use t= he cache and should return "2", rather than "1"
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 prest =3D conn.prep= areStatement("SELECT * FROM t1");
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rs =3D prest.execut= eQuery();

The expected file (expected.txt) has "2" but the result file
(testdir/result.txt) was "1".=C2=A0 This is the reason why the te= st
failed. I wonder if there's something wrong with the feature when the query cache is enabled. Can you look into this?

Regards,
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp


--
Nadav Shatz
<= font color=3D"#000000">Tailor Brands=C2=A0| CTO
--0000000000001b23fe064f7eb3d5-- --0000000000001b2400064f7eb3d7 Content-Type: application/octet-stream; name="v2-0001-address-review.patch" Content-Disposition: attachment; filename="v2-0001-address-review.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnzx13wk0 RnJvbSBjZWViZTEzMTgyNTk0MWUxZDQ5ZGQwNzFiZjMyZmZjYjAyMTMzOWE1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWRhdiBTaGF0eiA8bmFkYXZAdGFpbG9yYnJhbmRzLmNvbT4K RGF0ZTogV2VkLCAxNSBBcHIgMjAyNiAxMTo0NDoyMSArMDMwMApTdWJqZWN0OiBbUEFUQ0hdIEFk ZHJlc3MgcmV2aWV3OiByZW1vdmUgcXVlcnkgcGFyc2UgY2FjaGUsIGZpeCBtZW1xY2FjaGUgYnVn LgoKLSBSZW1vdmUgZGVhZCBxdWVyeSBwYXJzZSBjYWNoZSBjb2RlIChRdWVyeVBhcnNlQ2FjaGUs CiAgUXVlcnlQYXJzZUVudHJ5LCBhbmQgYWxsIHJlbGF0ZWQgZnVuY3Rpb25zKS4gIFRoZXNlIHdl cmUKICBuZXZlciB3aXJlZCB1cDsgdGhlIGZlYXR1cmUgdXNlcyBwZ3Bvb2wncyBleGlzdGluZyBw YXJzZXIuCiAgVGhpcyByZW1vdmVzIH43MDAgbGluZXMsIHRoZSBUUkFDS19UQUJMRV9NVVRBVElP Tl9RVUVSWV9TRU0KICBzZW1hcGhvcmUsIGFuZCB0aGUgdHJhY2tfdGFibGVfbXV0YXRpb25fcXVl cnlfYnVja2V0cyBhbmQKICB0cmFja190YWJsZV9tdXRhdGlvbl9xdWVyeV9wYXJzZV9jYWNoZV9z aXplIHBhcmFtZXRlcnMuCgotIEZpeCBzdGFsZSByZWFkIGZyb20gcXVlcnkgY2FjaGUgKG1lbXFj YWNoZSkgd2hlbgogIGRtbF9hZGFwdGl2ZV9nbG9iYWwgaXMgYWN0aXZlLiAgcG9vbF9zZXRfd3Jp dGluZ190cmFuc2FjdGlvbigpCiAgd2FzIHNraXBwaW5nIGRtbF9hZGFwdGl2ZV9nbG9iYWwsIHNv IHBvb2xfaXNfd3JpdGluZ190cmFuc2FjdGlvbigpCiAgYWx3YXlzIHJldHVybmVkIGZhbHNlLCBh bGxvd2luZyBjYWNoZWQgcmVzdWx0cyBhZnRlciBETUwgaW4gdGhlCiAgc2FtZSB0cmFuc2FjdGlv bi4gIE5vdyBkbWxfYWRhcHRpdmVfZ2xvYmFsIHNldHMgdGhlIGZsYWcgc28gdGhlCiAgcXVlcnkg Y2FjaGUgaXMgcHJvcGVybHkgc2tpcHBlZCBhZnRlciB3cml0ZXMuCgotIFJlc3RyaWN0IGNoZWNr X29iamVjdF9yZWxhdGlvbnNoaXBfbGlzdCgpIHRvIGRtbF9hZGFwdGl2ZSBvbmx5LgogIGRtbF9h ZGFwdGl2ZV9nbG9iYWwgZG9lcyBub3QgdXNlCiAgZG1sX2FkYXB0aXZlX29iamVjdF9yZWxhdGlv bnNoaXBfbGlzdC4KCi0gRml4IGRvY3M6IHJlbW92ZSBtYXJrZXRpbmcgbGFuZ3VhZ2UsIGRlc2Ny aWJlIGJlaGF2aW9yIHdoZW4KICBubyBkZWxheSBzb3VyY2UgaXMgY29uZmlndXJlZCwgYWRkIDEy OC10YWJsZS1wZXItU0VMRUNUIGxpbWl0CiAgdG8gbGltaXRhdGlvbnMsIGZpeCBsaW5lIGxlbmd0 aCBhbmQgc3BsaXQgaXNzdWVzLgoKQXV0aG9yOiBOYWRhdiBTaGF0eiA8bmFkYXZAdGFpbG9yYnJh bmRzLmNvbT4KLS0tCiBkb2Mvc3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dtbCAgICAgICAgICAgICAg ICAgfCAgODIgKy0tCiBzcmMvY29uZmlnL3Bvb2xfY29uZmlnX3ZhcmlhYmxlcy5jICAgICAgICAg ICAgfCAgMjQgLQogc3JjL2NvbnRleHQvcG9vbF9xdWVyeV9jb250ZXh0LmMgICAgICAgICAgICAg IHwgIDMxICstCiBzcmMvY29udGV4dC9wb29sX3Nlc3Npb25fY29udGV4dC5jICAgICAgICAgICAg fCAgMTAgKy0KIHNyYy9pbmNsdWRlL3Bvb2wuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMyArLQogc3JjL2luY2x1ZGUvcG9vbF9jb25maWcuaCAgICAgICAgICAgICAgICAgICAgIHwg ICA0IC0KIHNyYy9pbmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaCB8ICA4 MCAtLS0KIHNyYy9zYW1wbGUvcGdwb29sLmNvbmYuc2FtcGxlLXN0cmVhbSAgICAgICAgICB8ICAx MyArLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgICAy IC0KIHNyYy91dGlscy9wb29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmMgICAgICAgICB8IDU1MCAr LS0tLS0tLS0tLS0tLS0tLS0KIDEwIGZpbGVzIGNoYW5nZWQsIDQyIGluc2VydGlvbnMoKyksIDc1 NyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dt bCBiL2RvYy9zcmMvc2dtbC9sb2FkYmFsYW5jZS5zZ21sCmluZGV4IDczODRjZTgxYS4uZDRmYmNm MWE1IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dtbAorKysgYi9kb2Mv c3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dtbApAQCAtMTIwOSwxNCArMTIwOSwxMyBAQCBkbWxfYWRh cHRpdmVfb2JqZWN0X3JlbGF0aW9uc2hpcF9saXN0ID0gJ3RhYmxlXzE6dGFibGVfMicKICA8L3Nl Y3QyPgogCiAgPHNlY3QyIGlkPSJydW50aW1lLWNvbmZpZy10YWJsZS1tdXRhdGlvbi1tYXAiPgot ICA8dGl0bGU+VGFibGUgTXV0YXRpb24gTWFwIENvbmZpZ3VyYXRpb24gKExhZ2xlc3MgUmVwbGlj YSBSZWFkcyk8L3RpdGxlPgorICA8dGl0bGU+VGFibGUgTXV0YXRpb24gVHJhY2tpbmcgQ29uZmln dXJhdGlvbjwvdGl0bGU+CiAKICAgPHBhcmE+CiAgICBUaGVzZSBwYXJhbWV0ZXJzIGNvbmZpZ3Vy ZSB0aGUgdHJhY2sgdGFibGUgbXV0YXRpb24gZmVhdHVyZSwgd2hpY2ggaXMgYWN0aXZhdGVkIGJ5 IHNldHRpbmcKICAgIDx4cmVmIGxpbmtlbmQ9Imd1Yy1kaXNhYmxlLWxvYWQtYmFsYW5jZS1vbi13 cml0ZSI+IHRvIDxsaXRlcmFsPmRtbF9hZGFwdGl2ZV9nbG9iYWw8L2xpdGVyYWw+LgogICAgVGhl IGZlYXR1cmUgdHJhY2tzIHJlY2VudGx5IHdyaXR0ZW4gdGFibGVzIHRvIHByZXZlbnQgc3RhbGUg cmVhZHMgZnJvbSByZXBsaWNhIG5vZGVzIGR1cmluZwotICAgcmVwbGljYXRpb24gbGFnLCBpbXBs ZW1lbnRpbmcgdGhlICJsYWdsZXNzIiBhcmNoaXRlY3R1cmUgcGF0dGVybiBmb3IgZGlzdHJpYnV0 ZWQgc3lzdGVtcwotICAgd2l0aCByZWFkIHJlcGxpY2FzLgorICAgcmVwbGljYXRpb24gbGFnLgog ICA8L3BhcmE+CiAKICAgPHBhcmE+CkBAIC0xMjI5LDMwICsxMjI4LDE2IEBAIGRtbF9hZGFwdGl2 ZV9vYmplY3RfcmVsYXRpb25zaGlwX2xpc3QgPSAndGFibGVfMTp0YWJsZV8yJwogICAgVGhpcyBm ZWF0dXJlIHJlcXVpcmVzIHRpbWUtYmFzZWQgcmVwbGljYXRpb24gZGVsYXkgbW9uaXRvcmluZy4g VGhpcyBjYW4gYmUgcHJvdmlkZWQgYnkgZWl0aGVyCiAgICA8eHJlZiBsaW5rZW5kPSJndWMtcmVw bGljYXRpb24tZGVsYXktc291cmNlLWNtZCI+IChleHRlcm5hbCBjb21tYW5kIG1vZGUpIG9yIGJ5 IHNldHRpbmcKICAgIDx4cmVmIGxpbmtlbmQ9Imd1Yy1kZWxheS10aHJlc2hvbGQtYnktdGltZSI+ ICh3aGljaCB1c2VzIDxsaXRlcmFsPnBnX3N0YXRfcmVwbGljYXRpb24ucmVwbGF5X2xhZzwvbGl0 ZXJhbD4KLSAgIGZyb20gUG9zdGdyZVNRTCAxMCspLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgbXVz dCBiZSBjb25maWd1cmVkIGZvciB0aGUgVFRMIGNhbGN1bGF0aW9uIHRvIHdvcmsuCisgICBmcm9t IFBvc3RncmVTUUwgMTArKS4gSWYgbmVpdGhlciBpcyBjb25maWd1cmVkLCB0aGUgVFRMIHJlbWFp bnMgYXQgaXRzIGRlZmF1bHQgbWluaW11bSB2YWx1ZQorICAgKDEwMCBtaWxsaXNlY29uZHMpIGFu ZCBpcyBuZXZlciB1cGRhdGVkIGJhc2VkIG9uIGFjdHVhbCByZXBsaWNhdGlvbiBkZWxheSwgd2hp Y2ggbWF5IHJlc3VsdAorICAgaW4gc3Vib3B0aW1hbCByb3V0aW5nIGRlY2lzaW9ucy4KICAgPC9w YXJhPgogCiAgIDx3YXJuaW5nPgogICAgPHBhcmE+CiAgICAgRW5hYmxpbmcgPGxpdGVyYWw+ZG1s X2FkYXB0aXZlX2dsb2JhbDwvbGl0ZXJhbD4gaW5jcmVhc2VzIHNoYXJlZCBtZW1vcnkgY29uc3Vt cHRpb24uIFdpdGggZGVmYXVsdCBzZXR0aW5ncywKLSAgICB0aGUgZmVhdHVyZSByZXF1aXJlcyBh cHByb3hpbWF0ZWx5IDYuNCBNQiBvZiBzaGFyZWQgbWVtb3J5ICgwLjEgTUIgZm9yIHRhYmxlIHRy YWNraW5nICsgNi4zIE1CIGZvciBxdWVyeSBjYWNoZSkuCi0gICAgTWVtb3J5IHVzYWdlIHNjYWxl cyB3aXRoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKLSAgIDwvcGFyYT4KLSAgIDxpdGVtaXpl ZGxpc3Q+Ci0gICAgPGxpc3RpdGVtPgotICAgICA8cGFyYT4KLSAgICAgIFRhYmxlIHRyYWNraW5n OiA8bGl0ZXJhbD50cmFja190YWJsZV9tdXRhdGlvbl90YWJsZV9zaXplICogNDAgYnl0ZXM8L2xp dGVyYWw+IChkZWZhdWx0OiAyMDQ4ICogNDAgPSB+ODAgS0IpCi0gICAgIDwvcGFyYT4KLSAgICA8 L2xpc3RpdGVtPgotICAgIDxsaXN0aXRlbT4KLSAgICAgPHBhcmE+Ci0gICAgICBRdWVyeSBjYWNo ZTogPGxpdGVyYWw+dHJhY2tfdGFibGVfbXV0YXRpb25fcXVlcnlfcGFyc2VfY2FjaGVfc2l6ZSAq IDY0MCBieXRlczwvbGl0ZXJhbD4gKGRlZmF1bHQ6IDEwMDAwICogNjQwID0gfjYuMyBNQikKLSAg ICAgPC9wYXJhPgotICAgIDwvbGlzdGl0ZW0+Ci0gICA8L2l0ZW1pemVkbGlzdD4KLSAgIDxwYXJh PgotICAgIEZvciBoaWdoLXRyYWZmaWMgc3lzdGVtcyB3aXRoIGxhcmdlIGNhY2hlIHNpemVzIChl LmcuLCA8bGl0ZXJhbD50cmFja190YWJsZV9tdXRhdGlvbl9xdWVyeV9wYXJzZV9jYWNoZV9zaXpl ID0gMTAwMDAwPC9saXRlcmFsPiksCi0gICAgbWVtb3J5IHVzYWdlIGNhbiByZWFjaCA2NCBNQiBv ciBtb3JlLiBDb25zaWRlciB5b3VyIHN5c3RlbSdzIGF2YWlsYWJsZSBzaGFyZWQgbWVtb3J5IHdo ZW4gdXNpbmcgPGxpdGVyYWw+ZG1sX2FkYXB0aXZlX2dsb2JhbDwvbGl0ZXJhbD4uCisgICAgdGhl IGZlYXR1cmUgcmVxdWlyZXMgYXBwcm94aW1hdGVseSA4MCBLQiBvZiBzaGFyZWQgbWVtb3J5IGZv ciB0YWJsZSB0cmFja2luZzoKKyAgICA8bGl0ZXJhbD50cmFja190YWJsZV9tdXRhdGlvbl90YWJs ZV9zaXplICogNDAgYnl0ZXM8L2xpdGVyYWw+IChkZWZhdWx0OiAyMDQ4ICogNDAgPSB+ODAgS0Ip LgogICAgPC9wYXJhPgogICA8L3dhcm5pbmc+CiAKQEAgLTEzNjQsNDMgKzEzNDksNiBAQCBkbWxf YWRhcHRpdmVfb2JqZWN0X3JlbGF0aW9uc2hpcF9saXN0ID0gJ3RhYmxlXzE6dGFibGVfMicKICAg ICA8L2xpc3RpdGVtPgogICAgPC92YXJsaXN0ZW50cnk+CiAKLSAgIDx2YXJsaXN0ZW50cnkgaWQ9 Imd1Yy10cmFjay10YWJsZS1tdXRhdGlvbi1xdWVyeS1idWNrZXRzIiB4cmVmbGFiZWw9InRyYWNr X3RhYmxlX211dGF0aW9uX3F1ZXJ5X2J1Y2tldHMiPgotICAgIDx0ZXJtPjx2YXJuYW1lPnRyYWNr X3RhYmxlX211dGF0aW9uX3F1ZXJ5X2J1Y2tldHM8L3Zhcm5hbWU+ICg8dHlwZT5pbnRlZ2VyPC90 eXBlPikKLSAgICAgPGluZGV4dGVybT4KLSAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnRyYWNrX3Rh YmxlX211dGF0aW9uX3F1ZXJ5X2J1Y2tldHM8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVyPC9wcmltYXJ5PgotICAgICA8L2luZGV4dGVybT4KLSAgICA8L3Rlcm0+Ci0gICAgPGxpc3Rp dGVtPgotICAgICA8cGFyYT4KLSAgICAgIE51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIHRoZSBx dWVyeSBwYXJzZSBjYWNoZS4gVGhlIGNhY2hlIHN0b3JlcyBub3JtYWxpemVkCi0gICAgICBxdWVy eSBzdHJpbmdzIG1hcHBlZCB0byB0aGVpciB0YWJsZSBkZXBlbmRlbmNpZXMgdG8gYXZvaWQgcmVw ZWF0ZWQgcGFyc2luZy4KLSAgICAgPC9wYXJhPgotICAgICA8cGFyYT4KLSAgICAgIFZhbGlkIHJh bmdlOiA2NC02NTUzNi4gRGVmYXVsdCBpcyA8bGl0ZXJhbD4yMDQ4PC9saXRlcmFsPi4KLSAgICAg IFRoaXMgcGFyYW1ldGVyIGNhbiBvbmx5IGJlIHNldCBhdCBzZXJ2ZXIgc3RhcnQuCi0gICAgIDwv cGFyYT4KLSAgICA8L2xpc3RpdGVtPgotICAgPC92YXJsaXN0ZW50cnk+Ci0KLSAgIDx2YXJsaXN0 ZW50cnkgaWQ9Imd1Yy10cmFjay10YWJsZS1tdXRhdGlvbi1xdWVyeS1wYXJzZS1jYWNoZS1zaXpl IiB4cmVmbGFiZWw9InRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3BhcnNlX2NhY2hlX3NpemUi PgotICAgIDx0ZXJtPjx2YXJuYW1lPnRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3BhcnNlX2Nh Y2hlX3NpemU8L3Zhcm5hbWU+ICg8dHlwZT5pbnRlZ2VyPC90eXBlPikKLSAgICAgPGluZGV4dGVy bT4KLSAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3Bh cnNlX2NhY2hlX3NpemU8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9wcmltYXJ5 PgotICAgICA8L2luZGV4dGVybT4KLSAgICA8L3Rlcm0+Ci0gICAgPGxpc3RpdGVtPgotICAgICA8 cGFyYT4KLSAgICAgIE1heGltdW0gbnVtYmVyIG9mIHF1ZXJ5IHBhcnNlIHJlc3VsdHMgdG8gY2Fj aGUuIFVzZXMgTFJVIGV2aWN0aW9uIHdoZW4gZnVsbC4KLSAgICAgIExhcmdlciBjYWNoZXMgcmVk dWNlIHBhcnNpbmcgb3ZlcmhlYWQgYnV0IGNvbnN1bWUgbW9yZSBzaGFyZWQgbWVtb3J5LgotICAg ICA8L3BhcmE+Ci0gICAgIDxwYXJhPgotICAgICAgVmFsaWQgcmFuZ2U6IDEwMC0xMDAwMDAwLiBE ZWZhdWx0IGlzIDxsaXRlcmFsPjEwMDAwPC9saXRlcmFsPi4KLSAgICAgIE1lbW9yeSB1c2FnZTog YXBwcm94aW1hdGVseSA2NDAgYnl0ZXMgcGVyIGVudHJ5ICh+Ni4zIE1CIGZvciBkZWZhdWx0LCB+ NjQgTUIgZm9yIDEwMDAwMCBlbnRyaWVzKS4KLSAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBvbmx5 IGJlIHNldCBhdCBzZXJ2ZXIgc3RhcnQuCi0gICAgIDwvcGFyYT4KLSAgICA8L2xpc3RpdGVtPgot ICAgPC92YXJsaXN0ZW50cnk+Ci0KICAgPC92YXJpYWJsZWxpc3Q+CiAKICAgPHNlY3QzIGlkPSJy dW50aW1lLWNvbmZpZy10cmFjay10YWJsZS1tdXRhdGlvbi1leGFtcGxlIj4KQEAgLTE0MjIsMjAg KzEzNzAsMTkgQEAgcmVwbGljYXRpb25fZGVsYXlfc291cmNlX3RpbWVvdXQgPSAxMAogIyBPcHRp b24gQjogVXNlIHBnX3N0YXRfcmVwbGljYXRpb24gcmVwbGF5X2xhZyAoUEcgMTArKQogIyBkZWxh eV90aHJlc2hvbGRfYnlfdGltZSA9IDEwMDAKIAotIyBBZGp1c3QgY2FjaGUgc2l6ZXMgYmFzZWQg b24gd29ya2xvYWQgKGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UpCisjIEFkanVzdCB0YWJsZSBtYXAg c2l6ZSBiYXNlZCBvbiB3b3JrbG9hZAogdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6ZSA9 IDQwOTYKLXRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3BhcnNlX2NhY2hlX3NpemUgPSA1MDAw MAogICAgPC9wcm9ncmFtbGlzdGluZz4KICAgIDxwYXJhPgotICAgIFRvdGFsIHNoYXJlZCBtZW1v cnkgcmVxdWlyZWQgZm9yIGFib3ZlIGNvbmZpZ3VyYXRpb246IGFwcHJveGltYXRlbHkgMzEuMiBN QiAoMzEgTUIgcXVlcnkgY2FjaGUgKyAwLjIgTUIgdGFibGUgbWFwICsgb3ZlcmhlYWQpLgotICAg IERlZmF1bHQgY29uZmlndXJhdGlvbiAoMTAwMDAgcXVlcnkgY2FjaGUgZW50cmllcywgMjA0OCB0 YWJsZXMpIHJlcXVpcmVzIGFwcHJveGltYXRlbHkgNi40IE1CLgorICAgIFNoYXJlZCBtZW1vcnkg cmVxdWlyZWQgZm9yIGFib3ZlIGNvbmZpZ3VyYXRpb246IGFwcHJveGltYXRlbHkgMTYwIEtCIGZv ciB0aGUgdGFibGUgbWFwLgorICAgIERlZmF1bHQgY29uZmlndXJhdGlvbiAoMjA0OCB0YWJsZXMp IHJlcXVpcmVzIGFwcHJveGltYXRlbHkgODAgS0IuCiAgICA8L3BhcmE+CiAgIDwvc2VjdDM+CiAK ICAgPHNlY3QzIGlkPSJydW50aW1lLWNvbmZpZy10cmFjay10YWJsZS1tdXRhdGlvbi1saW1pdGF0 aW9ucyI+CiAgICA8dGl0bGU+TGltaXRhdGlvbnM8L3RpdGxlPgogICAgPHBhcmE+Ci0gICAgVGhl IHRyYWNrIHRhYmxlIG11dGF0aW9uIGZlYXR1cmUgaGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlv bjoKKyAgICBUaGUgdHJhY2sgdGFibGUgbXV0YXRpb24gZmVhdHVyZSBoYXMgdGhlIGZvbGxvd2lu ZyBsaW1pdGF0aW9uczoKICAgIDwvcGFyYT4KICAgIDxpdGVtaXplZGxpc3Q+CiAgICAgPGxpc3Rp dGVtPgpAQCAtMTQ0NCw2ICsxMzkxLDEzIEBAIHRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3Bh cnNlX2NhY2hlX3NpemUgPSA1MDAwMAogICAgICAgY29udGFpbmluZyBkYXRhIG1vZGlmaWNhdGlv biBpcyBleGVjdXRlZCwgdGhlIHRhYmxlIG11dGF0aW9uIGlzIG5vdCByZWNvcmRlZC4KICAgICAg PC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAg ICAgIEEgbWF4aW11bSBvZiAxMjggdGFibGVzIGNhbiBiZSB0cmFja2VkIHBlciBTRUxFQ1QgcXVl cnkgZm9yIHN0YWxlbmVzcyBjaGVja2luZy4KKyAgICAgIFRoaXMgbGltaXQgaXMgc2hhcmVkIHdp dGggdGhlIHF1ZXJ5IGNhY2hlIHN1YnN5c3RlbQorICAgICAgKDxsaXRlcmFsPlBPT0xfTUFYX1NF TEVDVF9PSURTPC9saXRlcmFsPikuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgogICAg PC9pdGVtaXplZGxpc3Q+CiAgICA8cGFyYT4KICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMg cHJlcGFyZWQgc3RhdGVtZW50cyBhbmQgcmVxdWlyZXMgcmVhZC1hZnRlci13cml0ZSBjb25zaXN0 ZW5jeSwKZGlmZiAtLWdpdCBhL3NyYy9jb25maWcvcG9vbF9jb25maWdfdmFyaWFibGVzLmMgYi9z cmMvY29uZmlnL3Bvb2xfY29uZmlnX3ZhcmlhYmxlcy5jCmluZGV4IGQ1ZjRmYjYwNS4uYmJkNjVi MTc2IDEwMDY0NAotLS0gYS9zcmMvY29uZmlnL3Bvb2xfY29uZmlnX3ZhcmlhYmxlcy5jCisrKyBi L3NyYy9jb25maWcvcG9vbF9jb25maWdfdmFyaWFibGVzLmMKQEAgLTI0NjIsMzAgKzI0NjIsNiBA QCBzdGF0aWMgc3RydWN0IGNvbmZpZ19pbnQgQ29uZmlndXJlTmFtZXNJbnRbXSA9CiAJCU5VTEws IE5VTEwsIE5VTEwKIAl9LAogCi0JewotCQl7InRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X2J1 Y2tldHMiLAotCQkJQ0ZHQ1hUX0lOSVQsIExPQURfQkFMQU5DRV9DT05GSUcsCi0JCQkiTnVtYmVy IG9mIGhhc2ggYnVja2V0cyBmb3IgcXVlcnkgcGFyc2UgY2FjaGUuIiwKLQkJCUNPTkZJR19WQVJf VFlQRV9JTlQsIGZhbHNlLCAwCi0JCX0sCi0JCSZnX3Bvb2xfY29uZmlnLnRyYWNrX3RhYmxlX211 dGF0aW9uX3F1ZXJ5X2J1Y2tldHMsCi0JCTIwNDgsCi0JCTY0LCA2NTUzNiwKLQkJTlVMTCwgTlVM TCwgTlVMTAotCX0sCi0KLQl7Ci0JCXsidHJhY2tfdGFibGVfbXV0YXRpb25fcXVlcnlfcGFyc2Vf Y2FjaGVfc2l6ZSIsCi0JCQlDRkdDWFRfSU5JVCwgTE9BRF9CQUxBTkNFX0NPTkZJRywKLQkJCSJN YXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXJ5IHBhcnNlIGNhY2hlLiIsCi0JCQlDT05G SUdfVkFSX1RZUEVfSU5ULCBmYWxzZSwgMAotCQl9LAotCQkmZ19wb29sX2NvbmZpZy50cmFja190 YWJsZV9tdXRhdGlvbl9xdWVyeV9wYXJzZV9jYWNoZV9zaXplLAotCQkxMDAwMCwKLQkJMTAwLCAx MDAwMDAwLAotCQlOVUxMLCBOVUxMLCBOVUxMCi0JfSwKLQogCS8qIEVuZC1vZi1saXN0IG1hcmtl ciAqLwogCUVNUFRZX0NPTkZJR19JTlQKIH07CmRpZmYgLS1naXQgYS9zcmMvY29udGV4dC9wb29s X3F1ZXJ5X2NvbnRleHQuYyBiL3NyYy9jb250ZXh0L3Bvb2xfcXVlcnlfY29udGV4dC5jCmluZGV4 IDAxOTBkMzY3My4uYzIwYTNhNDIwIDEwMDY0NAotLS0gYS9zcmMvY29udGV4dC9wb29sX3F1ZXJ5 X2NvbnRleHQuYworKysgYi9zcmMvY29udGV4dC9wb29sX3F1ZXJ5X2NvbnRleHQuYwpAQCAtMTgz MCwyNyArMTgzMCwyNSBAQCBzdGF0aWMgYm9vbAogaXNfc2VsZWN0X29iamVjdF9pbl90ZW1wX3dy aXRlX2xpc3QoTm9kZSAqbm9kZSwgdm9pZCAqY29udGV4dCkKIHsKIAlpZiAobm9kZSA9PSBOVUxM IHx8Ci0JCSFETEJPV19JU19ETUxfQURBUFRJVkUoCi0JCQkJCQkJICAgcG9vbF9jb25maWctPmRp c2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlKSkKKwkJIURMQk9XX0lTX0RNTF9BREFQVElWRShw b29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUpKQogCQlyZXR1cm4gZmFs c2U7CiAKIAlpZiAoSXNBKG5vZGUsIFJhbmdlVmFyKSkKIAl7CiAJCVJhbmdlVmFyICAgKnJndiA9 IChSYW5nZVZhciAqKSBub2RlOwogCQlQT09MX1NFU1NJT05fQ09OVEVYVCAqc2Vzc2lvbl9jb250 ZXh0OwotCQlib29sCQlpc19hZGFwdGl2ZTsKIAogCQlzZXNzaW9uX2NvbnRleHQgPSBwb29sX2dl dF9zZXNzaW9uX2NvbnRleHQoZmFsc2UpOwotCQlpc19hZGFwdGl2ZSA9IERMQk9XX0lTX0RNTF9B REFQVElWRSgKLQkJCQkJCQkJCQkJcG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29u X3dyaXRlKTsKIAotCQlpZiAoaXNfYWRhcHRpdmUgJiYKLQkJCXNlc3Npb25fY29udGV4dC0+aXNf aW5fdHJhbnNhY3Rpb24pCisJCWlmIChzZXNzaW9uX2NvbnRleHQtPmlzX2luX3RyYW5zYWN0aW9u KQogCQl7CiAJCQllcmVwb3J0KERFQlVHMSwKLQkJCQkJKGVycm1zZygiaXNfc2VsZWN0X29iamVj dF9pbl90ZW1wX3dyaXRlX2xpc3Q6IFwiJXNcIiwgZm91bmQgcmVsYXRpb24gXCIlc1wiIiwgKGNo YXIgKikgY29udGV4dCwgcmd2LT5yZWxuYW1lKSkpOworCQkJCQkoZXJybXNnKCJpc19zZWxlY3Rf b2JqZWN0X2luX3RlbXBfd3JpdGVfbGlzdDoiCisJCQkJCQkJIiBcIiVzXCIsIGZvdW5kIHJlbGF0 aW9uIFwiJXNcIiIsCisJCQkJCQkJKGNoYXIgKikgY29udGV4dCwgcmd2LT5yZWxuYW1lKSkpOwog Ci0JCQlyZXR1cm4gaXNfaW5fbGlzdChyZ3YtPnJlbG5hbWUsIHNlc3Npb25fY29udGV4dC0+dHJh bnNhY3Rpb25fdGVtcF93cml0ZV9saXN0KTsKKwkJCXJldHVybiBpc19pbl9saXN0KHJndi0+cmVs bmFtZSwKKwkJCQkJCQkgIHNlc3Npb25fY29udGV4dC0+dHJhbnNhY3Rpb25fdGVtcF93cml0ZV9s aXN0KTsKIAkJfQogCX0KIApAQCAtMTg5MSw4ICsxODg5LDkgQEAgY2hlY2tfb2JqZWN0X3JlbGF0 aW9uc2hpcF9saXN0KGNoYXIgKm5hbWUsIGJvb2wgaXNfZnVuY19uYW1lKQogewogCWJvb2wJCWlz X2FkYXB0aXZlOwogCi0JaXNfYWRhcHRpdmUgPSBETEJPV19JU19ETUxfQURBUFRJVkUoCi0JCQkJ CQkJCQkJcG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlKTsKKwlpc19h ZGFwdGl2ZSA9CisJCShwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUg PT0KKwkJIERMQk9XX0RNTF9BREFQVElWRSk7CiAKIAlpZiAoaXNfYWRhcHRpdmUgJiYKIAkJcG9v bF9jb25maWctPnBhcnNlZF9kbWxfYWRhcHRpdmVfb2JqZWN0X3JlbGF0aW9uc2hpcF9saXN0KQpA QCAtMTkwMiw4ICsxOTAxLDggQEAgY2hlY2tfb2JqZWN0X3JlbGF0aW9uc2hpcF9saXN0KGNoYXIg Km5hbWUsIGJvb2wgaXNfZnVuY19uYW1lKQogCQlpZiAoc2Vzc2lvbl9jb250ZXh0LT5pc19pbl90 cmFuc2FjdGlvbikKIAkJewogCQkJY2hhcgkgICAqcmlnaHRfdG9rZW4gPQotCQkJCWdldF9hc3Nv Y2lhdGVkX29iamVjdF9mcm9tX2RtbF9hZGFwdGl2ZV9yZWxhdGlvbnMKLQkJCQkobmFtZSwgaXNf ZnVuY19uYW1lID8gT0JKRUNUX1RZUEVfRlVOQ1RJT04gOiBPQkpFQ1RfVFlQRV9SRUxBVElPTik7 CisJCQlnZXRfYXNzb2NpYXRlZF9vYmplY3RfZnJvbV9kbWxfYWRhcHRpdmVfcmVsYXRpb25zCisJ CQkobmFtZSwgaXNfZnVuY19uYW1lID8gT0JKRUNUX1RZUEVfRlVOQ1RJT04gOiBPQkpFQ1RfVFlQ RV9SRUxBVElPTik7CiAKIAkJCWlmIChyaWdodF90b2tlbikKIAkJCXsKQEAgLTE5ODksOSArMTk4 OCw5IEBAIGRtbF9hZGFwdGl2ZShOb2RlICpub2RlLCBjaGFyICpxdWVyeSkKIAkJCQkgKiB0cmFu c2FjdGlvbnMuCiAJCQkJICovCiAJCQkJaW50CQkJZGxib3cgPQotCQkJCQlwb29sX2NvbmZpZy0+ ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGU7CisJCQkJcG9vbF9jb25maWctPmRpc2FibGVf bG9hZF9iYWxhbmNlX29uX3dyaXRlOwogCQkJCUxpc3QJICAgKndsaXN0ID0KLQkJCQkJc2Vzc2lv bl9jb250ZXh0LT50cmFuc2FjdGlvbl90ZW1wX3dyaXRlX2xpc3Q7CisJCQkJc2Vzc2lvbl9jb250 ZXh0LT50cmFuc2FjdGlvbl90ZW1wX3dyaXRlX2xpc3Q7CiAKIAkJCQlpZiAoZGxib3cgPT0gRExC T1dfRE1MX0FEQVBUSVZFX0dMT0JBTCAmJgogCQkJCQlpc19jb21taXRfcXVlcnkobm9kZSkgJiYK QEAgLTIyMzEsNyArMjIzMCw3IEBAIHdoZXJlX3RvX3NlbmRfbWFpbl9yZXBsaWNhKFBPT0xfUVVF UllfQ09OVEVYVCAqcXVlcnlfY29udGV4dCwgY2hhciAqcXVlcnksIE5vZGUKIAkJCQkJYm9vbAkJ Zm9yY2VfcHJpbWFyeSA9IGZhbHNlOwogCQkJCQlpbnQJCQlsYl9ub2RlOwogCQkJCQlQT09MX1FV RVJZX0NPTlRFWFQgKnFjdHggPQotCQkJCQkJc2Vzc2lvbl9jb250ZXh0LT5xdWVyeV9jb250ZXh0 OworCQkJCQlzZXNzaW9uX2NvbnRleHQtPnF1ZXJ5X2NvbnRleHQ7CiAKIAkJCQkJaWYgKHBvb2xf dHJhY2tfdGFibGVfbXV0YXRpb25faW5fY29sZF9zdGFydCgpKQogCQkJCQl7CmRpZmYgLS1naXQg YS9zcmMvY29udGV4dC9wb29sX3Nlc3Npb25fY29udGV4dC5jIGIvc3JjL2NvbnRleHQvcG9vbF9z ZXNzaW9uX2NvbnRleHQuYwppbmRleCAwNWQwYjYzNWIuLmJlMzBmMWE3YyAxMDA2NDQKLS0tIGEv c3JjL2NvbnRleHQvcG9vbF9zZXNzaW9uX2NvbnRleHQuYworKysgYi9zcmMvY29udGV4dC9wb29s X3Nlc3Npb25fY29udGV4dC5jCkBAIC03NDAsMTMgKzc0MCwxNSBAQCB2b2lkCiBwb29sX3NldF93 cml0aW5nX3RyYW5zYWN0aW9uKHZvaWQpCiB7CiAJLyoKLQkgKiBJZiBkaXNhYmxlX2xvYWRfYmFs YW5jZV9vbl93cml0ZSBpcyAnb2ZmJyBvciAnZG1sX2FkYXB0aXZlJyBvcgotCSAqICdkbWxfYWRh cHRpdmVfZ2xvYmFsJywgdGhlbiBuZXZlciB0dXJuIG9uIHdyaXRpbmcgdHJhbnNhY3Rpb24gZmxh Zy4KKwkgKiBJZiBkaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSBpcyAnb2ZmJyBvciAnZG1s X2FkYXB0aXZlJywgdGhlbiBuZXZlcgorCSAqIHR1cm4gb24gd3JpdGluZyB0cmFuc2FjdGlvbiBm bGFnLiBGb3IgZG1sX2FkYXB0aXZlX2dsb2JhbCB3ZSBkbyBzZXQgaXQKKwkgKiBzbyB0aGF0IHRo ZSBxdWVyeSBjYWNoZSAobWVtcWNhY2hlKSBpcyBwcm9wZXJseSBza2lwcGVkIGFmdGVyIERNTAor CSAqIHdpdGhpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbi4KIAkgKi8KIAlpZiAocG9vbF9jb25maWct PmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlICE9CiAJCURMQk9XX09GRiAmJgotCQkhRExC T1dfSVNfRE1MX0FEQVBUSVZFKAotCQkJCQkJCSAgIHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRf YmFsYW5jZV9vbl93cml0ZSkpCisJCXBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9v bl93cml0ZSAhPQorCQlETEJPV19ETUxfQURBUFRJVkUpCiAJewogCQlwb29sX2dldF9zZXNzaW9u X2NvbnRleHQoZmFsc2UpLT53cml0aW5nX3RyYW5zYWN0aW9uID0gdHJ1ZTsKIAkJZXJlcG9ydChE RUJVRzUsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9wb29sLmggYi9zcmMvaW5jbHVkZS9wb29s LmgKaW5kZXggMGU5MDE2OTFhLi43OWQ3OTg4ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3Bv b2wuaAorKysgYi9zcmMvaW5jbHVkZS9wb29sLmgKQEAgLTQyNCw3ICs0MjQsNyBAQCB0eXBlZGVm IGVudW0KICNkZWZpbmUgTWluKHgsIHkpCQkoKHgpIDwgKHkpID8gKHgpIDogKHkpKQogCiAKLSNk ZWZpbmUgTUFYX05VTV9TRU1BUEhPUkVTCQkxMAorI2RlZmluZSBNQVhfTlVNX1NFTUFQSE9SRVMJ CTkKICNkZWZpbmUgQ09OTl9DT1VOVEVSX1NFTQkJMAogI2RlZmluZSBSRVFVRVNUX0lORk9fU0VN CQkxCiAjZGVmaW5lIFFVRVJZX0NBQ0hFX1NUQVRTX1NFTQkyCkBAIC00MzUsNyArNDM1LDYgQEAg dHlwZWRlZiBlbnVtCiAjZGVmaW5lIE1BSU5fRVhJVF9IQU5ETEVSX1NFTQk3CS8qIHVzZWQgaW4g ZXhpdF9oYW5kZXIgaW4gcGdwb29sIG1haW4KIAkJCQkJCQkJCSAqIHByb2Nlc3MgKi8KICNkZWZp bmUgVFJBQ0tfVEFCTEVfTVVUQVRJT05fVEFCTEVfU0VNCTgKLSNkZWZpbmUgVFJBQ0tfVEFCTEVf TVVUQVRJT05fUVVFUllfU0VNCTkKICNkZWZpbmUgTUFYX1JFUVVFU1RfUVVFVUVfU0laRQkxMAog CiAjZGVmaW5lIE1BWF9TRUNfV0FJVF9GT1JfQ0xVU1RFUl9UUkFOU0FDVElPTiAxMCAvKiB0aW1l IGluIHNlY29uZHMgdG8ga2VlcApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcG9vbF9jb25maWcu aCBiL3NyYy9pbmNsdWRlL3Bvb2xfY29uZmlnLmgKaW5kZXggYWU1MDdkYzYwLi5iOGFiYWRkNTAg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3Bvb2xfY29uZmlnLmgKKysrIGIvc3JjL2luY2x1ZGUv cG9vbF9jb25maWcuaApAQCAtMzgyLDEwICszODIsNiBAQCB0eXBlZGVmIHN0cnVjdAogCWludAkJ CXRyYWNrX3RhYmxlX211dGF0aW9uX3RhYmxlX2J1Y2tldHM7IC8qIGhhc2ggYnVja2V0cyBmb3Ig dGFibGUKIAkJCQkJCQkJCQkJCQkgKiBtYXAgKi8KIAlpbnQJCQl0cmFja190YWJsZV9tdXRhdGlv bl90YWJsZV9zaXplOwkvKiBtYXggdGFibGUgbWFwIGVudHJpZXMgKi8KLQlpbnQJCQl0cmFja190 YWJsZV9tdXRhdGlvbl9xdWVyeV9idWNrZXRzOyAvKiBoYXNoIGJ1Y2tldHMgZm9yIHF1ZXJ5Ci0J CQkJCQkJCQkJCQkJICogY2FjaGUgKi8KLQlpbnQJCQl0cmFja190YWJsZV9tdXRhdGlvbl9xdWVy eV9wYXJzZV9jYWNoZV9zaXplOwkvKiBtYXggcXVlcnkgY2FjaGUKLQkJCQkJCQkJCQkJCQkJCQkg KiBlbnRyaWVzICovCiAKIAljaGFyCSAgICpmYWlsb3Zlcl9jb21tYW5kOwkvKiBleGVjdXRlIGNv bW1hbmQgd2hlbiBmYWlsb3ZlciBoYXBwZW5zICovCiAJY2hhcgkgICAqZm9sbG93X3ByaW1hcnlf Y29tbWFuZDsgLyogZXhlY3V0ZSBjb21tYW5kIHdoZW4gZmFpbG92ZXIgaXMKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaCBiL3NyYy9pbmNs dWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaAppbmRleCAyOGRlYzFjOGEuLmRm YmFjNjY2ZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcG9vbF90cmFja190YWJsZV9t dXRhdGlvbi5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRp b24uaApAQCAtMjYsMTcgKzI2LDYgQEAKICNpbmNsdWRlICJwb29sLmgiCiAjaW5jbHVkZSA8c3lz L3RpbWUuaD4KIAotLyoKLSAqIE1heGltdW0gdGFibGUgbmFtZSBsZW5ndGggaW5jbHVkaW5nIHNj aGVtYTogInNjaGVtYSIuInRhYmxlIgotICogVXNpbmcgTkFNRURBVEFMRU4gKiAyICsgNCBmb3Ig cXVvdGVzIGFuZCBkb3QKLSAqLwotI2RlZmluZSBUUkFDS19UQUJMRV9NVVRBVElPTl9UQUJMRV9O QU1FX0xFTgkoTkFNRURBVEFMRU4gKiAyICsgNCkKLQotLyoKLSAqIE1heGltdW0gbnVtYmVyIG9m IHRhYmxlcyB3ZSB0cmFjayBwZXIgcXVlcnkKLSAqLwotI2RlZmluZSBUUkFDS19UQUJMRV9NVVRB VElPTl9NQVhfVEFCTEVTX1BFUl9RVUVSWQk4Ci0KIC8qCiAgKiBJbnZhbGlkIGluZGV4IG1hcmtl ciBmb3IgbGlua2VkIGxpc3RzCiAgKi8KQEAgLTc3LDQxICs2Niw2IEBAIHR5cGVkZWYgc3RydWN0 IFRyYWNrVGFibGVNdXRhdGlvbkhhc2hUYWJsZQogCSAqLwogfSBUcmFja1RhYmxlTXV0YXRpb25I YXNoVGFibGU7CiAKLS8qCi0gKiBFbnRyeSBpbiB0aGUgcXVlcnkgcGFyc2UgY2FjaGUKLSAqLwot dHlwZWRlZiBzdHJ1Y3QgUXVlcnlQYXJzZUVudHJ5Ci17Ci0JdWludDY0CQlxdWVyeV9oYXNoOwkJ LyogSGFzaCBvZiBub3JtYWxpemVkIHF1ZXJ5ICovCi0JYm9vbAkJaXNfd3JpdGU7CQkvKiBUcnVl IGlmIElOU0VSVC9VUERBVEUvREVMRVRFICovCi0JaW50CQkJbnVtX3RhYmxlczsJCS8qIE51bWJl ciBvZiB0YWJsZXMgaW4gcXVlcnkgKi8KLQljaGFyCQl0YWJsZV9uYW1lcwotCVsJCQlUUkFDS19U QUJMRV9NVVRBVElPTl9NQVhfVEFCTEVTX1BFUl9RVUVSWV0KLQlbCQkJVFJBQ0tfVEFCTEVfTVVU QVRJT05fVEFCTEVfTkFNRV9MRU5dOwotCWludAkJCW5leHQ7CQkJLyogTmV4dCBlbnRyeSBpbiBj b2xsaXNpb24gY2hhaW4gKi8KLQlpbnQJCQlscnVfcHJldjsJCS8qIFByZXZpb3VzIGluIExSVSBs aXN0ICovCi0JaW50CQkJbHJ1X25leHQ7CQkvKiBOZXh0IGluIExSVSBsaXN0ICovCi0JYm9vbAkJ aW5fdXNlOwkJCS8qIElzIHRoaXMgZW50cnkgaW4gdXNlPyAqLwotfSBRdWVyeVBhcnNlRW50cnk7 Ci0KLS8qCi0gKiBIZWFkZXIgZm9yIHRoZSBxdWVyeSBwYXJzZSBjYWNoZSBpbiBzaGFyZWQgbWVt b3J5Ci0gKi8KLXR5cGVkZWYgc3RydWN0IFF1ZXJ5UGFyc2VDYWNoZQotewotCWludAkJCW51bV9i dWNrZXRzOwkvKiBOdW1iZXIgb2YgaGFzaCBidWNrZXRzICovCi0JaW50CQkJbWF4X2VudHJpZXM7 CS8qIE1heGltdW0gZW50cmllcyBhbGxvd2VkICovCi0JaW50CQkJbnVtX2VudHJpZXM7CS8qIEN1 cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMgKi8KLQlpbnQJCQlmcmVlX2xpc3RfaGVhZDsgLyogSGVh ZCBvZiBmcmVlIGVudHJ5IGxpc3QgKi8KLQlpbnQJCQlscnVfaGVhZDsJCS8qIE1vc3QgcmVjZW50 bHkgdXNlZCAqLwotCWludAkJCWxydV90YWlsOwkJLyogTGVhc3QgcmVjZW50bHkgdXNlZCAqLwot Ci0JLyoKLQkgKiBGbGV4aWJsZSBhcnJheSBtZW1iZXJzIGZvbGxvdyBpbiBzaGFyZWQgbWVtb3J5 OiBpbnQKLQkgKiBidWNrZXRzW251bV9idWNrZXRzXTsgUXVlcnlQYXJzZUVudHJ5IGVudHJpZXNb bWF4X2VudHJpZXNdOwotCSAqLwotfSBRdWVyeVBhcnNlQ2FjaGU7Ci0KIC8qCiAgKiBHbG9iYWwg c3RhdGUgZm9yIHRyYWNrIHRhYmxlIG11dGF0aW9uIGZlYXR1cmUKICAqLwpAQCAtMTM0LDcgKzg4 LDYgQEAgdHlwZWRlZiBzdHJ1Y3QgVHJhY2tUYWJsZU11dGF0aW9uU2htZW0KIHsKIAlUcmFja1Rh YmxlTXV0YXRpb25TdGF0ZSBzdGF0ZTsKIAlUcmFja1RhYmxlTXV0YXRpb25IYXNoVGFibGUgKnRh YmxlX21hcDsKLQlRdWVyeVBhcnNlQ2FjaGUgKnF1ZXJ5X2NhY2hlOwogfSBUcmFja1RhYmxlTXV0 YXRpb25TaG1lbTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjA2LDM5ICsxNTksNiBAQCBl eHRlcm4gdm9pZCBwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX21hcmtfdGFibGVfd3JpdHRlbigK ICAqLwogZXh0ZXJuIHZvaWQgcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl91cGRhdGVfdHRsKHVp bnQ2NCBkZWxheV91cyk7CiAKLS8qCi0gKiBMb29rIHVwIGNhY2hlZCBwYXJzZSByZXN1bHQgZm9y IGEgcXVlcnkuCi0gKiBoYXNoOiBoYXNoIG9mIG5vcm1hbGl6ZWQgcXVlcnkKLSAqIGlzX3dyaXRl OiBvdXRwdXQgLSB0cnVlIGlmIHF1ZXJ5IGlzIGEgd3JpdGUKLSAqIHRhYmxlX25hbWVzOiBvdXRw dXQgLSBhcnJheSB0byBmaWxsIHdpdGggdGFibGUgbmFtZXMKLSAqIG51bV90YWJsZXM6IG91dHB1 dCAtIG51bWJlciBvZiB0YWJsZXMgZm91bmQKLSAqIFJldHVybnMgdHJ1ZSBpZiBmb3VuZCBpbiBj YWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1leHRlcm4gYm9vbCBwb29sX3RyYWNrX3RhYmxl X211dGF0aW9uX2dldF9jYWNoZWRfcGFyc2UoCi0JCQkJCQkJCQkJCQkJICAgdWludDY0IGhhc2gs IGJvb2wgKmlzX3dyaXRlLAotCQkJCQkJCQkJCQkJCSAgIGNoYXIgdGFibGVfbmFtZXNbXVtUUkFD S19UQUJMRV9NVVRBVElPTl9UQUJMRV9OQU1FX0xFTl0sCi0JCQkJCQkJCQkJCQkJICAgaW50ICpu dW1fdGFibGVzKTsKLQotLyoKLSAqIENhY2hlIGEgcGFyc2UgcmVzdWx0IGZvciBhIHF1ZXJ5Lgot ICogaGFzaDogaGFzaCBvZiBub3JtYWxpemVkIHF1ZXJ5Ci0gKiBpc193cml0ZTogdHJ1ZSBpZiBx dWVyeSBpcyBhIHdyaXRlCi0gKiB0YWJsZV9uYW1lczogYXJyYXkgb2YgdGFibGUgbmFtZXMKLSAq IG51bV90YWJsZXM6IG51bWJlciBvZiB0YWJsZXMKLSAqLwotZXh0ZXJuIHZvaWQgcG9vbF90cmFj a190YWJsZV9tdXRhdGlvbl9jYWNoZV9wYXJzZSgKLQkJCQkJCQkJCQkJCSAgdWludDY0IGhhc2gs IGJvb2wgaXNfd3JpdGUsCi0JCQkJCQkJCQkJCQkgIGNvbnN0IGNoYXIgdGFibGVfbmFtZXNbXVtU UkFDS19UQUJMRV9NVVRBVElPTl9UQUJMRV9OQU1FX0xFTl0sCi0JCQkJCQkJCQkJCQkgIGludCBu dW1fdGFibGVzKTsKLQotLyoKLSAqIE5vcm1hbGl6ZSBhIHF1ZXJ5IGFuZCBjb21wdXRlIGl0cyBo YXNoLgotICogU3RyaXBzIGNvbW1lbnRzLCBub3JtYWxpemVzIHdoaXRlc3BhY2UgYW5kIGxpdGVy YWxzLgotICogcXVlcnk6IGlucHV0IFNRTCBxdWVyeSBzdHJpbmcKLSAqIFJldHVybnM6IDY0LWJp dCBoYXNoIG9mIG5vcm1hbGl6ZWQgcXVlcnkKLSAqLwotZXh0ZXJuIHVpbnQ2NCBwb29sX3RyYWNr X3RhYmxlX211dGF0aW9uX25vcm1hbGl6ZV9hbmRfaGFzaChjb25zdCBjaGFyICpxdWVyeSk7Ci0K IC8qCiAgKiBDYWxjdWxhdGUgcmVxdWlyZWQgc2hhcmVkIG1lbW9yeSBzaXplIGZvciB0cmFjayB0 YWJsZSBtdXRhdGlvbi4KICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NhbXBsZS9wZ3Bvb2wuY29uZi5z YW1wbGUtc3RyZWFtIGIvc3JjL3NhbXBsZS9wZ3Bvb2wuY29uZi5zYW1wbGUtc3RyZWFtCmluZGV4 IDAwMTMyZDUzNC4uY2U5YjkyZGEwIDEwMDY0NAotLS0gYS9zcmMvc2FtcGxlL3BncG9vbC5jb25m LnNhbXBsZS1zdHJlYW0KKysrIGIvc3JjL3NhbXBsZS9wZ3Bvb2wuY29uZi5zYW1wbGUtc3RyZWFt CkBAIC01MDksOCArNTA5LDcgQEAgYmFja2VuZF9jbHVzdGVyaW5nX21vZGUgPSBzdHJlYW1pbmdf cmVwbGljYXRpb24KIAogIyAtIFRyYWNrIFRhYmxlIE11dGF0aW9uICh1c2VkIGJ5IGRtbF9hZGFw dGl2ZV9nbG9iYWwpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXQVJO SU5HOiBkbWxfYWRhcHRpdmVfZ2xvYmFsIGluY3JlYXNlcyBzaGFyZWQgbWVtb3J5IHVzYWdlCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCBzZXR0aW5ncyByZXF1 aXJlIH42LjQgTUIgc2hhcmVkIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAjICgwLjEgTUIgdGFibGUgdHJhY2tpbmcgKyA2LjMgTUIgcXVlcnkgY2FjaGUpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCBzZXR0aW5ncyByZXF1aXJl IH44MCBLQiBzaGFyZWQgbWVtb3J5IGZvciB0YWJsZSB0cmFja2luZwogCiAjdHJhY2tfdGFibGVf bXV0YXRpb25fdHRsX2ZhY3RvciA9IDUuMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAjIFRUTCBtdWx0aXBsaWVyOiBUVEwgPSByZXBsaWNhdGlvbl9kZWxheSAqIGZhY3RvcgpA QCAtNTQ0LDE2ICs1NDMsNiBAQCBiYWNrZW5kX2NsdXN0ZXJpbmdfbW9kZSA9IHN0cmVhbWluZ19y ZXBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJhbmdlOiAx MjgtMTMxMDcyIChkZWZhdWx0OiAyMDQ4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAjIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKIAotI3RyYWNrX3RhYmxlX211dGF0aW9u X3F1ZXJ5X2J1Y2tldHMgPSAyMDQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICMgTnVtYmVyIG9mIGhhc2ggYnVja2V0cyBmb3IgcXVlcnkgcGFyc2UgY2FjaGUKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSYW5nZTogNjQtNjU1MzYgKGRlZmF1bHQ6IDIw NDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKGNoYW5nZSByZXF1aXJl cyByZXN0YXJ0KQotCi0jdHJhY2tfdGFibGVfbXV0YXRpb25fcXVlcnlfcGFyc2VfY2FjaGVfc2l6 ZSA9IDEwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF4aW11bSBu dW1iZXIgb2YgcXVlcnkgcGFyc2UgcmVzdWx0cyB0byBjYWNoZQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjIFJhbmdlOiAxMDAtMTAwMDAwMCAoZGVmYXVsdDogMTAwMDApCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtb3J5IHVzYWdlOiB+NjQwIGJ5 dGVzIHBlciBlbnRyeSAofjYuMyBNQiBkZWZhdWx0LCB+NjQgTUIgZm9yIDEwMDAwMCkKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQp CiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU1RSRUFNSU5HIFJFUExJQ0FUSU9OIE1PREUK ZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXggMGYxZmE4ODRjLi40NjdlYzExNGMgMTAwNjQ0 Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9w Z2luZGVudC90eXBlZGVmcy5saXN0CkBAIC00MzEsOCArNDMxLDYgQEAgUHVibGljYXRpb25PYmpT cGVjCiBQdWJsaWNhdGlvbk9ialNwZWNUeXBlCiBQdWJsaWNhdGlvblRhYmxlCiBRdWVyeQotUXVl cnlQYXJzZUNhY2hlCi1RdWVyeVBhcnNlRW50cnkKIFF1ZXJ5U291cmNlCiBSRUxRVEFSR0VUX09Q VElPTgogUlRFS2luZApkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0 YXRpb24uYyBiL3NyYy91dGlscy9wb29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmMKaW5kZXggOWJl NDZiMjhmLi5lNzc3MWU3YmYgMTAwNjQ0Ci0tLSBhL3NyYy91dGlscy9wb29sX3RyYWNrX3RhYmxl X211dGF0aW9uLmMKKysrIGIvc3JjL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uYwpA QCAtNzYsMTYgKzc2LDYgQEAgc3RhdGljIGJvb2wgY29sZF9zdGFydF9pbml0aWFsaXplZCA9IGZh bHNlOwogCQlzaXplb2YoVHJhY2tUYWJsZU11dGF0aW9uSGFzaFRhYmxlKSArIFwKIAkJKG1hcCkt Pm51bV9idWNrZXRzICogc2l6ZW9mKGludCkpKQogCi0vKiBHZXQgcG9pbnRlciB0byBidWNrZXQg YXJyYXkgaW4gcGFyc2UgY2FjaGUgKi8KLSNkZWZpbmUgUEFSU0VfQ0FDSEVfQlVDS0VUUyhjYWNo ZSkgXAotCSgoaW50ICopKChjaGFyICopKGNhY2hlKSArIHNpemVvZihRdWVyeVBhcnNlQ2FjaGUp KSkKLQotLyogR2V0IHBvaW50ZXIgdG8gZW50cnkgYXJyYXkgaW4gcGFyc2UgY2FjaGUgKi8KLSNk ZWZpbmUgUEFSU0VfQ0FDSEVfRU5UUklFUyhjYWNoZSkgXAotCSgoUXVlcnlQYXJzZUVudHJ5ICop KChjaGFyICopKGNhY2hlKSArIFwKLQkJc2l6ZW9mKFF1ZXJ5UGFyc2VDYWNoZSkgKyBcCi0JCShj YWNoZSktPm51bV9idWNrZXRzICogc2l6ZW9mKGludCkpKQotCiAvKiAtLS0tLS0tLS0tLS0tLS0t CiAgKiBTZW1hcGhvcmUgbG9jayBoZWxwZXJzCiAgKiAtLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDMs MTggKzkzLDYgQEAgdGFibGVfbWFwX3VubG9jayh2b2lkKQogCXBvb2xfc2VtYXBob3JlX3VubG9j ayhUUkFDS19UQUJMRV9NVVRBVElPTl9UQUJMRV9TRU0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZv aWQKLXBhcnNlX2NhY2hlX2xvY2sodm9pZCkKLXsKLQlwb29sX3NlbWFwaG9yZV9sb2NrKFRSQUNL X1RBQkxFX01VVEFUSU9OX1FVRVJZX1NFTSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcGFy c2VfY2FjaGVfdW5sb2NrKHZvaWQpCi17Ci0JcG9vbF9zZW1hcGhvcmVfdW5sb2NrKFRSQUNLX1RB QkxFX01VVEFUSU9OX1FVRVJZX1NFTSk7Ci19Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0KICAqIEhh c2ggZnVuY3Rpb25zCiAgKiAtLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDQsMjUgKzEyMiw2IEBAIGZu djFhX2hhc2hfdGFibGVfa2V5KGludCB0YWJsZV9vaWQsIGludCBkYm9pZCkKIAlyZXR1cm4gaGFz aDsKIH0KIAotLyoKLSAqIEZOVi0xYSBoYXNoIGZvciA2NC1iaXQgdmFsdWUKLSAqLwotc3RhdGlj IHVpbnQ2NAotZm52MWFfaGFzaF82NChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCi17Ci0J LyogRk5WIG9mZnNldCBiYXNpcyBmb3IgNjQtYml0ICovCi0JdWludDY0CQloYXNoID0gMTQ2OTU5 ODEwMzkzNDY2NTYwMzdVTEw7Ci0Jc2l6ZV90CQlpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsg aSsrKQotCXsKLQkJaGFzaCBePSAodWludDgpIHN0cltpXTsKLQkJaGFzaCAqPSAxMDk5NTExNjI4 MjExVUxMOwkvKiBGTlYgcHJpbWUgKi8KLQl9Ci0KLQlyZXR1cm4gaGFzaDsKLX0KLQogLyogLS0t LS0tLS0tLS0tLS0tLQogICogVGltZSB1dGlsaXRpZXMKICAqIC0tLS0tLS0tLS0tLS0tLS0KQEAg LTUxNCwzMzQgKzQ3Myw2IEBAIHRhYmxlX21hcF9jbGVhbnVwX2V4cGlyZWQoCiAJfQogfQogCi0v KiAtLS0tLS0tLS0tLS0tLS0tCi0gKiBQYXJzZSBjYWNoZSBvcGVyYXRpb25zCi0gKiAtLS0tLS0t LS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIEluaXRpYWxpemUgcGFyc2UgY2FjaGUKLSAqLwotc3Rh dGljIHZvaWQKLXBhcnNlX2NhY2hlX2luaXQoUXVlcnlQYXJzZUNhY2hlICogY2FjaGUsCi0JCQkJ IGludCBudW1fYnVja2V0cywgaW50IG1heF9lbnRyaWVzKQotewotCWludAkJICAgKmJ1Y2tldHM7 Ci0JUXVlcnlQYXJzZUVudHJ5ICplbnRyaWVzOwotCWludAkJCWk7Ci0JaW50CQkJaW52YWxpZCA9 IFRSQUNLX1RBQkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVg7Ci0KLQljYWNoZS0+bnVtX2J1Y2tl dHMgPSBudW1fYnVja2V0czsKLQljYWNoZS0+bWF4X2VudHJpZXMgPSBtYXhfZW50cmllczsKLQlj YWNoZS0+bnVtX2VudHJpZXMgPSAwOwotCWNhY2hlLT5mcmVlX2xpc3RfaGVhZCA9IDA7Ci0JY2Fj aGUtPmxydV9oZWFkID0gaW52YWxpZDsKLQljYWNoZS0+bHJ1X3RhaWwgPSBpbnZhbGlkOwotCi0J YnVja2V0cyA9IFBBUlNFX0NBQ0hFX0JVQ0tFVFMoY2FjaGUpOwotCWVudHJpZXMgPSBQQVJTRV9D QUNIRV9FTlRSSUVTKGNhY2hlKTsKLQotCS8qIEluaXRpYWxpemUgYWxsIGJ1Y2tldHMgdG8gZW1w dHkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1Y2tldHM7IGkrKykKLQkJYnVja2V0c1tpXSA9 IGludmFsaWQ7Ci0KLQkvKiBJbml0aWFsaXplIGZyZWUgbGlzdCAqLwotCWZvciAoaSA9IDA7IGkg PCBtYXhfZW50cmllczsgaSsrKQotCXsKLQkJZW50cmllc1tpXS5pbl91c2UgPSBmYWxzZTsKLQkJ ZW50cmllc1tpXS5uZXh0ID0gKGkgPCBtYXhfZW50cmllcyAtIDEpID8KLQkJCWkgKyAxIDogaW52 YWxpZDsKLQkJZW50cmllc1tpXS5scnVfcHJldiA9IGludmFsaWQ7Ci0JCWVudHJpZXNbaV0ubHJ1 X25leHQgPSBpbnZhbGlkOwotCX0KLQotCWVyZXBvcnQoREVCVUcxLAotCQkJKGVycm1zZygidHJh Y2tfdGFibGVfbXV0YXRpb246ICIKLQkJCQkJInBhcnNlIGNhY2hlIGluaXQgJWQgYnVja2V0cywg IgotCQkJCQkiJWQgbWF4IGVudHJpZXMiLAotCQkJCQludW1fYnVja2V0cywgbWF4X2VudHJpZXMp KSk7Ci19Ci0KLS8qCi0gKiBNb3ZlIGVudHJ5IHRvIGZyb250IG9mIExSVSBsaXN0IChtb3N0IHJl Y2VudGx5IHVzZWQpCi0gKi8KLXN0YXRpYyB2b2lkCi1wYXJzZV9jYWNoZV9scnVfdG91Y2goUXVl cnlQYXJzZUNhY2hlICogY2FjaGUsIGludCBpZHgpCi17Ci0JUXVlcnlQYXJzZUVudHJ5ICplbnRy aWVzID0gUEFSU0VfQ0FDSEVfRU5UUklFUyhjYWNoZSk7Ci0JaW50CQkJaW52YWxpZCA9IFRSQUNL X1RBQkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVg7Ci0KLQkvKiBBbHJlYWR5IGF0IGhlYWQ/ICov Ci0JaWYgKGNhY2hlLT5scnVfaGVhZCA9PSBpZHgpCi0JCXJldHVybjsKLQotCS8qIFJlbW92ZSBm cm9tIGN1cnJlbnQgcG9zaXRpb24gKi8KLQlpZiAoZW50cmllc1tpZHhdLmxydV9wcmV2ICE9IGlu dmFsaWQpCi0JCWVudHJpZXNbZW50cmllc1tpZHhdLmxydV9wcmV2XS5scnVfbmV4dCA9Ci0JCQll bnRyaWVzW2lkeF0ubHJ1X25leHQ7Ci0JaWYgKGVudHJpZXNbaWR4XS5scnVfbmV4dCAhPSBpbnZh bGlkKQotCQllbnRyaWVzW2VudHJpZXNbaWR4XS5scnVfbmV4dF0ubHJ1X3ByZXYgPQotCQkJZW50 cmllc1tpZHhdLmxydV9wcmV2OwotCWlmIChjYWNoZS0+bHJ1X3RhaWwgPT0gaWR4KQotCQljYWNo ZS0+bHJ1X3RhaWwgPSBlbnRyaWVzW2lkeF0ubHJ1X3ByZXY7Ci0KLQkvKiBJbnNlcnQgYXQgaGVh ZCAqLwotCWVudHJpZXNbaWR4XS5scnVfcHJldiA9IGludmFsaWQ7Ci0JZW50cmllc1tpZHhdLmxy dV9uZXh0ID0gY2FjaGUtPmxydV9oZWFkOwotCWlmIChjYWNoZS0+bHJ1X2hlYWQgIT0gaW52YWxp ZCkKLQkJZW50cmllc1tjYWNoZS0+bHJ1X2hlYWRdLmxydV9wcmV2ID0gaWR4OwotCWNhY2hlLT5s cnVfaGVhZCA9IGlkeDsKLQlpZiAoY2FjaGUtPmxydV90YWlsID09IGludmFsaWQpCi0JCWNhY2hl LT5scnVfdGFpbCA9IGlkeDsKLX0KLQotLyoKLSAqIEFkZCBlbnRyeSB0byBMUlUgbGlzdCAoYXQg aGVhZCkKLSAqLwotc3RhdGljIHZvaWQKLXBhcnNlX2NhY2hlX2xydV9hZGQoUXVlcnlQYXJzZUNh Y2hlICogY2FjaGUsIGludCBpZHgpCi17Ci0JUXVlcnlQYXJzZUVudHJ5ICplbnRyaWVzID0gUEFS U0VfQ0FDSEVfRU5UUklFUyhjYWNoZSk7Ci0JaW50CQkJaW52YWxpZCA9IFRSQUNLX1RBQkxFX01V VEFUSU9OX0lOVkFMSURfSU5ERVg7Ci0KLQllbnRyaWVzW2lkeF0ubHJ1X3ByZXYgPSBpbnZhbGlk OwotCWVudHJpZXNbaWR4XS5scnVfbmV4dCA9IGNhY2hlLT5scnVfaGVhZDsKLQotCWlmIChjYWNo ZS0+bHJ1X2hlYWQgIT0gaW52YWxpZCkKLQkJZW50cmllc1tjYWNoZS0+bHJ1X2hlYWRdLmxydV9w cmV2ID0gaWR4OwotCi0JY2FjaGUtPmxydV9oZWFkID0gaWR4OwotCi0JaWYgKGNhY2hlLT5scnVf dGFpbCA9PSBpbnZhbGlkKQotCQljYWNoZS0+bHJ1X3RhaWwgPSBpZHg7Ci19Ci0KLS8qCi0gKiBS ZW1vdmUgZW50cnkgZnJvbSBMUlUgbGlzdAotICovCi1zdGF0aWMgdm9pZAotcGFyc2VfY2FjaGVf bHJ1X3JlbW92ZShRdWVyeVBhcnNlQ2FjaGUgKiBjYWNoZSwgaW50IGlkeCkKLXsKLQlRdWVyeVBh cnNlRW50cnkgKmVudHJpZXMgPSBQQVJTRV9DQUNIRV9FTlRSSUVTKGNhY2hlKTsKLQlpbnQJCQlp bnZhbGlkID0gVFJBQ0tfVEFCTEVfTVVUQVRJT05fSU5WQUxJRF9JTkRFWDsKLQotCWlmIChlbnRy aWVzW2lkeF0ubHJ1X3ByZXYgIT0gaW52YWxpZCkKLQkJZW50cmllc1tlbnRyaWVzW2lkeF0ubHJ1 X3ByZXZdLmxydV9uZXh0ID0KLQkJCWVudHJpZXNbaWR4XS5scnVfbmV4dDsKLQllbHNlCi0JCWNh Y2hlLT5scnVfaGVhZCA9IGVudHJpZXNbaWR4XS5scnVfbmV4dDsKLQotCWlmIChlbnRyaWVzW2lk eF0ubHJ1X25leHQgIT0gaW52YWxpZCkKLQkJZW50cmllc1tlbnRyaWVzW2lkeF0ubHJ1X25leHRd LmxydV9wcmV2ID0KLQkJCWVudHJpZXNbaWR4XS5scnVfcHJldjsKLQllbHNlCi0JCWNhY2hlLT5s cnVfdGFpbCA9IGVudHJpZXNbaWR4XS5scnVfcHJldjsKLQotCWVudHJpZXNbaWR4XS5scnVfcHJl diA9IGludmFsaWQ7Ci0JZW50cmllc1tpZHhdLmxydV9uZXh0ID0gaW52YWxpZDsKLX0KLQotLyoK LSAqIEFsbG9jYXRlIGVudHJ5IGZyb20gZnJlZSBsaXN0LCBldmljdGluZyBMUlUgaWYgbmVlZGVk Ci0gKi8KLXN0YXRpYyBpbnQKLXBhcnNlX2NhY2hlX2FsbG9jX2VudHJ5KFF1ZXJ5UGFyc2VDYWNo ZSAqIGNhY2hlKQotewotCVF1ZXJ5UGFyc2VFbnRyeSAqZW50cmllcyA9IFBBUlNFX0NBQ0hFX0VO VFJJRVMoY2FjaGUpOwotCWludAkJICAgKmJ1Y2tldHMgPSBQQVJTRV9DQUNIRV9CVUNLRVRTKGNh Y2hlKTsKLQlpbnQJCQlpZHg7Ci0JaW50CQkJaW52YWxpZCA9IFRSQUNLX1RBQkxFX01VVEFUSU9O X0lOVkFMSURfSU5ERVg7Ci0KLQlpZiAoY2FjaGUtPmZyZWVfbGlzdF9oZWFkICE9IGludmFsaWQp Ci0JewotCQlpZHggPSBjYWNoZS0+ZnJlZV9saXN0X2hlYWQ7Ci0JCWNhY2hlLT5mcmVlX2xpc3Rf aGVhZCA9IGVudHJpZXNbaWR4XS5uZXh0OwotCQllbnRyaWVzW2lkeF0uaW5fdXNlID0gdHJ1ZTsK LQkJZW50cmllc1tpZHhdLm5leHQgPSBpbnZhbGlkOwotCQljYWNoZS0+bnVtX2VudHJpZXMrKzsK LQkJcmV0dXJuIGlkeDsKLQl9Ci0KLQkvKiBObyBmcmVlIGVudHJpZXMgLSBldmljdCBMUlUgKi8K LQlpZiAoY2FjaGUtPmxydV90YWlsID09IGludmFsaWQpCi0JCXJldHVybiBpbnZhbGlkOwotCi0J aWR4ID0gY2FjaGUtPmxydV90YWlsOwotCi0JLyogUmVtb3ZlIGZyb20gaGFzaCBidWNrZXQgKi8K LQl7Ci0JCWludAkJCWJ1Y2tldDsKLQkJaW50CQkgICAqcHJldl9wdHI7Ci0JCWludAkJCWN1cnI7 Ci0KLQkJYnVja2V0ID0gZW50cmllc1tpZHhdLnF1ZXJ5X2hhc2ggJQotCQkJY2FjaGUtPm51bV9i dWNrZXRzOwotCQlwcmV2X3B0ciA9ICZidWNrZXRzW2J1Y2tldF07Ci0JCWN1cnIgPSBidWNrZXRz W2J1Y2tldF07Ci0KLQkJd2hpbGUgKGN1cnIgIT0gaW52YWxpZCkKLQkJewotCQkJaWYgKGN1cnIg PT0gaWR4KQotCQkJewotCQkJCSpwcmV2X3B0ciA9IGVudHJpZXNbY3Vycl0ubmV4dDsKLQkJCQli cmVhazsKLQkJCX0KLQkJCXByZXZfcHRyID0gJmVudHJpZXNbY3Vycl0ubmV4dDsKLQkJCWN1cnIg PSBlbnRyaWVzW2N1cnJdLm5leHQ7Ci0JCX0KLQl9Ci0KLQkvKiBSZW1vdmUgZnJvbSBMUlUgbGlz dCAqLwotCXBhcnNlX2NhY2hlX2xydV9yZW1vdmUoY2FjaGUsIGlkeCk7Ci0KLQkvKiBSZWluaXRp YWxpemUgZW50cnkgKi8KLQllbnRyaWVzW2lkeF0uaW5fdXNlID0gdHJ1ZTsKLQllbnRyaWVzW2lk eF0ubmV4dCA9IGludmFsaWQ7Ci0KLQlyZXR1cm4gaWR4OwotfQotCi0vKgotICogTG9vayB1cCBh IHF1ZXJ5IGluIHRoZSBwYXJzZSBjYWNoZQotICovCi1zdGF0aWMgaW50Ci1wYXJzZV9jYWNoZV9s b29rdXAoUXVlcnlQYXJzZUNhY2hlICogY2FjaGUsIHVpbnQ2NCBoYXNoKQotewotCWludAkJICAg KmJ1Y2tldHMgPSBQQVJTRV9DQUNIRV9CVUNLRVRTKGNhY2hlKTsKLQlRdWVyeVBhcnNlRW50cnkg KmVudHJpZXMgPSBQQVJTRV9DQUNIRV9FTlRSSUVTKGNhY2hlKTsKLQlpbnQJCQlidWNrZXQgPSBo YXNoICUgY2FjaGUtPm51bV9idWNrZXRzOwotCWludAkJCWlkeCA9IGJ1Y2tldHNbYnVja2V0XTsK LQlpbnQJCQlpbnZhbGlkID0gVFJBQ0tfVEFCTEVfTVVUQVRJT05fSU5WQUxJRF9JTkRFWDsKLQot CXdoaWxlIChpZHggIT0gaW52YWxpZCkKLQl7Ci0JCWlmIChlbnRyaWVzW2lkeF0ucXVlcnlfaGFz aCA9PSBoYXNoKQotCQkJcmV0dXJuIGlkeDsKLQkJaWR4ID0gZW50cmllc1tpZHhdLm5leHQ7Ci0J fQotCi0JcmV0dXJuIGludmFsaWQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0KLSAqIFF1ZXJ5 IG5vcm1hbGl6YXRpb24KLSAqIC0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogU2ltcGxl IHF1ZXJ5IG5vcm1hbGl6YXRpb246Ci0gKiAtIFN0cmlwIGNvbW1lbnRzICgtLSBhbmQgQy1zdHls ZSBibG9jayBjb21tZW50cykKLSAqIC0gQ29sbGFwc2Ugd2hpdGVzcGFjZQotICogLSBDb252ZXJ0 IHRvIGxvd2VyY2FzZSAoZXhjZXB0IGluc2lkZSBzdHJpbmdzKQotICogLSBSZXBsYWNlIGxpdGVy YWwgdmFsdWVzIHdpdGggcGxhY2Vob2xkZXJzCi0gKi8KLXN0YXRpYyBzaXplX3QKLW5vcm1hbGl6 ZV9xdWVyeShjb25zdCBjaGFyICpxdWVyeSwgY2hhciAqb3V0cHV0LAotCQkJCXNpemVfdCBvdXRw dXRfc2l6ZSkKLXsKLQljb25zdCBjaGFyICpzcmMgPSBxdWVyeTsKLQljaGFyCSAgICpkc3QgPSBv dXRwdXQ7Ci0JY2hhcgkgICAqZHN0X2VuZCA9IG91dHB1dCArIG91dHB1dF9zaXplIC0gMTsKLQli b29sCQlpbl9zdHJpbmcgPSBmYWxzZTsKLQljaGFyCQlzdHJpbmdfY2hhciA9IDA7Ci0JYm9vbAkJ bGFzdF93YXNfc3BhY2UgPSB0cnVlOwotCi0Jd2hpbGUgKCpzcmMgJiYgZHN0IDwgZHN0X2VuZCkK LQl7Ci0JCS8qIEhhbmRsZSBzdHJpbmcgbGl0ZXJhbHMgKi8KLQkJaWYgKGluX3N0cmluZykKLQkJ ewotCQkJaWYgKCpzcmMgPT0gc3RyaW5nX2NoYXIpCi0JCQl7Ci0JCQkJaWYgKCooc3JjICsgMSkg PT0gc3RyaW5nX2NoYXIpCi0JCQkJewotCQkJCQkvKiBFc2NhcGVkIHF1b3RlICovCi0JCQkJCXNy YyArPSAyOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaW5fc3RyaW5nID0gZmFsc2U7Ci0J CQkJLyogUmVwbGFjZSBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlciAqLwotCQkJCSpkc3QrKyA9ICck JzsKLQkJCX0KLQkJCXNyYysrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3Ig c3RyaW5nIHN0YXJ0ICovCi0JCWlmICgqc3JjID09ICdcJycgfHwgKnNyYyA9PSAnIicpCi0JCXsK LQkJCWluX3N0cmluZyA9IHRydWU7Ci0JCQlzdHJpbmdfY2hhciA9ICpzcmM7Ci0JCQlzcmMrKzsK LQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSGFuZGxlIHNpbmdsZS1saW5lIGNvbW1lbnRzICov Ci0JCWlmICgqc3JjID09ICctJyAmJiAqKHNyYyArIDEpID09ICctJykKLQkJewotCQkJd2hpbGUg KCpzcmMgJiYgKnNyYyAhPSAnXG4nKQotCQkJCXNyYysrOwotCQkJY29udGludWU7Ci0JCX0KLQot CQkvKiBIYW5kbGUgbXVsdGktbGluZSBjb21tZW50cyAqLwotCQlpZiAoKnNyYyA9PSAnLycgJiYg KihzcmMgKyAxKSA9PSAnKicpCi0JCXsKLQkJCXNyYyArPSAyOwotCQkJd2hpbGUgKCpzcmMgJiYK LQkJCQkgICAhKCpzcmMgPT0gJyonICYmICooc3JjICsgMSkgPT0gJy8nKSkKLQkJCQlzcmMrKzsK LQkJCWlmICgqc3JjKQotCQkJCXNyYyArPSAyOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBI YW5kbGUgd2hpdGVzcGFjZSAqLwotCQlpZiAoKnNyYyA9PSAnICcgfHwgKnNyYyA9PSAnXHQnIHx8 Ci0JCQkqc3JjID09ICdcbicgfHwgKnNyYyA9PSAnXHInKQotCQl7Ci0JCQlpZiAoIWxhc3Rfd2Fz X3NwYWNlKQotCQkJewotCQkJCSpkc3QrKyA9ICcgJzsKLQkJCQlsYXN0X3dhc19zcGFjZSA9IHRy dWU7Ci0JCQl9Ci0JCQlzcmMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSGFuZGxlIG51 bWJlcnMgLSByZXBsYWNlIHdpdGggcGxhY2Vob2xkZXIgKi8KLQkJaWYgKCgqc3JjID49ICcwJyAm JiAqc3JjIDw9ICc5JykgfHwKLQkJCSgqc3JjID09ICcuJyAmJiAqKHNyYyArIDEpID49ICcwJyAm JgotCQkJICooc3JjICsgMSkgPD0gJzknKSkKLQkJewotCQkJd2hpbGUgKCpzcmMgJiYKLQkJCQkg ICAoKCpzcmMgPj0gJzAnICYmICpzcmMgPD0gJzknKSB8fAotCQkJCQkqc3JjID09ICcuJykpCi0J CQkJc3JjKys7Ci0JCQlpZiAoIWxhc3Rfd2FzX3NwYWNlICYmCi0JCQkJZHN0ID4gb3V0cHV0ICYm ICooZHN0IC0gMSkgIT0gJyQnKQotCQkJCSpkc3QrKyA9ICckJzsKLQkJCWxhc3Rfd2FzX3NwYWNl ID0gZmFsc2U7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFJlZ3VsYXIgY2hhcmFjdGVyIC0g Y29udmVydCB0byBsb3dlcmNhc2UgKi8KLQkJaWYgKCpzcmMgPj0gJ0EnICYmICpzcmMgPD0gJ1on KQotCQkJKmRzdCsrID0gKnNyYyArIDMyOwotCQllbHNlCi0JCQkqZHN0KysgPSAqc3JjOwotCi0J CWxhc3Rfd2FzX3NwYWNlID0gZmFsc2U7Ci0JCXNyYysrOwotCX0KLQotCS8qIFJlbW92ZSB0cmFp bGluZyBzcGFjZSAqLwotCWlmIChkc3QgPiBvdXRwdXQgJiYgKihkc3QgLSAxKSA9PSAnICcpCi0J CWRzdC0tOwotCi0JKmRzdCA9ICdcMCc7Ci0JcmV0dXJuIGRzdCAtIG91dHB1dDsKLX0KIAogLyog LS0tLS0tLS0tLS0tLS0tLQogICogUHVibGljIEFQSSBpbXBsZW1lbnRhdGlvbgpAQCAtODU4LDEz ICs0ODksOSBAQCBwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtX3NpemUodm9pZCkKIAlT aXplCQlzaXplID0gMDsKIAlpbnQJCQl0YmxfYmt0OwogCWludAkJCXRibF9zejsKLQlpbnQJCQlx cnlfYmt0OwotCWludAkJCXFyeV9zejsKIAogCXRibF9ia3QgPSBwb29sX2NvbmZpZy0+dHJhY2tf dGFibGVfbXV0YXRpb25fdGFibGVfYnVja2V0czsKIAl0Ymxfc3ogPSBwb29sX2NvbmZpZy0+dHJh Y2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6ZTsKLQlxcnlfYmt0ID0gcG9vbF9jb25maWctPnRy YWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X2J1Y2tldHM7Ci0JcXJ5X3N6ID0gcG9vbF9jb25maWct PnRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3BhcnNlX2NhY2hlX3NpemU7CiAKIAkvKiBNYWlu IHN0cnVjdHVyZSAqLwogCXNpemUgKz0gc2l6ZW9mKFRyYWNrVGFibGVNdXRhdGlvblNobWVtKTsK QEAgLTg3NCwxMSArNTAxLDYgQEAgcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbV9zaXpl KHZvaWQpCiAJc2l6ZSArPSB0YmxfYmt0ICogc2l6ZW9mKGludCk7CiAJc2l6ZSArPSB0Ymxfc3og KiBzaXplb2YoVHJhY2tUYWJsZU11dGF0aW9uRW50cnkpOwogCi0JLyogUGFyc2UgY2FjaGUgKi8K LQlzaXplICs9IHNpemVvZihRdWVyeVBhcnNlQ2FjaGUpOwotCXNpemUgKz0gcXJ5X2JrdCAqIHNp emVvZihpbnQpOwotCXNpemUgKz0gcXJ5X3N6ICogc2l6ZW9mKFF1ZXJ5UGFyc2VFbnRyeSk7Ci0K IAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtODk3LDggKzUxOSw2IEBAIHBvb2xfdHJhY2tfdGFibGVf bXV0YXRpb25faW5pdCh2b2lkKQogCVRyYWNrVGFibGVNdXRhdGlvblN0YXRlICpzdDsKIAlpbnQJ CQl0YmxfYmt0OwogCWludAkJCXRibF9zejsKLQlpbnQJCQlxcnlfYmt0OwotCWludAkJCXFyeV9z ejsKIAogCWlmIChwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUgIT0K IAkJRExCT1dfRE1MX0FEQVBUSVZFX0dMT0JBTCkKQEAgLTkxMSw4ICs1MzEsNiBAQCBwb29sX3Ry YWNrX3RhYmxlX211dGF0aW9uX2luaXQodm9pZCkKIAogCXRibF9ia3QgPSBwb29sX2NvbmZpZy0+ dHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfYnVja2V0czsKIAl0Ymxfc3ogPSBwb29sX2NvbmZp Zy0+dHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6ZTsKLQlxcnlfYmt0ID0gcG9vbF9jb25m aWctPnRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X2J1Y2tldHM7Ci0JcXJ5X3N6ID0gcG9vbF9j b25maWctPnRyYWNrX3RhYmxlX211dGF0aW9uX3F1ZXJ5X3BhcnNlX2NhY2hlX3NpemU7CiAKIAlz aG1lbV9zaXplID0gcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbV9zaXplKCk7CiAKQEAg LTkzOCwyMiArNTU2LDEyIEBAIHBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25faW5pdCh2b2lkKQog CiAJdHJhY2tfdGFibGVfbXV0YXRpb25fc2htZW0tPnRhYmxlX21hcCA9CiAJCShUcmFja1RhYmxl TXV0YXRpb25IYXNoVGFibGUgKikgc2htZW1fcHRyOwotCXNobWVtX3B0ciArPSBzaXplb2YoVHJh Y2tUYWJsZU11dGF0aW9uSGFzaFRhYmxlKTsKLQlzaG1lbV9wdHIgKz0gdGJsX2JrdCAqIHNpemVv ZihpbnQpOwotCXNobWVtX3B0ciArPSB0Ymxfc3ogKiBzaXplb2YoVHJhY2tUYWJsZU11dGF0aW9u RW50cnkpOwogCi0JdHJhY2tfdGFibGVfbXV0YXRpb25fc2htZW0tPnF1ZXJ5X2NhY2hlID0KLQkJ KFF1ZXJ5UGFyc2VDYWNoZSAqKSBzaG1lbV9wdHI7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVy ZXMgKi8KKwkvKiBJbml0aWFsaXplIHRhYmxlIG1hcCAqLwogCXRhYmxlX21hcF9pbml0KAogCQkJ CSAgIHRyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtLT50YWJsZV9tYXAsCiAJCQkJICAgdGJsX2Jr dCwgdGJsX3N6KTsKIAotCXBhcnNlX2NhY2hlX2luaXQoCi0JCQkJCSB0cmFja190YWJsZV9tdXRh dGlvbl9zaG1lbS0+cXVlcnlfY2FjaGUsCi0JCQkJCSBxcnlfYmt0LCBxcnlfc3opOwotCiAJLyog SW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGUgKi8KIAlzdCA9ICZ0cmFja190YWJsZV9tdXRhdGlvbl9z aG1lbS0+c3RhdGU7CiAJc3QtPmluaXRpYWxpemVkID0gdHJ1ZTsKQEAgLTEyOTIsMTU5ICs5MDAs MyBAQCBwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3VwZGF0ZV90dGwodWludDY0IGRlbGF5X3Vz KQogCQkJCQkodW5zaWduZWQgbG9uZykgZGVsYXlfdXMsCiAJCQkJCWZhY3RvcikpKTsKIH0KLQot LyoKLSAqIExvb2sgdXAgYSBjYWNoZWQgcGFyc2UgcmVzdWx0IGJ5IHF1ZXJ5IGhhc2guCi0gKiBS ZXR1cm5zIHRydWUgYW5kIGZpbGxzIG91dHB1dCBwYXJhbWV0ZXJzIGlmCi0gKiB0aGUgcXVlcnkg d2FzIGZvdW5kIGluIHRoZSBwYXJzZSBjYWNoZS4KLSAqLwotYm9vbAotcG9vbF90cmFja190YWJs ZV9tdXRhdGlvbl9nZXRfY2FjaGVkX3BhcnNlKAotCQkJCQkJCQkJCSAgIHVpbnQ2NCBoYXNoLCBi b29sICppc193cml0ZSwKLQkJCQkJCQkJCQkgICBjaGFyIHRhYmxlX25hbWVzW11bVFJBQ0tfVEFC TEVfTVVUQVRJT05fVEFCTEVfTkFNRV9MRU5dLAotCQkJCQkJCQkJCSAgIGludCAqbnVtX3RhYmxl cykKLXsKLQlRdWVyeVBhcnNlQ2FjaGUgKmNhY2hlOwotCWludAkJCWlkeDsKLQlib29sCQlmb3Vu ZCA9IGZhbHNlOwotCWludAkJCW1heF90YWJsZXM7Ci0KLQlpZiAoVFJBQ0tfVEFCTEVfTVVUQVRJ T05fRElTQUJMRUQoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbWF4X3RhYmxlcyA9IFRSQUNLX1RB QkxFX01VVEFUSU9OX01BWF9UQUJMRVNfUEVSX1FVRVJZOwotCWNhY2hlID0gdHJhY2tfdGFibGVf bXV0YXRpb25fc2htZW0tPnF1ZXJ5X2NhY2hlOwotCi0JcGFyc2VfY2FjaGVfbG9jaygpOwotCi0J aWR4ID0gcGFyc2VfY2FjaGVfbG9va3VwKGNhY2hlLCBoYXNoKTsKLQlpZiAoaWR4ICE9IFRSQUNL X1RBQkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVgpCi0JewotCQlRdWVyeVBhcnNlRW50cnkgKmVu dHJpZXM7Ci0JCWludAkJCWk7Ci0JCWludAkJCW5hbWVsZW47Ci0KLQkJZW50cmllcyA9IFBBUlNF X0NBQ0hFX0VOVFJJRVMoY2FjaGUpOwotCQluYW1lbGVuID0gVFJBQ0tfVEFCTEVfTVVUQVRJT05f VEFCTEVfTkFNRV9MRU47Ci0JCSppc193cml0ZSA9IGVudHJpZXNbaWR4XS5pc193cml0ZTsKLQkJ Km51bV90YWJsZXMgPSBlbnRyaWVzW2lkeF0ubnVtX3RhYmxlczsKLQotCQlmb3IgKGkgPSAwOwot CQkJIGkgPCBlbnRyaWVzW2lkeF0ubnVtX3RhYmxlcyAmJgotCQkJIGkgPCBtYXhfdGFibGVzOwot CQkJIGkrKykKLQkJewotCQkJc3RybGNweSh0YWJsZV9uYW1lc1tpXSwKLQkJCQkJZW50cmllc1tp ZHhdLnRhYmxlX25hbWVzW2ldLAotCQkJCQluYW1lbGVuKTsKLQkJfQotCi0JCS8qIE1vdmUgdG8g ZnJvbnQgb2YgTFJVICovCi0JCXBhcnNlX2NhY2hlX2xydV90b3VjaChjYWNoZSwgaWR4KTsKLQkJ Zm91bmQgPSB0cnVlOwotCX0KLQotCXBhcnNlX2NhY2hlX3VubG9jaygpOwotCi0JcmV0dXJuIGZv dW5kOwotfQotCi0vKgotICogU3RvcmUgYSBwYXJzZSByZXN1bHQgaW4gdGhlIHNoYXJlZCBjYWNo ZS4KLSAqIEV2aWN0cyB0aGUgTFJVIGVudHJ5IGlmIHRoZSBjYWNoZSBpcyBmdWxsLgotICovCi12 b2lkCi1wb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2NhY2hlX3BhcnNlKAotCQkJCQkJCQkJICB1 aW50NjQgaGFzaCwgYm9vbCBpc193cml0ZSwKLQkJCQkJCQkJCSAgY29uc3QgY2hhciB0YWJsZV9u YW1lc1tdW1RSQUNLX1RBQkxFX01VVEFUSU9OX1RBQkxFX05BTUVfTEVOXSwKLQkJCQkJCQkJCSAg aW50IG51bV90YWJsZXMpCi17Ci0JUXVlcnlQYXJzZUNhY2hlICpjYWNoZTsKLQlpbnQJCSAgICpi dWNrZXRzOwotCVF1ZXJ5UGFyc2VFbnRyeSAqZW50cmllczsKLQlpbnQJCQlpZHg7Ci0JaW50CQkJ YnVja2V0OwotCWludAkJCW1heF90YWJsZXM7Ci0JaW50CQkJbmFtZWxlbjsKLQotCWlmIChUUkFD S19UQUJMRV9NVVRBVElPTl9ESVNBQkxFRCgpKQotCQlyZXR1cm47Ci0KLQltYXhfdGFibGVzID0g VFJBQ0tfVEFCTEVfTVVUQVRJT05fTUFYX1RBQkxFU19QRVJfUVVFUlk7Ci0JbmFtZWxlbiA9IFRS QUNLX1RBQkxFX01VVEFUSU9OX1RBQkxFX05BTUVfTEVOOwotCWNhY2hlID0gdHJhY2tfdGFibGVf bXV0YXRpb25fc2htZW0tPnF1ZXJ5X2NhY2hlOwotCi0JcGFyc2VfY2FjaGVfbG9jaygpOwotCi0J LyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdHMgKi8KLQlpZHggPSBwYXJzZV9jYWNoZV9sb29rdXAo Y2FjaGUsIGhhc2gpOwotCWlmIChpZHggIT0gVFJBQ0tfVEFCTEVfTVVUQVRJT05fSU5WQUxJRF9J TkRFWCkKLQl7Ci0JCXBhcnNlX2NhY2hlX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JLyog QWxsb2NhdGUgbmV3IGVudHJ5IChtYXkgZXZpY3QgTFJVKSAqLwotCWlkeCA9IHBhcnNlX2NhY2hl X2FsbG9jX2VudHJ5KGNhY2hlKTsKLQlpZiAoaWR4ID09IFRSQUNLX1RBQkxFX01VVEFUSU9OX0lO VkFMSURfSU5ERVgpCi0JewotCQlwYXJzZV9jYWNoZV91bmxvY2soKTsKLQkJZXJlcG9ydChXQVJO SU5HLAotCQkJCShlcnJtc2coInRyYWNrX3RhYmxlX211dGF0aW9uOiAiCi0JCQkJCQkicGFyc2Ug Y2FjaGUgYWxsb2MgZmFpbGVkIikpKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJpZXMgPSBQQVJT RV9DQUNIRV9FTlRSSUVTKGNhY2hlKTsKLQlidWNrZXRzID0gUEFSU0VfQ0FDSEVfQlVDS0VUUyhj YWNoZSk7Ci0KLQkvKiBGaWxsIGluIGVudHJ5ICovCi0JZW50cmllc1tpZHhdLnF1ZXJ5X2hhc2gg PSBoYXNoOwotCWVudHJpZXNbaWR4XS5pc193cml0ZSA9IGlzX3dyaXRlOwotCWVudHJpZXNbaWR4 XS5udW1fdGFibGVzID0KLQkJKG51bV90YWJsZXMgPiBtYXhfdGFibGVzKSA/Ci0JCW1heF90YWJs ZXMgOiBudW1fdGFibGVzOwotCi0JewotCQlpbnQJCQlpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBl bnRyaWVzW2lkeF0ubnVtX3RhYmxlczsgaSsrKQotCQl7Ci0JCQlzdHJsY3B5KGVudHJpZXNbaWR4 XS50YWJsZV9uYW1lc1tpXSwKLQkJCQkJdGFibGVfbmFtZXNbaV0sIG5hbWVsZW4pOwotCQl9Ci0J fQotCi0JLyogSW5zZXJ0IGludG8gaGFzaCBidWNrZXQgKi8KLQlidWNrZXQgPSBoYXNoICUgY2Fj aGUtPm51bV9idWNrZXRzOwotCWVudHJpZXNbaWR4XS5uZXh0ID0gYnVja2V0c1tidWNrZXRdOwot CWJ1Y2tldHNbYnVja2V0XSA9IGlkeDsKLQotCS8qIEFkZCB0byBMUlUgbGlzdCAqLwotCXBhcnNl X2NhY2hlX2xydV9hZGQoY2FjaGUsIGlkeCk7Ci0KLQlwYXJzZV9jYWNoZV91bmxvY2soKTsKLX0K LQotLyoKLSAqIE5vcm1hbGl6ZSBhIFNRTCBxdWVyeSBhbmQgY29tcHV0ZSBpdHMgNjQtYml0IGhh c2guCi0gKiBTdHJpcHMgY29tbWVudHMsIGNvbGxhcHNlcyB3aGl0ZXNwYWNlLCBsb3dlcmNhc2Vz LAotICogYW5kIHJlcGxhY2VzIGxpdGVyYWxzIHdpdGggcGxhY2Vob2xkZXJzLgotICovCi11aW50 NjQKLXBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fbm9ybWFsaXplX2FuZF9oYXNoKAotCQkJCQkJ CQkJCQkgY29uc3QgY2hhciAqcXVlcnkpCi17Ci0JY2hhcgkJbm9ybWFsaXplZFs4MTkyXTsKLQlz aXplX3QJCWxlbjsKLQotCWlmIChxdWVyeSA9PSBOVUxMIHx8IHF1ZXJ5WzBdID09ICdcMCcpCi0J CXJldHVybiAwOwotCi0JbGVuID0gbm9ybWFsaXplX3F1ZXJ5KHF1ZXJ5LCBub3JtYWxpemVkLAot CQkJCQkJICBzaXplb2Yobm9ybWFsaXplZCkpOwotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuIDA7 Ci0KLQlyZXR1cm4gZm52MWFfaGFzaF82NChub3JtYWxpemVkLCBsZW4pOwotfQotLSAKMi41My4w Cgo= --0000000000001b2400064f7eb3d7--