Re: Feature: per-target port specification (with patch!)

Jan Gocník <[email protected]> Mon, 8 Apr 2019 15:15:23 +0200
Newsgroups gmane.comp.security.nmap.devel
Message-ID <OFC077AA08.C3D7DDE0-ONC12583D6.0047BC57-C12583D6.0048D20A@dcit.cz>
--=_mixed 0048D204C12583D6_=
Content-Type: multipart/alternative; boundary="=_alternative 0048D204C12583D6_="


--=_alternative 0048D204C12583D6_=
Content-Type: text/plain; charset="ISO-8859-2"
Content-Transfer-Encoding: quoted-printable

Hey,

I worked on this some more.

Fixed all of the memory leaks that were my fault, and the crash that was a =

result of a bug in mergeHostSpecificPorts. I took this opportunity to=20
rewrite the mergeHostSpecificPorts algorithm, so now the results are=20
properly sorted.
The disrepancy between "Scanning X [max N ports]" and "Completed Connect=20
Scan at X (0 ports max)" should be fixed as well, the totalprobes value is =

now properly initialized.

About the features you mentioned:
> The "Not shown: X ports" output for Normal output.
Well, from what I know, this doesn't always allow you to infer information =

about all ports anyway. For example, if you get "Not shown: 3995 closed=20
ports, 514 filtered ports". Therefore, as long as the counts are=20
calculated correctly, I don't think it's necessary to output information=20
about additional scanned ports, as you can get these from other more=20
verbose outputs.

> Properly formed XML output, with changes to the DTD and a=20
"xmloutputversion" number increase.
I simply output another scaninfo tag into each host tag. Updated the DTD=20
and xmloutputversion to 1.05.
For greppable, I output it in a format similiar to the ports listing.

> Combination of this feature with existing --top-ports/port-ratio and -p=20
options
From my testing, it merges with them properly.

> Combination of this feature with CIDR subnetting and IPv4 octet ranges
Should work just fine.

> Use of this feature along with advanced features like -O --traceroute=20
and -sV
I tested it with these options and everything seemed good to me.

On the topic of memory usage:
I wrote it so that if you do regular scans, the additional memory usage=20
should be very small - only a scan=5Flists per target group, which is <64=20
bytes, and a few pointers here and there. I can't get reproducible heap=20
reports form valgrind unfortunately, but in one case the new version even=20
allocated less memory than latest SVN trunk for "nmap scanme.nmap.org".
The biggest item of all is port=5Fmap=5Frev, which is 65536*sizeof(u16) =3D=
 128=20
kB. This is allocated for each target that has specific ports (but only=20
for those). Only way I can think of making this better is sharing those=20
for the whole target group, but I dunno if it's worth the effort.

Now, on the rationale.
A very specific (real) example when this feature is useful: We are=20
scanning a network, which has some kind of network appliance that replies=20
to SYNs on port 80 on every unleased IP, but doesn't reply to most other=20
ports at all (not even with a RST). That means that nmap considers every=20
single IP live,
but then waits for a long time when attempting to scan all the other=20
ports. I was scanning 521 IPs, of which 11 were really occupied and active =

and the 511 others were the "fakes".
I was testing three options: Scan all hosts for all ports that appeared at =

least once (marked all=5Fports), write a simple script that calls nmap for =

each target (script), and then used the per-target ports (per=5Ftarget).

With ping scan, the results were the following:
* all=5Fports: 102 seconds
* per=5Ftarget: 80 seconds
* script: 60 seconds
Without ping scan:
* script: 45 seconds
* all=5Fports: 38 seconds
* per=5Ftarget: 4 seconds

My conclusion is that this feature is useful when you get filtered ports,=20
as these take a lot of time. Basically, if you only have open and closed=20
ports, scanning some additional ones is fast and the "union all ports"=20
strategy is alright. But once you have filtered ports, the waiting quickly =

gets bad.
The script could be upgraded to be parallel, but then you're reinventing=20
nmap's parallel engine.

Now I know the "proper" solution on this network would be to use a brain=20
and try to discern real and fake machines, but this already gets much=20
faster results without a need for thinking, which is always nice.
I understand your concern about losing "new" services, but I see the main=20
usability of this in manual scans, for example running additional nse=20
scripts against your last scan results etc. When you are doing automatic=20
scans (for exmple as a network admin scanning network for new devices each =

week), you probably don't need to care about speed anyway...

Updated patch (to svn revision 37611):



Looking forward to further comments and hopefully we can make this work :)

Jan



From:   Jan Gocn=EDk/Dcit
To:     "Daniel Miller" <[email protected]>
Cc:     "Nmap-dev" <[email protected]>
Date:   02.04.2019 23:53
Subject:        Re: Feature: per-target port specification (with patch!)


Hey Dan,

thanks for the reply! It's a shame that I didn't find the GitHub issue you =

link to before implementing this, as it does raise a lot of valid=20
concerns.

First, let me say that the company I work for wants this feature, so even=20
if it doesn't end up in upstream, I will try to keep it at least as a fork =

- as I'll have to maintain it internally anyway, I wanted to share with=20
the community, in case others have a need for it as well.

I will go through all the things you mentioned (most of the compatibility=20
with other options should be taken care of, but memory leaks are a=20
problem), fix up the code, look at maybe getting the memory footprint=20
lower, and try to come up with some stronger numbers and rationale.

Jan





From:   "Daniel Miller" <[email protected]>
To:     "Jan Gocn=EDk" <[email protected]>
Cc:     "Nmap-dev" <[email protected]>
Date:   02.04.2019 21:21
Subject:        Re: Feature: per-target port specification (with patch!)
Sent by:        "dev" <[email protected]>



Some initial notes from building and testing this:

./nmap scanme.nmap.org^22-80 -d
Starting Nmap 7.70SVN ( https://nmap.org ) at 2019-04-02 18:37 UTC
PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0)
--------------- Timing report ---------------
  hostgroups: min 1, max 100000
  rtt-timeouts: init 1000, min 100, max 10000
  max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
  parallelism: min 0, max 0
  max-retries: 10, host-timeout: 0
  min-rate: 0, max-rate: 0
