<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.kde.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.6"
          urlbase="https://bugs.kde.org/"
          
          maintainer="sysadmin@kde.org"
>

    <bug>
          <bug_id>150979</bug_id>
          
          <creation_ts>2007-10-18 15:36:05 +0000</creation_ts>
          <short_desc>Picasa Export tool does not work</short_desc>
          <delta_ts>2018-03-23 12:09:02 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>2</classification_id>
          <classification>Applications</classification>
          <product>digikam</product>
          <component>Plugin-WebService-Google</component>
          <version>unspecified</version>
          <rep_platform>openSUSE</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>NOR</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>krienke</reporter>
          <assigned_to name="Digikam Developers">digikam-bugs-null</assigned_to>
          <cc>aaronw</cc>
    
    <cc>adrozdoff</cc>
    
    <cc>caulier.gilles</cc>
    
    <cc>dragonphyre2001</cc>
    
    <cc>gareth.doutch</cc>
    
    <cc>philippe.roubach</cc>
    
    <cc>robert.munteanu</cc>
    
    <cc>vardhman</cc>
          
          <cf_commitlink></cf_commitlink>
          <cf_versionfixedin>0.1.0</cf_versionfixedin>
          <cf_sentryurl></cf_sentryurl>
          <votes>40</votes>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>550524</commentid>
    <comment_count>0</comment_count>
    <who name="">krienke</who>
    <bug_when>2007-10-18 15:36:05 +0000</bug_when>
    <thetext>Version:           0.1.5beta1 (using KDE KDE 3.5.7)
Installed from:    SuSE RPMs
Compiler:          gcc 4.2.1 
OS:                Linux

I run digikam 0.9.3 beta1 as well as kipi-plugins 0.1.5-beta1 .  I would like 
to use the Picasa plugin. I can open the plugins dialog and I can download a 
list of Picasa-albums but I cannot create new albums via the plugin and most important, I cannot upload any photo to picasa web. I select a photo and say &quot;start upload&quot;. Then a progress-bar appears but this progress-bar will 
never show any progress. I looked at the network traffic and I can see that there is some traffic for about 5 sec to td-in-f91.google.com but then this traffic stopps. I already disabled my firewall to exclude this as a reason.

I do not have any problems logging in and loading up photos to picasa web via 
http://picasaweb.google.de/  .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550533</commentid>
    <comment_count>1</comment_count>
    <who name="">caulier.gilles</who>
    <bug_when>2007-10-18 16:01:56 +0000</bug_when>
    <thetext>Vardhman,

Are you few comments about this file ?

Gilles</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550558</commentid>
    <comment_count>2</comment_count>
    <who name="Vardhman">vardhman</who>
    <bug_when>2007-10-18 17:37:35 +0000</bug_when>
    <thetext>I could verify that new album issue. My guess is that the list of Albums returned by the server doesn&apos;t list empty albums or there might be issue in the way I parse  the returned data.

As far as uploading the photos is concerned I have tried uploading the photos many times but all my trial used login for picasaweb.google.com, I can&apos;t immediately think if the .com and .de may be working differently.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550662</commentid>
    <comment_count>3</comment_count>
    <who name="">krienke</who>
    <bug_when>2007-10-19 08:50:08 +0000</bug_when>
    <thetext>Am Donnerstag, 18. Oktober 2007 17:37:36 schrieb Vardhman:
&gt; ------- I could verify that new album issue. My guess is that the list of
&gt; Albums returned by the server doesn&apos;t list empty albums or there might be
&gt; issue in the way I parse  the returned data.
&gt;
&gt; As far as uploading the photos is concerned I have tried uploading the
&gt; photos many times but all my trial used login for picasaweb.google.com, I
&gt; can&apos;t immediately think if the .com and .de may be working differently.


Well after all I have no choice of selecting where the plugin does connect to 
(.com or .de). Perhaps this causes the trouble. On the other hand I tried to 
logon to picasaweb.google.com  with my browser which worked fine for me. I 
had no problems uploading a photo via the picasa webinterface using 
http://picasaweb.google.com . 

I just tried to export another photo on my suse10.3 system  and again the 
progress bar does not show any progress. Using netstat --inet I see that 
there is a connection:

bliss:~ # netstat --inet -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 141.26.64.65:38409      209.85.167.91:80        TIME_WAIT

I tried to telnet this host on port 80 and entered a get:

# telnet  209.85.167.91 80
Connected to 209.85.167.91.
Escape character is &apos;^]&apos;.
get


&lt;html&gt;&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot;&gt;
&lt;title&gt;400 Bad Request&lt;/title&gt;
&lt;style&gt;&lt;!--
...

So the connection works but the plugins connection remains in TIME_WAIT 
status.  Strange.

Rainer
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554162</commentid>
    <comment_count>4</comment_count>
    <who name="">krienke</who>
    <bug_when>2007-11-08 14:36:48 +0000</bug_when>
    <thetext>I had another idea to track the bug. Perhaps this info helps to isolate the problem. I started a photo upload and used wireshark to show whats going on. The host where data were uploaded to is 72.14.255.91 (td-in-f91.google.com). Using the follow tcp stream Method in wireshark I can see the following:

------start --------------------------------------------------------------------
POST /data/feed/api/user/krienke@uni-koblenz.de/album/Test HTTP/1.1
User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.6) Gecko/20040113
Pragma: no-cache
Cache-control: no-cache
Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate
Accept-Charset: iso-8859-15, utf-8;q=0.5, *;q=0.5
Accept-Language: de, en
Host: www.picasaweb.google.com
Cookie: rememberme=false; PREF=ID=b0045a98edc4465c:TM=1185257727:LM=1185257727:S=sUkSdTkFUMEGk0Ul
Authorization: GoogleLogin auth=
Content-Type: multipart/related; boundary=----------rcL6ZwtjEeQEUrxtcTZ8hC1MaxC2ITI73bBcX5KkjkyBat4AMdI1pIN
Connection: Keep-Alive
Content-Length: 134960

------------rcL6ZwtjEeQEUrxtcTZ8hC1MaxC2ITI73bBcX5KkjkyBat4AMdI1pIN
Content-Disposition: form-data; name=&quot;test&quot;
Content-Type: application/atom+xml
Mime-version: 1.0 
Content-Length: 207

&lt;entry xmlns=&apos;http://www.w3.org/2005/Atom&apos;&gt;&lt;title&gt;dsc_3256.jpg&lt;/title&gt;&lt;summary&gt;&lt;/summary&gt;&lt;category scheme=&quot;http://schemas.google.com/g/2005#kind&quot; term=&quot;http://schemas.google.com/photos/2007#photo&quot; /&gt;&lt;/entry&gt;
------------rcL6ZwtjEeQEUrxtcTZ8hC1MaxC2ITI73bBcX5KkjkyBat4AMdI1pIN
Content-Disposition: form-data; name=&quot;photo&quot;; filename=&quot;dsc_3256.jpg&quot;
Content-Length: 134295
Content-Type: image/jpeg

......JFIF..............Exif..MM.*.....
...................
.........................................(...........1.....
.....2.......................i..............NIKON CORPORATION.NIKON D80....,.......,....Ver.1.01 .2007:10:22 15:12:34.

....
&lt;more binary data&gt;
....

------------rcL6ZwtjEeQEUrxtcTZ8hC1MaxC2ITI73bBcX5KkjkyBat4AMdI1pIN--HTTP/1.1 500 Internal Server Error
Content-Type: text/plain
Content-Encoding: gzip
Transfer-Encoding: chunked
Cache-control: private, must-revalidate, max-age=0
Date: Thu, 08 Nov 2007 12:58:10 GMT
Server: GFE/1.3
Connection: Close
------end---------------------------------------------------------

So the photo (from my D80) is transferred until the http server repots an error.

After this try I uploaded a photo to picasa using the webinterface of google picase itself. Here too the upload server to which the photo was transferred was (shown by wireshark) td-in-f91.google.com and this time it worked just fine.

Rainer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554906</commentid>
    <comment_count>5</comment_count>
    <who name="Vardhman">vardhman</who>
    <bug_when>2007-11-12 21:32:07 +0000</bug_when>
    <thetext>Hey Krienke,

Thanks for helping on isolating the bug, sorry for the delay in response. I
was on vacation. I guess I am understanding the problem now. Just a few
things I want to verify from you (inlined below):

&gt; ------start
&gt; --------------------------------------------------------------------
&gt; POST /data/feed/api/user/krienke uni-koblenz de/album/Test HTTP/1.1
&gt;

The string after user/ and before /album is username for this particular url
the username appears to be &quot;krienke uni-koblenz de&quot; which is a string with
atlesast 2 spaces and a &apos;-&apos;, If I am not wrong this doesn&apos;t hold as a valid
user name. A user name is your google account name or your gmail id.  So
what I want to ask you here is that
1) Did you give your gmail id for the username field ?
2) Was the software able to fetch a list of albums for you given login ?

These two answers will greatly help me in understanding the problem better.


regards
Vardhman
Hey Krienke,&lt;br&gt;&lt;br&gt;Thanks for helping on isolating the bug, sorry for the delay in response. I was on vacation. I guess I am understanding the problem now. Just a few things I want to verify from you (inlined below):&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;&lt;div&gt;&lt;div class=&quot;Wj3C7c&quot;&gt;------start --------------------------------------------------------------------
&lt;br&gt;POST /data/feed/api/user/krienke uni-koblenz de/album/Test HTTP/1.1&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;The string after user/ and before /album is username for this particular url the username appears to be &amp;quot;krienke uni-koblenz de&amp;quot; which is a string with atlesast 2 spaces and a &amp;#39;-&amp;#39;, If I am not wrong this doesn&amp;#39;t hold as a valid user name. A user name is your google account name or your gmail id.&amp;nbsp; So what I want to ask you here is that 
&lt;br&gt;1) Did you give your gmail id for the username field ?&lt;br&gt;2) Was the software able to fetch a list of albums for you given login ?&lt;br&gt;&lt;br&gt;These two answers will greatly help me in understanding the problem better.&lt;br&gt;
 &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;regards&lt;br&gt;Vardhman&lt;br&gt;-- &lt;br&gt;Blogs: &lt;a href=&quot;http://vardhman.blogspot.com&quot;&gt;http://vardhman.blogspot.com&lt;/a&gt;&lt;br&gt;
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554981</commentid>
    <comment_count>6</comment_count>
    <who name="">krienke</who>
    <bug_when>2007-11-13 07:31:22 +0000</bug_when>
    <thetext>Am Montag, 12. November 2007 21:32:09 schrieb Vardhman:

Hello Vardhman,

My picasa user name is krienke &lt;at&gt; uni-koblenz.de (Replace at with @ and 
delete spaces). There are no spaces inside the whole string. When I start the 
picasa export plugin I am asked for the username and the name thats shown is 
correct. This time I also tried to click on &quot;Change user&quot; and then entered my 
picasa username again but this did not change a thing.  

Before this I created a new album in picasa using the picasa web interface. 
After I started the export-plugin it immedeately showed this new album. Next 
I again tried to uplad a photo but this simply hangs, nothing happens. Next I 
closed the export plugin reopened it and tried to create a new album. There 
is no error message when I say &quot;Create&quot; but the new album is not created when 
I look at my albums in the web interface nor is it shown in the export plugin 
after a &quot;reload abums&quot;. 

Here ist a snapshot how the picasa export window looks like when uploading a 
photo just as an info:

http://www.uni-koblenz.de/~krienke/tmp/picasaexport.jpg

Thanks
Rainer Krienke
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573200</commentid>
    <comment_count>7</comment_count>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-19 21:38:34 +0000</bug_when>
    <thetext>The same problem is with kipi plugins version 0.1.5-rc1.

The way to omit this problem is to prepare new album in picasa web interface. The album name cannot contain any spaces. In case some album names contain spaces the plugin cannot fetch album names from serwer (the &quot;Not feteched&quot; info is displaed in the album names list instead of actual names).
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575093</commentid>
    <comment_count>8</comment_count>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-25 08:49:54 +0000</bug_when>
    <thetext>Lets vote for this bug to increase the possibility that developers will take it serious and check it in order to confirm.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575095</commentid>
    <comment_count>9</comment_count>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-25 09:07:39 +0000</bug_when>
    <thetext>The one thing is quite strange for me. I compared source files of kipi plugins  0.1.5-rc1 with 0.1.5beta1 (subdirectory oicassawebexport). The only files which are different in two versions are: Makefile, kipiplugin_picasawebexport.desktop and *.moc files). The sources *.c and headers *.h are identical, but some kind of regression is visible:
Before, I used 0.1.5beta1, compiled from sources, under opensuse 10.3 i586. The export worked propoely except for album names and album creation. I had to create album by www picasa interface (in web browser) and the name couldn&apos;t include any spaces. After all the plugin fetched album names and could export photos. 
Now I use 0.1.5-rc1, also compiled from sources, with the same version of digikam 0.9.3 (installed from rpm) under opensuse 10.3 but now x64 version.
The plugin cannot fetch album names nor can upload photos. Even if I select one (any) from album names list, the upload stalls at 0%.
I suppose that there may be some changes in API on the Google side. I think I should install again older kipi plugins 0.1.5beta1 and test it.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575096</commentid>
    <comment_count>10</comment_count>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-25 09:11:21 +0000</bug_when>
    <thetext>The one thing is quite strange for me. I compared source files of kipi plugins  0.1.5-rc1 with 0.1.5beta1 (subdirectory oicassawebexport). The only files which are different in two versions are: Makefile, kipiplugin_picasawebexport.desktop and *.moc files). The sources *.c and headers *.h are identical, but some kind of regression is visible:
Before, I used 0.1.5beta1, compiled from sources, under opensuse 10.3 i586. The export worked propoely except for album names and album creation. I had to create album by www picasa interface (in web browser) and the name couldn&apos;t include any spaces. After all the plugin fetched album names and could export photos. 
Now I use 0.1.5-rc1, also compiled from sources, with the same version of digikam 0.9.3 (installed from rpm) under opensuse 10.3 but now x64 version.
The plugin cannot fetch album names nor can upload photos. Even if I select one (any) from album names list, the upload stalls at 0%.
I suppose that there may be some changes in API on the Google side. I think I should install again older kipi plugins 0.1.5beta1 and test it.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575098</commentid>
    <comment_count>11</comment_count>
      <attachid>23267</attachid>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-25 09:12:25 +0000</bug_when>
    <thetext>Created attachment 23267
Illustration of album names fetching problem</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575099</commentid>
    <comment_count>12</comment_count>
    <who name="Darek Borkowski">borkows</who>
    <bug_when>2008-01-25 09:13:42 +0000</bug_when>
    <thetext>sorry for duplicated comment :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575107</commentid>
    <comment_count>13</comment_count>
    <who name="">krienke</who>
    <bug_when>2008-01-25 09:23:36 +0000</bug_when>
    <thetext>Am Freitag, 25. Januar 2008 09:11:21 schrieb Darek Borkowski:

I can tell that a friend of mine lately had to upgrade to a newer version of 
picasa in order to upload his photos to google allthough he did not change 
anything and had been able to upload photos before. Because of your 
experience and what I saw with my friend it could be that google simply 
change part of the protocol.

Using 1.5.1-beta1 I am still unable to upload images and now even folders 
appear always as &quot;Not fetched&quot;. Some time ago at least the folders were shown 
with their name. For me it does not help to create an album (without any 
space or special character in the web frontend of picasa. When I try to 
upload a photo the process still hangs.

Rainer
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575300</commentid>
    <comment_count>14</comment_count>
    <who name="Angelo Naselli">anaselli</who>
    <bug_when>2008-01-25 22:40:52 +0000</bug_when>
    <thetext>&gt; Using 1.5.1-beta1 I am still unable to upload images and now even folders 

According to NEWS file nothing has been released concerning Picasa export plugin,
sorry.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597463</commentid>
    <comment_count>15</comment_count>
    <who name="Alexander Drozdov">adrozdoff</who>
    <bug_when>2008-04-28 03:32:38 +0000</bug_when>
    <thetext>Hi all, 

I try to use picasawebuploader plugin and it does not work for me, I try to fix next functionality:

1. Display gallery list (it does not work for me in some cases)
2. In gallery list display all galleryes, instead public only
3. Uploading files to galley, that name contained from two or more latin words or from one or more Russian (try for Russian and English only) words.

My patch:
http://hatred.homelinux.net/~hatred/picasawebexport_patch.diff

Sorry for big size, my editor reformat files on saving. Patch is based on 0.1.5rc2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597464</commentid>
    <comment_count>16</comment_count>
      <attachid>24540</attachid>
    <who name="Alexander Drozdov">adrozdoff</who>
    <bug_when>2008-04-28 03:35:23 +0000</bug_when>
    <thetext>Created attachment 24540
My fix for basic functionality

My fix for basic functionality of picaseweb exporter</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597489</commentid>
    <comment_count>17</comment_count>
    <who name="Vardhman">vardhman</who>
    <bug_when>2008-04-28 09:48:09 +0000</bug_when>
    <thetext>Hey Alex,
  Thanks for the patch, I would love to review it and accept it but right
now the formatting has lead to a very big change list with almost all lines
being changes (every line has got some extra white spaces in the beginning
for e.g) please make sure only the lines which you modified show up in the
patch Change list.


Vardhman
On Sun, Apr 27, 2008 at 6:35 PM, Alexander Drozdov &lt;adrozdoff@gmail.com&gt;
wrote:

[bugs.kde.org quoted mail]



Hey Alex,&lt;br&gt;&amp;nbsp; Thanks for the patch, I would love to review it and accept it but right now the formatting has lead to a very big change list with almost all lines being changes (every line has got some extra white spaces in the beginning for e.g) please make sure only the lines which you modified show up in the patch Change list.&lt;br&gt;
&lt;br&gt;&lt;br&gt;Vardhman&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Sun, Apr 27, 2008 at 6:35 PM, Alexander Drozdov &amp;lt;&lt;a href=&quot;mailto:adrozdoff@gmail.com&quot;&gt;adrozdoff@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
&lt;div class=&quot;Ih2E3d&quot;&gt;------- You are receiving this mail because: -------&lt;br&gt;
You are on the CC list for the bug, or are watching someone who is.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://bugs.kde.org/show_bug.cgi?id=150979&quot; target=&quot;_blank&quot;&gt;http://bugs.kde.org/show_bug.cgi?id=150979&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;------- Additional Comments From adrozdoff gmail com &amp;nbsp;2008-04-28 03:35 -------&lt;br&gt;
Created an attachment (id=24540)&lt;br&gt;
&amp;nbsp;--&amp;gt; (&lt;a href=&quot;http://bugs.kde.org/attachment.cgi?id=24540&amp;amp;action=view&quot; target=&quot;_blank&quot;&gt;http://bugs.kde.org/attachment.cgi?id=24540&amp;amp;action=view&lt;/a&gt;)&lt;br&gt;
My fix for basic functionality&lt;br&gt;
&lt;br&gt;
My fix for basic functionality of picaseweb exporter&lt;br&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Blogs: &lt;a href=&quot;http://vardhman.blogspot.com&quot;&gt;http://vardhman.blogspot.com&lt;/a&gt;&lt;br&gt;
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597637</commentid>
    <comment_count>18</comment_count>
    <who name="Alexander Drozdov">adrozdoff</who>
    <bug_when>2008-04-29 01:41:34 +0000</bug_when>
    <thetext>Hi Vardhman,

Ok, today I try to prepare new patch with my changes only and upload it to this bug-report.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>604004</commentid>
    <comment_count>19</comment_count>
      <attachid>24926</attachid>
    <who name="">x3ri7yz02</who>
    <bug_when>2008-05-25 02:01:45 +0000</bug_when>
    <thetext>Created attachment 24926
QObject errors seen on console during failed export from Digikam to Picasa

Testing with 0.9.4-beta5:

- Picasa export doesn&apos;t work.  Unable to list albums.
- lots of errors reported on the console - one example below, others in
attached document.

	
		QObject::connect: No such signal
KIPIPicasawebExportPlugin::PicasawebTalker::signalGetAlbumsListFailed(const
QString&amp;msg)
		QObject::connect:  (sender name:   &apos;unnamed&apos;)
		QObject::connect:  (receiver name: &apos;unnamed&apos;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>604038</commentid>
    <comment_count>20</comment_count>
    <who name="">caulier.gilles</who>
    <bug_when>2008-05-25 10:45:36 +0000</bug_when>
    <thetext>*** Bug 157148 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>604052</commentid>
    <comment_count>21</comment_count>
    <who name="">caulier.gilles</who>
    <bug_when>2008-05-25 11:17:48 +0000</bug_when>
    <thetext>To Tauri, #19: 

i have already fixed all broken signal/slots connections to svn. Are you use a fresh checkout of svn code. Also, i recommend to clean-up preview compilations using &apos;make clean&apos;.

Gilles Caulier</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613959</commentid>
    <comment_count>22</comment_count>
    <who name="Robert Munteanu">robert.munteanu</who>
    <bug_when>2008-06-20 21:52:08 +0000</bug_when>
    <thetext>*** This bug has been confirmed by popular vote. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>616122</commentid>
    <comment_count>23</comment_count>
    <who name="Fabien">fabien.ubuntu</who>
    <bug_when>2008-06-26 17:33:30 +0000</bug_when>
    <thetext>Does someone use this plugin with success with latest svn version (kipi + digikam) ?

For me, when starting the upload, I have a stalled progress bar and no pictures get uploaded...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>616197</commentid>
    <comment_count>24</comment_count>
    <who name="Vardhman">vardhman</who>
    <bug_when>2008-06-26 19:28:46 +0000</bug_when>
    <thetext>I have used the same and works quite well for me. to verify I just uploaded
a photo again.

My digikam version: 0.9.4
Kipi library version: 0.1.6.

To understand the reason behind failure in you case, it would be great if
you launch the application from console and cut paste the logs (if compiled
in debug mode).
If its possible for you to help by tracing the problem using one of the
network traffic monitoring tools like ethereal or tcpdump it would be great
too.

BTW while verifying this bug I found that the plugin doesn&apos;t indicate the
login failure problem and shows the upload screen active even if you enter
wrong password. This is a new bug, I will try to put the patch asap.


Vardhman
On Thu, Jun 26, 2008 at 9:03 PM, Fabien &lt;fabien.ubuntu@gmail.com&gt; wrote:

[bugs.kde.org quoted mail]



I have used the same and works quite well for me. to verify I just uploaded a photo again. &lt;br&gt;&lt;br&gt;My digikam version: 0.9.4&lt;br&gt;Kipi library version: &lt;a href=&quot;http://0.1.6.&quot;&gt;0.1.6.&lt;/a&gt;&lt;br&gt;&lt;br&gt;To understand the reason behind failure in you case, it would be great if you launch the application from console and cut paste the logs (if compiled in debug mode). &lt;br&gt;
If its possible for you to help by tracing the problem using one of the network traffic monitoring tools like ethereal or tcpdump it would be great too.&lt;br&gt;&lt;br&gt;BTW while verifying this bug I found that the plugin doesn&amp;#39;t indicate the login failure problem and shows the upload screen active even if you enter wrong password. This is a new bug, I will try to put the patch asap.&lt;br&gt;
&lt;br&gt;&lt;br&gt;Vardhman&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Thu, Jun 26, 2008 at 9:03 PM, Fabien &amp;lt;&lt;a href=&quot;mailto:fabien.ubuntu@gmail.com&quot;&gt;fabien.ubuntu@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
&lt;div class=&quot;Ih2E3d&quot;&gt;------- You are receiving this mail because: -------&lt;br&gt;
&lt;/div&gt;You are the assignee for the bug, or are watching the assignee.&lt;br&gt;
&lt;div class=&quot;Ih2E3d&quot;&gt;&lt;br&gt;
&lt;a href=&quot;http://bugs.kde.org/show_bug.cgi?id=150979&quot; target=&quot;_blank&quot;&gt;http://bugs.kde.org/show_bug.cgi?id=150979&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------- Additional Comments From fabien.ubuntu gmail com &amp;nbsp;2008-06-26 17:33 -------&lt;br&gt;
Does someone use this plugin with success with latest svn version (kipi + digikam) ?&lt;br&gt;
&lt;br&gt;
For me, when starting the upload, I have a stalled progress bar and no pictures get uploaded...&lt;br&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;Wj3C7c&quot;&gt;_______________________________________________&lt;br&gt;
Kde-imaging mailing list&lt;br&gt;
&lt;a href=&quot;mailto:Kde-imaging@kde.org&quot;&gt;Kde-imaging@kde.org&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://mail.kde.org/mailman/listinfo/kde-imaging&quot; target=&quot;_blank&quot;&gt;https://mail.kde.org/mailman/listinfo/kde-imaging&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Blogs: &lt;a href=&quot;http://vardhman.blogspot.com&quot;&gt;http://vardhman.blogspot.com&lt;/a&gt;&lt;br&gt;
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>638427</commentid>
    <comment_count>25</comment_count>
    <who name="Dragon">dragonphyre2001</who>
    <bug_when>2008-08-18 07:31:00 +0000</bug_when>
    <thetext>For whatever info it can contribute I have this bug on Debian Lenny.  I have found that if I create or change a album on the Picassa site to be public vs. private I can load those folders in the list.  And while it takes a while to upload the photo ( due to compression?) it will upload to a public gallery.

I have also discovered that if a Picassa folder has spaces and is public it will show in the list but the upload will fail.  If you remove the spaces and leave it public the upload will complete.

So at least a work around is to create a public folder with no spaces in the name and upload.  If you desire to keep it private vs. public you will need to go into the web album and change properties.

While not technical I hope this helps the devs.  This is really such a shining example of a great Linux/KDE app, I enjoy it far better than Picassa and at least can now use it again.  I&apos;m sure one day this will be fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>641619</commentid>
    <comment_count>26</comment_count>
    <who name="Vardhman">vardhman</who>
    <bug_when>2008-08-27 20:24:33 +0000</bug_when>
    <thetext>Hey Dragon,
Based on your detailed explanation, I have just fixed the bug related to spaces in album names. 
Strangely the fix for the listing of private albums has been done quite long back ~2 months at least, I am not sure if the version of yours is older than that.

If someone can test the feature on the latest SVN checkout, and give a feedback, I would promise a quick turnaround :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>665298</commentid>
    <comment_count>27</comment_count>
    <who name="Philippe ROUBACH">philippe.roubach</who>
    <bug_when>2008-11-15 13:49:03 +0000</bug_when>
    <thetext>i discovered an interesting thing :

when i first used picasaweb i create a count with :

id : &lt;name&gt;@free.fr
password : &lt;my password&gt;

then

later

with my google count

i activated and explored the google tool gmail then google created
a new mail address  &lt;first name&gt;.&lt;last name&gt;@gmail.com

i don&apos;t use gmail address and i don&apos;t use it to connect to google

i use picasaweb and picasa soft with
id : &lt;name&gt;@free.fr
password : &lt;my password&gt;

this works well

now what happens with picasawebexport ?

if i use
id : &lt;name&gt;@free.fr
password : &lt;my password&gt;

picaswebexport does not list my album and freeze or crash if use &quot;start
uploading&quot;

if i use

id : &lt;first name&gt;.&lt;last name&gt;@gmail.com
pwd : &lt;password2&gt;

picasawebexport lists all my albums and i can upload a photo but not a video
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>23267</attachid>
            <date>2008-01-25 09:12:25 +0000</date>
            <delta_ts>2008-01-25 09:12:25 +0000</delta_ts>
            <desc>Illustration of album names fetching problem</desc>
            <filename>picasawebexport.png</filename>
            <type>image/png</type>
            <size>52312</size>
            <attacher name="Darek Borkowski">borkows</attacher>
            
              <data encoding="base64">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
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24540</attachid>
            <date>2008-04-28 03:35:23 +0000</date>
            <delta_ts>2008-04-28 03:35:23 +0000</delta_ts>
            <desc>My fix for basic functionality</desc>
            <filename>picasawebexport_patch.diff</filename>
            <type>text/plain</type>
            <size>161508</size>
            <attacher name="Alexander Drozdov">adrozdoff</attacher>
            
              <data encoding="base64">ZGlmZiAtTnVyIHBpY2FzYXdlYmV4cG9ydC5vcmlnL3BpY2FzYXdlYml0ZW0uaCBwaWNhc2F3ZWJl
eHBvcnQvcGljYXNhd2ViaXRlbS5oCi0tLSBwaWNhc2F3ZWJleHBvcnQub3JpZy9waWNhc2F3ZWJp
dGVtLmgJMjAwOC0wMi0xNiAwMToyOTo0MC4wMDAwMDAwMDAgKzEwMDAKKysrIHBpY2FzYXdlYmV4
cG9ydC9waWNhc2F3ZWJpdGVtLmgJMjAwOC0wMi0xNiAxNDoyNToxNy4wMDAwMDAwMDAgKzEwMDAK
QEAgLTIsOCArMiw4IEBACiAgKiBGaWxlICA6IHBpY2FzYXdlYml0ZW0uaAogICogQXV0aG9yOiBW
YXJkaG1hbiBKYWluIDx2YXJkaG1hbiBAIGdtYWlsLmNvbT4KICAqIERhdGUgIDogMjAwNy0xNi0w
NwotICogRGVzY3JpcHRpb24gOiAKLSAqIAorICogRGVzY3JpcHRpb24gOgorICoKICAqIENvcHly
aWdodCAyMDA3IEJ5IFZhcmRobWFuIEphaW4gPHZhcmRobWFuIEAgZ21haWwuY29tPgogCiAgKiBU
aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKQEAg
LTExLDEwNiArMTEsMTA3IEBACiAgKiBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnl0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOwogICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlv
dXIgb3B0aW9uKQogICogYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dy
YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgotICogCisgKgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKICNpZm5kZWYgUElDQVNBV0VCSVRFTV9ICi0j
ZGVmaW5lIFBJQ0FTQVdFQklURU1fSAorIyAgICBkZWZpbmUgUElDQVNBV0VCSVRFTV9ICiAKLSNp
bmNsdWRlIDxxc3RyaW5nLmg+CisjICAgIGluY2x1ZGUgPHFzdHJpbmcuaD4KIAogbmFtZXNwYWNl
IEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW4KIHsKIAogY2xhc3MgR1Bob3RvCiB7Ci1wdWJsaWM6
CisgICAgcHVibGljOgogCi0gICAgR1Bob3RvKCkKLSAgICB7Ci0gICAgICAgIC8vcmVmX251bSA9
IC0xOwotICAgIH0KLSAgICAKLSAgICBpbnQgICAgICAgICAgIHJlZl9udW07Ci0gICAgUVN0ckxp
c3QgICAgICB0YWdzOwotICAgIFFTdHJpbmcgICAgICAgdGl0bGU7Ci0gICAgUVN0cmluZyAgICAg
ICBkZXNjcmlwdGlvbjsKLSAgICBib29sIAkgaXNfcHVibGljOwotICAgIGJvb2wgCSBpc19wcml2
YXRlOwotICAgIGJvb2wgCSBpc19mYW1pbHk7Ci0gICAgCi19OyAgICAKKyAgICAgICAgR1Bob3Rv
KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yZWZfbnVtID0gLTE7CisgICAgICAgIH0KKwor
ICAgICAgICBpbnQgcmVmX251bTsKKyAgICAgICAgUVN0ckxpc3QgdGFnczsKKyAgICAgICAgUVN0
cmluZyB0aXRsZTsKKyAgICAgICAgUVN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgYm9vbCBp
c19wdWJsaWM7CisgICAgICAgIGJvb2wgaXNfcHJpdmF0ZTsKKyAgICAgICAgYm9vbCBpc19mYW1p
bHk7CisKK307CiAKIGNsYXNzIEZQaG90b0luZm8KIHsKLXB1YmxpYzoKKyAgICBwdWJsaWM6CiAK
LSAgICBGUGhvdG9JbmZvKCkKLSAgICB7Ci0gICAgaXNfcHVibGljPWZhbHNlOwotICAgIGlzX2Zh
bWlseT1mYWxzZTsKLSAgICBpc19mcmllbmQ9ZmFsc2U7Ci0gICAgfQotICAgIAotICAgIAotICAg
IFFTdHJpbmcgICAgICAgdGl0bGU7Ci0gICAgUVN0cmluZyAgICAgICBkZXNjcmlwdGlvbjsKLSAg
ICBRU3RyaW5nTGlzdCAgICAgIHRhZ3M7Ci0gICAgYm9vbCAJIGlzX3B1YmxpYzsKLSAgICBib29s
IAkgaXNfZnJpZW5kOwotICAgIGJvb2wgCSBpc19mYW1pbHk7CisgICAgICAgIEZQaG90b0luZm8o
KQorICAgICAgICB7CisgICAgICAgICAgICBpc19wdWJsaWMgPSBmYWxzZTsKKyAgICAgICAgICAg
IGlzX2ZhbWlseSA9IGZhbHNlOworICAgICAgICAgICAgaXNfZnJpZW5kID0gZmFsc2U7CisgICAg
ICAgIH0KKworCisgICAgICAgIFFTdHJpbmcgdGl0bGU7CisgICAgICAgIFFTdHJpbmcgZGVzY3Jp
cHRpb247CisgICAgICAgIFFTdHJpbmdMaXN0IHRhZ3M7CisgICAgICAgIGJvb2wgaXNfcHVibGlj
OworICAgICAgICBib29sIGlzX2ZyaWVuZDsKKyAgICAgICAgYm9vbCBpc19mYW1pbHk7CiB9Owog
CiBjbGFzcyBHQWxidW0KIHsKLXB1YmxpYzoKKyAgICBwdWJsaWM6CiAKLSAgICBHQWxidW0oKQot
ICAgIHsKLSAgICAgICAgcmVmX251bSAgICAgICAgPSAtMTsKLSAgICAgICAgcGFyZW50X3JlZl9u
dW0gPSAtMTsKLQotICAgICAgICBhZGQgICAgICAgICAgICA9IGZhbHNlOwotICAgICAgICB3cml0
ZSAgICAgICAgICA9IGZhbHNlOwotICAgICAgICBkZWxfaXRlbSAgICAgICA9IGZhbHNlOwotICAg
ICAgICBkZWxfYWxiICAgICAgICA9IGZhbHNlOwotICAgICAgICBjcmVhdGVfc3ViICAgICA9IGZh
bHNlOwotICAgIH0KLQotICAgIGludCAgICAgICAgICAgICAgICByZWZfbnVtOwotICAgIGludCAg
ICAgICAgICAgICAgICBwYXJlbnRfcmVmX251bTsKLSAgICBRU3RyaW5nICAgICAgICAgICAgbmFt
ZTsKLSAgICBRU3RyaW5nICAgICAgICAgICAgcGFyZW50TmFtZTsKLSAgICBRU3RyaW5nICAgICAg
ICAgICAgdGl0bGU7Ci0gICAgUVN0cmluZyAgICAgICAgICAgIHN1bW1hcnk7Ci0gICAgUVN0cmlu
ZyAgICAgICAgICAgIGJhc2V1cmw7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2wg
ICAgICAgICAgICAgICBhZGQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIHdyaXRlOwotICAgIGJv
b2wgICAgICAgICAgICAgICBkZWxfaXRlbTsKLSAgICBib29sICAgICAgICAgICAgICAgZGVsX2Fs
YjsKLSAgICBib29sICAgICAgICAgICAgICAgY3JlYXRlX3N1YjsKKyAgICAgICAgR0FsYnVtKCkK
KyAgICAgICAgeworICAgICAgICAgICAgcmVmX251bSA9IC0xOworICAgICAgICAgICAgcGFyZW50
X3JlZl9udW0gPSAtMTsKKworICAgICAgICAgICAgYWRkID0gZmFsc2U7CisgICAgICAgICAgICB3
cml0ZSA9IGZhbHNlOworICAgICAgICAgICAgZGVsX2l0ZW0gPSBmYWxzZTsKKyAgICAgICAgICAg
IGRlbF9hbGIgPSBmYWxzZTsKKyAgICAgICAgICAgIGNyZWF0ZV9zdWIgPSBmYWxzZTsKKyAgICAg
ICAgfQorCisgICAgICAgIGludCByZWZfbnVtOworICAgICAgICBpbnQgcGFyZW50X3JlZl9udW07
CisgICAgICAgIFFTdHJpbmcgbmFtZTsKKyAgICAgICAgUVN0cmluZyBwYXJlbnROYW1lOworICAg
ICAgICBRU3RyaW5nIHRpdGxlOworICAgICAgICBRU3RyaW5nIHN1bW1hcnk7CisgICAgICAgIFFT
dHJpbmcgYmFzZXVybDsKKworICAgICAgICBib29sIGFkZDsKKyAgICAgICAgYm9vbCB3cml0ZTsK
KyAgICAgICAgYm9vbCBkZWxfaXRlbTsKKyAgICAgICAgYm9vbCBkZWxfYWxiOworICAgICAgICBi
b29sIGNyZWF0ZV9zdWI7CiB9OwogCiBjbGFzcyBQaWNhc2FXZWJBbGJ1bQogewotCXB1YmxpYzoK
LQkJUGljYXNhV2ViQWxidW0oKQotCQl7Ci0JCQlpZD0iLTEiOwotCQl9Ci0JUVN0cmluZyAgaWQ7
Ci0JUVN0cmluZyBwcmltYXJ5OyAvLz0iMjQ4MyIgCi0JUVN0cmluZyBzZWNyZXQ7Ly89ImFiY2Rl
ZiIKLQlRU3RyaW5nIHNlcnZlcjsKLQlRU3RyaW5nIHBob3RvczsKLQlRU3RyaW5nIHRpdGxlOwot
CVFTdHJpbmcgZGVzY3JpcHRpb247CisgICAgcHVibGljOgorICAgICAgICBQaWNhc2FXZWJBbGJ1
bSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkID0gIi0xIjsKKyAgICAgICAgfQorICAgICAg
ICBRU3RyaW5nIGlkOworICAgICAgICBRU3RyaW5nIHByaW1hcnk7ICAgICAgICAvLz0iMjQ4MyIK
KyAgICAgICAgUVN0cmluZyBzZWNyZXQ7ICAgICAgICAgLy89ImFiY2RlZiIKKyAgICAgICAgUVN0
cmluZyBzZXJ2ZXI7CisgICAgICAgIFFTdHJpbmcgcGhvdG9zOworICAgICAgICBRU3RyaW5nIHRp
dGxlOworICAgICAgICBRU3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBRU3RyaW5nIG5hbWU7
CiB9OwogfQogI2VuZGlmIC8qIFBJQ0FTQVdFQklURU1fSCAqLwpkaWZmIC1OdXIgcGljYXNhd2Vi
ZXhwb3J0Lm9yaWcvcGljYXNhd2VidGFsa2VyLmNwcCBwaWNhc2F3ZWJleHBvcnQvcGljYXNhd2Vi
dGFsa2VyLmNwcAotLS0gcGljYXNhd2ViZXhwb3J0Lm9yaWcvcGljYXNhd2VidGFsa2VyLmNwcAky
MDA4LTAyLTE2IDAxOjI5OjQwLjAwMDAwMDAwMCArMTAwMAorKysgcGljYXNhd2ViZXhwb3J0L3Bp
Y2FzYXdlYnRhbGtlci5jcHAJMjAwOC0wMi0xNiAxNDo0MTo0Ni4wMDAwMDAwMDAgKzEwMDAKQEAg
LTQxLDggKzQxLDkgQEAKICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPGNzdGRpbz4KICNp
bmNsdWRlIDxjc3RkbGliPgotCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFt
PgorCiAjaW5jbHVkZSAicGljYXNhd2ViaXRlbS5oIgogI2luY2x1ZGUgImV4aWZyZXN0b3Jlci5o
IgogI2luY2x1ZGUgIm1wZm9ybS5oIgpAQCAtNTIsNzQwICs1Myw5MjggQEAKICNpbmNsdWRlICJw
aWNhc2F3ZWJsb2dpbi5oIgogCiBjbGFzcyBQaWNhc2F3ZWJMb2dpbjsKKwogbmFtZXNwYWNlIEtJ
UElQaWNhc2F3ZWJFeHBvcnRQbHVnaW4KIHsKIAotCVBpY2FzYXdlYlRhbGtlcjo6UGljYXNhd2Vi
VGFsa2VyKCBRV2lkZ2V0KiBwYXJlbnQgKQotCQk6IG1fcGFyZW50KCBwYXJlbnQgKSwgIG1fam9i
KCAwICkKLQkJewotCQkJbV9hcGlrZXk9IjQ5ZDU4NWJhZmEwNzU4Y2I1YzU4YWI2NzE5OGJmNjMy
IjsKLQkJCW1fc2VjcmV0PSIzNGIzOTkyNWU2MjczZmZkIjsKLQkJCWNvbm5lY3QodGhpcyxTSUdO
QUwoc2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyYgc3RyKSksU0xPVChzbG90RXJyb3IoY29uc3Qg
UVN0cmluZyYgc3RyKSkpOwotCQkJYXV0aFByb2dyZXNzRGxnPW5ldyBRUHJvZ3Jlc3NEaWFsb2co
KTsKLQkJfQotCi0JUGljYXNhd2ViVGFsa2VyOjp+UGljYXNhd2ViVGFsa2VyKCkKLQl7Ci0JCWlm
IChtX2pvYikKLQkJCW1fam9iLT5raWxsKCk7Ci0JfQotCi0KLQlRU3RyaW5nIFBpY2FzYXdlYlRh
bGtlcjo6Z2V0QXBpU2lnKFFTdHJpbmcgc2VjcmV0LCBRU3RyaW5nTGlzdCBoZWFkZXJzKQotCXsK
LQkJUVN0cmluZ0xpc3QgY29tcHJlc3NlZCA7Ly89IG5ldyBMaXN0PHN0cmluZz4oaGVhZGVycy5M
ZW5ndGgpOwotCi0JCWZvciAoIFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IGhlYWRlcnMuYmVn
aW4oKTsgaXQgIT0gaGVhZGVycy5lbmQoKTsgKytpdCApIHsKLQkJCVFTdHJpbmdMaXN0IHN0cj1R
U3RyaW5nTGlzdDo6c3BsaXQoIj0iLCgqaXQpKTsKLQkJCWNvbXByZXNzZWQuYXBwZW5kKHN0clsw
XS5zdHJpcFdoaXRlU3BhY2UoKStzdHJbMV0uc3RyaXBXaGl0ZVNwYWNlKCkpOwotCQl9Ci0KLQkJ
Y29tcHJlc3NlZC5zb3J0KCk7Ci0JCVFTdHJpbmcgbWVyZ2VkPWNvbXByZXNzZWQuam9pbigiIik7
Ci0JCVFTdHJpbmcgZmluYWwgPSBzZWNyZXQgKyBtZXJnZWQ7Ci0JCWNvbnN0IGNoYXIgKnRlc3Q9
ZmluYWwuYXNjaWkoKTsKLQkJS01ENSBjb250ZXh0ICh0ZXN0KTsKLQkJLy9rZERlYnVnKCk8PCAi
VGVzdCBIZXggRGlnZXN0IG91dHB1dDogIiA8PCBjb250ZXh0LmhleERpZ2VzdCgpLmRhdGEoKSA8
PCBlbmRsOwotCQlyZXR1cm4gY29udGV4dC5oZXhEaWdlc3QoKS5kYXRhKCk7Ci0JfQotCXZvaWQg
UGljYXNhd2ViVGFsa2VyOjpnZXRUb2tlbihjb25zdCBRU3RyaW5nJiB1c2VybmFtZSwgY29uc3Qg
UVN0cmluZyYgcGFzc3dvcmQgKXsKLQkJaWYgKG1fam9iKXsKLQkJCW1fam9iLT5raWxsKCk7Ci0J
CQltX2pvYiA9IDA7Ci0JCX0KLQkJUVN0cmluZyB1cmwgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNv
bS9hY2NvdW50cy9DbGllbnRMb2dpbiI7Ci0gICAgICAgIAotCQlQaWNhc2F3ZWJMb2dpbiAqbG9n
aW5EaWFsb2cgPSBuZXcgUGljYXNhd2ViTG9naW4oMCwgUVN0cmluZygiTG9naW5XaW5kb3ciKSwg
dXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgLyppZiAodXNlcm5hbWUhPU5VTEwgJiYgdXNl
cm5hbWUubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAvLyAga2REZWJ1ZygpPDwiU2hvd2luZyBz
dG9yZWQgdXNlcm5hbWUiPDwgdXNlcm5hbWUgPDwgZW5kbDsKLSAgICAgICAgICAgIGxvZ2luRGlh
bG9nLT5zZXRVc2VybmFtZSh1c2VybmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0g
TlVMTCAmJiBwYXNzd29yZC5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgLy8gICAga2REZWJ1
ZygpPDwiU2hvd2luZyBzdG9yZWQgcGFzc3dvcmQiPDwgcGFzc3dvcmQgPDwgZW5kbDsKLSAgICAg
ICAgICAgICAgICBsb2dpbkRpYWxvZy0+c2V0UGFzc3dvcmQocGFzc3dvcmQpOwotICAgICAgICAg
ICAgICAvLyAga2REZWJ1ZygpPDwiU2hvd2luZyBzdG9yZWQgcGFzc3dvcmQiPDwgcGFzc3dvcmQg
PDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLyAgICAKLQkJUVN0
cmluZyB1c2VybmFtZV9lZGl0LCBwYXNzd29yZF9lZGl0OwotICAgICAgICBpZiAoIWxvZ2luRGlh
bG9nKQotICAgICAgICAgICAga2REZWJ1ZygpPDwiIE91dCBvZiBtZW1vcnkgZXJyb3IgIjw8IGVu
ZGw7Ci0JCWlmIChsb2dpbkRpYWxvZy0+ZXhlYygpID09IFFEaWFsb2c6OkFjY2VwdGVkKXsKLQkJ
CXVzZXJuYW1lX2VkaXQgPSBsb2dpbkRpYWxvZy0+dXNlcm5hbWUoKTsKLQkJCXBhc3N3b3JkX2Vk
aXQgPSBsb2dpbkRpYWxvZy0+cGFzc3dvcmQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vUmV0dXJu
IHNvbWV0aGluZyB3aGljaCBzYXkgYXV0aGVudGljYXRpb24gbmVlZGVkLgotCQkJcmV0dXJuIDsK
LQkJfQotCQltX3VzZXJuYW1lID0gdXNlcm5hbWVfZWRpdDsKLSAgICAgICAgIAotICAgICAgICB1
c2VybmFtZV9lZGl0ID0gdXNlcm5hbWU7Ci0JCVFTdHJpbmcgYWNjb3VudFR5cGUgPSAiR09PR0xF
IjsKLQkJaWYgKCEodXNlcm5hbWVfZWRpdC5lbmRzV2l0aCgiQGdtYWlsLmNvbSIpKSkKLQkJCXVz
ZXJuYW1lX2VkaXQgKz0gIkBnbWFpbC5jb20iOwotCQlRQnl0ZUFycmF5IGJ1ZmZlcjsKLQkJUVN0
cmluZ0xpc3QgcXNsOwotCQlxc2wuYXBwZW5kKCJFbWFpbD0iK3VzZXJuYW1lX2VkaXQpOwotCQlx
c2wuYXBwZW5kKCJQYXNzd2Q9IitwYXNzd29yZF9lZGl0KTsKLQkJcXNsLmFwcGVuZCgiYWNjb3Vu
dFR5cGU9IithY2NvdW50VHlwZSk7Ci0JCXFzbC5hcHBlbmQoInNlcnZpY2U9bGgyIik7Ci0JCXFz
bC5hcHBlbmQoInNvdXJjZT1raXBpLXBpY2FzYXdlYi1jbGllbnQiKTsKLQkJUVN0cmluZyBkYXRh
UGFyYW1ldGVycyA9IHFzbC5qb2luKCImIik7Ci0JCQkKLQkJUVRleHRTdHJlYW0gdHMoYnVmZmVy
LCBJT19BcHBlbmR8SU9fV3JpdGVPbmx5KTsKLQkJdHMuc2V0RW5jb2RpbmcoUVRleHRTdHJlYW06
OlVuaWNvZGVVVEY4KTsKLQkJdHMgPDwgZGF0YVBhcmFtZXRlcnM7Ci0JCQotCQlLSU86OlRyYW5z
ZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdCh1cmwsIGJ1ZmZlciwgZmFsc2UpOwotCQlqb2It
PmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94
LXd3dy1mb3JtLXVybGVuY29kZWQiICk7CQotCQltX3N0YXRlID0gRkVfR0VUVE9LRU47Ci0JCWF1
dGhQcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KGkxOG4oIkdldHRpbmcgdGhlIHRva2VuIikpOwot
CQljb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5Jikp
LAotCQkJCVNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkpOwotCQljb25u
ZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCi0JCQkJU0xPVChzbG90UmVzdWx0
KEtJTzo6Sm9iICopKSk7Ci0JCW1fam9iICAgPSBqb2I7Ci0JCW1fYnVmZmVyLnJlc2l6ZSgwKTsK
LQkJZW1pdCBzaWduYWxCdXN5KCB0cnVlICk7Ci0JfQotCi0gICAgdm9pZCBQaWNhc2F3ZWJUYWxr
ZXI6OmF1dGhlbnRpY2F0ZShjb25zdCBRU3RyaW5nJiB0b2tlbiwgY29uc3QgUVN0cmluZyYgdXNl
cm5hbWUsIGNvbnN0IFFTdHJpbmcmIHBhc3N3b3JkKXsKLSAgICAgICAgaWYgKCF0b2tlbiB8fCB0
b2tlbi5sZW5ndGgoKSA8IDEpewotICAgICAgICAgICAgY2hlY2tUb2tlbih0b2tlbik7Ci0gICAg
ICAgICAgICBtX3VzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgICAgICAgICBtX3Bhc3N3b3JkID0g
cGFzc3dvcmQ7IC8vdGhpcyB3b3VsZCBiZSBuZWVkZWQgaWYgdGhlIGNoZWNrdG9rZW4gZmFpbGVk
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2Ugd291bGQgbmVlZCB0byBy
ZWF1dGhlbnRpY2F0ZSB1c2luZyBhdXRoCitQaWNhc2F3ZWJUYWxrZXI6OlBpY2FzYXdlYlRhbGtl
cihRV2lkZ2V0KiBwYXJlbnQpCisgICAgICAgIDogbV9wYXJlbnQocGFyZW50KSwgIG1fam9iKDAp
Cit7CisgICAgbV9hcGlrZXkgPSAiNDlkNTg1YmFmYTA3NThjYjVjNThhYjY3MTk4YmY2MzIiOwor
ICAgIG1fc2VjcmV0ID0gIjM0YjM5OTI1ZTYyNzNmZmQiOworICAgIGNvbm5lY3QodGhpcywgU0lH
TkFMKHNpZ25hbEVycm9yKGNvbnN0IFFTdHJpbmcmIHN0cikpLCBTTE9UKHNsb3RFcnJvcihjb25z
dCBRU3RyaW5nJiBzdHIpKSk7CisgICAgYXV0aFByb2dyZXNzRGxnID0gbmV3IFFQcm9ncmVzc0Rp
YWxvZygpOworfQorCitQaWNhc2F3ZWJUYWxrZXI6On5QaWNhc2F3ZWJUYWxrZXIoKQoreworICAg
IGlmIChtX2pvYikKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKK30KKworCitRU3RyaW5nIFBpY2Fz
YXdlYlRhbGtlcjo6Z2V0QXBpU2lnKFFTdHJpbmcgc2VjcmV0LCBRU3RyaW5nTGlzdCBoZWFkZXJz
KQoreworICAgIFFTdHJpbmdMaXN0IGNvbXByZXNzZWQgOy8vPSBuZXcgTGlzdDxzdHJpbmc+KGhl
YWRlcnMuTGVuZ3RoKTsKKworICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gaGVh
ZGVycy5iZWdpbigpOyBpdCAhPSBoZWFkZXJzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAg
UVN0cmluZ0xpc3Qgc3RyID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCI9IiwgKCppdCkpOworICAgICAg
ICBjb21wcmVzc2VkLmFwcGVuZChzdHJbMF0uc3RyaXBXaGl0ZVNwYWNlKCkgKyBzdHJbMV0uc3Ry
aXBXaGl0ZVNwYWNlKCkpOworICAgIH0KKworICAgIGNvbXByZXNzZWQuc29ydCgpOworCisgICAg
UVN0cmluZyBtZXJnZWQgPSBjb21wcmVzc2VkLmpvaW4oIiIpOworICAgIFFTdHJpbmcgZmluYWwg
PSBzZWNyZXQgKyBtZXJnZWQ7CisgICAgY29uc3QgY2hhciAqdGVzdCA9IGZpbmFsLmFzY2lpKCk7
CisgICAgS01ENSBjb250ZXh0KHRlc3QpOworICAgIC8va2REZWJ1ZygpPDwgIlRlc3QgSGV4IERp
Z2VzdCBvdXRwdXQ6ICIgPDwgY29udGV4dC5oZXhEaWdlc3QoKS5kYXRhKCkgPDwgZW5kbDsKKyAg
ICByZXR1cm4gY29udGV4dC5oZXhEaWdlc3QoKS5kYXRhKCk7Cit9CisKK3ZvaWQgUGljYXNhd2Vi
VGFsa2VyOjpnZXRUb2tlbihjb25zdCBRU3RyaW5nJiB1c2VybmFtZSwgY29uc3QgUVN0cmluZyYg
cGFzc3dvcmQpCit7CisgICAgaWYgKG1fam9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwo
KTsKKyAgICAgICAgbV9qb2IgPSAwOworICAgIH0KKworICAgIFFTdHJpbmcgdXJsID0gImh0dHBz
Oi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xpZW50TG9naW4iOworCisgICAgUGljYXNhd2Vi
TG9naW4gKmxvZ2luRGlhbG9nID0gbmV3IFBpY2FzYXdlYkxvZ2luKDAsIFFTdHJpbmcoIkxvZ2lu
V2luZG93IiksIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgLyppZiAodXNlcm5hbWUhPU5VTEwg
JiYgdXNlcm5hbWUubGVuZ3RoKCkgPiAwKXsKKyAgICAgIC8vICBrZERlYnVnKCk8PCJTaG93aW5n
IHN0b3JlZCB1c2VybmFtZSI8PCB1c2VybmFtZSA8PCBlbmRsOworICAgICAgICBsb2dpbkRpYWxv
Zy0+c2V0VXNlcm5hbWUodXNlcm5hbWUpOworICAgICAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCAm
JiBwYXNzd29yZC5sZW5ndGgoKSA+IDApeworICAgICAgICAvLyAgICBrZERlYnVnKCk8PCJTaG93
aW5nIHN0b3JlZCBwYXNzd29yZCI8PCBwYXNzd29yZCA8PCBlbmRsOworICAgICAgICAgICAgbG9n
aW5EaWFsb2ctPnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgICAvLyAga2REZWJ1Zygp
PDwiU2hvd2luZyBzdG9yZWQgcGFzc3dvcmQiPDwgcGFzc3dvcmQgPDwgZW5kbDsKICAgICAgICAg
fQotICAgICAgICBlbHNlIAotICAgICAgICAgICAgZ2V0VG9rZW4odXNlcm5hbWUsIHBhc3N3b3Jk
KTsKLSAgICAgICAgCi0gICAgfQotCXZvaWQgUGljYXNhd2ViVGFsa2VyOjpjaGVja1Rva2VuKGNv
bnN0IFFTdHJpbmcmIHRva2VuKSB7Ci0JCWlmIChtX2pvYil7Ci0JCQltX2pvYi0+a2lsbCgpOwot
CQkJbV9qb2IgPSAwOwotCQl9Ci0JCVFTdHJpbmcgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZS5j
b20vYWNjb3VudHMvQ2xpZW50TG9naW4iOwotCQlRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2ds
ZUxvZ2luIGF1dGg9IiArIG1fdG9rZW47Ci0JCVFCeXRlQXJyYXkgdG1wOwotCQlLSU86OlRyYW5z
ZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdCh1cmwsIHRtcCwgZmFsc2UpOwotCQlqb2ItPmFk
ZE1ldGFEYXRhKCJjdXN0b21IVFRQSGVhZGVyIiwgIkF1dGhvcml6YXRpb246ICIgKyBhdXRoX3N0
cmluZyApOwotCi0JCWpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5
cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKTsJCi0JCWNvbm5lY3Qoam9i
LCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCi0JCQkJU0xPVChk
YXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSk7Ci0JCWNvbm5lY3Qoam9iLCBTSUdO
QUwocmVzdWx0KEtJTzo6Sm9iICopKSwKLQkJCQlTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikp
KTsKLQkJbV9zdGF0ZSA9IEZFX0NIRUNLVE9LRU47Ci0JCWF1dGhQcm9ncmVzc0RsZy0+c2V0TGFi
ZWxUZXh0KGkxOG4oIkNoZWNraW5nIGlmIHByZXZpb3VzIHRva2VuIGlzIHN0aWxsIHZhbGlkIikp
OwotCQlhdXRoUHJvZ3Jlc3NEbGctPnNldFByb2dyZXNzKDEsNCk7Ci0JCW1fam9iICAgPSBqb2I7
Ci0JCW1fYnVmZmVyLnJlc2l6ZSgwKTsKLQkJZW1pdCBzaWduYWxCdXN5KCB0cnVlICk7Ci0JfQot
Ci0gICAgLyogUGljYXNhV2ViJ3MgQWxidW0gbGlzdGluZyByZXF1ZXN0L3Jlc3BvbnNlCi0gICAg
ICogRmlyc3QgYSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHVybCBiZWxvdyBhbmQgdGhlbiB3ZSBt
aWdodCg/KSBnZXQgYSByZWRpcmVjdCBVUkwKLSAgICAgKiBXRSB0aGVuIG5lZWQgdG8gc2VuZCB0
aGUgR0VUIHJlcXVlc3QgdG8gdGhlIFJlZGlyZWN0IHVybAotICAgICAqLwotCXZvaWQgUGljYXNh
d2ViVGFsa2VyOjpsaXN0QWxidW1zKCkKLQl7Ci0JCWlmIChtX2pvYil7Ci0JCQltX2pvYi0+a2ls
bCgpOwotCQkJbV9qb2IgPSAwOwotCQl9Ci0JCVFTdHJpbmcgdXJsID0gImh0dHA6Ly9waWNhc2F3
ZWIuZ29vZ2xlLmNvbS9kYXRhL2ZlZWQvYXBpL3VzZXIvIiArIG1fdXNlcm5hbWUgKyAiP2tpbmQ9
YWxidW0iOwotCQlRQnl0ZUFycmF5IHRtcDsJCi0JCUtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJ
Tzo6Z2V0KHVybCwgdG1wLCBmYWxzZSk7Ci0JCWpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlw
ZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKTsJ
Ci0JCWNvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkm
KSksU0xPVChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSk7Ci0JCWNvbm5lY3Qo
am9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwgU0xPVChzbG90UmVzdWx0KEtJTzo6Sm9i
ICopKSk7Ci0JCW1fc3RhdGUgPSBGRV9MSVNUQUxCVU1TOwotCQltX2pvYiAgID0gam9iOwotCQlt
X2J1ZmZlci5yZXNpemUoMCk7Ci0JCWVtaXQgc2lnbmFsQnVzeSggdHJ1ZSApOwotCX0KLQkKLQl2
b2lkIFBpY2FzYXdlYlRhbGtlcjo6Z2V0UGhvdG9Qcm9wZXJ0eShjb25zdCBRU3RyaW5nJiBtZXRo
b2QsY29uc3QgUVN0cmluZyYgYXJnTGlzdCl7Ci0JCWlmIChtX2pvYil7Ci0JCQltX2pvYi0+a2ls
bCgpOwotCQkJbV9qb2IgPSAwOwotCQl9Ci0JCVFTdHJpbmcgdXJsPSJodHRwOi8vd3d3LnBpY2Fz
YXdlYi5jb20vc2VydmljZXMvcmVzdC8/IjsKLQkJUVN0cmluZ0xpc3QgaGVhZGVycyA7Ly8KLQkJ
aGVhZGVycy5hcHBlbmQoImFwaV9rZXk9IisgbV9hcGlrZXkpOwotCQloZWFkZXJzLmFwcGVuZCgi
bWV0aG9kPSIrbWV0aG9kKTsKLQkJaGVhZGVycy5hcHBlbmQoImZyb2I9IisgbV9mcm9iKTsKLQkJ
aGVhZGVycy5hcHBlbmQoYXJnTGlzdCk7Ci0JCVFTdHJpbmcgbWQ1PWdldEFwaVNpZyhtX3NlY3Jl
dCxoZWFkZXJzKTsKLQkJaGVhZGVycy5hcHBlbmQoImFwaV9zaWc9IisgbWQ1KTsKLQkJUVN0cmlu
ZyBxdWVyeVN0cj1oZWFkZXJzLmpvaW4oIiYiKTsKLQkJUVN0cmluZyBwb3N0VXJsPXVybCtxdWVy
eVN0cjsKLQkJUUJ5dGVBcnJheSB0bXA7CQotCQlLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86
Omh0dHBfcG9zdChwb3N0VXJsLCB0bXAsIGZhbHNlKTsKLQkJam9iLT5hZGRNZXRhRGF0YSgiY29u
dGVudC10eXBlIiwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNv
ZGVkIiApOwkKLQkJY29ubmVjdChqb2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5
dGVBcnJheSYpKSxTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKLQkJ
Y29ubmVjdChqb2IsIFNJR05BTChyZXN1bHQoS0lPOjpKb2IgKikpLCBTTE9UKHNsb3RSZXN1bHQo
S0lPOjpKb2IgKikpKTsKLQkJbV9zdGF0ZSA9IEZFX0dFVFBIT1RPUFJPUEVSVFk7Ci0JCW1fam9i
ICAgPSBqb2I7Ci0JCW1fYnVmZmVyLnJlc2l6ZSgwKTsKLQkJZW1pdCBzaWduYWxCdXN5KCB0cnVl
ICk7Ci0JCS8vYXV0aFByb2dyZXNzRGxnLT5zZXRMYWJlbFRleHQoIkdldHRpbmcgdGhlIFRva2Vu
IGZyb20gdGhlIHNlcnZlciIpOwotCQkvL2F1dGhQcm9ncmVzc0RsZy0+c2V0UHJvZ3Jlc3MoMyw0
KTsKLQl9Ci0gICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmFkZFBob3RvVGFnKGNvbnN0IFFTdHJp
bmcmIHBob3RvVVJJLCBjb25zdCBRU3RyaW5nJiB0YWcpeyAgICAKLQkJLy9pZiAobV9qb2IgJiYg
bV9zdGF0ZSAhPSBGRV9BRERUQUcpeyAvL3dlIHNob3VsZG4ndCBraWxsIHRoZSBvbGQgdGFnIHJl
cXVlc3QKLQkJLy8JbV9qb2ItPmtpbGwoKTsKLQkJLy8JbV9qb2IgPSAwOwotCQkvL30KLSAgICAg
ICAgUVN0cmluZyBhZGRUYWdYTUwgPSBRU3RyaW5nKCI8ZW50cnkgeG1sbnM9J2h0dHA6Ly93d3cu
dzMub3JnLzIwMDUvQXRvbSc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICI8dGl0bGU+JTE8L3RpdGxlPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiPGNhdGVnb3J5IHNjaGVtZT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIwMDUja2lu
ZCcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlcm09J2h0dHA6Ly9z
Y2hlbWFzLmdvb2dsZS5jb20vcGhvdG9zLzIwMDcjdGFnJy8+ICIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICI8L2VudHJ5PiIpLmFyZyh0YWcpOwotCSAgICBRU3RyaW5nIHBv
c3RVcmwgPSBRU3RyaW5nKCIlMSIpLmFyZyhwaG90b1VSSSk7Ci0JICAgIFFCeXRlQXJyYXkgYnVm
ZmVyOwotICAgIAlRVGV4dFN0cmVhbSB0cyhidWZmZXIsIElPX0FwcGVuZHxJT19Xcml0ZU9ubHkp
OwotCSAgICB0cy5zZXRFbmNvZGluZyhRVGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOwotICAgIAl0
cyA8PCBhZGRUYWdYTUw7Ci0gICAgICAgIAotICAgICAgICBRU3RyaW5nIGF1dGhfc3RyaW5nID0g
Ikdvb2dsZUxvZ2luIGF1dGg9IiArIG1fdG9rZW47Ci0JICAgIEtJTzo6VHJhbnNmZXJKb2IqIGpv
YiA9IEtJTzo6aHR0cF9wb3N0KHBvc3RVcmwsIGJ1ZmZlciwgZmFsc2UpOwotICAgIAlqb2ItPmFk
ZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9hdG9t
K3htbCIpOwotCSAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LWxlbmd0aCIsIFFTdHJpbmco
IkNvbnRlbnQtTGVuZ3RoOiAlMSIpLmFyZyhhZGRUYWdYTUwubGVuZ3RoKCkpKTsKLQkgICAgam9i
LT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsgYXV0
aF9zdHJpbmcgKTsKLQkJLy9jb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25z
dCBRQnl0ZUFycmF5JikpLAotCQkvLwkJU0xPVChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVB
cnJheSYpKSk7Ci0JCWNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKLQkJ
CQlTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKLSAgICAgICAgbV9zdGF0ZSA9IEZFX0FE
RFRBRzsKLSAgICAgICAgbV9qb2IgPSBqb2I7Ci0gICAgICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsK
LSAgICAgICAgZW1pdCBzaWduYWxCdXN5KHRydWUpOwotICAgIH0KLSAgICAKLQl2b2lkIFBpY2Fz
YXdlYlRhbGtlcjo6bGlzdFBob3RvcyggY29uc3QgUVN0cmluZyYgYWxidW1OYW1lICkKLQl7Ci0J
CVFTdHJpbmcgdGVtcD1hbGJ1bU5hbWU7Ly9qdXN0IGZvciBhdm9pZGluZyB3YXJuaW5nLgotCQkv
L1RvIGJlIGltcGxlbWVudGVkCi0JfQotCi0Jdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmNyZWF0ZUFs
YnVtKAotCQkJY29uc3QgUVN0cmluZyYgYWxidW1UaXRsZSwKLQkJCWNvbnN0IFFTdHJpbmcmIGFs
YnVtRGVzYywKLSAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcmIGxvY2F0aW9uLAotICAgICAgICAg
ICAgdWludCAgdGltZXN0YW1wLAotICAgICAgICAgICAgY29uc3QgUVN0cmluZyYgYWNjZXNzLAot
ICAgICAgICAgICAgY29uc3QgUVN0cmluZyYgbWVkaWFfa2V5d29yZHMsCi0gICAgICAgICAgICBi
b29sIGlzQ29tbWVudHNFbmFibGVkKQotCXsKLQkJaWYgKG1fam9iKXsKLQkJCW1fam9iLT5raWxs
KCk7Ci0JCQltX2pvYiA9IDA7Ci0JCX0KLSAgICAgUVN0cmluZyBuZXdBbGJ1bVhNTCA9IFFTdHJp
bmcoIjxlbnRyeSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tJyAiCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxuczptZWRpYT0naHR0cDovL3NlYXJjaC55
YWhvby5jb20vbXJzcy8nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInht
bG5zOmdwaG90bz0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90b3MvMjAwNyc+ICIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx0aXRsZSB0eXBlPSd0ZXh0Jz4lMTwv
dGl0bGU+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5IHR5
cGU9J3RleHQnPiUyPC9zdW1tYXJ5PiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICI8Z3Bob3RvOmxvY2F0aW9uPiUzPC9ncGhvdG86bG9jYXRpb24+ICIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIjxncGhvdG86YWNjZXNzPiU0PC9ncGhvdG86YWNjZXNz
PiAiCi0gICAgICAgICAgICAgICAgICAgICI8Z3Bob3RvOmNvbW1lbnRpbmdFbmFibGVkPiU1PC9n
cGhvdG86Y29tbWVudGluZ0VuYWJsZWQ+ICIKLSAgICAgICAgICAgICAgICAgICAgIjxncGhvdG86
dGltZXN0YW1wPiU2PC9ncGhvdG86dGltZXN0YW1wPiAiCi0gICAgICAgICAgICAgICAgICAgICI8
bWVkaWE6Z3JvdXA+ICIKLSAgICAgICAgICAgICAgICAgICAgIjxtZWRpYTprZXl3b3Jkcz4lNzwv
bWVkaWE6a2V5d29yZHM+ICIKLSAgICAgICAgICAgICAgICAgICAgIjwvbWVkaWE6Z3JvdXA+ICIK
LSAgICAgICAgICAgICAgICAgICAgIjxjYXRlZ29yeSBzY2hlbWU9J2h0dHA6Ly9zY2hlbWFzLmdv
b2dsZS5jb20vZy8yMDA1I2tpbmQnICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRlcm09
J2h0dHA6Ly9zY2hlbWFzLmdvb2dsZS5jb20vcGhvdG9zLzIwMDcjYWxidW0nPjwvY2F0ZWdvcnk+
ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2VudHJ5PiAiKS5hcmcoYWxidW1UaXRs
ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFyZyhhbGJ1bURlc2Mp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmcobG9jYXRpb24pCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmcoYWNjZXNzKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKGlzQ29tbWVudHNFbmFibGVkPT10
cnVlPyJ0cnVlIjoiZmFsc2UiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAuYXJnKHRpbWVzdGFtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
LmFyZyhtZWRpYV9rZXl3b3Jkcyk7Ci0KLQlRQnl0ZUFycmF5IGJ1ZmZlcjsKLQlRVGV4dFN0cmVh
bSB0cyhidWZmZXIsIElPX0FwcGVuZHxJT19Xcml0ZU9ubHkpOwotCXRzLnNldEVuY29kaW5nKFFU
ZXh0U3RyZWFtOjpVbmljb2RlVVRGOCk7Ci0JdHMgPDwgbmV3QWxidW1YTUw7Ci0JCisgICAgfQor
ICAgICovCisgICAgUVN0cmluZyB1c2VybmFtZV9lZGl0LCBwYXNzd29yZF9lZGl0OworCisgICAg
aWYgKCFsb2dpbkRpYWxvZykKKyAgICAgICAga2REZWJ1ZygpIDw8ICIgT3V0IG9mIG1lbW9yeSBl
cnJvciAiIDw8IGVuZGw7CisKKyAgICBpZiAobG9naW5EaWFsb2ctPmV4ZWMoKSA9PSBRRGlhbG9n
OjpBY2NlcHRlZCkKKyAgICB7CisgICAgICAgIHVzZXJuYW1lX2VkaXQgPSBsb2dpbkRpYWxvZy0+
dXNlcm5hbWUoKTsKKyAgICAgICAgcGFzc3dvcmRfZWRpdCA9IGxvZ2luRGlhbG9nLT5wYXNzd29y
ZCgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1JldHVybiBzb21ldGhpbmcg
d2hpY2ggc2F5IGF1dGhlbnRpY2F0aW9uIG5lZWRlZC4KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9
CisKKyAgICBtX3VzZXJuYW1lID0gdXNlcm5hbWVfZWRpdDsKKworICAgIHVzZXJuYW1lX2VkaXQg
PSB1c2VybmFtZTsKKyAgICBRU3RyaW5nIGFjY291bnRUeXBlID0gIkdPT0dMRSI7CisKKyAgICBp
ZiAoISh1c2VybmFtZV9lZGl0LmVuZHNXaXRoKCJAZ21haWwuY29tIikpKQorICAgICAgICB1c2Vy
bmFtZV9lZGl0ICs9ICJAZ21haWwuY29tIjsKKworICAgIFFCeXRlQXJyYXkgYnVmZmVyOworCisg
ICAgUVN0cmluZ0xpc3QgcXNsOworCisgICAgcXNsLmFwcGVuZCgiRW1haWw9IiArIHVzZXJuYW1l
X2VkaXQpOworCisgICAgcXNsLmFwcGVuZCgiUGFzc3dkPSIgKyBwYXNzd29yZF9lZGl0KTsKKwor
ICAgIHFzbC5hcHBlbmQoImFjY291bnRUeXBlPSIgKyBhY2NvdW50VHlwZSk7CisKKyAgICBxc2wu
YXBwZW5kKCJzZXJ2aWNlPWxoMiIpOworCisgICAgcXNsLmFwcGVuZCgic291cmNlPWtpcGktcGlj
YXNhd2ViLWNsaWVudCIpOworCisgICAgUVN0cmluZyBkYXRhUGFyYW1ldGVycyA9IHFzbC5qb2lu
KCImIik7CisKKyAgICBRVGV4dFN0cmVhbSB0cyhidWZmZXIsIElPX0FwcGVuZCB8IElPX1dyaXRl
T25seSk7CisKKyAgICB0cy5zZXRFbmNvZGluZyhRVGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOwor
CisgICAgdHMgPDwgZGF0YVBhcmFtZXRlcnM7CisKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2Ig
PSBLSU86Omh0dHBfcG9zdCh1cmwsIGJ1ZmZlciwgZmFsc2UpOworCisgICAgam9iLT5hZGRNZXRh
RGF0YSgiY29udGVudC10eXBlIiwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9y
bS11cmxlbmNvZGVkIik7CisKKyAgICBtX3N0YXRlID0gRkVfR0VUVE9LRU47CisKKyAgICBhdXRo
UHJvZ3Jlc3NEbGctPnNldExhYmVsVGV4dChpMThuKCJHZXR0aW5nIHRoZSB0b2tlbiIpKTsKKwor
ICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkm
KSksCisgICAgICAgICAgICBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5Jikp
KTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAg
ICAgICAgIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworCisgICAgbV9qb2IgICA9IGpv
YjsKKworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVl
KTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmF1dGhlbnRpY2F0ZShjb25zdCBRU3RyaW5n
JiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmlu
ZyYgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFT
dHJpbmcmIHBhc3N3b3JkKQoreworICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoKCkgPCAx
KQorICAgIHsKKyAgICAgICAgY2hlY2tUb2tlbih0b2tlbik7CisgICAgICAgIG1fdXNlcm5hbWUg
PSB1c2VybmFtZTsKKyAgICAgICAgbV9wYXNzd29yZCA9IHBhc3N3b3JkOyAvL3RoaXMgd291bGQg
YmUgbmVlZGVkIGlmIHRoZSBjaGVja3Rva2VuIGZhaWxlZAorICAgICAgICAvL3dlIHdvdWxkIG5l
ZWQgdG8gcmVhdXRoZW50aWNhdGUgdXNpbmcgYXV0aAorICAgIH0KKyAgICBlbHNlCisgICAgICAg
IGdldFRva2VuKHVzZXJuYW1lLCBwYXNzd29yZCk7CisKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxr
ZXI6OmNoZWNrVG9rZW4oY29uc3QgUVN0cmluZyYgdG9rZW4pCit7CisgICAgaWYgKG1fam9iKQor
ICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9qb2IgPSAwOworICAgIH0K
KworICAgIFFTdHJpbmcgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xp
ZW50TG9naW4iOworCisgICAgUVN0cmluZyBhdXRoX3N0cmluZyA9ICJHb29nbGVMb2dpbiBhdXRo
PSIgKyBtX3Rva2VuOworICAgIFFCeXRlQXJyYXkgdG1wOworICAgIEtJTzo6VHJhbnNmZXJKb2Iq
IGpvYiA9IEtJTzo6aHR0cF9wb3N0KHVybCwgdG1wLCBmYWxzZSk7CisgICAgam9iLT5hZGRNZXRh
RGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsgYXV0aF9zdHJpbmcp
OworCisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNvbnRlbnQtVHlwZTog
YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CisgICAgY29ubmVjdChqb2IsIFNJ
R05BTChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSwKKyAgICAgICAgICAgIFNM
T1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkpOworICAgIGNvbm5lY3Qoam9i
LCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAgICAgICAgIFNMT1Qoc2xvdFJlc3Vs
dChLSU86OkpvYiAqKSkpOworICAgIG1fc3RhdGUgPSBGRV9DSEVDS1RPS0VOOworICAgIGF1dGhQ
cm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KGkxOG4oIkNoZWNraW5nIGlmIHByZXZpb3VzIHRva2Vu
IGlzIHN0aWxsIHZhbGlkIikpOworICAgIGF1dGhQcm9ncmVzc0RsZy0+c2V0UHJvZ3Jlc3MoMSwg
NCk7CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgZW1p
dCBzaWduYWxCdXN5KHRydWUpOworfQorCisvKiBQaWNhc2FXZWIncyBBbGJ1bSBsaXN0aW5nIHJl
cXVlc3QvcmVzcG9uc2UKKyAqIEZpcnN0IGEgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSB1cmwgYmVs
b3cgYW5kIHRoZW4gd2UgbWlnaHQoPykgZ2V0IGEgcmVkaXJlY3QgVVJMCisgKiBXRSB0aGVuIG5l
ZWQgdG8gc2VuZCB0aGUgR0VUIHJlcXVlc3QgdG8gdGhlIFJlZGlyZWN0IHVybAorICovCit2b2lk
IFBpY2FzYXdlYlRhbGtlcjo6bGlzdEFsYnVtcygpCit7CisgICAgaWYgKG1fam9iKQorICAgIHsK
KyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9qb2IgPSAwOworICAgIH0KKworICAg
IFFTdHJpbmcgdXJsID0gImh0dHA6Ly9waWNhc2F3ZWIuZ29vZ2xlLmNvbS9kYXRhL2ZlZWQvYXBp
L3VzZXIvIiArIG1fdXNlcm5hbWUgKyAiP2tpbmQ9YWxidW0iOworCisgICAgUUJ5dGVBcnJheSB0
bXA7CisgICAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQodXJsLCB0bXAsIGZhbHNl
KTsKKyAgICBRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2dsZUxvZ2luIGF1dGg9IiArIG1fdG9r
ZW47CisKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBl
OiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICBqb2ItPmFkZE1ldGFE
YXRhKCJjdXN0b21IVFRQSGVhZGVyIiwgIkF1dGhvcml6YXRpb246ICIgKyBhdXRoX3N0cmluZyk7
CisKKyAgICBjb25uZWN0KGpvYiwKKyAgICAgICAgICAgIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwg
Y29uc3QgUUJ5dGVBcnJheSYpKSwKKyAgICAgICAgICAgIFNMT1QoZGF0YShLSU86OkpvYiosIGNv
bnN0IFFCeXRlQXJyYXkmKSkpOworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6
Sm9iICopKSwgU0xPVChzbG90UmVzdWx0KEtJTzo6Sm9iICopKSk7CisKKyAgICBtX3N0YXRlID0g
RkVfTElTVEFMQlVNUzsKKyAgICBtX2pvYiAgID0gam9iOworICAgIG1fYnVmZmVyLnJlc2l6ZSgw
KTsKKyAgICBlbWl0IHNpZ25hbEJ1c3kodHJ1ZSk7Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2Vy
OjpnZXRQaG90b1Byb3BlcnR5KGNvbnN0IFFTdHJpbmcmIG1ldGhvZCwgY29uc3QgUVN0cmluZyYg
YXJnTGlzdCkKK3sKKyAgICBpZiAobV9qb2IpCisgICAgeworICAgICAgICBtX2pvYi0+a2lsbCgp
OworICAgICAgICBtX2pvYiA9IDA7CisgICAgfQorCisgICAgUVN0cmluZyB1cmwgPSAiaHR0cDov
L3d3dy5waWNhc2F3ZWIuY29tL3NlcnZpY2VzL3Jlc3QvPyI7CisKKyAgICBRU3RyaW5nTGlzdCBo
ZWFkZXJzIDsvLworICAgIGhlYWRlcnMuYXBwZW5kKCJhcGlfa2V5PSIgKyBtX2FwaWtleSk7Cisg
ICAgaGVhZGVycy5hcHBlbmQoIm1ldGhvZD0iICsgbWV0aG9kKTsKKyAgICBoZWFkZXJzLmFwcGVu
ZCgiZnJvYj0iICsgbV9mcm9iKTsKKyAgICBoZWFkZXJzLmFwcGVuZChhcmdMaXN0KTsKKyAgICBR
U3RyaW5nIG1kNSA9IGdldEFwaVNpZyhtX3NlY3JldCwgaGVhZGVycyk7CisgICAgaGVhZGVycy5h
cHBlbmQoImFwaV9zaWc9IiArIG1kNSk7CisgICAgUVN0cmluZyBxdWVyeVN0ciA9IGhlYWRlcnMu
am9pbigiJiIpOworICAgIFFTdHJpbmcgcG9zdFVybCA9IHVybCArIHF1ZXJ5U3RyOworICAgIFFC
eXRlQXJyYXkgdG1wOworICAgIEtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJTzo6aHR0cF9wb3N0
KHBvc3RVcmwsIHRtcCwgZmFsc2UpOworICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlw
ZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwor
ICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkm
KSksIFNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkpOworICAgIGNvbm5l
Y3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwgU0xPVChzbG90UmVzdWx0KEtJTzo6
Sm9iICopKSk7CisgICAgbV9zdGF0ZSA9IEZFX0dFVFBIT1RPUFJPUEVSVFk7CisgICAgbV9qb2Ig
ICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgZW1pdCBzaWduYWxCdXN5KHRy
dWUpOworICAgIC8vYXV0aFByb2dyZXNzRGxnLT5zZXRMYWJlbFRleHQoIkdldHRpbmcgdGhlIFRv
a2VuIGZyb20gdGhlIHNlcnZlciIpOworICAgIC8vYXV0aFByb2dyZXNzRGxnLT5zZXRQcm9ncmVz
cygzLDQpOworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6YWRkUGhvdG9UYWcoY29uc3QgUVN0
cmluZyYgcGhvdG9VUkksIGNvbnN0IFFTdHJpbmcmIHRhZykKK3sKKyAgICAvL2lmIChtX2pvYiAm
JiBtX3N0YXRlICE9IEZFX0FERFRBRyl7IC8vd2Ugc2hvdWxkbid0IGtpbGwgdGhlIG9sZCB0YWcg
cmVxdWVzdAorICAgIC8vIG1fam9iLT5raWxsKCk7CisgICAgLy8gbV9qb2IgPSAwOworICAgIC8v
fQorICAgIFFTdHJpbmcgYWRkVGFnWE1MID0gUVN0cmluZygiPGVudHJ5IHhtbG5zPSdodHRwOi8v
d3d3LnczLm9yZy8yMDA1L0F0b20nPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICI8dGl0bGU+JTE8L3RpdGxlPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8
Y2F0ZWdvcnkgc2NoZW1lPSdodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL2cvMjAwNSNraW5kJyAi
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXJtPSdodHRwOi8vc2NoZW1hcy5n
b29nbGUuY29tL3Bob3Rvcy8yMDA3I3RhZycvPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICI8L2VudHJ5PiIpLmFyZyh0YWcpOworICAgIFFTdHJpbmcgcG9zdFVybCA9IFFTdHJp
bmcoIiUxIikuYXJnKHBob3RvVVJJKTsKKyAgICBRQnl0ZUFycmF5IGJ1ZmZlcjsKKyAgICBRVGV4
dFN0cmVhbSB0cyhidWZmZXIsIElPX0FwcGVuZCB8IElPX1dyaXRlT25seSk7CisgICAgdHMuc2V0
RW5jb2RpbmcoUVRleHRTdHJlYW06OlVuaWNvZGVVVEY4KTsKKyAgICB0cyA8PCBhZGRUYWdYTUw7
CisKKyAgICBRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2dsZUxvZ2luIGF1dGg9IiArIG1fdG9r
ZW47CisgICAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpodHRwX3Bvc3QocG9zdFVybCwg
YnVmZmVyLCBmYWxzZSk7CisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNv
bnRlbnQtVHlwZTogYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRh
KCJjb250ZW50LWxlbmd0aCIsIFFTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoOiAlMSIpLmFyZyhhZGRU
YWdYTUwubGVuZ3RoKCkpKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjdXN0b21IVFRQSGVhZGVy
IiwgIkF1dGhvcml6YXRpb246ICIgKyBhdXRoX3N0cmluZyk7CisgICAgLy9jb25uZWN0KGpvYiwg
U0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpLAorICAgIC8vICBTTE9U
KGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0KGpvYiwg
U0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCisgICAgICAgICAgICBTTE9UKHNsb3RSZXN1bHQo
S0lPOjpKb2IgKikpKTsKKyAgICBtX3N0YXRlID0gRkVfQUREVEFHOworICAgIG1fam9iID0gam9i
OworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKyAgICBlbWl0IHNpZ25hbEJ1c3kodHJ1ZSk7Cit9
CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpsaXN0UGhvdG9zKGNvbnN0IFFTdHJpbmcmIGFsYnVt
TmFtZSkKK3sKKyAgICBRU3RyaW5nIHRlbXAgPSBhbGJ1bU5hbWU7Ly9qdXN0IGZvciBhdm9pZGlu
ZyB3YXJuaW5nLgorICAgIC8vVG8gYmUgaW1wbGVtZW50ZWQKK30KKwordm9pZCBQaWNhc2F3ZWJU
YWxrZXI6OmNyZWF0ZUFsYnVtKGNvbnN0IFFTdHJpbmcmIGFsYnVtVGl0bGUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZyYgYWxidW1EZXNjLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcmIGxvY2F0aW9uLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFfVUxMT05HIHRpbWVzdGFtcCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRU3RyaW5nJiBhY2Nlc3MsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZyYgbWVkaWFfa2V5d29y
ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NvbW1lbnRzRW5h
YmxlZCkKK3sKKyAgICBpZiAobV9qb2IpCisgICAgeworICAgICAgICBtX2pvYi0+a2lsbCgpOwor
ICAgICAgICBtX2pvYiA9IDA7CisgICAgfQorCisgICAgLyogVGltZSBab25lIGNvcnJlY3Rpb24s
IFFUIHdvcmsgYXJvdW5kOiB3ZSBzaG91bGQgZGlzcGxheSBjb3JyZWN0IGN1cnJlbnQgdGltZSAq
LworICAgIFFfVUxMT05HIHRpbWVab25lID0KKyAgICAgICAgUURhdGVUaW1lOjpjdXJyZW50RGF0
ZVRpbWUoUXQ6OkxvY2FsVGltZSkudG9UaW1lX3QoKSAtCisgICAgICAgIFFEYXRlVGltZTo6Y3Vy
cmVudERhdGVUaW1lKFF0OjpVVEMpLnRvVGltZV90KCk7CisKKyAgICBRU3RyaW5nIG5ld0FsYnVt
WE1MID0gUVN0cmluZygiPGVudHJ5IHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20n
ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sbnM6bWVkaWE9J2h0dHA6
Ly9zZWFyY2gueWFob28uY29tL21yc3MvJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgInhtbG5zOmdwaG90bz0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90b3MvMjAw
Nyc+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHRpdGxlIHR5cGU9J3Rl
eHQnPiUxPC90aXRsZT4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3Vt
bWFyeSB0eXBlPSd0ZXh0Jz4lMjwvc3VtbWFyeT4gIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICI8Z3Bob3RvOmxvY2F0aW9uPiUzPC9ncGhvdG86bG9jYXRpb24+ICIKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGdwaG90bzphY2Nlc3M+JTQ8L2dwaG90bzph
Y2Nlc3M+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGdwaG90bzpjb21t
ZW50aW5nRW5hYmxlZD4lNTwvZ3Bob3RvOmNvbW1lbnRpbmdFbmFibGVkPiAiCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIjxncGhvdG86dGltZXN0YW1wPiU2PC9ncGhvdG86dGlt
ZXN0YW1wPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxtZWRpYTpncm91
cD4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bWVkaWE6a2V5d29yZHM+
JTc8L21lZGlhOmtleXdvcmRzPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IjwvbWVkaWE6Z3JvdXA+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGNh
dGVnb3J5IHNjaGVtZT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIwMDUja2luZCcgIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXJtPSdodHRwOi8vc2NoZW1hcy5n
b29nbGUuY29tL3Bob3Rvcy8yMDA3I2FsYnVtJz48L2NhdGVnb3J5PiAiCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIjwvZW50cnk+ICIpLmFyZyhhbGJ1bVRpdGxlKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAuYXJnKGFsYnVtRGVzYykKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgLmFyZyhsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFyZyhhY2Nl
c3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmcoaXNDb21tZW50c0VuYWJsZWQgPT0g
dHJ1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmco
KHRpbWVzdGFtcCArIHRpbWVab25lKSAqIDEwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAg
IC5hcmcobWVkaWFfa2V5d29yZHMpOworCisgICAgUUJ5dGVBcnJheSBidWZmZXI7CisgICAgUVRl
eHRTdHJlYW0gdHMoYnVmZmVyLCBJT19BcHBlbmQgfCBJT19Xcml0ZU9ubHkpOworICAgIHRzLnNl
dEVuY29kaW5nKFFUZXh0U3RyZWFtOjpVbmljb2RlVVRGOCk7CisgICAgdHMgPDwgbmV3QWxidW1Y
TUw7CisKICAgICBNUEZvcm0gZm9ybTsKLQlRU3RyaW5nIHBvc3RVcmwgPSAiaHR0cDovL3d3dy5w
aWNhc2F3ZWIuZ29vZ2xlLmNvbS9kYXRhL2ZlZWQvYXBpL3VzZXIvIiArIG1fdXNlcm5hbWUgOwor
ICAgIFFTdHJpbmcgcG9zdFVybCA9ICJodHRwOi8vd3d3LnBpY2FzYXdlYi5nb29nbGUuY29tL2Rh
dGEvZmVlZC9hcGkvdXNlci8iICsgbV91c2VybmFtZSA7CiAgICAgUVN0cmluZyBhdXRoX3N0cmlu
ZyA9ICJHb29nbGVMb2dpbiBhdXRoPSIgKyBtX3Rva2VuOwotCUtJTzo6VHJhbnNmZXJKb2IqIGpv
YiA9IEtJTzo6aHR0cF9wb3N0KHBvc3RVcmwsIGJ1ZmZlciwgZmFsc2UpOwotCWpvYi0+YWRkTWV0
YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2F0b20reG1s
Iik7Ci0Jam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC1sZW5ndGgiLCBRU3RyaW5nKCJDb250ZW50
LUxlbmd0aDogJTEiKS5hcmcobmV3QWxidW1YTUwubGVuZ3RoKCkpKTsKLQlqb2ItPmFkZE1ldGFE
YXRhKCJjdXN0b21IVFRQSGVhZGVyIiwgIkF1dGhvcml6YXRpb246ICIgKyBhdXRoX3N0cmluZyAp
OwotCQkKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChwb3N0VXJs
LCBidWZmZXIsIGZhbHNlKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAi
Q29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOworICAgIGpvYi0+YWRkTWV0YURh
dGEoImNvbnRlbnQtbGVuZ3RoIiwgUVN0cmluZygiQ29udGVudC1MZW5ndGg6ICUxIikuYXJnKG5l
d0FsYnVtWE1MLmxlbmd0aCgpKSk7CisgICAgam9iLT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhl
YWRlciIsICJBdXRob3JpemF0aW9uOiAiICsgYXV0aF9zdHJpbmcpOworCiAgICAgY29ubmVjdChq
b2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSwKLQkJCQlTTE9U
KGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKLQljb25uZWN0KGpvYiwgU0lH
TkFMKHJlc3VsdChLSU86OkpvYiAqKSksCi0JCQkJU0xPVChzbG90UmVzdWx0KEtJTzo6Sm9iICop
KSk7Ci0JCisgICAgICAgICAgICBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5
JikpKTsKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCisgICAg
ICAgICAgICBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKKwogICAgIG1fc3RhdGUgPSBG
RV9DUkVBVEVBTEJVTTsKLQltX2pvYiAgID0gam9iOwotCW1fYnVmZmVyLnJlc2l6ZSgwKTsKLQll
bWl0IHNpZ25hbEJ1c3koIHRydWUgKTsKLQl9Ci0KLQlib29sIFBpY2FzYXdlYlRhbGtlcjo6YWRk
UGhvdG8oICBjb25zdCBRU3RyaW5nJiBwaG90b1BhdGgsCi0JCQlGUGhvdG9JbmZvJiBpbmZvLCBj
b25zdCBRU3RyaW5nJiBhbGJ1bU5hbWUsCi0JCQlib29sICByZXNjYWxlLCBpbnQgbWF4RGltLCBp
bnQgaW1hZ2VRdWFsaXR5ICkKLQl7Ci0gICAgICAgIC8vIERpc2FibGluZyB0aGlzIHRvdGFsbHkg
bWF5IGJlIGNoZWNraW5nIHRoZSBtX3N0YXRlIGFuZCBkb2luZyBzZWxlY3RpbmcgCi0gICAgICAg
IC8vIGRpc2FibGluZyBpcyBhIGJldHRlciBpZGVhCi0JCS8qaWYgKG1fam9iKQotCQl7Ci0JCQlt
X2pvYi0+a2lsbCgpOwotCQkJbV9qb2IgPSAwOwotCQl9Ki8KLQkJUVN0cmluZyBhbGJ1bV9uYW1l
ID0gYWxidW1OYW1lOwotICAgICAgICBpZiAoYWxidW1fbmFtZS5sZW5ndGgoKSA9PSAwKQotICAg
ICAgICAgICAgYWxidW1fbmFtZSA9ICJ0ZXN0IjsKLQkJUVN0cmluZyBwb3N0VXJsID0gImh0dHA6
Ly93d3cucGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91c2VyLyIgKyBtX3VzZXJu
YW1lICsgIi9hbGJ1bS8iICsgYWxidW1fbmFtZTsKLQkJUVN0cmluZyBwYXRoID0gcGhvdG9QYXRo
OwotCQlRU3RyaW5nTGlzdCBoZWFkZXJzOyAKLQkJTVBGb3JtIGZvcm07Ci0JCVFTdHJpbmcgYXV0
aF9zdHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsKLQkJLy9mb3JtLmFkZFBh
aXIoIkF1dGhvcml6YXRpb24iLCBhdXRoX3N0cmluZyk7Ci0JCQotCQkvL0NyZWF0ZSB0aGUgQm9k
eSBpbiBhdG9tLXhtbAotCQlRU3RyaW5nTGlzdCBib2R5X3htbDsKLQkJYm9keV94bWwuYXBwZW5k
KCI8ZW50cnkgeG1sbnM9XCdodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b21cJz4iKTsKLQkJYm9k
eV94bWwuYXBwZW5kKCI8dGl0bGU+IisgaW5mby50aXRsZSArIjwvdGl0bGU+Iik7Ci0JCWJvZHlf
eG1sLmFwcGVuZCgiPHN1bW1hcnk+IisgaW5mby5kZXNjcmlwdGlvbiArIjwvc3VtbWFyeT4iKTsK
LQkJYm9keV94bWwuYXBwZW5kKCI8Y2F0ZWdvcnkgc2NoZW1lPVwiaHR0cDovL3NjaGVtYXMuZ29v
Z2xlLmNvbS9nLzIwMDUja2luZFwiICIKLQkJCSAgICAgICAgICAidGVybT1cImh0dHA6Ly9zY2hl
bWFzLmdvb2dsZS5jb20vcGhvdG9zLzIwMDcjcGhvdG9cIiAvPiIpOwotCQlib2R5X3htbC5hcHBl
bmQoIjwvZW50cnk+Iik7Ci0JCQotCQlRU3RyaW5nIGJvZHkgPSBib2R5X3htbC5qb2luKCIiKTsK
LQkJCi0JCWZvcm0uYWRkUGFpcigidGVzdCIsIGJvZHksICJhcHBsaWNhdGlvbi9hdG9tK3htbCIp
OwotCQkKLSAgICAgICAgLy8gc2F2ZSB0aGUgdGFncyBmb3IgdGhpcyBwaG90byBpbiB0byB0aGUg
dGFncyBoYXNobWFwCi0gICAgICAgIHRhZ3NfbWFwLmluc2VydChpbmZvLnRpdGxlLCBpbmZvLnRh
Z3MpOyAKLQkJUUltYWdlIGltYWdlKHBob3RvUGF0aCk7Ci0JCWlmICghaW1hZ2UuaXNOdWxsKCkp
Ci0JCXsKLQkJCS8vIGltYWdlIGZpbGUgLSBzZWUgaWYgd2UgbmVlZCB0byByZXNjYWxlIGl0Ci0J
CQlpZiAocmVzY2FsZSAmJiAoaW1hZ2Uud2lkdGgoKSA+IG1heERpbSB8fCBpbWFnZS5oZWlnaHQo
KSA+IG1heERpbSkpCi0JCQl7Ci0JCQkJaW1hZ2UgPSBpbWFnZS5zbW9vdGhTY2FsZShtYXhEaW0s
IG1heERpbSwgUUltYWdlOjpTY2FsZU1pbik7Ci0JCQkJcGF0aCA9IGxvY2F0ZUxvY2FsKCJ0bXAi
LCBLVVJMKHBob3RvUGF0aCkuZmlsZW5hbWUoKSk7Ci0JCQkJaW1hZ2Uuc2F2ZShwYXRoLCBRSW1h
Z2VJTzo6aW1hZ2VGb3JtYXQocGhvdG9QYXRoKSxpbWFnZVF1YWxpdHkpOwotCQkJCS8vaWYgdGhl
IGltYWdlIGlzIEpQRUc6Ci0JCQkJLy9UaGlzIHJlc2l6aW5nIGNvZGUgY29tZXMgbW9zdGx5IGFz
IGl0IGlzIGZyb20gc2VuZGltYWdlcGx1Z2luCi0JCQkJaWYgKFFTdHJpbmcoUUltYWdlSU86Omlt
YWdlRm9ybWF0KHBob3RvUGF0aCkpLnVwcGVyKCkgPT0gIkpQRUciICl7Ci0JCQkJCUV4aWZSZXN0
b3JlciBleGlmSG9sZGVyOwotCQkJCQlleGlmSG9sZGVyLnJlYWRGaWxlKHBob3RvUGF0aCxFeGlm
UmVzdG9yZXI6OkV4aWZPbmx5KTsKLQotCQkJCQlpZihleGlmSG9sZGVyLmhhc0V4aWYoKSkKLQkJ
CQkJewotCQkJCQkJRXhpZlJlc3RvcmVyIHJlc3RvcmVyOwotCQkJCQkJcmVzdG9yZXIucmVhZEZp
bGUocGF0aCxFeGlmUmVzdG9yZXI6OkVudGlyZUltYWdlKTsKLQkJCQkJCXJlc3RvcmVyLmluc2Vy
dEV4aWZEYXRhKGV4aWZIb2xkZXIuZXhpZkRhdGEoKSk7Ci0JCQkJCQlyZXN0b3Jlci53cml0ZUZp
bGUocGF0aCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJa2RXYXJuaW5nKDUxMDAwKTw8Iihw
aWNhc2F3ZWJFeHBvcnQ6OkltYWdlIGRvZXNuJ3QgaGF2ZSBleGlmIGRhdGEpIjw8ZW5kbDsKLQkJ
CQl9CQotCQkJCQotCQkJCWtkRGVidWcoKSA8PCAiUmVzaXppbmcgYW5kIHNhdmluZyB0byB0ZW1w
IGZpbGU6ICI8PCBwYXRoIDw8IGVuZGw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWZvcm0uYWRkRmls
ZSgicGhvdG8iLCBwYXRoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3JtLmZpbmlzaCgpOwot
Ci0JCUtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJTzo6aHR0cF9wb3N0KHBvc3RVcmwsIGZvcm0u
Zm9ybURhdGEoKSwgZmFsc2UpOwotICAgICAgICBLSU86OkpvYiAqam9iX29iaj0gam9iOwotCQlq
b2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCBmb3JtLmNvbnRlbnRUeXBlKCkpOwkKLQkJ
am9iLT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsg
YXV0aF9zdHJpbmcgKTsKLQkJY29ubmVjdChqb2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwgY29u
c3QgUUJ5dGVBcnJheSYpKSwKLQkJCQlTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFy
cmF5JikpKTsKLQkJY29ubmVjdChqb2IsIFNJR05BTChyZXN1bHQoS0lPOjpKb2IgKikpLAotCQkJ
CVNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOwotCi0JCW1fc3RhdGUgPSBGRV9BRERQSE9U
TzsKLQkJbV9qb2IgICA9IGpvYjsKLQkJbV9idWZmZXIucmVzaXplKDApOwotCQllbWl0IHNpZ25h
bEJ1c3koIHRydWUgKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JUVN0cmluZyBQaWNhc2F3ZWJU
YWxrZXI6OmdldFVzZXJOYW1lKCl7Ci0JCXJldHVybiBtX3VzZXJuYW1lOwotCX0KLQlRU3RyaW5n
IFBpY2FzYXdlYlRhbGtlcjo6Z2V0VXNlcklkKCl7Ci0JCXJldHVybiBtX3VzZXJJZDsKLQl9Ci0J
dm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmNhbmNlbCgpCi0JewotCQlpZiAobV9qb2IpCi0JCXsKLQkJ
CW1fam9iLT5raWxsKCk7Ci0JCQltX2pvYiA9IDA7Ci0JCX0KLQkJaWYgKGF1dGhQcm9ncmVzc0Rs
ZyAmJiAhYXV0aFByb2dyZXNzRGxnLT5pc0hpZGRlbigpKSAKLQkJCWF1dGhQcm9ncmVzc0RsZy0+
aGlkZSgpOwotCX0JCi0KLSAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6aW5mbyhLSU86OkpvYiog
am9iLCBjb25zdCBRU3RyaW5nJiBzdHIpewotICAgIH0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6
ZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmIGRhdGEpCi0JewotCQlpZiAoZGF0YS5p
c0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9sZFNpemUgPSBtX2J1ZmZlci5zaXplKCk7
Ci0JCW1fYnVmZmVyLnJlc2l6ZShtX2J1ZmZlci5zaXplKCkgKyBkYXRhLnNpemUoKSk7Ci0gICAg
ICAgIFFTdHJpbmcgb3V0cHV0X2RhdGEgPSBRU3RyaW5nKGRhdGEpOwotCQltZW1jcHkobV9idWZm
ZXIuZGF0YSgpK29sZFNpemUsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0JfQotCi0Jdm9p
ZCBQaWNhc2F3ZWJUYWxrZXI6OnNsb3RFcnJvcihjb25zdCBRU3RyaW5nICYgZXJyb3IpewotCQlR
U3RyaW5nIHRyYW5zRXJyb3I7Ci0JCWludCBlcnJvck5vID0gMDsKLSAgICAgICAgaWYgKCFlcnJv
ci5pc0VtcHR5KCkpCi0gICAgICAgICAgICBlcnJvck5vID0gYXRvaShlcnJvci5sYXRpbjEoKSk7
Ci0JCXN3aXRjaCAoZXJyb3JObyl7Ci0JCQljYXNlIDI6IAotCQkJCXRyYW5zRXJyb3I9aTE4bigi
Tm8gcGhvdG8gc3BlY2lmaWVkIik7YnJlYWs7Ci0JCQljYXNlIDM6IAotCQkJCXRyYW5zRXJyb3I9
aTE4bigiR2VuZXJhbCB1cGxvYWQgZmFpbHVyZSIpO2JyZWFrOwotCQkJY2FzZSA0OiAKLQkJCQl0
cmFuc0Vycm9yPWkxOG4oIkZpbGVzaXplIHdhcyB6ZXJvIik7YnJlYWs7Ci0JCQljYXNlIDU6IAot
CQkJCXRyYW5zRXJyb3I9aTE4bigiRmlsZXR5cGUgd2FzIG5vdCByZWNvZ25pc2VkIik7YnJlYWs7
Ci0JCQljYXNlIDY6Ci0JCQkJdHJhbnNFcnJvcj1pMThuKCJVc2VyIGV4Y2VlZGVkIHVwbG9hZCBs
aW1pdCIpO2JyZWFrOwotCQkJY2FzZSA5NjoKLQkJCQl0cmFuc0Vycm9yPWkxOG4oIkludmFsaWQg
c2lnbmF0dXJlIik7IGJyZWFrOwotCQkJY2FzZSA5NzoKLQkJCQl0cmFuc0Vycm9yPWkxOG4oIk1p
c3Npbmcgc2lnbmF0dXJlIik7IGJyZWFrOwotCQkJY2FzZSA5ODoKLQkJCQl0cmFuc0Vycm9yPWkx
OG4oIkxvZ2luIEZhaWxlZCAvIEludmFsaWQgYXV0aCB0b2tlbiIpOyBicmVhazsKLQkJCWNhc2Ug
MTAwOiAKLQkJCQl0cmFuc0Vycm9yPWkxOG4oIkludmFsaWQgQVBJIEtleSIpOyBicmVhazsKLQkJ
CWNhc2UgMTA1OgotCQkJCXRyYW5zRXJyb3I9aTE4bigiU2VydmljZSBjdXJyZW50bHkgdW5hdmFp
bGFibGUiKTticmVhazsJCQotCQkJY2FzZSAxMDg6Ci0JCQkJdHJhbnNFcnJvcj1pMThuKCJJbnZh
bGlkIEZyb2IiKTticmVhazsJCQotCQkJY2FzZSAxMTE6IAotCQkJCXRyYW5zRXJyb3I9aTE4bigi
Rm9ybWF0IFwieHh4XCIgbm90IGZvdW5kIik7IGJyZWFrOwotCQkJY2FzZSAxMTI6IAotCQkJCXRy
YW5zRXJyb3I9aTE4bigiTWV0aG9kIFwieHh4XCIgbm90IGZvdW5kIik7IGJyZWFrOwotCQkJY2Fz
ZSAxMTQ6IAotCQkJCXRyYW5zRXJyb3I9aTE4bigiSW52YWxpZCBTT0FQIGVudmVsb3BlIik7YnJl
YWs7Ci0JCQljYXNlIDExNTogCi0JCQkJdHJhbnNFcnJvcj1pMThuKCJJbnZhbGlkIFhNTC1SUEMg
TWV0aG9kIENhbGwiKTticmVhazsKLQkJCWNhc2UgMTE2OiAKLQkJCQl0cmFuc0Vycm9yPWkxOG4o
IlRoZSBQT1NUIG1ldGhvZCBpcyBub3cgcmVxdWlyZWQgZm9yIGFsbCBzZXR0ZXJzIik7IGJyZWFr
OwotCQkJZGVmYXVsdDoKLQkJCQl0cmFuc0Vycm9yPWkxOG4oIlVua25vd24gZXJyb3IiKTsKLQkJ
fTsKLQotCQlLTWVzc2FnZUJveDo6ZXJyb3IoIDAsIGkxOG4oIkVycm9yIE9jY3VyZWQ6ICUxXG4g
V2UgY2FuIG5vdCBwcm9jZWVkIGZ1cnRoZXIiKS5hcmcodHJhbnNFcnJvcikpOwotCQkvL2tkRGVi
dWcoKTw8Ik5vdCBoYW5kbGluZyB0aGUgZXJyb3Igbm93IHdpbGwgc2VlIGl0IGxhdGVyIjw8ZW5k
bDsKLQl9Ci0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6c2xvdFJlc3VsdChLSU86OkpvYiAqam9i
KQotCXsKLSAgICAgICAgCi0JCW1fam9iID0gMDsKLQkJZW1pdCBzaWduYWxCdXN5KCBmYWxzZSAp
OwotICAgICAgIAotCQlpZiAoIGpvYi0+ZXJyb3IoKSApCi0JCXsKLQkJCWlmICggbV9zdGF0ZSA9
PSBGRV9BRERQSE9UTyApewotCQkJCWVtaXQgc2lnbmFsQWRkUGhvdG9GYWlsZWQoIGpvYi0+ZXJy
b3JTdHJpbmcoKSApOwotICAgICAgICAgICAgfQotCQkJZWxzZSB7Ci0JCQkJam9iLT5zaG93RXJy
b3JEaWFsb2coIG1fcGFyZW50ICk7CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5y
ZXNpemUoMCk7CisgICAgZW1pdCBzaWduYWxCdXN5KHRydWUpOworfQorCitib29sIFBpY2FzYXdl
YlRhbGtlcjo6YWRkUGhvdG8oY29uc3QgUVN0cmluZyYgcGhvdG9QYXRoLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEZQaG90b0luZm8mIGluZm8sIGNvbnN0IFFTdHJpbmcmIGFsYnVt
TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICByZXNjYWxlLCBpbnQg
bWF4RGltLCBpbnQgaW1hZ2VRdWFsaXR5KQoreworICAgIC8vIERpc2FibGluZyB0aGlzIHRvdGFs
bHkgbWF5IGJlIGNoZWNraW5nIHRoZSBtX3N0YXRlIGFuZCBkb2luZyBzZWxlY3RpbmcKKyAgICAv
LyBkaXNhYmxpbmcgaXMgYSBiZXR0ZXIgaWRlYQorICAgIC8qaWYgKG1fam9iKQorICAgIHsKKyAg
ICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgbV9qb2IgPSAwOworICAgIH0qLworCisgICAgUVN0cmlu
ZyBhbGJ1bV9uYW1lID0gYWxidW1OYW1lOworICAgIFFTdHJpbmcgcG9zdFVybCA9ICJodHRwOi8v
d3d3LnBpY2FzYXdlYi5nb29nbGUuY29tL2RhdGEvZmVlZC9hcGkvdXNlci8iICsgbV91c2VybmFt
ZSArICIvYWxidW0vIiArIGFsYnVtX25hbWU7CisgICAgUVN0cmluZyBwYXRoID0gcGhvdG9QYXRo
OworICAgIFFTdHJpbmdMaXN0IGhlYWRlcnM7CisgICAgTVBGb3JtIGZvcm07CisgICAgUVN0cmlu
ZyBhdXRoX3N0cmluZyA9ICJHb29nbGVMb2dpbiBhdXRoPSIgKyBtX3Rva2VuOworICAgIC8vZm9y
bS5hZGRQYWlyKCJBdXRob3JpemF0aW9uIiwgYXV0aF9zdHJpbmcpOworCisgICAgLy9DcmVhdGUg
dGhlIEJvZHkgaW4gYXRvbS14bWwKKyAgICBRU3RyaW5nTGlzdCBib2R5X3htbDsKKyAgICBib2R5
X3htbC5hcHBlbmQoIjxlbnRyeSB4bWxucz1cJ2h0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbVwn
PiIpOworICAgIGJvZHlfeG1sLmFwcGVuZCgiPHRpdGxlPiIgKyBpbmZvLnRpdGxlICsgIjwvdGl0
bGU+Iik7CisgICAgYm9keV94bWwuYXBwZW5kKCI8c3VtbWFyeT4iICsgaW5mby5kZXNjcmlwdGlv
biArICI8L3N1bW1hcnk+Iik7CisgICAgYm9keV94bWwuYXBwZW5kKCI8Y2F0ZWdvcnkgc2NoZW1l
PVwiaHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIwMDUja2luZFwiICIKKyAgICAgICAgICAg
ICAgICAgICAgInRlcm09XCJodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL3Bob3Rvcy8yMDA3I3Bo
b3RvXCIgLz4iKTsKKyAgICBib2R5X3htbC5hcHBlbmQoIjwvZW50cnk+Iik7CisKKyAgICBRU3Ry
aW5nIGJvZHkgPSBib2R5X3htbC5qb2luKCIiKTsKKworICAgIGZvcm0uYWRkUGFpcigidGVzdCIs
IGJvZHksICJhcHBsaWNhdGlvbi9hdG9tK3htbCIpOworCisgICAgLy8gc2F2ZSB0aGUgdGFncyBm
b3IgdGhpcyBwaG90byBpbiB0byB0aGUgdGFncyBoYXNobWFwCisgICAgdGFnc19tYXAuaW5zZXJ0
KGluZm8udGl0bGUsIGluZm8udGFncyk7CisKKyAgICBRSW1hZ2UgaW1hZ2UocGhvdG9QYXRoKTsK
KworICAgIGlmICghaW1hZ2UuaXNOdWxsKCkpCisgICAgeworICAgICAgICAvLyBpbWFnZSBmaWxl
IC0gc2VlIGlmIHdlIG5lZWQgdG8gcmVzY2FsZSBpdAorICAgICAgICBpZiAocmVzY2FsZSAmJiAo
aW1hZ2Uud2lkdGgoKSA+IG1heERpbSB8fCBpbWFnZS5oZWlnaHQoKSA+IG1heERpbSkpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIGltYWdlID0gaW1hZ2Uuc21vb3RoU2NhbGUobWF4RGltLCBtYXhE
aW0sIFFJbWFnZTo6U2NhbGVNaW4pOworICAgICAgICAgICAgcGF0aCA9IGxvY2F0ZUxvY2FsKCJ0
bXAiLCBLVVJMKHBob3RvUGF0aCkuZmlsZW5hbWUoKSk7CisgICAgICAgICAgICBpbWFnZS5zYXZl
KHBhdGgsIFFJbWFnZUlPOjppbWFnZUZvcm1hdChwaG90b1BhdGgpLCBpbWFnZVF1YWxpdHkpOwor
ICAgICAgICAgICAgLy9pZiB0aGUgaW1hZ2UgaXMgSlBFRzoKKyAgICAgICAgICAgIC8vVGhpcyBy
ZXNpemluZyBjb2RlIGNvbWVzIG1vc3RseSBhcyBpdCBpcyBmcm9tIHNlbmRpbWFnZXBsdWdpbgor
CisgICAgICAgICAgICBpZiAoUVN0cmluZyhRSW1hZ2VJTzo6aW1hZ2VGb3JtYXQocGhvdG9QYXRo
KSkudXBwZXIoKSA9PSAiSlBFRyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhp
ZlJlc3RvcmVyIGV4aWZIb2xkZXI7CisgICAgICAgICAgICAgICAgZXhpZkhvbGRlci5yZWFkRmls
ZShwaG90b1BhdGgsIEV4aWZSZXN0b3Jlcjo6RXhpZk9ubHkpOworCisgICAgICAgICAgICAgICAg
aWYgKGV4aWZIb2xkZXIuaGFzRXhpZigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICAgICAgRXhpZlJlc3RvcmVyIHJlc3RvcmVyOworICAgICAgICAgICAgICAgICAgICByZXN0
b3Jlci5yZWFkRmlsZShwYXRoLCBFeGlmUmVzdG9yZXI6OkVudGlyZUltYWdlKTsKKyAgICAgICAg
ICAgICAgICAgICAgcmVzdG9yZXIuaW5zZXJ0RXhpZkRhdGEoZXhpZkhvbGRlci5leGlmRGF0YSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZXIud3JpdGVGaWxlKHBhdGgpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGtk
V2FybmluZyg1MTAwMCkgPDwgIihwaWNhc2F3ZWJFeHBvcnQ6OkltYWdlIGRvZXNuJ3QgaGF2ZSBl
eGlmIGRhdGEpIiA8PCBlbmRsOwogICAgICAgICAgICAgfQotCQkJcmV0dXJuOwotCQl9CiAKLQkJ
c3dpdGNoKG1fc3RhdGUpCi0JCXsKLQkJCWNhc2UoRkVfTE9HSU4pOgotCQkJCS8vcGFyc2VSZXNw
b25zZUxvZ2luKG1fYnVmZmVyKTsKLQkJCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UoRkVfQ1JF
QVRFQUxCVU0pOgotICAgICAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VDcmVhdGVBbGJ1bShtX2J1
ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlKEZFX0xJU1RB
TEJVTVMpOgotCQkJCXBhcnNlUmVzcG9uc2VMaXN0QWxidW1zKG1fYnVmZmVyKTsKLQkJCQlicmVh
azsKLQkJCWNhc2UoRkVfR0VURlJPQik6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKEZFX0dFVFRPS0VO
KToKLQkJCQlwYXJzZVJlc3BvbnNlR2V0VG9rZW4obV9idWZmZXIpOwotCQkJCWJyZWFrOwotCQkJ
Y2FzZShGRV9DSEVDS1RPS0VOKToKLQkJCQlwYXJzZVJlc3BvbnNlQ2hlY2tUb2tlbihtX2J1ZmZl
cik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKEZFX0dFVEFVVEhPUklaRUQpOgotCQkJCWJyZWFrOwot
CQkJY2FzZShGRV9MSVNUUEhPVE9TKToKLQkJCQlwYXJzZVJlc3BvbnNlTGlzdFBob3RvcyhtX2J1
ZmZlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKEZFX0dFVFBIT1RPUFJPUEVSVFkpOgotCQkJCXBh
cnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KG1fYnVmZmVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2Uo
RkVfQUREUEhPVE8pOgotCQkJCXBhcnNlUmVzcG9uc2VBZGRQaG90byhtX2J1ZmZlcik7Ci0JCQkJ
YnJlYWs7Ci0JCQljYXNlKEZFX0FERFRBRyk6Ci0JCQkJcGFyc2VSZXNwb25zZUFkZFRhZyhtX2J1
ZmZlcik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFy
c2VSZXNwb25zZUNoZWNrVG9rZW4oY29uc3QgUUJ5dGVBcnJheSAmZGF0YSkKLQl7Ci0JCWJvb2wg
c3VjY2VzcyA9IGZhbHNlOwotCQlRU3RyaW5nIGVycm9yU3RyaW5nOwotCQlRU3RyaW5nIHVzZXJu
YW1lOwotCQlRU3RyaW5nIHRyYW5zUmV0dXJuKGRhdGEpOwotICAgICAgICAvLyBJZiBjaGVja3Rv
a2VuIGZhaWxlZC4KLSAgICAgICAgLy8gZ2V0VG9rZW4gLi4uCi0gICAgICAgIGlmKHRyYW5zUmV0
dXJuLnN0YXJ0c1dpdGgoIkVycm9yPSIpKQotICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwor
ICAgICAgICAgICAga2REZWJ1ZygpIDw8ICJSZXNpemluZyBhbmQgc2F2aW5nIHRvIHRlbXAgZmls
ZTogIiA8PCBwYXRoIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvcm0u
YWRkRmlsZSgicGhvdG8iLCBwYXRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9y
bS5maW5pc2goKTsKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChw
b3N0VXJsLCBmb3JtLmZvcm1EYXRhKCksIGZhbHNlKTsKKyAgICBLSU86OkpvYiAqam9iX29iaiA9
IGpvYjsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCBmb3JtLmNvbnRlbnRU
eXBlKCkpOworICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9y
aXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsKKworICAgIGNvbm5lY3Qoam9iLAorICAgICAgICAg
ICAgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpLAorICAgICAgICAg
ICAgU0xPVChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSk7CisKKyAgICBjb25u
ZWN0KGpvYiwKKyAgICAgICAgICAgIFNJR05BTChyZXN1bHQoS0lPOjpKb2IgKikpLAorICAgICAg
ICAgICAgU0xPVChzbG90UmVzdWx0KEtJTzo6Sm9iICopKSk7CisKKyAgICBtX3N0YXRlID0gRkVf
QUREUEhPVE87CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7Cisg
ICAgZW1pdCBzaWduYWxCdXN5KHRydWUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1FTdHJp
bmcgUGljYXNhd2ViVGFsa2VyOjpnZXRVc2VyTmFtZSgpCit7CisgICAgcmV0dXJuIG1fdXNlcm5h
bWU7Cit9CisKK1FTdHJpbmcgUGljYXNhd2ViVGFsa2VyOjpnZXRVc2VySWQoKQoreworICAgIHJl
dHVybiBtX3VzZXJJZDsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmNhbmNlbCgpCit7Cisg
ICAgaWYgKG1fam9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9q
b2IgPSAwOworICAgIH0KKworICAgIGlmIChhdXRoUHJvZ3Jlc3NEbGcgJiYgIWF1dGhQcm9ncmVz
c0RsZy0+aXNIaWRkZW4oKSkKKyAgICAgICAgYXV0aFByb2dyZXNzRGxnLT5oaWRlKCk7Cit9CisK
K3ZvaWQgUGljYXNhd2ViVGFsa2VyOjppbmZvKEtJTzo6Sm9iKiBqb2IsIGNvbnN0IFFTdHJpbmcm
IHN0cikKK3sKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmRhdGEoS0lPOjpKb2IqLCBjb25z
dCBRQnl0ZUFycmF5JiBkYXRhKQoreworICAgIGlmIChkYXRhLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaW50IG9sZFNpemUgPSBtX2J1ZmZlci5zaXplKCk7CisKKyAgICBtX2J1
ZmZlci5yZXNpemUobV9idWZmZXIuc2l6ZSgpICsgZGF0YS5zaXplKCkpOworCisgICAgUVN0cmlu
ZyBvdXRwdXRfZGF0YSA9IFFTdHJpbmcoZGF0YSk7CisKKyAgICBtZW1jcHkobV9idWZmZXIuZGF0
YSgpICsgb2xkU2l6ZSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKK30KKwordm9pZCBQaWNh
c2F3ZWJUYWxrZXI6OnNsb3RFcnJvcihjb25zdCBRU3RyaW5nICYgZXJyb3IpCit7CisgICAgUVN0
cmluZyB0cmFuc0Vycm9yOworICAgIGludCBlcnJvck5vID0gMDsKKworICAgIGlmICghZXJyb3Iu
aXNFbXB0eSgpKQorICAgICAgICBlcnJvck5vID0gYXRvaShlcnJvci5sYXRpbjEoKSk7CisKKyAg
ICBzd2l0Y2ggKGVycm9yTm8pCisgICAgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0
cmFuc0Vycm9yID0gaTE4bigiTm8gcGhvdG8gc3BlY2lmaWVkIik7CisgICAgICAgICAgICBicmVh
azsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiR2Vu
ZXJhbCB1cGxvYWQgZmFpbHVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2Fz
ZSA0OgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZpbGVzaXplIHdhcyB6ZXJvIik7
CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB0cmFu
c0Vycm9yID0gaTE4bigiRmlsZXR5cGUgd2FzIG5vdCByZWNvZ25pc2VkIik7CisgICAgICAgICAg
ICBicmVhazsKKworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4
bigiVXNlciBleGNlZWRlZCB1cGxvYWQgbGltaXQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiSW52YWxpZCBz
aWduYXR1cmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTc6CisgICAg
ICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTWlzc2luZyBzaWduYXR1cmUiKTsKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0g
aTE4bigiTG9naW4gRmFpbGVkIC8gSW52YWxpZCBhdXRoIHRva2VuIik7CisgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThu
KCJJbnZhbGlkIEFQSSBLZXkiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ug
MTA1OgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIlNlcnZpY2UgY3VycmVudGx5IHVu
YXZhaWxhYmxlIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEwODoKKyAg
ICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIEZyb2IiKTsKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIGNhc2UgMTExOgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkx
OG4oIkZvcm1hdCBcInh4eFwiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAg
ICAgICAgY2FzZSAxMTI6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTWV0aG9kIFwi
eHh4XCIgbm90IGZvdW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEx
NDoKKyAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIFNPQVAgZW52ZWxvcGUi
KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTE1OgorICAgICAgICAgICAg
dHJhbnNFcnJvciA9IGkxOG4oIkludmFsaWQgWE1MLVJQQyBNZXRob2QgQ2FsbCIpOworICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMTY6CisgICAgICAgICAgICB0cmFuc0Vycm9y
ID0gaTE4bigiVGhlIFBPU1QgbWV0aG9kIGlzIG5vdyByZXF1aXJlZCBmb3IgYWxsIHNldHRlcnMi
KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0
cmFuc0Vycm9yID0gaTE4bigiVW5rbm93biBlcnJvciIpOworICAgIH07CisKKyAgICBLTWVzc2Fn
ZUJveDo6ZXJyb3IoMCwgaTE4bigiRXJyb3IgT2NjdXJlZDogJTFcbiBXZSBjYW4gbm90IHByb2Nl
ZWQgZnVydGhlciIpLmFyZyh0cmFuc0Vycm9yKSk7CisKKyAgICAvL2tkRGVidWcoKTw8Ik5vdCBo
YW5kbGluZyB0aGUgZXJyb3Igbm93IHdpbGwgc2VlIGl0IGxhdGVyIjw8ZW5kbDsKK30KKwordm9p
ZCBQaWNhc2F3ZWJUYWxrZXI6OnNsb3RSZXN1bHQoS0lPOjpKb2IgKmpvYikKK3sKKworICAgIG1f
am9iID0gMDsKKyAgICBlbWl0IHNpZ25hbEJ1c3koZmFsc2UpOworCisgICAgaWYgKGpvYi0+ZXJy
b3IoKSkKKyAgICB7CisgICAgICAgIGlmIChtX3N0YXRlID09IEZFX0FERFBIT1RPKQorICAgICAg
ICB7CisgICAgICAgICAgICBlbWl0IHNpZ25hbEFkZFBob3RvRmFpbGVkKGpvYi0+ZXJyb3JTdHJp
bmcoKSk7CisgICAgICAgIH0KICAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBq
b2ItPnNob3dFcnJvckRpYWxvZyhtX3BhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgc3dpdGNoIChtX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZShG
RV9MT0dJTik6CisgICAgICAgICAgICAvL3BhcnNlUmVzcG9uc2VMb2dpbihtX2J1ZmZlcik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9DUkVBVEVBTEJVTSk6CisgICAgICAg
ICAgICBwYXJzZVJlc3BvbnNlQ3JlYXRlQWxidW0obV9idWZmZXIpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UoRkVfTElTVEFMQlVNUyk6CisgICAgICAgICAgICBwYXJzZVJlc3Bv
bnNlTGlzdEFsYnVtcyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZShGRV9HRVRGUk9CKToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0dFVFRP
S0VOKToKKyAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VHZXRUb2tlbihtX2J1ZmZlcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9DSEVDS1RPS0VOKToKKyAgICAgICAgICAg
IHBhcnNlUmVzcG9uc2VDaGVja1Rva2VuKG1fYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlKEZFX0dFVEFVVEhPUklaRUQpOgorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UoRkVfTElTVFBIT1RPUyk6CisgICAgICAgICAgICBwYXJzZVJlc3BvbnNlTGlzdFBo
b3RvcyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9HRVRQ
SE9UT1BST1BFUlRZKToKKyAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KG1f
YnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0FERFBIT1RPKToK
KyAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VBZGRQaG90byhtX2J1ZmZlcik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZShGRV9BRERUQUcpOgorICAgICAgICAgICAgcGFyc2VSZXNw
b25zZUFkZFRhZyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3Zv
aWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlQ2hlY2tUb2tlbihjb25zdCBRQnl0ZUFy
cmF5ICZkYXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFTdHJpbmcgZXJy
b3JTdHJpbmc7CisgICAgUVN0cmluZyB1c2VybmFtZTsKKyAgICBRU3RyaW5nIHRyYW5zUmV0dXJu
KGRhdGEpOworICAgIC8vIElmIGNoZWNrdG9rZW4gZmFpbGVkLgorICAgIC8vIGdldFRva2VuIC4u
LgorCisgICAgaWYgKHRyYW5zUmV0dXJuLnN0YXJ0c1dpdGgoIkVycm9yPSIpKQorICAgICAgICBz
dWNjZXNzID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAg
IGlmICghc3VjY2VzcykKKyAgICAgICAgZ2V0VG9rZW4obV91c2VybmFtZSwgbV9wYXNzd29yZCk7
CisKKyAgICAvL2VtaXQgc2lnbmFsRXJyb3IoZXJyb3JTdHJpbmcpOworfQorCit2b2lkIFBpY2Fz
YXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUdldFRva2VuKGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEp
Cit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmluZyBlcnJvclN0cmluZzsK
KyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICAvL0NoZWNrIHRoZSByZXNwb25zZSBjb2RlIHNo
b3VsZCBpdCBiZSAyMDAsIHByb2NlZWQKKyAgICAvL2lmIGl0IGlzIDQwMyBoYW5kbGUgdGhlIGVy
cm9yIG1lc2cKKyAgICAvL2ZpZ3VyZSBvdXQgdGhlIGF1dGggc3RyaW5nIGZyb20gdGhpcyByZXNw
b25zZQorCisgICAgaWYgKHN0ci5maW5kKCJBdXRoPSIpKQorICAgIHsKKyAgICAgICAgUVN0cmlu
Z0xpc3Qgc3RyTGlzdCA9IFFTdHJpbmdMaXN0OjpzcGxpdCgiQXV0aD0iLCBzdHIpOworICAgICAg
ICBtX3Rva2VuID0gc3RyTGlzdFsxXTsKKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgfQorCisg
ICAgLy9saXN0QWxidW1zKCk7CisgICAgaWYgKHN1Y2Nlc3MpCisgICAgeworICAgICAgICBhdXRo
UHJvZ3Jlc3NEbGctPmhpZGUoKTsKKyAgICAgICAgZW1pdCBzaWduYWxUb2tlbk9idGFpbmVkKG1f
dG9rZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGVtaXQgc2lnbmFsRXJyb3IoZXJyb3JT
dHJpbmcpOworCisgICAgZW1pdCBzaWduYWxCdXN5KGZhbHNlKTsKK30KKwordm9pZCBQaWNhc2F3
ZWJUYWxrZXI6OmdldEhUTUxSZXNwb25zZUNvZGUoY29uc3QgUVN0cmluZyYgc3RyKQoreworfQor
Cit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUxpc3RBbGJ1bXMoY29uc3QgUUJ5
dGVBcnJheSAmZGF0YSkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBRU3RyaW5n
IHN0cihkYXRhKTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJmZWVkIik7CisKKyAgICBpZiAoIWRv
Yy5zZXRDb250ZW50KGRhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBRRG9t
Tm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7CisgICAgUURvbUVsZW1lbnQgZTsKKyAg
ICBRU3RyaW5nIGZlZWRfaWQsIGZlZWRfdXBkYXRlZCwgZmVlZF90aXRsZSwgZmVlZF9zdWJ0aXRs
ZTsKKyAgICBRU3RyaW5nIGZlZWRfaWNvbl91cmwsIGZlZWRfbGlua191cmw7CisgICAgUVN0cmlu
ZyBmZWVkX3VzZXJuYW1lLCBmZWVkX3VzZXJfdXJpOworCisgICAgUVN0cmluZyBhbGJ1bV9pZCwg
YWxidW1fdGl0bGUsIGFsYnVtX2Rlc2NyaXB0aW9uOworICAgIG1fYWxidW1zTGlzdCA9IG5ldyBR
VmFsdWVMaXN0IDxQaWNhc2FXZWJBbGJ1bT4oKTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwo
KSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLmlzRWxlbWVudCgpICYmIG5vZGUubm9kZU5hbWUo
KSA9PSAiZW50cnkiKQorICAgICAgICB7CiAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAg
ICAgICAgaWYoIXN1Y2Nlc3MpCi0gICAgICAgICAgICBnZXRUb2tlbihtX3VzZXJuYW1lLCBtX3Bh
c3N3b3JkKTsKLQkJLy9lbWl0IHNpZ25hbEVycm9yKGVycm9yU3RyaW5nKTsKLQl9Ci0gICAgCi0J
dm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VHZXRUb2tlbihjb25zdCBRQnl0ZUFy
cmF5ICZkYXRhKQotCXsKLQkJYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0JCVFTdHJpbmcgZXJyb3JT
dHJpbmc7Ci0JCVFTdHJpbmcgc3RyKGRhdGEpOwotCQkvL0NoZWNrIHRoZSByZXNwb25zZSBjb2Rl
IHNob3VsZCBpdCBiZSAyMDAsIHByb2NlZWQKLQkJLy9pZiBpdCBpcyA0MDMgaGFuZGxlIHRoZSBl
cnJvciBtZXNnCi0JCS8vZmlndXJlIG91dCB0aGUgYXV0aCBzdHJpbmcgZnJvbSB0aGlzIHJlc3Bv
bnNlCi0JCWlmIChzdHIuZmluZCgiQXV0aD0iKSl7Ci0JCQlRU3RyaW5nTGlzdCBzdHJMaXN0ID0g
UVN0cmluZ0xpc3Q6OnNwbGl0KCJBdXRoPSIsIHN0cik7Ci0JCQltX3Rva2VuID0gc3RyTGlzdFsx
XTsKLQkJICAgIHN1Y2Nlc3MgPSAxOworICAgICAgICAgICAgZSA9IG5vZGUudG9FbGVtZW50KCk7
CisgICAgICAgICAgICBRRG9tTm9kZSBkZXRhaWxzID0gZS5maXJzdENoaWxkKCk7CisgICAgICAg
ICAgICBQaWNhc2FXZWJBbGJ1bSBmcHM7CisgICAgICAgICAgICBRRG9tTm9kZSBkZXRhaWxzTm9k
ZSA9IGRldGFpbHM7CisKKyAgICAgICAgICAgIHdoaWxlICghZGV0YWlsc05vZGUuaXNOdWxsKCkp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRldGFpbHNOb2RlLmlzRWxlbWVu
dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFpbHNO
b2RlLm5vZGVOYW1lKCkgPT0gImlkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgICAgICAgICAgYWxidW1faWQgPSBkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS50ZXh0KCk7
CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgd2hhdCBpcyBvYnRhaW5lZCBmcm9t
IGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICBmcHMuaWQgPSBhbGJ1bV9pZDsKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzTm9kZS5u
b2RlTmFtZSgpID09ICJ0aXRsZSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGFsYnVtX3RpdGxlID0gIk5vdCBmZXRjaGVkIjsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGRldGFpbHNOb2RlLnRvRWxlbWVudCgpLmF0dHJpYnV0ZSgidHlwZSIp
ID09ICJ0ZXh0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV90aXRsZSA9IGRl
dGFpbHNOb2RlLnRvRWxlbWVudCgpLnRleHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Ly90aGlzIGlzIHdoYXQgaXMgb2J0YWluZWQgZnJvbSBkYXRhLgorICAgICAgICAgICAgICAgICAg
ICAgICAgZnBzLnRpdGxlID0gYWxidW1fdGl0bGU7CisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc05vZGUubm9kZU5hbWUoKSA9PSAiZ3Bob3Rv
Om5hbWUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBR
U3RyaW5nIG5hbWUgPSBkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS50ZXh0KCk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBmcHMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGV0YWlsc05vZGUgPSBkZXRhaWxzTm9k
ZS5uZXh0U2libGluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9hbGJ1bXNMaXN0
LT5hcHBlbmQoZnBzKTsKICAgICAgICAgfQotICAgICAgICAvL2xpc3RBbGJ1bXMoKTsKLQkJaWYo
c3VjY2Vzcyl7Ci0JCSAgICBhdXRoUHJvZ3Jlc3NEbGctPmhpZGUoKTsKLQkJCWVtaXQgc2lnbmFs
VG9rZW5PYnRhaW5lZChtX3Rva2VuKTsKKyAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmco
KTsKKyAgICB9CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgeworICAgICAgICBlbWl0IHNpZ25h
bEdldEFsYnVtc0xpc3RGYWlsZWQoaTE4bigiRmFpbGVkIHRvIGZldGNoIHBob3RvU2V0cyBMaXN0
IikpOworICAgICAgICBtX2FsYnVtc0xpc3QgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAg
eworICAgICAgICBlbWl0IHNpZ25hbEdldEFsYnVtc0xpc3RTdWNjZWVkZWQoKTsKKyAgICB9Cit9
CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlTGlzdFBob3Rvcyhjb25zdCBR
Qnl0ZUFycmF5ICZkYXRhKQoreworICAgIFFEb21Eb2N1bWVudCBkb2MoImdldFBob3Rvc0xpc3Qi
KTsKKworICAgIGlmICghZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgeworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgUURvbUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1l
bnQoKTsKKworICAgIFFEb21Ob2RlIG5vZGUgPSBkb2NFbGVtLmZpcnN0Q2hpbGQoKTsKKyAgICAv
L1FEb21FbGVtZW50IGU7CisgICAgLy9UbyBiZSBpbXBsZW1lbnRlZC4KK30KKwordm9pZCBQaWNh
c2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VDcmVhdGVBbGJ1bShjb25zdCBRQnl0ZUFycmF5ICZk
YXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFTdHJpbmcgZXJyb3JTdHJp
bmc7CisgICAgUVN0cmluZyByZXNwb25zZShkYXRhKTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJB
ZGRQaG90byBSZXNwb25zZSIpOworICAgIC8vIHBhcnNlIHRoZSBuZXcgYWxidW0gbmFtZQorICAg
IFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7CisgICAgUVN0cmlu
ZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsKKyAgICBRRG9tTm9kZSBub2Rl
ID0gZG9jRWxlbS5maXJzdENoaWxkKCk7IC8vdGhpcyBzaG91bGQgbWVhbiA8ZW50cnk+CisgICAg
UURvbUVsZW1lbnQgZTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwoKSkKKyAgICB7CisgICAg
ICAgIGlmIChub2RlLmlzRWxlbWVudCgpKQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5n
IG5vZGVfbmFtZSA9IG5vZGUubm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFFTdHJpbmcgbm9kZV92
YWx1ZSA9IG5vZGUudG9FbGVtZW50KCkudGV4dCgpOworCisgICAgICAgICAgICBpZiAobm9kZV9u
YW1lID09ICJ0aXRsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9
IHRydWU7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCisgICAgICAgICAgICAg
ICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1l
ID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgIHBob3RvX2lkID0gbm9kZV92YWx1ZTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmFsYnVtaWQiKQorICAg
ICAgICAgICAgICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKICAgICAgICAgfQotCQllbHNlCi0J
CQllbWl0IHNpZ25hbEVycm9yKGVycm9yU3RyaW5nKTsKLQkJZW1pdCBzaWduYWxCdXN5KCBmYWxz
ZSApOwotCX0KLSAgICAKLSAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Z2V0SFRNTFJlc3BvbnNl
Q29kZShjb25zdCBRU3RyaW5nJiBzdHIpewotICAgIH0KLSAgICAKLQl2b2lkIFBpY2FzYXdlYlRh
bGtlcjo6cGFyc2VSZXNwb25zZUxpc3RBbGJ1bXMoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSkKLQl7
Ci0JCWJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICBRU3RyaW5nIHN0cihkYXRhKTsKLQkJ
UURvbURvY3VtZW50IGRvYyggImZlZWQiICk7Ci0JCWlmICggIWRvYy5zZXRDb250ZW50KCBkYXRh
ICkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUURvbUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1
bWVudEVsZW1lbnQoKTsKLQkJUURvbU5vZGUgbm9kZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOwot
CQlRRG9tRWxlbWVudCBlOwotICAgICAgICBRU3RyaW5nIGZlZWRfaWQsIGZlZWRfdXBkYXRlZCwg
ZmVlZF90aXRsZSwgZmVlZF9zdWJ0aXRsZTsKLSAgICAgICAgUVN0cmluZyBmZWVkX2ljb25fdXJs
LCBmZWVkX2xpbmtfdXJsOwotICAgICAgICBRU3RyaW5nIGZlZWRfdXNlcm5hbWUsIGZlZWRfdXNl
cl91cmk7Ci0gICAgICAgIAotCQlRU3RyaW5nIGFsYnVtX2lkLCBhbGJ1bV90aXRsZSwgYWxidW1f
ZGVzY3JpcHRpb247Ci0JCW1fYWxidW1zTGlzdCA9IG5ldyBRVmFsdWVMaXN0IDxQaWNhc2FXZWJB
bGJ1bT4oKTsKLSAgICAgICAgCi0JCXdoaWxlKCAhbm9kZS5pc051bGwoKSApIHsKLQkJCWlmICgg
bm9kZS5pc0VsZW1lbnQoKSAmJiBub2RlLm5vZGVOYW1lKCkgPT0gImVudHJ5IiApIHsKKworICAg
ICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZygpOworICAgIH0KKworICAgIC8vIFJhaXNlIGEg
cG9wdXAgaW5mb3JtaW5nIHN1Y2Nlc3MKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNl
UmVzcG9uc2VBZGRUYWcoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSkKK3sKKyAgICBRU3RyaW5nIHN0
cihkYXRhKTsKKyAgICByZW1haW5pbmdfdGFnc19jb3VudCAtPSAxOworICAgIGVtaXQgc2lnbmFs
QnVzeShmYWxzZSk7CisgICAgbV9idWZmZXIucmVzaXplKDApOworCisgICAgaWYgKHJlbWFpbmlu
Z190YWdzX2NvdW50ID09IDApCisgICAgICAgIGVtaXQgc2lnbmFsQWRkUGhvdG9TdWNjZWVkZWQo
KTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VBZGRQaG90byhjb25z
dCBRQnl0ZUFycmF5ICZkYXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFT
dHJpbmcgICAgIGxpbmU7CisgICAgUVN0cmluZyBzdHIoZGF0YSk7CisgICAgc3VjY2VzcyA9IDE7
CisgICAgUURvbURvY3VtZW50IGRvYygiQWRkUGhvdG8gUmVzcG9uc2UiKTsKKworICAgIGlmICgh
ZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgUURvbUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQoKTsKKworICAgIFFT
dHJpbmcgdGl0bGUsIHBob3RvX2lkLCBhbGJ1bV9pZCwgcGhvdG9VUkk7CisgICAgUURvbU5vZGUg
bm9kZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOyAvL3RoaXMgc2hvdWxkIG1lYW4gPGVudHJ5Pgor
ICAgIFFEb21FbGVtZW50IGU7CisKKyAgICB3aGlsZSAoIW5vZGUuaXNOdWxsKCkpCisgICAgewor
ICAgICAgICBpZiAobm9kZS5pc0VsZW1lbnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUVN0
cmluZyBub2RlX25hbWUgPSBub2RlLm5vZGVOYW1lKCk7CisgICAgICAgICAgICBRU3RyaW5nIG5v
ZGVfdmFsdWUgPSBub2RlLnRvRWxlbWVudCgpLnRleHQoKTsKKworICAgICAgICAgICAgaWYgKG5v
ZGVfbmFtZSA9PSAidGl0bGUiKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHN1Y2Nl
c3MgPSB0cnVlOwotCQkJCWUgPSBub2RlLnRvRWxlbWVudCgpOyAKLQkJCQlRRG9tTm9kZSBkZXRh
aWxzPWUuZmlyc3RDaGlsZCgpOwotCQkJCVBpY2FzYVdlYkFsYnVtIGZwczsKLQkJCQlRRG9tTm9k
ZSBkZXRhaWxzTm9kZSA9IGRldGFpbHM7Ci0JCQkJd2hpbGUoIWRldGFpbHNOb2RlLmlzTnVsbCgp
KXsKLQkJCQkJaWYoZGV0YWlsc05vZGUuaXNFbGVtZW50KCkpewotCQkJCQkJaWYoZGV0YWlsc05v
ZGUubm9kZU5hbWUoKSA9PSAiaWQiKXsKLQkJCQkJCQlhbGJ1bV9pZCA9IGRldGFpbHNOb2RlLnRv
RWxlbWVudCgpLnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMg
d2hhdCBpcyBvYnRhaW5lZCBmcm9tIGRhdGEuCi0JCQkJCQkJZnBzLmlkID0gYWxidW1faWQ7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQlpZihkZXRhaWxzTm9kZS5ub2RlTmFtZSgp
ID09ICJ0aXRsZSIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3RpdGxlID0g
Ik5vdCBmZXRjaGVkIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXRhaWxzTm9k
ZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoInR5cGUiKT09InRleHQiKQotICAgIAkJCQkJCQlhbGJ1
bV90aXRsZSA9IGRldGFpbHNOb2RlLnRvRWxlbWVudCgpLnRleHQoKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvL3RoaXMgaXMgd2hhdCBpcyBvYnRhaW5lZCBmcm9tIGRhdGEuCi0JCQkJ
CQkJZnBzLnRpdGxlID0gYWxidW1fdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0J
CQkJCSAgICBpZihkZXRhaWxzTm9kZS5ub2RlTmFtZSgpPT0iZ3Bob3RvOm5hbWUiKXsKLQkJCQkJ
CQlRU3RyaW5nIG5hbWUgPSBkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS50ZXh0KCk7Ci0JCQkJCQl9
Ci0JCQkJCQkJfQotCQkJCQkJCQlkZXRhaWxzTm9kZSA9IGRldGFpbHNOb2RlLm5leHRTaWJsaW5n
KCk7Ci0JCQkJCQl9CQkJCQkKLQkJCQltX2FsYnVtc0xpc3QtPmFwcGVuZChmcHMpOworICAgICAg
ICAgICAgICAgIHRpdGxlID0gbm9kZV92YWx1ZTsKICAgICAgICAgICAgIH0KLQkJbm9kZSA9IG5v
ZGUubmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAoIXN1Y2Nlc3MpCi0JCXsKLQkJCWVtaXQgc2ln
bmFsR2V0QWxidW1zTGlzdEZhaWxlZChpMThuKCJGYWlsZWQgdG8gZmV0Y2ggcGhvdG9TZXRzIExp
c3QiKSk7Ci0gICAgICAgICAgICBtX2FsYnVtc0xpc3QgPSBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJ
ewotCQkJZW1pdCBzaWduYWxHZXRBbGJ1bXNMaXN0U3VjY2VlZGVkKCk7Ci0JCX0JCi0JfQotCi0J
dm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VMaXN0UGhvdG9zKGNvbnN0IFFCeXRl
QXJyYXkgJmRhdGEpCi0JewotCQlRRG9tRG9jdW1lbnQgZG9jKCAiZ2V0UGhvdG9zTGlzdCIgKTsK
LQkJaWYgKCAhZG9jLnNldENvbnRlbnQoIGRhdGEgKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQlR
RG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOwotCQlRRG9tTm9kZSBu
b2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7Ci0JCS8vUURvbUVsZW1lbnQgZTsKLQkJLy9UbyBi
ZSBpbXBsZW1lbnRlZC4KLQl9Ci0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25z
ZUNyZWF0ZUFsYnVtKGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEpCi0JewotICAgICAgICBib29sIHN1
Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgUVN0cmluZyBlcnJvclN0cmluZzsKLSAgICAgICAgUVN0
cmluZyByZXNwb25zZShkYXRhKTsKLQkJUURvbURvY3VtZW50IGRvYyggIkFkZFBob3RvIFJlc3Bv
bnNlIiApOwotCSAgICAvLyBwYXJzZSB0aGUgbmV3IGFsYnVtIG5hbWUKLSAgICAgICAgUURvbUVs
ZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgUVN0cmluZyB0
aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsgCi0JCVFEb21Ob2RlIG5vZGUgPSBk
b2NFbGVtLmZpcnN0Q2hpbGQoKTsgLy90aGlzIHNob3VsZCBtZWFuIDxlbnRyeT4KLQkJUURvbUVs
ZW1lbnQgZTsKLQkJd2hpbGUoICFub2RlLmlzTnVsbCgpICkgewotCQkJaWYgKCBub2RlLmlzRWxl
bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgbm9kZV9uYW1lID0gbm9kZS5u
b2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIG5vZGVfdmFsdWUgPSBub2Rl
LnRvRWxlbWVudCgpLnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobm9kZV9uYW1lID09
ICJ0aXRsZSIpewotCQkJCSAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB0aXRsZSA9IG5vZGVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBwaG90b1VSSSA9IG5vZGVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGVs
c2UgaWYobm9kZV9uYW1lID09ICJncGhvdG86aWQiKQotICAgICAgICAgICAgICAgICAgICAgICAg
cGhvdG9faWQgPSBub2RlX3ZhbHVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKG5vZGVf
bmFtZSA9PSAiZ3Bob3RvOmFsYnVtaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1f
aWQgPSBub2RlX3ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub2Rl
ID0gbm9kZS5uZXh0U2libGluZygpOwotCQl9Ci0gICAgICAgIC8vIFJhaXNlIGEgcG9wdXAgaW5m
b3JtaW5nIHN1Y2Nlc3MKLQl9Ci0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25z
ZUFkZFRhZyhjb25zdCBRQnl0ZUFycmF5ICZkYXRhKXsKLSAgICAgICAgUVN0cmluZyBzdHIoZGF0
YSk7Ci0gICAgICAgIHJlbWFpbmluZ190YWdzX2NvdW50IC09IDE7Ci0JCWVtaXQgc2lnbmFsQnVz
eSggZmFsc2UgKTsKLSAgICAgICAgbV9idWZmZXIucmVzaXplKDApOwotICAgICAgICBpZiAocmVt
YWluaW5nX3RhZ3NfY291bnQgPT0gMCkKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9
PSAiaWQiKQorICAgICAgICAgICAgICAgIHBob3RvVVJJID0gbm9kZV92YWx1ZTsKKyAgICAgICAg
ICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmlkIikKKyAgICAgICAgICAgICAgICBw
aG90b19pZCA9IG5vZGVfdmFsdWU7CisgICAgICAgICAgICBlbHNlIGlmIChub2RlX25hbWUgPT0g
ImdwaG90bzphbGJ1bWlkIikKKyAgICAgICAgICAgICAgICBhbGJ1bV9pZCA9IG5vZGVfdmFsdWU7
CisgICAgICAgIH0KKworICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZygpOworICAgIH0K
KworICAgIGlmICghc3VjY2VzcykKKyAgICB7CisgICAgICAgIGVtaXQgc2lnbmFsQWRkUGhvdG9G
YWlsZWQoaTE4bigiRmFpbGVkIHRvIHVwbG9hZCBwaG90byIpKTsKKyAgICB9CisgICAgZWxzZQor
ICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSB0YWdzIGluZm9ybWF0aW9uIGZyb20gdGhlIHRh
Z3NfbWFwCisgICAgICAgIFFTdHJpbmdMaXN0IHRhZ3MgPSB0YWdzX21hcFt0aXRsZV07CisgICAg
ICAgIHJlbWFpbmluZ190YWdzX2NvdW50ID0gdGFncy5jb3VudCgpOworCisgICAgICAgIGlmICh0
YWdzLmNvdW50KCkgPT0gMCkKICAgICAgICAgICAgIGVtaXQgc2lnbmFsQWRkUGhvdG9TdWNjZWVk
ZWQoKTsKKworICAgICAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IHRhZ3MuYmVn
aW4oKTsgaXQgIT0gdGFncy5lbmQoKTsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgICAgUVN0
cmluZyBwaG90b1VSSSA9IFFTdHJpbmcoImh0dHA6Ly9waWNhc2F3ZWIuZ29vZ2xlLmNvbS9kYXRh
L2ZlZWQvYXBpL3VzZXIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IiUxL2FsYnVtaWQvJTIvcGhvdG9pZC8lMyIpLmFyZyhtX3VzZXJuYW1lKS5hcmcoYWxidW1faWQp
LmFyZyhwaG90b19pZCk7CisgICAgICAgICAgICBhZGRQaG90b1RhZyhwaG90b1VSSSwgKml0KTsK
KyAgICAgICAgfQogICAgIH0KLQl2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUFk
ZFBob3RvKGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEpCi0JewotCQlib29sIHN1Y2Nlc3MgPSBmYWxz
ZTsKLQkJUVN0cmluZyAgICAgbGluZTsKLQkJUVN0cmluZyBzdHIoZGF0YSk7Ci0gICAgICAgIHN1
Y2Nlc3MgPSAxOwotCQlRRG9tRG9jdW1lbnQgZG9jKCAiQWRkUGhvdG8gUmVzcG9uc2UiICk7Ci0J
CWlmICggIWRvYy5zZXRDb250ZW50KCBkYXRhICkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUURv
bUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgUVN0cmlu
ZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsgCi0JCVFEb21Ob2RlIG5vZGUg
PSBkb2NFbGVtLmZpcnN0Q2hpbGQoKTsgLy90aGlzIHNob3VsZCBtZWFuIDxlbnRyeT4KLQkJUURv
bUVsZW1lbnQgZTsKLQkJd2hpbGUoICFub2RlLmlzTnVsbCgpICkgewotCQkJaWYgKCBub2RlLmlz
RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgbm9kZV9uYW1lID0gbm9k
ZS5ub2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIG5vZGVfdmFsdWUgPSBu
b2RlLnRvRWxlbWVudCgpLnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobm9kZV9uYW1l
ID09ICJ0aXRsZSIpewotCQkJCSAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB0aXRsZSA9IG5vZGVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBwaG90b1VSSSA9IG5vZGVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAg
IGVsc2UgaWYobm9kZV9uYW1lID09ICJncGhvdG86aWQiKQotICAgICAgICAgICAgICAgICAgICAg
ICAgcGhvdG9faWQgPSBub2RlX3ZhbHVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKG5v
ZGVfbmFtZSA9PSAiZ3Bob3RvOmFsYnVtaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgYWxi
dW1faWQgPSBub2RlX3ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBu
b2RlID0gbm9kZS5uZXh0U2libGluZygpOwotCQl9Ci0JCWlmICghc3VjY2VzcykKLQkJewotCQkJ
ZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8gdXBsb2FkIHBob3RvIikp
OwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0YWdzIGluZm9y
bWF0aW9uIGZyb20gdGhlIHRhZ3NfbWFwCi0gICAgICAgICAgICBRU3RyaW5nTGlzdCB0YWdzID0g
dGFnc19tYXBbdGl0bGVdOwotICAgICAgICAgICAgcmVtYWluaW5nX3RhZ3NfY291bnQgPSB0YWdz
LmNvdW50KCk7Ci0gICAgICAgICAgICBpZiAodGFncy5jb3VudCgpID09IDApCi0gICAgICAgICAg
ICAgICAgZW1pdCBzaWduYWxBZGRQaG90b1N1Y2NlZWRlZCgpOwotICAgICAgICAgICAgZm9yICgg
UVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpOyBpdCAhPSB0YWdzLmVuZCgp
OyArK2l0ICkgewotICAgICAgICAgICAgICAgIFFTdHJpbmcgcGhvdG9VUkk9IFFTdHJpbmcoImh0
dHA6Ly9waWNhc2F3ZWIuZ29vZ2xlLmNvbS9kYXRhL2ZlZWQvYXBpL3VzZXIvIgotICAgICAgICAg
ICAgICAgICAgICAgICAgIiUxL2FsYnVtaWQvJTIvcGhvdG9pZC8lMyIpLmFyZyhtX3VzZXJuYW1l
KS5hcmcoYWxidW1faWQpLmFyZyhwaG90b19pZCk7Ci0gICAgICAgICAgICAgICAgYWRkUGhvdG9U
YWcoIHBob3RvVVJJLCAqaXQpOwotICAgICAgICAgICAgfQotCQl9CiAKLQl9Ci0Jdm9pZCBQaWNh
c2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KGNvbnN0IFFCeXRlQXJyYXkg
JmRhdGEpCi0JewotCQlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJUVN0cmluZyAgICAgbGluZTsK
LQkJUURvbURvY3VtZW50IGRvYyggIlBob3RvcyBQcm9wZXJ0aWVzIiApOwotCQlpZiAoICFkb2Mu
c2V0Q29udGVudCggZGF0YSApICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVFEb21FbGVtZW50IGRv
Y0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7Ci0JCVFEb21Ob2RlIG5vZGUgPSBkb2NFbGVt
LmZpcnN0Q2hpbGQoKTsKLQkJUURvbUVsZW1lbnQgZTsKLQkJd2hpbGUoICFub2RlLmlzTnVsbCgp
ICkgewotCQkJaWYgKCBub2RlLmlzRWxlbWVudCgpICYmIG5vZGUubm9kZU5hbWUoKSA9PSAicGhv
dG9pZCIgKSB7Ci0JCQkJZSA9IG5vZGUudG9FbGVtZW50KCk7IC8vIHRyeSB0byBjb252ZXJ0IHRo
ZSBub2RlIHRvIGFuIGVsZW1lbnQuCi0JCQkJUURvbU5vZGUgZGV0YWlscz1lLmZpcnN0Q2hpbGQo
KTsKLQkJCQlzdWNjZXNzPXRydWU7Ci0JCQl9Ci0JCQlpZiAoIG5vZGUuaXNFbGVtZW50KCkgJiYg
bm9kZS5ub2RlTmFtZSgpID09ICJlcnIiICkgewotCQkJCWtkRGVidWcoKTw8IkNoZWNraW5nIEVy
cm9yIGluIHJlc3BvbnNlIjw8ZW5kbDsKLQkJCQlRU3RyaW5nIGNvZGU9bm9kZS50b0VsZW1lbnQo
KS5hdHRyaWJ1dGUoImNvZGUiKTsKLQkJCQlrZERlYnVnKCk8PCJFcnJvciBjb2RlPSI8PGNvZGU8
PGVuZGw7Ci0JCQkJa2REZWJ1ZygpPDwiTXNnPSI8PG5vZGUudG9FbGVtZW50KCkuYXR0cmlidXRl
KCJtc2ciKTw8ZW5kbDsJCi0JCQkJZW1pdCBzaWduYWxFcnJvcihjb2RlKTsKLQkJCX0KLQkJCW5v
ZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJa2REZWJ1ZygpPDwiR2V0VG9rZW4gZmlu
aXNoZWQiPDxlbmRsOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCXsKLQkJCWVtaXQgc2lnbmFsQWRkUGhv
dG9GYWlsZWQoaTE4bigiRmFpbGVkIHRvIHF1ZXJ5IHBob3RvIGluZm9ybWF0aW9uIikpOwotCQl9
Ci0JCWVsc2UKLQkJewotCQkJLy9lbWl0IHNpZ25hbEFkZFBob3RvU3VjY2VlZGVkKCk7Ci0JCX0K
K30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KGNv
bnN0IFFCeXRlQXJyYXkgJmRhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAg
UVN0cmluZyAgICAgbGluZTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJQaG90b3MgUHJvcGVydGll
cyIpOworCisgICAgaWYgKCFkb2Muc2V0Q29udGVudChkYXRhKSkKKyAgICB7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxl
bWVudCgpOworCisgICAgUURvbU5vZGUgbm9kZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOworICAg
IFFEb21FbGVtZW50IGU7CisKKyAgICB3aGlsZSAoIW5vZGUuaXNOdWxsKCkpCisgICAgeworICAg
ICAgICBpZiAobm9kZS5pc0VsZW1lbnQoKSAmJiBub2RlLm5vZGVOYW1lKCkgPT0gInBob3RvaWQi
KQorICAgICAgICB7CisgICAgICAgICAgICBlID0gbm9kZS50b0VsZW1lbnQoKTsgLy8gdHJ5IHRv
IGNvbnZlcnQgdGhlIG5vZGUgdG8gYW4gZWxlbWVudC4KKyAgICAgICAgICAgIFFEb21Ob2RlIGRl
dGFpbHMgPSBlLmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKG5vZGUuaXNFbGVtZW50KCkgJiYgbm9kZS5ub2RlTmFtZSgp
ID09ICJlcnIiKQorICAgICAgICB7CisgICAgICAgICAgICBrZERlYnVnKCkgPDwgIkNoZWNraW5n
IEVycm9yIGluIHJlc3BvbnNlIiA8PCBlbmRsOworICAgICAgICAgICAgUVN0cmluZyBjb2RlID0g
bm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoImNvZGUiKTsKKyAgICAgICAgICAgIGtkRGVidWco
KSA8PCAiRXJyb3IgY29kZT0iIDw8IGNvZGUgPDwgZW5kbDsKKyAgICAgICAgICAgIGtkRGVidWco
KSA8PCAiTXNnPSIgPDwgbm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoIm1zZyIpIDw8IGVuZGw7
CisgICAgICAgICAgICBlbWl0IHNpZ25hbEVycm9yKGNvZGUpOworICAgICAgICB9CisKKyAgICAg
ICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcoKTsKKyAgICB9CisKKyAgICBrZERlYnVnKCkgPDwg
IkdldFRva2VuIGZpbmlzaGVkIiA8PCBlbmRsOworCisgICAgaWYgKCFzdWNjZXNzKQorICAgIHsK
KyAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8gcXVlcnkg
cGhvdG8gaW5mb3JtYXRpb24iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8v
ZW1pdCBzaWduYWxBZGRQaG90b1N1Y2NlZWRlZCgpOworICAgIH0KIAotCX0KIH0KK30KKwogI2lu
Y2x1ZGUgInBpY2FzYXdlYnRhbGtlci5tb2MiCiAKZGlmZiAtTnVyIHBpY2FzYXdlYmV4cG9ydC5v
cmlnL3BpY2FzYXdlYnRhbGtlci5jcHAubXkgcGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRhbGtl
ci5jcHAubXkKLS0tIHBpY2FzYXdlYmV4cG9ydC5vcmlnL3BpY2FzYXdlYnRhbGtlci5jcHAubXkJ
MTk3MC0wMS0wMSAxMDowMDowMC4wMDAwMDAwMDAgKzEwMDAKKysrIHBpY2FzYXdlYmV4cG9ydC9w
aWNhc2F3ZWJ0YWxrZXIuY3BwLm15CTIwMDgtMDItMTYgMTM6MzE6MDYuMDAwMDAwMDAwICsxMDAw
CkBAIC0wLDAgKzEsOTU2IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBjb25maWcud3JpdGVFbnRyeSgicGFzc3dv
cmQiLCBtX3Bhc3N3b3JkKTsKKyAqIEZpbGUgIDogcGljYXNhd2VidGFsa2VyLmNwcAorICogQXV0
aG9yOiBWYXJkaG1hbiBKYWluIDx2YXJkaG1hbiBAIGdtYWlsLmNvbT4KKyAqIERhdGUgIDogMjAw
Ny0xNi0wNworICogRGVzY3JpcHRpb24gOgorICoKKyAqIENvcHlyaWdodCAyMDA3IGJ5IFZhcmRo
bWFuIEphaW4gPHZhcmRobWFuIEAgZ21haWwuY29tPgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAqIGFuZC9vciBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVy
c2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8cWNzdHJpbmcu
aD4KKyNpbmNsdWRlIDxxdGV4dHN0cmVhbS5oPgorI2luY2x1ZGUgPHFmaWxlLmg+CisjaW5jbHVk
ZSA8cWltYWdlLmg+CisjaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KKyNpbmNsdWRlIDxrbG9jYWxl
Lmg+CisjaW5jbHVkZSA8a2lvL2pvYi5oPgorI2luY2x1ZGUgPGtkZWJ1Zy5oPgorI2luY2x1ZGUg
PGttaW1ldHlwZS5oPgorI2luY2x1ZGUgPGtzdGFuZGFyZGRpcnMuaD4KKyNpbmNsdWRlIDxrbWRj
b2RlYy5oPgorI2luY2x1ZGUgPGthcHAuaD4KKyNpbmNsdWRlIDxrbWVzc2FnZWJveC5oPgorI2lu
Y2x1ZGUgPHF1cmwuaD4KKyNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbWVzc2Fn
ZWJveC5oPgorI2luY2x1ZGUgPGtpby9qb2JjbGFzc2VzLmg+CisjaW5jbHVkZSA8cWRvbS5oPgor
I2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+
CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAicGlj
YXNhd2ViaXRlbS5oIgorI2luY2x1ZGUgImV4aWZyZXN0b3Jlci5oIgorI2luY2x1ZGUgIm1wZm9y
bS5oIgorCisjaW5jbHVkZSAicGljYXNhd2VidGFsa2VyLmgiCisjaW5jbHVkZSAicGljYXNhd2Vi
d2luZG93LmgiCisjaW5jbHVkZSAicGljYXNhd2VibG9naW4uaCIKKworY2xhc3MgUGljYXNhd2Vi
TG9naW47CisKK25hbWVzcGFjZSBLSVBJUGljYXNhd2ViRXhwb3J0UGx1Z2luCit7CisKKyAgICBQ
aWNhc2F3ZWJUYWxrZXI6OlBpY2FzYXdlYlRhbGtlcihRV2lkZ2V0ICogcGFyZW50KTptX3BhcmVu
dChwYXJlbnQpLCBtX2pvYigwKQorICAgIHsKKyAgICAgICAgbV9hcGlrZXkgPSAiNDlkNTg1YmFm
YTA3NThjYjVjNThhYjY3MTk4YmY2MzIiOworICAgICAgICBtX3NlY3JldCA9ICIzNGIzOTkyNWU2
MjczZmZkIjsKKyAgICAgICAgY29ubmVjdCh0aGlzLCBTSUdOQUwoc2lnbmFsRXJyb3IoY29uc3Qg
UVN0cmluZyAmIHN0cikpLAorICAgICAgICAgICAgICAgIFNMT1Qoc2xvdEVycm9yKGNvbnN0IFFT
dHJpbmcgJiBzdHIpKSk7CisgICAgICAgICAgYXV0aFByb2dyZXNzRGxnID0gbmV3IFFQcm9ncmVz
c0RpYWxvZygpOworICAgIH0KKworICAgIFBpY2FzYXdlYlRhbGtlcjo6flBpY2FzYXdlYlRhbGtl
cigpCisgICAgeworICAgICAgICBpZihtX2pvYikKKyAgICAgICAgICAgIG1fam9iLT5raWxsKCk7
CisgICAgfQorCisKKyAgICBRU3RyaW5nIFBpY2FzYXdlYlRhbGtlcjo6Z2V0QXBpU2lnKFFTdHJp
bmcgc2VjcmV0LCBRU3RyaW5nTGlzdCBoZWFkZXJzKQorICAgIHsKKyAgICAgICAgUVN0cmluZ0xp
c3QgY29tcHJlc3NlZDsgLy89IG5ldyBMaXN0PHN0cmluZz4oaGVhZGVycy5MZW5ndGgpOworCisg
ICAgICAgIGZvcihRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBoZWFkZXJzLmJlZ2luKCk7IGl0
ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFFTdHJpbmdM
aXN0IHN0ciA9IFFTdHJpbmdMaXN0OjpzcGxpdCgiPSIsICgqaXQpKTsKKworICAgICAgICAgICAg
Y29tcHJlc3NlZC5hcHBlbmQoc3RyWzBdLnN0cmlwV2hpdGVTcGFjZSgpICsgc3RyWzFdLnN0cmlw
V2hpdGVTcGFjZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXByZXNzZWQuc29ydCgpOwor
ICAgICAgICBRU3RyaW5nIG1lcmdlZCA9IGNvbXByZXNzZWQuam9pbigiIik7CisgICAgICAgIFFT
dHJpbmcgZmluYWwgPSBzZWNyZXQgKyBtZXJnZWQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnRlc3Qg
PSBmaW5hbC5hc2NpaSgpOworICAgICAgICBLTUQ1IGNvbnRleHQodGVzdCk7CisKKyAgICAgICAg
Ly9rZERlYnVnKCk8PCAiVGVzdCBIZXggRGlnZXN0IG91dHB1dDogIiA8PCBjb250ZXh0LmhleERp
Z2VzdCgpLmRhdGEoKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gY29udGV4dC5oZXhEaWdlc3Qo
KS5kYXRhKCk7CisgICAgfQorICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjpnZXRUb2tlbihjb25z
dCBRU3RyaW5nICYgdXNlcm5hbWUsIGNvbnN0IFFTdHJpbmcgJiBwYXNzd29yZCkKKyAgICB7Cisg
ICAgICAgIGlmKG1fam9iKQorICAgICAgICB7CisgICAgICAgICAgICBtX2pvYi0+a2lsbCgpOwor
ICAgICAgICAgICAgbV9qb2IgPSAwOworICAgICAgICB9CisgICAgICAgIFFTdHJpbmcgdXJsID0g
Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xpZW50TG9naW4iOworCisgICAgICAg
IFBpY2FzYXdlYkxvZ2luICpsb2dpbkRpYWxvZyA9CisgICAgICAgICAgICBuZXcgUGljYXNhd2Vi
TG9naW4oMCwgUVN0cmluZygiTG9naW5XaW5kb3ciKSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAg
ICAgICAgLyppZiAodXNlcm5hbWUhPU5VTEwgJiYgdXNlcm5hbWUubGVuZ3RoKCkgPiAwKXsKKyAg
ICAgICAgICAgLy8gIGtkRGVidWcoKTw8IlNob3dpbmcgc3RvcmVkIHVzZXJuYW1lIjw8IHVzZXJu
YW1lIDw8IGVuZGw7CisgICAgICAgICAgIGxvZ2luRGlhbG9nLT5zZXRVc2VybmFtZSh1c2VybmFt
ZSk7CisgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBOVUxMICYmIHBhc3N3b3JkLmxlbmd0aCgp
ID4gMCl7CisgICAgICAgICAgIC8vICAgIGtkRGVidWcoKTw8IlNob3dpbmcgc3RvcmVkIHBhc3N3
b3JkIjw8IHBhc3N3b3JkIDw8IGVuZGw7CisgICAgICAgICAgIGxvZ2luRGlhbG9nLT5zZXRQYXNz
d29yZChwYXNzd29yZCk7CisgICAgICAgICAgIC8vICBrZERlYnVnKCk8PCJTaG93aW5nIHN0b3Jl
ZCBwYXNzd29yZCI8PCBwYXNzd29yZCA8PCBlbmRsOworICAgICAgICAgICB9CisgICAgICAgICAg
IH0KKyAgICAgICAgICovCisgICAgICAgIFFTdHJpbmcgdXNlcm5hbWVfZWRpdCwKKyAgICAgICAg
ICBwYXNzd29yZF9lZGl0OworCisgICAgICAgIGlmKCFsb2dpbkRpYWxvZykKKyAgICAgICAgICAg
IGtkRGVidWcoKSA8PCAiIE91dCBvZiBtZW1vcnkgZXJyb3IgIiA8PCBlbmRsOworICAgICAgICBp
Zihsb2dpbkRpYWxvZy0+ZXhlYygpID09IFFEaWFsb2c6OkFjY2VwdGVkKQorICAgICAgICB7Cisg
ICAgICAgICAgICB1c2VybmFtZV9lZGl0ID0gbG9naW5EaWFsb2ctPnVzZXJuYW1lKCk7CisgICAg
ICAgICAgICBwYXNzd29yZF9lZGl0ID0gbG9naW5EaWFsb2ctPnBhc3N3b3JkKCk7CisgICAgICAg
IH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1JldHVybiBzb21ldGhp
bmcgd2hpY2ggc2F5IGF1dGhlbnRpY2F0aW9uIG5lZWRlZC4KKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgICAgICBtX3VzZXJuYW1lID0gdXNlcm5hbWVfZWRpdDsKKworICAgICAg
ICB1c2VybmFtZV9lZGl0ID0gdXNlcm5hbWU7CisgICAgICAgIFFTdHJpbmcgYWNjb3VudFR5cGUg
PSAiR09PR0xFIjsKKworICAgICAgICBpZighKHVzZXJuYW1lX2VkaXQuZW5kc1dpdGgoIkBnbWFp
bC5jb20iKSkpCisgICAgICAgICAgICB1c2VybmFtZV9lZGl0ICs9ICJAZ21haWwuY29tIjsKKyAg
ICAgICAgUUJ5dGVBcnJheSBidWZmZXI7CisgICAgICAgIFFTdHJpbmdMaXN0IHFzbDsKKworICAg
ICAgICBxc2wuYXBwZW5kKCJFbWFpbD0iICsgdXNlcm5hbWVfZWRpdCk7CisgICAgICAgIHFzbC5h
cHBlbmQoIlBhc3N3ZD0iICsgcGFzc3dvcmRfZWRpdCk7CisgICAgICAgIHFzbC5hcHBlbmQoImFj
Y291bnRUeXBlPSIgKyBhY2NvdW50VHlwZSk7CisgICAgICAgIHFzbC5hcHBlbmQoInNlcnZpY2U9
bGgyIik7CisgICAgICAgIHFzbC5hcHBlbmQoInNvdXJjZT1raXBpLXBpY2FzYXdlYi1jbGllbnQi
KTsKKyAgICAgICAgUVN0cmluZyBkYXRhUGFyYW1ldGVycyA9IHFzbC5qb2luKCImIik7CisKKyAg
ICAgICAgUVRleHRTdHJlYW0gdHMoYnVmZmVyLCBJT19BcHBlbmQgfCBJT19Xcml0ZU9ubHkpOwor
CisgICAgICAgIHRzLnNldEVuY29kaW5nKFFUZXh0U3RyZWFtOjpVbmljb2RlVVRGOCk7CisgICAg
ICAgIHRzIDw8IGRhdGFQYXJhbWV0ZXJzOworCisgICAgICAgIEtJTzo6VHJhbnNmZXJKb2IgKiBq
b2IgPSBLSU86Omh0dHBfcG9zdCh1cmwsIGJ1ZmZlciwgZmFsc2UpOworICAgICAgICBqb2ItPmFk
ZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3
dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICAgICAgbV9zdGF0ZSA9IEZFX0dFVFRPS0VOOworICAg
ICAgICBhdXRoUHJvZ3Jlc3NEbGctPnNldExhYmVsVGV4dChpMThuKCJHZXR0aW5nIHRoZSB0b2tl
biIpKTsKKyAgICAgICAgY29ubmVjdChqb2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iICosIGNvbnN0
IFFCeXRlQXJyYXkgJikpLAorICAgICAgICAgICAgICAgIFNMT1QoZGF0YShLSU86OkpvYiAqLCBj
b25zdCBRQnl0ZUFycmF5ICYpKSk7CisgICAgICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0
KEtJTzo6Sm9iICopKSwgU0xPVChzbG90UmVzdWx0KEtJTzo6Sm9iICopKSk7CisgICAgICAgIG1f
am9iID0gam9iOworICAgICAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgICAgIGVtaXQgc2ln
bmFsQnVzeSh0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6YXV0aGVu
dGljYXRlKGNvbnN0IFFTdHJpbmcgJiB0b2tlbiwgY29uc3QgUVN0cmluZyAmIHVzZXJuYW1lLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZyAmIHBh
c3N3b3JkKQorICAgIHsKKyAgICAgICAgaWYoIXRva2VuIHx8IHRva2VuLmxlbmd0aCgpIDwgMSkK
KyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tUb2tlbih0b2tlbik7CisgICAgICAgICAgICBt
X3VzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgICAgICAgICBtX3Bhc3N3b3JkID0gcGFzc3dvcmQ7
ICAgICAgLy90aGlzIHdvdWxkIGJlIG5lZWRlZCBpZiB0aGUgY2hlY2t0b2tlbiBmYWlsZWQKKyAg
ICAgICAgICAgIC8vd2Ugd291bGQgbmVlZCB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBhdXRoCisg
ICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2V0VG9rZW4odXNlcm5hbWUsIHBh
c3N3b3JkKTsKKworICAgIH0KKyAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Y2hlY2tUb2tlbihj
b25zdCBRU3RyaW5nICYgdG9rZW4pCisgICAgeworICAgICAgICBpZihtX2pvYikKKyAgICAgICAg
eworICAgICAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgICAgIG1fam9iID0gMDsKKyAg
ICAgICAgfQorICAgICAgICBRU3RyaW5nIHVybCA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL2Fj
Y291bnRzL0NsaWVudExvZ2luIjsKKyAgICAgICAgUVN0cmluZyBhdXRoX3N0cmluZyA9ICJHb29n
bGVMb2dpbiBhdXRoPSIgKyBtX3Rva2VuOworICAgICAgICBRQnl0ZUFycmF5IHRtcDsKKworICAg
ICAgICBLSU86OlRyYW5zZmVySm9iICogam9iID0gS0lPOjpodHRwX3Bvc3QodXJsLCB0bXAsIGZh
bHNlKTsKKyAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRo
b3JpemF0aW9uOiAiICsgYXV0aF9zdHJpbmcpOworCisgICAgICAgIGpvYi0+YWRkTWV0YURhdGEo
ImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJs
ZW5jb2RlZCIpOworICAgICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IgKiwg
Y29uc3QgUUJ5dGVBcnJheSAmKSksCisgICAgICAgICAgICAgICAgU0xPVChkYXRhKEtJTzo6Sm9i
ICosIGNvbnN0IFFCeXRlQXJyYXkgJikpKTsKKyAgICAgICAgY29ubmVjdChqb2IsIFNJR05BTChy
ZXN1bHQoS0lPOjpKb2IgKikpLCBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKKyAgICAg
ICAgbV9zdGF0ZSA9IEZFX0NIRUNLVE9LRU47CisgICAgICAgIGF1dGhQcm9ncmVzc0RsZy0+c2V0
TGFiZWxUZXh0KGkxOG4oIkNoZWNraW5nIGlmIHByZXZpb3VzIHRva2VuIGlzIHN0aWxsIHZhbGlk
IikpOworICAgICAgICBhdXRoUHJvZ3Jlc3NEbGctPnNldFByb2dyZXNzKDEsIDQpOworICAgICAg
ICBtX2pvYiA9IGpvYjsKKyAgICAgICAgbV9idWZmZXIucmVzaXplKDApOworICAgICAgICBlbWl0
IHNpZ25hbEJ1c3kodHJ1ZSk7CisgICAgfQorCisgICAgLyogUGljYXNhV2ViJ3MgQWxidW0gbGlz
dGluZyByZXF1ZXN0L3Jlc3BvbnNlCisgICAgICogRmlyc3QgYSByZXF1ZXN0IGlzIHNlbnQgdG8g
dGhlIHVybCBiZWxvdyBhbmQgdGhlbiB3ZSBtaWdodCg/KSBnZXQgYSByZWRpcmVjdCBVUkwKKyAg
ICAgKiBXRSB0aGVuIG5lZWQgdG8gc2VuZCB0aGUgR0VUIHJlcXVlc3QgdG8gdGhlIFJlZGlyZWN0
IHVybAorICAgICAqLworICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjpsaXN0QWxidW1zKCkKKyAg
ICB7CisgICAgICAgIGlmKG1fam9iKQorICAgICAgICB7CisgICAgICAgICAgICBtX2pvYi0+a2ls
bCgpOworICAgICAgICAgICAgbV9qb2IgPSAwOworICAgICAgICB9CisgICAgICAgIFFTdHJpbmcg
dXJsID0KKyAgICAgICAgICAgICJodHRwOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVk
L2FwaS91c2VyLyIgKyBtX3VzZXJuYW1lICsgIj9raW5kPWFsYnVtIjsKKyAgICAgICAgUUJ5dGVB
cnJheSB0bXA7CisKKyAgICAgICAgS0lPOjpUcmFuc2ZlckpvYiAqIGpvYiA9IEtJTzo6Z2V0KHVy
bCwgdG1wLCBmYWxzZSk7CisgICAgICAgIFFTdHJpbmcgYXV0aF9zdHJpbmcgPSAiR29vZ2xlTG9n
aW4gYXV0aD0iICsgbV90b2tlbjsKKworICAgICAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50
LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQi
KTsKKyAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3Jp
emF0aW9uOiAiICsgYXV0aF9zdHJpbmcpOworICAgICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRh
dGEoS0lPOjpKb2IgKiwgY29uc3QgUUJ5dGVBcnJheSAmKSksCisgICAgICAgICAgICAgICAgU0xP
VChkYXRhKEtJTzo6Sm9iICosIGNvbnN0IFFCeXRlQXJyYXkgJikpKTsKKyAgICAgICAgY29ubmVj
dChqb2IsIFNJR05BTChyZXN1bHQoS0lPOjpKb2IgKikpLCBTTE9UKHNsb3RSZXN1bHQoS0lPOjpK
b2IgKikpKTsKKyAgICAgICAgbV9zdGF0ZSA9IEZFX0xJU1RBTEJVTVM7CisgICAgICAgIG1fam9i
ID0gam9iOworICAgICAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgICAgIGVtaXQgc2lnbmFs
QnVzeSh0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Z2V0UGhvdG9Q
cm9wZXJ0eShjb25zdCBRU3RyaW5nICYgbWV0aG9kLCBjb25zdCBRU3RyaW5nICYgYXJnTGlzdCkK
KyAgICB7CisgICAgICAgIGlmKG1fam9iKQorICAgICAgICB7CisgICAgICAgICAgICBtX2pvYi0+
a2lsbCgpOworICAgICAgICAgICAgbV9qb2IgPSAwOworICAgICAgICB9CisgICAgICAgIFFTdHJp
bmcgdXJsID0gImh0dHA6Ly93d3cucGljYXNhd2ViLmNvbS9zZXJ2aWNlcy9yZXN0Lz8iOworICAg
ICAgICBRU3RyaW5nTGlzdCBoZWFkZXJzOyAgICAvLworCisgICAgICAgIGhlYWRlcnMuYXBwZW5k
KCJhcGlfa2V5PSIgKyBtX2FwaWtleSk7CisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJtZXRob2Q9
IiArIG1ldGhvZCk7CisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJmcm9iPSIgKyBtX2Zyb2IpOwor
ICAgICAgICBoZWFkZXJzLmFwcGVuZChhcmdMaXN0KTsKKyAgICAgICAgUVN0cmluZyBtZDUgPSBn
ZXRBcGlTaWcobV9zZWNyZXQsIGhlYWRlcnMpOworCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJh
cGlfc2lnPSIgKyBtZDUpOworICAgICAgICBRU3RyaW5nIHF1ZXJ5U3RyID0gaGVhZGVycy5qb2lu
KCImIik7CisgICAgICAgIFFTdHJpbmcgcG9zdFVybCA9IHVybCArIHF1ZXJ5U3RyOworICAgICAg
ICBRQnl0ZUFycmF5IHRtcDsKKworICAgICAgICBLSU86OlRyYW5zZmVySm9iICogam9iID0gS0lP
OjpodHRwX3Bvc3QocG9zdFVybCwgdG1wLCBmYWxzZSk7CisgICAgICAgIGpvYi0+YWRkTWV0YURh
dGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0t
dXJsZW5jb2RlZCIpOworICAgICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2Ig
KiwgY29uc3QgUUJ5dGVBcnJheSAmKSksCisgICAgICAgICAgICAgICAgU0xPVChkYXRhKEtJTzo6
Sm9iICosIGNvbnN0IFFCeXRlQXJyYXkgJikpKTsKKyAgICAgICAgY29ubmVjdChqb2IsIFNJR05B
TChyZXN1bHQoS0lPOjpKb2IgKikpLCBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKKyAg
ICAgICAgbV9zdGF0ZSA9IEZFX0dFVFBIT1RPUFJPUEVSVFk7CisgICAgICAgIG1fam9iID0gam9i
OworICAgICAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgICAgIGVtaXQgc2lnbmFsQnVzeSh0
cnVlKTsKKworICAgICAgICAvL2F1dGhQcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KCJHZXR0aW5n
IHRoZSBUb2tlbiBmcm9tIHRoZSBzZXJ2ZXIiKTsKKyAgICAgICAgLy9hdXRoUHJvZ3Jlc3NEbGct
PnNldFByb2dyZXNzKDMsNCk7CisgICAgfQorICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjphZGRQ
aG90b1RhZyhjb25zdCBRU3RyaW5nICYgcGhvdG9VUkksIGNvbnN0IFFTdHJpbmcgJiB0YWcpCisg
ICAgeworICAgICAgICAvL2lmIChtX2pvYiAmJiBtX3N0YXRlICE9IEZFX0FERFRBRyl7IC8vd2Ug
c2hvdWxkbid0IGtpbGwgdGhlIG9sZCB0YWcgcmVxdWVzdAorICAgICAgICAvLyAgICAgIG1fam9i
LT5raWxsKCk7CisgICAgICAgIC8vICAgICAgbV9qb2IgPSAwOworICAgICAgICAvL30KKyAgICAg
ICAgUVN0cmluZyBhZGRUYWdYTUwgPSBRU3RyaW5nKCI8ZW50cnkgeG1sbnM9J2h0dHA6Ly93d3cu
dzMub3JnLzIwMDUvQXRvbSc+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICI8dGl0bGU+JTE8L3RpdGxlPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiPGNhdGVnb3J5IHNjaGVtZT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIwMDUja2lu
ZCcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlcm09J2h0dHA6Ly9z
Y2hlbWFzLmdvb2dsZS5jb20vcGhvdG9zLzIwMDcjdGFnJy8+ICIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICI8L2VudHJ5PiIpLmFyZyh0YWcpOworICAgICAgICBRU3RyaW5n
IHBvc3RVcmwgPSBRU3RyaW5nKCIlMSIpLmFyZyhwaG90b1VSSSk7CisgICAgICAgIFFCeXRlQXJy
YXkgYnVmZmVyOworICAgICAgICBRVGV4dFN0cmVhbSB0cyhidWZmZXIsIElPX0FwcGVuZCB8IElP
X1dyaXRlT25seSk7CisKKyAgICAgICAgdHMuc2V0RW5jb2RpbmcoUVRleHRTdHJlYW06OlVuaWNv
ZGVVVEY4KTsKKyAgICAgICAgdHMgPDwgYWRkVGFnWE1MOworCisgICAgICAgIFFTdHJpbmcgYXV0
aF9zdHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsKKworICAgICAgICBLSU86
OlRyYW5zZmVySm9iICogam9iID0gS0lPOjpodHRwX3Bvc3QocG9zdFVybCwgYnVmZmVyLCBmYWxz
ZSk7CisgICAgICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5
cGU6IGFwcGxpY2F0aW9uL2F0b20reG1sIik7CisgICAgICAgIGpvYi0+YWRkTWV0YURhdGEoImNv
bnRlbnQtbGVuZ3RoIiwgUVN0cmluZygiQ29udGVudC1MZW5ndGg6ICUxIikuYXJnKGFkZFRhZ1hN
TC5sZW5ndGgoKSkpOworICAgICAgICBqb2ItPmFkZE1ldGFEYXRhKCJjdXN0b21IVFRQSGVhZGVy
IiwgIkF1dGhvcml6YXRpb246ICIgKyBhdXRoX3N0cmluZyk7CisgICAgICAgIC8vY29ubmVjdChq
b2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSwKKyAgICAgICAg
Ly8gICAgICAgICAgICAgIFNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkp
OworICAgICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksIFNMT1Qo
c2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworICAgICAgICBtX3N0YXRlID0gRkVfQUREVEFHOwor
ICAgICAgICBtX2pvYiA9IGpvYjsKKyAgICAgICAgbV9idWZmZXIucmVzaXplKDApOworICAgICAg
ICBlbWl0IHNpZ25hbEJ1c3kodHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBQaWNhc2F3ZWJUYWxr
ZXI6Omxpc3RQaG90b3MoY29uc3QgUVN0cmluZyAmIGFsYnVtTmFtZSkKKyAgICB7CisgICAgICAg
IFFTdHJpbmcgdGVtcCA9IGFsYnVtTmFtZTsgICAgICAgLy9qdXN0IGZvciBhdm9pZGluZyB3YXJu
aW5nLgorCisgICAgICAgIC8vVG8gYmUgaW1wbGVtZW50ZWQKKyAgICB9CisKKyAgICB2b2lkIFBp
Y2FzYXdlYlRhbGtlcjo6Y3JlYXRlQWxidW0oY29uc3QgUVN0cmluZyAmIGFsYnVtVGl0bGUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcgJiBhbGJ1
bURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJp
bmcgJiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUV9V
TExPTkcgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBRU3RyaW5nICYgYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBRU3RyaW5nICYgbWVkaWFfa2V5d29yZHMsIGJvb2wgaXNDb21tZW50c0VuYWJs
ZWQpCisgICAgeworICAgICAgICBpZihtX2pvYikKKyAgICAgICAgeworICAgICAgICAgICAgbV9q
b2ItPmtpbGwoKTsKKyAgICAgICAgICAgIG1fam9iID0gMDsKKyAgICAgICAgfQorCisgICAgICAg
IC8qIFRpbWUgWm9uZSBjb3JyZWN0aW9uLCBRVCB3b3JrIGFyb3VuZDogd2Ugc2hvdWxkIGRpc3Bs
YXkgY29ycmVjdCBjdXJyZW50IHRpbWUgKi8KKyAgICAgICAgUV9VTExPTkcgdGltZVpvbmUgPQor
ICAgICAgICAgICAgUURhdGVUaW1lOjpjdXJyZW50RGF0ZVRpbWUoUXQ6OkxvY2FsVGltZSkudG9U
aW1lX3QoKSAtCisgICAgICAgICAgICBRRGF0ZVRpbWU6OmN1cnJlbnREYXRlVGltZShRdDo6VVRD
KS50b1RpbWVfdCgpOworCisgICAgICAgIFFTdHJpbmcgbmV3QWxidW1YTUwgPQorICAgICAgICAg
ICAgUVN0cmluZygiPGVudHJ5IHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20nICIK
KyAgICAgICAgICAgICAgICAgICAgInhtbG5zOm1lZGlhPSdodHRwOi8vc2VhcmNoLnlhaG9vLmNv
bS9tcnNzLycgIgorICAgICAgICAgICAgICAgICAgICAieG1sbnM6Z3Bob3RvPSdodHRwOi8vc2No
ZW1hcy5nb29nbGUuY29tL3Bob3Rvcy8yMDA3Jz4gIgorICAgICAgICAgICAgICAgICAgICAiPHRp
dGxlIHR5cGU9J3RleHQnPiUxPC90aXRsZT4gIgorICAgICAgICAgICAgICAgICAgICAiPHN1bW1h
cnkgdHlwZT0ndGV4dCc+JTI8L3N1bW1hcnk+ICIKKyAgICAgICAgICAgICAgICAgICAgIjxncGhv
dG86bG9jYXRpb24+JTM8L2dwaG90bzpsb2NhdGlvbj4gIgorICAgICAgICAgICAgICAgICAgICAi
PGdwaG90bzphY2Nlc3M+JTQ8L2dwaG90bzphY2Nlc3M+ICIKKyAgICAgICAgICAgICAgICAgICAg
IjxncGhvdG86Y29tbWVudGluZ0VuYWJsZWQ+JTU8L2dwaG90bzpjb21tZW50aW5nRW5hYmxlZD4g
IgorICAgICAgICAgICAgICAgICAgICAiPGdwaG90bzp0aW1lc3RhbXA+JTY8L2dwaG90bzp0aW1l
c3RhbXA+ICIKKyAgICAgICAgICAgICAgICAgICAgIjxtZWRpYTpncm91cD4gIgorICAgICAgICAg
ICAgICAgICAgICAiPG1lZGlhOmtleXdvcmRzPiU3PC9tZWRpYTprZXl3b3Jkcz4gIgorICAgICAg
ICAgICAgICAgICAgICAiPC9tZWRpYTpncm91cD4gIgorICAgICAgICAgICAgICAgICAgICAiPGNh
dGVnb3J5IHNjaGVtZT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIwMDUja2luZCcgIgor
ICAgICAgICAgICAgICAgICAgICAidGVybT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90
b3MvMjAwNyNhbGJ1bSc+PC9jYXRlZ29yeT4gIgorICAgICAgICAgICAgICAgICAgICAiPC9lbnRy
eT4gIikuYXJnKGFsYnVtVGl0bGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJnKGFsYnVtRGVzYykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcobG9j
YXRpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKGFjY2VzcykuCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcoaXNDb21tZW50c0VuYWJsZWQgPT0g
dHJ1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXJnKCh0aW1lc3RhbXAgKyB0aW1lWm9uZSkgKiAxMDAwKS4vKiBUaGlzIHBhcmFtIGluIG1p
bGxpc2Vjb25kcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKG1lZGlh
X2tleXdvcmRzKTsKKworICAgICAgICBRQnl0ZUFycmF5IGJ1ZmZlcjsKKyAgICAgICAgUVRleHRT
dHJlYW0gdHMoYnVmZmVyLCBJT19BcHBlbmQgfCBJT19Xcml0ZU9ubHkpOworCisgICAgICAgIHRz
LnNldEVuY29kaW5nKFFUZXh0U3RyZWFtOjpVbmljb2RlVVRGOCk7CisgICAgICAgIHRzIDw8IG5l
d0FsYnVtWE1MOworCisgICAgICAgIE1QRm9ybSBmb3JtOworICAgICAgICBRU3RyaW5nIHBvc3RV
cmwgPSAiaHR0cDovL3d3dy5waWNhc2F3ZWIuZ29vZ2xlLmNvbS9kYXRhL2ZlZWQvYXBpL3VzZXIv
IiArIG1fdXNlcm5hbWU7CisgICAgICAgIFFTdHJpbmcgYXV0aF9zdHJpbmcgPSAiR29vZ2xlTG9n
aW4gYXV0aD0iICsgbV90b2tlbjsKKworICAgICAgICBLSU86OlRyYW5zZmVySm9iICogam9iID0g
S0lPOjpodHRwX3Bvc3QocG9zdFVybCwgYnVmZmVyLCBmYWxzZSk7CisgICAgICAgIGpvYi0+YWRk
TWV0YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2F0b20r
eG1sIik7CisgICAgICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtbGVuZ3RoIiwgUVN0cmlu
ZygiQ29udGVudC1MZW5ndGg6ICUxIikuYXJnKG5ld0FsYnVtWE1MLmxlbmd0aCgpKSk7CisgICAg
ICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjog
IiArIGF1dGhfc3RyaW5nKTsKKworICAgICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lP
OjpKb2IgKiwgY29uc3QgUUJ5dGVBcnJheSAmKSksCisgICAgICAgICAgICAgICAgU0xPVChkYXRh
KEtJTzo6Sm9iICosIGNvbnN0IFFCeXRlQXJyYXkgJikpKTsKKyAgICAgICAgY29ubmVjdChqb2Is
IFNJR05BTChyZXN1bHQoS0lPOjpKb2IgKikpLCBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikp
KTsKKworICAgICAgICBtX3N0YXRlID0gRkVfQ1JFQVRFQUxCVU07CisgICAgICAgIG1fam9iID0g
am9iOworICAgICAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgICAgIGVtaXQgc2lnbmFsQnVz
eSh0cnVlKTsKKyAgICB9CisKKyAgICBib29sIFBpY2FzYXdlYlRhbGtlcjo6YWRkUGhvdG8oY29u
c3QgUVN0cmluZyAmIHBob3RvUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRlBob3RvSW5mbyAmIGluZm8sIGNvbnN0IFFTdHJpbmcgJiBhbGJ1bU5hbWUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzY2FsZSwgaW50IG1heERpbSwgaW50
IGltYWdlUXVhbGl0eSkKKyAgICB7CisgICAgICAgIC8vIERpc2FibGluZyB0aGlzIHRvdGFsbHkg
bWF5IGJlIGNoZWNraW5nIHRoZSBtX3N0YXRlIGFuZCBkb2luZyBzZWxlY3RpbmcKKyAgICAgICAg
Ly8gZGlzYWJsaW5nIGlzIGEgYmV0dGVyIGlkZWEKKyAgICAgICAgLyppZiAobV9qb2IpCisgICAg
ICAgICAgIHsKKyAgICAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgICAgbV9qb2IgPSAw
OworICAgICAgICAgICB9ICovCisKKyAgICAgICAgUVN0cmluZyBhbGJ1bV9uYW1lID0gIiI7Cisg
ICAgICAgIFFWYWx1ZUxpc3QgPFBpY2FzYVdlYkFsYnVtPjo6aXRlcmF0b3IgaXQ7CisKKyAgICAg
ICAgZm9yKGl0ID0gbV9hbGJ1bXNMaXN0LT5iZWdpbigpOyBpdCAhPSBtX2FsYnVtc0xpc3QtPmVu
ZCgpOyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgICBpZigoKml0KS50aXRsZSA9PSBhbGJ1
bU5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWxidW1fbmFtZSA9ICgqaXQp
Lm5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICBpZihhbGJ1bV9uYW1lID09ICIiKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvL1FTdHJpbmcgYWxidW1fbmFtZSA9
IGFsYnVtTmFtZTsKKworICAgICAgICBpZihhbGJ1bV9uYW1lLmxlbmd0aCgpID09IDApCisgICAg
ICAgICAgICBhbGJ1bV9uYW1lID0gInRlc3QiOworICAgICAgICBRU3RyaW5nIHBvc3RVcmwgPQor
ICAgICAgICAgICAgImh0dHA6Ly93d3cucGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2Fw
aS91c2VyLyIgKyBtX3VzZXJuYW1lICsgIi9hbGJ1bS8iICsKKyAgICAgICAgICAgIGFsYnVtX25h
bWU7CisgICAgICAgIFFTdHJpbmcgcGF0aCA9IHBob3RvUGF0aDsKKyAgICAgICAgUVN0cmluZ0xp
c3QgaGVhZGVyczsKKyAgICAgICAgTVBGb3JtIGZvcm07CisgICAgICAgIFFTdHJpbmcgYXV0aF9z
dHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsKKworICAgICAgICAvL2Zvcm0u
YWRkUGFpcigiQXV0aG9yaXphdGlvbiIsIGF1dGhfc3RyaW5nKTsKKworICAgICAgICAvL0NyZWF0
ZSB0aGUgQm9keSBpbiBhdG9tLXhtbAorICAgICAgICBRU3RyaW5nTGlzdCBib2R5X3htbDsKKwor
ICAgICAgICBib2R5X3htbC5hcHBlbmQoIjxlbnRyeSB4bWxucz1cJ2h0dHA6Ly93d3cudzMub3Jn
LzIwMDUvQXRvbVwnPiIpOworICAgICAgICBib2R5X3htbC5hcHBlbmQoIjx0aXRsZT4iICsgaW5m
by50aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBib2R5X3htbC5hcHBlbmQoIjxzdW1tYXJ5
PiIgKyBpbmZvLmRlc2NyaXB0aW9uICsgIjwvc3VtbWFyeT4iKTsKKyAgICAgICAgYm9keV94bWwu
YXBwZW5kKCI8Y2F0ZWdvcnkgc2NoZW1lPVwiaHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9nLzIw
MDUja2luZFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXJtPVwiaHR0cDovL3NjaGVt
YXMuZ29vZ2xlLmNvbS9waG90b3MvMjAwNyNwaG90b1wiIC8+Iik7CisgICAgICAgIGJvZHlfeG1s
LmFwcGVuZCgiPC9lbnRyeT4iKTsKKworICAgICAgICBRU3RyaW5nIGJvZHkgPSBib2R5X3htbC5q
b2luKCIiKTsKKworICAgICAgICBmb3JtLmFkZFBhaXIoInRlc3QiLCBib2R5LCAiYXBwbGljYXRp
b24vYXRvbSt4bWwiKTsKKworICAgICAgICAvLyBzYXZlIHRoZSB0YWdzIGZvciB0aGlzIHBob3Rv
IGluIHRvIHRoZSB0YWdzIGhhc2htYXAKKyAgICAgICAgdGFnc19tYXAuaW5zZXJ0KGluZm8udGl0
bGUsIGluZm8udGFncyk7CisgICAgICAgIFFJbWFnZSBpbWFnZShwaG90b1BhdGgpOworCisgICAg
ICAgIGlmKCFpbWFnZS5pc051bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW1hZ2Ug
ZmlsZSAtIHNlZSBpZiB3ZSBuZWVkIHRvIHJlc2NhbGUgaXQKKyAgICAgICAgICAgIGlmKHJlc2Nh
bGUgJiYgKGltYWdlLndpZHRoKCkgPiBtYXhEaW0gfHwgaW1hZ2UuaGVpZ2h0KCkgPiBtYXhEaW0p
KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltYWdlID0gaW1hZ2Uuc21vb3RoU2Nh
bGUobWF4RGltLCBtYXhEaW0sIFFJbWFnZTo6U2NhbGVNaW4pOworICAgICAgICAgICAgICAgIHBh
dGggPSBsb2NhdGVMb2NhbCgidG1wIiwgS1VSTChwaG90b1BhdGgpLmZpbGVuYW1lKCkpOworICAg
ICAgICAgICAgICAgIGltYWdlLnNhdmUocGF0aCwgUUltYWdlSU86OmltYWdlRm9ybWF0KHBob3Rv
UGF0aCksIGltYWdlUXVhbGl0eSk7CisgICAgICAgICAgICAgICAgLy9pZiB0aGUgaW1hZ2UgaXMg
SlBFRzoKKyAgICAgICAgICAgICAgICAvL1RoaXMgcmVzaXppbmcgY29kZSBjb21lcyBtb3N0bHkg
YXMgaXQgaXMgZnJvbSBzZW5kaW1hZ2VwbHVnaW4KKyAgICAgICAgICAgICAgICBpZihRU3RyaW5n
KFFJbWFnZUlPOjppbWFnZUZvcm1hdChwaG90b1BhdGgpKS51cHBlcigpID09ICJKUEVHIikKKyAg
ICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4aWZSZXN0b3JlciBleGlmSG9s
ZGVyOworCisgICAgICAgICAgICAgICAgICAgIGV4aWZIb2xkZXIucmVhZEZpbGUocGhvdG9QYXRo
LCBFeGlmUmVzdG9yZXI6OkV4aWZPbmx5KTsKKworICAgICAgICAgICAgICAgICAgICBpZihleGlm
SG9sZGVyLmhhc0V4aWYoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
ICAgICAgICAgRXhpZlJlc3RvcmVyIHJlc3RvcmVyOworCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXN0b3Jlci5yZWFkRmlsZShwYXRoLCBFeGlmUmVzdG9yZXI6OkVudGlyZUltYWdlKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVyLmluc2VydEV4aWZEYXRhKGV4aWZIb2xkZXIu
ZXhpZkRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3Jlci53cml0ZUZpbGUo
cGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICAgICAga2RXYXJuaW5nKDUxMDAwKSA8PCAiKHBpY2FzYXdlYkV4
cG9ydDo6SW1hZ2UgZG9lc24ndCBoYXZlIGV4aWYgZGF0YSkiIDw8CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBr
ZERlYnVnKCkgPDwgIlJlc2l6aW5nIGFuZCBzYXZpbmcgdG8gdGVtcCBmaWxlOiAiIDw8IHBhdGgg
PDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCFmb3JtLmFk
ZEZpbGUoInBob3RvIiwgcGF0aCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgZm9ybS5maW5pc2goKTsKKworICAgICAgICBLSU86OlRyYW5zZmVySm9iICogam9iID0gS0lP
OjpodHRwX3Bvc3QocG9zdFVybCwgZm9ybS5mb3JtRGF0YSgpLCBmYWxzZSk7CisgICAgICAgIEtJ
Tzo6Sm9iICogam9iX29iaiA9IGpvYjsKKyAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVu
dC10eXBlIiwgZm9ybS5jb250ZW50VHlwZSgpKTsKKyAgICAgICAgam9iLT5hZGRNZXRhRGF0YSgi
Y3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsgYXV0aF9zdHJpbmcpOworICAg
ICAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IgKiwgY29uc3QgUUJ5dGVBcnJh
eSAmKSksCisgICAgICAgICAgICAgICAgU0xPVChkYXRhKEtJTzo6Sm9iICosIGNvbnN0IFFCeXRl
QXJyYXkgJikpKTsKKyAgICAgICAgY29ubmVjdChqb2IsIFNJR05BTChyZXN1bHQoS0lPOjpKb2Ig
KikpLCBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKKworICAgICAgICBtX3N0YXRlID0g
RkVfQUREUEhPVE87CisgICAgICAgIG1fam9iID0gam9iOworICAgICAgICBtX2J1ZmZlci5yZXNp
emUoMCk7CisgICAgICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVlKTsKKworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBRU3RyaW5nIFBpY2FzYXdlYlRhbGtlcjo6Z2V0VXNlck5hbWUo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdXNlcm5hbWU7CisgICAgfQorICAgIFFTdHJpbmcg
UGljYXNhd2ViVGFsa2VyOjpnZXRVc2VySWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdXNl
cklkOworICAgIH0KKyAgICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Y2FuY2VsKCkKKyAgICB7Cisg
ICAgICAgIGlmKG1fam9iKQorICAgICAgICB7CisgICAgICAgICAgICBtX2pvYi0+a2lsbCgpOwor
ICAgICAgICAgICAgbV9qb2IgPSAwOworICAgICAgICB9CisgICAgICAgIGlmKGF1dGhQcm9ncmVz
c0RsZyAmJiAhYXV0aFByb2dyZXNzRGxnLT5pc0hpZGRlbigpKQorICAgICAgICAgICAgYXV0aFBy
b2dyZXNzRGxnLT5oaWRlKCk7CisgICAgfQorCisgICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6Omlu
Zm8oS0lPOjpKb2IgKiBqb2IsIGNvbnN0IFFTdHJpbmcgJiBzdHIpCisgICAgeworICAgIH0KKyAg
ICB2b2lkIFBpY2FzYXdlYlRhbGtlcjo6ZGF0YShLSU86OkpvYiAqLCBjb25zdCBRQnl0ZUFycmF5
ICYgZGF0YSkKKyAgICB7CisgICAgICAgIGlmKGRhdGEuaXNFbXB0eSgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGludCBvbGRTaXplID0gbV9idWZmZXIuc2l6ZSgpOworCisgICAg
ICAgIG1fYnVmZmVyLnJlc2l6ZShtX2J1ZmZlci5zaXplKCkgKyBkYXRhLnNpemUoKSk7CisgICAg
ICAgIFFTdHJpbmcgb3V0cHV0X2RhdGEgPSBRU3RyaW5nKGRhdGEpOworCisgICAgICAgIG1lbWNw
eShtX2J1ZmZlci5kYXRhKCkgKyBvbGRTaXplLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwor
ICAgIH0KKworICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjpzbG90RXJyb3IoY29uc3QgUVN0cmlu
ZyAmIGVycm9yKQorICAgIHsKKyAgICAgICAgUVN0cmluZyB0cmFuc0Vycm9yOworICAgICAgICBp
bnQgZXJyb3JObyA9IDA7CisKKyAgICAgICAgaWYoIWVycm9yLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIGVycm9yTm8gPSBhdG9pKGVycm9yLmxhdGluMSgpKTsKKyAgICAgICAgc3dpdGNoIChlcnJv
ck5vKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdHJh
bnNFcnJvciA9IGkxOG4oIk5vIHBob3RvIHNwZWNpZmllZCIpOworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBp
MThuKCJHZW5lcmFsIHVwbG9hZCBmYWlsdXJlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZp
bGVzaXplIHdhcyB6ZXJvIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIDU6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZpbGV0eXBlIHdhcyBu
b3QgcmVjb2duaXNlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSA2OgorICAgICAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThuKCJVc2VyIGV4Y2VlZGVkIHVw
bG9hZCBsaW1pdCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5
NjoKKyAgICAgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiSW52YWxpZCBzaWduYXR1cmUi
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTc6CisgICAgICAg
ICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIk1pc3Npbmcgc2lnbmF0dXJlIik7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk4OgorICAgICAgICAgICAgICAgIHRy
YW5zRXJyb3IgPSBpMThuKCJMb2dpbiBGYWlsZWQgLyBJbnZhbGlkIGF1dGggdG9rZW4iKTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAwOgorICAgICAgICAgICAg
ICAgIHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIEFQSSBLZXkiKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA1OgorICAgICAgICAgICAgICAgIHRyYW5zRXJy
b3IgPSBpMThuKCJTZXJ2aWNlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSIpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICAgICAgdHJhbnNF
cnJvciA9IGkxOG4oIkludmFsaWQgRnJvYiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZv
cm1hdCBcInh4eFwiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSAxMTI6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIk1ldGhv
ZCBcInh4eFwiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSAxMTQ6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkludmFsaWQg
U09BUCBlbnZlbG9wZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSAxMTU6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkludmFsaWQgWE1MLVJQ
QyBNZXRob2QgQ2FsbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSAxMTY6CisgICAgICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIlRoZSBQT1NUIG1ldGhv
ZCBpcyBub3cgcmVxdWlyZWQgZm9yIGFsbCBzZXR0ZXJzIik7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBp
MThuKCJVbmtub3duIGVycm9yIik7CisgICAgICAgIH07CisKKyAgICAgICAgS01lc3NhZ2VCb3g6
OmVycm9yKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuKCJFcnJvciBPY2N1cmVk
OiAlMVxuIFdlIGNhbiBub3QgcHJvY2VlZCBmdXJ0aGVyIikuYXJnKHRyYW5zRXJyb3IpKTsKKyAg
ICAgICAgLy9rZERlYnVnKCk8PCJOb3QgaGFuZGxpbmcgdGhlIGVycm9yIG5vdyB3aWxsIHNlZSBp
dCBsYXRlciI8PGVuZGw7CisgICAgfQorCisgICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnNsb3RS
ZXN1bHQoS0lPOjpKb2IgKiBqb2IpCisgICAgeworCisgICAgICAgIG1fam9iID0gMDsKKyAgICAg
ICAgZW1pdCBzaWduYWxCdXN5KGZhbHNlKTsKKworICAgICAgICBpZihqb2ItPmVycm9yKCkpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fc3RhdGUgPT0gRkVfQUREUEhPVE8pCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChqb2ItPmVy
cm9yU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIGpvYi0+c2hvd0Vycm9yRGlhbG9nKG1fcGFyZW50KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3
aXRjaCAobV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAoRkVfTE9HSU4pOgor
ICAgICAgICAgICAgICAgIC8vcGFyc2VSZXNwb25zZUxvZ2luKG1fYnVmZmVyKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKEZFX0NSRUFURUFMQlVNKToKKyAgICAg
ICAgICAgICAgICBwYXJzZVJlc3BvbnNlQ3JlYXRlQWxidW0obV9idWZmZXIpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoRkVfTElTVEFMQlVNUyk6CisgICAgICAg
ICAgICAgICAgcGFyc2VSZXNwb25zZUxpc3RBbGJ1bXMobV9idWZmZXIpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoRkVfR0VURlJPQik6CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChGRV9HRVRUT0tFTik6CisgICAgICAgICAgICAg
ICAgcGFyc2VSZXNwb25zZUdldFRva2VuKG1fYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgKEZFX0NIRUNLVE9LRU4pOgorICAgICAgICAgICAgICAgIHBh
cnNlUmVzcG9uc2VDaGVja1Rva2VuKG1fYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgKEZFX0dFVEFVVEhPUklaRUQpOgorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgY2FzZSAoRkVfTElTVFBIT1RPUyk6CisgICAgICAgICAgICAgICAg
cGFyc2VSZXNwb25zZUxpc3RQaG90b3MobV9idWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSAoRkVfR0VUUEhPVE9QUk9QRVJUWSk6CisgICAgICAgICAgICAg
ICAgcGFyc2VSZXNwb25zZVBob3RvUHJvcGVydHkobV9idWZmZXIpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSAoRkVfQUREUEhPVE8pOgorICAgICAgICAgICAgICAg
IHBhcnNlUmVzcG9uc2VBZGRQaG90byhtX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIChGRV9BRERUQUcpOgorICAgICAgICAgICAgICAgIHBhcnNlUmVz
cG9uc2VBZGRUYWcobV9idWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgfQorCisgICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VDaGVja1Rv
a2VuKGNvbnN0IFFCeXRlQXJyYXkgJiBkYXRhKQorICAgIHsKKyAgICAgICAgYm9vbCBzdWNjZXNz
ID0gZmFsc2U7CisgICAgICAgIFFTdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgICAgIFFTdHJpbmcg
dXNlcm5hbWU7CisgICAgICAgIFFTdHJpbmcgdHJhbnNSZXR1cm4oZGF0YSk7CisKKyAgICAgICAg
Ly8gSWYgY2hlY2t0b2tlbiBmYWlsZWQuCisgICAgICAgIC8vIGdldFRva2VuIC4uLgorICAgICAg
ICBpZih0cmFuc1JldHVybi5zdGFydHNXaXRoKCJFcnJvcj0iKSkKKyAgICAgICAgICAgIHN1Y2Nl
c3MgPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Cisg
ICAgICAgIGlmKCFzdWNjZXNzKQorICAgICAgICAgICAgZ2V0VG9rZW4obV91c2VybmFtZSwgbV9w
YXNzd29yZCk7CisgICAgICAgIC8vZW1pdCBzaWduYWxFcnJvcihlcnJvclN0cmluZyk7CisgICAg
fQorCisgICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VHZXRUb2tlbihjb25z
dCBRQnl0ZUFycmF5ICYgZGF0YSkKKyAgICB7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNl
OworICAgICAgICBRU3RyaW5nIGVycm9yU3RyaW5nOworICAgICAgICBRU3RyaW5nIHN0cihkYXRh
KTsKKworICAgICAgICAvL0NoZWNrIHRoZSByZXNwb25zZSBjb2RlIHNob3VsZCBpdCBiZSAyMDAs
IHByb2NlZWQKKyAgICAgICAgLy9pZiBpdCBpcyA0MDMgaGFuZGxlIHRoZSBlcnJvciBtZXNnCisg
ICAgICAgIC8vZmlndXJlIG91dCB0aGUgYXV0aCBzdHJpbmcgZnJvbSB0aGlzIHJlc3BvbnNlCisg
ICAgICAgIGlmKHN0ci5maW5kKCJBdXRoPSIpKQorICAgICAgICB7CisgICAgICAgICAgICBRU3Ry
aW5nTGlzdCBzdHJMaXN0ID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCJBdXRoPSIsIHN0cik7CisKKyAg
ICAgICAgICAgIG1fdG9rZW4gPSBzdHJMaXN0WzFdOworICAgICAgICAgICAgc3VjY2VzcyA9IDE7
CisgICAgICAgIH0KKyAgICAgICAgLy9saXN0QWxidW1zKCk7CisgICAgICAgIGlmKHN1Y2Nlc3Mp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dGhQcm9ncmVzc0RsZy0+aGlkZSgpOworICAgICAg
ICAgICAgZW1pdCBzaWduYWxUb2tlbk9idGFpbmVkKG1fdG9rZW4pOworICAgICAgICB9CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXQgc2lnbmFsRXJyb3IoZXJyb3JTdHJpbmcpOworICAg
ICAgICBlbWl0IHNpZ25hbEJ1c3koZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgUGljYXNhd2Vi
VGFsa2VyOjpnZXRIVE1MUmVzcG9uc2VDb2RlKGNvbnN0IFFTdHJpbmcgJiBzdHIpCisgICAgewor
ICAgIH0KKworICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlTGlzdEFsYnVt
cyhjb25zdCBRQnl0ZUFycmF5ICYgZGF0YSkKKyAgICB7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9
IGZhbHNlOworICAgICAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICAgICAgUURvbURvY3VtZW50
IGRvYygiZmVlZCIpOworCisgICAgICAgIGlmKCFkb2Muc2V0Q29udGVudChkYXRhKSkKKyAgICAg
ICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUURvbUVsZW1l
bnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgUURvbU5vZGUgbm9k
ZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOworICAgICAgICBRRG9tRWxlbWVudCBlOworICAgICAg
ICBRU3RyaW5nIGZlZWRfaWQsCisgICAgICAgICAgZmVlZF91cGRhdGVkLAorICAgICAgICAgIGZl
ZWRfdGl0bGUsCisgICAgICAgICAgZmVlZF9zdWJ0aXRsZTsKKyAgICAgICAgUVN0cmluZyBmZWVk
X2ljb25fdXJsLAorICAgICAgICAgIGZlZWRfbGlua191cmw7CisgICAgICAgIFFTdHJpbmcgZmVl
ZF91c2VybmFtZSwKKyAgICAgICAgICBmZWVkX3VzZXJfdXJpOworCisgICAgICAgIFFTdHJpbmcg
YWxidW1faWQsCisgICAgICAgICAgYWxidW1fdGl0bGUsCisgICAgICAgICAgYWxidW1fZGVzY3Jp
cHRpb247CisKKyAgICAgICAgbV9hbGJ1bXNMaXN0ID0gbmV3IFFWYWx1ZUxpc3QgPCBQaWNhc2FX
ZWJBbGJ1bSA+ICgpOworCisgICAgICAgIHdoaWxlKCFub2RlLmlzTnVsbCgpKQorICAgICAgICB7
CisgICAgICAgICAgICBpZihub2RlLmlzRWxlbWVudCgpICYmIG5vZGUubm9kZU5hbWUoKSA9PSAi
ZW50cnkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGUgPSBub2RlLnRvRWxlbWVudCgpOworICAgICAgICAgICAgICAgIFFE
b21Ob2RlIGRldGFpbHMgPSBlLmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBQaWNhc2FX
ZWJBbGJ1bSBmcHM7CisgICAgICAgICAgICAgICAgUURvbU5vZGUgZGV0YWlsc05vZGUgPSBkZXRh
aWxzOworCisgICAgICAgICAgICAgICAgd2hpbGUoIWRldGFpbHNOb2RlLmlzTnVsbCgpKQorICAg
ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoZGV0YWlsc05vZGUuaXNFbGVt
ZW50KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
KGRldGFpbHNOb2RlLm5vZGVOYW1lKCkgPT0gImlkIikKKyAgICAgICAgICAgICAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9pZCA9IGRldGFpbHNOb2RlLnRv
RWxlbWVudCgpLnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMg
d2hhdCBpcyBvYnRhaW5lZCBmcm9tIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZnBzLmlkID0gYWxidW1faWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmKGRldGFpbHNOb2RlLm5vZGVOYW1lKCkgPT0gInRpdGxlIikKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1
bV90aXRsZSA9ICJOb3QgZmV0Y2hlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYo
ZGV0YWlsc05vZGUudG9FbGVtZW50KCkuYXR0cmlidXRlKCJ0eXBlIikgPT0gInRleHQiKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV90aXRsZSA9IGRldGFpbHNOb2RlLnRv
RWxlbWVudCgpLnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMg
d2hhdCBpcyBvYnRhaW5lZCBmcm9tIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZnBzLnRpdGxlID0gYWxidW1fdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmKGRldGFpbHNOb2RlLm5vZGVOYW1lKCkgPT0gImdwaG90
bzpuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBRU3RyaW5nIG5hbWUgPSBkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS50ZXh0KCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
IGRldGFpbHNOb2RlID0gZGV0YWlsc05vZGUubmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgbV9hbGJ1bXNMaXN0LT5hcHBlbmQoZnBzKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0K
KyAgICAgICAgaWYoIXN1Y2Nlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgc2lnbmFs
R2V0QWxidW1zTGlzdEZhaWxlZChpMThuKCJGYWlsZWQgdG8gZmV0Y2ggcGhvdG9TZXRzIExpc3Qi
KSk7CisKKyAgICAgICAgICAgIG1fYWxidW1zTGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAg
ICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0IHNpZ25hbEdldEFsYnVtc0xpc3RT
dWNjZWVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgUGljYXNhd2ViVGFsa2Vy
OjpwYXJzZVJlc3BvbnNlTGlzdFBob3Rvcyhjb25zdCBRQnl0ZUFycmF5ICYgZGF0YSkKKyAgICB7
CisgICAgICAgIFFEb21Eb2N1bWVudCBkb2MoImdldFBob3Rvc0xpc3QiKTsKKworICAgICAgICBp
ZighZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgICAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxl
bWVudCgpOworICAgICAgICBRRG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7CisK
KyAgICAgICAgLy9RRG9tRWxlbWVudCBlOworICAgICAgICAvL1RvIGJlIGltcGxlbWVudGVkLgor
ICAgIH0KKworICAgIHZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlQ3JlYXRlQWxi
dW0oY29uc3QgUUJ5dGVBcnJheSAmIGRhdGEpCisgICAgeworICAgICAgICBib29sIHN1Y2Nlc3Mg
PSBmYWxzZTsKKyAgICAgICAgUVN0cmluZyBlcnJvclN0cmluZzsKKyAgICAgICAgUVN0cmluZyBy
ZXNwb25zZShkYXRhKTsKKyAgICAgICAgUURvbURvY3VtZW50IGRvYygiQWRkUGhvdG8gUmVzcG9u
c2UiKTsKKworICAgICAgICAvLyBwYXJzZSB0aGUgbmV3IGFsYnVtIG5hbWUKKyAgICAgICAgUURv
bUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgUVN0cmlu
ZyB0aXRsZSwKKyAgICAgICAgICBwaG90b19pZCwKKyAgICAgICAgICBhbGJ1bV9pZCwKKyAgICAg
ICAgICBwaG90b1VSSTsKKyAgICAgICAgUURvbU5vZGUgbm9kZSA9IGRvY0VsZW0uZmlyc3RDaGls
ZCgpOyAgIC8vdGhpcyBzaG91bGQgbWVhbiA8ZW50cnk+CisgICAgICAgIFFEb21FbGVtZW50IGU7
CisKKyAgICAgICAgd2hpbGUoIW5vZGUuaXNOdWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAg
IGlmKG5vZGUuaXNFbGVtZW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUVN0
cmluZyBub2RlX25hbWUgPSBub2RlLm5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgUVN0cmlu
ZyBub2RlX3ZhbHVlID0gbm9kZS50b0VsZW1lbnQoKS50ZXh0KCk7CisKKyAgICAgICAgICAgICAg
ICBpZihub2RlX25hbWUgPT0gInRpdGxlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IG5v
ZGVfdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYobm9k
ZV9uYW1lID09ICJpZCIpCisgICAgICAgICAgICAgICAgICAgIHBob3RvVVJJID0gbm9kZV92YWx1
ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmlkIikKKyAg
ICAgICAgICAgICAgICAgICAgcGhvdG9faWQgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgICAg
IGVsc2UgaWYobm9kZV9uYW1lID09ICJncGhvdG86YWxidW1pZCIpCisgICAgICAgICAgICAgICAg
ICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5v
ZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmFpc2UgYSBw
b3B1cCBpbmZvcm1pbmcgc3VjY2VzcworICAgIH0KKworICAgIHZvaWQgUGljYXNhd2ViVGFsa2Vy
OjpwYXJzZVJlc3BvbnNlQWRkVGFnKGNvbnN0IFFCeXRlQXJyYXkgJiBkYXRhKQorICAgIHsKKyAg
ICAgICAgUVN0cmluZyBzdHIoZGF0YSk7CisKKyAgICAgICAgcmVtYWluaW5nX3RhZ3NfY291bnQg
LT0gMTsKKyAgICAgICAgZW1pdCBzaWduYWxCdXN5KGZhbHNlKTsKKworICAgICAgICBtX2J1ZmZl
ci5yZXNpemUoMCk7CisgICAgICAgIGlmKHJlbWFpbmluZ190YWdzX2NvdW50ID09IDApCisgICAg
ICAgICAgICBlbWl0IHNpZ25hbEFkZFBob3RvU3VjY2VlZGVkKCk7CisgICAgfQorICAgIHZvaWQg
UGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlQWRkUGhvdG8oY29uc3QgUUJ5dGVBcnJheSAm
IGRhdGEpCisgICAgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgUVN0
cmluZyBsaW5lOworICAgICAgICBRU3RyaW5nIHN0cihkYXRhKTsKKworICAgICAgICBzdWNjZXNz
ID0gMTsKKyAgICAgICAgUURvbURvY3VtZW50IGRvYygiQWRkUGhvdG8gUmVzcG9uc2UiKTsKKwor
ICAgICAgICBpZighZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRv
Y3VtZW50RWxlbWVudCgpOworICAgICAgICBRU3RyaW5nIHRpdGxlLAorICAgICAgICAgIHBob3Rv
X2lkLAorICAgICAgICAgIGFsYnVtX2lkLAorICAgICAgICAgIHBob3RvVVJJOworICAgICAgICBR
RG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7ICAgLy90aGlzIHNob3VsZCBtZWFu
IDxlbnRyeT4KKyAgICAgICAgUURvbUVsZW1lbnQgZTsKKworICAgICAgICB3aGlsZSghbm9kZS5p
c051bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYobm9kZS5pc0VsZW1lbnQoKSkKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRU3RyaW5nIG5vZGVfbmFtZSA9IG5vZGUubm9k
ZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBRU3RyaW5nIG5vZGVfdmFsdWUgPSBub2RlLnRvRWxl
bWVudCgpLnRleHQoKTsKKworICAgICAgICAgICAgICAgIGlmKG5vZGVfbmFtZSA9PSAidGl0bGUi
KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbm9kZV92YWx1ZTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihub2RlX25hbWUgPT0gImlkIikKKyAgICAgICAg
ICAgICAgICAgICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgICAgIGVsc2Ug
aWYobm9kZV9uYW1lID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgICAgICBwaG90b19p
ZCA9IG5vZGVfdmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZihub2RlX25hbWUgPT0gImdw
aG90bzphbGJ1bWlkIikKKyAgICAgICAgICAgICAgICAgICAgYWxidW1faWQgPSBub2RlX3ZhbHVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcoKTsK
KyAgICAgICAgfQorICAgICAgICBpZighc3VjY2VzcykKKyAgICAgICAgeworICAgICAgICAgICAg
ZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8gdXBsb2FkIHBob3RvIikp
OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBk
YXRlIHRoZSB0YWdzIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhZ3NfbWFwCisgICAgICAgICAgICBR
U3RyaW5nTGlzdCB0YWdzID0gdGFnc19tYXBbdGl0bGVdOworCisgICAgICAgICAgICByZW1haW5p
bmdfdGFnc19jb3VudCA9IHRhZ3MuY291bnQoKTsKKyAgICAgICAgICAgIGlmKHRhZ3MuY291bnQo
KSA9PSAwKQorICAgICAgICAgICAgICAgIGVtaXQgc2lnbmFsQWRkUGhvdG9TdWNjZWVkZWQoKTsK
KworICAgICAgICAgICAgZm9yKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IHRhZ3MuYmVnaW4o
KTsgaXQgIT0gdGFncy5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBRU3RyaW5nIHBob3RvVVJJID0gUVN0cmluZygiaHR0cDovL3BpY2FzYXdlYi5nb29nbGUuY29t
L2RhdGEvZmVlZC9hcGkvdXNlci8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIiUxL2FsYnVtaWQvJTIvcGhvdG9pZC8lMyIpLmFyZyhtX3VzZXJuYW1lKS4KKyAg
ICAgICAgICAgICAgICAgICAgYXJnKGFsYnVtX2lkKS5hcmcocGhvdG9faWQpOworICAgICAgICAg
ICAgICAgIGFkZFBob3RvVGFnKHBob3RvVVJJLCAqaXQpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICB9CisgICAgdm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VQaG90
b1Byb3BlcnR5KGNvbnN0IFFCeXRlQXJyYXkgJiBkYXRhKQorICAgIHsKKyAgICAgICAgYm9vbCBz
dWNjZXNzID0gZmFsc2U7CisgICAgICAgIFFTdHJpbmcgbGluZTsKKyAgICAgICAgUURvbURvY3Vt
ZW50IGRvYygiUGhvdG9zIFByb3BlcnRpZXMiKTsKKworICAgICAgICBpZighZG9jLnNldENvbnRl
bnQoZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
ICAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOworICAgICAg
ICBRRG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7CisgICAgICAgIFFEb21FbGVt
ZW50IGU7CisKKyAgICAgICAgd2hpbGUoIW5vZGUuaXNOdWxsKCkpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIGlmKG5vZGUuaXNFbGVtZW50KCkgJiYgbm9kZS5ub2RlTmFtZSgpID09ICJwaG90b2lk
IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlID0gbm9kZS50b0VsZW1lbnQoKTsg
ICAvLyB0cnkgdG8gY29udmVydCB0aGUgbm9kZSB0byBhbiBlbGVtZW50LgorICAgICAgICAgICAg
ICAgIFFEb21Ob2RlIGRldGFpbHMgPSBlLmZpcnN0Q2hpbGQoKTsKKworICAgICAgICAgICAgICAg
IHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobm9kZS5pc0Vs
ZW1lbnQoKSAmJiBub2RlLm5vZGVOYW1lKCkgPT0gImVyciIpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAga2REZWJ1ZygpIDw8ICJDaGVja2luZyBFcnJvciBpbiByZXNwb25zZSIgPDwg
ZW5kbDsKKyAgICAgICAgICAgICAgICBRU3RyaW5nIGNvZGUgPSBub2RlLnRvRWxlbWVudCgpLmF0
dHJpYnV0ZSgiY29kZSIpOworCisgICAgICAgICAgICAgICAga2REZWJ1ZygpIDw8ICJFcnJvciBj
b2RlPSIgPDwgY29kZSA8PCBlbmRsOworICAgICAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiTXNn
PSIgPDwgbm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoIm1zZyIpIDw8IGVuZGw7CisgICAgICAg
ICAgICAgICAgZW1pdCBzaWduYWxFcnJvcihjb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAga2REZWJ1
ZygpIDw8ICJHZXRUb2tlbiBmaW5pc2hlZCIgPDwgZW5kbDsKKyAgICAgICAgaWYoIXN1Y2Nlc3Mp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgc2lnbmFsQWRkUGhvdG9GYWlsZWQoaTE4bigi
RmFpbGVkIHRvIHF1ZXJ5IHBob3RvIGluZm9ybWF0aW9uIikpOworICAgICAgICB9CisgICAgICAg
IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9lbWl0IHNpZ25hbEFkZFBob3RvU3VjY2Vl
ZGVkKCk7CisgICAgICAgIH0KKworICAgIH0KK30KKworI2luY2x1ZGUgInBpY2FzYXdlYnRhbGtl
ci5tb2MiCmRpZmYgLU51ciBwaWNhc2F3ZWJleHBvcnQub3JpZy9waWNhc2F3ZWJ0YWxrZXIuY3Bw
Lm9yaWcgcGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRhbGtlci5jcHAub3JpZwotLS0gcGljYXNh
d2ViZXhwb3J0Lm9yaWcvcGljYXNhd2VidGFsa2VyLmNwcC5vcmlnCTE5NzAtMDEtMDEgMTA6MDA6
MDAuMDAwMDAwMDAwICsxMDAwCisrKyBwaWNhc2F3ZWJleHBvcnQvcGljYXNhd2VidGFsa2VyLmNw
cC5vcmlnCTIwMDgtMDItMTYgMTM6NTY6MTIuMDAwMDAwMDAwICsxMDAwCkBAIC0wLDAgKzEsMTAw
MyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CisgICAgY29uZmlnLndyaXRlRW50cnkoInBhc3N3b3JkIiwgbV9wYXNzd29y
ZCk7CisgKiBGaWxlICA6IHBpY2FzYXdlYnRhbGtlci5jcHAKKyAqIEF1dGhvcjogVmFyZGhtYW4g
SmFpbiA8dmFyZGhtYW4gQCBnbWFpbC5jb20+CisgKiBEYXRlICA6IDIwMDctMTYtMDcKKyAqIERl
c2NyaXB0aW9uIDoKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBieSBWYXJkaG1hbiBKYWluIDx2YXJk
aG1hbiBAIGdtYWlsLmNvbT4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0
IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFt
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgPHFjc3RyaW5nLmg+CisjaW5jbHVkZSA8
cXRleHRzdHJlYW0uaD4KKyNpbmNsdWRlIDxxZmlsZS5oPgorI2luY2x1ZGUgPHFpbWFnZS5oPgor
I2luY2x1ZGUgPHFzdHJpbmdsaXN0Lmg+CisjaW5jbHVkZSA8a2xvY2FsZS5oPgorI2luY2x1ZGUg
PGtpby9qb2IuaD4KKyNpbmNsdWRlIDxrZGVidWcuaD4KKyNpbmNsdWRlIDxrbWltZXR5cGUuaD4K
KyNpbmNsdWRlIDxrc3RhbmRhcmRkaXJzLmg+CisjaW5jbHVkZSA8a21kY29kZWMuaD4KKyNpbmNs
dWRlIDxrYXBwLmg+CisjaW5jbHVkZSA8a21lc3NhZ2Vib3guaD4KKyNpbmNsdWRlIDxxdXJsLmg+
CisjaW5jbHVkZSA8cWxpbmVlZGl0Lmg+CisjaW5jbHVkZSA8cW1lc3NhZ2Vib3guaD4KKyNpbmNs
dWRlIDxraW8vam9iY2xhc3Nlcy5oPgorI2luY2x1ZGUgPHFkb20uaD4KKyNpbmNsdWRlIDxjc3Ry
aW5nPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0
cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgInBpY2FzYXdlYml0ZW0uaCIK
KyNpbmNsdWRlICJleGlmcmVzdG9yZXIuaCIKKyNpbmNsdWRlICJtcGZvcm0uaCIKKworI2luY2x1
ZGUgInBpY2FzYXdlYnRhbGtlci5oIgorI2luY2x1ZGUgInBpY2FzYXdlYndpbmRvdy5oIgorI2lu
Y2x1ZGUgInBpY2FzYXdlYmxvZ2luLmgiCisKK2NsYXNzIFBpY2FzYXdlYkxvZ2luOworCituYW1l
c3BhY2UgS0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdpbgoreworCitQaWNhc2F3ZWJUYWxrZXI6OlBp
Y2FzYXdlYlRhbGtlcihRV2lkZ2V0KiBwYXJlbnQpCisgICAgICAgIDogbV9wYXJlbnQocGFyZW50
KSwgIG1fam9iKDApCit7CisgICAgbV9hcGlrZXkgPSAiNDlkNTg1YmFmYTA3NThjYjVjNThhYjY3
MTk4YmY2MzIiOworICAgIG1fc2VjcmV0ID0gIjM0YjM5OTI1ZTYyNzNmZmQiOworICAgIGNvbm5l
Y3QodGhpcywgU0lHTkFMKHNpZ25hbEVycm9yKGNvbnN0IFFTdHJpbmcmIHN0cikpLCBTTE9UKHNs
b3RFcnJvcihjb25zdCBRU3RyaW5nJiBzdHIpKSk7CisgICAgYXV0aFByb2dyZXNzRGxnID0gbmV3
IFFQcm9ncmVzc0RpYWxvZygpOworfQorCitQaWNhc2F3ZWJUYWxrZXI6On5QaWNhc2F3ZWJUYWxr
ZXIoKQoreworICAgIGlmIChtX2pvYikKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKK30KKworCitR
U3RyaW5nIFBpY2FzYXdlYlRhbGtlcjo6Z2V0QXBpU2lnKFFTdHJpbmcgc2VjcmV0LCBRU3RyaW5n
TGlzdCBoZWFkZXJzKQoreworICAgIFFTdHJpbmdMaXN0IGNvbXByZXNzZWQgOy8vPSBuZXcgTGlz
dDxzdHJpbmc+KGhlYWRlcnMuTGVuZ3RoKTsKKworICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJh
dG9yIGl0ID0gaGVhZGVycy5iZWdpbigpOyBpdCAhPSBoZWFkZXJzLmVuZCgpOyArK2l0KQorICAg
IHsKKyAgICAgICAgUVN0cmluZ0xpc3Qgc3RyID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCI9IiwgKCpp
dCkpOworICAgICAgICBjb21wcmVzc2VkLmFwcGVuZChzdHJbMF0uc3RyaXBXaGl0ZVNwYWNlKCkg
KyBzdHJbMV0uc3RyaXBXaGl0ZVNwYWNlKCkpOworICAgIH0KKworICAgIGNvbXByZXNzZWQuc29y
dCgpOworCisgICAgUVN0cmluZyBtZXJnZWQgPSBjb21wcmVzc2VkLmpvaW4oIiIpOworICAgIFFT
dHJpbmcgZmluYWwgPSBzZWNyZXQgKyBtZXJnZWQ7CisgICAgY29uc3QgY2hhciAqdGVzdCA9IGZp
bmFsLmFzY2lpKCk7CisgICAgS01ENSBjb250ZXh0KHRlc3QpOworICAgIC8va2REZWJ1ZygpPDwg
IlRlc3QgSGV4IERpZ2VzdCBvdXRwdXQ6ICIgPDwgY29udGV4dC5oZXhEaWdlc3QoKS5kYXRhKCkg
PDwgZW5kbDsKKyAgICByZXR1cm4gY29udGV4dC5oZXhEaWdlc3QoKS5kYXRhKCk7Cit9CisKK3Zv
aWQgUGljYXNhd2ViVGFsa2VyOjpnZXRUb2tlbihjb25zdCBRU3RyaW5nJiB1c2VybmFtZSwgY29u
c3QgUVN0cmluZyYgcGFzc3dvcmQpCit7CisgICAgaWYgKG1fam9iKQorICAgIHsKKyAgICAgICAg
bV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9qb2IgPSAwOworICAgIH0KKworICAgIFFTdHJpbmcg
dXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xpZW50TG9naW4iOworCisg
ICAgUGljYXNhd2ViTG9naW4gKmxvZ2luRGlhbG9nID0gbmV3IFBpY2FzYXdlYkxvZ2luKDAsIFFT
dHJpbmcoIkxvZ2luV2luZG93IiksIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgLyppZiAodXNl
cm5hbWUhPU5VTEwgJiYgdXNlcm5hbWUubGVuZ3RoKCkgPiAwKXsKKyAgICAgIC8vICBrZERlYnVn
KCk8PCJTaG93aW5nIHN0b3JlZCB1c2VybmFtZSI8PCB1c2VybmFtZSA8PCBlbmRsOworICAgICAg
ICBsb2dpbkRpYWxvZy0+c2V0VXNlcm5hbWUodXNlcm5hbWUpOworICAgICAgICBpZiAocGFzc3dv
cmQgIT0gTlVMTCAmJiBwYXNzd29yZC5sZW5ndGgoKSA+IDApeworICAgICAgICAvLyAgICBrZERl
YnVnKCk8PCJTaG93aW5nIHN0b3JlZCBwYXNzd29yZCI8PCBwYXNzd29yZCA8PCBlbmRsOworICAg
ICAgICAgICAgbG9naW5EaWFsb2ctPnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgICAv
LyAga2REZWJ1ZygpPDwiU2hvd2luZyBzdG9yZWQgcGFzc3dvcmQiPDwgcGFzc3dvcmQgPDwgZW5k
bDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqLworICAgIFFTdHJpbmcgdXNlcm5hbWVfZWRpdCwg
cGFzc3dvcmRfZWRpdDsKKworICAgIGlmICghbG9naW5EaWFsb2cpCisgICAgICAgIGtkRGVidWco
KSA8PCAiIE91dCBvZiBtZW1vcnkgZXJyb3IgIiA8PCBlbmRsOworCisgICAgaWYgKGxvZ2luRGlh
bG9nLT5leGVjKCkgPT0gUURpYWxvZzo6QWNjZXB0ZWQpCisgICAgeworICAgICAgICB1c2VybmFt
ZV9lZGl0ID0gbG9naW5EaWFsb2ctPnVzZXJuYW1lKCk7CisgICAgICAgIHBhc3N3b3JkX2VkaXQg
PSBsb2dpbkRpYWxvZy0+cGFzc3dvcmQoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAg
ICAgLy9SZXR1cm4gc29tZXRoaW5nIHdoaWNoIHNheSBhdXRoZW50aWNhdGlvbiBuZWVkZWQuCisg
ICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgbV91c2VybmFtZSA9IHVzZXJuYW1lX2VkaXQ7
CisKKyAgICB1c2VybmFtZV9lZGl0ID0gdXNlcm5hbWU7CisgICAgUVN0cmluZyBhY2NvdW50VHlw
ZSA9ICJHT09HTEUiOworCisgICAgaWYgKCEodXNlcm5hbWVfZWRpdC5lbmRzV2l0aCgiQGdtYWls
LmNvbSIpKSkKKyAgICAgICAgdXNlcm5hbWVfZWRpdCArPSAiQGdtYWlsLmNvbSI7CisKKyAgICBR
Qnl0ZUFycmF5IGJ1ZmZlcjsKKworICAgIFFTdHJpbmdMaXN0IHFzbDsKKworICAgIHFzbC5hcHBl
bmQoIkVtYWlsPSIgKyB1c2VybmFtZV9lZGl0KTsKKworICAgIHFzbC5hcHBlbmQoIlBhc3N3ZD0i
ICsgcGFzc3dvcmRfZWRpdCk7CisKKyAgICBxc2wuYXBwZW5kKCJhY2NvdW50VHlwZT0iICsgYWNj
b3VudFR5cGUpOworCisgICAgcXNsLmFwcGVuZCgic2VydmljZT1saDIiKTsKKworICAgIHFzbC5h
cHBlbmQoInNvdXJjZT1raXBpLXBpY2FzYXdlYi1jbGllbnQiKTsKKworICAgIFFTdHJpbmcgZGF0
YVBhcmFtZXRlcnMgPSBxc2wuam9pbigiJiIpOworCisgICAgUVRleHRTdHJlYW0gdHMoYnVmZmVy
LCBJT19BcHBlbmQgfCBJT19Xcml0ZU9ubHkpOworCisgICAgdHMuc2V0RW5jb2RpbmcoUVRleHRT
dHJlYW06OlVuaWNvZGVVVEY4KTsKKworICAgIHRzIDw8IGRhdGFQYXJhbWV0ZXJzOworCisgICAg
S0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpodHRwX3Bvc3QodXJsLCBidWZmZXIsIGZhbHNl
KTsKKworICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6
IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOworCisgICAgbV9zdGF0ZSA9IEZF
X0dFVFRPS0VOOworCisgICAgYXV0aFByb2dyZXNzRGxnLT5zZXRMYWJlbFRleHQoaTE4bigiR2V0
dGluZyB0aGUgdG9rZW4iKSk7CisKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpK
b2IqLCBjb25zdCBRQnl0ZUFycmF5JikpLAorICAgICAgICAgICAgU0xPVChkYXRhKEtJTzo6Sm9i
KiwgY29uc3QgUUJ5dGVBcnJheSYpKSk7CisKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKHJlc3Vs
dChLSU86OkpvYiAqKSksCisgICAgICAgICAgICBTTE9UKHNsb3RSZXN1bHQoS0lPOjpKb2IgKikp
KTsKKworICAgIG1fam9iICAgPSBqb2I7CisKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisKKyAg
ICBlbWl0IHNpZ25hbEJ1c3kodHJ1ZSk7Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjphdXRo
ZW50aWNhdGUoY29uc3QgUVN0cmluZyYgdG9rZW4sCisgICAgICAgIGNvbnN0IFFTdHJpbmcmIHVz
ZXJuYW1lLAorICAgICAgICBjb25zdCBRU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBpbnQgZmRz
W10gPSB7ZmZkcywKKyAgICAgICAgICAgIGZkc2ZkcywKKyAgICAgICAgICAgIGZkc2ZkcworICAg
ICAgICAgICAgICAgIH07CisKKyAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCgpIDwgMSkK
KyAgICB7CisgICAgICAgIGNoZWNrVG9rZW4odG9rZW4pOworICAgICAgICBtX3VzZXJuYW1lID0g
dXNlcm5hbWU7CisgICAgICAgIG1fcGFzc3dvcmQgPSBwYXNzd29yZDsgLy90aGlzIHdvdWxkIGJl
IG5lZWRlZCBpZiB0aGUgY2hlY2t0b2tlbiBmYWlsZWQKKyAgICAgICAgLy93ZSB3b3VsZCBuZWVk
IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGF1dGgKKyAgICB9CisgICAgZWxzZQorICAgICAgICBn
ZXRUb2tlbih1c2VybmFtZSwgcGFzc3dvcmQpOworCit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2Vy
OjpjaGVja1Rva2VuKGNvbnN0IFFTdHJpbmcmIHRva2VuKQoreworICAgIGlmIChtX2pvYikKKyAg
ICB7CisgICAgICAgIG1fam9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisK
KyAgICBRU3RyaW5nIHVybCA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL0NsaWVu
dExvZ2luIjsKKworICAgIFFTdHJpbmcgYXV0aF9zdHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0i
ICsgbV90b2tlbjsKKyAgICBRQnl0ZUFycmF5IHRtcDsKKyAgICBLSU86OlRyYW5zZmVySm9iKiBq
b2IgPSBLSU86Omh0dHBfcG9zdCh1cmwsIHRtcCwgZmFsc2UpOworICAgIGpvYi0+YWRkTWV0YURh
dGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsK
KworICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtdHlwZSIsICJDb250ZW50LVR5cGU6IGFw
cGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOworICAgIGNvbm5lY3Qoam9iLCBTSUdO
QUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9U
KGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0KGpvYiwg
U0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCisgICAgICAgICAgICBTTE9UKHNsb3RSZXN1bHQo
S0lPOjpKb2IgKikpKTsKKyAgICBtX3N0YXRlID0gRkVfQ0hFQ0tUT0tFTjsKKyAgICBhdXRoUHJv
Z3Jlc3NEbGctPnNldExhYmVsVGV4dChpMThuKCJDaGVja2luZyBpZiBwcmV2aW91cyB0b2tlbiBp
cyBzdGlsbCB2YWxpZCIpKTsKKyAgICBhdXRoUHJvZ3Jlc3NEbGctPnNldFByb2dyZXNzKDEsIDQp
OworICAgIG1fam9iICAgPSBqb2I7CisgICAgbV9idWZmZXIucmVzaXplKDApOworICAgIGVtaXQg
c2lnbmFsQnVzeSh0cnVlKTsKK30KKworLyogUGljYXNhV2ViJ3MgQWxidW0gbGlzdGluZyByZXF1
ZXN0L3Jlc3BvbnNlCisgKiBGaXJzdCBhIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgdXJsIGJlbG93
IGFuZCB0aGVuIHdlIG1pZ2h0KD8pIGdldCBhIHJlZGlyZWN0IFVSTAorICogV0UgdGhlbiBuZWVk
IHRvIHNlbmQgdGhlIEdFVCByZXF1ZXN0IHRvIHRoZSBSZWRpcmVjdCB1cmwKKyAqLwordm9pZCBQ
aWNhc2F3ZWJUYWxrZXI6Omxpc3RBbGJ1bXMoKQoreworICAgIGlmIChtX2pvYikKKyAgICB7Cisg
ICAgICAgIG1fam9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisKKyAgICBR
U3RyaW5nIHVybCA9ICJodHRwOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91
c2VyLyIgKyBtX3VzZXJuYW1lICsgIj9raW5kPWFsYnVtIjsKKworICAgIFFCeXRlQXJyYXkgdG1w
OworICAgIEtJTzo6VHJhbnNmZXJKb2IqIGpvYiA9IEtJTzo6Z2V0KHVybCwgdG1wLCBmYWxzZSk7
CisgICAgUVN0cmluZyBhdXRoX3N0cmluZyA9ICJHb29nbGVMb2dpbiBhdXRoPSIgKyBtX3Rva2Vu
OworCisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNvbnRlbnQtVHlwZTog
YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CisgICAgam9iLT5hZGRNZXRhRGF0
YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsgYXV0aF9zdHJpbmcpOwor
CisgICAgY29ubmVjdChqb2IsCisgICAgICAgICAgICBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNv
bnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25z
dCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86Okpv
YiAqKSksIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworCisgICAgbV9zdGF0ZSA9IEZF
X0xJU1RBTEJVTVM7CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7
CisgICAgZW1pdCBzaWduYWxCdXN5KHRydWUpOworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6
Z2V0UGhvdG9Qcm9wZXJ0eShjb25zdCBRU3RyaW5nJiBtZXRob2QsIGNvbnN0IFFTdHJpbmcmIGFy
Z0xpc3QpCit7CisgICAgaWYgKG1fam9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsK
KyAgICAgICAgbV9qb2IgPSAwOworICAgIH0KKworICAgIFFTdHJpbmcgdXJsID0gImh0dHA6Ly93
d3cucGljYXNhd2ViLmNvbS9zZXJ2aWNlcy9yZXN0Lz8iOworCisgICAgUVN0cmluZ0xpc3QgaGVh
ZGVycyA7Ly8KKyAgICBoZWFkZXJzLmFwcGVuZCgiYXBpX2tleT0iICsgbV9hcGlrZXkpOworICAg
IGhlYWRlcnMuYXBwZW5kKCJtZXRob2Q9IiArIG1ldGhvZCk7CisgICAgaGVhZGVycy5hcHBlbmQo
ImZyb2I9IiArIG1fZnJvYik7CisgICAgaGVhZGVycy5hcHBlbmQoYXJnTGlzdCk7CisgICAgUVN0
cmluZyBtZDUgPSBnZXRBcGlTaWcobV9zZWNyZXQsIGhlYWRlcnMpOworICAgIGhlYWRlcnMuYXBw
ZW5kKCJhcGlfc2lnPSIgKyBtZDUpOworICAgIFFTdHJpbmcgcXVlcnlTdHIgPSBoZWFkZXJzLmpv
aW4oIiYiKTsKKyAgICBRU3RyaW5nIHBvc3RVcmwgPSB1cmwgKyBxdWVyeVN0cjsKKyAgICBRQnl0
ZUFycmF5IHRtcDsKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChw
b3N0VXJsLCB0bXAsIGZhbHNlKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUi
LCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAg
ICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5Jikp
LCBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0
KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksIFNMT1Qoc2xvdFJlc3VsdChLSU86Okpv
YiAqKSkpOworICAgIG1fc3RhdGUgPSBGRV9HRVRQSE9UT1BST1BFUlRZOworICAgIG1fam9iICAg
PSBqb2I7CisgICAgbV9idWZmZXIucmVzaXplKDApOworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVl
KTsKKyAgICAvL2F1dGhQcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KCJHZXR0aW5nIHRoZSBUb2tl
biBmcm9tIHRoZSBzZXJ2ZXIiKTsKKyAgICAvL2F1dGhQcm9ncmVzc0RsZy0+c2V0UHJvZ3Jlc3Mo
Myw0KTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmFkZFBob3RvVGFnKGNvbnN0IFFTdHJp
bmcmIHBob3RvVVJJLCBjb25zdCBRU3RyaW5nJiB0YWcpCit7CisgICAgLy9pZiAobV9qb2IgJiYg
bV9zdGF0ZSAhPSBGRV9BRERUQUcpeyAvL3dlIHNob3VsZG4ndCBraWxsIHRoZSBvbGQgdGFnIHJl
cXVlc3QKKyAgICAvLyBtX2pvYi0+a2lsbCgpOworICAgIC8vIG1fam9iID0gMDsKKyAgICAvL30K
KyAgICBRU3RyaW5nIGFkZFRhZ1hNTCA9IFFTdHJpbmcoIjxlbnRyeSB4bWxucz0naHR0cDovL3d3
dy53My5vcmcvMjAwNS9BdG9tJz4gIgorICAgICAgICAgICAgIjx0aXRsZT4lMTwvdGl0bGU+ICIK
KyAgICAgICAgICAgICI8Y2F0ZWdvcnkgc2NoZW1lPSdodHRwOi8vc2NoZW1hcy5nb29nbGUuY29t
L2cvMjAwNSNraW5kJyAiCisgICAgICAgICAgICAidGVybT0naHR0cDovL3NjaGVtYXMuZ29vZ2xl
LmNvbS9waG90b3MvMjAwNyN0YWcnLz4gIgorICAgICAgICAgICAgIjwvZW50cnk+IikuYXJnKHRh
Zyk7CisgICAgUVN0cmluZyBwb3N0VXJsID0gUVN0cmluZygiJTEiKS5hcmcocGhvdG9VUkkpOwor
ICAgIFFCeXRlQXJyYXkgYnVmZmVyOworICAgIFFUZXh0U3RyZWFtIHRzKGJ1ZmZlciwgSU9fQXBw
ZW5kIHwgSU9fV3JpdGVPbmx5KTsKKyAgICB0cy5zZXRFbmNvZGluZyhRVGV4dFN0cmVhbTo6VW5p
Y29kZVVURjgpOworICAgIHRzIDw8IGFkZFRhZ1hNTDsKKworICAgIFFTdHJpbmcgYXV0aF9zdHJp
bmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsKKyAgICBLSU86OlRyYW5zZmVySm9i
KiBqb2IgPSBLSU86Omh0dHBfcG9zdChwb3N0VXJsLCBidWZmZXIsIGZhbHNlKTsKKyAgICBqb2It
PmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9h
dG9tK3htbCIpOworICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtbGVuZ3RoIiwgUVN0cmlu
ZygiQ29udGVudC1MZW5ndGg6ICUxIikuYXJnKGFkZFRhZ1hNTC5sZW5ndGgoKSkpOworICAgIGpv
Yi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjogIiArIGF1
dGhfc3RyaW5nKTsKKyAgICAvL2Nvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNv
bnN0IFFCeXRlQXJyYXkmKSksCisgICAgLy8gIFNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFC
eXRlQXJyYXkmKSkpOworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICop
KSwKKyAgICAgICAgICAgIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworICAgIG1fc3Rh
dGUgPSBGRV9BRERUQUc7CisgICAgbV9qb2IgPSBqb2I7CisgICAgbV9idWZmZXIucmVzaXplKDAp
OworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVlKTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6
Omxpc3RQaG90b3MoY29uc3QgUVN0cmluZyYgYWxidW1OYW1lKQoreworICAgIFFTdHJpbmcgdGVt
cCA9IGFsYnVtTmFtZTsvL2p1c3QgZm9yIGF2b2lkaW5nIHdhcm5pbmcuCisgICAgLy9UbyBiZSBp
bXBsZW1lbnRlZAorfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Y3JlYXRlQWxidW0oCisgICAg
Y29uc3QgUVN0cmluZyYgYWxidW1UaXRsZSwKKyAgICBjb25zdCBRU3RyaW5nJiBhbGJ1bURlc2Ms
CisgICAgY29uc3QgUVN0cmluZyYgbG9jYXRpb24sCisgICAgdWludCAgdGltZXN0YW1wLAorICAg
IGNvbnN0IFFTdHJpbmcmIGFjY2VzcywKKyAgICBjb25zdCBRU3RyaW5nJiBtZWRpYV9rZXl3b3Jk
cywKKyAgICBib29sIGlzQ29tbWVudHNFbmFibGVkKQoreworICAgIGlmIChtX2pvYikKKyAgICB7
CisgICAgICAgIG1fam9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisKKyAg
ICBRU3RyaW5nIG5ld0FsYnVtWE1MID0gUVN0cmluZygiPGVudHJ5IHhtbG5zPSdodHRwOi8vd3d3
LnczLm9yZy8yMDA1L0F0b20nICIKKworICAgICAgICAgICAgInhtbG5zOm1lZGlhPSdodHRwOi8v
c2VhcmNoLnlhaG9vLmNvbS9tcnNzLycgIgorICAgICAgICAgICAgInhtbG5zOmdwaG90bz0naHR0
cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90b3MvMjAwNyc+ICIKKyAgICAgICAgICAgICI8dGl0
bGUgdHlwZT0ndGV4dCc+JTE8L3RpdGxlPiAiCisgICAgICAgICAgICAiPHN1bW1hcnkgdHlwZT0n
dGV4dCc+JTI8L3N1bW1hcnk+ICIKKyAgICAgICAgICAgICI8Z3Bob3RvOmxvY2F0aW9uPiUzPC9n
cGhvdG86bG9jYXRpb24+ICIKKyAgICAgICAgICAgICI8Z3Bob3RvOmFjY2Vzcz4lNDwvZ3Bob3Rv
OmFjY2Vzcz4gIgorICAgICAgICAgICAgIjxncGhvdG86Y29tbWVudGluZ0VuYWJsZWQ+JTU8L2dw
aG90bzpjb21tZW50aW5nRW5hYmxlZD4gIgorICAgICAgICAgICAgIjxncGhvdG86dGltZXN0YW1w
PiU2PC9ncGhvdG86dGltZXN0YW1wPiAiCisgICAgICAgICAgICAiPG1lZGlhOmdyb3VwPiAiCisg
ICAgICAgICAgICAiPG1lZGlhOmtleXdvcmRzPiU3PC9tZWRpYTprZXl3b3Jkcz4gIgorICAgICAg
ICAgICAgIjwvbWVkaWE6Z3JvdXA+ICIKKyAgICAgICAgICAgICI8Y2F0ZWdvcnkgc2NoZW1lPSdo
dHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL2cvMjAwNSNraW5kJyAiCisgICAgICAgICAgICAidGVy
bT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90b3MvMjAwNyNhbGJ1bSc+PC9jYXRlZ29y
eT4gIgorICAgICAgICAgICAgIjwvZW50cnk+ICIpLmFyZyhhbGJ1bVRpdGxlKQorICAgICAgICAg
ICAgLmFyZyhhbGJ1bURlc2MpCisgICAgICAgICAgICAuYXJnKGxvY2F0aW9uKQorICAgICAgICAg
ICAgLmFyZyhhY2Nlc3MpCisgICAgICAgICAgICAuYXJnKGlzQ29tbWVudHNFbmFibGVkID09IHRy
dWUgPyAidHJ1ZSIgOiAiZmFsc2UiKQorICAgICAgICAgICAgLmFyZyh0aW1lc3RhbXApCisgICAg
ICAgICAgICAuYXJnKG1lZGlhX2tleXdvcmRzKTsKKworICAgIFFCeXRlQXJyYXkgYnVmZmVyOwor
ICAgIFFUZXh0U3RyZWFtIHRzKGJ1ZmZlciwgSU9fQXBwZW5kIHwgSU9fV3JpdGVPbmx5KTsKKyAg
ICB0cy5zZXRFbmNvZGluZyhRVGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOworICAgIHRzIDw8IG5l
d0FsYnVtWE1MOworCisgICAgTVBGb3JtIGZvcm07CisgICAgUVN0cmluZyBwb3N0VXJsID0gImh0
dHA6Ly93d3cucGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91c2VyLyIgKyBtX3Vz
ZXJuYW1lIDsKKyAgICBRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2dsZUxvZ2luIGF1dGg9IiAr
IG1fdG9rZW47CisgICAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpodHRwX3Bvc3QocG9z
dFVybCwgYnVmZmVyLCBmYWxzZSk7CisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBl
IiwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKKyAgICBqb2ItPmFkZE1l
dGFEYXRhKCJjb250ZW50LWxlbmd0aCIsIFFTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoOiAlMSIpLmFy
ZyhuZXdBbGJ1bVhNTC5sZW5ndGgoKSkpOworICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhU
VFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsKKworICAgIGNvbm5l
Y3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAg
ICAgICAgICBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBj
b25uZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCisgICAgICAgICAgICBTTE9U
KHNsb3RSZXN1bHQoS0lPOjpKb2IgKikpKTsKKworICAgIG1fc3RhdGUgPSBGRV9DUkVBVEVBTEJV
TTsKKyAgICBtX2pvYiAgID0gam9iOworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKyAgICBlbWl0
IHNpZ25hbEJ1c3kodHJ1ZSk7Cit9CisKK2Jvb2wgUGljYXNhd2ViVGFsa2VyOjphZGRQaG90byhj
b25zdCBRU3RyaW5nJiBwaG90b1BhdGgsCisgICAgICAgIEZQaG90b0luZm8mIGluZm8sIGNvbnN0
IFFTdHJpbmcmIGFsYnVtTmFtZSwKKyAgICAgICAgYm9vbCAgcmVzY2FsZSwgaW50IG1heERpbSwg
aW50IGltYWdlUXVhbGl0eSkKK3sKKyAgICAvLyBEaXNhYmxpbmcgdGhpcyB0b3RhbGx5IG1heSBi
ZSBjaGVja2luZyB0aGUgbV9zdGF0ZSBhbmQgZG9pbmcgc2VsZWN0aW5nCisgICAgLy8gZGlzYWJs
aW5nIGlzIGEgYmV0dGVyIGlkZWEKKyAgICAvKmlmIChtX2pvYikKKyAgICB7CisgICAgIG1fam9i
LT5raWxsKCk7CisgICAgIG1fam9iID0gMDsKKyAgICB9Ki8KKyAgICBRU3RyaW5nIGFsYnVtX25h
bWUgPSBhbGJ1bU5hbWU7CisKKyAgICBpZiAoYWxidW1fbmFtZS5sZW5ndGgoKSA9PSAwKQorICAg
ICAgICBhbGJ1bV9uYW1lID0gInRlc3QiOworCisgICAgUVN0cmluZyBwb3N0VXJsID0gImh0dHA6
Ly93d3cucGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91c2VyLyIgKyBtX3VzZXJu
YW1lICsgIi9hbGJ1bS8iICsgYWxidW1fbmFtZTsKKworICAgIFFTdHJpbmcgcGF0aCA9IHBob3Rv
UGF0aDsKKworICAgIFFTdHJpbmdMaXN0IGhlYWRlcnM7CisKKyAgICBNUEZvcm0gZm9ybTsKKwor
ICAgIFFTdHJpbmcgYXV0aF9zdHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsK
KworICAgIC8vZm9ybS5hZGRQYWlyKCJBdXRob3JpemF0aW9uIiwgYXV0aF9zdHJpbmcpOworCisg
ICAgLy9DcmVhdGUgdGhlIEJvZHkgaW4gYXRvbS14bWwKKyAgICBRU3RyaW5nTGlzdCBib2R5X3ht
bDsKKworICAgIGJvZHlfeG1sLmFwcGVuZCgiPGVudHJ5IHhtbG5zPVwnaHR0cDovL3d3dy53My5v
cmcvMjAwNS9BdG9tXCc+Iik7CisKKyAgICBib2R5X3htbC5hcHBlbmQoIjx0aXRsZT4iICsgaW5m
by50aXRsZSArICI8L3RpdGxlPiIpOworCisgICAgYm9keV94bWwuYXBwZW5kKCI8c3VtbWFyeT4i
ICsgaW5mby5kZXNjcmlwdGlvbiArICI8L3N1bW1hcnk+Iik7CisKKyAgICBib2R5X3htbC5hcHBl
bmQoIjxjYXRlZ29yeSBzY2hlbWU9XCJodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL2cvMjAwNSNr
aW5kXCIgIgorICAgICAgICAgICAgInRlcm09XCJodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL3Bo
b3Rvcy8yMDA3I3Bob3RvXCIgLz4iKTsKKworICAgIGJvZHlfeG1sLmFwcGVuZCgiPC9lbnRyeT4i
KTsKKworICAgIFFTdHJpbmcgYm9keSA9IGJvZHlfeG1sLmpvaW4oIiIpOworCisgICAgZm9ybS5h
ZGRQYWlyKCJ0ZXN0IiwgYm9keSwgImFwcGxpY2F0aW9uL2F0b20reG1sIik7CisKKyAgICAvLyBz
YXZlIHRoZSB0YWdzIGZvciB0aGlzIHBob3RvIGluIHRvIHRoZSB0YWdzIGhhc2htYXAKKyAgICB0
YWdzX21hcC5pbnNlcnQoaW5mby50aXRsZSwgaW5mby50YWdzKTsKKworICAgIFFJbWFnZSBpbWFn
ZShwaG90b1BhdGgpOworCisgICAgaWYgKCFpbWFnZS5pc051bGwoKSkKKyAgICB7CisgICAgICAg
IC8vIGltYWdlIGZpbGUgLSBzZWUgaWYgd2UgbmVlZCB0byByZXNjYWxlIGl0CisgICAgICAgIGlm
IChyZXNjYWxlICYmIChpbWFnZS53aWR0aCgpID4gbWF4RGltIHx8IGltYWdlLmhlaWdodCgpID4g
bWF4RGltKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5zbW9vdGhTY2Fs
ZShtYXhEaW0sIG1heERpbSwgUUltYWdlOjpTY2FsZU1pbik7CisgICAgICAgICAgICBwYXRoID0g
bG9jYXRlTG9jYWwoInRtcCIsIEtVUkwocGhvdG9QYXRoKS5maWxlbmFtZSgpKTsKKyAgICAgICAg
ICAgIGltYWdlLnNhdmUocGF0aCwgUUltYWdlSU86OmltYWdlRm9ybWF0KHBob3RvUGF0aCksIGlt
YWdlUXVhbGl0eSk7CisgICAgICAgICAgICAvL2lmIHRoZSBpbWFnZSBpcyBKUEVHOgorICAgICAg
ICAgICAgLy9UaGlzIHJlc2l6aW5nIGNvZGUgY29tZXMgbW9zdGx5IGFzIGl0IGlzIGZyb20gc2Vu
ZGltYWdlcGx1Z2luCisKKyAgICAgICAgICAgIGlmIChRU3RyaW5nKFFJbWFnZUlPOjppbWFnZUZv
cm1hdChwaG90b1BhdGgpKS51cHBlcigpID09ICJKUEVHIikKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBFeGlmUmVzdG9yZXIgZXhpZkhvbGRlcjsKKyAgICAgICAgICAgICAgICBleGlm
SG9sZGVyLnJlYWRGaWxlKHBob3RvUGF0aCwgRXhpZlJlc3RvcmVyOjpFeGlmT25seSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAoZXhpZkhvbGRlci5oYXNFeGlmKCkpCisgICAgICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgICAgICBFeGlmUmVzdG9yZXIgcmVzdG9yZXI7CisgICAgICAgICAg
ICAgICAgICAgIHJlc3RvcmVyLnJlYWRGaWxlKHBhdGgsIEV4aWZSZXN0b3Jlcjo6RW50aXJlSW1h
Z2UpOworICAgICAgICAgICAgICAgICAgICByZXN0b3Jlci5pbnNlcnRFeGlmRGF0YShleGlmSG9s
ZGVyLmV4aWZEYXRhKCkpOworICAgICAgICAgICAgICAgICAgICByZXN0b3Jlci53cml0ZUZpbGUo
cGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAga2RXYXJuaW5nKDUxMDAwKSA8PCAiKHBpY2FzYXdlYkV4cG9ydDo6SW1hZ2Ug
ZG9lc24ndCBoYXZlIGV4aWYgZGF0YSkiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGtkRGVidWcoKSA8PCAiUmVzaXppbmcgYW5kIHNhdmluZyB0byB0ZW1wIGZpbGU6ICIg
PDwgcGF0aCA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3JtLmFkZEZp
bGUoInBob3RvIiwgcGF0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvcm0uZmlu
aXNoKCk7CisKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChwb3N0
VXJsLCBmb3JtLmZvcm1EYXRhKCksIGZhbHNlKTsKKworICAgIEtJTzo6Sm9iICpqb2Jfb2JqID0g
am9iOworCisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgZm9ybS5jb250ZW50
VHlwZSgpKTsKKworICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0
aG9yaXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwo
ZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9UKGRh
dGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKworICAgIGNvbm5lY3Qoam9iLCBT
SUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAgICAgICAgIFNMT1Qoc2xvdFJlc3VsdChL
SU86OkpvYiAqKSkpOworCisgICAgbV9zdGF0ZSA9IEZFX0FERFBIT1RPOworCisgICAgbV9qb2Ig
ICA9IGpvYjsKKworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKworICAgIGVtaXQgc2lnbmFsQnVz
eSh0cnVlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitRU3RyaW5nIFBpY2FzYXdlYlRhbGtl
cjo6Z2V0VXNlck5hbWUoKQoreworICAgIHJldHVybiBtX3VzZXJuYW1lOworfQorCitRU3RyaW5n
IFBpY2FzYXdlYlRhbGtlcjo6Z2V0VXNlcklkKCkKK3sKKyAgICByZXR1cm4gbV91c2VySWQ7Cit9
CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpjYW5jZWwoKQoreworICAgIGlmIChtX2pvYikKKyAg
ICB7CisgICAgICAgIG1fam9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisK
KyAgICBpZiAoYXV0aFByb2dyZXNzRGxnICYmICFhdXRoUHJvZ3Jlc3NEbGctPmlzSGlkZGVuKCkp
CisgICAgICAgIGF1dGhQcm9ncmVzc0RsZy0+aGlkZSgpOworfQorCit2b2lkIFBpY2FzYXdlYlRh
bGtlcjo6aW5mbyhLSU86OkpvYiogam9iLCBjb25zdCBRU3RyaW5nJiBzdHIpCit7Cit9CisKK3Zv
aWQgUGljYXNhd2ViVGFsa2VyOjpkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYgZGF0
YSkKK3sKKyAgICBpZiAoZGF0YS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlu
dCBvbGRTaXplID0gbV9idWZmZXIuc2l6ZSgpOworCisgICAgbV9idWZmZXIucmVzaXplKG1fYnVm
ZmVyLnNpemUoKSArIGRhdGEuc2l6ZSgpKTsKKworICAgIFFTdHJpbmcgb3V0cHV0X2RhdGEgPSBR
U3RyaW5nKGRhdGEpOworCisgICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG9sZFNpemUsIGRh
dGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpzbG90
RXJyb3IoY29uc3QgUVN0cmluZyAmIGVycm9yKQoreworICAgIFFTdHJpbmcgdHJhbnNFcnJvcjsK
KyAgICBpbnQgZXJyb3JObyA9IDA7CisKKyAgICBpZiAoIWVycm9yLmlzRW1wdHkoKSkKKyAgICAg
ICAgZXJyb3JObyA9IGF0b2koZXJyb3IubGF0aW4xKCkpOworCisgICAgc3dpdGNoIChlcnJvck5v
KQorICAgIHsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4
bigiTm8gcGhvdG8gc3BlY2lmaWVkIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBj
YXNlIDM6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiR2VuZXJhbCB1cGxvYWQgZmFp
bHVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAg
ICAgdHJhbnNFcnJvciA9IGkxOG4oIkZpbGVzaXplIHdhcyB6ZXJvIik7CisgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigi
RmlsZXR5cGUgd2FzIG5vdCByZWNvZ25pc2VkIik7CisgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICBjYXNlIDY6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiVXNlciBleGNlZWRl
ZCB1cGxvYWQgbGltaXQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTY6
CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiSW52YWxpZCBzaWduYXR1cmUiKTsKKyAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTc6CisgICAgICAgICAgICB0cmFuc0Vy
cm9yID0gaTE4bigiTWlzc2luZyBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTG9naW4gRmFp
bGVkIC8gSW52YWxpZCBhdXRoIHRva2VuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICBjYXNlIDEwMDoKKyAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIEFQSSBL
ZXkiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTA1OgorICAgICAgICAg
ICAgdHJhbnNFcnJvciA9IGkxOG4oIlNlcnZpY2UgY3VycmVudGx5IHVuYXZhaWxhYmxlIik7Cisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEwODoKKyAgICAgICAgICAgIHRyYW5z
RXJyb3IgPSBpMThuKCJJbnZhbGlkIEZyb2IiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgIGNhc2UgMTExOgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZvcm1hdCBcInh4
eFwiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMTI6
CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTWV0aG9kIFwieHh4XCIgbm90IGZvdW5k
Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDExNDoKKyAgICAgICAgICAg
IHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIFNPQVAgZW52ZWxvcGUiKTsKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIGNhc2UgMTE1OgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkx
OG4oIkludmFsaWQgWE1MLVJQQyBNZXRob2QgQ2FsbCIpOworICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgY2FzZSAxMTY6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiVGhlIFBP
U1QgbWV0aG9kIGlzIG5vdyByZXF1aXJlZCBmb3IgYWxsIHNldHRlcnMiKTsKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4
bigiVW5rbm93biBlcnJvciIpOworICAgIH07CisKKyAgICBLTWVzc2FnZUJveDo6ZXJyb3IoMCwg
aTE4bigiRXJyb3IgT2NjdXJlZDogJTFcbiBXZSBjYW4gbm90IHByb2NlZWQgZnVydGhlciIpLmFy
Zyh0cmFuc0Vycm9yKSk7CisKKyAgICAvL2tkRGVidWcoKTw8Ik5vdCBoYW5kbGluZyB0aGUgZXJy
b3Igbm93IHdpbGwgc2VlIGl0IGxhdGVyIjw8ZW5kbDsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxr
ZXI6OnNsb3RSZXN1bHQoS0lPOjpKb2IgKmpvYikKK3sKKworICAgIG1fam9iID0gMDsKKyAgICBl
bWl0IHNpZ25hbEJ1c3koZmFsc2UpOworCisgICAgaWYgKGpvYi0+ZXJyb3IoKSkKKyAgICB7Cisg
ICAgICAgIGlmIChtX3N0YXRlID09IEZFX0FERFBIT1RPKQorICAgICAgICB7CisgICAgICAgICAg
ICBlbWl0IHNpZ25hbEFkZFBob3RvRmFpbGVkKGpvYi0+ZXJyb3JTdHJpbmcoKSk7CisgICAgICAg
IH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBqb2ItPnNob3dFcnJvckRp
YWxvZyhtX3BhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgc3dpdGNoIChtX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZShGRV9MT0dJTik6CisgICAg
ICAgICAgICAgICAgICAgICAgICAvL3BhcnNlUmVzcG9uc2VMb2dpbihtX2J1ZmZlcik7CisgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9DUkVBVEVBTEJVTSk6
CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3BvbnNlQ3JlYXRlQWxidW0obV9idWZm
ZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UoRkVfTElTVEFMQlVNUyk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3BvbnNlTGlzdEFsYnVtcyhtX2J1ZmZlcik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9HRVRGUk9CKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0dFVFRPS0VOKToKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VHZXRUb2tlbihtX2J1ZmZlcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9DSEVDS1RPS0VOKToKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VDaGVja1Rva2VuKG1fYnVmZmVyKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0dFVEFVVEhPUklaRUQpOgorICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UoRkVfTElTVFBIT1RPUyk6CisgICAgICAg
ICAgICAgICAgICAgICAgICBwYXJzZVJlc3BvbnNlTGlzdFBob3RvcyhtX2J1ZmZlcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9HRVRQSE9UT1BST1BFUlRZKToKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KG1fYnVmZmVyKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0FERFBIT1RPKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnNlUmVzcG9uc2VBZGRQaG90byhtX2J1ZmZlcik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9BRERUQUcpOgorICAgICAgICAgICAgICAgICAg
ICAgICAgcGFyc2VSZXNwb25zZUFkZFRhZyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsK
KyAgICB9Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlQ2hlY2tUb2tl
bihjb25zdCBRQnl0ZUFycmF5ICZkYXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwor
ICAgIFFTdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgUVN0cmluZyB1c2VybmFtZTsKKyAgICBRU3Ry
aW5nIHRyYW5zUmV0dXJuKGRhdGEpOworICAgIC8vIElmIGNoZWNrdG9rZW4gZmFpbGVkLgorICAg
IC8vIGdldFRva2VuIC4uLgorCisgICAgaWYgKHRyYW5zUmV0dXJuLnN0YXJ0c1dpdGgoIkVycm9y
PSIpKQorICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNz
ID0gdHJ1ZTsKKworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ2V0VG9rZW4obV91c2VybmFt
ZSwgbV9wYXNzd29yZCk7CisKKyAgICAvL2VtaXQgc2lnbmFsRXJyb3IoZXJyb3JTdHJpbmcpOwor
fQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUdldFRva2VuKGNvbnN0IFFC
eXRlQXJyYXkgJmRhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmlu
ZyBlcnJvclN0cmluZzsKKyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICAvL0NoZWNrIHRoZSBy
ZXNwb25zZSBjb2RlIHNob3VsZCBpdCBiZSAyMDAsIHByb2NlZWQKKyAgICAvL2lmIGl0IGlzIDQw
MyBoYW5kbGUgdGhlIGVycm9yIG1lc2cKKyAgICAvL2ZpZ3VyZSBvdXQgdGhlIGF1dGggc3RyaW5n
IGZyb20gdGhpcyByZXNwb25zZQorCisgICAgaWYgKHN0ci5maW5kKCJBdXRoPSIpKQorICAgIHsK
KyAgICAgICAgUVN0cmluZ0xpc3Qgc3RyTGlzdCA9IFFTdHJpbmdMaXN0OjpzcGxpdCgiQXV0aD0i
LCBzdHIpOworICAgICAgICBtX3Rva2VuID0gc3RyTGlzdFsxXTsKKyAgICAgICAgc3VjY2VzcyA9
IDE7CisgICAgfQorCisgICAgLy9saXN0QWxidW1zKCk7CisgICAgaWYgKHN1Y2Nlc3MpCisgICAg
eworICAgICAgICBhdXRoUHJvZ3Jlc3NEbGctPmhpZGUoKTsKKyAgICAgICAgZW1pdCBzaWduYWxU
b2tlbk9idGFpbmVkKG1fdG9rZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGVtaXQgc2ln
bmFsRXJyb3IoZXJyb3JTdHJpbmcpOworCisgICAgZW1pdCBzaWduYWxCdXN5KGZhbHNlKTsKK30K
Kwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmdldEhUTUxSZXNwb25zZUNvZGUoY29uc3QgUVN0cmlu
ZyYgc3RyKQoreworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUxpc3RB
bGJ1bXMoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxz
ZTsKKyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJmZWVkIik7
CisKKyAgICBpZiAoIWRvYy5zZXRDb250ZW50KGRhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50
KCk7CisKKyAgICBRRG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7CisgICAgUURv
bUVsZW1lbnQgZTsKKyAgICBRU3RyaW5nIGZlZWRfaWQsIGZlZWRfdXBkYXRlZCwgZmVlZF90aXRs
ZSwgZmVlZF9zdWJ0aXRsZTsKKyAgICBRU3RyaW5nIGZlZWRfaWNvbl91cmwsIGZlZWRfbGlua191
cmw7CisgICAgUVN0cmluZyBmZWVkX3VzZXJuYW1lLCBmZWVkX3VzZXJfdXJpOworCisgICAgUVN0
cmluZyBhbGJ1bV9pZCwgYWxidW1fdGl0bGUsIGFsYnVtX2Rlc2NyaXB0aW9uOworICAgIG1fYWxi
dW1zTGlzdCA9IG5ldyBRVmFsdWVMaXN0IDxQaWNhc2FXZWJBbGJ1bT4oKTsKKworICAgIHdoaWxl
ICghbm9kZS5pc051bGwoKSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLmlzRWxlbWVudCgpICYm
IG5vZGUubm9kZU5hbWUoKSA9PSAiZW50cnkiKQorICAgICAgICB7CisgICAgICAgICAgICBzdWNj
ZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGUgPSBub2RlLnRvRWxlbWVudCgpOworICAgICAgICAg
ICAgUURvbU5vZGUgZGV0YWlscyA9IGUuZmlyc3RDaGlsZCgpOworICAgICAgICAgICAgUGljYXNh
V2ViQWxidW0gZnBzOworICAgICAgICAgICAgUURvbU5vZGUgZGV0YWlsc05vZGUgPSBkZXRhaWxz
OworCisgICAgICAgICAgICB3aGlsZSAoIWRldGFpbHNOb2RlLmlzTnVsbCgpKQorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzTm9kZS5pc0VsZW1lbnQoKSkKKyAgICAg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzTm9kZS5ub2RlTmFt
ZSgpID09ICJpZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGFsYnVtX2lkID0gZGV0YWlsc05vZGUudG9FbGVtZW50KCkudGV4dCgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgLy90aGlzIGlzIHdoYXQgaXMgb2J0YWluZWQgZnJvbSBkYXRhLgorICAg
ICAgICAgICAgICAgICAgICAgICAgZnBzLmlkID0gYWxidW1faWQ7CisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc05vZGUubm9kZU5hbWUoKSA9
PSAidGl0bGUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBhbGJ1bV90aXRsZSA9ICJOb3QgZmV0Y2hlZCI7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoInR5cGUiKSA9PSAidGV4dCIp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fdGl0bGUgPSBkZXRhaWxzTm9kZS50
b0VsZW1lbnQoKS50ZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyB3
aGF0IGlzIG9idGFpbmVkIGZyb20gZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcy50
aXRsZSA9IGFsYnVtX3RpdGxlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGRldGFpbHNOb2RlLm5vZGVOYW1lKCkgPT0gImdwaG90bzpuYW1lIikKKyAg
ICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBuYW1l
ID0gZGV0YWlsc05vZGUudG9FbGVtZW50KCkudGV4dCgpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGV0YWlsc05vZGUgPSBkZXRh
aWxzTm9kZS5uZXh0U2libGluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2Fs
YnVtc0xpc3QtPmFwcGVuZChmcHMpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9IG5vZGUu
bmV4dFNpYmxpbmcoKTsKKyAgICB9CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgeworICAgICAg
ICBlbWl0IHNpZ25hbEdldEFsYnVtc0xpc3RGYWlsZWQoaTE4bigiRmFpbGVkIHRvIGZldGNoIHBo
b3RvU2V0cyBMaXN0IikpOworICAgICAgICBtX2FsYnVtc0xpc3QgPSBOVUxMOworICAgIH0KKyAg
ICBlbHNlCisgICAgeworICAgICAgICBlbWl0IHNpZ25hbEdldEFsYnVtc0xpc3RTdWNjZWVkZWQo
KTsKKyAgICB9Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlTGlzdFBo
b3Rvcyhjb25zdCBRQnl0ZUFycmF5ICZkYXRhKQoreworICAgIFFEb21Eb2N1bWVudCBkb2MoImdl
dFBob3Rvc0xpc3QiKTsKKworICAgIGlmICghZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgewor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUURvbUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5k
b2N1bWVudEVsZW1lbnQoKTsKKworICAgIFFEb21Ob2RlIG5vZGUgPSBkb2NFbGVtLmZpcnN0Q2hp
bGQoKTsKKyAgICAvL1FEb21FbGVtZW50IGU7CisgICAgLy9UbyBiZSBpbXBsZW1lbnRlZC4KK30K
Kwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VDcmVhdGVBbGJ1bShjb25zdCBR
Qnl0ZUFycmF5ICZkYXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFTdHJp
bmcgZXJyb3JTdHJpbmc7CisgICAgUVN0cmluZyByZXNwb25zZShkYXRhKTsKKyAgICBRRG9tRG9j
dW1lbnQgZG9jKCJBZGRQaG90byBSZXNwb25zZSIpOworICAgIC8vIHBhcnNlIHRoZSBuZXcgYWxi
dW0gbmFtZQorICAgIFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7
CisgICAgUVN0cmluZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsKKyAgICBR
RG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7IC8vdGhpcyBzaG91bGQgbWVhbiA8
ZW50cnk+CisgICAgUURvbUVsZW1lbnQgZTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwoKSkK
KyAgICB7CisgICAgICAgIGlmIChub2RlLmlzRWxlbWVudCgpKQorICAgICAgICB7CisgICAgICAg
ICAgICBRU3RyaW5nIG5vZGVfbmFtZSA9IG5vZGUubm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFFT
dHJpbmcgbm9kZV92YWx1ZSA9IG5vZGUudG9FbGVtZW50KCkudGV4dCgpOworCisgICAgICAgICAg
ICBpZiAobm9kZV9uYW1lID09ICJ0aXRsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBub2RlX3ZhbHVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCisg
ICAgICAgICAgICAgICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgZWxzZSBp
ZiAobm9kZV9uYW1lID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgIHBob3RvX2lkID0g
bm9kZV92YWx1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmFs
YnVtaWQiKQorICAgICAgICAgICAgICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgLy8g
UmFpc2UgYSBwb3B1cCBpbmZvcm1pbmcgc3VjY2VzcworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtl
cjo6cGFyc2VSZXNwb25zZUFkZFRhZyhjb25zdCBRQnl0ZUFycmF5ICZkYXRhKQoreworICAgIFFT
dHJpbmcgc3RyKGRhdGEpOworICAgIHJlbWFpbmluZ190YWdzX2NvdW50IC09IDE7CisgICAgZW1p
dCBzaWduYWxCdXN5KGZhbHNlKTsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisKKyAgICBpZiAo
cmVtYWluaW5nX3RhZ3NfY291bnQgPT0gMCkKKyAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b1N1
Y2NlZWRlZCgpOworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUFkZFBo
b3RvKGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7
CisgICAgUVN0cmluZyAgICAgbGluZTsKKyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICBzdWNj
ZXNzID0gMTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJBZGRQaG90byBSZXNwb25zZSIpOworCisg
ICAgaWYgKCFkb2Muc2V0Q29udGVudChkYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOwor
CisgICAgUVN0cmluZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsKKyAgICBR
RG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7IC8vdGhpcyBzaG91bGQgbWVhbiA8
ZW50cnk+CisgICAgUURvbUVsZW1lbnQgZTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwoKSkK
KyAgICB7CisgICAgICAgIGlmIChub2RlLmlzRWxlbWVudCgpKQorICAgICAgICB7CisgICAgICAg
ICAgICBRU3RyaW5nIG5vZGVfbmFtZSA9IG5vZGUubm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFFT
dHJpbmcgbm9kZV92YWx1ZSA9IG5vZGUudG9FbGVtZW50KCkudGV4dCgpOworCisgICAgICAgICAg
ICBpZiAobm9kZV9uYW1lID09ICJ0aXRsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBub2RlX3ZhbHVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCisg
ICAgICAgICAgICAgICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgZWxzZSBp
ZiAobm9kZV9uYW1lID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgIHBob3RvX2lkID0g
bm9kZV92YWx1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmFs
YnVtaWQiKQorICAgICAgICAgICAgICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgaWYg
KCFzdWNjZXNzKQorICAgIHsKKyAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThu
KCJGYWlsZWQgdG8gdXBsb2FkIHBob3RvIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAg
ICAgICAvLyBVcGRhdGUgdGhlIHRhZ3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGFnc19tYXAKKyAg
ICAgICAgUVN0cmluZ0xpc3QgdGFncyA9IHRhZ3NfbWFwW3RpdGxlXTsKKyAgICAgICAgcmVtYWlu
aW5nX3RhZ3NfY291bnQgPSB0YWdzLmNvdW50KCk7CisKKyAgICAgICAgaWYgKHRhZ3MuY291bnQo
KSA9PSAwKQorICAgICAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b1N1Y2NlZWRlZCgpOworCisg
ICAgICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpOyBpdCAh
PSB0YWdzLmVuZCgpOyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5nIHBob3Rv
VVJJID0gUVN0cmluZygiaHR0cDovL3BpY2FzYXdlYi5nb29nbGUuY29tL2RhdGEvZmVlZC9hcGkv
dXNlci8iCisgICAgICAgICAgICAgICAgICAgICIlMS9hbGJ1bWlkLyUyL3Bob3RvaWQvJTMiKS5h
cmcobV91c2VybmFtZSkuYXJnKGFsYnVtX2lkKS5hcmcocGhvdG9faWQpOworICAgICAgICAgICAg
YWRkUGhvdG9UYWcocGhvdG9VUkksICppdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordm9p
ZCBQaWNhc2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KGNvbnN0IFFCeXRl
QXJyYXkgJmRhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmluZyAg
ICAgbGluZTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJQaG90b3MgUHJvcGVydGllcyIpOworCisg
ICAgaWYgKCFkb2Muc2V0Q29udGVudChkYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBRRG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOwor
CisgICAgUURvbU5vZGUgbm9kZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOworICAgIFFEb21FbGVt
ZW50IGU7CisKKyAgICB3aGlsZSAoIW5vZGUuaXNOdWxsKCkpCisgICAgeworICAgICAgICBpZiAo
bm9kZS5pc0VsZW1lbnQoKSAmJiBub2RlLm5vZGVOYW1lKCkgPT0gInBob3RvaWQiKQorICAgICAg
ICB7CisgICAgICAgICAgICBlID0gbm9kZS50b0VsZW1lbnQoKTsgLy8gdHJ5IHRvIGNvbnZlcnQg
dGhlIG5vZGUgdG8gYW4gZWxlbWVudC4KKyAgICAgICAgICAgIFFEb21Ob2RlIGRldGFpbHMgPSBl
LmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKG5vZGUuaXNFbGVtZW50KCkgJiYgbm9kZS5ub2RlTmFtZSgpID09ICJlcnIi
KQorICAgICAgICB7CisgICAgICAgICAgICBrZERlYnVnKCkgPDwgIkNoZWNraW5nIEVycm9yIGlu
IHJlc3BvbnNlIiA8PCBlbmRsOworICAgICAgICAgICAgUVN0cmluZyBjb2RlID0gbm9kZS50b0Vs
ZW1lbnQoKS5hdHRyaWJ1dGUoImNvZGUiKTsKKyAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiRXJy
b3IgY29kZT0iIDw8IGNvZGUgPDwgZW5kbDsKKyAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiTXNn
PSIgPDwgbm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoIm1zZyIpIDw8IGVuZGw7CisgICAgICAg
ICAgICBlbWl0IHNpZ25hbEVycm9yKGNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9
IG5vZGUubmV4dFNpYmxpbmcoKTsKKyAgICB9CisKKyAgICBrZERlYnVnKCkgPDwgIkdldFRva2Vu
IGZpbmlzaGVkIiA8PCBlbmRsOworCisgICAgaWYgKCFzdWNjZXNzKQorICAgIHsKKyAgICAgICAg
ZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8gcXVlcnkgcGhvdG8gaW5m
b3JtYXRpb24iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vZW1pdCBzaWdu
YWxBZGRQaG90b1N1Y2NlZWRlZCgpOworICAgIH0KKworfQorfQorCisjaW5jbHVkZSAicGljYXNh
d2VidGFsa2VyLm1vYyIKKwpkaWZmIC1OdXIgcGljYXNhd2ViZXhwb3J0Lm9yaWcvcGljYXNhd2Vi
dGFsa2VyLmNwcC50c3QgcGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRhbGtlci5jcHAudHN0Ci0t
LSBwaWNhc2F3ZWJleHBvcnQub3JpZy9waWNhc2F3ZWJ0YWxrZXIuY3BwLnRzdAkxOTcwLTAxLTAx
IDEwOjAwOjAwLjAwMDAwMDAwMCArMTAwMAorKysgcGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRh
bGtlci5jcHAudHN0CTIwMDgtMDItMTYgMTM6MzU6NDQuMDAwMDAwMDAwICsxMDAwCkBAIC0wLDAg
KzEsOTk0IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KKyAgICBjb25maWcud3JpdGVFbnRyeSgicGFzc3dvcmQiLCBtX3Bh
c3N3b3JkKTsKKyAqIEZpbGUgIDogcGljYXNhd2VidGFsa2VyLmNwcAorICogQXV0aG9yOiBWYXJk
aG1hbiBKYWluIDx2YXJkaG1hbiBAIGdtYWlsLmNvbT4KKyAqIERhdGUgIDogMjAwNy0xNi0wNwor
ICogRGVzY3JpcHRpb24gOgorICoKKyAqIENvcHlyaWdodCAyMDA3IGJ5IFZhcmRobWFuIEphaW4g
PHZhcmRobWFuIEAgZ21haWwuY29tPgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAqIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBv
ciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHBy
b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8cWNzdHJpbmcuaD4KKyNpbmNs
dWRlIDxxdGV4dHN0cmVhbS5oPgorI2luY2x1ZGUgPHFmaWxlLmg+CisjaW5jbHVkZSA8cWltYWdl
Lmg+CisjaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KKyNpbmNsdWRlIDxrbG9jYWxlLmg+CisjaW5j
bHVkZSA8a2lvL2pvYi5oPgorI2luY2x1ZGUgPGtkZWJ1Zy5oPgorI2luY2x1ZGUgPGttaW1ldHlw
ZS5oPgorI2luY2x1ZGUgPGtzdGFuZGFyZGRpcnMuaD4KKyNpbmNsdWRlIDxrbWRjb2RlYy5oPgor
I2luY2x1ZGUgPGthcHAuaD4KKyNpbmNsdWRlIDxrbWVzc2FnZWJveC5oPgorI2luY2x1ZGUgPHF1
cmwuaD4KKyNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbWVzc2FnZWJveC5oPgor
I2luY2x1ZGUgPGtpby9qb2JjbGFzc2VzLmg+CisjaW5jbHVkZSA8cWRvbS5oPgorI2luY2x1ZGUg
PGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVk
ZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAicGljYXNhd2ViaXRl
bS5oIgorI2luY2x1ZGUgImV4aWZyZXN0b3Jlci5oIgorI2luY2x1ZGUgIm1wZm9ybS5oIgorCisj
aW5jbHVkZSAicGljYXNhd2VidGFsa2VyLmgiCisjaW5jbHVkZSAicGljYXNhd2Vid2luZG93Lmgi
CisjaW5jbHVkZSAicGljYXNhd2VibG9naW4uaCIKKworY2xhc3MgUGljYXNhd2ViTG9naW47CisK
K25hbWVzcGFjZSBLSVBJUGljYXNhd2ViRXhwb3J0UGx1Z2luCit7CisKK1BpY2FzYXdlYlRhbGtl
cjo6UGljYXNhd2ViVGFsa2VyKFFXaWRnZXQqIHBhcmVudCkKKyAgICAgICAgOiBtX3BhcmVudChw
YXJlbnQpLCAgbV9qb2IoMCkKK3sKKyAgICBtX2FwaWtleSA9ICI0OWQ1ODViYWZhMDc1OGNiNWM1
OGFiNjcxOThiZjYzMiI7CisgICAgbV9zZWNyZXQgPSAiMzRiMzk5MjVlNjI3M2ZmZCI7CisgICAg
Y29ubmVjdCh0aGlzLCBTSUdOQUwoc2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyYgc3RyKSksIFNM
T1Qoc2xvdEVycm9yKGNvbnN0IFFTdHJpbmcmIHN0cikpKTsKKyAgICBhdXRoUHJvZ3Jlc3NEbGcg
PSBuZXcgUVByb2dyZXNzRGlhbG9nKCk7Cit9CisKK1BpY2FzYXdlYlRhbGtlcjo6flBpY2FzYXdl
YlRhbGtlcigpCit7CisgICAgaWYgKG1fam9iKQorICAgICAgICBtX2pvYi0+a2lsbCgpOworfQor
CisKK1FTdHJpbmcgUGljYXNhd2ViVGFsa2VyOjpnZXRBcGlTaWcoUVN0cmluZyBzZWNyZXQsIFFT
dHJpbmdMaXN0IGhlYWRlcnMpCit7CisgICAgUVN0cmluZ0xpc3QgY29tcHJlc3NlZCA7Ly89IG5l
dyBMaXN0PHN0cmluZz4oaGVhZGVycy5MZW5ndGgpOworCisgICAgZm9yIChRU3RyaW5nTGlzdDo6
SXRlcmF0b3IgaXQgPSBoZWFkZXJzLmJlZ2luKCk7IGl0ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQp
CisgICAgeworICAgICAgICBRU3RyaW5nTGlzdCBzdHIgPSBRU3RyaW5nTGlzdDo6c3BsaXQoIj0i
LCAoKml0KSk7CisgICAgICAgIGNvbXByZXNzZWQuYXBwZW5kKHN0clswXS5zdHJpcFdoaXRlU3Bh
Y2UoKSArIHN0clsxXS5zdHJpcFdoaXRlU3BhY2UoKSk7CisgICAgfQorCisgICAgY29tcHJlc3Nl
ZC5zb3J0KCk7CisKKyAgICBRU3RyaW5nIG1lcmdlZCA9IGNvbXByZXNzZWQuam9pbigiIik7Cisg
ICAgUVN0cmluZyBmaW5hbCA9IHNlY3JldCArIG1lcmdlZDsKKyAgICBjb25zdCBjaGFyICp0ZXN0
ID0gZmluYWwuYXNjaWkoKTsKKyAgICBLTUQ1IGNvbnRleHQodGVzdCk7CisgICAgLy9rZERlYnVn
KCk8PCAiVGVzdCBIZXggRGlnZXN0IG91dHB1dDogIiA8PCBjb250ZXh0LmhleERpZ2VzdCgpLmRh
dGEoKSA8PCBlbmRsOworICAgIHJldHVybiBjb250ZXh0LmhleERpZ2VzdCgpLmRhdGEoKTsKK30K
Kwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmdldFRva2VuKGNvbnN0IFFTdHJpbmcmIHVzZXJuYW1l
LCBjb25zdCBRU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBpZiAobV9qb2IpCisgICAgeworICAg
ICAgICBtX2pvYi0+a2lsbCgpOworICAgICAgICBtX2pvYiA9IDA7CisgICAgfQorCisgICAgUVN0
cmluZyB1cmwgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9DbGllbnRMb2dpbiI7
CisKKyAgICBQaWNhc2F3ZWJMb2dpbiAqbG9naW5EaWFsb2cgPSBuZXcgUGljYXNhd2ViTG9naW4o
MCwgUVN0cmluZygiTG9naW5XaW5kb3ciKSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAvKmlm
ICh1c2VybmFtZSE9TlVMTCAmJiB1c2VybmFtZS5sZW5ndGgoKSA+IDApeworICAgICAgLy8gIGtk
RGVidWcoKTw8IlNob3dpbmcgc3RvcmVkIHVzZXJuYW1lIjw8IHVzZXJuYW1lIDw8IGVuZGw7Cisg
ICAgICAgIGxvZ2luRGlhbG9nLT5zZXRVc2VybmFtZSh1c2VybmFtZSk7CisgICAgICAgIGlmIChw
YXNzd29yZCAhPSBOVUxMICYmIHBhc3N3b3JkLmxlbmd0aCgpID4gMCl7CisgICAgICAgIC8vICAg
IGtkRGVidWcoKTw8IlNob3dpbmcgc3RvcmVkIHBhc3N3b3JkIjw8IHBhc3N3b3JkIDw8IGVuZGw7
CisgICAgICAgICAgICBsb2dpbkRpYWxvZy0+c2V0UGFzc3dvcmQocGFzc3dvcmQpOworICAgICAg
ICAgIC8vICBrZERlYnVnKCk8PCJTaG93aW5nIHN0b3JlZCBwYXNzd29yZCI8PCBwYXNzd29yZCA8
PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgICovCisgICAgUVN0cmluZyB1c2VybmFtZV9l
ZGl0LCBwYXNzd29yZF9lZGl0OworCisgICAgaWYgKCFsb2dpbkRpYWxvZykKKyAgICAgICAga2RE
ZWJ1ZygpIDw8ICIgT3V0IG9mIG1lbW9yeSBlcnJvciAiIDw8IGVuZGw7CisKKyAgICBpZiAobG9n
aW5EaWFsb2ctPmV4ZWMoKSA9PSBRRGlhbG9nOjpBY2NlcHRlZCkKKyAgICB7CisgICAgICAgIHVz
ZXJuYW1lX2VkaXQgPSBsb2dpbkRpYWxvZy0+dXNlcm5hbWUoKTsKKyAgICAgICAgcGFzc3dvcmRf
ZWRpdCA9IGxvZ2luRGlhbG9nLT5wYXNzd29yZCgpOworICAgIH0KKyAgICBlbHNlCisgICAgewor
ICAgICAgICAvL1JldHVybiBzb21ldGhpbmcgd2hpY2ggc2F5IGF1dGhlbnRpY2F0aW9uIG5lZWRl
ZC4KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBtX3VzZXJuYW1lID0gdXNlcm5hbWVf
ZWRpdDsKKworICAgIHVzZXJuYW1lX2VkaXQgPSB1c2VybmFtZTsKKyAgICBRU3RyaW5nIGFjY291
bnRUeXBlID0gIkdPT0dMRSI7CisKKyAgICBpZiAoISh1c2VybmFtZV9lZGl0LmVuZHNXaXRoKCJA
Z21haWwuY29tIikpKQorICAgICAgICB1c2VybmFtZV9lZGl0ICs9ICJAZ21haWwuY29tIjsKKwor
ICAgIFFCeXRlQXJyYXkgYnVmZmVyOworCisgICAgUVN0cmluZ0xpc3QgcXNsOworCisgICAgcXNs
LmFwcGVuZCgiRW1haWw9IiArIHVzZXJuYW1lX2VkaXQpOworCisgICAgcXNsLmFwcGVuZCgiUGFz
c3dkPSIgKyBwYXNzd29yZF9lZGl0KTsKKworICAgIHFzbC5hcHBlbmQoImFjY291bnRUeXBlPSIg
KyBhY2NvdW50VHlwZSk7CisKKyAgICBxc2wuYXBwZW5kKCJzZXJ2aWNlPWxoMiIpOworCisgICAg
cXNsLmFwcGVuZCgic291cmNlPWtpcGktcGljYXNhd2ViLWNsaWVudCIpOworCisgICAgUVN0cmlu
ZyBkYXRhUGFyYW1ldGVycyA9IHFzbC5qb2luKCImIik7CisKKyAgICBRVGV4dFN0cmVhbSB0cyhi
dWZmZXIsIElPX0FwcGVuZCB8IElPX1dyaXRlT25seSk7CisKKyAgICB0cy5zZXRFbmNvZGluZyhR
VGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOworCisgICAgdHMgPDwgZGF0YVBhcmFtZXRlcnM7CisK
KyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdCh1cmwsIGJ1ZmZlciwg
ZmFsc2UpOworCisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNvbnRlbnQt
VHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CisKKyAgICBtX3N0YXRl
ID0gRkVfR0VUVE9LRU47CisKKyAgICBhdXRoUHJvZ3Jlc3NEbGctPnNldExhYmVsVGV4dChpMThu
KCJHZXR0aW5nIHRoZSB0b2tlbiIpKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShL
SU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9UKGRhdGEoS0lP
OjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwo
cmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAgICAgICAgIFNMT1Qoc2xvdFJlc3VsdChLSU86Okpv
YiAqKSkpOworCisgICAgbV9qb2IgICA9IGpvYjsKKworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsK
KworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVlKTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6
OmF1dGhlbnRpY2F0ZShjb25zdCBRU3RyaW5nJiB0b2tlbiwgY29uc3QgUVN0cmluZyYgdXNlcm5h
bWUsIGNvbnN0IFFTdHJpbmcmIHBhc3N3b3JkKQoreworICAgIGlmICghdG9rZW4gfHwgdG9rZW4u
bGVuZ3RoKCkgPCAxKQorICAgIHsKKyAgICAgICAgY2hlY2tUb2tlbih0b2tlbik7CisgICAgICAg
IG1fdXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgbV9wYXNzd29yZCA9IHBhc3N3b3JkOyAv
L3RoaXMgd291bGQgYmUgbmVlZGVkIGlmIHRoZSBjaGVja3Rva2VuIGZhaWxlZAorICAgICAgICAv
L3dlIHdvdWxkIG5lZWQgdG8gcmVhdXRoZW50aWNhdGUgdXNpbmcgYXV0aAorICAgIH0KKyAgICBl
bHNlCisgICAgICAgIGdldFRva2VuKHVzZXJuYW1lLCBwYXNzd29yZCk7CisKK30KKwordm9pZCBQ
aWNhc2F3ZWJUYWxrZXI6OmNoZWNrVG9rZW4oY29uc3QgUVN0cmluZyYgdG9rZW4pCit7CisgICAg
aWYgKG1fam9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9qb2Ig
PSAwOworICAgIH0KKworICAgIFFTdHJpbmcgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20v
YWNjb3VudHMvQ2xpZW50TG9naW4iOworCisgICAgUVN0cmluZyBhdXRoX3N0cmluZyA9ICJHb29n
bGVMb2dpbiBhdXRoPSIgKyBtX3Rva2VuOworICAgIFFCeXRlQXJyYXkgdG1wOworICAgIEtJTzo6
VHJhbnNmZXJKb2IqIGpvYiA9IEtJTzo6aHR0cF9wb3N0KHVybCwgdG1wLCBmYWxzZSk7CisgICAg
am9iLT5hZGRNZXRhRGF0YSgiY3VzdG9tSFRUUEhlYWRlciIsICJBdXRob3JpemF0aW9uOiAiICsg
YXV0aF9zdHJpbmcpOworCisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNv
bnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CisgICAgY29u
bmVjdChqb2IsIFNJR05BTChkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYpKSwKKyAg
ICAgICAgICAgIFNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkpOworICAg
IGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAgICAgICAgIFNM
T1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworICAgIG1fc3RhdGUgPSBGRV9DSEVDS1RPS0VO
OworICAgIGF1dGhQcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KGkxOG4oIkNoZWNraW5nIGlmIHBy
ZXZpb3VzIHRva2VuIGlzIHN0aWxsIHZhbGlkIikpOworICAgIGF1dGhQcm9ncmVzc0RsZy0+c2V0
UHJvZ3Jlc3MoMSwgNCk7CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUo
MCk7CisgICAgZW1pdCBzaWduYWxCdXN5KHRydWUpOworfQorCisvKiBQaWNhc2FXZWIncyBBbGJ1
bSBsaXN0aW5nIHJlcXVlc3QvcmVzcG9uc2UKKyAqIEZpcnN0IGEgcmVxdWVzdCBpcyBzZW50IHRv
IHRoZSB1cmwgYmVsb3cgYW5kIHRoZW4gd2UgbWlnaHQoPykgZ2V0IGEgcmVkaXJlY3QgVVJMCisg
KiBXRSB0aGVuIG5lZWQgdG8gc2VuZCB0aGUgR0VUIHJlcXVlc3QgdG8gdGhlIFJlZGlyZWN0IHVy
bAorICovCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6bGlzdEFsYnVtcygpCit7CisgICAgaWYgKG1f
am9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9qb2IgPSAwOwor
ICAgIH0KKworICAgIFFTdHJpbmcgdXJsID0gImh0dHA6Ly9waWNhc2F3ZWIuZ29vZ2xlLmNvbS9k
YXRhL2ZlZWQvYXBpL3VzZXIvIiArIG1fdXNlcm5hbWUgKyAiP2tpbmQ9YWxidW0iOworCisgICAg
UUJ5dGVBcnJheSB0bXA7CisgICAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpnZXQodXJs
LCB0bXAsIGZhbHNlKTsKKyAgICBRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2dsZUxvZ2luIGF1
dGg9IiArIG1fdG9rZW47CisKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAi
Q29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICBq
b2ItPmFkZE1ldGFEYXRhKCJjdXN0b21IVFRQSGVhZGVyIiwgIkF1dGhvcml6YXRpb246ICIgKyBh
dXRoX3N0cmluZyk7CisKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBj
b25zdCBRQnl0ZUFycmF5JikpLCBTTE9UKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5
JikpKTsKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksIFNMT1Qo
c2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworCisgICAgbV9zdGF0ZSA9IEZFX0xJU1RBTEJVTVM7
CisgICAgbV9qb2IgICA9IGpvYjsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisgICAgZW1pdCBz
aWduYWxCdXN5KHRydWUpOworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Z2V0UGhvdG9Qcm9w
ZXJ0eShjb25zdCBRU3RyaW5nJiBtZXRob2QsIGNvbnN0IFFTdHJpbmcmIGFyZ0xpc3QpCit7Cisg
ICAgaWYgKG1fam9iKQorICAgIHsKKyAgICAgICAgbV9qb2ItPmtpbGwoKTsKKyAgICAgICAgbV9q
b2IgPSAwOworICAgIH0KKworICAgIFFTdHJpbmcgdXJsID0gImh0dHA6Ly93d3cucGljYXNhd2Vi
LmNvbS9zZXJ2aWNlcy9yZXN0Lz8iOworCisgICAgUVN0cmluZ0xpc3QgaGVhZGVycyA7Ly8KKyAg
ICBoZWFkZXJzLmFwcGVuZCgiYXBpX2tleT0iICsgbV9hcGlrZXkpOworICAgIGhlYWRlcnMuYXBw
ZW5kKCJtZXRob2Q9IiArIG1ldGhvZCk7CisgICAgaGVhZGVycy5hcHBlbmQoImZyb2I9IiArIG1f
ZnJvYik7CisgICAgaGVhZGVycy5hcHBlbmQoYXJnTGlzdCk7CisgICAgUVN0cmluZyBtZDUgPSBn
ZXRBcGlTaWcobV9zZWNyZXQsIGhlYWRlcnMpOworICAgIGhlYWRlcnMuYXBwZW5kKCJhcGlfc2ln
PSIgKyBtZDUpOworICAgIFFTdHJpbmcgcXVlcnlTdHIgPSBoZWFkZXJzLmpvaW4oIiYiKTsKKyAg
ICBRU3RyaW5nIHBvc3RVcmwgPSB1cmwgKyBxdWVyeVN0cjsKKyAgICBRQnl0ZUFycmF5IHRtcDsK
KyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChwb3N0VXJsLCB0bXAs
IGZhbHNlKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1U
eXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICBjb25uZWN0KGpv
YiwgU0lHTkFMKGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpLCBTTE9UKGRhdGEo
S0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0KGpvYiwgU0lHTkFM
KHJlc3VsdChLSU86OkpvYiAqKSksIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworICAg
IG1fc3RhdGUgPSBGRV9HRVRQSE9UT1BST1BFUlRZOworICAgIG1fam9iICAgPSBqb2I7CisgICAg
bV9idWZmZXIucmVzaXplKDApOworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVlKTsKKyAgICAvL2F1
dGhQcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KCJHZXR0aW5nIHRoZSBUb2tlbiBmcm9tIHRoZSBz
ZXJ2ZXIiKTsKKyAgICAvL2F1dGhQcm9ncmVzc0RsZy0+c2V0UHJvZ3Jlc3MoMyw0KTsKK30KKwor
dm9pZCBQaWNhc2F3ZWJUYWxrZXI6OmFkZFBob3RvVGFnKGNvbnN0IFFTdHJpbmcmIHBob3RvVVJJ
LCBjb25zdCBRU3RyaW5nJiB0YWcpCit7CisgICAgLy9pZiAobV9qb2IgJiYgbV9zdGF0ZSAhPSBG
RV9BRERUQUcpeyAvL3dlIHNob3VsZG4ndCBraWxsIHRoZSBvbGQgdGFnIHJlcXVlc3QKKyAgICAv
LyBtX2pvYi0+a2lsbCgpOworICAgIC8vIG1fam9iID0gMDsKKyAgICAvL30KKyAgICBRU3RyaW5n
IGFkZFRhZ1hNTCA9IFFTdHJpbmcoIjxlbnRyeSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAw
NS9BdG9tJz4gIgorICAgICAgICAgICAgIjx0aXRsZT4lMTwvdGl0bGU+ICIKKyAgICAgICAgICAg
ICI8Y2F0ZWdvcnkgc2NoZW1lPSdodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL2cvMjAwNSNraW5k
JyAiCisgICAgICAgICAgICAidGVybT0naHR0cDovL3NjaGVtYXMuZ29vZ2xlLmNvbS9waG90b3Mv
MjAwNyN0YWcnLz4gIgorICAgICAgICAgICAgIjwvZW50cnk+IikuYXJnKHRhZyk7CisgICAgUVN0
cmluZyBwb3N0VXJsID0gUVN0cmluZygiJTEiKS5hcmcocGhvdG9VUkkpOworICAgIFFCeXRlQXJy
YXkgYnVmZmVyOworICAgIFFUZXh0U3RyZWFtIHRzKGJ1ZmZlciwgSU9fQXBwZW5kIHwgSU9fV3Jp
dGVPbmx5KTsKKyAgICB0cy5zZXRFbmNvZGluZyhRVGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOwor
ICAgIHRzIDw8IGFkZFRhZ1hNTDsKKworICAgIFFTdHJpbmcgYXV0aF9zdHJpbmcgPSAiR29vZ2xl
TG9naW4gYXV0aD0iICsgbV90b2tlbjsKKyAgICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86
Omh0dHBfcG9zdChwb3N0VXJsLCBidWZmZXIsIGZhbHNlKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRh
KCJjb250ZW50LXR5cGUiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9hdG9tK3htbCIpOwor
ICAgIGpvYi0+YWRkTWV0YURhdGEoImNvbnRlbnQtbGVuZ3RoIiwgUVN0cmluZygiQ29udGVudC1M
ZW5ndGg6ICUxIikuYXJnKGFkZFRhZ1hNTC5sZW5ndGgoKSkpOworICAgIGpvYi0+YWRkTWV0YURh
dGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsK
KyAgICAvL2Nvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJy
YXkmKSksCisgICAgLy8gIFNMT1QoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSkp
OworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0KEtJTzo6Sm9iICopKSwKKyAgICAgICAg
ICAgIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkpOworICAgIG1fc3RhdGUgPSBGRV9BRERU
QUc7CisgICAgbV9qb2IgPSBqb2I7CisgICAgbV9idWZmZXIucmVzaXplKDApOworICAgIGVtaXQg
c2lnbmFsQnVzeSh0cnVlKTsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6Omxpc3RQaG90b3Mo
Y29uc3QgUVN0cmluZyYgYWxidW1OYW1lKQoreworICAgIFFTdHJpbmcgdGVtcCA9IGFsYnVtTmFt
ZTsvL2p1c3QgZm9yIGF2b2lkaW5nIHdhcm5pbmcuCisgICAgLy9UbyBiZSBpbXBsZW1lbnRlZAor
fQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6Y3JlYXRlQWxidW0oCisgICAgY29uc3QgUVN0cmlu
ZyYgYWxidW1UaXRsZSwKKyAgICBjb25zdCBRU3RyaW5nJiBhbGJ1bURlc2MsCisgICAgY29uc3Qg
UVN0cmluZyYgbG9jYXRpb24sCisgICAgdWludCAgdGltZXN0YW1wLAorICAgIGNvbnN0IFFTdHJp
bmcmIGFjY2VzcywKKyAgICBjb25zdCBRU3RyaW5nJiBtZWRpYV9rZXl3b3JkcywKKyAgICBib29s
IGlzQ29tbWVudHNFbmFibGVkKQoreworICAgIGlmIChtX2pvYikKKyAgICB7CisgICAgICAgIG1f
am9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisKKyAgICBRU3RyaW5nIG5l
d0FsYnVtWE1MID0gUVN0cmluZygiPGVudHJ5IHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDA1
L0F0b20nICIKKworICAgICAgICAgICAgInhtbG5zOm1lZGlhPSdodHRwOi8vc2VhcmNoLnlhaG9v
LmNvbS9tcnNzLycgIgorICAgICAgICAgICAgInhtbG5zOmdwaG90bz0naHR0cDovL3NjaGVtYXMu
Z29vZ2xlLmNvbS9waG90b3MvMjAwNyc+ICIKKyAgICAgICAgICAgICI8dGl0bGUgdHlwZT0ndGV4
dCc+JTE8L3RpdGxlPiAiCisgICAgICAgICAgICAiPHN1bW1hcnkgdHlwZT0ndGV4dCc+JTI8L3N1
bW1hcnk+ICIKKyAgICAgICAgICAgICI8Z3Bob3RvOmxvY2F0aW9uPiUzPC9ncGhvdG86bG9jYXRp
b24+ICIKKyAgICAgICAgICAgICI8Z3Bob3RvOmFjY2Vzcz4lNDwvZ3Bob3RvOmFjY2Vzcz4gIgor
ICAgICAgICAgICAgIjxncGhvdG86Y29tbWVudGluZ0VuYWJsZWQ+JTU8L2dwaG90bzpjb21tZW50
aW5nRW5hYmxlZD4gIgorICAgICAgICAgICAgIjxncGhvdG86dGltZXN0YW1wPiU2PC9ncGhvdG86
dGltZXN0YW1wPiAiCisgICAgICAgICAgICAiPG1lZGlhOmdyb3VwPiAiCisgICAgICAgICAgICAi
PG1lZGlhOmtleXdvcmRzPiU3PC9tZWRpYTprZXl3b3Jkcz4gIgorICAgICAgICAgICAgIjwvbWVk
aWE6Z3JvdXA+ICIKKyAgICAgICAgICAgICI8Y2F0ZWdvcnkgc2NoZW1lPSdodHRwOi8vc2NoZW1h
cy5nb29nbGUuY29tL2cvMjAwNSNraW5kJyAiCisgICAgICAgICAgICAidGVybT0naHR0cDovL3Nj
aGVtYXMuZ29vZ2xlLmNvbS9waG90b3MvMjAwNyNhbGJ1bSc+PC9jYXRlZ29yeT4gIgorICAgICAg
ICAgICAgIjwvZW50cnk+ICIpLmFyZyhhbGJ1bVRpdGxlKQorICAgICAgICAgICAgLmFyZyhhbGJ1
bURlc2MpCisgICAgICAgICAgICAuYXJnKGxvY2F0aW9uKQorICAgICAgICAgICAgLmFyZyhhY2Nl
c3MpCisgICAgICAgICAgICAuYXJnKGlzQ29tbWVudHNFbmFibGVkID09IHRydWUgPyAidHJ1ZSIg
OiAiZmFsc2UiKQorICAgICAgICAgICAgLmFyZyh0aW1lc3RhbXApCisgICAgICAgICAgICAuYXJn
KG1lZGlhX2tleXdvcmRzKTsKKworICAgIFFCeXRlQXJyYXkgYnVmZmVyOworICAgIFFUZXh0U3Ry
ZWFtIHRzKGJ1ZmZlciwgSU9fQXBwZW5kIHwgSU9fV3JpdGVPbmx5KTsKKyAgICB0cy5zZXRFbmNv
ZGluZyhRVGV4dFN0cmVhbTo6VW5pY29kZVVURjgpOworICAgIHRzIDw8IG5ld0FsYnVtWE1MOwor
CisgICAgTVBGb3JtIGZvcm07CisgICAgUVN0cmluZyBwb3N0VXJsID0gImh0dHA6Ly93d3cucGlj
YXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91c2VyLyIgKyBtX3VzZXJuYW1lIDsKKyAg
ICBRU3RyaW5nIGF1dGhfc3RyaW5nID0gIkdvb2dsZUxvZ2luIGF1dGg9IiArIG1fdG9rZW47Cisg
ICAgS0lPOjpUcmFuc2ZlckpvYiogam9iID0gS0lPOjpodHRwX3Bvc3QocG9zdFVybCwgYnVmZmVy
LCBmYWxzZSk7CisgICAgam9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgIkNvbnRlbnQt
VHlwZTogYXBwbGljYXRpb24vYXRvbSt4bWwiKTsKKyAgICBqb2ItPmFkZE1ldGFEYXRhKCJjb250
ZW50LWxlbmd0aCIsIFFTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoOiAlMSIpLmFyZyhuZXdBbGJ1bVhN
TC5sZW5ndGgoKSkpOworICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAi
QXV0aG9yaXphdGlvbjogIiArIGF1dGhfc3RyaW5nKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdO
QUwoZGF0YShLSU86OkpvYiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9U
KGRhdGEoS0lPOjpKb2IqLCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKyAgICBjb25uZWN0KGpvYiwg
U0lHTkFMKHJlc3VsdChLSU86OkpvYiAqKSksCisgICAgICAgICAgICBTTE9UKHNsb3RSZXN1bHQo
S0lPOjpKb2IgKikpKTsKKworICAgIG1fc3RhdGUgPSBGRV9DUkVBVEVBTEJVTTsKKyAgICBtX2pv
YiAgID0gam9iOworICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKyAgICBlbWl0IHNpZ25hbEJ1c3ko
dHJ1ZSk7Cit9CisKK2Jvb2wgUGljYXNhd2ViVGFsa2VyOjphZGRQaG90byhjb25zdCBRU3RyaW5n
JiBwaG90b1BhdGgsCisgICAgICAgIEZQaG90b0luZm8mIGluZm8sIGNvbnN0IFFTdHJpbmcmIGFs
YnVtTmFtZSwKKyAgICAgICAgYm9vbCAgcmVzY2FsZSwgaW50IG1heERpbSwgaW50IGltYWdlUXVh
bGl0eSkKK3sKKyAgICAvLyBEaXNhYmxpbmcgdGhpcyB0b3RhbGx5IG1heSBiZSBjaGVja2luZyB0
aGUgbV9zdGF0ZSBhbmQgZG9pbmcgc2VsZWN0aW5nCisgICAgLy8gZGlzYWJsaW5nIGlzIGEgYmV0
dGVyIGlkZWEKKyAgICAvKmlmIChtX2pvYikKKyAgICB7CisgICAgIG1fam9iLT5raWxsKCk7Cisg
ICAgIG1fam9iID0gMDsKKyAgICB9Ki8KKyAgICBRU3RyaW5nIGFsYnVtX25hbWUgPSBhbGJ1bU5h
bWU7CisKKyAgICBpZiAoYWxidW1fbmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICBhbGJ1bV9u
YW1lID0gInRlc3QiOworCisgICAgUVN0cmluZyBwb3N0VXJsID0gImh0dHA6Ly93d3cucGljYXNh
d2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS91c2VyLyIgKyBtX3VzZXJuYW1lICsgIi9hbGJ1
bS8iICsgYWxidW1fbmFtZTsKKworICAgIFFTdHJpbmcgcGF0aCA9IHBob3RvUGF0aDsKKworICAg
IFFTdHJpbmdMaXN0IGhlYWRlcnM7CisKKyAgICBNUEZvcm0gZm9ybTsKKworICAgIFFTdHJpbmcg
YXV0aF9zdHJpbmcgPSAiR29vZ2xlTG9naW4gYXV0aD0iICsgbV90b2tlbjsKKworICAgIC8vZm9y
bS5hZGRQYWlyKCJBdXRob3JpemF0aW9uIiwgYXV0aF9zdHJpbmcpOworCisgICAgLy9DcmVhdGUg
dGhlIEJvZHkgaW4gYXRvbS14bWwKKyAgICBRU3RyaW5nTGlzdCBib2R5X3htbDsKKworICAgIGJv
ZHlfeG1sLmFwcGVuZCgiPGVudHJ5IHhtbG5zPVwnaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9t
XCc+Iik7CisKKyAgICBib2R5X3htbC5hcHBlbmQoIjx0aXRsZT4iICsgaW5mby50aXRsZSArICI8
L3RpdGxlPiIpOworCisgICAgYm9keV94bWwuYXBwZW5kKCI8c3VtbWFyeT4iICsgaW5mby5kZXNj
cmlwdGlvbiArICI8L3N1bW1hcnk+Iik7CisKKyAgICBib2R5X3htbC5hcHBlbmQoIjxjYXRlZ29y
eSBzY2hlbWU9XCJodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL2cvMjAwNSNraW5kXCIgIgorICAg
ICAgICAgICAgInRlcm09XCJodHRwOi8vc2NoZW1hcy5nb29nbGUuY29tL3Bob3Rvcy8yMDA3I3Bo
b3RvXCIgLz4iKTsKKworICAgIGJvZHlfeG1sLmFwcGVuZCgiPC9lbnRyeT4iKTsKKworICAgIFFT
dHJpbmcgYm9keSA9IGJvZHlfeG1sLmpvaW4oIiIpOworCisgICAgZm9ybS5hZGRQYWlyKCJ0ZXN0
IiwgYm9keSwgImFwcGxpY2F0aW9uL2F0b20reG1sIik7CisKKyAgICAvLyBzYXZlIHRoZSB0YWdz
IGZvciB0aGlzIHBob3RvIGluIHRvIHRoZSB0YWdzIGhhc2htYXAKKyAgICB0YWdzX21hcC5pbnNl
cnQoaW5mby50aXRsZSwgaW5mby50YWdzKTsKKworICAgIFFJbWFnZSBpbWFnZShwaG90b1BhdGgp
OworCisgICAgaWYgKCFpbWFnZS5pc051bGwoKSkKKyAgICB7CisgICAgICAgIC8vIGltYWdlIGZp
bGUgLSBzZWUgaWYgd2UgbmVlZCB0byByZXNjYWxlIGl0CisgICAgICAgIGlmIChyZXNjYWxlICYm
IChpbWFnZS53aWR0aCgpID4gbWF4RGltIHx8IGltYWdlLmhlaWdodCgpID4gbWF4RGltKSkKKyAg
ICAgICAgeworICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5zbW9vdGhTY2FsZShtYXhEaW0sIG1h
eERpbSwgUUltYWdlOjpTY2FsZU1pbik7CisgICAgICAgICAgICBwYXRoID0gbG9jYXRlTG9jYWwo
InRtcCIsIEtVUkwocGhvdG9QYXRoKS5maWxlbmFtZSgpKTsKKyAgICAgICAgICAgIGltYWdlLnNh
dmUocGF0aCwgUUltYWdlSU86OmltYWdlRm9ybWF0KHBob3RvUGF0aCksIGltYWdlUXVhbGl0eSk7
CisgICAgICAgICAgICAvL2lmIHRoZSBpbWFnZSBpcyBKUEVHOgorICAgICAgICAgICAgLy9UaGlz
IHJlc2l6aW5nIGNvZGUgY29tZXMgbW9zdGx5IGFzIGl0IGlzIGZyb20gc2VuZGltYWdlcGx1Z2lu
CisKKyAgICAgICAgICAgIGlmIChRU3RyaW5nKFFJbWFnZUlPOjppbWFnZUZvcm1hdChwaG90b1Bh
dGgpKS51cHBlcigpID09ICJKUEVHIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBF
eGlmUmVzdG9yZXIgZXhpZkhvbGRlcjsKKyAgICAgICAgICAgICAgICBleGlmSG9sZGVyLnJlYWRG
aWxlKHBob3RvUGF0aCwgRXhpZlJlc3RvcmVyOjpFeGlmT25seSk7CisKKyAgICAgICAgICAgICAg
ICBpZiAoZXhpZkhvbGRlci5oYXNFeGlmKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgICAgICBFeGlmUmVzdG9yZXIgcmVzdG9yZXI7CisgICAgICAgICAgICAgICAgICAgIHJl
c3RvcmVyLnJlYWRGaWxlKHBhdGgsIEV4aWZSZXN0b3Jlcjo6RW50aXJlSW1hZ2UpOworICAgICAg
ICAgICAgICAgICAgICByZXN0b3Jlci5pbnNlcnRFeGlmRGF0YShleGlmSG9sZGVyLmV4aWZEYXRh
KCkpOworICAgICAgICAgICAgICAgICAgICByZXN0b3Jlci53cml0ZUZpbGUocGF0aCk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
a2RXYXJuaW5nKDUxMDAwKSA8PCAiKHBpY2FzYXdlYkV4cG9ydDo6SW1hZ2UgZG9lc24ndCBoYXZl
IGV4aWYgZGF0YSkiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtkRGVi
dWcoKSA8PCAiUmVzaXppbmcgYW5kIHNhdmluZyB0byB0ZW1wIGZpbGU6ICIgPDwgcGF0aCA8PCBl
bmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3JtLmFkZEZpbGUoInBob3RvIiwg
cGF0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvcm0uZmluaXNoKCk7CisKKyAg
ICBLSU86OlRyYW5zZmVySm9iKiBqb2IgPSBLSU86Omh0dHBfcG9zdChwb3N0VXJsLCBmb3JtLmZv
cm1EYXRhKCksIGZhbHNlKTsKKworICAgIEtJTzo6Sm9iICpqb2Jfb2JqID0gam9iOworCisgICAg
am9iLT5hZGRNZXRhRGF0YSgiY29udGVudC10eXBlIiwgZm9ybS5jb250ZW50VHlwZSgpKTsKKwor
ICAgIGpvYi0+YWRkTWV0YURhdGEoImN1c3RvbUhUVFBIZWFkZXIiLCAiQXV0aG9yaXphdGlvbjog
IiArIGF1dGhfc3RyaW5nKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwoZGF0YShLSU86Okpv
YiosIGNvbnN0IFFCeXRlQXJyYXkmKSksCisgICAgICAgICAgICBTTE9UKGRhdGEoS0lPOjpKb2Iq
LCBjb25zdCBRQnl0ZUFycmF5JikpKTsKKworICAgIGNvbm5lY3Qoam9iLCBTSUdOQUwocmVzdWx0
KEtJTzo6Sm9iICopKSwKKyAgICAgICAgICAgIFNMT1Qoc2xvdFJlc3VsdChLSU86OkpvYiAqKSkp
OworCisgICAgbV9zdGF0ZSA9IEZFX0FERFBIT1RPOworCisgICAgbV9qb2IgICA9IGpvYjsKKwor
ICAgIG1fYnVmZmVyLnJlc2l6ZSgwKTsKKworICAgIGVtaXQgc2lnbmFsQnVzeSh0cnVlKTsKKwor
ICAgIHJldHVybiB0cnVlOworfQorCitRU3RyaW5nIFBpY2FzYXdlYlRhbGtlcjo6Z2V0VXNlck5h
bWUoKQoreworICAgIHJldHVybiBtX3VzZXJuYW1lOworfQorCitRU3RyaW5nIFBpY2FzYXdlYlRh
bGtlcjo6Z2V0VXNlcklkKCkKK3sKKyAgICByZXR1cm4gbV91c2VySWQ7Cit9CisKK3ZvaWQgUGlj
YXNhd2ViVGFsa2VyOjpjYW5jZWwoKQoreworICAgIGlmIChtX2pvYikKKyAgICB7CisgICAgICAg
IG1fam9iLT5raWxsKCk7CisgICAgICAgIG1fam9iID0gMDsKKyAgICB9CisKKyAgICBpZiAoYXV0
aFByb2dyZXNzRGxnICYmICFhdXRoUHJvZ3Jlc3NEbGctPmlzSGlkZGVuKCkpCisgICAgICAgIGF1
dGhQcm9ncmVzc0RsZy0+aGlkZSgpOworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6aW5mbyhL
SU86OkpvYiogam9iLCBjb25zdCBRU3RyaW5nJiBzdHIpCit7Cit9CisKK3ZvaWQgUGljYXNhd2Vi
VGFsa2VyOjpkYXRhKEtJTzo6Sm9iKiwgY29uc3QgUUJ5dGVBcnJheSYgZGF0YSkKK3sKKyAgICBp
ZiAoZGF0YS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBvbGRTaXplID0g
bV9idWZmZXIuc2l6ZSgpOworCisgICAgbV9idWZmZXIucmVzaXplKG1fYnVmZmVyLnNpemUoKSAr
IGRhdGEuc2l6ZSgpKTsKKworICAgIFFTdHJpbmcgb3V0cHV0X2RhdGEgPSBRU3RyaW5nKGRhdGEp
OworCisgICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG9sZFNpemUsIGRhdGEuZGF0YSgpLCBk
YXRhLnNpemUoKSk7Cit9CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpzbG90RXJyb3IoY29uc3Qg
UVN0cmluZyAmIGVycm9yKQoreworICAgIFFTdHJpbmcgdHJhbnNFcnJvcjsKKyAgICBpbnQgZXJy
b3JObyA9IDA7CisKKyAgICBpZiAoIWVycm9yLmlzRW1wdHkoKSkKKyAgICAgICAgZXJyb3JObyA9
IGF0b2koZXJyb3IubGF0aW4xKCkpOworCisgICAgc3dpdGNoIChlcnJvck5vKQorICAgIHsKKwor
ICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTm8gcGhvdG8g
c3BlY2lmaWVkIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAg
ICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiR2VuZXJhbCB1cGxvYWQgZmFpbHVyZSIpOworICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdHJhbnNFcnJv
ciA9IGkxOG4oIkZpbGVzaXplIHdhcyB6ZXJvIik7CisgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICBjYXNlIDU6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiRmlsZXR5cGUgd2Fz
IG5vdCByZWNvZ25pc2VkIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDY6
CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiVXNlciBleGNlZWRlZCB1cGxvYWQgbGlt
aXQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAg
ICB0cmFuc0Vycm9yID0gaTE4bigiSW52YWxpZCBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGNhc2UgOTc6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigi
TWlzc2luZyBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ug
OTg6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiTG9naW4gRmFpbGVkIC8gSW52YWxp
ZCBhdXRoIHRva2VuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEwMDoK
KyAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThuKCJJbnZhbGlkIEFQSSBLZXkiKTsKKyAgICAg
ICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTA1OgorICAgICAgICAgICAgdHJhbnNFcnJv
ciA9IGkxOG4oIlNlcnZpY2UgY3VycmVudGx5IHVuYXZhaWxhYmxlIik7CisgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICBjYXNlIDEwODoKKyAgICAgICAgICAgIHRyYW5zRXJyb3IgPSBpMThu
KCJJbnZhbGlkIEZyb2IiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTEx
OgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkZvcm1hdCBcInh4eFwiIG5vdCBmb3Vu
ZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMTI6CisgICAgICAgICAg
ICB0cmFuc0Vycm9yID0gaTE4bigiTWV0aG9kIFwieHh4XCIgbm90IGZvdW5kIik7CisgICAgICAg
ICAgICBicmVhazsKKworICAgICAgICBjYXNlIDExNDoKKyAgICAgICAgICAgIHRyYW5zRXJyb3Ig
PSBpMThuKCJJbnZhbGlkIFNPQVAgZW52ZWxvcGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIGNhc2UgMTE1OgorICAgICAgICAgICAgdHJhbnNFcnJvciA9IGkxOG4oIkludmFsaWQg
WE1MLVJQQyBNZXRob2QgQ2FsbCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2Fz
ZSAxMTY6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiVGhlIFBPU1QgbWV0aG9kIGlz
IG5vdyByZXF1aXJlZCBmb3IgYWxsIHNldHRlcnMiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0cmFuc0Vycm9yID0gaTE4bigiVW5rbm93biBl
cnJvciIpOworICAgIH07CisKKyAgICBLTWVzc2FnZUJveDo6ZXJyb3IoMCwgaTE4bigiRXJyb3Ig
T2NjdXJlZDogJTFcbiBXZSBjYW4gbm90IHByb2NlZWQgZnVydGhlciIpLmFyZyh0cmFuc0Vycm9y
KSk7CisKKyAgICAvL2tkRGVidWcoKTw8Ik5vdCBoYW5kbGluZyB0aGUgZXJyb3Igbm93IHdpbGwg
c2VlIGl0IGxhdGVyIjw8ZW5kbDsKK30KKwordm9pZCBQaWNhc2F3ZWJUYWxrZXI6OnNsb3RSZXN1
bHQoS0lPOjpKb2IgKmpvYikKK3sKKworICAgIG1fam9iID0gMDsKKyAgICBlbWl0IHNpZ25hbEJ1
c3koZmFsc2UpOworCisgICAgaWYgKGpvYi0+ZXJyb3IoKSkKKyAgICB7CisgICAgICAgIGlmICht
X3N0YXRlID09IEZFX0FERFBIT1RPKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0IHNpZ25h
bEFkZFBob3RvRmFpbGVkKGpvYi0+ZXJyb3JTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAg
ZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBqb2ItPnNob3dFcnJvckRpYWxvZyhtX3BhcmVu
dCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoICht
X3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZShGRV9MT0dJTik6CisgICAgICAgICAgICAgICAg
ICAgICAgICAvL3BhcnNlUmVzcG9uc2VMb2dpbihtX2J1ZmZlcik7CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShGRV9DUkVBVEVBTEJVTSk6CisgICAgICAgICAg
ICAgICAgICAgICAgICBwYXJzZVJlc3BvbnNlQ3JlYXRlQWxidW0obV9idWZmZXIpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UoRkVfTElTVEFMQlVNUyk6CisgICAgICAgICAgICAg
ICAgICAgICAgICBwYXJzZVJlc3BvbnNlTGlzdEFsYnVtcyhtX2J1ZmZlcik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZShGRV9HRVRGUk9CKToKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlKEZFX0dFVFRPS0VOKToKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHBhcnNlUmVzcG9uc2VHZXRUb2tlbihtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZShGRV9DSEVDS1RPS0VOKToKKyAgICAgICAgICAgICAgICAgICAgICAg
IHBhcnNlUmVzcG9uc2VDaGVja1Rva2VuKG1fYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlKEZFX0dFVEFVVEhPUklaRUQpOgorICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UoRkVfTElTVFBIT1RPUyk6CisgICAgICAgICAgICAgICAgICAg
ICAgICBwYXJzZVJlc3BvbnNlTGlzdFBob3RvcyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZShGRV9HRVRQSE9UT1BST1BFUlRZKToKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KG1fYnVmZmVyKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlKEZFX0FERFBIT1RPKToKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHBhcnNlUmVzcG9uc2VBZGRQaG90byhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZShGRV9BRERUQUcpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VS
ZXNwb25zZUFkZFRhZyhtX2J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisK
K3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlQ2hlY2tUb2tlbihjb25zdCBRQnl0
ZUFycmF5ICZkYXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFTdHJpbmcg
ZXJyb3JTdHJpbmc7CisgICAgUVN0cmluZyB1c2VybmFtZTsKKyAgICBRU3RyaW5nIHRyYW5zUmV0
dXJuKGRhdGEpOworICAgIC8vIElmIGNoZWNrdG9rZW4gZmFpbGVkLgorICAgIC8vIGdldFRva2Vu
IC4uLgorCisgICAgaWYgKHRyYW5zUmV0dXJuLnN0YXJ0c1dpdGgoIkVycm9yPSIpKQorICAgICAg
ICBzdWNjZXNzID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKwor
ICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ2V0VG9rZW4obV91c2VybmFtZSwgbV9wYXNzd29y
ZCk7CisKKyAgICAvL2VtaXQgc2lnbmFsRXJyb3IoZXJyb3JTdHJpbmcpOworfQorCit2b2lkIFBp
Y2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUdldFRva2VuKGNvbnN0IFFCeXRlQXJyYXkgJmRh
dGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmluZyBlcnJvclN0cmlu
ZzsKKyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICAvL0NoZWNrIHRoZSByZXNwb25zZSBjb2Rl
IHNob3VsZCBpdCBiZSAyMDAsIHByb2NlZWQKKyAgICAvL2lmIGl0IGlzIDQwMyBoYW5kbGUgdGhl
IGVycm9yIG1lc2cKKyAgICAvL2ZpZ3VyZSBvdXQgdGhlIGF1dGggc3RyaW5nIGZyb20gdGhpcyBy
ZXNwb25zZQorCisgICAgaWYgKHN0ci5maW5kKCJBdXRoPSIpKQorICAgIHsKKyAgICAgICAgUVN0
cmluZ0xpc3Qgc3RyTGlzdCA9IFFTdHJpbmdMaXN0OjpzcGxpdCgiQXV0aD0iLCBzdHIpOworICAg
ICAgICBtX3Rva2VuID0gc3RyTGlzdFsxXTsKKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgfQor
CisgICAgLy9saXN0QWxidW1zKCk7CisgICAgaWYgKHN1Y2Nlc3MpCisgICAgeworICAgICAgICBh
dXRoUHJvZ3Jlc3NEbGctPmhpZGUoKTsKKyAgICAgICAgZW1pdCBzaWduYWxUb2tlbk9idGFpbmVk
KG1fdG9rZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGVtaXQgc2lnbmFsRXJyb3IoZXJy
b3JTdHJpbmcpOworCisgICAgZW1pdCBzaWduYWxCdXN5KGZhbHNlKTsKK30KKwordm9pZCBQaWNh
c2F3ZWJUYWxrZXI6OmdldEhUTUxSZXNwb25zZUNvZGUoY29uc3QgUVN0cmluZyYgc3RyKQorewor
fQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUxpc3RBbGJ1bXMoY29uc3Qg
UUJ5dGVBcnJheSAmZGF0YSkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBRU3Ry
aW5nIHN0cihkYXRhKTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJmZWVkIik7CisKKyAgICBpZiAo
IWRvYy5zZXRDb250ZW50KGRhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBR
RG9tTm9kZSBub2RlID0gZG9jRWxlbS5maXJzdENoaWxkKCk7CisgICAgUURvbUVsZW1lbnQgZTsK
KyAgICBRU3RyaW5nIGZlZWRfaWQsIGZlZWRfdXBkYXRlZCwgZmVlZF90aXRsZSwgZmVlZF9zdWJ0
aXRsZTsKKyAgICBRU3RyaW5nIGZlZWRfaWNvbl91cmwsIGZlZWRfbGlua191cmw7CisgICAgUVN0
cmluZyBmZWVkX3VzZXJuYW1lLCBmZWVkX3VzZXJfdXJpOworCisgICAgUVN0cmluZyBhbGJ1bV9p
ZCwgYWxidW1fdGl0bGUsIGFsYnVtX2Rlc2NyaXB0aW9uOworICAgIG1fYWxidW1zTGlzdCA9IG5l
dyBRVmFsdWVMaXN0IDxQaWNhc2FXZWJBbGJ1bT4oKTsKKworICAgIHdoaWxlICghbm9kZS5pc051
bGwoKSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLmlzRWxlbWVudCgpICYmIG5vZGUubm9kZU5h
bWUoKSA9PSAiZW50cnkiKQorICAgICAgICB7CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsK
KyAgICAgICAgICAgIGUgPSBub2RlLnRvRWxlbWVudCgpOworICAgICAgICAgICAgUURvbU5vZGUg
ZGV0YWlscyA9IGUuZmlyc3RDaGlsZCgpOworICAgICAgICAgICAgUGljYXNhV2ViQWxidW0gZnBz
OworICAgICAgICAgICAgUURvbU5vZGUgZGV0YWlsc05vZGUgPSBkZXRhaWxzOworCisgICAgICAg
ICAgICB3aGlsZSAoIWRldGFpbHNOb2RlLmlzTnVsbCgpKQorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIGlmIChkZXRhaWxzTm9kZS5pc0VsZW1lbnQoKSkKKyAgICAgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzTm9kZS5ub2RlTmFtZSgpID09ICJpZCIp
CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX2lk
ID0gZGV0YWlsc05vZGUudG9FbGVtZW50KCkudGV4dCgpOworICAgICAgICAgICAgICAgICAgICAg
ICAgLy90aGlzIGlzIHdoYXQgaXMgb2J0YWluZWQgZnJvbSBkYXRhLgorICAgICAgICAgICAgICAg
ICAgICAgICAgZnBzLmlkID0gYWxidW1faWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc05vZGUubm9kZU5hbWUoKSA9PSAidGl0bGUiKQor
ICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV90aXRs
ZSA9ICJOb3QgZmV0Y2hlZCI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxz
Tm9kZS50b0VsZW1lbnQoKS5hdHRyaWJ1dGUoInR5cGUiKSA9PSAidGV4dCIpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYWxidW1fdGl0bGUgPSBkZXRhaWxzTm9kZS50b0VsZW1lbnQoKS50
ZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyB3aGF0IGlzIG9idGFp
bmVkIGZyb20gZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcy50aXRsZSA9IGFsYnVt
X3RpdGxlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KGRldGFpbHNOb2RlLm5vZGVOYW1lKCkgPT0gImdwaG90bzpuYW1lIikKKyAgICAgICAgICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBuYW1lID0gZGV0YWlsc05v
ZGUudG9FbGVtZW50KCkudGV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgZGV0YWlsc05vZGUgPSBkZXRhaWxzTm9kZS5uZXh0
U2libGluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2FsYnVtc0xpc3QtPmFw
cGVuZChmcHMpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmco
KTsKKyAgICB9CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgeworICAgICAgICBlbWl0IHNpZ25h
bEdldEFsYnVtc0xpc3RGYWlsZWQoaTE4bigiRmFpbGVkIHRvIGZldGNoIHBob3RvU2V0cyBMaXN0
IikpOworICAgICAgICBtX2FsYnVtc0xpc3QgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAg
eworICAgICAgICBlbWl0IHNpZ25hbEdldEFsYnVtc0xpc3RTdWNjZWVkZWQoKTsKKyAgICB9Cit9
CisKK3ZvaWQgUGljYXNhd2ViVGFsa2VyOjpwYXJzZVJlc3BvbnNlTGlzdFBob3Rvcyhjb25zdCBR
Qnl0ZUFycmF5ICZkYXRhKQoreworICAgIFFEb21Eb2N1bWVudCBkb2MoImdldFBob3Rvc0xpc3Qi
KTsKKworICAgIGlmICghZG9jLnNldENvbnRlbnQoZGF0YSkpCisgICAgeworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgUURvbUVsZW1lbnQgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1l
bnQoKTsKKworICAgIFFEb21Ob2RlIG5vZGUgPSBkb2NFbGVtLmZpcnN0Q2hpbGQoKTsKKyAgICAv
L1FEb21FbGVtZW50IGU7CisgICAgLy9UbyBiZSBpbXBsZW1lbnRlZC4KK30KKwordm9pZCBQaWNh
c2F3ZWJUYWxrZXI6OnBhcnNlUmVzcG9uc2VDcmVhdGVBbGJ1bShjb25zdCBRQnl0ZUFycmF5ICZk
YXRhKQoreworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFFTdHJpbmcgZXJyb3JTdHJp
bmc7CisgICAgUVN0cmluZyByZXNwb25zZShkYXRhKTsKKyAgICBRRG9tRG9jdW1lbnQgZG9jKCJB
ZGRQaG90byBSZXNwb25zZSIpOworICAgIC8vIHBhcnNlIHRoZSBuZXcgYWxidW0gbmFtZQorICAg
IFFEb21FbGVtZW50IGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50KCk7CisgICAgUVN0cmlu
ZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsKKyAgICBRRG9tTm9kZSBub2Rl
ID0gZG9jRWxlbS5maXJzdENoaWxkKCk7IC8vdGhpcyBzaG91bGQgbWVhbiA8ZW50cnk+CisgICAg
UURvbUVsZW1lbnQgZTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwoKSkKKyAgICB7CisgICAg
ICAgIGlmIChub2RlLmlzRWxlbWVudCgpKQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5n
IG5vZGVfbmFtZSA9IG5vZGUubm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFFTdHJpbmcgbm9kZV92
YWx1ZSA9IG5vZGUudG9FbGVtZW50KCkudGV4dCgpOworCisgICAgICAgICAgICBpZiAobm9kZV9u
YW1lID09ICJ0aXRsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9
IHRydWU7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCisgICAgICAgICAgICAg
ICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1l
ID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgIHBob3RvX2lkID0gbm9kZV92YWx1ZTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmFsYnVtaWQiKQorICAg
ICAgICAgICAgICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgLy8gUmFpc2UgYSBwb3B1
cCBpbmZvcm1pbmcgc3VjY2VzcworfQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNw
b25zZUFkZFRhZyhjb25zdCBRQnl0ZUFycmF5ICZkYXRhKQoreworICAgIFFTdHJpbmcgc3RyKGRh
dGEpOworICAgIHJlbWFpbmluZ190YWdzX2NvdW50IC09IDE7CisgICAgZW1pdCBzaWduYWxCdXN5
KGZhbHNlKTsKKyAgICBtX2J1ZmZlci5yZXNpemUoMCk7CisKKyAgICBpZiAocmVtYWluaW5nX3Rh
Z3NfY291bnQgPT0gMCkKKyAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b1N1Y2NlZWRlZCgpOwor
fQorCit2b2lkIFBpY2FzYXdlYlRhbGtlcjo6cGFyc2VSZXNwb25zZUFkZFBob3RvKGNvbnN0IFFC
eXRlQXJyYXkgJmRhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmlu
ZyAgICAgbGluZTsKKyAgICBRU3RyaW5nIHN0cihkYXRhKTsKKyAgICBzdWNjZXNzID0gMTsKKyAg
ICBRRG9tRG9jdW1lbnQgZG9jKCJBZGRQaG90byBSZXNwb25zZSIpOworCisgICAgaWYgKCFkb2Mu
c2V0Q29udGVudChkYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBR
RG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOworCisgICAgUVN0cmlu
ZyB0aXRsZSwgcGhvdG9faWQsIGFsYnVtX2lkLCBwaG90b1VSSTsKKyAgICBRRG9tTm9kZSBub2Rl
ID0gZG9jRWxlbS5maXJzdENoaWxkKCk7IC8vdGhpcyBzaG91bGQgbWVhbiA8ZW50cnk+CisgICAg
UURvbUVsZW1lbnQgZTsKKworICAgIHdoaWxlICghbm9kZS5pc051bGwoKSkKKyAgICB7CisgICAg
ICAgIGlmIChub2RlLmlzRWxlbWVudCgpKQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5n
IG5vZGVfbmFtZSA9IG5vZGUubm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFFTdHJpbmcgbm9kZV92
YWx1ZSA9IG5vZGUudG9FbGVtZW50KCkudGV4dCgpOworCisgICAgICAgICAgICBpZiAobm9kZV9u
YW1lID09ICJ0aXRsZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9
IHRydWU7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1lID09ICJpZCIpCisgICAgICAgICAgICAg
ICAgcGhvdG9VUkkgPSBub2RlX3ZhbHVlOworICAgICAgICAgICAgZWxzZSBpZiAobm9kZV9uYW1l
ID09ICJncGhvdG86aWQiKQorICAgICAgICAgICAgICAgIHBob3RvX2lkID0gbm9kZV92YWx1ZTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVfbmFtZSA9PSAiZ3Bob3RvOmFsYnVtaWQiKQorICAg
ICAgICAgICAgICAgIGFsYnVtX2lkID0gbm9kZV92YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgaWYgKCFzdWNjZXNzKQor
ICAgIHsKKyAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8g
dXBsb2FkIHBob3RvIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBVcGRh
dGUgdGhlIHRhZ3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGFnc19tYXAKKyAgICAgICAgUVN0cmlu
Z0xpc3QgdGFncyA9IHRhZ3NfbWFwW3RpdGxlXTsKKyAgICAgICAgcmVtYWluaW5nX3RhZ3NfY291
bnQgPSB0YWdzLmNvdW50KCk7CisKKyAgICAgICAgaWYgKHRhZ3MuY291bnQoKSA9PSAwKQorICAg
ICAgICAgICAgZW1pdCBzaWduYWxBZGRQaG90b1N1Y2NlZWRlZCgpOworCisgICAgICAgIGZvciAo
UVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpOyBpdCAhPSB0YWdzLmVuZCgp
OyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5nIHBob3RvVVJJID0gUVN0cmlu
ZygiaHR0cDovL3BpY2FzYXdlYi5nb29nbGUuY29tL2RhdGEvZmVlZC9hcGkvdXNlci8iCisgICAg
ICAgICAgICAgICAgICAgICIlMS9hbGJ1bWlkLyUyL3Bob3RvaWQvJTMiKS5hcmcobV91c2VybmFt
ZSkuYXJnKGFsYnVtX2lkKS5hcmcocGhvdG9faWQpOworICAgICAgICAgICAgYWRkUGhvdG9UYWco
cGhvdG9VUkksICppdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordm9pZCBQaWNhc2F3ZWJU
YWxrZXI6OnBhcnNlUmVzcG9uc2VQaG90b1Byb3BlcnR5KGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEp
Cit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgUVN0cmluZyAgICAgbGluZTsKKyAg
ICBRRG9tRG9jdW1lbnQgZG9jKCJQaG90b3MgUHJvcGVydGllcyIpOworCisgICAgaWYgKCFkb2Mu
c2V0Q29udGVudChkYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBR
RG9tRWxlbWVudCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCgpOworCisgICAgUURvbU5v
ZGUgbm9kZSA9IGRvY0VsZW0uZmlyc3RDaGlsZCgpOworICAgIFFEb21FbGVtZW50IGU7CisKKyAg
ICB3aGlsZSAoIW5vZGUuaXNOdWxsKCkpCisgICAgeworICAgICAgICBpZiAobm9kZS5pc0VsZW1l
bnQoKSAmJiBub2RlLm5vZGVOYW1lKCkgPT0gInBob3RvaWQiKQorICAgICAgICB7CisgICAgICAg
ICAgICBlID0gbm9kZS50b0VsZW1lbnQoKTsgLy8gdHJ5IHRvIGNvbnZlcnQgdGhlIG5vZGUgdG8g
YW4gZWxlbWVudC4KKyAgICAgICAgICAgIFFEb21Ob2RlIGRldGFpbHMgPSBlLmZpcnN0Q2hpbGQo
KTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KG5vZGUuaXNFbGVtZW50KCkgJiYgbm9kZS5ub2RlTmFtZSgpID09ICJlcnIiKQorICAgICAgICB7
CisgICAgICAgICAgICBrZERlYnVnKCkgPDwgIkNoZWNraW5nIEVycm9yIGluIHJlc3BvbnNlIiA8
PCBlbmRsOworICAgICAgICAgICAgUVN0cmluZyBjb2RlID0gbm9kZS50b0VsZW1lbnQoKS5hdHRy
aWJ1dGUoImNvZGUiKTsKKyAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiRXJyb3IgY29kZT0iIDw8
IGNvZGUgPDwgZW5kbDsKKyAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiTXNnPSIgPDwgbm9kZS50
b0VsZW1lbnQoKS5hdHRyaWJ1dGUoIm1zZyIpIDw8IGVuZGw7CisgICAgICAgICAgICBlbWl0IHNp
Z25hbEVycm9yKGNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNp
YmxpbmcoKTsKKyAgICB9CisKKyAgICBrZERlYnVnKCkgPDwgIkdldFRva2VuIGZpbmlzaGVkIiA8
PCBlbmRsOworCisgICAgaWYgKCFzdWNjZXNzKQorICAgIHsKKyAgICAgICAgZW1pdCBzaWduYWxB
ZGRQaG90b0ZhaWxlZChpMThuKCJGYWlsZWQgdG8gcXVlcnkgcGhvdG8gaW5mb3JtYXRpb24iKSk7
CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vZW1pdCBzaWduYWxBZGRQaG90b1N1
Y2NlZWRlZCgpOworICAgIH0KKworfQorfQorCisjaW5jbHVkZSAicGljYXNhd2VidGFsa2VyLm1v
YyIKKwpkaWZmIC1OdXIgcGljYXNhd2ViZXhwb3J0Lm9yaWcvcGljYXNhd2VidGFsa2VyLmggcGlj
YXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRhbGtlci5oCi0tLSBwaWNhc2F3ZWJleHBvcnQub3JpZy9w
aWNhc2F3ZWJ0YWxrZXIuaAkyMDA4LTAyLTE2IDAxOjI5OjQwLjAwMDAwMDAwMCArMTAwMAorKysg
cGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYnRhbGtlci5oCTIwMDgtMDItMTYgMDY6MDA6MjcuMDAw
MDAwMDAwICsxMDAwCkBAIC02NCwyMyArNjQsMjMgQEAKIAogICAgIFFWYWx1ZUxpc3QgPFBpY2Fz
YVdlYkFsYnVtPiAqIG1fYWxidW1zTGlzdDsKICAgICBRU3RyaW5nIGdldEFwaVNpZyhRU3RyaW5n
LFFTdHJpbmdMaXN0KSA7Ci0gICAgdm9pZCBhZGRQaG90b1RhZyhjb25zdCBRU3RyaW5nJiBwaG90
b1VSSSwgY29uc3QgUVN0cmluZyYgdGFnKTsgICAKLSAgICB2b2lkIGdldFRva2VuKGNvbnN0IFFT
dHJpbmcmIHVzZXIsIGNvbnN0IFFTdHJpbmcmIHBhc3N3ZCkgOwkgICAKLSAgICB2b2lkIGNoZWNr
VG9rZW4oY29uc3QgUVN0cmluZyYgdG9rZW4pIDsJICAgCi0gICAgdm9pZCBhdXRoZW50aWNhdGUo
Y29uc3QgUVN0cmluZyYgdG9rZW49TlVMTCwgY29uc3QgUVN0cmluZyYgdXNlcm5hbWU9TlVMTCwg
Y29uc3QgUVN0cmluZyYgcGFzc3dvcmQ9TlVMTCkgOwkgICAKLSAgICB2b2lkIGdldFBob3RvUHJv
cGVydHkoY29uc3QgUVN0cmluZyYgbWV0aG9kLCBjb25zdCBRU3RyaW5nJiBhcmdMaXN0KSA7CSAg
IAotICAgIHZvaWQgZ2V0SFRNTFJlc3BvbnNlQ29kZShjb25zdCBRU3RyaW5nJiBzdHIpOyAgIAor
ICAgIHZvaWQgYWRkUGhvdG9UYWcoY29uc3QgUVN0cmluZyYgcGhvdG9VUkksIGNvbnN0IFFTdHJp
bmcmIHRhZyk7CisgICAgdm9pZCBnZXRUb2tlbihjb25zdCBRU3RyaW5nJiB1c2VyLCBjb25zdCBR
U3RyaW5nJiBwYXNzd2QpIDsKKyAgICB2b2lkIGNoZWNrVG9rZW4oY29uc3QgUVN0cmluZyYgdG9r
ZW4pIDsKKyAgICB2b2lkIGF1dGhlbnRpY2F0ZShjb25zdCBRU3RyaW5nJiB0b2tlbj1OVUxMLCBj
b25zdCBRU3RyaW5nJiB1c2VybmFtZT1OVUxMLCBjb25zdCBRU3RyaW5nJiBwYXNzd29yZD1OVUxM
KSA7CisgICAgdm9pZCBnZXRQaG90b1Byb3BlcnR5KGNvbnN0IFFTdHJpbmcmIG1ldGhvZCwgY29u
c3QgUVN0cmluZyYgYXJnTGlzdCkgOworICAgIHZvaWQgZ2V0SFRNTFJlc3BvbnNlQ29kZShjb25z
dCBRU3RyaW5nJiBzdHIpOwogICAgIHZvaWQgbGlzdEFsYnVtcygpOwogICAgIHZvaWQgbGlzdFBo
b3RvcyggY29uc3QgUVN0cmluZyYgYWxidW1OYW1lICk7CiAgICAgdm9pZCBjcmVhdGVBbGJ1bSgg
Y29uc3QgUVN0cmluZyYgYWxidW1UaXRsZSwgY29uc3QgUVN0cmluZyYgYWxidW1EZXNjLCBjb25z
dCBRU3RyaW5nJiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50IHRpbWVzdGFt
cCwgY29uc3QgUVN0cmluZyYgYWNjZXNzLCBjb25zdCBRU3RyaW5nJiBtZWRpYV9rZXl3b3Jkcywg
Ym9vbCBpc0NvbW1lbnRFbmFibGVkPXRydWUpOworICAgICAgICAgICAgICAgICAgICAgIFFfVUxM
T05HIHRpbWVzdGFtcCwgY29uc3QgUVN0cmluZyYgYWNjZXNzLCBjb25zdCBRU3RyaW5nJiBtZWRp
YV9rZXl3b3JkcywgYm9vbCBpc0NvbW1lbnRFbmFibGVkPXRydWUpOwogICAgIGJvb2wgYWRkUGhv
dG8oIGNvbnN0IFFTdHJpbmcmIHBob3RvUGF0aCwKICAgICAgICAgICAgICAgICAgICBGUGhvdG9J
bmZvJiBpbmZvLCBjb25zdCBRU3RyaW5nJiBhbGJ1bW5hbWUsCiAJCQkgICAgICAgYm9vbCByZXNj
YWxlPWZhbHNlLCBpbnQgbWF4RGltPTYwMCAsIGludCBpbWFnZVF1YWxpdHk9ODUgKTsKIAlRU3Ry
aW5nIGdldFVzZXJOYW1lKCk7CiAJUVN0cmluZyBnZXRVc2VySWQoKTsKICAgICB2b2lkIGNhbmNl
bCgpOwotICAgIAorCiAgICAgUVByb2dyZXNzRGlhbG9nICphdXRoUHJvZ3Jlc3NEbGc7CiBwcml2
YXRlOgogICAgIGludCAgICAgICAgcmVtYWluaW5nX3RhZ3NfY291bnQ7CkBAIC0xMDksNyArMTA5
LDcgQEAKICAgICB2b2lkIHBhcnNlUmVzcG9uc2VHZXRUb2tlbihjb25zdCBRQnl0ZUFycmF5ICZk
YXRhKTsKICAgICB2b2lkIHBhcnNlUmVzcG9uc2VDaGVja1Rva2VuKGNvbnN0IFFCeXRlQXJyYXkg
JmRhdGEpOwogICAgIHZvaWQgcGFyc2VSZXNwb25zZVBob3RvUHJvcGVydHkoY29uc3QgUUJ5dGVB
cnJheSAmZGF0YSk7Ci0gICAJCisKIHNpZ25hbHM6CiAKICAgICB2b2lkIHNpZ25hbEVycm9yKCBj
b25zdCBRU3RyaW5nJiBtc2cgKTsKQEAgLTEyMSwxMyArMTIxLDEzIEBACiAgICAgdm9pZCBzaWdu
YWxHZXRBbGJ1bXNMaXN0U3VjY2VlZGVkKCk7CiAgICAgdm9pZCBzaWduYWxHZXRBbGJ1bXNMaXN0
RmFpbGVkKCBjb25zdCBRU3RyaW5nJiBtc2cgKTsKICAgICB2b2lkIHNpZ25hbEFkZFBob3RvRmFp
bGVkKCBjb25zdCBRU3RyaW5nJiBtc2cgKTsKLSAgICB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0ZSgp
IDsJICAgIAorICAgIHZvaWQgc2lnbmFsQXV0aGVudGljYXRlKCkgOwogICAgIHZvaWQgc2lnbmFs
VG9rZW5PYnRhaW5lZChjb25zdCBRU3RyaW5nJiB0b2tlbik7CiAKIHByaXZhdGUgc2xvdHM6CiAK
ICAgICB2b2lkIHNsb3RFcnJvciggY29uc3QgUVN0cmluZyYgbXNnICk7Ci0gICAgLy92b2lkIHNs
b3RBdXRoZW50aWNhdGUoKSA7CSAgICAKKyAgICAvL3ZvaWQgc2xvdEF1dGhlbnRpY2F0ZSgpIDsK
ICAgICB2b2lkIGRhdGEoS0lPOjpKb2IgKmpvYiwgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSk7CiAg
ICAgdm9pZCBpbmZvKEtJTzo6Sm9iICpqb2IsIGNvbnN0IFFTdHJpbmcmIHN0cik7CiAgICAgdm9p
ZCBzbG90UmVzdWx0IChLSU86OkpvYiAqam9iKTsKZGlmZiAtTnVyIHBpY2FzYXdlYmV4cG9ydC5v
cmlnL3BpY2FzYXdlYndpbmRvdy5jcHAgcGljYXNhd2ViZXhwb3J0L3BpY2FzYXdlYndpbmRvdy5j
cHAKLS0tIHBpY2FzYXdlYmV4cG9ydC5vcmlnL3BpY2FzYXdlYndpbmRvdy5jcHAJMjAwOC0wMi0x
NiAwMToyOTo0MC4wMDAwMDAwMDAgKzEwMDAKKysrIHBpY2FzYXdlYmV4cG9ydC9waWNhc2F3ZWJ3
aW5kb3cuY3BwCTIwMDgtMDItMTYgMTQ6Mzg6MjAuMDAwMDAwMDAwICsxMDAwCkBAIC0yMCw3ICsy
MCw3IEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0gKi8KIAogLy8gSW5jbHVkZSBmaWxlcyBmb3IgUXQKLSAKKwogI2luY2x1
ZGUgPHFsaXN0dmlldy5oPgogI2luY2x1ZGUgPHFwdXNoYnV0dG9uLmg+CiAjaW5jbHVkZSA8cWNv
bWJvYm94Lmg+CkBAIC04Miw2ICs4Miw3IEBACiAgICAgbV9pbnRlcmZhY2UgICA9IGludGVyZmFj
ZTsKICAgICBtX3VwbG9hZENvdW50ID0gMDsKICAgICBtX3VwbG9hZFRvdGFsID0gMDsKKyAgICBt
X3VwbG9hZEdhbGxlcnlOYW1lID0gIiI7CiAgICAgLy9tX3dhbGxldCAgICAgID0gMDsKIAogICAg
IC8vIEFib3V0IGRhdGEgYW5kIGhlbHAgYnV0dG9uLgpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAg
bV93aWRnZXQgPSBuZXcgUGljYXNhd2ViV2lkZ2V0KHRoaXMpOy8vbmV3IFBpY2FzYXdlYldpZGdl
dCggdGhpcyApOwogICAgIHNldE1haW5XaWRnZXQoIG1fd2lkZ2V0ICk7CiAgICAgbV93aWRnZXQt
PnNldE1pbmltdW1TaXplKCA2MDAsIDQwMCApOwotICAgIAorCiAgICAgbV91cmxzICAgICAgICAg
ICAgICAgICAgPSBOVUxMOwogICAgIG1fdGFnVmlldyAgICAgICAgICAgICAgID0gbV93aWRnZXQt
Pm1fdGFnVmlldzsKICAgICBtX3Bob3RvVmlldyAgICAgICAgICAgICA9IG1fd2lkZ2V0LT5tX3Bo
b3RvVmlldzsKQEAgLTEyMiw3ICsxMjMsNyBAQAogICAgIG1fd2lkZ2V0LT5tX2N1cnJlbnRTZWxl
Y3Rpb25CdXR0b24tPnNldENoZWNrZWQodHJ1ZSk7CiAgICAgaWYoIW1faW50ZXJmYWNlLT5oYXNG
ZWF0dXJlKEtJUEk6Okhvc3RTdXBwb3J0c1RhZ3MpKQogICAgIAkJbV9leHBvcnRBcHBsaWNhdGlv
blRhZ3MtPnNldEVuYWJsZWQoZmFsc2UpOwotICAgIAorCiAgICAgbV90YWxrZXIgPSBuZXcgUGlj
YXNhd2ViVGFsa2VyKCB0aGlzICk7CiAgICAgY29ubmVjdCggbV90YWxrZXIsIFNJR05BTCggc2ln
bmFsRXJyb3IoIGNvbnN0IFFTdHJpbmcmICkgKSxtX3RhbGtlciwKICAgICAgICAgICAgICBTTE9U
KCBzbG90RXJyb3IoIGNvbnN0IFFTdHJpbmcmICkgKSApOwpAQCAtMTY3LDcgKzE2OCw3IEBACiAg
ICAgLy9ubyBzYXZpbmcgcGFzc3dvcmQgcnQgbm93CiAgICAgaWYgKGNvbmZpZy5yZWFkQm9vbEVu
dHJ5KCJSZXNpemUiLCBmYWxzZSkpCiAgICAgICAgIG1fcmVzaXplQ2hlY2tCb3gtPnNldENoZWNr
ZWQodHJ1ZSk7Ci0gICAKKwogICAgbV9kaW1lbnNpb25TcGluQm94LT5zZXRWYWx1ZShjb25maWcu
cmVhZE51bUVudHJ5KCJNYXhpbXVtIFdpZHRoIiwgMTYwMCkpOwogICAgbV9pbWFnZVF1YWxpdHlT
cGluQm94LT5zZXRWYWx1ZShjb25maWcucmVhZE51bUVudHJ5KCJJbWFnZSBRdWFsaXR5IiwgODUp
KTsKICAgIG1fYXV0aFByb2dyZXNzRGxnID0gbmV3IFFQcm9ncmVzc0RpYWxvZyggdGhpcywgMCwg
dHJ1ZSApOwpAQCAtMTc1LDggKzE3Niw4IEBACiAgICBtX2F1dGhQcm9ncmVzc0RsZy0+c2V0QXV0
b0Nsb3NlKCB0cnVlICk7CiAgICBjb25uZWN0KCBtX2F1dGhQcm9ncmVzc0RsZywgU0lHTkFMKCBj
YW5jZWxlZCgpICksCiAgICAgICAgICAgICAgU0xPVCggc2xvdEF1dGhDYW5jZWwoKSApICk7Ci0g
ICBtX3RhbGtlci0+YXV0aFByb2dyZXNzRGxnPW1fYXV0aFByb2dyZXNzRGxnOyAKLSAgIG1fd2lk
Z2V0LT5zZXRFbmFibGVkKGZhbHNlKTsgCisgICBtX3RhbGtlci0+YXV0aFByb2dyZXNzRGxnPW1f
YXV0aFByb2dyZXNzRGxnOworICAgbV93aWRnZXQtPnNldEVuYWJsZWQoZmFsc2UpOwogICAvLyBB
bGwgdGhlc2UgdGhyZWUgdmFsdWVzIGNhbiBiZSBudWxsIHRvby4KICAgLy8gSWYgbV90b2tlbiBp
cyBvdCBudWxsLCB1c2VybmFtZSB3b3VsZCBiZSBub3QgbnVsbCB0b28uCiAgIC8vIGlmICghKCFt
X3Rva2VuIHx8IG1fdG9rZW4ubGVuZ3RoKCkgPCAxKSkKQEAgLTI0NCw3ICsyNDUsNyBAQAogICAg
ICAgICAgICAgICAgIGtkRGVidWcoKTw8IlNob3dpbmcgc3RvcmVkIHBhc3N3b3JkIjw8IHBhc3N3
b3JkIDw8IGVuZGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0qLwotICAgICAgICAgICAgCisK
IAkJUVN0cmluZyB1c2VybmFtZV9lZGl0LCBwYXNzd29yZF9lZGl0OwogCQlpZiAobG9naW5EaWFs
b2ctPmV4ZWMoKSA9PSBRRGlhbG9nOjpBY2NlcHRlZCl7CiAJCQl1c2VybmFtZV9lZGl0ID0gbG9n
aW5EaWFsb2ctPnVzZXJuYW1lKCk7CkBAIC0zMDgsNyArMzA5LDcgQEAKIH0KIAogdm9pZCBQaWNh
c2F3ZWJXaW5kb3c6OnNsb3RBdXRoQ2FuY2VsKCkKLXsJCit7CiAJbV90YWxrZXItPmNhbmNlbCgp
OwogCW1fYXV0aFByb2dyZXNzRGxnLT5oaWRlKCk7CiB9CkBAIC0zNTAsNyArMzUxLDcgQEAKIAog
dm9pZCBQaWNhc2F3ZWJXaW5kb3c6OnNsb3RMaXN0UGhvdG9TZXRzUmVzcG9uc2UoY29uc3QgUVZh
bHVlTGlzdCA8RlBob3RvU2V0PiYgcGhvdG9TZXRMaXN0KQogewotICBwaG90b1NldExpc3Q7IAor
ICBwaG90b1NldExpc3Q7CiB9CiAKIHZvaWQgUGljYXNhd2ViV2luZG93OjpzbG90QWRkUGhvdG9z
KCkKQEAgLTM1OCw5NSArMzU5LDEzMCBAQAogCS8vbV90YWxrZXItPmxpc3RQaG90b1NldHMoKTsK
ICAgICBtX3VybHMgPSBuZXcgS1VSTDo6TGlzdChLSVBJOjpJbWFnZURpYWxvZzo6Z2V0SW1hZ2VV
UkxzKCB0aGlzLAogCQkJCW1faW50ZXJmYWNlICkpOwotfSAKLXZvaWQgUGljYXNhd2ViV2luZG93
OjpzbG90VXBsb2FkSW1hZ2VzKCl7Ci0gICBpZihtX3dpZGdldC0+bV9jdXJyZW50U2VsZWN0aW9u
QnV0dG9uLT5pc0NoZWNrZWQoKSl7Ci0JICAgCSBpZiAobV91cmxzIT1OVUxMKQotCQkJIGRlbGV0
ZSBtX3VybHM7Ci0gICAJICAgIG1fdXJscz1uZXcgS1VSTDo6TGlzdChtX2ludGVyZmFjZS0+Y3Vy
cmVudFNlbGVjdGlvbigpLmltYWdlcygpKTsKLSAgIH0KLSAgIGlmIChtX3VybHMgPT0gTlVMTCB8
fCBtX3VybHMtPmlzRW1wdHkoKSkKK30KKwordm9pZCBQaWNhc2F3ZWJXaW5kb3c6OnNsb3RVcGxv
YWRJbWFnZXMoKQoreworICAgIGlmIChtX3dpZGdldC0+bV9jdXJyZW50U2VsZWN0aW9uQnV0dG9u
LT5pc0NoZWNrZWQoKSkKKyAgICB7CisgICAgICAgIGlmIChtX3VybHMgIT0gTlVMTCkKKyAgICAg
ICAgICAgIGRlbGV0ZSBtX3VybHM7CisgICAgICAgIG1fdXJscyA9IG5ldyBLVVJMOjpMaXN0KG1f
aW50ZXJmYWNlLT5jdXJyZW50U2VsZWN0aW9uKCkuaW1hZ2VzKCkpOworICAgIH0KKworICAgIGlm
IChtX3VybHMgPT0gTlVMTCB8fCBtX3VybHMtPmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwot
ICAgIHR5cGVkZWYgUVBhaXI8UVN0cmluZyxGUGhvdG9JbmZvPiBQYWlyOwotICAgIAorCisgICAg
dHlwZWRlZiBRUGFpcjxRU3RyaW5nLCBGUGhvdG9JbmZvPiBQYWlyOworCiAgICAgbV91cGxvYWRR
dWV1ZS5jbGVhcigpOworCiAgICAgZm9yIChLVVJMOjpMaXN0OjppdGVyYXRvciBpdCA9IG1fdXJs
cy0+YmVnaW4oKTsgaXQgIT0gbV91cmxzLT5lbmQoKTsgKytpdCkKICAgICB7Ci0gICAgICAgIEtJ
UEk6OkltYWdlSW5mbyBpbmZvID0gbV9pbnRlcmZhY2UtPmluZm8oICppdCApOworICAgICAgICBL
SVBJOjpJbWFnZUluZm8gaW5mbyA9IG1faW50ZXJmYWNlLT5pbmZvKCppdCk7CiAgICAgICAgIEZQ
aG90b0luZm8gdGVtcDsKLSAgICAgICAgCi0JCXRlbXAudGl0bGU9aW5mby50aXRsZSgpOwotICAg
ICAgICB0ZW1wLmRlc2NyaXB0aW9uPWluZm8uZGVzY3JpcHRpb24oKTsKLQkJCi0JCVFTdHJpbmdM
aXN0IGFsbFRhZ3M7Ci0gICAgCQotCQlRU3RyaW5nTGlzdCB0YWdzRnJvbURpYWxvZyA9IFFTdHJp
bmdMaXN0OjpzcGxpdCgiICIsIG1fdGFnc0xpbmVFZGl0LT50ZXh0KCksIGZhbHNlKTsgCi0JCVFT
dHJpbmdMaXN0OjpJdGVyYXRvciBpdFRhZ3M7Ci0KLQkJLy9UYWdzIGZyb20gdGhlIGludGVyZmFj
ZQkKLQkJaXRUYWdzPSB0YWdzRnJvbURpYWxvZy5iZWdpbigpOwotCQl3aGlsZSggaXRUYWdzICE9
IHRhZ3NGcm9tRGlhbG9nLmVuZCgpICkgewotCQkJYWxsVGFncy5hcHBlbmQoICppdFRhZ3MgKTsK
LQkJCSsraXRUYWdzOwotCQl9CiAKLQkJLy9UYWdzIGZyb20gdGhlIGRhdGFiYXNlCi0JCVFNYXAg
PFFTdHJpbmcsIFFWYXJpYW50PiBhdHRyaWJzID0gaW5mby5hdHRyaWJ1dGVzKCk7Ci0JCVFTdHJp
bmdMaXN0IHRhZ3NGcm9tRGF0YWJhc2U7Ci0JCQotCQlpZihtX2ludGVyZmFjZS0+aGFzRmVhdHVy
ZShLSVBJOjpIb3N0U3VwcG9ydHNUYWdzKSAmJiAgbV9leHBvcnRBcHBsaWNhdGlvblRhZ3MtPmlz
Q2hlY2tlZCgpKXsKLQkJLy8JdGFnc0Zyb21EYXRhYmFzZT1hdHRyaWJzWyJ0YWdzIl0uYXNTdHJp
bmdMaXN0KCk7CQotCQl9Ci0JCQotCQlpdFRhZ3MgPSB0YWdzRnJvbURhdGFiYXNlLmJlZ2luKCk7
Ci0JCXdoaWxlKCBpdFRhZ3MgIT0gdGFnc0Zyb21EYXRhYmFzZS5lbmQoKSApIHsKLQkJCWFsbFRh
Z3MuYXBwZW5kKCAqaXRUYWdzICk7Ci0JCQkrK2l0VGFnczsKLQkJfQotCQotCQkKLQkJaXRUYWdz
ID0gYWxsVGFncy5iZWdpbigpOwotCQkKLQkJd2hpbGUoIGl0VGFncyAhPSBhbGxUYWdzLmVuZCgp
ICkgewotCQkJKytpdFRhZ3M7Ci0JCX0KLQkJdGVtcC50YWdzPWFsbFRhZ3M7IAotICAgICAgICBt
X3VwbG9hZFF1ZXVlLmFwcGVuZCggUGFpciggKCppdCkucGF0aCgpLCB0ZW1wKSApOworICAgICAg
ICB0ZW1wLnRpdGxlID0gaW5mby50aXRsZSgpOworICAgICAgICB0ZW1wLmRlc2NyaXB0aW9uID0g
aW5mby5kZXNjcmlwdGlvbigpOworCisgICAgICAgIFFTdHJpbmdMaXN0IGFsbFRhZ3M7CisKKyAg
ICAgICAgUVN0cmluZ0xpc3QgdGFnc0Zyb21EaWFsb2cgPSBRU3RyaW5nTGlzdDo6c3BsaXQoIiAi
LCBtX3RhZ3NMaW5lRWRpdC0+dGV4dCgpLCBmYWxzZSk7CisgICAgICAgIFFTdHJpbmdMaXN0OjpJ
dGVyYXRvciBpdFRhZ3M7CisKKyAgICAgICAgLy9UYWdzIGZyb20gdGhlIGludGVyZmFjZQorICAg
ICAgICBpdFRhZ3MgPSB0YWdzRnJvbURpYWxvZy5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXRU
YWdzICE9IHRhZ3NGcm9tRGlhbG9nLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBhbGxU
YWdzLmFwcGVuZCgqaXRUYWdzKTsKKyAgICAgICAgICAgICsraXRUYWdzOworICAgICAgICB9CisK
KyAgICAgICAgLy9UYWdzIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICAgIFFNYXAgPFFTdHJpbmcs
IFFWYXJpYW50PiBhdHRyaWJzID0gaW5mby5hdHRyaWJ1dGVzKCk7CisgICAgICAgIFFTdHJpbmdM
aXN0IHRhZ3NGcm9tRGF0YWJhc2U7CisKKyAgICAgICAgaWYgKG1faW50ZXJmYWNlLT5oYXNGZWF0
dXJlKEtJUEk6Okhvc3RTdXBwb3J0c1RhZ3MpICYmICBtX2V4cG9ydEFwcGxpY2F0aW9uVGFncy0+
aXNDaGVja2VkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRhZ3NGcm9tRGF0YWJhc2U9
YXR0cmlic1sidGFncyJdLmFzU3RyaW5nTGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgaXRU
YWdzID0gdGFnc0Zyb21EYXRhYmFzZS5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXRUYWdzICE9
IHRhZ3NGcm9tRGF0YWJhc2UuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbFRhZ3Mu
YXBwZW5kKCppdFRhZ3MpOworICAgICAgICAgICAgKytpdFRhZ3M7CisgICAgICAgIH0KKworCisg
ICAgICAgIGl0VGFncyA9IGFsbFRhZ3MuYmVnaW4oKTsKKworICAgICAgICB3aGlsZSAoaXRUYWdz
ICE9IGFsbFRhZ3MuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraXRUYWdzOworICAg
ICAgICB9CisgICAgICAgIHRlbXAudGFncyA9IGFsbFRhZ3M7CisgICAgICAgIG1fdXBsb2FkUXVl
dWUuYXBwZW5kKFBhaXIoKCppdCkucGF0aCgpLCB0ZW1wKSk7CisgICAgfQorCisgICAgLyogQXNz
b2NpYXRlIEFsYnVtVGl0bGUgdG8gQWxidW1OYW1lIGZvciB1cGxvYWRpbmcgKi8KKyAgICBRVmFs
dWVMaXN0IDxQaWNhc2FXZWJBbGJ1bT46Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IG1fdGFs
a2VyLT5tX2FsYnVtc0xpc3QtPmJlZ2luKCk7IGl0ICE9IG1fdGFsa2VyLT5tX2FsYnVtc0xpc3Qt
PmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAgaWYoKCppdCkudGl0bGUgPT0gbV9hbGJ1bXNM
aXN0Q29tYm9Cb3gtPmN1cnJlbnRUZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdXBs
b2FkR2FsbGVyeU5hbWUgPSAoKml0KS5uYW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBpZihhbGJ1bV9uYW1lID09ICIiKQorICAgIHsKKyAgICAgICAgaWYg
KG1fdXJscyAhPSBOVUxMKQorICAgICAgICAgICAgZGVsZXRlIG1fdXJsczsKKworICAgICAgICBz
bG90QWRkUGhvdG9GYWlsZWQoIkluY29ycmVjdCBhbGJ1bSBuYW1lIik7CisgICAgICAgIHJldHVy
bjsKICAgICB9CiAKICAgICBtX3VwbG9hZFRvdGFsID0gbV91cGxvYWRRdWV1ZS5jb3VudCgpOwog
ICAgIG1fdXBsb2FkQ291bnQgPSAwOworCiAgICAgbV9wcm9ncmVzc0RsZy0+cmVzZXQoKTsKICAg
ICBzbG90QWRkUGhvdG9OZXh0KCk7CiB9CiAKIHZvaWQgUGljYXNhd2ViV2luZG93OjpzbG90QWRk
UGhvdG9OZXh0KCkKIHsKLSAgICBpZiAoIG1fdXBsb2FkUXVldWUuaXNFbXB0eSgpICkKKyAgICBp
ZiAobV91cGxvYWRRdWV1ZS5pc0VtcHR5KCkpCiAgICAgewogICAgICAgICBtX3Byb2dyZXNzRGxn
LT5yZXNldCgpOwogICAgICAgICBtX3Byb2dyZXNzRGxnLT5oaWRlKCk7CiAgICAgICAgIC8vc2xv
dEFsYnVtU2VsZWN0ZWQoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB0eXBlZGVmIFFQ
YWlyPFFTdHJpbmcsRlBob3RvSW5mbz4gUGFpcjsKKworICAgIHR5cGVkZWYgUVBhaXI8UVN0cmlu
ZywgRlBob3RvSW5mbz4gUGFpcjsKKwogICAgIFBhaXIgcGF0aENvbW1lbnRzID0gbV91cGxvYWRR
dWV1ZS5maXJzdCgpOwotICAgIEZQaG90b0luZm8gaW5mbz1wYXRoQ29tbWVudHMuc2Vjb25kOwor
ICAgIEZQaG90b0luZm8gaW5mbyA9IHBhdGhDb21tZW50cy5zZWNvbmQ7CiAgICAgbV91cGxvYWRR
dWV1ZS5wb3BfZnJvbnQoKTsKICAgICBpbnQgdXBsb2FkX2ltYWdlX3NpemU7CiAgICAgaW50IHVw
bG9hZF9pbWFnZV9xdWFsaXR5OwotICAgIAotICAgIGJvb2wgcmVzID0gbV90YWxrZXItPmFkZFBo
b3RvKCBwYXRoQ29tbWVudHMuZmlyc3QsIC8vdGhlIGZpbGUgcGF0aAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbmZvLCBtX2FsYnVtc0xpc3RDb21ib0JveC0+Y3VycmVudFRl
eHQoKSwKLQkJCQkgICAgICAgICAgICAgICAgICAgbV9yZXNpemVDaGVja0JveC0+aXNDaGVja2Vk
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGltZW5zaW9uU3BpbkJv
eC0+dmFsdWUoKSwgbV9pbWFnZVF1YWxpdHlTcGluQm94LT52YWx1ZSgpICk7CisKKyAgICBib29s
IHJlcyA9IG1fdGFsa2VyLT5hZGRQaG90byhwYXRoQ29tbWVudHMuZmlyc3QsICAvL3RoZSBmaWxl
IHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdXBsb2FkR2FsbGVyeU5hbWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9yZXNpemVDaGVja0JveC0+aXNDaGVja2VkKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kaW1lbnNpb25TcGluQm94LT52YWx1
ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW1hZ2VRdWFsaXR5U3Bp
bkJveC0+dmFsdWUoKSk7CiAgICAgaWYgKCFyZXMpCiAgICAgewotICAgICAgICBzbG90QWRkUGhv
dG9GYWlsZWQoICIiICk7CisgICAgICAgIHNsb3RBZGRQaG90b0ZhaWxlZCgiIik7CiAgICAgICAg
IHJldHVybjsKICAgICB9Ci0gICAgbV9wcm9ncmVzc0RsZy0+c2V0TGFiZWxUZXh0KCBpMThuKCJV
cGxvYWRpbmcgZmlsZSAlMSAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFy
ZyggS1VSTChwYXRoQ29tbWVudHMuZmlyc3QpLmZpbGVuYW1lKCkgKSApOworICAgIG1fcHJvZ3Jl
c3NEbGctPnNldExhYmVsVGV4dChpMThuKCJVcGxvYWRpbmcgZmlsZSAlMSAiKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAuYXJnKEtVUkwocGF0aENvbW1lbnRzLmZpcnN0KS5maWxl
bmFtZSgpKSk7CiAKICAgICBpZiAobV9wcm9ncmVzc0RsZy0+aXNIaWRkZW4oKSkKICAgICAgICAg
bV9wcm9ncmVzc0RsZy0+c2hvdygpOwpAQCAtNDkyLDcgKzUyOCw3IEBACiAgICAgbV9wcm9ncmVz
c0RsZy0+aGlkZSgpOwogCiAgICAgbV90YWxrZXItPmNhbmNlbCgpOwotICAgIAorCiAgICAgLy8g
cmVmcmVzaCB0aGUgdGh1bWJuYWlscwogICAgIC8vc2xvdFRhZ1NlbGVjdGVkKCk7CiB9CmRpZmYg
LU51ciBwaWNhc2F3ZWJleHBvcnQub3JpZy9waWNhc2F3ZWJ3aW5kb3cuaCBwaWNhc2F3ZWJleHBv
cnQvcGljYXNhd2Vid2luZG93LmgKLS0tIHBpY2FzYXdlYmV4cG9ydC5vcmlnL3BpY2FzYXdlYndp
bmRvdy5oCTIwMDgtMDItMTYgMDE6Mjk6NDAuMDAwMDAwMDAwICsxMDAwCisrKyBwaWNhc2F3ZWJl
eHBvcnQvcGljYXNhd2Vid2luZG93LmgJMjAwOC0wMi0xNiAxNDozMTo1Ny4wMDAwMDAwMDAgKzEw
MDAKQEAgLTc2LDEzICs3NiwxMyBAQAogCiAgICAgUUxpc3RWaWV3ICAgICAgICAgICAgICAgICpt
X3RhZ1ZpZXc7CiAgICAgS0hUTUxQYXJ0ICAgICAgICAgICAgICAgICptX3Bob3RvVmlldzsKLSAg
CisKICAgICBRUHVzaEJ1dHRvbiAgICAgICAgICAgICAgKm1fbmV3QWxidW1CdXR0b247CiAgICAg
UVNwaW5Cb3ggICAgICAgICAgICAgICAgICptX2RpbWVuc2lvblNwaW5Cb3g7CiAgICAgUVNwaW5C
b3ggICAgICAgICAgICAgICAgICptX2ltYWdlUXVhbGl0eVNwaW5Cb3g7CiAgICAgUVB1c2hCdXR0
b24gICAgICAgICAgICAgICptX2FkZFBob3RvQnV0dG9uOwogICAgIFFQdXNoQnV0dG9uICAgICAg
ICAgICAgICAqbV9oZWxwQnV0dG9uOwotICAgIAorCiAgICAgUUNoZWNrQm94ICAgICAgICAgICAg
ICAgICptX3Jlc2l6ZUNoZWNrQm94OwogICAgIFFMaW5lRWRpdCAgICAgICAgICAgICAgICAqbV90
YWdzTGluZUVkaXQ7CiAJUUNoZWNrQm94CQkJICAgICAqbV9leHBvcnRBcHBsaWNhdGlvblRhZ3M7
CkBAIC0xMDYsOSArMTA2LDEwIEBACiAgICAgUVByb2dyZXNzRGlhbG9nICAgICAgICAgICAgICAg
ICAgICAgICptX2F1dGhQcm9ncmVzc0RsZzsKICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fdXBsb2FkQ291bnQ7CiAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3VwbG9hZFRvdGFsOworICAgIFFTdHJpbmcgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbV91cGxvYWRHYWxsZXJ5TmFtZTsKICAgICBRVmFsdWVMaXN0PCBRUGFp
cjxRU3RyaW5nLEZQaG90b0luZm8+ID4gIG1fdXBsb2FkUXVldWU7CiAKLSAgICBLSVBJUGx1Z2lu
czo6S1BBYm91dERhdGEgICAgKm1fYWJvdXQ7IAorICAgIEtJUElQbHVnaW5zOjpLUEFib3V0RGF0
YSAgICAqbV9hYm91dDsKIAogcHJpdmF0ZSBzbG90czoKICAgICB2b2lkIHNsb3RUb2tlbk9idGFp
bmVkKGNvbnN0IFFTdHJpbmcmIHRva2VuKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>24926</attachid>
            <date>2008-05-25 02:01:45 +0000</date>
            <delta_ts>2008-05-25 02:01:45 +0000</delta_ts>
            <desc>QObject errors seen on console during failed export from Digikam to Picasa</desc>
            <filename>20080525-picasa_export_errors.txt</filename>
            <type>text/plain</type>
            <size>3962</size>
            <attacher>x3ri7yz02</attacher>
            
              <data encoding="base64">CQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQ
bHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyZzdHIpCgkJ
UU9iamVjdDo6Y29ubmVjdDogIChzZW5kZXIgbmFtZTogICAndW5uYW1lZCcpCgkJUU9iamVjdDo6
Y29ubmVjdDogIChyZWNlaXZlciBuYW1lOiAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDog
Tm8gc3VjaCBzaWduYWwgS0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdpbjo6UGljYXNhd2ViVGFsa2Vy
OjpzaWduYWxHZXRBbGJ1bXNMaXN0RmFpbGVkKGNvbnN0IFFTdHJpbmcmbXNnKQoJCVFPYmplY3Q6
OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6
ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2gg
c2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFs
TGlzdFBob3RvU2V0c1N1Y2NlZWRlZChjb25zdCBRVmFsdWVMaXN0PEZQaG90b1NldD4mKQoJCVFP
YmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNv
bm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5v
IHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6
c2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyZzdHIpCgkJUU9iamVjdDo6Y29ubmVjdDogIChzZW5k
ZXIgbmFtZTogICAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogIChyZWNlaXZlciBuYW1l
OiAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogTm8gc3VjaCBzaWduYWwgS0lQSVBpY2Fz
YXdlYkV4cG9ydFBsdWdpbjo6UGljYXNhd2ViVGFsa2VyOjpzaWduYWxHZXRBbGJ1bXNMaXN0RmFp
bGVkKGNvbnN0IFFTdHJpbmcmbXNnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6
ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFt
ZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBv
cnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsTGlzdFBob3RvU2V0c1N1Y2NlZWRlZChj
b25zdCBRVmFsdWVMaXN0PEZQaG90b1NldD4mKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVy
IG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTog
J3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3
ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsRXJyb3IoY29uc3QgUVN0cmlu
ZyZzdHIpCgkJUU9iamVjdDo6Y29ubmVjdDogIChzZW5kZXIgbmFtZTogICAndW5uYW1lZCcpCgkJ
UU9iamVjdDo6Y29ubmVjdDogIChyZWNlaXZlciBuYW1lOiAndW5uYW1lZCcpCgkJUU9iamVjdDo6
Y29ubmVjdDogTm8gc3VjaCBzaWduYWwgS0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdpbjo6UGljYXNh
d2ViVGFsa2VyOjpzaWduYWxHZXRBbGJ1bXNMaXN0RmFpbGVkKGNvbnN0IFFTdHJpbmcmbXNnKQoJ
CVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6
OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6
IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtl
cjo6c2lnbmFsTGlzdFBob3RvU2V0c1N1Y2NlZWRlZChjb25zdCBRVmFsdWVMaXN0PEZQaG90b1Nl
dD4mKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFP
YmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNv
bm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdl
YlRhbGtlcjo6c2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyZzdHIpCgkJUU9iamVjdDo6Y29ubmVj
dDogIChzZW5kZXIgbmFtZTogICAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogIChyZWNl
aXZlciBuYW1lOiAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogTm8gc3VjaCBzaWduYWwg
S0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdpbjo6UGljYXNhd2ViVGFsa2VyOjpzaWduYWxHZXRBbGJ1
bXNMaXN0RmFpbGVkKGNvbnN0IFFTdHJpbmcmbXNnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2Vu
ZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFt
ZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNh
c2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsTGlzdFBob3RvU2V0c1N1
Y2NlZWRlZChjb25zdCBRVmFsdWVMaXN0PEZQaG90b1NldD4mKQoJCVFPYmplY3Q6OmNvbm5lY3Q6
ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2
ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJ
UElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsRXJyb3IoY29u
c3QgUVN0cmluZyZzdHIpCgkJUU9iamVjdDo6Y29ubmVjdDogIChzZW5kZXIgbmFtZTogICAndW5u
YW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogIChyZWNlaXZlciBuYW1lOiAndW5uYW1lZCcpCgkJ
UU9iamVjdDo6Y29ubmVjdDogTm8gc3VjaCBzaWduYWwgS0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdp
bjo6UGljYXNhd2ViVGFsa2VyOjpzaWduYWxHZXRBbGJ1bXNMaXN0RmFpbGVkKGNvbnN0IFFTdHJp
bmcmbXNnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJ
CVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6
OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2Fz
YXdlYlRhbGtlcjo6c2lnbmFsTGlzdFBob3RvU2V0c1N1Y2NlZWRlZChjb25zdCBRVmFsdWVMaXN0
PEZQaG90b1NldD4mKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFt
ZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFP
YmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFsIEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46
OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsRXJyb3IoY29uc3QgUVN0cmluZyZzdHIpCgkJUU9iamVj
dDo6Y29ubmVjdDogIChzZW5kZXIgbmFtZTogICAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVj
dDogIChyZWNlaXZlciBuYW1lOiAndW5uYW1lZCcpCgkJUU9iamVjdDo6Y29ubmVjdDogTm8gc3Vj
aCBzaWduYWwgS0lQSVBpY2FzYXdlYkV4cG9ydFBsdWdpbjo6UGljYXNhd2ViVGFsa2VyOjpzaWdu
YWxHZXRBbGJ1bXNMaXN0RmFpbGVkKGNvbnN0IFFTdHJpbmcmbXNnKQoJCVFPYmplY3Q6OmNvbm5l
Y3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6ICAocmVj
ZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6IE5vIHN1Y2ggc2lnbmFs
IEtJUElQaWNhc2F3ZWJFeHBvcnRQbHVnaW46OlBpY2FzYXdlYlRhbGtlcjo6c2lnbmFsTGlzdFBo
b3RvU2V0c1N1Y2NlZWRlZChjb25zdCBRVmFsdWVMaXN0PEZQaG90b1NldD4mKQoJCVFPYmplY3Q6
OmNvbm5lY3Q6ICAoc2VuZGVyIG5hbWU6ICAgJ3VubmFtZWQnKQoJCVFPYmplY3Q6OmNvbm5lY3Q6
ICAocmVjZWl2ZXIgbmFtZTogJ3VubmFtZWQnKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>