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.94.2) (envelope-from ) id 1sWz5a-000pmj-Fj for pgsql-hackers@arkaria.postgresql.org; Thu, 25 Jul 2024 14:05:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sWz5Y-00Fccg-PV for pgsql-hackers@arkaria.postgresql.org; Thu, 25 Jul 2024 14:05:00 +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.94.2) (envelope-from ) id 1sWz5X-00FccX-TK for pgsql-hackers@lists.postgresql.org; Thu, 25 Jul 2024 14:05:00 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sWz5O-001NtI-K4 for pgsql-hackers@lists.postgresql.org; Thu, 25 Jul 2024 14:04:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1721916286; bh=UcVSkN0IxAsJoySaiABukA/koCGh1wM3foL1YL3+DxU=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=r2r/KbFXN6Zdvga957yJOZNpPzceafGXVoz7UoKZulGeTCr77GW+Jz6BOOh3LFZh9 IQIQuogi0bGKxuNITwDKAIMKfIlMvXrnWvogEblqBliHbx4zU57Gygzjqjb1cZmZRw yErVXl0nD3qkbSadHjYcJMuk1wap1dt8bHGOHfvzkenr8MuYmI8qtjM/woNZ3iz3oD 0ZbhuHvns6ZXKNKNN0OpoQ3jQLseMxY+fqw6fRKcDjg0ApIWZ5whmCdA9TvEOW8j7t tm43t5AlqR0ePleIaKb5FPGcXQW6E9W4EvSm77LkVJCySbbJiEIHsq3HuxGSDY/Ggd 0drClSZbMj3iw== Received: from [192.168.196.77] (unknown [93.174.131.141]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.rybakina@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 10BFF60274; Thu, 25 Jul 2024 17:04:45 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------OQroPYSjAYKCTuT0oWW9GZN9" Message-ID: <759292d5-cb51-4b12-89fa-576c1d9b374d@postgrespro.ru> Date: Thu, 25 Jul 2024 17:04:44 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: POC, WIP: OR-clause support for indexes To: Alexander Korotkov Cc: Nikolay Shaplov , pgsql-hackers@lists.postgresql.org, Andrei Lepikhov , jian he , Robert Haas , pgsql-hackers@postgresql.org, Peter Geoghegan , "Finnerty, Jim" , Marcos Pegoraro , teodor@sigaev.ru, Tomas Vondra , Peter Eisentraut , Ranier Vilela References: <567ED6CA.2040504@sigaev.ru> <8969055.VV5PYv0bhD@thinkpad-pgpro> <38289f6c-b8c0-4713-8fb5-703fe771872a@postgrespro.ru> Content-Language: en-US From: Alena Rybakina In-Reply-To: X-KSMG-AntiPhishing: NotDetected, bases: 2024/07/25 11:42:00 X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2024/07/25 12:34:00 #26147433 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------OQroPYSjAYKCTuT0oWW9GZN9 Content-Type: multipart/alternative; boundary="------------YOQW3HC2Lo21M26zQTKgRkrW" --------------YOQW3HC2Lo21M26zQTKgRkrW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 22.07.2024 03:52, Alexander Korotkov wrote: > Hi, Alena! > > Let me answer to some of your findings. > > On Mon, Jul 22, 2024 at 12:53 AM Alena Rybakina > wrote: >> To be honest,I saw a larger problem. Look at the query bellow: >> >> master: >> >> alena@postgres=# create table t (a int not null, b int not null, c int not null); >> insert into t (select 1, 1, i from generate_series(1,10000) i); >> insert into t (select i, 2, 2 from generate_series(1,10000) i); >> create index t_a_b_idx on t (a, b); > Just a side note. As I mention in [1], there is missing statement > create index t_a_b_idx on t (a, b); > to get same plan as in [2]. > >> create statistics t_a_b_stat (mcv) on a, b from t; >> create statistics t_b_c_stat (mcv) on b, c from t; >> vacuum analyze t; >> CREATE TABLE >> INSERT 0 10000 >> INSERT 0 10000 >> CREATE INDEX >> CREATE STATISTICS >> CREATE STATISTICS >> VACUUM >> alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2; >> QUERY PLAN >> ------------------------------------------------------------------------------ >> Bitmap Heap Scan on t (cost=156.55..465.57 rows=5001 width=12) >> Recheck Cond: (a = 1) >> Filter: ((c = 2) AND ((b = 1) OR (b = 2))) >> -> Bitmap Index Scan on t_a_b_idx (cost=0.00..155.29 rows=10001 width=0) >> Index Cond: (a = 1) >> (5 rows) >> >> >> The query plan if v26[0] and v27[1] versions are equal and wrong in my opinion -where is c=2 expression? >> >> v27 [1] >> alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2; >> QUERY PLAN >> ------------------------------------------------------------------------------ >> Bitmap Heap Scan on t (cost=165.85..474.87 rows=5001 width=12) >> Recheck Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[]))) >> Filter: (c = 2) >> -> Bitmap Index Scan on t_a_b_idx (cost=0.00..164.59 rows=10001 width=0) >> Index Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[]))) >> (5 rows) >> v26 [0] >> alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2; >> QUERY PLAN >> ------------------------------------------------------------------------------ >> Bitmap Heap Scan on t (cost=165.85..449.86 rows=5001 width=12) >> Recheck Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[]))) >> Filter: (c = 2) >> -> Bitmap Index Scan on t_a_b_idx (cost=0.00..164.59 rows=10001 width=0) >> Index Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[]))) >> (5 rows) > I think both v26 and v27 are correct here. The c = 2 condition is in > the Filter. Yes, I see it and agree with that. >> In addition, I noticed that the ANY expression will be formed only for first group and ignore for others, like in the sample bellow: >> >> v26 version [0]: >> >> alena@postgres=# explain select * from t where (b = 1 or b = 2) and (a = 2 or a=3); >> QUERY PLAN >> ----------------------------------------------------------------------------------- >> Index Scan using t_a_b_idx on t (cost=0.29..24.75 rows=2 width=12) >> Index Cond: ((a = ANY ('{2,3}'::integer[])) AND (b = ANY ('{1,2}'::integer[]))) >> (2 rows) >> >> v27 version [1]: >> >> alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3); >> QUERY PLAN >> -------------------------------------------------------- >> Seq Scan on t (cost=0.00..509.00 rows=14999 width=12) >> Filter: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3)) >> (2 rows) > Did you notice you're running different queries on v26 and v27 here? > If you will run ton v27 the same query you run on v26, the plan also > will be the same. > >> alena@postgres=# create index a_idx on t(a); >> CREATE INDEX >> alena@postgres=# create index b_idx on t(b); >> CREATE INDEX >> alena@postgres=# analyze; >> ANALYZE >> >> v26: >> >> alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3); >> QUERY PLAN >> ------------------------------------------------------------------------------------ >> Bitmap Heap Scan on t (cost=17.18..30.94 rows=4 width=12) >> Recheck Cond: ((a = ANY ('{2,3}'::integer[])) OR (a = ANY ('{2,3}'::integer[]))) >> -> BitmapOr (cost=17.18..17.18 rows=4 width=0) >> -> Bitmap Index Scan on a_idx (cost=0.00..8.59 rows=2 width=0) >> Index Cond: (a = ANY ('{2,3}'::integer[])) >> -> Bitmap Index Scan on a_idx (cost=0.00..8.59 rows=2 width=0) >> Index Cond: (a = ANY ('{2,3}'::integer[])) >> (7 rows) >> >> v27: >> >> alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3); >> QUERY PLAN >> -------------------------------------------------------- >> Seq Scan on t (cost=0.00..509.00 rows=14999 width=12) >> Filter: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3)) >> (2 rows) >> >> The behavior in version 26 is incorrect, but in version 27, it does not select anything other than seqscan > Please, check that there is still possibility to the generate BitmapOr plan. It is fine, I think. The transformation works, but due to the fact that index columns are different for two indexes, the transformation hasn't been applied. > > # explain select * from t where (b = 1 or b = 2 or a = 2 or a = 3); > QUERY PLAN > ------------------------------------------------------------------------------------ > Bitmap Heap Scan on t (cost=326.16..835.16 rows=14999 width=12) > Recheck Cond: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3)) > -> BitmapOr (cost=326.16..326.16 rows=20000 width=0) > -> Bitmap Index Scan on t_b_c_idx (cost=0.00..151.29 > rows=10000 width=0) > Index Cond: (b = 1) > -> Bitmap Index Scan on t_b_c_idx (cost=0.00..151.29 > rows=10000 width=0) > Index Cond: (b = 2) > -> Bitmap Index Scan on t_a_b_idx (cost=0.00..4.29 rows=1 width=0) > Index Cond: (a = 2) > -> Bitmap Index Scan on t_a_b_idx (cost=0.00..4.29 rows=1 width=0) > Index Cond: (a = 3) > > It has higher cost than SeqScan plan, but I think it would be selected > on larger tables. And yes, this is not ideal, because it fails to > generate BitmapOr over two IndexScans on SAOPs. But it's not worse > than what current master does. An optimization doesn't have to do > everything it could possible do. So, I think this could be improved > in a separate patch. > > Links > 1.https://www.postgresql.org/message-id/CAPpHfdvhWE5pArZhgJeLViLx3-A3rxEREZvfkTj3E%3Dh7q-Bx9w%40mail.gmail.com > 2.https://www.postgresql.org/message-id/CAPpHfdtSXxhdv3mLOLjEewGeXJ%2BFtfhjqodn1WWuq5JLsKx48g%40mail.gmail.com Yes, I see and agree with you. To be honest, I have found a big problem in this patch - we try to perform the transformation every time we examime a column: for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++) { ... } I have fixed it and moved the transformation before going through the loop. I try to make an array expression for "OR" expr, but at the same time I form the result as an "AND" expression, consisting of an "Array" expression and "OR" expressions, and then I check whether there is an index for this column, if so, I save it and write down the transformation. I also had to return the previous part of the patch, where we formed "ANY" groups, since we could end up with several such groups. I hope I made my idea clear, but if not, please tell me. Unfortunately, I have got the different result one of the query from regression tests and I'm not sure if it is correct: diff -U3 /home/alena/postgrespro_or3/src/test/regress/expected/create_index.out /home/alena/postgrespro_or3/src/test/regress/results/create_index.out --- /home/alena/postgrespro_or3/src/test/regress/expected/create_index.out 2024-07-23 18:51:13.077311360 +0300 +++ /home/alena/postgrespro_or3/src/test/regress/results/create_index.out 2024-07-25 16:43:56.895132328 +0300 @@ -1860,13 +1860,14 @@ EXPLAIN (COSTS OFF) SELECT * FROM tenk1 WHERE thousand = 42 AND (tenthous = 1 OR tenthous = (SELECT 1 + 2) OR tenthous = 42); - QUERY PLAN ----------------------------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------- Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand = 42) AND (tenthous = ANY (ARRAY[1, (InitPlan 1).col1, 42]))) + Index Cond: ((thousand = 42) AND (tenthous = ANY ('{1,-1,42}'::integer[]))) + Filter: ((tenthous = 1) OR (tenthous = (InitPlan 1).col1) OR (tenthous = 42)) InitPlan 1 -> Result -(4 rows) +(5 rows) SELECT * FROM tenk1 WHERE thousand = 42 AND (tenthous = 1 OR tenthous = (SELECT 1 + 2) OR tenthous = 42); I'm researching what's wrong here now. -- Regards, Alena Rybakina Postgres Professional:http://www.postgrespro.com The Russian Postgres Company --------------YOQW3HC2Lo21M26zQTKgRkrW Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit
On 22.07.2024 03:52, Alexander Korotkov wrote:
Hi, Alena!

Let me answer to some of your findings.

On Mon, Jul 22, 2024 at 12:53 AM Alena Rybakina
<a.rybakina@postgrespro.ru> wrote:
To be honest,I saw a larger problem. Look at the query bellow:

master:

alena@postgres=# create table t (a int not null, b int not null, c int not null);
insert into t (select 1, 1, i from generate_series(1,10000) i);
insert into t (select i, 2, 2 from generate_series(1,10000) i);
create index t_a_b_idx on t (a, b);
Just a side note.  As I mention in [1], there is missing statement
create index t_a_b_idx on t (a, b);
to get same plan as in [2].

create statistics t_a_b_stat (mcv) on a, b from t;
create statistics t_b_c_stat (mcv) on b, c from t;
vacuum analyze t;
CREATE TABLE
INSERT 0 10000
INSERT 0 10000
CREATE INDEX
CREATE STATISTICS
CREATE STATISTICS
VACUUM
alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2;
                                  QUERY PLAN
------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=156.55..465.57 rows=5001 width=12)
   Recheck Cond: (a = 1)
   Filter: ((c = 2) AND ((b = 1) OR (b = 2)))
   ->  Bitmap Index Scan on t_a_b_idx  (cost=0.00..155.29 rows=10001 width=0)
         Index Cond: (a = 1)