---------------------------------------------
Initiating Ping Scan at 18:37
Scanning scanme.nmap.org (45.33.32.156) [max 2 ports]
Completed Ping Scan at 18:37, 0.09s elapsed (1 total hosts)
Overall sending rates: 24.44 packets / s.
mass=5Frdns: Using DNS server X.X.X.X
Initiating Parallel DNS resolution of 1 host. at 18:37
mass=5Frdns: 0.12s 0/1 [#: 3, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]
Completed Parallel DNS resolution of 1 host. at 18:37, 0.06s elapsed
DNS resolution of 1 IPs took 0.15s. Mode: Async [#: 3, OK: 1, NX: 0, DR:=20
0, SF: 0, TR: 1, CN: 0]
Initiating Connect Scan at 18:37
Scanning scanme.nmap.org (45.33.32.156) [max 1059 ports]
Discovered open port 80/tcp
Discovered open port 22/tcp
Discovered open port 9929/tcp
Discovered open port 31337/tcp
nmap: portlist.cc:688: void PortList::mapPort(u16*, u8*) const: Assertion=20
`mapped=5Fportno < port=5Flist=5Fcount[mapped=5Fprotocol]' failed.
Aborted (core dumped)


Valgrind identified some memory leaks. These were the ones that are=20
definitely from this patch: Portlist::setIdStr(), idstr;=20
PortList::mergeHostSpecificPorts(), new=5Fport=5Fmap and new=5Fport=5Fmap=
=5Frev;

There was also a discrepancy between the "Scanning X [max N ports]" and=20
"Completed Connect Scan at X (0 ports max)", which valgrind says is due to =

an uninitialized value, probably GroupScanStats::totalprobes.

Of course, as you noted before, the results are not sorted by port number, =

which we would have to do to ensure predictable output that can be=20
compared with previous scans.

IPv6 addresses, CIDR, and IPv4 octet ranges seem to work fine with this.

With just my one test scan of localhost and scanme.nmap.org with one=20
unique port each and one port in common, the patched code allocated an=20
additional 383KB of heap memory. I do not know how this would scale up or=20
down, and I haven't compared it with a scan that should behave the same in =

both cases (for instance, "nmap 192.168.1.0/24".

My primary concern remains that repeated use of this feature will result=20
in missing new services and dropping existing ones if they are missed in=20
just one scan. This is more about use case than about the code, though, so =

I will defer to users on that.

Dan

On Tue, Apr 2, 2019 at 1:30 PM Daniel Miller <[email protected]>=20
wrote:
Jan,

Thanks for this contribution. We've had many requests for this type of=20
feature in the past, but have elected not to include it for a variety of=20
reasons. There is an open discussion on our issue tracker that lays out=20
some of the challenges in correctly implementing such a feature:=20
http://issues.nmap.org/1217

It looks like your patch has tried to handle some of these situations, for =

example the "Ports scanned" output for Grepable output (and maybe XML, but =

it didn't look complete at first glance). If we are to do an actual code=20
review and include this new feature, we would have to look for a complete=20
solution that can handle the following situations:

* The "Not shown: X ports" output for Normal output.
* Properly formed XML output, with changes to the DTD and a=20
"xmloutputversion" number increase.
* Combination of this feature with existing --top-ports/port-ratio and -p=20
options
* Combination of this feature with CIDR subnetting and IPv4 octet ranges
* Use of this feature along with advanced features like -O --traceroute=20
and -sV

Have you done any measurement of scans before and after adding this=20
feature to determine the actual impact on scan times and bandwidth? Do you =

have a bandwidth target for your scans that Nmap is exceeding right now,=20
and by how much? What does a typical nmap command line look like, and what =

performance options have you already tried?

I look forward to hearing more about this from you and our other devs and=20
users.

Dan

On Tue, Apr 2, 2019 at 8:07 AM Jan Gocn=EDk <[email protected]> wrote:
Hey,=20

I would like to propose a feature enabling specifying ports for each=20
target separately.=20

Rationale:=20
It often happens that we already have an nmap scan of 200 machines, and we =

want to do a service scan on those same machines. Usually that forces us=20
to scan the whole network for all the ports that appeared at least once.=20
That is a big waste of time and bandwidth. What we want to have is=20
essentially a rescan-like feature, that would rescan just ports that were=20
found to be open before.=20

User experience:=20
Everywhere where you could specify a target (-iL file, command line) you=20
can supply a "target^ports". It works with all the nmap magic ranges, so=20
"192.168.1.1-255^22-60" works. The common ports (supplied with -p) are=20
scanned on all targets.=20

Implementation details:=20
I tried to keep it so that if you don't use any "^" in the targets, the=20
code path should remain largely the same, so there should be no=20
regressions. However, I had to do some tuning in functions that expected=20
they can just get the number of probes by multiplying common ports by=20
targets.=20
There's a small issue, in that the results of the scan are not sorted=20
properly, as the target-specific ports get scanned last.=20

Usage example:=20
=3D=3D=3Dpaste start=3D=3D=3D=20
$ nmap -v -Pn -n -p22 "165.227.141.119^80,443" "40.113.73.59^8080"=20
Starting Nmap 7.70SVN ( https://nmap.org ) at 2019-04-01 19:46 CEST=20
Initiating SYN Stealth Scan at 19:46=20
Scanning 2 hosts [max 3 ports/host]=20
Discovered open port 22/tcp=20
Discovered open port 80/tcp=20
Discovered open port 443/tcp=20
Discovered open port 22/tcp=20
Completed SYN Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports =

max)=20
Nmap scan report for 165.227.141.119=20
Host is up (0.0090s latency).=20

PORT    STATE SERVICE=20
22/tcp  open  ssh=20
80/tcp  open  http=20
443/tcp open  https=20

Nmap scan report for 40.113.73.59=20
Host is up (0.038s latency).=20

PORT     STATE    SERVICE=20
22/tcp   open     ssh=20
8080/tcp filtered http-proxy=20

Read data files from: /home/gocnik/nmap=20
Nmap done: 2 IP addresses (2 hosts up) scanned in 1.52 seconds=20
           Raw packets sent: 6 (264B) | Rcvd: 4 (176B)=20
=3D=3D=3Dpaste end=3D=3D=3D=20

If done the usual way:=20
$ nmap -v -Pn -n -p22,80,443,8080 165.227.141.119 40.113.73.59=20
[...]=20
Raw packets sent: 10 (440B) | Rcvd: 6 (260B)=20


The patch is against svn trunk at this moment (revision 37608).=20



Looking forward to all comments!=20
JaGoTu=20

P.S.: Sorry if you recieve this e-mail twice, but the previous one=20
apparently got caught in a moderation queue or something, as it doesn't=20
show on seclists.org=20
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F
Sent through the dev mailing list
https://nmap.org/mailman/listinfo/dev
Archived at http://seclists.org/nmap-dev/
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F
Sent through the dev mailing list
https://nmap.org/mailman/listinfo/dev
Archived at http://seclists.org/nmap-dev/



--=_alternative 0048D204C12583D6_=
Content-Type: text/html; charset="ISO-8859-2"
Content-Transfer-Encoding: quoted-printable

<span style=3D" font-size:10pt;font-family:sans-serif">Hey,</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I worked on this
some more.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Fixed all of the
<b>memory leaks</b> that were my fault, and the crash that was a result
of a bug in mergeHostSpecificPorts. I took this opportunity to rewrite
the mergeHostSpecificPorts algorithm, so now <b>the results are properly
sorted</b>.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">The disrepancy
between &quot;Scanning X [max N ports]&quot; and &quot;Completed Connect
Scan at X (0 ports max)&quot; should be fixed as well, the totalprobes
value is now properly initialized.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">About the featur=
es
you mentioned:</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">&gt; The &quot;N=
ot
shown: X ports&quot; output for Normal output.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Well, from what
I know, this doesn't always allow you to infer information about all ports
anyway. For example, if you get &quot;Not shown: 3995 closed ports, 514
filtered ports&quot;. Therefore, as long as the counts are calculated corre=
ctly,
I don't think it's necessary to output information about additional scanned
ports, as you can get these from other more verbose outputs.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">&gt; Properly
formed XML output, with changes to the DTD and a &quot;xmloutputversion&quo=
t;
number increase.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I simply output
another scaninfo tag into each host tag. Updated the DTD and xmloutputversi=
on
to 1.05.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">For greppable,
I output it in a format similiar to the ports listing.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">&gt; Combination
of this feature with existing --top-ports/port-ratio and -p options</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">From my testing,
it merges with them properly.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">&gt; Combination
of this feature with CIDR subnetting and IPv4 octet ranges</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Should work just
fine.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">&gt; Use of this
feature along with advanced features like -O --traceroute and -sV</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I tested it with
these options and everything seemed good to me.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">On the topic of
<b>memory usage:</b></span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I wrote it so
that if you do regular scans, the additional memory usage should be very
small - only a scan=5Flists per target group, which is &lt;64 bytes, and
a few pointers here and there. I can't get reproducible heap reports form
valgrind unfortunately, but in one case the new version even allocated
less memory than latest SVN trunk for &quot;nmap scanme.nmap.org&quot;.</sp=
an>
<br><span style=3D" font-size:10pt;font-family:sans-serif">The biggest item
of all is port=5Fmap=5Frev, which is 65536*sizeof(u16) =3D 128 kB. This is =
allocated
for each target that has specific ports (but only for those). Only way
I can think of making this better is sharing those for the whole target
group, but I dunno if it's worth the effort.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Now, on the <b>r=
ationale.</b></span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">A very specific
(real) example when this feature is useful: We are scanning a network,
which has some kind of network appliance that replies to SYNs on port 80
on every unleased IP, but doesn't reply to most other ports at all (not
even with a RST). That means that nmap considers every single IP live,</spa=
n>
<br><span style=3D" font-size:10pt;font-family:sans-serif">but then waits
for a long time when attempting to scan all the other ports. I was scanning
521 IPs, of which 11 were really occupied and active and the 511 others
were the &quot;fakes&quot;.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I was testing
three options: Scan all hosts for all ports that appeared at least once
(marked all=5Fports), write a simple script that calls nmap for each target
(script), and then used the per-target ports (per=5Ftarget).</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">With ping scan,
the results were the following:</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* all=5Fports: 1=
02
seconds</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* per=5Ftarget:
80 seconds</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* script: 60 sec=
onds</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Without ping sca=
n:</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* script: 45 sec=
onds</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* all=5Fports: 38
seconds</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">* per=5Ftarget:
4 seconds</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">My conclusion
is that this feature is useful when you get filtered ports, as these take
a lot of time. Basically, if you only have open and closed ports, scanning
some additional ones is fast and the &quot;union all ports&quot; strategy
is alright. But once you have filtered ports, the waiting quickly gets
bad.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">The script could
be upgraded to be parallel, but then you're reinventing nmap's parallel
engine.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Now I know the
&quot;proper&quot; solution on this network would be to use a brain and
try to discern real and fake machines, but this already gets much faster
results without a need for thinking, which is always nice.</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I understand your
concern about losing &quot;new&quot; services, but I see the main usability
of this in manual scans, for example running additional nse scripts against
your last scan results etc. When you are doing automatic scans (for exmple
as a network admin scanning network for new devices each week), you probably
don't need to care about speed anyway...</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Updated patch
(to svn revision 37611):</span>
<br>
<br>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Looking forward
to further comments and hopefully we can make this work :)</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Jan</span>
<br>
<br>
<br>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Fro=
m:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">Jan
Gocn=EDk/Dcit</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">To:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">&quot;Daniel
Miller&quot; &lt;[email protected]&gt;</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Cc:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">&quot;Nmap-dev&quot;
&lt;[email protected]&gt;</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Dat=
e:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">02.04.2019
23:53</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sub=
ject:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">Re:
Feature: per-target port specification (with patch!)</span>
<br>
<hr noshade>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Hey Dan,</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">thanks for the
reply! It's a shame that I didn't find the GitHub issue you link to before
implementing this, as it does raise a lot of valid concerns.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">First, let me
say that the company I work for wants this feature, so even if it doesn't
end up in upstream, I will try to keep it at least as a fork - as I'll
have to maintain it internally anyway, I wanted to share with the community,
in case others have a need for it as well.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">I will go through
all the things you mentioned (most of the compatibility with other options
should be taken care of, but memory leaks are a problem), fix up the code,
look at maybe getting the memory footprint lower, and try to come up with
some stronger numbers and rationale.</span>
<br>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Jan</span>
<br>
<br>
<br>
<br>
<br>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Fro=
m:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">&quot;Daniel
Miller&quot; &lt;[email protected]&gt;</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">To:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">&quot;Jan
Gocn=EDk&quot; &lt;[email protected]&gt;</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Cc:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">&quot;Nmap-dev&quot;
&lt;[email protected]&gt;</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Dat=
e:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">02.04.2019
21:21</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sub=
ject:
&nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-family=
:sans-serif">Re:
Feature: per-target port specification (with patch!)</span>
<br><span style=3D" font-size:9pt;color:#5f5f5f;font-family:sans-serif">Sent
by: &nbsp; &nbsp; &nbsp; &nbsp;</span><span style=3D" font-size:9pt;font-fa=
mily:sans-serif">&quot;dev&quot;
&lt;[email protected]&gt;</span>
<br>
<hr noshade>
<br>
<br>
<br><span style=3D" font-size:12pt">Some initial notes from building and
testing this:</span>
<br>
<br><span style=3D" font-size:12pt">./nmap </span><a href=3Dhttp://scanme.n=
map.org/><span style=3D" font-size:12pt;color:blue"><u>scanme.nmap.org</u><=
/span></a><span style=3D" font-size:12pt">^22-80
-d<br>
Starting Nmap 7.70SVN ( </span><a href=3Dhttps://nmap.org/><span style=3D" =
font-size:12pt;color:blue"><u>https://nmap.org</u></span></a><span style=3D=
" font-size:12pt">
) at 2019-04-02 18:37 UTC<br>
PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0)<br>
--------------- Timing report ---------------<br>
&nbsp; hostgroups: min 1, max 100000<br>
&nbsp; rtt-timeouts: init 1000, min 100, max 10000<br>
&nbsp; max-scan-delay: TCP 1000, UDP 1000, SCTP 1000<br>
&nbsp; parallelism: min 0, max 0<br>
&nbsp; max-retries: 10, host-timeout: 0<br>
&nbsp; min-rate: 0, max-rate: 0<br>
---------------------------------------------<br>
Initiating Ping Scan at 18:37<br>
Scanning </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size=
:12pt;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-siz=
e:12pt">
(45.33.32.156) [max 2 ports]<br>
Completed Ping Scan at 18:37, 0.09s elapsed (1 total hosts)<br>
Overall sending rates: 24.44 packets / s.<br>
mass=5Frdns: Using DNS server X.X.X.X<br>
Initiating Parallel DNS resolution of 1 host. at 18:37<br>
mass=5Frdns: 0.12s 0/1 [#: 3, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]<br>
Completed Parallel DNS resolution of 1 host. at 18:37, 0.06s elapsed<br>
DNS resolution of 1 IPs took 0.15s. Mode: Async [#: 3, OK: 1, NX: 0, DR:
0, SF: 0, TR: 1, CN: 0]<br>
Initiating Connect Scan at 18:37<br>
Scanning </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size=
:12pt;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-siz=
e:12pt">
(45.33.32.156) [max 1059 ports]<br>
Discovered open port 80/tcp<br>
Discovered open port 22/tcp<br>
Discovered open port 9929/tcp<br>
Discovered open port 31337/tcp<br>
nmap: portlist.cc:688: void PortList::mapPort(u16*, u8*) const: Assertion
`mapped=5Fportno &lt; port=5Flist=5Fcount[mapped=5Fprotocol]' failed.<br>
Aborted (core dumped)</span>
<br>
<br>
<br><span style=3D" font-size:12pt">Valgrind identified some memory leaks.
These were the ones that are definitely from this patch: Portlist::setIdStr=
(),
idstr; PortList::mergeHostSpecificPorts(), new=5Fport=5Fmap and new=5Fport=
=5Fmap=5Frev;</span>
<br>
<br><span style=3D" font-size:12pt">There was also a discrepancy between
the &quot;Scanning X [max N ports]&quot; and &quot;Completed Connect Scan
at X (0 ports max)&quot;, which valgrind says is due to an uninitialized
value, probably GroupScanStats::totalprobes.</span>
<br>
<br><span style=3D" font-size:12pt">Of course, as you noted before, the res=
ults
are not sorted by port number, which we would have to do to ensure predicta=
ble
output that can be compared with previous scans.</span>
<br>
<br><span style=3D" font-size:12pt">IPv6 addresses, CIDR, and IPv4 octet
ranges seem to work fine with this.</span>
<br>
<br><span style=3D" font-size:12pt">With just my one test scan of localhost
and </span><a href=3Dhttp://scanme.nmap.org/><span style=3D" font-size:12pt=
;color:blue"><u>scanme.nmap.org</u></span></a><span style=3D" font-size:12p=
t">
with one unique port each and one port in common, the patched code allocated
an additional 383KB of heap memory. I do not know how this would scale
up or down, and I haven't compared it with a scan that should behave the
same in both cases (for instance, &quot;nmap </span><a href=3Dhttp://192.16=
8.1.0/24><span style=3D" font-size:12pt;color:blue"><u>192.168.1.0/24</u></=
span></a><span style=3D" font-size:12pt">&quot;.</span>
<br>
<br><span style=3D" font-size:12pt">My primary concern remains that repeated
use of this feature will result in missing new services and dropping existi=
ng
ones if they are missed in just one scan. This is more about use case than
about the code, though, so I will defer to users on that.</span>
<br>
<br><span style=3D" font-size:12pt">Dan</span>
<br>
<br><span style=3D" font-size:12pt">On Tue, Apr 2, 2019 at 1:30 PM Daniel
Miller &lt;</span><a href=3Dmailto:[email protected]><span style=3D" f=
ont-size:12pt;color:blue"><u>[email protected]</u></span></a><span sty=
le=3D" font-size:12pt">&gt;
wrote:</span>
<br><span style=3D" font-size:12pt">Jan,</span>
<br>
<br><span style=3D" font-size:12pt">Thanks for this contribution. We've had
many requests for this type of feature in the past, but have elected not
to include it for a variety of reasons. There is an open discussion on
our issue tracker that lays out some of the challenges in correctly impleme=
nting
such a feature: </span><a href=3Dhttp://issues.nmap.org/1217 target=3D=5Fbl=
ank><span style=3D" font-size:12pt;color:blue"><u>http://issues.nmap.org/12=
17</u></span></a>
<br>
<br><span style=3D" font-size:12pt">It looks like your patch has tried to
handle some of these situations, for example the &quot;Ports scanned&quot;
output for Grepable output (and maybe XML, but it didn't look complete
at first glance). If we are to do an actual code review and include this
new feature, we would have to look for a complete solution that can handle
the following situations:</span>
<br>
<br><span style=3D" font-size:12pt">* The &quot;Not shown: X ports&quot;
output for Normal output.</span>
<br><span style=3D" font-size:12pt">* Properly formed XML output, with chan=
ges
to the DTD and a &quot;xmloutputversion&quot; number increase.</span>
<br><span style=3D" font-size:12pt">* Combination of this feature with exis=
ting
--top-ports/port-ratio and -p options</span>
<br><span style=3D" font-size:12pt">* Combination of this feature with CIDR
subnetting and IPv4 octet ranges</span>
<br><span style=3D" font-size:12pt">* Use of this feature along with advanc=
ed
features like -O --traceroute and -sV</span>
<br>
<br><span style=3D" font-size:12pt">Have you done any measurement of scans
before and after adding this feature to determine the actual impact on
scan times and bandwidth? Do you have a bandwidth target for your scans
that Nmap is exceeding right now, and by how much? What does a typical
nmap command line look like, and what performance options have you already
tried?</span>
<br>
<br><span style=3D" font-size:12pt">I look forward to hearing more about
this from you and our other devs and users.</span>
<br>
<br><span style=3D" font-size:12pt">Dan</span>
<br>
<br><span style=3D" font-size:12pt">On Tue, Apr 2, 2019 at 8:07 AM Jan Gocn=
=EDk
&lt;</span><a href=3Dmailto:[email protected] target=3D=5Fblank><span style=3D=
" font-size:12pt;color:blue"><u>[email protected]</u></span></a><span style=3D=
" font-size:12pt">&gt;
wrote:</span>
<br><span style=3D" font-size:10pt;font-family:sans-serif">Hey,</span><span=
 style=3D" font-size:12pt">
<br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
I would like to propose a feature enabling specifying ports for each target
separately.</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Rationale:</span><span style=3D" font-size:12pt"> </span><span style=3D" fo=
nt-size:10pt;font-family:sans-serif"><br>
It often happens that we already have an nmap scan of 200 machines, and
we want to do a service scan on those same machines. Usually that forces
us to scan the whole network for all the ports that appeared at least once.=
</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
That is a big waste of time and bandwidth. What we want to have is essentia=
lly
a rescan-like feature, that would rescan just ports that were found to
be open before.</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
User experience:</span><span style=3D" font-size:12pt"> </span><span style=
=3D" font-size:10pt;font-family:sans-serif"><br>
Everywhere where you could specify a target (-iL file, command line) you
can supply a &quot;target^ports&quot;. It works with all the nmap magic
ranges, so &quot;192.168.1.1-255^22-60&quot; works. The common ports (suppl=
ied
with -p) are scanned on all targets.</span><span style=3D" font-size:12pt">
<br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Implementation details:</span><span style=3D" font-size:12pt"> </span><span=
 style=3D" font-size:10pt;font-family:sans-serif"><br>
I tried to keep it so that if you don't use any &quot;^&quot; in the target=
s,
the code path should remain largely the same, so there should be no regress=
ions.
However, I had to do some tuning in functions that expected they can just
get the number of probes by multiplying common ports by targets.</span><spa=
n style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
There's a small issue, in that the results of the scan are not sorted prope=
rly,
as the target-specific ports get scanned last.</span><span style=3D" font-s=
ize:12pt">
<br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Usage example:</span><span style=3D" font-size:12pt"> </span><span style=3D=
" font-size:10pt;font-family:sans-serif"><br>
=3D=3D=3Dpaste start=3D=3D=3D</span><span style=3D" font-size:12pt"> </span=
><span style=3D" font-size:10pt;font-family:sans-serif"><br>
$ nmap -v -Pn -n -p22 &quot;165.227.141.119^80,443&quot; &quot;40.113.73.59=
^8080&quot;</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Starting Nmap 7.70SVN ( </span><a href=3Dhttps://nmap.org/ target=3D=5Fblan=
k><span style=3D" font-size:10pt;color:blue;font-family:sans-serif"><u>http=
s://nmap.org</u></span></a><span style=3D" font-size:10pt;font-family:sans-=
serif">
) at 2019-04-01 19:46 CEST</span><span style=3D" font-size:12pt"> </span><s=
pan style=3D" font-size:10pt;font-family:sans-serif"><br>
Initiating SYN Stealth Scan at 19:46</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Scanning 2 hosts [max 3 ports/host]</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Discovered open port 22/tcp</span><span style=3D" font-size:12pt"> </span><=
span style=3D" font-size:10pt;font-family:sans-serif"><br>
Discovered open port 80/tcp</span><span style=3D" font-size:12pt"> </span><=
span style=3D" font-size:10pt;font-family:sans-serif"><br>
Discovered open port 443/tcp</span><span style=3D" font-size:12pt"> </span>=
<span style=3D" font-size:10pt;font-family:sans-serif"><br>
Discovered open port 22/tcp</span><span style=3D" font-size:12pt"> </span><=
span style=3D" font-size:10pt;font-family:sans-serif"><br>
Completed SYN Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports
max)</span><span style=3D" font-size:12pt"> </span><span style=3D" font-siz=
e:10pt;font-family:sans-serif"><br>
Nmap scan report for 165.227.141.119</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Host is up (0.0090s latency).</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
PORT &nbsp; &nbsp;STATE SERVICE</span><span style=3D" font-size:12pt"> </sp=
an><span style=3D" font-size:10pt;font-family:sans-serif"><br>
22/tcp &nbsp;open &nbsp;ssh</span><span style=3D" font-size:12pt"> </span><=
span style=3D" font-size:10pt;font-family:sans-serif"><br>
80/tcp &nbsp;open &nbsp;http</span><span style=3D" font-size:12pt"> </span>=
<span style=3D" font-size:10pt;font-family:sans-serif"><br>
443/tcp open &nbsp;https</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Nmap scan report for 40.113.73.59</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Host is up (0.038s latency).</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
PORT &nbsp; &nbsp; STATE &nbsp; &nbsp;SERVICE</span><span style=3D" font-si=
ze:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
22/tcp &nbsp; open &nbsp; &nbsp; ssh</span><span style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
8080/tcp filtered http-proxy</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Read data files from: /home/gocnik/nmap</span><span style=3D" font-size:12p=
t">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Nmap done: 2 IP addresses (2 hosts up) scanned in 1.52 seconds</span><span =
style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Raw packets sent: 6 (264B) | Rcvd:
4 (176B)</span><span style=3D" font-size:12pt"> </span><span style=3D" font=
-size:10pt;font-family:sans-serif"><br>
=3D=3D=3Dpaste end=3D=3D=3D</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
If done the usual way:</span><span style=3D" font-size:12pt"> </span><span =
style=3D" font-size:10pt;font-family:sans-serif"><br>
$ nmap -v -Pn -n -p22,80,443,8080 165.227.141.119 40.113.73.59</span><span =
style=3D" font-size:12pt">
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
[...]</span><span style=3D" font-size:12pt"> </span><span style=3D" font-si=
ze:10pt;font-family:sans-serif"><br>
Raw packets sent: 10 (440B) | Rcvd: 6 (260B)</span><span style=3D" font-siz=
e:12pt">
<br>
<br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
The patch is against svn trunk at this moment (revision 37608).</span><span=
 style=3D" font-size:12pt">
<br>
<br>
<br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
Looking forward to all comments!</span><span style=3D" font-size:12pt"> </s=
pan><span style=3D" font-size:10pt;font-family:sans-serif"><br>
JaGoTu</span><span style=3D" font-size:12pt"> <br>
</span><span style=3D" font-size:10pt;font-family:sans-serif"><br>
P.S.: Sorry if you recieve this e-mail twice, but the previous one apparent=
ly
got caught in a moderation queue or something, as it doesn't show on </span=
><a href=3Dhttp://seclists.org/ target=3D=5Fblank><span style=3D" font-size=
:10pt;color:blue;font-family:sans-serif"><u>seclists.org</u></span></a><spa=
n style=3D" font-size:12pt">
<br>
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F<br>
Sent through the dev mailing list</span><span style=3D" font-size:12pt;colo=
r:blue"><u><br>
</u></span><a href=3Dhttps://nmap.org/mailman/listinfo/dev target=3D=5Fblan=
k><span style=3D" font-size:12pt;color:blue"><u>https://nmap.org/mailman/li=
stinfo/dev</u></span></a><span style=3D" font-size:12pt"><br>
Archived at </span><a href=3D"http://seclists.org/nmap-dev/" target=3D=5Fbl=
ank><span style=3D" font-size:12pt;color:blue"><u>http://seclists.org/nmap-=
dev/</u></span></a><tt><span style=3D" font-size:10pt">=5F=5F=5F=5F=5F=5F=
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F<br>
Sent through the dev mailing list<br>
</span></tt><a href=3Dhttps://nmap.org/mailman/listinfo/dev><tt><span style=
=3D" font-size:10pt">https://nmap.org/mailman/listinfo/dev</span></tt></a><=
tt><span style=3D" font-size:10pt"><br>
Archived at </span></tt><a href=3D"http://seclists.org/nmap-dev/"><tt><span=
 style=3D" font-size:10pt">http://seclists.org/nmap-dev/</span></tt></a>
<br>
<br>
<br>
--=_alternative 0048D204C12583D6_=--
--=_mixed 0048D204C12583D6_=
Content-Type: application/octet-stream; name="nmap_pertarget_37611.patch"
Content-Disposition: attachment; filename="nmap_pertarget_37611.patch"
Content-Transfer-Encoding: base64

SW5kZXg6IE5tYXBPcHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBObWFwT3BzLmgJKHJldmlzaW9uIDM3NjEx
KQorKysgTm1hcE9wcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNTQsNiArMzU0LDcgQEAKICAgaW50
IHhtYXNzY2FuOwogICBib29sIG5vcmVzb2x2ZTsKICAgYm9vbCBub3BvcnRzY2FuOworICBib29s
IG5vY29tbW9ucG9ydHM7CiAgIGJvb2wgYXBwZW5kX291dHB1dDsgLyogQXBwZW5kIHRvIGFueSBv
dXRwdXQgZmlsZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRlICovCiAgIEZJTEUgKmxvZ2ZkW0xPR19O
VU1fRklMRVNdOwogICBGSUxFICpubWFwX3N0ZG91dDsgLyogTm1hcCBzdGFuZGFyZCBvdXRwdXQg
Ki8KQEAgLTM5NCw2ICszOTUsOCBAQAogICBjaGFyICpwb3J0bGlzdDsgLyogUG9ydHMgbGlzdCBz
cGVjaWZpZWQgYnkgdXNlciAqLwogICBjaGFyICpleGNsdWRlX3BvcnRsaXN0OyAvKiBleGNsdWRl
LXBvcnRzIGxpc3Qgc3BlY2lmaWVkIGJ5IHVzZXIgKi8KIAorICBib29sIGFueV90YXJnZXRfc3Bl
Y2lmaWM7CisKICAgbnNvY2tfcHJveHljaGFpbiBwcm94eV9jaGFpbjsKIAogI2lmbmRlZiBOT0xV
QQpJbmRleDogVGFyZ2V0LmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRhcmdldC5jYwkocmV2aXNpb24gMzc2
MTEpCisrKyBUYXJnZXQuY2MJKHdvcmtpbmcgY29weSkKQEAgLTE4Miw2ICsxODIsNyBAQAogICBz
dGF0ZV9yZWFzb25faW5pdCgmcmVhc29uKTsKICAgbWVtc2V0KCZwaW5ncHJvYmUsIDAsIHNpemVv
ZihwaW5ncHJvYmUpKTsKICAgcGluZ3Byb2JlX3N0YXRlID0gUE9SVF9VTktOT1dOOworICB0YXJn
ZXRfcG9ydHMgPSBOVUxMOwogfQogCiAKSW5kZXg6IFRhcmdldC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRh
cmdldC5oCShyZXZpc2lvbiAzNzYxMSkKKysrIFRhcmdldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
MTgsNiArMzE4LDcgQEAKICAgZW51bSBkaXN0X2NhbGNfbWV0aG9kIGRpc3RhbmNlX2NhbGN1bGF0
aW9uX21ldGhvZDsKICAgRmluZ2VyUHJpbnRSZXN1bHRzICpGUFI7IC8qIEZQIHJlc3VsdHMgZ2V0
IGJ5IHRoZSBPUyBzY2FuIHN5c3RlbS4gKi8KICAgUG9ydExpc3QgcG9ydHM7CisgIGNvbnN0IHN0
cnVjdCBzY2FuX2xpc3RzKiB0YXJnZXRfcG9ydHM7CiAKICAgaW50IHdlaXJkX3Jlc3BvbnNlczsg
LyogZWNobyByZXNwb25zZXMgZnJvbSBvdGhlciBhZGRyZXNzZXMsIEllIGEgbmV0d29yayBicm9h
ZGNhc3QgYWRkcmVzcyAqLwogICB1bnNpZ25lZCBpbnQgZmxhZ3M7IC8qIEhPU1RfVU5LTk9XTiwg
SE9TVF9VUCwgb3IgSE9TVF9ET1dOLiAqLwpJbmRleDogVGFyZ2V0R3JvdXAuY2MKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVGFyZ2V0R3JvdXAuY2MJKHJldmlzaW9uIDM3NjExKQorKysgVGFyZ2V0R3JvdXAuY2MJ
KHdvcmtpbmcgY29weSkKQEAgLTgzMSw2ICs4MzEsNyBAQAogVGFyZ2V0R3JvdXA6On5UYXJnZXRH
cm91cCgpIHsKICAgaWYgKHRoaXMtPm5ldGJsb2NrICE9IE5VTEwpCiAgICAgZGVsZXRlIHRoaXMt
Pm5ldGJsb2NrOworICBmcmVlX3NjYW5fbGlzdHMoJmdyb3VwX3BvcnRzKTsKIH0KIAogLyogSW5p
dGlhbGl6ZXMgKG9yIHJlaW5pdGlhbGl6ZXMpIHRoZSBvYmplY3Qgd2l0aCBhIG5ldyBleHByZXNz
aW9uLCBzdWNoCkBAIC04MzksNyArODQwLDI3IEBACiBpbnQgVGFyZ2V0R3JvdXA6OnBhcnNlX2V4
cHIoY29uc3QgY2hhciAqdGFyZ2V0X2V4cHIsIGludCBhZikgewogICBpZiAodGhpcy0+bmV0Ymxv
Y2sgIT0gTlVMTCkKICAgICBkZWxldGUgdGhpcy0+bmV0YmxvY2s7Ci0gIHRoaXMtPm5ldGJsb2Nr
ID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIodGFyZ2V0X2V4cHIsIGFmKTsKKworICBmcmVlX3NjYW5f
bGlzdHMoJmdyb3VwX3BvcnRzKTsKKyAgbWVtc2V0KCZncm91cF9wb3J0cywgMCwgc2l6ZW9mKGdy
b3VwX3BvcnRzKSk7CisKKyAgY29uc3QgY2hhciogcGFyID0gc3RycmNocih0YXJnZXRfZXhwciwg
J14nKTsKKyAgCisKKyAgaWYgKHBhciAhPSBOVUxMKQorICB7CisgICAgby5hbnlfdGFyZ2V0X3Nw
ZWNpZmljID0gdHJ1ZTsKKwkgIGdldHB0cyhwYXIgKyAxLCAmdGhpcy0+Z3JvdXBfcG9ydHMpOwor
CisJICBjaGFyKiBleHByX3dpdGhvdXRfcG9ydHMgPSBta3N0cih0YXJnZXRfZXhwciwgcGFyKTsK
KwkgIHRoaXMtPm5ldGJsb2NrID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIoZXhwcl93aXRob3V0X3Bv
cnRzLCBhZik7CisJICBmcmVlKGV4cHJfd2l0aG91dF9wb3J0cyk7CisgIH0KKyAgZWxzZSB7CisJ
ICB0aGlzLT5uZXRibG9jayA9IE5ldEJsb2NrOjpwYXJzZV9leHByKHRhcmdldF9leHByLCBhZik7
CisgIH0KKworICAKICAgaWYgKHRoaXMtPm5ldGJsb2NrICE9IE5VTEwpCiAgICAgcmV0dXJuIDA7
CiAgIGVsc2UKSW5kZXg6IFRhcmdldEdyb3VwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVGFyZ2V0R3JvdXAu
aAkocmV2aXNpb24gMzc2MTEpCisrKyBUYXJnZXRHcm91cC5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
MzcsNiArMTM3LDcgQEAKIAogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNp
bmNsdWRlICJzY2FuX2xpc3RzLmgiCiAKIGNsYXNzIE5ldEJsb2NrOwogCkBAIC0xNDMsOSArMTQ0
LDExIEBACiBjbGFzcyBUYXJnZXRHcm91cCB7CiBwdWJsaWM6CiAgIE5ldEJsb2NrICpuZXRibG9j
azsKKyAgc3RydWN0IHNjYW5fbGlzdHMgZ3JvdXBfcG9ydHM7CiAKICAgVGFyZ2V0R3JvdXAoKSB7
CiAgICAgdGhpcy0+bmV0YmxvY2sgPSBOVUxMOworICAgIG1lbXNldCgmdGhpcy0+Z3JvdXBfcG9y
dHMsIDAsIHNpemVvZih0aGlzLT5ncm91cF9wb3J0cykpOwogICB9CiAKICAgflRhcmdldEdyb3Vw
KCk7CkluZGV4OiBkb2NzL25tYXAuZHRkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvY3Mvbm1hcC5kdGQJKHJl
dmlzaW9uIDM3NjExKQorKysgZG9jcy9ubWFwLmR0ZAkod29ya2luZyBjb3B5KQpAQCAtMTQzLDcg
KzE0Myw3IEBACiA8IUVMRU1FTlQgaG9zdAkJKCBzdGF0dXMsIGFkZHJlc3MgLCAoYWRkcmVzcyB8
IGhvc3RuYW1lcyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtdXJmIHwgcG9ydHMgfCBv
cyB8IGRpc3RhbmNlIHwgdXB0aW1lIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcHNl
cXVlbmNlIHwgaXBpZHNlcXVlbmNlIHwgdGNwdHNzZXF1ZW5jZSB8Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgIGhvc3RzY3JpcHQgfCB0cmFjZSkqLCB0aW1lcz8gKSA+CisgICAgICAgICAgICAg
ICAgICAgICAgICAgIGhvc3RzY3JpcHQgfCB0cmFjZSB8IHNjYW5pbmZvKSosIHRpbWVzPyApID4K
IDwhQVRUTElTVCBob3N0CiAJCQlzdGFydHRpbWUJJWF0dHJfbnVtZXJpYzsJI0lNUExJRUQKIAkJ
CWVuZHRpbWUJCSVhdHRyX251bWVyaWM7CSNJTVBMSUVECkluZGV4OiBubWFwLmNjCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIG5tYXAuY2MJKHJldmlzaW9uIDM3NjExKQorKysgbm1hcC5jYwkod29ya2luZyBjb3B5
KQpAQCAtMjYwLDYgKzI2MCw4IEBACiAgICAgICAgICAiVEFSR0VUIFNQRUNJRklDQVRJT046XG4i
CiAgICAgICAgICAiICBDYW4gcGFzcyBob3N0bmFtZXMsIElQIGFkZHJlc3NlcywgbmV0d29ya3Ms
IGV0Yy5cbiIKICAgICAgICAgICIgIEV4OiBzY2FubWUubm1hcC5vcmcsIG1pY3Jvc29mdC5jb20v
MjQsIDE5Mi4xNjguMC4xOyAxMC4wLjAtMjU1LjEtMjU0XG4iCisgICAgICAgICAiICBBbHNvIGNh
biBjb250YWluIHBvcnRzIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBpbiBhZGRpdGlvbiB0b1xuIgor
ICAgICAgICAgIiAgY29tbW9uIHBvcnRzLiBFeDogc2Nhbm1lLm5tYXAub3JnXjQ0MywgMTAuMC4w
LTI1NS4xLTI1NF4yMlxuIgogICAgICAgICAgIiAgLWlMIDxpbnB1dGZpbGVuYW1lPjogSW5wdXQg
ZnJvbSBsaXN0IG9mIGhvc3RzL25ldHdvcmtzXG4iCiAgICAgICAgICAiICAtaVIgPG51bSBob3N0
cz46IENob29zZSByYW5kb20gdGFyZ2V0c1xuIgogICAgICAgICAgIiAgLS1leGNsdWRlIDxob3N0
MVssaG9zdDJdWyxob3N0M10sLi4uPjogRXhjbHVkZSBob3N0cy9uZXR3b3Jrc1xuIgpAQCAtMjg1
LDcgKzI4Nyw3IEBACiAgICAgICAgICAiICAtc086IElQIHByb3RvY29sIHNjYW5cbiIKICAgICAg
ICAgICIgIC1iIDxGVFAgcmVsYXkgaG9zdD46IEZUUCBib3VuY2Ugc2NhblxuIgogICAgICAgICAg
IlBPUlQgU1BFQ0lGSUNBVElPTiBBTkQgU0NBTiBPUkRFUjpcbiIKLSAgICAgICAgICIgIC1wIDxw
b3J0IHJhbmdlcz46IE9ubHkgc2NhbiBzcGVjaWZpZWQgcG9ydHNcbiIKKyAgICAgICAgICIgIC1w
IDxwb3J0IHJhbmdlcz46IFNjYW4gc3BlY2lmaWVkIHBvcnRzIG9uIGVhY2ggdGFyZ2V0XG4iCiAg
ICAgICAgICAiICAgIEV4OiAtcDIyOyAtcDEtNjU1MzU7IC1wIFU6NTMsMTExLDEzNyxUOjIxLTI1
LDgwLDEzOSw4MDgwLFM6OVxuIgogICAgICAgICAgIiAgLS1leGNsdWRlLXBvcnRzIDxwb3J0IHJh
bmdlcz46IEV4Y2x1ZGUgdGhlIHNwZWNpZmllZCBwb3J0cyBmcm9tIHNjYW5uaW5nXG4iCiAgICAg
ICAgICAiICAtRjogRmFzdCBtb2RlIC0gU2NhbiBmZXdlciBwb3J0cyB0aGFuIHRoZSBkZWZhdWx0
IHNjYW5cbiIKQEAgLTM4Nyw1MiArMzg5LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBp
bnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QodW5zaWduZWQgc2hvcnQgKm1saXN0LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWVyZ2VkX3BvcnRfY291bnQs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQg
cCkgewotICBpbnQgaTsKLSAgLy8gbWFrZSBzdXJlIHRoZSBwb3J0IGlzbid0IGFscmVhZHkgaW4g
dGhlIGxpc3QKLSAgZm9yIChpID0gMDsgaSA8ICptZXJnZWRfcG9ydF9jb3VudDsgaSsrKSB7Ci0g
ICAgaWYgKG1saXN0W2ldID09IHApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgbWxp
c3RbKm1lcmdlZF9wb3J0X2NvdW50XSA9IHA7Ci0gICgqbWVyZ2VkX3BvcnRfY291bnQpKys7Ci19
CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VfcG9ydF9saXN0cyh1bnNpZ25lZCBzaG9y
dCAqcG9ydF9saXN0MSwgaW50IGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcG9ydF9saXN0MiwgaW50IGNvdW50MiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1lcmdlZF9wb3J0X2NvdW50
KSB7Ci0gIGludCBpOwotICB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VkX3BvcnRfbGlzdCA9IE5VTEw7
CiAKLSAgKm1lcmdlZF9wb3J0X2NvdW50ID0gMDsKLQotICBtZXJnZWRfcG9ydF9saXN0ID0KLSAg
ICAodW5zaWduZWQgc2hvcnQgKikgc2FmZV96YWxsb2MoKGNvdW50MSArIGNvdW50MikgKiBzaXpl
b2YodW5zaWduZWQgc2hvcnQpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsK
LSAgICBpbnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlzdCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX3BvcnRfY291bnQsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBvcnRfbGlzdDFbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7
IGkgPCBjb3VudDI7IGkrKykgewotICAgIGluc2VydF9wb3J0X2ludG9fbWVyZ2VfbGlzdChtZXJn
ZWRfcG9ydF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRfcG9y
dF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9saXN0MltpXSk7
Ci0gIH0KLQotICAvLyBpZiB0aGVyZSB3ZXJlIGR1cGxpY2F0ZSBwb3J0cyB0aGVuIHdlIGNhbiBz
YXZlIHNvbWUgbWVtb3J5Ci0gIGlmICgqbWVyZ2VkX3BvcnRfY291bnQgPCAoY291bnQxICsgY291
bnQyKSkgewotICAgIG1lcmdlZF9wb3J0X2xpc3QgPSAodW5zaWduZWQgc2hvcnQqKQotICAgICAg
ICAgICAgICAgICAgICAgICBzYWZlX3JlYWxsb2MobWVyZ2VkX3BvcnRfbGlzdCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbWVyZ2VkX3BvcnRfY291bnQpICogc2l6ZW9m
KHVuc2lnbmVkIHNob3J0KSk7Ci0gIH0KLQotICByZXR1cm4gbWVyZ2VkX3BvcnRfbGlzdDsKLX0K
LQogdm9pZCB2YWxpZGF0ZV9zY2FuX2xpc3RzKHNjYW5fbGlzdHMgJnBvcnRzLCBObWFwT3BzICZv
KSB7CiAgIGlmIChvLnBpbmd0eXBlID09IFBJTkdUWVBFX1VOS05PV04pIHsKICAgICBpZiAoby5p
c3IwMHQpIHsKQEAgLTE1ODUsMTUgKzE1NDMsMTkgQEAKICAgaWYgKG8ucG9ydGxpc3QgJiYgby5m
YXN0c2NhbikKICAgICBmYXRhbCgiWW91IGNhbm5vdCB1c2UgLUYgKGZhc3Qgc2Nhbikgd2l0aCAt
cCAoZXhwbGljaXQgcG9ydCBzZWxlY3Rpb24pIGJ1dCBzZWUgLS10b3AtcG9ydHMgYW5kIC0tcG9y
dC1yYXRpbyB0byBmYXN0IHNjYW4gYSByYW5nZSBvZiBwb3J0cyIpOwogCisgIAogICBpZiAoby5p
cHByb3RzY2FuKSB7CiAgICAgaWYgKG8ucG9ydGxpc3QpCiAgICAgICBnZXRwdHMoby5wb3J0bGlz
dCwgJnBvcnRzKTsKICAgICBlbHNlCi0gICAgICBnZXRwdHMoKGNoYXIgKikgKG8uZmFzdHNjYW4g
PyAiW1A6MC1dIiA6ICIwLSIpLCAmcG9ydHMpOyAgLy8gRGVmYXVsdCBwcm90b2NvbHMgdG8gc2Nh
bgotICB9IGVsc2UgaWYgKCFvLm5vcG9ydHNjYW4pIHsKKyAgICAgIGdldHB0cygoY2hhciAqKShv
LmZhc3RzY2FuID8gIltQOjAtXSIgOiAiMC0iKSwgJnBvcnRzKTsgIC8vIERlZmF1bHQgcHJvdG9j
b2xzIHRvIHNjYW4KKyAgfQorICBlbHNlIGlmICghby5ub3BvcnRzY2FuKSB7CiAgICAgZ2V0dG9w
cHRzKG8udG9wcG9ydGxldmVsLCBvLnBvcnRsaXN0LCAmcG9ydHMsIG8uZXhjbHVkZV9wb3J0bGlz
dCk7CiAgIH0KKyAgCiAKKwogICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHVz
ZSB0aGUgY29tbW9uIGxpc3AgcG9ydCBzcGVjIHRlc3Qgc3VpdGUKICAgLy9wcmludGYoInBvcnQg
c3BlYzogKCVkICVkICVkICVkKVxuIiwgcG9ydHMudGNwX2NvdW50LCBwb3J0cy51ZHBfY291bnQs
IHBvcnRzLnNjdHBfY291bnQsIHBvcnRzLnByb3RfY291bnQpOyBleGl0KDApOwogCkBAIC0xNjY0
LDE2ICsxNjI2LDE5IEBACiAgICAqIChzdWNoIGFzIE9TIGlkZW50IHNjYW4pIG1pZ2h0IGJyZWFr
IGNhdXNlIG5vIHBvcnRzIHdlcmUgc3BlY2lmaWVkLCAgYnV0CiAgICAqIHdlJ3ZlIGdpdmVuIG91
ciB3YXJuaW5nLi4uCiAgICAqLwotICBpZiAoKG8uVENQU2NhbigpKSAmJiBwb3J0cy50Y3BfY291
bnQgPT0gMCkKLSAgICBlcnJvcigiV0FSTklORzogYSBUQ1Agc2NhbiB0eXBlIHdhcyByZXF1ZXN0
ZWQsIGJ1dCBubyB0Y3AgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0aGlzIHNjYW4g
dHlwZS4iKTsKLSAgaWYgKG8uU0NUUFNjYW4oKSAmJiBwb3J0cy5zY3RwX2NvdW50ID09IDApCi0g
ICAgZXJyb3IoIldBUk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3RlZCwgYnV0IG5v
IHNjdHAgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0aGlzIHNjYW4gdHlwZS4iKTsK
LSAgaWYgKG8uVURQU2NhbigpICYmIHBvcnRzLnVkcF9jb3VudCA9PSAwKQotICAgIGVycm9yKCJX
QVJOSU5HOiBVRFAgc2NhbiB3YXMgcmVxdWVzdGVkLCBidXQgbm8gdWRwIHBvcnRzIHdlcmUgc3Bl
Y2lmaWVkLiAgU2tpcHBpbmcgdGhpcyBzY2FuIHR5cGUuIik7Ci0gIGlmIChvLmlwcHJvdHNjYW4g
JiYgcG9ydHMucHJvdF9jb3VudCA9PSAwKQotICAgIGVycm9yKCJXQVJOSU5HOiBwcm90b2NvbCBz
Y2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBubyBwcm90b2NvbHMgd2VyZSBzcGVjaWZpZWQgdG8gYmUg
c2Nhbm5lZC4gIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBlLiIpOworICBpZiAoIW8ubm9jb21tb25w
b3J0cykKKyAgeworICAgIGlmICgoby5UQ1BTY2FuKCkpICYmIHBvcnRzLnRjcF9jb3VudCA9PSAw
KQorICAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHNjYW4gdHlwZSB3YXMgcmVxdWVzdGVkLCBi
dXQgbm8gY29tbW9uIHRjcCBwb3J0cyB3ZXJlIHNwZWNpZmllZC4gVW5sZXNzIHlvdSBzcGVjaWZp
ZWQgcGVyLXRhcmdldCBwb3J0cywgdGhlIHNjYW4gd2lsbCBiZSB1c2VsZXNzLiIpOworICAgIGlm
IChvLlNDVFBTY2FuKCkgJiYgcG9ydHMuc2N0cF9jb3VudCA9PSAwKQorICAgICAgZXJyb3IoIldB
Uk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3RlZCwgYnV0IG5vIGNvbW1vbiBzY3Rw
IHBvcnRzIHdlcmUgc3BlY2lmaWVkLiBVbmxlc3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBv
cnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxlc3MuIik7CisgICAgaWYgKG8uVURQU2NhbigpICYm
IHBvcnRzLnVkcF9jb3VudCA9PSAwKQorICAgICAgZXJyb3IoIldBUk5JTkc6IFVEUCBzY2FuIHdh
cyByZXF1ZXN0ZWQsIGJ1dCBubyBjb21tb24gdWRwIHBvcnRzIHdlcmUgc3BlY2lmaWVkLiBVbmxl
c3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxl
c3MuIik7CisgICAgaWYgKG8uaXBwcm90c2NhbiAmJiBwb3J0cy5wcm90X2NvdW50ID09IDApCisg
ICAgICBlcnJvcigiV0FSTklORzogcHJvdG9jb2wgc2NhbiB3YXMgcmVxdWVzdGVkLCBidXQgbm8g
Y29tbW9uIHByb3RvY29scyB3ZXJlIHNwZWNpZmllZCB0byBiZSBzY2FubmVkLiBVbmxlc3MgeW91
IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxlc3MuIik7
CisgIH0KIAotICBpZiAoby5waW5ndHlwZSAmIFBJTkdUWVBFX1RDUCAmJiBwb3J0cy5zeW5fcGlu
Z19jb3VudCtwb3J0cy5hY2tfcGluZ19jb3VudCA9PSAwKQorICBpZiAoby5waW5ndHlwZSAmIFBJ
TkdUWVBFX1RDUCAmJiBwb3J0cy5zeW5fcGluZ19jb3VudCArIHBvcnRzLmFja19waW5nX2NvdW50
ID09IDApCiAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHBpbmcgc2NhbiB3YXMgcmVxdWVzdGVk
LCBidXQgYWZ0ZXIgZXhjbHVkaW5nIHJlcXVlc3RlZCBUQ1AgcG9ydHMsIG5vbmUgcmVtYWluLiBT
a2lwcGluZyB0aGlzIHNjYW4gdHlwZS4iKTsKICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9V
RFAgJiYgcG9ydHMudWRwX3BpbmdfY291bnQgPT0gMCkKICAgICBlcnJvcigiV0FSTklORzogYSBV
RFAgcGluZyBzY2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBhZnRlciBleGNsdWRpbmcgcmVxdWVzdGVk
IFVEUCBwb3J0cywgbm9uZSByZW1haW4uIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBlLiIpOwpAQCAt
MTc4Myw3ICsxNzQ4LDcgQEAKIC8vIEZyZWUgc29tZSBnbG9iYWwgbWVtb3J5IGFsbG9jYXRpb25z
LgogLy8gVGhpcyBpcyB1c2VkIGZvciBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLgogdm9pZCBubWFw
X2ZyZWVfbWVtKCkgewotICBQb3J0TGlzdDo6ZnJlZVBvcnRNYXAoKTsKKyAgUG9ydExpc3Q6OmZy
ZWVDb21tb25Qb3J0TWFwKCk7CiAgIGNwX2ZyZWUoKTsKICAgZnJlZV9zZXJ2aWNlcygpOwogICBB
bGxQcm9iZXM6OnNlcnZpY2Vfc2Nhbl9mcmVlKCk7CkBAIC0xOTQ3LDcgKzE5MTIsNyBAQAogICAv
KiBCZWZvcmUgd2UgcmFuZG9taXplIHRoZSBwb3J0cyBzY2FubmVkLCBsZXRzIG91dHB1dCB0aGVt
IHRvIG1hY2hpbmUKICAgICAgcGFyc2VhYmxlIG91dHB1dCAqLwogICBpZiAoby52ZXJib3NlKQot
ICAgIG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoJnBvcnRzKTsKKyAg
ICBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dCgmcG9ydHMp
OwogCiAjaWYgZGVmaW5lZChIQVZFX1NJR05BTCkgJiYgZGVmaW5lZChTSUdQSVBFKQogICBzaWdu
YWwoU0lHUElQRSwgU0lHX0lHTik7IC8qIGlnbm9yZSBTSUdQSVBFIHNvIG91ciBwcm9ncmFtIGRv
ZXNuJ3QgY3Jhc2ggYmVjYXVzZQpAQCAtMTk3NiwxMyArMTk0MSwxMyBAQAogCiAgIC8qIEJlZm9y
ZSB3ZSByYW5kb21pemUgdGhlIHBvcnRzIHNjYW5uZWQsIHdlIG11c3QgaW5pdGlhbGl6ZSBQb3J0
TGlzdCBjbGFzcy4gKi8KICAgaWYgKG8uaXBwcm90c2NhbikKLSAgICBQb3J0TGlzdDo6aW5pdGlh
bGl6ZVBvcnRNYXAoSVBQUk9UT19JUCwgIHBvcnRzLnByb3RzLCBwb3J0cy5wcm90X2NvdW50KTsK
KyAgICBQb3J0TGlzdDo6aW5pdGlhbGl6ZUNvbW1vblBvcnRNYXAoSVBQUk9UT19JUCwgIHBvcnRz
LnByb3RzLCBwb3J0cy5wcm90X2NvdW50KTsKICAgaWYgKG8uVENQU2NhbigpKQotICAgIFBvcnRM
aXN0Ojppbml0aWFsaXplUG9ydE1hcChJUFBST1RPX1RDUCwgcG9ydHMudGNwX3BvcnRzLCBwb3J0
cy50Y3BfY291bnQpOworICAgIFBvcnRMaXN0Ojppbml0aWFsaXplQ29tbW9uUG9ydE1hcChJUFBS
T1RPX1RDUCwgcG9ydHMudGNwX3BvcnRzLCBwb3J0cy50Y3BfY291bnQpOwogICBpZiAoby5VRFBT
Y2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxpemVQb3J0TWFwKElQUFJPVE9fVURQLCBwb3J0
cy51ZHBfcG9ydHMsIHBvcnRzLnVkcF9jb3VudCk7CisgICAgUG9ydExpc3Q6OmluaXRpYWxpemVD
b21tb25Qb3J0TWFwKElQUFJPVE9fVURQLCBwb3J0cy51ZHBfcG9ydHMsIHBvcnRzLnVkcF9jb3Vu
dCk7CiAgIGlmIChvLlNDVFBTY2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxpemVQb3J0TWFw
KElQUFJPVE9fU0NUUCwgcG9ydHMuc2N0cF9wb3J0cywgcG9ydHMuc2N0cF9jb3VudCk7CisgICAg
UG9ydExpc3Q6OmluaXRpYWxpemVDb21tb25Qb3J0TWFwKElQUFJPVE9fU0NUUCwgcG9ydHMuc2N0
cF9wb3J0cywgcG9ydHMuc2N0cF9jb3VudCk7CiAKICAgaWYgKG8ucmFuZG9taXplX3BvcnRzKSB7
CiAgICAgaWYgKHBvcnRzLnRjcF9jb3VudCkgewpAQCAtMjA0Nyw2ICsyMDEyLDcgQEAKICAgICAg
IGlmICghY3VycmVudGhzKQogICAgICAgICBicmVhazsKIAorCiAgICAgICBpZiAoY3VycmVudGhz
LT5mbGFncyAmIEhPU1RfVVAgJiYgIW8ubGlzdHNjYW4pCiAgICAgICAgIG8ubnVtaG9zdHNfdXAr
KzsKIApAQCAtMjE4NywxMiArMjE1MywxOSBAQAogICAgICAgLyogVGhlc2UgbGFtZSBmdW5jdGlv
bnMgY2FuIG9ubHkgaGFuZGxlIG9uZSB0YXJnZXQgYXQgYSB0aW1lICovCiAgICAgICBpZiAoby5p
ZGxlc2NhbikgewogICAgICAgICBmb3IgKHRhcmdldG5vID0gMDsgdGFyZ2V0bm8gPCBUYXJnZXRz
LnNpemUoKTsgdGFyZ2V0bm8rKykgeworICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICogbWVyZ2Vk
X3RjcF9wb3J0cyA9IE5VTEw7CisgICAgICAgICAgaW50IG1lcmdlZF90Y3BfcG9ydHNfY291bnQg
PSAwOworICAgICAgICAgIG1lcmdlZF90Y3BfcG9ydHMgPSBtZXJnZV9wb3J0X2xpc3RzKHBvcnRz
LnRjcF9wb3J0cywgcG9ydHMudGNwX2NvdW50LCBUYXJnZXRzW3RhcmdldG5vXS0+dGFyZ2V0X3Bv
cnRzLT50Y3BfcG9ydHMsIFRhcmdldHNbdGFyZ2V0bm9dLT50YXJnZXRfcG9ydHMtPnRjcF9jb3Vu
dCwgJm1lcmdlZF90Y3BfcG9ydHNfY291bnQpOwogICAgICAgICAgIG8uY3VycmVudF9zY2FudHlw
ZSA9IElETEVfU0NBTjsKICAgICAgICAgICBrZXlXYXNQcmVzc2VkKCk7IC8vIENoZWNrIGlmIGEg
c3RhdHVzIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQKLSAgICAgICAgICBpZGxlX3NjYW4oVGFy
Z2V0c1t0YXJnZXRub10sIHBvcnRzLnRjcF9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgcG9y
dHMudGNwX2NvdW50LCBvLmlkbGVQcm94eSwgJnBvcnRzKTsKKworICAgICAgICAgIC8vVGhlIHBv
cnRzIHN0cnVjdHVyZSBhdCB0aGUgZW5kIGlzIG9ubHkgdXNlZCBmb3IgcHJvYmluZyB0aGUgcHJv
eHksIHNvIHdlIGRvbid0IG5lZWQgdG8gbWVyZ2UgdGhhdC4KKyAgICAgICAgICBpZGxlX3NjYW4o
VGFyZ2V0c1t0YXJnZXRub10sIG1lcmdlZF90Y3BfcG9ydHMsCisgICAgICAgICAgICAgICAgICAg
IG1lcmdlZF90Y3BfcG9ydHNfY291bnQsIG8uaWRsZVByb3h5LCAmcG9ydHMpOworICAgICAgICAg
IGZyZWUobWVyZ2VkX3RjcF9wb3J0cyk7CiAgICAgICAgIH0KICAgICAgIH0KKwogICAgICAgaWYg
KG8uYm91bmNlc2NhbikgewogICAgICAgICBmb3IgKHRhcmdldG5vID0gMDsgdGFyZ2V0bm8gPCBU
YXJnZXRzLnNpemUoKTsgdGFyZ2V0bm8rKykgewogICAgICAgICAgIG8uY3VycmVudF9zY2FudHlw
ZSA9IEJPVU5DRV9TQ0FOOwpAQCAtMjIwMCw3ICsyMTczLDEzIEBACiAgICAgICAgICAgaWYgKGZ0
cC5zZCA8PSAwKQogICAgICAgICAgICAgZnRwX2Fub25fY29ubmVjdCgmZnRwKTsKICAgICAgICAg
ICBpZiAoZnRwLnNkID4gMCkKLSAgICAgICAgICAgIGJvdW5jZV9zY2FuKFRhcmdldHNbdGFyZ2V0
bm9dLCBwb3J0cy50Y3BfcG9ydHMsIHBvcnRzLnRjcF9jb3VudCwgJmZ0cCk7CisgICAgICAgICAg
eworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKiBtZXJnZWRfdGNwX3BvcnRzID0gTlVMTDsK
KyAgICAgICAgICAgIGludCBtZXJnZWRfdGNwX3BvcnRzX2NvdW50ID0gMDsKKyAgICAgICAgICAg
IG1lcmdlZF90Y3BfcG9ydHMgPSBtZXJnZV9wb3J0X2xpc3RzKHBvcnRzLnRjcF9wb3J0cywgcG9y
dHMudGNwX2NvdW50LCBUYXJnZXRzW3RhcmdldG5vXS0+dGFyZ2V0X3BvcnRzLT50Y3BfcG9ydHMs
IFRhcmdldHNbdGFyZ2V0bm9dLT50YXJnZXRfcG9ydHMtPnRjcF9jb3VudCwgJm1lcmdlZF90Y3Bf
cG9ydHNfY291bnQpOworICAgICAgICAgICAgYm91bmNlX3NjYW4oVGFyZ2V0c1t0YXJnZXRub10s
IG1lcmdlZF90Y3BfcG9ydHMsIG1lcmdlZF90Y3BfcG9ydHNfY291bnQsICZmdHApOworICAgICAg
ICAgICAgZnJlZShtZXJnZWRfdGNwX3BvcnRzKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAg
ICAgIH0KIApJbmRleDogbm1hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5tYXAuaAkocmV2aXNpb24gMzc2
MTEpCisrKyBubWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgZWFy
bGllcikgdGhhbiBOTUFQX1ZFUlNJT04uICovCiAjZGVmaW5lIE5NQVBfVVBEQVRFX0NIQU5ORUwg
IjcuNzAiCiAKLSNkZWZpbmUgTk1BUF9YTUxPVVRQVVRWRVJTSU9OICIxLjA0IgorI2RlZmluZSBO
TUFQX1hNTE9VVFBVVFZFUlNJT04gIjEuMDUiCiAKIC8qIFVzZXIgY29uZmlndXJhYmxlICNkZWZp
bmVzOiAqLwogI2RlZmluZSBNQVhfUFJPQkVfUE9SVFMgMTAgICAgIC8qIEhvdyBtYW55IFRDUCBw
cm9iZSBwb3J0cyBhcmUgYWxsb3dlZCA/ICovCkluZGV4OiBvdXRwdXQuY2MKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gb3V0cHV0LmNjCShyZXZpc2lvbiAzNzYxMSkKKysrIG91dHB1dC5jYwkod29ya2luZyBjb3B5
KQpAQCAtODc4LDYgKzg3OCw5IEBACiAgIHhtbF9lbmRfdGFnKCk7IC8qIHBvcnRzICovCiAgIHht
bF9uZXdsaW5lKCk7CiAKKyAgCisgICAgCisKICAgaWYgKG8uZGVmZWF0X3JzdF9yYXRlbGltaXQg
JiYgby5UQ1BTY2FuKCkgJiYgcGxpc3QtPmdldFN0YXRlQ291bnRzKFBPUlRfRklMVEVSRUQpID4g
MCkgewogICAgIGxvZ193cml0ZShMT0dfUExBSU4sICJTb21lIGNsb3NlZCBwb3J0cyBtYXkgYmUg
cmVwb3J0ZWQgYXMgZmlsdGVyZWQgZHVlIHRvIC0tZGVmZWF0LXJzdC1yYXRlbGltaXRcbiIpOwog
ICB9CkBAIC0xMTcxLDEyICsxMTc0LDEyIEBACiAvKiBPdXRwdXQgdGhlIGxpc3Qgb2YgcG9ydHMg
c2Nhbm5lZCB0byB0aGUgdG9wIG9mIG1hY2hpbmUgcGFyc2VhYmxlCiAgICBsb2dzIChpbiBhIGNv
bW1lbnQsIHVuZm9ydHVuYXRlbHkpLiAgVGhlIGl0ZW1zIGluIHBvcnRzIHNob3VsZCBiZQogICAg
aW4gc2VxdWVudGlhbCBvcmRlciBmb3Igc3BhY2Ugc2F2aW5ncyBhbmQgZWFzaWVyIHRvIHJlYWQg
b3V0cHV0ICovCi12b2lkIG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQo
c3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKSB7Cit2b2lkIG91dHB1dF9wb3J0c190b19tYWNoaW5l
X3BhcnNlYWJsZV9vdXRwdXQoY29uc3Qgc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKSB7CiAgIGlu
dCB0Y3Bwb3J0c3NjYW5uZWQgPSBwb3J0cy0+dGNwX2NvdW50OwogICBpbnQgdWRwcG9ydHNzY2Fu
bmVkID0gcG9ydHMtPnVkcF9jb3VudDsKICAgaW50IHNjdHBwb3J0c3NjYW5uZWQgPSBwb3J0cy0+
c2N0cF9jb3VudDsKICAgaW50IHByb3Rzc2Nhbm5lZCA9IHBvcnRzLT5wcm90X2NvdW50OwotICBs
b2dfd3JpdGUoTE9HX01BQ0hJTkUsICIjIFBvcnRzIHNjYW5uZWQ6IFRDUCglZDsiLCB0Y3Bwb3J0
c3NjYW5uZWQpOworICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICJUQ1AoJWQ7IiwgdGNwcG9ydHNz
Y2FubmVkKTsKICAgaWYgKHRjcHBvcnRzc2Nhbm5lZCkKICAgICBvdXRwdXRfcmFuZ2VsaXN0X2dp
dmVuX3BvcnRzKExPR19NQUNISU5FLCBwb3J0cy0+dGNwX3BvcnRzLCB0Y3Bwb3J0c3NjYW5uZWQp
OwogICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICIpIFVEUCglZDsiLCB1ZHBwb3J0c3NjYW5uZWQp
OwpAQCAtMTE4OSw5ICsxMTkyLDI2IEBACiAgIGlmIChwcm90c3NjYW5uZWQpCiAgICAgb3V0cHV0
X3JhbmdlbGlzdF9naXZlbl9wb3J0cyhMT0dfTUFDSElORSwgcG9ydHMtPnByb3RzLCBwcm90c3Nj
YW5uZWQpOwogICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICIpXG4iKTsKK30KKworLyogT3V0cHV0
IHRoZSBsaXN0IG9mIHBvcnRzIHNjYW5uZWQgdG8gdGhlIHRvcCBvZiBtYWNoaW5lIHBhcnNlYWJs
ZQorbG9ncyAoaW4gYSBjb21tZW50LCB1bmZvcnR1bmF0ZWx5KS4gIFRoZSBpdGVtcyBpbiBwb3J0
cyBzaG91bGQgYmUKK2luIHNlcXVlbnRpYWwgb3JkZXIgZm9yIHNwYWNlIHNhdmluZ3MgYW5kIGVh
c2llciB0byByZWFkIG91dHB1dCAqLwordm9pZCBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hp
bmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpCit7CisgIGxvZ193
cml0ZShMT0dfTUFDSElORSwgIiMgUG9ydHMgc2Nhbm5lZCA6ICIpOworICBvdXRwdXRfcG9ydHNf
dG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KHBvcnRzKTsKICAgbG9nX2ZsdXNoX2FsbCgpOwog
fQogCit2b2lkIG91dHB1dF90YXJnZXRfcG9ydHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0
KFRhcmdldCAqY3VycmVudGhzKSB7CisgIGlmIChjdXJyZW50aHMtPnRhcmdldF9wb3J0cy0+dGNw
X2NvdW50ID09IDAgJiYgY3VycmVudGhzLT50YXJnZXRfcG9ydHMtPnVkcF9jb3VudCA9PSAwICYm
IGN1cnJlbnRocy0+dGFyZ2V0X3BvcnRzLT5zY3RwX2NvdW50ID09IDAgJiYgY3VycmVudGhzLT50
YXJnZXRfcG9ydHMtPnByb3RfY291bnQgPT0gMCkKKyAgICByZXR1cm47CisgIGxvZ193cml0ZShM
T0dfTUFDSElORSwgIkhvc3Q6ICVzICglcylcdEFkZGl0aW9uYWwgcG9ydHMgc2Nhbm5lZDogIiwK
KyAgICBjdXJyZW50aHMtPnRhcmdldGlwc3RyKCksIGN1cnJlbnRocy0+SG9zdE5hbWUoKSk7Cisg
IG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoY3VycmVudGhzLT50YXJn
ZXRfcG9ydHMpOworfQorCiAvLyBBIHNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvc2Nhbmlu
Zm8gaGFuZGxlcyB0aGUgYzE0biBvZiBvLnNjYW5mbGFncwogc3RhdGljIHZvaWQgZG9zY2FuZmxh
Z3MoKSB7CiAgIHN0cnVjdCB7CkBAIC0xMjc0LDcgKzEyOTQsNyBAQAogLyogU2ltaWxhciB0byBv
dXRwdXRfcG9ydHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0LCB0aGlzIGZ1bmN0aW9uCiAg
ICBvdXRwdXRzIHRoZSBYTUwgdmVyc2lvbiwgd2hpY2ggaXMgc2NhbmluZm8gcmVjb3JkcyBvZiBl
YWNoIHNjYW4KICAgIHJlcXVlc3RlZCBhbmQgdGhlIHBvcnRzIHdoaWNoIGl0IHdpbGwgc2NhbiBm
b3IgKi8KLXZvaWQgb3V0cHV0X3htbF9zY2FuaW5mb19yZWNvcmRzKHN0cnVjdCBzY2FuX2xpc3Rz
ICpzY2FubGlzdCkgewordm9pZCBvdXRwdXRfeG1sX3NjYW5pbmZvX3JlY29yZHMoY29uc3Qgc3Ry
dWN0IHNjYW5fbGlzdHMgKnNjYW5saXN0KSB7CiAgIGlmIChvLnN5bnNjYW4pCiAgICAgZG9zY2Fu
aW5mbygic3luIiwgInRjcCIsIHNjYW5saXN0LT50Y3BfcG9ydHMsIHNjYW5saXN0LT50Y3BfY291
bnQpOwogICBpZiAoby5hY2tzY2FuKQpAQCAtMTM2MSw2ICsxMzgxLDggQEAKICAgICB4bWxfZW5k
X3RhZygpOwogICAgIHhtbF9uZXdsaW5lKCk7CiAgIH0KKyAgeG1sX25ld2xpbmUoKTsKKyAgb3V0
cHV0X3htbF9zY2FuaW5mb19yZWNvcmRzKGN1cnJlbnRocy0+dGFyZ2V0X3BvcnRzKTsKICAgbG9n
X2ZsdXNoX2FsbCgpOwogfQogCkBAIC0xNDY1LDYgKzE0ODcsOCBAQAogICAgIGxvZ193cml0ZShM
T0dfUExBSU4sICJyRE5TIHJlY29yZCBmb3IgJXM6ICVzXG4iLAogICAgICAgY3VycmVudGhzLT50
YXJnZXRpcHN0cigpLCBjdXJyZW50aHMtPkhvc3ROYW1lKCkpOwogICB9CisKKyAgb3V0cHV0X3Rh
cmdldF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoY3VycmVudGhzKTsKIH0KIAog
LyogV3JpdGVzIGhvc3Qgc3RhdHVzIGluZm8gdG8gdGhlIGxvZyBzdHJlYW1zIChpbmNsdWRpbmcg
U1RET1VUKS4gIEFuCkluZGV4OiBvdXRwdXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBvdXRwdXQuaAkocmV2
aXNpb24gMzc2MTEpCisrKyBvdXRwdXQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMwLDEwICsyMzAs
MTYgQEAKICAgIGl0IGFscmVhZHkgZXhpc3RzLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qs
IGl0IHdpbGwgYmUgY3JlYXRlZCAqLwogaW50IGxvZ19vcGVuKGludCBsb2d0LCBib29sIGFwcGVu
ZCwgY2hhciAqZmlsZW5hbWUpOwogCi0vKiBPdXRwdXQgdGhlIGxpc3Qgb2YgcG9ydHMgc2Nhbm5l
ZCB0byB0aGUgdG9wIG9mIG1hY2hpbmUgcGFyc2VhYmxlCisKKy8qIE91dHB1dCB0aGUgbGlzdCBv
ZiBwb3J0cyBzY2FubmVkIGZvciB0aGlzIHNwZWNpZmljIHRhcmdldAorICAgdG8gbWFjaGluZSBw
YXJzZWFibGUgbG9ncyAgV2hlbiB1c2luZyBwZXItdGFyZ2V0IHBvcnRzLCB0aGlzIGluZm9ybWF0
aW9uCisgICBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gcG9ydHMgdXNlZCBpbiBhIHJlZ3VsYXIgc2Nh
biwgc28gaXQncyBub3QgYSBjb21tZW50LiovCit2b2lkIG91dHB1dF90YXJnZXRfcG9ydHNfdG9f
bWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KFRhcmdldCAqY3VycmVudGhzKTsKKworLyogT3V0cHV0
IHRoZSBsaXN0IG9mIGNvbW1vbiBwb3J0cyBzY2FubmVkIHRvIHRoZSB0b3Agb2YgbWFjaGluZSBw
YXJzZWFibGUKICAgIGxvZ3MgKGluIGEgY29tbWVudCwgdW5mb3J0dW5hdGVseSkuICBUaGUgaXRl
bXMgaW4gcG9ydHMgc2hvdWxkIGJlCiAgICBpbiBzZXF1ZW50aWFsIG9yZGVyIGZvciBzcGFjZSBz
YXZpbmdzIGFuZCBlYXNpZXIgdG8gcmVhZCBvdXRwdXQgKi8KLXZvaWQgb3V0cHV0X3BvcnRzX3Rv
X21hY2hpbmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpOwordm9p
ZCBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qg
c2Nhbl9saXN0cyAqcG9ydHMpOwogCiAvKiBSZXR1cm4gYSBzdGQ6OnN0cmluZyBjb250YWluaW5n
IGFsbCBuIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UsIGFuZAogICAgaW5kaXZpZHVh
bGx5IHF1b3RlZCBpZiBuZWVkZWQuICovCkBAIC0yNDIsNyArMjQ4LDcgQEAKIC8qIFNpbWlsYXIg
dG8gb3V0cHV0X3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1dCwgdGhpcyBmdW5jdGlv
bgogICAgb3V0cHV0cyB0aGUgWE1MIHZlcnNpb24sIHdoaWNoIGlzIHNjYW5pbmZvIHJlY29yZHMg
b2YgZWFjaCBzY2FuCiAgICByZXF1ZXN0ZWQgYW5kIHRoZSBwb3J0cyB3aGljaCBpdCB3aWxsIHNj
YW4gZm9yICovCi12b2lkIG91dHB1dF94bWxfc2NhbmluZm9fcmVjb3JkcyhzdHJ1Y3Qgc2Nhbl9s
aXN0cyAqcG9ydHMpOwordm9pZCBvdXRwdXRfeG1sX3NjYW5pbmZvX3JlY29yZHMoY29uc3Qgc3Ry
dWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKIAogLyogV3JpdGVzIGEgaGVhZGluZyBmb3IgYSBmdWxs
IHNjYW4gcmVwb3J0ICgiTm1hcCBzY2FuIHJlcG9ydCBmb3IuLi4iKSwKICAgIGluY2x1ZGluZyBo
b3N0IHN0YXR1cyBhbmQgRE5TIHJlY29yZHMuICovCkluZGV4OiBwb3J0bGlzdC5jYwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBwb3J0bGlzdC5jYwkocmV2aXNpb24gMzc2MTEpCisrKyBwb3J0bGlzdC5jYwkod29y
a2luZyBjb3B5KQpAQCAtNDcxLDEzICs0NzEsMTggQEAKICAgbWVtc2V0KHBvcnRfbGlzdCwgMCwg
c2l6ZW9mKHBvcnRfbGlzdCkpOwogCiAgIGZvcihwcm90bz0wOyBwcm90byA8IFBPUlRMSVNUX1BS
T1RPX01BWDsgcHJvdG8rKykgewotICAgIGlmKHBvcnRfbGlzdF9jb3VudFtwcm90b10gPiAwKQot
ICAgICAgcG9ydF9saXN0W3Byb3RvXSA9IChQb3J0KiopIHNhZmVfemFsbG9jKHNpemVvZihQb3J0
KikqcG9ydF9saXN0X2NvdW50W3Byb3RvXSk7CisgICAgaWYoY29tbW9uX3BvcnRfbGlzdF9jb3Vu
dFtwcm90b10gPiAwKQorICAgICAgcG9ydF9saXN0W3Byb3RvXSA9IChQb3J0KiopIHNhZmVfemFs
bG9jKHNpemVvZihQb3J0KikqY29tbW9uX3BvcnRfbGlzdF9jb3VudFtwcm90b10pOwogICAgIGRl
ZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10ucHJvdG8gPSBQT1JUTElTVFBST1RPMklOUFJPVE8ocHJv
dG8pOwogICAgIGRlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10ucmVhc29uLnJlYXNvbl9pZCA9IEVS
X05PUkVTUE9OU0U7Ci0gICAgc3RhdGVfY291bnRzX3Byb3RvW3Byb3RvXVtkZWZhdWx0X3BvcnRf
c3RhdGVbcHJvdG9dLnN0YXRlXSA9IHBvcnRfbGlzdF9jb3VudFtwcm90b107CisgICAgc3RhdGVf
Y291bnRzX3Byb3RvW3Byb3RvXVtkZWZhdWx0X3BvcnRfc3RhdGVbcHJvdG9dLnN0YXRlXSA9IGNv
bW1vbl9wb3J0X2xpc3RfY291bnRbcHJvdG9dOworCisgICAgcG9ydF9tYXBbcHJvdG9dID0gY29t
bW9uX3BvcnRfbWFwW3Byb3RvXTsKKyAgICBwb3J0X21hcF9yZXZbcHJvdG9dID0gY29tbW9uX3Bv
cnRfbWFwX3Jldltwcm90b107CisgICAgcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IGNvbW1vbl9w
b3J0X2xpc3RfY291bnRbcHJvdG9dOwogICB9CiAKKwogICBudW1zY3JpcHRyZXN1bHRzID0gMDsK
ICAgaWRzdHIgPSBOVUxMOwogfQpAQCAtNTAxLDYgKzUwNiwxNCBAQAogICAgICAgfQogICAgICAg
ZnJlZShwb3J0X2xpc3RbcHJvdG9dKTsKICAgICB9CisgICAgaWYocG9ydF9tYXBbcHJvdG9dICYm
IHBvcnRfbWFwW3Byb3RvXSAhPSBjb21tb25fcG9ydF9tYXBbcHJvdG9dKQorICAgIHsKKyAgICAg
IGZyZWUocG9ydF9tYXBbcHJvdG9dKTsKKyAgICB9CisgICAgaWYocG9ydF9tYXBfcmV2W3Byb3Rv
XSAmJiBwb3J0X21hcF9yZXZbcHJvdG9dICE9IGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKQor
ICAgIHsKKyAgICAgIGZyZWUocG9ydF9tYXBfcmV2W3Byb3RvXSk7CisgICAgfQogICB9CiB9CiAK
QEAgLTc0Myw0OSArNzU2LDUxIEBACiAKIC8qIEp1c3QgZnJlZSBtZW1vcnkgdXNlZCBieSBQb3J0
TGlzdDo6cG9ydF9tYXBbXS4gU2hvdWxkIGJlIGRvbmUgc29tZXdoZXJlCiAgKiBiZWZvcmUgY2xv
c2luZyBubWFwLiAqLwotdm9pZCBQb3J0TGlzdDo6ZnJlZVBvcnRNYXAoKSB7Cit2b2lkIFBvcnRM
aXN0OjpmcmVlQ29tbW9uUG9ydE1hcCgpIHsKICAgaW50IHByb3RvOwogCiAgIGZvciAocHJvdG89
MDsgcHJvdG8gPCBQT1JUTElTVF9QUk9UT19NQVg7IHByb3RvKyspIHsKLSAgICBpZiAocG9ydF9t
YXBbcHJvdG9dKSB7Ci0gICAgICBmcmVlKHBvcnRfbWFwW3Byb3RvXSk7Ci0gICAgICBwb3J0X21h
cFtwcm90b10gPSBOVUxMOworICAgIGlmIChjb21tb25fcG9ydF9tYXBbcHJvdG9dKSB7CisgICAg
ICBmcmVlKGNvbW1vbl9wb3J0X21hcFtwcm90b10pOworICAgICAgY29tbW9uX3BvcnRfbWFwW3By
b3RvXSA9IE5VTEw7CiAgICAgfQotICAgIGlmIChwb3J0X21hcF9yZXZbcHJvdG9dKSB7Ci0gICAg
ICBmcmVlKHBvcnRfbWFwX3Jldltwcm90b10pOwotICAgICAgcG9ydF9tYXBfcmV2W3Byb3RvXSA9
IE5VTEw7CisgICAgaWYgKGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKSB7CisgICAgICBmcmVl
KGNvbW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dKTsKKyAgICAgIGNvbW1vbl9wb3J0X21hcF9yZXZb
cHJvdG9dID0gTlVMTDsKICAgICB9Ci0gICAgcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IDA7Cisg
ICAgY29tbW9uX3BvcnRfbGlzdF9jb3VudFtwcm90b10gPSAwOwogICB9CiB9CiAKIAotdTE2ICpQ
b3J0TGlzdDo6cG9ydF9tYXBbUE9SVExJU1RfUFJPVE9fTUFYXTsKLXUxNiAqUG9ydExpc3Q6OnBv
cnRfbWFwX3JldltQT1JUTElTVF9QUk9UT19NQVhdOwotaW50IFBvcnRMaXN0Ojpwb3J0X2xpc3Rf
Y291bnRbUE9SVExJU1RfUFJPVE9fTUFYXTsKK3UxNiAqUG9ydExpc3Q6OmNvbW1vbl9wb3J0X21h
cFtQT1JUTElTVF9QUk9UT19NQVhdOwordTE2ICpQb3J0TGlzdDo6Y29tbW9uX3BvcnRfbWFwX3Jl
dltQT1JUTElTVF9QUk9UT19NQVhdOworaW50IFBvcnRMaXN0Ojpjb21tb25fcG9ydF9saXN0X2Nv
dW50W1BPUlRMSVNUX1BST1RPX01BWF07CiAKIC8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBydW4g
YmVmb3JlIGFueSBQb3J0TGlzdCBvYmplY3QgaXMgY3JlYXRlZC4KICAqIEl0IG11c3QgYmUgcnVu
IGZvciBldmVyeSB1c2VkIHByb3RvY29sLiBUaGUgZGF0YSBpbiAicG9ydHMiCiAgKiBzaG91bGQg
YmUgc29ydGVkLiAqLwotdm9pZCBQb3J0TGlzdDo6aW5pdGlhbGl6ZVBvcnRNYXAoaW50IHByb3Rv
Y29sLCB1MTYgKnBvcnRzLCBpbnQgcG9ydGNvdW50KSB7Cit2b2lkIFBvcnRMaXN0Ojppbml0aWFs
aXplQ29tbW9uUG9ydE1hcChpbnQgcHJvdG9jb2wsIHUxNiAqcG9ydHMsIGludCBwb3J0Y291bnQp
IHsKKyAgaWYgKHBvcnRjb3VudCA9PSAwKQorICAgIHJldHVybjsKICAgaW50IGk7CiAgIGludCBw
b3J0c19tYXggPSAocHJvdG9jb2wgPT0gSVBQUk9UT19JUCkgPyAyNTYgOiA2NTUzNjsKICAgaW50
IHByb3RvID0gSU5QUk9UTzJQT1JUTElTVFBST1RPKHByb3RvY29sKTsKIAotICBpZiAocG9ydF9t
YXBbcHJvdG9dICE9IE5VTEwgfHwgcG9ydF9tYXBfcmV2W3Byb3RvXSAhPSBOVUxMKQorICBpZiAo
Y29tbW9uX3BvcnRfbWFwW3Byb3RvXSAhPSBOVUxMIHx8IGNvbW1vbl9wb3J0X21hcF9yZXZbcHJv
dG9dICE9IE5VTEwpCiAgICAgZmF0YWwoIiVzOiBwb3J0bWFwIGZvciBwcm90b2NvbCAlaSBhbHJl
YWR5IGluaXRpYWxpemVkIiwgX19mdW5jX18sIHByb3RvY29sKTsKIAotICBhc3NlcnQocG9ydF9s
aXN0X2NvdW50W3Byb3RvXT09MCk7CisgIGFzc2VydChjb21tb25fcG9ydF9saXN0X2NvdW50W3By
b3RvXT09MCk7CiAKICAgLyogdGhpcyBtZW1vcnkgd2lsbCBuZXZlciBiZSBmcmVlZCwgYnV0IHRo
aXMgaXMgdGhlIHdheSBpdCBoYXMgdG8gYmUuICovCi0gIHBvcnRfbWFwW3Byb3RvXSA9ICh1MTYg
Kikgc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOwotICBwb3J0X21hcF9yZXZb
cHJvdG9dID0gKHUxNiAqKSBzYWZlX3phbGxvYyhzaXplb2YodTE2KSAqIHBvcnRjb3VudCk7Cisg
IGNvbW1vbl9wb3J0X21hcFtwcm90b10gPSAodTE2ICopIHNhZmVfemFsbG9jKHNpemVvZih1MTYp
ICogcG9ydHNfbWF4KTsKKyAgY29tbW9uX3BvcnRfbWFwX3Jldltwcm90b10gPSAodTE2ICopIHNh
ZmVfemFsbG9jKHNpemVvZih1MTYpICogcG9ydGNvdW50KTsKIAotICBwb3J0X2xpc3RfY291bnRb
cHJvdG9dID0gcG9ydGNvdW50OworICBjb21tb25fcG9ydF9saXN0X2NvdW50W3Byb3RvXSA9IHBv
cnRjb3VudDsKIAogICBmb3IoaT0wOyBpIDwgcG9ydGNvdW50OyBpKyspIHsKLSAgICBwb3J0X21h
cFtwcm90b11bcG9ydHNbaV1dID0gaTsKLSAgICBwb3J0X21hcF9yZXZbcHJvdG9dW2ldID0gcG9y
dHNbaV07CisgICAgY29tbW9uX3BvcnRfbWFwW3Byb3RvXVtwb3J0c1tpXV0gPSBpOworICAgIGNv
bW1vbl9wb3J0X21hcF9yZXZbcHJvdG9dW2ldID0gcG9ydHNbaV07CiAgIH0KICAgLyogU28gbm93
IHBvcnRfbWFwIHNob3VsZCBoYXZlIHN1Y2ggc3RydWN0dXJlIChsZXRzIHNjYW4gMm5kLDR0aCBh
bmQgNnRoIHBvcnQpOgogICAgKiAJcG9ydF9tYXBbMCwwLDEsMCwyLDAsMywuLi5dCSAgICAgICAg
PC0gaW5kZXhlcyB0byBwb3J0X2xpc3Qgc3RydWN0dXJlCkBAIC03OTIsNiArODA3LDExOCBAQAog
ICAgKiAJcG9ydF9saXN0W3BvcnRfMixwb3J0XzQscG9ydF82XSAqLwogfQogCit2b2lkIFBvcnRM
aXN0OjptZXJnZUhvc3RTcGVjaWZpY1BvcnRzKGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50
IHBvcnRjb3VudCkKK3sKKyAgaWYgKHBvcnRjb3VudCA9PSAwKSByZXR1cm47CisKKyAgaW50IGk7
CisgIGludCBwb3J0c19tYXggPSAocHJvdG9jb2wgPT0gSVBQUk9UT19JUCkgPyAyNTYgOiA2NTUz
NjsKKyAgaW50IHByb3RvID0gSU5QUk9UTzJQT1JUTElTVFBST1RPKHByb3RvY29sKTsKKworICBp
ZiAocG9ydF9tYXBbcHJvdG9dID09IE5VTEwpCisgIHsKKyAgICBwb3J0X21hcFtwcm90b10gPSAo
dTE2ICopc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOyAgCisgICAgcG9ydF9t
YXBfcmV2W3Byb3RvXSA9ICh1MTYgKilzYWZlX3phbGxvYyhzaXplb2YodTE2KSAqIHBvcnRjb3Vu
dCk7CisKKyAgICBwb3J0X2xpc3RfY291bnRbcHJvdG9dID0gcG9ydGNvdW50OworCisgICAgZm9y
IChpID0gMDsgaSA8IHBvcnRjb3VudDsgaSsrKSB7CisgICAgICBwb3J0X21hcFtwcm90b11bcG9y
dHNbaV1dID0gaTsKKyAgICAgIHBvcnRfbWFwX3Jldltwcm90b11baV0gPSBwb3J0c1tpXTsKKyAg
ICB9CisKKyAgfQorICBlbHNlIHsKKworICAgIGludCBuZXdfcG9ydHNfY291bnQgPSAwOworICAg
IGZvciAoaSA9IDA7IGkgPCBwb3J0Y291bnQ7IGkrKykgeworICAgICAgdTE2IGN1cnJfcG9ydCA9
IHBvcnRzW2ldOworICAgICAgaWYgKHBvcnRfbWFwW3Byb3RvXVtjdXJyX3BvcnRdID09IDAgJiYg
cG9ydF9tYXBfcmV2W3Byb3RvXVtjdXJyX3BvcnRdICE9IGkpCisgICAgICAgIG5ld19wb3J0c19j
b3VudCsrOworICAgIH0KKworICAgIGludCBvbGRfY291bnQgPSBwb3J0X2xpc3RfY291bnRbcHJv
dG9dOworICAgIGludCBuZXdfY291bnQgPSBvbGRfY291bnQgKyBuZXdfcG9ydHNfY291bnQ7Cisg
ICAgdTE2KiBuZXdfcG9ydF9tYXAgPSAodTE2ICopc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBw
b3J0c19tYXgpOworICAgIHUxNiogbmV3X3BvcnRfbWFwX3JldiA9ICh1MTYgKilzYWZlX3phbGxv
YyhzaXplb2YodTE2KSAqIG5ld19jb3VudCk7CisKKyAgICAvL21lbWNweShuZXdfcG9ydF9tYXAs
IHBvcnRfbWFwW3Byb3RvXSwgc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOworICAgIC8vbWVtY3B5
KG5ld19wb3J0X21hcF9yZXYsIHBvcnRfbWFwX3Jldltwcm90b10sIHNpemVvZih1MTYpICogb2xk
X2NvdW50KTsKKworICAgIC8vbWVyZ2UKKyAgICBpbnQgY3Vycl9vbGQgPSAwOworICAgIGludCBj
dXJyX25ldyA9IDA7CisgICAgaW50IG1lcmdlZF9wb3MgPSAwOworCisgICAgd2hpbGUgKGN1cnJf
b2xkIDwgb2xkX2NvdW50ICYmIGN1cnJfbmV3IDwgcG9ydGNvdW50KQorICAgIHsKKyAgICAgIHUx
NiBwb3J0X3RvX2FkZCA9IDA7CisKKyAgICAgIGlmIChwb3J0X21hcF9yZXZbcHJvdG9dW2N1cnJf
b2xkXSA8IHBvcnRzW2N1cnJfbmV3XSkKKyAgICAgIHsKKyAgICAgICAgcG9ydF90b19hZGQgPSBw
b3J0X21hcF9yZXZbcHJvdG9dW2N1cnJfb2xkKytdOworICAgICAgfQorICAgICAgZWxzZSBpZiAo
cG9ydF9tYXBfcmV2W3Byb3RvXVtjdXJyX29sZF0gPT0gcG9ydHNbY3Vycl9uZXddKQorICAgICAg
eworICAgICAgICBwb3J0X3RvX2FkZCA9IHBvcnRfbWFwX3Jldltwcm90b11bY3Vycl9vbGQrK107
CisgICAgICAgIGN1cnJfbmV3Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcG9y
dF90b19hZGQgPSBwb3J0c1tjdXJyX25ldysrXTsKKyAgICAgIH0KKyAgICAgIG5ld19wb3J0X21h
cFtwb3J0X3RvX2FkZF0gPSBtZXJnZWRfcG9zOworICAgICAgbmV3X3BvcnRfbWFwX3JldlttZXJn
ZWRfcG9zXSA9IHBvcnRfdG9fYWRkOworICAgICAgbWVyZ2VkX3BvcysrOworICAgIH0KKworICAg
IHdoaWxlIChjdXJyX29sZCA8IG9sZF9jb3VudCkKKyAgICB7CisgICAgICB1MTYgcG9ydF90b19h
ZGQgPSBwb3J0X21hcF9yZXZbcHJvdG9dW2N1cnJfb2xkKytdOworICAgICAgbmV3X3BvcnRfbWFw
W3BvcnRfdG9fYWRkXSA9IG1lcmdlZF9wb3M7CisgICAgICBuZXdfcG9ydF9tYXBfcmV2W21lcmdl
ZF9wb3NdID0gcG9ydF90b19hZGQ7CisgICAgICBtZXJnZWRfcG9zKys7CisgICAgfQorCisgICAg
d2hpbGUgKGN1cnJfbmV3IDwgcG9ydGNvdW50KQorICAgIHsKKyAgICAgIHUxNiBwb3J0X3RvX2Fk
ZCA9IHBvcnRzW2N1cnJfbmV3KytdOworICAgICAgbmV3X3BvcnRfbWFwW3BvcnRfdG9fYWRkXSA9
IG1lcmdlZF9wb3M7CisgICAgICBuZXdfcG9ydF9tYXBfcmV2W21lcmdlZF9wb3NdID0gcG9ydF90
b19hZGQ7CisgICAgICBtZXJnZWRfcG9zKys7CisgICAgfQorCisKKyAgICBpZihwb3J0X21hcFtw
cm90b10gJiYgcG9ydF9tYXBbcHJvdG9dICE9IGNvbW1vbl9wb3J0X21hcFtwcm90b10pCisgICAg
eworICAgICAgZnJlZShwb3J0X21hcFtwcm90b10pOworICAgIH0KKyAgICBpZihwb3J0X21hcF9y
ZXZbcHJvdG9dICYmIHBvcnRfbWFwX3Jldltwcm90b10gIT0gY29tbW9uX3BvcnRfbWFwX3Jldltw
cm90b10pCisgICAgeworICAgICAgZnJlZShwb3J0X21hcF9yZXZbcHJvdG9dKTsKKyAgICB9CisK
KworICAgIHBvcnRfbWFwW3Byb3RvXSA9IG5ld19wb3J0X21hcDsKKyAgICBwb3J0X21hcF9yZXZb
cHJvdG9dID0gbmV3X3BvcnRfbWFwX3JldjsKKyAgICBwb3J0X2xpc3RfY291bnRbcHJvdG9dID0g
bmV3X2NvdW50OworICB9CisKKyAgZm9yIChwcm90byA9IDA7IHByb3RvIDwgUE9SVExJU1RfUFJP
VE9fTUFYOyBwcm90bysrKSB7CisKKyAgICBpZiAocG9ydF9saXN0W3Byb3RvXSkKKyAgICAgIGZy
ZWUocG9ydF9saXN0W3Byb3RvXSk7CisKKyAgICBpZiAocG9ydF9saXN0X2NvdW50W3Byb3RvXSA+
IDApCisgICAgICBwb3J0X2xpc3RbcHJvdG9dID0gKFBvcnQqKilzYWZlX3phbGxvYyhzaXplb2Yo
UG9ydCopKnBvcnRfbGlzdF9jb3VudFtwcm90b10pOworCisgICAgZGVmYXVsdF9wb3J0X3N0YXRl
W3Byb3RvXS5wcm90byA9IFBPUlRMSVNUUFJPVE8ySU5QUk9UTyhwcm90byk7CisgICAgZGVmYXVs
dF9wb3J0X3N0YXRlW3Byb3RvXS5yZWFzb24ucmVhc29uX2lkID0gRVJfTk9SRVNQT05TRTsKKyAg
ICBzdGF0ZV9jb3VudHNfcHJvdG9bcHJvdG9dW2RlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10uc3Rh
dGVdID0gcG9ydF9saXN0X2NvdW50W3Byb3RvXTsKKyAgfQorCisgIG51bXNjcmlwdHJlc3VsdHMg
PSAwOworfQorCiAgIC8qIEN5Y2xlcyB0aHJvdWdoIHRoZSAwIG9yIG1vcmUgImlnbm9yZWQiIHBv
cnRzIHdoaWNoIHNob3VsZCBiZQogICAgY29uc29saWRhdGVkIGZvciBObWFwIG91dHB1dC4gIFRo
ZXkgYXJlIHJldHVybmVkIHNvcnRlZCBieSB0aGUKICAgIG51bWJlciBvZiBwb3J0cyBpbiB0aGUg
c3RhdGUsIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgY29tbW9uLiAgSXQKQEAgLTEwMDQsNCArMTEz
MSwzIEBACiAgIH0KICAgcmV0dXJuICJ1bmtub3duIjsKIH0KLQpJbmRleDogcG9ydGxpc3QuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBwb3J0bGlzdC5oCShyZXZpc2lvbiAzNzYxMSkKKysrIHBvcnRsaXN0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI0Niw5ICsyNDYsMTAgQEAKICAgflBvcnRMaXN0KCk7CiAgIC8q
IFNldCBwb3J0cyB0aGF0IHdpbGwgYmUgc2Nhbm5lZCBmb3IgZWFjaCBwcm90b2NvbC4gVGhpcyBm
dW5jdGlvbgogICAgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IFBvcnRMaXN0IG9iamVjdCB3
aWxsIGJlIGNyZWF0ZWQuICovCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQb3J0TWFwKGludCBw
cm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3VudCk7CisgIHN0YXRpYyB2b2lkIGluaXRp
YWxpemVDb21tb25Qb3J0TWFwKGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3Vu
dCk7CisgIHZvaWQgbWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhpbnQgcHJvdG9jb2wsIHUxNiAqcG9y
dHMsIGludCBwb3J0Y291bnQpOwogICAvKiBGcmVlIG1lbW9yeSB1c2VkIGJ5IHBvcnRfbWFwLiBJ
dCBzaG91bGQgYmUgZG9uZSBzb21ld2hlcmUgYmVmb3JlIHF1aXR0aW5nKi8KLSAgc3RhdGljIHZv
aWQgZnJlZVBvcnRNYXAoKTsKKyAgc3RhdGljIHZvaWQgZnJlZUNvbW1vblBvcnRNYXAoKTsKIAog
ICB2b2lkIHNldERlZmF1bHRQb3J0U3RhdGUodTggcHJvdG9jb2wsIGludCBzdGF0ZSk7CiAgIHZv
aWQgc2V0UG9ydFN0YXRlKHUxNiBwb3J0bm8sIHU4IHByb3RvY29sLCBpbnQgc3RhdGUpOwpAQCAt
MzQ2LDE0ICszNDcsMTkgQEAKICAgLyogTnVtYmVyIG9mIHBvcnRzIGluIGVhY2ggc3RhdGUgcGVy
IGVhY2ggcHJvdG9jb2wuICovCiAgIGludCBzdGF0ZV9jb3VudHNfcHJvdG9bUE9SVExJU1RfUFJP
VE9fTUFYXVtQT1JUX0hJR0hFU1RfU1RBVEVdOwogICBQb3J0ICoqcG9ydF9saXN0W1BPUlRMSVNU
X1BST1RPX01BWF07CisKKyAgdTE2ICpwb3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOworICB1
MTYgKnBvcnRfbWFwX3JldltQT1JUTElTVF9QUk9UT19NQVhdOworICBpbnQgcG9ydF9saXN0X2Nv
dW50W1BPUlRMSVNUX1BST1RPX01BWF07CisKICBwcm90ZWN0ZWQ6CiAgIC8qIE1hcHMgcG9ydF9u
dW1iZXIgdG8gaW5kZXggaW4gcG9ydF9saXN0IGFycmF5LgogICAgKiBPbmx5IGZ1bmN0aW9uczog
Z2V0UG9ydEVudHJ5LCBzZXRQb3J0RW50cnksIGluaXRpYWxpemVQb3J0TWFwIGFuZAogICAgKiBu
ZXh0UG9ydCBzaG91bGQgYWNjZXNzIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5LiAqLwotICBzdGF0
aWMgdTE2ICpwb3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOwotICBzdGF0aWMgdTE2ICpwb3J0
X21hcF9yZXZbUE9SVExJU1RfUFJPVE9fTUFYXTsKKyAgc3RhdGljIHUxNiAqY29tbW9uX3BvcnRf
bWFwW1BPUlRMSVNUX1BST1RPX01BWF07CisgIHN0YXRpYyB1MTYgKmNvbW1vbl9wb3J0X21hcF9y
ZXZbUE9SVExJU1RfUFJPVE9fTUFYXTsKICAgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50
cyBpbiBwb3J0X2xpc3QgcGVyIGVhY2ggcHJvdG9jb2wuICovCi0gIHN0YXRpYyBpbnQgcG9ydF9s
aXN0X2NvdW50W1BPUlRMSVNUX1BST1RPX01BWF07CisgIHN0YXRpYyBpbnQgY29tbW9uX3BvcnRf
bGlzdF9jb3VudFtQT1JUTElTVF9QUk9UT19NQVhdOwogICBQb3J0IGRlZmF1bHRfcG9ydF9zdGF0
ZVtQT1JUTElTVF9QUk9UT19NQVhdOwogfTsKIApJbmRleDogc2Nhbl9lbmdpbmUuY2MKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gc2Nhbl9lbmdpbmUuY2MJKHJldmlzaW9uIDM3NjExKQorKysgc2Nhbl9lbmdpbmUu
Y2MJKHdvcmtpbmcgY29weSkKQEAgLTMzNSw3ICszMzUsMTIgQEAKICAgICB0by50aW1lb3V0ID0g
TUFYKG8ubWluUnR0VGltZW91dCgpLCBNSU4oby5pbml0aWFsUnR0VGltZW91dCgpLCBJTklUSUFM
X0FSUF9SVFRfVElNRU9VVCkpICogMTAwMDsKICAgbnVtX3Byb2Jlc19hY3RpdmUgPSAwOwogICBu
dW10YXJnZXRzID0gVVNJLT5udW1JbmNvbXBsZXRlSG9zdHMoKTsgLy8gVGhleSBhcmUgYWxsIGlu
Y29tcGxldGUgYXQgdGhlIGJlZ2lubmluZwotICBudW1wcm9iZXMgPSBVU0ktPm51bVByb2Jlc1Bl
ckhvc3QoKTsKKyAgbnVtcHJvYmVzID0gVVNJLT5tYXhOdW1Qcm9iZXNQZXJIb3N0KCk7CisgIHRv
dGFscHJvYmVzID0gMDsKKyAgc3RkOjptdWx0aXNldDxIb3N0U2NhblN0YXRzICosIEhzc1ByZWRp
Y2F0ZT46Oml0ZXJhdG9yIGhvc3RJOworICBmb3IgKGhvc3RJID0gVVNJLT5pbmNvbXBsZXRlSG9z
dHMuYmVnaW4oKTsgaG9zdEkgIT0gVVNJLT5pbmNvbXBsZXRlSG9zdHMuZW5kKCk7IGhvc3RJKysp
IHsKKyAgICB0b3RhbHByb2JlcyArPSBVU0ktPm51bVByb2Jlc1Blckhvc3QoKmhvc3RJKTsKKyAg
fQogCiAgIGlmIChVU0ktPnNjYW50eXBlID09IENPTk5FQ1RfU0NBTiB8fCBVU0ktPnB0ZWNoLmNv
bm5lY3R0Y3BzY2FuKQogICAgIENTSSA9IG5ldyBDb25uZWN0U2NhbkluZm87CkBAIC04NDYsNyAr
ODUxLDcgQEAKICAgICAvLyBUaGlzIGlzIGluZXhhY3QgKG1heHRyaWVzIC0gMSkgYmVjYXVzZSBu
dW1wcm9iZXNfc2VudCBpbmNsdWRlcwogICAgIC8vIGF0IGxlYXN0IG9uZSB0cnkgb2YgcG9ydHNf
ZmluaXNoZWQuCiAgICAgdGhpc2hvc3RwZXJjZG9uZSA9IGhvc3QtPnBvcnRzX2ZpbmlzaGVkICog
KG1heHRyaWVzIC0gMSkgKyBob3N0LT5udW1wcm9iZXNfc2VudDsKLSAgICB0aGlzaG9zdHBlcmNk
b25lIC89IG1heHRyaWVzICogZ3N0YXRzLT5udW1wcm9iZXM7CisgICAgdGhpc2hvc3RwZXJjZG9u
ZSAvPSBtYXh0cmllcyAqIG51bVByb2Jlc1Blckhvc3QoaG9zdCk7CiAgICAgaWYgKHRoaXNob3N0
cGVyY2RvbmUgPj0gMC45OTk5KQogICAgICAgdGhpc2hvc3RwZXJjZG9uZSA9IDAuOTk5OTsKICAg
ICB0b3RhbCArPSB0aGlzaG9zdHBlcmNkb25lOwpAQCAtODYxLDYgKzg2Niw3IEBACiAgIHN0ZDo6
dmVjdG9yPFRhcmdldCAqPjo6aXRlcmF0b3IgdGFyZ2V0OwogCiAgIGZvciAodGFyZ2V0ID0gdGFy
Z2V0cy5iZWdpbigpOyB0YXJnZXQgIT0gdGFyZ2V0cy5lbmQoKTsgdGFyZ2V0KyspIHsKKyAgCiAg
ICAgc3dpdGNoIChzY2FudHlwZSkgewogICAgIGNhc2UgU1lOX1NDQU46CiAgICAgY2FzZSBBQ0tf
U0NBTjoKQEAgLTEwMzQsMTkgKzEwNDAsMjggQEAKICAgfQogfQogCisjZGVmaW5lIG1heF9tYWNy
byh4LCB5KSAoKCh4KSA+ICh5KSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIGNvbGxlY3QoQSxCKSBm
b3IgKGhvc3QgPSBpbmNvbXBsZXRlSG9zdHMuYmVnaW4oKTsgaG9zdCAhPSBpbmNvbXBsZXRlSG9z
dHMuZW5kKCk7IGhvc3QrKykgQSA9IG1heF9tYWNybyhBLCBwb3J0cy0+QiArICgqaG9zdCktPnRh
cmdldC0+dGFyZ2V0X3BvcnRzLT5CKTsgXAorICAgICAgICAgICAgICAgICAgICAgZm9yIChob3N0
ID0gY29tcGxldGVkSG9zdHMuYmVnaW4oKTsgaG9zdCAhPSBjb21wbGV0ZWRIb3N0cy5lbmQoKTsg
aG9zdCsrKSBBID0gbWF4X21hY3JvKEEsIHBvcnRzLT5CICsgKCpob3N0KS0+dGFyZ2V0LT50YXJn
ZXRfcG9ydHMtPkIpOworCiAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgdGhh
dCBtYXkgYmUgc2VudCB0byBlYWNoIGhvc3QuIFRoaXMgbmV2ZXIKICAgIGNoYW5nZXMgYWZ0ZXIg
aW5pdGlhbGl6YXRpb24uICovCi11bnNpZ25lZCBpbnQgVWx0cmFTY2FuSW5mbzo6bnVtUHJvYmVz
UGVySG9zdCgpIHsKLSAgdW5zaWduZWQgaW50IG51bXByb2JlcyA9IDA7Cit1bnNpZ25lZCBpbnQg
VWx0cmFTY2FuSW5mbzo6bWF4TnVtUHJvYmVzUGVySG9zdCgpIHsKKyAgaW50IG51bXByb2JlcyA9
IDA7CisgIHN0ZDo6bXVsdGlzZXQ8SG9zdFNjYW5TdGF0cyAqLCBIc3NQcmVkaWNhdGU+OjppdGVy
YXRvciBob3N0OwogCiAgIGlmICh0Y3Bfc2NhbikgewogICAgIG51bXByb2JlcyA9IHBvcnRzLT50
Y3BfY291bnQ7CisgICAgY29sbGVjdChudW1wcm9iZXMsIHRjcF9jb3VudCk7CiAgIH0gZWxzZSBp
ZiAodWRwX3NjYW4pIHsKICAgICBudW1wcm9iZXMgPSBwb3J0cy0+dWRwX2NvdW50OworICAgIGNv
bGxlY3QobnVtcHJvYmVzLCB1ZHBfY291bnQpOwogICB9IGVsc2UgaWYgKHNjdHBfc2Nhbikgewog
ICAgIG51bXByb2JlcyA9IHBvcnRzLT5zY3RwX2NvdW50OworICAgIGNvbGxlY3QobnVtcHJvYmVz
LCBzY3RwX2NvdW50KTsKICAgfSBlbHNlIGlmIChwcm90X3NjYW4pIHsKICAgICBudW1wcm9iZXMg
PSBwb3J0cy0+cHJvdF9jb3VudDsKKyAgICBjb2xsZWN0KG51bXByb2JlcywgcHJvdF9jb3VudCk7
CiAgIH0gZWxzZSBpZiAocGluZ19zY2FuX2FycCkgewogICAgIG51bXByb2JlcyA9IDE7CiAgIH0g
ZWxzZSBpZiAocGluZ19zY2FuX25kKSB7CkBAIC0xMDc3LDkgKzEwOTIsNjQgQEAKICAgICAgIG51
bXByb2JlcyArPSBwb3J0cy0+c3luX3BpbmdfY291bnQ7CiAgIH0gZWxzZSBhc3NlcnQoMCk7CiAK
KyAgYXNzZXJ0KG51bXByb2JlcyA+PSAwKTsKKwogICByZXR1cm4gbnVtcHJvYmVzOwogfQogCisv
KiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8g
ZWFjaCBob3N0LiAqLwordW5zaWduZWQgaW50IFVsdHJhU2NhbkluZm86Om51bVByb2Jlc1Blckhv
c3QoSG9zdFNjYW5TdGF0cyogaG9zdCkgeworICBpbnQgbnVtcHJvYmVzOworCisKKyAgaWYgKHRj
cF9zY2FuKSB7CisgICAgbnVtcHJvYmVzID0gcG9ydHMtPnRjcF9jb3VudCArIGhvc3QtPnRhcmdl
dC0+dGFyZ2V0X3BvcnRzLT50Y3BfY291bnQ7CisgIH0KKyAgZWxzZSBpZiAodWRwX3NjYW4pIHsK
KyAgICBudW1wcm9iZXMgPSBwb3J0cy0+dWRwX2NvdW50ICsgaG9zdC0+dGFyZ2V0LT50YXJnZXRf
cG9ydHMtPnVkcF9jb3VudDsKKyAgfQorICBlbHNlIGlmIChzY3RwX3NjYW4pIHsKKyAgICBudW1w
cm9iZXMgPSBwb3J0cy0+c2N0cF9jb3VudCArIGhvc3QtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLT5z
Y3RwX2NvdW50OworICB9CisgIGVsc2UgaWYgKHByb3Rfc2NhbikgeworICAgIG51bXByb2JlcyA9
IHBvcnRzLT5wcm90X2NvdW50ICsgaG9zdC0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3RfY291
bnQ7CisgIH0KKyAgZWxzZSBpZiAocGluZ19zY2FuX2FycCkgeworICAgIG51bXByb2JlcyA9IDE7
CisgIH0KKyAgZWxzZSBpZiAocGluZ19zY2FuX25kKSB7CisgICAgbnVtcHJvYmVzID0gMTsKKyAg
fQorICBlbHNlIGlmIChwaW5nX3NjYW4pIHsKKyAgICBudW1wcm9iZXMgPSAwOworICAgIGlmIChw
dGVjaC5yYXd0Y3BzY2FuKSB7CisgICAgICBpZiAoby5waW5ndHlwZSAmIFBJTkdUWVBFX1RDUF9V
U0VfQUNLKQorICAgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPmFja19waW5nX2NvdW50OworICAg
ICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9UQ1BfVVNFX1NZTikKKyAgICAgICAgbnVtcHJv
YmVzICs9IHBvcnRzLT5zeW5fcGluZ19jb3VudDsKKyAgICB9CisgICAgaWYgKHB0ZWNoLnJhd3Vk
cHNjYW4pCisgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnVkcF9waW5nX2NvdW50OworICAgIGlm
IChwdGVjaC5yYXdzY3Rwc2NhbikKKyAgICAgIG51bXByb2JlcyArPSBwb3J0cy0+c2N0cF9waW5n
X2NvdW50OworICAgIGlmIChwdGVjaC5yYXdpY21wc2NhbikgeworICAgICAgaWYgKG8ucGluZ3R5
cGUgJiBQSU5HVFlQRV9JQ01QX1BJTkcpCisgICAgICAgIG51bXByb2JlcysrOworICAgICAgaWYg
KG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9JQ01QX01BU0spCisgICAgICAgIG51bXByb2JlcysrOwor
ICAgICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9JQ01QX1RTKQorICAgICAgICBudW1wcm9i
ZXMrKzsKKyAgICB9CisgICAgaWYgKHB0ZWNoLnJhd3Byb3Rvc2NhbikKKyAgICAgIG51bXByb2Jl
cyArPSBwb3J0cy0+cHJvdG9fcGluZ19jb3VudDsKKyAgICBpZiAocHRlY2guY29ubmVjdHRjcHNj
YW4pCisgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnN5bl9waW5nX2NvdW50OworICB9CisgIGVs
c2UgYXNzZXJ0KDApOworCisgIHJldHVybiBudW1wcm9iZXM7Cit9CisKIC8qIENvbnN1bHRzIHdp
dGggdGhlIGdyb3VwIHN0YXRzLCBhbmQgdGhlIGhzdGF0cyBmb3IgZXZlcnkKICAgIGluY29tcGxl
dGUgaG9zdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2JlcyBtYXkgYmUgc2VudC4KICAg
IFJldHVybnMgdHJ1ZSBpZiB0aGV5IGNhbiBiZSBzZW50IGltbWVkaWF0ZWx5LiAgSWYgd2hlbiBp
cwpAQCAtMTM0OSw3ICsxNDE5LDcgQEAKICAgYXNzZXJ0KHBzcGVjKTsKIAogICBpZiAoVVNJLT50
Y3Bfc2NhbikgewotICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT50Y3Bf
Y291bnQpCisgICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnRjcF9jb3Vu
dCArIGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnRjcF9jb3VudCkKICAgICAgIHJldHVybiAt
MTsKICAgICBpZiAoVVNJLT5zY2FudHlwZSA9PSBDT05ORUNUX1NDQU4pCiAgICAgICBwc3BlYy0+
dHlwZSA9IFBTX0NPTk5FQ1RUQ1A7CkBAIC0xMzU3LDcgKzE0MjcsMTQgQEAKICAgICAgIHBzcGVj
LT50eXBlID0gUFNfVENQOwogICAgIHBzcGVjLT5wcm90byA9IElQUFJPVE9fVENQOwogCi0gICAg
cHNwZWMtPnBkLnRjcC5kcG9ydCA9IFVTSS0+cG9ydHMtPnRjcF9wb3J0c1toc3MtPm5leHRfcG9y
dGlkeCsrXTsKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2Nv
dW50KQorICAgIHsKKyAgICAgIHBzcGVjLT5wZC50Y3AuZHBvcnQgPSBoc3MtPnRhcmdldC0+dGFy
Z2V0X3BvcnRzLT50Y3BfcG9ydHNbKGhzcy0+bmV4dF9wb3J0aWR4KyspLShVU0ktPnBvcnRzLT50
Y3BfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwc3BlYy0+cGQudGNwLmRwb3J0
ID0gVVNJLT5wb3J0cy0+dGNwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4KytdOworICAgIH0KKyAg
ICAKICAgICBpZiAoVVNJLT5zY2FudHlwZSA9PSBDT05ORUNUX1NDQU4pCiAgICAgICBwc3BlYy0+
cGQudGNwLmZsYWdzID0gVEhfU1lOOwogICAgIGVsc2UgaWYgKG8uc2NhbmZsYWdzICE9IC0xKQpA
QCAtMTM5MiwxOCArMTQ2OSwzMCBAQAogICAgIH0KICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlm
IChVU0ktPnVkcF9zY2FuKSB7Ci0gICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9y
dHMtPnVkcF9jb3VudCkKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+
dWRwX2NvdW50ICsgaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50KQogICAgICAg
cmV0dXJuIC0xOwogICAgIHBzcGVjLT50eXBlID0gUFNfVURQOwogICAgIHBzcGVjLT5wcm90byA9
IElQUFJPVE9fVURQOwotICAgIHBzcGVjLT5wZC51ZHAuZHBvcnQgPSBVU0ktPnBvcnRzLT51ZHBf
cG9ydHNbaHNzLT5uZXh0X3BvcnRpZHgrK107CisgICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49
IFVTSS0+cG9ydHMtPnVkcF9jb3VudCkKKyAgICB7CisgICAgICBwc3BlYy0+cGQudWRwLmRwb3J0
ID0gaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX3BvcnRzWyhoc3MtPm5leHRfcG9ydGlk
eCsrKSAtIChVU0ktPnBvcnRzLT51ZHBfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAg
ICBwc3BlYy0+cGQudWRwLmRwb3J0ID0gVVNJLT5wb3J0cy0+dWRwX3BvcnRzW2hzcy0+bmV4dF9w
b3J0aWR4KytdOworICAgIH0KICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChVU0ktPnNjdHBf
c2NhbikgewotICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2Nv
dW50KQorICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50
ICsgaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy0+c2N0cF9jb3VudCkKICAgICAgIHJldHVybiAt
MTsKICAgICBwc3BlYy0+dHlwZSA9IFBTX1NDVFA7CiAgICAgcHNwZWMtPnByb3RvID0gSVBQUk9U
T19TQ1RQOwotICAgIHBzcGVjLT5wZC5zY3RwLmRwb3J0ID0gVVNJLT5wb3J0cy0+c2N0cF9wb3J0
c1toc3MtPm5leHRfcG9ydGlkeCsrXTsKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJ
LT5wb3J0cy0+c2N0cF9jb3VudCkKKyAgICB7CisgICAgICBwc3BlYy0+cGQuc2N0cC5kcG9ydCA9
IGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnNjdHBfcG9ydHNbKGhzcy0+bmV4dF9wb3J0aWR4
KyspIC0gKFVTSS0+cG9ydHMtPnNjdHBfY291bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAg
ICBwc3BlYy0+cGQuc2N0cC5kcG9ydCA9IFVTSS0+cG9ydHMtPnNjdHBfcG9ydHNbaHNzLT5uZXh0
X3BvcnRpZHgrK107CisgICAgfQogICAgIHN3aXRjaCAoVVNJLT5zY2FudHlwZSkgewogICAgIGNh
c2UgU0NUUF9JTklUX1NDQU46CiAgICAgICBwc3BlYy0+cGQuc2N0cC5jaHVua3R5cGUgPSBTQ1RQ
X0lOSVQ7CkBAIC0xNDE2LDkgKzE1MDUsMTYgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0g
ZWxzZSBpZiAoVVNJLT5wcm90X3NjYW4pIHsKLSAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0g
VVNJLT5wb3J0cy0+cHJvdF9jb3VudCkKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJ
LT5wb3J0cy0+cHJvdF9jb3VudCArIGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3RfY291
bnQpCiAgICAgICByZXR1cm4gLTE7CiAgICAgcHNwZWMtPnR5cGUgPSBQU19QUk9UTzsKKyAgICBp
ZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+cHJvdF9jb3VudCkKKyAgICB7Cisg
ICAgICBwc3BlYy0+cHJvdG8gPSBoc3MtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLT5wcm90c1soaHNz
LT5uZXh0X3BvcnRpZHgrKykgLSAoVVNJLT5wb3J0cy0+cHJvdF9jb3VudCldOworICAgIH0KKyAg
ICBlbHNlIHsKKyAgICAgIHBzcGVjLT5wcm90byA9IFVTSS0+cG9ydHMtPnByb3RzW2hzcy0+bmV4
dF9wb3J0aWR4KytdOworICAgIH0KICAgICBwc3BlYy0+cHJvdG8gPSBVU0ktPnBvcnRzLT5wcm90
c1toc3MtPm5leHRfcG9ydGlkeCsrXTsKICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChVU0kt
PnBpbmdfc2Nhbl9hcnApIHsKQEAgLTE1MjcsMjEgKzE2MjMsMjEgQEAKIC8qIFJldHVybnMgdGhl
IG51bWJlciBvZiBwb3J0cyByZW1haW5pbmcgdG8gcHJvYmUgKi8KIGludCBIb3N0U2NhblN0YXRz
OjpmcmVzaFBvcnRzTGVmdCgpIHsKICAgaWYgKFVTSS0+dGNwX3NjYW4pIHsKLSAgICBpZiAobmV4
dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnRjcF9jb3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4
ID49IFVTSS0+cG9ydHMtPnRjcF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLT50Y3BfY291
bnQpCiAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gVVNJLT5wb3J0cy0+dGNwX2NvdW50IC0g
bmV4dF9wb3J0aWR4OworICAgIHJldHVybiBVU0ktPnBvcnRzLT50Y3BfY291bnQgKyB0YXJnZXQt
PnRhcmdldF9wb3J0cy0+dGNwX2NvdW50IC0gbmV4dF9wb3J0aWR4OwogICB9IGVsc2UgaWYgKFVT
SS0+dWRwX3NjYW4pIHsKLSAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnVkcF9j
b3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnVkcF9jb3VudCArIHRh
cmdldC0+dGFyZ2V0X3BvcnRzLT51ZHBfY291bnQpCiAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gVVNJLT5wb3J0cy0+dWRwX2NvdW50IC0gbmV4dF9wb3J0aWR4OworICAgIHJldHVybiBVU0kt
PnBvcnRzLT51ZHBfY291bnQgKyB0YXJnZXQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50IC0gbmV4
dF9wb3J0aWR4OwogICB9IGVsc2UgaWYgKFVTSS0+c2N0cF9zY2FuKSB7Ci0gICAgaWYgKG5leHRf
cG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50KQorICAgIGlmIChuZXh0X3BvcnRpZHgg
Pj0gVVNJLT5wb3J0cy0+c2N0cF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLT5zY3RwX2Nv
dW50KQogICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIFVTSS0+cG9ydHMtPnNjdHBfY291bnQg
LSBuZXh0X3BvcnRpZHg7CisgICAgcmV0dXJuIFVTSS0+cG9ydHMtPnNjdHBfY291bnQgKyB0YXJn
ZXQtPnRhcmdldF9wb3J0cy0+c2N0cF9jb3VudCAtIG5leHRfcG9ydGlkeDsKICAgfSBlbHNlIGlm
IChVU0ktPnByb3Rfc2NhbikgewotICAgIGlmIChuZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+
cHJvdF9jb3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnByb3RfY291
bnQgKyB0YXJnZXQtPnRhcmdldF9wb3J0cy0+cHJvdF9jb3VudCkKICAgICAgIHJldHVybiAwOwot
ICAgIHJldHVybiBVU0ktPnBvcnRzLT5wcm90X2NvdW50IC0gbmV4dF9wb3J0aWR4OworICAgIHJl
dHVybiBVU0ktPnBvcnRzLT5wcm90X2NvdW50ICsgdGFyZ2V0LT50YXJnZXRfcG9ydHMtPnByb3Rf
Y291bnQgLSBuZXh0X3BvcnRpZHg7CiAgIH0gZWxzZSBpZiAoVVNJLT5waW5nX3NjYW5fYXJwKSB7
CiAgICAgaWYgKHNlbnRfYXJwKQogICAgICAgcmV0dXJuIDA7CkBAIC0yNzQ3LDcgKzI4NDMsNyBA
QAogICAgIGlmICghcGx1cmFsKSB7CiAgICAgICAoKihUYXJnZXRzLmJlZ2luKCkpKS0+TmFtZUlQ
KHRhcmdldHN0ciwgc2l6ZW9mKHRhcmdldHN0cikpOwogICAgIH0gZWxzZSBTbnByaW50Zih0YXJn
ZXRzdHIsIHNpemVvZih0YXJnZXRzdHIpLCAiJWQgaG9zdHMiLCAoaW50KSBUYXJnZXRzLnNpemUo
KSk7Ci0gICAgbG9nX3dyaXRlKExPR19TVERPVVQsICJTY2FubmluZyAlcyBbJWQgcG9ydCVzJXNd
XG4iLCB0YXJnZXRzdHIsIFVTSS5nc3RhdHMtPm51bXByb2JlcywgKFVTSS5nc3RhdHMtPm51bXBy
b2JlcyAhPSAxKSA/ICJzIiA6ICIiLCBwbHVyYWwgPyAiL2hvc3QiIDogIiIpOworICAgIGxvZ193
cml0ZShMT0dfU1RET1VULCAiU2Nhbm5pbmcgJXMgW21heCAlZCBwb3J0JXMlc11cbiIsIHRhcmdl
dHN0ciwgVVNJLmdzdGF0cy0+bnVtcHJvYmVzLCAoVVNJLmdzdGF0cy0+bnVtcHJvYmVzICE9IDEp
ID8gInMiIDogIiIsIHBsdXJhbCA/ICIvaG9zdCIgOiAiIik7CiAgIH0KIAogICBpZiAoVVNJLmlz
UmF3U2NhbigpKQpAQCAtMjc5OCw3ICsyODk0LDcgQEAKICAgICAgICAgICAgICAgICAgKHVuc2ln
bmVkIGxvbmcpIFRhcmdldHMuc2l6ZSgpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIFNucHJp
bnRmKGFkZGl0aW9uYWxfaW5mbywgc2l6ZW9mKGFkZGl0aW9uYWxfaW5mbyksICIlbHUgdG90YWwg
cG9ydHMiLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgVVNJLmdzdGF0cy0+bnVt
cHJvYmVzICogVGFyZ2V0cy5zaXplKCkpOworICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u
ZykgVVNJLmdzdGF0cy0+dG90YWxwcm9iZXMpOwogICAgICAgfQogICAgIGVsc2UgU25wcmludGYo
YWRkaXRpb25hbF9pbmZvLCBzaXplb2YoYWRkaXRpb25hbF9pbmZvKSwgIiVkICVzIHRpbWVkIG91
dCIsCiAgICAgICAgICAgICAgICAgICAgIFVTSS5nc3RhdHMtPm51bV9ob3N0c190aW1lZG91dCwK
SW5kZXg6IHNjYW5fZW5naW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc2Nhbl9lbmdpbmUuaAkocmV2aXNp
b24gMzc2MTEpCisrKyBzY2FuX2VuZ2luZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNjAsNiArMzYw
LDcgQEAKICAgc3RydWN0IHRpbWVvdXRfaW5mbyB0bzsgLyogR3JvdXAtd2lkZSBwYWNrZXQgcnR0
L3RpbWVvdXQgaW5mbyAqLwogICBpbnQgbnVtdGFyZ2V0czsgLyogVG90YWwgIyBvZiB0YXJnZXRz
IHNjYW5uZWQgLS0gaW5jbHVkZXMgZmluaXNoZWQgYW5kIGluY29tcGxldGUgaG9zdHMgKi8KICAg
aW50IG51bXByb2JlczsgLyogTnVtYmVyIG9mIHByb2Jlcy9wb3J0cyBzY2FubmVkIG9uIGVhY2gg
aG9zdCAqLworICBpbnQgdG90YWxwcm9iZXM7CiAgIC8qIFRoZSBsYXN0IHRpbWUgd2FpdEZvclJl
c3BvbnNlcyBmaW5pc2hlZCAoaW5pdGlhbGl6ZWQgdG8gR1NTIGNyZWF0aW9uIHRpbWUgKi8KICAg
aW50IHByb2Jlc19zZW50OyAvKiBOdW1iZXIgb2YgcHJvYmVzIHNlbnQgaW4gdG90YWwuICBUaGlz
IERPRVMgaW5jbHVkZSBwaW5ncyBhbmQgcmV0cmFuc21pc3Npb25zICovCiAKQEAgLTYyOCw3ICs2
MjksOCBAQAogICAvKiBNdXN0IGNhbGwgSW5pdCBpZiB5b3UgY3JlYXRlIG9iamVjdCB3aXRoIGRl
ZmF1bHQgY29uc3RydWN0b3IgKi8KICAgdm9pZCBJbml0KHN0ZDo6dmVjdG9yPFRhcmdldCAqPiAm
VGFyZ2V0cywgc3RydWN0IHNjYW5fbGlzdHMgKnB0cywgc3R5cGUgc2NhbnRwKTsKIAotICB1bnNp
Z25lZCBpbnQgbnVtUHJvYmVzUGVySG9zdCgpOworICB1bnNpZ25lZCBpbnQgbnVtUHJvYmVzUGVy
SG9zdChIb3N0U2NhblN0YXRzKiBob3N0KTsKKyAgdW5zaWduZWQgaW50IG1heE51bVByb2Jlc1Bl
ckhvc3QoKTsKIAogICAvKiBDb25zdWx0cyB3aXRoIHRoZSBncm91cCBzdGF0cywgYW5kIHRoZSBo
c3RhdHMgZm9yIGV2ZXJ5CiAgICAgIGluY29tcGxldGUgaG9zdHMgdG8gZGV0ZXJtaW5lIHdoZXRo
ZXIgYW55IHByb2JlcyBtYXkgYmUgc2VudC4KSW5kZXg6IHNjYW5fbGlzdHMuY2MKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gc2Nhbl9saXN0cy5jYwkocmV2aXNpb24gMzc2MTEpCisrKyBzY2FuX2xpc3RzLmNjCSh3
b3JraW5nIGNvcHkpCkBAIC0yMzksNyArMjM5LDExIEBACiAgIH0KIAogICBpZiAocmFuZ2VfdHlw
ZSAhPSAwICYmIDAgPT0gKHBvcnRzLT50Y3BfY291bnQgKyBwb3J0cy0+dWRwX2NvdW50ICsgcG9y
dHMtPnNjdHBfY291bnQgKyBwb3J0cy0+cHJvdF9jb3VudCkpCi0gICAgZmF0YWwoIk5vIHBvcnRz
IHNwZWNpZmllZCAtLSBJZiB5b3UgcmVhbGx5IGRvbid0IHdhbnQgdG8gc2NhbiBhbnkgcG9ydHMg
dXNlIHBpbmcgc2Nhbi4uLiIpOworICB7CisgICAgZXJyb3IoIk5vIGNvbW1vbiBwb3J0cyBzcGVj
aWZpZWQgLSBVbmxlc3MgeW91IHNwZWNpZmllZCBwb3J0cyBmb3Igc3BlY2lmaWMgdGFyZ2V0cywg
eW91IHNob3VsZCB1c2UgcGluZyBzY2FuLi4uIik7CisgICAgby5ub2NvbW1vbnBvcnRzID0gdHJ1
ZTsKKyAgfQorICAgIAogCiAgIGlmIChwb3J0cy0+dGNwX2NvdW50KSB7CiAgICAgcG9ydHMtPnRj
cF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHBvcnRzLT50Y3BfY291bnQg
KiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKQEAgLTU5Myw4ICs1OTcsNDYgQEAKICAgICBmcmVl
KHBvcnRzLT5wcm90b19waW5nX3BvcnRzKTsKIH0KIAorc3RydWN0IHNjYW5fbGlzdHMgY2xvbmVf
c2Nhbl9saXN0cyhjb25zdCBzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpCit7CisJc2Nhbl9saXN0
cyBzID0geyAwIH07CisJaWYgKHBvcnRzLT50Y3BfcG9ydHMpCisJeworCQlzLnRjcF9jb3VudCA9
IHBvcnRzLT50Y3BfY291bnQ7CisJCXNpemVfdCB0Y3Bfc2l6ZSA9IHBvcnRzLT50Y3BfY291bnQg
KiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCQlzLnRjcF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9y
dCAqKXNhZmVfemFsbG9jKHRjcF9zaXplKTsKKwkJbWVtY3B5KHMudGNwX3BvcnRzLCBwb3J0cy0+
dGNwX3BvcnRzLCB0Y3Bfc2l6ZSk7CisJfQogCisJaWYgKHBvcnRzLT51ZHBfcG9ydHMpCisJewor
CQlzLnVkcF9jb3VudCA9IHBvcnRzLT51ZHBfY291bnQ7CisJCXNpemVfdCB1ZHBfc2l6ZSA9IHBv
cnRzLT51ZHBfY291bnQgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCQlzLnVkcF9wb3J0cyA9
ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHVkcF9zaXplKTsKKwkJbWVtY3B5KHMudWRw
X3BvcnRzLCBwb3J0cy0+dWRwX3BvcnRzLCB1ZHBfc2l6ZSk7CisJfQogCisJaWYgKHBvcnRzLT5z
Y3RwX3BvcnRzKQorCXsKKwkJcy5zY3RwX2NvdW50ID0gcG9ydHMtPnNjdHBfY291bnQ7CisJCXNp
emVfdCBzY3RwX3NpemUgPSBwb3J0cy0+c2N0cF9jb3VudCAqIHNpemVvZih1bnNpZ25lZCBzaG9y
dCk7CisJCXMuc2N0cF9wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHNjdHBf
c2l6ZSk7CisJCW1lbWNweShzLnNjdHBfcG9ydHMsIHBvcnRzLT5zY3RwX3BvcnRzLCBzY3RwX3Np
emUpOworCX0KKworCWlmIChwb3J0cy0+cHJvdHMpCisJeworCQlzLnByb3RfY291bnQgPSBwb3J0
cy0+cHJvdF9jb3VudDsKKwkJc2l6ZV90IHByb3RzX3NpemUgPSBwb3J0cy0+cHJvdF9jb3VudCAq
IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCXMucHJvdHMgPSAodW5zaWduZWQgc2hvcnQgKilz
YWZlX3phbGxvYyhwcm90c19zaXplKTsKKwkJbWVtY3B5KHMucHJvdHMsIHBvcnRzLT5wcm90cywg
cHJvdHNfc2l6ZSk7CisJfQorCisJcmV0dXJuIHM7Cit9CisKKworCiAvKiBKdXN0IGEgcm91dGlu
ZSBmb3Igb2J0YWluaW5nIGEgc3RyaW5nIGZvciBwcmludGluZyBiYXNlZCBvbiB0aGUgc2NhbnR5
cGUgKi8KIGNvbnN0IGNoYXIgKnNjYW50eXBlMnN0cihzdHlwZSBzY2FudHlwZSkgewogCkBAIC02
ODMsMyArNzI1LDQ4IEBACiAKIH0KIAorc3RhdGljIHZvaWQgaW5zZXJ0X3BvcnRfaW50b19tZXJn
ZV9saXN0KHVuc2lnbmVkIHNob3J0ICptbGlzdCwKKyAgaW50ICptZXJnZWRfcG9ydF9jb3VudCwK
KyAgdW5zaWduZWQgc2hvcnQgcCkgeworICBpbnQgaTsKKyAgLy8gbWFrZSBzdXJlIHRoZSBwb3J0
IGlzbid0IGFscmVhZHkgaW4gdGhlIGxpc3QKKyAgZm9yIChpID0gMDsgaSA8ICptZXJnZWRfcG9y
dF9jb3VudDsgaSsrKSB7CisgICAgaWYgKG1saXN0W2ldID09IHApIHsKKyAgICAgIHJldHVybjsK
KyAgICB9CisgIH0KKyAgbWxpc3RbKm1lcmdlZF9wb3J0X2NvdW50XSA9IHA7CisgICgqbWVyZ2Vk
X3BvcnRfY291bnQpKys7Cit9CisKK3Vuc2lnbmVkIHNob3J0ICptZXJnZV9wb3J0X2xpc3RzKHVu
c2lnbmVkIHNob3J0ICpwb3J0X2xpc3QxLCBpbnQgY291bnQxLAorICB1bnNpZ25lZCBzaG9ydCAq
cG9ydF9saXN0MiwgaW50IGNvdW50MiwKKyAgaW50ICptZXJnZWRfcG9ydF9jb3VudCkgeworICBp
bnQgaTsKKyAgdW5zaWduZWQgc2hvcnQgKm1lcmdlZF9wb3J0X2xpc3QgPSBOVUxMOworCisgICpt
ZXJnZWRfcG9ydF9jb3VudCA9IDA7CisKKyAgbWVyZ2VkX3BvcnRfbGlzdCA9CisgICAgKHVuc2ln
bmVkIHNob3J0ICopc2FmZV96YWxsb2MoKGNvdW50MSArIGNvdW50MikgKiBzaXplb2YodW5zaWdu
ZWQgc2hvcnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsKKyAgICBpbnNl
cnRfcG9ydF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlzdCwKKyAgICAgIG1lcmdlZF9w
b3J0X2NvdW50LAorICAgICAgcG9ydF9saXN0MVtpXSk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8
IGNvdW50MjsgaSsrKSB7CisgICAgaW5zZXJ0X3BvcnRfaW50b19tZXJnZV9saXN0KG1lcmdlZF9w
b3J0X2xpc3QsCisgICAgICBtZXJnZWRfcG9ydF9jb3VudCwKKyAgICAgIHBvcnRfbGlzdDJbaV0p
OworICB9CisKKyAgLy8gaWYgdGhlcmUgd2VyZSBkdXBsaWNhdGUgcG9ydHMgdGhlbiB3ZSBjYW4g
c2F2ZSBzb21lIG1lbW9yeQorICBpZiAoKm1lcmdlZF9wb3J0X2NvdW50IDwgKGNvdW50MSArIGNv
dW50MikpIHsKKyAgICBtZXJnZWRfcG9ydF9saXN0ID0gKHVuc2lnbmVkIHNob3J0KikKKyAgICAg
IHNhZmVfcmVhbGxvYyhtZXJnZWRfcG9ydF9saXN0LAorICAgICAgKCptZXJnZWRfcG9ydF9jb3Vu
dCkgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgfQorCisgIHJldHVybiBtZXJnZWRfcG9y
dF9saXN0OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IHNjYW5fbGlzdHMu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBzY2FuX2xpc3RzLmgJKHJldmlzaW9uIDM3NjExKQorKysgc2Nhbl9s
aXN0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTAsOCArMTkwLDEwIEBACiAgICAgICAgICAgICAg
ICAgICAgdW5zaWduZWQgc2hvcnQgKipsaXN0LCBpbnQgKmNvdW50KTsKIHZvaWQgcmVtb3ZlcHRz
KGNvbnN0IGNoYXIgKmV4cHIsIHN0cnVjdCBzY2FuX2xpc3RzICogcG9ydHMpOwogdm9pZCBmcmVl
X3NjYW5fbGlzdHMoc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKK3N0cnVjdCBzY2FuX2xpc3Rz
IGNsb25lX3NjYW5fbGlzdHMoY29uc3Qgc3RydWN0IHNjYW5fbGlzdHMgKnBvcnRzKTsKIAogLyog
Z2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zICovCiBjb25zdCBjaGFyICpzY2FudHlwZTJzdHIoc3R5
cGUgc2NhbnR5cGUpOwordW5zaWduZWQgc2hvcnQgKm1lcmdlX3BvcnRfbGlzdHModW5zaWduZWQg
c2hvcnQgKnBvcnRfbGlzdDEsIGludCBjb3VudDEsIHVuc2lnbmVkIHNob3J0ICpwb3J0X2xpc3Qy
LCBpbnQgY291bnQyLCBpbnQgKm1lcmdlZF9wb3J0X2NvdW50KTsKIAogI2VuZGlmIC8qIFNDQU5f
TElTVFNfSCAqLwpJbmRleDogdGFyZ2V0cy5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0YXJnZXRzLmNjCShy
ZXZpc2lvbiAzNzYxMSkKKysrIHRhcmdldHMuY2MJKHdvcmtpbmcgY29weSkKQEAgLTQ0Niw2ICs0
NDYsMTIgQEAKICAgICB0LT51bnNjYW5uZWRfYWRkcnMgPSBocy0+Y3VycmVudF9ncm91cC5nZXRf
dW5zY2FubmVkX2FkZHJzKCk7CiAgIH0KIAorICB0LT50YXJnZXRfcG9ydHMgPSAmaHMtPmN1cnJl
bnRfZ3JvdXAuZ3JvdXBfcG9ydHM7CisgIHQtPnBvcnRzLm1lcmdlSG9zdFNwZWNpZmljUG9ydHMo
SVBQUk9UT19JUCwgdC0+dGFyZ2V0X3BvcnRzLT5wcm90cywgdC0+dGFyZ2V0X3BvcnRzLT5wcm90
X2NvdW50KTsKKyAgdC0+cG9ydHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1RDUCwg
dC0+dGFyZ2V0X3BvcnRzLT50Y3BfcG9ydHMsIHQtPnRhcmdldF9wb3J0cy0+dGNwX2NvdW50KTsK
KyAgdC0+cG9ydHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1VEUCwgdC0+dGFyZ2V0
X3BvcnRzLT51ZHBfcG9ydHMsIHQtPnRhcmdldF9wb3J0cy0+dWRwX2NvdW50KTsKKyAgdC0+cG9y
dHMubWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhJUFBST1RPX1NDVFAsIHQtPnRhcmdldF9wb3J0cy0+
c2N0cF9wb3J0cywgdC0+dGFyZ2V0X3BvcnRzLT5zY3RwX2NvdW50KTsKKwogICAvKiBXZSBmaWd1
cmUgb3V0IHRoZSBzb3VyY2UgSVAvZGV2aWNlIElGRgogICAgKiB0aGUgc2NhbiB0eXBlIHJlcXVp
cmVzIHVzIHRvICovCiAgIGlmIChvLlJhd1NjYW4oKSkgewo=

--=_mixed 0048D204C12583D6_=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Sent through the dev mailing list
https://nmap.org/mailman/listinfo/dev
Archived at http://seclists.org/nmap-dev/
--=_mixed 0048D204C12583D6_=--