Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nBQh7-00048v-Ey for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Jan 2022 00:25:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nBQh4-0006IH-H2 for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Jan 2022 00:25:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nBQh3-0006I8-Tn for pgsql-hackers@lists.postgresql.org; Sun, 23 Jan 2022 00:25:18 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nBQgw-0003jR-B4 for pgsql-hackers@lists.postgresql.org; Sun, 23 Jan 2022 00:25:17 +0000 Received: from [192.168.0.104] (unknown [5.165.75.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 8946F21C2FD9; Sun, 23 Jan 2022 03:25:08 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1642897508; bh=z8rJWAbTIzFch/+etCuXvQUKuRiMFBrraXGKH9tkgBE=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=fUllh473Ca2VxPEpfur4a2Z6TDjLYIg02Jbiu9nNAuvSbtAzOTIeZWGs3yBE/zrcI lTqbrakJExxlklJOu+9Xta7zb5RDH2rC6yS2p+JuZB1vsOxCPNIF8GQ09WzTfKogPA 0/mOhMvh/ZkgpIcCXX0Jydrme9pGABo103JBpz9A= Content-Type: multipart/mixed; boundary="------------0Bwm9qgi5SjAR5x8syR6OMh5" Message-ID: Date: Sun, 23 Jan 2022 03:24:33 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: Collecting statistics about contents of JSONB columns Content-Language: en-US To: Tomas Vondra Cc: PostgreSQL Hackers , Mahendra Thalor , Oleg Bartunov , Thomas Munro References: From: Nikita Glukhov In-Reply-To: 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. --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: multipart/alternative; boundary="------------mifjveAfFhikEuO7yXEeQAXM" --------------mifjveAfFhikEuO7yXEeQAXM Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi! I am glad that you found my very old patch interesting and started to work on it. We failed to post it in 2016 mostly because we were not satisfied with JSONB storage. Also we decided to wait for completion of work on extended statistics as we thought that it could help us. But in early 2017 we switched to SQL/JSON and forgot about this patch. I think custom datatype is necessary for better performance. With a plain JSONB we need to do a lot of work for extraction of path stats: - iterate through MCV/Histogram JSONB arrays - cast numeric values to float, string to text etc. - build PG arrays from extracted datums - form pg_statistic tuple. With a custom data type we could store pg_statistic tuple unmodified and use it without any overhead. But then we need modify a bit VariableStatData and several functions to pass additional nullfrac corrections. Maybe simple record type (path text, data pg_statistic, ext_data jsonb) would be enough. Also there is an idea to store per-path separately in pg_statistic_ext rows using expression like (jb #> '{foo,bar}') as stxexprs. This could also help user to select which paths to analyze simply by using some sort of CREATE STATISTICS. But it is really unclear how to: * store pg_statistic_ext rows from typanalyze * form path expressions for array elements (maybe add new jsonpath operator) * match various -> operator chains to stxexprs * jsonpath-like languages need simple API for searching by stxexprs Per-path statistics should only be collected for scalars. This can be enabled by flag JsonAnalyzeContext.scalarsOnly. But there are is a problem: computed MCVs and histograms will be broken and we will not be able to use them for queries like (jb > const) in general case. Also we will not be and use internally in scalarineqsel() and var_eq_const() (see jsonSelectivity()). Instead, we will have to implement own estimator functions for JSONB comparison operators that will correctly use our hacked MCVs and histograms (and maybe not all cases will be supported; for example, comparison to scalars only). It's possible to replace objects and arrays with empty ones when scalarsOnly is set to keep correct frequencies of non-scalars. But there is an old bug in JSONB comparison: empty arrays are placed before other values in the JSONB sort order, although they should go after all scalars. So we need also to distinguish empty and non-empty arrays here. I tried to fix a major part of places marked as XXX and FIXME, the new version of the patches is attached. There are a lot of changes, you can see them in a step-by-step form in the corresponding branch jsonb_stats_20220122 in our GitHub repo [1]. Below is the explanation of fixed XXXs: Patch 0001 src/backend/commands/operatorcmds.c: > XXX Maybe not the right name, because "estimator" implies we're > calculating selectivity. But we're actually deriving statistics for > an expression. Renamed to "Derivator". > XXX perhaps full "statistics" wording would be better Renamed to "statistics". src/backend/utils/adt/selfuncs.c: > examine_operator_expression(): > XXX Not sure why this returns bool - we ignore the return value > anyway. We might as well return the calculated vardata (or NULL). Oprstat was changed to return void. > XXX Not sure what to do about recursion - there can be another OpExpr > in one of the arguments, and we should call this recursively from the > oprstat procedure. But that's not possible, because it's marked as > static. Oprstat call chain: get_restriction_variable() => examine_variable() => examine_operator_expression(). The main thing here is that OpExpr with oprstat acts like ordinary Var. > examine_variable(): > XXX Shouldn't this put more restrictions on the OpExpr? E.g. that > one of the arguments has to be a Const or something? This is simply a responsibility of oprstat. Patch 0004 > XXX Not sure we want to add these functions to jsonb.h, which is the > public API. Maybe it belongs rather to jsonb_typanalyze.c or > elsewhere, closer to how it's used? Maybe it needs to be moved the new file jsonb_utils.h. I think these functions become very useful, when we start to build JSONBs with predefined structure. > pushJsonbValue(): > XXX I'm not quite sure why we actually do this? Why do we need to > change how JsonbValue is converted to Jsonb for the statistics patch? Scalars in JSONB are encoded as one-element preudo-array containers. So when we are inserting binary JsonbValues, that was initialized directly from JSONB datums, inside other non-empty JSONB in pushJsonbValue(), all values except scalars are inserted as expected but scalars become [scalar]. So we need to extract scalar values in caller functions or in pushJsonbValue(). I think autoextraction in pushJsonbValue() is better. This case simply was not used before JSONB stats introduction. Patch 0006 src/backend/utils/adt/jsonb_selfuncs.c > jsonPathStatsGetSpecialStats() > XXX This does not really extract any stats, it merely allocates the > struct? Renamed with "Alloc" suffix. > jsonPathStatsGetArrayLengthStats() > XXX Why doesn't this do jsonPathStatsGetTypeFreq check similar to > what jsonPathStatsGetLengthStats does? "length" stats were collected inside parent paths, but "array_length" and "avg_array_length" stats were collected inside child array paths. This resulted in inconsistencies in TypeFreq checks. I have removed "length" stats, moved "array_length" and "avg_array_length" to the parent path, and added separate "object_length" stats. TypeFreq checks become consistent. > XXX Seems to do essentially what jsonStatsFindPath, except that it > also considers jsdata->prefix. Seems fairly easy to combine those > into a single function. I don't think that it would be better to combine those function into one with considerPrefix flag, because jsonStatsFindPathStats() is a some kind of low-level function which is called only in two places. In all other places considerPrefix will be true. Also jsonStatsFindPathStatsStr() is exported in jsonb_selfuncs.h for to give external jsonpath-like query operators ability to use JSON statistics. > jsonPathStatsCompare() > XXX Seems a bit convoluted to first cast it to Datum, then Jsonb ... > Datum const *pdatum = pv2; > Jsonb *jsonb = DatumGetJsonbP(*pdatum); The problem of simply using 'jsonb = *(Jsonb **) pv2' is that DatumGetJsonbP() may deTOAST datums. > XXX Not sure about this? Does empty path mean global stats? Empty "path" is simply a sign of invalid stats data. > jsonStatsConvertArray() > FIXME Does this actually work on all 32/64-bit systems? What if typid > is FLOAT8OID or something? Should look at TypeCache instead, probably. Used get_typlenbyvalalign() instead of hardcoded values. > jsonb_stats() > XXX It might be useful to allow recursion, i.e. > get_restriction_variable might derive statistics too. > I don't think it does that now, right? get_restriction_variable() already might derive statistics: it calls examine_variable() on its both operands, and examine_variable() calls examine_operator_expression(). > XXX Could we also get varonleft=false in useful cases? All supported JSONB operators have signature jsonb OP arg. If varonleft = false, then we need to derive stats for expression like '{"foo": "bar"}' -> text_column having stats for text_column. It is possible to implement too, but it is not related to JSONB stats and needs to be done in the separate patch. > jsonSelectivityContains(): > XXX This really needs more comments explaining the logic. I have refactored this function and added comments. > jsonGetFloat4(): > XXX Not sure assert is a sufficient protection against different > types of JSONB values to be passed in. I have refactored this function by passing a default value for non-numeric JSONB case. > jsonPathAppendEntryWithLen() > XXX Doesn't this need ecape_json too? Comment is removed, because jsonPathAppendEntry() is called inside. > jsonPathStatsGetTypeFreq() > FIXME This is really hard to read/understand, with two nested ternary > operators. I have refactored this place. > XXX Seems more like an error, no? Why ignore it? It's not an error, it's request of non-numeric type. Length values are always numeric, and frequence of non-numeric values is 0. The possible case when it could happen is jsonpath '$.size() == "foo"'. Estimator for operator == will check frequence of strings in .size() and it will be 0. > jsonPathStatsFormTuple() > FIXME What does this mean? There is no need to transform ordinary root path stats tuple, it can be simply copied. jsonb_typanalyze.c > XXX We need entry+lenth because JSON path elements may contain null > bytes, I guess? 'entry' can be not zero-terminated when it is pointing to JSONB keys, so 'len' is necessary field. 'len' is also used for faster entry comparison, to distinguish array entries ('len' == -1). > XXX Sould be JsonPathEntryMatch as it deals with JsonPathEntry nodes > not whole paths, no? > XXX Again, maybe JsonPathEntryHash would be a better name? Functions renamed using JsonPathEntry prefix, JsonPath typedef removed. > JsonPathMatch() > XXX Seems a bit silly to return int, when the return statement only > really returns bool (because of how it compares paths). It's not really > a comparator for sorting, for example. This function is implementation of HashCompareFunc and it needs to return int. > jsonAnalyzeJson() > XXX The name seems a bit weird, with the two json bits. Renamed to jsonAnalyzeCollectPaths(). The two similar functions were renamed too. > jsonAnalyzeJson(): > XXX The mix of break/return statements in this block is really > confusing. I have refactored this place using only breaks. > XXX not sure why we're doing this? Manual recursion into containers by creating child iterator together with skipNested=true flag is used to give jsonAnalyzeJsonValue() ability to access jbvBinary containers. > compute_json_stats() > XXX Not sure what the first branch is doing (or supposed to)? > XXX It's not immediately clear why this is (-1) and not simply > NULL. It crashes, so presumably it's used to tweak the behavior, > but it's not clear why/how, and it affects place that is pretty > far away, and so not obvious. We should use some sort of flag > with a descriptive name instead. > XXX If I understand correctly, we simply collect all paths first, > without accumulating any Values. And then in the next step we > process each path independently, probably to save memory (we > don't want to accumulate all values for all paths, with a lot > of duplicities). There are two variants of stats collection: * single-pass - collect all values for all paths * multi-pass - collect only values for a one path at each pass The first variant can consume too much memory (jsonb iteration produces a lot of garbage etc.), but works faster than second. The first 'if (false)' is used for manual selection of one of this variants. This selection should be controlled by some user-specified option (maybe GUC), or the first variant can be simply removed. jsonAnalyzeJson()'s parameter of type JsonPathAnlStats * determines which paths we need to consider for the value collection: * NULL - collect values for all paths * -1 - do not collect any values * stats - collect values only for a given path The last variant really is unused because we already have another function jsonAnalyzeJsonPath(), which is optimized for selective path values collection (used object key accessor JSONB functions instead of full JSONB iteration). I have replaced this strange parameter with simple boolean flag. > XXX Could the parameters be different on other platforms? Used get_typlenbyvalalign(JSONBOID) instead of hardcoded values. > jsonAnalyzePathValues() > XXX Do we need to initialize all slots? I have copied here the following comment from extended_stats.c: /* * The fields describing the stats->stavalues[n] element types default * to the type of the data being analyzed, but the type-specific * typanalyze function can change them if it wants to store something * else. */ > XXX Not sure why we divide it by the number of json values? We divide counts of lengths by the total number of json values to compute correct nullfrac. I.e. not all input jsons have lengths, length of scalar jsons is NULL. [1]https://github.com/postgrespro/postgres/tree/jsonb_stats_20220122 -- Nikita Glukhov Postgres Professional:http://www.postgrespro.com The Russian Postgres Company --------------mifjveAfFhikEuO7yXEeQAXM Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit
Hi!

I am glad that you found my very old patch interesting and started to
work on it.  We failed to post it in 2016 mostly because we were not
satisfied with JSONB storage.  Also we decided to wait for completion
of work on extended statistics as we thought that it could help us.
But in early 2017 we switched to SQL/JSON and forgot about this patch.


I think custom datatype is necessary for better performance. With a
plain JSONB we need to do a lot of work for extraction of path stats:
 - iterate through MCV/Histogram JSONB arrays
 - cast numeric values to float, string to text etc.
 - build PG arrays from extracted datums
 - form pg_statistic tuple.

With a custom data type we could store pg_statistic tuple unmodified
and use it without any overhead.  But then we need modify a bit
VariableStatData and several functions to pass additional nullfrac
corrections.

Maybe simple record type (path text, data pg_statistic, ext_data jsonb)
would be enough.



Also there is an idea to store per-path separately in pg_statistic_ext
rows using expression like (jb #> '{foo,bar}') as stxexprs.  This could
also help user to select which paths to analyze simply by using some
sort of CREATE STATISTICS.  But it is really unclear how to:
 * store pg_statistic_ext rows from typanalyze
 * form path expressions for array elements (maybe add new jsonpath
   operator)
 * match various -> operator chains to stxexprs
 * jsonpath-like languages need simple API for searching by stxexprs



Per-path statistics should only be collected for scalars.  This can be
enabled by flag JsonAnalyzeContext.scalarsOnly.  But there are is a
problem: computed MCVs and histograms will be broken and we will not be
able to use them for queries like (jb > const) in general case.  Also
we will not be and use internally in scalarineqsel() and var_eq_const()
(see jsonSelectivity()).  Instead, we will have to implement own 
estimator functions for JSONB comparison operators that will correctly
use our hacked MCVs and histograms (and maybe not all cases will be
supported; for example, comparison to scalars only).

It's possible to replace objects and arrays with empty ones when 
scalarsOnly is set to keep correct frequencies of non-scalars.  
But there is an old bug in JSONB comparison: empty arrays are placed 
before other values in the JSONB sort order, although they should go 
after all scalars.  So we need also to distinguish empty and non-empty 
arrays here.



I tried to fix a major part of places marked as XXX and FIXME, the new
version of the patches is attached.  There are a lot of changes, you
can see them in a step-by-step form in the corresponding branch
jsonb_stats_20220122 in our GitHub repo [1]. 


Below is the explanation of fixed XXXs:

Patch 0001

src/backend/commands/operatorcmds.c:

> XXX Maybe not the right name, because "estimator" implies we're 
> calculating selectivity. But we're actually deriving statistics for 
> an expression.

Renamed to "Derivator".

> XXX perhaps full "statistics" wording would be better

Renamed to "statistics".

src/backend/utils/adt/selfuncs.c:

> examine_operator_expression():

> XXX Not sure why this returns bool - we ignore the return value
> anyway. We might as well return the calculated vardata (or NULL).

Oprstat was changed to return void.

> XXX Not sure what to do about recursion - there can be another OpExpr
> in one of the arguments, and we should call this recursively from the
> oprstat procedure. But that's not possible, because it's marked as
> static.

Oprstat call chain: get_restriction_variable() => examine_variable() =>
examine_operator_expression().

The main thing here is that OpExpr with oprstat acts like ordinary Var.

> examine_variable():
> XXX Shouldn't this put more restrictions on the OpExpr? E.g. that
> one of the arguments has to be a Const or something?

This is simply a responsibility of oprstat.


Patch 0004

> XXX Not sure we want to add these functions to jsonb.h, which is the
> public API. Maybe it belongs rather to jsonb_typanalyze.c or
> elsewhere, closer to how it's used?

Maybe it needs to be moved the new file jsonb_utils.h.  I think these
functions become very useful, when we start to build JSONBs with
predefined structure.


> pushJsonbValue():
> XXX I'm not quite sure why we actually do this? Why do we need to
> change how JsonbValue is converted to Jsonb for the statistics patch?

Scalars in JSONB are encoded as one-element preudo-array containers.
So when we are inserting binary JsonbValues, that was initialized
directly from JSONB datums, inside other non-empty JSONB in
pushJsonbValue(), all values except scalars are inserted as
expected but scalars become [scalar].  So we need to extract scalar
values in caller functions or in pushJsonbValue().  I think
autoextraction in pushJsonbValue() is better.  This case simply was not
used before JSONB stats introduction.


Patch 0006

src/backend/utils/adt/jsonb_selfuncs.c

> jsonPathStatsGetSpecialStats()
> XXX This does not really extract any stats, it merely allocates the
> struct?

Renamed with "Alloc" suffix.

> jsonPathStatsGetArrayLengthStats()
> XXX Why doesn't this do jsonPathStatsGetTypeFreq check similar to
> what jsonPathStatsGetLengthStats does?

"length" stats were collected inside parent paths, but "array_length"
and "avg_array_length" stats were collected inside child array paths.
This resulted in inconsistencies in TypeFreq checks.

I have removed "length" stats, moved "array_length" and
"avg_array_length" to the parent path, and added separate
"object_length" stats.  TypeFreq checks become consistent.

> XXX Seems to do essentially what jsonStatsFindPath, except that it
> also considers jsdata->prefix. Seems fairly easy to combine those
> into a single function.

I don't think that it would be better to combine those function into
one with considerPrefix flag, because jsonStatsFindPathStats() is a
some kind of low-level function which is called only in two places.
In all other places considerPrefix will be true. Also
jsonStatsFindPathStatsStr() is exported in jsonb_selfuncs.h for to give
external jsonpath-like query operators ability to use JSON statistics.

> jsonPathStatsCompare()
> XXX Seems a bit convoluted to first cast it to Datum, then Jsonb ...
> Datum const *pdatum = pv2;
> Jsonb	   *jsonb = DatumGetJsonbP(*pdatum);

The problem of simply using 'jsonb = *(Jsonb **) pv2' is that
DatumGetJsonbP() may deTOAST datums.

> XXX Not sure about this? Does empty path mean global stats?
Empty "path" is simply a sign of invalid stats data.


> jsonStatsConvertArray()
> FIXME Does this actually work on all 32/64-bit systems? What if typid
> is FLOAT8OID or something? Should look at TypeCache instead, probably.

Used get_typlenbyvalalign() instead of hardcoded values.

> jsonb_stats()
>   XXX It might be useful to allow recursion, i.e.
>   get_restriction_variable might derive statistics too.
>   I don't think it does that now, right?

get_restriction_variable() already might derive statistics: it calls
examine_variable() on its both operands, and examine_variable() calls
examine_operator_expression().

> XXX Could we also get varonleft=false in useful cases?

All supported JSONB operators have signature  jsonb OP arg.
If varonleft = false, then we need to derive stats for expression like
  '{"foo": "bar"}' -> text_column
having stats for text_column.  It is possible to implement too, but it
is not related to JSONB stats and needs to be done in the separate
patch.


> jsonSelectivityContains():
>   XXX This really needs more comments explaining the logic.

I have refactored this function and added comments.


> jsonGetFloat4():
>   XXX Not sure assert is a sufficient protection against different
>   types of JSONB values to be passed in.

I have refactored this function by passing a default value for
non-numeric JSONB case.

> jsonPathAppendEntryWithLen()
> XXX Doesn't this need ecape_json too?

Comment is removed, because jsonPathAppendEntry() is called inside.

> jsonPathStatsGetTypeFreq()
> FIXME This is really hard to read/understand, with two nested ternary
> operators.

I have refactored this place.

> XXX Seems more like an error, no? Why ignore it?

It's not an error, it's request of non-numeric type.  Length values
are always numeric, and frequence of non-numeric values is 0.

The possible case when it could happen is jsonpath '$.size() == "foo"'.
Estimator for operator == will check frequence of strings in .size()
and it will be 0.


> jsonPathStatsFormTuple()
> FIXME What does this mean?

There is no need to transform ordinary root path stats tuple, it can be
simply copied.


jsonb_typanalyze.c

> XXX We need entry+lenth because JSON path elements may contain null
> bytes, I guess?

'entry' can be not zero-terminated when it is pointing to JSONB keys,
so 'len' is necessary field.  'len' is also used for faster entry
 comparison, to distinguish array entries ('len' == -1).

> XXX Sould be JsonPathEntryMatch as it deals with JsonPathEntry nodes
> not whole paths, no?
> XXX Again, maybe JsonPathEntryHash would be a better name?

Functions renamed using JsonPathEntry prefix, JsonPath typedef removed.


> JsonPathMatch()
> XXX Seems a bit silly to return int, when the return statement only
> really returns bool (because of how it compares paths). It's not really
> a comparator for sorting, for example.

This function is implementation of HashCompareFunc and it needs to
return int.

> jsonAnalyzeJson()
> XXX The name seems a bit weird, with the two json bits.

Renamed to jsonAnalyzeCollectPaths(). The two similar functions were
renamed too.

> jsonAnalyzeJson():
> XXX The mix of break/return statements in this block is really
> confusing.

I have refactored this place using only breaks.

> XXX not sure why we're doing this?

Manual recursion into containers by creating child iterator together
with skipNested=true flag is used to give jsonAnalyzeJsonValue()
ability to access jbvBinary containers.


> compute_json_stats()
> XXX Not sure what the first branch is doing (or supposed to)?

> XXX It's not immediately clear why this is (-1) and not simply
> NULL. It crashes, so presumably it's used to tweak the behavior,
> but it's not clear why/how, and it affects place that is pretty
> far away, and so not obvious. We should use some sort of flag
> with a descriptive name instead.

> XXX If I understand correctly, we simply collect all paths first,
> without accumulating any Values. And then in the next step we
> process each path independently, probably to save memory (we
> don't want to accumulate all values for all paths, with a lot
> of duplicities).

There are two variants of stats collection:
 * single-pass - collect all values for all paths
 * multi-pass  - collect only values for a one path at each pass

The first variant can consume too much memory (jsonb iteration produces
a lot of garbage etc.), but works faster than second.

The first 'if (false)' is used for manual selection of one of this
variants.  This selection should be controlled by some user-specified
option (maybe GUC), or the first variant can be simply removed.

jsonAnalyzeJson()'s parameter of type JsonPathAnlStats * determines
which paths we need to consider for the value collection:
 * NULL  - collect values for all paths
 * -1    - do not collect any values
 * stats - collect values only for a given path

The last variant really is unused because we already have another
function jsonAnalyzeJsonPath(), which is optimized for selective path
values collection (used object key accessor JSONB functions instead of
full JSONB iteration).  I have replaced this strange parameter with
simple boolean flag.

> XXX Could the parameters be different on other platforms?

Used get_typlenbyvalalign(JSONBOID) instead of hardcoded values.

> jsonAnalyzePathValues()
> XXX Do we need to initialize all slots?

I have copied here the following comment from extended_stats.c:
/*
 * The fields describing the stats->stavalues[n] element types default
 * to the type of the data being analyzed, but the type-specific
 * typanalyze function can change them if it wants to store something
 * else.
 */

> XXX Not sure why we divide it by the number of json values?

We divide counts of lengths by the total number of json values to
compute correct nullfrac. I.e. not all input jsons have lengths,
length of scalar jsons is NULL.



[1] https://github.com/postgrespro/postgres/tree/jsonb_stats_20220122

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--------------mifjveAfFhikEuO7yXEeQAXM-- --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0001-Add-pg_operator.oprstat-for-derived-operator-statist.patch" Content-Disposition: attachment; filename*0="0001-Add-pg_operator.oprstat-for-derived-operator-statist.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBmMzM0YjVhMjEwZGQ1NzY1OWRhMmUyMDJmMzk4MDUyMTU4YTUyOTFhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFNhdCwgMTIgTm92IDIwMTYgMTg6NTk6NDMgKzAzMDAKU3ViamVj dDogW1BBVENIIDEvNl0gQWRkIHBnX29wZXJhdG9yLm9wcnN0YXQgZm9yIGRlcml2ZWQgb3Bl cmF0b3Igc3RhdGlzdGljcwogZXN0aW1hdGlvbgoKLS0tCiBzcmMvYmFja2VuZC9jYXRhbG9n L3BnX29wZXJhdG9yLmMgICAgICB8IDExICsrKysrCiBzcmMvYmFja2VuZC9jb21tYW5kcy9v cGVyYXRvcmNtZHMuYyAgICB8IDYxICsrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMv YmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyAgICAgICB8IDM4ICsrKysrKysrKysrKysr KysKIHNyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL2xzeXNjYWNoZS5jICAgIHwgMjQgKysrKysr KysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5oICAgICAgfCAgNCArKwog c3JjL2luY2x1ZGUvdXRpbHMvbHN5c2NhY2hlLmggICAgICAgICAgfCAgMSArCiBzcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dCB8ICAxICsKIDcgZmlsZXMgY2hhbmdl ZCwgMTQwIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9n L3BnX29wZXJhdG9yLmMgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX29wZXJhdG9yLmMKaW5k ZXggNjMwYmYzZTU2Y2MuLjkyMDVlNjJjMGViIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9j YXRhbG9nL3BnX29wZXJhdG9yLmMKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19vcGVy YXRvci5jCkBAIC0yNTYsNiArMjU2LDcgQEAgT3BlcmF0b3JTaGVsbE1ha2UoY29uc3QgY2hh ciAqb3BlcmF0b3JOYW1lLAogCXZhbHVlc1tBbnVtX3BnX29wZXJhdG9yX29wcmNvZGUgLSAx XSA9IE9iamVjdElkR2V0RGF0dW0oSW52YWxpZE9pZCk7CiAJdmFsdWVzW0FudW1fcGdfb3Bl cmF0b3Jfb3BycmVzdCAtIDFdID0gT2JqZWN0SWRHZXREYXR1bShJbnZhbGlkT2lkKTsKIAl2 YWx1ZXNbQW51bV9wZ19vcGVyYXRvcl9vcHJqb2luIC0gMV0gPSBPYmplY3RJZEdldERhdHVt KEludmFsaWRPaWQpOworCXZhbHVlc1tBbnVtX3BnX29wZXJhdG9yX29wcnN0YXQgLSAxXSA9 IE9iamVjdElkR2V0RGF0dW0oSW52YWxpZE9pZCk7CiAKIAkvKgogCSAqIGNyZWF0ZSBhIG5l dyBvcGVyYXRvciB0dXBsZQpAQCAtMzAxLDYgKzMwMiw3IEBAIE9wZXJhdG9yU2hlbGxNYWtl KGNvbnN0IGNoYXIgKm9wZXJhdG9yTmFtZSwKICAqCQluZWdhdG9yTmFtZQkJCQlYIG5lZ2F0 b3Igb3BlcmF0b3IKICAqCQlyZXN0cmljdGlvbklkCQkJWCByZXN0cmljdGlvbiBzZWxlY3Rp dml0eSBwcm9jZWR1cmUgSUQKICAqCQlqb2luSWQJCQkJCVggam9pbiBzZWxlY3Rpdml0eSBw cm9jZWR1cmUgSUQKKyAqCQlzdGF0c0lkCQkJCQlYIHN0YXRpc3RpY3MgZGVyaXZhdGlvbiBw cm9jZWR1cmUgSUQKICAqCQljYW5NZXJnZQkJCQltZXJnZSBqb2luIGNhbiBiZSB1c2VkIHdp dGggdGhpcyBvcGVyYXRvcgogICoJCWNhbkhhc2gJCQkJCWhhc2ggam9pbiBjYW4gYmUgdXNl ZCB3aXRoIHRoaXMgb3BlcmF0b3IKICAqCkBAIC0zMzMsNiArMzM1LDcgQEAgT3BlcmF0b3JD cmVhdGUoY29uc3QgY2hhciAqb3BlcmF0b3JOYW1lLAogCQkJICAgTGlzdCAqbmVnYXRvck5h bWUsCiAJCQkgICBPaWQgcmVzdHJpY3Rpb25JZCwKIAkJCSAgIE9pZCBqb2luSWQsCisJCQkg ICBPaWQgc3RhdHNJZCwKIAkJCSAgIGJvb2wgY2FuTWVyZ2UsCiAJCQkgICBib29sIGNhbkhh c2gpCiB7CkBAIC01MDUsNiArNTA4LDcgQEAgT3BlcmF0b3JDcmVhdGUoY29uc3QgY2hhciAq b3BlcmF0b3JOYW1lLAogCXZhbHVlc1tBbnVtX3BnX29wZXJhdG9yX29wcmNvZGUgLSAxXSA9 IE9iamVjdElkR2V0RGF0dW0ocHJvY2VkdXJlSWQpOwogCXZhbHVlc1tBbnVtX3BnX29wZXJh dG9yX29wcnJlc3QgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0ocmVzdHJpY3Rpb25JZCk7CiAJ dmFsdWVzW0FudW1fcGdfb3BlcmF0b3Jfb3Byam9pbiAtIDFdID0gT2JqZWN0SWRHZXREYXR1 bShqb2luSWQpOworCXZhbHVlc1tBbnVtX3BnX29wZXJhdG9yX29wcnN0YXQgLSAxXSA9IE9i amVjdElkR2V0RGF0dW0oc3RhdHNJZCk7CiAKIAlwZ19vcGVyYXRvcl9kZXNjID0gdGFibGVf b3BlbihPcGVyYXRvclJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxvY2spOwogCkBAIC04NTUs NiArODU5LDEzIEBAIG1ha2VPcGVyYXRvckRlcGVuZGVuY2llcyhIZWFwVHVwbGUgdHVwbGUs CiAJCWFkZF9leGFjdF9vYmplY3RfYWRkcmVzcygmcmVmZXJlbmNlZCwgYWRkcnMpOwogCX0K IAorCS8qIERlcGVuZGVuY3kgb24gc3RhdGlzdGljcyBkZXJpdmF0aW9uIGZ1bmN0aW9uICov CisJaWYgKE9pZElzVmFsaWQob3Blci0+b3Byc3RhdCkpCisJeworCQlPYmplY3RBZGRyZXNz U2V0KHJlZmVyZW5jZWQsIFByb2NlZHVyZVJlbGF0aW9uSWQsIG9wZXItPm9wcnN0YXQpOwor CQlhZGRfZXhhY3Rfb2JqZWN0X2FkZHJlc3MoJnJlZmVyZW5jZWQsIGFkZHJzKTsKKwl9CisK IAlyZWNvcmRfb2JqZWN0X2FkZHJlc3NfZGVwZW5kZW5jaWVzKCZteXNlbGYsIGFkZHJzLCBE RVBFTkRFTkNZX05PUk1BTCk7CiAJZnJlZV9vYmplY3RfYWRkcmVzc2VzKGFkZHJzKTsKIApk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvb3BlcmF0b3JjbWRzLmMgYi9zcmMv YmFja2VuZC9jb21tYW5kcy9vcGVyYXRvcmNtZHMuYwppbmRleCBhNTkyNGQ3ZDU2NC4uYWRm MTNlNjQ4YTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL29wZXJhdG9yY21k cy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL29wZXJhdG9yY21kcy5jCkBAIC01Miw2 ICs1Miw3IEBACiAKIHN0YXRpYyBPaWQJVmFsaWRhdGVSZXN0cmljdGlvbkVzdGltYXRvcihM aXN0ICpyZXN0cmljdGlvbk5hbWUpOwogc3RhdGljIE9pZAlWYWxpZGF0ZUpvaW5Fc3RpbWF0 b3IoTGlzdCAqam9pbk5hbWUpOworc3RhdGljIE9pZAlWYWxpZGF0ZVN0YXRpc3RpY3NEZXJp dmF0b3IoTGlzdCAqam9pbk5hbWUpOwogCiAvKgogICogRGVmaW5lT3BlcmF0b3IKQEAgLTc4 LDEwICs3OSwxMiBAQCBEZWZpbmVPcGVyYXRvcihMaXN0ICpuYW1lcywgTGlzdCAqcGFyYW1l dGVycykKIAlMaXN0CSAgICpjb21tdXRhdG9yTmFtZSA9IE5JTDsJLyogb3B0aW9uYWwgY29t bXV0YXRvciBvcGVyYXRvciBuYW1lICovCiAJTGlzdAkgICAqbmVnYXRvck5hbWUgPSBOSUw7 CS8qIG9wdGlvbmFsIG5lZ2F0b3Igb3BlcmF0b3IgbmFtZSAqLwogCUxpc3QJICAgKnJlc3Ry aWN0aW9uTmFtZSA9IE5JTDsJLyogb3B0aW9uYWwgcmVzdHJpY3QuIHNlbC4gZnVuY3Rpb24g Ki8KKwlMaXN0CSAgICpzdGF0aXN0aWNzTmFtZSA9IE5JTDsJLyogb3B0aW9uYWwgc3RhdHMg ZXN0aW1hdC4gcHJvY2VkdXJlICovCiAJTGlzdAkgICAqam9pbk5hbWUgPSBOSUw7IC8qIG9w dGlvbmFsIGpvaW4gc2VsLiBmdW5jdGlvbiAqLwogCU9pZAkJCWZ1bmN0aW9uT2lkOwkvKiBm dW5jdGlvbnMgY29udmVydGVkIHRvIE9JRCAqLwogCU9pZAkJCXJlc3RyaWN0aW9uT2lkOwog CU9pZAkJCWpvaW5PaWQ7CisJT2lkCQkJc3RhdGlzdGljc09pZDsKIAlPaWQJCQl0eXBlSWRb Ml07CQkvKiB0byBob2xkIGxlZnQgYW5kIHJpZ2h0IGFyZyAqLwogCWludAkJCW5hcmdzOwog CUxpc3RDZWxsICAgKnBsOwpAQCAtMTMxLDYgKzEzNCw4IEBAIERlZmluZU9wZXJhdG9yKExp c3QgKm5hbWVzLCBMaXN0ICpwYXJhbWV0ZXJzKQogCQkJcmVzdHJpY3Rpb25OYW1lID0gZGVm R2V0UXVhbGlmaWVkTmFtZShkZWZlbCk7CiAJCWVsc2UgaWYgKHN0cmNtcChkZWZlbC0+ZGVm bmFtZSwgImpvaW4iKSA9PSAwKQogCQkJam9pbk5hbWUgPSBkZWZHZXRRdWFsaWZpZWROYW1l KGRlZmVsKTsKKwkJZWxzZSBpZiAoc3RyY21wKGRlZmVsLT5kZWZuYW1lLCAic3RhdGlzdGlj cyIpID09IDApCisJCQlzdGF0aXN0aWNzTmFtZSA9IGRlZkdldFF1YWxpZmllZE5hbWUoZGVm ZWwpOwogCQllbHNlIGlmIChzdHJjbXAoZGVmZWwtPmRlZm5hbWUsICJoYXNoZXMiKSA9PSAw KQogCQkJY2FuSGFzaCA9IGRlZkdldEJvb2xlYW4oZGVmZWwpOwogCQllbHNlIGlmIChzdHJj bXAoZGVmZWwtPmRlZm5hbWUsICJtZXJnZXMiKSA9PSAwKQpAQCAtMjQ2LDYgKzI1MSwxMCBA QCBEZWZpbmVPcGVyYXRvcihMaXN0ICpuYW1lcywgTGlzdCAqcGFyYW1ldGVycykKIAkJam9p bk9pZCA9IFZhbGlkYXRlSm9pbkVzdGltYXRvcihqb2luTmFtZSk7CiAJZWxzZQogCQlqb2lu T2lkID0gSW52YWxpZE9pZDsKKwlpZiAoc3RhdGlzdGljc05hbWUpCisJCXN0YXRpc3RpY3NP aWQgPSBWYWxpZGF0ZVN0YXRpc3RpY3NEZXJpdmF0b3Ioc3RhdGlzdGljc05hbWUpOworCWVs c2UKKwkJc3RhdGlzdGljc09pZCA9IEludmFsaWRPaWQ7CiAKIAkvKgogCSAqIG5vdyBoYXZl IE9wZXJhdG9yQ3JlYXRlIGRvIGFsbCB0aGUgd29yay4uCkBAIC0yNjAsNiArMjY5LDcgQEAg RGVmaW5lT3BlcmF0b3IoTGlzdCAqbmFtZXMsIExpc3QgKnBhcmFtZXRlcnMpCiAJCQkJCSAg IG5lZ2F0b3JOYW1lLCAvKiBvcHRpb25hbCBuZWdhdG9yIG9wZXJhdG9yIG5hbWUgKi8KIAkJ CQkJICAgcmVzdHJpY3Rpb25PaWQsCS8qIG9wdGlvbmFsIHJlc3RyaWN0LiBzZWwuIGZ1bmN0 aW9uICovCiAJCQkJCSAgIGpvaW5PaWQsIC8qIG9wdGlvbmFsIGpvaW4gc2VsLiBmdW5jdGlv biBuYW1lICovCisJCQkJCSAgIHN0YXRpc3RpY3NPaWQsIC8qIG9wdGlvbmFsIHN0YXRzIGVz dGltYXRpb24gcHJvY2VkdXJlICovCiAJCQkJCSAgIGNhbk1lcmdlLAkvKiBvcGVyYXRvciBt ZXJnZXMgKi8KIAkJCQkJICAgY2FuSGFzaCk7CS8qIG9wZXJhdG9yIGhhc2hlcyAqLwogfQpA QCAtMzU3LDYgKzM2Nyw0MCBAQCBWYWxpZGF0ZUpvaW5Fc3RpbWF0b3IoTGlzdCAqam9pbk5h bWUpCiAJcmV0dXJuIGpvaW5PaWQ7CiB9CiAKKy8qCisgKiBMb29rIHVwIGEgc3RhdGlzdGlj cyBlc3RpbWF0b3IgZnVuY3Rpb24gYnkgbmFtZSwgYW5kIHZlcmlmeSB0aGF0IGl0IGhhcyB0 aGUKKyAqIGNvcnJlY3Qgc2lnbmF0dXJlIGFuZCB3ZSBoYXZlIHRoZSBwZXJtaXNzaW9ucyB0 byBhdHRhY2ggaXQgdG8gYW4gb3BlcmF0b3IuCisgKi8KK3N0YXRpYyBPaWQKK1ZhbGlkYXRl U3RhdGlzdGljc0Rlcml2YXRvcihMaXN0ICpzdGF0TmFtZSkKK3sKKwlPaWQJCQl0eXBlSWRb NF07CisJT2lkCQkJc3RhdE9pZDsKKwlBY2xSZXN1bHQJYWNscmVzdWx0OworCisJdHlwZUlk WzBdID0gSU5URVJOQUxPSUQ7CS8qIFBsYW5uZXJJbmZvICovCisJdHlwZUlkWzFdID0gSU5U RVJOQUxPSUQ7CS8qIE9wRXhwciAqLworCXR5cGVJZFsyXSA9IElOVDRPSUQ7CQkvKiB2YXJS ZWxpZCAqLworCXR5cGVJZFszXSA9IElOVEVSTkFMT0lEOwkvKiBWYXJpYWJsZVN0YXREYXRh ICovCisKKwlzdGF0T2lkID0gTG9va3VwRnVuY05hbWUoc3RhdE5hbWUsIDQsIHR5cGVJZCwg ZmFsc2UpOworCisJLyogc3RhdGlzdGljcyBlc3RpbWF0b3JzIG11c3QgcmV0dXJuIHZvaWQg Ki8KKwlpZiAoZ2V0X2Z1bmNfcmV0dHlwZShzdGF0T2lkKSAhPSBWT0lET0lEKQorCQllcmVw b3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9PQkpFQ1RfREVGSU5J VElPTiksCisJCQkJIGVycm1zZygic3RhdGlzdGljcyBlc3RpbWF0b3IgZnVuY3Rpb24gJXMg bXVzdCByZXR1cm4gdHlwZSAlcyIsCisJCQkJCQlOYW1lTGlzdFRvU3RyaW5nKHN0YXROYW1l KSwgInZvaWQiKSkpOworCisJLyogUmVxdWlyZSBFWEVDVVRFIHJpZ2h0cyBmb3IgdGhlIGVz dGltYXRvciAqLworCWFjbHJlc3VsdCA9IHBnX3Byb2NfYWNsY2hlY2soc3RhdE9pZCwgR2V0 VXNlcklkKCksIEFDTF9FWEVDVVRFKTsKKwlpZiAoYWNscmVzdWx0ICE9IEFDTENIRUNLX09L KQorCQlhY2xjaGVja19lcnJvcihhY2xyZXN1bHQsIE9CSkVDVF9GVU5DVElPTiwKKwkJCQkJ ICAgTmFtZUxpc3RUb1N0cmluZyhzdGF0TmFtZSkpOworCisJcmV0dXJuIHN0YXRPaWQ7Cit9 CisKIC8qCiAgKiBHdXRzIG9mIG9wZXJhdG9yIGRlbGV0aW9uLgogICovCkBAIC00MjQsNiAr NDY4LDkgQEAgQWx0ZXJPcGVyYXRvcihBbHRlck9wZXJhdG9yU3RtdCAqc3RtdCkKIAlMaXN0 CSAgICpqb2luTmFtZSA9IE5JTDsgLyogb3B0aW9uYWwgam9pbiBzZWwuIGZ1bmN0aW9uICov CiAJYm9vbAkJdXBkYXRlSm9pbiA9IGZhbHNlOwogCU9pZAkJCWpvaW5PaWQ7CisJTGlzdAkg ICAqc3RhdE5hbWUgPSBOSUw7IC8qIG9wdGlvbmFsIHN0YXRpc3RpY3MgZXN0aW1hdGlvbiBw cm9jZWR1cmUgKi8KKwlib29sCQl1cGRhdGVTdGF0ID0gZmFsc2U7CisJT2lkCQkJc3RhdE9p ZDsKIAogCS8qIExvb2sgdXAgdGhlIG9wZXJhdG9yICovCiAJb3BySWQgPSBMb29rdXBPcGVy V2l0aEFyZ3Moc3RtdC0+b3Blcm5hbWUsIGZhbHNlKTsKQEAgLTQ1NCw2ICs1MDEsMTEgQEAg QWx0ZXJPcGVyYXRvcihBbHRlck9wZXJhdG9yU3RtdCAqc3RtdCkKIAkJCWpvaW5OYW1lID0g cGFyYW07CiAJCQl1cGRhdGVKb2luID0gdHJ1ZTsKIAkJfQorCQllbHNlIGlmIChwZ19zdHJj YXNlY21wKGRlZmVsLT5kZWZuYW1lLCAic3RhdHMiKSA9PSAwKQorCQl7CisJCQlzdGF0TmFt ZSA9IHBhcmFtOworCQkJdXBkYXRlU3RhdCA9IHRydWU7CisJCX0KIAogCQkvKgogCQkgKiBU aGUgcmVzdCBvZiB0aGUgb3B0aW9ucyB0aGF0IENSRUFURSBhY2NlcHRzIGNhbm5vdCBiZSBj aGFuZ2VkLgpAQCAtNDk2LDYgKzU0OCwxMCBAQCBBbHRlck9wZXJhdG9yKEFsdGVyT3BlcmF0 b3JTdG10ICpzdG10KQogCQlqb2luT2lkID0gVmFsaWRhdGVKb2luRXN0aW1hdG9yKGpvaW5O YW1lKTsKIAllbHNlCiAJCWpvaW5PaWQgPSBJbnZhbGlkT2lkOworCWlmIChzdGF0TmFtZSkK KwkJc3RhdE9pZCA9IFZhbGlkYXRlU3RhdGlzdGljc0Rlcml2YXRvcihzdGF0TmFtZSk7CisJ ZWxzZQorCQlzdGF0T2lkID0gSW52YWxpZE9pZDsKIAogCS8qIFBlcmZvcm0gYWRkaXRpb25h bCBjaGVja3MsIGxpa2UgT3BlcmF0b3JDcmVhdGUgZG9lcyAqLwogCWlmICghKE9pZElzVmFs aWQob3ByRm9ybS0+b3BybGVmdCkgJiYgT2lkSXNWYWxpZChvcHJGb3JtLT5vcHJyaWdodCkp KQpAQCAtNTM2LDYgKzU5MiwxMSBAQCBBbHRlck9wZXJhdG9yKEFsdGVyT3BlcmF0b3JTdG10 ICpzdG10KQogCQlyZXBsYWNlc1tBbnVtX3BnX29wZXJhdG9yX29wcmpvaW4gLSAxXSA9IHRy dWU7CiAJCXZhbHVlc1tBbnVtX3BnX29wZXJhdG9yX29wcmpvaW4gLSAxXSA9IGpvaW5PaWQ7 CiAJfQorCWlmICh1cGRhdGVTdGF0KQorCXsKKwkJcmVwbGFjZXNbQW51bV9wZ19vcGVyYXRv cl9vcHJzdGF0IC0gMV0gPSB0cnVlOworCQl2YWx1ZXNbQW51bV9wZ19vcGVyYXRvcl9vcHJz dGF0IC0gMV0gPSBzdGF0T2lkOworCX0KIAogCXR1cCA9IGhlYXBfbW9kaWZ5X3R1cGxlKHR1 cCwgUmVsYXRpb25HZXREZXNjcihjYXRhbG9nKSwKIAkJCQkJCQl2YWx1ZXMsIG51bGxzLCBy ZXBsYWNlcyk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3Mu YyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IDFmYmIwYjI4YzNi Li5kMWRkMDQ5ZjFhZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1 bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTQ5MTcs NiArNDkxNywzMCBAQCBSZWxlYXNlRHVtbXkoSGVhcFR1cGxlIHR1cGxlKQogCXBmcmVlKHR1 cGxlKTsKIH0KIAorLyoKKyAqIGV4YW1pbmVfb3BlcmF0b3JfZXhwcmVzc2lvbgorICoJCVRy eSB0byBkZXJpdmUgb3B0aW1pemVyIHN0YXRpc3RpY3MgZm9yIHRoZSBvcGVyYXRvciBleHBy ZXNzaW9uIHVzaW5nCisgKgkJb3BlcmF0b3IncyBvcHJzdGF0IGZ1bmN0aW9uLgorICoKKyAq IFRoZXJlIGNhbiBiZSBhbm90aGVyIE9wRXhwciBpbiBvbmUgb2YgdGhlIGFyZ3VtZW50cywg YW5kIGl0IHdpbGwgYmUgY2FsbGVkCisgKiByZWN1cnNpdmVseSBmcm9tIHRoZSBvcHJzdGF0 IHByb2NlZHVyZSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgY2hhaW46CisgKiBnZXRfcmVzdHJp Y3Rpb25fdmFyaWFibGUoKSA9PiBleGFtaW5lX3ZhcmlhYmxlKCkgPT4KKyAqIGV4YW1pbmVf b3BlcmF0b3JfZXhwcmVzc2lvbigpLgorICovCitzdGF0aWMgdm9pZAorZXhhbWluZV9vcGVy YXRvcl9leHByZXNzaW9uKFBsYW5uZXJJbmZvICpyb290LCBPcEV4cHIgKm9wZXhwciwgaW50 IHZhclJlbGlkLAorCQkJCQkJCVZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEpCit7CisJUmVn UHJvY2VkdXJlIG9wcnN0YXQgPSBnZXRfb3Byc3RhdChvcGV4cHItPm9wbm8pOworCisJaWYg KE9pZElzVmFsaWQob3Byc3RhdCkpCisJCU9pZEZ1bmN0aW9uQ2FsbDQob3Byc3RhdCwKKwkJ CQkJCSBQb2ludGVyR2V0RGF0dW0ocm9vdCksCisJCQkJCQkgUG9pbnRlckdldERhdHVtKG9w ZXhwciksCisJCQkJCQkgSW50MzJHZXREYXR1bSh2YXJSZWxpZCksCisJCQkJCQkgUG9pbnRl ckdldERhdHVtKHZhcmRhdGEpKTsKK30KKwogLyoKICAqIGV4YW1pbmVfdmFyaWFibGUKICAq CQlUcnkgdG8gbG9vayB1cCBzdGF0aXN0aWNhbCBkYXRhIGFib3V0IGFuIGV4cHJlc3Npb24u CkBAIC01MzMyLDYgKzUzNTYsMjAgQEAgZXhhbWluZV92YXJpYWJsZShQbGFubmVySW5mbyAq cm9vdCwgTm9kZSAqbm9kZSwgaW50IHZhclJlbGlkLAogCQkJCXBvcysrOwogCQkJfQogCQl9 CisKKwkJLyoKKwkJICogSWYgdGhlcmUncyBubyBpbmRleCBvciBleHRlbmRlZCBzdGF0aXN0 aWNzIG1hdGNoaW5nIHRoZSBleHByZXNzaW9uLAorCQkgKiB0cnkgZGVyaXZpbmcgdGhlIHN0 YXRpc3RpY3MgZnJvbSBzdGF0aXN0aWNzIG9uIGFyZ3VtZW50cyBvZiB0aGUKKwkJICogb3Bl cmF0b3IgZXhwcmVzc2lvbiAoT3BFeHByKS4gV2UgZG8gdGhpcyBsYXN0IGJlY2F1c2UgaXQg bWF5IGJlIHF1aXRlCisJCSAqIGV4cGVuc2l2ZSwgYW5kIGl0J3MgdW5jbGVhciBob3cgYWNj dXJhdGUgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZS4KKwkJICoKKwkJICogTW9yZSByZXN0cmlj dGlvbnMgb24gdGhlIE9wRXhwciAoZS5nLiB0aGF0IG9uZSBvZiB0aGUgYXJndW1lbnRzCisJ CSAqIGhhcyB0byBiZSBhIENvbnN0IG9yIHNvbWV0aGluZykgY2FuIGJlIHB1dCBieSB0aGUg b3BlcmF0b3IgaXRzZWxmCisJCSAqIGluIGl0cyBvcHJzdGF0IGZ1bmN0aW9uLgorCQkgKi8K KwkJaWYgKCF2YXJkYXRhLT5zdGF0c1R1cGxlICYmIElzQShiYXNlbm9kZSwgT3BFeHByKSkK KwkJCWV4YW1pbmVfb3BlcmF0b3JfZXhwcmVzc2lvbihyb290LCAoT3BFeHByICopIGJhc2Vu b2RlLCB2YXJSZWxpZCwKKwkJCQkJCQkJCQl2YXJkYXRhKTsKIAl9CiB9CiAKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL2xzeXNjYWNoZS5jIGIvc3JjL2JhY2tlbmQv dXRpbHMvY2FjaGUvbHN5c2NhY2hlLmMKaW5kZXggZmVlZjk5OTg2MzQuLmI1NDQwYjU5NmNk IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9sc3lzY2FjaGUuYworKysg Yi9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9sc3lzY2FjaGUuYwpAQCAtMTU2Nyw2ICsxNTY3 LDMwIEBAIGdldF9vcHJqb2luKE9pZCBvcG5vKQogCQlyZXR1cm4gKFJlZ1Byb2NlZHVyZSkg SW52YWxpZE9pZDsKIH0KIAorLyoKKyAqIGdldF9vcHJzdGF0CisgKgorICoJCVJldHVybnMg cHJvY2VkdXJlIGlkIGZvciBlc3RpbWF0aW5nIHN0YXRpc3RpY3MgZm9yIGFuIG9wZXJhdG9y LgorICovCitSZWdQcm9jZWR1cmUKK2dldF9vcHJzdGF0KE9pZCBvcG5vKQoreworCUhlYXBU dXBsZQl0cDsKKworCXRwID0gU2VhcmNoU3lzQ2FjaGUxKE9QRVJPSUQsIE9iamVjdElkR2V0 RGF0dW0ob3BubykpOworCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHRwKSkKKwl7CisJCUZvcm1f cGdfb3BlcmF0b3Igb3B0dXAgPSAoRm9ybV9wZ19vcGVyYXRvcikgR0VUU1RSVUNUKHRwKTsK KwkJUmVnUHJvY2VkdXJlIHJlc3VsdDsKKworCQlyZXN1bHQgPSBvcHR1cC0+b3Byc3RhdDsK KwkJUmVsZWFzZVN5c0NhY2hlKHRwKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJZWxzZQor CQlyZXR1cm4gKFJlZ1Byb2NlZHVyZSkgSW52YWxpZE9pZDsKK30KKwogLyoJCQkJLS0tLS0t LS0tLSBGVU5DVElPTiBDQUNIRSAtLS0tLS0tLS0tCQkJCQkgKi8KIAogLyoKZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BlcmF0b3IuaCBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfb3BlcmF0b3IuaAppbmRleCA1MTI2M2Y1NTBmZS4uZmYxYmIzMzlmNzUgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BlcmF0b3IuaAorKysgYi9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmgKQEAgLTczLDYgKzczLDkgQEAgQ0FUQUxP RyhwZ19vcGVyYXRvciwyNjE3LE9wZXJhdG9yUmVsYXRpb25JZCkKIAogCS8qIE9JRCBvZiBq b2luIGVzdGltYXRvciwgb3IgMCAqLwogCXJlZ3Byb2MJCW9wcmpvaW4gQktJX0RFRkFVTFQo LSkgQktJX0xPT0tVUF9PUFQocGdfcHJvYyk7CisKKwkvKiBPSUQgb2Ygc3RhdGlzdGljcyBl c3RpbWF0b3IsIG9yIDAgKi8KKwlyZWdwcm9jCQlvcHJzdGF0IEJLSV9ERUZBVUxUKC0pIEJL SV9MT09LVVBfT1BUKHBnX3Byb2MpOwogfSBGb3JtRGF0YV9wZ19vcGVyYXRvcjsKIAogLyog LS0tLS0tLS0tLS0tLS0tLQpAQCAtOTUsNiArOTgsNyBAQCBleHRlcm4gT2JqZWN0QWRkcmVz cyBPcGVyYXRvckNyZWF0ZShjb25zdCBjaGFyICpvcGVyYXRvck5hbWUsCiAJCQkJCQkJCQlM aXN0ICpuZWdhdG9yTmFtZSwKIAkJCQkJCQkJCU9pZCByZXN0cmljdGlvbklkLAogCQkJCQkJ CQkJT2lkIGpvaW5JZCwKKwkJCQkJCQkJCU9pZCBzdGF0aXN0aWNzSWQsCiAJCQkJCQkJCQli b29sIGNhbk1lcmdlLAogCQkJCQkJCQkJYm9vbCBjYW5IYXNoKTsKIApkaWZmIC0tZ2l0IGEv c3JjL2luY2x1ZGUvdXRpbHMvbHN5c2NhY2hlLmggYi9zcmMvaW5jbHVkZS91dGlscy9sc3lz Y2FjaGUuaAppbmRleCBiOGRkMjdkNGE5Ni4uY2MwOGZjNTBhNTAgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL3V0aWxzL2xzeXNjYWNoZS5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL2xz eXNjYWNoZS5oCkBAIC0xMTgsNiArMTE4LDcgQEAgZXh0ZXJuIE9pZAlnZXRfY29tbXV0YXRv cihPaWQgb3Bubyk7CiBleHRlcm4gT2lkCWdldF9uZWdhdG9yKE9pZCBvcG5vKTsKIGV4dGVy biBSZWdQcm9jZWR1cmUgZ2V0X29wcnJlc3QoT2lkIG9wbm8pOwogZXh0ZXJuIFJlZ1Byb2Nl ZHVyZSBnZXRfb3Byam9pbihPaWQgb3Bubyk7CitleHRlcm4gUmVnUHJvY2VkdXJlIGdldF9v cHJzdGF0KE9pZCBvcG5vKTsKIGV4dGVybiBjaGFyICpnZXRfZnVuY19uYW1lKE9pZCBmdW5j aWQpOwogZXh0ZXJuIE9pZAlnZXRfZnVuY19uYW1lc3BhY2UoT2lkIGZ1bmNpZCk7CiBleHRl cm4gT2lkCWdldF9mdW5jX3JldHR5cGUoT2lkIGZ1bmNpZCk7CmRpZmYgLS1naXQgYS9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvb2lkam9pbnMub3V0CmluZGV4IDIxNWViODk5YmUzLi4xMTFlYTk5Y2RhZSAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9vaWRqb2lucy5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9vaWRqb2lucy5vdXQKQEAgLTExMyw2ICsx MTMsNyBAQCBOT1RJQ0U6ICBjaGVja2luZyBwZ19vcGVyYXRvciB7b3BybmVnYXRlfSA9PiBw Z19vcGVyYXRvciB7b2lkfQogTk9USUNFOiAgY2hlY2tpbmcgcGdfb3BlcmF0b3Ige29wcmNv ZGV9ID0+IHBnX3Byb2Mge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBnX29wZXJhdG9yIHtv cHJyZXN0fSA9PiBwZ19wcm9jIHtvaWR9CiBOT1RJQ0U6ICBjaGVja2luZyBwZ19vcGVyYXRv ciB7b3Byam9pbn0gPT4gcGdfcHJvYyB7b2lkfQorTk9USUNFOiAgY2hlY2tpbmcgcGdfb3Bl cmF0b3Ige29wcnN0YXR9ID0+IHBnX3Byb2Mge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBn X29wZmFtaWx5IHtvcGZtZXRob2R9ID0+IHBnX2FtIHtvaWR9CiBOT1RJQ0U6ICBjaGVja2lu ZyBwZ19vcGZhbWlseSB7b3BmbmFtZXNwYWNlfSA9PiBwZ19uYW1lc3BhY2Uge29pZH0KIE5P VElDRTogIGNoZWNraW5nIHBnX29wZmFtaWx5IHtvcGZvd25lcn0gPT4gcGdfYXV0aGlkIHtv aWR9Ci0tIAoyLjI1LjEKCg== --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0002-Add-stats_form_tuple.patch" Content-Disposition: attachment; filename="0002-Add-stats_form_tuple.patch" Content-Transfer-Encoding: base64 RnJvbSAwOGU5OTE1MmYzN2VlYjczYTg3OWI2NDBjOTdlNTI4NjMwNTgxZjNiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFdlZCwgNyBEZWMgMjAxNiAxNjoxMjo1NSArMDMwMApTdWJqZWN0 OiBbUEFUQ0ggMi82XSBBZGQgc3RhdHNfZm9ybV90dXBsZSgpCgotLS0KIHNyYy9iYWNrZW5k L3V0aWxzL2FkdC9zZWxmdW5jcy5jIHwgNTUgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIHNyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNzLmggICAgIHwgMjIgKysrKysrKysr KysrKwogMiBmaWxlcyBjaGFuZ2VkLCA3NyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9h ZHQvc2VsZnVuY3MuYwppbmRleCBkMWRkMDQ5ZjFhZS4uZjUzNGU4NjIwNzkgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9zZWxmdW5jcy5jCkBAIC03OTU0LDMgKzc5NTQsNTggQEAgYnJpbmNvc3Rl c3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9v cF9jb3VudCwKIAogCSppbmRleFBhZ2VzID0gaW5kZXgtPnBhZ2VzOwogfQorCisvKgorICog c3RhdHNfZm9ybV90dXBsZSAtIEZvcm0gcGdfc3RhdGlzdGljIHR1cGxlIGZyb20gU3RhdHNE YXRhLgorICoKKyAqIElmICdkYXRhJyBwYXJhbWV0ZXIgaXMgTlVMTCwgZm9ybSBhbGwtTlVM TCB0dXBsZSAobnVsbGZyYWMgPSAxLjApLgorICovCitIZWFwVHVwbGUKK3N0YXRzX2Zvcm1f dHVwbGUoU3RhdHNEYXRhICpkYXRhKQoreworCVJlbGF0aW9uCXJlbDsKKwlIZWFwVHVwbGUJ dHVwbGU7CisJRGF0dW0JCXZhbHVlc1tOYXR0c19wZ19zdGF0aXN0aWNdOworCWJvb2wJCW51 bGxzW05hdHRzX3BnX3N0YXRpc3RpY107CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkg PCBOYXR0c19wZ19zdGF0aXN0aWM7ICsraSkKKwkJbnVsbHNbaV0gPSBmYWxzZTsKKworCXZh bHVlc1tBbnVtX3BnX3N0YXRpc3RpY19zdGFyZWxpZCAtIDFdID0gT2JqZWN0SWRHZXREYXR1 bShJbnZhbGlkT2lkKTsKKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3RhYXR0bnVtIC0g MV0gPSBJbnQxNkdldERhdHVtKDApOworCXZhbHVlc1tBbnVtX3BnX3N0YXRpc3RpY19zdGFp bmhlcml0IC0gMV0gPSBCb29sR2V0RGF0dW0oZmFsc2UpOworCXZhbHVlc1tBbnVtX3BnX3N0 YXRpc3RpY19zdGFudWxsZnJhYyAtIDFdID0KKwkJCQkJCQkJCUZsb2F0NEdldERhdHVtKGRh dGEgPyBkYXRhLT5udWxsZnJhYyA6IDEuMCk7CisJdmFsdWVzW0FudW1fcGdfc3RhdGlzdGlj X3N0YXdpZHRoIC0gMV0gPQorCQkJCQkJCQkJSW50MzJHZXREYXR1bShkYXRhID8gZGF0YS0+ d2lkdGggOiAwKTsKKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3RhZGlzdGluY3QgLSAx XSA9CisJCQkJCQkJCQlGbG9hdDRHZXREYXR1bShkYXRhID8gZGF0YS0+ZGlzdGluY3QgOiAw KTsKKworCWZvciAoaSA9IDA7IGkgPCBTVEFUSVNUSUNfTlVNX1NMT1RTOyBpKyspCisJewor CQlTdGF0c1Nsb3QgKnNsb3QgPSBkYXRhID8gJmRhdGEtPnNsb3RzW2ldIDogTlVMTDsKKwor CQl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3Rha2luZDEgKyBpIC0gMV0gPQorCQkJCQkJ CQlJbnQxNkdldERhdHVtKHNsb3QgPyBzbG90LT5raW5kIDogMCk7CisKKwkJdmFsdWVzW0Fu dW1fcGdfc3RhdGlzdGljX3N0YW9wMSArIGkgLSAxXSA9CisJCQkJCU9iamVjdElkR2V0RGF0 dW0oc2xvdCA/IHNsb3QtPm9waWQgOiBJbnZhbGlkT2lkKTsKKworCQlpZiAoc2xvdCAmJiBE YXR1bUdldFBvaW50ZXIoc2xvdC0+bnVtYmVycykpCisJCQl2YWx1ZXNbQW51bV9wZ19zdGF0 aXN0aWNfc3RhbnVtYmVyczEgKyBpIC0gMV0gPSBzbG90LT5udW1iZXJzOworCQllbHNlCisJ CQludWxsc1tBbnVtX3BnX3N0YXRpc3RpY19zdGFudW1iZXJzMSArIGkgLSAxXSA9IHRydWU7 CisKKwkJaWYgKHNsb3QgJiYgRGF0dW1HZXRQb2ludGVyKHNsb3QtPnZhbHVlcykpCisJCQl2 YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3RhdmFsdWVzMSArIGkgLSAxXSA9IHNsb3QtPnZh bHVlczsKKwkJZWxzZQorCQkJbnVsbHNbQW51bV9wZ19zdGF0aXN0aWNfc3RhdmFsdWVzMSAr IGkgLSAxXSA9IHRydWU7CisJfQorCisJcmVsID0gdGFibGVfb3BlbihTdGF0aXN0aWNSZWxh dGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKFJl bGF0aW9uR2V0RGVzY3IocmVsKSwgdmFsdWVzLCBudWxscyk7CisJdGFibGVfY2xvc2UocmVs LCBOb0xvY2spOworCisJcmV0dXJuIHR1cGxlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvdXRpbHMvc2VsZnVuY3MuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNzLmgKaW5k ZXggOGYzZDczZWRmYjIuLjQ5ZmMzZDcxN2IxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91 dGlscy9zZWxmdW5jcy5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNzLmgKQEAg LTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgU0VMRlVOQ1NfSAogCiAjaW5jbHVkZSAiYWNjZXNz L2h0dXAuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3N0YXRpc3RpYy5oIgogI2luY2x1ZGUg ImZtZ3IuaCIKICNpbmNsdWRlICJub2Rlcy9wYXRobm9kZXMuaCIKIApAQCAtMTMzLDYgKzEz NCwyNCBAQCB0eXBlZGVmIHN0cnVjdAogCWRvdWJsZQkJbnVtX3NhX3NjYW5zOwkvKiAjIGlu ZGV4c2NhbnMgZnJvbSBTY2FsYXJBcnJheU9wRXhwcnMgKi8KIH0gR2VuZXJpY0Nvc3RzOwog CisvKiBTaW5nbGUgcGdfc3RhdGlzdGljIHNsb3QgKi8KK3R5cGVkZWYgc3RydWN0IFN0YXRz U2xvdAoreworCWludDE2CWtpbmQ7CQkvKiBzdGFraW5kTjogc3RhdGlzdGljIGtpbmQgKFNU QVRJU1RJQ19LSU5EX1hYWCkgKi8KKwlPaWQJCW9waWQ7CQkvKiBzdGFvcE46IGFzc29jaWF0 ZWQgb3BlcmF0b3IsIGlmIG5lZWRlZCAqLworCURhdHVtCW51bWJlcnM7CS8qIHN0YW51bWJl cnNOOiBmbG9hdDQgYXJyYXkgb2YgbnVtYmVycyAqLworCURhdHVtCXZhbHVlczsJCS8qIHN0 YXZhbHVlc046IGFueWFycmF5IG9mIHZhbHVlcyAqLworfSBTdGF0c1Nsb3Q7CisKKy8qIERl Zm9ybWVkIHBnX3N0YXRpc3RpYyB0dXBsZSAqLwordHlwZWRlZiBzdHJ1Y3QgU3RhdHNEYXRh Cit7CisJZmxvYXQ0CQludWxsZnJhYzsJLyogc3RhbnVsbGZyYWM6IGZyYWN0aW9uIG9mIE5V TEwgdmFsdWVzICAqLworCWZsb2F0NAkJZGlzdGluY3Q7CS8qIHN0YWRpc3RpbmN0OiBudW1i ZXIgb2YgZGlzdGluY3Qgbm9uLU5VTEwgdmFsdWVzICovCisJaW50MzIJCXdpZHRoOwkJLyog c3Rhd2lkdGg6IGF2ZXJhZ2Ugd2lkdGggaW4gYnl0ZXMgb2Ygbm9uLU5VTEwgdmFsdWVzICov CisJU3RhdHNTbG90CXNsb3RzW1NUQVRJU1RJQ19OVU1fU0xPVFNdOyAvKiBzbG90cyBmb3Ig ZGlmZmVyZW50IHN0YXRpc3RpYyB0eXBlcyAqLworfSBTdGF0c0RhdGE7CisKIC8qIEhvb2tz IGZvciBwbHVnaW5zIHRvIGdldCBjb250cm9sIHdoZW4gd2UgYXNrIGZvciBzdGF0cyAqLwog dHlwZWRlZiBib29sICgqZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2tfdHlwZSkgKFBsYW5uZXJJ bmZvICpyb290LAogCQkJCQkJCQkJCQkgIFJhbmdlVGJsRW50cnkgKnJ0ZSwKQEAgLTIzMSw2 ICsyNTAsOSBAQCBleHRlcm4gdm9pZCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZv ICpyb290LCBJbmRleFBhdGggKnBhdGgsCiAJCQkJCQkJCWRvdWJsZSBsb29wX2NvdW50LAog CQkJCQkJCQlHZW5lcmljQ29zdHMgKmNvc3RzKTsKIAorZXh0ZXJuIEhlYXBUdXBsZSBzdGF0 c19mb3JtX3R1cGxlKFN0YXRzRGF0YSAqZGF0YSk7CisKKwogLyogRnVuY3Rpb25zIGluIGFy cmF5X3NlbGZ1bmNzLmMgKi8KIAogZXh0ZXJuIFNlbGVjdGl2aXR5IHNjYWxhcmFycmF5c2Vs X2NvbnRhaW5tZW50KFBsYW5uZXJJbmZvICpyb290LAotLSAKMi4yNS4xCgo= --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0003-Add-symbolic-names-for-some-jsonb-operators.patch" Content-Disposition: attachment; filename="0003-Add-symbolic-names-for-some-jsonb-operators.patch" Content-Transfer-Encoding: base64 RnJvbSA0NzM1ZDZkZTllZDFmOGY5M2Q5NTkyZDlmZmExZjY2MmZjZGFmYmU3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFNhdCwgMTIgTm92IDIwMTYgMTg6NTk6NDMgKzAzMDAKU3ViamVj dDogW1BBVENIIDMvNl0gQWRkIHN5bWJvbGljIG5hbWVzIGZvciBzb21lIGpzb25iIG9wZXJh dG9ycwoKLS0tCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdCB8IDQ1ICsr KysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjYgaW5zZXJ0 aW9ucygrKSwgMTkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19vcGVyYXRvci5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9y LmRhdAppbmRleCBiYzVmODIxM2YzYS4uOGUwZTY1YWQyNzUgMTAwNjQ0Ci0tLSBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfb3BlcmF0b3IuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfb3BlcmF0b3IuZGF0CkBAIC0yMDY3LDcgKzIwNjcsNyBAQAogeyBvaWQgPT4gJzE3 NTEnLCBkZXNjciA9PiAnbmVnYXRlJywKICAgb3BybmFtZSA9PiAnLScsIG9wcmtpbmQgPT4g J2wnLCBvcHJsZWZ0ID0+ICcwJywgb3BycmlnaHQgPT4gJ251bWVyaWMnLAogICBvcHJyZXN1 bHQgPT4gJ251bWVyaWMnLCBvcHJjb2RlID0+ICdudW1lcmljX3VtaW51cycgfSwKLXsgb2lk ID0+ICcxNzUyJywgZGVzY3IgPT4gJ2VxdWFsJywKK3sgb2lkID0+ICcxNzUyJywgb2lkX3N5 bWJvbCA9PiAnTnVtZXJpY0VxT3BlcmF0b3InLCBkZXNjciA9PiAnZXF1YWwnLAogICBvcHJu YW1lID0+ICc9Jywgb3ByY2FubWVyZ2UgPT4gJ3QnLCBvcHJjYW5oYXNoID0+ICd0Jywgb3By bGVmdCA9PiAnbnVtZXJpYycsCiAgIG9wcnJpZ2h0ID0+ICdudW1lcmljJywgb3BycmVzdWx0 ID0+ICdib29sJywgb3ByY29tID0+ICc9KG51bWVyaWMsbnVtZXJpYyknLAogICBvcHJuZWdh dGUgPT4gJzw+KG51bWVyaWMsbnVtZXJpYyknLCBvcHJjb2RlID0+ICdudW1lcmljX2VxJywK QEAgLTIwNzcsNyArMjA3Nyw3IEBACiAgIG9wcnJlc3VsdCA9PiAnYm9vbCcsIG9wcmNvbSA9 PiAnPD4obnVtZXJpYyxudW1lcmljKScsCiAgIG9wcm5lZ2F0ZSA9PiAnPShudW1lcmljLG51 bWVyaWMpJywgb3ByY29kZSA9PiAnbnVtZXJpY19uZScsCiAgIG9wcnJlc3QgPT4gJ25lcXNl bCcsIG9wcmpvaW4gPT4gJ25lcWpvaW5zZWwnIH0sCi17IG9pZCA9PiAnMTc1NCcsIGRlc2Ny ID0+ICdsZXNzIHRoYW4nLAoreyBvaWQgPT4gJzE3NTQnLCBvaWRfc3ltYm9sID0+ICdOdW1l cmljTHRPcGVyYXRvcicsIGRlc2NyID0+ICdsZXNzIHRoYW4nLAogICBvcHJuYW1lID0+ICc8 Jywgb3BybGVmdCA9PiAnbnVtZXJpYycsIG9wcnJpZ2h0ID0+ICdudW1lcmljJywKICAgb3By cmVzdWx0ID0+ICdib29sJywgb3ByY29tID0+ICc+KG51bWVyaWMsbnVtZXJpYyknLAogICBv cHJuZWdhdGUgPT4gJz49KG51bWVyaWMsbnVtZXJpYyknLCBvcHJjb2RlID0+ICdudW1lcmlj X2x0JywKQEAgLTMxNzIsNzAgKzMxNzIsNzcgQEAKIHsgb2lkID0+ICczOTY3JywgZGVzY3Ig PT4gJ2dldCB2YWx1ZSBmcm9tIGpzb24gYXMgdGV4dCB3aXRoIHBhdGggZWxlbWVudHMnLAog ICBvcHJuYW1lID0+ICcjPj4nLCBvcHJsZWZ0ID0+ICdqc29uJywgb3BycmlnaHQgPT4gJ190 ZXh0Jywgb3BycmVzdWx0ID0+ICd0ZXh0JywKICAgb3ByY29kZSA9PiAnanNvbl9leHRyYWN0 X3BhdGhfdGV4dCcgfSwKLXsgb2lkID0+ICczMjExJywgZGVzY3IgPT4gJ2dldCBqc29uYiBv YmplY3QgZmllbGQnLAoreyBvaWQgPT4gJzMyMTEnLCBvaWRfc3ltYm9sID0+ICdKc29uYk9i amVjdEZpZWxkT3BlcmF0b3InLAorICBkZXNjciA9PiAnZ2V0IGpzb25iIG9iamVjdCBmaWVs ZCcsCiAgIG9wcm5hbWUgPT4gJy0+Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9 PiAndGV4dCcsIG9wcnJlc3VsdCA9PiAnanNvbmInLAogICBvcHJjb2RlID0+ICdqc29uYl9v YmplY3RfZmllbGQnIH0sCi17IG9pZCA9PiAnMzQ3NycsIGRlc2NyID0+ICdnZXQganNvbmIg b2JqZWN0IGZpZWxkIGFzIHRleHQnLAoreyBvaWQgPT4gJzM0NzcnLCBvaWRfc3ltYm9sID0+ ICdKc29uYk9iamVjdEZpZWxkVGV4dE9wZXJhdG9yJywKKyAgZGVzY3IgPT4gJ2dldCBqc29u YiBvYmplY3QgZmllbGQgYXMgdGV4dCcsCiAgIG9wcm5hbWUgPT4gJy0+PicsIG9wcmxlZnQg PT4gJ2pzb25iJywgb3BycmlnaHQgPT4gJ3RleHQnLCBvcHJyZXN1bHQgPT4gJ3RleHQnLAog ICBvcHJjb2RlID0+ICdqc29uYl9vYmplY3RfZmllbGRfdGV4dCcgfSwKLXsgb2lkID0+ICcz MjEyJywgZGVzY3IgPT4gJ2dldCBqc29uYiBhcnJheSBlbGVtZW50JywKK3sgb2lkID0+ICcz MjEyJywgb2lkX3N5bWJvbCA9PiAnSnNvbmJBcnJheUVsZW1lbnRPcGVyYXRvcicsCisgIGRl c2NyID0+ICdnZXQganNvbmIgYXJyYXkgZWxlbWVudCcsCiAgIG9wcm5hbWUgPT4gJy0+Jywg b3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnaW50NCcsIG9wcnJlc3VsdCA9PiAn anNvbmInLAogICBvcHJjb2RlID0+ICdqc29uYl9hcnJheV9lbGVtZW50JyB9LAoteyBvaWQg PT4gJzM0ODEnLCBkZXNjciA9PiAnZ2V0IGpzb25iIGFycmF5IGVsZW1lbnQgYXMgdGV4dCcs Cit7IG9pZCA9PiAnMzQ4MScsIG9pZF9zeW1ib2wgPT4gJ0pzb25iQXJyYXlFbGVtZW50VGV4 dE9wZXJhdG9yJywKKyAgZGVzY3IgPT4gJ2dldCBqc29uYiBhcnJheSBlbGVtZW50IGFzIHRl eHQnLAogICBvcHJuYW1lID0+ICctPj4nLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0 ID0+ICdpbnQ0Jywgb3BycmVzdWx0ID0+ICd0ZXh0JywKICAgb3ByY29kZSA9PiAnanNvbmJf YXJyYXlfZWxlbWVudF90ZXh0JyB9LAoteyBvaWQgPT4gJzMyMTMnLCBkZXNjciA9PiAnZ2V0 IHZhbHVlIGZyb20ganNvbmIgd2l0aCBwYXRoIGVsZW1lbnRzJywKK3sgb2lkID0+ICczMjEz Jywgb2lkX3N5bWJvbCA9PiAnSnNvbmJFeHRyYWN0UGF0aE9wZXJhdG9yJywKKyAgZGVzY3Ig PT4gJ2dldCB2YWx1ZSBmcm9tIGpzb25iIHdpdGggcGF0aCBlbGVtZW50cycsCiAgIG9wcm5h bWUgPT4gJyM+Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnX3RleHQnLAog ICBvcHJyZXN1bHQgPT4gJ2pzb25iJywgb3ByY29kZSA9PiAnanNvbmJfZXh0cmFjdF9wYXRo JyB9LAoteyBvaWQgPT4gJzMyMDYnLCBkZXNjciA9PiAnZ2V0IHZhbHVlIGZyb20ganNvbmIg YXMgdGV4dCB3aXRoIHBhdGggZWxlbWVudHMnLAoreyBvaWQgPT4gJzMyMDYnLCBvaWRfc3lt Ym9sID0+ICdKc29uYkV4dHJhY3RQYXRoVGV4dE9wZXJhdG9yJywKKyAgZGVzY3IgPT4gJ2dl dCB2YWx1ZSBmcm9tIGpzb25iIGFzIHRleHQgd2l0aCBwYXRoIGVsZW1lbnRzJywKICAgb3By bmFtZSA9PiAnIz4+Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnX3RleHQn LAogICBvcHJyZXN1bHQgPT4gJ3RleHQnLCBvcHJjb2RlID0+ICdqc29uYl9leHRyYWN0X3Bh dGhfdGV4dCcgfSwKLXsgb2lkID0+ICczMjQwJywgZGVzY3IgPT4gJ2VxdWFsJywKK3sgb2lk ID0+ICczMjQwJywgb2lkX3N5bWJvbCA9PiAnSnNvbmJFcU9wZXJhdG9yJywgZGVzY3IgPT4g J2VxdWFsJywKICAgb3BybmFtZSA9PiAnPScsIG9wcmNhbm1lcmdlID0+ICd0Jywgb3ByY2Fu aGFzaCA9PiAndCcsIG9wcmxlZnQgPT4gJ2pzb25iJywKICAgb3BycmlnaHQgPT4gJ2pzb25i Jywgb3BycmVzdWx0ID0+ICdib29sJywgb3ByY29tID0+ICc9KGpzb25iLGpzb25iKScsCiAg IG9wcm5lZ2F0ZSA9PiAnPD4oanNvbmIsanNvbmIpJywgb3ByY29kZSA9PiAnanNvbmJfZXEn LCBvcHJyZXN0ID0+ICdlcXNlbCcsCiAgIG9wcmpvaW4gPT4gJ2Vxam9pbnNlbCcgfSwKLXsg b2lkID0+ICczMjQxJywgZGVzY3IgPT4gJ25vdCBlcXVhbCcsCit7IG9pZCA9PiAnMzI0MScs IG9pZF9zeW1ib2wgPT4gJ0pzb25iTmVPcGVyYXRvcicsIGRlc2NyID0+ICdub3QgZXF1YWwn LAogICBvcHJuYW1lID0+ICc8PicsIG9wcmxlZnQgPT4gJ2pzb25iJywgb3BycmlnaHQgPT4g J2pzb25iJywgb3BycmVzdWx0ID0+ICdib29sJywKICAgb3ByY29tID0+ICc8Pihqc29uYixq c29uYiknLCBvcHJuZWdhdGUgPT4gJz0oanNvbmIsanNvbmIpJywKICAgb3ByY29kZSA9PiAn anNvbmJfbmUnLCBvcHJyZXN0ID0+ICduZXFzZWwnLCBvcHJqb2luID0+ICduZXFqb2luc2Vs JyB9LAoteyBvaWQgPT4gJzMyNDInLCBkZXNjciA9PiAnbGVzcyB0aGFuJywKK3sgb2lkID0+ ICczMjQyJywgb2lkX3N5bWJvbCA9PiAnSnNvbmJMdE9wZXJhdG9yJywgZGVzY3IgPT4gJ2xl c3MgdGhhbicsCiAgIG9wcm5hbWUgPT4gJzwnLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJp Z2h0ID0+ICdqc29uYicsIG9wcnJlc3VsdCA9PiAnYm9vbCcsCiAgIG9wcmNvbSA9PiAnPihq c29uYixqc29uYiknLCBvcHJuZWdhdGUgPT4gJz49KGpzb25iLGpzb25iKScsCiAgIG9wcmNv ZGUgPT4gJ2pzb25iX2x0Jywgb3BycmVzdCA9PiAnc2NhbGFybHRzZWwnLAogICBvcHJqb2lu ID0+ICdzY2FsYXJsdGpvaW5zZWwnIH0sCi17IG9pZCA9PiAnMzI0MycsIGRlc2NyID0+ICdn cmVhdGVyIHRoYW4nLAoreyBvaWQgPT4gJzMyNDMnLCBvaWRfc3ltYm9sID0+ICdKc29uYkd0 T3BlcmF0b3InLCBkZXNjciA9PiAnZ3JlYXRlciB0aGFuJywKICAgb3BybmFtZSA9PiAnPics IG9wcmxlZnQgPT4gJ2pzb25iJywgb3BycmlnaHQgPT4gJ2pzb25iJywgb3BycmVzdWx0ID0+ ICdib29sJywKICAgb3ByY29tID0+ICc8KGpzb25iLGpzb25iKScsIG9wcm5lZ2F0ZSA9PiAn PD0oanNvbmIsanNvbmIpJywKICAgb3ByY29kZSA9PiAnanNvbmJfZ3QnLCBvcHJyZXN0ID0+ ICdzY2FsYXJndHNlbCcsCiAgIG9wcmpvaW4gPT4gJ3NjYWxhcmd0am9pbnNlbCcgfSwKLXsg b2lkID0+ICczMjQ0JywgZGVzY3IgPT4gJ2xlc3MgdGhhbiBvciBlcXVhbCcsCit7IG9pZCA9 PiAnMzI0NCcsIG9pZF9zeW1ib2wgPT4gJ0pzb25iTGVPcGVyYXRvcicsIGRlc2NyID0+ICds ZXNzIHRoYW4gb3IgZXF1YWwnLAogICBvcHJuYW1lID0+ICc8PScsIG9wcmxlZnQgPT4gJ2pz b25iJywgb3BycmlnaHQgPT4gJ2pzb25iJywgb3BycmVzdWx0ID0+ICdib29sJywKICAgb3By Y29tID0+ICc+PShqc29uYixqc29uYiknLCBvcHJuZWdhdGUgPT4gJz4oanNvbmIsanNvbmIp JywKICAgb3ByY29kZSA9PiAnanNvbmJfbGUnLCBvcHJyZXN0ID0+ICdzY2FsYXJsZXNlbCcs CiAgIG9wcmpvaW4gPT4gJ3NjYWxhcmxlam9pbnNlbCcgfSwKLXsgb2lkID0+ICczMjQ1Jywg ZGVzY3IgPT4gJ2dyZWF0ZXIgdGhhbiBvciBlcXVhbCcsCit7IG9pZCA9PiAnMzI0NScsIG9p ZF9zeW1ib2wgPT4gJ0pzb25iR2VPcGVyYXRvcicsCisgIGRlc2NyID0+ICdncmVhdGVyIHRo YW4gb3IgZXF1YWwnLAogICBvcHJuYW1lID0+ICc+PScsIG9wcmxlZnQgPT4gJ2pzb25iJywg b3BycmlnaHQgPT4gJ2pzb25iJywgb3BycmVzdWx0ID0+ICdib29sJywKICAgb3ByY29tID0+ ICc8PShqc29uYixqc29uYiknLCBvcHJuZWdhdGUgPT4gJzwoanNvbmIsanNvbmIpJywKICAg b3ByY29kZSA9PiAnanNvbmJfZ2UnLCBvcHJyZXN0ID0+ICdzY2FsYXJnZXNlbCcsCiAgIG9w cmpvaW4gPT4gJ3NjYWxhcmdlam9pbnNlbCcgfSwKLXsgb2lkID0+ICczMjQ2JywgZGVzY3Ig PT4gJ2NvbnRhaW5zJywKK3sgb2lkID0+ICczMjQ2Jywgb2lkX3N5bWJvbCA9PiAnSnNvbmJD b250YWluc09wZXJhdG9yJywgZGVzY3IgPT4gJ2NvbnRhaW5zJywKICAgb3BybmFtZSA9PiAn QD4nLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ICdqc29uYicsIG9wcnJlc3Vs dCA9PiAnYm9vbCcsCiAgIG9wcmNvbSA9PiAnPEAoanNvbmIsanNvbmIpJywgb3ByY29kZSA9 PiAnanNvbmJfY29udGFpbnMnLAogICBvcHJyZXN0ID0+ICdtYXRjaGluZ3NlbCcsIG9wcmpv aW4gPT4gJ21hdGNoaW5nam9pbnNlbCcgfSwKLXsgb2lkID0+ICczMjQ3JywgZGVzY3IgPT4g J2tleSBleGlzdHMnLAoreyBvaWQgPT4gJzMyNDcnLCBvaWRfc3ltYm9sID0+ICdKc29uYkV4 aXN0c09wZXJhdG9yJywgZGVzY3IgPT4gJ2tleSBleGlzdHMnLAogICBvcHJuYW1lID0+ICc/ Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAndGV4dCcsIG9wcnJlc3VsdCA9 PiAnYm9vbCcsCiAgIG9wcmNvZGUgPT4gJ2pzb25iX2V4aXN0cycsIG9wcnJlc3QgPT4gJ21h dGNoaW5nc2VsJywKICAgb3Byam9pbiA9PiAnbWF0Y2hpbmdqb2luc2VsJyB9LAoteyBvaWQg PT4gJzMyNDgnLCBkZXNjciA9PiAnYW55IGtleSBleGlzdHMnLAoreyBvaWQgPT4gJzMyNDgn LCBvaWRfc3ltYm9sID0+ICdKc29uYkV4aXN0c0FueU9wZXJhdG9yJywgZGVzY3IgPT4gJ2Fu eSBrZXkgZXhpc3RzJywKICAgb3BybmFtZSA9PiAnP3wnLCBvcHJsZWZ0ID0+ICdqc29uYics IG9wcnJpZ2h0ID0+ICdfdGV4dCcsIG9wcnJlc3VsdCA9PiAnYm9vbCcsCiAgIG9wcmNvZGUg PT4gJ2pzb25iX2V4aXN0c19hbnknLCBvcHJyZXN0ID0+ICdtYXRjaGluZ3NlbCcsCiAgIG9w cmpvaW4gPT4gJ21hdGNoaW5nam9pbnNlbCcgfSwKLXsgb2lkID0+ICczMjQ5JywgZGVzY3Ig PT4gJ2FsbCBrZXlzIGV4aXN0JywKK3sgb2lkID0+ICczMjQ5Jywgb2lkX3N5bWJvbCA9PiAn SnNvbmJFeGlzdHNBbGxPcGVyYXRvcicsIGRlc2NyID0+ICdhbGwga2V5cyBleGlzdCcsCiAg IG9wcm5hbWUgPT4gJz8mJywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnX3Rl eHQnLCBvcHJyZXN1bHQgPT4gJ2Jvb2wnLAogICBvcHJjb2RlID0+ICdqc29uYl9leGlzdHNf YWxsJywgb3BycmVzdCA9PiAnbWF0Y2hpbmdzZWwnLAogICBvcHJqb2luID0+ICdtYXRjaGlu Z2pvaW5zZWwnIH0sCi17IG9pZCA9PiAnMzI1MCcsIGRlc2NyID0+ICdpcyBjb250YWluZWQg YnknLAoreyBvaWQgPT4gJzMyNTAnLCBvaWRfc3ltYm9sID0+ICdKc29uYkNvbnRhaW5lZE9w ZXJhdG9yJywgZGVzY3IgPT4gJ2lzIGNvbnRhaW5lZCBieScsCiAgIG9wcm5hbWUgPT4gJzxA Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnanNvbmInLCBvcHJyZXN1bHQg PT4gJ2Jvb2wnLAogICBvcHJjb20gPT4gJ0A+KGpzb25iLGpzb25iKScsIG9wcmNvZGUgPT4g J2pzb25iX2NvbnRhaW5lZCcsCiAgIG9wcnJlc3QgPT4gJ21hdGNoaW5nc2VsJywgb3Byam9p biA9PiAnbWF0Y2hpbmdqb2luc2VsJyB9LAotLSAKMi4yNS4xCgo= --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0004-Add-helper-jsonb-functions-and-macros.patch" Content-Disposition: attachment; filename="0004-Add-helper-jsonb-functions-and-macros.patch" Content-Transfer-Encoding: base64 RnJvbSA5OGZlNDUxNWM5NDk0ZWQ2ZjQxZTQwYzkwOWIxNDU4MDE3MDQ5ODMyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IEZyaSwgMTYgRGVjIDIwMTYgMTc6MTY6NDcgKzAzMDAKU3ViamVj dDogW1BBVENIIDQvNl0gQWRkIGhlbHBlciBqc29uYiBmdW5jdGlvbnMgYW5kIG1hY3JvcwoK LS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdXRpbC5jIHwgIDI3ICsrKysrCiBz cmMvYmFja2VuZC91dGlscy9hZHQvanNvbmZ1bmNzLmMgIHwgIDEwICstCiBzcmMvaW5jbHVk ZS91dGlscy9qc29uYi5oICAgICAgICAgIHwgMTY1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKystCiAzIGZpbGVzIGNoYW5nZWQsIDE5NSBpbnNlcnRpb25zKCspLCA3IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uYl91dGlsLmMg Yi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdXRpbC5jCmluZGV4IDI5MWZiNzIyZTJk Li45Yzc4YmYzZTkwMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25i X3V0aWwuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdXRpbC5jCkBAIC0z ODgsNiArMzg4LDIyIEBAIGZpbmRKc29uYlZhbHVlRnJvbUNvbnRhaW5lcihKc29uYkNvbnRh aW5lciAqY29udGFpbmVyLCB1aW50MzIgZmxhZ3MsCiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8q CisgKiBmaW5kSnNvbmJWYWx1ZUZyb21Db250YWluZXIoKSB3cmFwcGVyIHRoYXQgc2V0cyB1 cCBKc29uYlZhbHVlIGtleSBzdHJpbmcuCisgKi8KK0pzb25iVmFsdWUgKgorZmluZEpzb25i VmFsdWVGcm9tQ29udGFpbmVyTGVuKEpzb25iQ29udGFpbmVyICpjb250YWluZXIsIHVpbnQz MiBmbGFncywKKwkJCQkJCQkgICBjb25zdCBjaGFyICprZXksIHVpbnQzMiBrZXlsZW4pCit7 CisJSnNvbmJWYWx1ZQlrOworCisJay50eXBlID0gamJ2U3RyaW5nOworCWsudmFsLnN0cmlu Zy52YWwgPSBrZXk7CisJay52YWwuc3RyaW5nLmxlbiA9IGtleWxlbjsKKworCXJldHVybiBm aW5kSnNvbmJWYWx1ZUZyb21Db250YWluZXIoY29udGFpbmVyLCBmbGFncywgJmspOworfQor CiAvKgogICogRmluZCB2YWx1ZSBieSBrZXkgaW4gSnNvbmIgb2JqZWN0IGFuZCBmZXRjaCBp dCBpbnRvICdyZXMnLCB3aGljaCBpcyBhbHNvCiAgKiByZXR1cm5lZC4KQEAgLTYwMiw2ICs2 MTgsMTcgQEAgcHVzaEpzb25iVmFsdWUoSnNvbmJQYXJzZVN0YXRlICoqcHN0YXRlLCBKc29u Ykl0ZXJhdG9yVG9rZW4gc2VxLAogCQlyZXR1cm4gcHVzaEpzb25iVmFsdWVTY2FsYXIocHN0 YXRlLCBzZXEsIGpidmFsKTsKIAl9CiAKKwkvKgorCSAqIFhYWCBJJ20gbm90IHF1aXRlIHN1 cmUgd2h5IHdlIGFjdHVhbGx5IGRvIHRoaXM/IFdoeSBkbyB3ZSBuZWVkIHRvIGNoYW5nZQor CSAqIGhvdyBKc29uYlZhbHVlIGlzIGNvbnZlcnRlZCB0byBKc29uYiBmb3IgdGhlIHN0YXRp c3RpY3MgcGF0Y2g/CisJICovCisJLyogcHVzaCB2YWx1ZSBmcm9tIHNjYWxhciBjb250YWlu ZXIgd2l0aG91dCBpdHMgZW5jbG9zaW5nIGFycmF5ICovCisJaWYgKCpwc3RhdGUgJiYgSnNv bmJFeHRyYWN0U2NhbGFyKGpidmFsLT52YWwuYmluYXJ5LmRhdGEsICZ2KSkKKwl7CisJCUFz c2VydChJc0FKc29uYlNjYWxhcigmdikpOworCQlyZXR1cm4gcHVzaEpzb25iVmFsdWVTY2Fs YXIocHN0YXRlLCBzZXEsICZ2KTsKKwl9CisKIAkvKiB1bnBhY2sgdGhlIGJpbmFyeSBhbmQg YWRkIGVhY2ggcGllY2UgdG8gdGhlIHBzdGF0ZSAqLwogCWl0ID0gSnNvbmJJdGVyYXRvcklu aXQoamJ2YWwtPnZhbC5iaW5hcnkuZGF0YSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9qc29uZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uZnVu Y3MuYwppbmRleCAwMjczZjg4M2Q0Zi4uYWMwMzA3MjgzOWIgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9qc29uZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9h ZHQvanNvbmZ1bmNzLmMKQEAgLTUzNzEsNyArNTM3MSw4IEBAIGl0ZXJhdGVfanNvbmJfdmFs dWVzKEpzb25iICpqYiwgdWludDMyIGZsYWdzLCB2b2lkICpzdGF0ZSwKIAkJaWYgKHR5cGUg PT0gV0pCX0tFWSkKIAkJewogCQkJaWYgKGZsYWdzICYganRpS2V5KQotCQkJCWFjdGlvbihz dGF0ZSwgdi52YWwuc3RyaW5nLnZhbCwgdi52YWwuc3RyaW5nLmxlbik7CisJCQkJYWN0aW9u KHN0YXRlLCB1bmNvbnN0aWZ5KGNoYXIgKiwgdi52YWwuc3RyaW5nLnZhbCksCisJCQkJCSAg IHYudmFsLnN0cmluZy5sZW4pOwogCiAJCQljb250aW51ZTsKIAkJfQpAQCAtNTM4Niw3ICs1 Mzg3LDggQEAgaXRlcmF0ZV9qc29uYl92YWx1ZXMoSnNvbmIgKmpiLCB1aW50MzIgZmxhZ3Ms IHZvaWQgKnN0YXRlLAogCQl7CiAJCQljYXNlIGpidlN0cmluZzoKIAkJCQlpZiAoZmxhZ3Mg JiBqdGlTdHJpbmcpCi0JCQkJCWFjdGlvbihzdGF0ZSwgdi52YWwuc3RyaW5nLnZhbCwgdi52 YWwuc3RyaW5nLmxlbik7CisJCQkJCWFjdGlvbihzdGF0ZSwgdW5jb25zdGlmeShjaGFyICos IHYudmFsLnN0cmluZy52YWwpLAorCQkJCQkJICAgdi52YWwuc3RyaW5nLmxlbik7CiAJCQkJ YnJlYWs7CiAJCQljYXNlIGpidk51bWVyaWM6CiAJCQkJaWYgKGZsYWdzICYganRpTnVtZXJp YykKQEAgLTU1MDgsNyArNTUxMCw5IEBAIHRyYW5zZm9ybV9qc29uYl9zdHJpbmdfdmFsdWVz KEpzb25iICpqc29uYiwgdm9pZCAqYWN0aW9uX3N0YXRlLAogCXsKIAkJaWYgKCh0eXBlID09 IFdKQl9WQUxVRSB8fCB0eXBlID09IFdKQl9FTEVNKSAmJiB2LnR5cGUgPT0gamJ2U3RyaW5n KQogCQl7Ci0JCQlvdXQgPSB0cmFuc2Zvcm1fYWN0aW9uKGFjdGlvbl9zdGF0ZSwgdi52YWwu c3RyaW5nLnZhbCwgdi52YWwuc3RyaW5nLmxlbik7CisJCQlvdXQgPSB0cmFuc2Zvcm1fYWN0 aW9uKGFjdGlvbl9zdGF0ZSwKKwkJCQkJCQkJICAgdW5jb25zdGlmeShjaGFyICosIHYudmFs LnN0cmluZy52YWwpLAorCQkJCQkJCQkgICB2LnZhbC5zdHJpbmcubGVuKTsKIAkJCXYudmFs LnN0cmluZy52YWwgPSBWQVJEQVRBX0FOWShvdXQpOwogCQkJdi52YWwuc3RyaW5nLmxlbiA9 IFZBUlNJWkVfQU5ZX0VYSERSKG91dCk7CiAJCQlyZXMgPSBwdXNoSnNvbmJWYWx1ZSgmc3Qs IHR5cGUsIHR5cGUgPCBXSkJfQkVHSU5fQVJSQVkgPyAmdiA6IE5VTEwpOwpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvdXRpbHMvanNvbmIuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL2pzb25i LmgKaW5kZXggNGNiZTZlZGYyMTguLmUxZWQ3MTJmMjZjIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS91dGlscy9qc29uYi5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL2pzb25iLmgKQEAg LTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgImxpYi9zdHJpbmdpbmZvLmgiCiAjaW5jbHVk ZSAidXRpbHMvYXJyYXkuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1 ZGUgInV0aWxzL251bWVyaWMuaCIKIAogLyogVG9rZW5zIHVzZWQgd2hlbiBzZXF1ZW50aWFs bHkgcHJvY2Vzc2luZyBhIGpzb25iIHZhbHVlICovCkBAIC0yMjksOCArMjMwLDcgQEAgdHlw ZWRlZiBzdHJ1Y3QKICNkZWZpbmUgSkJfUk9PVF9JU19PQkpFQ1QoamJwXykgKCgqKHVpbnQz MiAqKSBWQVJEQVRBKGpicF8pICYgSkJfRk9CSkVDVCkgIT0gMCkKICNkZWZpbmUgSkJfUk9P VF9JU19BUlJBWShqYnBfKQkoKCoodWludDMyICopIFZBUkRBVEEoamJwXykgJiBKQl9GQVJS QVkpICE9IDApCiAKLQotZW51bSBqYnZUeXBlCit0eXBlZGVmIGVudW0gamJ2VHlwZQogewog CS8qIFNjYWxhciB0eXBlcyAqLwogCWpidk51bGwgPSAweDAsCkBAIC0yNTAsNyArMjUwLDcg QEAgZW51bSBqYnZUeXBlCiAJICogaW50byBKU09OIHN0cmluZ3Mgd2hlbiBvdXRwdXR0ZWQg dG8ganNvbi9qc29uYi4KIAkgKi8KIAlqYnZEYXRldGltZSA9IDB4MjAsCi19OworfSBKc29u YlZhbHVlVHlwZTsKIAogLyoKICAqIEpzb25iVmFsdWU6CUluLW1lbW9yeSByZXByZXNlbnRh dGlvbiBvZiBKc29uYi4gIFRoaXMgaXMgYSBjb252ZW5pZW50CkBAIC0yNjksNyArMjY5LDcg QEAgc3RydWN0IEpzb25iVmFsdWUKIAkJc3RydWN0CiAJCXsKIAkJCWludAkJCWxlbjsKLQkJ CWNoYXIJICAgKnZhbDsJLyogTm90IG5lY2Vzc2FyaWx5IG51bGwtdGVybWluYXRlZCAqLwor CQkJY29uc3QgY2hhciAqdmFsOwkvKiBOb3QgbmVjZXNzYXJpbHkgbnVsbC10ZXJtaW5hdGVk ICovCiAJCX0JCQlzdHJpbmc7CQkvKiBTdHJpbmcgcHJpbWl0aXZlIHR5cGUgKi8KIAogCQlz dHJ1Y3QKQEAgLTM4Miw2ICszODIsMTAgQEAgZXh0ZXJuIGludAljb21wYXJlSnNvbmJDb250 YWluZXJzKEpzb25iQ29udGFpbmVyICphLCBKc29uYkNvbnRhaW5lciAqYik7CiBleHRlcm4g SnNvbmJWYWx1ZSAqZmluZEpzb25iVmFsdWVGcm9tQ29udGFpbmVyKEpzb25iQ29udGFpbmVy ICpzaGVhZGVyLAogCQkJCQkJCQkJCQkgICB1aW50MzIgZmxhZ3MsCiAJCQkJCQkJCQkJCSAg IEpzb25iVmFsdWUgKmtleSk7CitleHRlcm4gSnNvbmJWYWx1ZSAqZmluZEpzb25iVmFsdWVG cm9tQ29udGFpbmVyTGVuKEpzb25iQ29udGFpbmVyICpjb250YWluZXIsCisJCQkJCQkJCQkJ CQkgIHVpbnQzMiBmbGFncywKKwkJCQkJCQkJCQkJCSAgY29uc3QgY2hhciAqa2V5LAorCQkJ CQkJCQkJCQkJICB1aW50MzIga2V5bGVuKTsKIGV4dGVybiBKc29uYlZhbHVlICpnZXRLZXlK c29uVmFsdWVGcm9tQ29udGFpbmVyKEpzb25iQ29udGFpbmVyICpjb250YWluZXIsCiAJCQkJ CQkJCQkJCQljb25zdCBjaGFyICprZXlWYWwsIGludCBrZXlMZW4sCiAJCQkJCQkJCQkJCQlK c29uYlZhbHVlICpyZXMpOwpAQCAtNDEyLDQgKzQxNiwxNTcgQEAgZXh0ZXJuIERhdHVtIGpz b25iX3NldF9lbGVtZW50KEpzb25iICpqYiwgRGF0dW0gKnBhdGgsIGludCBwYXRoX2xlbiwK IAkJCQkJCQkgICBKc29uYlZhbHVlICpuZXd2YWwpOwogZXh0ZXJuIERhdHVtIGpzb25iX2dl dF9lbGVtZW50KEpzb25iICpqYiwgRGF0dW0gKnBhdGgsIGludCBucGF0aCwKIAkJCQkJCQkg ICBib29sICppc251bGwsIGJvb2wgYXNfdGV4dCk7CisKKy8qCisgKiBYWFggTm90IHN1cmUg d2Ugd2FudCB0byBhZGQgdGhlc2UgZnVuY3Rpb25zIHRvIGpzb25iLmgsIHdoaWNoIGlzIHRo ZQorICogcHVibGljIEFQSS4gTWF5YmUgaXQgYmVsb25ncyByYXRoZXIgdG8ganNvbmJfdHlw YW5hbHl6ZS5jIG9yIGVsc2V3aGVyZSwKKyAqIGNsb3NlciB0byBob3cgaXQncyB1c2VkPwor ICovCisKKy8qIGhlbHBlciBpbmxpbmUgZnVuY3Rpb25zIGZvciBKc29uYlZhbHVlIGluaXRp YWxpemF0aW9uICovCitzdGF0aWMgaW5saW5lIEpzb25iVmFsdWUgKgorSnNvblZhbHVlSW5p dE9iamVjdChKc29uYlZhbHVlICp2YWwsIGludCBuUGFpcnMsIGludCBuUGFpcnNBbGxvY2F0 ZWQpCit7CisJdmFsLT50eXBlID0gamJ2T2JqZWN0OworCXZhbC0+dmFsLm9iamVjdC5uUGFp cnMgPSBuUGFpcnM7CisJdmFsLT52YWwub2JqZWN0LnBhaXJzID0gblBhaXJzQWxsb2NhdGVk ID8KKwkJCQkJCQlwYWxsb2Moc2l6ZW9mKEpzb25iUGFpcikgKiBuUGFpcnNBbGxvY2F0ZWQp IDogTlVMTDsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgSnNvbmJWYWx1 ZSAqCitKc29uVmFsdWVJbml0QXJyYXkoSnNvbmJWYWx1ZSAqdmFsLCBpbnQgbkVsZW1zLCBp bnQgbkVsZW1zQWxsb2NhdGVkLAorCQkJCSAgIGJvb2wgcmF3U2NhbGFyKQoreworCXZhbC0+ dHlwZSA9IGpidkFycmF5OworCXZhbC0+dmFsLmFycmF5Lm5FbGVtcyA9IG5FbGVtczsKKwl2 YWwtPnZhbC5hcnJheS5lbGVtcyA9IG5FbGVtc0FsbG9jYXRlZCA/CisJCQkJCQkJcGFsbG9j KHNpemVvZihKc29uYlZhbHVlKSAqIG5FbGVtc0FsbG9jYXRlZCkgOiBOVUxMOworCXZhbC0+ dmFsLmFycmF5LnJhd1NjYWxhciA9IHJhd1NjYWxhcjsKKworCXJldHVybiB2YWw7Cit9CisK K3N0YXRpYyBpbmxpbmUgSnNvbmJWYWx1ZSAqCitKc29uVmFsdWVJbml0QmluYXJ5KEpzb25i VmFsdWUgKnZhbCwgSnNvbmIgKmpiKQoreworCXZhbC0+dHlwZSA9IGpidkJpbmFyeTsKKwl2 YWwtPnZhbC5iaW5hcnkuZGF0YSA9ICYoamIpLT5yb290OworCXZhbC0+dmFsLmJpbmFyeS5s ZW4gPSBWQVJTSVpFX0FOWV9FWEhEUihqYik7CisJcmV0dXJuIHZhbDsKK30KKworCitzdGF0 aWMgaW5saW5lIEpzb25iVmFsdWUgKgorSnNvblZhbHVlSW5pdFN0cmluZyhKc29uYlZhbHVl ICpqYnYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlqYnYtPnR5cGUgPSBqYnZTdHJpbmc7CisJ amJ2LT52YWwuc3RyaW5nLmxlbiA9IHN0cmxlbihzdHIpOworCWpidi0+dmFsLnN0cmluZy52 YWwgPSBtZW1jcHkocGFsbG9jKGpidi0+dmFsLnN0cmluZy5sZW4gKyAxKSwgc3RyLAorCQkJ CQkJCQkgamJ2LT52YWwuc3RyaW5nLmxlbiArIDEpOworCXJldHVybiBqYnY7Cit9CisKK3N0 YXRpYyBpbmxpbmUgSnNvbmJWYWx1ZSAqCitKc29uVmFsdWVJbml0U3RyaW5nV2l0aExlbihK c29uYlZhbHVlICpqYnYsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlqYnYtPnR5 cGUgPSBqYnZTdHJpbmc7CisJamJ2LT52YWwuc3RyaW5nLnZhbCA9IHN0cjsKKwlqYnYtPnZh bC5zdHJpbmcubGVuID0gbGVuOworCXJldHVybiBqYnY7Cit9CisKK3N0YXRpYyBpbmxpbmUg SnNvbmJWYWx1ZSAqCitKc29uVmFsdWVJbml0VGV4dChKc29uYlZhbHVlICpqYnYsIHRleHQg KnR4dCkKK3sKKwlqYnYtPnR5cGUgPSBqYnZTdHJpbmc7CisJamJ2LT52YWwuc3RyaW5nLnZh bCA9IFZBUkRBVEFfQU5ZKHR4dCk7CisJamJ2LT52YWwuc3RyaW5nLmxlbiA9IFZBUlNJWkVf QU5ZX0VYSERSKHR4dCk7CisJcmV0dXJuIGpidjsKK30KKworc3RhdGljIGlubGluZSBKc29u YlZhbHVlICoKK0pzb25WYWx1ZUluaXROdW1lcmljKEpzb25iVmFsdWUgKmpidiwgTnVtZXJp YyBudW0pCit7CisJamJ2LT50eXBlID0gamJ2TnVtZXJpYzsKKwlqYnYtPnZhbC5udW1lcmlj ID0gbnVtOworCXJldHVybiBqYnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgSnNvbmJWYWx1ZSAq CitKc29uVmFsdWVJbml0SW50ZWdlcihKc29uYlZhbHVlICpqYnYsIGludDY0IGkpCit7CisJ amJ2LT50eXBlID0gamJ2TnVtZXJpYzsKKwlqYnYtPnZhbC5udW1lcmljID0gRGF0dW1HZXRO dW1lcmljKERpcmVjdEZ1bmN0aW9uQ2FsbDEoCisJCQkJCQkJCQkJCWludDhfbnVtZXJpYywg SW50NjRHZXREYXR1bShpKSkpOworCXJldHVybiBqYnY7Cit9CisKK3N0YXRpYyBpbmxpbmUg SnNvbmJWYWx1ZSAqCitKc29uVmFsdWVJbml0RmxvYXQoSnNvbmJWYWx1ZSAqamJ2LCBmbG9h dDQgZikKK3sKKwlqYnYtPnR5cGUgPSBqYnZOdW1lcmljOworCWpidi0+dmFsLm51bWVyaWMg PSBEYXR1bUdldE51bWVyaWMoRGlyZWN0RnVuY3Rpb25DYWxsMSgKKwkJCQkJCQkJCQkJZmxv YXQ0X251bWVyaWMsIEZsb2F0NEdldERhdHVtKGYpKSk7CisJcmV0dXJuIGpidjsKK30KKwor c3RhdGljIGlubGluZSBKc29uYlZhbHVlICoKK0pzb25WYWx1ZUluaXREb3VibGUoSnNvbmJW YWx1ZSAqamJ2LCBmbG9hdDggZikKK3sKKwlqYnYtPnR5cGUgPSBqYnZOdW1lcmljOworCWpi di0+dmFsLm51bWVyaWMgPSBEYXR1bUdldE51bWVyaWMoRGlyZWN0RnVuY3Rpb25DYWxsMSgK KwkJCQkJCQkJCQkJZmxvYXQ4X251bWVyaWMsIEZsb2F0OEdldERhdHVtKGYpKSk7CisJcmV0 dXJuIGpidjsKK30KKworLyogaGVscGVyIG1hY3JvcyBmb3IganNvbmIgYnVpbGRpbmcgKi8K KyNkZWZpbmUgcHVzaEpzb25iS2V5KHBzdGF0ZSwgamJ2LCBrZXkpIFwKKwkJcHVzaEpzb25i VmFsdWUocHN0YXRlLCBXSkJfS0VZLCBKc29uVmFsdWVJbml0U3RyaW5nKGpidiwga2V5KSkK KworI2RlZmluZSBwdXNoSnNvbmJWYWx1ZUdlbmVyaWMoVHlwZSwgcHN0YXRlLCBqYnYsIHZh bCkgXAorCQlwdXNoSnNvbmJWYWx1ZShwc3RhdGUsIFdKQl9WQUxVRSwgSnNvblZhbHVlSW5p dCMjVHlwZShqYnYsIHZhbCkpCisKKyNkZWZpbmUgcHVzaEpzb25iRWxlbUdlbmVyaWMoVHlw ZSwgcHN0YXRlLCBqYnYsIHZhbCkgXAorCQlwdXNoSnNvbmJWYWx1ZShwc3RhdGUsIFdKQl9F TEVNLCBKc29uVmFsdWVJbml0IyNUeXBlKGpidiwgdmFsKSkKKworI2RlZmluZSBwdXNoSnNv bmJWYWx1ZUludGVnZXIocHN0YXRlLCBqYnYsIGkpIFwKKwkJcHVzaEpzb25iVmFsdWVHZW5l cmljKEludGVnZXIsIHBzdGF0ZSwgamJ2LCBpKQorCisjZGVmaW5lIHB1c2hKc29uYlZhbHVl RmxvYXQocHN0YXRlLCBqYnYsIGYpIFwKKwkJcHVzaEpzb25iVmFsdWVHZW5lcmljKEZsb2F0 LCBwc3RhdGUsIGpidiwgZikKKworI2RlZmluZSBwdXNoSnNvbmJFbGVtRmxvYXQocHN0YXRl LCBqYnYsIGYpIFwKKwkJcHVzaEpzb25iRWxlbUdlbmVyaWMoRmxvYXQsIHBzdGF0ZSwgamJ2 LCBmKQorCisjZGVmaW5lIHB1c2hKc29uYkVsZW1TdHJpbmcocHN0YXRlLCBqYnYsIHR4dCkg XAorCQlwdXNoSnNvbmJFbGVtR2VuZXJpYyhTdHJpbmcsIHBzdGF0ZSwgamJ2LCB0eHQpCisK KyNkZWZpbmUgcHVzaEpzb25iRWxlbVRleHQocHN0YXRlLCBqYnYsIHR4dCkgXAorCQlwdXNo SnNvbmJFbGVtR2VuZXJpYyhUZXh0LCBwc3RhdGUsIGpidiwgdHh0KQorCisjZGVmaW5lIHB1 c2hKc29uYkVsZW1OdW1lcmljKHBzdGF0ZSwgamJ2LCBudW0pIFwKKwkJcHVzaEpzb25iRWxl bUdlbmVyaWMoTnVtZXJpYywgcHN0YXRlLCBqYnYsIG51bSkKKworI2RlZmluZSBwdXNoSnNv bmJFbGVtSW50ZWdlcihwc3RhdGUsIGpidiwgbnVtKSBcCisJCXB1c2hKc29uYkVsZW1HZW5l cmljKEludGVnZXIsIHBzdGF0ZSwgamJ2LCBudW0pCisKKyNkZWZpbmUgcHVzaEpzb25iRWxl bUJpbmFyeShwc3RhdGUsIGpidiwgamJjb250KSBcCisJCXB1c2hKc29uYkVsZW1HZW5lcmlj KEJpbmFyeSwgcHN0YXRlLCBqYnYsIGpiY29udCkKKworI2RlZmluZSBwdXNoSnNvbmJLZXlW YWx1ZUdlbmVyaWMoVHlwZSwgcHN0YXRlLCBqYnYsIGtleSwgdmFsKSAoIFwKKwkJcHVzaEpz b25iS2V5KHBzdGF0ZSwgamJ2LCBrZXkpLCBcCisJCXB1c2hKc29uYlZhbHVlR2VuZXJpYyhU eXBlLCBwc3RhdGUsIGpidiwgdmFsKSBcCisJKQorCisjZGVmaW5lIHB1c2hKc29uYktleVZh bHVlU3RyaW5nKHBzdGF0ZSwgamJ2LCBrZXksIHZhbCkgXAorCQlwdXNoSnNvbmJLZXlWYWx1 ZUdlbmVyaWMoU3RyaW5nLCBwc3RhdGUsIGpidiwga2V5LCB2YWwpCisKKyNkZWZpbmUgcHVz aEpzb25iS2V5VmFsdWVGbG9hdChwc3RhdGUsIGpidiwga2V5LCB2YWwpIFwKKwkJcHVzaEpz b25iS2V5VmFsdWVHZW5lcmljKEZsb2F0LCBwc3RhdGUsIGpidiwga2V5LCB2YWwpCisKKyNk ZWZpbmUgcHVzaEpzb25iS2V5VmFsdWVJbnRlZ2VyKHBzdGF0ZSwgamJ2LCBrZXksIHZhbCkg XAorCQlwdXNoSnNvbmJLZXlWYWx1ZUdlbmVyaWMoSW50ZWdlciwgcHN0YXRlLCBqYnYsIGtl eSwgdmFsKQorCiAjZW5kaWYJCQkJCQkJLyogX19KU09OQl9IX18gKi8KLS0gCjIuMjUuMQoK --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0005-Export-scalarineqsel.patch" Content-Disposition: attachment; filename="0005-Export-scalarineqsel.patch" Content-Transfer-Encoding: base64 RnJvbSA0NWI4MmZlZWQ2ZTg2NmJkMzM3ZDAzNmY2OGNkZjQ2YjY4MjdkMGI4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFNhdCwgMTIgTm92IDIwMTYgMTk6MDE6NDMgKzAzMDAKU3ViamVj dDogW1BBVENIIDUvNl0gRXhwb3J0IHNjYWxhcmluZXFzZWwoKQoKLS0tCiBzcmMvYmFja2Vu ZC91dGlscy9hZHQvc2VsZnVuY3MuYyB8IDIgKy0KIHNyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1 bmNzLmggICAgIHwgNCArKysrCiAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwg MSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxm dW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKaW5kZXggZjUzNGU4 NjIwNzkuLjZlZjMxZmRkNzljIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQv c2VsZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYwpAQCAt NTczLDcgKzU3Myw3IEBAIG5lcXNlbChQR19GVU5DVElPTl9BUkdTKQogICogaXQgd2lsbCBy ZXR1cm4gYW4gYXBwcm94aW1hdGUgZXN0aW1hdGUgYmFzZWQgb24gYXNzdW1pbmcgdGhhdCB0 aGUgY29uc3RhbnQKICAqIHZhbHVlIGZhbGxzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGJpbiBp ZGVudGlmaWVkIGJ5IGJpbmFyeSBzZWFyY2guCiAgKi8KLXN0YXRpYyBkb3VibGUKK2RvdWJs ZQogc2NhbGFyaW5lcXNlbChQbGFubmVySW5mbyAqcm9vdCwgT2lkIG9wZXJhdG9yLCBib29s IGlzZ3QsIGJvb2wgaXNlcSwKIAkJCSAgT2lkIGNvbGxhdGlvbiwKIAkJCSAgVmFyaWFibGVT dGF0RGF0YSAqdmFyZGF0YSwgRGF0dW0gY29uc3R2YWwsIE9pZCBjb25zdHR5cGUpCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9zZWxmdW5jcy5oIGIvc3JjL2luY2x1ZGUvdXRp bHMvc2VsZnVuY3MuaAppbmRleCA0OWZjM2Q3MTdiMS4uODhhOTU0MDFjNWYgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNzLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRp bHMvc2VsZnVuY3MuaApAQCAtMjQ5LDYgKzI0OSwxMCBAQCBleHRlcm4gTGlzdCAqYWRkX3By ZWRpY2F0ZV90b19pbmRleF9xdWFscyhJbmRleE9wdEluZm8gKmluZGV4LAogZXh0ZXJuIHZv aWQgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpw YXRoLAogCQkJCQkJCQlkb3VibGUgbG9vcF9jb3VudCwKIAkJCQkJCQkJR2VuZXJpY0Nvc3Rz ICpjb3N0cyk7CitleHRlcm4gZG91YmxlIHNjYWxhcmluZXFzZWwoUGxhbm5lckluZm8gKnJv b3QsIE9pZCBvcGVyYXRvciwgYm9vbCBpc2d0LAorCQkJCQkJCWJvb2wgaXNlcSwgT2lkIGNv bGxhdGlvbiwKKwkJCQkJCQlWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBEYXR1bSBjb25z dHZhbCwKKwkJCQkJCQlPaWQgY29uc3R0eXBlKTsKIAogZXh0ZXJuIEhlYXBUdXBsZSBzdGF0 c19mb3JtX3R1cGxlKFN0YXRzRGF0YSAqZGF0YSk7CiAKLS0gCjIuMjUuMQoK --------------0Bwm9qgi5SjAR5x8syR6OMh5 Content-Type: text/x-patch; charset=UTF-8; name="0006-Add-jsonb-statistics.patch" Content-Disposition: attachment; filename="0006-Add-jsonb-statistics.patch" Content-Transfer-Encoding: base64 RnJvbSA0ODVmNGNjMWMwZTFkMTZjYjgwOWRlZGMzYTI4MTk3ODBkMWEyYTIzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFNhdCwgMTIgTm92IDIwMTYgMTk6MTk6MzMgKzAzMDAKU3ViamVj dDogW1BBVENIIDYvNl0gQWRkIGpzb25iIHN0YXRpc3RpY3MKCi0tLQogc3JjL2JhY2tlbmQv Y2F0YWxvZy9zeXN0ZW1fZnVuY3Rpb25zLnNxbCAgfCAgIDM2ICsKIHNyYy9iYWNrZW5kL2Nh dGFsb2cvc3lzdGVtX3ZpZXdzLnNxbCAgICAgIHwgICA1NiArCiBzcmMvYmFja2VuZC91dGls cy9hZHQvTWFrZWZpbGUgICAgICAgICAgICB8ICAgIDIgKwogc3JjL2JhY2tlbmQvdXRpbHMv YWR0L2pzb25iX3NlbGZ1bmNzLmMgICAgfCAxNTgyICsrKysrKysrKysrKysrKysrKysrKwog c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25iX3R5cGFuYWx5emUuYyAgfCAxMzYwICsrKysr KysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2V4ZWMuYyAg ICAgfCAgICAyICstCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdCAgICAg ICB8ICAgMTcgKy0KIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAg IHwgICAxMSArCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3N0YXRpc3RpYy5oICAgICAgICB8 ICAgIDIgKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ190eXBlLmRhdCAgICAgICAgICAgfCAg ICAyICstCiBzcmMvaW5jbHVkZS91dGlscy9qc29uX3NlbGZ1bmNzLmggICAgICAgICB8ICAx MTMgKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmJfc3RhdHMub3V0IHwgIDcx MyArKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dCAgICAg ICB8ICAgMzIgKwogc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAgICAg fCAgICAyICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9zdGF0cy5zcWwgICAgICB8 ICAyNDkgKysrKwogMTUgZmlsZXMgY2hhbmdlZCwgNDE2OCBpbnNlcnRpb25zKCspLCAxMSBk ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC91dGlscy9hZHQv anNvbmJfc2VsZnVuY3MuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3V0aWxz L2FkdC9qc29uYl90eXBhbmFseXplLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW5jbHVk ZS91dGlscy9qc29uX3NlbGZ1bmNzLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2pzb25iX3N0YXRzLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iX3N0YXRzLnNxbAoKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0aW9ucy5zcWwgYi9zcmMvYmFja2VuZC9jYXRh bG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsCmluZGV4IGZkMTQyMTc4OGU2Li5mZGYyMzZlNGVk YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVuY3Rpb25zLnNx bAorKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsCkBAIC01 OTQsNiArNTk0LDQyIEBAIExBTkdVQUdFIGludGVybmFsCiBTVFJJQ1QgSU1NVVRBQkxFIFBB UkFMTEVMIFNBRkUKIEFTICd1bmljb2RlX2lzX25vcm1hbGl6ZWQnOwogCistLSBYWFggaXMg dGhpcyBmdW5jdGlvbiBpbW11dGFibGUgLyBwYXJhbGxlbCBzYWZlPworLS0gWFhYIGRvIHdl IGFjdHVhbGx5IG5lZWQgdG8gY2FzdCB0byB0ZXh0IGFuZCB0aGVuIHRvIGpzb25iPworQ1JF QVRFIEZVTkNUSU9OIHBnX2pzb25fcGF0aF9zdGF0cyh0YWIgcmVnY2xhc3MsIHBhdGhfaW5k ZXggaW50ZWdlcikgUkVUVVJOUyB0ZXh0CitBUyAkJAorCVNFTEVDVCBqc29uYl9wcmV0dHko KAorCQlDQVNFCisJCQlXSEVOIHN0YWtpbmQxID0gOCBUSEVOIHN0YXZhbHVlczEKKwkJCVdI RU4gc3Rha2luZDIgPSA4IFRIRU4gc3RhdmFsdWVzMgorCQkJV0hFTiBzdGFraW5kMyA9IDgg VEhFTiBzdGF2YWx1ZXMzCisJCQlXSEVOIHN0YWtpbmQ0ID0gOCBUSEVOIHN0YXZhbHVlczQK KwkJCVdIRU4gc3Rha2luZDUgPSA4IFRIRU4gc3RhdmFsdWVzNQorCQlFTkQ6OnRleHQ6Ompz b25iW10pWyQyXSkKKwlGUk9NIHBnX3N0YXRpc3RpYworCVdIRVJFIHN0YXJlbGlkID0gJDEK KyQkIExBTkdVQUdFICdzcWwnOworCistLSBYWFggaXMgdGhpcyBmdW5jdGlvbiBpbW11dGFi bGUgLyBwYXJhbGxlbCBzYWZlPworLS0gWFhYIGRvIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2Fz dCB0byB0ZXh0IGFuZCB0aGVuIHRvIGpzb25iPworQ1JFQVRFIEZVTkNUSU9OIHBnX2pzb25f cGF0aF9zdGF0cyh0YWIgcmVnY2xhc3MsIHBhdGggdGV4dCkgUkVUVVJOUyB0ZXh0CitBUyAk JAorCVNFTEVDVCBqc29uYl9wcmV0dHkocGF0aHN0YXRzKQorCUZST00gKAorCQlTRUxFQ1Qg dW5uZXN0KAorCQkJQ0FTRQorCQkJCVdIRU4gc3Rha2luZDEgPSA4IFRIRU4gc3RhdmFsdWVz MQorCQkJCVdIRU4gc3Rha2luZDIgPSA4IFRIRU4gc3RhdmFsdWVzMgorCQkJCVdIRU4gc3Rh a2luZDMgPSA4IFRIRU4gc3RhdmFsdWVzMworCQkJCVdIRU4gc3Rha2luZDQgPSA4IFRIRU4g c3RhdmFsdWVzNAorCQkJCVdIRU4gc3Rha2luZDUgPSA4IFRIRU4gc3RhdmFsdWVzNQorCQkJ RU5EOjp0ZXh0Ojpqc29uYltdKSBwYXRoc3RhdHMKKwkJRlJPTSBwZ19zdGF0aXN0aWMKKwkJ V0hFUkUgc3RhcmVsaWQgPSAkMQorCSkgcGF0aHMKKwlXSEVSRSBwYXRoc3RhdHMtPj4ncGF0 aCcgPSAkMgorJCQgTEFOR1VBR0UgJ3NxbCc7CisKIC0tCiAtLSBUaGUgZGVmYXVsdCBwZXJt aXNzaW9ucyBmb3IgZnVuY3Rpb25zIG1lYW4gdGhhdCBhbnlvbmUgY2FuIGV4ZWN1dGUgdGhl bS4KIC0tIEEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBzaG91bGRuJ3QgYmUgZXhlY3V0YWJsZSBi eSBqdXN0IGFueW9uZSwgYnV0IHJhdGhlcgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0 YWxvZy9zeXN0ZW1fdmlld3Muc3FsIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmll d3Muc3FsCmluZGV4IDNjYjY5YjFmODdiLi42ZmFmYTdhZWYzMSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCisrKyBiL3NyYy9iYWNrZW5kL2Nh dGFsb2cvc3lzdGVtX3ZpZXdzLnNxbApAQCAtMzY0LDYgKzM2NCw2MiBAQCBDUkVBVEUgVklF VyBwZ19zdGF0c19leHRfZXhwcnMgV0lUSCAoc2VjdXJpdHlfYmFycmllcikgQVMKIC0tIHVu cHJpdmlsZWdlZCB1c2VycyBtYXkgcmVhZCBwZ19zdGF0aXN0aWNfZXh0IGJ1dCBub3QgcGdf c3RhdGlzdGljX2V4dF9kYXRhCiBSRVZPS0UgQUxMIE9OIHBnX3N0YXRpc3RpY19leHRfZGF0 YSBGUk9NIHB1YmxpYzsKIAorLS0gWFhYIFRoaXMgcHJvYmFibHkgbmVlZHMgdG8gZG8gdGhl IHNhbWUgY2hlY2tzIGFzIHBnX3N0YXRzLCBpLmUuCistLSAgICBXSEVSRSBOT1QgYXR0aXNk cm9wcGVkCistLSAgICBBTkQgaGFzX2NvbHVtbl9wcml2aWxlZ2UoYy5vaWQsIGEuYXR0bnVt LCAnc2VsZWN0JykKKy0tICAgIEFORCAoYy5yZWxyb3dzZWN1cml0eSA9IGZhbHNlIE9SIE5P VCByb3dfc2VjdXJpdHlfYWN0aXZlKGMub2lkKSk7CitDUkVBVEUgVklFVyBwZ19zdGF0c19q c29uIEFTCisJU0VMRUNUCisJCW5zcG5hbWUgQVMgc2NoZW1hbmFtZSwKKwkJcmVsbmFtZSBB UyB0YWJsZW5hbWUsCisJCWF0dG5hbWUgQVMgYXR0bmFtZSwKKworCQlwYXRoLT4+J3BhdGgn IEFTIGpzb25fcGF0aCwKKworCQlzdGFpbmhlcml0IEFTIGluaGVyaXRlZCwKKworCQkocGF0 aC0+J2pzb24nLT4+J251bGxmcmFjJyk6OmZsb2F0NCBBUyBudWxsX2ZyYWMsCisJCShwYXRo LT4nanNvbictPj4nd2lkdGgnKTo6ZmxvYXQ0IEFTIGF2Z193aWR0aCwKKwkJKHBhdGgtPidq c29uJy0+PidkaXN0aW5jdCcpOjpmbG9hdDQgQVMgbl9kaXN0aW5jdCwKKworCQlBUlJBWShT RUxFQ1QgdmFsIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHMoCisJCQkJcGF0aC0+J2pzb24n LT4nbWN2Jy0+J3ZhbHVlcycpIHZhbCk6OmFueWFycmF5CisJCQlBUyBtb3N0X2NvbW1vbl92 YWxzLAorCisJCUFSUkFZKFNFTEVDVCBudW06OnRleHQ6OmZsb2F0NCBGUk9NIGpzb25iX2Fy cmF5X2VsZW1lbnRzKAorCQkJCXBhdGgtPidqc29uJy0+J21jdictPidudW1iZXJzJykgbnVt KQorCQkJQVMgbW9zdF9jb21tb25fZnJlcXMsCisKKwkJQVJSQVkoU0VMRUNUIHZhbCBGUk9N IGpzb25iX2FycmF5X2VsZW1lbnRzKAorCQkJCXBhdGgtPidqc29uJy0+J2hpc3RvZ3JhbSct Pid2YWx1ZXMnKSB2YWwpCisJCQlBUyBoaXN0b2dyYW1fYm91bmRzLAorCisJCUFSUkFZKFNF TEVDVCB2YWw6OnRleHQ6OmludCBGUk9NIGpzb25iX2FycmF5X2VsZW1lbnRzKAorCQkJCXBh dGgtPidhcnJheV9sZW5ndGgnLT4nbWN2Jy0+J3ZhbHVlcycpIHZhbCkKKwkJCUFTIG1vc3Rf Y29tbW9uX2FycmF5X2xlbmd0aHMsCisKKwkJQVJSQVkoU0VMRUNUIG51bTo6dGV4dDo6Zmxv YXQ0IEZST00ganNvbmJfYXJyYXlfZWxlbWVudHMoCisJCQkJcGF0aC0+J2FycmF5X2xlbmd0 aCctPidtY3YnLT4nbnVtYmVycycpIG51bSkKKwkJCUFTIG1vc3RfY29tbW9uX2FycmF5X2xl bmd0aF9mcmVxcywKKworCQkocGF0aC0+J2pzb24nLT4+J2NvcnJlbGF0aW9uJyk6OmZsb2F0 NCBBUyBjb3JyZWxhdGlvbgorCisJRlJPTQorCQlwZ19zdGF0aXN0aWMgcyBKT0lOIHBnX2Ns YXNzIGMgT04gKGMub2lkID0gcy5zdGFyZWxpZCkKKwkJSk9JTiBwZ19hdHRyaWJ1dGUgYSBP TiAoYy5vaWQgPSBhdHRyZWxpZCBBTkQgYXR0bnVtID0gcy5zdGFhdHRudW0pCisJCUxFRlQg Sk9JTiBwZ19uYW1lc3BhY2UgbiBPTiAobi5vaWQgPSBjLnJlbG5hbWVzcGFjZSksCisJCUxB VEVSQUwgKAorCQkJU0VMRUNUIHVubmVzdCgoQ0FTRQorCQkJCQlXSEVOIHN0YWtpbmQxID0g OCBUSEVOIHN0YXZhbHVlczEKKwkJCQkJV0hFTiBzdGFraW5kMiA9IDggVEhFTiBzdGF2YWx1 ZXMyCisJCQkJCVdIRU4gc3Rha2luZDMgPSA4IFRIRU4gc3RhdmFsdWVzMworCQkJCQlXSEVO IHN0YWtpbmQ0ID0gOCBUSEVOIHN0YXZhbHVlczQKKwkJCQkJV0hFTiBzdGFraW5kNSA9IDgg VEhFTiBzdGF2YWx1ZXM1CisJCQkJRU5EIDo6dGV4dDo6anNvbmJbXSlbMjpdKSBBUyBwYXRo CisJCSkgcGF0aHM7CisKKy0tIG5vIG5lZWQgdG8gcmV2b2tlIGFueSBwcml2aWxlZ2VzLCB3 ZSd2ZSBhbHJlYWR5IHJldm9rZWQgYWNjc3MgdG8gcGdfc3RhdGlzdGljCisKIENSRUFURSBW SUVXIHBnX3B1YmxpY2F0aW9uX3RhYmxlcyBBUwogICAgIFNFTEVDVAogICAgICAgICBQLnB1 Ym5hbWUgQVMgcHVibmFtZSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9N YWtlZmlsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtlZmlsZQppbmRleCA0MWI0ODZi Y2VmZi4uNWUzNTljY2Y0ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9N YWtlZmlsZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvTWFrZWZpbGUKQEAgLTUwLDYg KzUwLDggQEAgT0JKUyA9IFwKIAlqc29uYi5vIFwKIAlqc29uYl9naW4ubyBcCiAJanNvbmJf b3AubyBcCisJanNvbmJfc2VsZnVuY3MubyBcCisJanNvbmJfdHlwYW5hbHl6ZS5vIFwKIAlq c29uYl91dGlsLm8gXAogCWpzb25mdW5jcy5vIFwKIAlqc29uYnN1YnMubyBcCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfc2VsZnVuY3MuYyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9qc29uYl9zZWxmdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwLi4zYjZkMTQwNjU2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9qc29uYl9zZWxmdW5jcy5jCkBAIC0wLDAgKzEsMTU4MiBAQAor LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoganNvbmJfc2VsZnVuY3MuYworICoJICBG dW5jdGlvbnMgZm9yIHNlbGVjdGl2aXR5IGVzdGltYXRpb24gb2YganNvbmIgb3BlcmF0b3Jz CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjIsIFBvc3RncmVTUUwgR2xvYmFsIERl dmVsb3BtZW50IEdyb3VwCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCSAgc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2pzb25iX3NlbGZ1bmNzLmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAqLworCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgPG1hdGguaD4K KworI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJhY2Nlc3MvaGVhcGFtLmgiCisjaW5j bHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfb3Bl cmF0b3IuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3N0YXRpc3RpYy5oIgorI2luY2x1ZGUg ImNhdGFsb2cvcGdfdHlwZS5oIgorI2luY2x1ZGUgImNvbW1vbi9zdHJpbmcuaCIKKyNpbmNs dWRlICJub2Rlcy9wcmltbm9kZXMuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgor I2luY2x1ZGUgInV0aWxzL2pzb24uaCIKKyNpbmNsdWRlICJ1dGlscy9qc29uYi5oIgorI2lu Y2x1ZGUgInV0aWxzL2pzb25fc2VsZnVuY3MuaCIKKyNpbmNsdWRlICJ1dGlscy9sc3lzY2Fj aGUuaCIKKyNpbmNsdWRlICJ1dGlscy9yZWwuaCIKKyNpbmNsdWRlICJ1dGlscy9zZWxmdW5j cy5oIgorCisjZGVmaW5lIERFRkFVTFRfSlNPTl9DT05UQUlOU19TRUwJMC4wMDEKKworLyoK KyAqIGpzb25HZXRGaWVsZAorICoJCUdpdmVuIGEgSlNPTkIgZG9jdW1lbnQgYW5kIGEga2V5 LCBleHRyYWN0IHRoZSBKU09OQiB2YWx1ZSBmb3IgdGhlIGtleS4KKyAqLworc3RhdGljIGlu bGluZSBEYXR1bQoranNvbkdldEZpZWxkKERhdHVtIG9iaiwgY29uc3QgY2hhciAqZmllbGQp Cit7CisJSnNvbmIgCSAgICpqYiA9IERhdHVtR2V0SnNvbmJQKG9iaik7CisJSnNvbmJWYWx1 ZSAqamJ2ID0gZmluZEpzb25iVmFsdWVGcm9tQ29udGFpbmVyTGVuKCZqYi0+cm9vdCwgSkJf Rk9CSkVDVCwKKwkJCQkJCQkJCQkJCQkgZmllbGQsIHN0cmxlbihmaWVsZCkpOworCXJldHVy biBqYnYgPyBKc29uYlBHZXREYXR1bShKc29uYlZhbHVlVG9Kc29uYihqYnYpKSA6IFBvaW50 ZXJHZXREYXR1bShOVUxMKTsKK30KKworLyoKKyAqIGpzb25HZXRGbG9hdDQKKyAqCQlHaXZl biBhIEpTT05CIHZhbHVlLCBpbnRlcnByZXQgaXQgYXMgYSBmbG9hdDQgdmFsdWUuCisgKgor ICogVGhpcyBleHBlY3RzIHRoZSBKU09OQiB2YWx1ZSB0byBiZSBhIG51bWVyaWMsIGJlY2F1 c2UgdGhhdCdzIGhvdyB3ZSBzdG9yZQorICogZmxvYXRzIGluIEpTT05CLCBhbmQgd2UgY2Fz dCBpdCB0byBmbG9hdDQuCisgKi8KK3N0YXRpYyBpbmxpbmUgZmxvYXQ0Citqc29uR2V0Rmxv YXQ0KERhdHVtIGpzb25iLCBmbG9hdDQgZGVmYXVsdF92YWwpCit7CisJSnNvbmIJICAgKmpi OworCUpzb25iVmFsdWUJanY7CisKKwlpZiAoIURhdHVtR2V0UG9pbnRlcihqc29uYikpCisJ CXJldHVybiBkZWZhdWx0X3ZhbDsKKworCWpiID0gRGF0dW1HZXRKc29uYlAoanNvbmIpOwor CisJaWYgKCFKc29uYkV4dHJhY3RTY2FsYXIoJmpiLT5yb290LCAmanYpIHx8IGp2LnR5cGUg IT0gamJ2TnVtZXJpYykKKwkJcmV0dXJuIGRlZmF1bHRfdmFsOworCisJcmV0dXJuIERhdHVt R2V0RmxvYXQ0KERpcmVjdEZ1bmN0aW9uQ2FsbDEobnVtZXJpY19mbG9hdDQsCisJCQkJCQkJ CQkJCSAgTnVtZXJpY0dldERhdHVtKGp2LnZhbC5udW1lcmljKSkpOworfQorCisvKgorICog anNvblN0YXRzSW5pdAorICoJCUdpdmVuIGEgcGdfc3RhdGlzdGljIHR1cGxlLCBleHBhbmQg U1RBVElTVElDX0tJTkRfSlNPTiBpbnRvIEpzb25TdGF0cy4KKyAqLworYm9vbAoranNvblN0 YXRzSW5pdChKc29uU3RhdHMgZGF0YSwgY29uc3QgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0 YSkKK3sKKwlKc29uYgkgICAqamI7CisJSnNvbmJWYWx1ZQlwcmVmaXg7CisKKwlpZiAoIXZh cmRhdGEtPnN0YXRzVHVwbGUpCisJCXJldHVybiBmYWxzZTsKKworCWRhdGEtPnN0YXRzVHVw bGUgPSB2YXJkYXRhLT5zdGF0c1R1cGxlOworCW1lbXNldCgmZGF0YS0+YXR0c2xvdCwgMCwg c2l6ZW9mKGRhdGEtPmF0dHNsb3QpKTsKKworCS8qIFdlcmUgdGhlcmUganVzdCBOVUxMIHZh bHVlcyBpbiB0aGUgY29sdW1uPyBObyBKU09OIHN0YXRzLCBidXQgc3RpbGwgdXNlZnVsLiAq LworCWlmICgoKEZvcm1fcGdfc3RhdGlzdGljKSBHRVRTVFJVQ1QoZGF0YS0+c3RhdHNUdXBs ZSkpLT5zdGFudWxsZnJhYyA+PSAxLjApCisJeworCQlkYXRhLT5udWxsZnJhYyA9IDEuMDsK KwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogRG8gd2UgaGF2ZSB0aGUgSlNPTiBzdGF0cyBi dWlsdCBpbiB0aGUgcGdfc3RhdGlzdGljPyAqLworCWlmICghZ2V0X2F0dHN0YXRzc2xvdCgm ZGF0YS0+YXR0c2xvdCwgZGF0YS0+c3RhdHNUdXBsZSwKKwkJCQkJCSAgU1RBVElTVElDX0tJ TkRfSlNPTiwgSW52YWxpZE9pZCwKKwkJCQkJCSAgQVRUU1RBVFNTTE9UX05VTUJFUlMgfCBB VFRTVEFUU1NMT1RfVkFMVUVTKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBWYWxp ZCBKU09OIHN0YXRzIHNob3VsZCBoYXZlIGF0IGxlYXN0IDIgZWxlbWVudHMgaW4gdmFsdWVz OgorCSAqICAwdGggLSByb290IHBhdGggcHJlZml4CisJICogIDFzdCAtIHJvb3QgcGF0aCBz dGF0cworCSAqLworCWlmIChkYXRhLT5hdHRzbG90Lm52YWx1ZXMgPCAyKQorCXsKKwkJZnJl ZV9hdHRzdGF0c3Nsb3QoJmRhdGEtPmF0dHNsb3QpOworCQlyZXR1cm4gZmFsc2U7CisJfQor CisJLyogWFhYIElmIHRoZSBBQ0wgY2hlY2sgd2FzIG5vdCBPSywgd291bGQgd2UgZXZlbiBn ZXQgaGVyZT8gKi8KKwlkYXRhLT5hY2xfb2sgPSB2YXJkYXRhLT5hY2xfb2s7CisJZGF0YS0+ cmVsID0gdmFyZGF0YS0+cmVsOworCWRhdGEtPm51bGxmcmFjID0KKwkJZGF0YS0+YXR0c2xv dC5ubnVtYmVycyA+IDAgPyBkYXRhLT5hdHRzbG90Lm51bWJlcnNbMF0gOiAwLjA7CisJZGF0 YS0+cGF0aGRhdHVtcyA9IGRhdGEtPmF0dHNsb3QudmFsdWVzICsgMTsKKwlkYXRhLT5ucGF0 aHMgPSBkYXRhLT5hdHRzbG90Lm52YWx1ZXMgLSAxOworCisJLyogRXh0cmFjdCByb290IHBh dGggcHJlZml4ICovCisJamIgPSBEYXR1bUdldEpzb25iUChkYXRhLT5hdHRzbG90LnZhbHVl c1swXSk7CisJaWYgKCFKc29uYkV4dHJhY3RTY2FsYXIoJmpiLT5yb290LCAmcHJlZml4KSB8 fCBwcmVmaXgudHlwZSAhPSBqYnZTdHJpbmcpCisJeworCQlmcmVlX2F0dHN0YXRzc2xvdCgm ZGF0YS0+YXR0c2xvdCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlkYXRhLT5wcmVmaXgg PSBwcmVmaXgudmFsLnN0cmluZy52YWw7CisJZGF0YS0+cHJlZml4bGVuID0gcHJlZml4LnZh bC5zdHJpbmcubGVuOworCisJLyogQ3JlYXRlIHBhdGggY2FjaGUsIGluaXRpYWx6ZSBvbmx5 IHR3byBmaWVsZHMgdGhhdCBhY3RpbmcgYXMgZmxhZ3MgKi8KKwlkYXRhLT5wYXRocyA9IHBh bGxvYyhzaXplb2YoKmRhdGEtPnBhdGhzKSAqIGRhdGEtPm5wYXRocyk7CisKKwlmb3IgKGlu dCBpID0gMDsgaSA8IGRhdGEtPm5wYXRoczsgaSsrKQorCXsKKwkJZGF0YS0+cGF0aHNbaV0u ZGF0YSA9IE5VTEw7CisJCWRhdGEtPnBhdGhzW2ldLnBhdGggPSBOVUxMOworCX0KKworCXJl dHVybiB0cnVlOworfQorCisvKgorICoganNvblN0YXRzUmVsZWFzZQorICoJCVJlbGVhc2Ug cmVzb3VyY2VzIChzdGF0aXN0aWNzIHNsb3QpIGFzc29jaWF0ZWQgd2l0aCB0aGUgSnNvblN0 YXRzIHZhbHVlLgorICovCit2b2lkCitqc29uU3RhdHNSZWxlYXNlKEpzb25TdGF0cyBkYXRh KQoreworCWZyZWVfYXR0c3RhdHNzbG90KCZkYXRhLT5hdHRzbG90KTsKK30KKworLyoKKyAq IGpzb25QYXRoU3RhdHNBbGxvY1NwZWNpYWxTdGF0cworICoJCUFsbG9jYXRlIGEgY29weSBv ZiBKc29uUGF0aFN0YXRzIGZvciBhY2Nlc3Npbmcgc3BlY2lhbCAobGVuZ3RoIGV0Yy4pCisg KgkJc3RhdHMgZm9yIGEgZ2l2ZW4gSlNPTiBwYXRoLgorICovCitzdGF0aWMgSnNvblBhdGhT dGF0cworanNvblBhdGhTdGF0c0FsbG9jU3BlY2lhbFN0YXRzKEpzb25QYXRoU3RhdHMgcHN0 YXRzLCBKc29uUGF0aFN0YXRzVHlwZSB0eXBlKQoreworCUpzb25QYXRoU3RhdHMgc3RhdHM7 CisKKwlpZiAoIXBzdGF0cykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3B5IGFuZCByZXBs YWNlIHN0YXRzIHR5cGUgKi8KKwlzdGF0cyA9IHBhbGxvYyhzaXplb2YoKnN0YXRzKSk7CisJ KnN0YXRzID0gKnBzdGF0czsKKwlzdGF0cy0+dHlwZSA9IHR5cGU7CisKKwlyZXR1cm4gc3Rh dHM7Cit9CisKKy8qCisgKiBqc29uUGF0aFN0YXRzR2V0QXJyYXlMZW5ndGhTdGF0cworICoJ CUV4dHJhY3Qgc3RhdGlzdGljcyBvZiBhcnJheSBsZW5ndGhzIGZvciB0aGUgcGF0aC4KKyAq LworSnNvblBhdGhTdGF0cworanNvblBhdGhTdGF0c0dldEFycmF5TGVuZ3RoU3RhdHMoSnNv blBhdGhTdGF0cyBwc3RhdHMpCit7CisJLyoKKwkgKiBUaGUgYXJyYXkgbGVuZ3RoIHN0YXRp c3RpY3MgaXMgcmVsZXZhbnQgb25seSBmb3IgdmFsdWVzIHRoYXQgYXJlIGFycmF5cy4KKwkg KiBTbyBpZiB3ZSBvYnNlcnZlZCBubyBzdWNoIHZhbHVlcywgd2Uga25vdyB0aGVyZSBjYW4n dCBiZSBzdWNoCisJICogc3RhdGlzdGljcyBhbmQgc28gd2Ugc2ltcGx5IHJldHVybiBOVUxM LgorCSAqLworCWlmIChqc29uUGF0aFN0YXRzR2V0VHlwZUZyZXEocHN0YXRzLCBqYnZBcnJh eSwgMC4wKSA8PSAwLjApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGpzb25QYXRoU3Rh dHNBbGxvY1NwZWNpYWxTdGF0cyhwc3RhdHMsIEpzb25QYXRoU3RhdHNBcnJheUxlbmd0aCk7 Cit9CisKKy8qCisgKiBqc29uUGF0aFN0YXRzR2V0T2JqZWN0TGVuZ3RoU3RhdHMKKyAqCQlF eHRyYWN0IHN0YXRpc3RpY3Mgb2Ygb2JqZWN0IGxlbmd0aCBmb3IgdGhlIHBhdGguCisgKi8K K0pzb25QYXRoU3RhdHMKK2pzb25QYXRoU3RhdHNHZXRPYmplY3RMZW5ndGhTdGF0cyhKc29u UGF0aFN0YXRzIHBzdGF0cykKK3sKKwkvKgorCSAqIFRoZSBvYmplY3QgbGVuZ3RoIHN0YXRp c3RpY3MgaXMgcmVsZXZhbnQgb25seSBmb3IgdmFsdWVzIHRoYXQgYXJlIGFycmF5cy4KKwkg KiBTbyBpZiB3ZSBvYnNlcnZlZCBubyBzdWNoIHZhbHVlcywgd2Uga25vdyB0aGVyZSBjYW4n dCBiZSBzdWNoCisJICogc3RhdGlzdGljcyBhbmQgc28gd2Ugc2ltcGx5IHJldHVybiBOVUxM LgorCSAqLworCWlmIChqc29uUGF0aFN0YXRzR2V0VHlwZUZyZXEocHN0YXRzLCBqYnZPYmpl Y3QsIDAuMCkgPD0gMC4wKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBqc29uUGF0aFN0 YXRzQWxsb2NTcGVjaWFsU3RhdHMocHN0YXRzLCBKc29uUGF0aFN0YXRzT2JqZWN0TGVuZ3Ro KTsKK30KKworLyoKKyAqIGpzb25QYXRoU3RhdHNHZXRQYXRoCisgKgkJVHJ5IHRvIHVzZSBj YWNoZWQgcGF0aCBuYW1lIG9yIGV4dHJhY3QgaXQgZnJvbSBwZXItcGF0aCBzdGF0cyBkYXR1 bS4KKyAqCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2NlcywgZmFsc2Ugb24gZXJyb3IuCisg Ki8KK3N0YXRpYyBpbmxpbmUgYm9vbAoranNvblBhdGhTdGF0c0dldFBhdGgoSnNvblBhdGhT dGF0cyBzdGF0cywgRGF0dW0gcGF0aGRhdHVtLAorCQkJCQkgY29uc3QgY2hhciAqKnBhdGgs IGludCAqcGF0aGxlbikKK3sKKwkqcGF0aCA9IHN0YXRzLT5wYXRoOworCisJaWYgKCpwYXRo KQorCQkvKiB1c2UgY2FjaGVkIHBhdGggbmFtZSAqLworCQkqcGF0aGxlbiA9IHN0YXRzLT5w YXRobGVuOworCWVsc2UKKwl7CisJCUpzb25iCSAgICpqc29uYiA9IERhdHVtR2V0SnNvbmJQ KHBhdGhkYXR1bSk7CisJCUpzb25iVmFsdWUJcGF0aGtleTsKKwkJSnNvbmJWYWx1ZSAqcGF0 aHZhbDsKKworCQkvKiBleHRyYWN0IHBhdGggZnJvbSB0aGUgc3RhdGlzdGljcyByZXByZXNl bnRlZCBhcyBqc29uYiBkb2N1bWVudCAqLworCQlKc29uVmFsdWVJbml0U3RyaW5nV2l0aExl bigmcGF0aGtleSwgInBhdGgiLCA0KTsKKwkJcGF0aHZhbCA9IGZpbmRKc29uYlZhbHVlRnJv bUNvbnRhaW5lcigmanNvbmItPnJvb3QsIEpCX0ZPQkpFQ1QsICZwYXRoa2V5KTsKKworCQlp ZiAoIXBhdGh2YWwgfHwgcGF0aHZhbC0+dHlwZSAhPSBqYnZTdHJpbmcpCisJCQlyZXR1cm4g ZmFsc2U7CS8qIFhYWCBpbnZhbGlkIHN0YXRzIGRhdGEsIG1heWJlIHRocm93IGVycm9yICov CisKKwkJLyogY2FjaGUgZXh0cmFjdGVkIHBhdGggbmFtZSAqLworCQkqcGF0aCA9IHN0YXRz LT5wYXRoID0gcGF0aHZhbC0+dmFsLnN0cmluZy52YWw7CisJCSpwYXRobGVuID0gc3RhdHMt PnBhdGhsZW4gPSBwYXRodmFsLT52YWwuc3RyaW5nLmxlbjsKKwl9CisKKwlyZXR1cm4gdHJ1 ZTsKK30KKworLyogQ29udGV4dCBmb3IgYnNlYXJjaCgpaW5nIHBhdGhzICovCit0eXBlZGVm IHN0cnVjdCBKc29uUGF0aFN0YXRzU2VhcmNoQ29udGV4dAoreworCUpzb25TdGF0cwlzdGF0 czsKKwljb25zdCBjaGFyICpwYXRoOworCWludAkJCXBhdGhsZW47Cit9IEpzb25QYXRoU3Rh dHNTZWFyY2hDb250ZXh0OworCisvKgorICoganNvblBhdGhTdGF0c0NvbXBhcmUKKyAqCQlD b21wYXJlIHR3byBKc29uUGF0aFN0YXRzIHN0cnVjdHMsIHNvIHRoYXQgd2UgY2FuIHNvcnQg dGhlbS4KKyAqCisgKiBXZSBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIHNlYXJjaCBmb3Igc3Rh dHMgZm9yIGEgZ2l2ZW4gcGF0aCBzaW1wbHkgYnkKKyAqIGJzZWFyY2goKS4KKyAqCisgKiBY WFggV2UgbmV2ZXIgYnVpbGQgdHdvIHN0cnVjdHMgZm9yIHRoZSBzYW1lIHBhdGgsIHNvIHdl IGtub3cgdGhlIHBhdGhzCisgKiBhcmUgZGlmZmVyZW50IC0gb25lIG1heSBiZSBhIHByZWZp eCBvZiB0aGUgb3RoZXIsIGJ1dCB0aGVuIHdlIHNvcnQgdGhlCisgKiBzdHJpbmdzIGJ5IGxl bmd0aC4KKyAqLworc3RhdGljIGludAoranNvblBhdGhTdGF0c0NvbXBhcmUoY29uc3Qgdm9p ZCAqcHYxLCBjb25zdCB2b2lkICpwdjIpCit7CisJSnNvblBhdGhTdGF0c1NlYXJjaENvbnRl eHQgY29uc3QgKmN4dCA9IHB2MTsKKwlEYXR1bSBjb25zdCAqcGF0aGRhdHVtID0gKERhdHVt IGNvbnN0ICopIHB2MjsKKwlpbnQJCQlpbmRleCA9IHBhdGhkYXR1bSAtIGN4dC0+c3RhdHMt PnBhdGhkYXR1bXM7CisJSnNvblBhdGhTdGF0cyBzdGF0cyA9ICZjeHQtPnN0YXRzLT5wYXRo c1tpbmRleF07CisJY29uc3QgY2hhciAqcGF0aDsKKwlpbnQJCQlwYXRobGVuOworCWludAkJ CXJlczsKKworCWlmICghanNvblBhdGhTdGF0c0dldFBhdGgoc3RhdHMsICpwYXRoZGF0dW0s ICZwYXRoLCAmcGF0aGxlbikpCisJCXJldHVybiAxOwkvKiBYWFggaW52YWxpZCBzdGF0cyBk YXRhICovCisKKwkvKiBjb21wYXJlIHRoZSBzaGFyZWQgcGFydCBmaXJzdCwgdGhlbiBjb21w YXJlIGJ5IGxlbmd0aCAqLworCXJlcyA9IHN0cm5jbXAoY3h0LT5wYXRoLCBwYXRoLCBNaW4o Y3h0LT5wYXRobGVuLCBwYXRobGVuKSk7CisKKwlyZXR1cm4gcmVzID8gcmVzIDogY3h0LT5w YXRobGVuIC0gcGF0aGxlbjsKK30KKworLyoKKyAqIGpzb25TdGF0c0ZpbmRQYXRoCisgKgkJ RmluZCBzdGF0cyBmb3IgYSBnaXZlbiBwYXRoLgorICoKKyAqIFRoZSBzdGF0cyBhcmUgc29y dGVkIGJ5IHBhdGgsIHNvIHdlIGNhbiBzaW1wbHkgZG8gYnNlYXJjaCgpLgorICogVGhpcyBp cyBsb3ctbGV2ZWwgZnVuY3Rpb24gYW5kIGpzZGF0YS0+cHJlZml4IGlzIG5vdCBjb25zaWRl cmVkLCB0aGUgY2FsbGVyCisgKiBzaG91bGQgaGFuZGxlIGl0IGJ5IGl0c2VsZi4KKyAqLwor c3RhdGljIEpzb25QYXRoU3RhdHMKK2pzb25TdGF0c0ZpbmRQYXRoKEpzb25TdGF0cyBqc2Rh dGEsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXRobGVuKQoreworCUpzb25QYXRoU3RhdHNT ZWFyY2hDb250ZXh0IGN4dDsKKwlKc29uUGF0aFN0YXRzIHN0YXRzOworCURhdHVtCSAgICpw ZGF0dW07CisJaW50CQkJaW5kZXg7CisKKwljeHQuc3RhdHMgPSBqc2RhdGE7CisJY3h0LnBh dGggPSBwYXRoOworCWN4dC5wYXRobGVuID0gcGF0aGxlbjsKKworCXBkYXR1bSA9IGJzZWFy Y2goJmN4dCwganNkYXRhLT5wYXRoZGF0dW1zLCBqc2RhdGEtPm5wYXRocywKKwkJCQkJIHNp emVvZigqanNkYXRhLT5wYXRoZGF0dW1zKSwganNvblBhdGhTdGF0c0NvbXBhcmUpOworCisJ aWYgKCFwZGF0dW0pCisJCXJldHVybiBOVUxMOworCisJaW5kZXggPSBwZGF0dW0gLSBqc2Rh dGEtPnBhdGhkYXR1bXM7CisJc3RhdHMgPSAmanNkYXRhLT5wYXRoc1tpbmRleF07CisKKwlB c3NlcnQoc3RhdHMtPnBhdGgpOworCUFzc2VydChzdGF0cy0+cGF0aGxlbiA9PSBwYXRobGVu KTsKKworCS8qIEluaXQgYWxsIGZpZWxkcyBpZiBuZWVkZWQgKHN0YXRzLT5kYXRhID09IE5V TEwgbWVhbnMgdW5pbml0aWFsaXplZCkgKi8KKwlpZiAoIXN0YXRzLT5kYXRhKQorCXsKKwkJ c3RhdHMtPmRhdGEgPSBqc2RhdGE7CisJCXN0YXRzLT5kYXR1bSA9IHBkYXR1bTsKKwkJc3Rh dHMtPnR5cGUgPSBKc29uUGF0aFN0YXRzVmFsdWVzOworCX0KKworCXJldHVybiBzdGF0czsK K30KKworLyoKKyAqIGpzb25TdGF0c0dldFBhdGhCeVN0cgorICoJCUZpbmQgc3RhdHMgZm9y IGEgZ2l2ZW4gcGF0aCBzdHJpbmcgY29uc2lkZXJpbmcganNkYXRhLT5wcmVmaXguCisgKi8K K0pzb25QYXRoU3RhdHMKK2pzb25TdGF0c0dldFBhdGhCeVN0cihKc29uU3RhdHMganNkYXRh LCBjb25zdCBjaGFyICpzdWJwYXRoLCBpbnQgc3VicGF0aGxlbikKK3sKKwlKc29uUGF0aFN0 YXRzIHN0YXRzOworCWNoYXIJICAgKnBhdGg7CisJaW50CQkJcGF0aGxlbjsKKworCWlmIChq c2RhdGEtPm51bGxmcmFjID49IDEuMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXRobGVuID0g anNkYXRhLT5wcmVmaXhsZW4gKyBzdWJwYXRobGVuIC0gMTsKKwlwYXRoID0gcGFsbG9jKHBh dGhsZW4pOworCisJbWVtY3B5KHBhdGgsIGpzZGF0YS0+cHJlZml4LCBqc2RhdGEtPnByZWZp eGxlbik7CisJbWVtY3B5KCZwYXRoW2pzZGF0YS0+cHJlZml4bGVuXSwgJnN1YnBhdGhbMV0s IHN1YnBhdGhsZW4gLSAxKTsKKworCXN0YXRzID0ganNvblN0YXRzRmluZFBhdGgoanNkYXRh LCBwYXRoLCBwYXRobGVuKTsKKworCWlmICghc3RhdHMpCisJCXBmcmVlKHBhdGgpOworCisJ cmV0dXJuIHN0YXRzOworfQorCisvKgorICoganNvblN0YXRzR2V0Um9vdFBhdGgKKyAqCQlG aW5kIEpTT04gc3RhdHMgZm9yIHJvb3QgcHJlZml4IHBhdGguCisgKi8KK3N0YXRpYyBKc29u UGF0aFN0YXRzCitqc29uU3RhdHNHZXRSb290UGF0aChKc29uU3RhdHMganNkYXRhKQorewor CWlmIChqc2RhdGEtPm51bGxmcmFjID49IDEuMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1 cm4ganNvblN0YXRzRmluZFBhdGgoanNkYXRhLCBqc2RhdGEtPnByZWZpeCwganNkYXRhLT5w cmVmaXhsZW4pOworfQorCisjZGVmaW5lIGpzb25TdGF0c0dldFJvb3RBcnJheVBhdGgoanNk YXRhKSBcCisJCWpzb25TdGF0c0dldFBhdGhCeVN0cihqc2RhdGEsIEpTT05fUEFUSF9ST09U X0FSUkFZLCBKU09OX1BBVEhfUk9PVF9BUlJBWV9MRU4pCisKKy8qCisgKiBqc29uUGF0aEFw cGVuZEVudHJ5CisgKgkJQXBwZW5kIGVudHJ5IChyZXByZXNlbnRlZCBhcyBzaW1wbGUgc3Ry aW5nKSB0byBhIHBhdGguCisgKgorICogTlVMTCBlbnRyeSBpcyB0cmVhdGVkIGFzIHdpbGRj YXJkIGFycmF5IGFjY2Vzc29yICJbKl0iLgorICovCit2b2lkCitqc29uUGF0aEFwcGVuZEVu dHJ5KFN0cmluZ0luZm8gcGF0aCwgY29uc3QgY2hhciAqZW50cnkpCit7CisJaWYgKGVudHJ5 KQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhwYXRoLCAnLicpOworCQllc2Nh cGVfanNvbihwYXRoLCBlbnRyeSk7CisJfQorCWVsc2UKKwkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhwYXRoLCAiWypdIik7Cit9CisKKy8qCisgKiBqc29uUGF0aEFwcGVuZEVudHJ5V2l0 aExlbgorICoJCUFwcGVuZCBzdHJpbmcgKHJlcHJlc2VudGVkIGFzIHN0cmluZyArIGxlbmd0 aCkgdG8gYSBwYXRoLgorICovCitzdGF0aWMgdm9pZAoranNvblBhdGhBcHBlbmRFbnRyeVdp dGhMZW4oU3RyaW5nSW5mbyBwYXRoLCBjb25zdCBjaGFyICplbnRyeSwgaW50IGxlbikKK3sK KwljaGFyICp0bXBlbnRyeSA9IHBuc3RyZHVwKGVudHJ5LCBsZW4pOworCWpzb25QYXRoQXBw ZW5kRW50cnkocGF0aCwgdG1wZW50cnkpOworCXBmcmVlKHRtcGVudHJ5KTsKK30KKworLyoK KyAqIGpzb25QYXRoU3RhdHNHZXRTdWJwYXRoCisgKgkJRmluZCBKU09OIHBhdGggc3RhdHMg Zm9yIG9iamVjdCBrZXkgb3IgYXJyYXkgZWxlbWVudHMgKGlmICdrZXknID0gTlVMTCkuCisg Ki8KK0pzb25QYXRoU3RhdHMKK2pzb25QYXRoU3RhdHNHZXRTdWJwYXRoKEpzb25QYXRoU3Rh dHMgcHN0YXRzLCBjb25zdCBjaGFyICprZXkpCit7CisJSnNvblBhdGhTdGF0cyBzcHN0YXRz OworCVN0cmluZ0luZm9EYXRhIHN0cjsKKworCWluaXRTdHJpbmdJbmZvKCZzdHIpOworCWFw cGVuZEJpbmFyeVN0cmluZ0luZm8oJnN0ciwgcHN0YXRzLT5wYXRoLCBwc3RhdHMtPnBhdGhs ZW4pOworCWpzb25QYXRoQXBwZW5kRW50cnkoJnN0ciwga2V5KTsKKworCXNwc3RhdHMgPSBq c29uU3RhdHNGaW5kUGF0aChwc3RhdHMtPmRhdGEsIHN0ci5kYXRhLCBzdHIubGVuKTsKKwlp ZiAoIXNwc3RhdHMpCisJCXBmcmVlKHN0ci5kYXRhKTsKKworCXJldHVybiBzcHN0YXRzOwor fQorCisvKgorICoganNvblBhdGhTdGF0c0dldEFycmF5SW5kZXhTZWxlY3Rpdml0eQorICoJ CUdpdmVuIHN0YXRzIGZvciBhIHBhdGgsIGRldGVybWluZSBzZWxlY3Rpdml0eSBmb3IgYW4g YXJyYXkgaW5kZXguCisgKi8KK1NlbGVjdGl2aXR5Citqc29uUGF0aFN0YXRzR2V0QXJyYXlJ bmRleFNlbGVjdGl2aXR5KEpzb25QYXRoU3RhdHMgcHN0YXRzLCBpbnQgaW5kZXgpCit7CisJ SnNvblBhdGhTdGF0cyBsZW5zdGF0cyA9IGpzb25QYXRoU3RhdHNHZXRBcnJheUxlbmd0aFN0 YXRzKHBzdGF0cyk7CisJSnNvbmJWYWx1ZQl0bXBqYnY7CisJSnNvbmIJICAgKmpiOworCisJ LyoKKwkgKiBJZiB3ZSBoYXZlIG5vIGFycmF5IGxlbmd0aCBzdGF0cywgYXNzdW1lIGFsbCBk b2N1bWVudHMgbWF0Y2guCisJICoKKwkgKiBYWFggU2hvdWxkbid0IHRoaXMgdXNlIGEgZGVm YXVsdCBzbWFsbGVyIHRoYW4gMS4wPyBXaGF0IGRvIHRoZSBzZWxmdW5jcworCSAqIGZvciBy ZWd1bGFyIGFycmF5cyB1c2U/CisJICovCisJaWYgKCFsZW5zdGF0cykKKwkJcmV0dXJuIDEu MDsKKworCWpiID0gSnNvbmJWYWx1ZVRvSnNvbmIoSnNvblZhbHVlSW5pdEludGVnZXIoJnRt cGpidiwgaW5kZXgpKTsKKworCS8qIGNhbGN1bGF0ZSBmcmFjdGlvbiBvZiBlbGVtZW50cyBz bWFsbGVyIHRoYW4gdGhlIGluZGV4ICovCisJcmV0dXJuIGpzb25TZWxlY3Rpdml0eShsZW5z dGF0cywgSnNvbmJQR2V0RGF0dW0oamIpLCBKc29uYkd0T3BlcmF0b3IpOworfQorCisvKgor ICoganNvblN0YXRzR2V0UGF0aAorICoJCUZpbmQgSlNPTiBzdGF0aXN0aWNzIGZvciBhIGdp dmVuIHBhdGguCisgKgorICogJ3BhdGgnIGlzIGFuIGFycmF5IG9mIHRleHQgZGF0dW1zIG9m IGxlbmd0aCAncGF0aGxlbicgKGNhbiBiZSB6ZXJvKS4KKyAqLworc3RhdGljIEpzb25QYXRo U3RhdHMKK2pzb25TdGF0c0dldFBhdGgoSnNvblN0YXRzIGpzZGF0YSwgRGF0dW0gKnBhdGgs IGludCBwYXRobGVuLAorCQkJCSBib29sIHRyeV9hcnJheXNfaW5kZXhlcywgZmxvYXQ0ICpu dWxsZnJhYykKK3sKKwlKc29uUGF0aFN0YXRzIHBzdGF0cyA9IGpzb25TdGF0c0dldFJvb3RQ YXRoKGpzZGF0YSk7CisJU2VsZWN0aXZpdHkJc2VsID0gMS4wOworCisJZm9yIChpbnQgaSA9 IDA7IHBzdGF0cyAmJiBpIDwgcGF0aGxlbjsgaSsrKQorCXsKKwkJY2hhcgkgICAqa2V5ID0g VGV4dERhdHVtR2V0Q1N0cmluZyhwYXRoW2ldKTsKKwkJY2hhcgkgICAqdGFpbDsKKwkJaW50 CQkJaW5kZXg7CisKKwkJaWYgKCF0cnlfYXJyYXlzX2luZGV4ZXMpCisJCXsKKwkJCS8qIEZp bmQgb2JqZWN0IGtleSBzdGF0cyAqLworCQkJcHN0YXRzID0ganNvblBhdGhTdGF0c0dldFN1 YnBhdGgocHN0YXRzLCBrZXkpOworCQkJcGZyZWUoa2V5KTsKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJLyogVHJ5IHRvIGludGVycHJldCBwYXRoIGVudHJ5IGFzIGludGVnZXIgYXJyYXkg aW5kZXggKi8KKwkJZXJybm8gPSAwOworCQlpbmRleCA9IHN0cnRvaW50KGtleSwgJnRhaWws IDEwKTsKKworCQlpZiAodGFpbCA9PSBrZXkgfHwgKnRhaWwgIT0gJ1wwJyB8fCBlcnJubyAh PSAwKQorCQl7CisJCQkvKiBGaW5kIG9iamVjdCBrZXkgc3RhdHMgKi8KKwkJCXBzdGF0cyA9 IGpzb25QYXRoU3RhdHNHZXRTdWJwYXRoKHBzdGF0cywga2V5KTsKKwkJfQorCQllbHNlCisJ CXsKKwkJCS8qIEZpbmQgYXJyYXkgaW5kZXggc3RhdHMgKi8KKwkJCS8qIEZJWE1FIGNvbnNp ZGVyIG9iamVjdCBrZXkgImluZGV4IiBhbHNvICovCisJCQlKc29uUGF0aFN0YXRzIGFycnN0 YXRzID0ganNvblBhdGhTdGF0c0dldFN1YnBhdGgocHN0YXRzLCBOVUxMKTsKKworCQkJaWYg KGFycnN0YXRzKQorCQkJeworCQkJCWZsb2F0NAkJYXJyZnJlcSA9IGpzb25QYXRoU3RhdHNH ZXRGcmVxKHBzdGF0cywgMC4wKTsKKworCQkJCXNlbCAqPSBqc29uUGF0aFN0YXRzR2V0QXJy YXlJbmRleFNlbGVjdGl2aXR5KHBzdGF0cywgaW5kZXgpOworCisJCQkJaWYgKGFycmZyZXEg PiAwLjApCisJCQkJCXNlbCAvPSBhcnJmcmVxOworCQkJfQorCisJCQlwc3RhdHMgPSBhcnJz dGF0czsKKwkJfQorCisJCXBmcmVlKGtleSk7CisJfQorCisJKm51bGxmcmFjID0gMS4wIC0g c2VsOworCisJcmV0dXJuIHBzdGF0czsKK30KKworLyoKKyAqIGpzb25QYXRoU3RhdHNHZXRO ZXh0U3VicGF0aFN0YXRzCisgKgkJSXRlcmF0ZSBhbGwgY29sbGVjdGVkIHN1YnBhdGhzIG9m IGEgZ2l2ZW4gcGF0aC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgZm9y IGVzdGltYXRpb24gb2Ygc2VsZWN0aXZpdHkgb2YganNvbnBhdGgKKyAqICcuKicgYW5kICAn LioqJyBvcGVyYXRvcnMuCisgKgorICogVGhlIG5leHQgZm91bmQgc3VicGF0aCBpcyB3cml0 dGVuIGludG8gKnBrZXlzdGF0cywgd2hpY2ggc2hvdWxkIGJlIHNldCB0bworICogTlVMTCBi ZWZvcmUgdGhlIGZpcnN0IGNhbGwuCisgKgorICogSWYga2V5c09ubHkgaXMgdHJ1ZSwgZW1p dCBvbmx5IHRvcC1sZXZlbCBvYmplY3Qta2V5IHN1YnBhdGhzLgorICoKKyAqIFJldHVybnMg ZmFsc2Ugb24gdGhlIGVuZCBvZiBpdGVyYXRpb24gYW5kIHRydWUgb3RoZXJ3aXNlLgorICov Citib29sCitqc29uUGF0aFN0YXRzR2V0TmV4dFN1YnBhdGhTdGF0cyhKc29uUGF0aFN0YXRz IHN0YXRzLCBKc29uUGF0aFN0YXRzICpwa2V5c3RhdHMsCisJCQkJCQkJCSBib29sIGtleXNP bmx5KQoreworCUpzb25QYXRoU3RhdHMga2V5c3RhdHMgPSAqcGtleXN0YXRzOworCS8qIGNv bXB1dGUgbmV4dCBpbmRleCAqLworCWludAkJCWluZGV4ID0KKwkJKGtleXN0YXRzID8ga2V5 c3RhdHMtPmRhdHVtIDogc3RhdHMtPmRhdHVtKSAtIHN0YXRzLT5kYXRhLT5wYXRoZGF0dW1z ICsgMTsKKworCWlmIChzdGF0cy0+dHlwZSAhPSBKc29uUGF0aFN0YXRzVmFsdWVzKQorCQly ZXR1cm4gZmFsc2U7CS8qIGxlbmd0aCBzdGF0cyBkb2Ugbm90IGhhdmUgc3VicGF0aHMgKi8K KworCWZvciAoOyBpbmRleCA8IHN0YXRzLT5kYXRhLT5ucGF0aHM7IGluZGV4KyspCisJewor CQlEYXR1bQkgICAqcGF0aGRhdHVtID0gJnN0YXRzLT5kYXRhLT5wYXRoZGF0dW1zW2luZGV4 XTsKKwkJY29uc3QgY2hhciAqcGF0aDsKKwkJaW50CQkJcGF0aGxlbjsKKworCQlrZXlzdGF0 cyA9ICZzdGF0cy0+ZGF0YS0+cGF0aHNbaW5kZXhdOworCisJCWlmICghanNvblBhdGhTdGF0 c0dldFBhdGgoa2V5c3RhdHMsICpwYXRoZGF0dW0sICZwYXRoLCAmcGF0aGxlbikpCisJCQli cmVhazsJLyogaW52YWxpZCBwYXRoIHN0YXRzICovCisKKwkJLyogQnJlYWssIGlmIHN1YnBh dGggZG9lcyBub3Qgc3RhcnQgZnJvbSBhIGRlc2lyZWQgcHJlZml4ICovCisJCWlmIChwYXRo bGVuIDw9IHN0YXRzLT5wYXRobGVuIHx8CisJCQltZW1jbXAocGF0aCwgc3RhdHMtPnBhdGgs IHN0YXRzLT5wYXRobGVuKSkKKwkJCWJyZWFrOworCisJCWlmIChrZXlzT25seSkKKwkJewor CQkJY29uc3QgY2hhciAqYyA9ICZwYXRoW3N0YXRzLT5wYXRobGVuXTsKKworCQkJaWYgKCpj ID09ICdbJykKKwkJCXsKKwkJCQlBc3NlcnQoY1sxXSA9PSAnKicgJiYgY1syXSA9PSAnXScp OworCisjaWYgMAkvKiBUT0RPIGFkZCBzZXBhcmF0ZSBmbGFnIGZvciByZXF1ZXN0aW5nIHRv cC1sZXZlbCBhcnJheSBhY2Nlc3NvcnMgKi8KKwkJCQkvKiBza2lwIGlmIGl0IGlzIG5vdCBs YXN0IGtleSBpbiB0aGUgcGF0aCAqLworCQkJCWlmIChwYXRobGVuID4gc3RhdHMtPnBhdGhs ZW4gKyAzKQorI2VuZGlmCisJCQkJCWNvbnRpbnVlOwkvKiBza2lwIGFycmF5IGFjY2Vzc29y cyAqLworCQkJfQorCQkJZWxzZSBpZiAoKmMgPT0gJy4nKQorCQkJeworCQkJCS8qIGZpbmQg ZW5kIG9mICcuImtleSInICovCisJCQkJY29uc3QgY2hhciAqcGF0aGVuZCA9IHBhdGggKyBw YXRobGVuOworCisJCQkJaWYgKCsrYyA+PSBwYXRoZW5kIHx8ICpjICE9ICciJykKKwkJCQkJ YnJlYWs7CQkvKiBpbnZhbGlkIHBhdGggKi8KKworCQkJCXdoaWxlICgrK2MgPD0gcGF0aGVu ZCAmJiAqYyAhPSAnIicpCisJCQkJCWlmICgqYyA9PSAnXFwnKQkvKiBoYW5kbGUgZXNjYXBl ZCBjaGFycyAqLworCQkJCQkJYysrOworCisJCQkJaWYgKGMgPiBwYXRoZW5kKQorCQkJCQli cmVhazsJCS8qIGludmFsaWQgcGF0aCAqLworCisJCQkJLyogc2tpcCBpZiBpdCBpcyBub3Qg bGFzdCBrZXkgaW4gdGhlIHBhdGggKi8KKwkJCQlpZiAoYyA8IHBhdGhlbmQpCisJCQkJCWNv bnRpbnVlOworCQkJfQorCQkJZWxzZQorCQkJCWNvbnRpbnVlOwkvKiBpbnZhbGlkIHBhdGgg Ki8KKwkJfQorCisJCS8qIEluaXQgcGF0aCBzdGF0cyBpZiBuZWVkZWQgKi8KKwkJaWYgKCFz dGF0cy0+ZGF0YSkKKwkJeworCQkJa2V5c3RhdHMtPmRhdGEgPSBzdGF0cy0+ZGF0YTsKKwkJ CWtleXN0YXRzLT5kYXR1bSA9IHBhdGhkYXR1bTsKKwkJCWtleXN0YXRzLT50eXBlID0gSnNv blBhdGhTdGF0c1ZhbHVlczsKKwkJfQorCisJCSpwa2V5c3RhdHMgPSBrZXlzdGF0czsKKwor CQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBqc29u U3RhdHNDb252ZXJ0QXJyYXkKKyAqCQlDb252ZXJ0IGEgSlNPTkIgYXJyYXkgaW50byBhbiBh cnJheSBvZiBzb21lIHJlZ3VsYXIgZGF0YSB0eXBlLgorICoKKyAqIFRoZSAidHlwZSIgaWRl bnRpZmllcyB3aGF0IGVsZW1lbnRzIGFyZSBpbiB0aGUgaW5wdXQgSlNPTkIgYXJyYXksIHdo aWxlCisgKiB0eXBpZCBkZXRlcm1pbmVzIHRoZSB0YXJnZXQgdHlwZS4KKyAqLworc3RhdGlj IERhdHVtCitqc29uU3RhdHNDb252ZXJ0QXJyYXkoRGF0dW0ganNvbmJWYWx1ZUFycmF5LCBK c29uU3RhdFR5cGUgdHlwZSwgT2lkIHR5cGlkLAorCQkJCQkgIGZsb2F0NCBtdWx0aXBsaWVy KQoreworCURhdHVtCSAgICp2YWx1ZXM7CisJSnNvbmIJICAgKmpidmFsczsKKwlKc29uYlZh bHVlCWpidjsKKwlKc29uYkl0ZXJhdG9yICppdDsKKwlKc29uYkl0ZXJhdG9yVG9rZW4gcjsK KwlpbnQJCQludmFsdWVzOworCWludAkJCWk7CisJaW50MTYJCXR5cGxlbjsKKwlib29sCQl0 eXBieXZhbDsKKwljaGFyCQl0eXBhbGlnbjsKKworCWlmICghRGF0dW1HZXRQb2ludGVyKGpz b25iVmFsdWVBcnJheSkpCisJCXJldHVybiBQb2ludGVyR2V0RGF0dW0oTlVMTCk7CisKKwlq YnZhbHMgPSBEYXR1bUdldEpzb25iUChqc29uYlZhbHVlQXJyYXkpOworCisJbnZhbHVlcyA9 IEpzb25Db250YWluZXJTaXplKCZqYnZhbHMtPnJvb3QpOworCisJdmFsdWVzID0gcGFsbG9j KHNpemVvZihEYXR1bSkgKiBudmFsdWVzKTsKKworCWZvciAoaSA9IDAsIGl0ID0gSnNvbmJJ dGVyYXRvckluaXQoJmpidmFscy0+cm9vdCk7CisJCShyID0gSnNvbmJJdGVyYXRvck5leHQo Jml0LCAmamJ2LCB0cnVlKSkgIT0gV0pCX0RPTkU7KQorCXsKKwkJaWYgKHIgPT0gV0pCX0VM RU0pCisJCXsKKwkJCURhdHVtIHZhbHVlOworCisJCQlzd2l0Y2ggKHR5cGUpCisJCQl7CisJ CQkJY2FzZSBKc29uU3RhdEpzb25iOgorCQkJCWNhc2UgSnNvblN0YXRKc29uYldpdGhvdXRT dWJwYXRoczoKKwkJCQkJdmFsdWUgPSBKc29uYlBHZXREYXR1bShKc29uYlZhbHVlVG9Kc29u YigmamJ2KSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBKc29uU3RhdFRleHQ6CisJCQkJ Y2FzZSBKc29uU3RhdFN0cmluZzoKKwkJCQkJQXNzZXJ0KGpidi50eXBlID09IGpidlN0cmlu Zyk7CisJCQkJCXZhbHVlID0gUG9pbnRlckdldERhdHVtKAorCQkJCQkJCQljc3RyaW5nX3Rv X3RleHRfd2l0aF9sZW4oamJ2LnZhbC5zdHJpbmcudmFsLAorCQkJCQkJCQkJCQkJCQkgamJ2 LnZhbC5zdHJpbmcubGVuKSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBKc29uU3RhdE51 bWVyaWM6CisJCQkJCUFzc2VydChqYnYudHlwZSA9PSBqYnZOdW1lcmljKTsKKwkJCQkJdmFs dWUgPSBOdW1lcmljR2V0RGF0dW0oamJ2LnZhbC5udW1lcmljKTsKKwkJCQkJYnJlYWs7CisK KwkJCQljYXNlIEpzb25TdGF0RmxvYXQ0OgorCQkJCQlBc3NlcnQoamJ2LnR5cGUgPT0gamJ2 TnVtZXJpYyk7CisJCQkJCXZhbHVlID0gRGlyZWN0RnVuY3Rpb25DYWxsMShudW1lcmljX2Zs b2F0NCwKKwkJCQkJCQkJCQkJCU51bWVyaWNHZXREYXR1bShqYnYudmFsLm51bWVyaWMpKTsK KwkJCQkJdmFsdWUgPSBGbG9hdDRHZXREYXR1bShEYXR1bUdldEZsb2F0NCh2YWx1ZSkgKiBt dWx0aXBsaWVyKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQllbG9nKEVS Uk9SLCAiaW52YWxpZCBqc29uIHN0YXQgdHlwZSAlZCIsIHR5cGUpOworCQkJCQl2YWx1ZSA9 IChEYXR1bSkgMDsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCUFzc2VydChpIDwgbnZhbHVl cyk7CisJCQl2YWx1ZXNbaSsrXSA9IHZhbHVlOworCQl9CisJfQorCisJQXNzZXJ0KGkgPT0g bnZhbHVlcyk7CisKKwlnZXRfdHlwbGVuYnl2YWxhbGlnbih0eXBpZCwgJnR5cGxlbiwgJnR5 cGJ5dmFsLCAmdHlwYWxpZ24pOworCisJcmV0dXJuIFBvaW50ZXJHZXREYXR1bSgKKwkJY29u c3RydWN0X2FycmF5KHZhbHVlcywgbnZhbHVlcywgdHlwaWQsIHR5cGxlbiwgdHlwYnl2YWws IHR5cGFsaWduKSk7Cit9CisKKy8qCisgKiBqc29uUGF0aFN0YXRzRXh0cmFjdERhdGEKKyAq CQlFeHRyYWN0IHBnX3N0YXRpc3RpY3MgdmFsdWVzIGZyb20gc3RhdGlzdGljcyBmb3IgYSBz aW5nbGUgcGF0aC4KKyAqCisgKiBFeHRyYWN0IG9yZGluYXJ5IE1DViwgSGlzdG9ncmFtLCBD b3JyZWxhdGlvbiBzbG90cyBmb3IgYSByZXF1ZXN0ZWQgc3RhdHMKKyAqIHR5cGUuIElmIHJl cXVlc3RlZCBzdGF0cyBmb3IgSlNPTkIsIGluY2x1ZGUgYWxzbyB0cmFuc2Zvcm1lZCBKU09O IHNsb3QgZm9yCisgKiBhIHBhdGggYW5kIHBvc3NpYmx5IGZvciBpdHMgc3VicGF0aHMuCisg Ki8KK3N0YXRpYyBib29sCitqc29uUGF0aFN0YXRzRXh0cmFjdERhdGEoSnNvblBhdGhTdGF0 cyBwc3RhdHMsIEpzb25TdGF0VHlwZSBzdGF0dHlwZSwKKwkJCQkJCSBmbG9hdDQgbnVsbGZy YWMsIFN0YXRzRGF0YSAqc3RhdGRhdGEpCit7CisJRGF0dW0JCWRhdGE7CisJRGF0dW0JCW51 bGxmOworCURhdHVtCQlkaXN0OworCURhdHVtCQl3aWR0aDsKKwlEYXR1bQkJbWN2OworCURh dHVtCQloc3Q7CisJRGF0dW0JCWNvcnI7CisJT2lkCQkJdHlwZTsKKwlPaWQJCQllcW9wOwor CU9pZAkJCWx0b3A7CisJY29uc3QgY2hhciAqa2V5OworCVN0YXRzU2xvdCAgKnNsb3QgPSBz dGF0ZGF0YS0+c2xvdHM7CisKKwludWxsZnJhYyA9IDEuMCAtICgxLjAgLSBwc3RhdHMtPmRh dGEtPm51bGxmcmFjKSAqICgxLjAgLSBudWxsZnJhYyk7CisKKwkvKgorCSAqIERlcGVuZGlu ZyBvbiByZXF1ZXN0ZWQgc3RhdGlzdGljcyB0eXBlLCBzZWxlY3Q6CisJICoJLSBzdGF2YWx1 ZXMgZGF0YSB0eXBlCisJICoJLSBjb3JyZXNwb25kaW5nIGVxL2x0IG9wZXJhdG9ycworCSAq CS0gSlNPTkIgZmllbGQsIGNvbnRhaW5pbmcgc3RhdHMgc2xvdHMgZm9yIHRoaXMgc3RhdGlz dGljcyB0eXBlCisJICovCisJc3dpdGNoIChzdGF0dHlwZSkKKwl7CisJCWNhc2UgSnNvblN0 YXRKc29uYjoKKwkJY2FzZSBKc29uU3RhdEpzb25iV2l0aG91dFN1YnBhdGhzOgorCQkJa2V5 ID0gcHN0YXRzLT50eXBlID09IEpzb25QYXRoU3RhdHNBcnJheUxlbmd0aCA/ICJhcnJheV9s ZW5ndGgiIDoKKwkJCQkgIHBzdGF0cy0+dHlwZSA9PSBKc29uUGF0aFN0YXRzT2JqZWN0TGVu Z3RoID8gIm9iamVjdF9sZW5ndGgiIDoKKwkJCQkgICJqc29uIjsKKwkJCXR5cGUgPSBKU09O Qk9JRDsKKwkJCWVxb3AgPSBKc29uYkVxT3BlcmF0b3I7CisJCQlsdG9wID0gSnNvbmJMdE9w ZXJhdG9yOworCQkJYnJlYWs7CisJCWNhc2UgSnNvblN0YXRUZXh0OgorCQkJa2V5ID0gInRl eHQiOworCQkJdHlwZSA9IFRFWFRPSUQ7CisJCQllcW9wID0gVGV4dEVxdWFsT3BlcmF0b3I7 CisJCQlsdG9wID0gVGV4dExlc3NPcGVyYXRvcjsKKwkJCWJyZWFrOworCQljYXNlIEpzb25T dGF0U3RyaW5nOgorCQkJa2V5ID0gInN0cmluZyI7CisJCQl0eXBlID0gVEVYVE9JRDsKKwkJ CWVxb3AgPSBUZXh0RXF1YWxPcGVyYXRvcjsKKwkJCWx0b3AgPSBUZXh0TGVzc09wZXJhdG9y OworCQkJYnJlYWs7CisJCWNhc2UgSnNvblN0YXROdW1lcmljOgorCQkJa2V5ID0gIm51bWVy aWMiOworCQkJdHlwZSA9IE5VTUVSSUNPSUQ7CisJCQllcW9wID0gTnVtZXJpY0VxT3BlcmF0 b3I7CisJCQlsdG9wID0gTnVtZXJpY0x0T3BlcmF0b3I7CisJCQlicmVhazsKKwkJY2FzZSBK c29uU3RhdEZsb2F0NDoJLyogc3BlY2lhbCBpbnRlcm5hbCBzdGF0cyB0eXBlICovCisJCWRl ZmF1bHQ6CisJCQllbG9nKEVSUk9SLCAiaW52YWxpZCBqc29uIHN0YXRpc3RpYyB0eXBlICVk Iiwgc3RhdHR5cGUpOworCQkJYnJlYWs7CisJfQorCisJLyogRXh0cmFjdCBvYmplY3QgY29u dGFpbmluZyBzbG90cyAqLworCWRhdGEgPSBqc29uR2V0RmllbGQoKnBzdGF0cy0+ZGF0dW0s IGtleSk7CisKKwlpZiAoIURhdHVtR2V0UG9pbnRlcihkYXRhKSkKKwkJcmV0dXJuIGZhbHNl OworCisJbnVsbGYgPSBqc29uR2V0RmllbGQoZGF0YSwgIm51bGxmcmFjIik7CisJZGlzdCA9 IGpzb25HZXRGaWVsZChkYXRhLCAiZGlzdGluY3QiKTsKKwl3aWR0aCA9IGpzb25HZXRGaWVs ZChkYXRhLCAid2lkdGgiKTsKKwltY3YgPSBqc29uR2V0RmllbGQoZGF0YSwgIm1jdiIpOwor CWhzdCA9IGpzb25HZXRGaWVsZChkYXRhLCAiaGlzdG9ncmFtIik7CisJY29yciA9IGpzb25H ZXRGaWVsZChkYXRhLCAiY29ycmVsYXRpb24iKTsKKworCXN0YXRkYXRhLT5udWxsZnJhYyA9 IGpzb25HZXRGbG9hdDQobnVsbGYsIDApOworCXN0YXRkYXRhLT5kaXN0aW5jdCA9IGpzb25H ZXRGbG9hdDQoZGlzdCwgMCk7CisJc3RhdGRhdGEtPndpZHRoID0gKGludDMyKSBqc29uR2V0 RmxvYXQ0KHdpZHRoLCAwKTsKKworCXN0YXRkYXRhLT5udWxsZnJhYyArPSAoMS4wIC0gc3Rh dGRhdGEtPm51bGxmcmFjKSAqIG51bGxmcmFjOworCisJLyogSW5jbHVkZSBNQ1Ygc2xvdCBp ZiBleGlzdHMgKi8KKwlpZiAoRGF0dW1HZXRQb2ludGVyKG1jdikpCisJeworCQlzbG90LT5r aW5kID0gU1RBVElTVElDX0tJTkRfTUNWOworCQlzbG90LT5vcGlkID0gZXFvcDsKKwkJc2xv dC0+bnVtYmVycyA9IGpzb25TdGF0c0NvbnZlcnRBcnJheShqc29uR2V0RmllbGQobWN2LCAi bnVtYmVycyIpLAorCQkJCQkJCQkJCQkgIEpzb25TdGF0RmxvYXQ0LCBGTE9BVDRPSUQsCisJ CQkJCQkJCQkJCSAgMS4wIC0gbnVsbGZyYWMpOworCQlzbG90LT52YWx1ZXMgID0ganNvblN0 YXRzQ29udmVydEFycmF5KGpzb25HZXRGaWVsZChtY3YsICJ2YWx1ZXMiKSwKKwkJCQkJCQkJ CQkJICBzdGF0dHlwZSwgdHlwZSwgMCk7CisJCXNsb3QrKzsKKwl9CisKKwkvKiBJbmNsdWRl IEhpc3RvZ3JhbSBzbG90IGlmIGV4aXN0cyAqLworCWlmIChEYXR1bUdldFBvaW50ZXIoaHN0 KSkKKwl7CisJCXNsb3QtPmtpbmQgPSBTVEFUSVNUSUNfS0lORF9ISVNUT0dSQU07CisJCXNs b3QtPm9waWQgPSBsdG9wOworCQlzbG90LT5udW1iZXJzID0ganNvblN0YXRzQ29udmVydEFy cmF5KGpzb25HZXRGaWVsZChoc3QsICJudW1iZXJzIiksCisJCQkJCQkJCQkJCSAgSnNvblN0 YXRGbG9hdDQsIEZMT0FUNE9JRCwgMS4wKTsKKwkJc2xvdC0+dmFsdWVzICA9IGpzb25TdGF0 c0NvbnZlcnRBcnJheShqc29uR2V0RmllbGQoaHN0LCAidmFsdWVzIiksCisJCQkJCQkJCQkJ CSAgc3RhdHR5cGUsIHR5cGUsIDApOworCQlzbG90Kys7CisJfQorCisJLyogSW5jbHVkZSBD b3JyZWxhdGlvbiBzbG90IGlmIGV4aXN0cyAqLworCWlmIChEYXR1bUdldFBvaW50ZXIoY29y cikpCisJeworCQlEYXR1bQkJY29ycmVsYXRpb24gPSBGbG9hdDRHZXREYXR1bShqc29uR2V0 RmxvYXQ0KGNvcnIsIDApKTsKKworCQlzbG90LT5raW5kID0gU1RBVElTVElDX0tJTkRfQ09S UkVMQVRJT047CisJCXNsb3QtPm9waWQgPSBsdG9wOworCQlzbG90LT5udW1iZXJzID0gUG9p bnRlckdldERhdHVtKGNvbnN0cnVjdF9hcnJheSgmY29ycmVsYXRpb24sIDEsCisJCQkJCQkJ CQkJCQkJCUZMT0FUNE9JRCwgNCwgdHJ1ZSwKKwkJCQkJCQkJCQkJCQkJJ2knKSk7CisJCXNs b3QrKzsKKwl9CisKKwkvKiBJbmNsdWRlIEpTT04gc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBw YXRoIGFuZCBwb3NzaWJseSBmb3IgaXRzIHN1YnBhdGhzICovCisJaWYgKChzdGF0dHlwZSA9 PSBKc29uU3RhdEpzb25iIHx8CisJCSBzdGF0dHlwZSA9PSBKc29uU3RhdEpzb25iV2l0aG91 dFN1YnBhdGhzKSAmJgorCQlqc29uQW5hbHl6ZUJ1aWxkU3ViUGF0aHNEYXRhKHBzdGF0cy0+ ZGF0YS0+cGF0aGRhdHVtcywKKwkJCQkJCQkJCSBwc3RhdHMtPmRhdGEtPm5wYXRocywKKwkJ CQkJCQkJCSBwc3RhdHMtPmRhdHVtIC0gcHN0YXRzLT5kYXRhLT5wYXRoZGF0dW1zLAorCQkJ CQkJCQkJIHBzdGF0cy0+cGF0aCwKKwkJCQkJCQkJCSBwc3RhdHMtPnBhdGhsZW4sCisJCQkJ CQkJCQkgc3RhdHR5cGUgPT0gSnNvblN0YXRKc29uYiwKKwkJCQkJCQkJCSBudWxsZnJhYywK KwkJCQkJCQkJCSAmc2xvdC0+dmFsdWVzLAorCQkJCQkJCQkJICZzbG90LT5udW1iZXJzKSkK Kwl7CisJCXNsb3QtPmtpbmQgPSBTVEFUSVNUSUNfS0lORF9KU09OOworCQlzbG90Kys7CisJ fQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBmbG9hdDQKK2pzb25QYXRoU3RhdHNH ZXRGbG9hdChKc29uUGF0aFN0YXRzIHBzdGF0cywgY29uc3QgY2hhciAqa2V5LCBmbG9hdDQg ZGVmYXVsdHZhbCkKK3sKKwlpZiAoIXBzdGF0cykKKwkJcmV0dXJuIGRlZmF1bHR2YWw7CisK KwlyZXR1cm4ganNvbkdldEZsb2F0NChqc29uR2V0RmllbGQoKnBzdGF0cy0+ZGF0dW0sIGtl eSksIGRlZmF1bHR2YWwpOworfQorCitmbG9hdDQKK2pzb25QYXRoU3RhdHNHZXRGcmVxKEpz b25QYXRoU3RhdHMgcHN0YXRzLCBmbG9hdDQgZGVmYXVsdGZyZXEpCit7CisJcmV0dXJuIGpz b25QYXRoU3RhdHNHZXRGbG9hdChwc3RhdHMsICJmcmVxIiwgZGVmYXVsdGZyZXEpOworfQor CitmbG9hdDQKK2pzb25QYXRoU3RhdHNHZXRBdmdBcnJheVNpemUoSnNvblBhdGhTdGF0cyBw c3RhdHMpCit7CisJcmV0dXJuIGpzb25QYXRoU3RhdHNHZXRGbG9hdChwc3RhdHMsICJhdmdf YXJyYXlfbGVuZ3RoIiwgMS4wKTsKK30KKworLyoKKyAqIGpzb25QYXRoU3RhdHNHZXRUeXBl RnJlcQorICoJCUdldCBmcmVxdWVuY3kgb2YgZGlmZmVyZW50IEpTT04gb2JqZWN0IHR5cGVz IGZvciBhIGdpdmVuIHBhdGguCisgKgorICogSlNPTiBkb2N1bWVudHMgZG9uJ3QgaGF2ZSBh bnkgcGFydGljdWxhciBzY2hlbWEsIGFuZCB0aGUgc2FtZSBwYXRoIG1heSBwb2ludAorICog dG8gdmFsdWVzIHdpdGggZGlmZmVyZW50IHR5cGVzIGluIG11bHRpcGxlIGRvY3VtZW50cy4g Q29uc2lkZXIgZm9yIGV4YW1wbGUKKyAqIHR3byBkb2N1bWVudHMgeyJhIiA6ICJiIn0gYW5k IHsiYSIgOiAxMDB9IHdoaWNoIGhhdmUgYm90aCBhIHN0cmluZyBhbmQgaW50CisgKiBmb3Ig dGhlIHNhbWUgcGF0aC4gU28gd2UgdHJhY2sgdGhlIGZyZXF1ZW5jeSBvZiBkaWZmZXJlbnQg SlNPTiB0eXBlcyBmb3IKKyAqIGVhY2ggcGF0aCwgc28gdGhhdCB3ZSBjYW4gY29uc2lkZXIg dGhpcyBsYXRlci4KKyAqLworZmxvYXQ0Citqc29uUGF0aFN0YXRzR2V0VHlwZUZyZXEoSnNv blBhdGhTdGF0cyBwc3RhdHMsIEpzb25iVmFsdWVUeXBlIHR5cGUsCisJCQkJCQkgZmxvYXQ0 IGRlZmF1bHRmcmVxKQoreworCWNvbnN0IGNoYXIgKmtleTsKKworCWlmICghcHN0YXRzKQor CQlyZXR1cm4gZGVmYXVsdGZyZXE7CisKKwkvKgorCSAqIFdoZW4gZGVhbGluZyB3aXRoIChv YmplY3QvYXJyYXkpIGxlbmd0aCBzdGF0cywgd2Ugb25seSByZWFsbHkgY2FyZSBhYm91dAor CSAqIG9iamVjdHMgYW5kIGFycmF5cy4KKwkgKgorCSAqIExlbmd0aHMgYXJlIGFsd2F5cyBu dW1lcmljLCBzbyBzaW1wbHkgcmV0dXJuIDAgaWYgcmVxdWVzdGVkIGZyZXF1ZW5jeQorCSAq IG9mIG5vbi1udW1lcmljIHZhbHVlcy4KKwkgKi8KKwlpZiAocHN0YXRzLT50eXBlID09IEpz b25QYXRoU3RhdHNBcnJheUxlbmd0aCkKKwl7CisJCWlmICh0eXBlICE9IGpidk51bWVyaWMp CisJCQlyZXR1cm4gMC4wOworCisJCXJldHVybiBqc29uUGF0aFN0YXRzR2V0RmxvYXQocHN0 YXRzLCAiZnJlcV9hcnJheSIsIGRlZmF1bHRmcmVxKTsKKwl9CisKKwlpZiAocHN0YXRzLT50 eXBlID09IEpzb25QYXRoU3RhdHNPYmplY3RMZW5ndGgpCisJeworCQlpZiAodHlwZSAhPSBq YnZOdW1lcmljKQorCQkJcmV0dXJuIDAuMDsKKworCQlyZXR1cm4ganNvblBhdGhTdGF0c0dl dEZsb2F0KHBzdGF0cywgImZyZXFfb2JqZWN0IiwgZGVmYXVsdGZyZXEpOworCX0KKworCS8q IFdoaWNoIEpTT04gdHlwZSBhcmUgd2UgaW50ZXJlc3RlZCBpbj8gUGljayB0aGUgcmlnaHQg ZnJlcV90eXBlIGtleS4gKi8KKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIGpidk51bGw6 CisJCQlrZXkgPSAiZnJlcV9udWxsIjsKKwkJCWJyZWFrOworCQljYXNlIGpidlN0cmluZzoK KwkJCWtleSA9ICJmcmVxX3N0cmluZyI7CisJCQlicmVhazsKKwkJY2FzZSBqYnZOdW1lcmlj OgorCQkJa2V5ID0gImZyZXFfbnVtZXJpYyI7CisJCQlicmVhazsKKwkJY2FzZSBqYnZCb29s OgorCQkJa2V5ID0gImZyZXFfYm9vbGVhbiI7CisJCQlicmVhazsKKwkJY2FzZSBqYnZPYmpl Y3Q6CisJCQlrZXkgPSAiZnJlcV9vYmplY3QiOworCQkJYnJlYWs7CisJCWNhc2UgamJ2QXJy YXk6CisJCQlrZXkgPSAiZnJlcV9hcnJheSI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJ CWVsb2coRVJST1IsICJJbnZhbGlkIGpzb25iIHZhbHVlIHR5cGU6ICVkIiwgdHlwZSk7CisJ CQlicmVhazsKKwl9CisKKwlyZXR1cm4ganNvblBhdGhTdGF0c0dldEZsb2F0KHBzdGF0cywg a2V5LCBkZWZhdWx0ZnJlcSk7Cit9CisKKy8qCisgKiBqc29uUGF0aFN0YXRzRm9ybVR1cGxl CisgKgkJRm9yIGEgcGdfc3RhdGlzdGljIHR1cGxlIHJlcHJlc2VudGluZyBKU09OIHN0YXRp c3RpY3MuCisgKgorICogWFhYIE1heWJlIGl0J3MgYSBiaXQgZXhwZW5zaXZlIHRvIGZpcnN0 IGJ1aWxkIFN0YXRzRGF0YSBhbmQgdGhlbiB0cmFuc2Zvcm0gaXQKKyAqIGFnYWluIHdoaWxl IGJ1aWxkaW5nIHRoZSB0dXBsZS4gQ291bGQgaXQgYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVw PyBXb3VsZCBpdCBiZQorICogbW9yZSBlZmZpY2llbnQ/IE5vdCBzdXJlIGhvdyBleHBlbnNp dmUgaXQgYWN0dWFsbHkgaXMsIHRob3VnaC4KKyAqLworc3RhdGljIEhlYXBUdXBsZQoranNv blBhdGhTdGF0c0Zvcm1UdXBsZShKc29uUGF0aFN0YXRzIHBzdGF0cywgSnNvblN0YXRUeXBl IHR5cGUsIGZsb2F0NCBudWxsZnJhYykKK3sKKwlTdGF0c0RhdGEJc3RhdGRhdGE7CisKKwlp ZiAoIXBzdGF0cyB8fCAhcHN0YXRzLT5kYXR1bSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgor CSAqIElmIGl0IGlzIHRoZSBvcmRpbmFyeSByb290IHBhdGggc3RhdHMsIHRoZXJlIGlzIG5v IG5lZWQgdG8gdHJhbnNmb3JtCisJICogdGhlIHR1cGxlLCBpdCBjYW4gYmUgc2ltcGx5IGNv cGllZC4KKwkgKi8KKwlpZiAocHN0YXRzLT5kYXR1bSA9PSAmcHN0YXRzLT5kYXRhLT5wYXRo ZGF0dW1zWzBdICYmCisJCXBzdGF0cy0+dHlwZSA9PSBKc29uUGF0aFN0YXRzVmFsdWVzKQor CQlyZXR1cm4gaGVhcF9jb3B5dHVwbGUocHN0YXRzLT5kYXRhLT5zdGF0c1R1cGxlKTsKKwor CU1lbVNldCgmc3RhdGRhdGEsIDAsIHNpemVvZihzdGF0ZGF0YSkpOworCisJaWYgKCFqc29u UGF0aFN0YXRzRXh0cmFjdERhdGEocHN0YXRzLCB0eXBlLCBudWxsZnJhYywgJnN0YXRkYXRh KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RhdHNfZm9ybV90dXBsZSgmc3RhdGRh dGEpOworfQorCisvKgorICoganNvblN0YXRzR2V0UGF0aFR1cGxlCisgKgkJRXh0cmFjdCBK U09OIHN0YXRpc3RpY3MgZm9yIGEgdGV4dFtdIHBhdGggYW5kIGZvcm0gcGdfc3RhdGlzdGlj cyB0dXBsZS4KKyAqLworc3RhdGljIEhlYXBUdXBsZQoranNvblN0YXRzR2V0UGF0aFR1cGxl KEpzb25TdGF0cyBqc2RhdGEsIEpzb25TdGF0VHlwZSB0eXBlLAorCQkJCQkgIERhdHVtICpw YXRoLCBpbnQgcGF0aGxlbiwgYm9vbCB0cnlfYXJyYXlzX2luZGV4ZXMpCit7CisJZmxvYXQ0 CQkJbnVsbGZyYWM7CisJSnNvblBhdGhTdGF0cwlwc3RhdHMgPSBqc29uU3RhdHNHZXRQYXRo KGpzZGF0YSwgcGF0aCwgcGF0aGxlbiwKKwkJCQkJCQkJCQkJICB0cnlfYXJyYXlzX2luZGV4 ZXMsICZudWxsZnJhYyk7CisKKwlyZXR1cm4ganNvblBhdGhTdGF0c0Zvcm1UdXBsZShwc3Rh dHMsIHR5cGUsIG51bGxmcmFjKTsKK30KKworLyoKKyAqIGpzb25TdGF0c0dldEFycmF5SW5k ZXhTdGF0c1R1cGxlCisgKgkJRXh0cmFjdCBKU09OIHN0YXRpc3RpY3MgZm9yIGEgYXJyYXkg aW5kZXggYW5kIGZvcm0gcGdfc3RhdGlzdGljcyB0dXBsZS4KKyAqLworc3RhdGljIEhlYXBU dXBsZQoranNvblN0YXRzR2V0QXJyYXlJbmRleFN0YXRzVHVwbGUoSnNvblN0YXRzIGpzZGF0 YSwgSnNvblN0YXRUeXBlIHR5cGUsIGludDMyIGluZGV4KQoreworCS8qIEV4dHJhY3Qgc3Rh dGlzdGljcyBmb3Igcm9vdCBhcnJheSBlbGVtZW50cyAqLworCUpzb25QYXRoU3RhdHMgYXJy c3RhdHMgPSBqc29uU3RhdHNHZXRSb290QXJyYXlQYXRoKGpzZGF0YSk7CisJSnNvblBhdGhT dGF0cyByb290c3RhdHM7CisJU2VsZWN0aXZpdHkJaW5kZXhfc2VsOworCisJaWYgKCFhcnJz dGF0cykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDb21wdXRlIHJlbGF0aXZlIHNlbGVjdGl2 aXR5IG9mICdFWElTVFMoJFtpbmRleF0pJyAqLworCXJvb3RzdGF0cyA9IGpzb25TdGF0c0dl dFJvb3RQYXRoKGpzZGF0YSk7CisJaW5kZXhfc2VsID0ganNvblBhdGhTdGF0c0dldEFycmF5 SW5kZXhTZWxlY3Rpdml0eShyb290c3RhdHMsIGluZGV4KTsKKwlpbmRleF9zZWwgLz0ganNv blBhdGhTdGF0c0dldEZyZXEoYXJyc3RhdHMsIDAuMCk7CisKKwkvKiBGb3JtIHBnX3N0YXRp c3RpY3MgdHVwbGUsIHRha2luZyBpbnRvIGFjY291bnQgYXJyYXkgaW5kZXggc2VsZWN0aXZp dHkgKi8KKwlyZXR1cm4ganNvblBhdGhTdGF0c0Zvcm1UdXBsZShhcnJzdGF0cywgdHlwZSwg MS4wIC0gaW5kZXhfc2VsKTsKK30KKworLyoKKyAqIGpzb25TdGF0c0dldFBhdGhGcmVxCisg KgkJUmV0dXJuIGZyZXF1ZW5jeSBvZiBhIHBhdGggKGZyYWN0aW9uIG9mIGRvY3VtZW50cyBj b250YWluaW5nIGl0KS4KKyAqLworc3RhdGljIGZsb2F0NAoranNvblN0YXRzR2V0UGF0aEZy ZXEoSnNvblN0YXRzIGpzZGF0YSwgRGF0dW0gKnBhdGgsIGludCBwYXRobGVuLAorCQkJCQkg Ym9vbCB0cnlfYXJyYXlfaW5kZXhlcykKK3sKKwlmbG9hdDQJCW51bGxmcmFjOworCUpzb25Q YXRoU3RhdHMgcHN0YXRzID0ganNvblN0YXRzR2V0UGF0aChqc2RhdGEsIHBhdGgsIHBhdGhs ZW4sCisJCQkJCQkJCQkJCXRyeV9hcnJheV9pbmRleGVzLCAmbnVsbGZyYWMpOworCWZsb2F0 NAkJZnJlcSA9ICgxLjAgLSBudWxsZnJhYykgKiBqc29uUGF0aFN0YXRzR2V0RnJlcShwc3Rh dHMsIDAuMCk7CisKKwlDTEFNUF9QUk9CQUJJTElUWShmcmVxKTsKKwlyZXR1cm4gZnJlcTsK K30KKworLyoKKyAqIGpzb25iU3RhdHNWYXJPcENvbnN0CisgKgkJUHJlcGFyZSBvcHRpbWl6 ZXIgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBvcGVyYXRvciwgZnJvbSBKU09OIHN0YXRzLgor ICoKKyAqIFRoaXMgaGFuZGxlcyBvbmx5IE9wRXhwciBleHByZXNzaW9ucywgd2l0aCB2YXJp YWJsZSBhbmQgYSBjb25zdGFudC4gV2UgZ2V0CisgKiB0aGUgY29uc3RhbnQgYXMgaXMsIGFu ZCB0aGUgdmFyaWFibGUgaXMgcmVwcmVzZW50ZWQgYnkgc3RhdGlzdGljcyBmZXRjaGVkCisg KiBieSBnZXRfcmVzdHJpY3Rpb25fdmFyaWFibGUoKS4KKyAqCisgKiBvcGlkICAgIC0gT0lE IG9mIHRoZSBvcGVyYXRvciAoaW5wdXQgcGFyYW1ldGVyKQorICogcmVzZGF0YSAtIHBvaW50 ZXIgdG8gY2FsY3VsYXRlZCBzdGF0aXN0aWNzIGZvciByZXN1bHQgb2Ygb3BlcmF0b3IKKyAq IHZhcmRhdGEgLSBzdGF0aXN0aWNzIGZvciB0aGUgcmVzdHJpY3Rpb24gdmFyaWFibGUKKyAq IGNuc3QgICAgLSBjb25zdGFudCBmcm9tIHRoZSBvcGVyYXRvciBleHByZXNzaW9uCisgKgor ICogUmV0dXJucyB0cnVlIHdoZW4gdXNlZnVsIG9wdGltaXplciBzdGF0aXN0aWNzIGhhdmUg YmVlbiBjYWxjdWxhdGVkLgorICovCitzdGF0aWMgYm9vbAoranNvbmJTdGF0c1Zhck9wQ29u c3QoT2lkIG9waWQsIFZhcmlhYmxlU3RhdERhdGEgKnJlc2RhdGEsCisJCQkJCSBjb25zdCBW YXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBDb25zdCAqY25zdCkKK3sKKwlKc29uU3RhdERh dGEganNkYXRhOworCUpzb25TdGF0VHlwZSBzdGF0eXBlID0gSnNvblN0YXRKc29uYjsKKwor CWlmICghanNvblN0YXRzSW5pdCgmanNkYXRhLCB2YXJkYXRhKSkKKwkJcmV0dXJuIGZhbHNl OworCisJc3dpdGNoIChvcGlkKQorCXsKKwkJY2FzZSBKc29uYk9iamVjdEZpZWxkVGV4dE9w ZXJhdG9yOgorCQkJc3RhdHlwZSA9IEpzb25TdGF0VGV4dDsKKwkJCS8qIEZBTExUSFJPVUdI ICovCisJCWNhc2UgSnNvbmJPYmplY3RGaWVsZE9wZXJhdG9yOgorCQl7CisJCQlpZiAoY25z dC0+Y29uc3R0eXBlICE9IFRFWFRPSUQpCisJCQl7CisJCQkJanNvblN0YXRzUmVsZWFzZSgm anNkYXRhKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXJlc2RhdGEtPnN0YXRz VHVwbGUgPSBqc29uU3RhdHNHZXRQYXRoVHVwbGUoJmpzZGF0YSwgc3RhdHlwZSwKKwkJCQkJ CQkJCQkJCQkJJmNuc3QtPmNvbnN0dmFsdWUsIDEsCisJCQkJCQkJCQkJCQkJCWZhbHNlKTsK KwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBKc29uYkFycmF5RWxlbWVudFRleHRPcGVyYXRv cjoKKwkJCXN0YXR5cGUgPSBKc29uU3RhdFRleHQ7CisJCQkvKiBGQUxMVEhST1VHSCAqLwor CQljYXNlIEpzb25iQXJyYXlFbGVtZW50T3BlcmF0b3I6CisJCXsKKwkJCWlmIChjbnN0LT5j b25zdHR5cGUgIT0gSU5UNE9JRCkKKwkJCXsKKwkJCQlqc29uU3RhdHNSZWxlYXNlKCZqc2Rh dGEpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmVzZGF0YS0+c3RhdHNUdXBs ZSA9CisJCQkJanNvblN0YXRzR2V0QXJyYXlJbmRleFN0YXRzVHVwbGUoJmpzZGF0YSwgc3Rh dHlwZSwKKwkJCQkJCQkJCQkJCSBEYXR1bUdldEludDMyKGNuc3QtPmNvbnN0dmFsdWUpKTsK KwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBKc29uYkV4dHJhY3RQYXRoVGV4dE9wZXJhdG9y OgorCQkJc3RhdHlwZSA9IEpzb25TdGF0VGV4dDsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJ CWNhc2UgSnNvbmJFeHRyYWN0UGF0aE9wZXJhdG9yOgorCQl7CisJCQlEYXR1bQkgICAqcGF0 aDsKKwkJCWJvb2wJICAgKm51bGxzOworCQkJaW50CQkJcGF0aGxlbjsKKwkJCWJvb2wJCWhh dmVfbnVsbHMgPSBmYWxzZTsKKworCQkJaWYgKGNuc3QtPmNvbnN0dHlwZSAhPSBURVhUQVJS QVlPSUQpCisJCQl7CisJCQkJanNvblN0YXRzUmVsZWFzZSgmanNkYXRhKTsKKwkJCQlyZXR1 cm4gZmFsc2U7CisJCQl9CisKKwkJCWRlY29uc3RydWN0X2FycmF5KERhdHVtR2V0QXJyYXlU eXBlUChjbnN0LT5jb25zdHZhbHVlKSwgVEVYVE9JRCwKKwkJCQkJCQkgIC0xLCBmYWxzZSwg J2knLCAmcGF0aCwgJm51bGxzLCAmcGF0aGxlbik7CisKKwkJCWZvciAoaW50IGkgPSAwOyBp IDwgcGF0aGxlbjsgaSsrKQorCQkJeworCQkJCWlmIChudWxsc1tpXSkKKwkJCQl7CisJCQkJ CWhhdmVfbnVsbHMgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlm ICghaGF2ZV9udWxscykKKwkJCQlyZXNkYXRhLT5zdGF0c1R1cGxlID0ganNvblN0YXRzR2V0 UGF0aFR1cGxlKCZqc2RhdGEsIHN0YXR5cGUsCisJCQkJCQkJCQkJCQkJCQlwYXRoLCBwYXRo bGVuLAorCQkJCQkJCQkJCQkJCQkJdHJ1ZSk7CisKKwkJCXBmcmVlKHBhdGgpOworCQkJcGZy ZWUobnVsbHMpOworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQkJanNvblN0YXRz UmVsZWFzZSgmanNkYXRhKTsKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIXJlc2Rh dGEtPnN0YXRzVHVwbGUpCisJCXJlc2RhdGEtPnN0YXRzVHVwbGUgPSBzdGF0c19mb3JtX3R1 cGxlKE5VTEwpOwkvKiBmb3JtIGFsbC1OVUxMIHR1cGxlICovCisKKwlyZXNkYXRhLT5hY2xf b2sgPSB2YXJkYXRhLT5hY2xfb2s7CisJcmVzZGF0YS0+ZnJlZWZ1bmMgPSBoZWFwX2ZyZWV0 dXBsZTsKKwlBc3NlcnQocmVzZGF0YS0+cmVsID09IHZhcmRhdGEtPnJlbCk7CisJQXNzZXJ0 KHJlc2RhdGEtPmF0dHR5cGUgPT0KKwkJKHN0YXR5cGUgPT0gSnNvblN0YXRKc29uYiA/IEpT T05CT0lEIDoKKwkJIHN0YXR5cGUgPT0gSnNvblN0YXRUZXh0ID8gVEVYVE9JRCA6CisJCSAv KiBzdGF0eXBlID09IEpzb25TdGF0RnJlcSAqLyBCT09MT0lEKSk7CisKKwlqc29uU3RhdHNS ZWxlYXNlKCZqc2RhdGEpOworCXJldHVybiB0cnVlOworfQorCisvKgorICoganNvbmJfc3Rh dHMKKyAqCQlTdGF0aXN0aWNzIGVzdGltYXRpb24gcHJvY2VkdXJlIGZvciBKU09OQiBkYXRh IHR5cGUuCisgKgorICogVGhpcyBvbmx5IHN1cHBvcnRzIE9wRXhwciBleHByZXNzaW9ucywg d2l0aCAoVmFyIG9wIENvbnN0KSBzaGFwZS4KKyAqCisgKiBWYXIgcmVhbGx5IGNhbiBiZSBh IGNoYWluIG9mIE9wRXhwcnMgd2l0aCBkZXJpdmVkIHN0YXRpc3RpY3MKKyAqIChqc29uYl9j b2x1bW4gLT4gJ2tleTEnIC0+IGtleTInKSwgYmVjYXVzZSBnZXRfcmVzdHJpY3Rpb25fdmFy aWFibGUoKQorICogYWxyZWFkeSBoYW5kbGVzIHRoaXMgY2FzZS4KKyAqLworRGF0dW0KK2pz b25iX3N0YXRzKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJUGxhbm5lckluZm8gKnJvb3QgPSAo UGxhbm5lckluZm8gKikgUEdfR0VUQVJHX1BPSU5URVIoMCk7CisJT3BFeHByCSAgICpvcGV4 cHIgPSAoT3BFeHByICopIFBHX0dFVEFSR19QT0lOVEVSKDEpOworCWludAkJCXZhclJlbGlk ID0gUEdfR0VUQVJHX0lOVDMyKDIpOworCVZhcmlhYmxlU3RhdERhdGEgKnJlc2RhdGEJPSAo VmFyaWFibGVTdGF0RGF0YSAqKSBQR19HRVRBUkdfUE9JTlRFUigzKTsKKwlWYXJpYWJsZVN0 YXREYXRhIHZhcmRhdGE7CisJTm9kZQkgICAqY29uc3RleHByOworCWJvb2wJCXZhcm9ubGVm dDsKKworCS8qIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgT3BFeHByIGV4cHJlc3Npb25z ICovCisJQXNzZXJ0KElzQShvcGV4cHIsIE9wRXhwcikpOworCisJLyogSXMgdGhlIGV4cHJl c3Npb24gc2ltcGxlIGVub3VnaD8gKFZhciBvcCBDb25zdCkgb3Igc2ltaWxhcj8gKi8KKwlp ZiAoIWdldF9yZXN0cmljdGlvbl92YXJpYWJsZShyb290LCBvcGV4cHItPmFyZ3MsIHZhclJl bGlkLAorCQkJCQkJCQkgICZ2YXJkYXRhLCAmY29uc3RleHByLCAmdmFyb25sZWZ0KSkKKwkJ UEdfUkVUVVJOX1ZPSUQoKTsKKworCS8qIFhYWCBDb3VsZCB3ZSBhbHNvIGdldCB2YXJvbmxl ZnQ9ZmFsc2UgaW4gdXNlZnVsIGNhc2VzPyAqLworCWlmIChJc0EoY29uc3RleHByLCBDb25z dCkgJiYgdmFyb25sZWZ0KQorCQlqc29uYlN0YXRzVmFyT3BDb25zdChvcGV4cHItPm9wbm8s IHJlc2RhdGEsICZ2YXJkYXRhLAorCQkJCQkJCSAoQ29uc3QgKikgY29uc3RleHByKTsKKwor CVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCisJUEdfUkVUVVJOX1ZPSUQoKTsK K30KKworLyoKKyAqIGpzb25TZWxlY3Rpdml0eQorICoJCVVzZSBKU09OIHN0YXRpc3RpY3Mg dG8gZXN0aW1hdGUgc2VsZWN0aXZpdHkgZm9yIChpbillcXVhbGl0aWVzLgorICoKKyAqIFRo ZSBzdGF0aXN0aWNzIGlzIHJlcHJlc2VudGVkIGFzIChhcnJheXMgb2YpIEpTT04gdmFsdWVz IGV0Yy4gc28gd2UKKyAqIG5lZWQgdG8gcGFzcyB0aGUgcmlnaHQgb3BlcmF0b3JzIHRvIHRo ZSBmdW5jdGlvbnMuCisgKi8KK1NlbGVjdGl2aXR5Citqc29uU2VsZWN0aXZpdHkoSnNvblBh dGhTdGF0cyBzdGF0cywgRGF0dW0gc2NhbGFyLCBPaWQgb3BlcmF0b3IpCit7CisJVmFyaWFi bGVTdGF0RGF0YSB2YXJkYXRhOworCVNlbGVjdGl2aXR5IHNlbDsKKworCWlmICghc3RhdHMp CisJCXJldHVybiAwLjA7CisKKwl2YXJkYXRhLmF0dHR5cGUgPSBKU09OQk9JRDsKKwl2YXJk YXRhLmF0dHR5cG1vZCA9IC0xOworCXZhcmRhdGEuaXN1bmlxdWUgPSBmYWxzZTsKKwl2YXJk YXRhLnJlbCA9IHN0YXRzLT5kYXRhLT5yZWw7CisJdmFyZGF0YS52YXIgPSBOVUxMOworCXZh cmRhdGEudmFydHlwZSA9IEpTT05CT0lEOworCXZhcmRhdGEuYWNsX29rID0gc3RhdHMtPmRh dGEtPmFjbF9vazsKKwl2YXJkYXRhLnN0YXRzVHVwbGUgPSBqc29uUGF0aFN0YXRzRm9ybVR1 cGxlKHN0YXRzLAorCQkJCQkJCQkJCQkJSnNvblN0YXRKc29uYldpdGhvdXRTdWJwYXRocywg MC4wKTsKKworCWlmIChvcGVyYXRvciA9PSBKc29uYkVxT3BlcmF0b3IpCisJCXNlbCA9IHZh cl9lcV9jb25zdCgmdmFyZGF0YSwgb3BlcmF0b3IsIEludmFsaWRPaWQsIHNjYWxhciwgZmFs c2UsIHRydWUsIGZhbHNlKTsKKwllbHNlCisJCXNlbCA9IHNjYWxhcmluZXFzZWwoTlVMTCwg b3BlcmF0b3IsCisJCQkJCQkJLyogaXMgaXQgZ3JlYXRlciBvciBncmVhdGVyLW9yLWVxdWFs PyAqLworCQkJCQkJCW9wZXJhdG9yID09IEpzb25iR3RPcGVyYXRvciB8fAorCQkJCQkJCW9w ZXJhdG9yID09IEpzb25iR2VPcGVyYXRvciwKKwkJCQkJCQkvKiBpcyBpdCBlcXVhbGl0eT8g Ki8KKwkJCQkJCQlvcGVyYXRvciA9PSBKc29uYkxlT3BlcmF0b3IgfHwKKwkJCQkJCQlvcGVy YXRvciA9PSBKc29uYkdlT3BlcmF0b3IsCisJCQkJCQkJSW52YWxpZE9pZCwKKwkJCQkJCQkm dmFyZGF0YSwgc2NhbGFyLCBKU09OQk9JRCk7CisKKwlpZiAodmFyZGF0YS5zdGF0c1R1cGxl KQorCQloZWFwX2ZyZWV0dXBsZSh2YXJkYXRhLnN0YXRzVHVwbGUpOworCisJcmV0dXJuIHNl bDsKK30KKworLyoKKyAqIGpzb25BY2N1bXVsYXRlU3ViUGF0aFNlbGVjdGl2aXR5CisgKgkJ VHJhbnNmb3JtIGFic29sdXRlIHN1YnBhdGggc2VsZWN0aXZpdHkgaW50byByZWxhdGl2ZSBh bmQgYWNjdW11bGF0ZSBpdAorICoJCWludG8gcGFyZW50IHBhdGggc2ltcGx5IGJ5IG11bHRp cGxpY2F0aW9uIG9mIHJlbGF0aXZlIHNlbGVjdGl2aXRpZXMuCisgKi8KK3N0YXRpYyB2b2lk Citqc29uQWNjdW11bGF0ZVN1YlBhdGhTZWxlY3Rpdml0eShTZWxlY3Rpdml0eSBzdWJwYXRo X2Fic19zZWwsCisJCQkJCQkJCSBTZWxlY3Rpdml0eSBwYXRoX2ZyZXEsCisJCQkJCQkJCSBT ZWxlY3Rpdml0eSAqcGF0aF9yZWxhdGl2ZV9zZWwsCisJCQkJCQkJCSBKc29uUGF0aFN0YXRz IGFycmF5X3BhdGhfc3RhdHMpCit7CisJU2VsZWN0aXZpdHkgc2VsID0gc3VicGF0aF9hYnNf c2VsIC8gcGF0aF9mcmVxOwkvKiByZWxhdGl2ZSBzZWxlY3Rpdml0eSAqLworCisJLyogWFhY IFRyeSB0byB0YWtlIGludG8gYWNjb3VudCBhcnJheSBsZW5ndGggKi8KKwlpZiAoYXJyYXlf cGF0aF9zdGF0cykKKwkJc2VsID0gMS4wIC0gcG93KDEuMCAtIHNlbCwKKwkJCQkJCWpzb25Q YXRoU3RhdHNHZXRBdmdBcnJheVNpemUoYXJyYXlfcGF0aF9zdGF0cykpOworCisJLyogQWNj dW11bGF0ZSBzZWxlY3Rpdml0eSBvZiBzdWJwYXRoIGludG8gcGFyZW50IHBhdGggKi8KKwkq cGF0aF9yZWxhdGl2ZV9zZWwgKj0gc2VsOworfQorCisvKgorICoganNvblNlbGVjdGl2aXR5 Q29udGFpbnMKKyAqCQlFc3RpbWF0ZSBzZWxlY3Rpdml0eSBmb3IgY29udGFpbm1lbnQgb3Bl cmF0b3Igb24gSlNPTi4KKyAqCisgKiBJdGVyYXRlIHRocm91Z2ggcXVlcnkganNvbmIgZWxl bWVudHMsIGJ1aWxkIHBhdGhzIHRvIGl0cyBsZWFmIGVsZW1lbnRzLAorICogY2FsY3VsYXRl IHNlbGVjdGl2aWVzIG9mICdwYXRoID09IHNjYWxhcicgaW4gbGVhdmVzLCBtdWx0aXBseSBy ZWxhdGl2ZQorICogc2VsZWN0aXZpdGllcyBvZiBzdWJwYXRocyBhdCBlYWNoIHBhdGggbGV2 ZWwsIHByb3BhZ2F0ZSBjb21wdXRlZAorICogc2VsZWN0aXZpdGllcyB0byB0aGUgcm9vdC4K KyAqLworc3RhdGljIFNlbGVjdGl2aXR5Citqc29uU2VsZWN0aXZpdHlDb250YWlucyhKc29u U3RhdHMgc3RhdHMsIEpzb25iICpqYikKK3sKKwlKc29uYlZhbHVlCQl2OworCUpzb25iSXRl cmF0b3IgICppdDsKKwlKc29uYkl0ZXJhdG9yVG9rZW4gcjsKKwlTdHJpbmdJbmZvRGF0YQlw YXRoc3RyOwkvKiBwYXRoIHN0cmluZyAqLworCXN0cnVjdCBQYXRoCQkJCQkvKiBwYXRoIHN0 YWNrIGVudHJ5ICovCisJeworCQlzdHJ1Y3QgUGF0aCAqcGFyZW50OwkvKiBwYXJlbnQgZW50 cnkgKi8KKwkJaW50CQkJbGVuOwkJLyogYXNzb2NpYXRlZCBsZW5ndGggb2YgcGF0aHN0ciAq LworCQlTZWxlY3Rpdml0eQlmcmVxOwkJLyogYWJzb2x1dGUgZnJlcXVlbmNlIG9mIHBhdGgg Ki8KKwkJU2VsZWN0aXZpdHkJc2VsOwkJLyogcmVsYXRpdmUgc2VsZWN0aXZpdHkgb2Ygc3Vi cGF0aHMgKi8KKwkJSnNvblBhdGhTdGF0cyBzdGF0czsJLyogc3RhdGlzdGljcyBmb3IgdGhl IHBhdGggKi8KKwkJYm9vbAkJaXNfYXJyYXlfYWNjZXNvcjsJLyogaXMgaXQgJ1sqXScgPyAq LworCX0JCQlyb290LAkJCS8qIHJvb3QgcGF0aCBlbnRyeSAqLworCQkJICAgKnBhdGggPSAm cm9vdDsJLyogcGF0aCBlbnRyeSBzdGFjayAqLworCVNlbGVjdGl2aXR5CXNlbDsJCQkvKiBy ZXN1bHRpbmcgc2VsZWN0aXZpdHkgKi8KKwlTZWxlY3Rpdml0eQlzY2FsYXJTZWw7CQkvKiBz ZWxlY3Rpdml0eSBvZiAnanNvbmIgPT0gc2NhbGFyJyAqLworCisJLyogSW5pdGlhbGl6ZSBy b290IHBhdGggc3RyaW5nICovCisJaW5pdFN0cmluZ0luZm8oJnBhdGhzdHIpOworCWFwcGVu ZEJpbmFyeVN0cmluZ0luZm8oJnBhdGhzdHIsIHN0YXRzLT5wcmVmaXgsIHN0YXRzLT5wcmVm aXhsZW4pOworCisJLyogSW5pdGlhbGl6ZSByb290IHBhdGggZW50cnkgKi8KKwlyb290LnBh cmVudCA9IE5VTEw7CisJcm9vdC5sZW4gPSBwYXRoc3RyLmxlbjsKKwlyb290LnN0YXRzID0g anNvblN0YXRzRmluZFBhdGgoc3RhdHMsIHBhdGhzdHIuZGF0YSwgcGF0aHN0ci5sZW4pOwor CXJvb3QuZnJlcSA9IGpzb25QYXRoU3RhdHNHZXRGcmVxKHJvb3Quc3RhdHMsIDAuMCk7CisJ cm9vdC5zZWwgPSAxLjA7CisJcm9vdC5pc19hcnJheV9hY2Nlc29yID0gcGF0aHN0ci5kYXRh W3BhdGhzdHIubGVuIC0gMV0gPT0gJ10nOworCisJLyogUmV0dXJuIDAsIGlmIE5VTEwgZnJh Y3Rpb24gaXMgMS4gKi8KKwlpZiAocm9vdC5mcmVxIDw9IDAuMCkKKwkJcmV0dXJuIDAuMDsK KworCS8qCisJICogU2VsZWN0aXZpdHkgb2YgcXVlcnkgJ2pzb25iIEA+IHNjYWxhcicgY29u c2lzdHMgb2YgIHNlbGVjdGl2aXRpZXMgb2YKKwkgKiAnanNvbmIgPT0gc2NhbGFyJyBhbmQg J2pzb25iWypdID09IHNjYWxhcicuICBTZWxlY3Rpdml0eSBvZgorCSAqICdqc29uYlsqXSA9 PSBzY2FsYXInIHdpbGwgYmUgY29tcHV0ZWQgaW4gcm9vdC5zZWwsIGJ1dCBmb3IKKwkgKiAn anNvbmIgPT0gc2NhbGFyJyB3ZSBuZWVkIGFkZGl0aW9uYWwgY29tcHV0YXRpb24uCisJICov CisJaWYgKEpzb25Db250YWluZXJJc1NjYWxhcigmamItPnJvb3QpKQorCQlzY2FsYXJTZWwg PSBqc29uU2VsZWN0aXZpdHkocm9vdC5zdGF0cywgSnNvbmJQR2V0RGF0dW0oamIpLAorCQkJ CQkJCQkJSnNvbmJFcU9wZXJhdG9yKTsKKwllbHNlCisJCXNjYWxhclNlbCA9IDAuMDsKKwor CWl0ID0gSnNvbmJJdGVyYXRvckluaXQoJmpiLT5yb290KTsKKworCXdoaWxlICgociA9IEpz b25iSXRlcmF0b3JOZXh0KCZpdCwgJnYsIGZhbHNlKSkgIT0gV0pCX0RPTkUpCisJeworCQlz d2l0Y2ggKHIpCisJCXsKKwkJCWNhc2UgV0pCX0JFR0lOX09CSkVDVDoKKwkJCXsKKwkJCQlz dHJ1Y3QgUGF0aCAqcDsKKwkJCQlTZWxlY3Rpdml0eSBmcmVxID0KKwkJCQkJanNvblBhdGhT dGF0c0dldFR5cGVGcmVxKHBhdGgtPnN0YXRzLCBqYnZPYmplY3QsIDAuMCk7CisKKwkJCQkv KiBJZiB0aGVyZSBhcmUgbm8gb2JqZWN0cywgc2VsZWN0aXZpdHkgaXMgMC4gKi8KKwkJCQlp ZiAoZnJlcSA8PSAwLjApCisJCQkJCXJldHVybiAwLjA7CisKKwkJCQkvKgorCQkJCSAqIFB1 c2ggcGF0aCBlbnRyeSBmb3Igb2JqZWN0IGtleXMsIGFjdHVhbCBrZXkgbmFtZXMgYXJlCisJ CQkJICogYXBwZW5kZWQgbGF0ZXIgaW4gV0pCX0tFWSBjYXNlLgorCQkJCSAqLworCQkJCXAg PSBwYWxsb2Moc2l6ZW9mKCpwKSk7CisJCQkJcC0+bGVuID0gcGF0aHN0ci5sZW47CisJCQkJ cC0+cGFyZW50ID0gcGF0aDsKKwkJCQlwLT5zdGF0cyA9IE5VTEw7CisJCQkJcC0+ZnJlcSA9 IGZyZXE7CisJCQkJcC0+c2VsID0gMS4wOworCQkJCXAtPmlzX2FycmF5X2FjY2Vzb3IgPSBm YWxzZTsKKwkJCQlwYXRoID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBXSkJf QkVHSU5fQVJSQVk6CisJCQl7CisJCQkJc3RydWN0IFBhdGggKnA7CisJCQkJSnNvblBhdGhT dGF0cyBwc3RhdHM7CisJCQkJU2VsZWN0aXZpdHkgZnJlcTsKKworCQkJCS8qCisJCQkJICog Rmlyc3QsIGZpbmQgc3RhdHMgZm9yIHRoZSBwYXJlbnQgcGF0aCBpZiBuZWVkZWQsIGl0IHdp bGwgYmUKKwkJCQkgKiB1c2VkIGluIGpzb25BY2N1bXVsYXRlU3ViUGF0aFNlbGVjdGl2aXR5 KCkuCisJCQkJICovCisJCQkJaWYgKCFwYXRoLT5zdGF0cykKKwkJCQkJcGF0aC0+c3RhdHMg PSBqc29uU3RhdHNGaW5kUGF0aChzdGF0cywgcGF0aHN0ci5kYXRhLAorCQkJCQkJCQkJCQkJ CXBhdGhzdHIubGVuKTsKKworCQkJCS8qIEFwcGVlbmQgcGF0aCBzdHJpbmcgZW50cnkgZm9y IGFycmF5IGVsZW1lbnRzLCBnZXQgc3RhdHMuICovCisJCQkJanNvblBhdGhBcHBlbmRFbnRy eSgmcGF0aHN0ciwgTlVMTCk7CisJCQkJcHN0YXRzID0ganNvblN0YXRzRmluZFBhdGgoc3Rh dHMsIHBhdGhzdHIuZGF0YSwgcGF0aHN0ci5sZW4pOworCQkJCWZyZXEgPSBqc29uUGF0aFN0 YXRzR2V0RnJlcShwc3RhdHMsIDAuMCk7CisKKwkJCQkvKiBJZiB0aGVyZSBhcmUgbm8gYXJy YXlzLCByZXR1cm4gMCBvciBzY2FsYXIgc2VsZWN0aXZpdHkgKi8KKwkJCQlpZiAoZnJlcSA8 PSAwLjApCisJCQkJCXJldHVybiBzY2FsYXJTZWw7CisKKwkJCQkvKiBQdXNoIHBhdGggZW50 cnkgZm9yIGFycmF5IGVsZW1lbnRzLiAqLworCQkJCXAgPSBwYWxsb2Moc2l6ZW9mKCpwKSk7 CisJCQkJcC0+bGVuID0gcGF0aHN0ci5sZW47CisJCQkJcC0+cGFyZW50ID0gcGF0aDsKKwkJ CQlwLT5zdGF0cyA9IHBzdGF0czsKKwkJCQlwLT5mcmVxID0gZnJlcTsKKwkJCQlwLT5zZWwg PSAxLjA7CisJCQkJcC0+aXNfYXJyYXlfYWNjZXNvciA9IHRydWU7CisJCQkJcGF0aCA9IHA7 CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgV0pCX0VORF9PQkpFQ1Q6CisJCQljYXNl IFdKQl9FTkRfQVJSQVk6CisJCQl7CisJCQkJc3RydWN0IFBhdGggKnAgPSBwYXRoOworCQkJ CS8qIEFic291bHRlIHNlbGVjdGl2aXR5IG9mIHRoZSBwYXRoIHdpdGggaXRzIGFsbCBzdWJw YXRocyAqLworCQkJCVNlbGVjdGl2aXR5IGFic19zZWwgPSBwLT5zZWwgKiBwLT5mcmVxOwor CisJCQkJLyogUG9wIGxhc3QgcGF0aCBlbnRyeSAqLworCQkJCXBhdGggPSBwYXRoLT5wYXJl bnQ7CisJCQkJcGZyZWUocCk7CisJCQkJcGF0aHN0ci5sZW4gPSBwYXRoLT5sZW47CisJCQkJ cGF0aHN0ci5kYXRhW3BhdGhzdHIubGVuXSA9ICdcMCc7CisKKwkJCQkvKiBBY2N1bXVsYXRl IHNlbGVjdGl2aXR5IGludG8gcGFyZW50IHBhdGggKi8KKwkJCQlqc29uQWNjdW11bGF0ZVN1 YlBhdGhTZWxlY3Rpdml0eShhYnNfc2VsLCBwYXRoLT5mcmVxLAorCQkJCQkJCQkJCQkJICZw YXRoLT5zZWwsCisJCQkJCQkJCQkJCQkgcGF0aC0+aXNfYXJyYXlfYWNjZXNvciA/CisJCQkJ CQkJCQkJCQkgcGF0aC0+cGFyZW50LT5zdGF0cyA6IE5VTEwpOworCQkJCWJyZWFrOworCQkJ fQorCisJCQljYXNlIFdKQl9LRVk6CisJCQl7CisJCQkJLyogUmVtb3ZlIHByZXZpb3VzIGtl eSBpbiB0aGUgcGF0aCBzdHJpbmcgKi8KKwkJCQlwYXRoc3RyLmxlbiA9IHBhdGgtPnBhcmVu dC0+bGVuOworCQkJCXBhdGhzdHIuZGF0YVtwYXRoc3RyLmxlbl0gPSAnXDAnOworCisJCQkJ LyogQXBwZW5kIGN1cnJlbnQga2V5IHRvIHBhdGggc3RyaW5nICovCisJCQkJanNvblBhdGhB cHBlbmRFbnRyeVdpdGhMZW4oJnBhdGhzdHIsIHYudmFsLnN0cmluZy52YWwsCisJCQkJCQkJ CQkJICAgdi52YWwuc3RyaW5nLmxlbik7CisJCQkJcGF0aC0+bGVuID0gcGF0aHN0ci5sZW47 CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgV0pCX1ZBTFVFOgorCQkJY2FzZSBXSkJf RUxFTToKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEV4dHJhY3Qgc3RhdGlzdGljcyBmb3IgYSBw YXRoLiAgQXJyYXkgZWxlbWVudHMgc2hhcmUgdGhlCisJCQkJICogc2FtZSBzdGF0aXN0aWNz IHRoYXQgd2FzIGV4dHJhY3RlZCBpbiBXSkJfQkVHSU5fQVJSQVkuCisJCQkJICovCisJCQkJ SnNvblBhdGhTdGF0cyBwc3RhdHMgPSByID09IFdKQl9FTEVNID8gcGF0aC0+c3RhdHMgOgor CQkJCQlqc29uU3RhdHNGaW5kUGF0aChzdGF0cywgcGF0aHN0ci5kYXRhLCBwYXRoc3RyLmxl bik7CisJCQkJU2VsZWN0aXZpdHkgYWJzX3NlbDsJLyogQWJzb2x1dGUgc2VsZWN0aXZpdHkg b2YgJ3BhdGggPT0gc2NhbGFyJyAqLworCisJCQkJaWYgKHBzdGF0cykKKwkJCQl7CisJCQkJ CS8qIE1ha2Ugc2NhbGFyIGpzb25iIGRhdHVtIGFuZCBjb21wdXRlIHNlbGVjdGl2aXR5ICov CisJCQkJCURhdHVtCQlzY2FsYXIgPSBKc29uYlBHZXREYXR1bShKc29uYlZhbHVlVG9Kc29u YigmdikpOworCisJCQkJCWFic19zZWwgPSBqc29uU2VsZWN0aXZpdHkocHN0YXRzLCBzY2Fs YXIsIEpzb25iRXFPcGVyYXRvcik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJYWJzX3NlbCA9 IDAuMDsKKworCQkJCS8qIEFjY3VtdWxhdGUgc2VsZWN0aXZpdHkgaW50byBwYXJlbnQgcGF0 aCAqLworCQkJCWpzb25BY2N1bXVsYXRlU3ViUGF0aFNlbGVjdGl2aXR5KGFic19zZWwsIHBh dGgtPmZyZXEsCisJCQkJCQkJCQkJCQkgJnBhdGgtPnNlbCwKKwkJCQkJCQkJCQkJCSBwYXRo LT5pc19hcnJheV9hY2Nlc29yID8KKwkJCQkJCQkJCQkJCSBwYXRoLT5wYXJlbnQtPnN0YXRz IDogTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7 CisJCX0KKwl9CisKKwkvKiBDb21wdXRlIGFic29sdXRlIHNlbGVjdGl2aXR5IGZvciByb290 LCBpbmNsdWRpbmcgcmF3IHNjYWxhciBjYXNlLiAqLworCXNlbCA9IHJvb3Quc2VsICogcm9v dC5mcmVxICsgc2NhbGFyU2VsOworCUNMQU1QX1BST0JBQklMSVRZKHNlbCk7CisJcmV0dXJu IHNlbDsKK30KKworLyoKKyAqIGpzb25TZWxlY3Rpdml0eUV4aXN0cworICoJCUVzdGltYXRl IHNlbGVjdGl2aXR5IGZvciBKU09OICJleGlzdHMiIG9wZXJhdG9yLgorICovCitzdGF0aWMg U2VsZWN0aXZpdHkKK2pzb25TZWxlY3Rpdml0eUV4aXN0cyhKc29uU3RhdHMgc3RhdHMsIERh dHVtIGtleSkKK3sKKwlKc29uUGF0aFN0YXRzIHJvb3RzdGF0czsKKwlKc29uUGF0aFN0YXRz IGFycnN0YXRzOworCUpzb25iVmFsdWUJamJ2a2V5OworCURhdHVtCQlqYmtleTsKKwlTZWxl Y3Rpdml0eSBrZXlzZWw7CisJU2VsZWN0aXZpdHkgc2NhbGFyc2VsOworCVNlbGVjdGl2aXR5 IGFycmF5c2VsOworCVNlbGVjdGl2aXR5IHNlbDsKKworCUpzb25WYWx1ZUluaXRTdHJpbmdX aXRoTGVuKCZqYnZrZXksCisJCQkJCQkJICAgVkFSREFUQV9BTlkoa2V5KSwgVkFSU0laRV9B TllfRVhIRFIoa2V5KSk7CisKKwlqYmtleSA9IEpzb25iUEdldERhdHVtKEpzb25iVmFsdWVU b0pzb25iKCZqYnZrZXkpKTsKKworCWtleXNlbCA9IGpzb25TdGF0c0dldFBhdGhGcmVxKHN0 YXRzLCAma2V5LCAxLCBmYWxzZSk7CisKKwlyb290c3RhdHMgPSBqc29uU3RhdHNHZXRSb290 UGF0aChzdGF0cyk7CisJc2NhbGFyc2VsID0ganNvblNlbGVjdGl2aXR5KHJvb3RzdGF0cywg amJrZXksIEpzb25iRXFPcGVyYXRvcik7CisKKwlhcnJzdGF0cyA9IGpzb25TdGF0c0dldFJv b3RBcnJheVBhdGgoc3RhdHMpOworCWFycmF5c2VsID0ganNvblNlbGVjdGl2aXR5KGFycnN0 YXRzLCBqYmtleSwgSnNvbmJFcU9wZXJhdG9yKTsKKwlhcnJheXNlbCA9IDEuMCAtIHBvdygx LjAgLSBhcnJheXNlbCwKKwkJCQkJCSBqc29uUGF0aFN0YXRzR2V0QXZnQXJyYXlTaXplKHJv b3RzdGF0cykpOworCisJc2VsID0ga2V5c2VsICsgc2NhbGFyc2VsICsgYXJyYXlzZWw7CisJ Q0xBTVBfUFJPQkFCSUxJVFkoc2VsKTsKKwlyZXR1cm4gc2VsOworfQorCitzdGF0aWMgU2Vs ZWN0aXZpdHkKK2pzb25iX3NlbF9pbnRlcm5hbChKc29uU3RhdHMgc3RhdHMsIE9pZCBvcGVy YXRvciwgQ29uc3QgKmNuc3QsIGJvb2wgdmFyb25sZWZ0KQoreworCXN3aXRjaCAob3BlcmF0 b3IpCisJeworCQljYXNlIEpzb25iRXhpc3RzT3BlcmF0b3I6CisJCQlpZiAoIXZhcm9ubGVm dCB8fCBjbnN0LT5jb25zdHR5cGUgIT0gVEVYVE9JRCkKKwkJCQlicmVhazsKKworCQkJcmV0 dXJuIGpzb25TZWxlY3Rpdml0eUV4aXN0cyhzdGF0cywgY25zdC0+Y29uc3R2YWx1ZSk7CisK KwkJY2FzZSBKc29uYkV4aXN0c0FueU9wZXJhdG9yOgorCQljYXNlIEpzb25iRXhpc3RzQWxs T3BlcmF0b3I6CisJCXsKKwkJCURhdHVtCSAgICprZXlzOworCQkJYm9vbAkgICAqbnVsbHM7 CisJCQlTZWxlY3Rpdml0eQlmcmVxID0gMS4wOworCQkJaW50CQkJbmtleXM7CisJCQlpbnQJ CQlpOworCQkJYm9vbAkJYWxsID0gb3BlcmF0b3IgPT0gSnNvbmJFeGlzdHNBbGxPcGVyYXRv cjsKKworCQkJaWYgKCF2YXJvbmxlZnQgfHwgY25zdC0+Y29uc3R0eXBlICE9IFRFWFRBUlJB WU9JRCkKKwkJCQlicmVhazsKKworCQkJZGVjb25zdHJ1Y3RfYXJyYXkoRGF0dW1HZXRBcnJh eVR5cGVQKGNuc3QtPmNvbnN0dmFsdWUpLCBURVhUT0lELAorCQkJCQkJCSAgLTEsIGZhbHNl LCAnaScsICZrZXlzLCAmbnVsbHMsICZua2V5cyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBu a2V5czsgaSsrKQorCQkJCWlmICghbnVsbHNbaV0pCisJCQkJeworCQkJCQlTZWxlY3Rpdml0 eSBwYXRoZnJlcSA9IGpzb25TZWxlY3Rpdml0eUV4aXN0cyhzdGF0cywKKwkJCQkJCQkJCQkJ CQkJCQkga2V5c1tpXSk7CisJCQkJCWZyZXEgKj0gYWxsID8gcGF0aGZyZXEgOiAoMS4wIC0g cGF0aGZyZXEpOworCQkJCX0KKworCQkJcGZyZWUoa2V5cyk7CisJCQlwZnJlZShudWxscyk7 CisKKwkJCWlmICghYWxsKQorCQkJCWZyZXEgPSAxLjAgLSBmcmVxOworCisJCQlyZXR1cm4g ZnJlcTsKKwkJfQorCisJCWNhc2UgSnNvbmJDb250YWluZWRPcGVyYXRvcjoKKwkJCWlmICh2 YXJvbmxlZnQgfHwgY25zdC0+Y29uc3R0eXBlICE9IEpTT05CT0lEKQorCQkJCWJyZWFrOwor CisJCQlyZXR1cm4ganNvblNlbGVjdGl2aXR5Q29udGFpbnMoc3RhdHMsCisJCQkJCQkJCQkJ ICAgRGF0dW1HZXRKc29uYlAoY25zdC0+Y29uc3R2YWx1ZSkpOworCisJCWNhc2UgSnNvbmJD b250YWluc09wZXJhdG9yOgorCQkJaWYgKCF2YXJvbmxlZnQgfHwgY25zdC0+Y29uc3R0eXBl ICE9IEpTT05CT0lEKQorCQkJCWJyZWFrOworCisJCQlyZXR1cm4ganNvblNlbGVjdGl2aXR5 Q29udGFpbnMoc3RhdHMsCisJCQkJCQkJCQkJICAgRGF0dW1HZXRKc29uYlAoY25zdC0+Y29u c3R2YWx1ZSkpOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gREVG QVVMVF9KU09OX0NPTlRBSU5TX1NFTDsKK30KKworLyoKKyAqIGpzb25iX3NlbAorICoJCVRo ZSBtYWluIHByb2NlZHVyZSBlc3RpbWF0aW5nIHNlbGVjdGl2aXR5IGZvciBhbGwgSlNPTkIg b3BlcmF0b3JzLgorICovCitEYXR1bQoranNvbmJfc2VsKFBHX0ZVTkNUSU9OX0FSR1MpCit7 CisJUGxhbm5lckluZm8gKnJvb3QgPSAoUGxhbm5lckluZm8gKikgUEdfR0VUQVJHX1BPSU5U RVIoMCk7CisJT2lkCQkJb3BlcmF0b3IgPSBQR19HRVRBUkdfT0lEKDEpOworCUxpc3QJICAg KmFyZ3MgPSAoTGlzdCAqKSBQR19HRVRBUkdfUE9JTlRFUigyKTsKKwlpbnQJCQl2YXJSZWxp ZCA9IFBHX0dFVEFSR19JTlQzMigzKTsKKwlkb3VibGUJCXNlbCA9IERFRkFVTFRfSlNPTl9D T05UQUlOU19TRUw7CisJTm9kZQkgICAqb3RoZXI7CisJYm9vbAkJdmFyb25sZWZ0OworCVZh cmlhYmxlU3RhdERhdGEgdmFyZGF0YTsKKworCWlmIChnZXRfcmVzdHJpY3Rpb25fdmFyaWFi bGUocm9vdCwgYXJncywgdmFyUmVsaWQsCisJCQkJCQkJCSAgJnZhcmRhdGEsICZvdGhlciwg JnZhcm9ubGVmdCkpCisJeworCQlpZiAoSXNBKG90aGVyLCBDb25zdCkpCisJCXsKKwkJCUNv bnN0CSAgICpjbnN0ID0gKENvbnN0ICopIG90aGVyOworCisJCQlpZiAoY25zdC0+Y29uc3Rp c251bGwpCisJCQkJc2VsID0gMC4wOworCQkJZWxzZQorCQkJeworCQkJCUpzb25TdGF0RGF0 YSBzdGF0czsKKworCQkJCWlmIChqc29uU3RhdHNJbml0KCZzdGF0cywgJnZhcmRhdGEpKQor CQkJCXsKKwkJCQkJc2VsID0ganNvbmJfc2VsX2ludGVybmFsKCZzdGF0cywgb3BlcmF0b3Is IGNuc3QsIHZhcm9ubGVmdCk7CisJCQkJCWpzb25TdGF0c1JlbGVhc2UoJnN0YXRzKTsKKwkJ CQl9CisJCQl9CisJCX0KKworCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKwl9 CisKKwlQR19SRVRVUk5fRkxPQVQ4KChmbG9hdDgpIHNlbCk7Cit9CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdHlwYW5hbHl6ZS5jIGIvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L2pzb25iX3R5cGFuYWx5emUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uNjU1NTFmNmZmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvanNvbmJfdHlwYW5hbHl6ZS5jCkBAIC0wLDAgKzEsMTM2MCBAQAor LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoganNvbmJfdHlwYW5hbHl6ZS5jCisgKgkg IEZ1bmN0aW9ucyBmb3IgZ2F0aGVyaW5nIHN0YXRpc3RpY3MgZnJvbSBqc29uYiBjb2x1bW5z CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjIsIFBvc3RncmVTUUwgR2xvYmFsIERl dmVsb3BtZW50IEdyb3VwCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFyZSB1 c2VkIHRvIGFuYWx5emUgY29udGVudHMgb2YgSlNPTkIgY29sdW1ucworICogYW5kIGJ1aWxk IG9wdGltaXplciBzdGF0aXN0aWNzLiBJbiBwcmluY2lwbGUgd2UgZXh0cmFjdCBwYXRocyBm cm9tIGFsbAorICogc2FtcGxlZCBkb2N1bWVudHMgYW5kIGNhbGN1bGF0ZSB0aGUgdXN1YWwg c3RhdGlzdGljcyAoTUNWLCBoaXN0b2dyYW0pCisgKiBmb3IgZWFjaCBwYXRoIC0gaW4gcHJp bmNpcGxlIGVhY2ggcGF0aCBpcyB0cmVhdGVkIGFzIGEgY29sdW1uLgorICoKKyAqIEJlY2F1 c2Ugd2UncmUgbm90IGVuZm9yY2luZyBhbnkgSlNPTiBzY2hlbWEsIHRoZSBkb2N1bWVudHMg bWF5IGRpZmZlcgorICogYSBsb3QgLSB0aGUgZG9jdW1lbnRzIG1heSBjb250YWluIGxhcmdl IG51bWJlciBvZiBkaWZmZXJlbnQga2V5cywgdGhlCisgKiB0eXBlcyBvZiB2YWx1ZXMgbWF5 IGJlIGVudGlyZWx5IGRpZmZlcmVudCwgZXRjLiBUaGlzIG1ha2VzIGl0IG1vcmUKKyAqIGNo YWxsZW5naW5nIHRoYW4gYnVpbGRpbmcgc3RhdHMgZm9yIHJlZ3VsYXIgY29sdW1ucy4gRm9y IGV4YW1wbGUgbm90CisgKiBvbmx5IGRvIHdlIG5lZWQgdG8gZGVjaWRlIHdoaWNoIHZhbHVl cyB0byBrZWVwIGluIHRoZSBNQ1YsIGJ1dCBhbHNvCisgKiB3aGljaCBwYXRocyB0byBrZWVw IChpbiBjYXNlIHRoZSBkb2N1bWVudHMgYXJlIHNvIHZhcmlhYmxlIHdlIGNhbid0CisgKiBr ZWVwIGFsbCBwYXRocykuCisgKgorICogVGhlIHN0YXRpc3RpY3MgaXMgc3RvcmVkIGluIHBn X3N0YXRpc3RpYywgaW4gYSBzbG90IHdpdGggYSBuZXcgc3Rha2luZAorICogdmFsdWUgKFNU QVRJU1RJQ19LSU5EX0pTT04pLiBUaGUgc3RhdGlzdGljcyBpcyBzZXJpYWxpemVkIGFzIGFu IGFycmF5CisgKiBvZiBKU09OQiB2YWx1ZXMsIGVhc2ggZWxlbWVudCBzdG9yaW5nIHN0YXRp c3RpY3MgZm9yIG9uZSBwYXRoLgorICoKKyAqIEZvciBlYWNoIHBhdGgsIHdlIHN0b3JlIHRo ZSBmb2xsb3dpbmcga2V5czoKKyAqCisgKiAtIHBhdGggICAgICAgICAtIHBhdGggdGhpcyBz dGF0cyBpcyBmb3IsIHNlcmlhbGl6ZWQgYXMganNvbnBhdGgKKyAqIC0gZnJlcSAgICAgICAg IC0gZnJlcXVlbmN5IG9mIGRvY3VtZW50cyBjb250YWluaW5nIHRoaXMgcGF0aAorICogLSBq c29uICAgICAgICAgLSB0aGUgcmVndWxhciBwZXItY29sdW1uIHN0YXRzIChNQ1YsIGhpc3Rv Z3JhbSwgLi4uKQorICogLSBmcmVxX251bGwgICAgLSBmcmVxdWVuY3kgb2YgSlNPTiBudWxs IHZhbHVlcworICogLSBmcmVxX2FycmF5ICAgLSBmcmVxdWVuY3kgb2YgSlNPTiBhcnJheSB2 YWx1ZXMKKyAqIC0gZnJlcV9vYmplY3QgIC0gZnJlcXVlbmN5IG9mIEpTT04gb2JqZWN0IHZh bHVlcworICogLSBmcmVxX3N0cmluZyAgLSBmcmVxdWVuY3kgb2YgSlNPTiBzdHJpbmcgdmFs dWVzCisgKiAtIGZyZXFfbnVtZXJpYyAtIGZyZXF1ZW5jeSBvZiBKU09OIG51bWVyaWMgdmFs dWVzCisgKgorICogVGhpcyBpcyBzdG9yZWQgaW4gdGhlIHN0YXZhbHVlcyBhcnJheS4KKyAq CisgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBzdGF2YWx1ZXMgaXMgYSBwYXRoIHByZWZpeC4g IEl0IGlzIHVzZWQgZm9yIGF2b2lkaW5nCisgKiBwYXRoIHRyYW5zZm9ybWF0aW9ucyB3aGVu IHRoZSBkZXJpdmVkIHN0YXRpc3RpY3MgZm9yIHRoZSBjaGFpbnMgb2YgLT4KKyAqIG9wZXJh dG9ycyBpcyBjb21wdXRlZC4KKyAqCisgKiBUaGUgcGVyLWNvbHVtbiBzdGF0cyAoc3RvcmVk IGluIHRoZSAianNvbiIga2V5KSBoYXZlIGFkZGl0aW9uYWwgaW50ZXJuYWwKKyAqIHN0cnVj dHVyZSwgdG8gYWxsb3cgc3RvcmluZyBtdWx0aXBsZSBzdGFraW5kIHR5cGVzIChoaXN0b2dy YW0sIG1jdikuIFNlZQorICoganNvbkFuYWx5emVNYWtlU2NhbGFyU3RhdHMgZm9yIGRldGFp bHMuCisgKgorICoKKyAqIFhYWCBJdCdzIGEgYml0IHdlaXJkIHRoZSAicmVndWxhciIgc3Rh dHMgYXJlIHN0b3JlZCBpbiB0aGUgImpzb24iIGtleSwKKyAqIHdoaWxlIHRoZSBKU09OIHN0 YXRzIChmcmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgSlNPTiB0eXBlcykgYXJlIHJpZ2h0Cisg KiBhdCB0aGUgdG9wIGxldmVsLgorICoKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBz cmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdHlwYW5hbHl6ZS5jCisgKgorICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRl ICJmbWdyLmgiCisjaW5jbHVkZSAiYWNjZXNzL2hhc2guaCIKKyNpbmNsdWRlICJhY2Nlc3Mv ZGV0b2FzdC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfYXR0cmlidXRlLmgiCisjaW5jbHVk ZSAiY2F0YWxvZy9wZ19vcGVyYXRvci5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5o IgorI2luY2x1ZGUgImNvbW1hbmRzL3ZhY3V1bS5oIgorI2luY2x1ZGUgInV0aWxzL2J1aWx0 aW5zLmgiCisjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCisjaW5jbHVkZSAidXRpbHMvaHNlYXJj aC5oIgorI2luY2x1ZGUgInV0aWxzL2pzb24uaCIKKyNpbmNsdWRlICJ1dGlscy9qc29uYi5o IgorI2luY2x1ZGUgInV0aWxzL2pzb25fc2VsZnVuY3MuaCIKKyNpbmNsdWRlICJ1dGlscy9s c3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgorCit0eXBlZGVmIHN0 cnVjdCBKc29uUGF0aEVudHJ5IEpzb25QYXRoRW50cnk7CisKKy8qCisgKiBFbGVtZW50IG9m IGEgcGF0aCBpbiB0aGUgSlNPTiBkb2N1bWVudCAoaS5lLiBub3QganNvbnBhdGgpLiBFbGVt ZW50cworICogYXJlIGxpbmtlZCB0b2dldGhlciB0byBidWlsZCBsb25nZXIgcGF0aHMuCisg KgorICogJ2VudHJ5JyBjYW4gYmUgbm90IHplcm8tdGVybWluYXRlZCB3aGVuIGl0IGlzIHBv aW50aW5nIHRvIEpTT05CIGtleXMsIHNvCisgKiAnbGVuJyBpcyBuZWNlc3NhcnkuICAnbGVu JyBpcyBhbHNvIHVzZWQgZm9yIGZhc3RlciBlbnRyeSBjb21wYXJpc29uLCB0bworICogZGlz dGluZ3Vpc2ggYXJyYXkgZW50cmllcyAoJ2xlbicgPT0gLTEpLgorICovCit0eXBlZGVmIHN0 cnVjdCBKc29uUGF0aEVudHJ5Cit7CisJSnNvblBhdGhFbnRyeSAgKnBhcmVudDsKKwljb25z dCBjaGFyCSAgICplbnRyeTsJCS8qIGVsZW1lbnQgb2YgdGhlIHBhdGggYXMgYSBzdHJpbmcg Ki8KKwlpbnQJCQkJbGVuOwkJLyogbGVuZ3RoIG9mIGVudHJ5IHN0cmluZyAobWF5IGJlIDAg b3IgLTEpICovCisJdWludDMyCQkJaGFzaDsJCS8qIGhhc2ggb2YgdGhlIHdob2xlIHBhdGgg KHdpdGggcGFyZW50KSAqLworfSBKc29uUGF0aEVudHJ5OworCisjZGVmaW5lIEpzb25QYXRo RW50cnlJc0FycmF5KGVudHJ5KSAoKGVudHJ5KS0+bGVuID09IC0xKQorCisvKgorICogQW4g YXJyYXkgY29udGFpbmluZyBhIGR5bmFtaWMgbnVtYmVyIG9mIHZhbHVlcyBleHRyYWN0ZWQg ZnJvbSBKU09OIGRvY3VtZW50cy4KKyAqIEFsbCB2YWx1ZXMgc2hvdWxkIGhhdmUgdGhlIHNh bWUgZGF0YSB0eXBlOgorICoJCWpzb25iICAgLSBvcmRpbmFyeSBwYXRoIHN0YXRzLCB2YWx1 ZXMgb2YgZGlmZmVyZW50IEpTT04gdHlwZXMKKyAqCQlpbnQzMiAgIC0gYXJyYXkvb2JqZWN0 IGxlbmd0aCBzdGF0cworICoJCXRleHQgICAgLSBzZXBhcmF0ZSBzdGF0cyBmcm8gc3RyaW5n cworICoJCW51bWVyaWMgLSBzZXBhcmF0ZSBzdGF0cyBmcm8gbnVtYmVycworICovCit0eXBl ZGVmIHN0cnVjdCBKc29uVmFsdWVzCit7CisJRGF0dW0JICAgKmJ1ZjsKKwlpbnQJCQljb3Vu dDsKKwlpbnQJCQlhbGxvY2F0ZWQ7Cit9IEpzb25WYWx1ZXM7CisKKy8qCisgKiBTY2FsYXIg c3RhdGlzdGljcyBidWlsdCBmb3IgYW4gYXJyYXkgb2YgdmFsdWVzLCBleHRyYWN0ZWQgZnJv bSBhIEpTT04KKyAqIGRvY3VtZW50IChmb3Igb25lIHBhcnRpY3VsYXIgcGF0aCkuCisgKi8K K3R5cGVkZWYgc3RydWN0IEpzb25TY2FsYXJTdGF0cworeworCUpzb25WYWx1ZXMJCXZhbHVl czsKKwlWYWNBdHRyU3RhdHMJc3RhdHM7Cit9IEpzb25TY2FsYXJTdGF0czsKKworLyoKKyAq IFN0YXRpc3RpY3MgY2FsY3VsYXRlZCBmb3IgYSBzZXQgb2YgdmFsdWVzLgorICoKKyAqCisg KiBYWFggVGhpcyBzZWVtcyByYXRoZXIgY29tcGxpY2F0ZWQgYW5kIG5lZWRzIHNpbXBsaWZp Y2F0aW9uLiBXZSdyZSBub3QKKyAqIHJlYWxseSB1c2luZyBhbGwgdGhlIHZhcmlvdXMgSnNv blNjYWxhclN0YXRzIGJpdHMsIHRoZXJlJ3MgYSBsb3Qgb2YKKyAqIGR1cGxpY2F0aW9uIChl LmcuIGVhY2ggSnNvblNjYWxhclN0YXRzIGNvbnRhaW5zIGl0J3Mgb3duIGFycmF5LCB3aGlj aAorICogaGFzIGEgY29weSBvZiBkYXRhIGZyb20gdGhlIG9uZSBpbiAianNvbnMiKS4KKyAq LwordHlwZWRlZiBzdHJ1Y3QgSnNvblZhbHVlU3RhdHMKK3sKKwlKc29uU2NhbGFyU3RhdHMJ anNvbnM7CQkvKiBzdGF0cyBmb3IgYWxsIEpTT04gdHlwZXMgdG9nZXRoZXIgKi8KKworI2lm ZGVmIEpTT05fQU5BTFlaRV9TQ0FMQVJTCQkvKiBYWFggKi8KKwlKc29uU2NhbGFyU3RhdHMJ c3RyaW5nczsJLyogc3RhdHMgZm9yIEpTT04gc3RyaW5ncyAqLworCUpzb25TY2FsYXJTdGF0 cwludW1lcmljczsJLyogc3RhdHMgZm9yIEpTT04gbnVtZXJpY3MgKi8KKyNlbmRpZgorCisJ SnNvblNjYWxhclN0YXRzCWFycmxlbnM7CS8qIHN0YXRzIG9mIGFycmF5IGxlbmd0aHMgKi8K KwlKc29uU2NhbGFyU3RhdHMJb2JqbGVuczsJLyogc3RhdHMgb2Ygb2JqZWN0IGxlbmd0aHMg Ki8KKworCWludAkJCQlubnVsbHM7CQkvKiBudW1iZXIgb2YgSlNPTiBudWxsIHZhbHVlcyAq LworCWludAkJCQludHJ1ZTsJCS8qIG51bWJlciBvZiBKU09OIHRydWUgdmFsdWVzICovCisJ aW50CQkJCW5mYWxzZTsJCS8qIG51bWJlciBvZiBKU09OIGZhbHNlIHZhbHVlcyAqLworCWlu dAkJCQlub2JqZWN0czsJLyogbnVtYmVyIG9mIEpTT04gb2JqZWN0cyAqLworCWludAkJCQlu YXJyYXlzOwkvKiBudW1iZXIgb2YgSlNPTiBhcnJheXMgKi8KKwlpbnQJCQkJbnN0cmluZ3M7 CS8qIG51bWJlciBvZiBKU09OIHN0cmluZ3MgKi8KKwlpbnQJCQkJbm51bWVyaWNzOwkvKiBu dW1iZXIgb2YgSlNPTiBudW1lcmljcyAqLworCisJaW50NjQJCQluYXJyZWxlbXM7CS8qIHRv dGFsIG51bWJlciBvZiBhcnJheSBlbGVtZW50cworCQkJCQkJCQkgKiAoZm9yIGF2Zy4gYXJy YXkgbGVuZ3RoKSAqLworfSBKc29uVmFsdWVTdGF0czsKKworLyogTWFpbiBzdHJ1Y3R1cmUg Zm9yIGFuYWx5emVkIEpTT04gcGF0aCAgKi8KK3R5cGVkZWYgc3RydWN0IEpzb25QYXRoQW5s U3RhdHMKK3sKKwlKc29uUGF0aEVudHJ5IHBhdGg7CQkvKiBwYXRoIGVudHJ5IGNoYWluLCB1 c2VkIGZvciBoYXNoaW5nICovCisJSnNvblZhbHVlU3RhdHMgdnN0YXRzOwkvKiBjb2xsZWN0 ZWQgdmFsdWVzIGFuZCByYXcgY29tcHV0ZWQgc3RhdHMgKi8KKwlKc29uYgkgICAqc3RhdHM7 CQkvKiBzdGF0cyBjb252ZXJ0ZWQgaW50byBqc29uYiBmb3JtICovCisJY2hhcgkgICAqcGF0 aHN0cjsJLyogZnVsbCBwYXRoIHN0cmluZyAqLworCWRvdWJsZQkJZnJlcTsJCS8qIGZyZXF1 ZW5jZSBvZiB0aGUgcGF0aCAqLworCWludAkJCWRlcHRoOwkJLyogbmVzdGluZyBsZXZlbCwg aS5lLiBwYXRoIGxlbmd0aCAqLworfSBKc29uUGF0aEFubFN0YXRzOworCisvKiB2YXJpb3Vz IGJpdHMgbmVlZGVkIHdoaWxlIGFuYWx5emluZyBKU09OICovCit0eXBlZGVmIHN0cnVjdCBK c29uQW5hbHl6ZUNvbnRleHQKK3sKKwlWYWNBdHRyU3RhdHMJCSAgICpzdGF0czsKKwlNZW1v cnlDb250ZXh0CQkJbWN4dDsKKwlBbmFseXplQXR0ckZldGNoRnVuYwlmZXRjaGZ1bmM7CisJ SFRBQgkJCQkgICAqcGF0aHNoYXNoOworCUpzb25QYXRoQW5sU3RhdHMJICAgKnJvb3Q7CisJ ZG91YmxlCQkJCQl0b3RhbHJvd3M7CisJZG91YmxlCQkJCQl0b3RhbF93aWR0aDsKKwlpbnQJ CQkJCQlzYW1wbGVyb3dzOworCWludAkJCQkJCXRhcmdldDsKKwlpbnQJCQkJCQludWxsX2Nu dDsKKwlpbnQJCQkJCQlhbmFseXplZF9jbnQ7CisJaW50CQkJCQkJbWF4ZGVwdGg7CisJYm9v bAkJCQkJc2NhbGFyc09ubHk7Cit9IEpzb25BbmFseXplQ29udGV4dDsKKworLyoKKyAqIEpz b25QYXRoTWF0Y2gKKyAqCQlEZXRlcm1pbmUgd2hlbiB0d28gSlNPTiBwYXRocyAobGlzdCBv ZiBKc29uUGF0aEVudHJ5KSBtYXRjaC4KKyAqCisgKiBSZXR1cm5lZCBpbnQgaW5zdGVhZCBv ZiBib29sLCBiZWNhdXNlIGl0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiBIYXNoQ29t cGFyZUZ1bmMuCisgKi8KK3N0YXRpYyBpbnQKK0pzb25QYXRoRW50cnlNYXRjaChjb25zdCB2 b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyLCBTaXplIGtleXNpemUpCit7CisJY29uc3Qg SnNvblBhdGhFbnRyeSAqcGF0aDEgPSBrZXkxOworCWNvbnN0IEpzb25QYXRoRW50cnkgKnBh dGgyID0ga2V5MjsKKworCXJldHVybiBwYXRoMS0+cGFyZW50ICE9IHBhdGgyLT5wYXJlbnQg fHwKKwkJICAgcGF0aDEtPmxlbiAhPSBwYXRoMi0+bGVuIHx8CisJCSAgIChwYXRoMS0+bGVu ID4gMCAmJgorCQkJc3RybmNtcChwYXRoMS0+ZW50cnksIHBhdGgyLT5lbnRyeSwgcGF0aDEt PmxlbikpOworfQorCisvKgorICogSnNvblBhdGhIYXNoCisgKgkJQ2FsY3VsYXRlIGhhc2gg b2YgdGhlIHBhdGggZW50cnkuCisgKgorICogUGFyZW50IGhhc2ggc2hvdWxkIGJlIGFscmVh ZHkgY2FsY3VsYXRlZC4KKyAqLworc3RhdGljIHVpbnQzMgorSnNvblBhdGhFbnRyeUhhc2go Y29uc3Qgdm9pZCAqa2V5LCBTaXplIGtleXNpemUpCit7CisJY29uc3QgSnNvblBhdGhFbnRy eQkgICAqcGF0aCA9IGtleTsKKwl1aW50MzIJCQkJCWhhc2ggPSBwYXRoLT5wYXJlbnQgPyBw YXRoLT5wYXJlbnQtPmhhc2ggOiAwOworCisJaGFzaCA9IChoYXNoIDw8IDEpIHwgKGhhc2gg Pj4gMzEpOworCWhhc2ggXj0gcGF0aC0+bGVuIDwgMCA/IDAgOgorCQlEYXR1bUdldFVJbnQz MihoYXNoX2FueSgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwYXRoLT5lbnRyeSwgcGF0aC0+ bGVuKSk7CisKKwlyZXR1cm4gaGFzaDsKK30KKworLyoKKyAqIGpzb25BbmFseXplQWRkUGF0 aAorICoJCUFkZCBhbiBlbnRyeSBmb3IgYSBKU09OIHBhdGggdG8gdGhlIHdvcmtpbmcgbGlz dCBvZiBzdGF0aXN0aWNzLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIEpzb25QYXRo QW5sU3RhdHMgKHdoaWNoIG1pZ2h0IGhhdmUgYWxyZWFkeSBleGlzdGVkCisgKiBpZiB0aGUg cGF0aCB3YXMgaW4gZWFybGllciBkb2N1bWVudCksIHdoaWNoIGNhbiB0aGVuIGJlIHBvcHVs YXRlZCBvcgorICogdXBkYXRlZC4KKyAqLworc3RhdGljIGlubGluZSBKc29uUGF0aEFubFN0 YXRzICoKK2pzb25BbmFseXplQWRkUGF0aChKc29uQW5hbHl6ZUNvbnRleHQgKmN0eCwgSnNv blBhdGhFbnRyeSAqcGFyZW50LAorCQkJCSAgIGNvbnN0IGNoYXIgKmVudHJ5LCBpbnQgbGVu KQoreworCUpzb25QYXRoRW50cnkgcGF0aDsKKwlKc29uUGF0aEFubFN0YXRzICpzdGF0czsK Kwlib29sCQlmb3VuZDsKKworCS8qIEluaXQgcGF0aCBlbnRyeSAqLworCXBhdGgucGFyZW50 ID0gcGFyZW50OworCXBhdGguZW50cnkgPSBlbnRyeTsKKwlwYXRoLmxlbiA9IGxlbjsKKwlw YXRoLmhhc2ggPSBKc29uUGF0aEVudHJ5SGFzaCgmcGF0aCwgMCk7CisKKwkvKiBTZWUgaWYg d2UgYWxyZWFkeSBzYXcgdGhpcyBwYXRoIGVhcmxpZXIuICovCisJc3RhdHMgPSBoYXNoX3Nl YXJjaF93aXRoX2hhc2hfdmFsdWUoY3R4LT5wYXRoc2hhc2gsICZwYXRoLCBwYXRoLmhhc2gs CisJCQkJCQkJCQkJSEFTSF9FTlRFUiwgJmZvdW5kKTsKKworCS8qCisJICogTm9wZSwgaXQn cyB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgdGhpcyBwYXRoLCBzbyBpbml0aWFsaXplIGFsbCB0 aGUKKwkgKiBmaWVsZHMgKHBhdGggc3RyaW5nLCBjb3VudGVycywgLi4uKS4KKwkgKi8KKwlp ZiAoIWZvdW5kKQorCXsKKwkJSnNvblBhdGhBbmxTdGF0cyAqcGFyZW50ID0gKEpzb25QYXRo QW5sU3RhdHMgKikgc3RhdHMtPnBhdGgucGFyZW50OworCQlKc29uUGF0aEVudHJ5ICpwYXRo ID0gJnN0YXRzLT5wYXRoOworCQljb25zdCBjaGFyICpwcGF0aCA9IHBhcmVudC0+cGF0aHN0 cjsKKwkJU3RyaW5nSW5mb0RhdGEgc2k7CisJCU1lbW9yeUNvbnRleHQgb2xkY3h0ID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKGN0eC0+bWN4dCk7CisKKwkJLyogTlVMTCBlbnRyaWVzIGFy ZSB0cmVhdGVkIGFzIHdpbGRjYXJkIGFycmF5IGFjY2Vzc29ycyAiWypdIiAqLworCQlpZiAo cGF0aC0+ZW50cnkpCisJCQkvKiBDb3B5IHBhdGggZW50cnkgbmFtZSBpbnRvIHRoZSByaWdo dCBNZW1vcnlDb250ZXh0ICovCisJCQlwYXRoLT5lbnRyeSA9IHBuc3RyZHVwKHBhdGgtPmVu dHJ5LCBwYXRoLT5sZW4pOworCisJCS8qIEluaXRpYWx6ZSBmdWxsIHBhdGggc3RyaW5nICov CisJCWluaXRTdHJpbmdJbmZvKCZzaSk7CisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJnNp LCBwcGF0aCk7CisJCWpzb25QYXRoQXBwZW5kRW50cnkoJnNpLCBwYXRoLT5lbnRyeSk7CisJ CXN0YXRzLT5wYXRoc3RyID0gc2kuZGF0YTsKKworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o b2xkY3h0KTsKKworCQkvKiBpbml0aWFsaXplIHRoZSBzdGF0cyBjb3VudGVyIGZvciB0aGlz IHBhdGggZW50cnkgKi8KKwkJbWVtc2V0KCZzdGF0cy0+dnN0YXRzLCAwLCBzaXplb2YoSnNv blZhbHVlU3RhdHMpKTsKKwkJc3RhdHMtPnN0YXRzID0gTlVMTDsKKwkJc3RhdHMtPmZyZXEg PSAwLjA7CisJCXN0YXRzLT5kZXB0aCA9IHBhcmVudC0+ZGVwdGggKyAxOworCisJCS8qIHVw ZGF0ZSBtYXhpbWFsIGRlcHRoICovCisJCWlmIChjdHgtPm1heGRlcHRoIDwgc3RhdHMtPmRl cHRoKQorCQkJY3R4LT5tYXhkZXB0aCA9IHN0YXRzLT5kZXB0aDsKKwl9CisKKwlyZXR1cm4g c3RhdHM7Cit9CisKKy8qCisgKiBKc29uVmFsdWVzQXBwZW5kCisgKgkJQWRkIGEgSlNPTiB2 YWx1ZSB0byB0aGUgZHluYW1pYyBhcnJheSAoZW5sYXJnZSBpdCBpZiBuZWVkZWQpLgorICoK KyAqIFhYWCBUaGlzIGlzIGxpa2VseSBvbmUgb2YgdGhlIHByb2JsZW1zIC0gdGhlIGRvY3Vt ZW50cyBtYXkgYmUgcHJldHR5CisgKiBsYXJnZSwgd2l0aCBhIGxvdCBvZiBkaWZmZXJlbnQg dmFsdWVzIGZvciBlYWNoIHBhdGguIEF0IHRoYXQgcG9pbnQKKyAqIGl0J3MgcHJvYmxlbWF0 aWMgdG8ga2VlcCBhbGwgb2YgdGhhdCBpbiBtZW1vcnkgYXQgb25jZS4gU28gbWF5YmUgd2UK KyAqIG5lZWQgdG8gaW50cm9kdWNlIHNvbWUgc29ydCBvZiBjb21wYWN0aW9uIChlLmcuIHdl IGNvdWxkIHRyeQorICogZGVkdXBsaWNhdGluZyB0aGUgdmFsdWVzKSwgbGltaXQgb24gc2l6 ZSBvZiB0aGUgYXJyYXkgb3Igc29tZXRoaW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQK K0pzb25WYWx1ZXNBcHBlbmQoSnNvblZhbHVlcyAqdmFsdWVzLCBEYXR1bSB2YWx1ZSwgaW50 IGluaXRpYWxTaXplKQoreworCWlmICh2YWx1ZXMtPmNvdW50ID49IHZhbHVlcy0+YWxsb2Nh dGVkKQorCXsKKwkJaWYgKHZhbHVlcy0+YWxsb2NhdGVkKQorCQl7CisJCQl2YWx1ZXMtPmFs bG9jYXRlZCA9IHZhbHVlcy0+YWxsb2NhdGVkICogMjsKKwkJCXZhbHVlcy0+YnVmID0gcmVw YWxsb2ModmFsdWVzLT5idWYsCisJCQkJCQkJCQlzaXplb2YodmFsdWVzLT5idWZbMF0pICog dmFsdWVzLT5hbGxvY2F0ZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmFsdWVzLT5hbGxv Y2F0ZWQgPSBpbml0aWFsU2l6ZTsKKwkJCXZhbHVlcy0+YnVmID0gcGFsbG9jKHNpemVvZih2 YWx1ZXMtPmJ1ZlswXSkgKiB2YWx1ZXMtPmFsbG9jYXRlZCk7CisJCX0KKwl9CisKKwl2YWx1 ZXMtPmJ1Zlt2YWx1ZXMtPmNvdW50KytdID0gdmFsdWU7Cit9CisKKy8qCisgKiBqc29uQW5h bHl6ZUpzb25WYWx1ZQorICoJCVByb2Nlc3MgYSB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUg ZG9jdW1lbnQgKGZvciBhIGdpdmVuIHBhdGgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQK K2pzb25BbmFseXplSnNvblZhbHVlKEpzb25BbmFseXplQ29udGV4dCAqY3R4LCBKc29uVmFs dWVTdGF0cyAqdnN0YXRzLAorCQkJCQkgSnNvbmJWYWx1ZSAqanYpCit7CisJSnNvbmJWYWx1 ZQkJICAgKmpidjsKKwlKc29uYlZhbHVlCQkJamJ2dG1wOworCURhdHVtCQkJCXZhbHVlOwor CisJLyogWFhYIGlmIGFuYWx5emluZyBvbmx5IHNjYWxhciB2YWx1ZXMsIG1ha2UgY29udGFp bmVycyBlbXB0eSAqLworCWlmIChjdHgtPnNjYWxhcnNPbmx5ICYmIGp2LT50eXBlID09IGpi dkJpbmFyeSkKKwl7CisJCWlmIChKc29uQ29udGFpbmVySXNPYmplY3QoanYtPnZhbC5iaW5h cnkuZGF0YSkpCisJCQlqYnYgPSBKc29uVmFsdWVJbml0T2JqZWN0KCZqYnZ0bXAsIDAsIDAp OworCQllbHNlCisJCXsKKwkJCUFzc2VydChKc29uQ29udGFpbmVySXNBcnJheShqdi0+dmFs LmJpbmFyeS5kYXRhKSk7CisJCQlqYnYgPSBKc29uVmFsdWVJbml0QXJyYXkoJmpidnRtcCwg MCwgMCwgZmFsc2UpOworCQl9CisJfQorCWVsc2UKKwkJamJ2ID0ganY7CisKKwkvKiBhbHdh eXMgYWRkIGl0IHRvIHRoZSAiZ2xvYmFsIiBKU09OIHN0YXRzLCBzaGFyZWQgYnkgYWxsIHR5 cGVzICovCisJSnNvblZhbHVlc0FwcGVuZCgmdnN0YXRzLT5qc29ucy52YWx1ZXMsCisJCQkJ CSBKc29uYlBHZXREYXR1bShKc29uYlZhbHVlVG9Kc29uYihqYnYpKSwKKwkJCQkJIGN0eC0+ dGFyZ2V0KTsKKworCS8qIGFsc28gdXBkYXRlIHRoZSB0eXBlLXNwZWNpZmljIGNvdW50ZXJz ICovCisJc3dpdGNoIChqdi0+dHlwZSkKKwl7CisJCWNhc2UgamJ2TnVsbDoKKwkJCXZzdGF0 cy0+bm51bGxzKys7CisJCQlicmVhazsKKworCQljYXNlIGpidkJvb2w6CisJCQlpZiAoanYt PnZhbC5ib29sZWFuKQorCQkJCXZzdGF0cy0+bnRydWUrKzsKKwkJCWVsc2UKKwkJCQl2c3Rh dHMtPm5mYWxzZSsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBqYnZTdHJpbmc6CisJCQl2c3Rh dHMtPm5zdHJpbmdzKys7CisjaWZkZWYgSlNPTl9BTkFMWVpFX1NDQUxBUlMKKwkJCXZhbHVl ID0gUG9pbnRlckdldERhdHVtKAorCQkJCQkJY3N0cmluZ190b190ZXh0X3dpdGhfbGVuKGp2 LT52YWwuc3RyaW5nLnZhbCwKKwkJCQkJCQkJCQkJCSBqdi0+dmFsLnN0cmluZy5sZW4pKTsK KwkJCUpzb25WYWx1ZXNBcHBlbmQoJnZzdGF0cy0+c3RyaW5ncy52YWx1ZXMsIHZhbHVlLCBj dHgtPnRhcmdldCk7CisjZW5kaWYKKwkJCWJyZWFrOworCisJCWNhc2UgamJ2TnVtZXJpYzoK KwkJCXZzdGF0cy0+bm51bWVyaWNzKys7CisjaWZkZWYgSlNPTl9BTkFMWVpFX1NDQUxBUlMK KwkJCXZhbHVlID0gUG9pbnRlckdldERhdHVtKGp2LT52YWwubnVtZXJpYyk7CisJCQlKc29u VmFsdWVzQXBwZW5kKCZ2c3RhdHMtPm51bWVyaWNzLnZhbHVlcywgdmFsdWUsIGN0eC0+dGFy Z2V0KTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSBqYnZCaW5hcnk6CisJCQlpZiAo SnNvbkNvbnRhaW5lcklzT2JqZWN0KGp2LT52YWwuYmluYXJ5LmRhdGEpKQorCQkJeworCQkJ CXVpbnQzMgkJc2l6ZSA9IEpzb25Db250YWluZXJTaXplKGp2LT52YWwuYmluYXJ5LmRhdGEp OworCisJCQkJdmFsdWUgPSBEYXR1bUdldEludDMyKHNpemUpOworCQkJCXZzdGF0cy0+bm9i amVjdHMrKzsKKwkJCQlKc29uVmFsdWVzQXBwZW5kKCZ2c3RhdHMtPm9iamxlbnMudmFsdWVz LCB2YWx1ZSwgY3R4LT50YXJnZXQpOworCQkJfQorCQkJZWxzZSBpZiAoSnNvbkNvbnRhaW5l cklzQXJyYXkoanYtPnZhbC5iaW5hcnkuZGF0YSkpCisJCQl7CisJCQkJdWludDMyCQlzaXpl ID0gSnNvbkNvbnRhaW5lclNpemUoanYtPnZhbC5iaW5hcnkuZGF0YSk7CisKKwkJCQl2YWx1 ZSA9IERhdHVtR2V0SW50MzIoc2l6ZSk7CisJCQkJdnN0YXRzLT5uYXJyYXlzKys7CisJCQkJ SnNvblZhbHVlc0FwcGVuZCgmdnN0YXRzLT5hcnJsZW5zLnZhbHVlcywgdmFsdWUsIGN0eC0+ dGFyZ2V0KTsKKwkJCQl2c3RhdHMtPm5hcnJlbGVtcyArPSBzaXplOworCQkJfQorCQkJYnJl YWs7CisKKwkJZGVmYXVsdDoKKwkJCWVsb2coRVJST1IsICJpbnZhbGlkIHNjYWxhciBqc29u IHZhbHVlIHR5cGUgJWQiLCBqdi0+dHlwZSk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qCisg KiBqc29uQW5hbHl6ZUNvbGxlY3RQYXRocworICoJCVBhcnNlIHRoZSBKU09OIGRvY3VtZW50 IGFuZCBjb2xsZWN0IGFsbCBwYXRocyBhbmQgdGhlaXIgdmFsdWVzLgorICovCitzdGF0aWMg dm9pZAoranNvbkFuYWx5emVDb2xsZWN0UGF0aHMoSnNvbkFuYWx5emVDb250ZXh0ICpjdHgs IEpzb25iICpqYiwgdm9pZCAqcGFyYW0pCit7CisJSnNvbmJWYWx1ZQkJCWp2OworCUpzb25i SXRlcmF0b3IJICAgKml0OworCUpzb25iSXRlcmF0b3JUb2tlbgl0b2s7CisJSnNvblBhdGhB bmxTdGF0cyAgICpzdGF0cyA9IGN0eC0+cm9vdDsKKwlib29sCQkJCWNvbGxlY3RfdmFsdWVz ID0gKGJvb2wpKGludHB0cl90KSBwYXJhbTsKKwlib29sCQkJCXNjYWxhciA9IGZhbHNlOwor CisJaWYgKGNvbGxlY3RfdmFsdWVzICYmICFKQl9ST09UX0lTX1NDQUxBUihqYikpCisJCWpz b25BbmFseXplSnNvblZhbHVlKGN0eCwgJnN0YXRzLT52c3RhdHMsIEpzb25WYWx1ZUluaXRC aW5hcnkoJmp2LCBqYikpOworCisJaXQgPSBKc29uYkl0ZXJhdG9ySW5pdCgmamItPnJvb3Qp OworCisJd2hpbGUgKCh0b2sgPSBKc29uYkl0ZXJhdG9yTmV4dCgmaXQsICZqdiwgdHJ1ZSkp ICE9IFdKQl9ET05FKQorCXsKKwkJc3dpdGNoICh0b2spCisJCXsKKwkJCWNhc2UgV0pCX0JF R0lOX09CSkVDVDoKKwkJCQkvKgorCQkJCSAqIFJlYWQgbmV4dCB0b2tlbiB0byBzZWUgaWYg dGhlIG9iamVjdCBpcyBlbXB0eSBvciBub3QuCisJCQkJICogSWYgbm90LCBtYWtlIHN0YXRz IGZvciB0aGUgZmlyc3Qga2V5LiAgU3Vic2VxdWVudCBXSkJfS0VZcworCQkJCSAqIGFuZCBX SkJfRU5EX09CSkVDVCB3aWxsIGV4cGVjdCB0aGF0IHN0YXRzIHdpbGwgYmUgcG9pbnRpbmcK KwkJCQkgKiB0byB0aGUga2V5IG9mIGN1cnJlbnQgb2JqZWN0LgorCQkJCSAqLworCQkJCXRv ayA9IEpzb25iSXRlcmF0b3JOZXh0KCZpdCwgJmp2LCB0cnVlKTsKKworCQkJCWlmICh0b2sg PT0gV0pCX0VORF9PQkpFQ1QpCisJCQkJCS8qIEVtcHR5IG9iamVjdCwgc2ltcGx5IHNraXAg c3RhdHMgaW5pdGlhbGl6YXRpb24uICovCisJCQkJCWJyZWFrOworCisJCQkJaWYgKHRvayAh PSBXSkJfS0VZKQorCQkJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBqc29uYiBpdGVyYXRv ciB0b2tlbjogJWQiLCB0b2spOworCisJCQkJc3RhdHMgPSBqc29uQW5hbHl6ZUFkZFBhdGgo Y3R4LCAmc3RhdHMtPnBhdGgsCisJCQkJCQkJCQkJICAganYudmFsLnN0cmluZy52YWwsCisJ CQkJCQkJCQkJICAganYudmFsLnN0cmluZy5sZW4pOworCQkJCWJyZWFrOworCisJCQljYXNl IFdKQl9CRUdJTl9BUlJBWToKKwkJCQkvKiBNYWtlIHN0YXRzIGZvciBub24tc2NhbGFyIGFy cmF5IGFuZCB1c2UgaXQgZm9yIGFsbCBlbGVtZW50cyAqLworCQkJCWlmICghKHNjYWxhciA9 IGp2LnZhbC5hcnJheS5yYXdTY2FsYXIpKQorCQkJCQlzdGF0cyA9IGpzb25BbmFseXplQWRk UGF0aChjdHgsICZzdGF0cy0+cGF0aCwgTlVMTCwgLTEpOworCQkJCWJyZWFrOworCisJCQlj YXNlIFdKQl9FTkRfQVJSQVk6CisJCQkJaWYgKHNjYWxhcikKKwkJCQkJYnJlYWs7CisJCQkJ LyogRkFMTFRIUk9VR0ggKi8KKwkJCWNhc2UgV0pCX0VORF9PQkpFQ1Q6CisJCQkJLyogUmVz ZXQgdG8gcGFyZW50IHN0YXRzICovCisJCQkJc3RhdHMgPSAoSnNvblBhdGhBbmxTdGF0cyAq KSBzdGF0cy0+cGF0aC5wYXJlbnQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0pCX0tFWToK KwkJCQkvKgorCQkJCSAqIFN0YXRzIHNob3VsZCBwb2ludCB0byB0aGUgcHJldmlvdXMga2V5 IG9mIGN1cnJlbnQgb2JqZWN0LAorCQkJCSAqIHVzZSBpdHMgcGFyZW50IHBhdGggYXMgYSBi YXNlIHBhdGguCisJCQkJICovCisJCQkJc3RhdHMgPSBqc29uQW5hbHl6ZUFkZFBhdGgoY3R4 LCBzdGF0cy0+cGF0aC5wYXJlbnQsCisJCQkJCQkJCQkJICAganYudmFsLnN0cmluZy52YWws CisJCQkJCQkJCQkJICAganYudmFsLnN0cmluZy5sZW4pOworCQkJCWJyZWFrOworCisJCQlj YXNlIFdKQl9WQUxVRToKKwkJCWNhc2UgV0pCX0VMRU06CisJCQkJaWYgKGNvbGxlY3RfdmFs dWVzKQorCQkJCQlqc29uQW5hbHl6ZUpzb25WYWx1ZShjdHgsICZzdGF0cy0+dnN0YXRzLCAm anYpOworCisJCQkJLyoKKwkJCQkgKiBNYW51YWxseSByZWN1cnNlIGludG8gY29udGFpbmVy IGJ5IGNyZWF0aW5nIGNoaWxkIGl0ZXJhdG9yLgorCQkJCSAqIFdlIHVzZSBza2lwTmVzdGVk PXRydWUgdG8gZ2l2ZSBqc29uQW5hbHl6ZUpzb25WYWx1ZSgpCisJCQkJICogYWJpbGl0eSB0 byBhY2Nlc3MgamJ2QmluYXJ5IGNvbnRhaW5lcnMuCisJCQkJICovCisJCQkJaWYgKGp2LnR5 cGUgPT0gamJ2QmluYXJ5KQorCQkJCXsKKwkJCQkJSnNvbmJJdGVyYXRvciAqaXQyID0gSnNv bmJJdGVyYXRvckluaXQoanYudmFsLmJpbmFyeS5kYXRhKTsKKworCQkJCQlpdDItPnBhcmVu dCA9IGl0OworCQkJCQlpdCA9IGl0MjsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1 bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBqc29uQW5hbHl6ZUNvbGxl Y3RTdWJwYXRoCisgKgkJUmVjdXJzaXZlbHkgZXh0cmFjdCB0cmFpbGluZyBwYXJ0IG9mIGEg cGF0aCBhbmQgY29sbGVjdCBpdHMgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZAoranNvbkFu YWx5emVDb2xsZWN0U3VicGF0aChKc29uQW5hbHl6ZUNvbnRleHQgKmN0eCwgSnNvblBhdGhB bmxTdGF0cyAqcHN0YXRzLAorCQkJCQkJICBKc29uYlZhbHVlICpqYnYsIEpzb25QYXRoRW50 cnkgKiplbnRyaWVzLAorCQkJCQkJICBpbnQgc3RhcnRfZW50cnkpCit7CisJSnNvbmJWYWx1 ZQlzY2FsYXI7CisJaW50CQkJaTsKKworCWZvciAoaSA9IHN0YXJ0X2VudHJ5OyBpIDwgcHN0 YXRzLT5kZXB0aDsgaSsrKQorCXsKKwkJSnNvblBhdGhFbnRyeSAgKmVudHJ5ID0gZW50cmll c1tpXTsKKwkJSnNvbmJDb250YWluZXIgKmpiYyA9IGpidi0+dmFsLmJpbmFyeS5kYXRhOwor CQlKc29uYlZhbHVlVHlwZQl0eXBlID0gamJ2LT50eXBlOworCisJCWlmIChpID4gc3RhcnRf ZW50cnkpCisJCQlwZnJlZShqYnYpOworCisJCWlmICh0eXBlICE9IGpidkJpbmFyeSkKKwkJ CXJldHVybjsKKworCQlpZiAoSnNvblBhdGhFbnRyeUlzQXJyYXkoZW50cnkpKQorCQl7CisJ CQlKc29uYkl0ZXJhdG9yCSAgICppdDsKKwkJCUpzb25iSXRlcmF0b3JUb2tlbglyOworCQkJ SnNvbmJWYWx1ZQkJCWVsZW07CisKKwkJCWlmICghSnNvbkNvbnRhaW5lcklzQXJyYXkoamJj KSB8fCBKc29uQ29udGFpbmVySXNTY2FsYXIoamJjKSkKKwkJCQlyZXR1cm47CisKKwkJCWl0 ID0gSnNvbmJJdGVyYXRvckluaXQoamJjKTsKKworCQkJd2hpbGUgKChyID0gSnNvbmJJdGVy YXRvck5leHQoJml0LCAmZWxlbSwgdHJ1ZSkpICE9IFdKQl9ET05FKQorCQkJeworCQkJCWlm IChyID09IFdKQl9FTEVNKQorCQkJCQlqc29uQW5hbHl6ZUNvbGxlY3RTdWJwYXRoKGN0eCwg cHN0YXRzLCAmZWxlbSwgZW50cmllcywgaSArIDEpOworCQkJfQorCisJCQlyZXR1cm47CisJ CX0KKwkJZWxzZQorCQl7CisJCQlpZiAoIUpzb25Db250YWluZXJJc09iamVjdChqYmMpKQor CQkJCXJldHVybjsKKworCQkJamJ2ID0gZmluZEpzb25iVmFsdWVGcm9tQ29udGFpbmVyTGVu KGpiYywgSkJfRk9CSkVDVCwKKwkJCQkJCQkJCQkJCSBlbnRyeS0+ZW50cnksIGVudHJ5LT5s ZW4pOworCisJCQlpZiAoIWpidikKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoaSA9 PSBzdGFydF9lbnRyeSAmJgorCQlqYnYtPnR5cGUgPT0gamJ2QmluYXJ5ICYmCisJCUpzb25i RXh0cmFjdFNjYWxhcihqYnYtPnZhbC5iaW5hcnkuZGF0YSwgJnNjYWxhcikpCisJCWpidiA9 ICZzY2FsYXI7CisKKwlqc29uQW5hbHl6ZUpzb25WYWx1ZShjdHgsICZwc3RhdHMtPnZzdGF0 cywgamJ2KTsKKworCWlmIChpID4gc3RhcnRfZW50cnkpCisJCXBmcmVlKGpidik7Cit9CisK Ky8qCisgKiBqc29uQW5hbHl6ZUNvbGxlY3RQYXRoCisgKgkJRXh0cmFjdCBhIHNpbmdsZSBw YXRoIGZyb20gSlNPTiBkb2N1bWVudHMgYW5kIGNvbGxlY3QgaXRzIHZhbHVlcy4KKyAqLwor c3RhdGljIHZvaWQKK2pzb25BbmFseXplQ29sbGVjdFBhdGgoSnNvbkFuYWx5emVDb250ZXh0 ICpjdHgsIEpzb25iICpqYiwgdm9pZCAqcGFyYW0pCit7CisJSnNvblBhdGhBbmxTdGF0cyAq cHN0YXRzID0gKEpzb25QYXRoQW5sU3RhdHMgKikgcGFyYW07CisJSnNvbmJWYWx1ZQlqYnZ0 bXA7CisJSnNvbmJWYWx1ZSAqamJ2ID0gSnNvblZhbHVlSW5pdEJpbmFyeSgmamJ2dG1wLCBq Yik7CisJSnNvblBhdGhFbnRyeSAqcGF0aDsKKwlKc29uUGF0aEVudHJ5ICoqZW50cmllczsK KwlpbnQJCQlpOworCisJZW50cmllcyA9IHBhbGxvYyhzaXplb2YoKmVudHJpZXMpICogcHN0 YXRzLT5kZXB0aCk7CisKKwkvKiBCdWlsZCBlbnRyeSBhcnJheSBpbiBkaXJlY3Qgb3JkZXIg Ki8KKwlmb3IgKHBhdGggPSAmcHN0YXRzLT5wYXRoLCBpID0gcHN0YXRzLT5kZXB0aCAtIDE7 CisJCSBwYXRoLT5wYXJlbnQgJiYgaSA+PSAwOworCQkgcGF0aCA9IHBhdGgtPnBhcmVudCwg aS0tKQorCQllbnRyaWVzW2ldID0gcGF0aDsKKworCWpzb25BbmFseXplQ29sbGVjdFN1YnBh dGgoY3R4LCBwc3RhdHMsIGpidiwgZW50cmllcywgMCk7CisKKwlwZnJlZShlbnRyaWVzKTsK K30KKworc3RhdGljIERhdHVtCitqc29uQW5hbHl6ZVBhdGhGZXRjaChWYWNBdHRyU3RhdHNQ IHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc251bGwpCit7CisJKmlzbnVsbCA9IGZhbHNl OworCXJldHVybiBzdGF0cy0+ZXhwcnZhbHNbcm93bnVtXTsKK30KKworLyoKKyAqIGpzb25B bmFseXplUGF0aFZhbHVlcworICoJCUNhbGN1bGF0ZSBwZXItY29sdW1uIHN0YXRpc3RpY3Mg Zm9yIHZhbHVlcyBmb3IgYSBzaW5nbGUgcGF0aC4KKyAqCisgKiBXZSBoYXZlIGFscmVhZHkg YWNjdW11bGF0ZWQgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBwYXRoLCBzbyB3ZSBzaW1wbHkK KyAqIGNhbGwgdGhlIHR5cGFuYWx5emUgZnVuY3Rpb24gZm9yIHRoZSBwcm9wZXIgZGF0YSB0 eXBlLCBhbmQgdGhlbgorICogY29tcHV0ZV9zdGF0cyAod2hpY2ggcG9pbnRzIHRvIGNvbXB1 dGVfc2NhbGFyX3N0YXRzIG9yIHNvKS4KKyAqLworc3RhdGljIHZvaWQKK2pzb25BbmFseXpl UGF0aFZhbHVlcyhKc29uQW5hbHl6ZUNvbnRleHQgKmN0eCwgSnNvblNjYWxhclN0YXRzICpz c3RhdHMsCisJCQkJCSAgT2lkIHR5cGlkLCBkb3VibGUgZnJlcSkKK3sKKwlKc29uVmFsdWVz CQkJICAgKnZhbHVlcyA9ICZzc3RhdHMtPnZhbHVlczsKKwlWYWNBdHRyU3RhdHMJCSAgICpz dGF0cyA9ICZzc3RhdHMtPnN0YXRzOworCUZvcm1EYXRhX3BnX2F0dHJpYnV0ZQlhdHRyOwor CUZvcm1EYXRhX3BnX3R5cGUJCXR5cGU7CisJaW50CQkJCQkJaTsKKworCWlmICghc3N0YXRz LT52YWx1ZXMuY291bnQpCisJCXJldHVybjsKKworCWdldF90eXBsZW5ieXZhbGFsaWduKHR5 cGlkLCAmdHlwZS50eXBsZW4sICZ0eXBlLnR5cGJ5dmFsLCAmdHlwZS50eXBhbGlnbik7CisK KwlhdHRyLmF0dHN0YXR0YXJnZXQgPSBjdHgtPnRhcmdldDsKKworCXN0YXRzLT5hdHRyID0g JmF0dHI7CisJc3RhdHMtPmF0dHJ0eXBpZCA9IHR5cGlkOworCXN0YXRzLT5hdHRydHlwbW9k ID0gLTE7CisJc3RhdHMtPmF0dHJ0eXBlID0gJnR5cGU7CisJc3RhdHMtPmFubF9jb250ZXh0 ID0gY3R4LT5zdGF0cy0+YW5sX2NvbnRleHQ7CisKKwlzdGF0cy0+ZXhwcnZhbHMgPSB2YWx1 ZXMtPmJ1ZjsKKworCS8qCisJICogVGhlIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBzdGF0cy0+ c3RhdmFsdWVzW25dIGVsZW1lbnQgdHlwZXMgZGVmYXVsdCB0bworCSAqIHRoZSB0eXBlIG9m IHRoZSBkYXRhIGJlaW5nIGFuYWx5emVkLCBidXQgdGhlIHR5cGUtc3BlY2lmaWMgdHlwYW5h bHl6ZQorCSAqIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhlbSBpZiBpdCB3YW50cyB0byBzdG9y ZSBzb21ldGhpbmcgZWxzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBVElTVElDX05V TV9TTE9UUzsgaSsrKQorCXsKKwkJc3RhdHMtPnN0YXR5cGlkW2ldID0gc3RhdHMtPmF0dHJ0 eXBpZDsKKwkJc3RhdHMtPnN0YXR5cGxlbltpXSA9IHN0YXRzLT5hdHRydHlwZS0+dHlwbGVu OworCQlzdGF0cy0+c3RhdHlwYnl2YWxbaV0gPSBzdGF0cy0+YXR0cnR5cGUtPnR5cGJ5dmFs OworCQlzdGF0cy0+c3RhdHlwYWxpZ25baV0gPSBzdGF0cy0+YXR0cnR5cGUtPnR5cGFsaWdu OworCX0KKworCXN0ZF90eXBhbmFseXplKHN0YXRzKTsKKworCXN0YXRzLT5jb21wdXRlX3N0 YXRzKHN0YXRzLCBqc29uQW5hbHl6ZVBhdGhGZXRjaCwKKwkJCQkJCSB2YWx1ZXMtPmNvdW50 LAorCQkJCQkJIGN0eC0+dG90YWxyb3dzIC8gY3R4LT5zYW1wbGVyb3dzICogdmFsdWVzLT5j b3VudCk7CisKKwkvKgorCSAqIFdlJ3ZlIG9ubHkga2VwdCB0aGUgbm9uLW51bGwgdmFsdWVz LCBzbyBjb21wdXRlX3N0YXRzIHdpbGwgYWx3YXlzCisJICogbGVhdmUgdGhpcyBhcyAxLjAu IEJ1dCB3ZSBoYXZlIGVub3VnaCBpbmZvIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdAorCSAq IHZhbHVlLgorCSAqLworCXN0YXRzLT5zdGFudWxsZnJhYyA9IChmbG9hdDQpKDEuMCAtIGZy ZXEpOworCisJLyoKKwkgKiBTaW1pbGFybHksIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUgTUNW IGZyZXF1ZW5jaWVzLCBiZWN1c2UgdGhvc2UgYXJlCisJICogYWxzbyBjYWxjdWxhdGVkIG9u bHkgZnJvbSB0aGUgbm9uLW51bGwgdmFsdWVzLiBBbGwgd2UgbmVlZCB0byBkbyBpcworCSAq IHNpbXBseSBtdWx0aXBseSB0aGF0IHdpdGggdGhlIG5vbi1OVUxMIGZyZXF1ZW5jeS4KKwkg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBVElTVElDX05VTV9TTE9UUzsgaSsrKQorCXsKKwkJ aWYgKHN0YXRzLT5zdGFraW5kW2ldID09IFNUQVRJU1RJQ19LSU5EX01DVikKKwkJeworCQkJ aW50IGo7CisJCQlmb3IgKGogPSAwOyBqIDwgc3RhdHMtPm51bW51bWJlcnNbaV07IGorKykK KwkJCQlzdGF0cy0+c3RhbnVtYmVyc1tpXVtqXSAqPSBmcmVxOworCQl9CisJfQorfQorCisv KgorICoganNvbkFuYWx5emVNYWtlU2NhbGFyU3RhdHMKKyAqCQlTZXJpYWxpemUgc2NhbGFy IHN0YXRzIGludG8gYSBKU09OIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIFdlIHNpbXBseSBw cm9kdWNlIGEgSlNPTiBkb2N1bWVudCB3aXRoIGEgbGlzdCBvZiBwcmVkZWZpbmVkIGtleXM6 CisgKgorICogLSBudWxsZnJhYworICogLSBkaXN0aW5jdAorICogLSB3aWR0aAorICogLSBj b3JyZWxhdGlvbgorICogLSBtY3Ygb3IgaGlzdG9ncmFtCisgKgorICogRm9yIHRoZSBtY3Yg LyBoaXN0b2dyYW0sIHdlIHN0b3JlIGEgbmVzdGVkIHZhbHVlcyAvIG51bWJlcnMuCisgKi8K K3N0YXRpYyBKc29uYlZhbHVlICoKK2pzb25BbmFseXplTWFrZVNjYWxhclN0YXRzKEpzb25i UGFyc2VTdGF0ZSAqKnBzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJCWNvbnN0IFZhY0F0 dHJTdGF0cyAqc3RhdHMpCit7CisJSnNvbmJWYWx1ZQl2YWw7CisJaW50CQkJaTsKKwlpbnQJ CQlqOworCisJcHVzaEpzb25iS2V5KHBzLCAmdmFsLCBuYW1lKTsKKworCXB1c2hKc29uYlZh bHVlKHBzLCBXSkJfQkVHSU5fT0JKRUNULCBOVUxMKTsKKworCXB1c2hKc29uYktleVZhbHVl RmxvYXQocHMsICZ2YWwsICJudWxsZnJhYyIsIHN0YXRzLT5zdGFudWxsZnJhYyk7CisJcHVz aEpzb25iS2V5VmFsdWVGbG9hdChwcywgJnZhbCwgImRpc3RpbmN0Iiwgc3RhdHMtPnN0YWRp c3RpbmN0KTsKKwlwdXNoSnNvbmJLZXlWYWx1ZUludGVnZXIocHMsICZ2YWwsICJ3aWR0aCIs IHN0YXRzLT5zdGF3aWR0aCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RBVElTVElDX05VTV9T TE9UUzsgaSsrKQorCXsKKwkJaWYgKCFzdGF0cy0+c3Rha2luZFtpXSkKKwkJCWJyZWFrOwor CisJCXN3aXRjaCAoc3RhdHMtPnN0YWtpbmRbaV0pCisJCXsKKwkJCWNhc2UgU1RBVElTVElD X0tJTkRfTUNWOgorCQkJCXB1c2hKc29uYktleShwcywgJnZhbCwgIm1jdiIpOworCQkJCWJy ZWFrOworCisJCQljYXNlIFNUQVRJU1RJQ19LSU5EX0hJU1RPR1JBTToKKwkJCQlwdXNoSnNv bmJLZXkocHMsICZ2YWwsICJoaXN0b2dyYW0iKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBT VEFUSVNUSUNfS0lORF9DT1JSRUxBVElPTjoKKwkJCQlwdXNoSnNvbmJLZXlWYWx1ZUZsb2F0 KHBzLCAmdmFsLCAiY29ycmVsYXRpb24iLAorCQkJCQkJCQkJICAgc3RhdHMtPnN0YW51bWJl cnNbaV1bMF0pOworCQkJCWNvbnRpbnVlOworCisJCQlkZWZhdWx0OgorCQkJCWVsb2coRVJS T1IsICJ1bmV4cGVjdGVkIHN0YWtpbmQgJWQiLCBzdGF0cy0+c3Rha2luZFtpXSk7CisJCQkJ YnJlYWs7CisJCX0KKworCQlwdXNoSnNvbmJWYWx1ZShwcywgV0pCX0JFR0lOX09CSkVDVCwg TlVMTCk7CisKKwkJaWYgKHN0YXRzLT5udW12YWx1ZXNbaV0gPiAwKQorCQl7CisJCQlwdXNo SnNvbmJLZXkocHMsICZ2YWwsICJ2YWx1ZXMiKTsKKwkJCXB1c2hKc29uYlZhbHVlKHBzLCBX SkJfQkVHSU5fQVJSQVksIE5VTEwpOworCQkJZm9yIChqID0gMDsgaiA8IHN0YXRzLT5udW12 YWx1ZXNbaV07IGorKykKKwkJCXsKKwkJCQlEYXR1bSB2ID0gc3RhdHMtPnN0YXZhbHVlc1tp XVtqXTsKKwkJCQlpZiAoc3RhdHMtPmF0dHJ0eXBpZCA9PSBKU09OQk9JRCkKKwkJCQkJcHVz aEpzb25iRWxlbUJpbmFyeShwcywgJnZhbCwgRGF0dW1HZXRKc29uYlAodikpOworCQkJCWVs c2UgaWYgKHN0YXRzLT5hdHRydHlwaWQgPT0gVEVYVE9JRCkKKwkJCQkJcHVzaEpzb25iRWxl bVRleHQocHMsICZ2YWwsIERhdHVtR2V0VGV4dFAodikpOworCQkJCWVsc2UgaWYgKHN0YXRz LT5hdHRydHlwaWQgPT0gTlVNRVJJQ09JRCkKKwkJCQkJcHVzaEpzb25iRWxlbU51bWVyaWMo cHMsICZ2YWwsIERhdHVtR2V0TnVtZXJpYyh2KSk7CisJCQkJZWxzZSBpZiAoc3RhdHMtPmF0 dHJ0eXBpZCA9PSBJTlQ0T0lEKQorCQkJCQlwdXNoSnNvbmJFbGVtSW50ZWdlcihwcywgJnZh bCwgRGF0dW1HZXRJbnQzMih2KSk7CisJCQkJZWxzZQorCQkJCQllbG9nKEVSUk9SLCAidW5l eHBlY3RlZCBzdGF0IHZhbHVlIHR5cGUgJWQiLAorCQkJCQkJIHN0YXRzLT5hdHRydHlwaWQp OworCQkJfQorCQkJcHVzaEpzb25iVmFsdWUocHMsIFdKQl9FTkRfQVJSQVksIE5VTEwpOwor CQl9CisKKwkJaWYgKHN0YXRzLT5udW1udW1iZXJzW2ldID4gMCkKKwkJeworCQkJcHVzaEpz b25iS2V5KHBzLCAmdmFsLCAibnVtYmVycyIpOworCQkJcHVzaEpzb25iVmFsdWUocHMsIFdK Ql9CRUdJTl9BUlJBWSwgTlVMTCk7CisJCQlmb3IgKGogPSAwOyBqIDwgc3RhdHMtPm51bW51 bWJlcnNbaV07IGorKykKKwkJCQlwdXNoSnNvbmJFbGVtRmxvYXQocHMsICZ2YWwsIHN0YXRz LT5zdGFudW1iZXJzW2ldW2pdKTsKKwkJCXB1c2hKc29uYlZhbHVlKHBzLCBXSkJfRU5EX0FS UkFZLCBOVUxMKTsKKwkJfQorCisJCXB1c2hKc29uYlZhbHVlKHBzLCBXSkJfRU5EX09CSkVD VCwgTlVMTCk7CisJfQorCisJcmV0dXJuIHB1c2hKc29uYlZhbHVlKHBzLCBXSkJfRU5EX09C SkVDVCwgTlVMTCk7Cit9CisKKy8qCisgKiBqc29uQW5hbHl6ZUJ1aWxkUGF0aFN0YXRzCisg KgkJU2VyaWFsaXplIHN0YXRpc3RpY3MgZm9yIGEgcGFydGljdWxhciBqc29uIHBhdGguCisg KgorICogVGhpcyBpbmNsdWRlcyBib3RoIHRoZSBwZXItY29sdW1uIHN0YXRzIChzdG9yZWQg aW4gImpzb24iIGtleSkgYW5kIHRoZQorICogSlNPTiBzcGVjaWZpYyBzdGF0cyAobGlrZSBm cmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzKS4KKyAqLworc3RhdGljIEpz b25iICoKK2pzb25BbmFseXplQnVpbGRQYXRoU3RhdHMoSnNvblBhdGhBbmxTdGF0cyAqcHN0 YXRzKQoreworCWNvbnN0IEpzb25WYWx1ZVN0YXRzICp2c3RhdHMgPSAmcHN0YXRzLT52c3Rh dHM7CisJZmxvYXQ0CQkJCWZyZXEgPSBwc3RhdHMtPmZyZXE7CisJYm9vbAkJCQlmdWxsc3Rh dHMgPSB0cnVlOwkvKiBwc3RhdHMtPnBhdGgucGFyZW50ICE9IE5VTEwgKi8KKwlKc29uYlZh bHVlCQkJdmFsOworCUpzb25iVmFsdWUJCSAgICpqYnY7CisJSnNvbmJQYXJzZVN0YXRlCSAg ICpwcyA9IE5VTEw7CisKKwlwdXNoSnNvbmJWYWx1ZSgmcHMsIFdKQl9CRUdJTl9PQkpFQ1Qs IE5VTEwpOworCisJcHVzaEpzb25iS2V5VmFsdWVTdHJpbmcoJnBzLCAmdmFsLCAicGF0aCIs IHBzdGF0cy0+cGF0aHN0cik7CisKKwlwdXNoSnNvbmJLZXlWYWx1ZUZsb2F0KCZwcywgJnZh bCwgImZyZXEiLCBmcmVxKTsKKworCXB1c2hKc29uYktleVZhbHVlRmxvYXQoJnBzLCAmdmFs LCAiZnJlcV9udWxsIiwKKwkJCQkJCSAgIGZyZXEgKiB2c3RhdHMtPm5udWxscyAvCisJCQkJ CQkJCSAgdnN0YXRzLT5qc29ucy52YWx1ZXMuY291bnQpOworCisJcHVzaEpzb25iS2V5VmFs dWVGbG9hdCgmcHMsICZ2YWwsICJmcmVxX2Jvb2xlYW4iLAorCQkJCQkJICAgZnJlcSAqICh2 c3RhdHMtPm5mYWxzZSArIHZzdGF0cy0+bnRydWUpIC8KKwkJCQkJCQkJICB2c3RhdHMtPmpz b25zLnZhbHVlcy5jb3VudCk7CisKKwlwdXNoSnNvbmJLZXlWYWx1ZUZsb2F0KCZwcywgJnZh bCwgImZyZXFfc3RyaW5nIiwKKwkJCQkJCSAgIGZyZXEgKiB2c3RhdHMtPm5zdHJpbmdzIC8K KwkJCQkJCQkJICB2c3RhdHMtPmpzb25zLnZhbHVlcy5jb3VudCk7CisKKwlwdXNoSnNvbmJL ZXlWYWx1ZUZsb2F0KCZwcywgJnZhbCwgImZyZXFfbnVtZXJpYyIsCisJCQkJCQkgICBmcmVx ICogdnN0YXRzLT5ubnVtZXJpY3MgLworCQkJCQkJCQkgIHZzdGF0cy0+anNvbnMudmFsdWVz LmNvdW50KTsKKworCXB1c2hKc29uYktleVZhbHVlRmxvYXQoJnBzLCAmdmFsLCAiZnJlcV9h cnJheSIsCisJCQkJCQkgICBmcmVxICogdnN0YXRzLT5uYXJyYXlzIC8KKwkJCQkJCQkJICB2 c3RhdHMtPmpzb25zLnZhbHVlcy5jb3VudCk7CisKKwlwdXNoSnNvbmJLZXlWYWx1ZUZsb2F0 KCZwcywgJnZhbCwgImZyZXFfb2JqZWN0IiwKKwkJCQkJCSAgIGZyZXEgKiB2c3RhdHMtPm5v YmplY3RzIC8KKwkJCQkJCQkJICB2c3RhdHMtPmpzb25zLnZhbHVlcy5jb3VudCk7CisKKwkv KgorCSAqIFdlIGtlZXAgYXJyYXkgbGVuZ3RoIHN0YXRzIGhlcmUgZm9yIHF1ZXJpZXMgbGlr ZSBqc29ucGF0aCAnJC5zaXplKCkgPiA1Jy4KKwkgKiBPYmplY3QgbGVuZ3RocyBzdGF0cyBj YW4gYmUgdXNlZnVsIGZvciBvdGhlciBxdWVyeSBsYW51YWdlcy4KKwkgKi8KKwlpZiAodnN0 YXRzLT5hcnJsZW5zLnZhbHVlcy5jb3VudCkKKwkJanNvbkFuYWx5emVNYWtlU2NhbGFyU3Rh dHMoJnBzLCAiYXJyYXlfbGVuZ3RoIiwgJnZzdGF0cy0+YXJybGVucy5zdGF0cyk7CisKKwlp ZiAodnN0YXRzLT5vYmpsZW5zLnZhbHVlcy5jb3VudCkKKwkJanNvbkFuYWx5emVNYWtlU2Nh bGFyU3RhdHMoJnBzLCAib2JqZWN0X2xlbmd0aCIsICZ2c3RhdHMtPm9iamxlbnMuc3RhdHMp OworCisJaWYgKHZzdGF0cy0+bmFycmF5cykKKwkJcHVzaEpzb25iS2V5VmFsdWVGbG9hdCgm cHMsICZ2YWwsICJhdmdfYXJyYXlfbGVuZ3RoIiwKKwkJCQkJCQkgICAoZmxvYXQ0KSB2c3Rh dHMtPm5hcnJlbGVtcyAvIHZzdGF0cy0+bmFycmF5cyk7CisKKwlpZiAoZnVsbHN0YXRzKQor CXsKKyNpZmRlZiBKU09OX0FOQUxZWkVfU0NBTEFSUworCQlqc29uQW5hbHl6ZU1ha2VTY2Fs YXJTdGF0cygmcHMsICJzdHJpbmciLCAmdnN0YXRzLT5zdHJpbmdzLnN0YXRzKTsKKwkJanNv bkFuYWx5emVNYWtlU2NhbGFyU3RhdHMoJnBzLCAibnVtZXJpYyIsICZ2c3RhdHMtPm51bWVy aWNzLnN0YXRzKTsKKyNlbmRpZgorCQlqc29uQW5hbHl6ZU1ha2VTY2FsYXJTdGF0cygmcHMs ICJqc29uIiwgJnZzdGF0cy0+anNvbnMuc3RhdHMpOworCX0KKworCWpidiA9IHB1c2hKc29u YlZhbHVlKCZwcywgV0pCX0VORF9PQkpFQ1QsIE5VTEwpOworCisJcmV0dXJuIEpzb25iVmFs dWVUb0pzb25iKGpidik7Cit9CisKKy8qCisgKiBqc29uQW5hbHl6ZUNhbGNQYXRoRnJlcQor ICoJCUNhbGN1bGF0ZSBwYXRoIGZyZXF1ZW5jeSwgaS5lLiBob3cgbWFueSBkb2N1bWVudHMg Y29udGFpbiB0aGlzIHBhdGguCisgKi8KK3N0YXRpYyB2b2lkCitqc29uQW5hbHl6ZUNhbGNQ YXRoRnJlcShKc29uQW5hbHl6ZUNvbnRleHQgKmN0eCwgSnNvblBhdGhBbmxTdGF0cyAqcHN0 YXRzKQoreworCUpzb25QYXRoQW5sU3RhdHMgICpwYXJlbnQgPSAoSnNvblBhdGhBbmxTdGF0 cyAqKSBwc3RhdHMtPnBhdGgucGFyZW50OworCisJaWYgKHBhcmVudCkKKwl7CisJCWludAkJ CWNvdW50ID0gSnNvblBhdGhFbnRyeUlzQXJyYXkoJnBzdGF0cy0+cGF0aCkJPworCQkJcGFy ZW50LT52c3RhdHMubmFycmF5cyA6IHBzdGF0cy0+dnN0YXRzLmpzb25zLnZhbHVlcy5jb3Vu dDsKKworCQlwc3RhdHMtPmZyZXEgPSBwYXJlbnQtPmZyZXEgKiBjb3VudCAvIHBhcmVudC0+ dnN0YXRzLmpzb25zLnZhbHVlcy5jb3VudDsKKworCQlDTEFNUF9QUk9CQUJJTElUWShwc3Rh dHMtPmZyZXEpOworCX0KKwllbHNlCisJCXBzdGF0cy0+ZnJlcSA9IChkb3VibGUpIGN0eC0+ YW5hbHl6ZWRfY250IC8gY3R4LT5zYW1wbGVyb3dzOworfQorCisvKgorICoganNvbkFuYWx5 emVQYXRoCisgKgkJQnVpbGQgc3RhdGlzdGljcyBmb3IgdmFsdWVzIGFjY3VtdWxhdGVkIGZv ciB0aGlzIHBhdGguCisgKgorICogV2UncmUgZG9uZSB3aXRoIGFjY3VtdWxhdGluZyB2YWx1 ZXMgZm9yIHRoaXMgcGF0aCwgc28gY2FsY3VsYXRlIHRoZQorICogc3RhdGlzdGljcyBmb3Ig dGhlIHZhcmlvdXMgYXJyYXlzLgorICoKKyAqIFhYWCBJIHdvbmRlciBpZiB3ZSBjb3VsZCBp bnRyb2R1Y2Ugc29tZSBzaW1wbGUgaGV1cmlzdGljdCBvbiB3aGljaAorICogcGF0aHMgdG8g a2VlcCwgc2ltaWxhcmx5IHRvIHdoYXQgd2UgZG8gZm9yIE1DViBsaXN0cy4gRm9yIGV4YW1w bGUgYQorICogcGF0aCB0aGF0IG9jY3VycmVkIGp1c3Qgb25jZSBpcyBub3QgdmVyeSBpbnRl cmVzdGluZywgc28gd2UgY291bGQKKyAqIGRlY2lkZSB0byBpZ25vcmUgaXQgYW5kIG5vdCBi dWlsZCB0aGUgc3RhdHMuIEFsdGhvdWdoIHRoYXQgd29uJ3QKKyAqIHNhdmUgbXVjaCwgYmVj YXVzZSB0aGVyZSdsbCBiZSB2ZXJ5IGZldyB2YWx1ZXMgYWNjdW11bGF0ZWQuCisgKi8KK3N0 YXRpYyB2b2lkCitqc29uQW5hbHl6ZVBhdGgoSnNvbkFuYWx5emVDb250ZXh0ICpjdHgsIEpz b25QYXRoQW5sU3RhdHMgKnBzdGF0cykKK3sKKwlNZW1vcnlDb250ZXh0CQlvbGRjeHQ7CisJ SnNvblZhbHVlU3RhdHMJICAgKnZzdGF0cyA9ICZwc3RhdHMtPnZzdGF0czsKKworCWpzb25B bmFseXplQ2FsY1BhdGhGcmVxKGN0eCwgcHN0YXRzKTsKKworCS8qIHZhbHVlcyBjb21iaW5p bmcgYWxsIG9iamVjdCB0eXBlcyAqLworCWpzb25BbmFseXplUGF0aFZhbHVlcyhjdHgsICZ2 c3RhdHMtPmpzb25zLCBKU09OQk9JRCwgcHN0YXRzLT5mcmVxKTsKKworCS8qCisJICogTGVu Z3RocyBhbmQgYXJyYXkgbGVuZ3Rocy4gIFdlIGRpdmlkZSBjb3VudHMgYnkgdGhlIHRvdGFs IG51bWJlciBvZiBqc29uCisJICogdmFsdWVzIHRvIGNvbXB1dGUgY29ycmVjdCBudWxsZnJh YyAoaS5lLiBub3QgYWxsIGpzb25zIGhhdmUgbGVuZ3RocykuCisJICovCisJanNvbkFuYWx5 emVQYXRoVmFsdWVzKGN0eCwgJnZzdGF0cy0+YXJybGVucywgSU5UNE9JRCwKKwkJCQkJCSAg cHN0YXRzLT5mcmVxICogdnN0YXRzLT5hcnJsZW5zLnZhbHVlcy5jb3VudCAvCisJCQkJCQkJ CQkJIHZzdGF0cy0+anNvbnMudmFsdWVzLmNvdW50KTsKKwlqc29uQW5hbHl6ZVBhdGhWYWx1 ZXMoY3R4LCAmdnN0YXRzLT5vYmpsZW5zLCBJTlQ0T0lELAorCQkJCQkJICBwc3RhdHMtPmZy ZXEgKiB2c3RhdHMtPm9iamxlbnMudmFsdWVzLmNvdW50IC8KKwkJCQkJCQkJCQkgdnN0YXRz LT5qc29ucy52YWx1ZXMuY291bnQpOworCisjaWZkZWYgSlNPTl9BTkFMWVpFX1NDQUxBUlMK KwkvKiBzdGF0cyBmb3IgdmFsdWVzIG9mIHN0cmluZy9udW1lcmljIHR5cGVzIG9ubHkgKi8K Kwlqc29uQW5hbHl6ZVBhdGhWYWx1ZXMoY3R4LCAmdnN0YXRzLT5zdHJpbmdzLCBURVhUT0lE LCBwc3RhdHMtPmZyZXEpOworCWpzb25BbmFseXplUGF0aFZhbHVlcyhjdHgsICZ2c3RhdHMt Pm51bWVyaWNzLCBOVU1FUklDT0lELCBwc3RhdHMtPmZyZXEpOworI2VuZGlmCisKKwlvbGRj eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oY3R4LT5zdGF0cy0+YW5sX2NvbnRleHQpOwor CXBzdGF0cy0+c3RhdHMgPSBqc29uQW5hbHl6ZUJ1aWxkUGF0aFN0YXRzKHBzdGF0cyk7CisJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7Cit9CisKKy8qCisgKiBKc29uUGF0aFN0 YXRzQ29tcGFyZQorICoJCUNvbXBhcmUgdHdvIHBhdGggc3RhdHMgKGJ5IHBhdGggc3RyaW5n KS4KKyAqCisgKiBXZSBzdG9yZSB0aGUgc3RhdHMgc29ydGVkIGJ5IHBhdGggc3RyaW5nLCBh bmQgdGhpcyBpcyB0aGUgY29tcGFyYXRvci4KKyAqLworc3RhdGljIGludAorSnNvblBhdGhT dGF0c0NvbXBhcmUoY29uc3Qgdm9pZCAqcHYxLCBjb25zdCB2b2lkICpwdjIpCit7CisJcmV0 dXJuIHN0cmNtcCgoKigoY29uc3QgSnNvblBhdGhBbmxTdGF0cyAqKikgcHYxKSktPnBhdGhz dHIsCisJCQkJICAoKigoY29uc3QgSnNvblBhdGhBbmxTdGF0cyAqKikgcHYyKSktPnBhdGhz dHIpOworfQorCisvKgorICoganNvbkFuYWx5emVTb3J0UGF0aHMKKyAqCQlSZWFkcyBhbGwg c3RhdHMgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIGFuZCBzb3J0cyB0aGVtLgorICovCitz dGF0aWMgSnNvblBhdGhBbmxTdGF0cyAqKgoranNvbkFuYWx5emVTb3J0UGF0aHMoSnNvbkFu YWx5emVDb250ZXh0ICpjdHgsIGludCAqcF9ucGF0aHMpCit7CisJSEFTSF9TRVFfU1RBVFVT CWhzZXE7CisJSnNvblBhdGhBbmxTdGF0cyAqcGF0aDsKKwlKc29uUGF0aEFubFN0YXRzICoq cGF0aHM7CisJaW50CQkJbnBhdGhzOworCisJbnBhdGhzID0gaGFzaF9nZXRfbnVtX2VudHJp ZXMoY3R4LT5wYXRoc2hhc2gpICsgMTsKKwlwYXRocyA9IE1lbW9yeUNvbnRleHRBbGxvYyhj dHgtPm1jeHQsIHNpemVvZigqcGF0aHMpICogbnBhdGhzKTsKKworCXBhdGhzWzBdID0gY3R4 LT5yb290OworCisJaGFzaF9zZXFfaW5pdCgmaHNlcSwgY3R4LT5wYXRoc2hhc2gpOworCisJ Zm9yIChpbnQgaSA9IDE7IChwYXRoID0gaGFzaF9zZXFfc2VhcmNoKCZoc2VxKSkgIT0gTlVM TDsgaSsrKQorCQlwYXRoc1tpXSA9IHBhdGg7CisKKwlwZ19xc29ydChwYXRocywgbnBhdGhz LCBzaXplb2YoKnBhdGhzKSwgSnNvblBhdGhTdGF0c0NvbXBhcmUpOworCisJKnBfbnBhdGhz ID0gbnBhdGhzOworCXJldHVybiBwYXRoczsKK30KKworLyoKKyAqIGpzb25BbmFseXplQnVp bGRQYXRoU3RhdHNBcnJheQorICoJCUJ1aWxkIGpzb25iIGRhdHVtIGFycmF5IGZvciBwYXRo IHN0YXRzLCB0aGF0IHdpbGwgYmUgdXNlZCBhcyBzdGF2YWx1ZXMuCisgKgorICogVGhlIGZp cnN0IGVsZW1lbnQgaXMgYSBwYXRoIHByZWZpeC4KKyAqLworc3RhdGljIERhdHVtICoKK2pz b25BbmFseXplQnVpbGRQYXRoU3RhdHNBcnJheShKc29uUGF0aEFubFN0YXRzICoqcGF0aHMs IGludCBucGF0aHMsIGludCAqbnZhbHMsCisJCQkJCQkJICAgY29uc3QgY2hhciAqcHJlZml4 LCBpbnQgcHJlZml4bGVuKQoreworCURhdHVtCSAgICp2YWx1ZXMgPSBwYWxsb2Moc2l6ZW9m KERhdHVtKSAqIChucGF0aHMgKyAxKSk7CisJSnNvbmJWYWx1ZSAqamJ2cHJlZml4ID0gcGFs bG9jKHNpemVvZihKc29uYlZhbHVlKSk7CisJaW50CQkJaTsKKworCUpzb25WYWx1ZUluaXRT dHJpbmdXaXRoTGVuKGpidnByZWZpeCwKKwkJCQkJCQkgICBtZW1jcHkocGFsbG9jKHByZWZp eGxlbiksIHByZWZpeCwgcHJlZml4bGVuKSwKKwkJCQkJCQkgICBwcmVmaXhsZW4pOworCisJ dmFsdWVzWzBdID0gSnNvbmJQR2V0RGF0dW0oSnNvbmJWYWx1ZVRvSnNvbmIoamJ2cHJlZml4 KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhdGhzOyBpKyspCisJCXZhbHVlc1tpICsgMV0g PSBKc29uYlBHZXREYXR1bShwYXRoc1tpXS0+c3RhdHMpOworCisJKm52YWxzID0gbnBhdGhz ICsgMTsKKworCXJldHVybiB2YWx1ZXM7Cit9CisKKy8qCisgKiBqc29uQW5hbHl6ZU1ha2VT dGF0cworICoJCUJ1aWxkIHN0YXZhbHVlcyBqc29uYiBhcnJheSBmb3IgdGhlIHJvb3QgcGF0 aCBwcmVmaXguCisgKi8KK3N0YXRpYyBEYXR1bSAqCitqc29uQW5hbHl6ZU1ha2VTdGF0cyhK c29uQW5hbHl6ZUNvbnRleHQgKmN0eCwgSnNvblBhdGhBbmxTdGF0cyAqKnBhdGhzLAorCQkJ CQkgaW50IG5wYXRocywgaW50ICpudW12YWx1ZXMpCit7CisJRGF0dW0JICAgKnZhbHVlczsK KwlNZW1vcnlDb250ZXh0IG9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjdHgtPnN0 YXRzLT5hbmxfY29udGV4dCk7CisKKwl2YWx1ZXMgPSBqc29uQW5hbHl6ZUJ1aWxkUGF0aFN0 YXRzQXJyYXkocGF0aHMsIG5wYXRocywgbnVtdmFsdWVzLAorCQkJCQkJCQkJCQlKU09OX1BB VEhfUk9PVCwgSlNPTl9QQVRIX1JPT1RfTEVOKTsKKworCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjeHQpOworCisJcmV0dXJuIHZhbHVlczsKK30KKworLyoKKyAqIGpzb25BbmFseXpl QnVpbGRTdWJQYXRoc0RhdGEKKyAqCQlCdWlsZCBzdGF0dmFsdWVzIGFuZCBzdGFudW1iZXJz IGFycmF5cyBmb3IgdGhlIHN1YnNldCBvZiBwYXRocyBzdGFydGluZworICoJCWZyb20gYSBn aXZlbiBwcmVmaXguCisgKgorICogcGF0aHNEYXR1bXNbaW5kZXhdIHNob3VsZCBwb2ludCB0 byB0aGUgZGVzaXJlZCBwYXRoLgorICovCitib29sCitqc29uQW5hbHl6ZUJ1aWxkU3ViUGF0 aHNEYXRhKERhdHVtICpwYXRoc0RhdHVtcywgaW50IG5wYXRocywgaW50IGluZGV4LAorCQkJ CQkJCSBjb25zdCBjaGFyCSpwYXRoLCBpbnQgcGF0aGxlbiwKKwkJCQkJCQkgYm9vbCBpbmNs dWRlU3VicGF0aHMsIGZsb2F0NCBudWxsZnJhYywKKwkJCQkJCQkgRGF0dW0gKnB2YWxzLCBE YXR1bSAqcG51bXMpCit7CisJSnNvblBhdGhBbmxTdGF0cyAgKipwdmFsdWVzID0gcGFsbG9j KHNpemVvZigqcHZhbHVlcykgKiBucGF0aHMpOworCURhdHVtCSAgICp2YWx1ZXM7CisJRGF0 dW0JCW51bWJlcnNbMV07CisJSnNvbmJWYWx1ZQlwYXRoa2V5OworCWludAkJCW5zdWJwYXRo cyA9IDA7CisJaW50CQkJbnZhbHVlczsKKwlpbnQJCQlpOworCisJSnNvblZhbHVlSW5pdFN0 cmluZ1dpdGhMZW4oJnBhdGhrZXksICJwYXRoIiwgNCk7CisKKwlmb3IgKGkgPSBpbmRleDsg aSA8IG5wYXRoczsgaSsrKQorCXsKKwkJLyogRXh0cmFjdCBwYXRoIG5hbWUgKi8KKwkJSnNv bmIJICAgKmpiID0gRGF0dW1HZXRKc29uYlAocGF0aHNEYXR1bXNbaV0pOworCQlKc29uYlZh bHVlICpqYnYgPSBmaW5kSnNvbmJWYWx1ZUZyb21Db250YWluZXIoJmpiLT5yb290LCBKQl9G T0JKRUNULAorCQkJCQkJCQkJCQkJCSAgJnBhdGhrZXkpOworCisJCS8qIENoZWNrIGlmIHBh dGggbmFtZSBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeCAqLworCQlpZiAoIWpidiB8fCBq YnYtPnR5cGUgIT0gamJ2U3RyaW5nIHx8CisJCQlqYnYtPnZhbC5zdHJpbmcubGVuIDwgcGF0 aGxlbiB8fAorCQkJbWVtY21wKGpidi0+dmFsLnN0cmluZy52YWwsIHBhdGgsIHBhdGhsZW4p KQorCQkJYnJlYWs7CisKKwkJcGZyZWUoamJ2KTsKKworCQkvKiBDb2xsZWN0IG1hdGNoaW5n IHBhdGggKi8KKwkJcHZhbHVlc1tuc3VicGF0aHNdID0gcGFsbG9jKHNpemVvZigqKnB2YWx1 ZXMpKTsKKwkJcHZhbHVlc1tuc3VicGF0aHNdLT5zdGF0cyA9IGpiOworCisJCW5zdWJwYXRo cysrOworCisJCS8qCisJCSAqIFRoZSBwYXRoIHNob3VsZCBnbyBiZWZvcmUgaXRzIHN1YnBh dGhzLCBzbyBpZiBzdWJwYXRocyBhcmUgbm90CisJCSAqIG5lZWRlZCB0aGUgbG9vcCBpcyBi cm9rZW4gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoaW5nIHBhdGguCisJCSAqLworCQlpZiAoIWlu Y2x1ZGVTdWJwYXRocykKKwkJCWJyZWFrOworCX0KKworCWlmICghbnN1YnBhdGhzKQorCXsK KwkJcGZyZWUocHZhbHVlcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBDb25zdHJ1 Y3QgbmV3IGFycmF5IGZyb20gdGhlIHNlbGVjdGVkIHBhdGhzICovCisJdmFsdWVzID0ganNv bkFuYWx5emVCdWlsZFBhdGhTdGF0c0FycmF5KHB2YWx1ZXMsIG5zdWJwYXRocywgJm52YWx1 ZXMsCisJCQkJCQkJCQkJCXBhdGgsIHBhdGhsZW4pOworCSpwdmFscyA9IFBvaW50ZXJHZXRE YXR1bShjb25zdHJ1Y3RfYXJyYXkodmFsdWVzLCBudmFsdWVzLCBKU09OQk9JRCwgLTEsCisJ CQkJCQkJCQkJCSBmYWxzZSwgJ2knKSk7CisKKwlwZnJlZShwdmFsdWVzKTsKKwlwZnJlZSh2 YWx1ZXMpOworCisJbnVtYmVyc1swXSA9IEZsb2F0NEdldERhdHVtKG51bGxmcmFjKTsKKwkq cG51bXMgPSBQb2ludGVyR2V0RGF0dW0oY29uc3RydWN0X2FycmF5KG51bWJlcnMsIDEsIEZM T0FUNE9JRCwgNCwKKwkJCQkJCQkJCQkJIHRydWUgLypGTE9BVDRQQVNTQllWQUwqLywgJ2kn KSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGpzb25BbmFseXplSW5pdAorICoJ CUluaXRpYWxpemUgdGhlIGFuYWx5emUgY29udGV4dCBzbyB0aGF0IHdlIGNhbiBzdGFydCBh ZGRpbmcgcGF0aHMuCisgKi8KK3N0YXRpYyB2b2lkCitqc29uQW5hbHl6ZUluaXQoSnNvbkFu YWx5emVDb250ZXh0ICpjdHgsIFZhY0F0dHJTdGF0cyAqc3RhdHMsCisJCQkJQW5hbHl6ZUF0 dHJGZXRjaEZ1bmMgZmV0Y2hmdW5jLAorCQkJCWludCBzYW1wbGVyb3dzLCBkb3VibGUgdG90 YWxyb3dzKQoreworCUhBU0hDVEwJaGFzaF9jdGw7CisKKwltZW1zZXQoY3R4LCAwLCBzaXpl b2YoKmN0eCkpOworCisJY3R4LT5zdGF0cyA9IHN0YXRzOworCWN0eC0+ZmV0Y2hmdW5jID0g ZmV0Y2hmdW5jOworCWN0eC0+bWN4dCA9IEN1cnJlbnRNZW1vcnlDb250ZXh0OworCWN0eC0+ c2FtcGxlcm93cyA9IHNhbXBsZXJvd3M7CisJY3R4LT50b3RhbHJvd3MgPSB0b3RhbHJvd3M7 CisJY3R4LT50YXJnZXQgPSBzdGF0cy0+YXR0ci0+YXR0c3RhdHRhcmdldDsKKwljdHgtPnNj YWxhcnNPbmx5ID0gZmFsc2U7CisKKwlNZW1TZXQoJmhhc2hfY3RsLCAwLCBzaXplb2YoaGFz aF9jdGwpKTsKKwloYXNoX2N0bC5rZXlzaXplID0gc2l6ZW9mKEpzb25QYXRoRW50cnkpOwor CWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihKc29uUGF0aEFubFN0YXRzKTsKKwloYXNo X2N0bC5oYXNoID0gSnNvblBhdGhFbnRyeUhhc2g7CisJaGFzaF9jdGwubWF0Y2ggPSBKc29u UGF0aEVudHJ5TWF0Y2g7CisJaGFzaF9jdGwuaGN4dCA9IGN0eC0+bWN4dDsKKworCWN0eC0+ cGF0aHNoYXNoID0gaGFzaF9jcmVhdGUoIkpTT04gYW5hbHl6ZSBwYXRoIHRhYmxlIiwgMTAw LCAmaGFzaF9jdGwsCisJCQkJCUhBU0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX0NP TVBBUkUgfCBIQVNIX0NPTlRFWFQpOworCisJY3R4LT5yb290ID0gTWVtb3J5Q29udGV4dEFs bG9jWmVybyhjdHgtPm1jeHQsIHNpemVvZihKc29uUGF0aEFubFN0YXRzKSk7CisJY3R4LT5y b290LT5wYXRoc3RyID0gSlNPTl9QQVRIX1JPT1Q7Cit9CisKKy8qCisgKiBqc29uQW5hbHl6 ZVBhc3MKKyAqCQlPbmUgYW5hbHlzaXMgcGFzcyBvdmVyIHRoZSBKU09OIGNvbHVtbi4KKyAq CisgKiBQZXJmb3JtcyBvbmUgYW5hbHlzaXMgcGFzcyBvbiB0aGUgSlNPTiBkb2N1bWVudHMs IGFuZCBwYXNzZXMgdGhlbSB0byB0aGUKKyAqIGN1c3RvbSBhbmFseXplZnVuYy4KKyAqLwor c3RhdGljIHZvaWQKK2pzb25BbmFseXplUGFzcyhKc29uQW5hbHl6ZUNvbnRleHQgKmN0eCwK KwkJCQl2b2lkICgqYW5hbHl6ZWZ1bmMpKEpzb25BbmFseXplQ29udGV4dCAqLCBKc29uYiAq LCB2b2lkICopLAorCQkJCXZvaWQgKmFuYWx5emVhcmcpCit7CisJaW50CXJvd19udW07CisK KwlNZW1vcnlDb250ZXh0CXRtcGN4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJyZW50 TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkJCSJKc29uIEFuYWx5emUgUGFzcyBDb250ZXh0 IiwKKwkJCQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfTUlOU0laRSwKKwkJCQkJCQkJCQkJ CUFMTE9DU0VUX0RFRkFVTFRfSU5JVFNJWkUsCisJCQkJCQkJCQkJCQlBTExPQ1NFVF9ERUZB VUxUX01BWFNJWkUpOworCisJTWVtb3J5Q29udGV4dAlvbGRjeHQgPSBNZW1vcnlDb250ZXh0 U3dpdGNoVG8odG1wY3h0KTsKKworCWN0eC0+bnVsbF9jbnQgPSAwOworCWN0eC0+YW5hbHl6 ZWRfY250ID0gMDsKKwljdHgtPnRvdGFsX3dpZHRoID0gMDsKKworCS8qIExvb3Agb3ZlciB0 aGUgYXJyYXlzLiAqLworCWZvciAocm93X251bSA9IDA7IHJvd19udW0gPCBjdHgtPnNhbXBs ZXJvd3M7IHJvd19udW0rKykKKwl7CisJCURhdHVtCQl2YWx1ZTsKKwkJSnNvbmIJICAgKmpi OworCQlTaXplCQl3aWR0aDsKKwkJYm9vbAkJaXNudWxsOworCisJCXZhY3V1bV9kZWxheV9w b2ludCgpOworCisJCXZhbHVlID0gY3R4LT5mZXRjaGZ1bmMoY3R4LT5zdGF0cywgcm93X251 bSwgJmlzbnVsbCk7CisKKwkJaWYgKGlzbnVsbCkKKwkJeworCQkJLyoganNvbiBpcyBudWxs LCBqdXN0IGNvdW50IHRoYXQgKi8KKwkJCWN0eC0+bnVsbF9jbnQrKzsKKwkJCWNvbnRpbnVl OworCQl9CisKKwkJd2lkdGggPSB0b2FzdF9yYXdfZGF0dW1fc2l6ZSh2YWx1ZSk7CisKKwkJ Y3R4LT50b3RhbF93aWR0aCArPSBWQVJTSVpFX0FOWShEYXR1bUdldFBvaW50ZXIodmFsdWUp KTsgLyogRklYTUUgcmF3IHdpZHRoPyAqLworCisJCS8qIFNraXAgdG9vLWxhcmdlIHZhbHVl cy4gKi8KKyNkZWZpbmUgSlNPTl9XSURUSF9USFJFU0hPTEQgKDEwMCAqIDEwMjQpCisKKwkJ aWYgKHdpZHRoID4gSlNPTl9XSURUSF9USFJFU0hPTEQpCisJCQljb250aW51ZTsKKworCQlj dHgtPmFuYWx5emVkX2NudCsrOworCisJCWpiID0gRGF0dW1HZXRKc29uYlAodmFsdWUpOwor CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOworCisJCWFuYWx5emVmdW5jKGN0 eCwgamIsIGFuYWx5emVhcmcpOworCisJCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hU byh0bXBjeHQpOworCQlNZW1vcnlDb250ZXh0UmVzZXQodG1wY3h0KTsKKwl9CisKKwlNZW1v cnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKK30KKworLyoKKyAqIGNvbXB1dGVfanNvbl9z dGF0cygpIC0tIGNvbXB1dGUgc3RhdGlzdGljcyBmb3IgYSBqc29uIGNvbHVtbgorICovCitz dGF0aWMgdm9pZAorY29tcHV0ZV9qc29uX3N0YXRzKFZhY0F0dHJTdGF0cyAqc3RhdHMsIEFu YWx5emVBdHRyRmV0Y2hGdW5jIGZldGNoZnVuYywKKwkJCQkgICBpbnQgc2FtcGxlcm93cywg ZG91YmxlIHRvdGFscm93cykKK3sKKwlKc29uQW5hbHl6ZUNvbnRleHQJY3R4OworCUpzb25Q YXRoQW5sU3RhdHMgKipwYXRoczsKKwlpbnQJCQlucGF0aHM7CisJYm9vbAkJc2lnbGVfcGFz cyA9IGZhbHNlOwkvKiBGSVhNRSBtYWtlIEdVQyBvciBzaW1wbHkgcmVtb3ZlICovCisKKwlq c29uQW5hbHl6ZUluaXQoJmN0eCwgc3RhdHMsIGZldGNoZnVuYywgc2FtcGxlcm93cywgdG90 YWxyb3dzKTsKKworCS8qCisJICogQ29sbGVjdCBhbmQgYW5hbHl6ZSBKU09OIHBhdGggdmFs dWVzIGluIHNpbmdsZSBvciBtdWx0aXBsZSBwYXNzZXMuCisJICogU2lnbGUtcGFzcyBjb2xs ZWN0aW9uIGlzIGZhc3RlciBidXQgY29uc3VtZXMgbXVjaCBtb3JlIG1lbW9yeSB0aGFuCisJ ICogY29sbGVjdGluZyBhbmQgYW5hbHl6aW5nIGJ5IHRoZSBvbmUgcGF0aCBhdCBwYXNzLgor CSAqLworCWlmIChzaWdsZV9wYXNzKQorCXsKKwkJLyogQ29sbGVjdCBhbGwgdmFsdWVzIG9m IGFsbCBwYXRocyAqLworCQlqc29uQW5hbHl6ZVBhc3MoJmN0eCwganNvbkFuYWx5emVDb2xs ZWN0UGF0aHMsICh2b2lkICopKGludHB0cl90KSB0cnVlKTsKKworCQkvKgorCQkgKiBOb3cg dGhhdCB3ZSdyZSBkb25lIHdpdGggcHJvY2Vzc2luZyB0aGUgZG9jdW1lbnRzLCB3ZSBzb3J0 IHRoZSBwYXRocworCQkgKiB3ZSBleHRyYWN0ZWQgYW5kIGNhbGN1bGF0ZSBzdGF0cyBmb3Ig ZWFjaCBvZiB0aGVtLgorCQkgKgorCQkgKiBYWFggSSB3b25kZXIgaWYgd2UgY291bGQgZG8g dGhpcyBpbiB0d28gcGhhc2VzLCB0byBtYXliZSBub3QgY29sbGVjdAorCQkgKiAob3IgZXZl biBhY2N1bXVsYXRlKSB2YWx1ZXMgZm9yIHBhdGhzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGlu Zy4KKwkJICovCisJCXBhdGhzID0ganNvbkFuYWx5emVTb3J0UGF0aHMoJmN0eCwgJm5wYXRo cyk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBucGF0aHM7IGkrKykKKwkJCWpzb25BbmFs eXplUGF0aCgmY3R4LCBwYXRoc1tpXSk7CisJfQorCWVsc2UKKwl7CisJCU1lbW9yeUNvbnRl eHQJb2xkY3h0OworCQlNZW1vcnlDb250ZXh0CXRtcGN4dCA9IEFsbG9jU2V0Q29udGV4dENy ZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkJCQkiSnNvbiBBbmFseXpl IFRtcCBDb250ZXh0IiwKKwkJCQkJCQkJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX01JTlNJWkUs CisJCQkJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9JTklUU0laRSwKKwkJCQkJCQkJCQkJ CQlBTExPQ1NFVF9ERUZBVUxUX01BWFNJWkUpOworCisJCWVsb2coREVCVUcxLCAiYW5hbHl6 aW5nICVzIGF0dHJpYnV0ZSBcIiVzXCIiLAorCQkJc3RhdHMtPmF0dHJ0eXBpZCA9PSBKU09O Qk9JRCA/ICJqc29uYiIgOiAianNvbiIsCisJCQlOYW1lU3RyKHN0YXRzLT5hdHRyLT5hdHRu YW1lKSk7CisKKwkJZWxvZyhERUJVRzEsICJjb2xsZWN0aW5nIGpzb24gcGF0aHMiKTsKKwor CQlvbGRjeHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8odG1wY3h0KTsKKworCQkvKiBDb2xs ZWN0IGFsbCBwYXRocyBmaXJzdCB3aXRob3V0IGFjY3VtdWxhdGluZyBhbnkgVmFsdWVzLCBz b3J0IHRoZW0gKi8KKwkJanNvbkFuYWx5emVQYXNzKCZjdHgsIGpzb25BbmFseXplQ29sbGVj dFBhdGhzLCAodm9pZCAqKShpbnRwdHJfdCkgZmFsc2UpOworCQlwYXRocyA9IGpzb25BbmFs eXplU29ydFBhdGhzKCZjdHgsICZucGF0aHMpOworCisJCS8qCisJCSAqIE5leHQsIHByb2Nl c3MgZWFjaCBwYXRoIGluZGVwZW5kZW50bHkgdG8gc2F2ZSBtZW1vcnkgKHdlIGRvbid0IHdh bnQKKwkJICogdG8gYWNjdW11bGF0ZSBhbGwgdmFsdWVzIGZvciBhbGwgcGF0aHMsIHdpdGgg YSBsb3Qgb2YgZHVwbGljaXRpZXMpLgorCQkgKi8KKwkJTWVtb3J5Q29udGV4dFJlc2V0KHRt cGN4dCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBucGF0aHM7IGkrKykKKwkJeworCQkJ SnNvblBhdGhBbmxTdGF0cyAqcGF0aCA9IHBhdGhzW2ldOworCisJCQllbG9nKERFQlVHMSwg ImFuYWx5emluZyBqc29uIHBhdGggKCVkLyVkKSAlcyIsCisJCQkJIGkgKyAxLCBucGF0aHMs IHBhdGgtPnBhdGhzdHIpOworCisJCQlqc29uQW5hbHl6ZVBhc3MoJmN0eCwganNvbkFuYWx5 emVDb2xsZWN0UGF0aCwgcGF0aCk7CisJCQlqc29uQW5hbHl6ZVBhdGgoJmN0eCwgcGF0aCk7 CisKKwkJCU1lbW9yeUNvbnRleHRSZXNldCh0bXBjeHQpOworCQl9CisKKwkJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGN4dCk7CisKKwkJTWVtb3J5Q29udGV4dERlbGV0ZSh0bXBjeHQp OworCX0KKworCS8qIFdlIGNhbiBvbmx5IGNvbXB1dGUgcmVhbCBzdGF0cyBpZiB3ZSBmb3Vu ZCBzb21lIG5vbi1udWxsIHZhbHVlcy4gKi8KKwlpZiAoY3R4Lm51bGxfY250ID49IHNhbXBs ZXJvd3MpCisJeworCQkvKiBXZSBmb3VuZCBvbmx5IG51bGxzOyBhc3N1bWUgdGhlIGNvbHVt biBpcyBlbnRpcmVseSBudWxsICovCisJCXN0YXRzLT5zdGF0c192YWxpZCA9IHRydWU7CisJ CXN0YXRzLT5zdGFudWxsZnJhYyA9IDEuMDsKKwkJc3RhdHMtPnN0YXdpZHRoID0gMDsJCS8q ICJ1bmtub3duIiAqLworCQlzdGF0cy0+c3RhZGlzdGluY3QgPSAwLjA7CS8qICJ1bmtub3du IiAqLworCX0KKwllbHNlIGlmICghY3R4LmFuYWx5emVkX2NudCkKKwl7CisJCWludAlub25u dWxsX2NudCA9IHNhbXBsZXJvd3MgLSBjdHgubnVsbF9jbnQ7CisKKwkJLyogV2UgZm91bmQg c29tZSBub24tbnVsbCB2YWx1ZXMsIGJ1dCB0aGV5IHdlcmUgYWxsIHRvbyB3aWRlICovCisJ CXN0YXRzLT5zdGF0c192YWxpZCA9IHRydWU7CisJCS8qIERvIHRoZSBzaW1wbGUgbnVsbC1m cmFjIGFuZCB3aWR0aCBzdGF0cyAqLworCQlzdGF0cy0+c3RhbnVsbGZyYWMgPSAoZG91Ymxl KSBjdHgubnVsbF9jbnQgLyAoZG91YmxlKSBzYW1wbGVyb3dzOworCQlzdGF0cy0+c3Rhd2lk dGggPSBjdHgudG90YWxfd2lkdGggLyAoZG91YmxlKSBub25udWxsX2NudDsKKwkJLyogQXNz dW1lIGFsbCB0b28td2lkZSB2YWx1ZXMgYXJlIGRpc3RpbmN0LCBzbyBpdCdzIGEgdW5pcXVl IGNvbHVtbiAqLworCQlzdGF0cy0+c3RhZGlzdGluY3QgPSAtMS4wICogKDEuMCAtIHN0YXRz LT5zdGFudWxsZnJhYyk7CisJfQorCWVsc2UKKwl7CisJCVZhY0F0dHJTdGF0cyAgICpqc3N0 YXRzID0gJmN0eC5yb290LT52c3RhdHMuanNvbnMuc3RhdHM7CisJCWludAkJCQlpOworCQlp bnQJCQkJZW1wdHlfc2xvdCA9IC0xOworCisJCXN0YXRzLT5zdGF0c192YWxpZCA9IHRydWU7 CisKKwkJc3RhdHMtPnN0YW51bGxmcmFjCT0ganNzdGF0cy0+c3RhbnVsbGZyYWM7CisJCXN0 YXRzLT5zdGF3aWR0aAkJPSBqc3N0YXRzLT5zdGF3aWR0aDsKKwkJc3RhdHMtPnN0YWRpc3Rp bmN0CT0ganNzdGF0cy0+c3RhZGlzdGluY3Q7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBz dG9yZSB0aGUgc3RhdGlzdGljcyB0aGUgc3RhdGlzdGljcyBzbG90cy4gV2Ugc2ltcGx5CisJ CSAqIHN0b3JlIHRoZSByZWd1bGFyIHN0YXRzIGluIHRoZSBmaXJzdCBzbG90cywgYW5kIHRo ZW4gd2UgcHV0IHRoZQorCQkgKiBKU09OIHN0YXRzIGludG8gdGhlIGZpcnN0IGVtcHR5IHNs b3QuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU1RBVElTVElDX05VTV9TTE9UUzsgaSsr KQorCQl7CisJCQkvKiBvbmNlIHdlIGhpdCBhbiBlbXB0eSBzbG90LCB3ZSdyZSBkb25lICov CisJCQlpZiAoIWpzc3RhdHMtPnN0YW9wW2ldKQorCQkJeworCQkJCWVtcHR5X3Nsb3QgPSBp OwkJLyogcmVtZW1iZXIgdGhlIGVtcHR5IHNsb3QgKi8KKwkJCQlicmVhazsKKwkJCX0KKwor CQkJc3RhdHMtPnN0YWtpbmRbaV0gCQk9IGpzc3RhdHMtPnN0YWtpbmRbaV07CisJCQlzdGF0 cy0+c3Rhb3BbaV0gCQk9IGpzc3RhdHMtPnN0YW9wW2ldOworCQkJc3RhdHMtPnN0YW51bWJl cnNbaV0gCT0ganNzdGF0cy0+c3RhbnVtYmVyc1tpXTsKKwkJCXN0YXRzLT5zdGF2YWx1ZXNb aV0gCT0ganNzdGF0cy0+c3RhdmFsdWVzW2ldOworCQkJc3RhdHMtPnN0YXR5cGlkW2ldIAkJ PSBqc3N0YXRzLT5zdGF0eXBpZFtpXTsKKwkJCXN0YXRzLT5zdGF0eXBsZW5baV0gCT0ganNz dGF0cy0+c3RhdHlwbGVuW2ldOworCQkJc3RhdHMtPnN0YXR5cGJ5dmFsW2ldIAk9IGpzc3Rh dHMtPnN0YXR5cGJ5dmFsW2ldOworCQkJc3RhdHMtPnN0YXR5cGFsaWduW2ldIAk9IGpzc3Rh dHMtPnN0YXR5cGFsaWduW2ldOworCQkJc3RhdHMtPm51bW51bWJlcnNbaV0gCT0ganNzdGF0 cy0+bnVtbnVtYmVyc1tpXTsKKwkJCXN0YXRzLT5udW12YWx1ZXNbaV0gCT0ganNzdGF0cy0+ bnVtdmFsdWVzW2ldOworCQl9CisKKwkJQXNzZXJ0KChlbXB0eV9zbG90ID49IDApICYmIChl bXB0eV9zbG90IDwgU1RBVElTVElDX05VTV9TTE9UUykpOworCisJCXN0YXRzLT5zdGFraW5k W2VtcHR5X3Nsb3RdID0gU1RBVElTVElDX0tJTkRfSlNPTjsKKwkJc3RhdHMtPnN0YW9wW2Vt cHR5X3Nsb3RdID0gSW52YWxpZE9pZDsKKwkJc3RhdHMtPm51bW51bWJlcnNbZW1wdHlfc2xv dF0gPSAxOworCQlzdGF0cy0+c3RhbnVtYmVyc1tlbXB0eV9zbG90XSA9IE1lbW9yeUNvbnRl eHRBbGxvYyhzdGF0cy0+YW5sX2NvbnRleHQsCisJCQkJCQkJCQkJCQkJCSAgIHNpemVvZihm bG9hdDQpKTsKKwkJc3RhdHMtPnN0YW51bWJlcnNbZW1wdHlfc2xvdF1bMF0gPSAwLjA7IC8q IG51bGxmcmFjICovCisJCXN0YXRzLT5zdGF2YWx1ZXNbZW1wdHlfc2xvdF0gPQorCQkJanNv bkFuYWx5emVNYWtlU3RhdHMoJmN0eCwgcGF0aHMsIG5wYXRocywKKwkJCQkJCQkJICZzdGF0 cy0+bnVtdmFsdWVzW2VtcHR5X3Nsb3RdKTsKKworCQkvKiBXZSBhcmUgc3RvcmluZyBqc29u YiB2YWx1ZXMgKi8KKwkJc3RhdHMtPnN0YXR5cGlkW2VtcHR5X3Nsb3RdID0gSlNPTkJPSUQ7 CisJCWdldF90eXBsZW5ieXZhbGFsaWduKHN0YXRzLT5zdGF0eXBpZFtlbXB0eV9zbG90XSwK KwkJCQkJCQkgJnN0YXRzLT5zdGF0eXBsZW5bZW1wdHlfc2xvdF0sCisJCQkJCQkJICZzdGF0 cy0+c3RhdHlwYnl2YWxbZW1wdHlfc2xvdF0sCisJCQkJCQkJICZzdGF0cy0+c3RhdHlwYWxp Z25bZW1wdHlfc2xvdF0pOworCX0KK30KKworLyoKKyAqIGpzb25fdHlwYW5hbHl6ZSAtLSB0 eXBhbmFseXplIGZ1bmN0aW9uIGZvciBqc29uYgorICovCitEYXR1bQoranNvbmJfdHlwYW5h bHl6ZShQR19GVU5DVElPTl9BUkdTKQoreworCVZhY0F0dHJTdGF0cyAqc3RhdHMgPSAoVmFj QXR0clN0YXRzICopIFBHX0dFVEFSR19QT0lOVEVSKDApOworCUZvcm1fcGdfYXR0cmlidXRl IGF0dHIgPSBzdGF0cy0+YXR0cjsKKworCS8qIElmIHRoZSBhdHRzdGF0dGFyZ2V0IGNvbHVt biBpcyBuZWdhdGl2ZSwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlICovCisJLyogTkI6IGl0IGlz IG9rYXkgdG8gc2NyaWJibGUgb24gc3RhdHMtPmF0dHIgc2luY2UgaXQncyBhIGNvcHkgKi8K KwlpZiAoYXR0ci0+YXR0c3RhdHRhcmdldCA8IDApCisJCWF0dHItPmF0dHN0YXR0YXJnZXQg PSBkZWZhdWx0X3N0YXRpc3RpY3NfdGFyZ2V0OworCisJc3RhdHMtPmNvbXB1dGVfc3RhdHMg PSBjb21wdXRlX2pzb25fc3RhdHM7CisJLyogc2VlIGNvbW1lbnQgYWJvdXQgdGhlIGNob2lj ZSBvZiBtaW5yb3dzIGluIGNvbW1hbmRzL2FuYWx5emUuYyAqLworCXN0YXRzLT5taW5yb3dz ID0gMzAwICogYXR0ci0+YXR0c3RhdHRhcmdldDsKKworCVBHX1JFVFVSTl9CT09MKHRydWUp OworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2V4ZWMu YyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMKaW5kZXggZWZmMzcz NGI2YWIuLjk0YWU2ZTFmMzg1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQv anNvbnBhdGhfZXhlYy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9l eGVjLmMKQEAgLTE3MjMsNyArMTcyMyw3IEBAIGV4ZWN1dGVMaWtlUmVnZXgoSnNvblBhdGhJ dGVtICpqc3AsIEpzb25iVmFsdWUgKnN0ciwgSnNvbmJWYWx1ZSAqcmFyZywKIAkJY3h0LT5j ZmxhZ3MgPSBqc3BDb252ZXJ0UmVnZXhGbGFncyhqc3AtPmNvbnRlbnQubGlrZV9yZWdleC5m bGFncyk7CiAJfQogCi0JaWYgKFJFX2NvbXBpbGVfYW5kX2V4ZWN1dGUoY3h0LT5yZWdleCwg c3RyLT52YWwuc3RyaW5nLnZhbCwKKwlpZiAoUkVfY29tcGlsZV9hbmRfZXhlY3V0ZShjeHQt PnJlZ2V4LCB1bmNvbnN0aWZ5KGNoYXIgKiwgc3RyLT52YWwuc3RyaW5nLnZhbCksCiAJCQkJ CQkJICAgc3RyLT52YWwuc3RyaW5nLmxlbiwKIAkJCQkJCQkgICBjeHQtPmNmbGFncywgREVG QVVMVF9DT0xMQVRJT05fT0lELCAwLCBOVUxMKSkKIAkJcmV0dXJuIGpwYlRydWU7CmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdCBiL3NyYy9pbmNs dWRlL2NhdGFsb2cvcGdfb3BlcmF0b3IuZGF0CmluZGV4IDhlMGU2NWFkMjc1Li45ODA1YmIx NTAzOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQK KysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQKQEAgLTMxNzUsNyAr MzE3NSw3IEBACiB7IG9pZCA9PiAnMzIxMScsIG9pZF9zeW1ib2wgPT4gJ0pzb25iT2JqZWN0 RmllbGRPcGVyYXRvcicsCiAgIGRlc2NyID0+ICdnZXQganNvbmIgb2JqZWN0IGZpZWxkJywK ICAgb3BybmFtZSA9PiAnLT4nLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ICd0 ZXh0Jywgb3BycmVzdWx0ID0+ICdqc29uYicsCi0gIG9wcmNvZGUgPT4gJ2pzb25iX29iamVj dF9maWVsZCcgfSwKKyAgb3ByY29kZSA9PiAnanNvbmJfb2JqZWN0X2ZpZWxkJywgb3Byc3Rh dCA9PiAnanNvbmJfc3RhdHMnIH0sCiB7IG9pZCA9PiAnMzQ3NycsIG9pZF9zeW1ib2wgPT4g J0pzb25iT2JqZWN0RmllbGRUZXh0T3BlcmF0b3InLAogICBkZXNjciA9PiAnZ2V0IGpzb25i IG9iamVjdCBmaWVsZCBhcyB0ZXh0JywKICAgb3BybmFtZSA9PiAnLT4+Jywgb3BybGVmdCA9 PiAnanNvbmInLCBvcHJyaWdodCA9PiAndGV4dCcsIG9wcnJlc3VsdCA9PiAndGV4dCcsCkBA IC0zMTgzLDcgKzMxODMsNyBAQAogeyBvaWQgPT4gJzMyMTInLCBvaWRfc3ltYm9sID0+ICdK c29uYkFycmF5RWxlbWVudE9wZXJhdG9yJywKICAgZGVzY3IgPT4gJ2dldCBqc29uYiBhcnJh eSBlbGVtZW50JywKICAgb3BybmFtZSA9PiAnLT4nLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9w cnJpZ2h0ID0+ICdpbnQ0Jywgb3BycmVzdWx0ID0+ICdqc29uYicsCi0gIG9wcmNvZGUgPT4g J2pzb25iX2FycmF5X2VsZW1lbnQnIH0sCisgIG9wcmNvZGUgPT4gJ2pzb25iX2FycmF5X2Vs ZW1lbnQnLCBvcHJzdGF0ID0+ICdqc29uYl9zdGF0cycgfSwKIHsgb2lkID0+ICczNDgxJywg b2lkX3N5bWJvbCA9PiAnSnNvbmJBcnJheUVsZW1lbnRUZXh0T3BlcmF0b3InLAogICBkZXNj ciA9PiAnZ2V0IGpzb25iIGFycmF5IGVsZW1lbnQgYXMgdGV4dCcsCiAgIG9wcm5hbWUgPT4g Jy0+PicsIG9wcmxlZnQgPT4gJ2pzb25iJywgb3BycmlnaHQgPT4gJ2ludDQnLCBvcHJyZXN1 bHQgPT4gJ3RleHQnLApAQCAtMzE5MSw3ICszMTkxLDggQEAKIHsgb2lkID0+ICczMjEzJywg b2lkX3N5bWJvbCA9PiAnSnNvbmJFeHRyYWN0UGF0aE9wZXJhdG9yJywKICAgZGVzY3IgPT4g J2dldCB2YWx1ZSBmcm9tIGpzb25iIHdpdGggcGF0aCBlbGVtZW50cycsCiAgIG9wcm5hbWUg PT4gJyM+Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9PiAnX3RleHQnLAotICBv cHJyZXN1bHQgPT4gJ2pzb25iJywgb3ByY29kZSA9PiAnanNvbmJfZXh0cmFjdF9wYXRoJyB9 LAorICBvcHJyZXN1bHQgPT4gJ2pzb25iJywgb3ByY29kZSA9PiAnanNvbmJfZXh0cmFjdF9w YXRoJywKKyAgb3Byc3RhdCA9PiAnanNvbmJfc3RhdHMnIH0sCiB7IG9pZCA9PiAnMzIwNics IG9pZF9zeW1ib2wgPT4gJ0pzb25iRXh0cmFjdFBhdGhUZXh0T3BlcmF0b3InLAogICBkZXNj ciA9PiAnZ2V0IHZhbHVlIGZyb20ganNvbmIgYXMgdGV4dCB3aXRoIHBhdGggZWxlbWVudHMn LAogICBvcHJuYW1lID0+ICcjPj4nLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ ICdfdGV4dCcsCkBAIC0zMjI5LDIzICszMjMwLDIzIEBACiB7IG9pZCA9PiAnMzI0NicsIG9p ZF9zeW1ib2wgPT4gJ0pzb25iQ29udGFpbnNPcGVyYXRvcicsIGRlc2NyID0+ICdjb250YWlu cycsCiAgIG9wcm5hbWUgPT4gJ0A+Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdodCA9 PiAnanNvbmInLCBvcHJyZXN1bHQgPT4gJ2Jvb2wnLAogICBvcHJjb20gPT4gJzxAKGpzb25i LGpzb25iKScsIG9wcmNvZGUgPT4gJ2pzb25iX2NvbnRhaW5zJywKLSAgb3BycmVzdCA9PiAn bWF0Y2hpbmdzZWwnLCBvcHJqb2luID0+ICdtYXRjaGluZ2pvaW5zZWwnIH0sCisgIG9wcnJl c3QgPT4gJ2pzb25iX3NlbCcsIG9wcmpvaW4gPT4gJ21hdGNoaW5nam9pbnNlbCcgfSwKIHsg b2lkID0+ICczMjQ3Jywgb2lkX3N5bWJvbCA9PiAnSnNvbmJFeGlzdHNPcGVyYXRvcicsIGRl c2NyID0+ICdrZXkgZXhpc3RzJywKICAgb3BybmFtZSA9PiAnPycsIG9wcmxlZnQgPT4gJ2pz b25iJywgb3BycmlnaHQgPT4gJ3RleHQnLCBvcHJyZXN1bHQgPT4gJ2Jvb2wnLAotICBvcHJj b2RlID0+ICdqc29uYl9leGlzdHMnLCBvcHJyZXN0ID0+ICdtYXRjaGluZ3NlbCcsCisgIG9w cmNvZGUgPT4gJ2pzb25iX2V4aXN0cycsIG9wcnJlc3QgPT4gJ2pzb25iX3NlbCcsCiAgIG9w cmpvaW4gPT4gJ21hdGNoaW5nam9pbnNlbCcgfSwKIHsgb2lkID0+ICczMjQ4Jywgb2lkX3N5 bWJvbCA9PiAnSnNvbmJFeGlzdHNBbnlPcGVyYXRvcicsIGRlc2NyID0+ICdhbnkga2V5IGV4 aXN0cycsCiAgIG9wcm5hbWUgPT4gJz98Jywgb3BybGVmdCA9PiAnanNvbmInLCBvcHJyaWdo dCA9PiAnX3RleHQnLCBvcHJyZXN1bHQgPT4gJ2Jvb2wnLAotICBvcHJjb2RlID0+ICdqc29u Yl9leGlzdHNfYW55Jywgb3BycmVzdCA9PiAnbWF0Y2hpbmdzZWwnLAorICBvcHJjb2RlID0+ ICdqc29uYl9leGlzdHNfYW55Jywgb3BycmVzdCA9PiAnanNvbmJfc2VsJywKICAgb3Byam9p biA9PiAnbWF0Y2hpbmdqb2luc2VsJyB9LAogeyBvaWQgPT4gJzMyNDknLCBvaWRfc3ltYm9s ID0+ICdKc29uYkV4aXN0c0FsbE9wZXJhdG9yJywgZGVzY3IgPT4gJ2FsbCBrZXlzIGV4aXN0 JywKICAgb3BybmFtZSA9PiAnPyYnLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ ICdfdGV4dCcsIG9wcnJlc3VsdCA9PiAnYm9vbCcsCi0gIG9wcmNvZGUgPT4gJ2pzb25iX2V4 aXN0c19hbGwnLCBvcHJyZXN0ID0+ICdtYXRjaGluZ3NlbCcsCisgIG9wcmNvZGUgPT4gJ2pz b25iX2V4aXN0c19hbGwnLCBvcHJyZXN0ID0+ICdqc29uYl9zZWwnLAogICBvcHJqb2luID0+ ICdtYXRjaGluZ2pvaW5zZWwnIH0sCiB7IG9pZCA9PiAnMzI1MCcsIG9pZF9zeW1ib2wgPT4g J0pzb25iQ29udGFpbmVkT3BlcmF0b3InLCBkZXNjciA9PiAnaXMgY29udGFpbmVkIGJ5JywK ICAgb3BybmFtZSA9PiAnPEAnLCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ICdq c29uYicsIG9wcnJlc3VsdCA9PiAnYm9vbCcsCiAgIG9wcmNvbSA9PiAnQD4oanNvbmIsanNv bmIpJywgb3ByY29kZSA9PiAnanNvbmJfY29udGFpbmVkJywKLSAgb3BycmVzdCA9PiAnbWF0 Y2hpbmdzZWwnLCBvcHJqb2luID0+ICdtYXRjaGluZ2pvaW5zZWwnIH0sCisgIG9wcnJlc3Qg PT4gJ2pzb25iX3NlbCcsIG9wcmpvaW4gPT4gJ21hdGNoaW5nam9pbnNlbCcgfSwKIHsgb2lk ID0+ICczMjg0JywgZGVzY3IgPT4gJ2NvbmNhdGVuYXRlJywKICAgb3BybmFtZSA9PiAnfHwn LCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ICdqc29uYicsCiAgIG9wcnJlc3Vs dCA9PiAnanNvbmInLCBvcHJjb2RlID0+ICdqc29uYl9jb25jYXQnIH0sCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdAppbmRleCAwODU5ZGM4MWNhYy4uMmRjM2YxMzRlYTUgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTE3MzEsNCArMTE3MzEsMTUgQEAKICAgcHJvcmV0 dHlwZSA9PiAnYnl0ZWEnLCBwcm9hcmd0eXBlcyA9PiAncGdfYnJpbl9taW5tYXhfbXVsdGlf c3VtbWFyeScsCiAgIHByb3NyYyA9PiAnYnJpbl9taW5tYXhfbXVsdGlfc3VtbWFyeV9zZW5k JyB9LAogCisjIGpzb25iIHN0YXRpc3RpY3MKK3sgb2lkID0+ICc4NTI2JywgZGVzY3IgPT4g J2pzb25iIHR5cGFuYWx5emUnLAorICBwcm9uYW1lID0+ICdqc29uYl90eXBhbmFseXplJywg cHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICdib29sJywKKyAgcHJvYXJndHlw ZXMgPT4gJ2ludGVybmFsJywgcHJvc3JjID0+ICdqc29uYl90eXBhbmFseXplJyB9LAoreyBv aWQgPT4gJzg1MjcnLCBkZXNjciA9PiAnanNvbmIgc2VsZWN0aXZpdHkgZXN0aW1hdGlvbics CisgIHByb25hbWUgPT4gJ2pzb25iX3NlbCcsIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcmV0 dHlwZSA9PiAnZmxvYXQ4JywKKyAgcHJvYXJndHlwZXMgPT4gJ2ludGVybmFsIG9pZCBpbnRl cm5hbCBpbnQ0JywgcHJvc3JjID0+ICdqc29uYl9zZWwnIH0sCit7IG9pZCA9PiAnODUyOCcs IGRlc2NyID0+ICdqc29uYiBzdGF0c2lzdGljcyBlc3RpbWF0aW9uJywKKyAgcHJvbmFtZSA9 PiAnanNvbmJfc3RhdHMnLCBwcm92b2xhdGlsZSA9PiAncycsIHByb3JldHR5cGUgPT4gJ3Zv aWQnLAorICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwgaW50ZXJuYWwgaW50NCBpbnRlcm5h bCcsIHByb3NyYyA9PiAnanNvbmJfc3RhdHMnIH0sCisKIF0KZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfc3RhdGlzdGljLmggYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3N0YXRpc3RpYy5oCmluZGV4IGNkZjc0NDgxMzk4Li5jNGY1M2ViZDFiYSAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19zdGF0aXN0aWMuaAorKysgYi9zcmMvaW5jbHVk ZS9jYXRhbG9nL3BnX3N0YXRpc3RpYy5oCkBAIC0yNzcsNiArMjc3LDggQEAgREVDTEFSRV9G T1JFSUdOX0tFWSgoc3RhcmVsaWQsIHN0YWF0dG51bSksIHBnX2F0dHJpYnV0ZSwgKGF0dHJl bGlkLCBhdHRudW0pKTsKICAqLwogI2RlZmluZSBTVEFUSVNUSUNfS0lORF9CT1VORFNfSElT VE9HUkFNICA3CiAKKyNkZWZpbmUgU1RBVElTVElDX0tJTkRfSlNPTiA4CisKICNlbmRpZgkJ CQkJCQkvKiBFWFBPU0VfVE9fQ0xJRU5UX0NPREUgKi8KIAogI2VuZGlmCQkJCQkJCS8qIFBH X1NUQVRJU1RJQ19IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3R5 cGUuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ190eXBlLmRhdAppbmRleCBkZjQ1ODc5 NDYzNS4uYjg2N2RiNDJmNDUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdf dHlwZS5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ190eXBlLmRhdApAQCAtNDQ1 LDcgKzQ0NSw3IEBACiAgIHR5cG5hbWUgPT4gJ2pzb25iJywgdHlwbGVuID0+ICctMScsIHR5 cGJ5dmFsID0+ICdmJywgdHlwY2F0ZWdvcnkgPT4gJ1UnLAogICB0eXBzdWJzY3JpcHQgPT4g J2pzb25iX3N1YnNjcmlwdF9oYW5kbGVyJywgdHlwaW5wdXQgPT4gJ2pzb25iX2luJywKICAg dHlwb3V0cHV0ID0+ICdqc29uYl9vdXQnLCB0eXByZWNlaXZlID0+ICdqc29uYl9yZWN2Jywg dHlwc2VuZCA9PiAnanNvbmJfc2VuZCcsCi0gIHR5cGFsaWduID0+ICdpJywgdHlwc3RvcmFn ZSA9PiAneCcgfSwKKyAgdHlwYW5hbHl6ZSA9PiAnanNvbmJfdHlwYW5hbHl6ZScsIHR5cGFs aWduID0+ICdpJywgdHlwc3RvcmFnZSA9PiAneCcgfSwKIHsgb2lkID0+ICc0MDcyJywgYXJy YXlfdHlwZV9vaWQgPT4gJzQwNzMnLCBkZXNjciA9PiAnSlNPTiBwYXRoJywKICAgdHlwbmFt ZSA9PiAnanNvbnBhdGgnLCB0eXBsZW4gPT4gJy0xJywgdHlwYnl2YWwgPT4gJ2YnLCB0eXBj YXRlZ29yeSA9PiAnVScsCiAgIHR5cGlucHV0ID0+ICdqc29ucGF0aF9pbicsIHR5cG91dHB1 dCA9PiAnanNvbnBhdGhfb3V0JywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL2pz b25fc2VsZnVuY3MuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL2pzb25fc2VsZnVuY3MuaApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWEzNjU2N2FlNjUKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9qc29uX3NlbGZ1bmNzLmgKQEAgLTAs MCArMSwxMTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGpzb25fc2VsZnVu Y3MuaAorICoJICBKU09OIGNvc3QgZXN0aW1hdGlvbiBmdW5jdGlvbnMuCisgKgorICoKKyAq IFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxNi0yMDIyLCBQb3N0Z3JlU1FMIEdsb2JhbCBE ZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKiAgICBzcmMvaW5j bHVkZS91dGlscy9qc29uX3NlbGZ1bmNzLmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqLworCisjaWZuZGVmIEpTT05fU0VMRlVOQ1NfSF8KKyNkZWZpbmUgSlNPTl9TRUxGVU5D U19IIDEKKworI2luY2x1ZGUgInBvc3RncmVzLmgiCisjaW5jbHVkZSAiYWNjZXNzL2h0dXAu aCIKKyNpbmNsdWRlICJ1dGlscy9qc29uYi5oIgorI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNo ZS5oIgorI2luY2x1ZGUgInV0aWxzL3NlbGZ1bmNzLmgiCisKKyNkZWZpbmUgSlNPTl9QQVRI X1JPT1QgIiQiCisjZGVmaW5lIEpTT05fUEFUSF9ST09UX0xFTiAxCisKKyNkZWZpbmUgSlNP Tl9QQVRIX1JPT1RfQVJSQVkgIiRbKl0iCisjZGVmaW5lIEpTT05fUEFUSF9ST09UX0FSUkFZ X0xFTiA0CisKK3R5cGVkZWYgZW51bQoreworCUpzb25QYXRoU3RhdHNWYWx1ZXMsCisJSnNv blBhdGhTdGF0c0FycmF5TGVuZ3RoLAorCUpzb25QYXRoU3RhdHNPYmplY3RMZW5ndGgKK30g SnNvblBhdGhTdGF0c1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IEpzb25TdGF0RGF0YSBKc29u U3RhdERhdGEsICpKc29uU3RhdHM7CisKKy8qIFBlci1wYXRoIEpTT04gc3RhdHMgKi8KK3R5 cGVkZWYgc3RydWN0IEpzb25QYXRoU3RhdHNEYXRhCit7CisJSnNvblN0YXRzCWRhdGE7CQkJ LyogcG9pbnRlciB0byBwZXItY29sdW1uIGNvbnRyb2wgc3RydWN0dXJlICovCisJRGF0dW0J ICAgKmRhdHVtOwkJCS8qIHBvaW50ZXIgdG8gSlNPTkIgZGF0dW0gd2l0aCBzdGF0cyBkYXRh ICovCisJY29uc3QgY2hhciAqcGF0aDsJCQkvKiBwYXRoIHN0cmluZywgcG9pbnRzIGRpcmVj dGx5IHRvIEpTT05CIGRhdGEgKi8KKwlpbnQJCQlwYXRobGVuOwkJLyogcGF0aCBsZW5ndGgg Ki8KKwlKc29uUGF0aFN0YXRzVHlwZSB0eXBlOwkJLyogdHlwZSBvZiBzdGF0cyAodmFsdWVz LCBsZW5ndGhzIGV0Yy4pICovCit9IEpzb25QYXRoU3RhdHNEYXRhLCAqSnNvblBhdGhTdGF0 czsKKworLyogUGVyLWNvbHVtbiBKU09OIHN0YXRzICovCitzdHJ1Y3QgSnNvblN0YXREYXRh Cit7CisJSGVhcFR1cGxlCXN0YXRzVHVwbGU7CQkvKiBvcmlnaW5hbCBwZ19zdGF0aXN0aWMg dHVwbGUgKi8KKwlBdHRTdGF0c1Nsb3QgYXR0c2xvdDsJCS8qIGRhdGEgZXh0cmFjdGVkIGZy b20gU1RBVElTVElDX0tJTkRfSlNPTgorCQkJCQkJCQkgKiBzbG90IG9mIHN0YXRzVHVwbGUg Ki8KKwlSZWxPcHRJbmZvICpyZWw7CQkJLyogUmVsYXRpb24sIG9yIE5VTEwgaWYgbm90IGlk ZW50aWZpYWJsZSAqLworCURhdHVtCSAgICpwYXRoZGF0dW1zOwkJLyogcGF0aCBKU09OQiBk YXR1bXMgKi8KKwlKc29uUGF0aFN0YXRzRGF0YSAqcGF0aHM7CS8qIGNhY2hlZCBwYXRocyAq LworCWludAkJCW5wYXRoczsJCQkvKiBudW1iZXIgb2YgcGF0aHMgKi8KKwlmbG9hdDQJCW51 bGxmcmFjOwkJLyogTlVMTCBmcmFjdGlvbiAqLworCWNvbnN0IGNoYXIgKnByZWZpeDsJCQkv KiBnbG9iYWwgcGF0aCBwcmVmaXggd2hpY2ggbmVlZHMgdG8gYmUgdXNlZAorCQkJCQkJCQkg KiBmb3Igc2VhcmNoaW5nIGluIHBhdGhkYXR1bXMgKi8KKwlpbnQJCQlwcmVmaXhsZW47CQkv KiBwYXRoIHByZWZpeCBsZW5ndGggKi8KKwlib29sCQlhY2xfb2s7CQkJLyogQUNMIGNoZWNr IGlzIE9rICovCit9OworCit0eXBlZGVmIGVudW0gSnNvblN0YXRUeXBlCit7CisJSnNvblN0 YXRKc29uYiwKKwlKc29uU3RhdEpzb25iV2l0aG91dFN1YnBhdGhzLAorCUpzb25TdGF0VGV4 dCwKKwlKc29uU3RhdEZsb2F0NCwKKwlKc29uU3RhdFN0cmluZywKKwlKc29uU3RhdE51bWVy aWMsCisJSnNvblN0YXRGcmVxLAorfSBKc29uU3RhdFR5cGU7CisKK2V4dGVybiBib29sIGpz b25TdGF0c0luaXQoSnNvblN0YXRzIHN0YXRzLCBjb25zdCBWYXJpYWJsZVN0YXREYXRhICp2 YXJkYXRhKTsKK2V4dGVybiB2b2lkIGpzb25TdGF0c1JlbGVhc2UoSnNvblN0YXRzIGRhdGEp OworCitleHRlcm4gSnNvblBhdGhTdGF0cyBqc29uU3RhdHNHZXRQYXRoQnlTdHIoSnNvblN0 YXRzIHN0YXRzLAorCQkJCQkJCQkJCSAgIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXRobGVu KTsKKworZXh0ZXJuIEpzb25QYXRoU3RhdHMganNvblBhdGhTdGF0c0dldFN1YnBhdGgoSnNv blBhdGhTdGF0cyBzdGF0cywKKwkJCQkJCQkJCQkJIGNvbnN0IGNoYXIgKnN1YnBhdGgpOwor CitleHRlcm4gYm9vbCBqc29uUGF0aFN0YXRzR2V0TmV4dFN1YnBhdGhTdGF0cyhKc29uUGF0 aFN0YXRzIHN0YXRzLAorCQkJCQkJCQkJCQkgSnNvblBhdGhTdGF0cyAqa2V5c3RhdHMsCisJ CQkJCQkJCQkJCSBib29sIGtleXNPbmx5KTsKKworZXh0ZXJuIEpzb25QYXRoU3RhdHMganNv blBhdGhTdGF0c0dldEFycmF5TGVuZ3RoU3RhdHMoSnNvblBhdGhTdGF0cyBwc3RhdHMpOwor ZXh0ZXJuIEpzb25QYXRoU3RhdHMganNvblBhdGhTdGF0c0dldE9iamVjdExlbmd0aFN0YXRz KEpzb25QYXRoU3RhdHMgcHN0YXRzKTsKKworZXh0ZXJuIGZsb2F0NCBqc29uUGF0aFN0YXRz R2V0RnJlcShKc29uUGF0aFN0YXRzIHBzdGF0cywgZmxvYXQ0IGRlZmF1bHRmcmVxKTsKKwor ZXh0ZXJuIGZsb2F0NCBqc29uUGF0aFN0YXRzR2V0VHlwZUZyZXEoSnNvblBhdGhTdGF0cyBw c3RhdHMsCisJCQkJCQkJCQlKc29uYlZhbHVlVHlwZSB0eXBlLCBmbG9hdDQgZGVmYXVsdGZy ZXEpOworCitleHRlcm4gZmxvYXQ0IGpzb25QYXRoU3RhdHNHZXRBdmdBcnJheVNpemUoSnNv blBhdGhTdGF0cyBwc3RhdHMpOworCitleHRlcm4gU2VsZWN0aXZpdHkganNvblBhdGhTdGF0 c0dldEFycmF5SW5kZXhTZWxlY3Rpdml0eShKc29uUGF0aFN0YXRzIHBzdGF0cywKKwkJCQkJ CQkJCQkJCQkJIGludCBpbmRleCk7CisKK2V4dGVybiBTZWxlY3Rpdml0eSBqc29uU2VsZWN0 aXZpdHkoSnNvblBhdGhTdGF0cyBzdGF0cywgRGF0dW0gc2NhbGFyLCBPaWQgb3Blcik7CisK K2V4dGVybiB2b2lkIGpzb25QYXRoQXBwZW5kRW50cnkoU3RyaW5nSW5mbyBwYXRoLCBjb25z dCBjaGFyICplbnRyeSk7CisKK2V4dGVybiBib29sIGpzb25BbmFseXplQnVpbGRTdWJQYXRo c0RhdGEoRGF0dW0gKnBhdGhzRGF0dW1zLAorCQkJCQkJCQkJCSBpbnQgbnBhdGhzLCBpbnQg aW5kZXgsCisJCQkJCQkJCQkJIGNvbnN0IGNoYXIJKnBhdGgsIGludCBwYXRobGVuLAorCQkJ CQkJCQkJCSBib29sIGluY2x1ZGVTdWJwYXRocywgZmxvYXQ0IG51bGxmcmFjLAorCQkJCQkJ CQkJCSBEYXR1bSAqcHZhbHMsIERhdHVtICpwbnVtcyk7CisKKyNlbmRpZiAvKiBKU09OX1NF TEZVTkNTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNv bmJfc3RhdHMub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9zdGF0cy5v dXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmM3YjFlNjQ0MDk5 Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9z dGF0cy5vdXQKQEAgLTAsMCArMSw3MTMgQEAKK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9O IGV4cGxhaW5fanNvbmIoc3FsX3F1ZXJ5IHRleHQpCitSRVRVUk5TIFRBQkxFKGV4cGxhaW5f bGluZSBqc29uKSBBUworJCQKK0JFR0lOCisJUkVUVVJOIFFVRVJZIEVYRUNVVEUgJ0VYUExB SU4gKEFOQUxZWkUsIEZPUk1BVCBqc29uKSAnIHx8IHNxbF9xdWVyeTsKK0VORDsKKyQkIExB TkdVQUdFIHBscGdzcWw7CitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBnZXRfcGxhbl9h bmRfYWN0dWFsX3Jvd3Moc3FsX3F1ZXJ5IHRleHQpCitSRVRVUk5TIFRBQkxFKHBsYW4gaW50 ZWdlciwgYWN0dWFsIGludGVnZXIpIEFTCiskJAorCVNFTEVDVAorCQkocGxhbi0+PidQbGFu IFJvd3MnKTo6aW50ZWdlciBwbGFuLAorCQkocGxhbi0+PidBY3R1YWwgUm93cycpOjppbnRl Z2VyIGFjdHVhbAorCUZST00gKAorCQlTRUxFQ1QgZXhwbGFpbl9qc29uYihzcWxfcXVlcnkp ICM+ICd7MCxQbGFuLFBsYW5zLDB9JworCSkgcChwbGFuKQorJCQgTEFOR1VBR0Ugc3FsOwor Q1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gY2hlY2tfZXN0aW1hdGUoc3FsX3F1ZXJ5IHRl eHQsIGFjY3VyYWN5IHJlYWwpCitSRVRVUk5TIGJvb2xlYW4gQVMKKyQkCisJU0VMRUNUIHBs YW4gQkVUV0VFTiBhY3R1YWwgLyAoMSArIGFjY3VyYWN5KSBBTkQgKGFjdHVhbCArIDEpICog KDEgKyBhY2N1cmFjeSkKKwlGUk9NIChTRUxFQ1QgKiBGUk9NIGdldF9wbGFuX2FuZF9hY3R1 YWxfcm93cyhzcWxfcXVlcnkpKSB4CiskJCBMQU5HVUFHRSBzcWw7CitDUkVBVEUgT1IgUkVQ TEFDRSBGVU5DVElPTiBjaGVja19lc3RpbWF0ZTIoc3FsX3F1ZXJ5IHRleHQsIGFjY3VyYWN5 IHJlYWwpCitSRVRVUk5TIFRBQkxFKG1pbiBpbnRlZ2VyLCBtYXggaW50ZWdlcikgQVMKKyQk CisJU0VMRUNUIChhY3R1YWwgKiAoMSAtIGFjY3VyYWN5KSk6OmludGVnZXIsICgoYWN0dWFs ICsgMSkgKiAoMSArIGFjY3VyYWN5KSk6OmludGVnZXIKKwlGUk9NIChTRUxFQ1QgKiBGUk9N IGdldF9wbGFuX2FuZF9hY3R1YWxfcm93cyhzcWxfcXVlcnkpKSB4CiskJCBMQU5HVUFHRSBz cWw7CitDUkVBVEUgVEFCTEUganNvbmJfc3RhdHNfdGVzdChqcyBqc29uYik7CitJTlNFUlQg SU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCBOVUxMIEZST00gZ2VuZXJhdGVfc2VyaWVz KDEsIDEwMDApOworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ251bGwn IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0 c190ZXN0IFNFTEVDVCAndHJ1ZScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzAwKTsKK0lO U0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICdmYWxzZScgRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgNTAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNU ICcxMjM0NScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0lOU0VSVCBJTlRPIGpz b25iX3N0YXRzX3Rlc3QgU0VMRUNUICgxMDAwICogKGkgJSAxMCkpOjp0ZXh0Ojpqc29uYiBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCA0MDApIGk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0 c190ZXN0IFNFTEVDVCBpOjp0ZXh0Ojpqc29uYiBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA1 MDApIGk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnImZvbyInIEZS T00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190 ZXN0IFNFTEVDVCBmb3JtYXQoJyJiYXIlcyInLCBpICUgMTApOjpqc29uYiBGUk9NIGdlbmVy YXRlX3NlcmllcygxLCA0MDApIGk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNF TEVDVCBmb3JtYXQoJyJiYXolcyInLCBpKTo6anNvbmIgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwgNTAwKSBpOworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ3t9JyBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDApOworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNf dGVzdCBTRUxFQ1QganNvbmJfYnVpbGRfb2JqZWN0KCdmb28nLCAnYmFyJykgRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VM RUNUIGpzb25iX2J1aWxkX29iamVjdCgnZm9vJywgJ2JheicgfHwgKGkgJSAxMCkpIEZST00g Z2VuZXJhdGVfc2VyaWVzKDEsIDMwMCkgaTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rl c3QgU0VMRUNUIGpzb25iX2J1aWxkX29iamVjdCgnZm9vJywgaSAlIDEwKSBGUk9NIGdlbmVy YXRlX3NlcmllcygxLCAyMDApIGk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNF TEVDVCBqc29uYl9idWlsZF9vYmplY3QoJyJmb28gXCJiYXIiJywgaSAlIDEwKSBGUk9NIGdl bmVyYXRlX3NlcmllcygxLCAyMDApIGk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0 IFNFTEVDVCAnW10nIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCk7CitJTlNFUlQgSU5U TyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnWyJmb28iXScgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwgMjAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICdbMTIz NDVdJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMDApOworSU5TRVJUIElOVE8ganNvbmJf c3RhdHNfdGVzdCBTRUxFQ1QgJ1tbImZvbyJdXScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwg MjAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICdbeyJrZXkiOiAi Zm9vIn1dJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAyMDApOworSU5TRVJUIElOVE8ganNv bmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ1tudWxsLCAiZm9vIl0nIEZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDIwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnW251 bGwsIDEyMzQ1XScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzAwKTsKK0lOU0VSVCBJTlRP IGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICdbbnVsbCwgWyJmb28iXV0nIEZST00gZ2VuZXJh dGVfc2VyaWVzKDEsIDIwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVD VCAnW251bGwsIHsia2V5IjogImZvbyJ9XScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAw KTsKKy0tIEJ1aWxkIHJhbmRvbSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBhcnJheXMKK1NF TEVDVCBzZXRzZWVkKDAuMCk7Cisgc2V0c2VlZCAKKy0tLS0tLS0tLQorIAorKDEgcm93KQor CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0CitTRUxFQ1QganNvbmJfYnVpbGRfb2Jq ZWN0KCdhcnJheScsCisJanNvbmJfYnVpbGRfYXJyYXkoKSkKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDEwMDApOworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdAorU0VMRUNUIGpz b25iX2J1aWxkX29iamVjdCgnYXJyYXknLAorCWpzb25iX2J1aWxkX2FycmF5KAorCQlmbG9v cihyYW5kb20oKSAqIDEwKTo6aW50KSkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDQwMDAp OworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdAorU0VMRUNUIGpzb25iX2J1aWxkX29i amVjdCgnYXJyYXknLAorCWpzb25iX2J1aWxkX2FycmF5KAorCQlmbG9vcihyYW5kb20oKSAq IDEwKTo6aW50LAorCQlmbG9vcihyYW5kb20oKSAqIDEwKTo6aW50KSkKK0ZST00gZ2VuZXJh dGVfc2VyaWVzKDEsIDMwMDApOworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdAorU0VM RUNUIGpzb25iX2J1aWxkX29iamVjdCgnYXJyYXknLAorCWpzb25iX2J1aWxkX2FycmF5KAor CQlmbG9vcihyYW5kb20oKSAqIDEwKTo6aW50LAorCQlmbG9vcihyYW5kb20oKSAqIDEwKTo6 aW50LAorCQlmbG9vcihyYW5kb20oKSAqIDEwKTo6aW50KSkKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDIwMDApOworQU5BTFlaRSBqc29uYl9zdGF0c190ZXN0OworQ1JFQVRFIE9SIFJF UExBQ0UgRlVOQ1RJT04gY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZShzcWxfY29u ZGl0aW9uIHRleHQsIGFjY3VyYWN5IHJlYWwpCitSRVRVUk5TIGJvb2xlYW4gQVMKKyQkCisJ U0VMRUNUIGNoZWNrX2VzdGltYXRlKCdTRUxFQ1QgY291bnQoKikgRlJPTSBqc29uYl9zdGF0 c190ZXN0IFdIRVJFICcgfHwgc3FsX2NvbmRpdGlvbiwgYWNjdXJhY3kpCiskJCBMQU5HVUFH RSBzcWw7CitEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlMih0ZXh0LCByZWFsKTsKK05PVElDRTogIGZ1bmN0aW9uIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUyKHRleHQscGdfY2F0YWxvZy5mbG9hdDQpIGRvZXMgbm90 IGV4aXN0LCBza2lwcGluZworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gY2hlY2tfanNv bmJfc3RhdHNfdGVzdF9lc3RpbWF0ZTIoc3FsX2NvbmRpdGlvbiB0ZXh0LCBhY2N1cmFjeSBy ZWFsKQorUkVUVVJOUyBUQUJMRShwbGFuIGludGVnZXIsIGFjdHVhbCBpbnRlZ2VyKSBBUwor JCQKKwlTRUxFQ1QgZ2V0X3BsYW5fYW5kX2FjdHVhbF9yb3dzKCdTRUxFQ1QgY291bnQoKikg RlJPTSBqc29uYl9zdGF0c190ZXN0IFdIRVJFICcgfHwgc3FsX2NvbmRpdGlvbikKKyQkIExB TkdVQUdFIHNxbDsKKy0tIENoZWNrIE5VTEwgZXN0aW1hdGUKK1NFTEVDVCBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgSVMgTlVMTCQkLCAwLjAzKTsKKyBjaGVja19q c29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIC0+ICdiYWRfa2V5JyBJUyBOVUxMJCQsIDAuMDEpOworIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlKCQkanMgIz4gJ3tiYWRfa2V5fScgSVMgTlVMTCQkLCAwLjAxKTsKKyBjaGVja19q c29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIC0+IDEwMDAwMDAgSVMgTlVMTCQkLCAwLjAxKTsKKyBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3Rp bWF0ZSgkJGpzICM+ICd7MTAwMDAwMH0nIElTIE5VTEwkJCwgMC4wMSk7CisgY2hlY2tfanNv bmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUoJCRqcyAtPiAnYmFkX2tleTEnIC0+ICdiYWRfa2V5MicgSVMgTlVMTCQkLCAwLjAx KTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzICM+ICd7YmFkX2tleTEsYmFkX2tleTJ9JyBJUyBO VUxMJCQsIDAuMDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBj aGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJ2JhZF9rZXkxJyAtPiAx IElTIE5VTEwkJCwgMC4wMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VM RUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAjPiAne2JhZF9rZXkx LDF9JyBJUyBOVUxMJCQsIDAuMDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisK K1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gMTAwMDAw MCAtPiAnZm9vJyBJUyBOVUxMJCQsIDAuMDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgIz4g J3sxMDAwMDAwLGZvb30nIElTIE5VTEwkJCwgMC4wMSk7CisgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQK KygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRq cyAtPiAnYmFkX2tleScgPSAnMTIzJyQkLCAwLjAxKTsKKyBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpz IC0+IDEwMDAwMDAgPSAnMTIzJyQkLCAwLjAxKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEg cm93KQorCistLSBDaGVjayBudWxsIGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID0gICdudWxsJyQkLCAwLjEpOworIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlKCQkanMgQD4gJ251bGwnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworLS0gQ2hlY2sgYm9vbGVhbiBlcSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA9ICAndHJ1ZSckJCwgMC4xKTsKKyBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSgkJGpzIEA+ICd0cnVlJyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0 CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQk anMgPSAgJ2ZhbHNlJyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisK K1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ2ZhbHNl JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKKy0tIENoZWNrIG51 bWVyaWMgZXEgZXN0aW1hdGUKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgPSAnMTIzNDUnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJv dykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyM+J3t9 JyA9ICcxMjM0NSckJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRl IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitT RUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID0gJzMwMDAnJCQs IDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA9ICcxMjM0JyQkLCAxKTsKKyBjaGVja19q c29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIEA+ICc2MDAwJyQkLCAwLjIpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rl c3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0Ciso MSByb3cpCisKKy0tIENoZWNrIG51bWVyaWMgcmFuZ2UgZXN0aW1hdGUKK1NFTEVDVCBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPCAnMCckJCwgMC4xKTsKKyBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSgkJGpzIDwgJzEwMCckJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpz IDwgJzEwMDAnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VM RUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA8ICczNDU2JyQkLCAw LjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPCAnMTAwMDAnJCQsIDAuMSk7CisgY2hlY2tf anNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUoJCRqcyA8ICcxMDAwMDAnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQK KygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRq cyA+ICcxMDAnIEFORCBqcyA8ICc2MDAnJCQsIDAuNSk7CisgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQK KygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRq cyA+ICc2ODAwJyBBTkQganMgPCAnMTIwMDAnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3Rh dHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IHQKKygxIHJvdykKKworLS0gQ2hlY2sgc3RyaW5nIGVxIGVzdGltYXRlCitTRUxFQ1QgY2hl Y2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID0gJyJmb28iJyQkLCAwLjEpOwor IGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0 c190ZXN0X2VzdGltYXRlKCQkanMgPSAnImJhcjciJyQkLCAwLjIpOworIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgPSAnImJhejEyMzQiJyQkLCAxMCk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBA PiAnImJhcjQiJyQkLCAwLjMpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKKy0t IENoZWNrIHN0cmluZyByYW5nZSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUoJCRqcyA+ICciZm9vIickJCwgMC4wMSk7CisgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUoJCRqcyA+ICciYmFyIickJCwgMC4wMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJv dykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA+ICci YmF6IickJCwgMC4wMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gQ2hl Y2sgb2JqZWN0IGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzID0gJ3t9JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPiAn e30nJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gQ2hlY2sg b2JqZWN0IGtleSBlcSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUoJCRqcyAtPiAnZm9vJyA9ICciYmFyIickJCwgMC4yKTsKKyBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3Rp bWF0ZSgkJGpzIC0+ICdmb28nID0gJyJiYXoiJyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRl KCQkanMgLT4gJ2ZvbycgPSAnImJhejUiJyQkLCAwLjMpOworIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0 CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQk anMgIz4gJ3tmb299JyA9ICciYmFyIickJCwgMC4yKTsKKyBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCistLSBDaGVjayBvYmplY3Qga2V5IHJhbmdlIGVzdGltYXRlCitTRUxFQ1Qg Y2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdmb28nID49ICciYmF6 MiInJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNo ZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnZm9vJyA8ICAnImJhejki JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJ2ZvbycgPj0gJyJiYXoyIicg QU5EIGpzIC0+ICdmb28nIDwgJyJiYXo5IickJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0 c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg dAorKDEgcm93KQorCistLSBDaGVjayBhcnJheSBlcSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNr X2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA9ICdbXSckJCwgMC4xKTsKKyBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSgkJGpzID49ICdbXScgQU5EIGpzIDwgJ3t9JyQkLCAwLjEpOworIGNoZWNr X2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyB0CisoMSByb3cpCisKKy0tIENoZWNrIHZhcmlhYmxlLWxlbmd0aCBhcnJh eSBlbGVtZW50IGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMCA9ICcxJyQkLCAwLjIpOworIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlKCQkanMgLT4gJ2FycmF5JyAtPiAxID0gJzYnJCQsIDAuMik7CisgY2hlY2tfanNv bmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUoJCRqcyAtPiAnYXJyYXknIC0+IDIgPSAnOCckJCwgMC4yKTsKKyBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3Rp bWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMyA9ICcxJyQkLCAwLjIpOworIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKKy0tIENoZWNrIHZhcmlhYmxlLWxlbmd0aCBhcnJheSBlbGVt ZW50IHJhbmdlIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3Rp bWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMCA8ICc3JyQkLCAwLjEpOworIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgLT4gJ2FycmF5JyAtPiAxIDwgJzcnJCQsIDAuMSk7CisgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUoJCRqcyAtPiAnYXJyYXknIC0+IDIgPCAnNyckJCwgMC4xKTsKKyBjaGVja19qc29uYl9z dGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSgkJGpzIC0+ICdhcnJheScgLT4gMyA8ICc3JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyB0CisoMSByb3cpCisKKy0tIENoZWNrIHZhcmlhYmxlLWxlbmd0aCBhcnJheSBjb250YWlu bWVudCBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUo JCRqcyAtPiAnYXJyYXknIEA+ICdbXSckJCwgMC4yKTsKKyBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpz IC0+ICdhcnJheScgQD4gJ1sxXSckJCwgMC4yKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEg cm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ ICdhcnJheScgQD4gJ1sxMDBdJyQkLCAwLjIpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4g J2FycmF5JyBAPiAnWzEsIDJdJyQkLCAxKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93 KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdh cnJheScgQD4gJ1sxLCAxMDBdJyQkLCAxKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93 KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdh cnJheScgQD4gJ1sxLCAyLCAxMDBdJyQkLCAxKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEg cm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ ICdhcnJheScgQD4gJ1sxLCAyLCAzXSckJCwgNSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAt PiAnYXJyYXknIEA+ICcxJyQkLCAwLjMpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cp CisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJ2Fy cmF5JyBAPiAnMTAwJyQkLCAxMCk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXkn IC0+IDAgQD4gJzEnJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXkn IC0+IDEgQD4gJzEnJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXkn IC0+IDIgQD4gJzEnJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXkn IC0+IDMgQD4gJzEnJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXkn IC0+IDAgQD4gJ1sxXSckJCwgMC4zKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQor CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICd7ImFy cmF5IjogW119JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NF TEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXki OiBbMV19JyQkLCAwLjMpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVD VCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXkiOiBb MTAwXX0nJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNU IGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAneyJhcnJheSI6IFsx LCAyXX0nJCQsIDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBj aGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXkiOiBbMSwg MTAwXX0nJCQsIDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBj aGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXkiOiBbMSwg MiwgMTAwXX0nJCQsIDEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVD VCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXkiOiBb MSwgMiwgM119JyQkLCAzKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCistLSBj aGVjayBtaXNjIGNvbnRhaW5tZW50CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIEA+ICciZm9vIickJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAor KDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpz IEA+ICcxMjM0NSckJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRl IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitT RUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICdbXSckJCwg MC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNv bmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICdbMTIzNDVdJyQkLCAwLjEpOworIGNo ZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlKCQkanMgQD4gJ1siZm9vIl0nJCQsIDAuMSk7CisgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUoJCRqcyBAPiAnW1siZm9vIiwgImJhciJdXSckJCwgMC4xKTsKKyBjaGVja19qc29uYl9z dGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSgkJGpzIEA+ICdbWyJmb28iXV0nJCQsIDAuMik7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBA PiAnW3sia2V5IjogImZvbyJ9XSckJCwgMC4xKTsKKyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEg cm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ ICdbbnVsbF0nJCQsIDAuMyk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0g Q2hlY2sgb2JqZWN0IGtleSBudWxsIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3Rh dHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdmb28nIElTIE5VTEwkJCwgMC4xKTsKKyBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSgkJGpzIC0+ICdmb28nIElTIE5PVCBOVUxMJCQsIDAuMSk7CisgY2hlY2tf anNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUoJCRqcyAtPiAnImZvbyBcImJhciInIElTIE5PVCBOVUxMJCQsIDAuMSk7Cisg Y2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYmFkX2tleScgSVMgTlVMTCQkLCAwLjAxKTsKKyBj aGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdiYWRfa2V5JyBJUyBOT1QgTlVMTCQkLCAwLjAxKTsK KyBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCistLSBDaGVjayBvYmplY3Qga2V5IGV4 aXN0ZW5jZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA/ ICdiYWRfa2V5JyQkLCAxMCk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VM RUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA/ICdmb28nJCQsIDAu MSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA/ICdhcnJheSckJCwgMC4xKTsKKyBjaGVja19q c29uYl9zdGF0c190ZXN0X2VzdGltYXRlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzID98ICd7Zm9vLGJhZF9rZXl9JyQkLCAwLjEpOworIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgP3wgJ3tmb28sYXJyYXl9JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0 CisoMSByb3cpCisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQk anMgPyYgJ3tmb28sYmFkX2tleX0nJCQsIDAuMSk7CisgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA/ JiAne2ZvbyxiYXJ9JyQkLCAwLjEpOworIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcnVsZXMub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ydWxlcy5vdXQKaW5kZXggZDY1MmY3YjVmYjQuLjli NjMzYmFhMTc5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVz Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dApAQCAtMjUz Nyw2ICsyNTM3LDM4IEBAIHBnX3N0YXRzX2V4dF9leHByc3wgU0VMRUNUIGNuLm5zcG5hbWUg QVMgc2NoZW1hbmFtZSwKICAgICAgTEVGVCBKT0lOIHBnX25hbWVzcGFjZSBzbiBPTiAoKHNu Lm9pZCA9IHMuc3R4bmFtZXNwYWNlKSkpCiAgICAgIEpPSU4gTEFURVJBTCAoIFNFTEVDVCB1 bm5lc3QocGdfZ2V0X3N0YXRpc3RpY3NvYmpkZWZfZXhwcmVzc2lvbnMocy5vaWQpKSBBUyBl eHByLAogICAgICAgICAgICAgdW5uZXN0KHNkLnN0eGRleHByKSBBUyBhKSBzdGF0IE9OICgo c3RhdC5leHByIElTIE5PVCBOVUxMKSkpOworcGdfc3RhdHNfanNvbnwgU0VMRUNUIG4ubnNw bmFtZSBBUyBzY2hlbWFuYW1lLAorICAgIGMucmVsbmFtZSBBUyB0YWJsZW5hbWUsCisgICAg YS5hdHRuYW1lLAorICAgIChwYXRocy5wYXRoIC0+PiAncGF0aCc6OnRleHQpIEFTIGpzb25f cGF0aCwKKyAgICBzLnN0YWluaGVyaXQgQVMgaW5oZXJpdGVkLAorICAgICgoKHBhdGhzLnBh dGggLT4gJ2pzb24nOjp0ZXh0KSAtPj4gJ251bGxmcmFjJzo6dGV4dCkpOjpyZWFsIEFTIG51 bGxfZnJhYywKKyAgICAoKChwYXRocy5wYXRoIC0+ICdqc29uJzo6dGV4dCkgLT4+ICd3aWR0 aCc6OnRleHQpKTo6cmVhbCBBUyBhdmdfd2lkdGgsCisgICAgKCgocGF0aHMucGF0aCAtPiAn anNvbic6OnRleHQpIC0+PiAnZGlzdGluY3QnOjp0ZXh0KSk6OnJlYWwgQVMgbl9kaXN0aW5j dCwKKyAgICBBUlJBWSggU0VMRUNUIHZhbC52YWx1ZSBBUyB2YWwKKyAgICAgICAgICAgRlJP TSBqc29uYl9hcnJheV9lbGVtZW50cygoKChwYXRocy5wYXRoIC0+ICdqc29uJzo6dGV4dCkg LT4gJ21jdic6OnRleHQpIC0+ICd2YWx1ZXMnOjp0ZXh0KSkgdmFsKHZhbHVlKSkgQVMgbW9z dF9jb21tb25fdmFscywKKyAgICBBUlJBWSggU0VMRUNUICgobnVtLnZhbHVlKTo6dGV4dCk6 OnJlYWwgQVMgbnVtCisgICAgICAgICAgIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHMoKCgo cGF0aHMucGF0aCAtPiAnanNvbic6OnRleHQpIC0+ICdtY3YnOjp0ZXh0KSAtPiAnbnVtYmVy cyc6OnRleHQpKSBudW0odmFsdWUpKSBBUyBtb3N0X2NvbW1vbl9mcmVxcywKKyAgICBBUlJB WSggU0VMRUNUIHZhbC52YWx1ZSBBUyB2YWwKKyAgICAgICAgICAgRlJPTSBqc29uYl9hcnJh eV9lbGVtZW50cygoKChwYXRocy5wYXRoIC0+ICdqc29uJzo6dGV4dCkgLT4gJ2hpc3RvZ3Jh bSc6OnRleHQpIC0+ICd2YWx1ZXMnOjp0ZXh0KSkgdmFsKHZhbHVlKSkgQVMgaGlzdG9ncmFt X2JvdW5kcywKKyAgICBBUlJBWSggU0VMRUNUICgodmFsLnZhbHVlKTo6dGV4dCk6OmludGVn ZXIgQVMgdmFsCisgICAgICAgICAgIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHMoKCgocGF0 aHMucGF0aCAtPiAnYXJyYXlfbGVuZ3RoJzo6dGV4dCkgLT4gJ21jdic6OnRleHQpIC0+ICd2 YWx1ZXMnOjp0ZXh0KSkgdmFsKHZhbHVlKSkgQVMgbW9zdF9jb21tb25fYXJyYXlfbGVuZ3Ro cywKKyAgICBBUlJBWSggU0VMRUNUICgobnVtLnZhbHVlKTo6dGV4dCk6OnJlYWwgQVMgbnVt CisgICAgICAgICAgIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHMoKCgocGF0aHMucGF0aCAt PiAnYXJyYXlfbGVuZ3RoJzo6dGV4dCkgLT4gJ21jdic6OnRleHQpIC0+ICdudW1iZXJzJzo6 dGV4dCkpIG51bSh2YWx1ZSkpIEFTIG1vc3RfY29tbW9uX2FycmF5X2xlbmd0aF9mcmVxcywK KyAgICAoKChwYXRocy5wYXRoIC0+ICdqc29uJzo6dGV4dCkgLT4+ICdjb3JyZWxhdGlvbic6 OnRleHQpKTo6cmVhbCBBUyBjb3JyZWxhdGlvbgorICAgRlJPTSAoKChwZ19zdGF0aXN0aWMg cworICAgICBKT0lOIHBnX2NsYXNzIGMgT04gKChjLm9pZCA9IHMuc3RhcmVsaWQpKSkKKyAg ICAgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiAoKChjLm9pZCA9IGEuYXR0cmVsaWQpIEFORCAo YS5hdHRudW0gPSBzLnN0YWF0dG51bSkpKSkKKyAgICAgTEVGVCBKT0lOIHBnX25hbWVzcGFj ZSBuIE9OICgobi5vaWQgPSBjLnJlbG5hbWVzcGFjZSkpKSwKKyAgICBMQVRFUkFMICggU0VM RUNUIHVubmVzdCgoKCgKKyAgICAgICAgICAgICAgICBDQVNFCisgICAgICAgICAgICAgICAg ICAgIFdIRU4gKHMuc3Rha2luZDEgPSA4KSBUSEVOIHMuc3RhdmFsdWVzMQorICAgICAgICAg ICAgICAgICAgICBXSEVOIChzLnN0YWtpbmQyID0gOCkgVEhFTiBzLnN0YXZhbHVlczIKKyAg ICAgICAgICAgICAgICAgICAgV0hFTiAocy5zdGFraW5kMyA9IDgpIFRIRU4gcy5zdGF2YWx1 ZXMzCisgICAgICAgICAgICAgICAgICAgIFdIRU4gKHMuc3Rha2luZDQgPSA4KSBUSEVOIHMu c3RhdmFsdWVzNAorICAgICAgICAgICAgICAgICAgICBXSEVOIChzLnN0YWtpbmQ1ID0gOCkg VEhFTiBzLnN0YXZhbHVlczUKKyAgICAgICAgICAgICAgICAgICAgRUxTRSBOVUxMOjphbnlh cnJheQorICAgICAgICAgICAgICAgIEVORCk6OnRleHQpOjpqc29uYltdKVsyOl0pIEFTIHBh dGgpIHBhdGhzOwogcGdfdGFibGVzfCBTRUxFQ1Qgbi5uc3BuYW1lIEFTIHNjaGVtYW5hbWUs CiAgICAgYy5yZWxuYW1lIEFTIHRhYmxlbmFtZSwKICAgICBwZ19nZXRfdXNlcmJ5aWQoYy5y ZWxvd25lcikgQVMgdGFibGVvd25lciwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv cGFyYWxsZWxfc2NoZWR1bGUgYi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxl CmluZGV4IDViMGM3M2Q3ZTM3Li5kMTA4Y2M2MjEwNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFs bGVsX3NjaGVkdWxlCkBAIC0xMTIsNyArMTEyLDcgQEAgdGVzdDogc2VsZWN0X3ZpZXdzIHBv cnRhbHNfcDIgZm9yZWlnbl9rZXkgY2x1c3RlciBkZXBlbmRlbmN5IGd1YyBiaXRtYXBvcHMg Y29tYm8KICMgLS0tLS0tLS0tLQogIyBBbm90aGVyIGdyb3VwIG9mIHBhcmFsbGVsIHRlc3Rz IChKU09OIHJlbGF0ZWQpCiAjIC0tLS0tLS0tLS0KLXRlc3Q6IGpzb24ganNvbmIganNvbl9l bmNvZGluZyBqc29ucGF0aCBqc29ucGF0aF9lbmNvZGluZyBqc29uYl9qc29ucGF0aAordGVz dDoganNvbiBqc29uYiBqc29uX2VuY29kaW5nIGpzb25wYXRoIGpzb25wYXRoX2VuY29kaW5n IGpzb25iX2pzb25wYXRoIGpzb25iX3N0YXRzCiAKICMgLS0tLS0tLS0tLQogIyBBbm90aGVy IGdyb3VwIG9mIHBhcmFsbGVsIHRlc3RzCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNz L3NxbC9qc29uYl9zdGF0cy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9zdGF0 cy5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmZhYzcxZDA5 ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJfc3Rh dHMuc3FsCkBAIC0wLDAgKzEsMjQ5IEBACitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBl eHBsYWluX2pzb25iKHNxbF9xdWVyeSB0ZXh0KQorUkVUVVJOUyBUQUJMRShleHBsYWluX2xp bmUganNvbikgQVMKKyQkCitCRUdJTgorCVJFVFVSTiBRVUVSWSBFWEVDVVRFICdFWFBMQUlO IChBTkFMWVpFLCBGT1JNQVQganNvbikgJyB8fCBzcWxfcXVlcnk7CitFTkQ7CiskJCBMQU5H VUFHRSBwbHBnc3FsOworCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBnZXRfcGxhbl9h bmRfYWN0dWFsX3Jvd3Moc3FsX3F1ZXJ5IHRleHQpCitSRVRVUk5TIFRBQkxFKHBsYW4gaW50 ZWdlciwgYWN0dWFsIGludGVnZXIpIEFTCiskJAorCVNFTEVDVAorCQkocGxhbi0+PidQbGFu IFJvd3MnKTo6aW50ZWdlciBwbGFuLAorCQkocGxhbi0+PidBY3R1YWwgUm93cycpOjppbnRl Z2VyIGFjdHVhbAorCUZST00gKAorCQlTRUxFQ1QgZXhwbGFpbl9qc29uYihzcWxfcXVlcnkp ICM+ICd7MCxQbGFuLFBsYW5zLDB9JworCSkgcChwbGFuKQorJCQgTEFOR1VBR0Ugc3FsOwor CitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBjaGVja19lc3RpbWF0ZShzcWxfcXVlcnkg dGV4dCwgYWNjdXJhY3kgcmVhbCkKK1JFVFVSTlMgYm9vbGVhbiBBUworJCQKKwlTRUxFQ1Qg cGxhbiBCRVRXRUVOIGFjdHVhbCAvICgxICsgYWNjdXJhY3kpIEFORCAoYWN0dWFsICsgMSkg KiAoMSArIGFjY3VyYWN5KQorCUZST00gKFNFTEVDVCAqIEZST00gZ2V0X3BsYW5fYW5kX2Fj dHVhbF9yb3dzKHNxbF9xdWVyeSkpIHgKKyQkIExBTkdVQUdFIHNxbDsKKworQ1JFQVRFIE9S IFJFUExBQ0UgRlVOQ1RJT04gY2hlY2tfZXN0aW1hdGUyKHNxbF9xdWVyeSB0ZXh0LCBhY2N1 cmFjeSByZWFsKQorUkVUVVJOUyBUQUJMRShtaW4gaW50ZWdlciwgbWF4IGludGVnZXIpIEFT CiskJAorCVNFTEVDVCAoYWN0dWFsICogKDEgLSBhY2N1cmFjeSkpOjppbnRlZ2VyLCAoKGFj dHVhbCArIDEpICogKDEgKyBhY2N1cmFjeSkpOjppbnRlZ2VyCisJRlJPTSAoU0VMRUNUICog RlJPTSBnZXRfcGxhbl9hbmRfYWN0dWFsX3Jvd3Moc3FsX3F1ZXJ5KSkgeAorJCQgTEFOR1VB R0Ugc3FsOworCitDUkVBVEUgVEFCTEUganNvbmJfc3RhdHNfdGVzdChqcyBqc29uYik7CisK K0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUIE5VTEwgRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgMTAwMCk7CisKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VM RUNUICdudWxsJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAyMDApOworSU5TRVJUIElOVE8g anNvbmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ3RydWUnIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEs IDMwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnZmFsc2UnIEZS T00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMCk7CisKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRz X3Rlc3QgU0VMRUNUICcxMjM0NScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0lO U0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICgxMDAwICogKGkgJSAxMCkpOjp0 ZXh0Ojpqc29uYiBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA0MDApIGk7CitJTlNFUlQgSU5U TyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCBpOjp0ZXh0Ojpqc29uYiBGUk9NIGdlbmVyYXRl X3NlcmllcygxLCA1MDApIGk7CisKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VM RUNUICciZm9vIicgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0lOU0VSVCBJTlRP IGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUIGZvcm1hdCgnImJhciVzIicsIGkgJSAxMCk6Ompz b25iIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDQwMCkgaTsKK0lOU0VSVCBJTlRPIGpzb25i X3N0YXRzX3Rlc3QgU0VMRUNUIGZvcm1hdCgnImJheiVzIicsIGkpOjpqc29uYiBGUk9NIGdl bmVyYXRlX3NlcmllcygxLCA1MDApIGk7CisKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rl c3QgU0VMRUNUICd7fScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0lOU0VSVCBJ TlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUIGpzb25iX2J1aWxkX29iamVjdCgnZm9vJywg J2JhcicpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCk7CitJTlNFUlQgSU5UTyBqc29u Yl9zdGF0c190ZXN0IFNFTEVDVCBqc29uYl9idWlsZF9vYmplY3QoJ2ZvbycsICdiYXonIHx8 IChpICUgMTApKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMDApIGk7CitJTlNFUlQgSU5U TyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCBqc29uYl9idWlsZF9vYmplY3QoJ2ZvbycsIGkg JSAxMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKSBpOworSU5TRVJUIElOVE8ganNv bmJfc3RhdHNfdGVzdCBTRUxFQ1QganNvbmJfYnVpbGRfb2JqZWN0KCciZm9vIFwiYmFyIics IGkgJSAxMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKSBpOworCitJTlNFUlQgSU5U TyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnW10nIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEs IDEwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0c190ZXN0IFNFTEVDVCAnWyJmb28iXScg RlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRz X3Rlc3QgU0VMRUNUICdbMTIzNDVdJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMDApOwor SU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ1tbImZvbyJdXScgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3Qg U0VMRUNUICdbeyJrZXkiOiAiZm9vIn1dJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAyMDAp OworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdCBTRUxFQ1QgJ1tudWxsLCAiZm9vIl0n IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMCk7CitJTlNFUlQgSU5UTyBqc29uYl9zdGF0 c190ZXN0IFNFTEVDVCAnW251bGwsIDEyMzQ1XScgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwg MzAwKTsKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QgU0VMRUNUICdbbnVsbCwgWyJm b28iXV0nIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMCk7CitJTlNFUlQgSU5UTyBqc29u Yl9zdGF0c190ZXN0IFNFTEVDVCAnW251bGwsIHsia2V5IjogImZvbyJ9XScgRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgMjAwKTsKKworLS0gQnVpbGQgcmFuZG9tIHZhcmlhYmxlLWxlbmd0 aCBpbnRlZ2VyIGFycmF5cworU0VMRUNUIHNldHNlZWQoMC4wKTsKKworSU5TRVJUIElOVE8g anNvbmJfc3RhdHNfdGVzdAorU0VMRUNUIGpzb25iX2J1aWxkX29iamVjdCgnYXJyYXknLAor CWpzb25iX2J1aWxkX2FycmF5KCkpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwKTsK KworSU5TRVJUIElOVE8ganNvbmJfc3RhdHNfdGVzdAorU0VMRUNUIGpzb25iX2J1aWxkX29i amVjdCgnYXJyYXknLAorCWpzb25iX2J1aWxkX2FycmF5KAorCQlmbG9vcihyYW5kb20oKSAq IDEwKTo6aW50KSkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDQwMDApOworCitJTlNFUlQg SU5UTyBqc29uYl9zdGF0c190ZXN0CitTRUxFQ1QganNvbmJfYnVpbGRfb2JqZWN0KCdhcnJh eScsCisJanNvbmJfYnVpbGRfYXJyYXkoCisJCWZsb29yKHJhbmRvbSgpICogMTApOjppbnQs CisJCWZsb29yKHJhbmRvbSgpICogMTApOjppbnQpKQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwgMzAwMCk7CisKK0lOU0VSVCBJTlRPIGpzb25iX3N0YXRzX3Rlc3QKK1NFTEVDVCBqc29u Yl9idWlsZF9vYmplY3QoJ2FycmF5JywKKwlqc29uYl9idWlsZF9hcnJheSgKKwkJZmxvb3Io cmFuZG9tKCkgKiAxMCk6OmludCwKKwkJZmxvb3IocmFuZG9tKCkgKiAxMCk6OmludCwKKwkJ Zmxvb3IocmFuZG9tKCkgKiAxMCk6OmludCkpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAy MDAwKTsKKworCitBTkFMWVpFIGpzb25iX3N0YXRzX3Rlc3Q7CisKK0NSRUFURSBPUiBSRVBM QUNFIEZVTkNUSU9OIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoc3FsX2NvbmRp dGlvbiB0ZXh0LCBhY2N1cmFjeSByZWFsKQorUkVUVVJOUyBib29sZWFuIEFTCiskJAorCVNF TEVDVCBjaGVja19lc3RpbWF0ZSgnU0VMRUNUIGNvdW50KCopIEZST00ganNvbmJfc3RhdHNf dGVzdCBXSEVSRSAnIHx8IHNxbF9jb25kaXRpb24sIGFjY3VyYWN5KQorJCQgTEFOR1VBR0Ug c3FsOworCitEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlMih0ZXh0LCByZWFsKTsKKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04g Y2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZTIoc3FsX2NvbmRpdGlvbiB0ZXh0LCBh Y2N1cmFjeSByZWFsKQorUkVUVVJOUyBUQUJMRShwbGFuIGludGVnZXIsIGFjdHVhbCBpbnRl Z2VyKSBBUworJCQKKwlTRUxFQ1QgZ2V0X3BsYW5fYW5kX2FjdHVhbF9yb3dzKCdTRUxFQ1Qg Y291bnQoKikgRlJPTSBqc29uYl9zdGF0c190ZXN0IFdIRVJFICcgfHwgc3FsX2NvbmRpdGlv bikKKyQkIExBTkdVQUdFIHNxbDsKKworLS0gQ2hlY2sgTlVMTCBlc3RpbWF0ZQorU0VMRUNU IGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBJUyBOVUxMJCQsIDAuMDMp OworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYmFk X2tleScgSVMgTlVMTCQkLCAwLjAxKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlKCQkanMgIz4gJ3tiYWRfa2V5fScgSVMgTlVMTCQkLCAwLjAxKTsKK1NFTEVD VCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gMTAwMDAwMCBJUyBO VUxMJCQsIDAuMDEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUo JCRqcyAjPiAnezEwMDAwMDB9JyBJUyBOVUxMJCQsIDAuMDEpOworU0VMRUNUIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYmFkX2tleTEnIC0+ICdiYWRfa2V5 MicgSVMgTlVMTCQkLCAwLjAxKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlKCQkanMgIz4gJ3tiYWRfa2V5MSxiYWRfa2V5Mn0nIElTIE5VTEwkJCwgMC4wMSk7 CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdiYWRf a2V5MScgLT4gMSBJUyBOVUxMJCQsIDAuMDEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUoJCRqcyAjPiAne2JhZF9rZXkxLDF9JyBJUyBOVUxMJCQsIDAuMDEp OworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAxMDAw MDAwIC0+ICdmb28nIElTIE5VTEwkJCwgMC4wMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3Rh dHNfdGVzdF9lc3RpbWF0ZSgkJGpzICM+ICd7MTAwMDAwMCxmb299JyBJUyBOVUxMJCQsIDAu MDEpOworCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ ICdiYWRfa2V5JyA9ICcxMjMnJCQsIDAuMDEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAxMDAwMDAwID0gJzEyMyckJCwgMC4wMSk7CisKKy0t IENoZWNrIG51bGwgZXEgZXN0aW1hdGUKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlKCQkanMgPSAgJ251bGwnJCQsIDAuMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICdudWxsJyQkLCAwLjEpOworCistLSBDaGVj ayBib29sZWFuIGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzID0gICd0cnVlJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAndHJ1ZSckJCwgMC4xKTsKK1NFTEVDVCBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPSAgJ2ZhbHNlJyQkLCAwLjEpOwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAnZmFsc2Un JCQsIDAuMSk7CisKKy0tIENoZWNrIG51bWVyaWMgZXEgZXN0aW1hdGUKK1NFTEVDVCBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPSAnMTIzNDUnJCQsIDAuMSk7CitT RUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIz4ne30nID0gJzEy MzQ1JyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUo JCRqcyA9ICczMDAwJyQkLCAwLjMpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUoJCRqcyA9ICcxMjM0JyQkLCAxKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0 c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJzYwMDAnJCQsIDAuMik7CisKKy0tIENoZWNrIG51 bWVyaWMgcmFuZ2UgZXN0aW1hdGUKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2Vz dGltYXRlKCQkanMgPCAnMCckJCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlKCQkanMgPCAnMTAwJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA8ICcxMDAwJyQkLCAwLjEpOworU0VMRUNUIGNo ZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA8ICczNDU2JyQkLCAwLjEpOwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA8ICcxMDAwMCck JCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMg PCAnMTAwMDAwJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUoJCRqcyA+ICcxMDAnIEFORCBqcyA8ICc2MDAnJCQsIDAuNSk7CitTRUxFQ1QgY2hl Y2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID4gJzY4MDAnIEFORCBqcyA8ICcx MjAwMCckJCwgMC4xKTsKKworLS0gQ2hlY2sgc3RyaW5nIGVxIGVzdGltYXRlCitTRUxFQ1Qg Y2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID0gJyJmb28iJyQkLCAwLjEp OworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA9ICciYmFy NyInJCQsIDAuMik7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgk JGpzID0gJyJiYXoxMjM0IickJCwgMTApOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rl c3RfZXN0aW1hdGUoJCRqcyBAPiAnImJhcjQiJyQkLCAwLjMpOworCistLSBDaGVjayBzdHJp bmcgcmFuZ2UgZXN0aW1hdGUKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgPiAnImZvbyInJCQsIDAuMDEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRz X3Rlc3RfZXN0aW1hdGUoJCRqcyA+ICciYmFyIickJCwgMC4wMSk7CitTRUxFQ1QgY2hlY2tf anNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID4gJyJiYXoiJyQkLCAwLjAxKTsKKwor LS0gQ2hlY2sgb2JqZWN0IGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSgkJGpzID0gJ3t9JyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA+ICd7fSckJCwgMC4xKTsKKworLS0gQ2hlY2sg b2JqZWN0IGtleSBlcSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3Rf ZXN0aW1hdGUoJCRqcyAtPiAnZm9vJyA9ICciYmFyIickJCwgMC4yKTsKK1NFTEVDVCBjaGVj a19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJ2ZvbycgPSAnImJheiInJCQs IDAuMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ ICdmb28nID0gJyJiYXo1IickJCwgMC4zKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190 ZXN0X2VzdGltYXRlKCQkanMgIz4gJ3tmb299JyA9ICciYmFyIickJCwgMC4yKTsKKworLS0g Q2hlY2sgb2JqZWN0IGtleSByYW5nZSBlc3RpbWF0ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnZm9vJyA+PSAnImJhejIiJyQkLCAwLjEpOwor U0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnZm9vJyA8 ICAnImJhejkiJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUoJCRqcyAtPiAnZm9vJyA+PSAnImJhejIiJyBBTkQganMgLT4gJ2ZvbycgPCAnImJh ejkiJyQkLCAwLjEpOworCistLSBDaGVjayBhcnJheSBlcSBlc3RpbWF0ZQorU0VMRUNUIGNo ZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA9ICdbXSckJCwgMC4xKTsKK1NF TEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPj0gJ1tdJyBBTkQg anMgPCAne30nJCQsIDAuMSk7CisKKy0tIENoZWNrIHZhcmlhYmxlLWxlbmd0aCBhcnJheSBl bGVtZW50IGVxIGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3Rp bWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMCA9ICcxJyQkLCAwLjIpOworU0VMRUNUIGNoZWNr X2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXknIC0+IDEgPSAnNick JCwgMC4yKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMg LT4gJ2FycmF5JyAtPiAyID0gJzgnJCQsIDAuMik7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3Rh dHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMyA9ICcxJyQkLCAwLjIpOwor CistLSBDaGVjayB2YXJpYWJsZS1sZW5ndGggYXJyYXkgZWxlbWVudCByYW5nZSBlc3RpbWF0 ZQorU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJy YXknIC0+IDAgPCAnNyckJCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0 X2VzdGltYXRlKCQkanMgLT4gJ2FycmF5JyAtPiAxIDwgJzcnJCQsIDAuMSk7CitTRUxFQ1Qg Y2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMiA8 ICc3JyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUo JCRqcyAtPiAnYXJyYXknIC0+IDMgPCAnNyckJCwgMC4xKTsKKworLS0gQ2hlY2sgdmFyaWFi bGUtbGVuZ3RoIGFycmF5IGNvbnRhaW5tZW50IGVzdGltYXRlCitTRUxFQ1QgY2hlY2tfanNv bmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgQD4gJ1tdJyQkLCAwLjIp OworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJy YXknIEA+ICdbMV0nJCQsIDAuMik7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9l c3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgQD4gJ1sxMDBdJyQkLCAwLjIpOworU0VMRUNUIGNo ZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXknIEA+ICdbMSwg Ml0nJCQsIDEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRq cyAtPiAnYXJyYXknIEA+ICdbMSwgMTAwXSckJCwgMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgQD4gJ1sxLCAyLCAxMDBdJyQk LCAxKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4g J2FycmF5JyBAPiAnWzEsIDIsIDNdJyQkLCA1KTsKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXknIEA+ICcxJyQkLCAwLjMpOworU0VM RUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXknIEA+ ICcxMDAnJCQsIDEwKTsKKworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1h dGUoJCRqcyAtPiAnYXJyYXknIC0+IDAgQD4gJzEnJCQsIDAuMyk7CitTRUxFQ1QgY2hlY2tf anNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJheScgLT4gMSBAPiAnMSck JCwgMC4zKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMg LT4gJ2FycmF5JyAtPiAyIEA+ICcxJyQkLCAwLjMpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0 YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyAtPiAnYXJyYXknIC0+IDMgQD4gJzEnJCQsIDAuMyk7 CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdhcnJh eScgLT4gMCBAPiAnWzFdJyQkLCAwLjMpOworCitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNf dGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICd7ImFycmF5IjogW119JyQkLCAwLjEpOworU0VMRUNU IGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAneyJhcnJheSI6IFsx XX0nJCQsIDAuMyk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgk JGpzIEA+ICd7ImFycmF5IjogWzEwMF19JyQkLCAwLjMpOworU0VMRUNUIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAneyJhcnJheSI6IFsxLCAyXX0nJCQsIDEp OworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAneyJh cnJheSI6IFsxLCAxMDBdfSckJCwgMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVz dF9lc3RpbWF0ZSgkJGpzIEA+ICd7ImFycmF5IjogWzEsIDIsIDEwMF19JyQkLCAxKTsKK1NF TEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ3siYXJyYXki OiBbMSwgMiwgM119JyQkLCAzKTsKKworLS0gY2hlY2sgbWlzYyBjb250YWlubWVudAorU0VM RUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAnImZvbyInJCQs IDAuMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ ICcxMjM0NSckJCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGlt YXRlKCQkanMgQD4gJ1tdJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rl c3RfZXN0aW1hdGUoJCRqcyBAPiAnWzEyMzQ1XSckJCwgMC4xKTsKK1NFTEVDVCBjaGVja19q c29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ1siZm9vIl0nJCQsIDAuMSk7CitT RUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIEA+ICdbWyJmb28i LCAiYmFyIl1dJyQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0 aW1hdGUoJCRqcyBAPiAnW1siZm9vIl1dJyQkLCAwLjIpOworU0VMRUNUIGNoZWNrX2pzb25i X3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyBAPiAnW3sia2V5IjogImZvbyJ9XSckJCwgMC4x KTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgQD4gJ1tu dWxsXSckJCwgMC4zKTsKKworLS0gQ2hlY2sgb2JqZWN0IGtleSBudWxsIGVzdGltYXRlCitT RUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzIC0+ICdmb28nIElT IE5VTEwkJCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRl KCQkanMgLT4gJ2ZvbycgSVMgTk9UIE5VTEwkJCwgMC4xKTsKK1NFTEVDVCBjaGVja19qc29u Yl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJyJmb28gXCJiYXIiJyBJUyBOT1QgTlVM TCQkLCAwLjEpOworU0VMRUNUIGNoZWNrX2pzb25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRq cyAtPiAnYmFkX2tleScgSVMgTlVMTCQkLCAwLjAxKTsKK1NFTEVDVCBjaGVja19qc29uYl9z dGF0c190ZXN0X2VzdGltYXRlKCQkanMgLT4gJ2JhZF9rZXknIElTIE5PVCBOVUxMJCQsIDAu MDEpOworCistLSBDaGVjayBvYmplY3Qga2V5IGV4aXN0ZW5jZQorU0VMRUNUIGNoZWNrX2pz b25iX3N0YXRzX3Rlc3RfZXN0aW1hdGUoJCRqcyA/ICdiYWRfa2V5JyQkLCAxMCk7CitTRUxF Q1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID8gJ2ZvbyckJCwgMC4x KTsKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPyAnYXJy YXknJCQsIDAuMSk7CisKK1NFTEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRl KCQkanMgP3wgJ3tmb28sYmFkX2tleX0nJCQsIDAuMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJf c3RhdHNfdGVzdF9lc3RpbWF0ZSgkJGpzID98ICd7Zm9vLGFycmF5fSckJCwgMC4xKTsKK1NF TEVDVCBjaGVja19qc29uYl9zdGF0c190ZXN0X2VzdGltYXRlKCQkanMgPyYgJ3tmb28sYmFk X2tleX0nJCQsIDAuMSk7CitTRUxFQ1QgY2hlY2tfanNvbmJfc3RhdHNfdGVzdF9lc3RpbWF0 ZSgkJGpzID8mICd7Zm9vLGJhcn0nJCQsIDAuMSk7Ci0tIAoyLjI1LjEKCg== --------------0Bwm9qgi5SjAR5x8syR6OMh5--