(5 rows)


The query plan if v26[0] and v27[1] versions are equal and wrong in my opinion -where is c=2 expression?

v27 [1]
alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2;
                                  QUERY PLAN
------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=165.85..474.87 rows=5001 width=12)
   Recheck Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[])))
   Filter: (c = 2)
   ->  Bitmap Index Scan on t_a_b_idx  (cost=0.00..164.59 rows=10001 width=0)
         Index Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[])))
(5 rows)
v26 [0]
alena@postgres=# explain select * from t where a = 1 and (b = 1 or b = 2) and c = 2;
                                  QUERY PLAN
------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=165.85..449.86 rows=5001 width=12)
   Recheck Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[])))
   Filter: (c = 2)
   ->  Bitmap Index Scan on t_a_b_idx  (cost=0.00..164.59 rows=10001 width=0)
         Index Cond: ((a = 1) AND (b = ANY ('{1,2}'::integer[])))
(5 rows)
I think both v26 and v27 are correct here.  The c = 2 condition is in
the Filter.
Yes, I see it and agree with that.
In addition, I noticed that the ANY expression will be formed only for first group and ignore for others, like in the sample bellow:

v26 version [0]:

alena@postgres=# explain select * from t where (b = 1 or b = 2) and (a = 2 or a=3);
                                    QUERY PLAN
-----------------------------------------------------------------------------------
 Index Scan using t_a_b_idx on t  (cost=0.29..24.75 rows=2 width=12)
   Index Cond: ((a = ANY ('{2,3}'::integer[])) AND (b = ANY ('{1,2}'::integer[])))
(2 rows)

v27 version [1]:

alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3);
                       QUERY PLAN
--------------------------------------------------------
 Seq Scan on t  (cost=0.00..509.00 rows=14999 width=12)
   Filter: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3))
(2 rows)
Did you notice you're running different queries on v26 and v27 here?
If you will run ton v27 the same query you run on v26, the plan also
will be the same.

alena@postgres=# create index a_idx on t(a);
CREATE INDEX
alena@postgres=# create index b_idx on t(b);
CREATE INDEX
alena@postgres=# analyze;
ANALYZE

v26:

alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3);
                                     QUERY PLAN
------------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=17.18..30.94 rows=4 width=12)
   Recheck Cond: ((a = ANY ('{2,3}'::integer[])) OR (a = ANY ('{2,3}'::integer[])))
   ->  BitmapOr  (cost=17.18..17.18 rows=4 width=0)
         ->  Bitmap Index Scan on a_idx  (cost=0.00..8.59 rows=2 width=0)
               Index Cond: (a = ANY ('{2,3}'::integer[]))
         ->  Bitmap Index Scan on a_idx  (cost=0.00..8.59 rows=2 width=0)
               Index Cond: (a = ANY ('{2,3}'::integer[]))
(7 rows)

v27:

alena@postgres=# explain select * from t where (b = 1 or b = 2 or a = 2 or a=3);
                       QUERY PLAN
--------------------------------------------------------
 Seq Scan on t  (cost=0.00..509.00 rows=14999 width=12)
   Filter: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3))
(2 rows)

The behavior in version 26 is incorrect, but in version 27, it does not select anything other than seqscan
Please, check that there is still possibility to the generate BitmapOr plan.
It is fine, I think. The transformation works, but due to the fact that index columns are different for two indexes, the transformation hasn't been applied.

# explain select * from t where (b = 1 or b = 2 or a = 2 or a = 3);
                                     QUERY PLAN
------------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=326.16..835.16 rows=14999 width=12)
   Recheck Cond: ((b = 1) OR (b = 2) OR (a = 2) OR (a = 3))
   ->  BitmapOr  (cost=326.16..326.16 rows=20000 width=0)
         ->  Bitmap Index Scan on t_b_c_idx  (cost=0.00..151.29
rows=10000 width=0)
               Index Cond: (b = 1)
         ->  Bitmap Index Scan on t_b_c_idx  (cost=0.00..151.29
rows=10000 width=0)
               Index Cond: (b = 2)
         ->  Bitmap Index Scan on t_a_b_idx  (cost=0.00..4.29 rows=1 width=0)
               Index Cond: (a = 2)
         ->  Bitmap Index Scan on t_a_b_idx  (cost=0.00..4.29 rows=1 width=0)
               Index Cond: (a = 3)

It has higher cost than SeqScan plan, but I think it would be selected
on larger tables.  And yes, this is not ideal, because it fails to
generate BitmapOr over two IndexScans on SAOPs.  But it's not worse
than what current master does.  An optimization doesn't have to do
everything it could possible do.  So, I think this could be improved
in a separate patch.

Links
1. https://www.postgresql.org/message-id/CAPpHfdvhWE5pArZhgJeLViLx3-A3rxEREZvfkTj3E%3Dh7q-Bx9w%40mail.gmail.com
2. https://www.postgresql.org/message-id/CAPpHfdtSXxhdv3mLOLjEewGeXJ%2BFtfhjqodn1WWuq5JLsKx48g%40mail.gmail.com

Yes, I see and agree with you.

To be honest, I have found a big problem in this patch - we try to perform the transformation every time we examime a column:

for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++) { ...

}

I have fixed it and moved the transformation before going through the loop.

I try to make an array expression for "OR" expr, but at the same time I form the result as an "AND" expression, consisting of an "Array" expression and "OR" expressions, and then I check whether there is an index for this column, if so, I save it and write down the transformation. I also had to return the previous part of the patch, where we formed "ANY" groups, since we could end up with several such groups. I hope I made my idea clear, but if not, please tell me.

Unfortunately, I have got the different result one of the query from regression tests and I'm not sure if it is correct:

diff -U3 /home/alena/postgrespro_or3/src/test/regress/expected/create_index.out /home/alena/postgrespro_or3/src/test/regress/results/create_index.out --- /home/alena/postgrespro_or3/src/test/regress/expected/create_index.out 2024-07-23 18:51:13.077311360 +0300 +++ /home/alena/postgrespro_or3/src/test/regress/results/create_index.out 2024-07-25 16:43:56.895132328 +0300 @@ -1860,13 +1860,14 @@ EXPLAIN (COSTS OFF) SELECT * FROM tenk1 WHERE thousand = 42 AND (tenthous = 1 OR tenthous = (SELECT 1 + 2) OR tenthous = 42); - QUERY PLAN ----------------------------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------- Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand = 42) AND (tenthous = ANY (ARRAY[1, (InitPlan 1).col1, 42]))) + Index Cond: ((thousand = 42) AND (tenthous = ANY ('{1,-1,42}'::integer[]))) + Filter: ((tenthous = 1) OR (tenthous = (InitPlan 1).col1) OR (tenthous = 42)) InitPlan 1 -> Result -(4 rows) +(5 rows) SELECT * FROM tenk1 WHERE thousand = 42 AND (tenthous = 1 OR tenthous = (SELECT 1 + 2) OR tenthous = 42);

I'm researching what's wrong here now.

-- 
Regards,
Alena Rybakina
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
--------------YOQW3HC2Lo21M26zQTKgRkrW-- --------------OQroPYSjAYKCTuT0oWW9GZN9 Content-Type: text/x-patch; charset=UTF-8; name="v28-Transform-OR-clauses-to-ANY-expression.patch" Content-Disposition: attachment; filename="v28-Transform-OR-clauses-to-ANY-expression.patch" Content-Transfer-Encoding: base64 RnJvbSAzMWY1OGI4YWQ4NWU3NzUzNGQzOGQwOTkzNjgxNjhkOWY3NzUxNDlmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0 Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAyNSBKdWwgMjAyNCAxNzowMzowNSArMDMwMApTdWJq ZWN0OiBbUEFUQ0hdIFRyYW5zZm9ybSBPUiBjbGF1c2VzIHRvIEFOWSBleHByZXNzaW9uCgpS ZXBsYWNlIChleHByIG9wIEMxKSBPUiAoZXhwciBvcCBDMikgLi4uIHdpdGggZXhwciBvcCBB TlkoQVJSQVlbQzEsIEMyLCAuLi5dKQpkdXJpbmcgbWF0Y2hpbmcgYSBjbGF1c2UgdG8gaW5k ZXguCgpIZXJlIENuIGlzIGEgbi10aCBjb25zdGFudCBvciBwYXJhbWV0ZXJzIGV4cHJlc3Np b24sICdleHByJyBpcyBub24tY29uc3RhbnQKZXhwcmVzc2lvbiwgJ29wJyBpcyBhbiBvcGVy YXRvciB3aGljaCByZXR1cm5zIGJvb2xlYW4gcmVzdWx0IGFuZCBoYXMgYSBjb21tdXRlcgoo Zm9yIHRoZSBjYXNlIG9mIHJldmVyc2Ugb3JkZXIgb2YgY29uc3RhbnQgYW5kIG5vbi1jb25z dGFudCBwYXJ0cyBvZiB0aGUKZXhwcmVzc2lvbiwgbGlrZSAnQ24gb3AgZXhwcicpLgoKRGlz Y3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS81NjdFRDZDQS4yMDQwNTA0JTQwc2lnYWV2 LnJ1CkF1dGhvcjogQWxlbmEgUnliYWtpbmEgPGxlbmEucmliYWNraW5hQHlhbmRleC5ydT4K QXV0aG9yOiBBbmRyZXkgTGVwaWtob3YgPGEubGVwaWtob3ZAcG9zdGdyZXNwcm8ucnU+ClJl dmlld2VkLWJ5OiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+ClJldmlld2VkLWJ5OiBS YW5pZXIgVmlsZWxhIDxyYW5pZXIudmZAZ21haWwuY29tPgpSZXZpZXdlZC1ieTogQWxleGFu ZGVyIEtvcm90a292IDxhZWtvcm90a292QGdtYWlsLmNvbT4KUmV2aWV3ZWQtYnk6IFJvYmVy dCBIYWFzIDxyb2JlcnRtaGFhc0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBKaWFuIEhlIDxq aWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBUb20gTGFuZSA8dGds QHNzcy5wZ2gucGEudXM+ClJldmlld2VkLWJ5OiBOaWtvbGF5IFNoYXBsb3YgPGRoeWFuQG5h dGFyYWouc3U+Ci0tLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAg ICAgIHwgMzk2ICsrKysrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0 aG5vZGVzLmggICAgICAgICAgICAgIHwgIDMxICsrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2NyZWF0ZV9pbmRleC5vdXQgfCAxODMgKysrKysrKysrLQogc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgIHwgIDU3ICsrLQogc3JjL3Rlc3QvcmVncmVz cy9zcWwvY3JlYXRlX2luZGV4LnNxbCAgICAgIHwgIDQyICsrKwogc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwgICAgICAgICAgICAgIHwgICA5ICsKIHNyYy90b29scy9wZ2luZGVu dC90eXBlZGVmcy5saXN0ICAgICAgICAgICB8ICAgMSArCiA3IGZpbGVzIGNoYW5nZWQsIDY5 NyBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvaW5keHBhdGguYwppbmRleCBjMGZjYzdkNzhkZi4uMzViZGYwMGRjYjEgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysrIGIvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMzIsNyArMzIsOSBAQAog I2luY2x1ZGUgIm9wdGltaXplci9wYXRocy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9wcmVw LmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL3Jlc3RyaWN0aW5mby5oIgorI2luY2x1ZGUgInV0 aWxzL2FycmF5LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCisjaW5jbHVkZSAi dXRpbHMvc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9zZWxmdW5jcy5oIgogCiAKQEAg LTE5MSw2ICsxOTMsMTAgQEAgc3RhdGljIEV4cHIgKm1hdGNoX2NsYXVzZV90b19vcmRlcmlu Z19vcChJbmRleE9wdEluZm8gKmluZGV4LAogc3RhdGljIGJvb2wgZWNfbWVtYmVyX21hdGNo ZXNfaW5kZXhjb2woUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJ CQkJCSAgIEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBFcXVpdmFsZW5jZU1lbWJlciAqZW0sCiAJ CQkJCQkJCQkgICB2b2lkICphcmcpOworc3RhdGljIGJvb2wKK3RyeV9wcmVwYXJlX3Npbmds ZV9vcihSZXN0cmljdEluZm8gKnJpbmZvLCBMaXN0ICoqYXBwcm9wcmlhdGVfZ3JvdXApOwor c3RhdGljIExpc3QgKgordHJhbnNmb3JtX29yX3RvX2FueShQbGFubmVySW5mbyAqcm9vdCwg UmVzdHJpY3RJbmZvICogcmluZm8pOwogCiAKIC8qCkBAIC0yMDg3LDYgKzIwOTMsNyBAQCBt YXRjaF9jbGF1c2VfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCSAgSW5kZXhD bGF1c2VTZXQgKmNsYXVzZXNldCkKIHsKIAlpbnQJCQlpbmRleGNvbDsKKwlMaXN0ICpjYW5k aWRhdGVzID0gTklMOwogCiAJLyoKIAkgKiBOZXZlciBtYXRjaCBwc2V1ZG9jb25zdGFudHMg dG8gaW5kZXhlcy4gIChOb3JtYWxseSBhIG1hdGNoIGNvdWxkIG5vdApAQCAtMjEwNCw2ICsy MTExLDkgQEAgbWF0Y2hfY2xhdXNlX3RvX2luZGV4KFBsYW5uZXJJbmZvICpyb290LAogCWlm ICghcmVzdHJpY3Rpb25faXNfc2VjdXJlbHlfcHJvbW90YWJsZShyaW5mbywgaW5kZXgtPnJl bCkpCiAJCXJldHVybjsKIAorCWlmIChJc0EocmluZm8tPmNsYXVzZSwgQm9vbEV4cHIpICYm IGlzX29yY2xhdXNlKHJpbmZvLT5jbGF1c2UpKQorCQkJY2FuZGlkYXRlcyA9IHRyYW5zZm9y bV9vcl90b19hbnkocm9vdCwgcmluZm8pOworCiAJLyogT0ssIGNoZWNrIGVhY2ggaW5kZXgg a2V5IGNvbHVtbiBmb3IgYSBtYXRjaCAqLwogCWZvciAoaW5kZXhjb2wgPSAwOyBpbmRleGNv bCA8IGluZGV4LT5ua2V5Y29sdW1uczsgaW5kZXhjb2wrKykKIAl7CkBAIC0yMTE5LDYgKzIx MjksNzEgQEAgbWF0Y2hfY2xhdXNlX3RvX2luZGV4KFBsYW5uZXJJbmZvICpyb290LAogCQkJ CXJldHVybjsKIAkJfQogCisJCWlmIChjYW5kaWRhdGVzICE9IE5JTCkKKwkJeworCQkJTGlz dENlbGwgKmxjMTsKKwkJCUV4cHIgKml0ZW0gPSBOVUxMOworCQkJTm9kZSAqbmNvbnN0X2V4 cHIgPSBOVUxMOworCQkJRXhwciAqZXhwciA9IE5VTEw7CisJCQlMaXN0ICpyZXN1bHQgPSBO SUw7CisJCQlib29sIGZsYWcgPSBmYWxzZTsKKworCQkJZm9yZWFjaChsYzEsIGNhbmRpZGF0 ZXMpCisJCQl7CisJCQkJaXRlbSA9IGxmaXJzdChsYzEpOworCisJCQkJaWYoaXRlbSAmJiBJ c0EoaXRlbSwgQm9vbEV4cHIpKQorCQkJCXsKKwkJCQkJaWYoaXNfYW5kY2xhdXNlKChOb2Rl KikgaXRlbSkgJiYgSXNBKGxpbml0aWFsKCgoQm9vbEV4cHIgKikgaXRlbSktPmFyZ3MpLCBT Y2FsYXJBcnJheU9wRXhwcikpCisJCQkJCXsKKworCQkJCQkJZXhwciA9IGxpbml0aWFsKCgo Qm9vbEV4cHIgKikgaXRlbSktPmFyZ3MpOworCisJCQkJCQluY29uc3RfZXhwciA9IGdldF9s ZWZ0b3AoZXhwcik7CisKKwkJCQkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKG5jb25z dF9leHByLCBpbmRleGNvbCwgaW5kZXgpKQorCQkJCQkJeworCQkJCQkJCXJlc3VsdCA9IGxh cHBlbmQocmVzdWx0LCAodm9pZCAqKSBleHByKTsKKwkJCQkJCQlmbGFnID0gdHJ1ZTsKKwkJ CQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQll eHByID0gbHNlY29uZCgoKEJvb2xFeHByICopIGl0ZW0pLT5hcmdzKTsKKwkJCQkJCX0KKwkJ CQkJfQorCQkJCX0KKworCQkJCWlmKGV4cHIgPT0gTlVMTCkKKwkJCQkJcmVzdWx0ID0gbGFw cGVuZChyZXN1bHQsICh2b2lkICopaXRlbSk7CisJCQkJZWxzZQorCQkJCQlyZXN1bHQgPSBs YXBwZW5kKHJlc3VsdCwgZXhwcik7CisJCQl9CisKKwkJCWlmIChmbGFnKQorCQkJeworCQkJ CXJpbmZvID0gbWFrZV9yZXN0cmljdGluZm8ocm9vdCwKKwkJCQkJCQkJCSAgIGxpc3RfbGVu Z3RoKHJlc3VsdCkgPiAxID8KKwkJCQkJCQkJCQkJbWFrZUJvb2xFeHByKE9SX0VYUFIsIHJl c3VsdCwKKwkJCQkJCQkJCQkJKChCb29sRXhwciAqKSByaW5mby0+Y2xhdXNlKS0+bG9jYXRp b24pIDoKKwkJCQkJCQkJCQkJbGluaXRpYWwocmVzdWx0KSwKKwkJCQkJCQkJCSAgIHJpbmZv LT5pc19wdXNoZWRfZG93biwKKwkJCQkJCQkJCSAgIHJpbmZvLT5oYXNfY2xvbmUsCisJCQkJ CQkJCQkgICByaW5mby0+aXNfY2xvbmUsCisJCQkJCQkJCSAgIAkgICByaW5mby0+cHNldWRv Y29uc3RhbnQsCisJCQkJCQkJCQkgICByaW5mby0+c2VjdXJpdHlfbGV2ZWwsCisJCQkJCQkJ CQkgICByaW5mby0+cmVxdWlyZWRfcmVsaWRzLAorCQkJCQkJCQkJICAgcmluZm8tPmluY29t cGF0aWJsZV9yZWxpZHMsCisJCQkJCQkJCQkgICByaW5mby0+b3V0ZXJfcmVsaWRzKTsKKwkJ CQlpY2xhdXNlID0gbWFrZU5vZGUoSW5kZXhDbGF1c2UpOworCQkJCWljbGF1c2UtPnJpbmZv ID0gcmluZm87CisJCQkJaWNsYXVzZS0+aW5kZXhxdWFscyA9IGxpc3RfbWFrZTEoaWNsYXVz ZS0+cmluZm8pOworCQkJCWljbGF1c2UtPmxvc3N5ID0gZmFsc2U7CisJCQkJaWNsYXVzZS0+ aW5kZXhjb2wgPSBpbmRleGNvbDsKKwkJCQlpY2xhdXNlLT5pbmRleGNvbHMgPSBOSUw7CisJ CQl9CisJCX0KKwogCQkvKiBPSywgdHJ5IHRvIG1hdGNoIHRoZSBjbGF1c2UgdG8gdGhlIGlu ZGV4IGNvbHVtbiAqLwogCQlpY2xhdXNlID0gbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sKHJv b3QsCiAJCQkJCQkJCQkJICAgcmluZm8sCkBAIC0yNzcxLDYgKzI4NDYsMzI3IEBAIG1hdGNo X3Jvd2NvbXBhcmVfdG9faW5kZXhjb2woUGxhbm5lckluZm8gKnJvb3QsCiAJcmV0dXJuIE5V TEw7CiB9CiAKK3N0YXRpYyBib29sCit0cnlfcHJlcGFyZV9zaW5nbGVfb3IoUmVzdHJpY3RJ bmZvICpyaW5mbywgTGlzdCAqKmFwcHJvcHJpYXRlX2dyb3VwKQoreworCU9wRXhwcgkgICAq b3JxdWFsOworCU5vZGUJICAgKmNvbnN0X2V4cHI7CisJTm9kZQkgICAqbmNvbnN0X2V4cHI7 CisJT2lkCQkJb3BubzsKKwlPaWQJCQljb25zdHR5cGU7CisJTm9kZQkgICAqbGVmdG9wLAor CQkJICAgKnJpZ2h0b3A7CisJTGlzdENlbGwgICAqbGMyOworCWJvb2wgZm91bmQgPSBmYWxz ZTsKKwlPckNsYXVzZUdyb3VwICpvcl9jbGF1c2VfZ3JvdXA7CisKKwlpZiAoIUlzQShyaW5m bywgUmVzdHJpY3RJbmZvKSB8fCAhSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikpCisJewor CQlyZXR1cm4gZmFsc2U7CisJfQorCisJb3JxdWFsID0gKE9wRXhwciAqKSByaW5mby0+Y2xh dXNlOworCW9wbm8gPSBvcnF1YWwtPm9wbm87CisJaWYgKGdldF9vcF9yZXR0eXBlKG9wbm8p ICE9IEJPT0xPSUQpCisJeworCQkvKiBPbmx5IG9wZXJhdG9yIHJldHVybmluZyBib29sZWFu IHN1aXRzIE9SIC0+IEFOWSB0cmFuc2Zvcm1hdGlvbiAqLworCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJLyoKKwkJKiBEZXRlY3QgdGhlIGNvbnN0YW50IHNpZGUgb2YgdGhlIGNsYXVzZS4g UmVjYWxsIG5vbi1jb25zdGFudAorCQkqIGV4cHJlc3Npb24gY2FuIGJlIG1hZGUgbm90IG9u bHkgd2l0aCBWYXJzLCBidXQgYWxzbyB3aXRoIFBhcmFtcywKKwkJKiB3aGljaCBpcyBub3Qg Ym9uZGVkIHdpdGggYW55IHJlbGF0aW9uLiBUaHVzLCB3ZSBkZXRlY3QgdGhlIGNvbnN0CisJ CSogc2lkZSAtIGlmIGFub3RoZXIgc2lkZSBpcyBjb25zdGFudCB0b28sIHRoZSBvcnF1YWwg Y291bGRuJ3QgYmUgYW4KKwkJKiBPcEV4cHIuICBHZXQgcG9pbnRlcnMgdG8gY29uc3RhbnQg YW5kIGV4cHJlc3Npb24gc2lkZXMgb2YgdGhlIHF1YWwuCisJCSovCisJbGVmdG9wID0gZ2V0 X2xlZnRvcChvcnF1YWwpOworCWlmIChJc0EobGVmdG9wLCBSZWxhYmVsVHlwZSkpCisJCWxl ZnRvcCA9IChOb2RlICopICgoUmVsYWJlbFR5cGUgKikgbGVmdG9wKS0+YXJnOworCisJcmln aHRvcCA9IGdldF9yaWdodG9wKG9ycXVhbCk7CisJaWYgKElzQShyaWdodG9wLCBSZWxhYmVs VHlwZSkpCisJCXJpZ2h0b3AgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIHJpZ2h0b3Ap LT5hcmc7CisKKwlpZiAoSXNBKGxlZnRvcCwgQ29uc3QpIHx8IElzQShsZWZ0b3AsIFBhcmFt KSkKKwl7CisJCW9wbm8gPSBnZXRfY29tbXV0YXRvcihvcG5vKTsKKworCQlpZiAoIU9pZElz VmFsaWQob3BubykpCisJCXsvKiBjb21tdXRhdG9yIGRvZXNuJ3QgZXhpc3QsIHdlIGNhbid0 IHJldmVyc2UgdGhlIG9yZGVyICovCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQluY29u c3RfZXhwciA9IGdldF9yaWdodG9wKG9ycXVhbCk7CisJCWNvbnN0X2V4cHIgPSBnZXRfbGVm dG9wKG9ycXVhbCk7CisJfQorCWVsc2UgaWYgKElzQShyaWdodG9wLCBDb25zdCkgfHwgSXNB KHJpZ2h0b3AsIFBhcmFtKSkKKwl7CisJCWNvbnN0X2V4cHIgPSBnZXRfcmlnaHRvcChvcnF1 YWwpOworCQluY29uc3RfZXhwciA9IGdldF9sZWZ0b3Aob3JxdWFsKTsKKwl9CisJZWxzZQor CXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJCSogRm9yYmlkIHRyYW5zZm9ybWF0 aW9uIGZvciBjb21wb3NpdGUgdHlwZXMsIHJlY29yZHMsIGFuZCB2b2xhdGlsZQorCQkqIGV4 cHJlc3Npb25zLgorCQkqLworCWNvbnN0dHlwZSA9IGV4cHJUeXBlKGNvbnN0X2V4cHIpOwor CWlmICh0eXBlX2lzX3Jvd3R5cGUoZXhwclR5cGUoY29uc3RfZXhwcikpIHx8CisJCXR5cGVf aXNfcm93dHlwZShjb25zdHR5cGUpIHx8CisJCWNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25z KChOb2RlICopIG5jb25zdF9leHByKSkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlv cl9jbGF1c2VfZ3JvdXAgPSBtYWtlTm9kZShPckNsYXVzZUdyb3VwKTsKKworCWZvcmVhY2go bGMyLCAqYXBwcm9wcmlhdGVfZ3JvdXApCisJeworCisJCWlmICghSXNBKGxmaXJzdChsYzIp LCBPckNsYXVzZUdyb3VwKSkKKwkJCUFzc2VydCgwKTsKKworCQlvcl9jbGF1c2VfZ3JvdXAg PSAoT3JDbGF1c2VHcm91cCAqKSBsZmlyc3QobGMyKTsKKworCQlpZiAob3JfY2xhdXNlX2dy b3VwLT5vcG5vID09IG9wbm8gJiYKKwkJCW9yX2NsYXVzZV9ncm91cC0+Y29uc3R0eXBlID09 IGNvbnN0dHlwZSAmJgorCQkJb3JfY2xhdXNlX2dyb3VwLT5pbnB1dGNvbGxpZCA9PSBleHBy Q29sbGF0aW9uKGNvbnN0X2V4cHIpICYmCisJCQllcXVhbChvcl9jbGF1c2VfZ3JvdXAtPmV4 cHIsIG5jb25zdF9leHByKSkKKwkJeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJ CX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCXsKKwkJb3JfY2xhdXNlX2dyb3VwLT5leHByID0g KEV4cHIgKikgbmNvbnN0X2V4cHI7CisJCW9yX2NsYXVzZV9ncm91cC0+ZXhwcnMgPSBsaXN0 X21ha2UxKCh2b2lkICopIG9ycXVhbCk7CisJCW9yX2NsYXVzZV9ncm91cC0+b3BubyA9IG9w bm87CisJCW9yX2NsYXVzZV9ncm91cC0+aW5wdXRjb2xsaWQgPSBleHByQ29sbGF0aW9uKGNv bnN0X2V4cHIpOworCQlvcl9jbGF1c2VfZ3JvdXAtPmNvbnN0dHlwZSA9IGNvbnN0dHlwZTsK KwkJb3JfY2xhdXNlX2dyb3VwLT5jb25zdHMgPSBsaXN0X21ha2UxKGNvbnN0X2V4cHIpOwor CQlvcl9jbGF1c2VfZ3JvdXAtPmhhdmVfcGFyYW0gPSBJc0EoY29uc3RfZXhwciwgUGFyYW0p OworCQlBc3NlcnQobGlzdF9sZW5ndGgob3JfY2xhdXNlX2dyb3VwLT5leHBycykgPT0gbGlz dF9sZW5ndGgob3JfY2xhdXNlX2dyb3VwLT5jb25zdHMpKTsKKwkJKmFwcHJvcHJpYXRlX2dy b3VwID0gbGFwcGVuZCgqYXBwcm9wcmlhdGVfZ3JvdXAsIG9yX2NsYXVzZV9ncm91cCk7CisJ CUFzc2VydChsaXN0X2xlbmd0aChvcl9jbGF1c2VfZ3JvdXAtPmV4cHJzKSA9PSBsaXN0X2xl bmd0aChvcl9jbGF1c2VfZ3JvdXAtPmNvbnN0cykpOworCX0KKwllbHNlCisJeworCQlvcl9j bGF1c2VfZ3JvdXAtPmNvbnN0cyA9IGxhcHBlbmQob3JfY2xhdXNlX2dyb3VwLT5jb25zdHMs IGNvbnN0X2V4cHIpOworCQlvcl9jbGF1c2VfZ3JvdXAtPmV4cHJzID0gbGFwcGVuZChvcl9j bGF1c2VfZ3JvdXAtPmV4cHJzLCAodm9pZCAqKSBvcnF1YWwpOworCQlBc3NlcnQobGlzdF9s ZW5ndGgob3JfY2xhdXNlX2dyb3VwLT5leHBycykgPT0gbGlzdF9sZW5ndGgob3JfY2xhdXNl X2dyb3VwLT5jb25zdHMpKTsKKworCQlBc3NlcnQobGlzdF9sZW5ndGgob3JfY2xhdXNlX2dy b3VwLT5leHBycykgPT0gbGlzdF9sZW5ndGgob3JfY2xhdXNlX2dyb3VwLT5jb25zdHMpKTsK Kwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHRyYW5zZm9ybV9vcl90b19hbnkg LQorICoJICBEaXNjb3ZlciB0aGUgYXJncyBvZiBhbiBPUiBleHByZXNzaW9uIGFuZCB0cnkg dG8gZ3JvdXAgc2ltaWxhciBPUgorICoJICBleHByZXNzaW9ucyB0byBTQU9QIGV4cHJlc3Np b25zLgorICoKKyAqIFRoaXMgdHJhbnNmb3JtYXRpb24gZ3JvdXBzIHR3by1zaWRlZCBlcXVh bGl0eSBleHByZXNzaW9uLiAgT25lIHNpZGUgb2YKKyAqIHN1Y2ggYW4gZXhwcmVzc2lvbiBt dXN0IGJlIGEgcGxhaW4gY29uc3RhbnQgb3IgY29uc3RhbnQgZXhwcmVzc2lvbi4gIFRoZQor ICogb3RoZXIgc2lkZSBtdXN0IGJlIGEgdmFyaWFibGUgZXhwcmVzc2lvbiB3aXRob3V0IHZv bGF0aWxlIGZ1bmN0aW9ucy4KKyAqIFRvIGdyb3VwIHF1YWxzLCBvcG5vLCBpbnB1dGNvbGxp ZCBvZiB2YXJpYWJsZSBleHByZXNzaW9uLCBhbmQgdHlwZSBvZgorICogY29uc3RhbnQgZXhw cmVzc2lvbiBtdXN0IGJlIGVxdWFsIHRvby4KKyAqCisgKiBUaGUgZ3JvdXBpbmcgdGVjaG5p cXVlIGlzIGJhc2VkIG9uIHRoZSBlcXVpdmFsZW5jZSBvZiB2YXJpYWJsZSBzaWRlcyBvZgor ICogdGhlIGV4cHJlc3Npb246IHVzaW5nIGV4cHJJZCBhbmQgZXF1YWwoKSByb3V0aW5lLCBp dCBncm91cHMgY29uc3RhbnQgc2lkZXMKKyAqIG9mIHNpbWlsYXIgY2xhdXNlcyBpbnRvIGFu IGFycmF5LiAgQWZ0ZXIgdGhlIGdyb3VwaW5nIHByb2NlZHVyZSwgZWFjaAorICogY291cGxl ICgndmFyaWFibGUgZXhwcmVzc2lvbicgYW5kICdjb25zdGFudCBhcnJheScpIGZvcm1zIGEg bmV3IFNBT1AKKyAqIG9wZXJhdGlvbiwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGFyZ3MgbGlz dCBvZiB0aGUgcmV0dXJuaW5nIGV4cHJlc3Npb24uCisgKi8KK3N0YXRpYyBMaXN0ICoKK3Ry YW5zZm9ybV9vcl90b19hbnkoUGxhbm5lckluZm8gKnJvb3QsIFJlc3RyaWN0SW5mbyAqIHJp bmZvKQoreworCUxpc3QJICAgKmFwcHJvcHJpYXRlX2VudHJpZXMgPSBOSUw7CisJTGlzdAkg ICAqb3JfZW50cmllcyA9IE5JTDsKKwlpbnQJCQlsZW5fb3JzID0gKChCb29sRXhwciAqKSBy aW5mby0+Y2xhdXNlKS0+YXJncyA/IGxpc3RfbGVuZ3RoKCgoQm9vbEV4cHIgKikgcmluZm8t PmNsYXVzZSktPmFyZ3MpIDogMDsKKwlPckNsYXVzZUdyb3VwICpyZXN0cmljdF9pbmZvX2Vu dHJ5ID0gTlVMTDsKKwlMaXN0Q2VsbAkgICAqbGM7CisJYm9vbCBmb3VuZDsKKwlMaXN0ICpy ZXN1bHQgPSBOSUw7CisKKwlpZihsZW5fb3JzIDwgMikKKwkJcmV0dXJuIE5JTDsKKworCWZv cmVhY2gobGMsICgoQm9vbEV4cHIgKikgcmluZm8tPm9yY2xhdXNlKS0+YXJncykKKwl7CisJ CVJlc3RyaWN0SW5mbyAqc3ViX3JpbmZvOworCQlFeHByCQkgKm9yX3F1YWwgPSAoRXhwciAq KSBsZmlyc3QobGMpOworCisJCWlmKCFJc0EobGZpcnN0KGxjKSwgUmVzdHJpY3RJbmZvKSkK KwkJCW9yX2VudHJpZXMgPSBsYXBwZW5kKG9yX2VudHJpZXMsICh2b2lkICopIG9yX3F1YWwp OworCQllbHNlCisJCXsKKwkJCXN1Yl9yaW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0 KGxjKTsKKworCQkJLyoKKwkJCSogQWRkIHRoZSByZXN0cmljdF9pbmZvX2VudHJ5IHRvIHRo ZSBsaXN0LiAgSXQgaXMgbmVlZGVkIGV4Y2x1c2l2ZWx5IHRvIG1hbmFnZQorCQkJKiB0aGUg cHJvYmxlbSB3aXRoIHRoZSBvcmRlciBvZiB0cmFuc2Zvcm1lZCBjbGF1c2VzIGluIGV4cGxh aW4uCisJCQkqIEhhc2ggdmFsdWUgY2FuIGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0gYW5kIHZl cnNpb24uICBIZW5jZSwKKwkJCSogc2VxdWVudGFsIHNjYW4gb2YgdGhlIGhhc2ggdGFibGUg d291bGQgcHJvbmUgdG8gY2hhbmdlIHRoZQorCQkJKiBvcmRlciBvZiBjbGF1c2VzIGluIGxp c3RzIGFuZCwgYXMgYSByZXN1bHQsIGJyZWFrIHJlZ3Jlc3Npb24KKwkJCSogdGVzdHMgYWNj aWRlbnRpYWxseS4KKwkJCSovCisJCQlmb3VuZCA9IHRyeV9wcmVwYXJlX3NpbmdsZV9vcihz dWJfcmluZm8sICZhcHByb3ByaWF0ZV9lbnRyaWVzKTsKKworCQkJaWYgKCFmb3VuZCkKKwkJ CXsKKwkJCQlvcl9lbnRyaWVzID0gbGFwcGVuZChvcl9lbnRyaWVzLCAodm9pZCAqKSBzdWJf cmluZm8tPmNsYXVzZSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobGlzdF9sZW5ndGgob3Jf ZW50cmllcykgPT0gbGVuX29ycyB8fCAoYXBwcm9wcmlhdGVfZW50cmllcyA9PSBOSUwgJiYg bGlzdF9sZW5ndGgoYXBwcm9wcmlhdGVfZW50cmllcykgPCAxKSkKKwkJcmV0dXJuIE5JTDsK KworCWZvdW5kID0gZmFsc2U7CisKKwkvKiBMZXQncyBjb252ZXJ0IGVhY2ggZ3JvdXAgb2Yg Y2xhdXNlcyB0byBhbiBBTlkgZXhwcmVzc2lvbi4gKi8KKworCS8qCisJICogR28gdGhyb3Vn aCB0aGUgbGlzdCBvZiBncm91cHMgYW5kIGNvbnZlcnQgZWFjaCwgd2hlcmUgbnVtYmVyIG9m IGNvbnN0cworCSAqIG1vcmUgdGhhbiAxLiB0cml2aWFsIGdyb3VwcyBtb3ZlIHRvIE9SLWxp c3QgYWdhaW4KKwkgKi8KKworCWZvcmVhY2gobGMsIGFwcHJvcHJpYXRlX2VudHJpZXMpCisJ eworCQlPaWQJCQlzY2FsYXJfdHlwZTsKKwkJT2lkCQkJYXJyYXlfdHlwZTsKKwkJTm9kZQkg ICAqbmV3YSA9IE5VTEw7CisJCUhlYXBUdXBsZQlvcGVydHVwOworCQlGb3JtX3BnX29wZXJh dG9yIG9wZXJmb3JtOworCQlTY2FsYXJBcnJheU9wRXhwciAqc2FvcGV4cHIgPSBOVUxMOwor CQlFeHByICpjYW5kaWRhdGUgPSBOVUxMOworCQlFeHByICptYWluX29ycyA9IE5VTEw7CisK KwkJaWYgKCFJc0EobGZpcnN0KGxjKSwgT3JDbGF1c2VHcm91cCkpCisJCXsKKwkJCUFzc2Vy dCgwKTsKKwkJfQorCisJCXJlc3RyaWN0X2luZm9fZW50cnkgPSAoT3JDbGF1c2VHcm91cCAq KSBsZmlyc3QobGMpOworCisJCUFzc2VydChsaXN0X2xlbmd0aChyZXN0cmljdF9pbmZvX2Vu dHJ5LT5leHBycykgPT0gbGlzdF9sZW5ndGgocmVzdHJpY3RfaW5mb19lbnRyeS0+Y29uc3Rz KSk7CisKKwkJaWYgKGxpc3RfbGVuZ3RoKHJlc3RyaWN0X2luZm9fZW50cnktPmNvbnN0cykg PT0gMSkKKwkJeworCQkJLyoKKwkJCSAqIE9ubHkgb25lIGVsZW1lbnQgcmV0dXJucyBvcmln aW4gZXhwcmVzc2lvbiBpbnRvIHRoZSBCb29sRXhwcgorCQkJICogYXJncyBsaXN0IHVuY2hh bmdlZC4KKwkJCSAqLworCQkJb3JfZW50cmllcyA9IGxpc3RfY29uY2F0KG9yX2VudHJpZXMs ICh2b2lkICopIHJlc3RyaWN0X2luZm9fZW50cnktPmV4cHJzKTsKKwkJCWNvbnRpbnVlOwor CQl9CisKKwkJc2NhbGFyX3R5cGUgPSByZXN0cmljdF9pbmZvX2VudHJ5LT5jb25zdHR5cGU7 CisJCWFycmF5X3R5cGUgPSBPaWRJc1ZhbGlkKHNjYWxhcl90eXBlKSA/IGdldF9hcnJheV90 eXBlKHNjYWxhcl90eXBlKSA6CisJCQlJbnZhbGlkT2lkOworCisJCWlmICghT2lkSXNWYWxp ZChhcnJheV90eXBlKSkKKwkJeworCQkJb3JfZW50cmllcyA9IGxpc3RfY29uY2F0KG9yX2Vu dHJpZXMsICh2b2lkICopIHJlc3RyaWN0X2luZm9fZW50cnktPmV4cHJzKTsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJaWYgKHJlc3RyaWN0X2luZm9fZW50cnktPmhhdmVfcGFyYW0pCisJ CXsKKwkJCS8qCisJCQkqIFdlIG5lZWQgdG8gY29uc3RydWN0IGFuIEFycmF5RXhwciBnaXZl biB3ZSBoYXZlIFBhcmFtJ3Mgbm90IGp1c3QKKwkJCSogQ29uc3Qncy4KKwkJCSovCisJCQlB cnJheUV4cHIgICphcmV4cHIgPSBtYWtlTm9kZShBcnJheUV4cHIpOworCisJCQkvKiBhcnJh eV9jb2xsaWQgd2lsbCBiZSBzZXQgYnkgcGFyc2VfY29sbGF0ZS5jICovCisJCQlhcmV4cHIt PmVsZW1lbnRfdHlwZWlkID0gc2NhbGFyX3R5cGU7CisJCQlhcmV4cHItPmFycmF5X3R5cGVp ZCA9IGFycmF5X3R5cGU7CisJCQlhcmV4cHItPm11bHRpZGltcyA9IGZhbHNlOworCQkJYXJl eHByLT5lbGVtZW50cyA9IHJlc3RyaWN0X2luZm9fZW50cnktPmNvbnN0czsKKwkJCWFyZXhw ci0+bG9jYXRpb24gPSAtMTsKKworCQkJbmV3YSA9IChOb2RlICopIGFyZXhwcjsKKwkJfQor CQllbHNlCisJCXsKKwkJCS8qIFdlIGhhdmUgb25seSBDb3N0cydzLiAgQ2FuIGdlbmVyYXRl IGNvbnN0YW50IGFycmF5LiAqLworCisJCQlpbnQxNgkJdHlwbGVuOworCQkJYm9vbAkJdHlw Ynl2YWw7CisJCQljaGFyCQl0eXBhbGlnbjsKKwkJCURhdHVtCSAgICplbGVtczsKKwkJCWlu dAkJCWkgPSAwOworCQkJQXJyYXlUeXBlICAqYXI7CisJCQlMaXN0Q2VsbCAqbGMxOworCisJ CQlnZXRfdHlwbGVuYnl2YWxhbGlnbihzY2FsYXJfdHlwZSwgJnR5cGxlbiwgJnR5cGJ5dmFs LCAmdHlwYWxpZ24pOworCisJCQllbGVtcyA9IChEYXR1bSAqKSBwYWxsb2Moc2l6ZW9mKERh dHVtKSAqIGxpc3RfbGVuZ3RoKHJlc3RyaWN0X2luZm9fZW50cnktPmNvbnN0cykpOworCQkJ Zm9yZWFjaChsYzEsIHJlc3RyaWN0X2luZm9fZW50cnktPmNvbnN0cykKKwkJCXsKKwkJCQlO b2RlCSAgICplbGVtID0gKE5vZGUgKikgbGZpcnN0KGxjMSk7CisKKwkJCQllbGVtc1tpKytd ID0gKChDb25zdCAqKSBlbGVtKS0+Y29uc3R2YWx1ZTsKKwkJCX0KKworCQkJYXIgPSBjb25z dHJ1Y3RfYXJyYXkoZWxlbXMsIGksIHNjYWxhcl90eXBlLCB0eXBsZW4sIHR5cGJ5dmFsLCB0 eXBhbGlnbik7CisJCQluZXdhID0gKE5vZGUgKikgbWFrZUNvbnN0KGFycmF5X3R5cGUsIC0x LCByZXN0cmljdF9pbmZvX2VudHJ5LT5pbnB1dGNvbGxpZCwgLTEsIFBvaW50ZXJHZXREYXR1 bShhciksIGZhbHNlLCBmYWxzZSk7CisKKwkJCXBmcmVlKGVsZW1zKTsKKwkJfQorCisJCW9w ZXJ0dXAgPSBTZWFyY2hTeXNDYWNoZTEoT1BFUk9JRCwKKwkJCQkJCQkJT2JqZWN0SWRHZXRE YXR1bShyZXN0cmljdF9pbmZvX2VudHJ5LT5vcG5vKSk7CisJCWlmICghSGVhcFR1cGxlSXNW YWxpZChvcGVydHVwKSkKKwkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZv ciBvcGVyYXRvciAldSIsIHJlc3RyaWN0X2luZm9fZW50cnktPm9wbm8pOworCisJCW9wZXJm b3JtID0gKEZvcm1fcGdfb3BlcmF0b3IpIEdFVFNUUlVDVChvcGVydHVwKTsKKworCQkvKiBh bmQgYnVpbGQgdGhlIGV4cHJlc3Npb24gbm9kZSAqLworCQlzYW9wZXhwciA9IG1ha2VOb2Rl KFNjYWxhckFycmF5T3BFeHByKTsKKwkJc2FvcGV4cHItPm9wbm8gPSByZXN0cmljdF9pbmZv X2VudHJ5LT5vcG5vOworCQlzYW9wZXhwci0+b3BmdW5jaWQgPSBvcGVyZm9ybS0+b3ByY29k ZTsKKwkJc2FvcGV4cHItPmhhc2hmdW5jaWQgPSBJbnZhbGlkT2lkOworCQlzYW9wZXhwci0+ bmVnZnVuY2lkID0gSW52YWxpZE9pZDsKKwkJc2FvcGV4cHItPnVzZU9yID0gdHJ1ZTsKKwkJ c2FvcGV4cHItPmlucHV0Y29sbGlkID0gcmVzdHJpY3RfaW5mb19lbnRyeS0+aW5wdXRjb2xs aWQ7CisJCS8qIGlucHV0Y29sbGlkIHdpbGwgYmUgc2V0IGJ5IHBhcnNlX2NvbGxhdGUuYyAq LworCQlzYW9wZXhwci0+YXJncyA9IGxpc3RfbWFrZTIocmVzdHJpY3RfaW5mb19lbnRyeS0+ ZXhwciwgbmV3YSk7CisJCXNhb3BleHByLT5sb2NhdGlvbiA9IC0xOworCisJCUFzc2VydChs aXN0X2xlbmd0aChyZXN0cmljdF9pbmZvX2VudHJ5LT5leHBycykgPiAxKTsKKworCQltYWlu X29ycyA9IG1ha2VCb29sRXhwcihPUl9FWFBSLCByZXN0cmljdF9pbmZvX2VudHJ5LT5leHBy cywgLTEpOworCisJCWNhbmRpZGF0ZSA9IG1ha2VCb29sRXhwcihBTkRfRVhQUiwgbGlzdF9t YWtlMihzYW9wZXhwciwgbWFpbl9vcnMpLCAtMSk7CisJCS8vbGlzdF9mcmVlKHJlc3RyaWN0 X2luZm9fZW50cnktPmNvbnN0cyk7CisJCXJlc3VsdCA9IGxhcHBlbmQocmVzdWx0LCAgKHZv aWQgKikgY2FuZGlkYXRlKTsKKwkJUmVsZWFzZVN5c0NhY2hlKG9wZXJ0dXApOworCX0KKwls aXN0X2ZyZWUoYXBwcm9wcmlhdGVfZW50cmllcyk7CisKKwkvKiBPbmUgbW9yZSB0cmljazog YXNzZW1ibGUgY29ycmVjdCBjbGF1c2UgKi8KKwlpZiAocmVzdWx0ID09IE5JTCkKKwkJcmV0 dXJuIE5JTDsKKwllbHNlCisJeworCQlpZiAob3JfZW50cmllcyAhPSBOSUwpCisJCQlyZXN1 bHQgPSBsYXBwZW5kKHJlc3VsdCwgbGlzdF9sZW5ndGgob3JfZW50cmllcykgPiAxID8KKwkJ CQkJCQkJCQkJbWFrZUJvb2xFeHByKE9SX0VYUFIsIG9yX2VudHJpZXMsCisJCQkJCQkJCQkJ CSgoQm9vbEV4cHIgKikgcmluZm8tPmNsYXVzZSktPmxvY2F0aW9uKSA6CisJCQkJCQkJCQkJ CWxpbml0aWFsKG9yX2VudHJpZXMpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisKIC8q CiAgKiBleHBhbmRfaW5kZXhxdWFsX3Jvd2NvbXBhcmUgLS0tIGV4cGFuZCBhIHNpbmdsZSBp bmRleHF1YWwgY29uZGl0aW9uCiAgKgkJdGhhdCBpcyBhIFJvd0NvbXBhcmVFeHByCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaCBiL3NyYy9pbmNsdWRlL25v ZGVzL3BhdGhub2Rlcy5oCmluZGV4IDE0Y2NmYzFhYzFjLi4yM2RhNTdiNmQ1NSAxMDA2NDQK LS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUv bm9kZXMvcGF0aG5vZGVzLmgKQEAgLTI3MDgsNiArMjcwOCwzNyBAQCB0eXBlZGVmIHN0cnVj dCBSZXN0cmljdEluZm8KIAlPaWQJCQlyaWdodF9oYXNoZXFvcGVyYXRvciBwZ19ub2RlX2F0 dHIoZXF1YWxfaWdub3JlKTsKIH0gUmVzdHJpY3RJbmZvOwogCisvKgorICogVGhlIGdyb3Vw IG9mIHNpbWlsYXIgb3BlcmF0b3IgZXhwcmVzc2lvbnMgaW4gdHJhbnNmb3JtX29yX3RvX2Fu eSgpLgorICovCit0eXBlZGVmIHN0cnVjdCBPckNsYXVzZUdyb3VwCit7CisJcGdfbm9kZV9h dHRyKG5vZGV0YWdfb25seSkKKworCU5vZGVUYWcJCXR5cGU7CisKKwkvKiBUaGUgZXhwcmVz c2lvbiBvZiB0aGUgdmFyaWFibGUgc2lkZSBvZiBvcGVyYXRvciAqLworRXhwcgkgICAqZXhw cjsKKwkvKiBUaGUgb3BlcmF0b3Igb2YgdGhlIG9wZXJhdG9yIGV4cHJlc3Npb24gKi8KKwlP aWQJCQlvcG5vOworCS8qIFRoZSBjb2xsYXRpb24gb2YgdGhlIG9wZXJhdG9yIGV4cHJlc3Np b24gKi8KKwlPaWQJCQlpbnB1dGNvbGxpZDsKKwkvKiBUaGUgdHlwZSBvZiBjb25zdGFudCBz aWRlIG9mIG9wZXJhdG9yICovCisJT2lkCQkJY29uc3R0eXBlOworCisJLyogVGhlIGxpc3Qg b2YgY29uc3RhbnQgc2lkZXMgb2Ygb3BlcmF0b3JzICovCisJTGlzdAkgICAqY29uc3RzOwor CisJLyoKKwkgKiBMaXN0IG9mIHNvdXJjZSBleHByZXNzaW9ucy4gIFdlIG5lZWQgdGhpcyBm b3IgY29udmVuaWVuY2UgaW4gY2FzZSB3ZQorCSAqIHdpbGwgZ2l2ZSB1cCBvbiB0cmFuc2Zv cm1hdGlvbi4KKwkgKi8KKwlMaXN0CSAgICpleHByczsKKworCU5vZGUJICAgKmNvbnN0X2V4 cHI7CisJYm9vbCBoYXZlX3BhcmFtOworfSBPckNsYXVzZUdyb3VwOworCiAvKgogICogVGhp cyBtYWNybyBlbWJvZGllcyB0aGUgY29ycmVjdCB3YXkgdG8gdGVzdCB3aGV0aGVyIGEgUmVz dHJpY3RJbmZvIGlzCiAgKiAicHVzaGVkIGRvd24iIHRvIGEgZ2l2ZW4gb3V0ZXIgam9pbiwg dGhhdCBpcywgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBmaWx0ZXIKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCBiL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAppbmRleCBjZjZlYWM1NzM0OS4uYzJi MjU5MzZjOGMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRl X2luZGV4Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRl eC5vdXQKQEAgLTE4NDQsMTggKzE4NDQsMTEgQEAgRFJPUCBUQUJMRSBvbmVrX3dpdGhfbnVs bDsKIEVYUExBSU4gKENPU1RTIE9GRikKIFNFTEVDVCAqIEZST00gdGVuazEKICAgV0hFUkUg dGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50aG91cyA9IDMgT1IgdGVu dGhvdXMgPSA0Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlbmsxCi0gICBS ZWNoZWNrIENvbmQ6ICgoKHRob3VzYW5kID0gNDIpIEFORCAodGVudGhvdXMgPSAxKSkgT1Ig KCh0aG91c2FuZCA9IDQyKSBBTkQgKHRlbnRob3VzID0gMykpIE9SICgodGhvdXNhbmQgPSA0 MikgQU5EICh0ZW50aG91cyA9IDQyKSkpCi0gICAtPiAgQml0bWFwT3IKLSAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cwotICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA9IDQyKSBBTkQgKHRlbnRob3VzID0gMSkp Ci0gICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdGhvdXNfdGVudGhv dXMKLSAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgodGhvdXNhbmQgPSA0MikgQU5EICh0 ZW50aG91cyA9IDMpKQotICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsx X3Rob3VzX3RlbnRob3VzCi0gICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKHRob3VzYW5k ID0gNDIpIEFORCAodGVudGhvdXMgPSA0MikpCi0oOSByb3dzKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVzaW5n IHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3Vz YW5kID0gNDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MSwzLDQyfSc6OmludGVnZXJbXSkp KQorKDIgcm93cykKIAogU0VMRUNUICogRlJPTSB0ZW5rMQogICBXSEVSRSB0aG91c2FuZCA9 IDQyIEFORCAodGVudGhvdXMgPSAxIE9SIHRlbnRob3VzID0gMyBPUiB0ZW50aG91cyA9IDQy KTsKQEAgLTE4NjQsMTQgKzE4NTcsMTY2IEBAIFNFTEVDVCAqIEZST00gdGVuazEKICAgICAg IDQyIHwgICAgNTUzMCB8ICAgMCB8ICAgIDIgfCAgIDIgfCAgICAgIDIgfCAgICAgIDQyIHwg ICAgICAgNDIgfCAgICAgICAgICA0MiB8ICAgICAgICA0MiB8ICAgICAgIDQyIHwgIDg0IHwg ICA4NSB8IFFCQUFBQSAgIHwgU0VJQUFBICAgfCBPT09PeHgKICgxIHJvdykKIAorRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSB0ZW5rMQorICBXSEVSRSB0aG91c2FuZCA9 IDQyIEFORCAodGVudGhvdXMgPSAxIE9SIHRlbnRob3VzID0gKFNFTEVDVCAxICsgMikgT1Ig dGVudGhvdXMgPSA0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSW5kZXggU2NhbiB1c2luZyB0 ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMQorICAgSW5kZXggQ29uZDogKCh0aG91c2Fu ZCA9IDQyKSBBTkQgKHRlbnRob3VzID0gQU5ZIChBUlJBWVsxLCAoSW5pdFBsYW4gMSkuY29s MSwgNDJdKSkpCisgICBJbml0UGxhbiAxCisgICAgIC0+ICBSZXN1bHQKKyg0IHJvd3MpCisK K1NFTEVDVCAqIEZST00gdGVuazEKKyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRo b3VzID0gMSBPUiB0ZW50aG91cyA9IChTRUxFQ1QgMSArIDIpIE9SIHRlbnRob3VzID0gNDIp OworIHVuaXF1ZTEgfCB1bmlxdWUyIHwgdHdvIHwgZm91ciB8IHRlbiB8IHR3ZW50eSB8IGh1 bmRyZWQgfCB0aG91c2FuZCB8IHR3b3Rob3VzYW5kIHwgZml2ZXRob3VzIHwgdGVudGhvdXMg fCBvZGQgfCBldmVuIHwgc3RyaW5ndTEgfCBzdHJpbmd1MiB8IHN0cmluZzQgCistLS0tLS0t LS0rLS0tLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSstLS0tLS0tLSstLS0tLS0tLS0rLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rLS0t LS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyAgICAgIDQyIHwgICAgNTUz MCB8ICAgMCB8ICAgIDIgfCAgIDIgfCAgICAgIDIgfCAgICAgIDQyIHwgICAgICAgNDIgfCAg ICAgICAgICA0MiB8ICAgICAgICA0MiB8ICAgICAgIDQyIHwgIDg0IHwgICA4NSB8IFFCQUFB QSAgIHwgU0VJQUFBICAgfCBPT09PeHgKKygxIHJvdykKKwogRVhQTEFJTiAoQ09TVFMgT0ZG KQogU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKICAgV0hFUkUgaHVuZHJlZCA9IDQyIEFO RCAodGhvdXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5KTsKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEFn Z3JlZ2F0ZQogICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEKLSAgICAgICAgIFJl Y2hlY2sgQ29uZDogKChodW5kcmVkID0gNDIpIEFORCAoKHRob3VzYW5kID0gNDIpIE9SICh0 aG91c2FuZCA9IDk5KSkpCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoaHVuZHJlZCA9IDQy KSBBTkQgKHRob3VzYW5kID0gQU5ZICgnezQyLDk5fSc6OmludGVnZXJbXSkpKQorICAgICAg ICAgLT4gIEJpdG1hcEFuZAorICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2Fu IG9uIHRlbmsxX2h1bmRyZWQKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICho dW5kcmVkID0gNDIpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g dGVuazFfdGhvdXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6 ICh0aG91c2FuZCA9IEFOWSAoJ3s0Miw5OX0nOjppbnRlZ2VyW10pKQorKDggcm93cykKKwor U0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAo dGhvdXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5KTsKKyBjb3VudCAKKy0tLS0tLS0KKyAg ICAxMAorKDEgcm93KQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHRl bmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9IDEgT1IgdGVudGhv dXMgPSAzIE9SIHRlbnRob3VzID0gNDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVzaW5nIHRlbmsxX3Rob3Vz X3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3VzYW5kID0gNDIpIEFO RCAodGVudGhvdXMgPSBBTlkgKCd7MSwzLDQyfSc6OmludGVnZXJbXSkpKQorKDIgcm93cykK KworU0VMRUNUICogRlJPTSB0ZW5rMQorICBXSEVSRSB0aG91c2FuZCA9IDQyIEFORCAodGVu dGhvdXMgPSAxIE9SIHRlbnRob3VzID0gMyBPUiB0ZW50aG91cyA9IDQyKTsKKyB1bmlxdWUx IHwgdW5pcXVlMiB8IHR3byB8IGZvdXIgfCB0ZW4gfCB0d2VudHkgfCBodW5kcmVkIHwgdGhv dXNhbmQgfCB0d290aG91c2FuZCB8IGZpdmV0aG91cyB8IHRlbnRob3VzIHwgb2RkIHwgZXZl biB8IHN0cmluZ3UxIHwgc3RyaW5ndTIgfCBzdHJpbmc0IAorLS0tLS0tLS0tKy0tLS0tLS0t LSstLS0tLSstLS0tLS0rLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLS0t LS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCisgICAgICA0MiB8ICAgIDU1MzAgfCAgIDAgfCAg ICAyIHwgICAyIHwgICAgICAyIHwgICAgICA0MiB8ICAgICAgIDQyIHwgICAgICAgICAgNDIg fCAgICAgICAgNDIgfCAgICAgICA0MiB8ICA4NCB8ICAgODUgfCBRQkFBQUEgICB8IFNFSUFB QSAgIHwgT09PT3h4CisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBj b3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5k ID0gNDIgT1IgdGhvdXNhbmQgPSA5OSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4g IEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKCho dW5kcmVkID0gNDIpIEFORCAodGhvdXNhbmQgPSBBTlkgKCd7NDIsOTl9Jzo6aW50ZWdlcltd KSkpCisgICAgICAgICAtPiAgQml0bWFwQW5kCisgICAgICAgICAgICAgICAtPiAgQml0bWFw IEluZGV4IFNjYW4gb24gdGVuazFfaHVuZHJlZAorICAgICAgICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGh1bmRyZWQgPSA0MikKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5k ZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKHRob3VzYW5kID0gQU5ZICgnezQyLDk5fSc6OmludGVnZXJbXSkpCiso OCByb3dzKQorCitTRUxFQ1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVk ID0gNDIgQU5EICh0aG91c2FuZCA9IDQyIE9SIHRob3VzYW5kID0gOTkpOworIGNvdW50IAor LS0tLS0tLQorICAgIDEwCisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3Vz YW5kIDwgNDIgT1IgdGhvdXNhbmQgPCA5OSBPUiA0MyA+IHRob3VzYW5kIE9SIDQyID4gdGhv dXNhbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRt YXAgSGVhcCBTY2FuIG9uIHRlbmsxCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoaHVuZHJl ZCA9IDQyKSBBTkQgKHRob3VzYW5kIDwgQU5ZICgnezQyLDk5LDQzLDQyfSc6OmludGVnZXJb XSkpKQorICAgICAgICAgLT4gIEJpdG1hcEFuZAorICAgICAgICAgICAgICAgLT4gIEJpdG1h cCBJbmRleCBTY2FuIG9uIHRlbmsxX2h1bmRyZWQKKyAgICAgICAgICAgICAgICAgICAgIElu ZGV4IENvbmQ6IChodW5kcmVkID0gNDIpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIElu ZGV4IFNjYW4gb24gdGVuazFfdGhvdXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAg IEluZGV4IENvbmQ6ICh0aG91c2FuZCA8IEFOWSAoJ3s0Miw5OSw0Myw0Mn0nOjppbnRlZ2Vy W10pKQorKDggcm93cykKKworU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUg aHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPCA0MiBPUiB0aG91c2FuZCA8IDk5IE9SIDQz ID4gdGhvdXNhbmQgT1IgNDIgPiB0aG91c2FuZCk7CisgY291bnQgCistLS0tLS0tCisgICAg MTAKKygxIHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCopIEZS T00gdGVuazEKKyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0 ZW50aG91cyA9IDMpIE9SIHRob3VzYW5kID0gNDE7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAg SGVhcCBTY2FuIG9uIHRlbmsxCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoKHRob3VzYW5k ID0gNDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MSwzfSc6OmludGVnZXJbXSkpKSBPUiAo dGhvdXNhbmQgPSA0MSkpCisgICAgICAgICAtPiAgQml0bWFwT3IKKyAgICAgICAgICAgICAg IC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cworICAgICAg ICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA9IDQyKSBBTkQgKHRlbnRo b3VzID0gQU5ZICgnezEsM30nOjppbnRlZ2VyW10pKSkKKyAgICAgICAgICAgICAgIC0+ICBC aXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKHRob3VzYW5kID0gNDEpCisoOCByb3dzKQorCitTRUxF Q1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSB0aG91c2FuZCA9IDQyIEFORCAodGVu dGhvdXMgPSAxIE9SIHRlbnRob3VzID0gMykgT1IgdGhvdXNhbmQgPSA0MTsKKyBjb3VudCAK Ky0tLS0tLS0KKyAgICAxMAorKDEgcm93KQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVkID0gNDIgQU5EICh0aG91 c2FuZCA9IDQyIE9SIHRob3VzYW5kID0gOTkgT1IgdGVudGhvdXMgPCAyKSBPUiB0aG91c2Fu ZCA9IDQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlbmsxCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgo KGh1bmRyZWQgPSA0MikgQU5EICgodGhvdXNhbmQgPSA0MikgT1IgKHRob3VzYW5kID0gOTkp IE9SICh0ZW50aG91cyA8IDIpKSkgT1IgKHRob3VzYW5kID0gNDEpKQorICAgICAgICAgLT4g IEJpdG1hcE9yCisgICAgICAgICAgICAgICAtPiAgQml0bWFwQW5kCisgICAgICAgICAgICAg ICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfaHVuZHJlZAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGh1bmRyZWQgPSA0MikKKyAgICAg ICAgICAgICAgICAgICAgIC0+ICBCaXRtYXBPcgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSA0 MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBv biB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgSW5kZXggQ29uZDogKHRob3VzYW5kID0gOTkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdGhvdXNfdGVudGhvdXMKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh0ZW50aG91cyA8 IDIpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdGhv dXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh0aG91c2Fu ZCA9IDQxKQorKDE2IHJvd3MpCisKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdI RVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA5OSBP UiB0ZW50aG91cyA8IDIpIE9SIHRob3VzYW5kID0gNDE7CisgY291bnQgCistLS0tLS0tCisg ICAgMjAKKygxIHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCop IEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPSA0MiBP UiB0aG91c2FuZCA9IDQxIE9SIHRob3VzYW5kID0gOTkgQU5EIHRlbnRob3VzID0gMik7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgQml0bWFw IEhlYXAgU2NhbiBvbiB0ZW5rMQorICAgICAgICAgUmVjaGVjayBDb25kOiAoKGh1bmRyZWQg PSA0MikgQU5EICgodGhvdXNhbmQgPSA0MikgT1IgKHRob3VzYW5kID0gNDEpIE9SICgodGhv dXNhbmQgPSA5OSkgQU5EICh0ZW50aG91cyA9IDIpKSkpCiAgICAgICAgICAtPiAgQml0bWFw QW5kCiAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfaHVu ZHJlZAogICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGh1bmRyZWQgPSA0MikK QEAgLTE4NzksMTEgKzIwMjQsMTMgQEAgU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKICAg ICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91 c190ZW50aG91cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHRo b3VzYW5kID0gNDIpCiAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNj YW4gb24gdGVuazFfdGhvdXNfdGVudGhvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAg IEluZGV4IENvbmQ6ICh0aG91c2FuZCA9IDk5KQotKDExIHJvd3MpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSA0MSkKKyAgICAgICAgICAg ICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91 cworICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA9 IDk5KSBBTkQgKHRlbnRob3VzID0gMikpCisoMTMgcm93cykKIAogU0VMRUNUIGNvdW50KCop IEZST00gdGVuazEKLSAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPSA0MiBP UiB0aG91c2FuZCA9IDk5KTsKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQg PSA0MiBPUiB0aG91c2FuZCA9IDQxIE9SIHRob3VzYW5kID0gOTkgQU5EIHRlbnRob3VzID0g Mik7CiAgY291bnQgCiAtLS0tLS0tCiAgICAgMTAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pv aW4ub3V0CmluZGV4IDUzZjcwZDcyZWQ2Li5hYmU5OGZmM2M1MyAxMDA2NDQKLS0tIGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2pvaW4ub3V0CkBAIC00Mjc4LDE1ICs0Mjc4LDY0IEBAIHNlbGVjdCAqIGZy b20gdGVuazEgYSBqb2luIHRlbmsxIGIgb24KICAgICAgICAgICAgICAgICAgICAgIEluZGV4 IENvbmQ6IChodW5kcmVkID0gNCkKICAgIC0+ICBNYXRlcmlhbGl6ZQogICAgICAgICAgLT4g IEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEgYQotICAgICAgICAgICAgICAgUmVjaGVjayBD b25kOiAoKHVuaXF1ZTEgPSAxKSBPUiAodW5pcXVlMiA9IDMpIE9SICh1bmlxdWUyID0gNykp CisgICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6ICgodW5pcXVlMSA9IDEpIE9SICh1bmlx dWUyID0gQU5ZICgnezMsN30nOjppbnRlZ2VyW10pKSkKKyAgICAgICAgICAgICAgIEZpbHRl cjogKCh1bmlxdWUxID0gMSkgT1IgKHVuaXF1ZTIgPSAzKSBPUiAodW5pcXVlMiA9IDcpKQog ICAgICAgICAgICAgICAgLT4gIEJpdG1hcE9yCiAgICAgICAgICAgICAgICAgICAgICAtPiAg Qml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdW5pcXVlMQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1ZTEgPSAxKQogICAgICAgICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTIKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUyID0gMykKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUyID0gQU5ZICgnezMsN30nOjpp bnRlZ2VyW10pKQorKDE4IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAq IGZyb20gdGVuazEgYSBqb2luIHRlbmsxIGIgb24KKyAgKGEudW5pcXVlMSA9IDEgYW5kIGIu dW5pcXVlMSA9IDIpIG9yCisgICgoYS51bmlxdWUyID0gMyBvciBhLnVuaXF1ZTIgPSA3KSBh bmQgYi5odW5kcmVkID0gNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoKChhLnVuaXF1ZTEgPSAxKSBBTkQgKGIudW5pcXVlMSA9 IDIpKSBPUiAoKChhLnVuaXF1ZTIgPSAzKSBPUiAoYS51bmlxdWUyID0gNykpIEFORCAoYi5o dW5kcmVkID0gNCkpKQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEgYgorICAg ICAgICAgUmVjaGVjayBDb25kOiAoKHVuaXF1ZTEgPSAyKSBPUiAoaHVuZHJlZCA9IDQpKQor ICAgICAgICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4 IFNjYW4gb24gdGVuazFfdW5pcXVlMQorICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29u ZDogKHVuaXF1ZTEgPSAyKQorICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2Fu IG9uIHRlbmsxX2h1bmRyZWQKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICho dW5kcmVkID0gNCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIEJpdG1hcCBI ZWFwIFNjYW4gb24gdGVuazEgYQorICAgICAgICAgICAgICAgUmVjaGVjayBDb25kOiAoKHVu aXF1ZTEgPSAxKSBPUiAodW5pcXVlMiA9IEFOWSAoJ3szLDd9Jzo6aW50ZWdlcltdKSkpCisg ICAgICAgICAgICAgICBGaWx0ZXI6ICgodW5pcXVlMSA9IDEpIE9SICh1bmlxdWUyID0gMykg T1IgKHVuaXF1ZTIgPSA3KSkKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXBPcgorICAgICAg ICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTEK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMSkK ICAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV91 bmlxdWUyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVl MiA9IDcpCi0oMTkgcm93cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6ICh1bmlxdWUyID0gQU5ZICgnezMsN30nOjppbnRlZ2VyW10pKQorKDE4IHJvd3MpCisK K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gdGVuazEgYSBqb2luIHRlbmsx IGIgb24KKyAgKGEudW5pcXVlMSA8IDIwIG9yIGEudW5pcXVlMSA9IDMgb3IgYS51bmlxdWUx ID0gMSBhbmQgYi51bmlxdWUxID0gMikgb3IKKyAgKChhLnVuaXF1ZTIgPSAzIG9yIGEudW5p cXVlMiA9IDcpIGFuZCBiLmh1bmRyZWQgPSA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6 ICgoYS51bmlxdWUxIDwgMjApIE9SIChhLnVuaXF1ZTEgPSAzKSBPUiAoKGEudW5pcXVlMSA9 IDEpIEFORCAoYi51bmlxdWUxID0gMikpIE9SICgoKGEudW5pcXVlMiA9IDMpIE9SIChhLnVu aXF1ZTIgPSA3KSkgQU5EIChiLmh1bmRyZWQgPSA0KSkpCisgICAtPiAgU2VxIFNjYW4gb24g dGVuazEgYgorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgQml0bWFwIEhlYXAg U2NhbiBvbiB0ZW5rMSBhCisgICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6ICgodW5pcXVl MSA8IDIwKSBPUiAodW5pcXVlMSA9IDMpIE9SICh1bmlxdWUxID0gMSkgT1IgKHVuaXF1ZTIg PSBBTlkgKCd7Myw3fSc6OmludGVnZXJbXSkpKQorICAgICAgICAgICAgICAgRmlsdGVyOiAo KHVuaXF1ZTEgPCAyMCkgT1IgKHVuaXF1ZTEgPSAzKSBPUiAodW5pcXVlMSA9IDEpIE9SICh1 bmlxdWUyID0gMykgT1IgKHVuaXF1ZTIgPSA3KSkKKyAgICAgICAgICAgICAgIC0+ICBCaXRt YXBPcgorICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRl bmsxX3VuaXF1ZTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1 bmlxdWUxIDwgMjApCisgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNj YW4gb24gdGVuazFfdW5pcXVlMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKHVuaXF1ZTEgPSAzKQorICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJ bmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAg IEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMSkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBC aXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV91bmlxdWUyCisgICAgICAgICAgICAgICAgICAg ICAgICAgICBJbmRleCBDb25kOiAodW5pcXVlMiA9IEFOWSAoJ3szLDd9Jzo6aW50ZWdlcltd KSkKKygxNiByb3dzKQogCiAtLQogLS0gdGVzdCBwbGFjZW1lbnQgb2YgbW92YWJsZSBxdWFs cyBpbiBhIHBhcmFtZXRlcml6ZWQgam9pbiB0cmVlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3Jl YXRlX2luZGV4LnNxbAppbmRleCBlMjk2ODkxY2FiOC4uZjc0YWQ0MTVmYmYgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbApAQCAtNzI2LDYgKzcyNiwyNCBAQCBE Uk9QIFRBQkxFIG9uZWtfd2l0aF9udWxsOwogLS0gQ2hlY2sgYml0bWFwIGluZGV4IHBhdGgg cGxhbm5pbmcKIC0tCiAKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gdGVu azEKKyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50aG91 cyA9IDMgT1IgdGVudGhvdXMgPSA0Mik7CitTRUxFQ1QgKiBGUk9NIHRlbmsxCisgIFdIRVJF IHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9IDEgT1IgdGVudGhvdXMgPSAzIE9SIHRl bnRob3VzID0gNDIpOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHRl bmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9IDEgT1IgdGVudGhv dXMgPSAoU0VMRUNUIDEgKyAyKSBPUiB0ZW50aG91cyA9IDQyKTsKK1NFTEVDVCAqIEZST00g dGVuazEKKyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50 aG91cyA9IChTRUxFQ1QgMSArIDIpIE9SIHRlbnRob3VzID0gNDIpOworCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVk ID0gNDIgQU5EICh0aG91c2FuZCA9IDQyIE9SIHRob3VzYW5kID0gOTkpOworU0VMRUNUIGNv dW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQg PSA0MiBPUiB0aG91c2FuZCA9IDk5KTsKKwogRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNU ICogRlJPTSB0ZW5rMQogICBXSEVSRSB0aG91c2FuZCA9IDQyIEFORCAodGVudGhvdXMgPSAx IE9SIHRlbnRob3VzID0gMyBPUiB0ZW50aG91cyA9IDQyKTsKQEAgLTczOCw2ICs3NTYsMzAg QEAgU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKIFNFTEVDVCBjb3VudCgqKSBGUk9NIHRl bmsxCiAgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNh bmQgPSA5OSk7CiAKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9N IHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kIDwgNDIgT1IgdGhv dXNhbmQgPCA5OSBPUiA0MyA+IHRob3VzYW5kIE9SIDQyID4gdGhvdXNhbmQpOworU0VMRUNU IGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNh bmQgPCA0MiBPUiB0aG91c2FuZCA8IDk5IE9SIDQzID4gdGhvdXNhbmQgT1IgNDIgPiB0aG91 c2FuZCk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRl bmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9IDEgT1IgdGVudGhv dXMgPSAzKSBPUiB0aG91c2FuZCA9IDQxOworU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEK KyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50aG91cyA9 IDMpIE9SIHRob3VzYW5kID0gNDE7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBj b3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5k ID0gNDIgT1IgdGhvdXNhbmQgPSA5OSBPUiB0ZW50aG91cyA8IDIpIE9SIHRob3VzYW5kID0g NDE7CitTRUxFQ1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVkID0gNDIg QU5EICh0aG91c2FuZCA9IDQyIE9SIHRob3VzYW5kID0gOTkgT1IgdGVudGhvdXMgPCAyKSBP UiB0aG91c2FuZCA9IDQxOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgY291bnQo KikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVkID0gNDIgQU5EICh0aG91c2FuZCA9IDQy IE9SIHRob3VzYW5kID0gNDEgT1IgdGhvdXNhbmQgPSA5OSBBTkQgdGVudGhvdXMgPSAyKTsK K1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQg KHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA0MSBPUiB0aG91c2FuZCA9IDk5IEFORCB0 ZW50aG91cyA9IDIpOworCiAtLQogLS0gQ2hlY2sgYmVoYXZpb3Igd2l0aCBkdXBsaWNhdGUg aW5kZXggY29sdW1uIGNvbnRlbnRzCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9pbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAppbmRleCBk ODFmZjYzYmU1My4uNDQ3M2I4ZjA0ZDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2pvaW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCkBAIC0x NDMzLDYgKzE0MzMsMTUgQEAgc2VsZWN0ICogZnJvbSB0ZW5rMSBhIGpvaW4gdGVuazEgYiBv bgogICAoYS51bmlxdWUxID0gMSBhbmQgYi51bmlxdWUxID0gMikgb3IKICAgKChhLnVuaXF1 ZTIgPSAzIG9yIGEudW5pcXVlMiA9IDcpIGFuZCBiLmh1bmRyZWQgPSA0KTsKIAorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSB0ZW5rMSBhIGpvaW4gdGVuazEgYiBvbgor ICAoYS51bmlxdWUxID0gMSBhbmQgYi51bmlxdWUxID0gMikgb3IKKyAgKChhLnVuaXF1ZTIg PSAzIG9yIGEudW5pcXVlMiA9IDcpIGFuZCBiLmh1bmRyZWQgPSA0KTsKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gdGVuazEgYSBqb2luIHRlbmsxIGIgb24KKyAgKGEu dW5pcXVlMSA8IDIwIG9yIGEudW5pcXVlMSA9IDMgb3IgYS51bmlxdWUxID0gMSBhbmQgYi51 bmlxdWUxID0gMikgb3IKKyAgKChhLnVuaXF1ZTIgPSAzIG9yIGEudW5pcXVlMiA9IDcpIGFu ZCBiLmh1bmRyZWQgPSA0KTsKKwogLS0KIC0tIHRlc3QgcGxhY2VtZW50IG9mIG1vdmFibGUg cXVhbHMgaW4gYSBwYXJhbWV0ZXJpemVkIGpvaW4gdHJlZQogLS0KZGlmZiAtLWdpdCBhL3Ny Yy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5 cGVkZWZzLmxpc3QKaW5kZXggYjRkN2Y5MjE3Y2UuLjk5MmM4MGY5MzUwIDEwMDY0NAotLS0g YS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdp bmRlbnQvdHlwZWRlZnMubGlzdApAQCAtMTcxNyw2ICsxNzE3LDcgQEAgTnVtZXJpY1Zhcgog T01fdWludDMyCiBPUAogT1NBUGVyR3JvdXBTdGF0ZQorT3JDbGF1c2VHcm91cAogT1NBUGVy UXVlcnlTdGF0ZQogT1NJbmZvCiBPU1NMQ2lwaGVyCi0tIAoyLjM0LjEKCg== --------------OQroPYSjAYKCTuT0oWW9GZN9--