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

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>88094</bug_id>
          
          <creation_ts>2012-06-01 07:49:07 -0700</creation_ts>
          <short_desc>Web Inspector: Add a WebInspectorServer on Linux using the GSocket API for the GTK port</short_desc>
          <delta_ts>2012-11-14 06:26:59 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</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>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>98705</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Anton Obzhirov">obzhirov</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abecsi</cc>
    
    <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>cgarcia</cc>
    
    <cc>christian</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>danilo.eu</cc>
    
    <cc>danw</cc>
    
    <cc>d.nomiyama</cc>
    
    <cc>gustavo</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>hausmann</cc>
    
    <cc>jesus</cc>
    
    <cc>joepeck</cc>
    
    <cc>jturcotte</cc>
    
    <cc>kangil.han</cc>
    
    <cc>keishi</cc>
    
    <cc>kenneth</cc>
    
    <cc>loislo</cc>
    
    <cc>menard</cc>
    
    <cc>mrobinson</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rakuco</cc>
    
    <cc>rik</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>seokju.kwon</cc>
    
    <cc>tmpsantos</cc>
    
    <cc>vsevik</cc>
    
    <cc>web-inspector-bugs</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
    
    <cc>yutak</cc>
    
    <cc>zan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>639339</commentid>
    <comment_count>0</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-06-01 07:49:07 -0700</bug_when>
    <thetext>There is a platform dependant implementation missing for WebInspectorServer on Linux platform.
I implemented it using GSocket API. We want to contribute it to WebKit.
Please assign this bug to me and advise me how to proceed further with the contribution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>643673</commentid>
    <comment_count>1</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2012-06-07 10:35:10 -0700</bug_when>
    <thetext>Hey Anton. There is a short page detailing best practices for contributing code to WebKit:
&lt;http://www.webkit.org/coding/contributing.html&gt;

If you already have a patch I suppose the next step would be to attach it to this bug, mark
it as a patch, and set the review flag to &quot;?&quot;. Some tips before you upload the patch: make
sure you have a ChangeLog and make sure code follows the style guidelines. If the patch
is large consider breaking it up into smaller pieces and upload each patch separately.
When the patches are attached, someone will eventually get around to reviewing it!

It sounds like you&apos;re adding this for the GTK port? If that is the case you might want the
patch to get reviewed by both an Inspector reviewer and a GTK reviewer. The GTK port
maintainers would probably want to be aware of this feature getting added and how to
use it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>644716</commentid>
    <comment_count>2</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-06-08 09:07:51 -0700</bug_when>
    <thetext>Yes, it is GTK port. I&apos;ll attach the patch on Monday.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>647859</commentid>
    <comment_count>3</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-06-13 03:26:02 -0700</bug_when>
    <thetext>Hm, tried to build test dependencies as it&apos;s required to run regression tests. Got *** module webkitgtk-testing-dependencies not built due to non-buildable gdk-pixbuf *** [18/18]
*** module webkitgtk-testing-dependencies not built due to non-buildable gtk+ *** [18/18]
*** module webkitgtk-testing-dependencies not built due to non-buildable gnome-icon-theme *** [18/18]
*** the following modules were not built *** [18/18]. Does anybody know what&apos;s the problem here? I followed instruction in http://trac.webkit.org/wiki/BuildingGtk and build for Ubuntu 12.4.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>652535</commentid>
    <comment_count>4</comment_count>
      <attachid>148350</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-06-19 09:50:57 -0700</bug_when>
    <thetext>Created attachment 148350
Implementation of remote Web Inspector server platform depended bits for GTK platform</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>652540</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-06-19 09:54:15 -0700</bug_when>
    <thetext>Attachment 148350 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/ChangeLog:8:  You should remove the &apos;No new tests&apos; and either add and list tests, or explain why no new tests were possible.  [changelog/nonewtests] [5]
Total errors found: 1 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>672246</commentid>
    <comment_count>6</comment_count>
      <attachid>152986</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-07-18 04:46:31 -0700</bug_when>
    <thetext>Created attachment 152986
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>672343</commentid>
    <comment_count>7</comment_count>
      <attachid>152986</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-07-18 07:09:43 -0700</bug_when>
    <thetext>Comment on attachment 152986
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=152986&amp;action=review

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:109
&gt; +    if (!m_readBuffer)
&gt; +        return;

This check seems unnecessary.

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:121
&gt; +    if (m_client) {
&gt; +        // The client can close the handle, potentially removing the last reference.
&gt; +        RefPtr&lt;SocketStreamHandle&gt; protect(this); 
&gt; +        m_client-&gt;didOpenSocketStream(this);
&gt; +    }

Protecting this should not be necessary here, since we are not doing anything else after didOpenSocketStream&apos;s called.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:375
&gt; +#if PLATFORM(GTK)
&gt; +    // will read host address from environment variables
&gt; +    if (m_pageGroup-&gt;preferences()-&gt;developerExtrasEnabled())
&gt; +        WebInspectorServer::shared().listen(&quot;&quot;, 2999);
&gt; +    else
&gt; +        WebInspectorServer::shared().close();
&gt; +#endif

This doesn&apos;t look right... WebSocketServer::platform{Listen,Close} should already be called when appropriate, shouldn&apos;t they?

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:1747
&gt; +#if PLATFORM(GTK)
&gt; +    // will read host address from environment variables
&gt; +    if (m_pageGroup-&gt;preferences()-&gt;developerExtrasEnabled())
&gt; +        WebInspectorServer::shared().listen(&quot;&quot;, 2999);
&gt; +    else
&gt; +        WebInspectorServer::shared().close();
&gt; +#endif

Ditto.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:38
&gt; +    if (path == &quot;/&quot;) {

So, as I understand it, if the remote side asks for / we want to give it the default page, which is the inspector.html file, but we want any other resource requested to be delivered as is. I don&apos;t understand what the meta refresh is about; also, is there a reason why we are not delivering pagelist.json in a special-case like qt?

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:50
&gt; +        if (!url)
&gt; +            url = &quot;http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html&quot;;

Hmm, no, we should use the locally installed file, not the one hosted in webkit.org.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:87
&gt; +        portValue = 2999;

Why 2999? Is it the same one used by the other ports?

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:88
&gt; +        const char* envCStr = getenv(&quot;GTKWEBKIT_INSPECTOR_SERVER&quot;);

We use WEBKIT_ as our environment variables prefix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>676886</commentid>
    <comment_count>8</comment_count>
      <attachid>152986</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-07-24 09:05:50 -0700</bug_when>
    <thetext>Comment on attachment 152986
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=152986&amp;action=review

&gt;&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:109
&gt;&gt; +        return;
&gt; 
&gt; This check seems unnecessary.

I&apos;ll remove it. By the way what is standard strategy in webkit to deal with failed memory allocations?

&gt;&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:121
&gt;&gt; +    }
&gt; 
&gt; Protecting this should not be necessary here, since we are not doing anything else after didOpenSocketStream&apos;s called.

ok

&gt;&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:375
&gt;&gt; +#endif
&gt; 
&gt; This doesn&apos;t look right... WebSocketServer::platform{Listen,Close} should already be called when appropriate, shouldn&apos;t they?

I don&apos;t think they are called, I need to check. Another reason was to start/stop the server if developer extras enabled/disabled via the menu.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:38
&gt;&gt; +    if (path == &quot;/&quot;) {
&gt; 
&gt; So, as I understand it, if the remote side asks for / we want to give it the default page, which is the inspector.html file, but we want any other resource requested to be delivered as is. I don&apos;t understand what the meta refresh is about; also, is there a reason why we are not delivering pagelist.json in a special-case like qt?

Meta refresh is to redirect page to http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html?ws=ddd.ddd.ddd.ddd:2999/devtools/page/1 if there is only one page. Otherwise it will show the page with the list of links to 
http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html?ws=ddd.ddd.ddd.ddd:2999/devtools/page/1
...
http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html?ws=ddd.ddd.ddd.ddd:2999/devtools/page/[n]
.
The idea is to reuse latest web inspector resources from http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/. But from your comment below probably it is not a good idea.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:50
&gt;&gt; +            url = &quot;http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html&quot;;
&gt; 
&gt; Hmm, no, we should use the locally installed file, not the one hosted in webkit.org.

The hosted one should have the latest updates/fixes, shouldn&apos;t it?

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:87
&gt;&gt; +        portValue = 2999;
&gt; 
&gt; Why 2999? Is it the same one used by the other ports?

well it was mentioned here as an example : http://www.webkit.org/blog/1620/webkit-remote-debugging/.
Can be any value I suppose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>681388</commentid>
    <comment_count>9</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-07-28 04:02:00 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; This check seems unnecessary.
&gt; 
&gt; I&apos;ll remove it. By the way what is standard strategy in webkit to deal with failed memory allocations?

The only sane way to deal with it is to abort I think.

&gt; &gt; This doesn&apos;t look right... WebSocketServer::platform{Listen,Close} should already be called when appropriate, shouldn&apos;t they?
&gt; 
&gt; I don&apos;t think they are called, I need to check. Another reason was to start/stop the server if developer extras enabled/disabled via the menu.

If that&apos;s the case, we should probably be calling the WebSocketServer functions rather than doing work here, and there should be no reason to do it only for a port, I think.
 
&gt; &gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:50
&gt; &gt;&gt; +            url = &quot;http://trac.webkit.org/export/head/trunk/Source/WebCore/inspector/front-end/inspector.html&quot;;
&gt; &gt; 
&gt; &gt; Hmm, no, we should use the locally installed file, not the one hosted in webkit.org.
&gt; 
&gt; The hosted one should have the latest updates/fixes, shouldn&apos;t it?

Yep. And it may be incompatible with the Inspector that is built in the library. Also, we don&apos;t want all users of WebKitGTK+ hitting a WebKit development server. And we don&apos;t want to require that the developer has an internet connection available for using the inspector. I can only see disadvantages for both the WebKit project and Inspector users.
 
&gt; &gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:87
&gt; &gt;&gt; +        portValue = 2999;
&gt; &gt; 
&gt; &gt; Why 2999? Is it the same one used by the other ports?
&gt; 
&gt; well it was mentioned here as an example : http://www.webkit.org/blog/1620/webkit-remote-debugging/.
&gt; Can be any value I suppose.

That sounds OK then. I hope we&apos;ll also add some API for starting the server, so a browser can do that even if it wasn&apos;t started with the env variable =).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>692630</commentid>
    <comment_count>10</comment_count>
      <attachid>157749</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-08-10 09:53:59 -0700</bug_when>
    <thetext>Created attachment 157749
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>704885</commentid>
    <comment_count>11</comment_count>
      <attachid>157749</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-08-26 13:13:56 -0700</bug_when>
    <thetext>Comment on attachment 157749
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=157749&amp;action=review

Needs work still. I think I now understand better how starting and closing the server is supposed to work after reading more of the Qt code, so could make more useful suggestions.

&gt; Source/WebCore/inspector/front-end/inspectorPageIndex.html:1
&gt; +&lt;!DOCTYPE html&gt;

This is the same page qt uses as far as I understand, we should share it with qt somehow, either by moving it here (and thus removing qt&apos;s own copy) or by placing it somewhere under Source/WebKit2/UIProcess/InpsectorServer, let&apos;s not have a duplicate though.

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:116
&gt; +    if (m_client) {

Make this an early return :

if (!m_client)
    return;

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:118
&gt; +        // The client can close the handle, potentially removing the last reference.
&gt; +        RefPtr&lt;SocketStreamHandle&gt; protect(this); 

My comment about this not being needed still stands =)

&gt; Source/WebKit2/ChangeLog:14
&gt; +        (for example using 192.168.124.130:2999 link).

I&apos;d remove this parens, they are already implied by the rest of the description.

&gt; Source/WebKit2/ChangeLog:16
&gt; +        It is not possible to test the change automatically, so all testing has been done manually.

Qt has API tests, we can probably add a couple to our own tests, here: http://trac.webkit.org/browser/trunk/Source/WebKit2/UIProcess/API/gtk/tests

&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.cpp:87
&gt; +    start();    

See bellow.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.cpp:98
&gt; +    if (m_clientMap.isEmpty()) // stop the server if no pages left, the server will be restarted if new page is registered.
&gt; +        close();

See bellow (regarding start).

&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.h:4
&gt; + * Copyright (C) 2012 Samsung Electronics Ltd. All Rights Reserved. 

Doesn&apos;t look like a substation enough change to warrant this.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.cpp:4
&gt; + * Copyright (C) 2012 Samsung Electronics Ltd. All Rights Reserved. 

Ditto, but see bellow.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.cpp:94
&gt; +void WebSocketServer::start()
&gt; +{
&gt; +    if (m_state == Listening)
&gt; +        return;
&gt; +
&gt; +    platformGetIPAddress(m_bindAddress, m_port);
&gt; +    listen(m_bindAddress, m_port);
&gt; +}
&gt; +

I don&apos;t think we should have something like this here. This kind of logic should go on the platform-specific implementation or be performed by the user agent. We should have public API in the future to start and close down the server, for now I think we should use Qt&apos;s approach of initializing the server as part of the WebContext initialization, using the variable, like you did. See: http://trac.webkit.org/browser/trunk/Source/WebKit2/UIProcess/qt/QtWebContext.cpp#L48

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.h:4
&gt; + * Copyright (C) 2012 Samsung Electronics Ltd. All Rights Reserved. 

Ditto.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.h:43
&gt; +#include &lt;glib.h&gt;

Should not need glib.h here from what I&apos;ve seen.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:4
&gt; + * Copyright (C) 2012 Samsung Electronics Ltd. All Rights Reserved.

Ditto.

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:129
&gt; +    // To prevent double deletion in WebSocketServer::didCloseWebSocketServerConnection()
&gt; +    if (!m_socket)
&gt; +        return;

Is this triggered by something this patch does currently, like closing the socket when the last page is unregistered?

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:38
&gt; +#include &quot;FileSystem.h&quot;
&gt; +#include &quot;WebInspectorProxy.h&quot;
&gt; +#include &quot;WebPageProxy.h&quot;
&gt; +#include &lt;WebCore/MIMETypeRegistry.h&gt;
&gt; +
&gt; +#include &lt;gio/gio.h&gt;
&gt; +#include &lt;glib.h&gt;
&gt; +
&gt; +#include &lt;wtf/gobject/GOwnPtr.h&gt;
&gt; +#include &lt;wtf/text/CString.h&gt;
&gt; +#include &lt;wtf/text/StringBuilder.h&gt;

There should be no empty lines here, and it looks like the sorting is not right (&lt;g...&gt; should go before &lt;WebCore...&gt;)

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:120
&gt; +void getIPAddress(String&amp; ipAddress)

I think we should always default to 127.0.0.1 if no explicit IP is given, opening up the server to a public IP would be quite bad, so I&apos;d remove this function. If you need for your particular use-case you can add this kind of logic to the browser afterwards, or to a wrapper that starts the browser with the environment variable filled.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:147
&gt; +void WebSocketServer::platformGetIPAddress(String&amp; bindAddress, unsigned short&amp; port)

Ditto.

&gt; Source/WebKit2/UIProcess/InspectorServer/qt/WebSocketServerQt.cpp:52
&gt; +void WebSocketServer::platformGetIPAddress(String&amp;, unsigned short&amp;)
&gt; +{
&gt; +}
&gt; +

Ditto, thus.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707267</commentid>
    <comment_count>12</comment_count>
      <attachid>157749</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-08-29 03:23:43 -0700</bug_when>
    <thetext>Comment on attachment 157749
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=157749&amp;action=review

&gt;&gt; Source/WebCore/inspector/front-end/inspectorPageIndex.html:1
&gt;&gt; +&lt;!DOCTYPE html&gt;
&gt; 
&gt; This is the same page qt uses as far as I understand, we should share it with qt somehow, either by moving it here (and thus removing qt&apos;s own copy) or by placing it somewhere under Source/WebKit2/UIProcess/InpsectorServer, let&apos;s not have a duplicate though.

I think it should be in Source/WebCore/Inspector/front-end/inspector as it&apos;s part of front-end (kind of). I will remove qt&apos;s copy.

&gt;&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:118
&gt;&gt; +        RefPtr&lt;SocketStreamHandle&gt; protect(this); 
&gt; 
&gt; My comment about this not being needed still stands =)

Forgot to remove :)

&gt;&gt; Source/WebKit2/ChangeLog:16
&gt;&gt; +        It is not possible to test the change automatically, so all testing has been done manually.
&gt; 
&gt; Qt has API tests, we can probably add a couple to our own tests, here: http://trac.webkit.org/browser/trunk/Source/WebKit2/UIProcess/API/gtk/tests

OK, will check how it is done in QT port. Not entirely sure yet how to test it.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.h:4
&gt;&gt; + * Copyright (C) 2012 Samsung Electronics Ltd. All Rights Reserved. 
&gt; 
&gt; Doesn&apos;t look like a substation enough change to warrant this.

Is it about if change is less than 10 lines?

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.cpp:94
&gt;&gt; +
&gt; 
&gt; I don&apos;t think we should have something like this here. This kind of logic should go on the platform-specific implementation or be performed by the user agent. We should have public API in the future to start and close down the server, for now I think we should use Qt&apos;s approach of initializing the server as part of the WebContext initialization, using the variable, like you did. See: http://trac.webkit.org/browser/trunk/Source/WebKit2/UIProcess/qt/QtWebContext.cpp#L48

Will undo my change here, hopefully there will be more generic approach in the future.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:129
&gt;&gt; +        return;
&gt; 
&gt; Is this triggered by something this patch does currently, like closing the socket when the last page is unregistered?

No as far as I remember, will double check anyway.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:120
&gt;&gt; +void getIPAddress(String&amp; ipAddress)
&gt; 
&gt; I think we should always default to 127.0.0.1 if no explicit IP is given, opening up the server to a public IP would be quite bad, so I&apos;d remove this function. If you need for your particular use-case you can add this kind of logic to the browser afterwards, or to a wrapper that starts the browser with the environment variable filled.

That was one of your comments that it would be good to get IP address somehow :). Don&apos;t really need it, so will remove it anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>708604</commentid>
    <comment_count>13</comment_count>
      <attachid>157749</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-08-30 07:40:34 -0700</bug_when>
    <thetext>Comment on attachment 157749
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=157749&amp;action=review

&gt;&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.cpp:94
&gt;&gt;&gt; +
&gt;&gt; 
&gt;&gt; I don&apos;t think we should have something like this here. This kind of logic should go on the platform-specific implementation or be performed by the user agent. We should have public API in the future to start and close down the server, for now I think we should use Qt&apos;s approach of initializing the server as part of the WebContext initialization, using the variable, like you did. See: http://trac.webkit.org/browser/trunk/Source/WebKit2/UIProcess/qt/QtWebContext.cpp#L48
&gt; 
&gt; Will undo my change here, hopefully there will be more generic approach in the future.

I found one place which should be good for the server initialization: void WebContext::platformInitializeWebProcess(WebProcessCreationParameters&amp;) in WebContextGtk.cpp.
However with this approach the server will start up regardless if developer extras is enabled or not. (The same for QT port). That doesn&apos;t seem to be correct. That&apos;s why
in one of my previous patches I started the server in WebPageProxy::initializeWebPage() after checking developer extras. What do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>713414</commentid>
    <comment_count>14</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-09-06 10:16:29 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; I think we should always default to 127.0.0.1 if no explicit IP is given, opening up the server to a public IP would be quite bad, so I&apos;d remove this function. If you need for your particular use-case you can add this kind of logic to the browser afterwards, or to a wrapper that starts the browser with the environment variable filled.
&gt; 
&gt; That was one of your comments that it would be good to get IP address somehow :). Don&apos;t really need it, so will remove it anyway.

I couldn&apos;t find where I said this, maybe I said something misleading, but I didn&apos;t mean that.

(In reply to comment #13)
&gt; &gt; Will undo my change here, hopefully there will be more generic approach in the future.
&gt; 
&gt; I found one place which should be good for the server initialization: void WebContext::platformInitializeWebProcess(WebProcessCreationParameters&amp;) in WebContextGtk.cpp.
&gt; However with this approach the server will start up regardless if developer extras is enabled or not. (The same for QT port). That doesn&apos;t seem to be correct. That&apos;s why
&gt; in one of my previous patches I started the server in WebPageProxy::initializeWebPage() after checking developer extras. What do you think?

I think we should just do what Qt does, for now; if the developer has used the environment variable, then it&apos;s safe to assume they want it, even without checking the developer extras setting. When we add API to open up the server in the future we can think about how it will interact with developer extras.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>716994</commentid>
    <comment_count>15</comment_count>
      <attachid>163316</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-11 02:52:08 -0700</bug_when>
    <thetext>Created attachment 163316
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>716998</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-09-11 02:57:48 -0700</bug_when>
    <thetext>Thanks for the patch. If this patch contains new public API please make sure it follows the guidelines for new WebKit2 GTK+ API. See http://trac.webkit.org/wiki/WebKitGTK/AddingNewWebKit2API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717056</commentid>
    <comment_count>17</comment_count>
      <attachid>163316</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-09-11 04:46:53 -0700</bug_when>
    <thetext>Comment on attachment 163316
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163316&amp;action=review

I don&apos;t know much about the inspector nor the inspector server, setting r- because of the memory leaks, styles issues, etc.

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:103
&gt; +    m_socketConnection = adoptGRef(socketConnection);

You should not adopt the ref, but take a reference.

&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:116
&gt; +    m_outputStream = G_POLLABLE_OUTPUT_STREAM(g_io_stream_get_output_stream(G_IO_STREAM(m_socketConnection.get())));
&gt; +    m_inputStream = g_io_stream_get_input_stream(G_IO_STREAM(m_socketConnection.get()));
&gt; +    m_readBuffer = new char[READ_BUFFER_SIZE];
&gt; +
&gt; +    g_input_stream_read_async(m_inputStream.get(), m_readBuffer, READ_BUFFER_SIZE, G_PRIORITY_DEFAULT, 0,
&gt; +        reinterpret_cast&lt;GAsyncReadyCallback&gt;(readReadyCallback), m_id);
&gt; +
&gt; +    m_state = Open;
&gt; +
&gt; +    if (!m_client)
&gt; +        return;
&gt; +
&gt; +    m_client-&gt;didOpenSocketStream(this);

Instead of duplicating all this code, since the socket is already connected this could be just:

m_id = activateHandle(this);
connected(socketConnection, 0);

For this to work, we would also need to fix connectedCallback() to use GRefPtr and adopGRef for the socket connection (note that it&apos;s leaked in case of error), and take a ref instead of adopting it in connected().

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:51
&gt; +    GRefPtr&lt;GFile&gt; file(g_file_new_for_path(localPath.latin1().data()));

Use adoptGRef() to avoid leaking the GFile. GFile expects UTF-8 so you should use localPath.utf8().data() instead of latin1

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:54
&gt; +    if (file) {

g_file_new always returns a valid pointer, so you don&apos;t need this check

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:56
&gt; +        GRefPtr&lt;GFileInfo&gt; fileInfo(g_file_query_info(file.get(), G_FILE_ATTRIBUTE_STANDARD_SIZE, G_FILE_QUERY_INFO_NONE, NULL, &amp;error.outPtr()));

Use adoptGRef here too. Use 0 instead of NULL. Also since you are not handling the error, you could pass 0, and check the return value, returning if fileInfo is NULL.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:61
&gt; +        GRefPtr&lt;GFileInputStream&gt; inputStream(g_file_read(file.get(), NULL, &amp;error.outPtr()));

You should use adopGRef here too, use 0 instad of NULL, and pass 0 for the error too since you are not handling the error.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:66
&gt; +        size = g_file_info_get_size(fileInfo.get());
&gt; +        data.grow(size);

This could be a single line:

data.grow(g_file_info_get_size(fileInfo.get()));

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:70
&gt; +        gsize bytesRead = 0;
&gt; +        if (!g_input_stream_read_all(G_INPUT_STREAM(inputStream.get()), data.data(), data.size(), &amp;bytesRead, 0, 0))
&gt; +            return false;

bytesRead is unused, you could simply pass NULL to g_input_stream_read_all

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:74
&gt; +        size_t extStart = localPath.reverseFind(&apos;.&apos;);
&gt; +        String ext = localPath.substring(extStart != notFound ? extStart + 1 : 0);
&gt; +        contentType = WebCore::MIMETypeRegistry::getMIMETypeForExtension(ext);

Instead of this, you could pass G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE to g_file_query_info and get the mime type from the GFileInfo with g_file_info_get_content_type().

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:55
&gt; +    WebSocketServer* server = (WebSocketServer*)self;

Use C++ style casts. In this case we can simply avoid the cast, since the callback is already &quot;casted&quot;, you can pass WebSocketServer* server as parameter instead of gpointer self

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:57
&gt; +    // reference connection before accepting it
&gt; +    g_object_ref_sink(connection);

Don&apos;t do this, pass the connection to SocketStreamHandle::create() and the constructor will tak a reference.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:69
&gt; +    m_socketService = adoptGRef(g_socket_service_new());
&gt; +    if (m_socketService.get()) {

g_socket_service_new() always returns a valid pointer.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:72
&gt; +        if (!g_socket_service_is_active(m_socketService.get()))
&gt; +            g_socket_service_start(m_socketService.get());

g_socket_service_start already checks whether the service is active or not, so you can call g_socket_service_start(m_socketService.get()); directly.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:86
&gt; +    GSocketService* socketService = m_socketService.get();
&gt; +    if (!socketService) {
&gt; +        LOG_ERROR(&quot;Failed to get socket service.&quot;);
&gt; +        return false;
&gt; +    }

I think this shouldn&apos;t happen, if you want to be extra sure, add an assert ASSERT(socketService);

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:89
&gt; +    GInetAddress* address = g_inet_address_new_from_string(bindAddress.latin1().data());
&gt; +    GSocketAddress* socketAddress = g_inet_socket_address_new(address, port);

Use GRefPtr and adoptGRef in both cases. Use bindAddress.utf8().data() instead of latin1 too.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:105
&gt; +    gboolean result = g_socket_listener_add_address(G_SOCKET_LISTENER(socketService),
&gt; +                                  socketAddress,
&gt; +                                  G_SOCKET_TYPE_STREAM,
&gt; +                                  G_SOCKET_PROTOCOL_TCP, 0, 0, 0);
&gt; +
&gt; +    if (!result)
&gt; +         LOG_ERROR(&quot;Failed to add inet address to web inspector server listener.&quot;);
&gt; +
&gt; +    g_object_unref(socketAddress);
&gt; +    g_object_unref(address);
&gt; +
&gt; +    if (!result)
&gt; +        return false;
&gt; +
&gt; +    return true;

All this could be just 

return g_socket_listener_add_address(G_SOCKET_LISTENER(m_socketService.get()), socketAddress.get(), G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, 0, 0, 0);

&gt; Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp:50
&gt; -    String localPath = (path == &quot;/&quot;) ? &quot;/webkit/resources/inspectorPageIndex.html&quot; : path;
&gt; +    String localPath = (path == &quot;/&quot;) ? &quot;/webkit/inspector/inspectorPageIndex.html&quot; : path;

Is this a bug in Qt implementation or something that has changed in this patch?

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:66
&gt; +    initialized = WebInspectorServer::shared().listen(bindAddress, port);

Do we want this even if the env variable is not present?

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:78
&gt; +    initInspectorServer();

How is the inspector server run? does it run in the UI process?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717182</commentid>
    <comment_count>18</comment_count>
      <attachid>163316</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-11 08:14:22 -0700</bug_when>
    <thetext>Comment on attachment 163316
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163316&amp;action=review

&gt;&gt; Source/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp:116
&gt;&gt; +    m_client-&gt;didOpenSocketStream(this);
&gt; 
&gt; Instead of duplicating all this code, since the socket is already connected this could be just:
&gt; 
&gt; m_id = activateHandle(this);
&gt; connected(socketConnection, 0);
&gt; 
&gt; For this to work, we would also need to fix connectedCallback() to use GRefPtr and adopGRef for the socket connection (note that it&apos;s leaked in case of error), and take a ref instead of adopting it in connected().

Yep, I realized I should have call connected() here. Original version of this function before few patches was a bit different. :)

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:57
&gt;&gt; +    g_object_ref_sink(connection);
&gt; 
&gt; Don&apos;t do this, pass the connection to SocketStreamHandle::create() and the constructor will tak a reference.

OK, makes sense which changes above,

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp:50
&gt;&gt; +    String localPath = (path == &quot;/&quot;) ? &quot;/webkit/inspector/inspectorPageIndex.html&quot; : path;
&gt; 
&gt; Is this a bug in Qt implementation or something that has changed in this patch?

GTK and QT ports will share inspectorPageIndex.html. I moved the file in generic location (see previous reviews)

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:66
&gt;&gt; +    initialized = WebInspectorServer::shared().listen(bindAddress, port);
&gt; 
&gt; Do we want this even if the env variable is not present?

I think so. It will be bound to 127.0.0.1 by default. It basically copies QT port behavior here.

.

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:78
&gt;&gt; +    initInspectorServer();
&gt; 
&gt; How is the inspector server run? does it run in the UI process?

Yes, as a part of GTK main loop in UI process.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717206</commentid>
    <comment_count>19</comment_count>
      <attachid>163316</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-09-11 08:36:24 -0700</bug_when>
    <thetext>Comment on attachment 163316
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163316&amp;action=review

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:51
&gt;&gt; +    GRefPtr&lt;GFile&gt; file(g_file_new_for_path(localPath.latin1().data()));
&gt; 
&gt; Use adoptGRef() to avoid leaking the GFile. GFile expects UTF-8 so you should use localPath.utf8().data() instead of latin1

This is an awesome review, but I just thought it&apos;d be good to point out here that GFile accepts the &quot;glib filename encoding&quot; which isn&apos;t necessarily UTF-8. Instead you should use fileSystemRepresentation from FileSystemGtk.cpp to convert from a String to a CString.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717209</commentid>
    <comment_count>20</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-09-11 08:37:06 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; &gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:66
&gt; &gt;&gt; +    initialized = WebInspectorServer::shared().listen(bindAddress, port);
&gt; &gt; 
&gt; &gt; Do we want this even if the env variable is not present?
&gt; 
&gt; I think so. It will be bound to 127.0.0.1 by default. It basically copies QT port behavior here.

hmm, in Source/WebKit2/UIProcess/qt/QtWebContext.cpp, function initInspectorServer() there&apos;s

QString inspectorEnv = QString::fromUtf8(qgetenv(&quot;QTWEBKIT_INSPECTOR_SERVER&quot;));
    if (!inspectorEnv.isEmpty()) {
    }

So if the env var si not present it does nothing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717212</commentid>
    <comment_count>21</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-09-11 08:38:07 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (From update of attachment 163316 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=163316&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:51
&gt; &gt;&gt; +    GRefPtr&lt;GFile&gt; file(g_file_new_for_path(localPath.latin1().data()));
&gt; &gt; 
&gt; &gt; Use adoptGRef() to avoid leaking the GFile. GFile expects UTF-8 so you should use localPath.utf8().data() instead of latin1
&gt; 
&gt; This is an awesome review, but I just thought it&apos;d be good to point out here that GFile accepts the &quot;glib filename encoding&quot; which isn&apos;t necessarily UTF-8. Instead you should use fileSystemRepresentation from FileSystemGtk.cpp to convert from a String to a CString.

You are right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>717284</commentid>
    <comment_count>22</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-11 09:44:21 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #18)
&gt; &gt; &gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:66
&gt; &gt; &gt;&gt; +    initialized = WebInspectorServer::shared().listen(bindAddress, port);
&gt; &gt; &gt; 
&gt; &gt; &gt; Do we want this even if the env variable is not present?
&gt; &gt; 
&gt; &gt; I think so. It will be bound to 127.0.0.1 by default. It basically copies QT port behavior here.
&gt; 
&gt; hmm, in Source/WebKit2/UIProcess/qt/QtWebContext.cpp, function initInspectorServer() there&apos;s
&gt; 
&gt; QString inspectorEnv = QString::fromUtf8(qgetenv(&quot;QTWEBKIT_INSPECTOR_SERVER&quot;));
&gt;     if (!inspectorEnv.isEmpty()) {
&gt;     }
&gt; 
&gt; So if the env var si not present it does nothing.
Yes, you are right. Just checked myself. Will change it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>719508</commentid>
    <comment_count>23</comment_count>
      <attachid>163880</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-13 08:14:28 -0700</bug_when>
    <thetext>Created attachment 163880
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>719603</commentid>
    <comment_count>24</comment_count>
      <attachid>163880</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-09-13 09:48:02 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

OK, we&apos;re getting there. I&apos;m worried about the changes to WebSocketServerConnection, though.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:86
&gt; +#if (!GLIB_CHECK_VERSION(2, 31, 0))
&gt; +    g_thread_create(testServerMonitorThreadFunc, 0, FALSE, 0);
&gt; +#else
&gt; +    g_thread_new(&quot;TestServerMonitor&quot;, testServerMonitorThreadFunc, 0);

Do we really need to use a thread here? Wouldn&apos;t a glib timeout do?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:96
&gt; +    // Save current WEBKIT_INSPECTOR_SERVER variable to restore it after the test is finished.
&gt; +    s_inspectorServerEnv = g_getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;);

You shouldn&apos;t need to do this, setting the variable for your own process will not affect the parents.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:98
&gt; +    // Overwrite WEBKIT_INSPECTOR_SERVER variable with default value.

No need to add &quot;what&quot; comments when the line of code is already pretty explicit, I think you can cut back most of the comments.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:116
&gt; +    if (!g_spawn_async_with_pipes(0, testServerArgv, 0, static_cast&lt;GSpawnFlags&gt;(0), 0, 0,
&gt; +                                  &amp;s_childProcessPid, 0, &amp;childStdout, 0, 0)) {
&gt; +        close(childStdout);
&gt; +        return;
&gt; +    }

I believe this should be an assert instead of a simple check; if the spawn fails all bets are off.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:119
&gt; +    // Start monitoring the test server (in a separate thread) to
&gt; +    // ensure we don&apos;t block on the child process more than a timeout.

I don&apos;t understand why you&apos;d block on the child process using  glib timeout on the main thread.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:128
&gt; +    GIOChannel* ioChannel = g_io_channel_unix_new(childStdout);
&gt; +    if (g_io_channel_read_chars(ioChannel, msg, 2, 0, 0) == G_IO_STATUS_NORMAL) {
&gt; +        // Check whether the server sent a message saying it&apos;s ready
&gt; +        // and store the result globally, so the monitor can see it.
&gt; +        s_childIsReady = msg[0] == &apos;O&apos; &amp;&amp; msg[1] == &apos;K&apos;;
&gt; +    }

Guess because you&apos;re blocking here? You should just need to g_io_add_watch here instead.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:239
&gt; +    // debugging session was established correctly through web socket. It should be something like &quot;Web Inspector - &lt;Page URL&gt;&quot;.

How about we assert g_str_has_prefix instead?

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:84
&gt;  {
&gt; -    // If this ASSERT happens on any platform then their SocketStreamHandle::send
&gt; -    // followed by a SocketStreamHandle::close is not guarenteed to have sent all
&gt; -    // data. If this happens, we need to slightly change the design to include a
&gt; -    // SocketStreamHandleClient::didSend, handle it here, and add an m_shutdownAfterSend
&gt; -    // state on this WebSocketServerConnection.
&gt; +    if (m_socket-&gt;bufferedAmount()) {
&gt; +        m_shutdownAfterSend = true;
&gt; +        return;
&gt; +    }
&gt; +
&gt;      ASSERT(!m_socket-&gt;bufferedAmount());

This doesn&apos;t look right. The assert is now useless... it may make sense to drop it, but then we should drop it and implement what&apos;s descried in the comment, not just make it useless =). Might be useful to get the developer who wrote it (git blame should tell you) what they think about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>720386</commentid>
    <comment_count>25</comment_count>
      <attachid>163880</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-09-14 00:08:52 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:86
&gt;&gt; +    g_thread_new(&quot;TestServerMonitor&quot;, testServerMonitorThreadFunc, 0);
&gt; 
&gt; Do we really need to use a thread here? Wouldn&apos;t a glib timeout do?

I think the reasoning is the same as in bug #72589, see the discussion there.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:40
&gt; +bool WebInspectorServer::platformResourceForPath(const String&amp; path, Vector&lt;char&gt;&amp; data, String&amp; contentType)

How often is this method called? I don&apos;t like all these synchronous API blocking the UI process, but the method is synchronous so I don&apos;t see any other solution.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:58
&gt; +    GRefPtr&lt;GFileInputStream&gt; inputStream = adoptGRef(g_file_read(file.get(), NULL, 0));

Use 0 instead of NULL.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:66
&gt; +    contentType = GOwnPtr&lt;gchar&gt;(g_file_info_get_attribute_as_string(fileInfo.get(), G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE)).get();

You can use g_file_info_get_content_type() which returns a const char *, if what contentType expects is actually the mime type, you might need to call g_content_type_get_mime_type() to get the mime type from the content type.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:44
&gt; +static gboolean connectionCallback(GSocketService* service,
&gt; +                                   GSocketConnection* connection,
&gt; +                                   GObject* sourceObject,
&gt; +                                   WebSocketServer* server)

This should be a single line.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:47
&gt; +    GSocketAddress* sockaddr = g_socket_connection_get_remote_address(connection, NULL);

Use GRefPtr and adoptGRef. Use also 0 instead of NULL.

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:61
&gt; +        initialized = WebInspectorServer::shared().listen(bindAddress, port);

initialized is to ensure initInspectorServer() is executed only once, so it should set to true always, even if the env var is not present or the server fails to run.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>720460</commentid>
    <comment_count>26</comment_count>
      <attachid>163880</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-09-14 02:18:30 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt; Source/WebCore/ChangeLog:13
&gt; +        * inspector/front-end/inspectorPageIndex.html: Added.

I don&apos;t think it belongs in WebCore, the inspector server is contained in WebKit2, so the resource should go there as well.
Source/WebKit2/UIProcess/InspectorServer/front-end would feel like a better place to me, but that means that ports might have to include it in a different resource bundle.

&gt; Source/WebKit2/config.h:122
&gt;  #if PLATFORM(QT)
&gt;  #define ENABLE_INSPECTOR_SERVER 1
&gt; +#elif PLATFORM(GTK)
&gt; +#define ENABLE_INSPECTOR_SERVER 1

#if PLATFORM(QT) || PLATFORM(GTK)

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:130
&gt; +    // To prevent double deletion in WebSocketServer::didCloseWebSocketServerConnection()
&gt; +    if (!m_socket)
&gt; +        return;

Can you elaborate on this? If in any case didCloseWebSocketServerConnection isn&apos;t run, this would prevent the server from accepting a new connection if the previous connection wasn&apos;t cleaned-up properly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>720464</commentid>
    <comment_count>27</comment_count>
      <attachid>163880</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-09-14 02:23:56 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

Is the intent to make this work for EFL later?

&gt; Source/WebCore/ChangeLog:11
&gt; +        inspectorPageIndex.html has been moved to new location to share the file between GTK and QT ports. 

Qt*

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:45
&gt; +    String envStr(getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;));

g_getenv?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>720536</commentid>
    <comment_count>28</comment_count>
      <attachid>163880</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-14 03:44:53 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt;&gt; Source/WebCore/ChangeLog:13
&gt;&gt; +        * inspector/front-end/inspectorPageIndex.html: Added.
&gt; 
&gt; I don&apos;t think it belongs in WebCore, the inspector server is contained in WebKit2, so the resource should go there as well.
&gt; Source/WebKit2/UIProcess/InspectorServer/front-end would feel like a better place to me, but that means that ports might have to include it in a different resource bundle.

OK, I will move it to Source/WebKit2/UIProcess/InspectorServer/front-end and update resource path if needed.

&gt;&gt; Source/WebKit2/config.h:122
&gt;&gt; +#define ENABLE_INSPECTOR_SERVER 1
&gt; 
&gt; #if PLATFORM(QT) || PLATFORM(GTK)

ok

&gt;&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:86
&gt;&gt;&gt; +    g_thread_new(&quot;TestServerMonitor&quot;, testServerMonitorThreadFunc, 0);
&gt;&gt; 
&gt;&gt; Do we really need to use a thread here? Wouldn&apos;t a glib timeout do?
&gt; 
&gt; I think the reasoning is the same as in bug #72589, see the discussion there.

Check as well implementation of TestWebkitAccessability.cpp /WebKit2/UIProcess/API/gtk/tests/TestWebKitAccessibility.cpp

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:96
&gt;&gt; +    s_inspectorServerEnv = g_getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;);
&gt; 
&gt; You shouldn&apos;t need to do this, setting the variable for your own process will not affect the parents.

yep, forget about this.

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:98
&gt;&gt; +    // Overwrite WEBKIT_INSPECTOR_SERVER variable with default value.
&gt; 
&gt; No need to add &quot;what&quot; comments when the line of code is already pretty explicit, I think you can cut back most of the comments.

there is no harm in additional comments I suppose plus I copied this code anyway from TestWebkitAccessability.cpp with all these comments :)

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:116
&gt;&gt; +    }
&gt; 
&gt; I believe this should be an assert instead of a simple check; if the spawn fails all bets are off.

ok

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:128
&gt;&gt; +    }
&gt; 
&gt; Guess because you&apos;re blocking here? You should just need to g_io_add_watch here instead.

ok will check

&gt;&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:239
&gt;&gt; +    // debugging session was established correctly through web socket. It should be something like &quot;Web Inspector - &lt;Page URL&gt;&quot;.
&gt; 
&gt; How about we assert g_str_has_prefix instead?

hm, probably you are right. What if some changes title format in the future?

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:84
&gt;&gt;      ASSERT(!m_socket-&gt;bufferedAmount());
&gt; 
&gt; This doesn&apos;t look right. The assert is now useless... it may make sense to drop it, but then we should drop it and implement what&apos;s descried in the comment, not just make it useless =). Might be useful to get the developer who wrote it (git blame should tell you) what they think about this.

yes, assert shouldn&apos;t be here any more. I implemented what was described in the comment but instead of adding new callback in SocketStreamHandleClient
I used existing didUpdateBufferedAmount which basically means didSend when bufferedAmount is 0.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:130
&gt;&gt; +        return;
&gt; 
&gt; Can you elaborate on this? If in any case didCloseWebSocketServerConnection isn&apos;t run, this would prevent the server from accepting a new connection if the previous connection wasn&apos;t cleaned-up properly.

I think if m_socket is 0 didCloseWebSocketServerConnection has been already called, I will attach call stack to show why double deletion happens.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:40
&gt;&gt; +bool WebInspectorServer::platformResourceForPath(const String&amp; path, Vector&lt;char&gt;&amp; data, String&amp; contentType)
&gt; 
&gt; How often is this method called? I don&apos;t like all these synchronous API blocking the UI process, but the method is synchronous so I don&apos;t see any other solution.

Whenever inspector page on remote host sends resource request. Shouldn&apos;t happen often, didn&apos;t notice slow down because of that.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:58
&gt;&gt; +    GRefPtr&lt;GFileInputStream&gt; inputStream = adoptGRef(g_file_read(file.get(), NULL, 0));
&gt; 
&gt; Use 0 instead of NULL.

ok

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:66
&gt;&gt; +    contentType = GOwnPtr&lt;gchar&gt;(g_file_info_get_attribute_as_string(fileInfo.get(), G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE)).get();
&gt; 
&gt; You can use g_file_info_get_content_type() which returns a const char *, if what contentType expects is actually the mime type, you might need to call g_content_type_get_mime_type() to get the mime type from the content type.

g_file_info_get_content_type() returns NULL because G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE attribute is not set. I can use G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
in attributes string but it will probably slow down getting file info a bit.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:44
&gt;&gt; +                                   WebSocketServer* server)
&gt; 
&gt; This should be a single line.

ok

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:47
&gt;&gt; +    GSocketAddress* sockaddr = g_socket_connection_get_remote_address(connection, NULL);
&gt; 
&gt; Use GRefPtr and adoptGRef. Use also 0 instead of NULL.

ok

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:45
&gt;&gt; +    String envStr(getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;));
&gt; 
&gt; g_getenv?

ok

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:61
&gt;&gt; +        initialized = WebInspectorServer::shared().listen(bindAddress, port);
&gt; 
&gt; initialized is to ensure initInspectorServer() is executed only once, so it should set to true always, even if the env var is not present or the server fails to run.

ok</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>720808</commentid>
    <comment_count>29</comment_count>
      <attachid>163880</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-09-14 08:43:26 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt;&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:130
&gt;&gt;&gt; +        return;
&gt;&gt; 
&gt;&gt; Can you elaborate on this? If in any case didCloseWebSocketServerConnection isn&apos;t run, this would prevent the server from accepting a new connection if the previous connection wasn&apos;t cleaned-up properly.
&gt; 
&gt; I think if m_socket is 0 didCloseWebSocketServerConnection has been already called, I will attach call stack to show why double deletion happens.

The call stack:
0	__GI_raise	raise.c	64	0x7ffff283f445	
1	__GI_abort	abort.c	91	0x7ffff2842bab	
2	__libc_message	libc_fatal.c	201	0x7ffff287ce2e	
3	malloc_printerr	malloc.c	5007	0x7ffff2887626	
4	WebKit::WebSocketServerConnection::~WebSocketServerConnection	WebSocketServerConnection.cpp	60	0x7ffff43e590e	
5	WTF::deleteOwnedPtr&lt;WebKit::WebSocketServerConnection&gt;	OwnPtrCommon.h	56	0x7ffff43e57ec	
6	WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;::~OwnPtr	OwnPtr.h	55	0x7ffff43e5783	
7	WTF::VectorDestructor&lt;true, WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt; &gt;::destruct	Vector.h	59	0x7ffff43e563f	
8	WTF::VectorTypeOperations&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt; &gt;::destruct	Vector.h	221	0x7ffff43e5181	
9	WTF::Deque&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;, 0ul&gt;::remove	Deque.h	516	0x7ffff43e4fbd	
10	WTF::Deque&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;, 0ul&gt;::remove	Deque.h	496	0x7ffff43e45d1	
11	WebKit::WebSocketServer::didCloseWebSocketServerConnection	WebSocketServer.cpp	95	0x7ffff43e4267	
12	WebKit::WebSocketServerConnection::didCloseSocketStream	WebSocketServerConnection.cpp	137	0x7ffff43e5ef1	
13	WebCore::SocketStreamHandle::platformClose	SocketStreamHandleSoup.cpp	205	0x7ffff4e5477c	
14	WebCore::SocketStreamHandleBase::disconnect	SocketStreamHandleBase.cpp	98	0x7ffff4e48c82	
15	WebCore::SocketStreamHandleBase::close	SocketStreamHandleBase.cpp	91	0x7ffff4e48c44	
16	WebCore::SocketStreamHandle::readBytes	SocketStreamHandleSoup.cpp	140	0x7ffff4e54327	
17	WebCore::readReadyCallback	SocketStreamHandleSoup.cpp	274	0x7ffff4e54bf3	
18	async_ready_callback_wrapper	ginputstream.c	529	0x7ffff33b1775	
19	g_simple_async_result_complete	gsimpleasyncresult.c	767	0x7ffff33c68dd	
20	complete_in_idle_cb	gsimpleasyncresult.c	779	0x7ffff33c6a0c	
...	&lt;More&gt;

SocketStreamHandle instance gets deleted as a part of WebSocketServerConnection instance. if I protect SocketStreamHandle before close() call the issue seems to be fixed,
however there another crush might occur. Will investigate it further and fix after my 2 weeks trip.


void SocketStreamHandle::readBytes(signed long bytesRead, GError* error)
{
    if (error) {
        m_client-&gt;didFailSocketStream(this, SocketStreamError(error-&gt;code, error-&gt;message));
        return;
    }

+   RefPtr&lt;SocketStreamHandle&gt; protect(this);
    if (!bytesRead) {
        close();
        return;
    }

    // The client can close the handle, potentially removing the last reference.
-   RefPtr&lt;SocketStreamHandle&gt; protect(this);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721748</commentid>
    <comment_count>30</comment_count>
      <attachid>163880</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-09-17 01:38:23 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt;&gt;&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:130
&gt;&gt;&gt;&gt; +        return;
&gt;&gt;&gt; 
&gt;&gt;&gt; Can you elaborate on this? If in any case didCloseWebSocketServerConnection isn&apos;t run, this would prevent the server from accepting a new connection if the previous connection wasn&apos;t cleaned-up properly.
&gt;&gt; 
&gt;&gt; I think if m_socket is 0 didCloseWebSocketServerConnection has been already called, I will attach call stack to show why double deletion happens.
&gt; 
&gt; The call stack:
&gt; 0    __GI_raise    raise.c    64    0x7ffff283f445    
&gt; 1    __GI_abort    abort.c    91    0x7ffff2842bab    
&gt; 2    __libc_message    libc_fatal.c    201    0x7ffff287ce2e    
&gt; 3    malloc_printerr    malloc.c    5007    0x7ffff2887626    
&gt; 4    WebKit::WebSocketServerConnection::~WebSocketServerConnection    WebSocketServerConnection.cpp    60    0x7ffff43e590e    
&gt; 5    WTF::deleteOwnedPtr&lt;WebKit::WebSocketServerConnection&gt;    OwnPtrCommon.h    56    0x7ffff43e57ec    
&gt; 6    WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;::~OwnPtr    OwnPtr.h    55    0x7ffff43e5783    
&gt; 7    WTF::VectorDestructor&lt;true, WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt; &gt;::destruct    Vector.h    59    0x7ffff43e563f    
&gt; 8    WTF::VectorTypeOperations&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt; &gt;::destruct    Vector.h    221    0x7ffff43e5181    
&gt; 9    WTF::Deque&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;, 0ul&gt;::remove    Deque.h    516    0x7ffff43e4fbd    
&gt; 10    WTF::Deque&lt;WTF::OwnPtr&lt;WebKit::WebSocketServerConnection&gt;, 0ul&gt;::remove    Deque.h    496    0x7ffff43e45d1    
&gt; 11    WebKit::WebSocketServer::didCloseWebSocketServerConnection    WebSocketServer.cpp    95    0x7ffff43e4267    
&gt; 12    WebKit::WebSocketServerConnection::didCloseSocketStream    WebSocketServerConnection.cpp    137    0x7ffff43e5ef1    
&gt; 13    WebCore::SocketStreamHandle::platformClose    SocketStreamHandleSoup.cpp    205    0x7ffff4e5477c    
&gt; 14    WebCore::SocketStreamHandleBase::disconnect    SocketStreamHandleBase.cpp    98    0x7ffff4e48c82    
&gt; 15    WebCore::SocketStreamHandleBase::close    SocketStreamHandleBase.cpp    91    0x7ffff4e48c44    
&gt; 16    WebCore::SocketStreamHandle::readBytes    SocketStreamHandleSoup.cpp    140    0x7ffff4e54327    
&gt; 17    WebCore::readReadyCallback    SocketStreamHandleSoup.cpp    274    0x7ffff4e54bf3    
&gt; 18    async_ready_callback_wrapper    ginputstream.c    529    0x7ffff33b1775    
&gt; 19    g_simple_async_result_complete    gsimpleasyncresult.c    767    0x7ffff33c68dd    
&gt; 20    complete_in_idle_cb    gsimpleasyncresult.c    779    0x7ffff33c6a0c    
&gt; ...    &lt;More&gt;
&gt; 
&gt; SocketStreamHandle instance gets deleted as a part of WebSocketServerConnection instance. if I protect SocketStreamHandle before close() call the issue seems to be fixed,
&gt; however there another crush might occur. Will investigate it further and fix after my 2 weeks trip.
&gt; 
&gt; 
&gt; void SocketStreamHandle::readBytes(signed long bytesRead, GError* error)
&gt; {
&gt;     if (error) {
&gt;         m_client-&gt;didFailSocketStream(this, SocketStreamError(error-&gt;code, error-&gt;message));
&gt;         return;
&gt;     }
&gt; 
&gt; +   RefPtr&lt;SocketStreamHandle&gt; protect(this);
&gt;     if (!bytesRead) {
&gt;         close();
&gt;         return;
&gt;     }
&gt; 
&gt;     // The client can close the handle, potentially removing the last reference.
&gt; -   RefPtr&lt;SocketStreamHandle&gt; protect(this);

To me this confirms that WebSocketServer::didCloseWebSocketServerConnection has something to clean up, thus that preventing this call would make it impossible to re-inspect a page after closing a previous browser window.
I remember that the order of destruction was pretty tight around there for Qt as well, and things might have to be adjusted a bit for GTK. Feel free to ping me on IRC if you see the need.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736062</commentid>
    <comment_count>31</comment_count>
      <attachid>163880</attachid>
    <who name="Jesus Sanchez-Palencia">jesus</who>
    <bug_when>2012-10-05 15:53:15 -0700</bug_when>
    <thetext>Comment on attachment 163880
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review

&gt; Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp:50
&gt; +    String localPath = (path == &quot;/&quot;) ? &quot;/webkit/inspector/inspectorPageIndex.html&quot; : path;

Why are you changing this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736583</commentid>
    <comment_count>32</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-08 02:06:34 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; (From update of attachment 163880 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=163880&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp:50
&gt; &gt; +    String localPath = (path == &quot;/&quot;) ? &quot;/webkit/inspector/inspectorPageIndex.html&quot; : path;
&gt; 
&gt; Why are you changing this?

I found out that I don&apos;t need to do it actually. So this code will be reverted. I want to reuse inspectorPageIndex.html for GTK port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736682</commentid>
    <comment_count>33</comment_count>
      <attachid>167539</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-08 07:42:58 -0700</bug_when>
    <thetext>Created attachment 167539
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737453</commentid>
    <comment_count>34</comment_count>
      <attachid>167539</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-10-08 23:28:15 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

Just added style comments. SocketStream part looks good to me. I&apos;d like to let GTK folks to do the final review.

&gt; Source/WebKit2/ChangeLog:9
&gt; +        The server listens on port 2999 by default. Ip address of the server can be set

Ip -&gt; IP

&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.h:64
&gt; +#if (PLATFORM(QT) || PLATFORM(GTK))

Outermost parentheses are not necessary.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:44
&gt; +#ifndef LOG_DISABLED

I think this line should be &quot;#if !LOG_DISABLED&quot;.

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:68
&gt; +#ifndef LOG_DISABLED
&gt; +    LOG(Network, &quot;Listen to address=%s, port=%d.&quot;, bindAddress.utf8().data(), port);
&gt; +#endif

This #ifndef block is not necessary because LOG() becomes a no-op when LOG_DISABLED is true. See wtf/Assertions.h.

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:46
&gt; +    String envStr(g_getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;));

We tend to avoid abbreviations like &quot;env&quot; or &quot;Str&quot; and spell the words fully.

Or, as an alternative, &quot;serverAddress&quot; or &quot;serverSpecification&quot; may sound better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737622</commentid>
    <comment_count>35</comment_count>
      <attachid>167539</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-10-09 03:49:48 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

&gt; Source/WebKit2/WebKit2.qrc:3
&gt; -    &lt;file alias=&quot;inspectorPageIndex.html&quot;&gt;qt/Resources/inspectorPageIndex.html&lt;/file&gt;
&gt; +    &lt;file alias=&quot;inspectorPageIndex.html&quot;&gt;UIProcess/InspectorServer/front-end/inspectorPageIndex.html&lt;/file&gt;

This patch should also remove the now unused file at Source/WebKit2/qt/Resources/inspectorPageIndex.html

&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:55
&gt; +        Vector&lt;String&gt; result;
&gt; +        envStr.split(&quot;:&quot;, result);
&gt; +
&gt; +        if (result.size() == 2) {

I don&apos;t know how you intend to use WEBKIT_INSPECTOR_SERVER, but if users are going to fill it directly it might be good to give back some error message in cases where you couldn&apos;t parse the address/port or if you couldn&apos;t open the server.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737786</commentid>
    <comment_count>36</comment_count>
      <attachid>167539</attachid>
    <who name="Jesus Sanchez-Palencia">jesus</who>
    <bug_when>2012-10-09 08:04:45 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.h:40
&gt; +#elif PLATFORM(GTK)

Shouldn&apos;t this be #elif USE(SOUP), instead? Then both GTK and EFL could benefit from it.
Also, I would move this entire block up, before the #if PLATFORM(QT), since it is related to includes and not namespaces/forward declarations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737842</commentid>
    <comment_count>37</comment_count>
      <attachid>167539</attachid>
    <who name="Jesus Sanchez-Palencia">jesus</who>
    <bug_when>2012-10-09 09:09:55 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:47
&gt; +    LOG(Network, &quot;New Connection from %s:%d.&quot;, addressStr.get(), g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(socketAddress.get())));

Shouldn&apos;t the #ifndef LOG_DISABLED be protecting only this line instead of all the 3 ones above?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738427</commentid>
    <comment_count>38</comment_count>
      <attachid>167539</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-10-09 18:55:07 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:46
&gt; +    GOwnPtr&lt;gchar&gt; addressStr(g_inet_address_to_string(g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(socketAddress.get()))));

Abbreviation &quot;Str&quot; here, too. &quot;addressString&quot; would be fine.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:47
&gt;&gt; +    LOG(Network, &quot;New Connection from %s:%d.&quot;, addressStr.get(), g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(socketAddress.get())));
&gt; 
&gt; Shouldn&apos;t the #ifndef LOG_DISABLED be protecting only this line instead of all the 3 ones above?

I guess the original code is fine in this case because socketAddress and addressStr are only used within LOG().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>739826</commentid>
    <comment_count>39</comment_count>
    <who name="Seokju Kwon">seokju.kwon</who>
    <bug_when>2012-10-11 05:02:17 -0700</bug_when>
    <thetext>(In reply to comment #36)
&gt; (From update of attachment 167539 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.h:40
&gt; &gt; +#elif PLATFORM(GTK)
&gt; 
&gt; Shouldn&apos;t this be #elif USE(SOUP), instead? Then both GTK and EFL could benefit from it.
&gt; Also, I would move this entire block up, before the #if PLATFORM(QT), since it is related to includes and not namespaces/forward declarations.

I want to use &apos;WebSocketServer&apos; using g_socket_service on efl port.
Should I copy WebSocketServerGtk.cpp to WebSocketServerEfl.cpp? or make a shareable directory for gtk/efl?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>739876</commentid>
    <comment_count>40</comment_count>
    <who name="Jesus Sanchez-Palencia">jesus</who>
    <bug_when>2012-10-11 06:08:47 -0700</bug_when>
    <thetext>(In reply to comment #39)
&gt; I want to use &apos;WebSocketServer&apos; using g_socket_service on efl port.
&gt; Should I copy WebSocketServerGtk.cpp to WebSocketServerEfl.cpp? or make a shareable directory for gtk/efl?

I would go for a shared implementation inside WebKit2/UIProcess/InspectorServer/soup/ (ok, I know it will be GSocket but why not following the convention of WebCore/platform/network/soup), if EFL is gonna use a GSocket based implementation as well.

And, as I&apos;ve commented on the patch, you will be able to avoid stuff like:
&quot;#elif PLATFORM(GTK) || PLATFORM(EFL)&quot; by using &quot;USE(SOUP)&quot; instead.

In fact, from another glance at the patch, the only thing that might change in between the ports is the implementation of WebInspectorServer::platformResourceForPath .

IMO, all of these could still be fixed on this patch since it is still waiting for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>739937</commentid>
    <comment_count>41</comment_count>
      <attachid>167539</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-11 07:13:00 -0700</bug_when>
    <thetext>Comment on attachment 167539
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=167539&amp;action=review

&gt;&gt; Source/WebKit2/ChangeLog:9
&gt;&gt; +        The server listens on port 2999 by default. Ip address of the server can be set
&gt; 
&gt; Ip -&gt; IP

ok

&gt;&gt; Source/WebKit2/WebKit2.qrc:3
&gt;&gt; +    &lt;file alias=&quot;inspectorPageIndex.html&quot;&gt;UIProcess/InspectorServer/front-end/inspectorPageIndex.html&lt;/file&gt;
&gt; 
&gt; This patch should also remove the now unused file at Source/WebKit2/qt/Resources/inspectorPageIndex.html

Yep, forgot to remove.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebInspectorServer.h:64
&gt;&gt; +#if (PLATFORM(QT) || PLATFORM(GTK))
&gt; 
&gt; Outermost parentheses are not necessary.

ok

&gt;&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServer.h:40
&gt;&gt;&gt; +#elif PLATFORM(GTK)
&gt;&gt; 
&gt;&gt; Shouldn&apos;t this be #elif USE(SOUP), instead? Then both GTK and EFL could benefit from it.
&gt;&gt; Also, I would move this entire block up, before the #if PLATFORM(QT), since it is related to includes and not namespaces/forward declarations.
&gt; 
&gt; I want to use &apos;WebSocketServer&apos; using g_socket_service on efl port.
&gt; Should I copy WebSocketServerGtk.cpp to WebSocketServerEfl.cpp? or make a shareable directory for gtk/efl?

Shareable folder should be better. Probably it should be WebSocketServerSoup.cpp in soup folder. I can change it in the next patch.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:44
&gt;&gt; +#ifndef LOG_DISABLED
&gt; 
&gt; I think this line should be &quot;#if !LOG_DISABLED&quot;.

ok

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:46
&gt;&gt; +    GOwnPtr&lt;gchar&gt; addressStr(g_inet_address_to_string(g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(socketAddress.get()))));
&gt; 
&gt; Abbreviation &quot;Str&quot; here, too. &quot;addressString&quot; would be fine.

ok

&gt;&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:47
&gt;&gt;&gt; +    LOG(Network, &quot;New Connection from %s:%d.&quot;, addressStr.get(), g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(socketAddress.get())));
&gt;&gt; 
&gt;&gt; Shouldn&apos;t the #ifndef LOG_DISABLED be protecting only this line instead of all the 3 ones above?
&gt; 
&gt; I guess the original code is fine in this case because socketAddress and addressStr are only used within LOG().

Yes, it doesn&apos;t make sense to move them out of the block.

&gt;&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebSocketServerGtk.cpp:68
&gt;&gt; +#endif
&gt; 
&gt; This #ifndef block is not necessary because LOG() becomes a no-op when LOG_DISABLED is true. See wtf/Assertions.h.

ok, will check

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:46
&gt;&gt; +    String envStr(g_getenv(&quot;WEBKIT_INSPECTOR_SERVER&quot;));
&gt; 
&gt; We tend to avoid abbreviations like &quot;env&quot; or &quot;Str&quot; and spell the words fully.
&gt; 
&gt; Or, as an alternative, &quot;serverAddress&quot; or &quot;serverSpecification&quot; may sound better.

ok

&gt;&gt; Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp:55
&gt;&gt; +        if (result.size() == 2) {
&gt; 
&gt; I don&apos;t know how you intend to use WEBKIT_INSPECTOR_SERVER, but if users are going to fill it directly it might be good to give back some error message in cases where you couldn&apos;t parse the address/port or if you couldn&apos;t open the server.

ok, I will add LOG_ERROR message here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>746185</commentid>
    <comment_count>42</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-19 03:21:44 -0700</bug_when>
    <thetext>Hi all, I am going to make new patch in few days, there is one question I want to clarify about refactoring the code to use SOUP compilation flag. I guess I can just follow Comment #40 From Jesus Sanchez-Palencia for that. Does anybody have any additional comments about it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>746230</commentid>
    <comment_count>43</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-10-19 05:13:24 -0700</bug_when>
    <thetext>(In reply to comment #42)
&gt; Hi all, I am going to make new patch in few days, there is one question I want to clarify about refactoring the code to use SOUP compilation flag. I guess I can just follow Comment #40 From Jesus Sanchez-Palencia for that. Does anybody have any additional comments about it?

This is just my opinion and not everybody might agree with this, but I think that it would be less wasted reviewing efforts if you apply the modifications needed to land this patch first and then do further tuning in different patches (e.g. for EFL support).
If you refactor this code, it might be difficult to do a review on only what changed.

This patch is already larger than the average and splitting in smaller patches is usually encouraged.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>746244</commentid>
    <comment_count>44</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-19 05:47:51 -0700</bug_when>
    <thetext>(In reply to comment #43)
&gt; (In reply to comment #42)
&gt; &gt; Hi all, I am going to make new patch in few days, there is one question I want to clarify about refactoring the code to use SOUP compilation flag. I guess I can just follow Comment #40 From Jesus Sanchez-Palencia for that. Does anybody have any additional comments about it?
&gt; 
&gt; This is just my opinion and not everybody might agree with this, but I think that it would be less wasted reviewing efforts if you apply the modifications needed to land this patch first and then do further tuning in different patches (e.g. for EFL support).
&gt; If you refactor this code, it might be difficult to do a review on only what changed.
&gt; 
&gt; This patch is already larger than the average and splitting in smaller patches is usually encouraged.

Makes sense for me. I will fix now all remaining bits except EFL support which will be addressed later probably with another bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>746470</commentid>
    <comment_count>45</comment_count>
      <attachid>169656</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-10-19 11:18:17 -0700</bug_when>
    <thetext>Created attachment 169656
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761472</commentid>
    <comment_count>46</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2012-11-08 01:39:49 -0800</bug_when>
    <thetext>Is there anything specific that needs to be done to move this work forward? The patch already went through detailed reviews and is quite matured, it seems as if only the polishing is left.

At the very least I&apos;d recommend splitting up the patch, into at least two parts. For instance, the SocketStreamHandle work seems to be ready to land, so that could go into a separate patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761484</commentid>
    <comment_count>47</comment_count>
      <attachid>169656</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-11-08 01:49:25 -0800</bug_when>
    <thetext>Comment on attachment 169656
Patch

The inspector server, Qt and SocketStreamHandle parts look fine to me. If someone could review the GTK part it would be nice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761746</commentid>
    <comment_count>48</comment_count>
      <attachid>169656</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-11-08 07:02:44 -0800</bug_when>
    <thetext>Comment on attachment 169656
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=169656&amp;action=review

Looks good to me, I have only a couple of minor comments. Gustavo, are your concerns about the changes to WebSocketServerConnection fixed now?

&gt; Source/WebKit2/GNUmakefile.am:560
&gt; +dist_remoteinspector_DATA = \

do we really need the dist prefix? I guess you can use remoteinspector_DATA and add the inspectorPageIndex.html to EXTRA_DIST.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:32
&gt; +static const char* s_testServerAppName = &quot;InspectorTestServer&quot;;

We don&apos;t use that prefix for global variables, we use k or g without the underscore.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:35
&gt; +static const int s_maxWaitForChild = 5;

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:38
&gt; +static GPid s_childProcessPid = 0;

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:41
&gt; +static bool s_childIsReady = false;

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:193
&gt; +    String validInspectorURL = String(&quot;/webinspector/inspector.html?page=&quot;) + String::number(pageId);
&gt; +    g_assert_cmpstr(valueString.get(), ==, validInspectorURL.latin1().data());

utf8() instead of latin1()

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:241
&gt; +    String resolvedURL = String(&quot;http://127.0.0.1:2999/&quot;) + WebViewTest::javascriptResultToCString(javascriptResult);

I think this should be 

String(&quot;http://127.0.0.1:2999/&quot;) + String::fromUTF8(WebViewTest::javascriptResultToCString(javascriptResult).data())

because js result is a CString utf8 encoded.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestInspectorServer.cpp:242
&gt; +    test-&gt;loadURI(resolvedURL.latin1().data());

utf8() instead of latin1()

&gt; Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:28
&gt; +#include &quot;FileSystem.h&quot;

Use &lt;WebCore/FileSystem.h&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762765</commentid>
    <comment_count>49</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-09 02:49:14 -0800</bug_when>
    <thetext>Hi all,

I guess all found issues so far are minor and located in the test code. Can we still proceed with landing the patch? Another option would be splitting the patch into soup socket handle changes, implementation and test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>763145</commentid>
    <comment_count>50</comment_count>
      <attachid>173334</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-09 10:29:40 -0800</bug_when>
    <thetext>Created attachment 173334
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764313</commentid>
    <comment_count>51</comment_count>
      <attachid>173334</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-11-12 05:39:56 -0800</bug_when>
    <thetext>Comment on attachment 173334
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=173334&amp;action=review

&gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:82
&gt; -    // If this ASSERT happens on any platform then their SocketStreamHandle::send
&gt; -    // followed by a SocketStreamHandle::close is not guarenteed to have sent all
&gt; -    // data. If this happens, we need to slightly change the design to include a
&gt; -    // SocketStreamHandleClient::didSend, handle it here, and add an m_shutdownAfterSend
&gt; -    // state on this WebSocketServerConnection.
&gt; -    ASSERT(!m_socket-&gt;bufferedAmount());
&gt; +    if (m_socket-&gt;bufferedAmount()) {
&gt; +        m_shutdownAfterSend = true;
&gt; +        return;
&gt; +    }

The only concern I still have is this, since the comment has not been fully applied, I&apos;m not 100% sure this is acting as expected. If you could double-check with the person who wrote the comment that would be great, otherwise looks fine to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764330</commentid>
    <comment_count>52</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-12 06:11:34 -0800</bug_when>
    <thetext>(In reply to comment #51)
&gt; (From update of attachment 173334 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=173334&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:82
&gt; &gt; -    // If this ASSERT happens on any platform then their SocketStreamHandle::send
&gt; &gt; -    // followed by a SocketStreamHandle::close is not guarenteed to have sent all
&gt; &gt; -    // data. If this happens, we need to slightly change the design to include a
&gt; &gt; -    // SocketStreamHandleClient::didSend, handle it here, and add an m_shutdownAfterSend
&gt; &gt; -    // state on this WebSocketServerConnection.
&gt; &gt; -    ASSERT(!m_socket-&gt;bufferedAmount());
&gt; &gt; +    if (m_socket-&gt;bufferedAmount()) {
&gt; &gt; +        m_shutdownAfterSend = true;
&gt; &gt; +        return;
&gt; &gt; +    }
&gt; 
&gt; The only concern I still have is this, since the comment has not been fully applied, I&apos;m not 100% sure this is acting as expected. If you could double-check with the person who wrote the comment that would be great, otherwise looks fine to me.

Hi, from functionality point of view it follows the comment. I will check with the person who left the comment anyway, and if he is unhappy for the reason I can always submit another patch to fix it. Current solution seems to work flawlessly for me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764487</commentid>
    <comment_count>53</comment_count>
    <who name="Danilo de Paula">danilo.eu</who>
    <bug_when>2012-11-12 09:29:32 -0800</bug_when>
    <thetext>(In reply to comment #52)
&gt; (In reply to comment #51)
&gt; &gt; (From update of attachment 173334 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=173334&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp:82
&gt; &gt; &gt; -    // If this ASSERT happens on any platform then their SocketStreamHandle::send
&gt; &gt; &gt; -    // followed by a SocketStreamHandle::close is not guarenteed to have sent all
&gt; &gt; &gt; -    // data. If this happens, we need to slightly change the design to include a
&gt; &gt; &gt; -    // SocketStreamHandleClient::didSend, handle it here, and add an m_shutdownAfterSend
&gt; &gt; &gt; -    // state on this WebSocketServerConnection.
&gt; &gt; &gt; -    ASSERT(!m_socket-&gt;bufferedAmount());
&gt; &gt; &gt; +    if (m_socket-&gt;bufferedAmount()) {
&gt; &gt; &gt; +        m_shutdownAfterSend = true;
&gt; &gt; &gt; +        return;
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt; The only concern I still have is this, since the comment has not been fully applied, I&apos;m not 100% sure this is acting as expected. If you could double-check with the person who wrote the comment that would be great, otherwise looks fine to me.
&gt; 
&gt; Hi, from functionality point of view it follows the comment. I will check with the person who left the comment anyway, and if he is unhappy for the reason I can always submit another patch to fix it. Current solution seems to work flawlessly for me.

Can you check if this patch compiles on a debug build, please?
Looks like WebContextGtk.cpp uses Log but it doesn&apos;t include the header.

It compiles fine on a release build, but debug is failing here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764505</commentid>
    <comment_count>54</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-12 09:43:25 -0800</bug_when>
    <thetext>Seems to build fine for me here. What is your IRC?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764530</commentid>
    <comment_count>55</comment_count>
    <who name="Danilo de Paula">danilo.eu</who>
    <bug_when>2012-11-12 10:03:25 -0800</bug_when>
    <thetext>(In reply to comment #54)
&gt; Seems to build fine for me here. What is your IRC?

danilocesar</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>764688</commentid>
    <comment_count>56</comment_count>
    <who name="Danilo de Paula">danilo.eu</who>
    <bug_when>2012-11-12 12:45:08 -0800</bug_when>
    <thetext>(In reply to comment #55)
&gt; (In reply to comment #54)
&gt; &gt; Seems to build fine for me here. What is your IRC?
&gt; 
&gt; danilocesar

A(In reply to comment #55)
&gt; (In reply to comment #54)
&gt; &gt; Seems to build fine for me here. What is your IRC?
&gt; 
&gt; danilocesar

A question: Why should we specify the host address? Shouldn&apos;t we always set the server address as localhost?
On chromium, we only need to specify the port to be used. Can&apos;t we use the same solution?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765420</commentid>
    <comment_count>57</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-11-13 02:26:18 -0800</bug_when>
    <thetext>(In reply to comment #56)
&gt; A question: Why should we specify the host address? Shouldn&apos;t we always set the server address as localhost?
&gt; On chromium, we only need to specify the port to be used. Can&apos;t we use the same solution?

The reason was to allow remote debugging on phones/tablets. The Qt port opens the port on localhost by default (if only the port is given) but also allows to specify the interface.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765457</commentid>
    <comment_count>58</comment_count>
      <attachid>173859</attachid>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-13 04:21:16 -0800</bug_when>
    <thetext>Created attachment 173859
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765459</commentid>
    <comment_count>59</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-13 04:27:15 -0800</bug_when>
    <thetext>Had to resubmit to fix compilation problem due to merging with the latest baseline, The only change is adding &quot;Logging.h&quot; in WebContextGtk.cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765460</commentid>
    <comment_count>60</comment_count>
    <who name="Danilo de Paula">danilo.eu</who>
    <bug_when>2012-11-13 04:29:40 -0800</bug_when>
    <thetext>From a IRC talk:
[10:06] &lt;danilocesar&gt; is there any webkit call that can be use to use a file that can be installed or not installed on the system? Right now #88094 uses WebCore::sharedResourcesPath().data() which translates to /usr/local/share. So remote debugging won&apos;t work if it&apos;s not installed. Any idea?
[10:19] &lt;philn&gt; danilocesar: in AudioBusGtk for instance, we handle the uninstalled case with an env var
[10:20] &lt;philn&gt; the inspector does something similar iirc
[10:21] &lt;danilocesar&gt; I remember something about the inspector.
[10:21] &lt;danilocesar&gt; philn: do you remember who fixed it?
[10:22] &lt;philn&gt; i don&apos;t, but i did the AudioBus stuff :)
[10:23] &lt;philn&gt; another approach is to use a macro, i think that&apos;s what the inspector uses actually
[10:24] &lt;philn&gt; resources management is not great in glib... but i think some recent work was done to improve it

Is it OK to push it this way and fix it later?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765468</commentid>
    <comment_count>61</comment_count>
    <who name="Anton Obzhirov">obzhirov</who>
    <bug_when>2012-11-13 04:41:23 -0800</bug_when>
    <thetext>I would (In reply to comment #60)
&gt; From a IRC talk:
&gt; [10:06] &lt;danilocesar&gt; is there any webkit call that can be use to use a file that can be installed or not installed on the system? Right now #88094 uses WebCore::sharedResourcesPath().data() which translates to /usr/local/share. So remote debugging won&apos;t work if it&apos;s not installed. Any idea?
&gt; [10:19] &lt;philn&gt; danilocesar: in AudioBusGtk for instance, we handle the uninstalled case with an env var
&gt; [10:20] &lt;philn&gt; the inspector does something similar iirc
&gt; [10:21] &lt;danilocesar&gt; I remember something about the inspector.
&gt; [10:21] &lt;danilocesar&gt; philn: do you remember who fixed it?
&gt; [10:22] &lt;philn&gt; i don&apos;t, but i did the AudioBus stuff :)
&gt; [10:23] &lt;philn&gt; another approach is to use a macro, i think that&apos;s what the inspector uses actually
&gt; [10:24] &lt;philn&gt; resources management is not great in glib... but i think some recent work was done to improve it
&gt; 
&gt; Is it OK to push it this way and fix it later?

I would still suggest to use sharedResourcePath() for now (I need to double check but that how QT port used to do it) and submit the change. If we need to change it I can always do it with another patch later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765476</commentid>
    <comment_count>62</comment_count>
    <who name="Danilo de Paula">danilo.eu</who>
    <bug_when>2012-11-13 04:50:41 -0800</bug_when>
    <thetext>(In reply to comment #61)
&gt; I would (In reply to comment #60)
&gt; &gt; From a IRC talk:
&gt; &gt; [10:06] &lt;danilocesar&gt; is there any webkit call that can be use to use a file that can be installed or not installed on the system? Right now #88094 uses WebCore::sharedResourcesPath().data() which translates to /usr/local/share. So remote debugging won&apos;t work if it&apos;s not installed. Any idea?
&gt; &gt; [10:19] &lt;philn&gt; danilocesar: in AudioBusGtk for instance, we handle the uninstalled case with an env var
&gt; &gt; [10:20] &lt;philn&gt; the inspector does something similar iirc
&gt; &gt; [10:21] &lt;danilocesar&gt; I remember something about the inspector.
&gt; &gt; [10:21] &lt;danilocesar&gt; philn: do you remember who fixed it?
&gt; &gt; [10:22] &lt;philn&gt; i don&apos;t, but i did the AudioBus stuff :)
&gt; &gt; [10:23] &lt;philn&gt; another approach is to use a macro, i think that&apos;s what the inspector uses actually
&gt; &gt; [10:24] &lt;philn&gt; resources management is not great in glib... but i think some recent work was done to improve it
&gt; &gt; 
&gt; &gt; Is it OK to push it this way and fix it later?
&gt; 
&gt; I would still suggest to use sharedResourcePath() for now (I need to double check but that how QT port used to do it) and submit the change. If we need to change it I can always do it with another patch later.

Looks good enough to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765599</commentid>
    <comment_count>63</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-11-13 07:56:45 -0800</bug_when>
    <thetext>(In reply to comment #51)
&gt; The only concern I still have is this, since the comment has not been fully applied, I&apos;m not 100% sure this is acting as expected. If you could double-check with the person who wrote the comment that would be great, otherwise looks fine to me.

Joseph Pecoraro added that comment initially for Mac and I didn&apos;t need to fix it for Qt either but I think that the way that soup is behaving is the kind of case that this assert was trying to protect against. I believe that this patch properly handles it and the assert can be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766821</commentid>
    <comment_count>64</comment_count>
      <attachid>173859</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-14 06:26:48 -0800</bug_when>
    <thetext>Comment on attachment 173859
Patch

Clearing flags on attachment: 173859

Committed r134600: &lt;http://trac.webkit.org/changeset/134600&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766822</commentid>
    <comment_count>65</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-14 06:26:59 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>148350</attachid>
            <date>2012-06-19 09:50:57 -0700</date>
            <delta_ts>2012-07-18 04:46:20 -0700</delta_ts>
            <desc>Implementation of remote Web Inspector server platform depended bits for GTK platform</desc>
            <filename>88094.diff</filename>
            <type>text/plain</type>
            <size>20004</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuY3BwCShyZXZpc2lv
biAxMjA1ODQpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAs
IDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTAyLDcgKzEwMywxMCBAQAogCiAjaWYgUExB
VEZPUk0oR1RLKQogI2luY2x1ZGUgIkFyZ3VtZW50Q29kZXJzR3RrLmgiCisjaWYgRU5BQkxFKElO
U1BFQ1RPUl9TRVJWRVIpCisjaW5jbHVkZSA8V2ViSW5zcGVjdG9yU2VydmVyLmg+CiAjZW5kaWYK
KyNlbmRpZgogCiAjaWZuZGVmIE5ERUJVRwogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0Nv
dW50ZXIuaD4KQEAgLTM2MCw3ICszNjQsMTQgQEAKICAgICBBU1NFUlQobV9kcmF3aW5nQXJlYSk7
CiAKICNpZiBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKyNpZiBQTEFURk9STShHVEspCisgICAg
Ly8gd2lsbCByZWFkIGhvc3QgYWRkcmVzcyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcwogICAg
IGlmIChtX3BhZ2VHcm91cC0+cHJlZmVyZW5jZXMoKS0+ZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCgp
KQorICAgICAgICBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmxpc3RlbigiIiwgMjk5OSk7
CisgICAgZWxzZQorICAgICAgICBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmNsb3NlKCk7
CisjZW5kaWYKKyAgICBpZiAobV9wYWdlR3JvdXAtPnByZWZlcmVuY2VzKCktPmRldmVsb3BlckV4
dHJhc0VuYWJsZWQoKSkKICAgICAgICAgaW5zcGVjdG9yKCktPmVuYWJsZVJlbW90ZUluc3BlY3Rp
b24oKTsKICNlbmRpZgogCkBAIC0xNzA4LDcgKzE3MTksMTQgQEAKICAgICAgICAgcmV0dXJuOwog
CiAjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIpCisjaWYgUExBVEZPUk0oR1RLKQorICAgIC8v
IHdpbGwgcmVhZCBob3N0IGFkZHJlc3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgICBp
ZiAobV9wYWdlR3JvdXAtPnByZWZlcmVuY2VzKCktPmRldmVsb3BlckV4dHJhc0VuYWJsZWQoKSkK
KyAgICAgICAgV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5saXN0ZW4oIiIsIDI5OTkpOwor
ICAgIGVsc2UKKyAgICAgICAgV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5jbG9zZSgpOwor
I2VuZGlmCisgICAgaWYgKG1fcGFnZUdyb3VwLT5wcmVmZXJlbmNlcygpLT5kZXZlbG9wZXJFeHRy
YXNFbmFibGVkKCkpCiAgICAgICAgIGluc3BlY3RvcigpLT5lbmFibGVSZW1vdGVJbnNwZWN0aW9u
KCk7CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCShyZXZpc2lvbiAxMjA1ODQp
CisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNl
cnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAxMSBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVz
ZXJ2ZWQuIAogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNyw2ICszOCwxMCBA
QAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBRdFRjcFNlcnZlckhhbmRsZXI7CiB9CisjZWxp
ZiBQTEFURk9STShHVEspCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4K
KyNpbmNsdWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+CiAjZW5kaWYKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewpAQCAtNzcsNiArODIsOCBAQAogICAgIHVuc2lnbmVkIHNob3J0IG1fcG9ydDsKICNp
ZiBQTEFURk9STShRVCkKICAgICBPd25QdHI8UXRUY3BTZXJ2ZXJIYW5kbGVyPiBtX3RjcFNlcnZl
ckhhbmRsZXI7CisjZWxpZiBQTEFURk9STShHVEspCisgICAgR1JlZlB0cjxHU29ja2V0U2Vydmlj
ZT4gbV9zb2NrZXRTZXJ2aWNlOwogI2VuZGlmCiAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFNl
cnZlckNvbm5lY3Rpb247CiB9OwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0
cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5oIgorCisjaW5jbHVk
ZSAiV2ViSW5zcGVjdG9yUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNs
dWRlIDxXZWJDb3JlL01JTUVUeXBlUmVnaXN0cnkuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2Ug
V2ViS2l0IHsKKworYm9vbCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQ
YXRoKGNvbnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRl
bnRUeXBlKQoreworICAgIGlmIChwYXRoID09ICIvIikgeworICAgICAgICBjb250ZW50VHlwZSA9
ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVp
bGRlciBidWlsZGVyOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiPGh0dHA+Iik7CisKKyAgICAg
ICAgY29uc3QgY2hhciogc2VydmVyQWRkcmVzcyA9IGdldGVudigiR1RLV0VCS0lUX0lOU1BFQ1RP
Ul9TRVJWRVIiKTsKKyAgICAgICAgaWYgKCFzZXJ2ZXJBZGRyZXNzKQorICAgICAgICAgICAgc2Vy
dmVyQWRkcmVzcyA9ICIxMjcuMC4wLjE6Mjk5OSI7CisKKyAgICAgICAgY29uc3QgY2hhciogdXJs
ID0gZ2V0ZW52KCJHVEtXRUJLSVRfSU5TUEVDVE9SX1VSTCIpOworICAgICAgICBpZiAoIXVybCkK
KyAgICAgICAgICAgIHVybCA9ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL2V4cG9ydC9oZWFkL3Ry
dW5rL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwiOwor
CisgICAgICAgIFN0cmluZyBpbnNwZWN0b3JVUkwgPSBTdHJpbmcodXJsKSArICI/d3M9IiArIHNl
cnZlckFkZHJlc3MgKyAiL2RldnRvb2xzL3BhZ2UvIjsgCisKKyAgICAgICAgaWYgKG1fY2xpZW50
TWFwLnNpemUoKSA9PSAxKSB7IC8vIG9ubHkgb25lIHBhZ2UgcmVnaXN0ZXJlZCwgY2FuIGRvIHJl
ZGlyZWN0CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPGhlYWQ+PG1ldGEgaHR0cC1lcXVp
dj1cInJlZnJlc2hcIiBjb250ZW50PVwiMDsgVVJMPSIpOworICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoaW5zcGVjdG9yVVJMICsgU3RyaW5nOjpudW1iZXIobV9jbGllbnRNYXAuYmVnaW4oKS0+
Zmlyc3QpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIj48L2hlYWQ+Iik7CisgICAg
ICAgIH0KKworICAgICAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IG1fY2xpZW50TWFwLmVu
ZCgpOworICAgICAgICBmb3IgKENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBtX2NsaWVudE1hcC5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIFdlYlBhZ2VQcm94eSogd2Vi
UGFnZSA9IGl0LT5zZWNvbmQtPnBhZ2UoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI8
YSBocmVmPVwiIiArIGluc3BlY3RvclVSTCArIFN0cmluZzo6bnVtYmVyKGl0LT5maXJzdCkgKyAi
XCI+IiArIHdlYlBhZ2UtPnBhZ2VUaXRsZSgpICsgIjwvYT48YnI+Iik7CisgICAgICAgIH0KKwor
ICAgICAgICBidWlsZGVyLmFwcGVuZCgiPC9odHRwPiIpOworCisgICAgICAgIENTdHJpbmcgY3N0
ciA9IGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCk7CisgICAgICAgIGRhdGEuYXBwZW5kKGNzdHIu
ZGF0YSgpLCBjc3RyLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorIAor
ICAgIHJldHVybiBmYWxzZTsKK30KKworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0luc3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJv
bmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQorCisjaW5jbHVkZSAi
V2ViU29ja2V0U2VydmVyLmgiCisKKyNpbmNsdWRlIDxXZWJDb3JlL1NvY2tldFN0cmVhbUhhbmRs
ZS5oPgorCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1
ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1
c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0YXRpYyBn
Ym9vbGVhbiBjb25uZWN0aW9uQ2FsbGJhY2soR1NvY2tldFNlcnZpY2UqIHNlcnZpY2UsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTb2NrZXRDb25uZWN0aW9uKiBjb25uZWN0
aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT2JqZWN0KiBzb3VyY2VP
YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHNlbGYp
Cit7ICAgCisjaWZuZGVmIExPR19ESVNBQkxFRCAgICAKKyAgICBHU29ja2V0QWRkcmVzcyogc29j
a2FkZHIgPSBnX3NvY2tldF9jb25uZWN0aW9uX2dldF9yZW1vdGVfYWRkcmVzcyhjb25uZWN0aW9u
LCBOVUxMKTsKKyAgICBHSW5ldEFkZHJlc3MqIGFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3Nf
Z2V0X2FkZHJlc3MoR19JTkVUX1NPQ0tFVF9BRERSRVNTKHNvY2thZGRyKSk7CisgICAgZ3VpbnQx
NiBwb3J0ID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0KEdfSU5FVF9TT0NLRVRfQURE
UkVTUyhzb2NrYWRkcikpOworCisgICAgTE9HKFdlYlNvY2tldFNlcnZlciwgIk5ldyBDb25uZWN0
aW9uIGZyb20gJXM6JWQuIiwgZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nKGFkZHIpLCBwb3J0KTsK
KyAgICBnX29iamVjdF91bnJlZihzb2NrYWRkcik7CisjZW5kaWYKKworICAgIFdlYlNvY2tldFNl
cnZlciogc2VydmVyID0gKFdlYlNvY2tldFNlcnZlciopc2VsZjsKKyAgICAvLyByZWZlcmVuY2Ug
Y29ubmVjdGlvbiBiZWZvcmUgYWNjZXB0aW5nIGl0CisgICAgZ19vYmplY3RfcmVmX3NpbmsoY29u
bmVjdGlvbik7CisgICAgc2VydmVyLT5kaWRBY2NlcHRDb25uZWN0aW9uKFNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKGNvbm5lY3Rpb24sIDApKTsKKyAgICByZXR1cm4gVFJVRTsKK30gCisKK3Zv
aWQgV2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUluaXRpYWxpemUoKQoreworICAgIG1fc29ja2V0
U2VydmljZSA9IGFkb3B0R1JlZihnX3NvY2tldF9zZXJ2aWNlX25ldygpKTsKKyAgICBpZiAobV9z
b2NrZXRTZXJ2aWNlLmdldCgpKSB7CisgICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9zb2NrZXRT
ZXJ2aWNlLmdldCgpLCAiaW5jb21pbmciLCBHX0NBTExCQUNLKGNvbm5lY3Rpb25DYWxsYmFjayks
IHRoaXMpOworICAgICAgICBpZiAoIWdfc29ja2V0X3NlcnZpY2VfaXNfYWN0aXZlKG1fc29ja2V0
U2VydmljZS5nZXQoKSkpCisgICAgICAgICAgICBnX3NvY2tldF9zZXJ2aWNlX3N0YXJ0KG1fc29j
a2V0U2VydmljZS5nZXQoKSk7CisgICAgfQorfQorCitib29sIFdlYlNvY2tldFNlcnZlcjo6cGxh
dGZvcm1MaXN0ZW4oY29uc3QgU3RyaW5nJiBiaW5kQWRkcmVzcywgdW5zaWduZWQgc2hvcnQgcG9y
dCkKK3sKKyAgICBTdHJpbmcgaG9zdG5hbWUgPSBiaW5kQWRkcmVzczsKKyAgICB1bnNpZ25lZCBz
aG9ydCBwb3J0VmFsdWUgPSBwb3J0OworICAgIAorICAgIGlmIChiaW5kQWRkcmVzcyA9PSAiIikg
eworICAgICAgICBTdHJpbmcgZW52U3RyOworICAgICAgICBob3N0bmFtZSA9ICIxMjcuMC4wLjEi
OworICAgICAgICBwb3J0VmFsdWUgPSAyOTk5OworICAgICAgICBjb25zdCBjaGFyKiBlbnZDU3Ry
ID0gZ2V0ZW52KCJHVEtXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIpOworICAgIAorICAgICAgICBp
ZiAoZW52Q1N0cikgeworICAgICAgICAgICAgZW52U3RyID0gZW52Q1N0cjsgIAorICAgICAgICAg
ICAgVmVjdG9yPFN0cmluZz4gcmVzdWx0OworICAgICAgICAgICAgZW52U3RyLnNwbGl0KCI6Iiwg
cmVzdWx0KTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMikgeworICAgICAg
ICAgICAgICAgIGhvc3RuYW1lID0gcmVzdWx0WzBdOworICAgICAgICAgICAgICAgIGJvb2wgb2sg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3J0VmFsdWUgPSByZXN1bHRbMV0udG9JbnQoJm9r
KTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICBwb3J0ID0g
Mjk5OTsgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg
IExPRyhXZWJTb2NrZXRTZXJ2ZXIsICJMaXN0ZW4gdG8gYWRkcmVzcz0lcywgcG9ydD0lZC4iLCBo
b3N0bmFtZS5sYXRpbjEoKS5kYXRhKCksIHBvcnRWYWx1ZSk7CisKKyAgICBHU29ja2V0U2Vydmlj
ZSogc29ja2V0U2VydmljZSA9IG1fc29ja2V0U2VydmljZS5nZXQoKTsKKyAgICBpZiAoIXNvY2tl
dFNlcnZpY2UpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IHNvY2tldCBzZXJ2
aWNlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR0luZXRBZGRyZXNz
KiBhZGRyZXNzID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGhvc3RuYW1lLmxhdGlu
MSgpLmRhdGEoKSk7CisgICAgR1NvY2tldEFkZHJlc3MqIHNvY2tldEFkZHJlc3MgPSBnX2luZXRf
c29ja2V0X2FkZHJlc3NfbmV3KGFkZHJlc3MsIHBvcnRWYWx1ZSk7CisKKyAgICBnYm9vbGVhbiBy
ZXN1bHQgPSBnX3NvY2tldF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUihz
b2NrZXRTZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRB
ZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVf
U1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1BST1RP
Q09MX1RDUCwgMCwgMCwgMCk7CisKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgIExPR19FUlJP
UigiRmFpbGVkIHRvIGFkZCBpbmV0IGFkZHJlc3MgdG8gd2ViIGluc3BlY3RvciBzZXJ2ZXIgbGlz
dGVuZXIuIik7CisKKyAgICBnX29iamVjdF91bnJlZihzb2NrZXRBZGRyZXNzKTsKKyAgICBnX29i
amVjdF91bnJlZihhZGRyZXNzKTsKKworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBs
YXRmb3JtQ2xvc2UoKQoreworICAgIGlmIChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpCisgICAgICAg
IGdfc29ja2V0X3NlcnZpY2Vfc3RvcChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisK
KyNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKSW5kZXg6IFNvdXJjZS9XZWJLaXQy
L0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxl
LmFtCShyZXZpc2lvbiAxMjA1ODQpCisrKyBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQko
d29ya2luZyBjb3B5KQpAQCAtNTYsNiArNTYsNyBAQAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9QbHVnaW5zIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvUGx1Z2lucy9ndGsgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9zb3VwIFwKKwktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzIFwKIAktSSQo
c3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0FwcGxpY2F0aW9uQ2FjaGUgXAogCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0aGVudGljYXRpb24gXApJbmRl
eDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L0NoYW5nZUxvZwkocmV2aXNpb24gMTIwNzIyKQorKysgU291cmNlL1dlYktpdDIvQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTItMDYtMTkgIEFudG9uIE9iemhp
cm92ICA8YS5vYnpoaXJvdkBzYW1zdW5nLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBB
ZGQgYSBXZWJJbnNwZWN0b3JTZXJ2ZXIgb24gTGludXggdXNpbmcgdGhlIEdTb2NrZXQgQVBJIGZv
ciB0aGUgR1RLIHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTg4MDk0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgor
ICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyLmg6Cisg
ICAgICAgIChXZWJTb2NrZXRTZXJ2ZXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0
ay9XZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6Cisg
ICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjZUZvclBh
dGgpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNl
cnZlckd0ay5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6
Y29ubmVjdGlvbkNhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpw
bGF0Zm9ybUluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBs
YXRmb3JtTGlzdGVuKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9y
bUNsb3NlKToKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcDoKKyAgICAgICAg
KFdlYktpdDo6V2ViUGFnZVByb3h5Ojppbml0aWFsaXplV2ViUGFnZSk6CisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2VQcm94eTo6cHJlZmVyZW5jZXNEaWRDaGFuZ2UpOgorICAgICAgICAqIGNvbmZp
Zy5oOgorCiAyMDEyLTA2LTE5ICBBbGV4aXMgTWVuYXJkICA8YWxleGlzLm1lbmFyZEBvcGVuYm9z
c2Eub3JnPgogCiAgICAgICAgIFtRdF0gQ3JlYXRlIGFuIGV4dHJhIGF0bGFzIHdoZW4gdGhlcmUg
aXMgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzcGFjZS4KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL2NvbmZp
Zy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCShyZXZpc2lvbiAxMjA1
ODQpCisrKyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTE4LDUg
KzExOCw3IEBACiAjaWZuZGVmIEVOQUJMRV9JTlNQRUNUT1JfU0VSVkVSCiAjaWYgUExBVEZPUk0o
UVQpCiAjZGVmaW5lIEVOQUJMRV9JTlNQRUNUT1JfU0VSVkVSIDEKKyNlbGlmIFBMQVRGT1JNKEdU
SykKKyNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQogI2VuZGlmCiAjZW5kaWYKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmxpc3QuYW0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQkocmV2aXNpb24gMTIwNTg0KQorKysgU291
cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQkod29ya2luZyBjb3B5KQpAQCAtODQ0LDYg
Kzg0NCwxNSBAQAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJUZXh0Q2hlY2tlckNsaWVu
dC5oIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuY3BwIFwKIAlTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuaCBcCisJU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuY3BwIFwKKwlTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oIFwK
KwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZl
ci5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29j
a2V0U2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
V2ViU29ja2V0U2VydmVyQ2xpZW50LmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNw
ZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAgXAorCVNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5o
IFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNw
ZWN0b3JTZXJ2ZXJHdGsuY3BwIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwIFwKIAlTb3VyY2UvV2ViS2l0Mi9XZWJL
aXQyUHJlZml4LmggXAogCVNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXBwbGljYXRpb25DYWNo
ZS9XZWJBcHBsaWNhdGlvbkNhY2hlTWFuYWdlci5oIFwKIAlTb3VyY2UvV2ViS2l0Mi9XZWJQcm9j
ZXNzL0FwcGxpY2F0aW9uQ2FjaGUvV2ViQXBwbGljYXRpb25DYWNoZU1hbmFnZXIuY3BwIFwKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMDcyMykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIxIEBACisyMDEyLTA2LTE5ICBBbnRvbiBPYnpo
aXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgV2ViIEluc3BlY3Rvcjog
QWRkIGEgV2ViSW5zcGVjdG9yU2VydmVyIG9uIExpbnV4IHVzaW5nIHRoZSBHU29ja2V0IEFQSSBm
b3IgdGhlIEdUSyBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD04ODA5NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlOjpjcmVhdGUpOgorICAgICAgICAoU29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhhbmRsZSk6
CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRs
ZTo6cGxhdGZvcm1TZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6
cGxhdGZvcm1DbG9zZSk6CisKIDIwMTItMDYtMTkgIEFsbGFuIFNhbmRmZWxkIEplbnNlbiAgPGFs
bGFuLmplbnNlbkBub2tpYS5jb20+CiAKICAgICAgICAgTWFrZSBSZW5kZXJUYWJsZVNlY3Rpb24g
LSBub2RlQXRQb2ludCBhbmQgcGFpbnRPYmplY3QgcmV1c2Ugc3Bhbm5pbmcgbG9naWMuCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1Nv
Y2tldFN0cmVhbUhhbmRsZS5oCShyZXZpc2lvbiAxMjA1ODQpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9u
aWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKQEAgLTQ2LDYgKzQ3LDcgQEAKICAgICBjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGUg
OiBwdWJsaWMgUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+LCBwdWJsaWMgU29ja2V0U3Ry
ZWFtSGFuZGxlQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxT
b2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShjb25zdCBLVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhh
bmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihuZXcgU29ja2V0U3RyZWFtSGFu
ZGxlKHVybCwgY2xpZW50KSk7IH0KKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29ja2V0U3Ry
ZWFtSGFuZGxlPiBjcmVhdGUoR1NvY2tldENvbm5lY3Rpb24qIHNvY2tldENvbm5lY3Rpb24sIFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihuZXcgU29j
a2V0U3RyZWFtSGFuZGxlKHNvY2tldENvbm5lY3Rpb24sIGNsaWVudCkpOyB9CiAKICAgICAgICAg
dmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7CiAgICAgICAgIHZvaWQgY29ubmVjdGVkKEdT
b2NrZXRDb25uZWN0aW9uKiwgR0Vycm9yKik7CkBAIC02Niw2ICs2OCw3IEBACiAgICAgICAgIHZv
aWQqIG1faWQ7CiAKICAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxlKGNvbnN0IEtVUkwmLCBTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxlKEdTb2Nr
ZXRDb25uZWN0aW9uKiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7CiAKICAgICAgICAgLy8g
Tm8gYXV0aGVudGljYXRpb24gZm9yIHN0cmVhbXMgcGVyIHNlLCBidXQgcHJveHkgbWF5IGFzayBm
b3IgY3JlZGVudGlhbHMuCiAgICAgICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0
cmVhbUhhbmRsZVNvdXAuY3BwCShyZXZpc2lvbiAxMjA1ODQpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExIEdv
b2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNh
bXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtOTQsNiArOTUsMzIgQEAKICAgICAgICAgcmVpbnRl
cnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPihjb25uZWN0ZWRDYWxsYmFjayksIG1faWQp
OwogfQogCitTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhhbmRsZShHU29ja2V0Q29u
bmVjdGlvbiogc29ja2V0Q29ubmVjdGlvbiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50KiBjbGll
bnQpCisgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlKEtVUkwoKSwgY2xpZW50KQorICAgICwg
bV9yZWFkQnVmZmVyKDApCit7CisgICAgbV9pZCA9IGFjdGl2YXRlSGFuZGxlKHRoaXMpOworICAg
IG1fc29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0R1JlZihzb2NrZXRDb25uZWN0aW9uKTsKKyAgICBt
X291dHB1dFN0cmVhbSA9IEdfUE9MTEFCTEVfT1VUUFVUX1NUUkVBTShnX2lvX3N0cmVhbV9nZXRf
b3V0cHV0X3N0cmVhbShHX0lPX1NUUkVBTShtX3NvY2tldENvbm5lY3Rpb24uZ2V0KCkpKSk7Cisg
ICAgbV9pbnB1dFN0cmVhbSA9IGdfaW9fc3RyZWFtX2dldF9pbnB1dF9zdHJlYW0oR19JT19TVFJF
QU0obV9zb2NrZXRDb25uZWN0aW9uLmdldCgpKSk7CisKKyAgICBtX3JlYWRCdWZmZXIgPSBuZXcg
Y2hhcltSRUFEX0JVRkZFUl9TSVpFXTsKKyAgICBpZiAoIW1fcmVhZEJ1ZmZlcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgZ19pbnB1dF9zdHJlYW1fcmVhZF9hc3luYyhtX2lucHV0U3RyZWFtLmdl
dCgpLCBtX3JlYWRCdWZmZXIsIFJFQURfQlVGRkVSX1NJWkUsIEdfUFJJT1JJVFlfREVGQVVMVCwg
MCwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPihyZWFkUmVh
ZHlDYWxsYmFjayksIG1faWQpOworCisgICAgbV9zdGF0ZSA9IE9wZW47CisgICAgbV9jbGllbnQg
PSBjbGllbnQ7CisKKyAgICBpZiAobV9jbGllbnQpIHsKKyAgICAgICAgLy8gVGhlIGNsaWVudCBj
YW4gY2xvc2UgdGhlIGhhbmRsZSwgcG90ZW50aWFsbHkgcmVtb3ZpbmcgdGhlIGxhc3QgcmVmZXJl
bmNlLgorICAgICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBwcm90ZWN0KHRoaXMpOyAK
KyAgICAgICAgbV9jbGllbnQtPmRpZE9wZW5Tb2NrZXRTdHJlYW0odGhpcyk7CisgICAgfQorfQor
CiBTb2NrZXRTdHJlYW1IYW5kbGU6On5Tb2NrZXRTdHJlYW1IYW5kbGUoKQogewogICAgIC8vIElm
IGZvciBzb21lIHJlYXNvbiB3ZSB3ZXJlIGRlc3Ryb3llZCB3aXRob3V0IGNsb3NpbmcsIGVuc3Vy
ZSB0aGF0IHdlIGFyZSBkZWFjdGl2YXRlZC4KQEAgLTE1Nyw2ICsxODQsOSBAQAogCiBpbnQgU29j
a2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0
aCkKIHsKKyAgICBpZiAoIW1fb3V0cHV0U3RyZWFtIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4g
MDsKKwogICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKICAgICBnc3NpemUgd3JpdHRlbiA9IGdf
cG9sbGFibGVfb3V0cHV0X3N0cmVhbV93cml0ZV9ub25ibG9ja2luZyhtX291dHB1dFN0cmVhbS5n
ZXQoKSwgZGF0YSwgbGVuZ3RoLCAwLCAmZXJyb3Iub3V0UHRyKCkpOwogICAgIGlmIChlcnJvcikg
ewpAQCAtMTkyLDYgKzIyMiw3IEBACiAgICAgbV9vdXRwdXRTdHJlYW0gPSAwOwogICAgIG1faW5w
dXRTdHJlYW0gPSAwOwogICAgIGRlbGV0ZSBtX3JlYWRCdWZmZXI7CisgICAgbV9yZWFkQnVmZmVy
ID0gMDsKIAogICAgIG1fY2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152986</attachid>
            <date>2012-07-18 04:46:31 -0700</date>
            <delta_ts>2012-08-10 09:53:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20120718124621.patch</filename>
            <type>text/plain</type>
            <size>21339</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMjk0MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTA3LTE4ICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEV4dHJh
IFNvY2tldFN0cmVhbUhhbmRsZSBjb25zdHJ1Y3RvciBpcyBhZGRlZCB0byBhY2NlcHQgZXhpc3Rp
bmcgR1NvY2tldENvbm5lY3Rpb24uIE5lZWRlZCAKKyAgICAgICAgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4KKworICAgICAgICBJdCBpcyBub3QgcG9z
c2libGUgdG8gdGVzdCB0aGUgY2hhbmdlIGF1dG9tYXRpY2FsbHksIHNvIGFsbCB0ZXN0aW5nIGhh
cyBiZWVuIGRvbmUgbWFudWFsbHkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL3NvdXAv
U29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5kbGUpOgorICAgICAgICAqIHBs
YXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAg
ICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0
Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9y
bUNsb3NlKToKKwogMjAxMi0wNy0xOCAgWW9zaGlmdW1pIElub3VlICA8eW9zaW5AY2hyb21pdW0u
b3JnPgogCiAgICAgICAgIFJFR1JFU1NJT04ocjExNzczOCkgW0Zvcm1zXSBEZWZhdWx0IHN0ZXAg
YmFzZSBzaG91bGQgYmUgMCAoPTE5NzAtMDEpIGZvciBpbnB1dCB0eXBlIG1vbnRoCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tl
dFN0cmVhbUhhbmRsZS5oCShyZXZpc2lvbiAxMjI5NDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNz
IEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKQEAgLTQ2LDYgKzQ3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIFNv
Y2tldFN0cmVhbUhhbmRsZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT4s
IHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IEtVUkwmIHVy
bCwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpIHsgcmV0dXJuIGFkb3B0UmVmKG5l
dyBTb2NrZXRTdHJlYW1IYW5kbGUodXJsLCBjbGllbnQpKTsgfQorICAgICAgICBzdGF0aWMgUGFz
c1JlZlB0cjxTb2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShHU29ja2V0Q29ubmVjdGlvbiogc29j
a2V0Q29ubmVjdGlvbiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpIHsgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTb2NrZXRTdHJlYW1IYW5kbGUoc29ja2V0Q29ubmVjdGlvbiwgY2xpZW50
KSk7IH0KIAogICAgICAgICB2aXJ0dWFsIH5Tb2NrZXRTdHJlYW1IYW5kbGUoKTsKICAgICAgICAg
dm9pZCBjb25uZWN0ZWQoR1NvY2tldENvbm5lY3Rpb24qLCBHRXJyb3IqKTsKQEAgLTY2LDYgKzY4
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkKiBtX2lkOwogCiAgICAgICAg
IFNvY2tldFN0cmVhbUhhbmRsZShjb25zdCBLVVJMJiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50
Kik7CisgICAgICAgIFNvY2tldFN0cmVhbUhhbmRsZShHU29ja2V0Q29ubmVjdGlvbiosIFNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudCopOwogCiAgICAgICAgIC8vIE5vIGF1dGhlbnRpY2F0aW9uIGZv
ciBzdHJlYW1zIHBlciBzZSwgYnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRlbnRpYWxzLgogICAg
ICAgICB2b2lkIGRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50
aWNhdGlvbkNoYWxsZW5nZSYpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZVNvdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAko
cmV2aXNpb24gMTIyOTQxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3Vw
L1NvY2tldFN0cmVhbUhhbmRsZVNvdXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBA
QAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0
ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKQEAgLTk0LDYgKzk1LDMyIEBAIFNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFu
ZGxlKGMKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPihjb25u
ZWN0ZWRDYWxsYmFjayksIG1faWQpOwogfQogCitTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0
cmVhbUhhbmRsZShHU29ja2V0Q29ubmVjdGlvbiogc29ja2V0Q29ubmVjdGlvbiwgU29ja2V0U3Ry
ZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpCisgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlKEtV
UkwoKSwgY2xpZW50KQorICAgICwgbV9yZWFkQnVmZmVyKDApCit7CisgICAgbV9pZCA9IGFjdGl2
YXRlSGFuZGxlKHRoaXMpOworICAgIG1fc29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0R1JlZihzb2Nr
ZXRDb25uZWN0aW9uKTsKKyAgICBtX291dHB1dFN0cmVhbSA9IEdfUE9MTEFCTEVfT1VUUFVUX1NU
UkVBTShnX2lvX3N0cmVhbV9nZXRfb3V0cHV0X3N0cmVhbShHX0lPX1NUUkVBTShtX3NvY2tldENv
bm5lY3Rpb24uZ2V0KCkpKSk7CisgICAgbV9pbnB1dFN0cmVhbSA9IGdfaW9fc3RyZWFtX2dldF9p
bnB1dF9zdHJlYW0oR19JT19TVFJFQU0obV9zb2NrZXRDb25uZWN0aW9uLmdldCgpKSk7CisKKyAg
ICBtX3JlYWRCdWZmZXIgPSBuZXcgY2hhcltSRUFEX0JVRkZFUl9TSVpFXTsKKyAgICBpZiAoIW1f
cmVhZEJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgZ19pbnB1dF9zdHJlYW1fcmVhZF9h
c3luYyhtX2lucHV0U3RyZWFtLmdldCgpLCBtX3JlYWRCdWZmZXIsIFJFQURfQlVGRkVSX1NJWkUs
IEdfUFJJT1JJVFlfREVGQVVMVCwgMCwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNS
ZWFkeUNhbGxiYWNrPihyZWFkUmVhZHlDYWxsYmFjayksIG1faWQpOworCisgICAgbV9zdGF0ZSA9
IE9wZW47CisgICAgbV9jbGllbnQgPSBjbGllbnQ7CisKKyAgICBpZiAobV9jbGllbnQpIHsKKyAg
ICAgICAgLy8gVGhlIGNsaWVudCBjYW4gY2xvc2UgdGhlIGhhbmRsZSwgcG90ZW50aWFsbHkgcmVt
b3ZpbmcgdGhlIGxhc3QgcmVmZXJlbmNlLgorICAgICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFu
ZGxlPiBwcm90ZWN0KHRoaXMpOyAKKyAgICAgICAgbV9jbGllbnQtPmRpZE9wZW5Tb2NrZXRTdHJl
YW0odGhpcyk7CisgICAgfQorfQorCiBTb2NrZXRTdHJlYW1IYW5kbGU6On5Tb2NrZXRTdHJlYW1I
YW5kbGUoKQogewogICAgIC8vIElmIGZvciBzb21lIHJlYXNvbiB3ZSB3ZXJlIGRlc3Ryb3llZCB3
aXRob3V0IGNsb3NpbmcsIGVuc3VyZSB0aGF0IHdlIGFyZSBkZWFjdGl2YXRlZC4KQEAgLTE1Nyw2
ICsxODQsOSBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6d3JpdGVSZWFkeSgpCiAKIGludCBT
b2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtU2VuZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVu
Z3RoKQogeworICAgIGlmICghbV9vdXRwdXRTdHJlYW0gfHwgIWRhdGEpCisgICAgICAgIHJldHVy
biAwOworCiAgICAgR093blB0cjxHRXJyb3I+IGVycm9yOwogICAgIGdzc2l6ZSB3cml0dGVuID0g
Z19wb2xsYWJsZV9vdXRwdXRfc3RyZWFtX3dyaXRlX25vbmJsb2NraW5nKG1fb3V0cHV0U3RyZWFt
LmdldCgpLCBkYXRhLCBsZW5ndGgsIDAsICZlcnJvci5vdXRQdHIoKSk7CiAgICAgaWYgKGVycm9y
KSB7CkBAIC0xOTIsNiArMjIyLDcgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3Jt
Q2xvc2UoKQogICAgIG1fb3V0cHV0U3RyZWFtID0gMDsKICAgICBtX2lucHV0U3RyZWFtID0gMDsK
ICAgICBkZWxldGUgbV9yZWFkQnVmZmVyOworICAgIG1fcmVhZEJ1ZmZlciA9IDA7CiAKICAgICBt
X2NsaWVudC0+ZGlkQ2xvc2VTb2NrZXRTdHJlYW0odGhpcyk7CiB9CkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShy
ZXZpc2lvbiAxMjI5NDEpCisrKyBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwzNiBAQAorMjAxMi0wNy0xOCAgQW50b24gT2J6aGlyb3YgIDxhLm9iemhp
cm92QHNhbXN1bmcuY29tPgorCisgICAgICAgIEFkZCBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBv
ZiByZW1vdGUgd2ViIGluc3BlY3RvciBzZXJ2ZXIgZm9yIEdUSyBwb3J0LgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODgwOTQKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgcGxhdGZvcm0gaW1wbGVtZW50
YXRpb24gaXMgYmFzZWQgb24gR1NvY2tldCBBUEkgKFdlYkluc3BlY3RvclNlcnZlckd0ay5jcHAg
YW5kIFdlYlNvY2tldFNlcnZlckd0ay5jcHApLgorICAgICAgICBUaGUgc2VydmVyIGxpc3RlbnMg
b24gcG9ydCAyOTk5IGJ5IGRlZmF1bHQuIElwIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBpcyBzZXQK
KyAgICAgICAgaW4gR1RLV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgKGZvciBleGFtcGxlIGV4cG9y
dCBHVEtXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUj0iMTkyLjE2OC4xMjQuMTMwOjI5OTkiKS4KKyAg
ICAgICAgVGhlIHNlcnZlciBpcyBzdGFydGVkL3N0b3BwZWQgYnkgZW5hYmxpbmcvZGlzYWJsaW5n
IGRldmVsb3BlciBleHRyYXMuCisgICAgICAgIE9uY2UgYSBwYWdlIGlzIGxvYWRlZCBpbnNlY3Rv
ciBzZXJ2ZXIgY2FuIGJlIGFjY2Vzc2VkIHZpYSBvdGhlciBXZWJLaXQgYmFzZWQgYnJvd3Nlci4K
KyAgICAgICAgKGZvciBleGFtcGxlIHVzaW5nIDEwNi4xLjkuMjM6Mjk5OSBsaW5rKS4gCisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgor
ICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyLmg6Cisg
ICAgICAgIChXZWJTb2NrZXRTZXJ2ZXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0
ay9XZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6Cisg
ICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjZUZvclBh
dGgpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNl
cnZlckd0ay5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6
Y29ubmVjdGlvbkNhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpw
bGF0Zm9ybUluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBs
YXRmb3JtTGlzdGVuKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9y
bUNsb3NlKToKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcDoKKyAgICAgICAg
KFdlYktpdDo6V2ViUGFnZVByb3h5Ojppbml0aWFsaXplV2ViUGFnZSk6CisgICAgICAgIChXZWJL
aXQ6OldlYlBhZ2VQcm94eTo6cHJlZmVyZW5jZXNEaWRDaGFuZ2UpOgorICAgICAgICAqIGNvbmZp
Zy5oOgorCiAyMDEyLTA3LTE4ICBZb3VuZ1RhZWNrIFNvbmcgIDx5b3VuZ3RhZWNrLnNvbmdAc2Ft
c3VuZy5jb20+CiAKICAgICAgICAgW1dLMl1bRUZMXSBBZGQgYSBjb21tb24gY29kZSB1c2luZyBD
b2xvciBpbnN0ZWFkIG9mIFFDb2xvcgpJbmRleDogU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUu
YW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9u
IDEyMjk0MSkKKysrIFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkp
CkBAIC01Nyw2ICs1Nyw3IEBAIGxpYndlYmtpdDJndGtfQFdFQktJVEdUS19BUElfTUFKT1JfVkVS
U0kKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGx1Z2lucyBcCiAJLUkk
KHNyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1BsdWdpbnMvZ3RrIFwKIAktSSQoc3Jj
ZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvc291cCBcCisJLUkkKHNyY2RpcikvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlciBcCiAJLUkkKHNyY2RpcikvU291cmNl
L1dlYktpdDIvV2ViUHJvY2VzcyBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvV2ViUHJv
Y2Vzcy9BcHBsaWNhdGlvbkNhY2hlIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL0F1dGhlbnRpY2F0aW9uIFwKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxl
Lmxpc3QuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5h
bQkocmV2aXNpb24gMTIyOTQxKQorKysgU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5h
bQkod29ya2luZyBjb3B5KQpAQCAtODk5LDYgKzg5OSwxNSBAQCB3ZWJraXQyX3NvdXJjZXMgKz0g
XAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJUZXh0Q2hlY2tlckNsaWVudC5oIFwKIAlT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuY3BwIFwKIAlTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuY3BwIFwKKwlTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oIFwKKwlTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5jcHAgXAor
CVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVy
LmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0
U2VydmVyQ2xpZW50LmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oIFwKKwlTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JTZXJ2
ZXJHdGsuY3BwIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0
ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2Vi
VmlicmF0aW9uUHJvdmlkZXIuY3BwIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVmli
cmF0aW9uUHJvdmlkZXIuaCBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlZpYnJhdGlv
blByb3h5LmNwcCBcCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkocmV2aXNpb24gMTIyOTQxKQorKysgU291cmNlL1dl
YktpdDIvY29uZmlnLmgJKHdvcmtpbmcgY29weSkKQEAgLTExOCw1ICsxMTgsNyBAQCBzdGF0aWMg
Y29uc3QgdHlwZSYgbmFtZSgpIFwKICNpZm5kZWYgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIKICNp
ZiBQTEFURk9STShRVCkKICNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQorI2VsaWYg
UExBVEZPUk0oR1RLKQorI2RlZmluZSBFTkFCTEVfSU5TUEVDVE9SX1NFUlZFUiAxCiAjZW5kaWYK
ICNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAJ
KHJldmlzaW9uIDEyMjk0MSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJv
eHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmln
aHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEwMyw2ICsxMDQsOSBA
QAogCiAjaWYgUExBVEZPUk0oR1RLKQogI2luY2x1ZGUgIkFyZ3VtZW50Q29kZXJzR3RrLmgiCisj
aWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIpCisjaW5jbHVkZSA8V2ViSW5zcGVjdG9yU2VydmVy
Lmg+CisjZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIE5ERUJVRwpAQCAtMzYyLDYgKzM2NiwxMyBA
QCB2b2lkIFdlYlBhZ2VQcm94eTo6aW5pdGlhbGl6ZVdlYlBhZ2UoKQogICAgIEFTU0VSVChtX2Ry
YXdpbmdBcmVhKTsKIAogI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQorI2lmIFBMQVRGT1JN
KEdUSykKKyAgICAvLyB3aWxsIHJlYWQgaG9zdCBhZGRyZXNzIGZyb20gZW52aXJvbm1lbnQgdmFy
aWFibGVzCisgICAgaWYgKG1fcGFnZUdyb3VwLT5wcmVmZXJlbmNlcygpLT5kZXZlbG9wZXJFeHRy
YXNFbmFibGVkKCkpCisgICAgICAgIFdlYkluc3BlY3RvclNlcnZlcjo6c2hhcmVkKCkubGlzdGVu
KCIiLCAyOTk5KTsKKyAgICBlbHNlCisgICAgICAgIFdlYkluc3BlY3RvclNlcnZlcjo6c2hhcmVk
KCkuY2xvc2UoKTsKKyNlbmRpZgogICAgIGlmIChtX3BhZ2VHcm91cC0+cHJlZmVyZW5jZXMoKS0+
ZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCgpKQogICAgICAgICBpbnNwZWN0b3IoKS0+ZW5hYmxlUmVt
b3RlSW5zcGVjdGlvbigpOwogI2VuZGlmCkBAIC0xNzI3LDYgKzE3MzgsMTMgQEAgdm9pZCBXZWJQ
YWdlUHJveHk6OnByZWZlcmVuY2VzRGlkQ2hhbmdlKAogICAgICAgICByZXR1cm47CiAKICNpZiBF
TkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKyNpZiBQTEFURk9STShHVEspCisgICAgLy8gd2lsbCBy
ZWFkIGhvc3QgYWRkcmVzcyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgIGlmIChtX3Bh
Z2VHcm91cC0+cHJlZmVyZW5jZXMoKS0+ZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCgpKQorICAgICAg
ICBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmxpc3RlbigiIiwgMjk5OSk7CisgICAgZWxz
ZQorICAgICAgICBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmNsb3NlKCk7CisjZW5kaWYK
ICAgICBpZiAobV9wYWdlR3JvdXAtPnByZWZlcmVuY2VzKCktPmRldmVsb3BlckV4dHJhc0VuYWJs
ZWQoKSkKICAgICAgICAgaW5zcGVjdG9yKCktPmVuYWJsZVJlbW90ZUluc3BlY3Rpb24oKTsKICNl
bmRpZgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJT
b2NrZXRTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5z
cGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCShyZXZpc2lvbiAxMjI5NDEpCisrKyBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAxMSBB
cHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTm9r
aWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNyw2ICszOCwxMCBAQAogbmFtZXNw
YWNlIFdlYktpdCB7CiBjbGFzcyBRdFRjcFNlcnZlckhhbmRsZXI7CiB9CisjZWxpZiBQTEFURk9S
TShHVEspCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRl
IDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+CiAjZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpA
QCAtNzgsNiArODMsOCBAQCBwcml2YXRlOgogICAgIHVuc2lnbmVkIHNob3J0IG1fcG9ydDsKICNp
ZiBQTEFURk9STShRVCkKICAgICBPd25QdHI8UXRUY3BTZXJ2ZXJIYW5kbGVyPiBtX3RjcFNlcnZl
ckhhbmRsZXI7CisjZWxpZiBQTEFURk9STShHVEspCisgICAgR1JlZlB0cjxHU29ja2V0U2Vydmlj
ZT4gbV9zb2NrZXRTZXJ2aWNlOwogI2VuZGlmCiAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFNl
cnZlckNvbm5lY3Rpb247CiB9OwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0
cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5oIgorCisjaW5jbHVk
ZSAiV2ViSW5zcGVjdG9yUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNs
dWRlIDxXZWJDb3JlL01JTUVUeXBlUmVnaXN0cnkuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2Ug
V2ViS2l0IHsKKworYm9vbCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQ
YXRoKGNvbnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRl
bnRUeXBlKQoreworICAgIGlmIChwYXRoID09ICIvIikgeworICAgICAgICBjb250ZW50VHlwZSA9
ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVp
bGRlciBidWlsZGVyOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiPGh0dHA+Iik7CisKKyAgICAg
ICAgY29uc3QgY2hhciogc2VydmVyQWRkcmVzcyA9IGdldGVudigiR1RLV0VCS0lUX0lOU1BFQ1RP
Ul9TRVJWRVIiKTsKKyAgICAgICAgaWYgKCFzZXJ2ZXJBZGRyZXNzKQorICAgICAgICAgICAgc2Vy
dmVyQWRkcmVzcyA9ICIxMjcuMC4wLjE6Mjk5OSI7CisKKyAgICAgICAgY29uc3QgY2hhciogdXJs
ID0gZ2V0ZW52KCJHVEtXRUJLSVRfSU5TUEVDVE9SX1VSTCIpOworICAgICAgICBpZiAoIXVybCkK
KyAgICAgICAgICAgIHVybCA9ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL2V4cG9ydC9oZWFkL3Ry
dW5rL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwiOwor
CisgICAgICAgIFN0cmluZyBpbnNwZWN0b3JVUkwgPSBTdHJpbmcodXJsKSArICI/d3M9IiArIHNl
cnZlckFkZHJlc3MgKyAiL2RldnRvb2xzL3BhZ2UvIjsgCisKKyAgICAgICAgaWYgKG1fY2xpZW50
TWFwLnNpemUoKSA9PSAxKSB7IC8vIG9ubHkgb25lIHBhZ2UgcmVnaXN0ZXJlZCwgY2FuIGRvIHJl
ZGlyZWN0CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPGhlYWQ+PG1ldGEgaHR0cC1lcXVp
dj1cInJlZnJlc2hcIiBjb250ZW50PVwiMDsgVVJMPSIpOworICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoaW5zcGVjdG9yVVJMICsgU3RyaW5nOjpudW1iZXIobV9jbGllbnRNYXAuYmVnaW4oKS0+
Zmlyc3QpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIj48L2hlYWQ+Iik7CisgICAg
ICAgIH0KKworICAgICAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IG1fY2xpZW50TWFwLmVu
ZCgpOworICAgICAgICBmb3IgKENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBtX2NsaWVudE1hcC5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIFdlYlBhZ2VQcm94eSogd2Vi
UGFnZSA9IGl0LT5zZWNvbmQtPnBhZ2UoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI8
YSBocmVmPVwiIiArIGluc3BlY3RvclVSTCArIFN0cmluZzo6bnVtYmVyKGl0LT5maXJzdCkgKyAi
XCI+IiArIHdlYlBhZ2UtPnBhZ2VUaXRsZSgpICsgIjwvYT48YnI+Iik7CisgICAgICAgIH0KKwor
ICAgICAgICBidWlsZGVyLmFwcGVuZCgiPC9odHRwPiIpOworCisgICAgICAgIENTdHJpbmcgY3N0
ciA9IGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCk7CisgICAgICAgIGRhdGEuYXBwZW5kKGNzdHIu
ZGF0YSgpLCBjc3RyLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorIAor
ICAgIHJldHVybiBmYWxzZTsKK30KKworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0luc3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJv
bmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQorCisjaW5jbHVkZSAi
V2ViU29ja2V0U2VydmVyLmgiCisKKyNpbmNsdWRlICJXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
LmgiCisjaW5jbHVkZSA8V2ViQ29yZS9Tb2NrZXRTdHJlYW1IYW5kbGUuaD4KKworI2luY2x1ZGUg
PGdpby9naW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx3dGYvUGFzc093blB0
ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgZ2Jvb2xlYW4gY29ubmVjdGlv
bkNhbGxiYWNrKEdTb2NrZXRTZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBHU29ja2V0Q29ubmVjdGlvbiogY29ubmVjdGlvbiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgR09iamVjdCogc291cmNlT2JqZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciBzZWxmKQoreyAgIAorI2lmbmRlZiBM
T0dfRElTQUJMRUQgICAgCisgICAgR1NvY2tldEFkZHJlc3MqIHNvY2thZGRyID0gZ19zb2NrZXRf
Y29ubmVjdGlvbl9nZXRfcmVtb3RlX2FkZHJlc3MoY29ubmVjdGlvbiwgTlVMTCk7CisgICAgR0lu
ZXRBZGRyZXNzKiBhZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzKEdfSU5F
VF9TT0NLRVRfQUREUkVTUyhzb2NrYWRkcikpOworICAgIGd1aW50MTYgcG9ydCA9IGdfaW5ldF9z
b2NrZXRfYWRkcmVzc19nZXRfcG9ydChHX0lORVRfU09DS0VUX0FERFJFU1Moc29ja2FkZHIpKTsK
KworICAgIExPRyhXZWJTb2NrZXRTZXJ2ZXIsICJOZXcgQ29ubmVjdGlvbiBmcm9tICVzOiVkLiIs
IGdfaW5ldF9hZGRyZXNzX3RvX3N0cmluZyhhZGRyKSwgcG9ydCk7CisgICAgZ19vYmplY3RfdW5y
ZWYoc29ja2FkZHIpOworI2VuZGlmCisKKyAgICBXZWJTb2NrZXRTZXJ2ZXIqIHNlcnZlciA9IChX
ZWJTb2NrZXRTZXJ2ZXIqKXNlbGY7CisgICAgLy8gcmVmZXJlbmNlIGNvbm5lY3Rpb24gYmVmb3Jl
IGFjY2VwdGluZyBpdAorICAgIGdfb2JqZWN0X3JlZl9zaW5rKGNvbm5lY3Rpb24pOworCisgICAg
T3duUHRyPFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24+IHdlYlNvY2tldENvbm5lY3Rpb24gPSBh
ZG9wdFB0cihuZXcgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbihzZXJ2ZXItPmNsaWVudCgpLCBz
ZXJ2ZXIpKTsKKyAgICB3ZWJTb2NrZXRDb25uZWN0aW9uLT5zZXRTb2NrZXRIYW5kbGUoU29ja2V0
U3RyZWFtSGFuZGxlOjpjcmVhdGUoY29ubmVjdGlvbiwgd2ViU29ja2V0Q29ubmVjdGlvbi5nZXQo
KSkpOworICAgIHNlcnZlci0+ZGlkQWNjZXB0Q29ubmVjdGlvbih3ZWJTb2NrZXRDb25uZWN0aW9u
LnJlbGVhc2UoKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30gCisKK3ZvaWQgV2ViU29ja2V0U2Vy
dmVyOjpwbGF0Zm9ybUluaXRpYWxpemUoKQoreworICAgIG1fc29ja2V0U2VydmljZSA9IGFkb3B0
R1JlZihnX3NvY2tldF9zZXJ2aWNlX25ldygpKTsKKyAgICBpZiAobV9zb2NrZXRTZXJ2aWNlLmdl
dCgpKSB7CisgICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9zb2NrZXRTZXJ2aWNlLmdldCgpLCAi
aW5jb21pbmciLCBHX0NBTExCQUNLKGNvbm5lY3Rpb25DYWxsYmFjayksIHRoaXMpOworICAgICAg
ICBpZiAoIWdfc29ja2V0X3NlcnZpY2VfaXNfYWN0aXZlKG1fc29ja2V0U2VydmljZS5nZXQoKSkp
CisgICAgICAgICAgICBnX3NvY2tldF9zZXJ2aWNlX3N0YXJ0KG1fc29ja2V0U2VydmljZS5nZXQo
KSk7CisgICAgfQorfQorCitib29sIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1MaXN0ZW4oY29u
c3QgU3RyaW5nJiBiaW5kQWRkcmVzcywgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKyAgICBTdHJp
bmcgaG9zdG5hbWUgPSBiaW5kQWRkcmVzczsKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0VmFsdWUg
PSBwb3J0OworICAgIAorICAgIGlmIChiaW5kQWRkcmVzcyA9PSAiIikgeworICAgICAgICBTdHJp
bmcgZW52U3RyOworICAgICAgICBob3N0bmFtZSA9ICIxMjcuMC4wLjEiOworICAgICAgICBwb3J0
VmFsdWUgPSAyOTk5OworICAgICAgICBjb25zdCBjaGFyKiBlbnZDU3RyID0gZ2V0ZW52KCJHVEtX
RUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIpOworICAgIAorICAgICAgICBpZiAoZW52Q1N0cikgewor
ICAgICAgICAgICAgZW52U3RyID0gZW52Q1N0cjsgIAorICAgICAgICAgICAgVmVjdG9yPFN0cmlu
Zz4gcmVzdWx0OworICAgICAgICAgICAgZW52U3RyLnNwbGl0KCI6IiwgcmVzdWx0KTsKKworICAg
ICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgIGhvc3Ru
YW1lID0gcmVzdWx0WzBdOworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICBwb3J0VmFsdWUgPSByZXN1bHRbMV0udG9JbnQoJm9rKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICBwb3J0ID0gMjk5OTsgICAgICAgICAg
ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIExPRyhXZWJTb2NrZXRT
ZXJ2ZXIsICJMaXN0ZW4gdG8gYWRkcmVzcz0lcywgcG9ydD0lZC4iLCBob3N0bmFtZS5sYXRpbjEo
KS5kYXRhKCksIHBvcnRWYWx1ZSk7CisKKyAgICBHU29ja2V0U2VydmljZSogc29ja2V0U2Vydmlj
ZSA9IG1fc29ja2V0U2VydmljZS5nZXQoKTsKKyAgICBpZiAoIXNvY2tldFNlcnZpY2UpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IHNvY2tldCBzZXJ2aWNlLiIpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR0luZXRBZGRyZXNzKiBhZGRyZXNzID0gZ19p
bmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGhvc3RuYW1lLmxhdGluMSgpLmRhdGEoKSk7Cisg
ICAgR1NvY2tldEFkZHJlc3MqIHNvY2tldEFkZHJlc3MgPSBnX2luZXRfc29ja2V0X2FkZHJlc3Nf
bmV3KGFkZHJlc3MsIHBvcnRWYWx1ZSk7CisKKyAgICBnYm9vbGVhbiByZXN1bHQgPSBnX3NvY2tl
dF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUihzb2NrZXRTZXJ2aWNlKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRBZGRyZXNzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfU1RSRUFNLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1BST1RPQ09MX1RDUCwgMCwgMCwg
MCk7CisKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFk
ZCBpbmV0IGFkZHJlc3MgdG8gd2ViIGluc3BlY3RvciBzZXJ2ZXIgbGlzdGVuZXIuIik7CisKKyAg
ICBnX29iamVjdF91bnJlZihzb2NrZXRBZGRyZXNzKTsKKyAgICBnX29iamVjdF91bnJlZihhZGRy
ZXNzKTsKKworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UoKQor
eworICAgIGlmIChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpCisgICAgICAgIGdfc29ja2V0X3NlcnZp
Y2Vfc3RvcChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFC
TEUoSU5TUEVDVE9SX1NFUlZFUikK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157749</attachid>
            <date>2012-08-10 09:53:59 -0700</date>
            <delta_ts>2012-09-11 02:52:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20120810175300.patch</filename>
            <type>text/plain</type>
            <size>29486</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyNTI4OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDEyLTA4LTEwICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEV4dHJh
IFNvY2tldFN0cmVhbUhhbmRsZSBjb25zdHJ1Y3RvciBpcyBhZGRlZCB0byBhY2NlcHQgZXhpc3Rp
bmcgR1NvY2tldENvbm5lY3Rpb24uIE5lZWRlZCAKKyAgICAgICAgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4KKworICAgICAgICBJdCBpcyBub3QgcG9z
c2libGUgdG8gdGVzdCB0aGUgY2hhbmdlIGF1dG9tYXRpY2FsbHksIHNvIGFsbCB0ZXN0aW5nIGhh
cyBiZWVuIGRvbmUgbWFudWFsbHkuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2lu
c3BlY3RvclBhZ2VJbmRleC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3Jr
L3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5kbGUpOgorICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxl
OjpwbGF0Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpw
bGF0Zm9ybUNsb3NlKToKKwogMjAxMi0wOC0xMCAgS2V2aW4gRWxsaXMgIDxrZXZlcnNAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIEhvcml6b250YWwgc2Nyb2xsYmFyIGFwcGVhcnMgaW4gdGhlIG1v
bnRoLXllYXIgc2VsZWN0b3Igb2YgaW5wdXRbdHlwZT1kYXRlXQpJbmRleDogU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRl
eC5odG1sCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMSBAQAor
PCFET0NUWVBFIGh0bWw+Cis8aHRtbD48aGVhZD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2Ny
aXB0Ij4KK2Z1bmN0aW9uIGNyZWF0ZVBhZ2VMaXN0KCkgeworICAgIHZhciB4aHIgPSBuZXcgWE1M
SHR0cFJlcXVlc3Q7CisgICAgeGhyLm9wZW4oIkdFVCIsICIvcGFnZWxpc3QuanNvbiIpOworICAg
IHhoci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7CisgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIw
MCkgeworICAgICAgICAgICAgdmFyIHBhZ2VzID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0
KTsKKyAgICAgICAgICAgIGlmIChwYWdlcy5sZW5ndGgpCisgICAgICAgICAgICAgICAgZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoIm5vUGFnZU5vdGljZSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7
CisgICAgICAgICAgICBmb3IgKHZhciBpIGluIHBhZ2VzKSB7CisgICAgICAgICAgICAgICAgdmFy
IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CisgICAgICAgICAgICAgICAgdmFy
IHRpdGxlID0gcGFnZXNbaV0udGl0bGUgPyBwYWdlc1tpXS50aXRsZSA6ICgiUGFnZSAiICsgKE51
bWJlcihwYWdlc1tpXS5pZCkpKTsKKyAgICAgICAgICAgICAgICB2YXIgdXJsID0gcGFnZXNbaV0u
dXJsOworICAgICAgICAgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4
dE5vZGUodGl0bGUgKyAodXJsID8gKCIgWyIgKyB1cmwgKyAiXSIpIDogIiIgKSkpOworICAgICAg
ICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCJocmVmIiwgcGFnZXNbaV0uaW5zcGVjdG9yVXJs
KTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspOworICAg
ICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgiYnIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIHhoci5z
ZW5kKCk7Cit9CisKK2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQi
LCBjcmVhdGVQYWdlTGlzdCwgZmFsc2UpOworPC9zY3JpcHQ+Cis8L2hlYWQ+PGJvZHk+Cis8aDE+
SW5zcGVjdGFibGUgd2ViIHZpZXdzPC9oMT4KKzxwIGlkPSJub1BhZ2VOb3RpY2UiIHN0eWxlPSJj
b2xvcjpncmV5Ij5Ob25lIGZvdW5kLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBzZXQgdGhlIGRl
dmVsb3BlckV4dHJhc0VuYWJsZWQgcHJlZmVyZW5jZSBwcm9wZXJ0eSBvbiB5b3VyIFdlYlZpZXcu
PC9wPgorPC9ib2R5PjwvaHRtbD4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHJldmlzaW9uIDEy
NTI2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJl
YW1IYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmln
aHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsNiArNDcsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlIDogcHVibGljIFJl
ZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZUJh
c2UgewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29ja2V0U3RyZWFt
SGFuZGxlPiBjcmVhdGUoY29uc3QgS1VSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQq
IGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNs
aWVudCkpOyB9CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVhbUhhbmRsZT4g
Y3JlYXRlKEdTb2NrZXRDb25uZWN0aW9uKiBzb2NrZXRDb25uZWN0aW9uLCBTb2NrZXRTdHJlYW1I
YW5kbGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhh
bmRsZShzb2NrZXRDb25uZWN0aW9uLCBjbGllbnQpKTsgfQogCiAgICAgICAgIHZpcnR1YWwgflNv
Y2tldFN0cmVhbUhhbmRsZSgpOwogICAgICAgICB2b2lkIGNvbm5lY3RlZChHU29ja2V0Q29ubmVj
dGlvbiosIEdFcnJvciopOwpAQCAtNjYsNiArNjgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgICAgIHZvaWQqIG1faWQ7CiAKICAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxlKGNvbnN0IEtV
UkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICAgICAgU29ja2V0U3RyZWFtSGFu
ZGxlKEdTb2NrZXRDb25uZWN0aW9uKiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7CiAKICAg
ICAgICAgLy8gTm8gYXV0aGVudGljYXRpb24gZm9yIHN0cmVhbXMgcGVyIHNlLCBidXQgcHJveHkg
bWF5IGFzayBmb3IgY3JlZGVudGlhbHMuCiAgICAgICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291
cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3Vw
L1NvY2tldFN0cmVhbUhhbmRsZVNvdXAuY3BwCShyZXZpc2lvbiAxMjUyNjYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5
LCAyMDExIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtOTQsNiArOTUsMzEgQEAgU29ja2V0
U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUoYwogICAgICAgICByZWludGVycHJldF9j
YXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KGNvbm5lY3RlZENhbGxiYWNrKSwgbV9pZCk7CiB9CiAK
K1NvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKEdTb2NrZXRDb25uZWN0aW9u
KiBzb2NrZXRDb25uZWN0aW9uLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkKKyAg
ICA6IFNvY2tldFN0cmVhbUhhbmRsZUJhc2UoS1VSTCgpLCBjbGllbnQpCisgICAgLCBtX3JlYWRC
dWZmZXIoMCkKK3sKKyAgICBtX2lkID0gYWN0aXZhdGVIYW5kbGUodGhpcyk7CisgICAgbV9zb2Nr
ZXRDb25uZWN0aW9uID0gYWRvcHRHUmVmKHNvY2tldENvbm5lY3Rpb24pOworICAgIG1fb3V0cHV0
U3RyZWFtID0gR19QT0xMQUJMRV9PVVRQVVRfU1RSRUFNKGdfaW9fc3RyZWFtX2dldF9vdXRwdXRf
c3RyZWFtKEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpKTsKKyAgICBtX2lu
cHV0U3RyZWFtID0gZ19pb19zdHJlYW1fZ2V0X2lucHV0X3N0cmVhbShHX0lPX1NUUkVBTShtX3Nv
Y2tldENvbm5lY3Rpb24uZ2V0KCkpKTsKKworICAgIG1fcmVhZEJ1ZmZlciA9IG5ldyBjaGFyW1JF
QURfQlVGRkVSX1NJWkVdOworICAgIGlmICghbV9yZWFkQnVmZmVyKQorICAgICAgICByZXR1cm47
CisKKyAgICBnX2lucHV0X3N0cmVhbV9yZWFkX2FzeW5jKG1faW5wdXRTdHJlYW0uZ2V0KCksIG1f
cmVhZEJ1ZmZlciwgUkVBRF9CVUZGRVJfU0laRSwgR19QUklPUklUWV9ERUZBVUxULCAwLAorICAg
ICAgICByZWludGVycHJldF9jYXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KHJlYWRSZWFkeUNhbGxi
YWNrKSwgbV9pZCk7CisKKyAgICBtX3N0YXRlID0gT3BlbjsKKworICAgIGlmIChtX2NsaWVudCkg
eworICAgICAgICAvLyBUaGUgY2xpZW50IGNhbiBjbG9zZSB0aGUgaGFuZGxlLCBwb3RlbnRpYWxs
eSByZW1vdmluZyB0aGUgbGFzdCByZWZlcmVuY2UuCisgICAgICAgIFJlZlB0cjxTb2NrZXRTdHJl
YW1IYW5kbGU+IHByb3RlY3QodGhpcyk7IAorICAgICAgICBtX2NsaWVudC0+ZGlkT3BlblNvY2tl
dFN0cmVhbSh0aGlzKTsKKyAgICB9Cit9CisKIFNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0
cmVhbUhhbmRsZSgpCiB7CiAgICAgLy8gSWYgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgZGVzdHJv
eWVkIHdpdGhvdXQgY2xvc2luZywgZW5zdXJlIHRoYXQgd2UgYXJlIGRlYWN0aXZhdGVkLgpAQCAt
MTUzLDYgKzE3OSw5IEBAIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjp3cml0ZVJlYWR5KCkKIAog
aW50IFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGlu
dCBsZW5ndGgpCiB7CisgICAgaWYgKCFtX291dHB1dFN0cmVhbSB8fCAhZGF0YSkKKyAgICAgICAg
cmV0dXJuIDA7CisKICAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CiAgICAgZ3NzaXplIHdyaXR0
ZW4gPSBnX3BvbGxhYmxlX291dHB1dF9zdHJlYW1fd3JpdGVfbm9uYmxvY2tpbmcobV9vdXRwdXRT
dHJlYW0uZ2V0KCksIGRhdGEsIGxlbmd0aCwgMCwgJmVycm9yLm91dFB0cigpKTsKICAgICBpZiAo
ZXJyb3IpIHsKQEAgLTE4OCw2ICsyMTcsNyBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cGxh
dGZvcm1DbG9zZSgpCiAgICAgbV9vdXRwdXRTdHJlYW0gPSAwOwogICAgIG1faW5wdXRTdHJlYW0g
PSAwOwogICAgIGRlbGV0ZSBtX3JlYWRCdWZmZXI7CisgICAgbV9yZWFkQnVmZmVyID0gMDsKIAog
ICAgIG1fY2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsKIH0KSW5kZXg6IFNvdXJj
ZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VM
b2cJKHJldmlzaW9uIDEyNTI4OSkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDUzIEBACisyMDEyLTA4LTEwICBBbnRvbiBPYnpoaXJvdiAgPGEu
b2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3JtIGltcGxlbWVudGF0
aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBvcnQuCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5NAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBwbGF0Zm9ybSBpbXBs
ZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBHU29ja2V0IEFQSSAoV2ViSW5zcGVjdG9yU2VydmVyR3Rr
LmNwcCBhbmQgV2ViU29ja2V0U2VydmVyR3RrLmNwcCkuCisgICAgICAgIFRoZSBzZXJ2ZXIgbGlz
dGVucyBvbiBwb3J0IDI5OTkgYnkgZGVmYXVsdC4gSXAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGNh
biBiZSBzZXQKKyAgICAgICAgaW4gV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgKGZvciBleGFtcGxl
IGV4cG9ydCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUj0iMTkyLjE2OC4xMjQuMTMwOjI5OTkiKSBv
ciBjb2RlIHdpbGwgCisgICAgICAgIHRyeSB0byBmaWd1cmUgb3V0IGl0IGJ5IGNoZWNraW5nIGV4
aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlcyBpbiB0aGUgc3lzdGVtLgorICAgICAgICBUaGUgc2Vy
dmVyIGlzIHN0YXJ0ZWQgd2hlbiBmaXJzdCBwYWdlIGlzIHJlZ2lzdGVyZWQgYW5kIGlmIGRldmVs
b3BlciBleHRyYXMgaXMgZW5hYmxlZC4KKyAgICAgICAgT25jZSBhIHBhZ2UgaXMgbG9hZGVkIGlu
c2VjdG9yIHNlcnZlciBjYW4gYmUgYWNjZXNzZWQgdmlhIG90aGVyIFdlYktpdCBiYXNlZCBicm93
c2VyLgorICAgICAgICAoZm9yIGV4YW1wbGUgdXNpbmcgMTkyLjE2OC4xMjQuMTMwOjI5OTkgbGlu
aykuCisKKyAgICAgICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHRlc3QgdGhlIGNoYW5nZSBhdXRv
bWF0aWNhbGx5LCBzbyBhbGwgdGVzdGluZyBoYXMgYmVlbiBkb25lIG1hbnVhbGx5LgorCisgICAg
ICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cmVnaXN0ZXJQYWdlKToKKyAg
ICAgICAgKFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjp1bnJlZ2lzdGVyUGFnZSk6CisgICAg
ICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuaDoKKyAg
ICAgICAgKFdlYkluc3BlY3RvclNlcnZlcik6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3Rv
clNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRT
ZXJ2ZXI6OmNsb3NlKToKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OldlYlNv
Y2tldFNlcnZlcjo6c3RhcnQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
V2ViU29ja2V0U2VydmVyLmg6CisgICAgICAgIChXZWJTb2NrZXRTZXJ2ZXIpOgorICAgICAgICAq
IFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZENsb3NlU29j
a2V0U3RyZWFtKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0azogQWRk
ZWQuCisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9y
U2VydmVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViS2l0
OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKToKKyAgICAgICAg
KFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjpidWlsZFBhZ2VMaXN0KToKKyAgICAgICAgKiBV
SVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OmNvbm5lY3Rpb25DYWxsYmFj
ayk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1Jbml0aWFsaXpl
KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUxpc3Rlbik6Cisg
ICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1DbG9zZSk6CisgICAgICAg
IChXZWJLaXQ6OmdldElQQWRkcmVzcyk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZl
cjo6cGxhdGZvcm1HZXRJUEFkZHJlc3MpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvcXQvV2ViU29ja2V0U2VydmVyUXQuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2Nr
ZXRTZXJ2ZXI6OnBsYXRmb3JtR2V0SVBBZGRyZXNzKToKKyAgICAgICAgKFdlYktpdCk6CisgICAg
ICAgICogY29uZmlnLmg6CisKIDIwMTItMDgtMTAgIEFsbGFuIFNhbmRmZWxkIEplbnNlbiAgPGFs
bGFuLmplbnNlbkBub2tpYS5jb20+CiAKICAgICAgICAgW1F0XSBVbmluaXRpYWxpemVkIGZsYWdz
IGluIENvb3JkaW5hdGVkR3JhcGhpY3NMYXllcgpJbmRleDogU291cmNlL1dlYktpdDIvR05VbWFr
ZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUuYW0JKHJl
dmlzaW9uIDEyNTI2NikKKysrIFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5n
IGNvcHkpCkBAIC01Nyw2ICs1Nyw3IEBAIGxpYndlYmtpdDJndGtfQFdFQktJVEdUS19BUElfTUFK
T1JfVkVSU0kKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGx1Z2lucyBc
CiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1BsdWdpbnMvZ3RrIFwKIAkt
SSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvc291cCBcCisJLUkkKHNyY2Rpcikv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlciBcCiAJLUkkKHNyY2Rpcikv
U291cmNlL1dlYktpdDIvV2ViUHJvY2VzcyBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIv
V2ViUHJvY2Vzcy9BcHBsaWNhdGlvbkNhY2hlIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0
Mi9XZWJQcm9jZXNzL0F1dGhlbnRpY2F0aW9uIFwKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL0dOVW1h
a2VmaWxlLmxpc3QuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUu
bGlzdC5hbQkocmV2aXNpb24gMTI1MjY2KQorKysgU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUu
bGlzdC5hbQkod29ya2luZyBjb3B5KQpAQCAtOTA4LDYgKzkwOCwxNSBAQCB3ZWJraXQyX3NvdXJj
ZXMgKz0gXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJUZXh0Q2hlY2tlckNsaWVudC5o
IFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuY3BwIFwKIAlTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvV2ViVUlDbGllbnQuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuY3BwIFwKKwlTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oIFwKKwlT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5j
cHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0
U2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2Vi
U29ja2V0U2VydmVyQ2xpZW50LmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0
b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAgXAorCVNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oIFwK
KwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0
b3JTZXJ2ZXJHdGsuY3BwIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViVmlicmF0aW9uUHJvdmlkZXIuY3BwIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
V2ViVmlicmF0aW9uUHJvdmlkZXIuaCBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlZp
YnJhdGlvblByb3h5LmNwcCBcCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkocmV2aXNpb24gMTI1MjY2KQorKysgU291
cmNlL1dlYktpdDIvY29uZmlnLmgJKHdvcmtpbmcgY29weSkKQEAgLTExOCw1ICsxMTgsNyBAQCBz
dGF0aWMgY29uc3QgdHlwZSYgbmFtZSgpIFwKICNpZm5kZWYgRU5BQkxFX0lOU1BFQ1RPUl9TRVJW
RVIKICNpZiBQTEFURk9STShRVCkKICNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQor
I2VsaWYgUExBVEZPUk0oR1RLKQorI2RlZmluZSBFTkFCTEVfSU5TUEVDVE9SX1NFUlZFUiAxCiAj
ZW5kaWYKICNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmNwcAkocmV2aXNp
b24gMTI1MjY2KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9X
ZWJJbnNwZWN0b3JTZXJ2ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Myw2ICs4Myw4IEBAIGlu
dCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnJlZ2lzdGVyUGFnZShXZWIKIAogICAgIGludCBwYWdlSWQg
PSBtX25leHRBdmFpbGFibGVQYWdlSWQrKzsKICAgICBtX2NsaWVudE1hcC5zZXQocGFnZUlkLCBj
bGllbnQpOworCisgICAgc3RhcnQoKTsgICAgCiAgICAgcmV0dXJuIHBhZ2VJZDsKIH0KIApAQCAt
OTIsNiArOTQsOCBAQCB2b2lkIFdlYkluc3BlY3RvclNlcnZlcjo6dW5yZWdpc3RlclBhZ2UoCiAg
ICAgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IG1fY29ubmVjdGlvbk1h
cC5nZXQocGFnZUlkKTsKICAgICBpZiAoY29ubmVjdGlvbikKICAgICAgICAgY2xvc2VDb25uZWN0
aW9uKDAsIGNvbm5lY3Rpb24pOworICAgIGlmIChtX2NsaWVudE1hcC5pc0VtcHR5KCkpIC8vIHN0
b3AgdGhlIHNlcnZlciBpZiBubyBwYWdlcyBsZWZ0LCB0aGUgc2VydmVyIHdpbGwgYmUgcmVzdGFy
dGVkIGlmIG5ldyBwYWdlIGlzIHJlZ2lzdGVyZWQuCisgICAgICAgIGNsb3NlKCk7CiB9CiAKICNp
ZiAhUExBVEZPUk0oUVQpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmgJKHJldmlzaW9u
IDEyNTI2NikKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2Vi
SW5zcGVjdG9yU2VydmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICog
Q29weXJpZ2h0IChDKSAyMDExIEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIENv
cHlyaWdodCAoQykgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxs
IFJpZ2h0cyBSZXNlcnZlZC4gCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTYx
LDcgKzYyLDcgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgZGlkQ2xvc2VXZWJTb2NrZXRD
b25uZWN0aW9uKFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24qKTsKIAogICAgIGJvb2wgcGxhdGZv
cm1SZXNvdXJjZUZvclBhdGgoY29uc3QgU3RyaW5nJiBwYXRoLCBWZWN0b3I8Y2hhcj4mIGRhdGEs
IFN0cmluZyYgY29udGVudFR5cGUpOwotI2lmIFBMQVRGT1JNKFFUKQorI2lmIChQTEFURk9STShR
VCkgfHwgUExBVEZPUk0oR1RLKSkKICAgICB2b2lkIGJ1aWxkUGFnZUxpc3QoVmVjdG9yPGNoYXI+
JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKTsKICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2Nr
ZXRTZXJ2ZXIuY3BwCShyZXZpc2lvbiAxMjUyNjYpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDExIEFwcGxlIEluYy4gQWxsIFJp
Z2h0cyBSZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5n
IEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCiAgKgogICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKQEAgLTgyLDYgKzgzLDE1IEBAIHZvaWQgV2ViU29ja2V0U2VydmVyOjpj
bG9zZSgpCiAgICAgbV9iaW5kQWRkcmVzcyA9IFN0cmluZygpOwogfQogCit2b2lkIFdlYlNvY2tl
dFNlcnZlcjo6c3RhcnQoKQoreworICAgIGlmIChtX3N0YXRlID09IExpc3RlbmluZykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1HZXRJUEFkZHJlc3MobV9iaW5kQWRkcmVzcywgbV9w
b3J0KTsKKyAgICBsaXN0ZW4obV9iaW5kQWRkcmVzcywgbV9wb3J0KTsKK30KKwogdm9pZCBXZWJT
b2NrZXRTZXJ2ZXI6OmRpZEFjY2VwdENvbm5lY3Rpb24oUGFzc093blB0cjxXZWJTb2NrZXRTZXJ2
ZXJDb25uZWN0aW9uPiBjb25uZWN0aW9uKQogewogICAgIG1fY29ubmVjdGlvbnMuYXBwZW5kKGNv
bm5lY3Rpb24pOwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9XZWJTb2NrZXRTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCShyZXZpc2lvbiAxMjUyNjYpCisr
KyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZl
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykg
MjAxMSBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIw
MTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2
ZWQuIAogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNyw2ICszOCwxMCBAQAog
bmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBRdFRjcFNlcnZlckhhbmRsZXI7CiB9CisjZWxpZiBQ
TEFURk9STShHVEspCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNp
bmNsdWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+CiAjZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewpAQCAtNjAsNiArNjUsNyBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCgp
IGNvbnN0IHsgcmV0dXJuIG1fcG9ydDsgfTsKICAgICBTZXJ2ZXJTdGF0ZSBzZXJ2ZXJTdGF0ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGU7IH07CiAgICAgdm9pZCBjbG9zZSgpOworICAgIHZvaWQg
c3RhcnQoKTsKIAogICAgIFdlYlNvY2tldFNlcnZlckNsaWVudCogY2xpZW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9jbGllbnQ7IH0KICAgICB2b2lkIGRpZEFjY2VwdENvbm5lY3Rpb24oUGFzc093blB0
cjxXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uPik7CkBAIC03MCw2ICs3Niw3IEBAIHByaXZhdGU6
CiAgICAgdm9pZCBwbGF0Zm9ybUluaXRpYWxpemUoKTsKICAgICBib29sIHBsYXRmb3JtTGlzdGVu
KGNvbnN0IFN0cmluZyYgYmluZEFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IHBvcnQpOwogICAgIHZv
aWQgcGxhdGZvcm1DbG9zZSgpOworICAgIHZvaWQgcGxhdGZvcm1HZXRJUEFkZHJlc3MoU3RyaW5n
JiBiaW5kQWRkcmVzcywgdW5zaWduZWQgc2hvcnQmIHBvcnQpOwogCiAgICAgU2VydmVyU3RhdGUg
bV9zdGF0ZTsKICAgICBEZXF1ZTxPd25QdHI8V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbj4gPiBt
X2Nvbm5lY3Rpb25zOwpAQCAtNzgsNiArODUsOCBAQCBwcml2YXRlOgogICAgIHVuc2lnbmVkIHNo
b3J0IG1fcG9ydDsKICNpZiBQTEFURk9STShRVCkKICAgICBPd25QdHI8UXRUY3BTZXJ2ZXJIYW5k
bGVyPiBtX3RjcFNlcnZlckhhbmRsZXI7CisjZWxpZiBQTEFURk9STShHVEspCisgICAgR1JlZlB0
cjxHU29ja2V0U2VydmljZT4gbV9zb2NrZXRTZXJ2aWNlOwogI2VuZGlmCiAgICAgZnJpZW5kIGNs
YXNzIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb247CiB9OwpJbmRleDogU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dl
YlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwCShyZXZpc2lvbiAxMjUyNjYpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAxMSBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEyMyw2ICsxMjQsOSBA
QCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNlbmRSYXdECiAKIHZvaWQgV2ViU29j
a2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkQ2xvc2VTb2NrZXRTdHJlYW0oU29ja2V0U3RyZWFtSGFu
ZGxlKikKIHsKKyAgICAvLyBUbyBwcmV2ZW50IGRvdWJsZSBkZWxldGlvbiBpbiBXZWJTb2NrZXRT
ZXJ2ZXI6OmRpZENsb3NlV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbigpCisgICAgaWYgKCFtX3Nv
Y2tldCkKKyAgICAgICAgcmV0dXJuOwogICAgIC8vIFdlYiBTb2NrZXQgTW9kZS4KICAgICBpZiAo
bV9tb2RlID09IFdlYlNvY2tldCkKICAgICAgICAgbV9jbGllbnQtPmRpZENsb3NlV2ViU29ja2V0
Q29ubmVjdGlvbih0aGlzKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0
b3JTZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2Vy
dmVyR3RrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNw
ZWN0b3JTZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ry
b25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2ViSW5zcGVjdG9yU2VydmVyLmgiCisKKyNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiV2ViSW5zcGVjdG9yUHJveHkuaCIKKyNpbmNsdWRl
ICJXZWJQYWdlUHJveHkuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL01JTUVUeXBlUmVnaXN0cnkuaD4K
KworI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx3
dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisK
K2Jvb2wgV2ViSW5zcGVjdG9yU2VydmVyOjpwbGF0Zm9ybVJlc291cmNlRm9yUGF0aChjb25zdCBT
dHJpbmcmIHBhdGgsIFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBjb250ZW50VHlwZSkKK3sK
KyAgICAvLyBUaGUgcGFnZSBsaXN0IGNvbnRhaW5zIGFuIHVuZm9ybWF0ZWQgbGlzdCBvZiBwYWdl
cyB0aGF0IGNhbiBiZSBpbnNwZWN0ZWQgd2l0aCBhIGxpbmsgdG8gb3BlbiBhIHNlc3Npb24uCisg
ICAgaWYgKHBhdGggPT0gIi9wYWdlbGlzdC5qc29uIikgeworICAgICAgICBidWlsZFBhZ2VMaXN0
KGRhdGEsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ly8gUG9pbnQgdGhlIGRlZmF1bHQgcGF0aCB0byBhIGZvcm1hdHRlZCBwYWdlIHRoYXQgcXVlcmll
cyB0aGUgcGFnZSBsaXN0IGFuZCBkaXNwbGF5IHRoZW0uCisgICAgU3RyaW5nIGxvY2FsUGF0aCA9
IFN0cmluZyhXZWJDb3JlOjpzaGFyZWRSZXNvdXJjZXNQYXRoKCkuZGF0YSgpKSArICgocGF0aCA9
PSAiLyIpID8gIi93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiIDogcGF0aCk7
CisKKyAgICBHUmVmUHRyPEdGaWxlPiBmaWxlKGdfZmlsZV9uZXdfZm9yX3BhdGgobG9jYWxQYXRo
LmxhdGluMSgpLmRhdGEoKSkpOworICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKworICAgIGlm
IChmaWxlKSB7CisgICAgICAgIGdvZmZzZXQgc2l6ZSA9IDA7CisgICAgICAgIEdSZWZQdHI8R0Zp
bGVJbmZvPiBmaWxlSW5mbyhnX2ZpbGVfcXVlcnlfaW5mbyhmaWxlLmdldCgpLCBHX0ZJTEVfQVRU
UklCVVRFX1NUQU5EQVJEX1NJWkUsIEdfRklMRV9RVUVSWV9JTkZPX05PTkUsIE5VTEwsICZlcnJv
ci5vdXRQdHIoKSkpOworICAgICAgICAKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgCisgICAgICAgIEdSZWZQdHI8R0ZpbGVJbnB1
dFN0cmVhbT4gaW5wdXRTdHJlYW0oZ19maWxlX3JlYWQoZmlsZS5nZXQoKSwgTlVMTCwgJmVycm9y
Lm91dFB0cigpKSk7CisgICAgICAgIGlmICghaW5wdXRTdHJlYW0pCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgc2l6ZSA9IGdfZmlsZV9pbmZvX2dldF9zaXplKGZpbGVJbmZv
LmdldCgpKTsKKyAgICAgICAgZGF0YS5ncm93KHNpemUpOworCisgICAgICAgIGdzaXplIGJ5dGVz
UmVhZCA9IDA7CisgICAgICAgIGlmICghZ19pbnB1dF9zdHJlYW1fcmVhZF9hbGwoR19JTlBVVF9T
VFJFQU0oaW5wdXRTdHJlYW0uZ2V0KCkpLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksICZieXRl
c1JlYWQsIDAsIDApKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHNpemVf
dCBleHRTdGFydCA9IGxvY2FsUGF0aC5yZXZlcnNlRmluZCgnLicpOworICAgICAgICBTdHJpbmcg
ZXh0ID0gbG9jYWxQYXRoLnN1YnN0cmluZyhleHRTdGFydCAhPSBub3RGb3VuZCA/IGV4dFN0YXJ0
ICsgMSA6IDApOworICAgICAgICBjb250ZW50VHlwZSA9IFdlYkNvcmU6Ok1JTUVUeXBlUmVnaXN0
cnk6OmdldE1JTUVUeXBlRm9yRXh0ZW5zaW9uKGV4dCk7CisgICAgICAgIHJldHVybiB0cnVlOyAg
CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOyAKK30KKwordm9pZCBXZWJJbnNwZWN0b3JTZXJ2
ZXI6OmJ1aWxkUGFnZUxpc3QoVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBl
KQoreworICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmFwcGVuZCgiWyAi
KTsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IG1fY2xpZW50TWFwLmVuZCgpOworICAg
IGZvciAoQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IG1fY2xpZW50TWFwLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBXZWJQYWdlUHJveHkqIHdlYlBhZ2UgPSBpdC0+c2Vjb25k
LT5wYWdlKCk7CisgICAgICAgIGlmIChpdCAhPSBtX2NsaWVudE1hcC5iZWdpbigpKQorICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ7IFwi
aWRcIjogIiArIFN0cmluZzo6bnVtYmVyKGl0LT5maXJzdCkpOworICAgICAgICBidWlsZGVyLmFw
cGVuZCgiLCBcInRpdGxlXCI6IFwiIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHdlYlBhZ2Ut
PnBhZ2VUaXRsZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiLCBcInVybFwiOiBcIiIp
OworICAgICAgICBidWlsZGVyLmFwcGVuZCh3ZWJQYWdlLT5hY3RpdmVVUkwoKSk7CisgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKCJcIiwgXCJpbnNwZWN0b3JVcmxcIjogXCIiKTsKKyAgICAgICAgYnVp
bGRlci5hcHBlbmQoIi93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0iICsgU3RyaW5n
OjpudW1iZXIoaXQtPmZpcnN0KSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIiB9Iik7Cisg
ICAgfQorICAgIGJ1aWxkZXIuYXBwZW5kKCIgXSIpOworICAgIENTdHJpbmcgY3N0ciA9IGJ1aWxk
ZXIudG9TdHJpbmcoKS51dGY4KCk7CisgICAgZGF0YS5hcHBlbmQoY3N0ci5kYXRhKCksIGNzdHIu
bGVuZ3RoKCkpOworICAgIGNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9
dXRmLTgiOworfQorCisKK30KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0
b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3Rr
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRk
LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKworI2luY2x1ZGUgIldlYlNvY2tl
dFNlcnZlci5oIgorCisjaW5jbHVkZSAiV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oIgorI2lu
Y2x1ZGUgPFdlYkNvcmUvU29ja2V0U3RyZWFtSGFuZGxlLmg+CisKKyNpbmNsdWRlIDxhcnBhL2lu
ZXQuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUg
PGlmYWRkcnMuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4K
KyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsK
KworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0YXRpYyBnYm9vbGVhbiBjb25uZWN0aW9uQ2FsbGJh
Y2soR1NvY2tldFNlcnZpY2UqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEdTb2NrZXRDb25uZWN0aW9uKiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBHT2JqZWN0KiBzb3VyY2VPYmplY3QsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHNlbGYpCit7ICAgCisjaWZuZGVmIExPR19ESVNB
QkxFRCAgICAKKyAgICBHU29ja2V0QWRkcmVzcyogc29ja2FkZHIgPSBnX3NvY2tldF9jb25uZWN0
aW9uX2dldF9yZW1vdGVfYWRkcmVzcyhjb25uZWN0aW9uLCBOVUxMKTsKKyAgICBHSW5ldEFkZHJl
c3MqIGFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MoR19JTkVUX1NPQ0tF
VF9BRERSRVNTKHNvY2thZGRyKSk7CisgICAgZ3VpbnQxNiBwb3J0ID0gZ19pbmV0X3NvY2tldF9h
ZGRyZXNzX2dldF9wb3J0KEdfSU5FVF9TT0NLRVRfQUREUkVTUyhzb2NrYWRkcikpOworCisgICAg
TE9HKFdlYlNvY2tldFNlcnZlciwgIk5ldyBDb25uZWN0aW9uIGZyb20gJXM6JWQuIiwgZ19pbmV0
X2FkZHJlc3NfdG9fc3RyaW5nKGFkZHIpLCBwb3J0KTsKKyAgICBnX29iamVjdF91bnJlZihzb2Nr
YWRkcik7CisjZW5kaWYKKworICAgIFdlYlNvY2tldFNlcnZlciogc2VydmVyID0gKFdlYlNvY2tl
dFNlcnZlciopc2VsZjsKKyAgICAvLyByZWZlcmVuY2UgY29ubmVjdGlvbiBiZWZvcmUgYWNjZXB0
aW5nIGl0CisgICAgZ19vYmplY3RfcmVmX3NpbmsoY29ubmVjdGlvbik7CisKKyAgICBPd25QdHI8
V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbj4gd2ViU29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0UHRy
KG5ldyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKHNlcnZlci0+Y2xpZW50KCksIHNlcnZlcikp
OworICAgIHdlYlNvY2tldENvbm5lY3Rpb24tPnNldFNvY2tldEhhbmRsZShTb2NrZXRTdHJlYW1I
YW5kbGU6OmNyZWF0ZShjb25uZWN0aW9uLCB3ZWJTb2NrZXRDb25uZWN0aW9uLmdldCgpKSk7Cisg
ICAgc2VydmVyLT5kaWRBY2NlcHRDb25uZWN0aW9uKHdlYlNvY2tldENvbm5lY3Rpb24ucmVsZWFz
ZSgpKTsKKworICAgIHJldHVybiBUUlVFOworfSAKKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBs
YXRmb3JtSW5pdGlhbGl6ZSgpCit7CisgICAgbV9zb2NrZXRTZXJ2aWNlID0gYWRvcHRHUmVmKGdf
c29ja2V0X3NlcnZpY2VfbmV3KCkpOworICAgIGlmIChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpIHsK
KyAgICAgICAgZ19zaWduYWxfY29ubmVjdChtX3NvY2tldFNlcnZpY2UuZ2V0KCksICJpbmNvbWlu
ZyIsIEdfQ0FMTEJBQ0soY29ubmVjdGlvbkNhbGxiYWNrKSwgdGhpcyk7CisgICAgICAgIGlmICgh
Z19zb2NrZXRfc2VydmljZV9pc19hY3RpdmUobV9zb2NrZXRTZXJ2aWNlLmdldCgpKSkKKyAgICAg
ICAgICAgIGdfc29ja2V0X3NlcnZpY2Vfc3RhcnQobV9zb2NrZXRTZXJ2aWNlLmdldCgpKTsKKyAg
ICB9Cit9CisKK2Jvb2wgV2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUxpc3Rlbihjb25zdCBTdHJp
bmcmIGJpbmRBZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworICAgIExPRyhXZWJTb2Nr
ZXRTZXJ2ZXIsICJMaXN0ZW4gdG8gYWRkcmVzcz0lcywgcG9ydD0lZC4iLCBiaW5kQWRkcmVzcy5s
YXRpbjEoKS5kYXRhKCksIHBvcnQpOworCisgICAgR1NvY2tldFNlcnZpY2UqIHNvY2tldFNlcnZp
Y2UgPSBtX3NvY2tldFNlcnZpY2UuZ2V0KCk7CisgICAgaWYgKCFzb2NrZXRTZXJ2aWNlKSB7Cisg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGdldCBzb2NrZXQgc2VydmljZS4iKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEdJbmV0QWRkcmVzcyogYWRkcmVzcyA9IGdf
aW5ldF9hZGRyZXNzX25ld19mcm9tX3N0cmluZyhiaW5kQWRkcmVzcy5sYXRpbjEoKS5kYXRhKCkp
OworICAgIEdTb2NrZXRBZGRyZXNzKiBzb2NrZXRBZGRyZXNzID0gZ19pbmV0X3NvY2tldF9hZGRy
ZXNzX25ldyhhZGRyZXNzLCBwb3J0KTsKKworICAgIGdib29sZWFuIHJlc3VsdCA9IGdfc29ja2V0
X2xpc3RlbmVyX2FkZF9hZGRyZXNzKEdfU09DS0VUX0xJU1RFTkVSKHNvY2tldFNlcnZpY2UpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldEFkZHJlc3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgR19TT0NLRVRfVFlQRV9TVFJFQU0sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgR19TT0NLRVRfUFJPVE9DT0xfVENQLCAwLCAwLCAw
KTsKKworICAgIGlmICghcmVzdWx0KQorICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gYWRk
IGluZXQgYWRkcmVzcyB0byB3ZWIgaW5zcGVjdG9yIHNlcnZlciBsaXN0ZW5lci4iKTsKKworICAg
IGdfb2JqZWN0X3VucmVmKHNvY2tldEFkZHJlc3MpOworICAgIGdfb2JqZWN0X3VucmVmKGFkZHJl
c3MpOworCisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1DbG9zZSgpCit7
CisgICAgaWYgKG1fc29ja2V0U2VydmljZS5nZXQoKSkKKyAgICAgICAgZ19zb2NrZXRfc2Vydmlj
ZV9zdG9wKG1fc29ja2V0U2VydmljZS5nZXQoKSk7Cit9CisKK3ZvaWQgZ2V0SVBBZGRyZXNzKFN0
cmluZyYgaXBBZGRyZXNzKQoreworICAgIHN0cnVjdCBpZmFkZHJzICppZmFkZHIsICppZmE7Cisg
ICAgY2hhciBob3N0W05JX01BWEhPU1RdOworCisgICAgaWYgKGdldGlmYWRkcnMoJmlmYWRkcikg
PT0gLTEpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaWZhID0gaWZhZGRyOyBpZmE7IGlm
YSA9IGlmYS0+aWZhX25leHQpIHsKKyAgICAgICAgaWYgKCFpZmEtPmlmYV9hZGRyKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gZ2V0IGZpcnN0IGVudHJ5IGFuZCByZXR1cm4K
KyAgICAgICAgaWYgKGlmYS0+aWZhX2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUIHx8IGlmYS0+
aWZhX2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgICAgaWYgKCFnZXRu
YW1laW5mbyhpZmEtPmlmYV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAoaWZhLT5pZmFfYWRk
ci0+c2FfZmFtaWx5ID09IEFGX0lORVQpID8gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOiBz
aXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCisgICAgICAgICAgICAgICAgICAgIGhvc3QsIE5J
X01BWEhPU1QsIDAsIDAsIE5JX05VTUVSSUNIT1NUKSkgeworICAgICAgICAgICAgICAgIGlwQWRk
cmVzcyA9IGhvc3Q7CisgICAgICAgICAgICAgICAgaWYgKGlwQWRkcmVzcyAhPSAiMTI3LjAuMC4x
IiAmJiBpcEFkZHJlc3MubGVuZ3RoKCkgPj0gNykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmVlaWZhZGRycyhpZmFk
ZHIpOworfQorCit2b2lkIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1HZXRJUEFkZHJlc3MoU3Ry
aW5nJiBiaW5kQWRkcmVzcywgdW5zaWduZWQgc2hvcnQmIHBvcnQpCit7CisgICAgaWYgKGJpbmRB
ZGRyZXNzID09IFN0cmluZygpKSB7CisgICAgICAgIFN0cmluZyBlbnZTdHI7CisgICAgICAgIGJp
bmRBZGRyZXNzID0gIjEyNy4wLjAuMSI7CisgICAgICAgIHBvcnQgPSAyOTk5OworICAgICAgICBj
b25zdCBjaGFyKiBlbnZDU3RyID0gZ2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIpOwor
ICAgIAorICAgICAgICBpZiAoZW52Q1N0cikgeworICAgICAgICAgICAgZW52U3RyID0gZW52Q1N0
cjsgIAorICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4gcmVzdWx0OworICAgICAgICAgICAgZW52
U3RyLnNwbGl0KCI6IiwgcmVzdWx0KTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkg
PT0gMikgeworICAgICAgICAgICAgICAgIGJpbmRBZGRyZXNzID0gcmVzdWx0WzBdOworICAgICAg
ICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3J0ID0gcmVzdWx0
WzFdLnRvSW50KCZvayk7CisgICAgICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAg
ICAgICAgcG9ydCA9IDI5OTk7ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgZ2V0SVBBZGRyZXNzKGJpbmRBZGRyZXNzKTsKKyAgICB9Cit9CisK
K30KKworI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQpJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9xdC9XZWJTb2NrZXRTZXJ2ZXJRdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9x
dC9XZWJTb2NrZXRTZXJ2ZXJRdC5jcHAJKHJldmlzaW9uIDEyNTI2NikKKysrIFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvcXQvV2ViU29ja2V0U2VydmVyUXQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00Niw2ICs0NiwxMCBAQCB2b2lkIFdlYlNvY2tldFNlcnZlcjo6cGxh
dGZvcm1DbG9zZSgpCiAgICAgbV90Y3BTZXJ2ZXJIYW5kbGVyLT5jbG9zZSgpOwogfQogCit2b2lk
IFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1HZXRJUEFkZHJlc3MoU3RyaW5nJiwgdW5zaWduZWQg
c2hvcnQmKQoreworfQorCiBRdFRjcFNlcnZlckhhbmRsZXI6OlF0VGNwU2VydmVySGFuZGxlcihX
ZWJTb2NrZXRTZXJ2ZXIqIHdlYlNvY2tldFNlcnZlcikKIDogbV93ZWJTb2NrZXRTZXJ2ZXIod2Vi
U29ja2V0U2VydmVyKQogewo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>163316</attachid>
            <date>2012-09-11 02:52:08 -0700</date>
            <delta_ts>2012-09-13 08:14:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20120911105050.patch</filename>
            <type>text/plain</type>
            <size>45620</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyODA3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDEyLTA5LTExICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisgICAgICAgIGluc3BlY3Rv
clBhZ2VJbmRleC5odG1sIGhhcyBiZWVuIG1vdmVkIHRvIG5ldyBsb2NhdGlvbiB0byBzaGFyZSB0
aGUgZmlsZSBiZXR3ZWVuIEdUSyBhbmQgUVQgcG9ydHMuIAorCisgICAgICAgICogaW5zcGVjdG9y
L2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oOgorICAgICAgICAoV2ViQ29y
ZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGUpOgorICAgICAgICAoU29ja2V0U3RyZWFtSGFu
ZGxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxl
U291cC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0
cmVhbUhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSk6CisKIDIwMTItMDktMTAgIE1pa2UgV2VzdCAgPG1r
d3N0QGNocm9taXVtLm9yZz4KIAogICAgICAgICBDbGFyaWZ5IHRoZSBjYXVzZSBvZiBjb25zb2xl
IHdhcm5pbmdzIGdlbmVyYXRlZCBieSAiY3Jvc3Mtb3JpZ2luIiBhY2Nlc3MgdG8gc2FuZGJveGVk
IGlmcmFtZXMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3RvclBhZ2VJbmRleC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFk
PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxp
c3QoKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDsKKyAgICB4aHIub3Blbigi
R0VUIiwgIi9wYWdlbGlzdC5qc29uIik7CisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsK
KyAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CisgICAgICAgICAgICB2YXIgcGFnZXMg
PSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgaWYgKHBhZ2VzLmxl
bmd0aCkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90
aWNlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4g
cGFnZXMpIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImEiKTsKKyAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBh
Z2VzW2ldLnRpdGxlIDogKCJQYWdlICIgKyAoTnVtYmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAg
ICAgICAgICAgIHZhciB1cmwgPSBwYWdlc1tpXS51cmw7CisgICAgICAgICAgICAgICAgbGluay5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiAr
IHVybCArICJdIikgOiAiIiApKSk7CisgICAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUo
ImhyZWYiLCBwYWdlc1tpXS5pbnNwZWN0b3JVcmwpOworICAgICAgICAgICAgICAgIGRvY3VtZW50
LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH07CisgICAgeGhyLnNlbmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZl
bnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8
L3NjcmlwdD4KKzwvaGVhZD48Ym9keT4KKzxoMT5JbnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgor
PHAgaWQ9Im5vUGFnZU5vdGljZSIgc3R5bGU9ImNvbG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ug
c3VyZSB0aGF0IHlvdSBoYXZlIHNldCB0aGUgZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJl
bmNlIHByb3BlcnR5IG9uIHlvdXIgV2ViVmlldy48L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2Nr
ZXRTdHJlYW1IYW5kbGUuaAkocmV2aXNpb24gMTI4MDM5KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmlj
cyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCkBAIC00Niw2ICs0Nyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBT
b2NrZXRTdHJlYW1IYW5kbGUgOiBwdWJsaWMgUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+
LCBwdWJsaWMgU29ja2V0U3RyZWFtSGFuZGxlQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBz
dGF0aWMgUGFzc1JlZlB0cjxTb2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShjb25zdCBLVVJMJiB1
cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihu
ZXcgU29ja2V0U3RyZWFtSGFuZGxlKHVybCwgY2xpZW50KSk7IH0KKyAgICAgICAgc3RhdGljIFBh
c3NSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoR1NvY2tldENvbm5lY3Rpb24qIHNv
Y2tldENvbm5lY3Rpb24sIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVy
biBhZG9wdFJlZihuZXcgU29ja2V0U3RyZWFtSGFuZGxlKHNvY2tldENvbm5lY3Rpb24sIGNsaWVu
dCkpOyB9CiAKICAgICAgICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7CiAgICAgICAg
IHZvaWQgY29ubmVjdGVkKEdTb2NrZXRDb25uZWN0aW9uKiwgR0Vycm9yKik7CkBAIC02Niw2ICs2
OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCogbV9pZDsKIAogICAgICAg
ICBTb2NrZXRTdHJlYW1IYW5kbGUoY29uc3QgS1VSTCYsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVu
dCopOworICAgICAgICBTb2NrZXRTdHJlYW1IYW5kbGUoR1NvY2tldENvbm5lY3Rpb24qLCBTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKIAogICAgICAgICAvLyBObyBhdXRoZW50aWNhdGlvbiBm
b3Igc3RyZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50aWFscy4KICAg
ICAgICAgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UmKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAJ
KHJldmlzaW9uIDEyODAzOSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291
cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYg
QEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgR29vZ2xlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBM
dGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCkBAIC05NCw2ICs5NSwyNyBAQCBTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhh
bmRsZShjCiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0FzeW5jUmVhZHlDYWxsYmFjaz4oY29u
bmVjdGVkQ2FsbGJhY2spLCBtX2lkKTsKIH0KIAorU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRT
dHJlYW1IYW5kbGUoR1NvY2tldENvbm5lY3Rpb24qIHNvY2tldENvbm5lY3Rpb24sIFNvY2tldFN0
cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KQorICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZShL
VVJMKCksIGNsaWVudCkKKyAgICAsIG1fcmVhZEJ1ZmZlcigwKQoreworICAgIG1faWQgPSBhY3Rp
dmF0ZUhhbmRsZSh0aGlzKTsKKyAgICBtX3NvY2tldENvbm5lY3Rpb24gPSBhZG9wdEdSZWYoc29j
a2V0Q29ubmVjdGlvbik7CisgICAgbV9vdXRwdXRTdHJlYW0gPSBHX1BPTExBQkxFX09VVFBVVF9T
VFJFQU0oZ19pb19zdHJlYW1fZ2V0X291dHB1dF9zdHJlYW0oR19JT19TVFJFQU0obV9zb2NrZXRD
b25uZWN0aW9uLmdldCgpKSkpOworICAgIG1faW5wdXRTdHJlYW0gPSBnX2lvX3N0cmVhbV9nZXRf
aW5wdXRfc3RyZWFtKEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpOworICAg
IG1fcmVhZEJ1ZmZlciA9IG5ldyBjaGFyW1JFQURfQlVGRkVSX1NJWkVdOworCisgICAgZ19pbnB1
dF9zdHJlYW1fcmVhZF9hc3luYyhtX2lucHV0U3RyZWFtLmdldCgpLCBtX3JlYWRCdWZmZXIsIFJF
QURfQlVGRkVSX1NJWkUsIEdfUFJJT1JJVFlfREVGQVVMVCwgMCwKKyAgICAgICAgcmVpbnRlcnBy
ZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPihyZWFkUmVhZHlDYWxsYmFjayksIG1faWQpOwor
CisgICAgbV9zdGF0ZSA9IE9wZW47CisKKyAgICBpZiAoIW1fY2xpZW50KQorICAgICAgICByZXR1
cm47CisKKyAgICBtX2NsaWVudC0+ZGlkT3BlblNvY2tldFN0cmVhbSh0aGlzKTsKK30KKwogU29j
a2V0U3RyZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKCkKIHsKICAgICAvLyBJZiBmb3Ig
c29tZSByZWFzb24gd2Ugd2VyZSBkZXN0cm95ZWQgd2l0aG91dCBjbG9zaW5nLCBlbnN1cmUgdGhh
dCB3ZSBhcmUgZGVhY3RpdmF0ZWQuCkBAIC0xNTMsNiArMTc1LDkgQEAgdm9pZCBTb2NrZXRTdHJl
YW1IYW5kbGU6OndyaXRlUmVhZHkoKQogCiBpbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9y
bVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKIHsKKyAgICBpZiAoIW1fb3V0cHV0
U3RyZWFtIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKwogICAgIEdPd25QdHI8R0Vycm9y
PiBlcnJvcjsKICAgICBnc3NpemUgd3JpdHRlbiA9IGdfcG9sbGFibGVfb3V0cHV0X3N0cmVhbV93
cml0ZV9ub25ibG9ja2luZyhtX291dHB1dFN0cmVhbS5nZXQoKSwgZGF0YSwgbGVuZ3RoLCAwLCAm
ZXJyb3Iub3V0UHRyKCkpOwogICAgIGlmIChlcnJvcikgewpAQCAtMTg4LDYgKzIxMyw3IEBAIHZv
aWQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybUNsb3NlKCkKICAgICBtX291dHB1dFN0cmVh
bSA9IDA7CiAgICAgbV9pbnB1dFN0cmVhbSA9IDA7CiAgICAgZGVsZXRlIG1fcmVhZEJ1ZmZlcjsK
KyAgICBtX3JlYWRCdWZmZXIgPSAwOwogCiAgICAgbV9jbGllbnQtPmRpZENsb3NlU29ja2V0U3Ry
ZWFtKHRoaXMpOwogfQpJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gMTI4MDcyKQorKysgU291cmNl
L1dlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjkgQEAKKzIwMTIt
MDktMTEgIEFudG9uIE9iemhpcm92ICA8YS5vYnpoaXJvdkBzYW1zdW5nLmNvbT4KKworICAgICAg
ICBBZGQgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gb2YgcmVtb3RlIHdlYiBpbnNwZWN0b3Igc2Vy
dmVyIGZvciBHVEsgcG9ydC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTg4MDk0IAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFRoZSBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBHU29ja2V0
IEFQSSAoV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcCBhbmQgV2ViU29ja2V0U2VydmVyR3RrLmNw
cCkuCisgICAgICAgIFRoZSBzZXJ2ZXIgbGlzdGVucyBvbiBwb3J0IDI5OTkgYnkgZGVmYXVsdC4g
SXAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGNhbiBiZSBzZXQKKyAgICAgICAgaW4gV0VCS0lUX0lO
U1BFQ1RPUl9TRVJWRVIgKGZvciBleGFtcGxlIGV4cG9ydCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZF
Uj0iMTkyLjE2OC4xMjQuMTMwOjI5OTkiKS4KKyAgICAgICAgVGhlIHNlcnZlciBpcyBzdGFydGVk
IGR1cmluZyBXZWJLaXQgY29udGV4dCBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgT25jZSBhIHBh
Z2UgaXMgbG9hZGVkIGluc2VjdG9yIHNlcnZlciBjYW4gYmUgYWNjZXNzZWQgdmlhIG90aGVyIFdl
YktpdCBiYXNlZCBicm93c2VyLgorICAgICAgICBOZXcgV2ViS2l0IEFQSSBndGsgdGVzdHMgaGF2
ZSBiZWVkIGFkZGVkLgorCisgICAgICAgIFRlc3Q6IHRlc3QtcGFnZS1saXN0LCB0ZXN0LXJlbW90
ZS1kZWJ1Z2dpbmctbWVzc2FnZSwgdGVzdC1vcGVuLWRlYnVnZ2luZy1zZXNzaW9uCisKKyAgICAg
ICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgorICAg
ICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtOgorICAgICAgICAq
IFVJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwOiBBZGRlZC4K
KyAgICAgICAgKGxvYWRDaGFuZ2VkQ2FsbGJhY2spOgorICAgICAgICAobWFpbik6CisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHA6IEFkZGVk
LgorICAgICAgICAoc3RvcFRlc3RTZXJ2ZXIpOgorICAgICAgICAoc2lnQWJvcnRIYW5kbGVyKToK
KyAgICAgICAgKHRlc3RTZXJ2ZXJNb25pdG9yVGhyZWFkRnVuYyk6CisgICAgICAgIChzdGFydFRl
c3RTZXJ2ZXJNb25pdG9yKToKKyAgICAgICAgKHN0YXJ0VGVzdFNlcnZlcik6CisgICAgICAgICh0
ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3QpOgorICAgICAgICAodGVzdFJlbW90ZURlYnVnZ2lu
Z01lc3NhZ2UpOgorICAgICAgICAob3BlblJlbW90ZURlYnVnZ2luZ1Nlc3Npb24pOgorICAgICAg
ICAoYmVmb3JlQWxsKToKKyAgICAgICAgKGFmdGVyQWxsKToKKyAgICAgICAgKiBVSVByb2Nlc3Mv
SW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oOgorICAgICAgICAoV2ViSW5zcGVj
dG9yU2VydmVyKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tl
dFNlcnZlci5oOgorICAgICAgICAoV2ViU29ja2V0U2VydmVyKToKKyAgICAgICAgKiBVSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwOgorICAgICAg
ICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2ZXJDb25u
ZWN0aW9uKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2h1
dGRvd25Ob3cpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpz
aHV0ZG93bkFmdGVyU2VuZE9yTm93KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVy
Q29ubmVjdGlvbjo6ZGlkQ2xvc2VTb2NrZXRTdHJlYW0pOgorICAgICAgICAoV2ViS2l0OjpXZWJT
b2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSk6CisgICAg
ICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
OjpkaWRVcGRhdGVCdWZmZXJlZEFtb3VudCk6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3Rv
clNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmg6CisgICAgICAgIChXZWJTb2NrZXRT
ZXJ2ZXJDb25uZWN0aW9uKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0
azogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5z
cGVjdG9yU2VydmVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAo
V2ViS2l0OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKToKKyAg
ICAgICAgKFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjpidWlsZFBhZ2VMaXN0KToKKyAgICAg
ICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OmNvbm5lY3Rpb25D
YWxsYmFjayk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1Jbml0
aWFsaXplKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUxpc3Rl
bik6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1DbG9zZSk6Cisg
ICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9xdC9XZWJJbnNwZWN0b3JTZXJ2ZXJR
dC5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNv
dXJjZUZvclBhdGgpOgorICAgICAgICAqIFVJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5jcHA6
CisgICAgICAgIChXZWJLaXQ6OmluaXRJbnNwZWN0b3JTZXJ2ZXIpOgorICAgICAgICAoV2ViS2l0
KToKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dDo6cGxhdGZvcm1Jbml0aWFsaXplV2ViUHJv
Y2Vzcyk6CisgICAgICAgICogY29uZmlnLmg6CisKIDIwMTItMDktMTAgIENhcmxvcyBHYXJjaWEg
Q2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtTT1VQXSBEb24ndCBjb252
ZXJ0IHRvIFVURi04IHRoZSBzdWdnZXN0ZWRGaWxlbmFtZSBwYXNzZWQgdG8gRG93bmxvYWQ6OmRl
Y2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZEZpbGVuYW1lKCkKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0dOVW1ha2Vm
aWxlLmFtCShyZXZpc2lvbiAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5h
bQkod29ya2luZyBjb3B5KQpAQCAtNTcsNiArNTcsNyBAQCBsaWJ3ZWJraXQyZ3RrX0BXRUJLSVRH
VEtfQVBJX01BSk9SX1ZFUlNJCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L1BsdWdpbnMgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QbHVnaW5z
L2d0ayBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3NvdXAgXAorCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIgXAogCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MgXAogCS1JJChzcmNkaXIpL1NvdXJj
ZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXBwbGljYXRpb25DYWNoZSBcCiAJLUkkKHNyY2RpcikvU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BdXRoZW50aWNhdGlvbiBcCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0dO
VW1ha2VmaWxlLmxpc3QuYW0JKHJldmlzaW9uIDEyODAzOSkKKysrIFNvdXJjZS9XZWJLaXQyL0dO
VW1ha2VmaWxlLmxpc3QuYW0JKHdvcmtpbmcgY29weSkKQEAgLTkwNSw2ICs5MDUsMTUgQEAgd2Vi
a2l0Ml9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVGV4dENoZWNr
ZXJDbGllbnQuaCBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlVJQ2xpZW50LmNwcCBc
CiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlVJQ2xpZW50LmggXAorCVNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmNwcCBcCisJ
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2
ZXIuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2Nr
ZXRTZXJ2ZXIuY3BwIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVy
L1dlYlNvY2tldFNlcnZlci5oIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyL1dlYlNvY2tldFNlcnZlckNsaWVudC5oIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwIFwKKwlTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5l
Y3Rpb24uaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsv
V2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcCBcCiAJU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL1dlYlZpYnJhdGlvblByb3ZpZGVyLmNwcCBcCiAJU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL1dlYlZpYnJhdGlvblByb3ZpZGVyLmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9XZWJWaWJyYXRpb25Qcm94eS5jcHAgXApJbmRleDogU291cmNlL1dlYktpdDIvY29uZmln
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvY29uZmlnLmgJKHJldmlzaW9uIDEyODAz
OSkKKysrIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTgsNSAr
MTE4LDcgQEAgc3RhdGljIGNvbnN0IHR5cGUmIG5hbWUoKSBcCiAjaWZuZGVmIEVOQUJMRV9JTlNQ
RUNUT1JfU0VSVkVSCiAjaWYgUExBVEZPUk0oUVQpCiAjZGVmaW5lIEVOQUJMRV9JTlNQRUNUT1Jf
U0VSVkVSIDEKKyNlbGlmIFBMQVRGT1JNKEdUSykKKyNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9T
RVJWRVIgMQogI2VuZGlmCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvZ3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiAxMjgwMzkp
CisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5h
bQkod29ya2luZyBjb3B5KQpAQCAtMSwxMSArMSwxMyBAQAogaWYgRU5BQkxFX1dFQktJVDIKIAog
VEVTVF9QUk9HUyArPSBcCisJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL0luc3BlY3RvclRlc3RT
ZXJ2ZXIgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0QmFja0ZvcndhcmRMaXN0IFwK
IAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdENvbnRleHRNZW51IFwKIAlQcm9ncmFtcy9X
ZWJLaXQyQVBJVGVzdHMvVGVzdENvb2tpZU1hbmFnZXIgXAogCVByb2dyYW1zL1dlYktpdDJBUElU
ZXN0cy9UZXN0RG93bmxvYWRzIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdEluc3Bl
Y3RvciBcCisJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIgXAog
CVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0TG9hZGVyQ2xpZW50IFwKIAlQcm9ncmFtcy9X
ZWJLaXQyQVBJVGVzdHMvVGVzdFByaW50aW5nIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMv
VGVzdFJlc291cmNlcyBcCkBAIC05Nyw2ICs5OSwxMiBAQCBQcm9ncmFtc19XZWJLaXQyQVBJVGVz
dHNfVGVzdFdlYktpdFNldHRpCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFNl
dHRpbmdzX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQogUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RXZWJLaXRTZXR0aW5nc19MREZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxh
Z3MpCiAKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX1NPVVJD
RVMgPSBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvSW5zcGVjdG9y
VGVzdFNlcnZlci5jcHAKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2Vy
dmVyX0NQUEZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2NwcGZsYWdzKQorUHJvZ3JhbXNfV2ViS2l0
MkFQSVRlc3RzX0luc3BlY3RvclRlc3RTZXJ2ZXJfTERBREQgPSAkKHdlYmtpdDJfdGVzdHNfbGRh
ZGQpCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9MREZMQUdT
ID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxhZ3MpCisKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19U
ZXN0QmFja0ZvcndhcmRMaXN0X1NPVVJDRVMgPSBcCiAgICAgICAgIFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RCYWNrRm9yd2FyZExpc3QuY3BwCiBQcm9ncmFtc19X
ZWJLaXQyQVBJVGVzdHNfVGVzdEJhY2tGb3J3YXJkTGlzdF9DUFBGTEFHUyA9ICQod2Via2l0Ml90
ZXN0c19jcHBmbGFncykKQEAgLTE2Nyw2ICsxNzUsMTIgQEAgUHJvZ3JhbXNfV2ViS2l0MkFQSVRl
c3RzX1Rlc3RJbnNwZWN0b3JfQwogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0
b3JfTERBREQgPSAkKHdlYmtpdDJfdGVzdHNfbGRhZGQpCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVz
dHNfVGVzdEluc3BlY3Rvcl9MREZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxhZ3MpCiAKK1By
b2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX1NPVVJDRVMgPSBcCisJ
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZl
ci5jcHAKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX0NQUEZM
QUdTID0gJCh3ZWJraXQyX3Rlc3RzX2NwcGZsYWdzKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3Rz
X1Rlc3RJbnNwZWN0b3JTZXJ2ZXJfTERBREQgPSAkKHdlYmtpdDJfdGVzdHNfbGRhZGQpCitQcm9n
cmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNlcnZlcl9MREZMQUdTID0gJCh3ZWJr
aXQyX3Rlc3RzX2xkZmxhZ3MpCisKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2ViS2l0
VmVyc2lvbl9TT1VSQ0VTID0gXAogICAgICAgICBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay90ZXN0cy9UZXN0V2ViS2l0VmVyc2lvbi5jcHAKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0
c19UZXN0V2ViS2l0VmVyc2lvbl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykK
SW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRl
c3RTZXJ2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvSW5zcGVjdG9yVGVzdFNlcnZlci5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIg
U2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAq
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNs
dWRlIDx3ZWJraXQyL3dlYmtpdDIuaD4KKworc3RhdGljIHZvaWQgbG9hZENoYW5nZWRDYWxsYmFj
ayhXZWJLaXRXZWJWaWV3KiwgV2ViS2l0TG9hZEV2ZW50IGxvYWRFdmVudCwgZ3BvaW50ZXIpCit7
CisgICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBwcm9jZXNzIHdoZW4gd2UncmUg
cmVhZHkuCisgICAgaWYgKGxvYWRFdmVudCA9PSBXRUJLSVRfTE9BRF9GSU5JU0hFRCkKKyAgICAg
ICAgZ19wcmludCgiT0siKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQor
eworICAgIGd0a19pbml0KCZhcmdjLCAmYXJndik7CisKKyAgICBXZWJLaXRXZWJWaWV3KiB3ZWJW
aWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJfdmlld19uZXcoKSk7CisgICAgd2Via2l0
X3NldHRpbmdzX3NldF9lbmFibGVfZGV2ZWxvcGVyX2V4dHJhcyh3ZWJraXRfd2ViX3ZpZXdfZ2V0
X3NldHRpbmdzKHdlYlZpZXcpLCBUUlVFKTsKKyAgICB3ZWJraXRfd2ViX3ZpZXdfbG9hZF9odG1s
KHdlYlZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGh0bWw+PGJvZHk+PHA+
V2ViS2l0R1RLKyBJbnNwZWN0b3IgVGVzdCBTZXJ2ZXI8L3A+PC9ib2R5PjwvaHRtbD4iLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8iKTsKKwor
ICAgIEd0a1dpZGdldCogd2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19UT1BMRVZF
TCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCBHVEtfV0lE
R0VUKHdlYlZpZXcpKTsKKyAgICBndGtfd2lkZ2V0X3Nob3dfYWxsKHdpbmRvdyk7CisKKyAgICBn
X3NpZ25hbF9jb25uZWN0KHdpbmRvdywgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0soZ3RrX21h
aW5fcXVpdCksIDApOworICAgIGdfc2lnbmFsX2Nvbm5lY3Qod2ViVmlldywgImxvYWQtY2hhbmdl
ZCIsIEdfQ0FMTEJBQ0sobG9hZENoYW5nZWRDYWxsYmFjayksIDApOworCisgICAgZ3RrX21haW4o
KTsKK30KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJ
bnNwZWN0b3JTZXJ2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZl
ci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJXZWJWaWV3VGVz
dC5oIgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KKworLy8gTmFtZSBvZiB0aGUgdGVzdCBzZXJ2ZXIgYXBwbGljYXRpb24g
Y3JlYXRpbmcgdGhlIHdlYlZpZXcgb2JqZWN0Lgorc3RhdGljIGNvbnN0IGNoYXIqIHNfdGVzdFNl
cnZlckFwcE5hbWUgPSAiSW5zcGVjdG9yVGVzdFNlcnZlciI7CisKKy8vIE1heCBzZWNvbmRzIHRv
IHdhaXQgZm9yIHRoZSB0ZXN0IHNlcnZlciBiZWZvcmUgaW5zcGVjdGluZyBpdC4KK3N0YXRpYyBj
b25zdCBpbnQgc19tYXhXYWl0Rm9yQ2hpbGQgPSA1OworCisvLyBUaGUgUElEIGZvciB0aGUgdGVz
dCBzZXJ2ZXIgcnVubmluZywgc28gd2UgY2FuIGtpbGwgaXQgaWYgbmVlZGVkLgorc3RhdGljIEdQ
aWQgc19jaGlsZFByb2Nlc3NQaWQgPSAwOworCisvLyBXaGV0aGVyIHRoZSBjaGlsZCBoYXMgcmVw
bGllZCBhbmQgaXQncyByZWFkeS4KK3N0YXRpYyBib29sIHNfY2hpbGRJc1JlYWR5ID0gZmFsc2U7
CisKKy8vIFBvaW50ZXIgdG8gb2xkIFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIHZhcmlhYmxlCitz
dGF0aWMgY29uc3QgY2hhciogc19pbnNwZWN0b3JTZXJ2ZXJFbnY7CisKK3N0YXRpYyB2b2lkIHN0
b3BUZXN0U2VydmVyKCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3Mgbm8gc2VydmVy
IHJ1bm5pbmcuCisgICAgaWYgKCFzX2NoaWxkUHJvY2Vzc1BpZCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgZ19zcGF3bl9jbG9zZV9waWQoc19jaGlsZFByb2Nlc3NQaWQpOworICAgIGtpbGwoc19j
aGlsZFByb2Nlc3NQaWQsIFNJR1RFUk0pOworICAgIHNfY2hpbGRQcm9jZXNzUGlkID0gMDsKKwor
ICAgIC8vIHJlc3RvcmUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICBnX3NldGVudigiV0VCS0lU
X0lOU1BFQ1RPUl9TRVJWRVIiLCBzX2luc3BlY3RvclNlcnZlckVudiwgVFJVRSk7Cit9CisKK3N0
YXRpYyB2b2lkIHNpZ0Fib3J0SGFuZGxlcihpbnQgc2lnTnVtKQoreworICAgIC8vIEp1c3Qgc3Rv
cCB0aGUgdGVzdCBzZXJ2ZXIgaWYgU0lHQUJSVCB3YXMgcmVjZWl2ZWQuCisgICAgc3RvcFRlc3RT
ZXJ2ZXIoKTsKK30KKworc3RhdGljIGdwb2ludGVyIHRlc3RTZXJ2ZXJNb25pdG9yVGhyZWFkRnVu
YyhncG9pbnRlcikKK3sKKyAgICAvLyBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgdG8g
aGFwcGVuLgorICAgIGdfdXNsZWVwKHNfbWF4V2FpdEZvckNoaWxkICogR19VU0VDX1BFUl9TRUMp
OworCisgICAgLy8gS2lsbCB0aGUgY2hpbGQgcHJvY2VzcyBpZiBub3QgcmVhZHkgeWV0LgorICAg
IGlmICghc19jaGlsZElzUmVhZHkpCisgICAgICAgIHN0b3BUZXN0U2VydmVyKCk7CisKKyAgICBn
X3RocmVhZF9leGl0KDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdGFydFRl
c3RTZXJ2ZXJNb25pdG9yKCkKK3sKKyAgICBzX2NoaWxkSXNSZWFkeSA9IGZhbHNlOworCisjaWYg
KCFHTElCX0NIRUNLX1ZFUlNJT04oMiwgMzEsIDApKQorICAgIGdfdGhyZWFkX2NyZWF0ZSh0ZXN0
U2VydmVyTW9uaXRvclRocmVhZEZ1bmMsIDAsIEZBTFNFLCAwKTsKKyNlbHNlCisgICAgZ190aHJl
YWRfbmV3KCJUZXN0U2VydmVyTW9uaXRvciIsIHRlc3RTZXJ2ZXJNb25pdG9yVGhyZWFkRnVuYywg
MCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc3RhcnRUZXN0U2VydmVyKCkKK3sKKyAgICAv
LyBQcmVwYXJlIGFyZ3ZbXSBmb3Igc3Bhd25pbmcgdGhlIHNlcnZlciBwcm9jZXNzLgorICAgIEdP
d25QdHI8Y2hhcj4gdGVzdFNlcnZlclBhdGgoZ19idWlsZF9maWxlbmFtZShXRUJLSVRfRVhFQ19Q
QVRILCAiV2ViS2l0MkFQSVRlc3RzIiwgc190ZXN0U2VydmVyQXBwTmFtZSwgTlVMTCkpOworCisg
ICAgLy8gU2F2ZSBjdXJyZW50IFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIHZhcmlhYmxlIHRvIHJl
c3RvcmUgaXQgYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgc19pbnNwZWN0b3JTZXJ2
ZXJFbnYgPSBnX2dldGVudigiV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIiKTsKKworICAgIC8vIE92
ZXJ3cml0ZSBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiB2YXJpYWJsZSB3aXRoIGRlZmF1bHQgdmFs
dWUuCisgICAgZ19zZXRlbnYoIldFQktJVF9JTlNQRUNUT1JfU0VSVkVSIiwgIjEyNy4wLjAuMToy
OTk5IiwgVFJVRSk7CisKKyAgICAvLyBXZSBpbnN0YWxsIGEgaGFuZGxlciB0byBlbnN1cmUgdGhh
dCB3ZSBraWxsIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgLy8gaWYgdGhlIHBhcmVudCBkaWVzIGJl
Y2F1c2Ugb2Ygd2hhdGV2ZXIgdGhlIHJlYXNvbiBpcy4KKyAgICBzaWduYWwoU0lHQUJSVCwgc2ln
QWJvcnRIYW5kbGVyKTsKKworICAgIGNoYXIqIHRlc3RTZXJ2ZXJBcmd2WzJdOworICAgIHRlc3RT
ZXJ2ZXJBcmd2WzBdID0gdGVzdFNlcnZlclBhdGguZ2V0KCk7CisgICAgdGVzdFNlcnZlckFyZ3Zb
MV0gPSAwOworCisgICAgLy8gU3Bhd24gdGhlIHNlcnZlciwgZ2V0dGluZyBpdHMgc3Rkb3V0IGZp
bGUgZGVzY3JpcHRvciB0byBzZXQgYQorICAgIC8vIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc28g
d2Uga25vdyB3aGVuIGl0J3MgcmVhZHkuCisgICAgaW50IGNoaWxkU3Rkb3V0ID0gMDsKKyAgICBp
ZiAoIWdfc3Bhd25fYXN5bmNfd2l0aF9waXBlcygwLCB0ZXN0U2VydmVyQXJndiwgMCwgc3RhdGlj
X2Nhc3Q8R1NwYXduRmxhZ3M+KDApLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICZzX2NoaWxkUHJvY2Vzc1BpZCwgMCwgJmNoaWxkU3Rkb3V0LCAwLCAwKSkgeworICAg
ICAgICBjbG9zZShjaGlsZFN0ZG91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBTdGFydCBtb25pdG9yaW5nIHRoZSB0ZXN0IHNlcnZlciAoaW4gYSBzZXBhcmF0ZSB0aHJlYWQp
IHRvCisgICAgLy8gZW5zdXJlIHdlIGRvbid0IGJsb2NrIG9uIHRoZSBjaGlsZCBwcm9jZXNzIG1v
cmUgdGhhbiBhIHRpbWVvdXQuCisgICAgc3RhcnRUZXN0U2VydmVyTW9uaXRvcigpOworCisgICAg
Y2hhciBtc2dbMl07CisgICAgR0lPQ2hhbm5lbCogaW9DaGFubmVsID0gZ19pb19jaGFubmVsX3Vu
aXhfbmV3KGNoaWxkU3Rkb3V0KTsKKyAgICBpZiAoZ19pb19jaGFubmVsX3JlYWRfY2hhcnMoaW9D
aGFubmVsLCBtc2csIDIsIDAsIDApID09IEdfSU9fU1RBVFVTX05PUk1BTCkgeworICAgICAgICAv
LyBDaGVjayB3aGV0aGVyIHRoZSBzZXJ2ZXIgc2VudCBhIG1lc3NhZ2Ugc2F5aW5nIGl0J3MgcmVh
ZHkKKyAgICAgICAgLy8gYW5kIHN0b3JlIHRoZSByZXN1bHQgZ2xvYmFsbHksIHNvIHRoZSBtb25p
dG9yIGNhbiBzZWUgaXQuCisgICAgICAgIHNfY2hpbGRJc1JlYWR5ID0gbXNnWzBdID09ICdPJyAm
JiBtc2dbMV0gPT0gJ0snOworICAgIH0KKyAgICBnX2lvX2NoYW5uZWxfdW5yZWYoaW9DaGFubmVs
KTsKKyAgICBjbG9zZShjaGlsZFN0ZG91dCk7CisKKyAgICAvLyBUaGUgdGltZW91dCB3YXMgcmVh
Y2hlZCBhbmQgdGhlIHNlcnZlciBpcyBub3QgcmVhZHkgeWV0LCBzbworICAgIC8vIHN0b3AgaXQg
aW5tZWRpYXRlbHksIGFuZCBsZXQgdGhlIHVuaXQgdGVzdHMgZmFpbC4KKyAgICBpZiAoIXNfY2hp
bGRJc1JlYWR5KQorICAgICAgICBzdG9wVGVzdFNlcnZlcigpOworfQorCitjbGFzcyBJbnNwZWN0
b3JTZXJ2ZXJUZXN0OiBwdWJsaWMgV2ViVmlld1Rlc3QgeworcHVibGljOgorICAgIE1BS0VfR0xJ
Ql9URVNUX0ZJWFRVUkUoSW5zcGVjdG9yU2VydmVyVGVzdCk7CisKKyAgICBJbnNwZWN0b3JTZXJ2
ZXJUZXN0KCkKKyAgICAgICAgOiBXZWJWaWV3VGVzdCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgZ2V0UGFnZUxpc3QoKQorICAgIHsKKyAgICAgICAgbG9hZEh0bWwoIjxzY3JpcHQgdHlwZT1c
InRleHQvamF2YXNjcmlwdFwiPlxuIgorICAgICAgICAgICAgICAgICAidmFyIHBhZ2VzO1xuIgor
ICAgICAgICAgICAgICAgICAidmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiIKKyAgICAg
ICAgICAgICAgICAgInhoci5vcGVuKFwiR0VUXCIsIFwiL3BhZ2VsaXN0Lmpzb25cIik7XG4iCisg
ICAgICAgICAgICAgICAgICJ4aHIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuIgorICAgICAgICAg
ICAgICAgICAgICAgImlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuIgorICAgICAgICAgICAgICAg
ICAgICAgICAgICJwYWdlcyA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4iCisgICAg
ICAgICAgICAgICAgICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJPS1wiO1xuIgorICAgICAg
ICAgICAgICAgICAgICAgIn0gZWxzZSBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZG9j
dW1lbnQudGl0bGUgPSBcIkZBSUxcIjtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAg
ICAgICAgICAgICAgInhoci5zZW5kKCk7XG4iCisgICAgICAgICAgICAgICAgICI8L3NjcmlwdD5c
biIsCisgICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjI5OTkvIik7CisKKyAgICAg
ICAgd2FpdFVudGlsVGl0bGVDaGFuZ2VkKCk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAod2Via2l0
X3dlYl92aWV3X2dldF90aXRsZShtX3dlYlZpZXcpLCAiT0siKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB+SW5zcGVjdG9y
U2VydmVyVGVzdCgpCisgICAgeworICAgIH0KK307CisKKy8vIFRlc3QgdG8gZ2V0IGluc3BlY3Rv
ciBzZXJ2ZXIgcGFnZSBsaXN0IGZyb20gdGhlIHRlc3Qgc2VydmVyLgorLy8gU2hvdWxkIGNvbnRh
aW4gb25seSBvbmUgZW50cnkgcG9pbnRpbmcgdG8gaHR0cDovLzEyNy4wLjAuMToyOTk5L3dlYmlu
c3BlY3Rvci9pbnNwZWN0b3IuaHRtbD9wYWdlPTEKK3N0YXRpYyB2b2lkIHRlc3RJbnNwZWN0b3JT
ZXJ2ZXJQYWdlTGlzdChJbnNwZWN0b3JTZXJ2ZXJUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQor
eworICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKworICAgIHRlc3QtPnNob3dJbldpbmRvd0Fu
ZFdhaXRVbnRpbE1hcHBlZChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgICBnX2Fzc2VydCh0ZXN0
LT5nZXRQYWdlTGlzdCgpKTsKKworICAgIFdlYktpdEphdmFzY3JpcHRSZXN1bHQqIGphdmFzY3Jp
cHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVudGlsRmluaXNoZWQoInBhZ2Vz
Lmxlbmd0aDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1
bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgZ19hc3NlcnRfY21waW50KFdl
YlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9OdW1iZXIoamF2YXNjcmlwdFJlc3VsdCksID09
LCAxKTsKKworICAgIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2Fp
dFVudGlsRmluaXNoZWQoInBhZ2VzWzBdLmlkOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19h
c3NlcnQoamF2YXNjcmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAg
ICBpbnQgcGFnZUlkID0gV2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb051bWJlcihqYXZh
c2NyaXB0UmVzdWx0KTsKKworICAgIEdPd25QdHI8Y2hhcj4gdmFsdWVTdHJpbmc7CisgICAgamF2
YXNjcmlwdFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgi
cGFnZXNbMF0udXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2YXNjcmlw
dFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0cmluZy5z
ZXQoV2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3Vs
dCkpOworICAgIGdfYXNzZXJ0X2NtcHN0cih2YWx1ZVN0cmluZy5nZXQoKSwgPT0sICJodHRwOi8v
MTI3LjAuMC4xOjI5OTkvIik7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2
YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pbnNwZWN0b3JVcmw7IiwgJmVy
cm9yLm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fz
c2VydCghZXJyb3IuZ2V0KCkpOworICAgIHZhbHVlU3RyaW5nLnNldChXZWJWaWV3VGVzdDo6amF2
YXNjcmlwdFJlc3VsdFRvQ1N0cmluZyhqYXZhc2NyaXB0UmVzdWx0KSk7CisgICAgU3RyaW5nIHZh
bGlkSW5zcGVjdG9yVVJMID0gU3RyaW5nKCIvd2ViaW5zcGVjdG9yL2luc3BlY3Rvci5odG1sP3Bh
Z2U9IikgKyBTdHJpbmc6Om51bWJlcihwYWdlSWQpOworICAgIGdfYXNzZXJ0X2NtcHN0cih2YWx1
ZVN0cmluZy5nZXQoKSwgPT0sIHZhbGlkSW5zcGVjdG9yVVJMLmxhdGluMSgpLmRhdGEoKSk7Cit9
CisKKy8vIFRlc3Qgc2VuZGluZyBhIHJhdyByZW1vdGUgZGVidWdnaW5nIG1lc3NhZ2UgdGhyb3Vn
aCBvdXIgd2ViIHNvY2tldCBzZXJ2ZXIuCisvLyBGb3IgdGhpcyBzcGVjaWZpYyBtZXNzYWdlIHNl
ZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9jaHJvbWUvZGV2dG9vbHMvZG9jcy9wcm90b2NvbC90
b3QvcnVudGltZS5odG1sI2NvbW1hbmQtZXZhbHVhdGUKK3N0YXRpYyB2b2lkIHRlc3RSZW1vdGVE
ZWJ1Z2dpbmdNZXNzYWdlKEluc3BlY3RvclNlcnZlclRlc3QqIHRlc3QsIGdjb25zdHBvaW50ZXIp
Cit7CisgICAgdGVzdC0+c2hvd0luV2luZG93QW5kV2FpdFVudGlsTWFwcGVkKEdUS19XSU5ET1df
VE9QTEVWRUwpOworCisgICAgdGVzdC0+bG9hZEh0bWwoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2
YXNjcmlwdFwiPlxuIgorICAgICAgICAidmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoJ3dzOi8v
MTI3LjAuMC4xOjI5OTkvZGV2dG9vbHMvcGFnZS8xJyk7XG4iCisgICAgICAgICJzb2NrZXQub25t
ZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSkge1xuIgorICAgICAgICAgICAgInZhciByZXNwb25z
ZSA9IEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKTtcbiIKKyAgICAgICAgICAgICJpZiAocmVzcG9u
c2UuaWQgPT09IDEpXG4iCisgICAgICAgICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gcmVzcG9u
c2UucmVzdWx0LnJlc3VsdC52YWx1ZTtcbiIKKyAgICAgICAgICAgICJlbHNlXG4iCisgICAgICAg
ICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJGQUlMXCI7XG4iCisgICAgICAgICJ9XG4iCisg
ICAgICAgICJzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKSB7XG4iCisgICAgICAgICAgICAic29j
a2V0LnNlbmQoJ3tcImlkXCI6IDEsIFwibWV0aG9kXCI6IFwiUnVudGltZS5ldmFsdWF0ZVwiLCBc
InBhcmFtc1wiOiB7XCJleHByZXNzaW9uXCI6IFwiMiArIDJcIiB9IH0nKTtcbiIKKyAgICAgICAg
In1cbiIKKyAgICAgICAgIjwvc2NyaXB0PiIsCisgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjI5
OTkvIik7CisgICAgdGVzdC0+d2FpdFVudGlsVGl0bGVDaGFuZ2VkKCk7CisKKyAgICBnX2Fzc2Vy
dF9jbXBzdHIod2Via2l0X3dlYl92aWV3X2dldF90aXRsZSh0ZXN0LT5tX3dlYlZpZXcpLCA9PSwg
IjQiKTsKK30KKworc3RhdGljIHZvaWQgb3BlblJlbW90ZURlYnVnZ2luZ1Nlc3Npb24oSW5zcGVj
dG9yU2VydmVyVGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICAvLyBUbyB0ZXN0IHRo
ZSB3aG9sZSBwaXBlbGluZSB0aGlzIGV4cGxvaXRzIGEgYmVoYXZpb3Igb2YgdGhlIGluc3BlY3Rv
ciBmcm9udC1lbmQgd2hpY2ggd29uJ3QgcHJvdmlkZSBhbnkgdGl0bGUgdW5sZXNzIHRoZQorICAg
IC8vIGRlYnVnZ2luZyBzZXNzaW9uIHdhcyBlc3RhYmxpc2hlZCBjb3JyZWN0bHkgdGhyb3VnaCB3
ZWIgc29ja2V0LiBJdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgIldlYiBJbnNwZWN0b3IgLSA8
UGFnZSBVUkw+Ii4KKyAgICAvLyBTbyB0aGlzIHRlc3QgY2FzZSB3aWxsIGZhaWwgaWY6CisgICAg
Ly8gLSBUaGUgcGFnZSBsaXN0IGRpZG4ndCByZXR1cm4gYSB2YWxpZCBpbnNwZWN0b3IgVVJMCisg
ICAgLy8gLSBPciB0aGUgZnJvbnQtZW5kIGNvdWxkbid0IGJlIGxvYWRlZCB0aHJvdWdoIHRoZSBp
bnNwZWN0b3IgSFRUUCBzZXJ2ZXIKKyAgICAvLyAtIE9yIHRoZSB3ZWIgc29ja2V0IGNvbm5lY3Rp
b24gY291bGRuJ3QgYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiB0aGUgZnJvbnQtZW5kIGFuZCB0aGUg
cGFnZSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc2VydmVyCisgICAgLy8gTGV0J3Mgc2VlIGlmIHRo
aXMgdGVzdCBpc24ndCByYWlzaW5nIHRvbyBtYW55IGZhbHNlIHBvc2l0aXZlcywgaW4gd2hpY2gg
Y2FzZSB3ZSBzaG91bGQgdXNlIGEgYmV0dGVyIHByZWRpY2F0ZSBpZiBhdmFpbGFibGUuCisKKyAg
ICB0ZXN0LT5zaG93SW5XaW5kb3dBbmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZF
TCk7CisKKyAgICBnX2Fzc2VydCh0ZXN0LT5nZXRQYWdlTGlzdCgpKTsKKworICAgIEdPd25QdHI8
R0Vycm9yPiBlcnJvcjsKKyAgICBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0KiBqYXZhc2NyaXB0UmVz
dWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5p
bnNwZWN0b3JVcmw7IiwgJmVycm9yLm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0
UmVzdWx0KTsKKyAgICBnX2Fzc2VydCghZXJyb3IuZ2V0KCkpOworCisgICAgU3RyaW5nIHJlc29s
dmVkVVJMID0gU3RyaW5nKCJodHRwOi8vMTI3LjAuMC4xOjI5OTkvIikgKyBXZWJWaWV3VGVzdDo6
amF2YXNjcmlwdFJlc3VsdFRvQ1N0cmluZyhqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICB0ZXN0LT5s
b2FkVVJJKHJlc29sdmVkVVJMLmxhdGluMSgpLmRhdGEoKSk7CisgICAgdGVzdC0+d2FpdFVudGls
VGl0bGVDaGFuZ2VkKCk7CisKKyAgICBnX2Fzc2VydCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X3RpdGxl
KHRlc3QtPm1fd2ViVmlldykpOworfQorCisKK3ZvaWQgYmVmb3JlQWxsKCkKK3sKKyAgICBzdGFy
dFRlc3RTZXJ2ZXIoKTsKKyAgICBJbnNwZWN0b3JTZXJ2ZXJUZXN0OjphZGQoIldlYktpdFdlYklu
c3BlY3RvclNlcnZlciIsICJ0ZXN0LXBhZ2UtbGlzdCIsIHRlc3RJbnNwZWN0b3JTZXJ2ZXJQYWdl
TGlzdCk7CisgICAgSW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRXZWJJbnNwZWN0b3JT
ZXJ2ZXIiLCAidGVzdC1yZW1vdGUtZGVidWdnaW5nLW1lc3NhZ2UiLCB0ZXN0UmVtb3RlRGVidWdn
aW5nTWVzc2FnZSk7CisgICAgSW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRXZWJJbnNw
ZWN0b3JTZXJ2ZXIiLCAidGVzdC1vcGVuLWRlYnVnZ2luZy1zZXNzaW9uIiwgb3BlblJlbW90ZURl
YnVnZ2luZ1Nlc3Npb24pOworCit9CisKK3ZvaWQgYWZ0ZXJBbGwoKQoreworICAgIHN0b3BUZXN0
U2VydmVyKCk7Cit9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL1dlYkluc3BlY3RvclNlcnZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmgJKHJldmlzaW9uIDEy
ODAzOSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5z
cGVjdG9yU2VydmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIHZvaWQgZGlkQ2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKFdlYlNvY2tldFNl
cnZlckNvbm5lY3Rpb24qKTsKIAogICAgIGJvb2wgcGxhdGZvcm1SZXNvdXJjZUZvclBhdGgoY29u
c3QgU3RyaW5nJiBwYXRoLCBWZWN0b3I8Y2hhcj4mIGRhdGEsIFN0cmluZyYgY29udGVudFR5cGUp
OwotI2lmIFBMQVRGT1JNKFFUKQorI2lmIChQTEFURk9STShRVCkgfHwgUExBVEZPUk0oR1RLKSkK
ICAgICB2b2lkIGJ1aWxkUGFnZUxpc3QoVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRl
bnRUeXBlKTsKICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVj
dG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyLmgJKHJldmlzaW9uIDEy
ODAzOSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29j
a2V0U2VydmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTM3LDYgKzM3LDkgQEAKIG5hbWVzcGFjZSBX
ZWJLaXQgewogY2xhc3MgUXRUY3BTZXJ2ZXJIYW5kbGVyOwogfQorI2VsaWYgUExBVEZPUk0oR1RL
KQorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+
CiAjZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNzgsNiArODEsOCBAQCBwcml2YXRl
OgogICAgIHVuc2lnbmVkIHNob3J0IG1fcG9ydDsKICNpZiBQTEFURk9STShRVCkKICAgICBPd25Q
dHI8UXRUY3BTZXJ2ZXJIYW5kbGVyPiBtX3RjcFNlcnZlckhhbmRsZXI7CisjZWxpZiBQTEFURk9S
TShHVEspCisgICAgR1JlZlB0cjxHU29ja2V0U2VydmljZT4gbV9zb2NrZXRTZXJ2aWNlOwogI2Vu
ZGlmCiAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb247CiB9OwpJbmRl
eDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2
ZXJDb25uZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
SW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwCShyZXZpc2lvbiAx
MjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNv
Y2tldFNlcnZlckNvbm5lY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCw2ICs1MCw3IEBA
IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OldlYlNvY2tldFNlcnYKICAgICAsIG1fbW9kZShI
VFRQKQogICAgICwgbV9zZXJ2ZXIoc2VydmVyKQogICAgICwgbV9jbGllbnQoY2xpZW50KQorICAg
ICwgbV9zaHV0ZG93bkFmdGVyU2VuZChmYWxzZSkKIHsKIH0KIApAQCAtNzAsMTUgKzcxLDE2IEBA
IHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2h1dGRvd24KICAgICAgICAgcmV0dXJu
OwogICAgIFJlZlB0cjxTb2NrZXRTdHJlYW1IYW5kbGU+IHNvY2tldCA9IG1fc29ja2V0LnJlbGVh
c2UoKTsKICAgICBzb2NrZXQtPmNsb3NlKCk7CisgICAgbV9zaHV0ZG93bkFmdGVyU2VuZCA9IGZh
bHNlOwogfQogCiB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3duQWZ0ZXJT
ZW5kT3JOb3coKQogewotICAgIC8vIElmIHRoaXMgQVNTRVJUIGhhcHBlbnMgb24gYW55IHBsYXRm
b3JtIHRoZW4gdGhlaXIgU29ja2V0U3RyZWFtSGFuZGxlOjpzZW5kCi0gICAgLy8gZm9sbG93ZWQg
YnkgYSBTb2NrZXRTdHJlYW1IYW5kbGU6OmNsb3NlIGlzIG5vdCBndWFyZW50ZWVkIHRvIGhhdmUg
c2VudCBhbGwKLSAgICAvLyBkYXRhLiBJZiB0aGlzIGhhcHBlbnMsIHdlIG5lZWQgdG8gc2xpZ2h0
bHkgY2hhbmdlIHRoZSBkZXNpZ24gdG8gaW5jbHVkZSBhCi0gICAgLy8gU29ja2V0U3RyZWFtSGFu
ZGxlQ2xpZW50OjpkaWRTZW5kLCBoYW5kbGUgaXQgaGVyZSwgYW5kIGFkZCBhbiBtX3NodXRkb3du
QWZ0ZXJTZW5kCi0gICAgLy8gc3RhdGUgb24gdGhpcyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
LgorICAgIGlmIChtX3NvY2tldC0+YnVmZmVyZWRBbW91bnQoKSkgeworICAgICAgICBtX3NodXRk
b3duQWZ0ZXJTZW5kID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIEFTU0VS
VCghbV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpOwogCiAgICAgc2h1dGRvd25Ob3coKTsKQEAg
LTEyMyw2ICsxMjUsMTAgQEAgdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzZW5kUmF3
RAogCiB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZENsb3NlU29ja2V0U3RyZWFt
KFNvY2tldFN0cmVhbUhhbmRsZSopCiB7CisgICAgLy8gVG8gcHJldmVudCBkb3VibGUgZGVsZXRp
b24gaW4gV2ViU29ja2V0U2VydmVyOjpkaWRDbG9zZVdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24o
KQorICAgIGlmICghbV9zb2NrZXQpCisgICAgICAgIHJldHVybjsKKwogICAgIC8vIFdlYiBTb2Nr
ZXQgTW9kZS4KICAgICBpZiAobV9tb2RlID09IFdlYlNvY2tldCkKICAgICAgICAgbV9jbGllbnQt
PmRpZENsb3NlV2ViU29ja2V0Q29ubmVjdGlvbih0aGlzKTsKQEAgLTE1MCw2ICsxNTYsMTIgQEAg
dm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRSZWNlaQogICAgIH0KIH0KIAordm9p
ZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRVcGRhdGVCdWZmZXJlZEFtb3VudChXZWJD
b3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUqLCBzaXplX3QpCit7CisgICAgaWYgKG1fc2h1dGRvd25B
ZnRlclNlbmQgJiYgIW1fc29ja2V0LT5idWZmZXJlZEFtb3VudCgpKQorICAgICAgICBzaHV0ZG93
bk5vdygpOworfQorCiB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZEZhaWxTb2Nr
ZXRTdHJlYW0oU29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgU29ja2V0U3RyZWFtRXJyb3ImKQog
ewogICAgIC8vIFBvc3NpYmxlIHJlYWQgb3Igd3JpdGUgZXJyb3IuCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVy
L1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uaAkocmV2aXNpb24gMTI4MDM5KQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTY4LDYgKzY4LDcgQEAgcHVibGljOgogICAgIC8vIFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCBpbXBsZW1lbnRhdGlvbi4KICAgICB2aXJ0dWFsIHZvaWQg
ZGlkQ2xvc2VTb2NrZXRTdHJlYW0oV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKik7CiAgICAg
dmlydHVhbCB2b2lkIGRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZSosIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpOworICAgIHZpcnR1YWwg
dm9pZCBkaWRVcGRhdGVCdWZmZXJlZEFtb3VudChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUq
LCBzaXplX3QgYnVmZmVyZWRBbW91bnQpOwogICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsU29ja2V0
U3RyZWFtKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSosIGNvbnN0IFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUVycm9yJik7CiAKIHByaXZhdGU6CkBAIC04Niw2ICs4Nyw3IEBAIHByb3RlY3RlZDoK
ICAgICBSZWZQdHI8V2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlPiBtX3NvY2tldDsKICAgICBX
ZWJTb2NrZXRTZXJ2ZXIqIG1fc2VydmVyOwogICAgIFdlYlNvY2tldFNlcnZlckNsaWVudCogbV9j
bGllbnQ7CisgICAgYm9vbCBtX3NodXRkb3duQWZ0ZXJTZW5kOwogfTsKIAogfQpJbmRleDogU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2Vy
dmVyR3RrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVj
dG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9y
U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IK
KyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJJ
bnNwZWN0b3JTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJX
ZWJJbnNwZWN0b3JQcm94eS5oIgorI2luY2x1ZGUgIldlYlBhZ2VQcm94eS5oIgorI2luY2x1ZGUg
PFdlYkNvcmUvTUlNRVR5cGVSZWdpc3RyeS5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNs
dWRlIDxnbGliLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+
CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitib29sIFdlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZv
cm1SZXNvdXJjZUZvclBhdGgoY29uc3QgU3RyaW5nJiBwYXRoLCBWZWN0b3I8Y2hhcj4mIGRhdGEs
IFN0cmluZyYgY29udGVudFR5cGUpCit7CisgICAgLy8gVGhlIHBhZ2UgbGlzdCBjb250YWlucyBh
biB1bmZvcm1hdGVkIGxpc3Qgb2YgcGFnZXMgdGhhdCBjYW4gYmUgaW5zcGVjdGVkIHdpdGggYSBs
aW5rIHRvIG9wZW4gYSBzZXNzaW9uLgorICAgIGlmIChwYXRoID09ICIvcGFnZWxpc3QuanNvbiIp
IHsKKyAgICAgICAgYnVpbGRQYWdlTGlzdChkYXRhLCBjb250ZW50VHlwZSk7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFBvaW50IHRoZSBkZWZhdWx0IHBhdGggdG8gYSBm
b3JtYXR0ZWQgcGFnZSB0aGF0IHF1ZXJpZXMgdGhlIHBhZ2UgbGlzdCBhbmQgZGlzcGxheSB0aGVt
LgorICAgIFN0cmluZyBsb2NhbFBhdGggPSBTdHJpbmcoV2ViQ29yZTo6c2hhcmVkUmVzb3VyY2Vz
UGF0aCgpLmRhdGEoKSkgKyAoKHBhdGggPT0gIi8iKSA/ICIvd2ViaW5zcGVjdG9yL2luc3BlY3Rv
clBhZ2VJbmRleC5odG1sIiA6IHBhdGgpOworCisgICAgR1JlZlB0cjxHRmlsZT4gZmlsZShnX2Zp
bGVfbmV3X2Zvcl9wYXRoKGxvY2FsUGF0aC5sYXRpbjEoKS5kYXRhKCkpKTsKKyAgICBHT3duUHRy
PEdFcnJvcj4gZXJyb3I7CisKKyAgICBpZiAoZmlsZSkgeworICAgICAgICBnb2Zmc2V0IHNpemUg
PSAwOworICAgICAgICBHUmVmUHRyPEdGaWxlSW5mbz4gZmlsZUluZm8oZ19maWxlX3F1ZXJ5X2lu
Zm8oZmlsZS5nZXQoKSwgR19GSUxFX0FUVFJJQlVURV9TVEFOREFSRF9TSVpFLCBHX0ZJTEVfUVVF
UllfSU5GT19OT05FLCBOVUxMLCAmZXJyb3Iub3V0UHRyKCkpKTsKKyAgICAgICAgCisgICAgICAg
IGlmIChlcnJvcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgIAor
ICAgICAgICBHUmVmUHRyPEdGaWxlSW5wdXRTdHJlYW0+IGlucHV0U3RyZWFtKGdfZmlsZV9yZWFk
KGZpbGUuZ2V0KCksIE5VTEwsICZlcnJvci5vdXRQdHIoKSkpOworICAgICAgICBpZiAoIWlucHV0
U3RyZWFtKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHNpemUgPSBnX2Zp
bGVfaW5mb19nZXRfc2l6ZShmaWxlSW5mby5nZXQoKSk7CisgICAgICAgIGRhdGEuZ3JvdyhzaXpl
KTsKKworICAgICAgICBnc2l6ZSBieXRlc1JlYWQgPSAwOworICAgICAgICBpZiAoIWdfaW5wdXRf
c3RyZWFtX3JlYWRfYWxsKEdfSU5QVVRfU1RSRUFNKGlucHV0U3RyZWFtLmdldCgpKSwgZGF0YS5k
YXRhKCksIGRhdGEuc2l6ZSgpLCAmYnl0ZXNSZWFkLCAwLCAwKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBzaXplX3QgZXh0U3RhcnQgPSBsb2NhbFBhdGgucmV2ZXJzZUZp
bmQoJy4nKTsKKyAgICAgICAgU3RyaW5nIGV4dCA9IGxvY2FsUGF0aC5zdWJzdHJpbmcoZXh0U3Rh
cnQgIT0gbm90Rm91bmQgPyBleHRTdGFydCArIDEgOiAwKTsKKyAgICAgICAgY29udGVudFR5cGUg
PSBXZWJDb3JlOjpNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRNSU1FVHlwZUZvckV4dGVuc2lvbihleHQp
OworICAgICAgICByZXR1cm4gdHJ1ZTsgIAorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsgCit9
CisKK3ZvaWQgV2ViSW5zcGVjdG9yU2VydmVyOjpidWlsZFBhZ2VMaXN0KFZlY3RvcjxjaGFyPiYg
ZGF0YSwgU3RyaW5nJiBjb250ZW50VHlwZSkKK3sKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7
CisgICAgYnVpbGRlci5hcHBlbmQoIlsgIik7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQg
PSBtX2NsaWVudE1hcC5lbmQoKTsKKyAgICBmb3IgKENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBt
X2NsaWVudE1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgV2ViUGFnZVBy
b3h5KiB3ZWJQYWdlID0gaXQtPnNlY29uZC0+cGFnZSgpOworICAgICAgICBpZiAoaXQgIT0gbV9j
bGllbnRNYXAuYmVnaW4oKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOworICAg
ICAgICBidWlsZGVyLmFwcGVuZCgieyBcImlkXCI6ICIgKyBTdHJpbmc6Om51bWJlcihpdC0+Zmly
c3QpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgXCJ0aXRsZVwiOiBcIiIpOworICAgICAg
ICBidWlsZGVyLmFwcGVuZCh3ZWJQYWdlLT5wYWdlVGl0bGUoKSk7CisgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCJcIiwgXCJ1cmxcIjogXCIiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQod2ViUGFn
ZS0+YWN0aXZlVVJMKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiXCIsIFwiaW5zcGVjdG9y
VXJsXCI6IFwiIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIvd2ViaW5zcGVjdG9yL2luc3Bl
Y3Rvci5odG1sP3BhZ2U9IiArIFN0cmluZzo6bnVtYmVyKGl0LT5maXJzdCkpOworICAgICAgICBi
dWlsZGVyLmFwcGVuZCgiXCIgfSIpOworICAgIH0KKyAgICBidWlsZGVyLmFwcGVuZCgiIF0iKTsK
KyAgICBDU3RyaW5nIGNzdHIgPSBidWlsZGVyLnRvU3RyaW5nKCkudXRmOCgpOworICAgIGRhdGEu
YXBwZW5kKGNzdHIuZGF0YSgpLCBjc3RyLmxlbmd0aCgpKTsKKyAgICBjb250ZW50VHlwZSA9ICJh
cHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IjsKK30KKworCit9CkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVS
KQorI2luY2x1ZGUgIldlYlNvY2tldFNlcnZlci5oIgorCisjaW5jbHVkZSAiTG9nZ2luZy5oIgor
I2luY2x1ZGUgIldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlIDxXZWJDb3Jl
L1NvY2tldFN0cmVhbUhhbmRsZS5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDxn
bGliLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0
IHsKKworc3RhdGljIGdib29sZWFuIGNvbm5lY3Rpb25DYWxsYmFjayhHU29ja2V0U2VydmljZSog
c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NvY2tldENvbm5l
Y3Rpb24qIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdP
YmplY3QqIHNvdXJjZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z3BvaW50ZXIgc2VsZikKK3sgICAKKyNpZm5kZWYgTE9HX0RJU0FCTEVEICAgIAorICAgIEdTb2Nr
ZXRBZGRyZXNzKiBzb2NrYWRkciA9IGdfc29ja2V0X2Nvbm5lY3Rpb25fZ2V0X3JlbW90ZV9hZGRy
ZXNzKGNvbm5lY3Rpb24sIE5VTEwpOworICAgIEdJbmV0QWRkcmVzcyogYWRkciA9IGdfaW5ldF9z
b2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyhHX0lORVRfU09DS0VUX0FERFJFU1Moc29ja2FkZHIp
KTsKKyAgICBndWludDE2IHBvcnQgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X3BvcnQoR19J
TkVUX1NPQ0tFVF9BRERSRVNTKHNvY2thZGRyKSk7CisKKyAgICBMT0coTmV0d29yaywgIk5ldyBD
b25uZWN0aW9uIGZyb20gJXM6JWQuIiwgZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nKGFkZHIpLCBw
b3J0KTsKKyAgICBnX29iamVjdF91bnJlZihzb2NrYWRkcik7CisjZW5kaWYKKworICAgIFdlYlNv
Y2tldFNlcnZlciogc2VydmVyID0gKFdlYlNvY2tldFNlcnZlciopc2VsZjsKKyAgICAvLyByZWZl
cmVuY2UgY29ubmVjdGlvbiBiZWZvcmUgYWNjZXB0aW5nIGl0CisgICAgZ19vYmplY3RfcmVmX3Np
bmsoY29ubmVjdGlvbik7CisKKyAgICBPd25QdHI8V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbj4g
d2ViU29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0UHRyKG5ldyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uKHNlcnZlci0+Y2xpZW50KCksIHNlcnZlcikpOworICAgIHdlYlNvY2tldENvbm5lY3Rpb24t
PnNldFNvY2tldEhhbmRsZShTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZShjb25uZWN0aW9uLCB3
ZWJTb2NrZXRDb25uZWN0aW9uLmdldCgpKSk7CisgICAgc2VydmVyLT5kaWRBY2NlcHRDb25uZWN0
aW9uKHdlYlNvY2tldENvbm5lY3Rpb24ucmVsZWFzZSgpKTsKKworICAgIHJldHVybiBUUlVFOwor
fSAKKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtSW5pdGlhbGl6ZSgpCit7CisgICAg
bV9zb2NrZXRTZXJ2aWNlID0gYWRvcHRHUmVmKGdfc29ja2V0X3NlcnZpY2VfbmV3KCkpOworICAg
IGlmIChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpIHsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCht
X3NvY2tldFNlcnZpY2UuZ2V0KCksICJpbmNvbWluZyIsIEdfQ0FMTEJBQ0soY29ubmVjdGlvbkNh
bGxiYWNrKSwgdGhpcyk7CisgICAgICAgIGlmICghZ19zb2NrZXRfc2VydmljZV9pc19hY3RpdmUo
bV9zb2NrZXRTZXJ2aWNlLmdldCgpKSkKKyAgICAgICAgICAgIGdfc29ja2V0X3NlcnZpY2Vfc3Rh
cnQobV9zb2NrZXRTZXJ2aWNlLmdldCgpKTsKKyAgICB9Cit9CisKK2Jvb2wgV2ViU29ja2V0U2Vy
dmVyOjpwbGF0Zm9ybUxpc3Rlbihjb25zdCBTdHJpbmcmIGJpbmRBZGRyZXNzLCB1bnNpZ25lZCBz
aG9ydCBwb3J0KQoreworI2lmbmRlZiBMT0dfRElTQUJMRUQKKyAgICBMT0coTmV0d29yaywgIkxp
c3RlbiB0byBhZGRyZXNzPSVzLCBwb3J0PSVkLiIsIGJpbmRBZGRyZXNzLmxhdGluMSgpLmRhdGEo
KSwgcG9ydCk7CisjZW5kaWYKKworICAgIEdTb2NrZXRTZXJ2aWNlKiBzb2NrZXRTZXJ2aWNlID0g
bV9zb2NrZXRTZXJ2aWNlLmdldCgpOworICAgIGlmICghc29ja2V0U2VydmljZSkgeworICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBnZXQgc29ja2V0IHNlcnZpY2UuIik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBHSW5ldEFkZHJlc3MqIGFkZHJlc3MgPSBnX2luZXRf
YWRkcmVzc19uZXdfZnJvbV9zdHJpbmcoYmluZEFkZHJlc3MubGF0aW4xKCkuZGF0YSgpKTsKKyAg
ICBHU29ja2V0QWRkcmVzcyogc29ja2V0QWRkcmVzcyA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19u
ZXcoYWRkcmVzcywgcG9ydCk7CisKKyAgICBnYm9vbGVhbiByZXN1bHQgPSBnX3NvY2tldF9saXN0
ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUihzb2NrZXRTZXJ2aWNlKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRBZGRyZXNzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfU1RSRUFNLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1BST1RPQ09MX1RDUCwgMCwgMCwgMCk7CisK
KyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFkZCBpbmV0
IGFkZHJlc3MgdG8gd2ViIGluc3BlY3RvciBzZXJ2ZXIgbGlzdGVuZXIuIik7CisKKyAgICBnX29i
amVjdF91bnJlZihzb2NrZXRBZGRyZXNzKTsKKyAgICBnX29iamVjdF91bnJlZihhZGRyZXNzKTsK
KworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UoKQoreworICAg
IGlmIChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpCisgICAgICAgIGdfc29ja2V0X3NlcnZpY2Vfc3Rv
cChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5T
UEVDVE9SX1NFUlZFUikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvcXQvV2ViSW5zcGVjdG9yU2VydmVyUXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvcXQvV2ViSW5zcGVjdG9yU2VydmVyUXQu
Y3BwCShyZXZpc2lvbiAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVj
dG9yU2VydmVyL3F0L1dlYkluc3BlY3RvclNlcnZlclF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDcsNyArNDcsNyBAQCBib29sIFdlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjCiAg
ICAgfQogCiAgICAgLy8gUG9pbnQgdGhlIGRlZmF1bHQgcGF0aCB0byBhIGZvcm1hdHRlZCBwYWdl
IHRoYXQgcXVlcmllcyB0aGUgcGFnZSBsaXN0IGFuZCBkaXNwbGF5IHRoZW0uCi0gICAgU3RyaW5n
IGxvY2FsUGF0aCA9IChwYXRoID09ICIvIikgPyAiL3dlYmtpdC9yZXNvdXJjZXMvaW5zcGVjdG9y
UGFnZUluZGV4Lmh0bWwiIDogcGF0aDsKKyAgICBTdHJpbmcgbG9jYWxQYXRoID0gKHBhdGggPT0g
Ii8iKSA/ICIvd2Via2l0L2luc3BlY3Rvci9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbCIgOiBwYXRo
OwogICAgIC8vIEFsbCBvdGhlciBwYXRocyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIGEgcmVzb3Vy
Y2UsIGlmIHBvc3NpYmxlLgogICAgIFFGaWxlIGZpbGUoUVN0cmluZzo6ZnJvbUxhdGluMSgiOiUx
IikuYXJnKGxvY2FsUGF0aCkpOwogICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvZ3RrL1dlYkNvbnRleHRHdGsuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5jcHAJKHJldmlzaW9u
IDEyODAzOSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAy
MDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFBvcnRpb25zIENvcHlyaWdo
dCAoYykgMjAxMCBNb3Rvcm9sYSBNb2JpbGl0eSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTEgKzI3
LDQ2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJDb250ZXh0LmgiCisK
KyNpbmNsdWRlICJXZWJJbnNwZWN0b3JTZXJ2ZXIuaCIKICNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVT
eXN0ZW0uaD4KICNpbmNsdWRlIDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAorc3RhdGljIHZvaWQgaW5p
dEluc3BlY3RvclNlcnZlcigpCit7CisjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIpCisgICAg
c3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisg
ICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBlbnZTdHI7CisgICAgU3RyaW5nIGJpbmRBZGRy
ZXNzID0gIjEyNy4wLjAuMSI7CisgICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IDI5OTk7CisKKyAg
ICBjb25zdCBjaGFyKiBlbnZDU3RyID0gZ2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIp
OworCisgICAgaWYgKGVudkNTdHIpIHsKKyAgICAgICAgZW52U3RyID0gZW52Q1N0cjsKKworICAg
ICAgICBWZWN0b3I8U3RyaW5nPiByZXN1bHQ7CisgICAgICAgIGVudlN0ci5zcGxpdCgiOiIsIHJl
c3VsdCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMikgeworICAgICAgICAgICAg
YmluZEFkZHJlc3MgPSByZXN1bHRbMF07CisgICAgICAgICAgICBib29sIG9rID0gZmFsc2U7Cisg
ICAgICAgICAgICBwb3J0ID0gcmVzdWx0WzFdLnRvSW50KCZvayk7CisgICAgICAgICAgICBpZiAo
IW9rKQorICAgICAgICAgICAgICAgIHBvcnQgPSAyOTk5OworICAgICAgICB9CisgICAgfQorCisg
ICAgaW5pdGlhbGl6ZWQgPSBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmxpc3RlbihiaW5k
QWRkcmVzcywgcG9ydCk7CisjZW5kaWYKK30KKwogV1RGOjpTdHJpbmcgV2ViQ29udGV4dDo6YXBw
bGljYXRpb25DYWNoZURpcmVjdG9yeSgpCiB7CiAgICAgR093blB0cjxnY2hhcj4gY2FjaGVEaXJl
Y3RvcnkoZ19idWlsZF9maWxlbmFtZShnX2dldF91c2VyX2NhY2hlX2RpcigpLCAid2Via2l0Z3Rr
IiwgImFwcGxpY2F0aW9ucyIsIE5VTEwpKTsKQEAgLTM5LDYgKzc1LDcgQEAgV1RGOjpTdHJpbmcg
V2ViQ29udGV4dDo6YXBwbGljYXRpb25DYWNoZQogCiB2b2lkIFdlYkNvbnRleHQ6OnBsYXRmb3Jt
SW5pdGlhbGl6ZVdlYlByb2Nlc3MoV2ViUHJvY2Vzc0NyZWF0aW9uUGFyYW1ldGVycyYpCiB7Cisg
ICAgaW5pdEluc3BlY3RvclNlcnZlcigpOwogfQogCiB2b2lkIFdlYkNvbnRleHQ6OnBsYXRmb3Jt
SW52YWxpZGF0ZUNvbnRleHQoKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>163880</attachid>
            <date>2012-09-13 08:14:28 -0700</date>
            <delta_ts>2012-10-08 07:42:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20120913161309.patch</filename>
            <type>text/plain</type>
            <size>44488</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyODA3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDEyLTA5LTEzICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisgICAgICAgIGluc3BlY3Rv
clBhZ2VJbmRleC5odG1sIGhhcyBiZWVuIG1vdmVkIHRvIG5ldyBsb2NhdGlvbiB0byBzaGFyZSB0
aGUgZmlsZSBiZXR3ZWVuIEdUSyBhbmQgUVQgcG9ydHMuIAorCisgICAgICAgICogaW5zcGVjdG9y
L2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oOgorICAgICAgICAoV2ViQ29y
ZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGUpOgorICAgICAgICAoU29ja2V0U3RyZWFtSGFu
ZGxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxl
U291cC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0
cmVhbUhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSk6CisKIDIwMTItMDktMTAgIE1pa2UgV2VzdCAgPG1r
d3N0QGNocm9taXVtLm9yZz4KIAogICAgICAgICBDbGFyaWZ5IHRoZSBjYXVzZSBvZiBjb25zb2xl
IHdhcm5pbmdzIGdlbmVyYXRlZCBieSAiY3Jvc3Mtb3JpZ2luIiBhY2Nlc3MgdG8gc2FuZGJveGVk
IGlmcmFtZXMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3RvclBhZ2VJbmRleC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFk
PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxp
c3QoKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDsKKyAgICB4aHIub3Blbigi
R0VUIiwgIi9wYWdlbGlzdC5qc29uIik7CisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsK
KyAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CisgICAgICAgICAgICB2YXIgcGFnZXMg
PSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgaWYgKHBhZ2VzLmxl
bmd0aCkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90
aWNlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4g
cGFnZXMpIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImEiKTsKKyAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBh
Z2VzW2ldLnRpdGxlIDogKCJQYWdlICIgKyAoTnVtYmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAg
ICAgICAgICAgIHZhciB1cmwgPSBwYWdlc1tpXS51cmw7CisgICAgICAgICAgICAgICAgbGluay5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiAr
IHVybCArICJdIikgOiAiIiApKSk7CisgICAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUo
ImhyZWYiLCBwYWdlc1tpXS5pbnNwZWN0b3JVcmwpOworICAgICAgICAgICAgICAgIGRvY3VtZW50
LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH07CisgICAgeGhyLnNlbmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZl
bnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8
L3NjcmlwdD4KKzwvaGVhZD48Ym9keT4KKzxoMT5JbnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgor
PHAgaWQ9Im5vUGFnZU5vdGljZSIgc3R5bGU9ImNvbG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ug
c3VyZSB0aGF0IHlvdSBoYXZlIHNldCB0aGUgZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJl
bmNlIHByb3BlcnR5IG9uIHlvdXIgV2ViVmlldy48L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2Nr
ZXRTdHJlYW1IYW5kbGUuaAkocmV2aXNpb24gMTI4MDM5KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmlj
cyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCkBAIC00Niw2ICs0Nyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBT
b2NrZXRTdHJlYW1IYW5kbGUgOiBwdWJsaWMgUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+
LCBwdWJsaWMgU29ja2V0U3RyZWFtSGFuZGxlQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBz
dGF0aWMgUGFzc1JlZlB0cjxTb2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShjb25zdCBLVVJMJiB1
cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihu
ZXcgU29ja2V0U3RyZWFtSGFuZGxlKHVybCwgY2xpZW50KSk7IH0KKyAgICAgICAgc3RhdGljIFBh
c3NSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoR1NvY2tldENvbm5lY3Rpb24qIHNv
Y2tldENvbm5lY3Rpb24sIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVy
biBhZG9wdFJlZihuZXcgU29ja2V0U3RyZWFtSGFuZGxlKHNvY2tldENvbm5lY3Rpb24sIGNsaWVu
dCkpOyB9CiAKICAgICAgICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7CiAgICAgICAg
IHZvaWQgY29ubmVjdGVkKEdTb2NrZXRDb25uZWN0aW9uKiwgR0Vycm9yKik7CkBAIC02Niw2ICs2
OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCogbV9pZDsKIAogICAgICAg
ICBTb2NrZXRTdHJlYW1IYW5kbGUoY29uc3QgS1VSTCYsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVu
dCopOworICAgICAgICBTb2NrZXRTdHJlYW1IYW5kbGUoR1NvY2tldENvbm5lY3Rpb24qLCBTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKIAogICAgICAgICAvLyBObyBhdXRoZW50aWNhdGlvbiBm
b3Igc3RyZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50aWFscy4KICAg
ICAgICAgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UmKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAJ
KHJldmlzaW9uIDEyODAzOSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291
cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYg
QEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgR29vZ2xlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBM
dGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCkBAIC05NCw2ICs5NSwxNCBAQCBTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhh
bmRsZShjCiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0FzeW5jUmVhZHlDYWxsYmFjaz4oY29u
bmVjdGVkQ2FsbGJhY2spLCBtX2lkKTsKIH0KIAorU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRT
dHJlYW1IYW5kbGUoR1NvY2tldENvbm5lY3Rpb24qIHNvY2tldENvbm5lY3Rpb24sIFNvY2tldFN0
cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KQorICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZShL
VVJMKCksIGNsaWVudCkKKyAgICAsIG1fcmVhZEJ1ZmZlcigwKQoreworICAgIG1faWQgPSBhY3Rp
dmF0ZUhhbmRsZSh0aGlzKTsKKyAgICBjb25uZWN0ZWQoc29ja2V0Q29ubmVjdGlvbiwgMCk7Cit9
CisKIFNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSgpCiB7CiAgICAgLy8g
SWYgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgZGVzdHJveWVkIHdpdGhvdXQgY2xvc2luZywgZW5z
dXJlIHRoYXQgd2UgYXJlIGRlYWN0aXZhdGVkLgpAQCAtMTA4LDcgKzExNyw3IEBAIHZvaWQgU29j
a2V0U3RyZWFtSGFuZGxlOjpjb25uZWN0ZWQoR1NvY2sKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIG1fc29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0R1JlZihzb2NrZXRDb25uZWN0aW9uKTsK
KyAgICBtX3NvY2tldENvbm5lY3Rpb24gPSBzb2NrZXRDb25uZWN0aW9uOwogICAgIG1fb3V0cHV0
U3RyZWFtID0gR19QT0xMQUJMRV9PVVRQVVRfU1RSRUFNKGdfaW9fc3RyZWFtX2dldF9vdXRwdXRf
c3RyZWFtKEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpKTsKICAgICBtX2lu
cHV0U3RyZWFtID0gZ19pb19zdHJlYW1fZ2V0X2lucHV0X3N0cmVhbShHX0lPX1NUUkVBTShtX3Nv
Y2tldENvbm5lY3Rpb24uZ2V0KCkpKTsKIApAQCAtMTUzLDYgKzE2Miw5IEBAIHZvaWQgU29ja2V0
U3RyZWFtSGFuZGxlOjp3cml0ZVJlYWR5KCkKIAogaW50IFNvY2tldFN0cmVhbUhhbmRsZTo6cGxh
dGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7CisgICAgaWYgKCFtX291
dHB1dFN0cmVhbSB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICBHT3duUHRyPEdF
cnJvcj4gZXJyb3I7CiAgICAgZ3NzaXplIHdyaXR0ZW4gPSBnX3BvbGxhYmxlX291dHB1dF9zdHJl
YW1fd3JpdGVfbm9uYmxvY2tpbmcobV9vdXRwdXRTdHJlYW0uZ2V0KCksIGRhdGEsIGxlbmd0aCwg
MCwgJmVycm9yLm91dFB0cigpKTsKICAgICBpZiAoZXJyb3IpIHsKQEAgLTE4OCw2ICsyMDAsNyBA
QCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSgpCiAgICAgbV9vdXRwdXRT
dHJlYW0gPSAwOwogICAgIG1faW5wdXRTdHJlYW0gPSAwOwogICAgIGRlbGV0ZSBtX3JlYWRCdWZm
ZXI7CisgICAgbV9yZWFkQnVmZmVyID0gMDsKIAogICAgIG1fY2xpZW50LT5kaWRDbG9zZVNvY2tl
dFN0cmVhbSh0aGlzKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyODA3MikKKysrIFNv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY5IEBACisy
MDEyLTA5LTEzICBBbnRvbiBPYnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAg
ICAgICAgQWRkIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9y
IHNlcnZlciBmb3IgR1RLIHBvcnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD04ODA5NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gR1Nv
Y2tldCBBUEkgKFdlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgYW5kIFdlYlNvY2tldFNlcnZlckd0
ay5jcHApLgorICAgICAgICBUaGUgc2VydmVyIGxpc3RlbnMgb24gcG9ydCAyOTk5IGJ5IGRlZmF1
bHQuIElwIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBjYW4gYmUgc2V0CisgICAgICAgIGluIFdFQktJ
VF9JTlNQRUNUT1JfU0VSVkVSIChmb3IgZXhhbXBsZSBleHBvcnQgV0VCS0lUX0lOU1BFQ1RPUl9T
RVJWRVI9IjE5Mi4xNjguMTI0LjEzMDoyOTk5IikuCisgICAgICAgIFRoZSBzZXJ2ZXIgaXMgc3Rh
cnRlZCBkdXJpbmcgV2ViS2l0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24uCisgICAgICAgIE9uY2Ug
YSBwYWdlIGlzIGxvYWRlZCBpbnNlY3RvciBzZXJ2ZXIgY2FuIGJlIGFjY2Vzc2VkIHZpYSBvdGhl
ciBXZWJLaXQgYmFzZWQgYnJvd3Nlci4KKyAgICAgICAgTmV3IFdlYktpdCBBUEkgZ3RrIHRlc3Rz
IGhhdmUgYmVlZCBhZGRlZC4KKworICAgICAgICBUZXN0OiB0ZXN0LXBhZ2UtbGlzdCwgdGVzdC1y
ZW1vdGUtZGVidWdnaW5nLW1lc3NhZ2UsIHRlc3Qtb3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbgorCisg
ICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToK
KyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5hbToKKyAgICAg
ICAgKiBVSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcDogQWRk
ZWQuCisgICAgICAgIChsb2FkQ2hhbmdlZENhbGxiYWNrKToKKyAgICAgICAgKG1haW4pOgorICAg
ICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKHN0b3BUZXN0U2VydmVyKToKKyAgICAgICAgKHNpZ0Fib3J0SGFuZGxl
cik6CisgICAgICAgICh0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1bmMpOgorICAgICAgICAoc3Rh
cnRUZXN0U2VydmVyTW9uaXRvcik6CisgICAgICAgIChzdGFydFRlc3RTZXJ2ZXIpOgorICAgICAg
ICAodGVzdEluc3BlY3RvclNlcnZlclBhZ2VMaXN0KToKKyAgICAgICAgKHRlc3RSZW1vdGVEZWJ1
Z2dpbmdNZXNzYWdlKToKKyAgICAgICAgKG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKToKKyAg
ICAgICAgKGJlZm9yZUFsbCk6CisgICAgICAgIChhZnRlckFsbCk6CisgICAgICAgICogVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuaDoKKyAgICAgICAgKFdlYklu
c3BlY3RvclNlcnZlcik6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJT
b2NrZXRTZXJ2ZXIuaDoKKyAgICAgICAgKFdlYlNvY2tldFNlcnZlcik6CisgICAgICAgICogVUlQ
cm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6V2ViU29ja2V0U2VydmVy
Q29ubmVjdGlvbik6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246
OnNodXRkb3duTm93KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlv
bjo6c2h1dGRvd25BZnRlclNlbmRPck5vdyk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNl
cnZlckNvbm5lY3Rpb246OmRpZENsb3NlU29ja2V0U3RyZWFtKToKKyAgICAgICAgKFdlYktpdDo6
V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEpOgor
ICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVj
dGlvbjo6ZGlkVXBkYXRlQnVmZmVyZWRBbW91bnQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNw
ZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oOgorICAgICAgICAoV2ViU29j
a2V0U2VydmVyQ29ubmVjdGlvbik6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9ndGs6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dl
Ykluc3BlY3RvclNlcnZlckd0ay5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0KToKKyAgICAg
ICAgKFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjpwbGF0Zm9ybVJlc291cmNlRm9yUGF0aCk6
CisgICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6YnVpbGRQYWdlTGlzdCk6Cisg
ICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3Rr
LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViS2l0Ojpjb25uZWN0
aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3Jt
SW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1M
aXN0ZW4pOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2Up
OgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvcXQvV2ViSW5zcGVjdG9yU2Vy
dmVyUXQuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3Jt
UmVzb3VyY2VGb3JQYXRoKToKKyAgICAgICAgKiBVSVByb2Nlc3MvZ3RrL1dlYkNvbnRleHRHdGsu
Y3BwOgorICAgICAgICAoV2ViS2l0Ojppbml0SW5zcGVjdG9yU2VydmVyKToKKyAgICAgICAgKFdl
YktpdCk6CisgICAgICAgIChXZWJLaXQ6OldlYkNvbnRleHQ6OnBsYXRmb3JtSW5pdGlhbGl6ZVdl
YlByb2Nlc3MpOgorICAgICAgICAqIGNvbmZpZy5oOgorCiAyMDEyLTA5LTEwICBDYXJsb3MgR2Fy
Y2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAgICAgICBbU09VUF0gRG9uJ3Qg
Y29udmVydCB0byBVVEYtOCB0aGUgc3VnZ2VzdGVkRmlsZW5hbWUgcGFzc2VkIHRvIERvd25sb2Fk
OjpkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRGaWxlbmFtZSgpCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9HTlVt
YWtlZmlsZS5hbQkocmV2aXNpb24gMTI4MDM5KQorKysgU291cmNlL1dlYktpdDIvR05VbWFrZWZp
bGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTU3LDYgKzU3LDcgQEAgbGlid2Via2l0Mmd0a19AV0VC
S0lUR1RLX0FQSV9NQUpPUl9WRVJTSQogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9QbHVnaW5zIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGx1
Z2lucy9ndGsgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9zb3VwIFwK
KwktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyIFwK
IAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzIFwKIAktSSQoc3JjZGlyKS9T
b3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0FwcGxpY2F0aW9uQ2FjaGUgXAogCS1JJChzcmNkaXIp
L1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0aGVudGljYXRpb24gXApJbmRleDogU291cmNl
L1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0
Mi9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBAIC05MDUsNiArOTA1LDE1IEBA
IHdlYmtpdDJfc291cmNlcyArPSBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlRleHRD
aGVja2VyQ2xpZW50LmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5j
cHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5oIFwKKwlTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5jcHAg
XAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9y
U2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2Vi
U29ja2V0U2VydmVyLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXIuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDbGllbnQuaCBcCisJU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcCBcCisJ
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJD
b25uZWN0aW9uLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
Z3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAgXAogCVNvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5jcHAgXAogCVNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5oIFwKIAlTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvV2ViVmlicmF0aW9uUHJveHkuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL2Nv
bmZpZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCShyZXZpc2lvbiAx
MjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTE4
LDUgKzExOCw3IEBAIHN0YXRpYyBjb25zdCB0eXBlJiBuYW1lKCkgXAogI2lmbmRlZiBFTkFCTEVf
SU5TUEVDVE9SX1NFUlZFUgogI2lmIFBMQVRGT1JNKFFUKQogI2RlZmluZSBFTkFCTEVfSU5TUEVD
VE9SX1NFUlZFUiAxCisjZWxpZiBQTEFURk9STShHVEspCisjZGVmaW5lIEVOQUJMRV9JTlNQRUNU
T1JfU0VSVkVSIDEKICNlbmRpZgogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5hbQkocmV2aXNpb24gMTI4
MDM5KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZp
bGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTEsMTEgKzEsMTMgQEAKIGlmIEVOQUJMRV9XRUJLSVQy
CiAKIFRFU1RfUFJPR1MgKz0gXAorCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9JbnNwZWN0b3JU
ZXN0U2VydmVyIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdEJhY2tGb3J3YXJkTGlz
dCBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RDb250ZXh0TWVudSBcCiAJUHJvZ3Jh
bXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RDb29raWVNYW5hZ2VyIFwKIAlQcm9ncmFtcy9XZWJLaXQy
QVBJVGVzdHMvVGVzdERvd25sb2FkcyBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RJ
bnNwZWN0b3IgXAorCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0SW5zcGVjdG9yU2VydmVy
IFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdExvYWRlckNsaWVudCBcCiAJUHJvZ3Jh
bXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RQcmludGluZyBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRl
c3RzL1Rlc3RSZXNvdXJjZXMgXApAQCAtOTcsNiArOTksMTIgQEAgUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RXZWJLaXRTZXR0aQogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJL
aXRTZXR0aW5nc19MREFERCA9ICQod2Via2l0Ml90ZXN0c19sZGFkZCkKIFByb2dyYW1zX1dlYktp
dDJBUElUZXN0c19UZXN0V2ViS2l0U2V0dGluZ3NfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19s
ZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9T
T1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3Bl
Y3RvclRlc3RTZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVjdG9yVGVz
dFNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKK1Byb2dyYW1zX1dl
YktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX0xEQUREID0gJCh3ZWJraXQyX3Rlc3Rz
X2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX0luc3BlY3RvclRlc3RTZXJ2ZXJfTERG
TEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVz
dHNfVGVzdEJhY2tGb3J3YXJkTGlzdF9TT1VSQ0VTID0gXAogICAgICAgICBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0QmFja0ZvcndhcmRMaXN0LmNwcAogUHJvZ3Jh
bXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RCYWNrRm9yd2FyZExpc3RfQ1BQRkxBR1MgPSAkKHdlYmtp
dDJfdGVzdHNfY3BwZmxhZ3MpCkBAIC0xNjcsNiArMTc1LDEyIEBAIFByb2dyYW1zX1dlYktpdDJB
UElUZXN0c19UZXN0SW5zcGVjdG9yX0MKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5z
cGVjdG9yX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQogUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RJbnNwZWN0b3JfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQog
CitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNlcnZlcl9TT1VSQ0VTID0g
XAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JT
ZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNlcnZlcl9D
UFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKK1Byb2dyYW1zX1dlYktpdDJBUElU
ZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQor
UHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JTZXJ2ZXJfTERGTEFHUyA9ICQo
d2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdl
YktpdFZlcnNpb25fU09VUkNFUyA9IFwKICAgICAgICAgU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFZlcnNpb24uY3BwCiBQcm9ncmFtc19XZWJLaXQyQVBJ
VGVzdHNfVGVzdFdlYktpdFZlcnNpb25fQ1BQRkxBR1MgPSAkKHdlYmtpdDJfdGVzdHNfY3BwZmxh
Z3MpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNwZWN0
b3JUZXN0U2VydmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL2d0ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+Cisj
aW5jbHVkZSA8d2Via2l0Mi93ZWJraXQyLmg+CisKK3N0YXRpYyB2b2lkIGxvYWRDaGFuZ2VkQ2Fs
bGJhY2soV2ViS2l0V2ViVmlldyosIFdlYktpdExvYWRFdmVudCBsb2FkRXZlbnQsIGdwb2ludGVy
KQoreworICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBwYXJlbnQgcHJvY2VzcyB3aGVuIHdl
J3JlIHJlYWR5LgorICAgIGlmIChsb2FkRXZlbnQgPT0gV0VCS0lUX0xPQURfRklOSVNIRUQpCisg
ICAgICAgIGdfcHJpbnQoIk9LIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJn
dikKK3sKKyAgICBndGtfaW5pdCgmYXJnYywgJmFyZ3YpOworCisgICAgV2ViS2l0V2ViVmlldyog
d2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIHdl
YmtpdF9zZXR0aW5nc19zZXRfZW5hYmxlX2RldmVsb3Blcl9leHRyYXMod2Via2l0X3dlYl92aWV3
X2dldF9zZXR0aW5ncyh3ZWJWaWV3KSwgVFJVRSk7CisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRf
aHRtbCh3ZWJWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxodG1sPjxib2R5
PjxwPldlYktpdEdUSysgSW5zcGVjdG9yIFRlc3QgU2VydmVyPC9wPjwvYm9keT48L2h0bWw+IiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjI5OTkvIik7
CisKKyAgICBHdGtXaWRnZXQqIHdpbmRvdyA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfVE9Q
TEVWRUwpOworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIod2luZG93KSwgR1RL
X1dJREdFVCh3ZWJWaWV3KSk7CisgICAgZ3RrX3dpZGdldF9zaG93X2FsbCh3aW5kb3cpOworCisg
ICAgZ19zaWduYWxfY29ubmVjdCh3aW5kb3csICJkZWxldGUtZXZlbnQiLCBHX0NBTExCQUNLKGd0
a19tYWluX3F1aXQpLCAwKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHdlYlZpZXcsICJsb2FkLWNo
YW5nZWQiLCBHX0NBTExCQUNLKGxvYWRDaGFuZ2VkQ2FsbGJhY2spLCAwKTsKKworICAgIGd0a19t
YWluKCk7Cit9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9U
ZXN0SW5zcGVjdG9yU2VydmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0SW5zcGVjdG9yU2VydmVyLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JT
ZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICog
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiV2ViVmll
d1Rlc3QuaCIKKyNpbmNsdWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvV1RGU3RyaW5nLmg+CisKKy8vIE5hbWUgb2YgdGhlIHRlc3Qgc2VydmVyIGFwcGxpY2F0
aW9uIGNyZWF0aW5nIHRoZSB3ZWJWaWV3IG9iamVjdC4KK3N0YXRpYyBjb25zdCBjaGFyKiBzX3Rl
c3RTZXJ2ZXJBcHBOYW1lID0gIkluc3BlY3RvclRlc3RTZXJ2ZXIiOworCisvLyBNYXggc2Vjb25k
cyB0byB3YWl0IGZvciB0aGUgdGVzdCBzZXJ2ZXIgYmVmb3JlIGluc3BlY3RpbmcgaXQuCitzdGF0
aWMgY29uc3QgaW50IHNfbWF4V2FpdEZvckNoaWxkID0gNTsKKworLy8gVGhlIFBJRCBmb3IgdGhl
IHRlc3Qgc2VydmVyIHJ1bm5pbmcsIHNvIHdlIGNhbiBraWxsIGl0IGlmIG5lZWRlZC4KK3N0YXRp
YyBHUGlkIHNfY2hpbGRQcm9jZXNzUGlkID0gMDsKKworLy8gV2hldGhlciB0aGUgY2hpbGQgaGFz
IHJlcGxpZWQgYW5kIGl0J3MgcmVhZHkuCitzdGF0aWMgYm9vbCBzX2NoaWxkSXNSZWFkeSA9IGZh
bHNlOworCisvLyBQb2ludGVyIHRvIG9sZCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiB2YXJpYWJs
ZQorc3RhdGljIGNvbnN0IGNoYXIqIHNfaW5zcGVjdG9yU2VydmVyRW52OworCitzdGF0aWMgdm9p
ZCBzdG9wVGVzdFNlcnZlcigpCit7CisgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIG5vIHNl
cnZlciBydW5uaW5nLgorICAgIGlmICghc19jaGlsZFByb2Nlc3NQaWQpCisgICAgICAgIHJldHVy
bjsKKworICAgIGdfc3Bhd25fY2xvc2VfcGlkKHNfY2hpbGRQcm9jZXNzUGlkKTsKKyAgICBraWxs
KHNfY2hpbGRQcm9jZXNzUGlkLCBTSUdURVJNKTsKKyAgICBzX2NoaWxkUHJvY2Vzc1BpZCA9IDA7
CisKKyAgICAvLyByZXN0b3JlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgZ19zZXRlbnYoIldF
QktJVF9JTlNQRUNUT1JfU0VSVkVSIiwgc19pbnNwZWN0b3JTZXJ2ZXJFbnYsIFRSVUUpOworfQor
CitzdGF0aWMgdm9pZCBzaWdBYm9ydEhhbmRsZXIoaW50IHNpZ051bSkKK3sKKyAgICAvLyBKdXN0
IHN0b3AgdGhlIHRlc3Qgc2VydmVyIGlmIFNJR0FCUlQgd2FzIHJlY2VpdmVkLgorICAgIHN0b3BU
ZXN0U2VydmVyKCk7Cit9CisKK3N0YXRpYyBncG9pbnRlciB0ZXN0U2VydmVyTW9uaXRvclRocmVh
ZEZ1bmMoZ3BvaW50ZXIpCit7CisgICAgLy8gV2FpdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lb3V0
IHRvIGhhcHBlbi4KKyAgICBnX3VzbGVlcChzX21heFdhaXRGb3JDaGlsZCAqIEdfVVNFQ19QRVJf
U0VDKTsKKworICAgIC8vIEtpbGwgdGhlIGNoaWxkIHByb2Nlc3MgaWYgbm90IHJlYWR5IHlldC4K
KyAgICBpZiAoIXNfY2hpbGRJc1JlYWR5KQorICAgICAgICBzdG9wVGVzdFNlcnZlcigpOworCisg
ICAgZ190aHJlYWRfZXhpdCgwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3Rh
cnRUZXN0U2VydmVyTW9uaXRvcigpCit7CisgICAgc19jaGlsZElzUmVhZHkgPSBmYWxzZTsKKwor
I2lmICghR0xJQl9DSEVDS19WRVJTSU9OKDIsIDMxLCAwKSkKKyAgICBnX3RocmVhZF9jcmVhdGUo
dGVzdFNlcnZlck1vbml0b3JUaHJlYWRGdW5jLCAwLCBGQUxTRSwgMCk7CisjZWxzZQorICAgIGdf
dGhyZWFkX25ldygiVGVzdFNlcnZlck1vbml0b3IiLCB0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1
bmMsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0VGVzdFNlcnZlcigpCit7Cisg
ICAgLy8gUHJlcGFyZSBhcmd2W10gZm9yIHNwYXduaW5nIHRoZSBzZXJ2ZXIgcHJvY2Vzcy4KKyAg
ICBHT3duUHRyPGNoYXI+IHRlc3RTZXJ2ZXJQYXRoKGdfYnVpbGRfZmlsZW5hbWUoV0VCS0lUX0VY
RUNfUEFUSCwgIldlYktpdDJBUElUZXN0cyIsIHNfdGVzdFNlcnZlckFwcE5hbWUsIE5VTEwpKTsK
KworICAgIC8vIFNhdmUgY3VycmVudCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiB2YXJpYWJsZSB0
byByZXN0b3JlIGl0IGFmdGVyIHRoZSB0ZXN0IGlzIGZpbmlzaGVkLgorICAgIHNfaW5zcGVjdG9y
U2VydmVyRW52ID0gZ19nZXRlbnYoIldFQktJVF9JTlNQRUNUT1JfU0VSVkVSIik7CisKKyAgICAv
LyBPdmVyd3JpdGUgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgdmFyaWFibGUgd2l0aCBkZWZhdWx0
IHZhbHVlLgorICAgIGdfc2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIsICIxMjcuMC4w
LjE6Mjk5OSIsIFRSVUUpOworCisgICAgLy8gV2UgaW5zdGFsbCBhIGhhbmRsZXIgdG8gZW5zdXJl
IHRoYXQgd2Uga2lsbCB0aGUgY2hpbGQgcHJvY2VzcworICAgIC8vIGlmIHRoZSBwYXJlbnQgZGll
cyBiZWNhdXNlIG9mIHdoYXRldmVyIHRoZSByZWFzb24gaXMuCisgICAgc2lnbmFsKFNJR0FCUlQs
IHNpZ0Fib3J0SGFuZGxlcik7CisKKyAgICBjaGFyKiB0ZXN0U2VydmVyQXJndlsyXTsKKyAgICB0
ZXN0U2VydmVyQXJndlswXSA9IHRlc3RTZXJ2ZXJQYXRoLmdldCgpOworICAgIHRlc3RTZXJ2ZXJB
cmd2WzFdID0gMDsKKworICAgIC8vIFNwYXduIHRoZSBzZXJ2ZXIsIGdldHRpbmcgaXRzIHN0ZG91
dCBmaWxlIGRlc2NyaXB0b3IgdG8gc2V0IGEKKyAgICAvLyBjb21tdW5pY2F0aW9uIGNoYW5uZWws
IHNvIHdlIGtub3cgd2hlbiBpdCdzIHJlYWR5LgorICAgIGludCBjaGlsZFN0ZG91dCA9IDA7Cisg
ICAgaWYgKCFnX3NwYXduX2FzeW5jX3dpdGhfcGlwZXMoMCwgdGVzdFNlcnZlckFyZ3YsIDAsIHN0
YXRpY19jYXN0PEdTcGF3bkZsYWdzPigwKSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAmc19jaGlsZFByb2Nlc3NQaWQsIDAsICZjaGlsZFN0ZG91dCwgMCwgMCkpIHsK
KyAgICAgICAgY2xvc2UoY2hpbGRTdGRvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gU3RhcnQgbW9uaXRvcmluZyB0aGUgdGVzdCBzZXJ2ZXIgKGluIGEgc2VwYXJhdGUgdGhy
ZWFkKSB0bworICAgIC8vIGVuc3VyZSB3ZSBkb24ndCBibG9jayBvbiB0aGUgY2hpbGQgcHJvY2Vz
cyBtb3JlIHRoYW4gYSB0aW1lb3V0LgorICAgIHN0YXJ0VGVzdFNlcnZlck1vbml0b3IoKTsKKwor
ICAgIGNoYXIgbXNnWzJdOworICAgIEdJT0NoYW5uZWwqIGlvQ2hhbm5lbCA9IGdfaW9fY2hhbm5l
bF91bml4X25ldyhjaGlsZFN0ZG91dCk7CisgICAgaWYgKGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJz
KGlvQ2hhbm5lbCwgbXNnLCAyLCAwLCAwKSA9PSBHX0lPX1NUQVRVU19OT1JNQUwpIHsKKyAgICAg
ICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VydmVyIHNlbnQgYSBtZXNzYWdlIHNheWluZyBpdCdz
IHJlYWR5CisgICAgICAgIC8vIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGdsb2JhbGx5LCBzbyB0aGUg
bW9uaXRvciBjYW4gc2VlIGl0LgorICAgICAgICBzX2NoaWxkSXNSZWFkeSA9IG1zZ1swXSA9PSAn
TycgJiYgbXNnWzFdID09ICdLJzsKKyAgICB9CisgICAgZ19pb19jaGFubmVsX3VucmVmKGlvQ2hh
bm5lbCk7CisgICAgY2xvc2UoY2hpbGRTdGRvdXQpOworCisgICAgLy8gVGhlIHRpbWVvdXQgd2Fz
IHJlYWNoZWQgYW5kIHRoZSBzZXJ2ZXIgaXMgbm90IHJlYWR5IHlldCwgc28KKyAgICAvLyBzdG9w
IGl0IGlubWVkaWF0ZWx5LCBhbmQgbGV0IHRoZSB1bml0IHRlc3RzIGZhaWwuCisgICAgaWYgKCFz
X2NoaWxkSXNSZWFkeSkKKyAgICAgICAgc3RvcFRlc3RTZXJ2ZXIoKTsKK30KKworY2xhc3MgSW5z
cGVjdG9yU2VydmVyVGVzdDogcHVibGljIFdlYlZpZXdUZXN0IHsKK3B1YmxpYzoKKyAgICBNQUtF
X0dMSUJfVEVTVF9GSVhUVVJFKEluc3BlY3RvclNlcnZlclRlc3QpOworCisgICAgSW5zcGVjdG9y
U2VydmVyVGVzdCgpCisgICAgICAgIDogV2ViVmlld1Rlc3QoKQorICAgIHsKKyAgICB9CisKKyAg
ICBib29sIGdldFBhZ2VMaXN0KCkKKyAgICB7CisgICAgICAgIGxvYWRIdG1sKCI8c2NyaXB0IHR5
cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj5cbiIKKyAgICAgICAgICAgICAgICAgInZhciBwYWdlcztc
biIKKyAgICAgICAgICAgICAgICAgInZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4iCisg
ICAgICAgICAgICAgICAgICJ4aHIub3BlbihcIkdFVFwiLCBcIi9wYWdlbGlzdC5qc29uXCIpO1xu
IgorICAgICAgICAgICAgICAgICAieGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiIKKyAgICAg
ICAgICAgICAgICAgICAgICJpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiIKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAicGFnZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwiT0tcIjtcbiIKKyAg
ICAgICAgICAgICAgICAgICAgICJ9IGVsc2UgXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAg
ImRvY3VtZW50LnRpdGxlID0gXCJGQUlMXCI7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iCisg
ICAgICAgICAgICAgICAgICJ4aHIuc2VuZCgpO1xuIgorICAgICAgICAgICAgICAgICAiPC9zY3Jp
cHQ+XG4iLAorICAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisg
ICAgICAgIHdhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisgICAgICAgIGlmICghc3RyY21wKHdl
YmtpdF93ZWJfdmlld19nZXRfdGl0bGUobV93ZWJWaWV3KSwgIk9LIikpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgfkluc3Bl
Y3RvclNlcnZlclRlc3QoKQorICAgIHsKKyAgICB9Cit9OworCisvLyBUZXN0IHRvIGdldCBpbnNw
ZWN0b3Igc2VydmVyIHBhZ2UgbGlzdCBmcm9tIHRoZSB0ZXN0IHNlcnZlci4KKy8vIFNob3VsZCBj
b250YWluIG9ubHkgb25lIGVudHJ5IHBvaW50aW5nIHRvIGh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS93
ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0xCitzdGF0aWMgdm9pZCB0ZXN0SW5zcGVj
dG9yU2VydmVyUGFnZUxpc3QoSW5zcGVjdG9yU2VydmVyVGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRl
cikKK3sKKyAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisKKyAgICB0ZXN0LT5zaG93SW5XaW5k
b3dBbmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgICAgZ19hc3NlcnQo
dGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAgICBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0KiBqYXZh
c2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJw
YWdlcy5sZW5ndGg7IiwgJmVycm9yLm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0
UmVzdWx0KTsKKyAgICBnX2Fzc2VydCghZXJyb3IuZ2V0KCkpOworICAgIGdfYXNzZXJ0X2NtcGlu
dChXZWJWaWV3VGVzdDo6amF2YXNjcmlwdFJlc3VsdFRvTnVtYmVyKGphdmFzY3JpcHRSZXN1bHQp
LCA9PSwgMSk7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFu
ZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pZDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAg
IGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7
CisgICAgaW50IHBhZ2VJZCA9IFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9OdW1iZXIo
amF2YXNjcmlwdFJlc3VsdCk7CisKKyAgICBHT3duUHRyPGNoYXI+IHZhbHVlU3RyaW5nOworICAg
IGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVudGlsRmluaXNo
ZWQoInBhZ2VzWzBdLnVybDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGphdmFz
Y3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgdmFsdWVTdHJp
bmcuc2V0KFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9DU3RyaW5nKGphdmFzY3JpcHRS
ZXN1bHQpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVTdHJpbmcuZ2V0KCksID09LCAiaHR0
cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisgICAgamF2YXNjcmlwdFJlc3VsdCA9IHRlc3QtPnJ1
bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFnZXNbMF0uaW5zcGVjdG9yVXJsOyIs
ICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2YXNjcmlwdFJlc3VsdCk7CisgICAg
Z19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0cmluZy5zZXQoV2ViVmlld1Rlc3Q6
OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3VsdCkpOworICAgIFN0cmlu
ZyB2YWxpZEluc3BlY3RvclVSTCA9IFN0cmluZygiL3dlYmluc3BlY3Rvci9pbnNwZWN0b3IuaHRt
bD9wYWdlPSIpICsgU3RyaW5nOjpudW1iZXIocGFnZUlkKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIo
dmFsdWVTdHJpbmcuZ2V0KCksID09LCB2YWxpZEluc3BlY3RvclVSTC5sYXRpbjEoKS5kYXRhKCkp
OworfQorCisvLyBUZXN0IHNlbmRpbmcgYSByYXcgcmVtb3RlIGRlYnVnZ2luZyBtZXNzYWdlIHRo
cm91Z2ggb3VyIHdlYiBzb2NrZXQgc2VydmVyLgorLy8gRm9yIHRoaXMgc3BlY2lmaWMgbWVzc2Fn
ZSBzZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vY2hyb21lL2RldnRvb2xzL2RvY3MvcHJvdG9j
b2wvdG90L3J1bnRpbWUuaHRtbCNjb21tYW5kLWV2YWx1YXRlCitzdGF0aWMgdm9pZCB0ZXN0UmVt
b3RlRGVidWdnaW5nTWVzc2FnZShJbnNwZWN0b3JTZXJ2ZXJUZXN0KiB0ZXN0LCBnY29uc3Rwb2lu
dGVyKQoreworICAgIHRlc3QtPnNob3dJbldpbmRvd0FuZFdhaXRVbnRpbE1hcHBlZChHVEtfV0lO
RE9XX1RPUExFVkVMKTsKKworICAgIHRlc3QtPmxvYWRIdG1sKCI8c2NyaXB0IHR5cGU9XCJ0ZXh0
L2phdmFzY3JpcHRcIj5cbiIKKyAgICAgICAgInZhciBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KCd3
czovLzEyNy4wLjAuMToyOTk5L2RldnRvb2xzL3BhZ2UvMScpO1xuIgorICAgICAgICAic29ja2V0
Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiIKKyAgICAgICAgICAgICJ2YXIgcmVz
cG9uc2UgPSBKU09OLnBhcnNlKG1lc3NhZ2UuZGF0YSk7XG4iCisgICAgICAgICAgICAiaWYgKHJl
c3BvbnNlLmlkID09PSAxKVxuIgorICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IHJl
c3BvbnNlLnJlc3VsdC5yZXN1bHQudmFsdWU7XG4iCisgICAgICAgICAgICAiZWxzZVxuIgorICAg
ICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwiRkFJTFwiO1xuIgorICAgICAgICAifVxu
IgorICAgICAgICAic29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCkge1xuIgorICAgICAgICAgICAg
InNvY2tldC5zZW5kKCd7XCJpZFwiOiAxLCBcIm1ldGhvZFwiOiBcIlJ1bnRpbWUuZXZhbHVhdGVc
IiwgXCJwYXJhbXNcIjoge1wiZXhwcmVzc2lvblwiOiBcIjIgKyAyXCIgfSB9Jyk7XG4iCisgICAg
ICAgICJ9XG4iCisgICAgICAgICI8L3NjcmlwdD4iLAorICAgICAgICAiaHR0cDovLzEyNy4wLjAu
MToyOTk5LyIpOworICAgIHRlc3QtPndhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisgICAgZ19h
c3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfdmlld19nZXRfdGl0bGUodGVzdC0+bV93ZWJWaWV3KSwg
PT0sICI0Iik7Cit9CisKK3N0YXRpYyB2b2lkIG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKElu
c3BlY3RvclNlcnZlclRlc3QqIHRlc3QsIGdjb25zdHBvaW50ZXIpCit7CisgICAgLy8gVG8gdGVz
dCB0aGUgd2hvbGUgcGlwZWxpbmUgdGhpcyBleHBsb2l0cyBhIGJlaGF2aW9yIG9mIHRoZSBpbnNw
ZWN0b3IgZnJvbnQtZW5kIHdoaWNoIHdvbid0IHByb3ZpZGUgYW55IHRpdGxlIHVubGVzcyB0aGUK
KyAgICAvLyBkZWJ1Z2dpbmcgc2Vzc2lvbiB3YXMgZXN0YWJsaXNoZWQgY29ycmVjdGx5IHRocm91
Z2ggd2ViIHNvY2tldC4gSXQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlICJXZWIgSW5zcGVjdG9y
IC0gPFBhZ2UgVVJMPiIuCisgICAgLy8gU28gdGhpcyB0ZXN0IGNhc2Ugd2lsbCBmYWlsIGlmOgor
ICAgIC8vIC0gVGhlIHBhZ2UgbGlzdCBkaWRuJ3QgcmV0dXJuIGEgdmFsaWQgaW5zcGVjdG9yIFVS
TAorICAgIC8vIC0gT3IgdGhlIGZyb250LWVuZCBjb3VsZG4ndCBiZSBsb2FkZWQgdGhyb3VnaCB0
aGUgaW5zcGVjdG9yIEhUVFAgc2VydmVyCisgICAgLy8gLSBPciB0aGUgd2ViIHNvY2tldCBjb25u
ZWN0aW9uIGNvdWxkbid0IGJlIGVzdGFibGlzaGVkIGJldHdlZW4gdGhlIGZyb250LWVuZCBhbmQg
dGhlIHBhZ2UgdGhyb3VnaCB0aGUgaW5zcGVjdG9yIHNlcnZlcgorICAgIC8vIExldCdzIHNlZSBp
ZiB0aGlzIHRlc3QgaXNuJ3QgcmFpc2luZyB0b28gbWFueSBmYWxzZSBwb3NpdGl2ZXMsIGluIHdo
aWNoIGNhc2Ugd2Ugc2hvdWxkIHVzZSBhIGJldHRlciBwcmVkaWNhdGUgaWYgYXZhaWxhYmxlLgor
CisgICAgdGVzdC0+c2hvd0luV2luZG93QW5kV2FpdFVudGlsTWFwcGVkKEdUS19XSU5ET1dfVE9Q
TEVWRUwpOworCisgICAgZ19hc3NlcnQodGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAgICBHT3du
UHRyPEdFcnJvcj4gZXJyb3I7CisgICAgV2ViS2l0SmF2YXNjcmlwdFJlc3VsdCogamF2YXNjcmlw
dFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFnZXNb
MF0uaW5zcGVjdG9yVXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2YXNj
cmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKworICAgIFN0cmluZyBy
ZXNvbHZlZFVSTCA9IFN0cmluZygiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpICsgV2ViVmlld1Rl
c3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3VsdCk7CisgICAgdGVz
dC0+bG9hZFVSSShyZXNvbHZlZFVSTC5sYXRpbjEoKS5kYXRhKCkpOworICAgIHRlc3QtPndhaXRV
bnRpbFRpdGxlQ2hhbmdlZCgpOworCisgICAgZ19hc3NlcnQod2Via2l0X3dlYl92aWV3X2dldF90
aXRsZSh0ZXN0LT5tX3dlYlZpZXcpKTsKK30KKworCit2b2lkIGJlZm9yZUFsbCgpCit7CisgICAg
c3RhcnRUZXN0U2VydmVyKCk7CisgICAgSW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRX
ZWJJbnNwZWN0b3JTZXJ2ZXIiLCAidGVzdC1wYWdlLWxpc3QiLCB0ZXN0SW5zcGVjdG9yU2VydmVy
UGFnZUxpc3QpOworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVj
dG9yU2VydmVyIiwgInRlc3QtcmVtb3RlLWRlYnVnZ2luZy1tZXNzYWdlIiwgdGVzdFJlbW90ZURl
YnVnZ2luZ01lc3NhZ2UpOworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2Vi
SW5zcGVjdG9yU2VydmVyIiwgInRlc3Qtb3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbiIsIG9wZW5SZW1v
dGVEZWJ1Z2dpbmdTZXNzaW9uKTsKKworfQorCit2b2lkIGFmdGVyQWxsKCkKK3sKKyAgICBzdG9w
VGVzdFNlcnZlcigpOworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3Rv
clNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCShyZXZpc2lv
biAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dl
Ykluc3BlY3RvclNlcnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3ICs2MSw3IEBAIHByaXZh
dGU6CiAgICAgdmlydHVhbCB2b2lkIGRpZENsb3NlV2ViU29ja2V0Q29ubmVjdGlvbihXZWJTb2Nr
ZXRTZXJ2ZXJDb25uZWN0aW9uKik7CiAKICAgICBib29sIHBsYXRmb3JtUmVzb3VyY2VGb3JQYXRo
KGNvbnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRU
eXBlKTsKLSNpZiBQTEFURk9STShRVCkKKyNpZiAoUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKEdU
SykpCiAgICAgdm9pZCBidWlsZFBhZ2VMaXN0KFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBj
b250ZW50VHlwZSk7CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCShyZXZpc2lv
biAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dl
YlNvY2tldFNlcnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw5IEBACiBuYW1lc3Bh
Y2UgV2ViS2l0IHsKIGNsYXNzIFF0VGNwU2VydmVySGFuZGxlcjsKIH0KKyNlbGlmIFBMQVRGT1JN
KEdUSykKKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0
ci5oPgogI2VuZGlmCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTc4LDYgKzgxLDggQEAgcHJp
dmF0ZToKICAgICB1bnNpZ25lZCBzaG9ydCBtX3BvcnQ7CiAjaWYgUExBVEZPUk0oUVQpCiAgICAg
T3duUHRyPFF0VGNwU2VydmVySGFuZGxlcj4gbV90Y3BTZXJ2ZXJIYW5kbGVyOworI2VsaWYgUExB
VEZPUk0oR1RLKQorICAgIEdSZWZQdHI8R1NvY2tldFNlcnZpY2U+IG1fc29ja2V0U2VydmljZTsK
ICNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOwogfTsK
SW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0
U2VydmVyQ29ubmVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkocmV2aXNp
b24gMTI4MDM5KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9X
ZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsNiArNTAs
NyBAQCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2CiAgICAgLCBtX21v
ZGUoSFRUUCkKICAgICAsIG1fc2VydmVyKHNlcnZlcikKICAgICAsIG1fY2xpZW50KGNsaWVudCkK
KyAgICAsIG1fc2h1dGRvd25BZnRlclNlbmQoZmFsc2UpCiB7CiB9CiAKQEAgLTcwLDE1ICs3MSwx
NiBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3duCiAgICAgICAgIHJl
dHVybjsKICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBzb2NrZXQgPSBtX3NvY2tldC5y
ZWxlYXNlKCk7CiAgICAgc29ja2V0LT5jbG9zZSgpOworICAgIG1fc2h1dGRvd25BZnRlclNlbmQg
PSBmYWxzZTsKIH0KIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzaHV0ZG93bkFm
dGVyU2VuZE9yTm93KCkKIHsKLSAgICAvLyBJZiB0aGlzIEFTU0VSVCBoYXBwZW5zIG9uIGFueSBw
bGF0Zm9ybSB0aGVuIHRoZWlyIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZAotICAgIC8vIGZvbGxv
d2VkIGJ5IGEgU29ja2V0U3RyZWFtSGFuZGxlOjpjbG9zZSBpcyBub3QgZ3VhcmVudGVlZCB0byBo
YXZlIHNlbnQgYWxsCi0gICAgLy8gZGF0YS4gSWYgdGhpcyBoYXBwZW5zLCB3ZSBuZWVkIHRvIHNs
aWdodGx5IGNoYW5nZSB0aGUgZGVzaWduIHRvIGluY2x1ZGUgYQotICAgIC8vIFNvY2tldFN0cmVh
bUhhbmRsZUNsaWVudDo6ZGlkU2VuZCwgaGFuZGxlIGl0IGhlcmUsIGFuZCBhZGQgYW4gbV9zaHV0
ZG93bkFmdGVyU2VuZAotICAgIC8vIHN0YXRlIG9uIHRoaXMgV2ViU29ja2V0U2VydmVyQ29ubmVj
dGlvbi4KKyAgICBpZiAobV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpIHsKKyAgICAgICAgbV9z
aHV0ZG93bkFmdGVyU2VuZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBB
U1NFUlQoIW1fc29ja2V0LT5idWZmZXJlZEFtb3VudCgpKTsKIAogICAgIHNodXRkb3duTm93KCk7
CkBAIC0xMjMsNiArMTI1LDEwIEBAIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2Vu
ZFJhd0QKIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRDbG9zZVNvY2tldFN0
cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqKQogeworICAgIC8vIFRvIHByZXZlbnQgZG91YmxlIGRl
bGV0aW9uIGluIFdlYlNvY2tldFNlcnZlcjo6ZGlkQ2xvc2VXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uKCkKKyAgICBpZiAoIW1fc29ja2V0KQorICAgICAgICByZXR1cm47CisKICAgICAvLyBXZWIg
U29ja2V0IE1vZGUuCiAgICAgaWYgKG1fbW9kZSA9PSBXZWJTb2NrZXQpCiAgICAgICAgIG1fY2xp
ZW50LT5kaWRDbG9zZVdlYlNvY2tldENvbm5lY3Rpb24odGhpcyk7CkBAIC0xNTAsNiArMTU2LDEy
IEBAIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkUmVjZWkKICAgICB9CiB9CiAK
K3ZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkVXBkYXRlQnVmZmVyZWRBbW91bnQo
V2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgc2l6ZV90KQoreworICAgIGlmIChtX3NodXRk
b3duQWZ0ZXJTZW5kICYmICFtX3NvY2tldC0+YnVmZmVyZWRBbW91bnQoKSkKKyAgICAgICAgc2h1
dGRvd25Ob3coKTsKK30KKwogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRGYWls
U29ja2V0U3RyZWFtKFNvY2tldFN0cmVhbUhhbmRsZSosIGNvbnN0IFNvY2tldFN0cmVhbUVycm9y
JikKIHsKICAgICAvLyBQb3NzaWJsZSByZWFkIG9yIHdyaXRlIGVycm9yLgpJbmRleDogU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmgJKHJldmlzaW9uIDEyODAzOSkKKysrIFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29u
bmVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02OCw2ICs2OCw3IEBAIHB1YmxpYzoKICAgICAv
LyBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQgaW1wbGVtZW50YXRpb24uCiAgICAgdmlydHVhbCB2
b2lkIGRpZENsb3NlU29ja2V0U3RyZWFtKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSopOwog
ICAgIHZpcnR1YWwgdm9pZCBkaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YShXZWJDb3JlOjpTb2Nr
ZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkVXBkYXRlQnVmZmVyZWRBbW91bnQoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlKiwgc2l6ZV90IGJ1ZmZlcmVkQW1vdW50KTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbFNv
Y2tldFN0cmVhbShXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBXZWJDb3JlOjpT
b2NrZXRTdHJlYW1FcnJvciYpOwogCiBwcml2YXRlOgpAQCAtODYsNiArODcsNyBAQCBwcm90ZWN0
ZWQ6CiAgICAgUmVmUHRyPFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZT4gbV9zb2NrZXQ7CiAg
ICAgV2ViU29ja2V0U2VydmVyKiBtX3NlcnZlcjsKICAgICBXZWJTb2NrZXRTZXJ2ZXJDbGllbnQq
IG1fY2xpZW50OworICAgIGJvb2wgbV9zaHV0ZG93bkFmdGVyU2VuZDsKIH07CiAKIH0KSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYkluc3BlY3Rv
clNlcnZlckd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYkluc3Bl
Y3RvclNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJX
ZWJJbnNwZWN0b3JTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRl
ICJXZWJJbnNwZWN0b3JQcm94eS5oIgorI2luY2x1ZGUgIldlYlBhZ2VQcm94eS5oIgorI2luY2x1
ZGUgPFdlYkNvcmUvTUlNRVR5cGVSZWdpc3RyeS5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNp
bmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgorI2luY2x1
ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVy
Lmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitib29sIFdlYkluc3BlY3RvclNlcnZlcjo6cGxh
dGZvcm1SZXNvdXJjZUZvclBhdGgoY29uc3QgU3RyaW5nJiBwYXRoLCBWZWN0b3I8Y2hhcj4mIGRh
dGEsIFN0cmluZyYgY29udGVudFR5cGUpCit7CisgICAgLy8gVGhlIHBhZ2UgbGlzdCBjb250YWlu
cyBhbiB1bmZvcm1hdGVkIGxpc3Qgb2YgcGFnZXMgdGhhdCBjYW4gYmUgaW5zcGVjdGVkIHdpdGgg
YSBsaW5rIHRvIG9wZW4gYSBzZXNzaW9uLgorICAgIGlmIChwYXRoID09ICIvcGFnZWxpc3QuanNv
biIpIHsKKyAgICAgICAgYnVpbGRQYWdlTGlzdChkYXRhLCBjb250ZW50VHlwZSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFBvaW50IHRoZSBkZWZhdWx0IHBhdGggdG8g
YSBmb3JtYXR0ZWQgcGFnZSB0aGF0IHF1ZXJpZXMgdGhlIHBhZ2UgbGlzdCBhbmQgZGlzcGxheSB0
aGVtLgorICAgIENTdHJpbmcgbG9jYWxQYXRoID0gV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2Vu
dGF0aW9uKFN0cmluZyhXZWJDb3JlOjpzaGFyZWRSZXNvdXJjZXNQYXRoKCkuZGF0YSgpKSArICgo
cGF0aCA9PSAiLyIpID8gIi93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiIDog
cGF0aCkpOworICAgIGlmIChsb2NhbFBhdGguaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIEdSZWZQdHI8R0ZpbGU+IGZpbGUgPSBhZG9wdEdSZWYoZ19maWxlX25ld19mb3Jf
cGF0aChsb2NhbFBhdGguZGF0YSgpKSk7CisgICAgR1JlZlB0cjxHRmlsZUluZm8+IGZpbGVJbmZv
ID0gYWRvcHRHUmVmKGdfZmlsZV9xdWVyeV9pbmZvKGZpbGUuZ2V0KCksIEdfRklMRV9BVFRSSUJV
VEVfU1RBTkRBUkRfU0laRSIsIkdfRklMRV9BVFRSSUJVVEVfU1RBTkRBUkRfRkFTVF9DT05URU5U
X1RZUEUsIEdfRklMRV9RVUVSWV9JTkZPX05PTkUsIDAsIDApKTsKKyAgICBpZiAoIWZpbGVJbmZv
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAKKyAgICBHUmVmUHRyPEdG
aWxlSW5wdXRTdHJlYW0+IGlucHV0U3RyZWFtID0gYWRvcHRHUmVmKGdfZmlsZV9yZWFkKGZpbGUu
Z2V0KCksIE5VTEwsIDApKTsKKyAgICBpZiAoIWlucHV0U3RyZWFtKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBkYXRhLmdyb3coZ19maWxlX2luZm9fZ2V0X3NpemUoZmlsZUluZm8uZ2V0
KCkpKTsKKyAgICBpZiAoIWdfaW5wdXRfc3RyZWFtX3JlYWRfYWxsKEdfSU5QVVRfU1RSRUFNKGlu
cHV0U3RyZWFtLmdldCgpKSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCAwLCAwLCAwKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29udGVudFR5cGUgPSBHT3duUHRyPGdjaGFyPihn
X2ZpbGVfaW5mb19nZXRfYXR0cmlidXRlX2FzX3N0cmluZyhmaWxlSW5mby5nZXQoKSwgR19GSUxF
X0FUVFJJQlVURV9TVEFOREFSRF9GQVNUX0NPTlRFTlRfVFlQRSkpLmdldCgpOworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFdlYkluc3BlY3RvclNlcnZlcjo6YnVpbGRQYWdlTGlzdChWZWN0
b3I8Y2hhcj4mIGRhdGEsIFN0cmluZyYgY29udGVudFR5cGUpCit7CisgICAgU3RyaW5nQnVpbGRl
ciBidWlsZGVyOworICAgIGJ1aWxkZXIuYXBwZW5kKCJbICIpOworICAgIENsaWVudE1hcDo6aXRl
cmF0b3IgZW5kID0gbV9jbGllbnRNYXAuZW5kKCk7CisgICAgZm9yIChDbGllbnRNYXA6Oml0ZXJh
dG9yIGl0ID0gbV9jbGllbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
IFdlYlBhZ2VQcm94eSogd2ViUGFnZSA9IGl0LT5zZWNvbmQtPnBhZ2UoKTsKKyAgICAgICAgaWYg
KGl0ICE9IG1fY2xpZW50TWFwLmJlZ2luKCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgi
LCAiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoInsgXCJpZFwiOiAiICsgU3RyaW5nOjpudW1i
ZXIoaXQtPmZpcnN0KSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIFwidGl0bGVcIjogXCIi
KTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQod2ViUGFnZS0+cGFnZVRpdGxlKCkpOworICAgICAg
ICBidWlsZGVyLmFwcGVuZCgiXCIsIFwidXJsXCI6IFwiIik7CisgICAgICAgIGJ1aWxkZXIuYXBw
ZW5kKHdlYlBhZ2UtPmFjdGl2ZVVSTCgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiLCBc
Imluc3BlY3RvclVybFwiOiBcIiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiL3dlYmluc3Bl
Y3Rvci9pbnNwZWN0b3IuaHRtbD9wYWdlPSIgKyBTdHJpbmc6Om51bWJlcihpdC0+Zmlyc3QpKTsK
KyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIH0iKTsKKyAgICB9CisgICAgYnVpbGRlci5hcHBl
bmQoIiBdIik7CisgICAgQ1N0cmluZyBjc3RyID0gYnVpbGRlci50b1N0cmluZygpLnV0ZjgoKTsK
KyAgICBkYXRhLmFwcGVuZChjc3RyLmRhdGEoKSwgY3N0ci5sZW5ndGgoKSk7CisgICAgY29udGVu
dFR5cGUgPSAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCI7Cit9CisKK30KSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNl
cnZlckd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZl
ckd0ay5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMK
KyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBFTkFCTEUoSU5TUEVDVE9S
X1NFUlZFUikKKyNpbmNsdWRlICJXZWJTb2NrZXRTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkxvZ2dp
bmcuaCIKKyNpbmNsdWRlICJXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmgiCisjaW5jbHVkZSA8
V2ViQ29yZS9Tb2NrZXRTdHJlYW1IYW5kbGUuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5j
bHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK3N0YXRpYyBnYm9vbGVhbiBjb25uZWN0aW9uQ2FsbGJhY2soR1NvY2tldFNl
cnZpY2UqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTb2Nr
ZXRDb25uZWN0aW9uKiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBHT2JqZWN0KiBzb3VyY2VPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFdlYlNvY2tldFNlcnZlciogc2VydmVyKQoreyAgIAorI2lmbmRlZiBMT0dfRElTQUJM
RUQgICAgCisgICAgR1NvY2tldEFkZHJlc3MqIHNvY2thZGRyID0gZ19zb2NrZXRfY29ubmVjdGlv
bl9nZXRfcmVtb3RlX2FkZHJlc3MoY29ubmVjdGlvbiwgTlVMTCk7CisgICAgR0luZXRBZGRyZXNz
KiBhZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzKEdfSU5FVF9TT0NLRVRf
QUREUkVTUyhzb2NrYWRkcikpOworICAgIGd1aW50MTYgcG9ydCA9IGdfaW5ldF9zb2NrZXRfYWRk
cmVzc19nZXRfcG9ydChHX0lORVRfU09DS0VUX0FERFJFU1Moc29ja2FkZHIpKTsKKworICAgIExP
RyhOZXR3b3JrLCAiTmV3IENvbm5lY3Rpb24gZnJvbSAlczolZC4iLCBnX2luZXRfYWRkcmVzc190
b19zdHJpbmcoYWRkciksIHBvcnQpOworICAgIGdfb2JqZWN0X3VucmVmKHNvY2thZGRyKTsKKyNl
bmRpZgorCisgICAgT3duUHRyPFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24+IHdlYlNvY2tldENv
bm5lY3Rpb24gPSBhZG9wdFB0cihuZXcgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbihzZXJ2ZXIt
PmNsaWVudCgpLCBzZXJ2ZXIpKTsKKyAgICB3ZWJTb2NrZXRDb25uZWN0aW9uLT5zZXRTb2NrZXRI
YW5kbGUoU29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGUoY29ubmVjdGlvbiwgd2ViU29ja2V0Q29u
bmVjdGlvbi5nZXQoKSkpOworICAgIHNlcnZlci0+ZGlkQWNjZXB0Q29ubmVjdGlvbih3ZWJTb2Nr
ZXRDb25uZWN0aW9uLnJlbGVhc2UoKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30gCisKK3ZvaWQg
V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUluaXRpYWxpemUoKQoreworICAgIG1fc29ja2V0U2Vy
dmljZSA9IGFkb3B0R1JlZihnX3NvY2tldF9zZXJ2aWNlX25ldygpKTsKKyAgICBnX3NpZ25hbF9j
b25uZWN0KG1fc29ja2V0U2VydmljZS5nZXQoKSwgImluY29taW5nIiwgR19DQUxMQkFDSyhjb25u
ZWN0aW9uQ2FsbGJhY2spLCB0aGlzKTsKKyAgICBnX3NvY2tldF9zZXJ2aWNlX3N0YXJ0KG1fc29j
a2V0U2VydmljZS5nZXQoKSk7Cit9CisKK2Jvb2wgV2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUxp
c3Rlbihjb25zdCBTdHJpbmcmIGJpbmRBZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQorewor
I2lmbmRlZiBMT0dfRElTQUJMRUQKKyAgICBMT0coTmV0d29yaywgIkxpc3RlbiB0byBhZGRyZXNz
PSVzLCBwb3J0PSVkLiIsIGJpbmRBZGRyZXNzLnV0ZjgoKS5kYXRhKCksIHBvcnQpOworI2VuZGlm
CisgICAgR1JlZlB0cjxHSW5ldEFkZHJlc3M+IGFkZHJlc3MgPSBhZG9wdEdSZWYoZ19pbmV0X2Fk
ZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGJpbmRBZGRyZXNzLnV0ZjgoKS5kYXRhKCkpKTsKKyAgICBH
UmVmUHRyPEdTb2NrZXRBZGRyZXNzPiBzb2NrZXRBZGRyZXNzID0gYWRvcHRHUmVmKGdfaW5ldF9z
b2NrZXRfYWRkcmVzc19uZXcoYWRkcmVzcy5nZXQoKSwgcG9ydCkpOworICAgIHJldHVybiBnX3Nv
Y2tldF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUihtX3NvY2tldFNlcnZp
Y2UuZ2V0KCkpLCBzb2NrZXRBZGRyZXNzLmdldCgpLCBHX1NPQ0tFVF9UWVBFX1NUUkVBTSwgR19T
T0NLRVRfUFJPVE9DT0xfVENQLCAwLCAwLCAwKTsKK30KKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6
OnBsYXRmb3JtQ2xvc2UoKQoreworICAgIGdfc29ja2V0X3NlcnZpY2Vfc3RvcChtX3NvY2tldFNl
cnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SX1NFUlZF
UikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvcXQvV2Vi
SW5zcGVjdG9yU2VydmVyUXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvcXQvV2ViSW5zcGVjdG9yU2VydmVyUXQuY3BwCShyZXZpc2lv
biAxMjgwMzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL3F0
L1dlYkluc3BlY3RvclNlcnZlclF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBA
QCBib29sIFdlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjCiAgICAgfQogCiAgICAg
Ly8gUG9pbnQgdGhlIGRlZmF1bHQgcGF0aCB0byBhIGZvcm1hdHRlZCBwYWdlIHRoYXQgcXVlcmll
cyB0aGUgcGFnZSBsaXN0IGFuZCBkaXNwbGF5IHRoZW0uCi0gICAgU3RyaW5nIGxvY2FsUGF0aCA9
IChwYXRoID09ICIvIikgPyAiL3dlYmtpdC9yZXNvdXJjZXMvaW5zcGVjdG9yUGFnZUluZGV4Lmh0
bWwiIDogcGF0aDsKKyAgICBTdHJpbmcgbG9jYWxQYXRoID0gKHBhdGggPT0gIi8iKSA/ICIvd2Vi
a2l0L2luc3BlY3Rvci9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbCIgOiBwYXRoOwogICAgIC8vIEFs
bCBvdGhlciBwYXRocyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIGEgcmVzb3VyY2UsIGlmIHBvc3Np
YmxlLgogICAgIFFGaWxlIGZpbGUoUVN0cmluZzo6ZnJvbUxhdGluMSgiOiUxIikuYXJnKGxvY2Fs
UGF0aCkpOwogICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvZ3RrL1dlYkNvbnRleHRHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5jcHAJKHJldmlzaW9uIDEyODAzOSkKKysr
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxMCBN
b3Rvcm9sYSBNb2JpbGl0eSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4K
ICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTEgKzI3LDQyIEBACiAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJDb250ZXh0LmgiCisKKyNpbmNsdWRlICJX
ZWJJbnNwZWN0b3JTZXJ2ZXIuaCIKICNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KICNp
bmNsdWRlIDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAorc3RhdGljIHZvaWQgaW5pdEluc3BlY3RvclNl
cnZlcigpCit7CisjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIpCisgICAgc3RhdGljIGJvb2wg
aW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVy
bjsKKworICAgIFN0cmluZyBlbnZTdHIoZ2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIp
KTsKKworICAgIGlmICghZW52U3RyLmlzTnVsbCgpKSB7CisgICAgICAgIFN0cmluZyBiaW5kQWRk
cmVzcyA9ICIxMjcuMC4wLjEiOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMjk5OTsK
KworICAgICAgICBWZWN0b3I8U3RyaW5nPiByZXN1bHQ7CisgICAgICAgIGVudlN0ci5zcGxpdCgi
OiIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMikgeworICAgICAg
ICAgICAgYmluZEFkZHJlc3MgPSByZXN1bHRbMF07CisgICAgICAgICAgICBib29sIG9rID0gZmFs
c2U7CisgICAgICAgICAgICBwb3J0ID0gcmVzdWx0WzFdLnRvSW50KCZvayk7CisgICAgICAgICAg
ICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIHBvcnQgPSAyOTk5OworICAgICAgICB9CisgICAg
ICAgIGluaXRpYWxpemVkID0gV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5saXN0ZW4oYmlu
ZEFkZHJlc3MsIHBvcnQpOworICAgIH0KKyNlbmRpZgorfQorCiBXVEY6OlN0cmluZyBXZWJDb250
ZXh0OjphcHBsaWNhdGlvbkNhY2hlRGlyZWN0b3J5KCkKIHsKICAgICBHT3duUHRyPGdjaGFyPiBj
YWNoZURpcmVjdG9yeShnX2J1aWxkX2ZpbGVuYW1lKGdfZ2V0X3VzZXJfY2FjaGVfZGlyKCksICJ3
ZWJraXRndGsiLCAiYXBwbGljYXRpb25zIiwgTlVMTCkpOwpAQCAtMzksNiArNzEsNyBAQCBXVEY6
OlN0cmluZyBXZWJDb250ZXh0OjphcHBsaWNhdGlvbkNhY2hlCiAKIHZvaWQgV2ViQ29udGV4dDo6
cGxhdGZvcm1Jbml0aWFsaXplV2ViUHJvY2VzcyhXZWJQcm9jZXNzQ3JlYXRpb25QYXJhbWV0ZXJz
JikKIHsKKyAgICBpbml0SW5zcGVjdG9yU2VydmVyKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dDo6
cGxhdGZvcm1JbnZhbGlkYXRlQ29udGV4dCgpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>167539</attachid>
            <date>2012-10-08 07:42:58 -0700</date>
            <delta_ts>2012-10-19 11:18:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20121008154217.patch</filename>
            <type>text/plain</type>
            <size>44206</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMDYzNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTEwLTA4ICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5k
bGUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVT
b3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0
U3RyZWFtSGFuZGxlOjpjb25uZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpwbGF0Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlOjpwbGF0Zm9ybUNsb3NlKToKKwogMjAxMi0xMC0wOCAgWm9sdGFuIEhvcnZhdGggIDx6b2x0
YW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICBbUXRdIHIxMjI3MjAgY2F1c2VzIHBlcmZvcm1hbmNl
IHJlZ3Jlc3Npb24gd2l0aCBEaXJlY3RGQiBvbiBBUk12NwpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGUu
aAkocmV2aXNpb24gMTMwNjI3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9z
b3VwL1NvY2tldFN0cmVhbUhhbmRsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAog
LyoKICAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdo
dHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00Niw2
ICs0Nyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBTb2NrZXRTdHJlYW1IYW5k
bGUgOiBwdWJsaWMgUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+LCBwdWJsaWMgU29ja2V0
U3RyZWFtSGFuZGxlQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTb2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShjb25zdCBLVVJMJiB1cmwsIFNvY2tldFN0cmVh
bUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihuZXcgU29ja2V0U3RyZWFt
SGFuZGxlKHVybCwgY2xpZW50KSk7IH0KKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29ja2V0
U3RyZWFtSGFuZGxlPiBjcmVhdGUoR1NvY2tldENvbm5lY3Rpb24qIHNvY2tldENvbm5lY3Rpb24s
IFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihuZXcg
U29ja2V0U3RyZWFtSGFuZGxlKHNvY2tldENvbm5lY3Rpb24sIGNsaWVudCkpOyB9CiAKICAgICAg
ICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7CiAgICAgICAgIHZvaWQgY29ubmVjdGVk
KEdTb2NrZXRDb25uZWN0aW9uKiwgR0Vycm9yKik7CkBAIC02Niw2ICs2OCw3IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCogbV9pZDsKIAogICAgICAgICBTb2NrZXRTdHJlYW1I
YW5kbGUoY29uc3QgS1VSTCYsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCopOworICAgICAgICBT
b2NrZXRTdHJlYW1IYW5kbGUoR1NvY2tldENvbm5lY3Rpb24qLCBTb2NrZXRTdHJlYW1IYW5kbGVD
bGllbnQqKTsKIAogICAgICAgICAvLyBObyBhdXRoZW50aWNhdGlvbiBmb3Igc3RyZWFtcyBwZXIg
c2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50aWFscy4KICAgICAgICAgdm9pZCBkaWRS
ZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVu
Z2UmKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRT
dHJlYW1IYW5kbGVTb3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlU291cC5jcHAJKHJldmlzaW9uIDEzMDYy
NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1I
YW5kbGVTb3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTEgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMg
UmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC05NCw2ICs5
NSwxNCBAQCBTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhhbmRsZShjCiAgICAgICAg
IHJlaW50ZXJwcmV0X2Nhc3Q8R0FzeW5jUmVhZHlDYWxsYmFjaz4oY29ubmVjdGVkQ2FsbGJhY2sp
LCBtX2lkKTsKIH0KIAorU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUoR1Nv
Y2tldENvbm5lY3Rpb24qIHNvY2tldENvbm5lY3Rpb24sIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVu
dCogY2xpZW50KQorICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZShLVVJMKCksIGNsaWVudCkK
KyAgICAsIG1fcmVhZEJ1ZmZlcigwKQoreworICAgIG1faWQgPSBhY3RpdmF0ZUhhbmRsZSh0aGlz
KTsKKyAgICBjb25uZWN0ZWQoc29ja2V0Q29ubmVjdGlvbiwgMCk7Cit9CisKIFNvY2tldFN0cmVh
bUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSgpCiB7CiAgICAgLy8gSWYgZm9yIHNvbWUgcmVh
c29uIHdlIHdlcmUgZGVzdHJveWVkIHdpdGhvdXQgY2xvc2luZywgZW5zdXJlIHRoYXQgd2UgYXJl
IGRlYWN0aXZhdGVkLgpAQCAtMTA4LDcgKzExNyw3IEBAIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxl
Ojpjb25uZWN0ZWQoR1NvY2sKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fc29ja2V0
Q29ubmVjdGlvbiA9IGFkb3B0R1JlZihzb2NrZXRDb25uZWN0aW9uKTsKKyAgICBtX3NvY2tldENv
bm5lY3Rpb24gPSBzb2NrZXRDb25uZWN0aW9uOwogICAgIG1fb3V0cHV0U3RyZWFtID0gR19QT0xM
QUJMRV9PVVRQVVRfU1RSRUFNKGdfaW9fc3RyZWFtX2dldF9vdXRwdXRfc3RyZWFtKEdfSU9fU1RS
RUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpKTsKICAgICBtX2lucHV0U3RyZWFtID0gZ19p
b19zdHJlYW1fZ2V0X2lucHV0X3N0cmVhbShHX0lPX1NUUkVBTShtX3NvY2tldENvbm5lY3Rpb24u
Z2V0KCkpKTsKIApAQCAtMTUzLDYgKzE2Miw5IEBAIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjp3
cml0ZVJlYWR5KCkKIAogaW50IFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0
IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7CisgICAgaWYgKCFtX291dHB1dFN0cmVhbSB8fCAh
ZGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CiAg
ICAgZ3NzaXplIHdyaXR0ZW4gPSBnX3BvbGxhYmxlX291dHB1dF9zdHJlYW1fd3JpdGVfbm9uYmxv
Y2tpbmcobV9vdXRwdXRTdHJlYW0uZ2V0KCksIGRhdGEsIGxlbmd0aCwgMCwgJmVycm9yLm91dFB0
cigpKTsKICAgICBpZiAoZXJyb3IpIHsKQEAgLTE4OCw2ICsyMDAsNyBAQCB2b2lkIFNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSgpCiAgICAgbV9vdXRwdXRTdHJlYW0gPSAwOwogICAg
IG1faW5wdXRTdHJlYW0gPSAwOwogICAgIGRlbGV0ZSBtX3JlYWRCdWZmZXI7CisgICAgbV9yZWFk
QnVmZmVyID0gMDsKIAogICAgIG1fY2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsK
IH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMDYzNykKKysrIFNvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBACisyMDEyLTEwLTA4ICBBbnRv
biBPYnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRm
b3JtIGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RL
IHBvcnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
ODA5NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBU
aGUgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gR1NvY2tldCBBUEkgKFdlYklu
c3BlY3RvclNlcnZlckd0ay5jcHAgYW5kIFdlYlNvY2tldFNlcnZlckd0ay5jcHApLgorICAgICAg
ICBUaGUgc2VydmVyIGxpc3RlbnMgb24gcG9ydCAyOTk5IGJ5IGRlZmF1bHQuIElwIGFkZHJlc3Mg
b2YgdGhlIHNlcnZlciBjYW4gYmUgc2V0CisgICAgICAgIGluIFdFQktJVF9JTlNQRUNUT1JfU0VS
VkVSIChmb3IgZXhhbXBsZSBleHBvcnQgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVI9IjE5Mi4xNjgu
MTI0LjEzMDoyOTk5IikuCisgICAgICAgIFRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBkdXJpbmcgV2Vi
S2l0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24uCisgICAgICAgIE9uY2UgYSBwYWdlIGlzIGxvYWRl
ZCBpbnNlY3RvciBzZXJ2ZXIgY2FuIGJlIGFjY2Vzc2VkIHZpYSBvdGhlciBXZWJLaXQgYmFzZWQg
YnJvd3Nlci4KKyAgICAgICAgTmV3IFdlYktpdCBBUEkgZ3RrIHRlc3RzIGhhdmUgYmVlZCBhZGRl
ZC4KKyAgICAgICAgaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwgaGFzIGJlZW4gbW92ZWQgdG8gbmV3
IGxvY2F0aW9uIHRvIHNoYXJlIHRoZSBmaWxlIGJldHdlZW4gR1RLIGFuZCBRdCBwb3J0cy4KKwor
ICAgICAgICBUZXN0OiB0ZXN0LXBhZ2UtbGlzdCwgdGVzdC1yZW1vdGUtZGVidWdnaW5nLW1lc3Nh
Z2UsIHRlc3Qtb3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbgorCisgICAgICAgICogR05VbWFrZWZpbGUu
YW06CisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBVSVByb2Nlc3Mv
QVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0
ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcDogQWRkZWQuCisgICAgICAgIChsb2FkQ2hh
bmdlZENhbGxiYWNrKToKKyAgICAgICAgKG1haW4pOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKHN0b3BU
ZXN0U2VydmVyKToKKyAgICAgICAgKHNpZ0Fib3J0SGFuZGxlcik6CisgICAgICAgICh0ZXN0U2Vy
dmVyTW9uaXRvclRocmVhZEZ1bmMpOgorICAgICAgICAoc3RhcnRUZXN0U2VydmVyTW9uaXRvcik6
CisgICAgICAgIChzdGFydFRlc3RTZXJ2ZXIpOgorICAgICAgICAodGVzdEluc3BlY3RvclNlcnZl
clBhZ2VMaXN0KToKKyAgICAgICAgKHRlc3RSZW1vdGVEZWJ1Z2dpbmdNZXNzYWdlKToKKyAgICAg
ICAgKG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKToKKyAgICAgICAgKGJlZm9yZUFsbCk6Cisg
ICAgICAgIChhZnRlckFsbCk6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9X
ZWJJbnNwZWN0b3JTZXJ2ZXIuaDoKKyAgICAgICAgKFdlYkluc3BlY3RvclNlcnZlcik6CisgICAg
ICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaDoKKyAgICAg
ICAgKFdlYlNvY2tldFNlcnZlcik6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViU29j
a2V0U2VydmVyQ29ubmVjdGlvbjo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbik6CisgICAgICAg
IChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3duTm93KToKKyAgICAg
ICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2h1dGRvd25BZnRlclNlbmRP
ck5vdyk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZENs
b3NlU29ja2V0U3RyZWFtKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVj
dGlvbjo6ZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEpOgorICAgICAgICAoV2ViS2l0KToKKyAg
ICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkVXBkYXRlQnVmZmVy
ZWRBbW91bnQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0
U2VydmVyQ29ubmVjdGlvbi5oOgorICAgICAgICAoV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbik6
CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9mcm9udC1lbmQ6IEFkZGVkLgor
ICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3RvclBh
Z2VJbmRleC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVy
L2d0azogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2Vi
SW5zcGVjdG9yU2VydmVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQpOgorICAgICAg
ICAoV2ViS2l0OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKToK
KyAgICAgICAgKFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjpidWlsZFBhZ2VMaXN0KToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OmNvbm5lY3Rp
b25DYWxsYmFjayk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1J
bml0aWFsaXplKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUxp
c3Rlbik6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1DbG9zZSk6
CisgICAgICAgICogVUlQcm9jZXNzL2d0ay9XZWJDb250ZXh0R3RrLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6aW5pdEluc3BlY3RvclNlcnZlcik6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAo
V2ViS2l0OjpXZWJDb250ZXh0OjpwbGF0Zm9ybUluaXRpYWxpemVXZWJQcm9jZXNzKToKKyAgICAg
ICAgKiBXZWJLaXQyLnFyYzoKKyAgICAgICAgKiBjb25maWcuaDoKKwogMjAxMi0xMC0wOCAgQ2hy
aXN0b3BoZSBEdW1leiAgPGNocmlzdG9waGUuZHVtZXpAaW50ZWwuY29tPgogCiAgICAgICAgIFtF
RkxdW1dLMl0gVXNlIFVSTCBpbnN0ZWFkIG9mIFVSSSBpbiB0aGUgQVBJCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9HTlVt
YWtlZmlsZS5hbQkocmV2aXNpb24gMTMwNjI3KQorKysgU291cmNlL1dlYktpdDIvR05VbWFrZWZp
bGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTU3LDYgKzU3LDcgQEAgbGlid2Via2l0Mmd0a19AV0VC
S0lUR1RLX0FQSV9NQUpPUl9WRVJTSQogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9QbHVnaW5zIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGx1
Z2lucy91bml4IFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvc291cCBc
CisJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlciBc
CiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvV2ViUHJvY2VzcyBcCiAJLUkkKHNyY2Rpcikv
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BcHBsaWNhdGlvbkNhY2hlIFwKIAktSSQoc3JjZGly
KS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dGhlbnRpY2F0aW9uIFwKQEAgLTU1MSwzICs1
NTIsOSBAQCBFWFRSQV9ESVNUICs9IFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vz
cy9XZWJDb3JlU3VwcG9ydC8qLmluKSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dlYlByb2Nl
c3MvV2ViUGFnZS8qLmluKSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dlYlByb2Nlc3Mvc291
cC8qLmluKQorCisjIEluc3RhbGxpbmcgcmVtb3RlIGluc3BlY3RvciBmaWxlcworcmVtb3RlaW5z
cGVjdG9yZGlyID0gJHtkYXRhZGlyfS93ZWJraXRndGstQFdFQktJVEdUS19BUElfVkVSU0lPTkAv
d2ViaW5zcGVjdG9yCitkaXN0X3JlbW90ZWluc3BlY3Rvcl9EQVRBID0gXAorCSQoV2ViS2l0Mikv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0
bWwKKwpJbmRleDogU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMzA2Mjcp
CisrKyBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBA
IC05MjYsNiArOTI2LDE1IEBAIHdlYmtpdDJfc291cmNlcyArPSBcCiAJU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL1dlYlRleHRDaGVja2VyQ2xpZW50LmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9XZWJVSUNsaWVudC5jcHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNs
aWVudC5oIFwKKwlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYklu
c3BlY3RvclNlcnZlci5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9J
bnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaCBcCisJU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDbGllbnQuaCBcCisJ
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJD
b25uZWN0aW9uLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgXAorCVNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0
ay5jcHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5j
cHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5oIFwK
IAlTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViVmlicmF0aW9uUHJveHkuY3BwIFwKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL1dlYktpdDIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1dlYktpdDIucXJjCShyZXZpc2lvbiAxMzA2MjcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQy
LnFyYwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIDwhRE9DVFlQRSBSQ0M+PFJDQyB2
ZXJzaW9uPSIxLjAiPgogPHFyZXNvdXJjZSBwcmVmaXg9Ii93ZWJraXQvcmVzb3VyY2VzIj4KLSAg
ICA8ZmlsZSBhbGlhcz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiPnF0L1Jlc291cmNlcy9pbnNw
ZWN0b3JQYWdlSW5kZXguaHRtbDwvZmlsZT4KKyAgICA8ZmlsZSBhbGlhcz0iaW5zcGVjdG9yUGFn
ZUluZGV4Lmh0bWwiPlVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3Rv
clBhZ2VJbmRleC5odG1sPC9maWxlPgogPC9xcmVzb3VyY2U+CiA8L1JDQz4KSW5kZXg6IFNvdXJj
ZS9XZWJLaXQyL2NvbmZpZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5o
CShyZXZpc2lvbiAxMzA2MjcpCisrKyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBj
b3B5KQpAQCAtMTIwLDcgKzEyMCw3IEBAIHN0YXRpYyBjb25zdCB0eXBlJiBuYW1lKCkgXAogI2Rl
ZmluZSBQTFVHSU5fQVJDSElURUNUVVJFKEFSQ0gpIChkZWZpbmVkIFBMVUdJTl9BUkNISVRFQ1RV
UkVfIyNBUkNIICYmIFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIKQogCiAjaWZuZGVmIEVOQUJM
RV9JTlNQRUNUT1JfU0VSVkVSCi0jaWYgUExBVEZPUk0oUVQpCisjaWYgUExBVEZPUk0oUVQpIHx8
IFBMQVRGT1JNKEdUSykKICNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQogI2VuZGlm
CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0dO
VW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiAxMzA2MjcpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5
KQpAQCAtMSwxMSArMSwxMyBAQAogaWYgRU5BQkxFX1dFQktJVDIKIAogVEVTVF9QUk9HUyArPSBc
CisJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIgXAogCVByb2dy
YW1zL1dlYktpdDJBUElUZXN0cy9UZXN0QmFja0ZvcndhcmRMaXN0IFwKIAlQcm9ncmFtcy9XZWJL
aXQyQVBJVGVzdHMvVGVzdENvbnRleHRNZW51IFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMv
VGVzdENvb2tpZU1hbmFnZXIgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0RG93bmxv
YWRzIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdEluc3BlY3RvciBcCisJUHJvZ3Jh
bXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIgXAogCVByb2dyYW1zL1dlYktp
dDJBUElUZXN0cy9UZXN0TG9hZGVyQ2xpZW50IFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMv
VGVzdFByaW50aW5nIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdFJlc291cmNlcyBc
CkBAIC05OCw2ICsxMDAsMTIgQEAgUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJLaXRT
ZXR0aQogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJLaXRTZXR0aW5nc19MREFERCA9
ICQod2Via2l0Ml90ZXN0c19sZGFkZCkKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2Vi
S2l0U2V0dGluZ3NfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQogCitQcm9ncmFt
c19XZWJLaXQyQVBJVGVzdHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9TT1VSQ0VTID0gXAorCVNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3Bw
CitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9DUFBGTEFHUyA9
ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19JbnNw
ZWN0b3JUZXN0U2VydmVyX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNf
V2ViS2l0MkFQSVRlc3RzX0luc3BlY3RvclRlc3RTZXJ2ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90
ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEJhY2tGb3J3YXJk
TGlzdF9TT1VSQ0VTID0gXAogICAgICAgICBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay90ZXN0cy9UZXN0QmFja0ZvcndhcmRMaXN0LmNwcAogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3Rz
X1Rlc3RCYWNrRm9yd2FyZExpc3RfQ1BQRkxBR1MgPSAkKHdlYmtpdDJfdGVzdHNfY3BwZmxhZ3Mp
CkBAIC0xNzQsNiArMTgyLDEyIEBAIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVj
dG9yX0MKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yX0xEQUREID0gJCh3
ZWJraXQyX3Rlc3RzX2xkYWRkKQogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0
b3JfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQy
QVBJVGVzdHNfVGVzdEluc3BlY3RvclNlcnZlcl9TT1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCitQcm9ncmFt
c19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0
Ml90ZXN0c19jcHBmbGFncykKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9y
U2VydmVyX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RJbnNwZWN0b3JTZXJ2ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZs
YWdzKQorCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFZlcnNpb25fU09VUkNF
UyA9IFwKICAgICAgICAgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVz
dFdlYktpdFZlcnNpb24uY3BwCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFZl
cnNpb25fQ1BQRkxBR1MgPSAkKHdlYmtpdDJfdGVzdHNfY3BwZmxhZ3MpCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNw
ZWN0b3JUZXN0U2VydmVyLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ry
b25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8d2Via2l0Mi93
ZWJraXQyLmg+CisKK3N0YXRpYyB2b2lkIGxvYWRDaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmll
dyosIFdlYktpdExvYWRFdmVudCBsb2FkRXZlbnQsIGdwb2ludGVyKQoreworICAgIC8vIFNlbmQg
YSBtZXNzYWdlIHRvIHRoZSBwYXJlbnQgcHJvY2VzcyB3aGVuIHdlJ3JlIHJlYWR5LgorICAgIGlm
IChsb2FkRXZlbnQgPT0gV0VCS0lUX0xPQURfRklOSVNIRUQpCisgICAgICAgIGdfcHJpbnQoIk9L
Iik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBndGtfaW5p
dCgmYXJnYywgJmFyZ3YpOworCisgICAgV2ViS2l0V2ViVmlldyogd2ViVmlldyA9IFdFQktJVF9X
RUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIHdlYmtpdF9zZXR0aW5nc19zZXRf
ZW5hYmxlX2RldmVsb3Blcl9leHRyYXMod2Via2l0X3dlYl92aWV3X2dldF9zZXR0aW5ncyh3ZWJW
aWV3KSwgVFJVRSk7CisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRfaHRtbCh3ZWJWaWV3LAorICAg
ICAgICAiPGh0bWw+PGJvZHk+PHA+V2ViS2l0R1RLKyBJbnNwZWN0b3IgVGVzdCBTZXJ2ZXI8L3A+
PC9ib2R5PjwvaHRtbD4iLAorICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisg
ICAgR3RrV2lkZ2V0KiB3aW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1RPUExFVkVM
KTsKKyAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHdpbmRvdyksIEdUS19XSURH
RVQod2ViVmlldykpOworICAgIGd0a193aWRnZXRfc2hvd19hbGwod2luZG93KTsKKworICAgIGdf
c2lnbmFsX2Nvbm5lY3Qod2luZG93LCAiZGVsZXRlLWV2ZW50IiwgR19DQUxMQkFDSyhndGtfbWFp
bl9xdWl0KSwgMCk7CisgICAgZ19zaWduYWxfY29ubmVjdCh3ZWJWaWV3LCAibG9hZC1jaGFuZ2Vk
IiwgR19DQUxMQkFDSyhsb2FkQ2hhbmdlZENhbGxiYWNrKSwgMCk7CisKKyAgICBndGtfbWFpbigp
OworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdElu
c3BlY3RvclNlcnZlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0SW5zcGVjdG9yU2VydmVy
LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAq
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIldlYlZpZXdUZXN0
LmgiCisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1dURlN0cmluZy5oPgorCisvLyBOYW1lIG9mIHRoZSB0ZXN0IHNlcnZlciBhcHBsaWNhdGlvbiBj
cmVhdGluZyB0aGUgd2ViVmlldyBvYmplY3QuCitzdGF0aWMgY29uc3QgY2hhciogc190ZXN0U2Vy
dmVyQXBwTmFtZSA9ICJJbnNwZWN0b3JUZXN0U2VydmVyIjsKKworLy8gTWF4IHNlY29uZHMgdG8g
d2FpdCBmb3IgdGhlIHRlc3Qgc2VydmVyIGJlZm9yZSBpbnNwZWN0aW5nIGl0Lgorc3RhdGljIGNv
bnN0IGludCBzX21heFdhaXRGb3JDaGlsZCA9IDU7CisKKy8vIFRoZSBQSUQgZm9yIHRoZSB0ZXN0
IHNlcnZlciBydW5uaW5nLCBzbyB3ZSBjYW4ga2lsbCBpdCBpZiBuZWVkZWQuCitzdGF0aWMgR1Bp
ZCBzX2NoaWxkUHJvY2Vzc1BpZCA9IDA7CisKKy8vIFdoZXRoZXIgdGhlIGNoaWxkIGhhcyByZXBs
aWVkIGFuZCBpdCdzIHJlYWR5Lgorc3RhdGljIGJvb2wgc19jaGlsZElzUmVhZHkgPSBmYWxzZTsK
Kworc3RhdGljIHZvaWQgc3RvcFRlc3RTZXJ2ZXIoKQoreworICAgIC8vIERvIG5vdGhpbmcgaWYg
dGhlcmUncyBubyBzZXJ2ZXIgcnVubmluZy4KKyAgICBpZiAoIXNfY2hpbGRQcm9jZXNzUGlkKQor
ICAgICAgICByZXR1cm47CisKKyAgICBnX3NwYXduX2Nsb3NlX3BpZChzX2NoaWxkUHJvY2Vzc1Bp
ZCk7CisgICAga2lsbChzX2NoaWxkUHJvY2Vzc1BpZCwgU0lHVEVSTSk7CisgICAgc19jaGlsZFBy
b2Nlc3NQaWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBzaWdBYm9ydEhhbmRsZXIoaW50IHNpZ051
bSkKK3sKKyAgICAvLyBKdXN0IHN0b3AgdGhlIHRlc3Qgc2VydmVyIGlmIFNJR0FCUlQgd2FzIHJl
Y2VpdmVkLgorICAgIHN0b3BUZXN0U2VydmVyKCk7Cit9CisKK3N0YXRpYyBncG9pbnRlciB0ZXN0
U2VydmVyTW9uaXRvclRocmVhZEZ1bmMoZ3BvaW50ZXIpCit7CisgICAgLy8gV2FpdCBmb3IgdGhl
IHNwZWNpZmllZCB0aW1lb3V0IHRvIGhhcHBlbi4KKyAgICBnX3VzbGVlcChzX21heFdhaXRGb3JD
aGlsZCAqIEdfVVNFQ19QRVJfU0VDKTsKKworICAgIC8vIEtpbGwgdGhlIGNoaWxkIHByb2Nlc3Mg
aWYgbm90IHJlYWR5IHlldC4KKyAgICBpZiAoIXNfY2hpbGRJc1JlYWR5KQorICAgICAgICBzdG9w
VGVzdFNlcnZlcigpOworCisgICAgZ190aHJlYWRfZXhpdCgwKTsKKyAgICByZXR1cm4gMDsKK30K
Kworc3RhdGljIHZvaWQgc3RhcnRUZXN0U2VydmVyTW9uaXRvcigpCit7CisgICAgc19jaGlsZElz
UmVhZHkgPSBmYWxzZTsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OKDIsIDMxLCAwKSkKKyAg
ICBnX3RocmVhZF9jcmVhdGUodGVzdFNlcnZlck1vbml0b3JUaHJlYWRGdW5jLCAwLCBGQUxTRSwg
MCk7CisjZWxzZQorICAgIGdfdGhyZWFkX25ldygiVGVzdFNlcnZlck1vbml0b3IiLCB0ZXN0U2Vy
dmVyTW9uaXRvclRocmVhZEZ1bmMsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0
VGVzdFNlcnZlcigpCit7CisgICAgLy8gUHJlcGFyZSBhcmd2W10gZm9yIHNwYXduaW5nIHRoZSBz
ZXJ2ZXIgcHJvY2Vzcy4KKyAgICBHT3duUHRyPGNoYXI+IHRlc3RTZXJ2ZXJQYXRoKGdfYnVpbGRf
ZmlsZW5hbWUoV0VCS0lUX0VYRUNfUEFUSCwgIldlYktpdDJBUElUZXN0cyIsIHNfdGVzdFNlcnZl
ckFwcE5hbWUsIE5VTEwpKTsKKworICAgIC8vIE92ZXJ3cml0ZSBXRUJLSVRfSU5TUEVDVE9SX1NF
UlZFUiB2YXJpYWJsZSB3aXRoIGRlZmF1bHQgdmFsdWUuCisgICAgZ19zZXRlbnYoIldFQktJVF9J
TlNQRUNUT1JfU0VSVkVSIiwgIjEyNy4wLjAuMToyOTk5IiwgVFJVRSk7CisKKyAgICAvLyBXZSBp
bnN0YWxsIGEgaGFuZGxlciB0byBlbnN1cmUgdGhhdCB3ZSBraWxsIHRoZSBjaGlsZCBwcm9jZXNz
CisgICAgLy8gaWYgdGhlIHBhcmVudCBkaWVzIGJlY2F1c2Ugb2Ygd2hhdGV2ZXIgdGhlIHJlYXNv
biBpcy4KKyAgICBzaWduYWwoU0lHQUJSVCwgc2lnQWJvcnRIYW5kbGVyKTsKKworICAgIGNoYXIq
IHRlc3RTZXJ2ZXJBcmd2WzJdOworICAgIHRlc3RTZXJ2ZXJBcmd2WzBdID0gdGVzdFNlcnZlclBh
dGguZ2V0KCk7CisgICAgdGVzdFNlcnZlckFyZ3ZbMV0gPSAwOworCisgICAgLy8gU3Bhd24gdGhl
IHNlcnZlciwgZ2V0dGluZyBpdHMgc3Rkb3V0IGZpbGUgZGVzY3JpcHRvciB0byBzZXQgYQorICAg
IC8vIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc28gd2Uga25vdyB3aGVuIGl0J3MgcmVhZHkuCisg
ICAgaW50IGNoaWxkU3Rkb3V0ID0gMDsKKyAgICBnX2Fzc2VydChnX3NwYXduX2FzeW5jX3dpdGhf
cGlwZXMoMCwgdGVzdFNlcnZlckFyZ3YsIDAsIHN0YXRpY19jYXN0PEdTcGF3bkZsYWdzPigwKSwg
MCwgMCwKKyAgICAgICAgJnNfY2hpbGRQcm9jZXNzUGlkLCAwLCAmY2hpbGRTdGRvdXQsIDAsIDAp
KTsKKworICAgIC8vIFN0YXJ0IG1vbml0b3JpbmcgdGhlIHRlc3Qgc2VydmVyIChpbiBhIHNlcGFy
YXRlIHRocmVhZCkgdG8KKyAgICAvLyBlbnN1cmUgd2UgZG9uJ3QgYmxvY2sgb24gdGhlIGNoaWxk
IHByb2Nlc3MgbW9yZSB0aGFuIGEgdGltZW91dC4KKyAgICBzdGFydFRlc3RTZXJ2ZXJNb25pdG9y
KCk7CisKKyAgICBjaGFyIG1zZ1syXTsKKyAgICBHSU9DaGFubmVsKiBpb0NoYW5uZWwgPSBnX2lv
X2NoYW5uZWxfdW5peF9uZXcoY2hpbGRTdGRvdXQpOworICAgIGlmIChnX2lvX2NoYW5uZWxfcmVh
ZF9jaGFycyhpb0NoYW5uZWwsIG1zZywgMiwgMCwgMCkgPT0gR19JT19TVEFUVVNfTk9STUFMKSB7
CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlcnZlciBzZW50IGEgbWVzc2FnZSBzYXlp
bmcgaXQncyByZWFkeQorICAgICAgICAvLyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBnbG9iYWxseSwg
c28gdGhlIG1vbml0b3IgY2FuIHNlZSBpdC4KKyAgICAgICAgc19jaGlsZElzUmVhZHkgPSBtc2db
MF0gPT0gJ08nICYmIG1zZ1sxXSA9PSAnSyc7CisgICAgfQorICAgIGdfaW9fY2hhbm5lbF91bnJl
Zihpb0NoYW5uZWwpOworICAgIGNsb3NlKGNoaWxkU3Rkb3V0KTsKKworICAgIC8vIFRoZSB0aW1l
b3V0IHdhcyByZWFjaGVkIGFuZCB0aGUgc2VydmVyIGlzIG5vdCByZWFkeSB5ZXQsIHNvCisgICAg
Ly8gc3RvcCBpdCBpbm1lZGlhdGVseSwgYW5kIGxldCB0aGUgdW5pdCB0ZXN0cyBmYWlsLgorICAg
IGlmICghc19jaGlsZElzUmVhZHkpCisgICAgICAgIHN0b3BUZXN0U2VydmVyKCk7Cit9CisKK2Ns
YXNzIEluc3BlY3RvclNlcnZlclRlc3Q6IHB1YmxpYyBXZWJWaWV3VGVzdCB7CitwdWJsaWM6Cisg
ICAgTUFLRV9HTElCX1RFU1RfRklYVFVSRShJbnNwZWN0b3JTZXJ2ZXJUZXN0KTsKKworICAgIElu
c3BlY3RvclNlcnZlclRlc3QoKQorICAgICAgICA6IFdlYlZpZXdUZXN0KCkKKyAgICB7CisgICAg
fQorCisgICAgYm9vbCBnZXRQYWdlTGlzdCgpCisgICAgeworICAgICAgICBsb2FkSHRtbCgiPHNj
cmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iCisgICAgICAgICAgICAidmFyIHBhZ2Vz
O1xuIgorICAgICAgICAgICAgInZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4iCisgICAg
ICAgICAgICAieGhyLm9wZW4oXCJHRVRcIiwgXCIvcGFnZWxpc3QuanNvblwiKTtcbiIKKyAgICAg
ICAgICAgICJ4aHIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuIgorICAgICAgICAgICAgICAgICJp
ZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgInBhZ2VzID0g
SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiIKKyAgICAgICAgICAgICAgICAgICAgImRv
Y3VtZW50LnRpdGxlID0gXCJPS1wiO1xuIgorICAgICAgICAgICAgICAgICJ9IGVsc2UgXG4iCisg
ICAgICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwiRkFJTFwiO1xuIgorICAgICAg
ICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAieGhyLnNlbmQoKTtcbiIKKyAgICAgICAgICAg
ICI8L3NjcmlwdD5cbiIsCisgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOwor
CisgICAgICAgIHdhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisgICAgICAgIGlmICghc3RyY21w
KHdlYmtpdF93ZWJfdmlld19nZXRfdGl0bGUobV93ZWJWaWV3KSwgIk9LIikpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgfklu
c3BlY3RvclNlcnZlclRlc3QoKQorICAgIHsKKyAgICB9Cit9OworCisvLyBUZXN0IHRvIGdldCBp
bnNwZWN0b3Igc2VydmVyIHBhZ2UgbGlzdCBmcm9tIHRoZSB0ZXN0IHNlcnZlci4KKy8vIFNob3Vs
ZCBjb250YWluIG9ubHkgb25lIGVudHJ5IHBvaW50aW5nIHRvIGh0dHA6Ly8xMjcuMC4wLjE6Mjk5
OS93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0xCitzdGF0aWMgdm9pZCB0ZXN0SW5z
cGVjdG9yU2VydmVyUGFnZUxpc3QoSW5zcGVjdG9yU2VydmVyVGVzdCogdGVzdCwgZ2NvbnN0cG9p
bnRlcikKK3sKKyAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisKKyAgICB0ZXN0LT5zaG93SW5X
aW5kb3dBbmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgICAgZ19hc3Nl
cnQodGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAgICBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0KiBq
YXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVk
KCJwYWdlcy5sZW5ndGg7IiwgJmVycm9yLm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2Ny
aXB0UmVzdWx0KTsKKyAgICBnX2Fzc2VydCghZXJyb3IuZ2V0KCkpOworICAgIGdfYXNzZXJ0X2Nt
cGludChXZWJWaWV3VGVzdDo6amF2YXNjcmlwdFJlc3VsdFRvTnVtYmVyKGphdmFzY3JpcHRSZXN1
bHQpLCA9PSwgMSk7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlw
dEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pZDsiLCAmZXJyb3Iub3V0UHRyKCkpOwor
ICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQo
KSk7CisgICAgaW50IHBhZ2VJZCA9IFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9OdW1i
ZXIoamF2YXNjcmlwdFJlc3VsdCk7CisKKyAgICBHT3duUHRyPGNoYXI+IHZhbHVlU3RyaW5nOwor
ICAgIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVudGlsRmlu
aXNoZWQoInBhZ2VzWzBdLnVybDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGph
dmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgdmFsdWVT
dHJpbmcuc2V0KFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9DU3RyaW5nKGphdmFzY3Jp
cHRSZXN1bHQpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVTdHJpbmcuZ2V0KCksID09LCAi
aHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisgICAgamF2YXNjcmlwdFJlc3VsdCA9IHRlc3Qt
PnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFnZXNbMF0uaW5zcGVjdG9yVXJs
OyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2YXNjcmlwdFJlc3VsdCk7Cisg
ICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0cmluZy5zZXQoV2ViVmlld1Rl
c3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3VsdCkpOworICAgIFN0
cmluZyB2YWxpZEluc3BlY3RvclVSTCA9IFN0cmluZygiL3dlYmluc3BlY3Rvci9pbnNwZWN0b3Iu
aHRtbD9wYWdlPSIpICsgU3RyaW5nOjpudW1iZXIocGFnZUlkKTsKKyAgICBnX2Fzc2VydF9jbXBz
dHIodmFsdWVTdHJpbmcuZ2V0KCksID09LCB2YWxpZEluc3BlY3RvclVSTC5sYXRpbjEoKS5kYXRh
KCkpOworfQorCisvLyBUZXN0IHNlbmRpbmcgYSByYXcgcmVtb3RlIGRlYnVnZ2luZyBtZXNzYWdl
IHRocm91Z2ggb3VyIHdlYiBzb2NrZXQgc2VydmVyLgorLy8gRm9yIHRoaXMgc3BlY2lmaWMgbWVz
c2FnZSBzZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vY2hyb21lL2RldnRvb2xzL2RvY3MvcHJv
dG9jb2wvdG90L3J1bnRpbWUuaHRtbCNjb21tYW5kLWV2YWx1YXRlCitzdGF0aWMgdm9pZCB0ZXN0
UmVtb3RlRGVidWdnaW5nTWVzc2FnZShJbnNwZWN0b3JTZXJ2ZXJUZXN0KiB0ZXN0LCBnY29uc3Rw
b2ludGVyKQoreworICAgIHRlc3QtPnNob3dJbldpbmRvd0FuZFdhaXRVbnRpbE1hcHBlZChHVEtf
V0lORE9XX1RPUExFVkVMKTsKKworICAgIHRlc3QtPmxvYWRIdG1sKCI8c2NyaXB0IHR5cGU9XCJ0
ZXh0L2phdmFzY3JpcHRcIj5cbiIKKyAgICAgICAgInZhciBzb2NrZXQgPSBuZXcgV2ViU29ja2V0
KCd3czovLzEyNy4wLjAuMToyOTk5L2RldnRvb2xzL3BhZ2UvMScpO1xuIgorICAgICAgICAic29j
a2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiIKKyAgICAgICAgICAgICJ2YXIg
cmVzcG9uc2UgPSBKU09OLnBhcnNlKG1lc3NhZ2UuZGF0YSk7XG4iCisgICAgICAgICAgICAiaWYg
KHJlc3BvbnNlLmlkID09PSAxKVxuIgorICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9
IHJlc3BvbnNlLnJlc3VsdC5yZXN1bHQudmFsdWU7XG4iCisgICAgICAgICAgICAiZWxzZVxuIgor
ICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwiRkFJTFwiO1xuIgorICAgICAgICAg
ICAgIn1cbiIKKyAgICAgICAgICAgICJzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKSB7XG4iCisg
ICAgICAgICAgICAic29ja2V0LnNlbmQoJ3tcImlkXCI6IDEsIFwibWV0aG9kXCI6IFwiUnVudGlt
ZS5ldmFsdWF0ZVwiLCBcInBhcmFtc1wiOiB7XCJleHByZXNzaW9uXCI6IFwiMiArIDJcIiB9IH0n
KTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIjwvc2NyaXB0PiIsCisgICAgICAgICJodHRw
Oi8vMTI3LjAuMC4xOjI5OTkvIik7CisgICAgdGVzdC0+d2FpdFVudGlsVGl0bGVDaGFuZ2VkKCk7
CisKKyAgICBnX2Fzc2VydF9jbXBzdHIod2Via2l0X3dlYl92aWV3X2dldF90aXRsZSh0ZXN0LT5t
X3dlYlZpZXcpLCA9PSwgIjQiKTsKK30KKworc3RhdGljIHZvaWQgb3BlblJlbW90ZURlYnVnZ2lu
Z1Nlc3Npb24oSW5zcGVjdG9yU2VydmVyVGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAg
ICAvLyBUbyB0ZXN0IHRoZSB3aG9sZSBwaXBlbGluZSB0aGlzIGV4cGxvaXRzIGEgYmVoYXZpb3Ig
b2YgdGhlIGluc3BlY3RvciBmcm9udC1lbmQgd2hpY2ggd29uJ3QgcHJvdmlkZSBhbnkgdGl0bGUg
dW5sZXNzIHRoZQorICAgIC8vIGRlYnVnZ2luZyBzZXNzaW9uIHdhcyBlc3RhYmxpc2hlZCBjb3Jy
ZWN0bHkgdGhyb3VnaCB3ZWIgc29ja2V0LiBJdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgIldl
YiBJbnNwZWN0b3IgLSA8UGFnZSBVUkw+Ii4KKyAgICAvLyBJbiBvdXIgY2FzZSBwYWdlIFVSTCBz
aG91bGQgYmUgaHR0cDovLzEyNy4wLjAuMToyOTk5LworICAgIC8vIFNvIHRoaXMgdGVzdCBjYXNl
IHdpbGwgZmFpbCBpZjoKKyAgICAvLyAtIFRoZSBwYWdlIGxpc3QgZGlkbid0IHJldHVybiBhIHZh
bGlkIGluc3BlY3RvciBVUkwKKyAgICAvLyAtIE9yIHRoZSBmcm9udC1lbmQgY291bGRuJ3QgYmUg
bG9hZGVkIHRocm91Z2ggdGhlIGluc3BlY3RvciBIVFRQIHNlcnZlcgorICAgIC8vIC0gT3IgdGhl
IHdlYiBzb2NrZXQgY29ubmVjdGlvbiBjb3VsZG4ndCBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIHRo
ZSBmcm9udC1lbmQgYW5kIHRoZSBwYWdlIHRocm91Z2ggdGhlIGluc3BlY3RvciBzZXJ2ZXIKKyAg
ICAvLyBMZXQncyBzZWUgaWYgdGhpcyB0ZXN0IGlzbid0IHJhaXNpbmcgdG9vIG1hbnkgZmFsc2Ug
cG9zaXRpdmVzLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCB1c2UgYSBiZXR0ZXIgcHJlZGljYXRl
IGlmIGF2YWlsYWJsZS4KKworICAgIHRlc3QtPnNob3dJbldpbmRvd0FuZFdhaXRVbnRpbE1hcHBl
ZChHVEtfV0lORE9XX1RPUExFVkVMKTsKKworICAgIGdfYXNzZXJ0KHRlc3QtPmdldFBhZ2VMaXN0
KCkpOworCisgICAgR093blB0cjxHRXJyb3I+IGVycm9yOworICAgIFdlYktpdEphdmFzY3JpcHRS
ZXN1bHQqIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVudGls
RmluaXNoZWQoInBhZ2VzWzBdLmluc3BlY3RvclVybDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAg
IGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7
CisKKyAgICBTdHJpbmcgcmVzb2x2ZWRVUkwgPSBTdHJpbmcoImh0dHA6Ly8xMjcuMC4wLjE6Mjk5
OS8iKSArIFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9DU3RyaW5nKGphdmFzY3JpcHRS
ZXN1bHQpOworICAgIHRlc3QtPmxvYWRVUkkocmVzb2x2ZWRVUkwubGF0aW4xKCkuZGF0YSgpKTsK
KyAgICB0ZXN0LT53YWl0VW50aWxUaXRsZUNoYW5nZWQoKTsKKworICAgIGdfYXNzZXJ0X2NtcHN0
cih3ZWJraXRfd2ViX3ZpZXdfZ2V0X3RpdGxlKHRlc3QtPm1fd2ViVmlldyksID09LCAiV2ViIElu
c3BlY3RvciAtIGh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8iKTsKK30KKworCit2b2lkIGJlZm9yZUFs
bCgpCit7CisgICAgc3RhcnRUZXN0U2VydmVyKCk7CisgICAgSW5zcGVjdG9yU2VydmVyVGVzdDo6
YWRkKCJXZWJLaXRXZWJJbnNwZWN0b3JTZXJ2ZXIiLCAidGVzdC1wYWdlLWxpc3QiLCB0ZXN0SW5z
cGVjdG9yU2VydmVyUGFnZUxpc3QpOworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2Vi
S2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3QtcmVtb3RlLWRlYnVnZ2luZy1tZXNzYWdlIiwg
dGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UpOworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFk
ZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3Qtb3Blbi1kZWJ1Z2dpbmctc2Vzc2lv
biIsIG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKTsKKworfQorCit2b2lkIGFmdGVyQWxsKCkK
K3sKKyAgICBzdG9wVGVzdFNlcnZlcigpOworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZl
ci5oCShyZXZpc2lvbiAxMzA2MjcpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVj
dG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3ICs2
MSw3IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGRpZENsb3NlV2ViU29ja2V0Q29ubmVj
dGlvbihXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKik7CiAKICAgICBib29sIHBsYXRmb3JtUmVz
b3VyY2VGb3JQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJp
bmcmIGNvbnRlbnRUeXBlKTsKLSNpZiBQTEFURk9STShRVCkKKyNpZiAoUExBVEZPUk0oUVQpIHx8
IFBMQVRGT1JNKEdUSykpCiAgICAgdm9pZCBidWlsZFBhZ2VMaXN0KFZlY3RvcjxjaGFyPiYgZGF0
YSwgU3RyaW5nJiBjb250ZW50VHlwZSk7CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZl
ci5oCShyZXZpc2lvbiAxMzA2MjcpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVj
dG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw5
IEBACiBuYW1lc3BhY2UgV2ViS2l0IHsKIGNsYXNzIFF0VGNwU2VydmVySGFuZGxlcjsKIH0KKyNl
bGlmIFBMQVRGT1JNKEdUSykKKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8d3RmL2dv
YmplY3QvR1JlZlB0ci5oPgogI2VuZGlmCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTc4LDYg
KzgxLDggQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBzaG9ydCBtX3BvcnQ7CiAjaWYgUExBVEZP
Uk0oUVQpCiAgICAgT3duUHRyPFF0VGNwU2VydmVySGFuZGxlcj4gbV90Y3BTZXJ2ZXJIYW5kbGVy
OworI2VsaWYgUExBVEZPUk0oR1RLKQorICAgIEdSZWZQdHI8R1NvY2tldFNlcnZpY2U+IG1fc29j
a2V0U2VydmljZTsKICNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25u
ZWN0aW9uOwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
LmNwcAkocmV2aXNpb24gMTMwNjI3KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNTAsNiArNTAsNyBAQCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2
CiAgICAgLCBtX21vZGUoSFRUUCkKICAgICAsIG1fc2VydmVyKHNlcnZlcikKICAgICAsIG1fY2xp
ZW50KGNsaWVudCkKKyAgICAsIG1fc2h1dGRvd25BZnRlclNlbmQoZmFsc2UpCiB7CiB9CiAKQEAg
LTcwLDE2ICs3MSwxNSBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3du
CiAgICAgICAgIHJldHVybjsKICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBzb2NrZXQg
PSBtX3NvY2tldC5yZWxlYXNlKCk7CiAgICAgc29ja2V0LT5jbG9zZSgpOworICAgIG1fc2h1dGRv
d25BZnRlclNlbmQgPSBmYWxzZTsKIH0KIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
OjpzaHV0ZG93bkFmdGVyU2VuZE9yTm93KCkKIHsKLSAgICAvLyBJZiB0aGlzIEFTU0VSVCBoYXBw
ZW5zIG9uIGFueSBwbGF0Zm9ybSB0aGVuIHRoZWlyIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZAot
ICAgIC8vIGZvbGxvd2VkIGJ5IGEgU29ja2V0U3RyZWFtSGFuZGxlOjpjbG9zZSBpcyBub3QgZ3Vh
cmVudGVlZCB0byBoYXZlIHNlbnQgYWxsCi0gICAgLy8gZGF0YS4gSWYgdGhpcyBoYXBwZW5zLCB3
ZSBuZWVkIHRvIHNsaWdodGx5IGNoYW5nZSB0aGUgZGVzaWduIHRvIGluY2x1ZGUgYQotICAgIC8v
IFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDo6ZGlkU2VuZCwgaGFuZGxlIGl0IGhlcmUsIGFuZCBh
ZGQgYW4gbV9zaHV0ZG93bkFmdGVyU2VuZAotICAgIC8vIHN0YXRlIG9uIHRoaXMgV2ViU29ja2V0
U2VydmVyQ29ubmVjdGlvbi4KLSAgICBBU1NFUlQoIW1fc29ja2V0LT5idWZmZXJlZEFtb3VudCgp
KTsKKyAgICBpZiAobV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpIHsKKyAgICAgICAgbV9zaHV0
ZG93bkFmdGVyU2VuZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaHV0
ZG93bk5vdygpOwogfQpAQCAtMTI0LDYgKzEyNCw5IEBAIHZvaWQgV2ViU29ja2V0U2VydmVyQ29u
bmVjdGlvbjo6c2VuZFJhd0QKIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRD
bG9zZVNvY2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqKQogeworICAgIC8vIERlc3Ryb3kg
dGhlIFNvY2tldFN0cmVhbUhhbmRsZSBub3cgdG8gcHJldmVudCBjbG9zaW5nIGFuIGFscmVhZHkg
Y2xvc2VkIHNvY2tldCBsYXRlci4KKyAgICBtX3NvY2tldC5jbGVhcigpOworCiAgICAgLy8gV2Vi
IFNvY2tldCBNb2RlLgogICAgIGlmIChtX21vZGUgPT0gV2ViU29ja2V0KQogICAgICAgICBtX2Ns
aWVudC0+ZGlkQ2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMpOwpAQCAtMTUxLDYgKzE1NCwx
MiBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFJlY2VpCiAgICAgfQogfQog
Cit2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50
KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSosIHNpemVfdCkKK3sKKyAgICBpZiAobV9zaHV0
ZG93bkFmdGVyU2VuZCAmJiAhbV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpCisgICAgICAgIHNo
dXRkb3duTm93KCk7Cit9CisKIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkRmFp
bFNvY2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBTb2NrZXRTdHJlYW1FcnJv
ciYpCiB7CiAgICAgLy8gUG9zc2libGUgcmVhZCBvciB3cml0ZSBlcnJvci4KSW5kZXg6IFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVj
dGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oCShyZXZpc2lvbiAxMzA2MjcpCisrKyBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNv
bm5lY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQCBwdWJsaWM6CiAgICAg
Ly8gU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50IGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwg
dm9pZCBkaWRDbG9zZVNvY2tldFN0cmVhbShXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUqKTsK
ICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoV2ViQ29yZTo6U29j
a2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCk7CisgICAgdmly
dHVhbCB2b2lkIGRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZSosIHNpemVfdCBidWZmZXJlZEFtb3VudCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWxT
b2NrZXRTdHJlYW0oV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgV2ViQ29yZTo6
U29ja2V0U3RyZWFtRXJyb3ImKTsKIAogcHJpdmF0ZToKQEAgLTg2LDYgKzg3LDcgQEAgcHJvdGVj
dGVkOgogICAgIFJlZlB0cjxXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU+IG1fc29ja2V0Owog
ICAgIFdlYlNvY2tldFNlcnZlciogbV9zZXJ2ZXI7CiAgICAgV2ViU29ja2V0U2VydmVyQ2xpZW50
KiBtX2NsaWVudDsKKyAgICBib29sIG1fc2h1dGRvd25BZnRlclNlbmQ7CiB9OwogCiB9CkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNw
ZWN0b3JQYWdlSW5kZXguaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJv
bnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMx
IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFkPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2ph
dmFzY3JpcHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxpc3QoKSB7CisgICAgdmFyIHhociA9IG5l
dyBYTUxIdHRwUmVxdWVzdDsKKyAgICB4aHIub3BlbigiR0VUIiwgIi9wYWdlbGlzdC5qc29uIik7
CisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKHhoci5zdGF0dXMg
PT0gMjAwKSB7CisgICAgICAgICAgICB2YXIgcGFnZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25z
ZVRleHQpOworICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90aWNlIikuc3R5bGUuZGlzcGxheSA9ICJu
b25lIjsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFnZXMpIHsKKyAgICAgICAgICAgICAg
ICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgICAgICAg
ICB2YXIgdGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBhZ2VzW2ldLnRpdGxlIDogKCJQYWdlICIg
KyAoTnVtYmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAgICAgICAgICAgIHZhciB1cmwgPSBwYWdl
c1tpXS51cmw7CisgICAgICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh
dGVUZXh0Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiArIHVybCArICJdIikgOiAiIiApKSk7Cisg
ICAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCBwYWdlc1tpXS5pbnNwZWN0
b3JVcmwpOworICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7
CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAg
eGhyLnNlbmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExv
YWRlZCIsIGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8L3NjcmlwdD4KKzwvaGVhZD48Ym9keT4K
KzxoMT5JbnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgorPHAgaWQ9Im5vUGFnZU5vdGljZSIgc3R5
bGU9ImNvbG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHNldCB0
aGUgZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJlbmNlIHByb3BlcnR5IG9uIHlvdXIgV2Vi
Vmlldy48L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNw
ZWN0b3JTZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5n
IEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5oIgorCisj
aW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclByb3h5LmgiCisj
aW5jbHVkZSAiV2ViUGFnZVByb3h5LmgiCisjaW5jbHVkZSA8V2ViQ29yZS9NSU1FVHlwZVJlZ2lz
dHJ5Lmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRl
IDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK2Jvb2wgV2ViSW5zcGVjdG9yU2VydmVyOjpwbGF0Zm9ybVJlc291cmNlRm9yUGF0aChjb25z
dCBTdHJpbmcmIHBhdGgsIFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBjb250ZW50VHlwZSkK
K3sKKyAgICAvLyBUaGUgcGFnZSBsaXN0IGNvbnRhaW5zIGFuIHVuZm9ybWF0ZWQgbGlzdCBvZiBw
YWdlcyB0aGF0IGNhbiBiZSBpbnNwZWN0ZWQgd2l0aCBhIGxpbmsgdG8gb3BlbiBhIHNlc3Npb24u
CisgICAgaWYgKHBhdGggPT0gIi9wYWdlbGlzdC5qc29uIikgeworICAgICAgICBidWlsZFBhZ2VM
aXN0KGRhdGEsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgLy8gUG9pbnQgdGhlIGRlZmF1bHQgcGF0aCB0byBhIGZvcm1hdHRlZCBwYWdlIHRoYXQgcXVl
cmllcyB0aGUgcGFnZSBsaXN0IGFuZCBkaXNwbGF5IHRoZW0uCisgICAgQ1N0cmluZyBsb2NhbFBh
dGggPSBXZWJDb3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oU3RyaW5nKFdlYkNvcmU6OnNo
YXJlZFJlc291cmNlc1BhdGgoKS5kYXRhKCkpICsgKChwYXRoID09ICIvIikgPyAiL3dlYmluc3Bl
Y3Rvci9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbCIgOiBwYXRoKSk7CisgICAgaWYgKGxvY2FsUGF0
aC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR1JlZlB0cjxHRmlsZT4g
ZmlsZSA9IGFkb3B0R1JlZihnX2ZpbGVfbmV3X2Zvcl9wYXRoKGxvY2FsUGF0aC5kYXRhKCkpKTsK
KyAgICBHUmVmUHRyPEdGaWxlSW5mbz4gZmlsZUluZm8gPSBhZG9wdEdSZWYoZ19maWxlX3F1ZXJ5
X2luZm8oZmlsZS5nZXQoKSwgR19GSUxFX0FUVFJJQlVURV9TVEFOREFSRF9TSVpFIiwiR19GSUxF
X0FUVFJJQlVURV9TVEFOREFSRF9GQVNUX0NPTlRFTlRfVFlQRSwgR19GSUxFX1FVRVJZX0lORk9f
Tk9ORSwgMCwgMCkpOworICAgIGlmICghZmlsZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIEdSZWZQdHI8R0ZpbGVJbnB1dFN0cmVhbT4gaW5wdXRTdHJlYW0gPSBhZG9wdEdSZWYo
Z19maWxlX3JlYWQoZmlsZS5nZXQoKSwgMCwgMCkpOworICAgIGlmICghaW5wdXRTdHJlYW0pCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRhdGEuZ3JvdyhnX2ZpbGVfaW5mb19nZXRfc2l6
ZShmaWxlSW5mby5nZXQoKSkpOworICAgIGlmICghZ19pbnB1dF9zdHJlYW1fcmVhZF9hbGwoR19J
TlBVVF9TVFJFQU0oaW5wdXRTdHJlYW0uZ2V0KCkpLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCks
IDAsIDAsIDApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb250ZW50VHlwZSA9IEdP
d25QdHI8Z2NoYXI+KGdfZmlsZV9pbmZvX2dldF9hdHRyaWJ1dGVfYXNfc3RyaW5nKGZpbGVJbmZv
LmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX0ZBU1RfQ09OVEVOVF9UWVBFKSkuZ2V0
KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV2ViSW5zcGVjdG9yU2VydmVyOjpidWls
ZFBhZ2VMaXN0KFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBjb250ZW50VHlwZSkKK3sKKyAg
ICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCJbICIp
OworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgZW5kID0gbV9jbGllbnRNYXAuZW5kKCk7CisgICAg
Zm9yIChDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jbGllbnRNYXAuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgIFdlYlBhZ2VQcm94eSogd2ViUGFnZSA9IGl0LT52YWx1ZS0+
cGFnZSgpOworICAgICAgICBpZiAoaXQgIT0gbV9jbGllbnRNYXAuYmVnaW4oKSkKKyAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kTGl0ZXJhbCgiLCAiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmRM
aXRlcmFsKCJ7IFwiaWRcIjogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTnVtYmVyKGl0LT5r
ZXkpOworICAgICAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIiwgXCJ0aXRsZVwiOiBcIiIpOwor
ICAgICAgICBidWlsZGVyLmFwcGVuZCh3ZWJQYWdlLT5wYWdlVGl0bGUoKSk7CisgICAgICAgIGJ1
aWxkZXIuYXBwZW5kTGl0ZXJhbCgiXCIsIFwidXJsXCI6IFwiIik7CisgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKHdlYlBhZ2UtPmFjdGl2ZVVSTCgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmRMaXRl
cmFsKCJcIiwgXCJpbnNwZWN0b3JVcmxcIjogXCIiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmRM
aXRlcmFsKCIvd2ViaW5zcGVjdG9yL2luc3BlY3Rvci5odG1sP3BhZ2U9Iik7CisgICAgICAgIGJ1
aWxkZXIuYXBwZW5kTnVtYmVyKGl0LT5rZXkpOworICAgICAgICBidWlsZGVyLmFwcGVuZExpdGVy
YWwoIlwiIH0iKTsKKyAgICB9CisgICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCIgXSIpOworICAg
IENTdHJpbmcgY3N0ciA9IGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCk7CisgICAgZGF0YS5hcHBl
bmQoY3N0ci5kYXRhKCksIGNzdHIubGVuZ3RoKCkpOworICAgIGNvbnRlbnRUeXBlID0gImFwcGxp
Y2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiOworfQorCit9CkluZGV4OiBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3Rr
L1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1
bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIpCisjaW5j
bHVkZSAiV2ViU29ja2V0U2VydmVyLmgiCisKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVk
ZSAiV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgPFdlYkNvcmUvU29ja2V0
U3RyZWFtSGFuZGxlLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4K
KyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dPd25Q
dHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBX
ZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGljIGdib29sZWFuIGNvbm5lY3Rp
b25DYWxsYmFjayhHU29ja2V0U2VydmljZSogc2VydmljZSwgR1NvY2tldENvbm5lY3Rpb24qIGNv
bm5lY3Rpb24sIEdPYmplY3QqIHNvdXJjZU9iamVjdCwgV2ViU29ja2V0U2VydmVyKiBzZXJ2ZXIp
Cit7CisjaWZuZGVmIExPR19ESVNBQkxFRAorICAgIEdSZWZQdHI8R1NvY2tldEFkZHJlc3M+IHNv
Y2tldEFkZHJlc3MgPSBhZG9wdEdSZWYoZ19zb2NrZXRfY29ubmVjdGlvbl9nZXRfcmVtb3RlX2Fk
ZHJlc3MoY29ubmVjdGlvbiwgMCkpOworICAgIEdPd25QdHI8Z2NoYXI+IGFkZHJlc3NTdHIoZ19p
bmV0X2FkZHJlc3NfdG9fc3RyaW5nKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyhH
X0lORVRfU09DS0VUX0FERFJFU1Moc29ja2V0QWRkcmVzcy5nZXQoKSkpKSk7CisgICAgTE9HKE5l
dHdvcmssICJOZXcgQ29ubmVjdGlvbiBmcm9tICVzOiVkLiIsIGFkZHJlc3NTdHIuZ2V0KCksIGdf
aW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydChHX0lORVRfU09DS0VUX0FERFJFU1Moc29ja2V0
QWRkcmVzcy5nZXQoKSkpKTsKKyNlbmRpZgorCisgICAgT3duUHRyPFdlYlNvY2tldFNlcnZlckNv
bm5lY3Rpb24+IHdlYlNvY2tldENvbm5lY3Rpb24gPSBhZG9wdFB0cihuZXcgV2ViU29ja2V0U2Vy
dmVyQ29ubmVjdGlvbihzZXJ2ZXItPmNsaWVudCgpLCBzZXJ2ZXIpKTsKKyAgICB3ZWJTb2NrZXRD
b25uZWN0aW9uLT5zZXRTb2NrZXRIYW5kbGUoU29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGUoY29u
bmVjdGlvbiwgd2ViU29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpOworICAgIHNlcnZlci0+ZGlkQWNj
ZXB0Q29ubmVjdGlvbih3ZWJTb2NrZXRDb25uZWN0aW9uLnJlbGVhc2UoKSk7CisKKyAgICByZXR1
cm4gVFJVRTsKK30gCisKK3ZvaWQgV2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUluaXRpYWxpemUo
KQoreworICAgIG1fc29ja2V0U2VydmljZSA9IGFkb3B0R1JlZihnX3NvY2tldF9zZXJ2aWNlX25l
dygpKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KG1fc29ja2V0U2VydmljZS5nZXQoKSwgImluY29t
aW5nIiwgR19DQUxMQkFDSyhjb25uZWN0aW9uQ2FsbGJhY2spLCB0aGlzKTsKKyAgICBnX3NvY2tl
dF9zZXJ2aWNlX3N0YXJ0KG1fc29ja2V0U2VydmljZS5nZXQoKSk7Cit9CisKK2Jvb2wgV2ViU29j
a2V0U2VydmVyOjpwbGF0Zm9ybUxpc3Rlbihjb25zdCBTdHJpbmcmIGJpbmRBZGRyZXNzLCB1bnNp
Z25lZCBzaG9ydCBwb3J0KQoreworI2lmbmRlZiBMT0dfRElTQUJMRUQKKyAgICBMT0coTmV0d29y
aywgIkxpc3RlbiB0byBhZGRyZXNzPSVzLCBwb3J0PSVkLiIsIGJpbmRBZGRyZXNzLnV0ZjgoKS5k
YXRhKCksIHBvcnQpOworI2VuZGlmCisgICAgR1JlZlB0cjxHSW5ldEFkZHJlc3M+IGFkZHJlc3Mg
PSBhZG9wdEdSZWYoZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGJpbmRBZGRyZXNzLnV0
ZjgoKS5kYXRhKCkpKTsKKyAgICBHUmVmUHRyPEdTb2NrZXRBZGRyZXNzPiBzb2NrZXRBZGRyZXNz
ID0gYWRvcHRHUmVmKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcoYWRkcmVzcy5nZXQoKSwgcG9y
dCkpOworICAgIHJldHVybiBnX3NvY2tldF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9M
SVNURU5FUihtX3NvY2tldFNlcnZpY2UuZ2V0KCkpLCBzb2NrZXRBZGRyZXNzLmdldCgpLCBHX1NP
Q0tFVF9UWVBFX1NUUkVBTSwgR19TT0NLRVRfUFJPVE9DT0xfVENQLCAwLCAwLCAwKTsKK30KKwor
dm9pZCBXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UoKQoreworICAgIGdfc29ja2V0X3Nl
cnZpY2Vfc3RvcChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBF
TkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9n
dGsvV2ViQ29udGV4dEd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL2d0ay9XZWJDb250ZXh0R3RrLmNwcAkocmV2aXNpb24gMTMwNjI3KQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL2d0ay9XZWJDb250ZXh0R3RrLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEwIE1vdG9yb2xhIE1v
YmlsaXR5LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEy
IFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNiwxMSArMjcsNDMgQEAKIAogI2luY2x1ZGUgImNv
bmZpZy5oIgogI2luY2x1ZGUgIldlYkNvbnRleHQuaCIKKworI2luY2x1ZGUgIldlYkluc3BlY3Rv
clNlcnZlci5oIgogI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgogI2luY2x1ZGUgPHd0
Zi9nb2JqZWN0L0dPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5h
bWVzcGFjZSBXZWJLaXQgewogCitzdGF0aWMgdm9pZCBpbml0SW5zcGVjdG9yU2VydmVyKCkKK3sK
KyNpZiBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXpl
ZCA9IGZhbHNlOworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIFN0cmluZyBlbnZTdHIoZ19nZXRlbnYoIldFQktJVF9J
TlNQRUNUT1JfU0VSVkVSIikpOworCisgICAgaWYgKCFlbnZTdHIuaXNOdWxsKCkpIHsKKyAgICAg
ICAgU3RyaW5nIGJpbmRBZGRyZXNzID0gIjEyNy4wLjAuMSI7CisgICAgICAgIHVuc2lnbmVkIHNo
b3J0IHBvcnQgPSAyOTk5OworCisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHJlc3VsdDsKKyAgICAg
ICAgZW52U3RyLnNwbGl0KCI6IiwgcmVzdWx0KTsKKworICAgICAgICBpZiAocmVzdWx0LnNpemUo
KSA9PSAyKSB7CisgICAgICAgICAgICBiaW5kQWRkcmVzcyA9IHJlc3VsdFswXTsKKyAgICAgICAg
ICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIHBvcnQgPSByZXN1bHRbMV0udG9JbnQo
Jm9rKTsKKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgcG9ydCA9IDI5OTk7
CisgICAgICAgIH0KKyAgICAgICAgV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5saXN0ZW4o
YmluZEFkZHJlc3MsIHBvcnQpOworICAgIH0KKyNlbmRpZgorfQorCiBXVEY6OlN0cmluZyBXZWJD
b250ZXh0OjphcHBsaWNhdGlvbkNhY2hlRGlyZWN0b3J5KCkKIHsKICAgICBHT3duUHRyPGdjaGFy
PiBjYWNoZURpcmVjdG9yeShnX2J1aWxkX2ZpbGVuYW1lKGdfZ2V0X3VzZXJfY2FjaGVfZGlyKCks
ICJ3ZWJraXRndGsiLCAiYXBwbGljYXRpb25zIiwgTlVMTCkpOwpAQCAtMzksNiArNzIsNyBAQCBX
VEY6OlN0cmluZyBXZWJDb250ZXh0OjphcHBsaWNhdGlvbkNhY2hlCiAKIHZvaWQgV2ViQ29udGV4
dDo6cGxhdGZvcm1Jbml0aWFsaXplV2ViUHJvY2VzcyhXZWJQcm9jZXNzQ3JlYXRpb25QYXJhbWV0
ZXJzJikKIHsKKyAgICBpbml0SW5zcGVjdG9yU2VydmVyKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4
dDo6cGxhdGZvcm1JbnZhbGlkYXRlQ29udGV4dCgpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>169656</attachid>
            <date>2012-10-19 11:18:17 -0700</date>
            <delta_ts>2012-11-09 10:29:29 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20121019191721.patch</filename>
            <type>text/plain</type>
            <size>49657</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMTkyMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTEwLTE5ICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5k
bGUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVT
b3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0
U3RyZWFtSGFuZGxlOjpjb25uZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpwbGF0Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlOjpwbGF0Zm9ybUNsb3NlKToKKwogMjAxMi0xMC0xOSAgTmF0ZSBDaGFwaW4gIDxqYXBoZXRA
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJlb3JkZXIgc29tZSBmdW5jdGlvbnMgaW4gU3VicmVz
b3VyY2VMb2FkZXIgdG8gcGVybWl0IG1haW4gcmVzb3VyY2VzCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRs
ZS5oCShyZXZpc2lvbiAxMzE5MDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBA
CiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJp
Z2h0cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ2
LDYgKzQ3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIFNvY2tldFN0cmVhbUhh
bmRsZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT4sIHB1YmxpYyBTb2Nr
ZXRTdHJlYW1IYW5kbGVCYXNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFNvY2tldFN0cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IEtVUkwmIHVybCwgU29ja2V0U3Ry
ZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBTb2NrZXRTdHJl
YW1IYW5kbGUodXJsLCBjbGllbnQpKTsgfQorICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTb2Nr
ZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShHU29ja2V0Q29ubmVjdGlvbiogc29ja2V0Q29ubmVjdGlv
biwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpIHsgcmV0dXJuIGFkb3B0UmVmKG5l
dyBTb2NrZXRTdHJlYW1IYW5kbGUoc29ja2V0Q29ubmVjdGlvbiwgY2xpZW50KSk7IH0KIAogICAg
ICAgICB2aXJ0dWFsIH5Tb2NrZXRTdHJlYW1IYW5kbGUoKTsKICAgICAgICAgdm9pZCBjb25uZWN0
ZWQoR1NvY2tldENvbm5lY3Rpb24qLCBHRXJyb3IqKTsKQEAgLTY2LDYgKzY4LDcgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkKiBtX2lkOwogCiAgICAgICAgIFNvY2tldFN0cmVh
bUhhbmRsZShjb25zdCBLVVJMJiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7CisgICAgICAg
IFNvY2tldFN0cmVhbUhhbmRsZShHU29ja2V0Q29ubmVjdGlvbiosIFNvY2tldFN0cmVhbUhhbmRs
ZUNsaWVudCopOwogCiAgICAgICAgIC8vIE5vIGF1dGhlbnRpY2F0aW9uIGZvciBzdHJlYW1zIHBl
ciBzZSwgYnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRlbnRpYWxzLgogICAgICAgICB2b2lkIGRp
ZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZSYpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tl
dFN0cmVhbUhhbmRsZVNvdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVTb3VwLmNwcAkocmV2aXNpb24gMTMx
OTA2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1NvY2tldFN0cmVh
bUhhbmRsZVNvdXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwOSwgMjAxMSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTk0LDYg
Kzk1LDE0IEBAIFNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKGMKICAgICAg
ICAgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPihjb25uZWN0ZWRDYWxsYmFj
ayksIG1faWQpOwogfQogCitTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhhbmRsZShH
U29ja2V0Q29ubmVjdGlvbiogc29ja2V0Q29ubmVjdGlvbiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xp
ZW50KiBjbGllbnQpCisgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlKEtVUkwoKSwgY2xpZW50
KQorICAgICwgbV9yZWFkQnVmZmVyKDApCit7CisgICAgbV9pZCA9IGFjdGl2YXRlSGFuZGxlKHRo
aXMpOworICAgIGNvbm5lY3RlZChzb2NrZXRDb25uZWN0aW9uLCAwKTsKK30KKwogU29ja2V0U3Ry
ZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKCkKIHsKICAgICAvLyBJZiBmb3Igc29tZSBy
ZWFzb24gd2Ugd2VyZSBkZXN0cm95ZWQgd2l0aG91dCBjbG9zaW5nLCBlbnN1cmUgdGhhdCB3ZSBh
cmUgZGVhY3RpdmF0ZWQuCkBAIC0xMDgsNyArMTE3LDcgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5k
bGU6OmNvbm5lY3RlZChHU29jawogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9zb2Nr
ZXRDb25uZWN0aW9uID0gYWRvcHRHUmVmKHNvY2tldENvbm5lY3Rpb24pOworICAgIG1fc29ja2V0
Q29ubmVjdGlvbiA9IHNvY2tldENvbm5lY3Rpb247CiAgICAgbV9vdXRwdXRTdHJlYW0gPSBHX1BP
TExBQkxFX09VVFBVVF9TVFJFQU0oZ19pb19zdHJlYW1fZ2V0X291dHB1dF9zdHJlYW0oR19JT19T
VFJFQU0obV9zb2NrZXRDb25uZWN0aW9uLmdldCgpKSkpOwogICAgIG1faW5wdXRTdHJlYW0gPSBn
X2lvX3N0cmVhbV9nZXRfaW5wdXRfc3RyZWFtKEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlv
bi5nZXQoKSkpOwogCkBAIC0xNTMsNiArMTYyLDkgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6
OndyaXRlUmVhZHkoKQogCiBpbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29u
c3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKIHsKKyAgICBpZiAoIW1fb3V0cHV0U3RyZWFtIHx8
ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKwogICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsK
ICAgICBnc3NpemUgd3JpdHRlbiA9IGdfcG9sbGFibGVfb3V0cHV0X3N0cmVhbV93cml0ZV9ub25i
bG9ja2luZyhtX291dHB1dFN0cmVhbS5nZXQoKSwgZGF0YSwgbGVuZ3RoLCAwLCAmZXJyb3Iub3V0
UHRyKCkpOwogICAgIGlmIChlcnJvcikgewpAQCAtMTg4LDYgKzIwMCw3IEBAIHZvaWQgU29ja2V0
U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybUNsb3NlKCkKICAgICBtX291dHB1dFN0cmVhbSA9IDA7CiAg
ICAgbV9pbnB1dFN0cmVhbSA9IDA7CiAgICAgZGVsZXRlIG1fcmVhZEJ1ZmZlcjsKKyAgICBtX3Jl
YWRCdWZmZXIgPSAwOwogCiAgICAgbV9jbGllbnQtPmRpZENsb3NlU29ja2V0U3RyZWFtKHRoaXMp
OwogfQpJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gMTMxOTIyKQorKysgU291cmNlL1dlYktpdDIv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTItMTAtMTkgIEFu
dG9uIE9iemhpcm92ICA8YS5vYnpoaXJvdkBzYW1zdW5nLmNvbT4KKworICAgICAgICBBZGQgcGxh
dGZvcm0gaW1wbGVtZW50YXRpb24gb2YgcmVtb3RlIHdlYiBpbnNwZWN0b3Igc2VydmVyIGZvciBH
VEsgcG9ydC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTg4MDk0IAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFRoZSBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBHU29ja2V0IEFQSSAoV2Vi
SW5zcGVjdG9yU2VydmVyR3RrLmNwcCBhbmQgV2ViU29ja2V0U2VydmVyR3RrLmNwcCkuCisgICAg
ICAgIFRoZSBzZXJ2ZXIgbGlzdGVucyBvbiBwb3J0IDI5OTkgYnkgZGVmYXVsdC4gSVAgYWRkcmVz
cyBvZiB0aGUgc2VydmVyIGNhbiBiZSBzZXQKKyAgICAgICAgaW4gV0VCS0lUX0lOU1BFQ1RPUl9T
RVJWRVIgKGZvciBleGFtcGxlIGV4cG9ydCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUj0iMTkyLjE2
OC4xMjQuMTMwOjI5OTkiKS4KKyAgICAgICAgVGhlIHNlcnZlciBpcyBzdGFydGVkIGR1cmluZyBX
ZWJLaXQgY29udGV4dCBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgT25jZSBhIHBhZ2UgaXMgbG9h
ZGVkIGluc2VjdG9yIHNlcnZlciBjYW4gYmUgYWNjZXNzZWQgdmlhIG90aGVyIFdlYktpdCBiYXNl
ZCBicm93c2VyLgorICAgICAgICBOZXcgV2ViS2l0IEFQSSBndGsgdGVzdHMgaGF2ZSBiZWVkIGFk
ZGVkLgorICAgICAgICBpbnNwZWN0b3JQYWdlSW5kZXguaHRtbCBoYXMgYmVlbiBtb3ZlZCB0byBu
ZXcgbG9jYXRpb24gdG8gc2hhcmUgdGhlIGZpbGUgYmV0d2VlbiBHVEsgYW5kIFF0IHBvcnRzLgor
CisgICAgICAgIFRlc3Q6IHRlc3QtcGFnZS1saXN0LCB0ZXN0LXJlbW90ZS1kZWJ1Z2dpbmctbWVz
c2FnZSwgdGVzdC1vcGVuLWRlYnVnZ2luZy1zZXNzaW9uCisKKyAgICAgICAgKiBHTlVtYWtlZmls
ZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgorICAgICAgICAqIFBsYXRmb3Jt
L0xvZ2dpbmcuY3BwOgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6Z2V0Q2hh
bm5lbEZyb21OYW1lKToKKyAgICAgICAgKFdlYktpdDo6aW5pdGlhbGl6ZUxvZ0NoYW5uZWxzSWZO
ZWNlc3NhcnkpOgorICAgICAgICAqIFBsYXRmb3JtL0xvZ2dpbmcuaDoKKyAgICAgICAgKFdlYktp
dCk6CisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW06Cisg
ICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvSW5zcGVjdG9yVGVzdFNlcnZlci5jcHA6
IEFkZGVkLgorICAgICAgICAobG9hZENoYW5nZWRDYWxsYmFjayk6CisgICAgICAgIChtYWluKToK
KyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0SW5zcGVjdG9yU2VydmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChzdG9wVGVzdFNlcnZlcik6CisgICAgICAgIChzaWdBYm9ydEhh
bmRsZXIpOgorICAgICAgICAodGVzdFNlcnZlck1vbml0b3JUaHJlYWRGdW5jKToKKyAgICAgICAg
KHN0YXJ0VGVzdFNlcnZlck1vbml0b3IpOgorICAgICAgICAoc3RhcnRUZXN0U2VydmVyKToKKyAg
ICAgICAgKHRlc3RJbnNwZWN0b3JTZXJ2ZXJQYWdlTGlzdCk6CisgICAgICAgICh0ZXN0UmVtb3Rl
RGVidWdnaW5nTWVzc2FnZSk6CisgICAgICAgIChvcGVuUmVtb3RlRGVidWdnaW5nU2Vzc2lvbik6
CisgICAgICAgIChiZWZvcmVBbGwpOgorICAgICAgICAoYWZ0ZXJBbGwpOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2VydmVyLmg6CisgICAgICAgIChX
ZWJJbnNwZWN0b3JTZXJ2ZXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
V2ViU29ja2V0U2VydmVyLmg6CisgICAgICAgIChXZWJTb2NrZXRTZXJ2ZXIpOgorICAgICAgICAq
IFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OldlYlNvY2tldFNl
cnZlckNvbm5lY3Rpb24pOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uOjpzaHV0ZG93bk5vdyk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNvbm5l
Y3Rpb246OnNodXRkb3duQWZ0ZXJTZW5kT3JOb3cpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2Nr
ZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRDbG9zZVNvY2tldFN0cmVhbSk6CisgICAgICAgIChXZWJL
aXQ6OldlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRh
KToKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OldlYlNvY2tldFNlcnZlckNv
bm5lY3Rpb246OmRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KToKKyAgICAgICAgKiBVSVByb2Nlc3Mv
SW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uaDoKKyAgICAgICAgKFdl
YlNvY2tldFNlcnZlckNvbm5lY3Rpb24pOgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZnJvbnQtZW5kOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDogQWRkZWQuCisgICAgICAgICog
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGs6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vz
cy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHA6IEFkZGVkLgor
ICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6V2ViSW5zcGVjdG9yU2VydmVyOjpw
bGF0Zm9ybVJlc291cmNlRm9yUGF0aCk6CisgICAgICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNl
cnZlcjo6YnVpbGRQYWdlTGlzdCk6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9ndGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQpOgor
ICAgICAgICAoV2ViS2l0Ojpjb25uZWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2ViS2l0OjpX
ZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtSW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6Oldl
YlNvY2tldFNlcnZlcjo6cGxhdGZvcm1MaXN0ZW4pOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2Nr
ZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UpOgorICAgICAgICAqIFVJUHJvY2Vzcy9ndGsvV2ViQ29u
dGV4dEd0ay5jcHA6CisgICAgICAgIChXZWJLaXQ6OmluaXRJbnNwZWN0b3JTZXJ2ZXIpOgorICAg
ICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dDo6cGxhdGZvcm1Jbml0
aWFsaXplV2ViUHJvY2Vzcyk6CisgICAgICAgICogV2ViS2l0Mi5xcmM6CisgICAgICAgICogY29u
ZmlnLmg6CisgICAgICAgICogcXQvUmVzb3VyY2VzL2luc3BlY3RvclBhZ2VJbmRleC5odG1sOiBS
ZW1vdmVkLgorCiAyMDEyLTEwLTE5ICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4K
IAogICAgICAgICBSRUdSRVNTSU9OIChyMTMxNjg2KTogQ3Jhc2ggaW4gTlNUb29sVGlwTWFuYWdl
ciBtb3VzZUVudGVyZWRUb29sVGlwCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5h
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQkocmV2aXNpb24g
MTMxOTA2KQorKysgU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkK
QEAgLTU3LDYgKzU3LDcgQEAgbGlid2Via2l0Mmd0a19AV0VCS0lUR1RLX0FQSV9NQUpPUl9WRVJT
SQogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9QbHVnaW5zIFwKIAktSSQo
c3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvUGx1Z2lucy91bml4IFwKIAktSSQoc3Jj
ZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvc291cCBcCisJLUkkKHNyY2RpcikvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlciBcCiAJLUkkKHNyY2RpcikvU291cmNl
L1dlYktpdDIvV2ViUHJvY2VzcyBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktpdDIvV2ViUHJv
Y2Vzcy9BcHBsaWNhdGlvbkNhY2hlIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL0F1dGhlbnRpY2F0aW9uIFwKQEAgLTU1MywzICs1NTQsOSBAQCBFWFRSQV9ESVNUICs9
IFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC8qLmlu
KSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dlYlByb2Nlc3MvV2ViUGFnZS8qLmluKSBcCiAJ
JChzaGVsbCBscyAkKFdlYktpdDIpL1dlYlByb2Nlc3Mvc291cC8qLmluKQorCisjIEluc3RhbGxp
bmcgcmVtb3RlIGluc3BlY3RvciBmaWxlcworcmVtb3RlaW5zcGVjdG9yZGlyID0gJHtkYXRhZGly
fS93ZWJraXRndGstQFdFQktJVEdUS19BUElfVkVSU0lPTkAvd2ViaW5zcGVjdG9yCitkaXN0X3Jl
bW90ZWluc3BlY3Rvcl9EQVRBID0gXAorCSQoV2ViS2l0MikvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwKKwpJbmRleDogU291cmNlL1dl
YktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9H
TlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMzE5MDYpCisrKyBTb3VyY2UvV2ViS2l0Mi9H
TlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBAIC05MzMsNiArOTMzLDE1IEBAIHdl
YmtpdDJfc291cmNlcyArPSBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlRleHRDaGVj
a2VyQ2xpZW50LmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5jcHAg
XAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5oIFwKKwlTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5jcHAgXAor
CVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5zcGVjdG9yU2Vy
dmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29j
a2V0U2VydmVyLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZl
ci9XZWJTb2NrZXRTZXJ2ZXIuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3Rv
clNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDbGllbnQuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcCBcCisJU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25u
ZWN0aW9uLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3Rr
L1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9J
bnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAgXAogCVNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5jcHAgXAogCVNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5oIFwKIAlTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvV2ViVmlicmF0aW9uUHJveHkuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYktp
dDIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYktpdDIucXJjCShyZXZpc2lv
biAxMzE5MDYpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnFyYwkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIDwhRE9DVFlQRSBSQ0M+PFJDQyB2ZXJzaW9uPSIxLjAiPgogPHFyZXNv
dXJjZSBwcmVmaXg9Ii93ZWJraXQvcmVzb3VyY2VzIj4KLSAgICA8ZmlsZSBhbGlhcz0iaW5zcGVj
dG9yUGFnZUluZGV4Lmh0bWwiPnF0L1Jlc291cmNlcy9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDwv
ZmlsZT4KKyAgICA8ZmlsZSBhbGlhcz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiPlVJUHJvY2Vz
cy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5odG1sPC9maWxl
PgogPC9xcmVzb3VyY2U+CiA8L1JDQz4KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCShyZXZpc2lvbiAxMzE5MDYpCisr
KyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTIwLDcgKzEyMCw3
IEBAIHN0YXRpYyBjb25zdCB0eXBlJiBuYW1lKCkgXAogI2RlZmluZSBQTFVHSU5fQVJDSElURUNU
VVJFKEFSQ0gpIChkZWZpbmVkIFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIICYmIFBMVUdJTl9B
UkNISVRFQ1RVUkVfIyNBUkNIKQogCiAjaWZuZGVmIEVOQUJMRV9JTlNQRUNUT1JfU0VSVkVSCi0j
aWYgUExBVEZPUk0oUVQpCisjaWYgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKEdUSykKICNkZWZp
bmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQogI2VuZGlmCiAjZW5kaWYKSW5kZXg6IFNvdXJj
ZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCShyZXZpc2lvbiAxMzE5MDYpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsMTMgKzMxLDE0
IEBACiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCi1XVEZMb2dDaGFubmVsIExvZ1Nlc3Npb25TdGF0
ZSA9IHsgMHgwMDAwMDAwMSwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxPZmYgfTsK
LVdURkxvZ0NoYW5uZWwgTG9nQ29udGV4dE1lbnUgID0geyAweDAwMDAwMDAyLCAiV2ViS2l0Mkxv
Z0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9OwotV1RGTG9nQ2hhbm5lbCBMb2dUZXh0SW5wdXQg
ICAgPSB7IDB4MDAwMDAwMDQsICJXZWJLaXQyTG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07
Ci1XVEZMb2dDaGFubmVsIExvZ1ZpZXcgICAgICAgICA9IHsgMHgwMDAwMDAwOCwgIldlYktpdDJM
b2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxPZmYgfTsKLVdURkxvZ0NoYW5uZWwgTG9nSWNvbkRhdGFi
YXNlID0geyAweDAwMDAwMDEwLCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9
OwotV1RGTG9nQ2hhbm5lbCBMb2dLZXlIYW5kbGluZyAgPSB7IDB4MDAwMDAwMjAsICJXZWJLaXQy
TG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07Ci1XVEZMb2dDaGFubmVsIExvZ1BsdWdpbnMg
ICAgICA9IHsgMHgwMDAwMDA0MCwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxPZmYg
fTsKK1dURkxvZ0NoYW5uZWwgTG9nU2Vzc2lvblN0YXRlICAgID0geyAweDAwMDAwMDAxLCAiV2Vi
S2l0MkxvZ0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9OworV1RGTG9nQ2hhbm5lbCBMb2dDb250
ZXh0TWVudSAgICAgPSB7IDB4MDAwMDAwMDIsICJXZWJLaXQyTG9nTGV2ZWwiLCBXVEZMb2dDaGFu
bmVsT2ZmIH07CitXVEZMb2dDaGFubmVsIExvZ1RleHRJbnB1dCAgICAgICA9IHsgMHgwMDAwMDAw
NCwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxPZmYgfTsKK1dURkxvZ0NoYW5uZWwg
TG9nVmlldyAgICAgICAgICAgID0geyAweDAwMDAwMDA4LCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RG
TG9nQ2hhbm5lbE9mZiB9OworV1RGTG9nQ2hhbm5lbCBMb2dJY29uRGF0YWJhc2UgICAgPSB7IDB4
MDAwMDAwMTAsICJXZWJLaXQyTG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07CitXVEZMb2dD
aGFubmVsIExvZ0tleUhhbmRsaW5nICAgICA9IHsgMHgwMDAwMDAyMCwgIldlYktpdDJMb2dMZXZl
bCIsIFdURkxvZ0NoYW5uZWxPZmYgfTsKK1dURkxvZ0NoYW5uZWwgTG9nUGx1Z2lucyAgICAgICAg
ID0geyAweDAwMDAwMDQwLCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9Owor
V1RGTG9nQ2hhbm5lbCBMb2dJbnNwZWN0b3JTZXJ2ZXIgPSB7IDB4MDAwMDAwODAsICJXZWJLaXQy
TG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07CiAKICNpZiAhUExBVEZPUk0oTUFDKSAmJiAh
UExBVEZPUk0oR1RLKSAmJiAhUExBVEZPUk0oUVQpICYmICFQTEFURk9STShFRkwpCiB2b2lkIGlu
aXRpYWxpemVMb2dDaGFubmVsKFdURkxvZ0NoYW5uZWwqIGNoYW5uZWwpCkBAIC03Myw2ICs3NCw5
IEBAIFdURkxvZ0NoYW5uZWwqIGdldENoYW5uZWxGcm9tTmFtZShjb25zdAogICAgIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShjaGFubmVsTmFtZSwgU3RyaW5nKCJQbHVnaW5zIikpKQogICAgICAgICBy
ZXR1cm4gJkxvZ1BsdWdpbnM7CiAKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoY2hhbm5lbE5h
bWUsIFN0cmluZygiSW5zcGVjdG9yU2VydmVyIikpKQorICAgICAgICByZXR1cm4gJkxvZ0luc3Bl
Y3RvclNlcnZlcjsKKwogICAgIHJldHVybiAwOwogfQogI2VuZGlmCkBAIC04Niw2ICs5MCw3IEBA
IHZvaWQgaW5pdGlhbGl6ZUxvZ0NoYW5uZWxzSWZOZWNlc3NhcnkoKQogCiAgICAgaW5pdGlhbGl6
ZUxvZ0NoYW5uZWwoJkxvZ0NvbnRleHRNZW51KTsKICAgICBpbml0aWFsaXplTG9nQ2hhbm5lbCgm
TG9nSWNvbkRhdGFiYXNlKTsKKyAgICBpbml0aWFsaXplTG9nQ2hhbm5lbCgmTG9nSW5zcGVjdG9y
U2VydmVyKTsKICAgICBpbml0aWFsaXplTG9nQ2hhbm5lbCgmTG9nS2V5SGFuZGxpbmcpOwogICAg
IGluaXRpYWxpemVMb2dDaGFubmVsKCZMb2dQbHVnaW5zKTsKICAgICBpbml0aWFsaXplTG9nQ2hh
bm5lbCgmTG9nU2Vzc2lvblN0YXRlKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xv
Z2dpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgJ
KHJldmlzaW9uIDEzMTkwNikKKysrIFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuaAko
d29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQCBuYW1lc3BhY2UgV2ViS2l0IHsKIAogZXh0
ZXJuIFdURkxvZ0NoYW5uZWwgTG9nQ29udGV4dE1lbnU7CiBleHRlcm4gV1RGTG9nQ2hhbm5lbCBM
b2dJY29uRGF0YWJhc2U7CitleHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dJbnNwZWN0b3JTZXJ2ZXI7
CiBleHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dLZXlIYW5kbGluZzsKIGV4dGVybiBXVEZMb2dDaGFu
bmVsIExvZ1BsdWdpbnM7CiBleHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dTZXNzaW9uU3RhdGU7Cklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9HTlVtYWtlZmlsZS5h
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9H
TlVtYWtlZmlsZS5hbQkocmV2aXNpb24gMTMxOTA2KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTEsMTEg
KzEsMTMgQEAKIGlmIEVOQUJMRV9XRUJLSVQyCiAKIFRFU1RfUFJPR1MgKz0gXAorCVByb2dyYW1z
L1dlYktpdDJBUElUZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyIFwKIAlQcm9ncmFtcy9XZWJLaXQy
QVBJVGVzdHMvVGVzdEJhY2tGb3J3YXJkTGlzdCBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3Rz
L1Rlc3RDb250ZXh0TWVudSBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RDb29raWVN
YW5hZ2VyIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdERvd25sb2FkcyBcCiAJUHJv
Z3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RJbnNwZWN0b3IgXAorCVByb2dyYW1zL1dlYktpdDJB
UElUZXN0cy9UZXN0SW5zcGVjdG9yU2VydmVyIFwKIAlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMv
VGVzdExvYWRlckNsaWVudCBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RQcmludGlu
ZyBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RSZXNvdXJjZXMgXApAQCAtMTA2LDYg
KzEwOCwxMiBAQCBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFNldHRpCiBQcm9n
cmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFNldHRpbmdzX0xEQUREID0gJCh3ZWJraXQy
X3Rlc3RzX2xkYWRkKQogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJLaXRTZXR0aW5n
c19MREZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxhZ3MpCiAKK1Byb2dyYW1zX1dlYktpdDJB
UElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX1NPVVJDRVMgPSBcCisJU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvSW5zcGVjdG9yVGVzdFNlcnZlci5jcHAKK1Byb2dyYW1z
X1dlYktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX0NQUEZMQUdTID0gJCh3ZWJraXQy
X3Rlc3RzX2NwcGZsYWdzKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX0luc3BlY3RvclRlc3RT
ZXJ2ZXJfTERBREQgPSAkKHdlYmtpdDJfdGVzdHNfbGRhZGQpCitQcm9ncmFtc19XZWJLaXQyQVBJ
VGVzdHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9MREZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxh
Z3MpCisKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0QmFja0ZvcndhcmRMaXN0X1NPVVJD
RVMgPSBcCiAgICAgICAgIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rl
c3RCYWNrRm9yd2FyZExpc3QuY3BwCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEJhY2tG
b3J3YXJkTGlzdF9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKQEAgLTE4Miw2
ICsxOTAsMTIgQEAgUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JfQwogUHJv
Z3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JfTERBREQgPSAkKHdlYmtpdDJfdGVz
dHNfbGRhZGQpCiBQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3Rvcl9MREZMQUdT
ID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxhZ3MpCiAKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19U
ZXN0SW5zcGVjdG9yU2VydmVyX1NPVVJDRVMgPSBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHAKK1Byb2dyYW1zX1dlYktpdDJB
UElUZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX0NQUEZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2Nw
cGZsYWdzKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JTZXJ2ZXJfTERB
REQgPSAkKHdlYmtpdDJfdGVzdHNfbGRhZGQpCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVz
dEluc3BlY3RvclNlcnZlcl9MREZMQUdTID0gJCh3ZWJraXQyX3Rlc3RzX2xkZmxhZ3MpCisKIFBy
b2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2ViS2l0VmVyc2lvbl9TT1VSQ0VTID0gXAogICAg
ICAgICBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0VmVy
c2lvbi5jcHAKIFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2ViS2l0VmVyc2lvbl9DUFBG
TEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3BlY3RvclRlc3RT
ZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9n
dGsvdGVzdHMvSW5zcGVjdG9yVGVzdFNlcnZlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQu
IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDx3ZWJraXQyL3dlYmtpdDIuaD4K
Kworc3RhdGljIHZvaWQgbG9hZENoYW5nZWRDYWxsYmFjayhXZWJLaXRXZWJWaWV3KiwgV2ViS2l0
TG9hZEV2ZW50IGxvYWRFdmVudCwgZ3BvaW50ZXIpCit7CisgICAgLy8gU2VuZCBhIG1lc3NhZ2Ug
dG8gdGhlIHBhcmVudCBwcm9jZXNzIHdoZW4gd2UncmUgcmVhZHkuCisgICAgaWYgKGxvYWRFdmVu
dCA9PSBXRUJLSVRfTE9BRF9GSU5JU0hFRCkKKyAgICAgICAgZ19wcmludCgiT0siKTsKK30KKwor
aW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGd0a19pbml0KCZhcmdjLCAm
YXJndik7CisKKyAgICAvLyBPdmVyd3JpdGUgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgdmFyaWFi
bGUgd2l0aCBkZWZhdWx0IHZhbHVlLgorICAgIGdfc2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NF
UlZFUiIsICIxMjcuMC4wLjE6Mjk5OSIsIFRSVUUpOworCisgICAgV2ViS2l0V2ViVmlldyogd2Vi
VmlldyA9IFdFQktJVF9XRUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIHdlYmtp
dF9zZXR0aW5nc19zZXRfZW5hYmxlX2RldmVsb3Blcl9leHRyYXMod2Via2l0X3dlYl92aWV3X2dl
dF9zZXR0aW5ncyh3ZWJWaWV3KSwgVFJVRSk7CisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRfaHRt
bCh3ZWJWaWV3LAorICAgICAgICAiPGh0bWw+PGJvZHk+PHA+V2ViS2l0R1RLKyBJbnNwZWN0b3Ig
VGVzdCBTZXJ2ZXI8L3A+PC9ib2R5PjwvaHRtbD4iLAorICAgICAgICAiaHR0cDovLzEyNy4wLjAu
MToyOTk5LyIpOworCisgICAgR3RrV2lkZ2V0KiB3aW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtf
V0lORE9XX1RPUExFVkVMKTsKKyAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHdp
bmRvdyksIEdUS19XSURHRVQod2ViVmlldykpOworICAgIGd0a193aWRnZXRfc2hvd19hbGwod2lu
ZG93KTsKKworICAgIGdfc2lnbmFsX2Nvbm5lY3Qod2luZG93LCAiZGVsZXRlLWV2ZW50IiwgR19D
QUxMQkFDSyhndGtfbWFpbl9xdWl0KSwgMCk7CisgICAgZ19zaWduYWxfY29ubmVjdCh3ZWJWaWV3
LCAibG9hZC1jaGFuZ2VkIiwgR19DQUxMQkFDSyhsb2FkQ2hhbmdlZENhbGxiYWNrKSwgMCk7CisK
KyAgICBndGtfbWFpbigpOworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9n
dGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0
SW5zcGVjdG9yU2VydmVyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMg
UmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1
ZGUgIldlYlZpZXdUZXN0LmgiCisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCisvLyBOYW1lIG9mIHRoZSB0ZXN0IHNlcnZl
ciBhcHBsaWNhdGlvbiBjcmVhdGluZyB0aGUgd2ViVmlldyBvYmplY3QuCitzdGF0aWMgY29uc3Qg
Y2hhciogc190ZXN0U2VydmVyQXBwTmFtZSA9ICJJbnNwZWN0b3JUZXN0U2VydmVyIjsKKworLy8g
TWF4IHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIHRlc3Qgc2VydmVyIGJlZm9yZSBpbnNwZWN0aW5n
IGl0Lgorc3RhdGljIGNvbnN0IGludCBzX21heFdhaXRGb3JDaGlsZCA9IDU7CisKKy8vIFRoZSBQ
SUQgZm9yIHRoZSB0ZXN0IHNlcnZlciBydW5uaW5nLCBzbyB3ZSBjYW4ga2lsbCBpdCBpZiBuZWVk
ZWQuCitzdGF0aWMgR1BpZCBzX2NoaWxkUHJvY2Vzc1BpZCA9IDA7CisKKy8vIFdoZXRoZXIgdGhl
IGNoaWxkIGhhcyByZXBsaWVkIGFuZCBpdCdzIHJlYWR5Lgorc3RhdGljIGJvb2wgc19jaGlsZElz
UmVhZHkgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgc3RvcFRlc3RTZXJ2ZXIoKQoreworICAgIC8v
IERvIG5vdGhpbmcgaWYgdGhlcmUncyBubyBzZXJ2ZXIgcnVubmluZy4KKyAgICBpZiAoIXNfY2hp
bGRQcm9jZXNzUGlkKQorICAgICAgICByZXR1cm47CisKKyAgICBnX3NwYXduX2Nsb3NlX3BpZChz
X2NoaWxkUHJvY2Vzc1BpZCk7CisgICAga2lsbChzX2NoaWxkUHJvY2Vzc1BpZCwgU0lHVEVSTSk7
CisgICAgc19jaGlsZFByb2Nlc3NQaWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBzaWdBYm9ydEhh
bmRsZXIoaW50IHNpZ051bSkKK3sKKyAgICAvLyBKdXN0IHN0b3AgdGhlIHRlc3Qgc2VydmVyIGlm
IFNJR0FCUlQgd2FzIHJlY2VpdmVkLgorICAgIHN0b3BUZXN0U2VydmVyKCk7Cit9CisKK3N0YXRp
YyBncG9pbnRlciB0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1bmMoZ3BvaW50ZXIpCit7CisgICAg
Ly8gV2FpdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lb3V0IHRvIGhhcHBlbi4KKyAgICBnX3VzbGVl
cChzX21heFdhaXRGb3JDaGlsZCAqIEdfVVNFQ19QRVJfU0VDKTsKKworICAgIC8vIEtpbGwgdGhl
IGNoaWxkIHByb2Nlc3MgaWYgbm90IHJlYWR5IHlldC4KKyAgICBpZiAoIXNfY2hpbGRJc1JlYWR5
KQorICAgICAgICBzdG9wVGVzdFNlcnZlcigpOworCisgICAgZ190aHJlYWRfZXhpdCgwKTsKKyAg
ICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RhcnRUZXN0U2VydmVyTW9uaXRvcigpCit7
CisgICAgc19jaGlsZElzUmVhZHkgPSBmYWxzZTsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9O
KDIsIDMxLCAwKSkKKyAgICBnX3RocmVhZF9jcmVhdGUodGVzdFNlcnZlck1vbml0b3JUaHJlYWRG
dW5jLCAwLCBGQUxTRSwgMCk7CisjZWxzZQorICAgIGdfdGhyZWFkX25ldygiVGVzdFNlcnZlck1v
bml0b3IiLCB0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1bmMsIDApOworI2VuZGlmCit9CisKK3N0
YXRpYyB2b2lkIHN0YXJ0VGVzdFNlcnZlcigpCit7CisgICAgLy8gUHJlcGFyZSBhcmd2W10gZm9y
IHNwYXduaW5nIHRoZSBzZXJ2ZXIgcHJvY2Vzcy4KKyAgICBHT3duUHRyPGNoYXI+IHRlc3RTZXJ2
ZXJQYXRoKGdfYnVpbGRfZmlsZW5hbWUoV0VCS0lUX0VYRUNfUEFUSCwgIldlYktpdDJBUElUZXN0
cyIsIHNfdGVzdFNlcnZlckFwcE5hbWUsIE5VTEwpKTsKKworICAgIC8vIFdlIGluc3RhbGwgYSBo
YW5kbGVyIHRvIGVuc3VyZSB0aGF0IHdlIGtpbGwgdGhlIGNoaWxkIHByb2Nlc3MKKyAgICAvLyBp
ZiB0aGUgcGFyZW50IGRpZXMgYmVjYXVzZSBvZiB3aGF0ZXZlciB0aGUgcmVhc29uIGlzLgorICAg
IHNpZ25hbChTSUdBQlJULCBzaWdBYm9ydEhhbmRsZXIpOworCisgICAgY2hhciogdGVzdFNlcnZl
ckFyZ3ZbMl07CisgICAgdGVzdFNlcnZlckFyZ3ZbMF0gPSB0ZXN0U2VydmVyUGF0aC5nZXQoKTsK
KyAgICB0ZXN0U2VydmVyQXJndlsxXSA9IDA7CisKKyAgICAvLyBTcGF3biB0aGUgc2VydmVyLCBn
ZXR0aW5nIGl0cyBzdGRvdXQgZmlsZSBkZXNjcmlwdG9yIHRvIHNldCBhCisgICAgLy8gY29tbXVu
aWNhdGlvbiBjaGFubmVsLCBzbyB3ZSBrbm93IHdoZW4gaXQncyByZWFkeS4KKyAgICBpbnQgY2hp
bGRTdGRvdXQgPSAwOworICAgIGdfYXNzZXJ0KGdfc3Bhd25fYXN5bmNfd2l0aF9waXBlcygwLCB0
ZXN0U2VydmVyQXJndiwgMCwgc3RhdGljX2Nhc3Q8R1NwYXduRmxhZ3M+KDApLCAwLCAwLAorICAg
ICAgICAmc19jaGlsZFByb2Nlc3NQaWQsIDAsICZjaGlsZFN0ZG91dCwgMCwgMCkpOworCisgICAg
Ly8gU3RhcnQgbW9uaXRvcmluZyB0aGUgdGVzdCBzZXJ2ZXIgKGluIGEgc2VwYXJhdGUgdGhyZWFk
KSB0bworICAgIC8vIGVuc3VyZSB3ZSBkb24ndCBibG9jayBvbiB0aGUgY2hpbGQgcHJvY2VzcyBt
b3JlIHRoYW4gYSB0aW1lb3V0LgorICAgIHN0YXJ0VGVzdFNlcnZlck1vbml0b3IoKTsKKworICAg
IGNoYXIgbXNnWzJdOworICAgIEdJT0NoYW5uZWwqIGlvQ2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91
bml4X25ldyhjaGlsZFN0ZG91dCk7CisgICAgaWYgKGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzKGlv
Q2hhbm5lbCwgbXNnLCAyLCAwLCAwKSA9PSBHX0lPX1NUQVRVU19OT1JNQUwpIHsKKyAgICAgICAg
Ly8gQ2hlY2sgd2hldGhlciB0aGUgc2VydmVyIHNlbnQgYSBtZXNzYWdlIHNheWluZyBpdCdzIHJl
YWR5CisgICAgICAgIC8vIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGdsb2JhbGx5LCBzbyB0aGUgbW9u
aXRvciBjYW4gc2VlIGl0LgorICAgICAgICBzX2NoaWxkSXNSZWFkeSA9IG1zZ1swXSA9PSAnTycg
JiYgbXNnWzFdID09ICdLJzsKKyAgICB9CisgICAgZ19pb19jaGFubmVsX3VucmVmKGlvQ2hhbm5l
bCk7CisgICAgY2xvc2UoY2hpbGRTdGRvdXQpOworCisgICAgLy8gVGhlIHRpbWVvdXQgd2FzIHJl
YWNoZWQgYW5kIHRoZSBzZXJ2ZXIgaXMgbm90IHJlYWR5IHlldCwgc28KKyAgICAvLyBzdG9wIGl0
IGlubWVkaWF0ZWx5LCBhbmQgbGV0IHRoZSB1bml0IHRlc3RzIGZhaWwuCisgICAgaWYgKCFzX2No
aWxkSXNSZWFkeSkKKyAgICAgICAgc3RvcFRlc3RTZXJ2ZXIoKTsKK30KKworY2xhc3MgSW5zcGVj
dG9yU2VydmVyVGVzdDogcHVibGljIFdlYlZpZXdUZXN0IHsKK3B1YmxpYzoKKyAgICBNQUtFX0dM
SUJfVEVTVF9GSVhUVVJFKEluc3BlY3RvclNlcnZlclRlc3QpOworCisgICAgSW5zcGVjdG9yU2Vy
dmVyVGVzdCgpCisgICAgICAgIDogV2ViVmlld1Rlc3QoKQorICAgIHsKKyAgICB9CisKKyAgICBi
b29sIGdldFBhZ2VMaXN0KCkKKyAgICB7CisgICAgICAgIGxvYWRIdG1sKCI8c2NyaXB0IHR5cGU9
XCJ0ZXh0L2phdmFzY3JpcHRcIj5cbiIKKyAgICAgICAgICAgICJ2YXIgcGFnZXM7XG4iCisgICAg
ICAgICAgICAidmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiIKKyAgICAgICAgICAgICJ4
aHIub3BlbihcIkdFVFwiLCBcIi9wYWdlbGlzdC5qc29uXCIpO1xuIgorICAgICAgICAgICAgInho
ci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4iCisgICAgICAgICAgICAgICAgImlmICh4aHIuc3Rh
dHVzID09IDIwMCkge1xuIgorICAgICAgICAgICAgICAgICAgICAicGFnZXMgPSBKU09OLnBhcnNl
KHhoci5yZXNwb25zZVRleHQpO1xuIgorICAgICAgICAgICAgICAgICAgICAiZG9jdW1lbnQudGl0
bGUgPSBcIk9LXCI7XG4iCisgICAgICAgICAgICAgICAgIn0gZWxzZSBcbiIKKyAgICAgICAgICAg
ICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJGQUlMXCI7XG4iCisgICAgICAgICAgICAgICAg
In1cbiIKKyAgICAgICAgICAgICJ4aHIuc2VuZCgpO1xuIgorICAgICAgICAgICAgIjwvc2NyaXB0
PlxuIiwKKyAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjI5OTkvIik7CisKKyAgICAgICAg
d2FpdFVudGlsVGl0bGVDaGFuZ2VkKCk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAod2Via2l0X3dl
Yl92aWV3X2dldF90aXRsZShtX3dlYlZpZXcpLCAiT0siKSkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB+SW5zcGVjdG9yU2Vy
dmVyVGVzdCgpCisgICAgeworICAgIH0KK307CisKKy8vIFRlc3QgdG8gZ2V0IGluc3BlY3RvciBz
ZXJ2ZXIgcGFnZSBsaXN0IGZyb20gdGhlIHRlc3Qgc2VydmVyLgorLy8gU2hvdWxkIGNvbnRhaW4g
b25seSBvbmUgZW50cnkgcG9pbnRpbmcgdG8gaHR0cDovLzEyNy4wLjAuMToyOTk5L3dlYmluc3Bl
Y3Rvci9pbnNwZWN0b3IuaHRtbD9wYWdlPTEKK3N0YXRpYyB2b2lkIHRlc3RJbnNwZWN0b3JTZXJ2
ZXJQYWdlTGlzdChJbnNwZWN0b3JTZXJ2ZXJUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQorewor
ICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKworICAgIHRlc3QtPnNob3dJbldpbmRvd0FuZFdh
aXRVbnRpbE1hcHBlZChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgICBnX2Fzc2VydCh0ZXN0LT5n
ZXRQYWdlTGlzdCgpKTsKKworICAgIFdlYktpdEphdmFzY3JpcHRSZXN1bHQqIGphdmFzY3JpcHRS
ZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVudGlsRmluaXNoZWQoInBhZ2VzLmxl
bmd0aDsiLCAmZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQp
OworICAgIGdfYXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgZ19hc3NlcnRfY21waW50KFdlYlZp
ZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0VG9OdW1iZXIoamF2YXNjcmlwdFJlc3VsdCksID09LCAx
KTsKKworICAgIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2NyaXB0QW5kV2FpdFVu
dGlsRmluaXNoZWQoInBhZ2VzWzBdLmlkOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3Nl
cnQoamF2YXNjcmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICBp
bnQgcGFnZUlkID0gV2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb051bWJlcihqYXZhc2Ny
aXB0UmVzdWx0KTsKKworICAgIEdPd25QdHI8Y2hhcj4gdmFsdWVTdHJpbmc7CisgICAgamF2YXNj
cmlwdFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFn
ZXNbMF0udXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2YXNjcmlwdFJl
c3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0cmluZy5zZXQo
V2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3VsdCkp
OworICAgIGdfYXNzZXJ0X2NtcHN0cih2YWx1ZVN0cmluZy5nZXQoKSwgPT0sICJodHRwOi8vMTI3
LjAuMC4xOjI5OTkvIik7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNj
cmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pbnNwZWN0b3JVcmw7IiwgJmVycm9y
Lm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fzc2Vy
dCghZXJyb3IuZ2V0KCkpOworICAgIHZhbHVlU3RyaW5nLnNldChXZWJWaWV3VGVzdDo6amF2YXNj
cmlwdFJlc3VsdFRvQ1N0cmluZyhqYXZhc2NyaXB0UmVzdWx0KSk7CisgICAgU3RyaW5nIHZhbGlk
SW5zcGVjdG9yVVJMID0gU3RyaW5nKCIvd2ViaW5zcGVjdG9yL2luc3BlY3Rvci5odG1sP3BhZ2U9
IikgKyBTdHJpbmc6Om51bWJlcihwYWdlSWQpOworICAgIGdfYXNzZXJ0X2NtcHN0cih2YWx1ZVN0
cmluZy5nZXQoKSwgPT0sIHZhbGlkSW5zcGVjdG9yVVJMLmxhdGluMSgpLmRhdGEoKSk7Cit9CisK
Ky8vIFRlc3Qgc2VuZGluZyBhIHJhdyByZW1vdGUgZGVidWdnaW5nIG1lc3NhZ2UgdGhyb3VnaCBv
dXIgd2ViIHNvY2tldCBzZXJ2ZXIuCisvLyBGb3IgdGhpcyBzcGVjaWZpYyBtZXNzYWdlIHNlZTog
aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9jaHJvbWUvZGV2dG9vbHMvZG9jcy9wcm90b2NvbC90b3Qv
cnVudGltZS5odG1sI2NvbW1hbmQtZXZhbHVhdGUKK3N0YXRpYyB2b2lkIHRlc3RSZW1vdGVEZWJ1
Z2dpbmdNZXNzYWdlKEluc3BlY3RvclNlcnZlclRlc3QqIHRlc3QsIGdjb25zdHBvaW50ZXIpCit7
CisgICAgdGVzdC0+c2hvd0luV2luZG93QW5kV2FpdFVudGlsTWFwcGVkKEdUS19XSU5ET1dfVE9Q
TEVWRUwpOworCisgICAgdGVzdC0+bG9hZEh0bWwoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNj
cmlwdFwiPlxuIgorICAgICAgICAidmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoJ3dzOi8vMTI3
LjAuMC4xOjI5OTkvZGV2dG9vbHMvcGFnZS8xJyk7XG4iCisgICAgICAgICJzb2NrZXQub25tZXNz
YWdlID0gZnVuY3Rpb24obWVzc2FnZSkge1xuIgorICAgICAgICAgICAgInZhciByZXNwb25zZSA9
IEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKTtcbiIKKyAgICAgICAgICAgICJpZiAocmVzcG9uc2Uu
aWQgPT09IDEpXG4iCisgICAgICAgICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gcmVzcG9uc2Uu
cmVzdWx0LnJlc3VsdC52YWx1ZTtcbiIKKyAgICAgICAgICAgICJlbHNlXG4iCisgICAgICAgICAg
ICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJGQUlMXCI7XG4iCisgICAgICAgICAgICAifVxuIgor
ICAgICAgICAgICAgInNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpIHtcbiIKKyAgICAgICAgICAg
ICJzb2NrZXQuc2VuZCgne1wiaWRcIjogMSwgXCJtZXRob2RcIjogXCJSdW50aW1lLmV2YWx1YXRl
XCIsIFwicGFyYW1zXCI6IHtcImV4cHJlc3Npb25cIjogXCIyICsgMlwiIH0gfScpO1xuIgorICAg
ICAgICAifVxuIgorICAgICAgICAiPC9zY3JpcHQ+IiwKKyAgICAgICAgImh0dHA6Ly8xMjcuMC4w
LjE6Mjk5OS8iKTsKKyAgICB0ZXN0LT53YWl0VW50aWxUaXRsZUNoYW5nZWQoKTsKKworICAgIGdf
YXNzZXJ0X2NtcHN0cih3ZWJraXRfd2ViX3ZpZXdfZ2V0X3RpdGxlKHRlc3QtPm1fd2ViVmlldyks
ID09LCAiNCIpOworfQorCitzdGF0aWMgdm9pZCBvcGVuUmVtb3RlRGVidWdnaW5nU2Vzc2lvbihJ
bnNwZWN0b3JTZXJ2ZXJUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQoreworICAgIC8vIFRvIHRl
c3QgdGhlIHdob2xlIHBpcGVsaW5lIHRoaXMgZXhwbG9pdHMgYSBiZWhhdmlvciBvZiB0aGUgaW5z
cGVjdG9yIGZyb250LWVuZCB3aGljaCB3b24ndCBwcm92aWRlIGFueSB0aXRsZSB1bmxlc3MgdGhl
CisgICAgLy8gZGVidWdnaW5nIHNlc3Npb24gd2FzIGVzdGFibGlzaGVkIGNvcnJlY3RseSB0aHJv
dWdoIHdlYiBzb2NrZXQuIEl0IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSAiV2ViIEluc3BlY3Rv
ciAtIDxQYWdlIFVSTD4iLgorICAgIC8vIEluIG91ciBjYXNlIHBhZ2UgVVJMIHNob3VsZCBiZSBo
dHRwOi8vMTI3LjAuMC4xOjI5OTkvCisgICAgLy8gU28gdGhpcyB0ZXN0IGNhc2Ugd2lsbCBmYWls
IGlmOgorICAgIC8vIC0gVGhlIHBhZ2UgbGlzdCBkaWRuJ3QgcmV0dXJuIGEgdmFsaWQgaW5zcGVj
dG9yIFVSTAorICAgIC8vIC0gT3IgdGhlIGZyb250LWVuZCBjb3VsZG4ndCBiZSBsb2FkZWQgdGhy
b3VnaCB0aGUgaW5zcGVjdG9yIEhUVFAgc2VydmVyCisgICAgLy8gLSBPciB0aGUgd2ViIHNvY2tl
dCBjb25uZWN0aW9uIGNvdWxkbid0IGJlIGVzdGFibGlzaGVkIGJldHdlZW4gdGhlIGZyb250LWVu
ZCBhbmQgdGhlIHBhZ2UgdGhyb3VnaCB0aGUgaW5zcGVjdG9yIHNlcnZlcgorICAgIC8vIExldCdz
IHNlZSBpZiB0aGlzIHRlc3QgaXNuJ3QgcmFpc2luZyB0b28gbWFueSBmYWxzZSBwb3NpdGl2ZXMs
IGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIHVzZSBhIGJldHRlciBwcmVkaWNhdGUgaWYgYXZhaWxh
YmxlLgorCisgICAgdGVzdC0+c2hvd0luV2luZG93QW5kV2FpdFVudGlsTWFwcGVkKEdUS19XSU5E
T1dfVE9QTEVWRUwpOworCisgICAgZ19hc3NlcnQodGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAg
ICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisgICAgV2ViS2l0SmF2YXNjcmlwdFJlc3VsdCogamF2
YXNjcmlwdFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgi
cGFnZXNbMF0uaW5zcGVjdG9yVXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQo
amF2YXNjcmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKworICAgIFN0
cmluZyByZXNvbHZlZFVSTCA9IFN0cmluZygiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpICsgV2Vi
Vmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlwdFJlc3VsdCk7Cisg
ICAgdGVzdC0+bG9hZFVSSShyZXNvbHZlZFVSTC5sYXRpbjEoKS5kYXRhKCkpOworICAgIHRlc3Qt
PndhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93
ZWJfdmlld19nZXRfdGl0bGUodGVzdC0+bV93ZWJWaWV3KSwgPT0sICJXZWIgSW5zcGVjdG9yIC0g
aHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworfQorCisKK3ZvaWQgYmVmb3JlQWxsKCkKK3sKKyAg
ICAvLyBPdmVyd3JpdGUgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgdmFyaWFibGUgd2l0aCBkZWZh
dWx0IElQIGFkZHJlc3MgYnV0IGRpZmZlcmVudCBwb3J0IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgg
dGhlIHRlc3QgaW5zcGVjdG9yIHNlcnZlciBwYWdlLgorICAgIGdfc2V0ZW52KCJXRUJLSVRfSU5T
UEVDVE9SX1NFUlZFUiIsICIxMjcuMC4wLjE6Mjk5OCIsIFRSVUUpOworCisgICAgc3RhcnRUZXN0
U2VydmVyKCk7CisgICAgSW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRXZWJJbnNwZWN0
b3JTZXJ2ZXIiLCAidGVzdC1wYWdlLWxpc3QiLCB0ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3Qp
OworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVy
IiwgInRlc3QtcmVtb3RlLWRlYnVnZ2luZy1tZXNzYWdlIiwgdGVzdFJlbW90ZURlYnVnZ2luZ01l
c3NhZ2UpOworICAgIEluc3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9y
U2VydmVyIiwgInRlc3Qtb3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbiIsIG9wZW5SZW1vdGVEZWJ1Z2dp
bmdTZXNzaW9uKTsKKworfQorCit2b2lkIGFmdGVyQWxsKCkKK3sKKyAgICBzdG9wVGVzdFNlcnZl
cigpOworfQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9X
ZWJJbnNwZWN0b3JTZXJ2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCShyZXZpc2lvbiAxMzE5MDYp
CisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3Rv
clNlcnZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3ICs2MSw3IEBAIHByaXZhdGU6CiAgICAg
dmlydHVhbCB2b2lkIGRpZENsb3NlV2ViU29ja2V0Q29ubmVjdGlvbihXZWJTb2NrZXRTZXJ2ZXJD
b25uZWN0aW9uKik7CiAKICAgICBib29sIHBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKGNvbnN0IFN0
cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKTsKLSNp
ZiBQTEFURk9STShRVCkKKyNpZiBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oR1RLKQogICAgIHZv
aWQgYnVpbGRQYWdlTGlzdChWZWN0b3I8Y2hhcj4mIGRhdGEsIFN0cmluZyYgY29udGVudFR5cGUp
OwogI2VuZGlmCiAKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvV2ViU29ja2V0U2VydmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAkocmV2aXNpb24gMTMxOTA2KQor
KysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2
ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjksOCArMjksMTQgQEAKIAogI2lmIEVOQUJMRShJTlNQ
RUNUT1JfU0VSVkVSKQogCisjaWYgUExBVEZPUk0oR1RLKQorI2luY2x1ZGUgPGdpby9naW8uaD4K
KyNlbmRpZgogI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4K
KyNpZiBQTEFURk9STShHVEspCisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgorI2Vu
ZGlmCiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKICNpZiBQTEFURk9STShRVCkK
QEAgLTc4LDYgKzg0LDggQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBzaG9ydCBtX3BvcnQ7CiAj
aWYgUExBVEZPUk0oUVQpCiAgICAgT3duUHRyPFF0VGNwU2VydmVySGFuZGxlcj4gbV90Y3BTZXJ2
ZXJIYW5kbGVyOworI2VsaWYgUExBVEZPUk0oR1RLKQorICAgIEdSZWZQdHI8R1NvY2tldFNlcnZp
Y2U+IG1fc29ja2V0U2VydmljZTsKICNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRT
ZXJ2ZXJDb25uZWN0aW9uOwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNw
ZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJD
b25uZWN0aW9uLmNwcAkocmV2aXNpb24gMTMxOTA2KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTAsNiArNTAsNyBAQCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJT
b2NrZXRTZXJ2CiAgICAgLCBtX21vZGUoSFRUUCkKICAgICAsIG1fc2VydmVyKHNlcnZlcikKICAg
ICAsIG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1fc2h1dGRvd25BZnRlclNlbmQoZmFsc2UpCiB7
CiB9CiAKQEAgLTcwLDE2ICs3MSwxNSBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246
OnNodXRkb3duCiAgICAgICAgIHJldHVybjsKICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxl
PiBzb2NrZXQgPSBtX3NvY2tldC5yZWxlYXNlKCk7CiAgICAgc29ja2V0LT5jbG9zZSgpOworICAg
IG1fc2h1dGRvd25BZnRlclNlbmQgPSBmYWxzZTsKIH0KIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJD
b25uZWN0aW9uOjpzaHV0ZG93bkFmdGVyU2VuZE9yTm93KCkKIHsKLSAgICAvLyBJZiB0aGlzIEFT
U0VSVCBoYXBwZW5zIG9uIGFueSBwbGF0Zm9ybSB0aGVuIHRoZWlyIFNvY2tldFN0cmVhbUhhbmRs
ZTo6c2VuZAotICAgIC8vIGZvbGxvd2VkIGJ5IGEgU29ja2V0U3RyZWFtSGFuZGxlOjpjbG9zZSBp
cyBub3QgZ3VhcmVudGVlZCB0byBoYXZlIHNlbnQgYWxsCi0gICAgLy8gZGF0YS4gSWYgdGhpcyBo
YXBwZW5zLCB3ZSBuZWVkIHRvIHNsaWdodGx5IGNoYW5nZSB0aGUgZGVzaWduIHRvIGluY2x1ZGUg
YQotICAgIC8vIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDo6ZGlkU2VuZCwgaGFuZGxlIGl0IGhl
cmUsIGFuZCBhZGQgYW4gbV9zaHV0ZG93bkFmdGVyU2VuZAotICAgIC8vIHN0YXRlIG9uIHRoaXMg
V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi4KLSAgICBBU1NFUlQoIW1fc29ja2V0LT5idWZmZXJl
ZEFtb3VudCgpKTsKKyAgICBpZiAobV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpIHsKKyAgICAg
ICAgbV9zaHV0ZG93bkFmdGVyU2VuZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAK
ICAgICBzaHV0ZG93bk5vdygpOwogfQpAQCAtMTI0LDYgKzEyNCw5IEBAIHZvaWQgV2ViU29ja2V0
U2VydmVyQ29ubmVjdGlvbjo6c2VuZFJhd0QKIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0
aW9uOjpkaWRDbG9zZVNvY2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqKQogeworICAgIC8v
IERlc3Ryb3kgdGhlIFNvY2tldFN0cmVhbUhhbmRsZSBub3cgdG8gcHJldmVudCBjbG9zaW5nIGFu
IGFscmVhZHkgY2xvc2VkIHNvY2tldCBsYXRlci4KKyAgICBtX3NvY2tldC5jbGVhcigpOworCiAg
ICAgLy8gV2ViIFNvY2tldCBNb2RlLgogICAgIGlmIChtX21vZGUgPT0gV2ViU29ja2V0KQogICAg
ICAgICBtX2NsaWVudC0+ZGlkQ2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMpOwpAQCAtMTUx
LDYgKzE1NCwxMiBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFJlY2VpCiAg
ICAgfQogfQogCit2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFVwZGF0ZUJ1ZmZl
cmVkQW1vdW50KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSosIHNpemVfdCkKK3sKKyAgICBp
ZiAobV9zaHV0ZG93bkFmdGVyU2VuZCAmJiAhbV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpCisg
ICAgICAgIHNodXRkb3duTm93KCk7Cit9CisKIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlv
bjo6ZGlkRmFpbFNvY2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBTb2NrZXRT
dHJlYW1FcnJvciYpCiB7CiAgICAgLy8gUG9zc2libGUgcmVhZCBvciB3cml0ZSBlcnJvci4KSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2Vy
dmVyQ29ubmVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9J
bnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oCShyZXZpc2lvbiAxMzE5
MDYpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tl
dFNlcnZlckNvbm5lY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQCBwdWJs
aWM6CiAgICAgLy8gU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50IGltcGxlbWVudGF0aW9uLgogICAg
IHZpcnR1YWwgdm9pZCBkaWRDbG9zZVNvY2tldFN0cmVhbShXZWJDb3JlOjpTb2NrZXRTdHJlYW1I
YW5kbGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoV2Vi
Q29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCk7
CisgICAgdmlydHVhbCB2b2lkIGRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZSosIHNpemVfdCBidWZmZXJlZEFtb3VudCk7CiAgICAgdmlydHVhbCB2b2lk
IGRpZEZhaWxTb2NrZXRTdHJlYW0oV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3Qg
V2ViQ29yZTo6U29ja2V0U3RyZWFtRXJyb3ImKTsKIAogcHJpdmF0ZToKQEAgLTg2LDYgKzg3LDcg
QEAgcHJvdGVjdGVkOgogICAgIFJlZlB0cjxXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU+IG1f
c29ja2V0OwogICAgIFdlYlNvY2tldFNlcnZlciogbV9zZXJ2ZXI7CiAgICAgV2ViU29ja2V0U2Vy
dmVyQ2xpZW50KiBtX2NsaWVudDsKKyAgICBib29sIG1fc2h1dGRvd25BZnRlclNlbmQ7CiB9Owog
CiB9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250
LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXgu
aHRtbAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDMxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFkPgorPHNjcmlwdCB0eXBl
PSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxpc3QoKSB7CisgICAgdmFy
IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDsKKyAgICB4aHIub3BlbigiR0VUIiwgIi9wYWdlbGlz
dC5qc29uIik7CisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKHho
ci5zdGF0dXMgPT0gMjAwKSB7CisgICAgICAgICAgICB2YXIgcGFnZXMgPSBKU09OLnBhcnNlKHho
ci5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkKKyAgICAgICAg
ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90aWNlIikuc3R5bGUuZGlz
cGxheSA9ICJub25lIjsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFnZXMpIHsKKyAgICAg
ICAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAg
ICAgICAgICAgICB2YXIgdGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBhZ2VzW2ldLnRpdGxlIDog
KCJQYWdlICIgKyAoTnVtYmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAgICAgICAgICAgIHZhciB1
cmwgPSBwYWdlc1tpXS51cmw7CisgICAgICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1
bWVudC5jcmVhdGVUZXh0Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiArIHVybCArICJdIikgOiAi
IiApKSk7CisgICAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCBwYWdlc1tp
XS5pbnNwZWN0b3JVcmwpOworICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hp
bGQobGluayk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH07CisgICAgeGhyLnNlbmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9N
Q29udGVudExvYWRlZCIsIGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8L3NjcmlwdD4KKzwvaGVh
ZD48Ym9keT4KKzxoMT5JbnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgorPHAgaWQ9Im5vUGFnZU5v
dGljZSIgc3R5bGU9ImNvbG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IHlvdSBo
YXZlIHNldCB0aGUgZGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJlbmNlIHByb3BlcnR5IG9u
IHlvdXIgV2ViVmlldy48L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDogU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0
ay9XZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNw
cAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MiBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZl
ci5oIgorCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclBy
b3h5LmgiCisjaW5jbHVkZSAiV2ViUGFnZVByb3h5LmgiCisjaW5jbHVkZSA8V2ViQ29yZS9NSU1F
VHlwZVJlZ2lzdHJ5Lmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4K
KyNpbmNsdWRlIDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK2Jvb2wgV2ViSW5zcGVjdG9yU2VydmVyOjpwbGF0Zm9ybVJlc291cmNlRm9y
UGF0aChjb25zdCBTdHJpbmcmIHBhdGgsIFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBjb250
ZW50VHlwZSkKK3sKKyAgICAvLyBUaGUgcGFnZSBsaXN0IGNvbnRhaW5zIGFuIHVuZm9ybWF0ZWQg
bGlzdCBvZiBwYWdlcyB0aGF0IGNhbiBiZSBpbnNwZWN0ZWQgd2l0aCBhIGxpbmsgdG8gb3BlbiBh
IHNlc3Npb24uCisgICAgaWYgKHBhdGggPT0gIi9wYWdlbGlzdC5qc29uIikgeworICAgICAgICBi
dWlsZFBhZ2VMaXN0KGRhdGEsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgLy8gUG9pbnQgdGhlIGRlZmF1bHQgcGF0aCB0byBhIGZvcm1hdHRlZCBwYWdl
IHRoYXQgcXVlcmllcyB0aGUgcGFnZSBsaXN0IGFuZCBkaXNwbGF5IHRoZW0uCisgICAgQ1N0cmlu
ZyBsb2NhbFBhdGggPSBXZWJDb3JlOjpmaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oU3RyaW5nKFdl
YkNvcmU6OnNoYXJlZFJlc291cmNlc1BhdGgoKS5kYXRhKCkpICsgKChwYXRoID09ICIvIikgPyAi
L3dlYmluc3BlY3Rvci9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbCIgOiBwYXRoKSk7CisgICAgaWYg
KGxvY2FsUGF0aC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR1JlZlB0
cjxHRmlsZT4gZmlsZSA9IGFkb3B0R1JlZihnX2ZpbGVfbmV3X2Zvcl9wYXRoKGxvY2FsUGF0aC5k
YXRhKCkpKTsKKyAgICBHUmVmUHRyPEdGaWxlSW5mbz4gZmlsZUluZm8gPSBhZG9wdEdSZWYoZ19m
aWxlX3F1ZXJ5X2luZm8oZmlsZS5nZXQoKSwgR19GSUxFX0FUVFJJQlVURV9TVEFOREFSRF9TSVpF
IiwiR19GSUxFX0FUVFJJQlVURV9TVEFOREFSRF9GQVNUX0NPTlRFTlRfVFlQRSwgR19GSUxFX1FV
RVJZX0lORk9fTk9ORSwgMCwgMCkpOworICAgIGlmICghZmlsZUluZm8pCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIEdSZWZQdHI8R0ZpbGVJbnB1dFN0cmVhbT4gaW5wdXRTdHJlYW0gPSBh
ZG9wdEdSZWYoZ19maWxlX3JlYWQoZmlsZS5nZXQoKSwgMCwgMCkpOworICAgIGlmICghaW5wdXRT
dHJlYW0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRhdGEuZ3JvdyhnX2ZpbGVfaW5m
b19nZXRfc2l6ZShmaWxlSW5mby5nZXQoKSkpOworICAgIGlmICghZ19pbnB1dF9zdHJlYW1fcmVh
ZF9hbGwoR19JTlBVVF9TVFJFQU0oaW5wdXRTdHJlYW0uZ2V0KCkpLCBkYXRhLmRhdGEoKSwgZGF0
YS5zaXplKCksIDAsIDAsIDApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb250ZW50
VHlwZSA9IEdPd25QdHI8Z2NoYXI+KGdfZmlsZV9pbmZvX2dldF9hdHRyaWJ1dGVfYXNfc3RyaW5n
KGZpbGVJbmZvLmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX0ZBU1RfQ09OVEVOVF9U
WVBFKSkuZ2V0KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV2ViSW5zcGVjdG9yU2Vy
dmVyOjpidWlsZFBhZ2VMaXN0KFZlY3RvcjxjaGFyPiYgZGF0YSwgU3RyaW5nJiBjb250ZW50VHlw
ZSkKK3sKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgYnVpbGRlci5hcHBlbmRMaXRl
cmFsKCJbICIpOworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgZW5kID0gbV9jbGllbnRNYXAuZW5k
KCk7CisgICAgZm9yIChDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jbGllbnRNYXAuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIFdlYlBhZ2VQcm94eSogd2ViUGFnZSA9IGl0
LT52YWx1ZS0+cGFnZSgpOworICAgICAgICBpZiAoaXQgIT0gbV9jbGllbnRNYXAuYmVnaW4oKSkK
KyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0ZXJhbCgiLCAiKTsKKyAgICAgICAgYnVpbGRl
ci5hcHBlbmRMaXRlcmFsKCJ7IFwiaWRcIjogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTnVt
YmVyKGl0LT5rZXkpOworICAgICAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIiwgXCJ0aXRsZVwi
OiBcIiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh3ZWJQYWdlLT5wYWdlVGl0bGUoKSk7Cisg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0ZXJhbCgiXCIsIFwidXJsXCI6IFwiIik7CisgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKHdlYlBhZ2UtPmFjdGl2ZVVSTCgpKTsKKyAgICAgICAgYnVpbGRlci5h
cHBlbmRMaXRlcmFsKCJcIiwgXCJpbnNwZWN0b3JVcmxcIjogXCIiKTsKKyAgICAgICAgYnVpbGRl
ci5hcHBlbmRMaXRlcmFsKCIvd2ViaW5zcGVjdG9yL2luc3BlY3Rvci5odG1sP3BhZ2U9Iik7Cisg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kTnVtYmVyKGl0LT5rZXkpOworICAgICAgICBidWlsZGVyLmFw
cGVuZExpdGVyYWwoIlwiIH0iKTsKKyAgICB9CisgICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCIg
XSIpOworICAgIENTdHJpbmcgY3N0ciA9IGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCk7CisgICAg
ZGF0YS5hcHBlbmQoY3N0ci5kYXRhKCksIGNzdHIubGVuZ3RoKCkpOworICAgIGNvbnRlbnRUeXBl
ID0gImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiOworfQorCit9CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJH
dGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJTb2NrZXRTZXJ2ZXJHdGsu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJW
RVIpCisjaW5jbHVkZSAiV2ViU29ja2V0U2VydmVyLmgiCisKKyNpbmNsdWRlICJMb2dnaW5nLmgi
CisjaW5jbHVkZSAiV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgPFdlYkNv
cmUvU29ja2V0U3RyZWFtSGFuZGxlLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUg
PGdsaWIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9nb2Jq
ZWN0L0dPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGljIGdib29sZWFu
IGNvbm5lY3Rpb25DYWxsYmFjayhHU29ja2V0U2VydmljZSogc2VydmljZSwgR1NvY2tldENvbm5l
Y3Rpb24qIGNvbm5lY3Rpb24sIEdPYmplY3QqIHNvdXJjZU9iamVjdCwgV2ViU29ja2V0U2VydmVy
KiBzZXJ2ZXIpCit7CisjaWYgIUxPR19ESVNBQkxFRAorICAgIEdSZWZQdHI8R1NvY2tldEFkZHJl
c3M+IHNvY2tldEFkZHJlc3MgPSBhZG9wdEdSZWYoZ19zb2NrZXRfY29ubmVjdGlvbl9nZXRfcmVt
b3RlX2FkZHJlc3MoY29ubmVjdGlvbiwgMCkpOworICAgIEdPd25QdHI8Z2NoYXI+IGFkZHJlc3NT
dHJpbmcoZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRf
YWRkcmVzcyhHX0lORVRfU09DS0VUX0FERFJFU1Moc29ja2V0QWRkcmVzcy5nZXQoKSkpKSk7Cisg
ICAgTE9HKEluc3BlY3RvclNlcnZlciwgIk5ldyBDb25uZWN0aW9uIGZyb20gJXM6JWQuIiwgYWRk
cmVzc1N0cmluZy5nZXQoKSwgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0KEdfSU5FVF9T
T0NLRVRfQUREUkVTUyhzb2NrZXRBZGRyZXNzLmdldCgpKSkpOworI2VuZGlmCisKKyAgICBPd25Q
dHI8V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbj4gd2ViU29ja2V0Q29ubmVjdGlvbiA9IGFkb3B0
UHRyKG5ldyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKHNlcnZlci0+Y2xpZW50KCksIHNlcnZl
cikpOworICAgIHdlYlNvY2tldENvbm5lY3Rpb24tPnNldFNvY2tldEhhbmRsZShTb2NrZXRTdHJl
YW1IYW5kbGU6OmNyZWF0ZShjb25uZWN0aW9uLCB3ZWJTb2NrZXRDb25uZWN0aW9uLmdldCgpKSk7
CisgICAgc2VydmVyLT5kaWRBY2NlcHRDb25uZWN0aW9uKHdlYlNvY2tldENvbm5lY3Rpb24ucmVs
ZWFzZSgpKTsKKworICAgIHJldHVybiBUUlVFOworfSAKKwordm9pZCBXZWJTb2NrZXRTZXJ2ZXI6
OnBsYXRmb3JtSW5pdGlhbGl6ZSgpCit7CisgICAgbV9zb2NrZXRTZXJ2aWNlID0gYWRvcHRHUmVm
KGdfc29ja2V0X3NlcnZpY2VfbmV3KCkpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9zb2NrZXRT
ZXJ2aWNlLmdldCgpLCAiaW5jb21pbmciLCBHX0NBTExCQUNLKGNvbm5lY3Rpb25DYWxsYmFjayks
IHRoaXMpOworICAgIGdfc29ja2V0X3NlcnZpY2Vfc3RhcnQobV9zb2NrZXRTZXJ2aWNlLmdldCgp
KTsKK30KKworYm9vbCBXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3JtTGlzdGVuKGNvbnN0IFN0cmlu
ZyYgYmluZEFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisgICAgTE9HKEluc3BlY3Rv
clNlcnZlciwgIkxpc3RlbiB0byBhZGRyZXNzPSVzLCBwb3J0PSVkLiIsIGJpbmRBZGRyZXNzLnV0
ZjgoKS5kYXRhKCksIHBvcnQpOworICAgIEdSZWZQdHI8R0luZXRBZGRyZXNzPiBhZGRyZXNzID0g
YWRvcHRHUmVmKGdfaW5ldF9hZGRyZXNzX25ld19mcm9tX3N0cmluZyhiaW5kQWRkcmVzcy51dGY4
KCkuZGF0YSgpKSk7CisgICAgR1JlZlB0cjxHU29ja2V0QWRkcmVzcz4gc29ja2V0QWRkcmVzcyA9
IGFkb3B0R1JlZihnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3KGFkZHJlc3MuZ2V0KCksIHBvcnQp
KTsKKyAgICByZXR1cm4gZ19zb2NrZXRfbGlzdGVuZXJfYWRkX2FkZHJlc3MoR19TT0NLRVRfTElT
VEVORVIobV9zb2NrZXRTZXJ2aWNlLmdldCgpKSwgc29ja2V0QWRkcmVzcy5nZXQoKSwgR19TT0NL
RVRfVFlQRV9TVFJFQU0sIEdfU09DS0VUX1BST1RPQ09MX1RDUCwgMCwgMCwgMCk7Cit9CisKK3Zv
aWQgV2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUNsb3NlKCkKK3sKKyAgICBnX3NvY2tldF9zZXJ2
aWNlX3N0b3AobV9zb2NrZXRTZXJ2aWNlLmdldCgpKTsKK30KKworfQorCisjZW5kaWYgLy8gRU5B
QkxFKElOU1BFQ1RPUl9TRVJWRVIpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvZ3Rr
L1dlYkNvbnRleHRHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9ndGsvV2ViQ29udGV4dEd0ay5jcHAJKHJldmlzaW9uIDEzMTkwNikKKysrIFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29udGV4dEd0ay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEs
NiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxMCBNb3Rvcm9sYSBNb2Jp
bGl0eSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBT
YW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTIgKzI3LDUyIEBACiAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpbmNsdWRlICJXZWJDb250ZXh0LmgiCisKKyNpbmNsdWRlICJXZWJJbnNwZWN0b3JT
ZXJ2ZXIuaCIKICNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KICNpbmNsdWRlIDxXZWJD
b3JlL05vdEltcGxlbWVudGVkLmg+CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKK3N0
YXRpYyB2b2lkIGluaXRJbnNwZWN0b3JTZXJ2ZXIoKQoreworI2lmIEVOQUJMRShJTlNQRUNUT1Jf
U0VSVkVSKQorICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKGlu
aXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpbml0aWFsaXplZCA9IHRydWU7Cisg
ICAgU3RyaW5nIHNlcnZlckFkZHJlc3MoZ19nZXRlbnYoIldFQktJVF9JTlNQRUNUT1JfU0VSVkVS
IikpOworCisgICAgaWYgKCFzZXJ2ZXJBZGRyZXNzLmlzTnVsbCgpKSB7CisgICAgICAgIFN0cmlu
ZyBiaW5kQWRkcmVzcyA9ICIxMjcuMC4wLjEiOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0
ID0gMjk5OTsKKworICAgICAgICBWZWN0b3I8U3RyaW5nPiByZXN1bHQ7CisgICAgICAgIHNlcnZl
ckFkZHJlc3Muc3BsaXQoIjoiLCByZXN1bHQpOworCisgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgp
ID09IDIpIHsKKyAgICAgICAgICAgIGJpbmRBZGRyZXNzID0gcmVzdWx0WzBdOworICAgICAgICAg
ICAgYm9vbCBvayA9IGZhbHNlOworICAgICAgICAgICAgcG9ydCA9IHJlc3VsdFsxXS50b0ludCgm
b2spOworICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgIHBvcnQgPSAyOTk5
OworICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ291bGRuJ3QgcGFyc2UgdGhlIHBvcnQuIFVz
ZSAyOTk5IGluc3RlYWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgTE9HX0VSUk9SKCJDb3VsZG4ndCBwYXJzZSAlcywgd3JvbmcgZm9ybWF0PyBVc2UgMTI3
LjAuMC4xOjI5OTkgaW5zdGVhZC4iLCBzZXJ2ZXJBZGRyZXNzLnV0ZjgoKS5kYXRhKCkpOworCisg
ICAgICAgIGlmICghV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5saXN0ZW4oYmluZEFkZHJl
c3MsIHBvcnQpKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZG4ndCBzdGFydCBsaXN0ZW5p
bmcgb246IElQIGFkZHJlc3M9JXMsIHBvcnQ9JWQuIiwgYmluZEFkZHJlc3MudXRmOCgpLmRhdGEo
KSwgcG9ydCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0coSW5zcGVjdG9yU2Vy
dmVyLCAiVG8gc3RhcnQgaW5zcGVjdG9yIHNlcnZlciBzZXQgV0VCS0lUX0lOU1BFQ1RPUl9TRVJW
RVIgdG8gMTI3LjAuMC4xOjI5OTkgZm9yIGV4YW1wbGUuIik7CisjZW5kaWYKK30KKwogV1RGOjpT
dHJpbmcgV2ViQ29udGV4dDo6YXBwbGljYXRpb25DYWNoZURpcmVjdG9yeSgpCiB7CiAgICAgR093
blB0cjxnY2hhcj4gY2FjaGVEaXJlY3RvcnkoZ19idWlsZF9maWxlbmFtZShnX2dldF91c2VyX2Nh
Y2hlX2RpcigpLCAid2Via2l0Z3RrIiwgImFwcGxpY2F0aW9ucyIsIE5VTEwpKTsKQEAgLTQwLDYg
KzgxLDcgQEAgV1RGOjpTdHJpbmcgV2ViQ29udGV4dDo6YXBwbGljYXRpb25DYWNoZQogCiB2b2lk
IFdlYkNvbnRleHQ6OnBsYXRmb3JtSW5pdGlhbGl6ZVdlYlByb2Nlc3MoV2ViUHJvY2Vzc0NyZWF0
aW9uUGFyYW1ldGVycyYpCiB7CisgICAgaW5pdEluc3BlY3RvclNlcnZlcigpOwogfQogCiB2b2lk
IFdlYkNvbnRleHQ6OnBsYXRmb3JtSW52YWxpZGF0ZUNvbnRleHQoKQpJbmRleDogU291cmNlL1dl
YktpdDIvcXQvUmVzb3VyY2VzL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL3F0L1Jlc291cmNlcy9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAkocmV2
aXNpb24gMTMxOTA2KQorKysgU291cmNlL1dlYktpdDIvcXQvUmVzb3VyY2VzL2luc3BlY3RvclBh
Z2VJbmRleC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBo
dG1sPgotPGh0bWw+PGhlYWQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5j
dGlvbiBjcmVhdGVQYWdlTGlzdCgpIHsKLSAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0
OwotICAgIHhoci5vcGVuKCJHRVQiLCAiL3BhZ2VsaXN0Lmpzb24iKTsKLSAgICB4aHIub25sb2Fk
ID0gZnVuY3Rpb24oZSkgewotICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHsKLSAgICAg
ICAgICAgIHZhciBwYWdlcyA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7Ci0gICAgICAg
ICAgICBpZiAocGFnZXMubGVuZ3RoKQotICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCJub1BhZ2VOb3RpY2UiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAg
ICAgZm9yICh2YXIgaSBpbiBwYWdlcykgewotICAgICAgICAgICAgICAgIHZhciBsaW5rID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHBh
Z2VzW2ldLnRpdGxlID8gcGFnZXNbaV0udGl0bGUgOiAoIlBhZ2UgIiArIChOdW1iZXIocGFnZXNb
aV0uaWQpKSk7Ci0gICAgICAgICAgICAgICAgdmFyIHVybCA9IHBhZ2VzW2ldLnVybDsKLSAgICAg
ICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRpdGxl
ICsgKHVybCA/ICgiIFsiICsgdXJsICsgIl0iKSA6ICIiICkpKTsKLSAgICAgICAgICAgICAgICBs
aW5rLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHBhZ2VzW2ldLmluc3BlY3RvclVybCk7Ci0gICAgICAg
ICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsKLSAgICAgICAgICAgICAg
ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICB4aHIuc2VuZCgpOwotfQot
Ci1kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgY3JlYXRlUGFn
ZUxpc3QsIGZhbHNlKTsKLTwvc2NyaXB0PgotPC9oZWFkPjxib2R5PgotPGgxPkluc3BlY3RhYmxl
IHdlYiB2aWV3czwvaDE+Ci08cCBpZD0ibm9QYWdlTm90aWNlIiBzdHlsZT0iY29sb3I6Z3JleSI+
Tm9uZSBmb3VuZCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc2V0IHRoZSBkZXZlbG9wZXJFeHRy
YXNFbmFibGVkIHByZWZlcmVuY2UgcHJvcGVydHkgb24geW91ciBXZWJWaWV3LjwvcD4KLTwvYm9k
eT48L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173334</attachid>
            <date>2012-11-09 10:29:40 -0800</date>
            <delta_ts>2012-11-13 04:21:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20121109182814.patch</filename>
            <type>text/plain</type>
            <size>49194</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNDA4MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTExLTA5ICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5k
bGUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVT
b3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0
U3RyZWFtSGFuZGxlOjpjb25uZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpwbGF0Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlOjpwbGF0Zm9ybUNsb3NlKToKKwogMjAxMi0xMS0wOSAgQWxleGV5IFByb3NrdXJ5YWtvdiAg
PGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBDb29raWVKYXIgdXNlcyBEb2N1bWVudCBjbGFzcywg
d2hpY2ggaXMgYSBsYXllcmluZyB2aW9sYXRpb24KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHJl
dmlzaW9uIDEzNDA3NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9T
b2NrZXRTdHJlYW1IYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJl
c2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsNiArNDcs
NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlIDog
cHVibGljIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVh
bUhhbmRsZUJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29j
a2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoY29uc3QgS1VSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRs
ZSh1cmwsIGNsaWVudCkpOyB9CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVh
bUhhbmRsZT4gY3JlYXRlKEdTb2NrZXRDb25uZWN0aW9uKiBzb2NrZXRDb25uZWN0aW9uLCBTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tl
dFN0cmVhbUhhbmRsZShzb2NrZXRDb25uZWN0aW9uLCBjbGllbnQpKTsgfQogCiAgICAgICAgIHZp
cnR1YWwgflNvY2tldFN0cmVhbUhhbmRsZSgpOwogICAgICAgICB2b2lkIGNvbm5lY3RlZChHU29j
a2V0Q29ubmVjdGlvbiosIEdFcnJvciopOwpAQCAtNjYsNiArNjgsNyBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAgICAgICAgIHZvaWQqIG1faWQ7CiAKICAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxl
KGNvbnN0IEtVUkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICAgICAgU29ja2V0
U3RyZWFtSGFuZGxlKEdTb2NrZXRDb25uZWN0aW9uKiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50
Kik7CiAKICAgICAgICAgLy8gTm8gYXV0aGVudGljYXRpb24gZm9yIHN0cmVhbXMgcGVyIHNlLCBi
dXQgcHJveHkgbWF5IGFzayBmb3IgY3JlZGVudGlhbHMuCiAgICAgICAgIHZvaWQgZGlkUmVjZWl2
ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFt
SGFuZGxlU291cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZVNvdXAuY3BwCShyZXZpc2lvbiAxMzQwNzcpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxl
U291cC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDA5LCAyMDExIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtOTUsNiArOTYsMTUg
QEAgU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUoYwogICAgICAgICByZWlu
dGVycHJldF9jYXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KGNvbm5lY3RlZENhbGxiYWNrKSwgbV9p
ZCk7CiB9CiAKK1NvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKEdTb2NrZXRD
b25uZWN0aW9uKiBzb2NrZXRDb25uZWN0aW9uLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNs
aWVudCkKKyAgICA6IFNvY2tldFN0cmVhbUhhbmRsZUJhc2UoS1VSTCgpLCBjbGllbnQpCisgICAg
LCBtX3JlYWRCdWZmZXIoMCkKK3sKKyAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRs
ZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhpcywgbV9jbGllbnQpOworICAgIG1faWQgPSBhY3RpdmF0
ZUhhbmRsZSh0aGlzKTsKKyAgICBjb25uZWN0ZWQoc29ja2V0Q29ubmVjdGlvbiwgMCk7Cit9CisK
IFNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSgpCiB7CiAgICAgTE9HKE5l
dHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgZGVsZXRlIiwgdGhpcyk7CkBAIC0xMTAsNyAr
MTIwLDcgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmNvbm5lY3RlZChHU29jawogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgbV9zb2NrZXRDb25uZWN0aW9uID0gYWRvcHRHUmVmKHNv
Y2tldENvbm5lY3Rpb24pOworICAgIG1fc29ja2V0Q29ubmVjdGlvbiA9IHNvY2tldENvbm5lY3Rp
b247CiAgICAgbV9vdXRwdXRTdHJlYW0gPSBHX1BPTExBQkxFX09VVFBVVF9TVFJFQU0oZ19pb19z
dHJlYW1fZ2V0X291dHB1dF9zdHJlYW0oR19JT19TVFJFQU0obV9zb2NrZXRDb25uZWN0aW9uLmdl
dCgpKSkpOwogICAgIG1faW5wdXRTdHJlYW0gPSBnX2lvX3N0cmVhbV9nZXRfaW5wdXRfc3RyZWFt
KEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpOwogCkBAIC0xNTYsNiArMTY2
LDkgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OndyaXRlUmVhZHkoKQogaW50IFNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7
CiAgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1TZW5kIiwg
dGhpcyk7CisgICAgaWYgKCFtX291dHB1dFN0cmVhbSB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJu
IDA7CisKICAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CiAgICAgZ3NzaXplIHdyaXR0ZW4gPSBn
X3BvbGxhYmxlX291dHB1dF9zdHJlYW1fd3JpdGVfbm9uYmxvY2tpbmcobV9vdXRwdXRTdHJlYW0u
Z2V0KCksIGRhdGEsIGxlbmd0aCwgMCwgJmVycm9yLm91dFB0cigpKTsKICAgICBpZiAoZXJyb3Ip
IHsKQEAgLTE5Miw2ICsyMDUsNyBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1D
bG9zZSgpCiAgICAgbV9vdXRwdXRTdHJlYW0gPSAwOwogICAgIG1faW5wdXRTdHJlYW0gPSAwOwog
ICAgIGRlbGV0ZSBtX3JlYWRCdWZmZXI7CisgICAgbV9yZWFkQnVmZmVyID0gMDsKIAogICAgIG1f
Y2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEzNDA4MikKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDc4IEBACisyMDEyLTExLTA5ICBBbnRvbiBPYnpoaXJvdiAgPGEub2J6aGly
b3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIG9m
IHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBvcnQuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5NCAKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgcGxhdGZvcm0gaW1wbGVtZW50
YXRpb24gaXMgYmFzZWQgb24gR1NvY2tldCBBUEkgKFdlYkluc3BlY3RvclNlcnZlckd0ay5jcHAg
YW5kIFdlYlNvY2tldFNlcnZlckd0ay5jcHApLgorICAgICAgICBUaGUgc2VydmVyIGxpc3RlbnMg
b24gcG9ydCAyOTk5IGJ5IGRlZmF1bHQuIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBjYW4gYmUg
c2V0CisgICAgICAgIGluIFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIChmb3IgZXhhbXBsZSBleHBv
cnQgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVI9IjE5Mi4xNjguMTI0LjEzMDoyOTk5IikuCisgICAg
ICAgIFRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBkdXJpbmcgV2ViS2l0IGNvbnRleHQgaW5pdGlhbGl6
YXRpb24uCisgICAgICAgIE9uY2UgYSBwYWdlIGlzIGxvYWRlZCBpbnNlY3RvciBzZXJ2ZXIgY2Fu
IGJlIGFjY2Vzc2VkIHZpYSBvdGhlciBXZWJLaXQgYmFzZWQgYnJvd3Nlci4KKyAgICAgICAgTmV3
IFdlYktpdCBBUEkgZ3RrIHRlc3RzIGhhdmUgYmVlZCBhZGRlZC4KKyAgICAgICAgaW5zcGVjdG9y
UGFnZUluZGV4Lmh0bWwgaGFzIGJlZW4gbW92ZWQgdG8gbmV3IGxvY2F0aW9uIHRvIHNoYXJlIHRo
ZSBmaWxlIGJldHdlZW4gR1RLIGFuZCBRdCBwb3J0cy4KKworICAgICAgICBUZXN0OiB0ZXN0LXBh
Z2UtbGlzdCwgdGVzdC1yZW1vdGUtZGVidWdnaW5nLW1lc3NhZ2UsIHRlc3Qtb3Blbi1kZWJ1Z2dp
bmctc2Vzc2lvbgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogR05VbWFr
ZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBQbGF0Zm9ybS9Mb2dnaW5nLmNwcDoKKyAgICAgICAg
KFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OmdldENoYW5uZWxGcm9tTmFtZSk6CisgICAgICAg
IChXZWJLaXQ6OmluaXRpYWxpemVMb2dDaGFubmVsc0lmTmVjZXNzYXJ5KToKKyAgICAgICAgKiBQ
bGF0Zm9ybS9Mb2dnaW5nLmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAqIFVJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKGxvYWRD
aGFuZ2VkQ2FsbGJhY2spOgorICAgICAgICAobWFpbik6CisgICAgICAgICogVUlQcm9jZXNzL0FQ
SS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHA6IEFkZGVkLgorICAgICAgICAoc3Rv
cFRlc3RTZXJ2ZXIpOgorICAgICAgICAoc2lnQWJvcnRIYW5kbGVyKToKKyAgICAgICAgKHRlc3RT
ZXJ2ZXJNb25pdG9yVGhyZWFkRnVuYyk6CisgICAgICAgIChzdGFydFRlc3RTZXJ2ZXJNb25pdG9y
KToKKyAgICAgICAgKHN0YXJ0VGVzdFNlcnZlcik6CisgICAgICAgICh0ZXN0SW5zcGVjdG9yU2Vy
dmVyUGFnZUxpc3QpOgorICAgICAgICAodGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UpOgorICAg
ICAgICAob3BlblJlbW90ZURlYnVnZ2luZ1Nlc3Npb24pOgorICAgICAgICAoYmVmb3JlQWxsKToK
KyAgICAgICAgKGFmdGVyQWxsKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVy
L1dlYkluc3BlY3RvclNlcnZlci5oOgorICAgICAgICAoV2ViSW5zcGVjdG9yU2VydmVyKToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oOgorICAg
ICAgICAoV2ViU29ja2V0U2VydmVyKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJT
b2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKToKKyAgICAg
ICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2h1dGRvd25Ob3cpOgorICAg
ICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzaHV0ZG93bkFmdGVyU2Vu
ZE9yTm93KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlk
Q2xvc2VTb2NrZXRTdHJlYW0pOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25u
ZWN0aW9uOjpkaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSk6CisgICAgICAgIChXZWJLaXQpOgor
ICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRVcGRhdGVCdWZm
ZXJlZEFtb3VudCk6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2Nr
ZXRTZXJ2ZXJDb25uZWN0aW9uLmg6CisgICAgICAgIChXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
KToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZDogQWRkZWQu
CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9mcm9udC1lbmQvaW5zcGVjdG9y
UGFnZUluZGV4Lmh0bWw6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvZ3RrOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9X
ZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjZUZvclBhdGgp
OgorICAgICAgICAoV2ViS2l0OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OmJ1aWxkUGFnZUxpc3QpOgor
ICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0
ay5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6Y29ubmVj
dGlvbkNhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9y
bUluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3Jt
TGlzdGVuKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUNsb3Nl
KToKKyAgICAgICAgKiBVSVByb2Nlc3MvZ3RrL1dlYkNvbnRleHRHdGsuY3BwOgorICAgICAgICAo
V2ViS2l0Ojppbml0SW5zcGVjdG9yU2VydmVyKToKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAg
IChXZWJLaXQ6OldlYkNvbnRleHQ6OnBsYXRmb3JtSW5pdGlhbGl6ZVdlYlByb2Nlc3MpOgorICAg
ICAgICAqIFdlYktpdDIucXJjOgorICAgICAgICAqIGNvbmZpZy5oOgorICAgICAgICAqIHF0L1Jl
c291cmNlcy9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDogUmVtb3ZlZC4KKwogMjAxMi0xMS0wOSAg
QWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBDb29raWVKYXIg
dXNlcyBEb2N1bWVudCBjbGFzcywgd2hpY2ggaXMgYSBsYXllcmluZyB2aW9sYXRpb24KSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9H
TlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtNTcsNiArNTcsNyBAQCBsaWJ3ZWJraXQy
Z3RrX0BXRUJLSVRHVEtfQVBJX01BSk9SX1ZFUlNJCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL1BsdWdpbnMgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9QbHVnaW5zL3VuaXggXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9zb3VwIFwKKwktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzIFwKIAktSSQo
c3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0FwcGxpY2F0aW9uQ2FjaGUgXAogCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0aGVudGljYXRpb24gXApAQCAt
NTc4LDYgKzU3OSw3IEBAIEVYVFJBX0RJU1QgKz0gXAogCSQoV2ViS2l0MikvU2NyaXB0cy93ZWJr
aXQyL21vZGVsLnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvd2Via2l0Mi9wYXJzZXIucHkgXAog
CSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvd2Via2l0Mm1hcnNoYWwubGlzdCBcCisJJChX
ZWJLaXQyKS9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdl
SW5kZXguaHRtbCBcCiAJJChXZWJLaXQyKS9TY3JpcHRzL2dlbmVyYXRlLWZvcndhcmRpbmctaGVh
ZGVycy5wbCBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1BsdWdpblByb2Nlc3MvKi5pbikgXAog
CSQoc2hlbGwgbHMgJChXZWJLaXQyKS9TaGFyZWQvKi5pbikgXApAQCAtNjA0LDMgKzYwNiw5IEBA
IEVYVFJBX0RJU1QgKz0gXAogCSQoc2hlbGwgbHMgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1dlYkNv
cmVTdXBwb3J0LyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9XZWJQ
YWdlLyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9zb3VwLyouaW4p
CisKKyMgSW5zdGFsbGluZyByZW1vdGUgaW5zcGVjdG9yIGZpbGVzCityZW1vdGVpbnNwZWN0b3Jk
aXIgPSAke2RhdGFkaXJ9L3dlYmtpdGd0ay1AV0VCS0lUR1RLX0FQSV9WRVJTSU9OQC93ZWJpbnNw
ZWN0b3IKK3JlbW90ZWluc3BlY3Rvcl9EQVRBID0gXAorCSQoV2ViS2l0MikvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwKKwpJbmRleDog
U291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBAIC05MzUsNiArOTM1
LDE1IEBAIHdlYmtpdDJfc291cmNlcyArPSBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dl
YlRleHRDaGVja2VyQ2xpZW50LmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNs
aWVudC5jcHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5oIFwKKwlT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZl
ci5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5z
cGVjdG9yU2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvV2ViU29ja2V0U2VydmVyLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDbGllbnQuaCBcCisJU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNw
cCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRT
ZXJ2ZXJDb25uZWN0aW9uLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAgXAogCVNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5jcHAgXAogCVNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5oIFwKIAlTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvV2ViVmlicmF0aW9uUHJveHkuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1dlYktpdDIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYktpdDIucXJj
CShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnFyYwkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIDwhRE9DVFlQRSBSQ0M+PFJDQyB2ZXJzaW9uPSIxLjAi
PgogPHFyZXNvdXJjZSBwcmVmaXg9Ii93ZWJraXQvcmVzb3VyY2VzIj4KLSAgICA8ZmlsZSBhbGlh
cz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiPnF0L1Jlc291cmNlcy9pbnNwZWN0b3JQYWdlSW5k
ZXguaHRtbDwvZmlsZT4KKyAgICA8ZmlsZSBhbGlhcz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwi
PlVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5o
dG1sPC9maWxlPgogPC9xcmVzb3VyY2U+CiA8L1JDQz4KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL2Nv
bmZpZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCShyZXZpc2lvbiAx
MzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTIw
LDcgKzEyMCw3IEBAIHN0YXRpYyBjb25zdCB0eXBlJiBuYW1lKCkgXAogI2RlZmluZSBQTFVHSU5f
QVJDSElURUNUVVJFKEFSQ0gpIChkZWZpbmVkIFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIICYm
IFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIKQogCiAjaWZuZGVmIEVOQUJMRV9JTlNQRUNUT1Jf
U0VSVkVSCi0jaWYgUExBVEZPUk0oUVQpCisjaWYgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKEdU
SykKICNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQogI2VuZGlmCiAjZW5kaWYKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCShyZXZpc2lvbiAxMzQwNzcpCisrKyBT
b3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAs
NiArNDAsNyBAQCBXVEZMb2dDaGFubmVsIExvZ0tleUhhbmRsaW5nICAgICAgID0geyAwCiBXVEZM
b2dDaGFubmVsIExvZ1BsdWdpbnMgICAgICAgICAgID0geyAweDAwMDAwMDQwLCAiV2ViS2l0Mkxv
Z0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9OwogV1RGTG9nQ2hhbm5lbCBMb2dOZXR3b3JrICAg
ICAgICAgICA9IHsgMHgwMDAwMDA4MCwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxP
ZmYgfTsKIFdURkxvZ0NoYW5uZWwgTG9nTmV0d29ya1NjaGVkdWxpbmcgPSB7IDB4MDAwMDAxMDAs
ICJXZWJLaXQyTG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07CitXVEZMb2dDaGFubmVsIExv
Z0luc3BlY3RvclNlcnZlciAgID0geyAweDAwMDAwMjAwLCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RG
TG9nQ2hhbm5lbE9mZiB9OwogCiAjaWYgIVBMQVRGT1JNKE1BQykgJiYgIVBMQVRGT1JNKEdUSykg
JiYgIVBMQVRGT1JNKFFUKSAmJiAhUExBVEZPUk0oRUZMKQogdm9pZCBpbml0aWFsaXplTG9nQ2hh
bm5lbChXVEZMb2dDaGFubmVsKiBjaGFubmVsKQpAQCAtNzgsNiArNzksOSBAQCBXVEZMb2dDaGFu
bmVsKiBnZXRDaGFubmVsRnJvbU5hbWUoY29uc3QKICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
Y2hhbm5lbE5hbWUsIFN0cmluZygiTmV0d29yayIpKSkKICAgICAgICAgcmV0dXJuICZMb2dOZXR3
b3JrOwogCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGNoYW5uZWxOYW1lLCBTdHJpbmcoIklu
c3BlY3RvclNlcnZlciIpKSkKKyAgICAgICAgcmV0dXJuICZMb2dJbnNwZWN0b3JTZXJ2ZXI7CisK
ICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtOTEsNiArOTUsNyBAQCB2b2lkIGluaXRpYWxp
emVMb2dDaGFubmVsc0lmTmVjZXNzYXJ5KCkKIAogICAgIGluaXRpYWxpemVMb2dDaGFubmVsKCZM
b2dDb250ZXh0TWVudSk7CiAgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0ljb25EYXRhYmFz
ZSk7CisgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0luc3BlY3RvclNlcnZlcik7CiAgICAg
aW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0tleUhhbmRsaW5nKTsKICAgICBpbml0aWFsaXplTG9n
Q2hhbm5lbCgmTG9nUGx1Z2lucyk7CiAgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ1Nlc3Np
b25TdGF0ZSk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvUGxhdGZvcm0vTG9nZ2luZy5oCShyZXZpc2lvbiAxMzQw
NzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgJKHdvcmtpbmcgY29weSkK
QEAgLTM5LDYgKzM5LDcgQEAgbmFtZXNwYWNlIFdlYktpdCB7CiAKIGV4dGVybiBXVEZMb2dDaGFu
bmVsIExvZ0NvbnRleHRNZW51OwogZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nSWNvbkRhdGFiYXNl
OworZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nSW5zcGVjdG9yU2VydmVyOwogZXh0ZXJuIFdURkxv
Z0NoYW5uZWwgTG9nS2V5SGFuZGxpbmc7CiBleHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dQbHVnaW5z
OwogZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nU2Vzc2lvblN0YXRlOwpJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW0J
KHJldmlzaW9uIDEzNDA3NykKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rl
c3RzL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0xLDExICsxLDEzIEBACiBpZiBF
TkFCTEVfV0VCS0lUMgogCiBURVNUX1BST0dTICs9IFwKKwlQcm9ncmFtcy9XZWJLaXQyQVBJVGVz
dHMvSW5zcGVjdG9yVGVzdFNlcnZlciBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RC
YWNrRm9yd2FyZExpc3QgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0Q29udGV4dE1l
bnUgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0Q29va2llTWFuYWdlciBcCiAJUHJv
Z3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3REb3dubG9hZHMgXAogCVByb2dyYW1zL1dlYktpdDJB
UElUZXN0cy9UZXN0SW5zcGVjdG9yIFwKKwlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdElu
c3BlY3RvclNlcnZlciBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RMb2FkZXJDbGll
bnQgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0UHJpbnRpbmcgXAogCVByb2dyYW1z
L1dlYktpdDJBUElUZXN0cy9UZXN0UmVzb3VyY2VzIFwKQEAgLTEwNiw2ICsxMDgsMTIgQEAgUHJv
Z3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJLaXRTZXR0aQogUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RXZWJLaXRTZXR0aW5nc19MREFERCA9ICQod2Via2l0Ml90ZXN0c19sZGFkZCkK
IFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2ViS2l0U2V0dGluZ3NfTERGTEFHUyA9ICQo
d2Via2l0Ml90ZXN0c19sZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVj
dG9yVGVzdFNlcnZlcl9TT1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVz
dHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFn
cykKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX0xEQUREID0g
JCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX0luc3BlY3Rv
clRlc3RTZXJ2ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFt
c19XZWJLaXQyQVBJVGVzdHNfVGVzdEJhY2tGb3J3YXJkTGlzdF9TT1VSQ0VTID0gXAogICAgICAg
ICBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0QmFja0ZvcndhcmRM
aXN0LmNwcAogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RCYWNrRm9yd2FyZExpc3RfQ1BQ
RkxBR1MgPSAkKHdlYmtpdDJfdGVzdHNfY3BwZmxhZ3MpCkBAIC0xODIsNiArMTkwLDEyIEBAIFBy
b2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yX0MKIFByb2dyYW1zX1dlYktpdDJB
UElUZXN0c19UZXN0SW5zcGVjdG9yX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQogUHJv
Z3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JfTERGTEFHUyA9ICQod2Via2l0Ml90
ZXN0c19sZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNl
cnZlcl9TT1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3Rz
L1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdElu
c3BlY3RvclNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKK1Byb2dy
YW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX0xEQUREID0gJCh3ZWJraXQy
X3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JTZXJ2
ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFtc19XZWJLaXQy
QVBJVGVzdHNfVGVzdFdlYktpdFZlcnNpb25fU09VUkNFUyA9IFwKICAgICAgICAgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFZlcnNpb24uY3BwCiBQcm9n
cmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFZlcnNpb25fQ1BQRkxBR1MgPSAkKHdlYmtp
dDJfdGVzdHNfY3BwZmxhZ3MpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3Bl
Y3RvclRlc3RTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRl
IDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8d2Via2l0Mi93ZWJraXQyLmg+CisKK3N0YXRpYyB2b2lk
IGxvYWRDaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmlldyosIFdlYktpdExvYWRFdmVudCBsb2Fk
RXZlbnQsIGdwb2ludGVyKQoreworICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBwYXJlbnQg
cHJvY2VzcyB3aGVuIHdlJ3JlIHJlYWR5LgorICAgIGlmIChsb2FkRXZlbnQgPT0gV0VCS0lUX0xP
QURfRklOSVNIRUQpCisgICAgICAgIGdfcHJpbnQoIk9LIik7Cit9CisKK2ludCBtYWluKGludCBh
cmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBndGtfaW5pdCgmYXJnYywgJmFyZ3YpOworCisgICAg
Ly8gT3ZlcndyaXRlIFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIHZhcmlhYmxlIHdpdGggZGVmYXVs
dCB2YWx1ZS4KKyAgICBnX3NldGVudigiV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIiLCAiMTI3LjAu
MC4xOjI5OTkiLCBUUlVFKTsKKworICAgIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcgPSBXRUJLSVRf
V0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsKKyAgICB3ZWJraXRfc2V0dGluZ3Nfc2V0
X2VuYWJsZV9kZXZlbG9wZXJfZXh0cmFzKHdlYmtpdF93ZWJfdmlld19nZXRfc2V0dGluZ3Mod2Vi
VmlldyksIFRSVUUpOworICAgIHdlYmtpdF93ZWJfdmlld19sb2FkX2h0bWwod2ViVmlldywKKyAg
ICAgICAgIjxodG1sPjxib2R5PjxwPldlYktpdEdUSysgSW5zcGVjdG9yIFRlc3QgU2VydmVyPC9w
PjwvYm9keT48L2h0bWw+IiwKKyAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8iKTsKKwor
ICAgIEd0a1dpZGdldCogd2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19UT1BMRVZF
TCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCBHVEtfV0lE
R0VUKHdlYlZpZXcpKTsKKyAgICBndGtfd2lkZ2V0X3Nob3dfYWxsKHdpbmRvdyk7CisKKyAgICBn
X3NpZ25hbF9jb25uZWN0KHdpbmRvdywgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0soZ3RrX21h
aW5fcXVpdCksIDApOworICAgIGdfc2lnbmFsX2Nvbm5lY3Qod2ViVmlldywgImxvYWQtY2hhbmdl
ZCIsIEdfQ0FMTEJBQ0sobG9hZENoYW5nZWRDYWxsYmFjayksIDApOworCisgICAgZ3RrX21haW4o
KTsKK30KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJ
bnNwZWN0b3JTZXJ2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZl
ci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJXZWJWaWV3VGVz
dC5oIgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KKworLy8gTmFtZSBvZiB0aGUgdGVzdCBzZXJ2ZXIgYXBwbGljYXRpb24g
Y3JlYXRpbmcgdGhlIHdlYlZpZXcgb2JqZWN0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGdUZXN0U2Vy
dmVyQXBwTmFtZSA9ICJJbnNwZWN0b3JUZXN0U2VydmVyIjsKKworLy8gTWF4IHNlY29uZHMgdG8g
d2FpdCBmb3IgdGhlIHRlc3Qgc2VydmVyIGJlZm9yZSBpbnNwZWN0aW5nIGl0Lgorc3RhdGljIGNv
bnN0IGludCBnTWF4V2FpdEZvckNoaWxkID0gNTsKKworLy8gVGhlIFBJRCBmb3IgdGhlIHRlc3Qg
c2VydmVyIHJ1bm5pbmcsIHNvIHdlIGNhbiBraWxsIGl0IGlmIG5lZWRlZC4KK3N0YXRpYyBHUGlk
IGdDaGlsZFByb2Nlc3NQaWQgPSAwOworCisvLyBXaGV0aGVyIHRoZSBjaGlsZCBoYXMgcmVwbGll
ZCBhbmQgaXQncyByZWFkeS4KK3N0YXRpYyBib29sIGdDaGlsZElzUmVhZHkgPSBmYWxzZTsKKwor
c3RhdGljIHZvaWQgc3RvcFRlc3RTZXJ2ZXIoKQoreworICAgIC8vIERvIG5vdGhpbmcgaWYgdGhl
cmUncyBubyBzZXJ2ZXIgcnVubmluZy4KKyAgICBpZiAoIWdDaGlsZFByb2Nlc3NQaWQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGdfc3Bhd25fY2xvc2VfcGlkKGdDaGlsZFByb2Nlc3NQaWQpOwor
ICAgIGtpbGwoZ0NoaWxkUHJvY2Vzc1BpZCwgU0lHVEVSTSk7CisgICAgZ0NoaWxkUHJvY2Vzc1Bp
ZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ0Fib3J0SGFuZGxlcihpbnQgc2lnTnVtKQorewor
ICAgIC8vIEp1c3Qgc3RvcCB0aGUgdGVzdCBzZXJ2ZXIgaWYgU0lHQUJSVCB3YXMgcmVjZWl2ZWQu
CisgICAgc3RvcFRlc3RTZXJ2ZXIoKTsKK30KKworc3RhdGljIGdwb2ludGVyIHRlc3RTZXJ2ZXJN
b25pdG9yVGhyZWFkRnVuYyhncG9pbnRlcikKK3sKKyAgICAvLyBXYWl0IGZvciB0aGUgc3BlY2lm
aWVkIHRpbWVvdXQgdG8gaGFwcGVuLgorICAgIGdfdXNsZWVwKGdNYXhXYWl0Rm9yQ2hpbGQgKiBH
X1VTRUNfUEVSX1NFQyk7CisKKyAgICAvLyBLaWxsIHRoZSBjaGlsZCBwcm9jZXNzIGlmIG5vdCBy
ZWFkeSB5ZXQuCisgICAgaWYgKCFnQ2hpbGRJc1JlYWR5KQorICAgICAgICBzdG9wVGVzdFNlcnZl
cigpOworCisgICAgZ190aHJlYWRfZXhpdCgwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGlj
IHZvaWQgc3RhcnRUZXN0U2VydmVyTW9uaXRvcigpCit7CisgICAgZ0NoaWxkSXNSZWFkeSA9IGZh
bHNlOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04oMiwgMzEsIDApKQorICAgIGdfdGhyZWFk
X2NyZWF0ZSh0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1bmMsIDAsIEZBTFNFLCAwKTsKKyNlbHNl
CisgICAgZ190aHJlYWRfbmV3KCJUZXN0U2VydmVyTW9uaXRvciIsIHRlc3RTZXJ2ZXJNb25pdG9y
VGhyZWFkRnVuYywgMCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc3RhcnRUZXN0U2VydmVy
KCkKK3sKKyAgICAvLyBQcmVwYXJlIGFyZ3ZbXSBmb3Igc3Bhd25pbmcgdGhlIHNlcnZlciBwcm9j
ZXNzLgorICAgIEdPd25QdHI8Y2hhcj4gdGVzdFNlcnZlclBhdGgoZ19idWlsZF9maWxlbmFtZShX
RUJLSVRfRVhFQ19QQVRILCAiV2ViS2l0MkFQSVRlc3RzIiwgZ1Rlc3RTZXJ2ZXJBcHBOYW1lLCBO
VUxMKSk7CisKKyAgICAvLyBXZSBpbnN0YWxsIGEgaGFuZGxlciB0byBlbnN1cmUgdGhhdCB3ZSBr
aWxsIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgLy8gaWYgdGhlIHBhcmVudCBkaWVzIGJlY2F1c2Ug
b2Ygd2hhdGV2ZXIgdGhlIHJlYXNvbiBpcy4KKyAgICBzaWduYWwoU0lHQUJSVCwgc2lnQWJvcnRI
YW5kbGVyKTsKKworICAgIGNoYXIqIHRlc3RTZXJ2ZXJBcmd2WzJdOworICAgIHRlc3RTZXJ2ZXJB
cmd2WzBdID0gdGVzdFNlcnZlclBhdGguZ2V0KCk7CisgICAgdGVzdFNlcnZlckFyZ3ZbMV0gPSAw
OworCisgICAgLy8gU3Bhd24gdGhlIHNlcnZlciwgZ2V0dGluZyBpdHMgc3Rkb3V0IGZpbGUgZGVz
Y3JpcHRvciB0byBzZXQgYQorICAgIC8vIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc28gd2Uga25v
dyB3aGVuIGl0J3MgcmVhZHkuCisgICAgaW50IGNoaWxkU3Rkb3V0ID0gMDsKKyAgICBnX2Fzc2Vy
dChnX3NwYXduX2FzeW5jX3dpdGhfcGlwZXMoMCwgdGVzdFNlcnZlckFyZ3YsIDAsIHN0YXRpY19j
YXN0PEdTcGF3bkZsYWdzPigwKSwgMCwgMCwKKyAgICAgICAgJmdDaGlsZFByb2Nlc3NQaWQsIDAs
ICZjaGlsZFN0ZG91dCwgMCwgMCkpOworCisgICAgLy8gU3RhcnQgbW9uaXRvcmluZyB0aGUgdGVz
dCBzZXJ2ZXIgKGluIGEgc2VwYXJhdGUgdGhyZWFkKSB0bworICAgIC8vIGVuc3VyZSB3ZSBkb24n
dCBibG9jayBvbiB0aGUgY2hpbGQgcHJvY2VzcyBtb3JlIHRoYW4gYSB0aW1lb3V0LgorICAgIHN0
YXJ0VGVzdFNlcnZlck1vbml0b3IoKTsKKworICAgIGNoYXIgbXNnWzJdOworICAgIEdJT0NoYW5u
ZWwqIGlvQ2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91bml4X25ldyhjaGlsZFN0ZG91dCk7CisgICAg
aWYgKGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzKGlvQ2hhbm5lbCwgbXNnLCAyLCAwLCAwKSA9PSBH
X0lPX1NUQVRVU19OT1JNQUwpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VydmVy
IHNlbnQgYSBtZXNzYWdlIHNheWluZyBpdCdzIHJlYWR5CisgICAgICAgIC8vIGFuZCBzdG9yZSB0
aGUgcmVzdWx0IGdsb2JhbGx5LCBzbyB0aGUgbW9uaXRvciBjYW4gc2VlIGl0LgorICAgICAgICBn
Q2hpbGRJc1JlYWR5ID0gbXNnWzBdID09ICdPJyAmJiBtc2dbMV0gPT0gJ0snOworICAgIH0KKyAg
ICBnX2lvX2NoYW5uZWxfdW5yZWYoaW9DaGFubmVsKTsKKyAgICBjbG9zZShjaGlsZFN0ZG91dCk7
CisKKyAgICAvLyBUaGUgdGltZW91dCB3YXMgcmVhY2hlZCBhbmQgdGhlIHNlcnZlciBpcyBub3Qg
cmVhZHkgeWV0LCBzbworICAgIC8vIHN0b3AgaXQgaW5tZWRpYXRlbHksIGFuZCBsZXQgdGhlIHVu
aXQgdGVzdHMgZmFpbC4KKyAgICBpZiAoIWdDaGlsZElzUmVhZHkpCisgICAgICAgIHN0b3BUZXN0
U2VydmVyKCk7Cit9CisKK2NsYXNzIEluc3BlY3RvclNlcnZlclRlc3Q6IHB1YmxpYyBXZWJWaWV3
VGVzdCB7CitwdWJsaWM6CisgICAgTUFLRV9HTElCX1RFU1RfRklYVFVSRShJbnNwZWN0b3JTZXJ2
ZXJUZXN0KTsKKworICAgIEluc3BlY3RvclNlcnZlclRlc3QoKQorICAgICAgICA6IFdlYlZpZXdU
ZXN0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBnZXRQYWdlTGlzdCgpCisgICAgeworICAg
ICAgICBsb2FkSHRtbCgiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iCisgICAg
ICAgICAgICAidmFyIHBhZ2VzO1xuIgorICAgICAgICAgICAgInZhciB4aHIgPSBuZXcgWE1MSHR0
cFJlcXVlc3Q7XG4iCisgICAgICAgICAgICAieGhyLm9wZW4oXCJHRVRcIiwgXCIvcGFnZWxpc3Qu
anNvblwiKTtcbiIKKyAgICAgICAgICAgICJ4aHIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuIgor
ICAgICAgICAgICAgICAgICJpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiIKKyAgICAgICAgICAg
ICAgICAgICAgInBhZ2VzID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiIKKyAgICAg
ICAgICAgICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJPS1wiO1xuIgorICAgICAgICAgICAg
ICAgICJ9IGVsc2UgXG4iCisgICAgICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwi
RkFJTFwiO1xuIgorICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAieGhyLnNlbmQo
KTtcbiIKKyAgICAgICAgICAgICI8L3NjcmlwdD5cbiIsCisgICAgICAgICAgICAiaHR0cDovLzEy
Ny4wLjAuMToyOTk5LyIpOworCisgICAgICAgIHdhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisg
ICAgICAgIGlmICghc3RyY21wKHdlYmtpdF93ZWJfdmlld19nZXRfdGl0bGUobV93ZWJWaWV3KSwg
Ik9LIikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgfkluc3BlY3RvclNlcnZlclRlc3QoKQorICAgIHsKKyAgICB9Cit9Owor
CisvLyBUZXN0IHRvIGdldCBpbnNwZWN0b3Igc2VydmVyIHBhZ2UgbGlzdCBmcm9tIHRoZSB0ZXN0
IHNlcnZlci4KKy8vIFNob3VsZCBjb250YWluIG9ubHkgb25lIGVudHJ5IHBvaW50aW5nIHRvIGh0
dHA6Ly8xMjcuMC4wLjE6Mjk5OS93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0xCitz
dGF0aWMgdm9pZCB0ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3QoSW5zcGVjdG9yU2VydmVyVGVz
dCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisK
KyAgICB0ZXN0LT5zaG93SW5XaW5kb3dBbmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BM
RVZFTCk7CisgICAgZ19hc3NlcnQodGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAgICBXZWJLaXRK
YXZhc2NyaXB0UmVzdWx0KiBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFu
ZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlcy5sZW5ndGg7IiwgJmVycm9yLm91dFB0cigpKTsKKyAg
ICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fzc2VydCghZXJyb3IuZ2V0KCkp
OworICAgIGdfYXNzZXJ0X2NtcGludChXZWJWaWV3VGVzdDo6amF2YXNjcmlwdFJlc3VsdFRvTnVt
YmVyKGphdmFzY3JpcHRSZXN1bHQpLCA9PSwgMSk7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0g
dGVzdC0+cnVuSmF2YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pZDsiLCAm
ZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdf
YXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgaW50IHBhZ2VJZCA9IFdlYlZpZXdUZXN0OjpqYXZh
c2NyaXB0UmVzdWx0VG9OdW1iZXIoamF2YXNjcmlwdFJlc3VsdCk7CisKKyAgICBHT3duUHRyPGNo
YXI+IHZhbHVlU3RyaW5nOworICAgIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2Ny
aXB0QW5kV2FpdFVudGlsRmluaXNoZWQoInBhZ2VzWzBdLnVybDsiLCAmZXJyb3Iub3V0UHRyKCkp
OworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5n
ZXQoKSk7CisgICAgdmFsdWVTdHJpbmcuc2V0KFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0
VG9DU3RyaW5nKGphdmFzY3JpcHRSZXN1bHQpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVT
dHJpbmcuZ2V0KCksID09LCAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisgICAgamF2YXNj
cmlwdFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFn
ZXNbMF0uaW5zcGVjdG9yVXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2
YXNjcmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0
cmluZy5zZXQoV2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlw
dFJlc3VsdCkpOworICAgIFN0cmluZyB2YWxpZEluc3BlY3RvclVSTCA9IFN0cmluZygiL3dlYmlu
c3BlY3Rvci9pbnNwZWN0b3IuaHRtbD9wYWdlPSIpICsgU3RyaW5nOjpudW1iZXIocGFnZUlkKTsK
KyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVTdHJpbmcuZ2V0KCksID09LCB2YWxpZEluc3BlY3Rv
clVSTC51dGY4KCkuZGF0YSgpKTsKK30KKworLy8gVGVzdCBzZW5kaW5nIGEgcmF3IHJlbW90ZSBk
ZWJ1Z2dpbmcgbWVzc2FnZSB0aHJvdWdoIG91ciB3ZWIgc29ja2V0IHNlcnZlci4KKy8vIEZvciB0
aGlzIHNwZWNpZmljIG1lc3NhZ2Ugc2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL2Nocm9tZS9k
ZXZ0b29scy9kb2NzL3Byb3RvY29sL3RvdC9ydW50aW1lLmh0bWwjY29tbWFuZC1ldmFsdWF0ZQor
c3RhdGljIHZvaWQgdGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UoSW5zcGVjdG9yU2VydmVyVGVz
dCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICB0ZXN0LT5zaG93SW5XaW5kb3dBbmRXYWl0
VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisKKyAgICB0ZXN0LT5sb2FkSHRtbCgi
PHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iCisgICAgICAgICJ2YXIgc29ja2V0
ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8xMjcuMC4wLjE6Mjk5OS9kZXZ0b29scy9wYWdlLzEnKTtc
biIKKyAgICAgICAgInNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4iCisg
ICAgICAgICAgICAidmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpO1xuIgor
ICAgICAgICAgICAgImlmIChyZXNwb25zZS5pZCA9PT0gMSlcbiIKKyAgICAgICAgICAgICAgICAi
ZG9jdW1lbnQudGl0bGUgPSByZXNwb25zZS5yZXN1bHQucmVzdWx0LnZhbHVlO1xuIgorICAgICAg
ICAgICAgImVsc2VcbiIKKyAgICAgICAgICAgICAgICAiZG9jdW1lbnQudGl0bGUgPSBcIkZBSUxc
IjtcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAic29ja2V0Lm9ub3BlbiA9IGZ1
bmN0aW9uKCkge1xuIgorICAgICAgICAgICAgInNvY2tldC5zZW5kKCd7XCJpZFwiOiAxLCBcIm1l
dGhvZFwiOiBcIlJ1bnRpbWUuZXZhbHVhdGVcIiwgXCJwYXJhbXNcIjoge1wiZXhwcmVzc2lvblwi
OiBcIjIgKyAyXCIgfSB9Jyk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICI8L3NjcmlwdD4i
LAorICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworICAgIHRlc3QtPndhaXRVbnRp
bFRpdGxlQ2hhbmdlZCgpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfdmlld19n
ZXRfdGl0bGUodGVzdC0+bV93ZWJWaWV3KSwgPT0sICI0Iik7Cit9CisKK3N0YXRpYyB2b2lkIG9w
ZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKEluc3BlY3RvclNlcnZlclRlc3QqIHRlc3QsIGdjb25z
dHBvaW50ZXIpCit7CisgICAgLy8gVG8gdGVzdCB0aGUgd2hvbGUgcGlwZWxpbmUgdGhpcyBleHBs
b2l0cyBhIGJlaGF2aW9yIG9mIHRoZSBpbnNwZWN0b3IgZnJvbnQtZW5kIHdoaWNoIHdvbid0IHBy
b3ZpZGUgYW55IHRpdGxlIHVubGVzcyB0aGUKKyAgICAvLyBkZWJ1Z2dpbmcgc2Vzc2lvbiB3YXMg
ZXN0YWJsaXNoZWQgY29ycmVjdGx5IHRocm91Z2ggd2ViIHNvY2tldC4gSXQgc2hvdWxkIGJlIHNv
bWV0aGluZyBsaWtlICJXZWIgSW5zcGVjdG9yIC0gPFBhZ2UgVVJMPiIuCisgICAgLy8gSW4gb3Vy
IGNhc2UgcGFnZSBVUkwgc2hvdWxkIGJlIGh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8KKyAgICAvLyBT
byB0aGlzIHRlc3QgY2FzZSB3aWxsIGZhaWwgaWY6CisgICAgLy8gLSBUaGUgcGFnZSBsaXN0IGRp
ZG4ndCByZXR1cm4gYSB2YWxpZCBpbnNwZWN0b3IgVVJMCisgICAgLy8gLSBPciB0aGUgZnJvbnQt
ZW5kIGNvdWxkbid0IGJlIGxvYWRlZCB0aHJvdWdoIHRoZSBpbnNwZWN0b3IgSFRUUCBzZXJ2ZXIK
KyAgICAvLyAtIE9yIHRoZSB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gY291bGRuJ3QgYmUgZXN0YWJs
aXNoZWQgYmV0d2VlbiB0aGUgZnJvbnQtZW5kIGFuZCB0aGUgcGFnZSB0aHJvdWdoIHRoZSBpbnNw
ZWN0b3Igc2VydmVyCisgICAgLy8gTGV0J3Mgc2VlIGlmIHRoaXMgdGVzdCBpc24ndCByYWlzaW5n
IHRvbyBtYW55IGZhbHNlIHBvc2l0aXZlcywgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgdXNlIGEg
YmV0dGVyIHByZWRpY2F0ZSBpZiBhdmFpbGFibGUuCisKKyAgICB0ZXN0LT5zaG93SW5XaW5kb3dB
bmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisKKyAgICBnX2Fzc2VydCh0
ZXN0LT5nZXRQYWdlTGlzdCgpKTsKKworICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKyAgICBX
ZWJLaXRKYXZhc2NyaXB0UmVzdWx0KiBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNj
cmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pbnNwZWN0b3JVcmw7IiwgJmVycm9y
Lm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fzc2Vy
dCghZXJyb3IuZ2V0KCkpOworCisgICAgU3RyaW5nIHJlc29sdmVkVVJMID0gU3RyaW5nKCJodHRw
Oi8vMTI3LjAuMC4xOjI5OTkvIikgKyBTdHJpbmc6OmZyb21VVEY4KFdlYlZpZXdUZXN0OjpqYXZh
c2NyaXB0UmVzdWx0VG9DU3RyaW5nKGphdmFzY3JpcHRSZXN1bHQpKTsKKyAgICB0ZXN0LT5sb2Fk
VVJJKHJlc29sdmVkVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIHRlc3QtPndhaXRVbnRpbFRpdGxl
Q2hhbmdlZCgpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfdmlld19nZXRfdGl0
bGUodGVzdC0+bV93ZWJWaWV3KSwgPT0sICJXZWIgSW5zcGVjdG9yIC0gaHR0cDovLzEyNy4wLjAu
MToyOTk5LyIpOworfQorCisKK3ZvaWQgYmVmb3JlQWxsKCkKK3sKKyAgICAvLyBPdmVyd3JpdGUg
V0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgdmFyaWFibGUgd2l0aCBkZWZhdWx0IElQIGFkZHJlc3Mg
YnV0IGRpZmZlcmVudCBwb3J0IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggdGhlIHRlc3QgaW5zcGVj
dG9yIHNlcnZlciBwYWdlLgorICAgIGdfc2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIs
ICIxMjcuMC4wLjE6Mjk5OCIsIFRSVUUpOworCisgICAgc3RhcnRUZXN0U2VydmVyKCk7CisgICAg
SW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRXZWJJbnNwZWN0b3JTZXJ2ZXIiLCAidGVz
dC1wYWdlLWxpc3QiLCB0ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3QpOworICAgIEluc3BlY3Rv
clNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3QtcmVtb3Rl
LWRlYnVnZ2luZy1tZXNzYWdlIiwgdGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UpOworICAgIElu
c3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3Qt
b3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbiIsIG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKTsKKwor
fQorCit2b2lkIGFmdGVyQWxsKCkKK3sKKyAgICBzdG9wVGVzdFNlcnZlcigpOworfQpJbmRleDog
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL1dlYkluc3BlY3RvclNlcnZlci5oCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02MSw3ICs2MSw3IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGRp
ZENsb3NlV2ViU29ja2V0Q29ubmVjdGlvbihXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKik7CiAK
ICAgICBib29sIHBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCwgVmVj
dG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKTsKLSNpZiBQTEFURk9STShRVCkK
KyNpZiBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oR1RLKQogICAgIHZvaWQgYnVpbGRQYWdlTGlz
dChWZWN0b3I8Y2hhcj4mIGRhdGEsIFN0cmluZyYgY29udGVudFR5cGUpOwogI2VuZGlmCiAKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2Vy
dmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAkocmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMjksOCArMjksMTQgQEAKIAogI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQog
CisjaWYgUExBVEZPUk0oR1RLKQorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNlbmRpZgogI2luY2x1
ZGUgPHd0Zi9EZXF1ZS5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpZiBQTEFURk9STShH
VEspCisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8
d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKICNpZiBQTEFURk9STShRVCkKQEAgLTc4LDYgKzg0LDgg
QEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBzaG9ydCBtX3BvcnQ7CiAjaWYgUExBVEZPUk0oUVQp
CiAgICAgT3duUHRyPFF0VGNwU2VydmVySGFuZGxlcj4gbV90Y3BTZXJ2ZXJIYW5kbGVyOworI2Vs
aWYgUExBVEZPUk0oR1RLKQorICAgIEdSZWZQdHI8R1NvY2tldFNlcnZpY2U+IG1fc29ja2V0U2Vy
dmljZTsKICNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
OwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2Vi
U29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAko
cmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAs
NiArNTAsNyBAQCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2CiAgICAg
LCBtX21vZGUoSFRUUCkKICAgICAsIG1fc2VydmVyKHNlcnZlcikKICAgICAsIG1fY2xpZW50KGNs
aWVudCkKKyAgICAsIG1fc2h1dGRvd25BZnRlclNlbmQoZmFsc2UpCiB7CiB9CiAKQEAgLTcwLDE2
ICs3MSwxNSBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3duCiAgICAg
ICAgIHJldHVybjsKICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBzb2NrZXQgPSBtX3Nv
Y2tldC5yZWxlYXNlKCk7CiAgICAgc29ja2V0LT5jbG9zZSgpOworICAgIG1fc2h1dGRvd25BZnRl
clNlbmQgPSBmYWxzZTsKIH0KIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzaHV0
ZG93bkFmdGVyU2VuZE9yTm93KCkKIHsKLSAgICAvLyBJZiB0aGlzIEFTU0VSVCBoYXBwZW5zIG9u
IGFueSBwbGF0Zm9ybSB0aGVuIHRoZWlyIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZAotICAgIC8v
IGZvbGxvd2VkIGJ5IGEgU29ja2V0U3RyZWFtSGFuZGxlOjpjbG9zZSBpcyBub3QgZ3VhcmVudGVl
ZCB0byBoYXZlIHNlbnQgYWxsCi0gICAgLy8gZGF0YS4gSWYgdGhpcyBoYXBwZW5zLCB3ZSBuZWVk
IHRvIHNsaWdodGx5IGNoYW5nZSB0aGUgZGVzaWduIHRvIGluY2x1ZGUgYQotICAgIC8vIFNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudDo6ZGlkU2VuZCwgaGFuZGxlIGl0IGhlcmUsIGFuZCBhZGQgYW4g
bV9zaHV0ZG93bkFmdGVyU2VuZAotICAgIC8vIHN0YXRlIG9uIHRoaXMgV2ViU29ja2V0U2VydmVy
Q29ubmVjdGlvbi4KLSAgICBBU1NFUlQoIW1fc29ja2V0LT5idWZmZXJlZEFtb3VudCgpKTsKKyAg
ICBpZiAobV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpIHsKKyAgICAgICAgbV9zaHV0ZG93bkFm
dGVyU2VuZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaHV0ZG93bk5v
dygpOwogfQpAQCAtMTI0LDYgKzEyNCw5IEBAIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlv
bjo6c2VuZFJhd0QKIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRDbG9zZVNv
Y2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqKQogeworICAgIC8vIERlc3Ryb3kgdGhlIFNv
Y2tldFN0cmVhbUhhbmRsZSBub3cgdG8gcHJldmVudCBjbG9zaW5nIGFuIGFscmVhZHkgY2xvc2Vk
IHNvY2tldCBsYXRlci4KKyAgICBtX3NvY2tldC5jbGVhcigpOworCiAgICAgLy8gV2ViIFNvY2tl
dCBNb2RlLgogICAgIGlmIChtX21vZGUgPT0gV2ViU29ja2V0KQogICAgICAgICBtX2NsaWVudC0+
ZGlkQ2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMpOwpAQCAtMTUxLDYgKzE1NCwxMiBAQCB2
b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFJlY2VpCiAgICAgfQogfQogCit2b2lk
IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNv
cmU6OlNvY2tldFN0cmVhbUhhbmRsZSosIHNpemVfdCkKK3sKKyAgICBpZiAobV9zaHV0ZG93bkFm
dGVyU2VuZCAmJiAhbV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpCisgICAgICAgIHNodXRkb3du
Tm93KCk7Cit9CisKIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkRmFpbFNvY2tl
dFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBTb2NrZXRTdHJlYW1FcnJvciYpCiB7
CiAgICAgLy8gUG9zc2libGUgcmVhZCBvciB3cml0ZSBlcnJvci4KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rp
b24uaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQCBwdWJsaWM6CiAgICAgLy8gU29j
a2V0U3RyZWFtSGFuZGxlQ2xpZW50IGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgdm9pZCBk
aWRDbG9zZVNvY2tldFN0cmVhbShXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUqKTsKICAgICB2
aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKiwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCk7CisgICAgdmlydHVhbCB2
b2lkIGRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSos
IHNpemVfdCBidWZmZXJlZEFtb3VudCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWxTb2NrZXRT
dHJlYW0oV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgV2ViQ29yZTo6U29ja2V0
U3RyZWFtRXJyb3ImKTsKIAogcHJpdmF0ZToKQEAgLTg2LDYgKzg3LDcgQEAgcHJvdGVjdGVkOgog
ICAgIFJlZlB0cjxXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU+IG1fc29ja2V0OwogICAgIFdl
YlNvY2tldFNlcnZlciogbV9zZXJ2ZXI7CiAgICAgV2ViU29ja2V0U2VydmVyQ2xpZW50KiBtX2Ns
aWVudDsKKyAgICBib29sIG1fc2h1dGRvd25BZnRlclNlbmQ7CiB9OwogCiB9CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQ
YWdlSW5kZXguaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5z
cGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5k
L2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMxIEBACis8
IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFkPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxpc3QoKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxI
dHRwUmVxdWVzdDsKKyAgICB4aHIub3BlbigiR0VUIiwgIi9wYWdlbGlzdC5qc29uIik7CisgICAg
eGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAw
KSB7CisgICAgICAgICAgICB2YXIgcGFnZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQp
OworICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90aWNlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsK
KyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFnZXMpIHsKKyAgICAgICAgICAgICAgICB2YXIg
bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgICAgICAgICB2YXIg
dGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBhZ2VzW2ldLnRpdGxlIDogKCJQYWdlICIgKyAoTnVt
YmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAgICAgICAgICAgIHZhciB1cmwgPSBwYWdlc1tpXS51
cmw7CisgICAgICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiArIHVybCArICJdIikgOiAiIiApKSk7CisgICAgICAg
ICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCBwYWdlc1tpXS5pbnNwZWN0b3JVcmwp
OworICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7CisgICAg
ICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgeGhyLnNl
bmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIs
IGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8L3NjcmlwdD4KKzwvaGVhZD48Ym9keT4KKzxoMT5J
bnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgorPHAgaWQ9Im5vUGFnZU5vdGljZSIgc3R5bGU9ImNv
bG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHNldCB0aGUgZGV2
ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJlbmNlIHByb3BlcnR5IG9uIHlvdXIgV2ViVmlldy48
L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0
cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5oIgorCisjaW5jbHVk
ZSAiV2ViSW5zcGVjdG9yUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNs
dWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL01JTUVUeXBlUmVn
aXN0cnkuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1
ZGUgPHd0Zi9nb2JqZWN0L0dPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2UgV2ViS2l0
IHsKKworYm9vbCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKGNv
bnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBl
KQoreworICAgIC8vIFRoZSBwYWdlIGxpc3QgY29udGFpbnMgYW4gdW5mb3JtYXRlZCBsaXN0IG9m
IHBhZ2VzIHRoYXQgY2FuIGJlIGluc3BlY3RlZCB3aXRoIGEgbGluayB0byBvcGVuIGEgc2Vzc2lv
bi4KKyAgICBpZiAocGF0aCA9PSAiL3BhZ2VsaXN0Lmpzb24iKSB7CisgICAgICAgIGJ1aWxkUGFn
ZUxpc3QoZGF0YSwgY29udGVudFR5cGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICAvLyBQb2ludCB0aGUgZGVmYXVsdCBwYXRoIHRvIGEgZm9ybWF0dGVkIHBhZ2UgdGhhdCBx
dWVyaWVzIHRoZSBwYWdlIGxpc3QgYW5kIGRpc3BsYXkgdGhlbS4KKyAgICBDU3RyaW5nIGxvY2Fs
UGF0aCA9IFdlYkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihTdHJpbmcoV2ViQ29yZTo6
c2hhcmVkUmVzb3VyY2VzUGF0aCgpLmRhdGEoKSkgKyAoKHBhdGggPT0gIi8iKSA/ICIvd2ViaW5z
cGVjdG9yL2luc3BlY3RvclBhZ2VJbmRleC5odG1sIiA6IHBhdGgpKTsKKyAgICBpZiAobG9jYWxQ
YXRoLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHUmVmUHRyPEdGaWxl
PiBmaWxlID0gYWRvcHRHUmVmKGdfZmlsZV9uZXdfZm9yX3BhdGgobG9jYWxQYXRoLmRhdGEoKSkp
OworICAgIEdSZWZQdHI8R0ZpbGVJbmZvPiBmaWxlSW5mbyA9IGFkb3B0R1JlZihnX2ZpbGVfcXVl
cnlfaW5mbyhmaWxlLmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX1NJWkUiLCJHX0ZJ
TEVfQVRUUklCVVRFX1NUQU5EQVJEX0ZBU1RfQ09OVEVOVF9UWVBFLCBHX0ZJTEVfUVVFUllfSU5G
T19OT05FLCAwLCAwKSk7CisgICAgaWYgKCFmaWxlSW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgR1JlZlB0cjxHRmlsZUlucHV0U3RyZWFtPiBpbnB1dFN0cmVhbSA9IGFkb3B0R1Jl
ZihnX2ZpbGVfcmVhZChmaWxlLmdldCgpLCAwLCAwKSk7CisgICAgaWYgKCFpbnB1dFN0cmVhbSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGF0YS5ncm93KGdfZmlsZV9pbmZvX2dldF9z
aXplKGZpbGVJbmZvLmdldCgpKSk7CisgICAgaWYgKCFnX2lucHV0X3N0cmVhbV9yZWFkX2FsbChH
X0lOUFVUX1NUUkVBTShpbnB1dFN0cmVhbS5nZXQoKSksIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUo
KSwgMCwgMCwgMCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnRlbnRUeXBlID0g
R093blB0cjxnY2hhcj4oZ19maWxlX2luZm9fZ2V0X2F0dHJpYnV0ZV9hc19zdHJpbmcoZmlsZUlu
Zm8uZ2V0KCksIEdfRklMRV9BVFRSSUJVVEVfU1RBTkRBUkRfRkFTVF9DT05URU5UX1RZUEUpKS5n
ZXQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OmJ1
aWxkUGFnZUxpc3QoVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKQorewor
ICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIlsg
Iik7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQgPSBtX2NsaWVudE1hcC5lbmQoKTsKKyAg
ICBmb3IgKENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBtX2NsaWVudE1hcC5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKKyAgICAgICAgV2ViUGFnZVByb3h5KiB3ZWJQYWdlID0gaXQtPnZhbHVl
LT5wYWdlKCk7CisgICAgICAgIGlmIChpdCAhPSBtX2NsaWVudE1hcC5iZWdpbigpKQorICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCIsICIpOworICAgICAgICBidWlsZGVyLmFwcGVu
ZExpdGVyYWwoInsgXCJpZFwiOiAiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmROdW1iZXIoaXQt
PmtleSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0ZXJhbCgiLCBcInRpdGxlXCI6IFwiIik7
CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHdlYlBhZ2UtPnBhZ2VUaXRsZSgpKTsKKyAgICAgICAg
YnVpbGRlci5hcHBlbmRMaXRlcmFsKCJcIiwgXCJ1cmxcIjogXCIiKTsKKyAgICAgICAgYnVpbGRl
ci5hcHBlbmQod2ViUGFnZS0+YWN0aXZlVVJMKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZExp
dGVyYWwoIlwiLCBcImluc3BlY3RvclVybFwiOiBcIiIpOworICAgICAgICBidWlsZGVyLmFwcGVu
ZExpdGVyYWwoIi93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0iKTsKKyAgICAgICAg
YnVpbGRlci5hcHBlbmROdW1iZXIoaXQtPmtleSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0
ZXJhbCgiXCIgfSIpOworICAgIH0KKyAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIiBdIik7Cisg
ICAgQ1N0cmluZyBjc3RyID0gYnVpbGRlci50b1N0cmluZygpLnV0ZjgoKTsKKyAgICBkYXRhLmFw
cGVuZChjc3RyLmRhdGEoKSwgY3N0ci5sZW5ndGgoKSk7CisgICAgY29udGVudFR5cGUgPSAiYXBw
bGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCI7Cit9CisKK30KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9n
dGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ft
c3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisg
KiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKyNp
bmNsdWRlICJXZWJTb2NrZXRTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNs
dWRlICJXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9Tb2Nr
ZXRTdHJlYW1IYW5kbGUuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8Z2xpYi5o
PgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgZ2Jvb2xlYW4gY29ubmVj
dGlvbkNhbGxiYWNrKEdTb2NrZXRTZXJ2aWNlKiBzZXJ2aWNlLCBHU29ja2V0Q29ubmVjdGlvbiog
Y29ubmVjdGlvbiwgR09iamVjdCogc291cmNlT2JqZWN0LCBXZWJTb2NrZXRTZXJ2ZXIqIHNlcnZl
cikKK3sKKyNpZiAhTE9HX0RJU0FCTEVECisgICAgR1JlZlB0cjxHU29ja2V0QWRkcmVzcz4gc29j
a2V0QWRkcmVzcyA9IGFkb3B0R1JlZihnX3NvY2tldF9jb25uZWN0aW9uX2dldF9yZW1vdGVfYWRk
cmVzcyhjb25uZWN0aW9uLCAwKSk7CisgICAgR093blB0cjxnY2hhcj4gYWRkcmVzc1N0cmluZyhn
X2luZXRfYWRkcmVzc190b19zdHJpbmcoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNz
KEdfSU5FVF9TT0NLRVRfQUREUkVTUyhzb2NrZXRBZGRyZXNzLmdldCgpKSkpKTsKKyAgICBMT0co
SW5zcGVjdG9yU2VydmVyLCAiTmV3IENvbm5lY3Rpb24gZnJvbSAlczolZC4iLCBhZGRyZXNzU3Ry
aW5nLmdldCgpLCBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X3BvcnQoR19JTkVUX1NPQ0tFVF9B
RERSRVNTKHNvY2tldEFkZHJlc3MuZ2V0KCkpKSk7CisjZW5kaWYKKworICAgIE93blB0cjxXZWJT
b2NrZXRTZXJ2ZXJDb25uZWN0aW9uPiB3ZWJTb2NrZXRDb25uZWN0aW9uID0gYWRvcHRQdHIobmV3
IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24oc2VydmVyLT5jbGllbnQoKSwgc2VydmVyKSk7Cisg
ICAgd2ViU29ja2V0Q29ubmVjdGlvbi0+c2V0U29ja2V0SGFuZGxlKFNvY2tldFN0cmVhbUhhbmRs
ZTo6Y3JlYXRlKGNvbm5lY3Rpb24sIHdlYlNvY2tldENvbm5lY3Rpb24uZ2V0KCkpKTsKKyAgICBz
ZXJ2ZXItPmRpZEFjY2VwdENvbm5lY3Rpb24od2ViU29ja2V0Q29ubmVjdGlvbi5yZWxlYXNlKCkp
OworCisgICAgcmV0dXJuIFRSVUU7Cit9IAorCit2b2lkIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZv
cm1Jbml0aWFsaXplKCkKK3sKKyAgICBtX3NvY2tldFNlcnZpY2UgPSBhZG9wdEdSZWYoZ19zb2Nr
ZXRfc2VydmljZV9uZXcoKSk7CisgICAgZ19zaWduYWxfY29ubmVjdChtX3NvY2tldFNlcnZpY2Uu
Z2V0KCksICJpbmNvbWluZyIsIEdfQ0FMTEJBQ0soY29ubmVjdGlvbkNhbGxiYWNrKSwgdGhpcyk7
CisgICAgZ19zb2NrZXRfc2VydmljZV9zdGFydChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQor
Citib29sIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1MaXN0ZW4oY29uc3QgU3RyaW5nJiBiaW5k
QWRkcmVzcywgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKyAgICBMT0coSW5zcGVjdG9yU2VydmVy
LCAiTGlzdGVuIHRvIGFkZHJlc3M9JXMsIHBvcnQ9JWQuIiwgYmluZEFkZHJlc3MudXRmOCgpLmRh
dGEoKSwgcG9ydCk7CisgICAgR1JlZlB0cjxHSW5ldEFkZHJlc3M+IGFkZHJlc3MgPSBhZG9wdEdS
ZWYoZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGJpbmRBZGRyZXNzLnV0ZjgoKS5kYXRh
KCkpKTsKKyAgICBHUmVmUHRyPEdTb2NrZXRBZGRyZXNzPiBzb2NrZXRBZGRyZXNzID0gYWRvcHRH
UmVmKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcoYWRkcmVzcy5nZXQoKSwgcG9ydCkpOworICAg
IHJldHVybiBnX3NvY2tldF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUiht
X3NvY2tldFNlcnZpY2UuZ2V0KCkpLCBzb2NrZXRBZGRyZXNzLmdldCgpLCBHX1NPQ0tFVF9UWVBF
X1NUUkVBTSwgR19TT0NLRVRfUFJPVE9DT0xfVENQLCAwLCAwLCAwKTsKK30KKwordm9pZCBXZWJT
b2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UoKQoreworICAgIGdfc29ja2V0X3NlcnZpY2Vfc3Rv
cChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5T
UEVDVE9SX1NFUlZFUikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29u
dGV4dEd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2d0ay9X
ZWJDb250ZXh0R3RrLmNwcAkocmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL2d0ay9XZWJDb250ZXh0R3RrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcg
QEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEwIE1vdG9yb2xhIE1vYmlsaXR5LCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcg
RWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC0yNiwxMiArMjcsNTIgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIldlYkNvbnRleHQuaCIKKworI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5o
IgogI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvTm90
SW1wbGVtZW50ZWQuaD4KICNpbmNsdWRlIDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAorc3RhdGljIHZv
aWQgaW5pdEluc3BlY3RvclNlcnZlcigpCit7CisjaWYgRU5BQkxFKElOU1BFQ1RPUl9TRVJWRVIp
CisgICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoaW5pdGlhbGl6
ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBTdHJp
bmcgc2VydmVyQWRkcmVzcyhnX2dldGVudigiV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIiKSk7CisK
KyAgICBpZiAoIXNlcnZlckFkZHJlc3MuaXNOdWxsKCkpIHsKKyAgICAgICAgU3RyaW5nIGJpbmRB
ZGRyZXNzID0gIjEyNy4wLjAuMSI7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSAyOTk5
OworCisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHJlc3VsdDsKKyAgICAgICAgc2VydmVyQWRkcmVz
cy5zcGxpdCgiOiIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMikg
eworICAgICAgICAgICAgYmluZEFkZHJlc3MgPSByZXN1bHRbMF07CisgICAgICAgICAgICBib29s
IG9rID0gZmFsc2U7CisgICAgICAgICAgICBwb3J0ID0gcmVzdWx0WzFdLnRvSW50KCZvayk7Cisg
ICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IDI5OTk7CisgICAg
ICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZG4ndCBwYXJzZSB0aGUgcG9ydC4gVXNlIDI5OTkg
aW5zdGVhZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBM
T0dfRVJST1IoIkNvdWxkbid0IHBhcnNlICVzLCB3cm9uZyBmb3JtYXQ/IFVzZSAxMjcuMC4wLjE6
Mjk5OSBpbnN0ZWFkLiIsIHNlcnZlckFkZHJlc3MudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAg
aWYgKCFXZWJJbnNwZWN0b3JTZXJ2ZXI6OnNoYXJlZCgpLmxpc3RlbihiaW5kQWRkcmVzcywgcG9y
dCkpCisgICAgICAgICAgICBMT0dfRVJST1IoIkNvdWxkbid0IHN0YXJ0IGxpc3RlbmluZyBvbjog
SVAgYWRkcmVzcz0lcywgcG9ydD0lZC4iLCBiaW5kQWRkcmVzcy51dGY4KCkuZGF0YSgpLCBwb3J0
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPRyhJbnNwZWN0b3JTZXJ2ZXIsICJU
byBzdGFydCBpbnNwZWN0b3Igc2VydmVyIHNldCBXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiB0byAx
MjcuMC4wLjE6Mjk5OSBmb3IgZXhhbXBsZS4iKTsKKyNlbmRpZgorfQorCiBXVEY6OlN0cmluZyBX
ZWJDb250ZXh0OjphcHBsaWNhdGlvbkNhY2hlRGlyZWN0b3J5KCkKIHsKICAgICBHT3duUHRyPGdj
aGFyPiBjYWNoZURpcmVjdG9yeShnX2J1aWxkX2ZpbGVuYW1lKGdfZ2V0X3VzZXJfY2FjaGVfZGly
KCksICJ3ZWJraXRndGsiLCAiYXBwbGljYXRpb25zIiwgTlVMTCkpOwpAQCAtNDAsNiArODEsNyBA
QCBXVEY6OlN0cmluZyBXZWJDb250ZXh0OjphcHBsaWNhdGlvbkNhY2hlCiAKIHZvaWQgV2ViQ29u
dGV4dDo6cGxhdGZvcm1Jbml0aWFsaXplV2ViUHJvY2VzcyhXZWJQcm9jZXNzQ3JlYXRpb25QYXJh
bWV0ZXJzJikKIHsKKyAgICBpbml0SW5zcGVjdG9yU2VydmVyKCk7CiB9CiAKIHZvaWQgV2ViQ29u
dGV4dDo6cGxhdGZvcm1JbnZhbGlkYXRlQ29udGV4dCgpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9x
dC9SZXNvdXJjZXMvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvcXQvUmVzb3VyY2VzL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShyZXZpc2lvbiAx
MzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9xdC9SZXNvdXJjZXMvaW5zcGVjdG9yUGFnZUluZGV4
Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08
aHRtbD48aGVhZD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIGNy
ZWF0ZVBhZ2VMaXN0KCkgewotICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7Ci0gICAg
eGhyLm9wZW4oIkdFVCIsICIvcGFnZWxpc3QuanNvbiIpOwotICAgIHhoci5vbmxvYWQgPSBmdW5j
dGlvbihlKSB7Ci0gICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkgewotICAgICAgICAgICAg
dmFyIHBhZ2VzID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTsKLSAgICAgICAgICAgIGlm
IChwYWdlcy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
Im5vUGFnZU5vdGljZSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgICAgICBmb3Ig
KHZhciBpIGluIHBhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGxpbmsgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJhIik7Ci0gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gcGFnZXNbaV0u
dGl0bGUgPyBwYWdlc1tpXS50aXRsZSA6ICgiUGFnZSAiICsgKE51bWJlcihwYWdlc1tpXS5pZCkp
KTsKLSAgICAgICAgICAgICAgICB2YXIgdXJsID0gcGFnZXNbaV0udXJsOwotICAgICAgICAgICAg
ICAgIGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGl0bGUgKyAodXJs
ID8gKCIgWyIgKyB1cmwgKyAiXSIpIDogIiIgKSkpOwotICAgICAgICAgICAgICAgIGxpbmsuc2V0
QXR0cmlidXRlKCJocmVmIiwgcGFnZXNbaV0uaW5zcGVjdG9yVXJsKTsKLSAgICAgICAgICAgICAg
ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspOwotICAgICAgICAgICAgICAgIGRvY3Vt
ZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHhoci5zZW5kKCk7Ci19Ci0KLWRvY3Vt
ZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBjcmVhdGVQYWdlTGlzdCwg
ZmFsc2UpOwotPC9zY3JpcHQ+Ci08L2hlYWQ+PGJvZHk+Ci08aDE+SW5zcGVjdGFibGUgd2ViIHZp
ZXdzPC9oMT4KLTxwIGlkPSJub1BhZ2VOb3RpY2UiIHN0eWxlPSJjb2xvcjpncmV5Ij5Ob25lIGZv
dW5kLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBzZXQgdGhlIGRldmVsb3BlckV4dHJhc0VuYWJs
ZWQgcHJlZmVyZW5jZSBwcm9wZXJ0eSBvbiB5b3VyIFdlYlZpZXcuPC9wPgotPC9ib2R5PjwvaHRt
bD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173859</attachid>
            <date>2012-11-13 04:21:16 -0800</date>
            <delta_ts>2012-11-14 06:26:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-88094-20121113121946.patch</filename>
            <type>text/plain</type>
            <size>49216</size>
            <attacher name="Anton Obzhirov">obzhirov</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNDA4MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTExLTA5ICBBbnRvbiBP
YnpoaXJvdiAgPGEub2J6aGlyb3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3Jt
IGltcGxlbWVudGF0aW9uIG9mIHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBv
cnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5
NCAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFeHRy
YSBTb2NrZXRTdHJlYW1IYW5kbGUgY29uc3RydWN0b3IgaXMgYWRkZWQgdG8gYWNjZXB0IGV4aXN0
aW5nIEdTb2NrZXRDb25uZWN0aW9uLgorICAgICAgICBOZWVkZWQgdG8gcGFzcyByZW1vdGUgaW5z
cGVjdG9yIHNlcnZlciBzb2NrZXQgY29ubmVjdGlvbi4gVGhlIGNoYW5nZSBpcyB0ZXN0ZWQgd2l0
aCAKKyAgICAgICAgaW5zcGVjdG9yIHNlcnZlciBBUEkgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmg6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZSk6CisgICAgICAgIChTb2NrZXRTdHJlYW1IYW5k
bGUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGVT
b3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0
U3RyZWFtSGFuZGxlOjpjb25uZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpwbGF0Zm9ybVNlbmQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlOjpwbGF0Zm9ybUNsb3NlKToKKwogMjAxMi0xMS0wOSAgQWxleGV5IFByb3NrdXJ5YWtvdiAg
PGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBDb29raWVKYXIgdXNlcyBEb2N1bWVudCBjbGFzcywg
d2hpY2ggaXMgYSBsYXllcmluZyB2aW9sYXRpb24KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvc291cC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHJl
dmlzaW9uIDEzNDA3NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9T
b2NrZXRTdHJlYW1IYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJl
c2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsNiArNDcs
NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlIDog
cHVibGljIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVh
bUhhbmRsZUJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29j
a2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoY29uc3QgS1VSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRs
ZSh1cmwsIGNsaWVudCkpOyB9CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVh
bUhhbmRsZT4gY3JlYXRlKEdTb2NrZXRDb25uZWN0aW9uKiBzb2NrZXRDb25uZWN0aW9uLCBTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tl
dFN0cmVhbUhhbmRsZShzb2NrZXRDb25uZWN0aW9uLCBjbGllbnQpKTsgfQogCiAgICAgICAgIHZp
cnR1YWwgflNvY2tldFN0cmVhbUhhbmRsZSgpOwogICAgICAgICB2b2lkIGNvbm5lY3RlZChHU29j
a2V0Q29ubmVjdGlvbiosIEdFcnJvciopOwpAQCAtNjYsNiArNjgsNyBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAgICAgICAgIHZvaWQqIG1faWQ7CiAKICAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxl
KGNvbnN0IEtVUkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICAgICAgU29ja2V0
U3RyZWFtSGFuZGxlKEdTb2NrZXRDb25uZWN0aW9uKiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50
Kik7CiAKICAgICAgICAgLy8gTm8gYXV0aGVudGljYXRpb24gZm9yIHN0cmVhbXMgcGVyIHNlLCBi
dXQgcHJveHkgbWF5IGFzayBmb3IgY3JlZGVudGlhbHMuCiAgICAgICAgIHZvaWQgZGlkUmVjZWl2
ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFt
SGFuZGxlU291cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9zb3VwL1NvY2tldFN0cmVhbUhhbmRsZVNvdXAuY3BwCShyZXZpc2lvbiAxMzQwNzcpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvU29ja2V0U3RyZWFtSGFuZGxl
U291cC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDA5LCAyMDExIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtOTUsNiArOTYsMTUg
QEAgU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUoYwogICAgICAgICByZWlu
dGVycHJldF9jYXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KGNvbm5lY3RlZENhbGxiYWNrKSwgbV9p
ZCk7CiB9CiAKK1NvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKEdTb2NrZXRD
b25uZWN0aW9uKiBzb2NrZXRDb25uZWN0aW9uLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNs
aWVudCkKKyAgICA6IFNvY2tldFN0cmVhbUhhbmRsZUJhc2UoS1VSTCgpLCBjbGllbnQpCisgICAg
LCBtX3JlYWRCdWZmZXIoMCkKK3sKKyAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRs
ZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhpcywgbV9jbGllbnQpOworICAgIG1faWQgPSBhY3RpdmF0
ZUhhbmRsZSh0aGlzKTsKKyAgICBjb25uZWN0ZWQoc29ja2V0Q29ubmVjdGlvbiwgMCk7Cit9CisK
IFNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSgpCiB7CiAgICAgTE9HKE5l
dHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgZGVsZXRlIiwgdGhpcyk7CkBAIC0xMTAsNyAr
MTIwLDcgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmNvbm5lY3RlZChHU29jawogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgbV9zb2NrZXRDb25uZWN0aW9uID0gYWRvcHRHUmVmKHNv
Y2tldENvbm5lY3Rpb24pOworICAgIG1fc29ja2V0Q29ubmVjdGlvbiA9IHNvY2tldENvbm5lY3Rp
b247CiAgICAgbV9vdXRwdXRTdHJlYW0gPSBHX1BPTExBQkxFX09VVFBVVF9TVFJFQU0oZ19pb19z
dHJlYW1fZ2V0X291dHB1dF9zdHJlYW0oR19JT19TVFJFQU0obV9zb2NrZXRDb25uZWN0aW9uLmdl
dCgpKSkpOwogICAgIG1faW5wdXRTdHJlYW0gPSBnX2lvX3N0cmVhbV9nZXRfaW5wdXRfc3RyZWFt
KEdfSU9fU1RSRUFNKG1fc29ja2V0Q29ubmVjdGlvbi5nZXQoKSkpOwogCkBAIC0xNTYsNiArMTY2
LDkgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OndyaXRlUmVhZHkoKQogaW50IFNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7
CiAgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1TZW5kIiwg
dGhpcyk7CisgICAgaWYgKCFtX291dHB1dFN0cmVhbSB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJu
IDA7CisKICAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CiAgICAgZ3NzaXplIHdyaXR0ZW4gPSBn
X3BvbGxhYmxlX291dHB1dF9zdHJlYW1fd3JpdGVfbm9uYmxvY2tpbmcobV9vdXRwdXRTdHJlYW0u
Z2V0KCksIGRhdGEsIGxlbmd0aCwgMCwgJmVycm9yLm91dFB0cigpKTsKICAgICBpZiAoZXJyb3Ip
IHsKQEAgLTE5Miw2ICsyMDUsNyBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1D
bG9zZSgpCiAgICAgbV9vdXRwdXRTdHJlYW0gPSAwOwogICAgIG1faW5wdXRTdHJlYW0gPSAwOwog
ICAgIGRlbGV0ZSBtX3JlYWRCdWZmZXI7CisgICAgbV9yZWFkQnVmZmVyID0gMDsKIAogICAgIG1f
Y2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEzNDA4MikKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDc4IEBACisyMDEyLTExLTA5ICBBbnRvbiBPYnpoaXJvdiAgPGEub2J6aGly
b3ZAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgQWRkIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIG9m
IHJlbW90ZSB3ZWIgaW5zcGVjdG9yIHNlcnZlciBmb3IgR1RLIHBvcnQuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODA5NCAKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgcGxhdGZvcm0gaW1wbGVtZW50
YXRpb24gaXMgYmFzZWQgb24gR1NvY2tldCBBUEkgKFdlYkluc3BlY3RvclNlcnZlckd0ay5jcHAg
YW5kIFdlYlNvY2tldFNlcnZlckd0ay5jcHApLgorICAgICAgICBUaGUgc2VydmVyIGxpc3RlbnMg
b24gcG9ydCAyOTk5IGJ5IGRlZmF1bHQuIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBjYW4gYmUg
c2V0CisgICAgICAgIGluIFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIChmb3IgZXhhbXBsZSBleHBv
cnQgV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVI9IjE5Mi4xNjguMTI0LjEzMDoyOTk5IikuCisgICAg
ICAgIFRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBkdXJpbmcgV2ViS2l0IGNvbnRleHQgaW5pdGlhbGl6
YXRpb24uCisgICAgICAgIE9uY2UgYSBwYWdlIGlzIGxvYWRlZCBpbnNlY3RvciBzZXJ2ZXIgY2Fu
IGJlIGFjY2Vzc2VkIHZpYSBvdGhlciBXZWJLaXQgYmFzZWQgYnJvd3Nlci4KKyAgICAgICAgTmV3
IFdlYktpdCBBUEkgZ3RrIHRlc3RzIGhhdmUgYmVlZCBhZGRlZC4KKyAgICAgICAgaW5zcGVjdG9y
UGFnZUluZGV4Lmh0bWwgaGFzIGJlZW4gbW92ZWQgdG8gbmV3IGxvY2F0aW9uIHRvIHNoYXJlIHRo
ZSBmaWxlIGJldHdlZW4gR1RLIGFuZCBRdCBwb3J0cy4KKworICAgICAgICBUZXN0OiB0ZXN0LXBh
Z2UtbGlzdCwgdGVzdC1yZW1vdGUtZGVidWdnaW5nLW1lc3NhZ2UsIHRlc3Qtb3Blbi1kZWJ1Z2dp
bmctc2Vzc2lvbgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogR05VbWFr
ZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBQbGF0Zm9ybS9Mb2dnaW5nLmNwcDoKKyAgICAgICAg
KFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OmdldENoYW5uZWxGcm9tTmFtZSk6CisgICAgICAg
IChXZWJLaXQ6OmluaXRpYWxpemVMb2dDaGFubmVsc0lmTmVjZXNzYXJ5KToKKyAgICAgICAgKiBQ
bGF0Zm9ybS9Mb2dnaW5nLmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAqIFVJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL0dOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKGxvYWRD
aGFuZ2VkQ2FsbGJhY2spOgorICAgICAgICAobWFpbik6CisgICAgICAgICogVUlQcm9jZXNzL0FQ
SS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZlci5jcHA6IEFkZGVkLgorICAgICAgICAoc3Rv
cFRlc3RTZXJ2ZXIpOgorICAgICAgICAoc2lnQWJvcnRIYW5kbGVyKToKKyAgICAgICAgKHRlc3RT
ZXJ2ZXJNb25pdG9yVGhyZWFkRnVuYyk6CisgICAgICAgIChzdGFydFRlc3RTZXJ2ZXJNb25pdG9y
KToKKyAgICAgICAgKHN0YXJ0VGVzdFNlcnZlcik6CisgICAgICAgICh0ZXN0SW5zcGVjdG9yU2Vy
dmVyUGFnZUxpc3QpOgorICAgICAgICAodGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UpOgorICAg
ICAgICAob3BlblJlbW90ZURlYnVnZ2luZ1Nlc3Npb24pOgorICAgICAgICAoYmVmb3JlQWxsKToK
KyAgICAgICAgKGFmdGVyQWxsKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVy
L1dlYkluc3BlY3RvclNlcnZlci5oOgorICAgICAgICAoV2ViSW5zcGVjdG9yU2VydmVyKToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlci5oOgorICAg
ICAgICAoV2ViU29ja2V0U2VydmVyKToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24uY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJT
b2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKToKKyAgICAg
ICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6c2h1dGRvd25Ob3cpOgorICAg
ICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzaHV0ZG93bkFmdGVyU2Vu
ZE9yTm93KToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlk
Q2xvc2VTb2NrZXRTdHJlYW0pOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25u
ZWN0aW9uOjpkaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSk6CisgICAgICAgIChXZWJLaXQpOgor
ICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRVcGRhdGVCdWZm
ZXJlZEFtb3VudCk6CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2Nr
ZXRTZXJ2ZXJDb25uZWN0aW9uLmg6CisgICAgICAgIChXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
KToKKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZDogQWRkZWQu
CisgICAgICAgICogVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9mcm9udC1lbmQvaW5zcGVjdG9y
UGFnZUluZGV4Lmh0bWw6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvZ3RrOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9X
ZWJJbnNwZWN0b3JTZXJ2ZXJHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYkluc3BlY3RvclNlcnZlcjo6cGxhdGZvcm1SZXNvdXJjZUZvclBhdGgp
OgorICAgICAgICAoV2ViS2l0OjpXZWJJbnNwZWN0b3JTZXJ2ZXI6OmJ1aWxkUGFnZUxpc3QpOgor
ICAgICAgICAqIFVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0
ay5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6Y29ubmVj
dGlvbkNhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9y
bUluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpXZWJTb2NrZXRTZXJ2ZXI6OnBsYXRmb3Jt
TGlzdGVuKToKKyAgICAgICAgKFdlYktpdDo6V2ViU29ja2V0U2VydmVyOjpwbGF0Zm9ybUNsb3Nl
KToKKyAgICAgICAgKiBVSVByb2Nlc3MvZ3RrL1dlYkNvbnRleHRHdGsuY3BwOgorICAgICAgICAo
V2ViS2l0Ojppbml0SW5zcGVjdG9yU2VydmVyKToKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAg
IChXZWJLaXQ6OldlYkNvbnRleHQ6OnBsYXRmb3JtSW5pdGlhbGl6ZVdlYlByb2Nlc3MpOgorICAg
ICAgICAqIFdlYktpdDIucXJjOgorICAgICAgICAqIGNvbmZpZy5oOgorICAgICAgICAqIHF0L1Jl
c291cmNlcy9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbDogUmVtb3ZlZC4KKwogMjAxMi0xMS0wOSAg
QWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBDb29raWVKYXIg
dXNlcyBEb2N1bWVudCBjbGFzcywgd2hpY2ggaXMgYSBsYXllcmluZyB2aW9sYXRpb24KSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQyL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9H
TlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtNTcsNiArNTcsNyBAQCBsaWJ3ZWJraXQy
Z3RrX0BXRUJLSVRHVEtfQVBJX01BSk9SX1ZFUlNJCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL1BsdWdpbnMgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9QbHVnaW5zL3VuaXggXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9zb3VwIFwKKwktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9y
U2VydmVyIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzIFwKIAktSSQo
c3JjZGlyKS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0FwcGxpY2F0aW9uQ2FjaGUgXAogCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0aGVudGljYXRpb24gXApAQCAt
NTc4LDYgKzU3OSw3IEBAIEVYVFJBX0RJU1QgKz0gXAogCSQoV2ViS2l0MikvU2NyaXB0cy93ZWJr
aXQyL21vZGVsLnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvd2Via2l0Mi9wYXJzZXIucHkgXAog
CSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvd2Via2l0Mm1hcnNoYWwubGlzdCBcCisJJChX
ZWJLaXQyKS9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdl
SW5kZXguaHRtbCBcCiAJJChXZWJLaXQyKS9TY3JpcHRzL2dlbmVyYXRlLWZvcndhcmRpbmctaGVh
ZGVycy5wbCBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1BsdWdpblByb2Nlc3MvKi5pbikgXAog
CSQoc2hlbGwgbHMgJChXZWJLaXQyKS9TaGFyZWQvKi5pbikgXApAQCAtNjA0LDMgKzYwNiw5IEBA
IEVYVFJBX0RJU1QgKz0gXAogCSQoc2hlbGwgbHMgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1dlYkNv
cmVTdXBwb3J0LyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9XZWJQ
YWdlLyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9zb3VwLyouaW4p
CisKKyMgSW5zdGFsbGluZyByZW1vdGUgaW5zcGVjdG9yIGZpbGVzCityZW1vdGVpbnNwZWN0b3Jk
aXIgPSAke2RhdGFkaXJ9L3dlYmtpdGd0ay1AV0VCS0lUR1RLX0FQSV9WRVJTSU9OQC93ZWJpbnNw
ZWN0b3IKK3JlbW90ZWluc3BlY3Rvcl9EQVRBID0gXAorCSQoV2ViS2l0MikvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9mcm9udC1lbmQvaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwKKwpJbmRleDog
U291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBAIC05MzUsNiArOTM1
LDE1IEBAIHdlYmtpdDJfc291cmNlcyArPSBcCiAJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dl
YlRleHRDaGVja2VyQ2xpZW50LmggXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNs
aWVudC5jcHAgXAogCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJVSUNsaWVudC5oIFwKKwlT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZl
ci5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViSW5z
cGVjdG9yU2VydmVyLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2
ZXIvV2ViU29ja2V0U2VydmVyLmNwcCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDbGllbnQuaCBcCisJU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNw
cCBcCisJU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRT
ZXJ2ZXJDb25uZWN0aW9uLmggXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JT
ZXJ2ZXIvZ3RrL1dlYkluc3BlY3RvclNlcnZlckd0ay5jcHAgXAorCVNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAgXAogCVNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5jcHAgXAogCVNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJWaWJyYXRpb25Qcm92aWRlci5oIFwKIAlTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvV2ViVmlicmF0aW9uUHJveHkuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1dlYktpdDIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYktpdDIucXJj
CShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnFyYwkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIDwhRE9DVFlQRSBSQ0M+PFJDQyB2ZXJzaW9uPSIxLjAi
PgogPHFyZXNvdXJjZSBwcmVmaXg9Ii93ZWJraXQvcmVzb3VyY2VzIj4KLSAgICA8ZmlsZSBhbGlh
cz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwiPnF0L1Jlc291cmNlcy9pbnNwZWN0b3JQYWdlSW5k
ZXguaHRtbDwvZmlsZT4KKyAgICA8ZmlsZSBhbGlhcz0iaW5zcGVjdG9yUGFnZUluZGV4Lmh0bWwi
PlVJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5kL2luc3BlY3RvclBhZ2VJbmRleC5o
dG1sPC9maWxlPgogPC9xcmVzb3VyY2U+CiA8L1JDQz4KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL2Nv
bmZpZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL2NvbmZpZy5oCShyZXZpc2lvbiAx
MzQwNzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9jb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTIw
LDcgKzEyMCw3IEBAIHN0YXRpYyBjb25zdCB0eXBlJiBuYW1lKCkgXAogI2RlZmluZSBQTFVHSU5f
QVJDSElURUNUVVJFKEFSQ0gpIChkZWZpbmVkIFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIICYm
IFBMVUdJTl9BUkNISVRFQ1RVUkVfIyNBUkNIKQogCiAjaWZuZGVmIEVOQUJMRV9JTlNQRUNUT1Jf
U0VSVkVSCi0jaWYgUExBVEZPUk0oUVQpCisjaWYgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKEdU
SykKICNkZWZpbmUgRU5BQkxFX0lOU1BFQ1RPUl9TRVJWRVIgMQogI2VuZGlmCiAjZW5kaWYKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL1BsYXRmb3JtL0xvZ2dpbmcuY3BwCShyZXZpc2lvbiAxMzQwNzcpCisrKyBT
b3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAs
NiArNDAsNyBAQCBXVEZMb2dDaGFubmVsIExvZ0tleUhhbmRsaW5nICAgICAgID0geyAwCiBXVEZM
b2dDaGFubmVsIExvZ1BsdWdpbnMgICAgICAgICAgID0geyAweDAwMDAwMDQwLCAiV2ViS2l0Mkxv
Z0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9mZiB9OwogV1RGTG9nQ2hhbm5lbCBMb2dOZXR3b3JrICAg
ICAgICAgICA9IHsgMHgwMDAwMDA4MCwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxP
ZmYgfTsKIFdURkxvZ0NoYW5uZWwgTG9nTmV0d29ya1NjaGVkdWxpbmcgPSB7IDB4MDAwMDAxMDAs
ICJXZWJLaXQyTG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT2ZmIH07CitXVEZMb2dDaGFubmVsIExv
Z0luc3BlY3RvclNlcnZlciAgID0geyAweDAwMDAwMjAwLCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RG
TG9nQ2hhbm5lbE9mZiB9OwogCiAjaWYgIVBMQVRGT1JNKE1BQykgJiYgIVBMQVRGT1JNKEdUSykg
JiYgIVBMQVRGT1JNKFFUKSAmJiAhUExBVEZPUk0oRUZMKQogdm9pZCBpbml0aWFsaXplTG9nQ2hh
bm5lbChXVEZMb2dDaGFubmVsKiBjaGFubmVsKQpAQCAtNzgsNiArNzksOSBAQCBXVEZMb2dDaGFu
bmVsKiBnZXRDaGFubmVsRnJvbU5hbWUoY29uc3QKICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
Y2hhbm5lbE5hbWUsIFN0cmluZygiTmV0d29yayIpKSkKICAgICAgICAgcmV0dXJuICZMb2dOZXR3
b3JrOwogCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGNoYW5uZWxOYW1lLCBTdHJpbmcoIklu
c3BlY3RvclNlcnZlciIpKSkKKyAgICAgICAgcmV0dXJuICZMb2dJbnNwZWN0b3JTZXJ2ZXI7CisK
ICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtOTEsNiArOTUsNyBAQCB2b2lkIGluaXRpYWxp
emVMb2dDaGFubmVsc0lmTmVjZXNzYXJ5KCkKIAogICAgIGluaXRpYWxpemVMb2dDaGFubmVsKCZM
b2dDb250ZXh0TWVudSk7CiAgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0ljb25EYXRhYmFz
ZSk7CisgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0luc3BlY3RvclNlcnZlcik7CiAgICAg
aW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ0tleUhhbmRsaW5nKTsKICAgICBpbml0aWFsaXplTG9n
Q2hhbm5lbCgmTG9nUGx1Z2lucyk7CiAgICAgaW5pdGlhbGl6ZUxvZ0NoYW5uZWwoJkxvZ1Nlc3Np
b25TdGF0ZSk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvUGxhdGZvcm0vTG9nZ2luZy5oCShyZXZpc2lvbiAxMzQw
NzcpCisrKyBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgJKHdvcmtpbmcgY29weSkK
QEAgLTM5LDYgKzM5LDcgQEAgbmFtZXNwYWNlIFdlYktpdCB7CiAKIGV4dGVybiBXVEZMb2dDaGFu
bmVsIExvZ0NvbnRleHRNZW51OwogZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nSWNvbkRhdGFiYXNl
OworZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nSW5zcGVjdG9yU2VydmVyOwogZXh0ZXJuIFdURkxv
Z0NoYW5uZWwgTG9nS2V5SGFuZGxpbmc7CiBleHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dQbHVnaW5z
OwogZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nU2Vzc2lvblN0YXRlOwpJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvR05VbWFrZWZpbGUuYW0J
KHJldmlzaW9uIDEzNDA3NykKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rl
c3RzL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0xLDExICsxLDEzIEBACiBpZiBF
TkFCTEVfV0VCS0lUMgogCiBURVNUX1BST0dTICs9IFwKKwlQcm9ncmFtcy9XZWJLaXQyQVBJVGVz
dHMvSW5zcGVjdG9yVGVzdFNlcnZlciBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RC
YWNrRm9yd2FyZExpc3QgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0Q29udGV4dE1l
bnUgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0Q29va2llTWFuYWdlciBcCiAJUHJv
Z3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3REb3dubG9hZHMgXAogCVByb2dyYW1zL1dlYktpdDJB
UElUZXN0cy9UZXN0SW5zcGVjdG9yIFwKKwlQcm9ncmFtcy9XZWJLaXQyQVBJVGVzdHMvVGVzdElu
c3BlY3RvclNlcnZlciBcCiAJUHJvZ3JhbXMvV2ViS2l0MkFQSVRlc3RzL1Rlc3RMb2FkZXJDbGll
bnQgXAogCVByb2dyYW1zL1dlYktpdDJBUElUZXN0cy9UZXN0UHJpbnRpbmcgXAogCVByb2dyYW1z
L1dlYktpdDJBUElUZXN0cy9UZXN0UmVzb3VyY2VzIFwKQEAgLTEwNiw2ICsxMDgsMTIgQEAgUHJv
Z3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RXZWJLaXRTZXR0aQogUHJvZ3JhbXNfV2ViS2l0MkFQ
SVRlc3RzX1Rlc3RXZWJLaXRTZXR0aW5nc19MREFERCA9ICQod2Via2l0Ml90ZXN0c19sZGFkZCkK
IFByb2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0V2ViS2l0U2V0dGluZ3NfTERGTEFHUyA9ICQo
d2Via2l0Ml90ZXN0c19sZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfSW5zcGVj
dG9yVGVzdFNlcnZlcl9TT1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z3RrL3Rlc3RzL0luc3BlY3RvclRlc3RTZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVz
dHNfSW5zcGVjdG9yVGVzdFNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFn
cykKK1Byb2dyYW1zX1dlYktpdDJBUElUZXN0c19JbnNwZWN0b3JUZXN0U2VydmVyX0xEQUREID0g
JCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX0luc3BlY3Rv
clRlc3RTZXJ2ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFt
c19XZWJLaXQyQVBJVGVzdHNfVGVzdEJhY2tGb3J3YXJkTGlzdF9TT1VSQ0VTID0gXAogICAgICAg
ICBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0QmFja0ZvcndhcmRM
aXN0LmNwcAogUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RCYWNrRm9yd2FyZExpc3RfQ1BQ
RkxBR1MgPSAkKHdlYmtpdDJfdGVzdHNfY3BwZmxhZ3MpCkBAIC0xODIsNiArMTkwLDEyIEBAIFBy
b2dyYW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yX0MKIFByb2dyYW1zX1dlYktpdDJB
UElUZXN0c19UZXN0SW5zcGVjdG9yX0xEQUREID0gJCh3ZWJraXQyX3Rlc3RzX2xkYWRkKQogUHJv
Z3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JfTERGTEFHUyA9ICQod2Via2l0Ml90
ZXN0c19sZGZsYWdzKQogCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdEluc3BlY3RvclNl
cnZlcl9TT1VSQ0VTID0gXAorCVNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3Rz
L1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCitQcm9ncmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdElu
c3BlY3RvclNlcnZlcl9DUFBGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19jcHBmbGFncykKK1Byb2dy
YW1zX1dlYktpdDJBUElUZXN0c19UZXN0SW5zcGVjdG9yU2VydmVyX0xEQUREID0gJCh3ZWJraXQy
X3Rlc3RzX2xkYWRkKQorUHJvZ3JhbXNfV2ViS2l0MkFQSVRlc3RzX1Rlc3RJbnNwZWN0b3JTZXJ2
ZXJfTERGTEFHUyA9ICQod2Via2l0Ml90ZXN0c19sZGZsYWdzKQorCiBQcm9ncmFtc19XZWJLaXQy
QVBJVGVzdHNfVGVzdFdlYktpdFZlcnNpb25fU09VUkNFUyA9IFwKICAgICAgICAgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFZlcnNpb24uY3BwCiBQcm9n
cmFtc19XZWJLaXQyQVBJVGVzdHNfVGVzdFdlYktpdFZlcnNpb25fQ1BQRkxBR1MgPSAkKHdlYmtp
dDJfdGVzdHNfY3BwZmxhZ3MpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9JbnNwZWN0b3JUZXN0U2VydmVyLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL0luc3Bl
Y3RvclRlc3RTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRl
IDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8d2Via2l0Mi93ZWJraXQyLmg+CisKK3N0YXRpYyB2b2lk
IGxvYWRDaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmlldyosIFdlYktpdExvYWRFdmVudCBsb2Fk
RXZlbnQsIGdwb2ludGVyKQoreworICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBwYXJlbnQg
cHJvY2VzcyB3aGVuIHdlJ3JlIHJlYWR5LgorICAgIGlmIChsb2FkRXZlbnQgPT0gV0VCS0lUX0xP
QURfRklOSVNIRUQpCisgICAgICAgIGdfcHJpbnQoIk9LIik7Cit9CisKK2ludCBtYWluKGludCBh
cmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBndGtfaW5pdCgmYXJnYywgJmFyZ3YpOworCisgICAg
Ly8gT3ZlcndyaXRlIFdFQktJVF9JTlNQRUNUT1JfU0VSVkVSIHZhcmlhYmxlIHdpdGggZGVmYXVs
dCB2YWx1ZS4KKyAgICBnX3NldGVudigiV0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIiLCAiMTI3LjAu
MC4xOjI5OTkiLCBUUlVFKTsKKworICAgIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcgPSBXRUJLSVRf
V0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsKKyAgICB3ZWJraXRfc2V0dGluZ3Nfc2V0
X2VuYWJsZV9kZXZlbG9wZXJfZXh0cmFzKHdlYmtpdF93ZWJfdmlld19nZXRfc2V0dGluZ3Mod2Vi
VmlldyksIFRSVUUpOworICAgIHdlYmtpdF93ZWJfdmlld19sb2FkX2h0bWwod2ViVmlldywKKyAg
ICAgICAgIjxodG1sPjxib2R5PjxwPldlYktpdEdUSysgSW5zcGVjdG9yIFRlc3QgU2VydmVyPC9w
PjwvYm9keT48L2h0bWw+IiwKKyAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8iKTsKKwor
ICAgIEd0a1dpZGdldCogd2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19UT1BMRVZF
TCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCBHVEtfV0lE
R0VUKHdlYlZpZXcpKTsKKyAgICBndGtfd2lkZ2V0X3Nob3dfYWxsKHdpbmRvdyk7CisKKyAgICBn
X3NpZ25hbF9jb25uZWN0KHdpbmRvdywgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0soZ3RrX21h
aW5fcXVpdCksIDApOworICAgIGdfc2lnbmFsX2Nvbm5lY3Qod2ViVmlldywgImxvYWQtY2hhbmdl
ZCIsIEdfQ0FMTEJBQ0sobG9hZENoYW5nZWRDYWxsYmFjayksIDApOworCisgICAgZ3RrX21haW4o
KTsKK30KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJ
bnNwZWN0b3JTZXJ2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdEluc3BlY3RvclNlcnZl
ci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJXZWJWaWV3VGVz
dC5oIgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KKworLy8gTmFtZSBvZiB0aGUgdGVzdCBzZXJ2ZXIgYXBwbGljYXRpb24g
Y3JlYXRpbmcgdGhlIHdlYlZpZXcgb2JqZWN0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGdUZXN0U2Vy
dmVyQXBwTmFtZSA9ICJJbnNwZWN0b3JUZXN0U2VydmVyIjsKKworLy8gTWF4IHNlY29uZHMgdG8g
d2FpdCBmb3IgdGhlIHRlc3Qgc2VydmVyIGJlZm9yZSBpbnNwZWN0aW5nIGl0Lgorc3RhdGljIGNv
bnN0IGludCBnTWF4V2FpdEZvckNoaWxkID0gNTsKKworLy8gVGhlIFBJRCBmb3IgdGhlIHRlc3Qg
c2VydmVyIHJ1bm5pbmcsIHNvIHdlIGNhbiBraWxsIGl0IGlmIG5lZWRlZC4KK3N0YXRpYyBHUGlk
IGdDaGlsZFByb2Nlc3NQaWQgPSAwOworCisvLyBXaGV0aGVyIHRoZSBjaGlsZCBoYXMgcmVwbGll
ZCBhbmQgaXQncyByZWFkeS4KK3N0YXRpYyBib29sIGdDaGlsZElzUmVhZHkgPSBmYWxzZTsKKwor
c3RhdGljIHZvaWQgc3RvcFRlc3RTZXJ2ZXIoKQoreworICAgIC8vIERvIG5vdGhpbmcgaWYgdGhl
cmUncyBubyBzZXJ2ZXIgcnVubmluZy4KKyAgICBpZiAoIWdDaGlsZFByb2Nlc3NQaWQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGdfc3Bhd25fY2xvc2VfcGlkKGdDaGlsZFByb2Nlc3NQaWQpOwor
ICAgIGtpbGwoZ0NoaWxkUHJvY2Vzc1BpZCwgU0lHVEVSTSk7CisgICAgZ0NoaWxkUHJvY2Vzc1Bp
ZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ0Fib3J0SGFuZGxlcihpbnQgc2lnTnVtKQorewor
ICAgIC8vIEp1c3Qgc3RvcCB0aGUgdGVzdCBzZXJ2ZXIgaWYgU0lHQUJSVCB3YXMgcmVjZWl2ZWQu
CisgICAgc3RvcFRlc3RTZXJ2ZXIoKTsKK30KKworc3RhdGljIGdwb2ludGVyIHRlc3RTZXJ2ZXJN
b25pdG9yVGhyZWFkRnVuYyhncG9pbnRlcikKK3sKKyAgICAvLyBXYWl0IGZvciB0aGUgc3BlY2lm
aWVkIHRpbWVvdXQgdG8gaGFwcGVuLgorICAgIGdfdXNsZWVwKGdNYXhXYWl0Rm9yQ2hpbGQgKiBH
X1VTRUNfUEVSX1NFQyk7CisKKyAgICAvLyBLaWxsIHRoZSBjaGlsZCBwcm9jZXNzIGlmIG5vdCBy
ZWFkeSB5ZXQuCisgICAgaWYgKCFnQ2hpbGRJc1JlYWR5KQorICAgICAgICBzdG9wVGVzdFNlcnZl
cigpOworCisgICAgZ190aHJlYWRfZXhpdCgwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGlj
IHZvaWQgc3RhcnRUZXN0U2VydmVyTW9uaXRvcigpCit7CisgICAgZ0NoaWxkSXNSZWFkeSA9IGZh
bHNlOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04oMiwgMzEsIDApKQorICAgIGdfdGhyZWFk
X2NyZWF0ZSh0ZXN0U2VydmVyTW9uaXRvclRocmVhZEZ1bmMsIDAsIEZBTFNFLCAwKTsKKyNlbHNl
CisgICAgZ190aHJlYWRfbmV3KCJUZXN0U2VydmVyTW9uaXRvciIsIHRlc3RTZXJ2ZXJNb25pdG9y
VGhyZWFkRnVuYywgMCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc3RhcnRUZXN0U2VydmVy
KCkKK3sKKyAgICAvLyBQcmVwYXJlIGFyZ3ZbXSBmb3Igc3Bhd25pbmcgdGhlIHNlcnZlciBwcm9j
ZXNzLgorICAgIEdPd25QdHI8Y2hhcj4gdGVzdFNlcnZlclBhdGgoZ19idWlsZF9maWxlbmFtZShX
RUJLSVRfRVhFQ19QQVRILCAiV2ViS2l0MkFQSVRlc3RzIiwgZ1Rlc3RTZXJ2ZXJBcHBOYW1lLCBO
VUxMKSk7CisKKyAgICAvLyBXZSBpbnN0YWxsIGEgaGFuZGxlciB0byBlbnN1cmUgdGhhdCB3ZSBr
aWxsIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgLy8gaWYgdGhlIHBhcmVudCBkaWVzIGJlY2F1c2Ug
b2Ygd2hhdGV2ZXIgdGhlIHJlYXNvbiBpcy4KKyAgICBzaWduYWwoU0lHQUJSVCwgc2lnQWJvcnRI
YW5kbGVyKTsKKworICAgIGNoYXIqIHRlc3RTZXJ2ZXJBcmd2WzJdOworICAgIHRlc3RTZXJ2ZXJB
cmd2WzBdID0gdGVzdFNlcnZlclBhdGguZ2V0KCk7CisgICAgdGVzdFNlcnZlckFyZ3ZbMV0gPSAw
OworCisgICAgLy8gU3Bhd24gdGhlIHNlcnZlciwgZ2V0dGluZyBpdHMgc3Rkb3V0IGZpbGUgZGVz
Y3JpcHRvciB0byBzZXQgYQorICAgIC8vIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc28gd2Uga25v
dyB3aGVuIGl0J3MgcmVhZHkuCisgICAgaW50IGNoaWxkU3Rkb3V0ID0gMDsKKyAgICBnX2Fzc2Vy
dChnX3NwYXduX2FzeW5jX3dpdGhfcGlwZXMoMCwgdGVzdFNlcnZlckFyZ3YsIDAsIHN0YXRpY19j
YXN0PEdTcGF3bkZsYWdzPigwKSwgMCwgMCwKKyAgICAgICAgJmdDaGlsZFByb2Nlc3NQaWQsIDAs
ICZjaGlsZFN0ZG91dCwgMCwgMCkpOworCisgICAgLy8gU3RhcnQgbW9uaXRvcmluZyB0aGUgdGVz
dCBzZXJ2ZXIgKGluIGEgc2VwYXJhdGUgdGhyZWFkKSB0bworICAgIC8vIGVuc3VyZSB3ZSBkb24n
dCBibG9jayBvbiB0aGUgY2hpbGQgcHJvY2VzcyBtb3JlIHRoYW4gYSB0aW1lb3V0LgorICAgIHN0
YXJ0VGVzdFNlcnZlck1vbml0b3IoKTsKKworICAgIGNoYXIgbXNnWzJdOworICAgIEdJT0NoYW5u
ZWwqIGlvQ2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91bml4X25ldyhjaGlsZFN0ZG91dCk7CisgICAg
aWYgKGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzKGlvQ2hhbm5lbCwgbXNnLCAyLCAwLCAwKSA9PSBH
X0lPX1NUQVRVU19OT1JNQUwpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VydmVy
IHNlbnQgYSBtZXNzYWdlIHNheWluZyBpdCdzIHJlYWR5CisgICAgICAgIC8vIGFuZCBzdG9yZSB0
aGUgcmVzdWx0IGdsb2JhbGx5LCBzbyB0aGUgbW9uaXRvciBjYW4gc2VlIGl0LgorICAgICAgICBn
Q2hpbGRJc1JlYWR5ID0gbXNnWzBdID09ICdPJyAmJiBtc2dbMV0gPT0gJ0snOworICAgIH0KKyAg
ICBnX2lvX2NoYW5uZWxfdW5yZWYoaW9DaGFubmVsKTsKKyAgICBjbG9zZShjaGlsZFN0ZG91dCk7
CisKKyAgICAvLyBUaGUgdGltZW91dCB3YXMgcmVhY2hlZCBhbmQgdGhlIHNlcnZlciBpcyBub3Qg
cmVhZHkgeWV0LCBzbworICAgIC8vIHN0b3AgaXQgaW5tZWRpYXRlbHksIGFuZCBsZXQgdGhlIHVu
aXQgdGVzdHMgZmFpbC4KKyAgICBpZiAoIWdDaGlsZElzUmVhZHkpCisgICAgICAgIHN0b3BUZXN0
U2VydmVyKCk7Cit9CisKK2NsYXNzIEluc3BlY3RvclNlcnZlclRlc3Q6IHB1YmxpYyBXZWJWaWV3
VGVzdCB7CitwdWJsaWM6CisgICAgTUFLRV9HTElCX1RFU1RfRklYVFVSRShJbnNwZWN0b3JTZXJ2
ZXJUZXN0KTsKKworICAgIEluc3BlY3RvclNlcnZlclRlc3QoKQorICAgICAgICA6IFdlYlZpZXdU
ZXN0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBnZXRQYWdlTGlzdCgpCisgICAgeworICAg
ICAgICBsb2FkSHRtbCgiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iCisgICAg
ICAgICAgICAidmFyIHBhZ2VzO1xuIgorICAgICAgICAgICAgInZhciB4aHIgPSBuZXcgWE1MSHR0
cFJlcXVlc3Q7XG4iCisgICAgICAgICAgICAieGhyLm9wZW4oXCJHRVRcIiwgXCIvcGFnZWxpc3Qu
anNvblwiKTtcbiIKKyAgICAgICAgICAgICJ4aHIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuIgor
ICAgICAgICAgICAgICAgICJpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiIKKyAgICAgICAgICAg
ICAgICAgICAgInBhZ2VzID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiIKKyAgICAg
ICAgICAgICAgICAgICAgImRvY3VtZW50LnRpdGxlID0gXCJPS1wiO1xuIgorICAgICAgICAgICAg
ICAgICJ9IGVsc2UgXG4iCisgICAgICAgICAgICAgICAgICAgICJkb2N1bWVudC50aXRsZSA9IFwi
RkFJTFwiO1xuIgorICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAieGhyLnNlbmQo
KTtcbiIKKyAgICAgICAgICAgICI8L3NjcmlwdD5cbiIsCisgICAgICAgICAgICAiaHR0cDovLzEy
Ny4wLjAuMToyOTk5LyIpOworCisgICAgICAgIHdhaXRVbnRpbFRpdGxlQ2hhbmdlZCgpOworCisg
ICAgICAgIGlmICghc3RyY21wKHdlYmtpdF93ZWJfdmlld19nZXRfdGl0bGUobV93ZWJWaWV3KSwg
Ik9LIikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgfkluc3BlY3RvclNlcnZlclRlc3QoKQorICAgIHsKKyAgICB9Cit9Owor
CisvLyBUZXN0IHRvIGdldCBpbnNwZWN0b3Igc2VydmVyIHBhZ2UgbGlzdCBmcm9tIHRoZSB0ZXN0
IHNlcnZlci4KKy8vIFNob3VsZCBjb250YWluIG9ubHkgb25lIGVudHJ5IHBvaW50aW5nIHRvIGh0
dHA6Ly8xMjcuMC4wLjE6Mjk5OS93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0xCitz
dGF0aWMgdm9pZCB0ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3QoSW5zcGVjdG9yU2VydmVyVGVz
dCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisK
KyAgICB0ZXN0LT5zaG93SW5XaW5kb3dBbmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BM
RVZFTCk7CisgICAgZ19hc3NlcnQodGVzdC0+Z2V0UGFnZUxpc3QoKSk7CisKKyAgICBXZWJLaXRK
YXZhc2NyaXB0UmVzdWx0KiBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNjcmlwdEFu
ZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlcy5sZW5ndGg7IiwgJmVycm9yLm91dFB0cigpKTsKKyAg
ICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fzc2VydCghZXJyb3IuZ2V0KCkp
OworICAgIGdfYXNzZXJ0X2NtcGludChXZWJWaWV3VGVzdDo6amF2YXNjcmlwdFJlc3VsdFRvTnVt
YmVyKGphdmFzY3JpcHRSZXN1bHQpLCA9PSwgMSk7CisKKyAgICBqYXZhc2NyaXB0UmVzdWx0ID0g
dGVzdC0+cnVuSmF2YVNjcmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pZDsiLCAm
ZXJyb3Iub3V0UHRyKCkpOworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdf
YXNzZXJ0KCFlcnJvci5nZXQoKSk7CisgICAgaW50IHBhZ2VJZCA9IFdlYlZpZXdUZXN0OjpqYXZh
c2NyaXB0UmVzdWx0VG9OdW1iZXIoamF2YXNjcmlwdFJlc3VsdCk7CisKKyAgICBHT3duUHRyPGNo
YXI+IHZhbHVlU3RyaW5nOworICAgIGphdmFzY3JpcHRSZXN1bHQgPSB0ZXN0LT5ydW5KYXZhU2Ny
aXB0QW5kV2FpdFVudGlsRmluaXNoZWQoInBhZ2VzWzBdLnVybDsiLCAmZXJyb3Iub3V0UHRyKCkp
OworICAgIGdfYXNzZXJ0KGphdmFzY3JpcHRSZXN1bHQpOworICAgIGdfYXNzZXJ0KCFlcnJvci5n
ZXQoKSk7CisgICAgdmFsdWVTdHJpbmcuc2V0KFdlYlZpZXdUZXN0OjpqYXZhc2NyaXB0UmVzdWx0
VG9DU3RyaW5nKGphdmFzY3JpcHRSZXN1bHQpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVT
dHJpbmcuZ2V0KCksID09LCAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworCisgICAgamF2YXNj
cmlwdFJlc3VsdCA9IHRlc3QtPnJ1bkphdmFTY3JpcHRBbmRXYWl0VW50aWxGaW5pc2hlZCgicGFn
ZXNbMF0uaW5zcGVjdG9yVXJsOyIsICZlcnJvci5vdXRQdHIoKSk7CisgICAgZ19hc3NlcnQoamF2
YXNjcmlwdFJlc3VsdCk7CisgICAgZ19hc3NlcnQoIWVycm9yLmdldCgpKTsKKyAgICB2YWx1ZVN0
cmluZy5zZXQoV2ViVmlld1Rlc3Q6OmphdmFzY3JpcHRSZXN1bHRUb0NTdHJpbmcoamF2YXNjcmlw
dFJlc3VsdCkpOworICAgIFN0cmluZyB2YWxpZEluc3BlY3RvclVSTCA9IFN0cmluZygiL3dlYmlu
c3BlY3Rvci9pbnNwZWN0b3IuaHRtbD9wYWdlPSIpICsgU3RyaW5nOjpudW1iZXIocGFnZUlkKTsK
KyAgICBnX2Fzc2VydF9jbXBzdHIodmFsdWVTdHJpbmcuZ2V0KCksID09LCB2YWxpZEluc3BlY3Rv
clVSTC51dGY4KCkuZGF0YSgpKTsKK30KKworLy8gVGVzdCBzZW5kaW5nIGEgcmF3IHJlbW90ZSBk
ZWJ1Z2dpbmcgbWVzc2FnZSB0aHJvdWdoIG91ciB3ZWIgc29ja2V0IHNlcnZlci4KKy8vIEZvciB0
aGlzIHNwZWNpZmljIG1lc3NhZ2Ugc2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL2Nocm9tZS9k
ZXZ0b29scy9kb2NzL3Byb3RvY29sL3RvdC9ydW50aW1lLmh0bWwjY29tbWFuZC1ldmFsdWF0ZQor
c3RhdGljIHZvaWQgdGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UoSW5zcGVjdG9yU2VydmVyVGVz
dCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICB0ZXN0LT5zaG93SW5XaW5kb3dBbmRXYWl0
VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisKKyAgICB0ZXN0LT5sb2FkSHRtbCgi
PHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iCisgICAgICAgICJ2YXIgc29ja2V0
ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8xMjcuMC4wLjE6Mjk5OS9kZXZ0b29scy9wYWdlLzEnKTtc
biIKKyAgICAgICAgInNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4iCisg
ICAgICAgICAgICAidmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpO1xuIgor
ICAgICAgICAgICAgImlmIChyZXNwb25zZS5pZCA9PT0gMSlcbiIKKyAgICAgICAgICAgICAgICAi
ZG9jdW1lbnQudGl0bGUgPSByZXNwb25zZS5yZXN1bHQucmVzdWx0LnZhbHVlO1xuIgorICAgICAg
ICAgICAgImVsc2VcbiIKKyAgICAgICAgICAgICAgICAiZG9jdW1lbnQudGl0bGUgPSBcIkZBSUxc
IjtcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAic29ja2V0Lm9ub3BlbiA9IGZ1
bmN0aW9uKCkge1xuIgorICAgICAgICAgICAgInNvY2tldC5zZW5kKCd7XCJpZFwiOiAxLCBcIm1l
dGhvZFwiOiBcIlJ1bnRpbWUuZXZhbHVhdGVcIiwgXCJwYXJhbXNcIjoge1wiZXhwcmVzc2lvblwi
OiBcIjIgKyAyXCIgfSB9Jyk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICI8L3NjcmlwdD4i
LAorICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToyOTk5LyIpOworICAgIHRlc3QtPndhaXRVbnRp
bFRpdGxlQ2hhbmdlZCgpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfdmlld19n
ZXRfdGl0bGUodGVzdC0+bV93ZWJWaWV3KSwgPT0sICI0Iik7Cit9CisKK3N0YXRpYyB2b2lkIG9w
ZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKEluc3BlY3RvclNlcnZlclRlc3QqIHRlc3QsIGdjb25z
dHBvaW50ZXIpCit7CisgICAgLy8gVG8gdGVzdCB0aGUgd2hvbGUgcGlwZWxpbmUgdGhpcyBleHBs
b2l0cyBhIGJlaGF2aW9yIG9mIHRoZSBpbnNwZWN0b3IgZnJvbnQtZW5kIHdoaWNoIHdvbid0IHBy
b3ZpZGUgYW55IHRpdGxlIHVubGVzcyB0aGUKKyAgICAvLyBkZWJ1Z2dpbmcgc2Vzc2lvbiB3YXMg
ZXN0YWJsaXNoZWQgY29ycmVjdGx5IHRocm91Z2ggd2ViIHNvY2tldC4gSXQgc2hvdWxkIGJlIHNv
bWV0aGluZyBsaWtlICJXZWIgSW5zcGVjdG9yIC0gPFBhZ2UgVVJMPiIuCisgICAgLy8gSW4gb3Vy
IGNhc2UgcGFnZSBVUkwgc2hvdWxkIGJlIGh0dHA6Ly8xMjcuMC4wLjE6Mjk5OS8KKyAgICAvLyBT
byB0aGlzIHRlc3QgY2FzZSB3aWxsIGZhaWwgaWY6CisgICAgLy8gLSBUaGUgcGFnZSBsaXN0IGRp
ZG4ndCByZXR1cm4gYSB2YWxpZCBpbnNwZWN0b3IgVVJMCisgICAgLy8gLSBPciB0aGUgZnJvbnQt
ZW5kIGNvdWxkbid0IGJlIGxvYWRlZCB0aHJvdWdoIHRoZSBpbnNwZWN0b3IgSFRUUCBzZXJ2ZXIK
KyAgICAvLyAtIE9yIHRoZSB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gY291bGRuJ3QgYmUgZXN0YWJs
aXNoZWQgYmV0d2VlbiB0aGUgZnJvbnQtZW5kIGFuZCB0aGUgcGFnZSB0aHJvdWdoIHRoZSBpbnNw
ZWN0b3Igc2VydmVyCisgICAgLy8gTGV0J3Mgc2VlIGlmIHRoaXMgdGVzdCBpc24ndCByYWlzaW5n
IHRvbyBtYW55IGZhbHNlIHBvc2l0aXZlcywgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgdXNlIGEg
YmV0dGVyIHByZWRpY2F0ZSBpZiBhdmFpbGFibGUuCisKKyAgICB0ZXN0LT5zaG93SW5XaW5kb3dB
bmRXYWl0VW50aWxNYXBwZWQoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisKKyAgICBnX2Fzc2VydCh0
ZXN0LT5nZXRQYWdlTGlzdCgpKTsKKworICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKyAgICBX
ZWJLaXRKYXZhc2NyaXB0UmVzdWx0KiBqYXZhc2NyaXB0UmVzdWx0ID0gdGVzdC0+cnVuSmF2YVNj
cmlwdEFuZFdhaXRVbnRpbEZpbmlzaGVkKCJwYWdlc1swXS5pbnNwZWN0b3JVcmw7IiwgJmVycm9y
Lm91dFB0cigpKTsKKyAgICBnX2Fzc2VydChqYXZhc2NyaXB0UmVzdWx0KTsKKyAgICBnX2Fzc2Vy
dCghZXJyb3IuZ2V0KCkpOworCisgICAgU3RyaW5nIHJlc29sdmVkVVJMID0gU3RyaW5nKCJodHRw
Oi8vMTI3LjAuMC4xOjI5OTkvIikgKyBTdHJpbmc6OmZyb21VVEY4KFdlYlZpZXdUZXN0OjpqYXZh
c2NyaXB0UmVzdWx0VG9DU3RyaW5nKGphdmFzY3JpcHRSZXN1bHQpKTsKKyAgICB0ZXN0LT5sb2Fk
VVJJKHJlc29sdmVkVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIHRlc3QtPndhaXRVbnRpbFRpdGxl
Q2hhbmdlZCgpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfdmlld19nZXRfdGl0
bGUodGVzdC0+bV93ZWJWaWV3KSwgPT0sICJXZWIgSW5zcGVjdG9yIC0gaHR0cDovLzEyNy4wLjAu
MToyOTk5LyIpOworfQorCisKK3ZvaWQgYmVmb3JlQWxsKCkKK3sKKyAgICAvLyBPdmVyd3JpdGUg
V0VCS0lUX0lOU1BFQ1RPUl9TRVJWRVIgdmFyaWFibGUgd2l0aCBkZWZhdWx0IElQIGFkZHJlc3Mg
YnV0IGRpZmZlcmVudCBwb3J0IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggdGhlIHRlc3QgaW5zcGVj
dG9yIHNlcnZlciBwYWdlLgorICAgIGdfc2V0ZW52KCJXRUJLSVRfSU5TUEVDVE9SX1NFUlZFUiIs
ICIxMjcuMC4wLjE6Mjk5OCIsIFRSVUUpOworCisgICAgc3RhcnRUZXN0U2VydmVyKCk7CisgICAg
SW5zcGVjdG9yU2VydmVyVGVzdDo6YWRkKCJXZWJLaXRXZWJJbnNwZWN0b3JTZXJ2ZXIiLCAidGVz
dC1wYWdlLWxpc3QiLCB0ZXN0SW5zcGVjdG9yU2VydmVyUGFnZUxpc3QpOworICAgIEluc3BlY3Rv
clNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3QtcmVtb3Rl
LWRlYnVnZ2luZy1tZXNzYWdlIiwgdGVzdFJlbW90ZURlYnVnZ2luZ01lc3NhZ2UpOworICAgIElu
c3BlY3RvclNlcnZlclRlc3Q6OmFkZCgiV2ViS2l0V2ViSW5zcGVjdG9yU2VydmVyIiwgInRlc3Qt
b3Blbi1kZWJ1Z2dpbmctc2Vzc2lvbiIsIG9wZW5SZW1vdGVEZWJ1Z2dpbmdTZXNzaW9uKTsKKwor
fQorCit2b2lkIGFmdGVyQWxsKCkKK3sKKyAgICBzdG9wVGVzdFNlcnZlcigpOworfQpJbmRleDog
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJJbnNwZWN0b3JTZXJ2
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2Vy
dmVyL1dlYkluc3BlY3RvclNlcnZlci5oCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYkluc3BlY3RvclNlcnZlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02MSw3ICs2MSw3IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGRp
ZENsb3NlV2ViU29ja2V0Q29ubmVjdGlvbihXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uKik7CiAK
ICAgICBib29sIHBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCwgVmVj
dG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKTsKLSNpZiBQTEFURk9STShRVCkK
KyNpZiBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oR1RLKQogICAgIHZvaWQgYnVpbGRQYWdlTGlz
dChWZWN0b3I8Y2hhcj4mIGRhdGEsIFN0cmluZyYgY29udGVudFR5cGUpOwogI2VuZGlmCiAKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2Vy
dmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAkocmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMjksOCArMjksMTQgQEAKIAogI2lmIEVOQUJMRShJTlNQRUNUT1JfU0VSVkVSKQog
CisjaWYgUExBVEZPUk0oR1RLKQorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNlbmRpZgogI2luY2x1
ZGUgPHd0Zi9EZXF1ZS5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpZiBQTEFURk9STShH
VEspCisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8
d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKICNpZiBQTEFURk9STShRVCkKQEAgLTc4LDYgKzg0LDgg
QEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBzaG9ydCBtX3BvcnQ7CiAjaWYgUExBVEZPUk0oUVQp
CiAgICAgT3duUHRyPFF0VGNwU2VydmVySGFuZGxlcj4gbV90Y3BTZXJ2ZXJIYW5kbGVyOworI2Vs
aWYgUExBVEZPUk0oR1RLKQorICAgIEdSZWZQdHI8R1NvY2tldFNlcnZpY2U+IG1fc29ja2V0U2Vy
dmljZTsKICNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9u
OwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2Vi
U29ja2V0U2VydmVyQ29ubmVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAko
cmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNl
cnZlci9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAs
NiArNTAsNyBAQCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpXZWJTb2NrZXRTZXJ2CiAgICAg
LCBtX21vZGUoSFRUUCkKICAgICAsIG1fc2VydmVyKHNlcnZlcikKICAgICAsIG1fY2xpZW50KGNs
aWVudCkKKyAgICAsIG1fc2h1dGRvd25BZnRlclNlbmQoZmFsc2UpCiB7CiB9CiAKQEAgLTcwLDE2
ICs3MSwxNSBAQCB2b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OnNodXRkb3duCiAgICAg
ICAgIHJldHVybjsKICAgICBSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBzb2NrZXQgPSBtX3Nv
Y2tldC5yZWxlYXNlKCk7CiAgICAgc29ja2V0LT5jbG9zZSgpOworICAgIG1fc2h1dGRvd25BZnRl
clNlbmQgPSBmYWxzZTsKIH0KIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpzaHV0
ZG93bkFmdGVyU2VuZE9yTm93KCkKIHsKLSAgICAvLyBJZiB0aGlzIEFTU0VSVCBoYXBwZW5zIG9u
IGFueSBwbGF0Zm9ybSB0aGVuIHRoZWlyIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZAotICAgIC8v
IGZvbGxvd2VkIGJ5IGEgU29ja2V0U3RyZWFtSGFuZGxlOjpjbG9zZSBpcyBub3QgZ3VhcmVudGVl
ZCB0byBoYXZlIHNlbnQgYWxsCi0gICAgLy8gZGF0YS4gSWYgdGhpcyBoYXBwZW5zLCB3ZSBuZWVk
IHRvIHNsaWdodGx5IGNoYW5nZSB0aGUgZGVzaWduIHRvIGluY2x1ZGUgYQotICAgIC8vIFNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudDo6ZGlkU2VuZCwgaGFuZGxlIGl0IGhlcmUsIGFuZCBhZGQgYW4g
bV9zaHV0ZG93bkFmdGVyU2VuZAotICAgIC8vIHN0YXRlIG9uIHRoaXMgV2ViU29ja2V0U2VydmVy
Q29ubmVjdGlvbi4KLSAgICBBU1NFUlQoIW1fc29ja2V0LT5idWZmZXJlZEFtb3VudCgpKTsKKyAg
ICBpZiAobV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpIHsKKyAgICAgICAgbV9zaHV0ZG93bkFm
dGVyU2VuZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaHV0ZG93bk5v
dygpOwogfQpAQCAtMTI0LDYgKzEyNCw5IEBAIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlv
bjo6c2VuZFJhd0QKIAogdm9pZCBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uOjpkaWRDbG9zZVNv
Y2tldFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqKQogeworICAgIC8vIERlc3Ryb3kgdGhlIFNv
Y2tldFN0cmVhbUhhbmRsZSBub3cgdG8gcHJldmVudCBjbG9zaW5nIGFuIGFscmVhZHkgY2xvc2Vk
IHNvY2tldCBsYXRlci4KKyAgICBtX3NvY2tldC5jbGVhcigpOworCiAgICAgLy8gV2ViIFNvY2tl
dCBNb2RlLgogICAgIGlmIChtX21vZGUgPT0gV2ViU29ja2V0KQogICAgICAgICBtX2NsaWVudC0+
ZGlkQ2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMpOwpAQCAtMTUxLDYgKzE1NCwxMiBAQCB2
b2lkIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFJlY2VpCiAgICAgfQogfQogCit2b2lk
IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb246OmRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNv
cmU6OlNvY2tldFN0cmVhbUhhbmRsZSosIHNpemVfdCkKK3sKKyAgICBpZiAobV9zaHV0ZG93bkFm
dGVyU2VuZCAmJiAhbV9zb2NrZXQtPmJ1ZmZlcmVkQW1vdW50KCkpCisgICAgICAgIHNodXRkb3du
Tm93KCk7Cit9CisKIHZvaWQgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbjo6ZGlkRmFpbFNvY2tl
dFN0cmVhbShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBTb2NrZXRTdHJlYW1FcnJvciYpCiB7
CiAgICAgLy8gUG9zc2libGUgcmVhZCBvciB3cml0ZSBlcnJvci4KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIv
V2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi5oCShyZXZpc2lvbiAxMzQwNzcpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL1dlYlNvY2tldFNlcnZlckNvbm5lY3Rp
b24uaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQCBwdWJsaWM6CiAgICAgLy8gU29j
a2V0U3RyZWFtSGFuZGxlQ2xpZW50IGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgdm9pZCBk
aWRDbG9zZVNvY2tldFN0cmVhbShXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGUqKTsKICAgICB2
aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZVNvY2tldFN0cmVhbURhdGEoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlKiwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCk7CisgICAgdmlydHVhbCB2
b2lkIGRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZSos
IHNpemVfdCBidWZmZXJlZEFtb3VudCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWxTb2NrZXRT
dHJlYW0oV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgV2ViQ29yZTo6U29ja2V0
U3RyZWFtRXJyb3ImKTsKIAogcHJpdmF0ZToKQEAgLTg2LDYgKzg3LDcgQEAgcHJvdGVjdGVkOgog
ICAgIFJlZlB0cjxXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU+IG1fc29ja2V0OwogICAgIFdl
YlNvY2tldFNlcnZlciogbV9zZXJ2ZXI7CiAgICAgV2ViU29ja2V0U2VydmVyQ2xpZW50KiBtX2Ns
aWVudDsKKyAgICBib29sIG1fc2h1dGRvd25BZnRlclNlbmQ7CiB9OwogCiB9CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQ
YWdlSW5kZXguaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5z
cGVjdG9yU2VydmVyL2Zyb250LWVuZC9pbnNwZWN0b3JQYWdlSW5kZXguaHRtbAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZnJvbnQtZW5k
L2luc3BlY3RvclBhZ2VJbmRleC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMxIEBACis8
IURPQ1RZUEUgaHRtbD4KKzxodG1sPjxoZWFkPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiPgorZnVuY3Rpb24gY3JlYXRlUGFnZUxpc3QoKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxI
dHRwUmVxdWVzdDsKKyAgICB4aHIub3BlbigiR0VUIiwgIi9wYWdlbGlzdC5qc29uIik7CisgICAg
eGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAw
KSB7CisgICAgICAgICAgICB2YXIgcGFnZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQp
OworICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgibm9QYWdlTm90aWNlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsK
KyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFnZXMpIHsKKyAgICAgICAgICAgICAgICB2YXIg
bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgICAgICAgICB2YXIg
dGl0bGUgPSBwYWdlc1tpXS50aXRsZSA/IHBhZ2VzW2ldLnRpdGxlIDogKCJQYWdlICIgKyAoTnVt
YmVyKHBhZ2VzW2ldLmlkKSkpOworICAgICAgICAgICAgICAgIHZhciB1cmwgPSBwYWdlc1tpXS51
cmw7CisgICAgICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZSh0aXRsZSArICh1cmwgPyAoIiBbIiArIHVybCArICJdIikgOiAiIiApKSk7CisgICAgICAg
ICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCBwYWdlc1tpXS5pbnNwZWN0b3JVcmwp
OworICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7CisgICAg
ICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJiciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgeGhyLnNl
bmQoKTsKK30KKworZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIs
IGNyZWF0ZVBhZ2VMaXN0LCBmYWxzZSk7Cis8L3NjcmlwdD4KKzwvaGVhZD48Ym9keT4KKzxoMT5J
bnNwZWN0YWJsZSB3ZWIgdmlld3M8L2gxPgorPHAgaWQ9Im5vUGFnZU5vdGljZSIgc3R5bGU9ImNv
bG9yOmdyZXkiPk5vbmUgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHNldCB0aGUgZGV2
ZWxvcGVyRXh0cmFzRW5hYmxlZCBwcmVmZXJlbmNlIHByb3BlcnR5IG9uIHlvdXIgV2ViVmlldy48
L3A+Cis8L2JvZHk+PC9odG1sPgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3Bl
Y3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvSW5zcGVjdG9yU2VydmVyL2d0ay9XZWJJbnNwZWN0b3JT
ZXJ2ZXJHdGsuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0lu
c3BlY3RvclNlcnZlci9ndGsvV2ViSW5zcGVjdG9yU2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0
cm9uaWNzIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkluc3BlY3RvclNlcnZlci5oIgorCisjaW5jbHVk
ZSAiV2ViSW5zcGVjdG9yUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNs
dWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL01JTUVUeXBlUmVn
aXN0cnkuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1
ZGUgPHd0Zi9nb2JqZWN0L0dPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2UgV2ViS2l0
IHsKKworYm9vbCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OnBsYXRmb3JtUmVzb3VyY2VGb3JQYXRoKGNv
bnN0IFN0cmluZyYgcGF0aCwgVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBl
KQoreworICAgIC8vIFRoZSBwYWdlIGxpc3QgY29udGFpbnMgYW4gdW5mb3JtYXRlZCBsaXN0IG9m
IHBhZ2VzIHRoYXQgY2FuIGJlIGluc3BlY3RlZCB3aXRoIGEgbGluayB0byBvcGVuIGEgc2Vzc2lv
bi4KKyAgICBpZiAocGF0aCA9PSAiL3BhZ2VsaXN0Lmpzb24iKSB7CisgICAgICAgIGJ1aWxkUGFn
ZUxpc3QoZGF0YSwgY29udGVudFR5cGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICAvLyBQb2ludCB0aGUgZGVmYXVsdCBwYXRoIHRvIGEgZm9ybWF0dGVkIHBhZ2UgdGhhdCBx
dWVyaWVzIHRoZSBwYWdlIGxpc3QgYW5kIGRpc3BsYXkgdGhlbS4KKyAgICBDU3RyaW5nIGxvY2Fs
UGF0aCA9IFdlYkNvcmU6OmZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihTdHJpbmcoV2ViQ29yZTo6
c2hhcmVkUmVzb3VyY2VzUGF0aCgpLmRhdGEoKSkgKyAoKHBhdGggPT0gIi8iKSA/ICIvd2ViaW5z
cGVjdG9yL2luc3BlY3RvclBhZ2VJbmRleC5odG1sIiA6IHBhdGgpKTsKKyAgICBpZiAobG9jYWxQ
YXRoLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHUmVmUHRyPEdGaWxl
PiBmaWxlID0gYWRvcHRHUmVmKGdfZmlsZV9uZXdfZm9yX3BhdGgobG9jYWxQYXRoLmRhdGEoKSkp
OworICAgIEdSZWZQdHI8R0ZpbGVJbmZvPiBmaWxlSW5mbyA9IGFkb3B0R1JlZihnX2ZpbGVfcXVl
cnlfaW5mbyhmaWxlLmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX1NJWkUiLCJHX0ZJ
TEVfQVRUUklCVVRFX1NUQU5EQVJEX0ZBU1RfQ09OVEVOVF9UWVBFLCBHX0ZJTEVfUVVFUllfSU5G
T19OT05FLCAwLCAwKSk7CisgICAgaWYgKCFmaWxlSW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgR1JlZlB0cjxHRmlsZUlucHV0U3RyZWFtPiBpbnB1dFN0cmVhbSA9IGFkb3B0R1Jl
ZihnX2ZpbGVfcmVhZChmaWxlLmdldCgpLCAwLCAwKSk7CisgICAgaWYgKCFpbnB1dFN0cmVhbSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGF0YS5ncm93KGdfZmlsZV9pbmZvX2dldF9z
aXplKGZpbGVJbmZvLmdldCgpKSk7CisgICAgaWYgKCFnX2lucHV0X3N0cmVhbV9yZWFkX2FsbChH
X0lOUFVUX1NUUkVBTShpbnB1dFN0cmVhbS5nZXQoKSksIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUo
KSwgMCwgMCwgMCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnRlbnRUeXBlID0g
R093blB0cjxnY2hhcj4oZ19maWxlX2luZm9fZ2V0X2F0dHJpYnV0ZV9hc19zdHJpbmcoZmlsZUlu
Zm8uZ2V0KCksIEdfRklMRV9BVFRSSUJVVEVfU1RBTkRBUkRfRkFTVF9DT05URU5UX1RZUEUpKS5n
ZXQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJJbnNwZWN0b3JTZXJ2ZXI6OmJ1
aWxkUGFnZUxpc3QoVmVjdG9yPGNoYXI+JiBkYXRhLCBTdHJpbmcmIGNvbnRlbnRUeXBlKQorewor
ICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIlsg
Iik7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQgPSBtX2NsaWVudE1hcC5lbmQoKTsKKyAg
ICBmb3IgKENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBtX2NsaWVudE1hcC5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKKyAgICAgICAgV2ViUGFnZVByb3h5KiB3ZWJQYWdlID0gaXQtPnZhbHVl
LT5wYWdlKCk7CisgICAgICAgIGlmIChpdCAhPSBtX2NsaWVudE1hcC5iZWdpbigpKQorICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCIsICIpOworICAgICAgICBidWlsZGVyLmFwcGVu
ZExpdGVyYWwoInsgXCJpZFwiOiAiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmROdW1iZXIoaXQt
PmtleSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0ZXJhbCgiLCBcInRpdGxlXCI6IFwiIik7
CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHdlYlBhZ2UtPnBhZ2VUaXRsZSgpKTsKKyAgICAgICAg
YnVpbGRlci5hcHBlbmRMaXRlcmFsKCJcIiwgXCJ1cmxcIjogXCIiKTsKKyAgICAgICAgYnVpbGRl
ci5hcHBlbmQod2ViUGFnZS0+YWN0aXZlVVJMKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZExp
dGVyYWwoIlwiLCBcImluc3BlY3RvclVybFwiOiBcIiIpOworICAgICAgICBidWlsZGVyLmFwcGVu
ZExpdGVyYWwoIi93ZWJpbnNwZWN0b3IvaW5zcGVjdG9yLmh0bWw/cGFnZT0iKTsKKyAgICAgICAg
YnVpbGRlci5hcHBlbmROdW1iZXIoaXQtPmtleSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTGl0
ZXJhbCgiXCIgfSIpOworICAgIH0KKyAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIiBdIik7Cisg
ICAgQ1N0cmluZyBjc3RyID0gYnVpbGRlci50b1N0cmluZygpLnV0ZjgoKTsKKyAgICBkYXRhLmFw
cGVuZChjc3RyLmRhdGEoKSwgY3N0ci5sZW5ndGgoKSk7CisgICAgY29udGVudFR5cGUgPSAiYXBw
bGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCI7Cit9CisKK30KSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0luc3BlY3RvclNlcnZlci9n
dGsvV2ViU29ja2V0U2VydmVyR3RrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9JbnNwZWN0b3JTZXJ2ZXIvZ3RrL1dlYlNvY2tldFNlcnZlckd0ay5jcHAJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ft
c3VuZyBFbGVjdHJvbmljcyBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisg
KiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBFTkFCTEUoSU5TUEVDVE9SX1NFUlZFUikKKyNp
bmNsdWRlICJXZWJTb2NrZXRTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNs
dWRlICJXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9Tb2Nr
ZXRTdHJlYW1IYW5kbGUuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8Z2xpYi5o
PgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgZ2Jvb2xlYW4gY29ubmVj
dGlvbkNhbGxiYWNrKEdTb2NrZXRTZXJ2aWNlKiBzZXJ2aWNlLCBHU29ja2V0Q29ubmVjdGlvbiog
Y29ubmVjdGlvbiwgR09iamVjdCogc291cmNlT2JqZWN0LCBXZWJTb2NrZXRTZXJ2ZXIqIHNlcnZl
cikKK3sKKyNpZiAhTE9HX0RJU0FCTEVECisgICAgR1JlZlB0cjxHU29ja2V0QWRkcmVzcz4gc29j
a2V0QWRkcmVzcyA9IGFkb3B0R1JlZihnX3NvY2tldF9jb25uZWN0aW9uX2dldF9yZW1vdGVfYWRk
cmVzcyhjb25uZWN0aW9uLCAwKSk7CisgICAgR093blB0cjxnY2hhcj4gYWRkcmVzc1N0cmluZyhn
X2luZXRfYWRkcmVzc190b19zdHJpbmcoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNz
KEdfSU5FVF9TT0NLRVRfQUREUkVTUyhzb2NrZXRBZGRyZXNzLmdldCgpKSkpKTsKKyAgICBMT0co
SW5zcGVjdG9yU2VydmVyLCAiTmV3IENvbm5lY3Rpb24gZnJvbSAlczolZC4iLCBhZGRyZXNzU3Ry
aW5nLmdldCgpLCBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X3BvcnQoR19JTkVUX1NPQ0tFVF9B
RERSRVNTKHNvY2tldEFkZHJlc3MuZ2V0KCkpKSk7CisjZW5kaWYKKworICAgIE93blB0cjxXZWJT
b2NrZXRTZXJ2ZXJDb25uZWN0aW9uPiB3ZWJTb2NrZXRDb25uZWN0aW9uID0gYWRvcHRQdHIobmV3
IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24oc2VydmVyLT5jbGllbnQoKSwgc2VydmVyKSk7Cisg
ICAgd2ViU29ja2V0Q29ubmVjdGlvbi0+c2V0U29ja2V0SGFuZGxlKFNvY2tldFN0cmVhbUhhbmRs
ZTo6Y3JlYXRlKGNvbm5lY3Rpb24sIHdlYlNvY2tldENvbm5lY3Rpb24uZ2V0KCkpKTsKKyAgICBz
ZXJ2ZXItPmRpZEFjY2VwdENvbm5lY3Rpb24od2ViU29ja2V0Q29ubmVjdGlvbi5yZWxlYXNlKCkp
OworCisgICAgcmV0dXJuIFRSVUU7Cit9IAorCit2b2lkIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZv
cm1Jbml0aWFsaXplKCkKK3sKKyAgICBtX3NvY2tldFNlcnZpY2UgPSBhZG9wdEdSZWYoZ19zb2Nr
ZXRfc2VydmljZV9uZXcoKSk7CisgICAgZ19zaWduYWxfY29ubmVjdChtX3NvY2tldFNlcnZpY2Uu
Z2V0KCksICJpbmNvbWluZyIsIEdfQ0FMTEJBQ0soY29ubmVjdGlvbkNhbGxiYWNrKSwgdGhpcyk7
CisgICAgZ19zb2NrZXRfc2VydmljZV9zdGFydChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQor
Citib29sIFdlYlNvY2tldFNlcnZlcjo6cGxhdGZvcm1MaXN0ZW4oY29uc3QgU3RyaW5nJiBiaW5k
QWRkcmVzcywgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKyAgICBMT0coSW5zcGVjdG9yU2VydmVy
LCAiTGlzdGVuIHRvIGFkZHJlc3M9JXMsIHBvcnQ9JWQuIiwgYmluZEFkZHJlc3MudXRmOCgpLmRh
dGEoKSwgcG9ydCk7CisgICAgR1JlZlB0cjxHSW5ldEFkZHJlc3M+IGFkZHJlc3MgPSBhZG9wdEdS
ZWYoZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nKGJpbmRBZGRyZXNzLnV0ZjgoKS5kYXRh
KCkpKTsKKyAgICBHUmVmUHRyPEdTb2NrZXRBZGRyZXNzPiBzb2NrZXRBZGRyZXNzID0gYWRvcHRH
UmVmKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcoYWRkcmVzcy5nZXQoKSwgcG9ydCkpOworICAg
IHJldHVybiBnX3NvY2tldF9saXN0ZW5lcl9hZGRfYWRkcmVzcyhHX1NPQ0tFVF9MSVNURU5FUiht
X3NvY2tldFNlcnZpY2UuZ2V0KCkpLCBzb2NrZXRBZGRyZXNzLmdldCgpLCBHX1NPQ0tFVF9UWVBF
X1NUUkVBTSwgR19TT0NLRVRfUFJPVE9DT0xfVENQLCAwLCAwLCAwKTsKK30KKwordm9pZCBXZWJT
b2NrZXRTZXJ2ZXI6OnBsYXRmb3JtQ2xvc2UoKQoreworICAgIGdfc29ja2V0X3NlcnZpY2Vfc3Rv
cChtX3NvY2tldFNlcnZpY2UuZ2V0KCkpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5T
UEVDVE9SX1NFUlZFUikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9ndGsvV2ViQ29u
dGV4dEd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2d0ay9X
ZWJDb250ZXh0R3RrLmNwcAkocmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL2d0ay9XZWJDb250ZXh0R3RrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcg
QEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEwIE1vdG9yb2xhIE1vYmlsaXR5LCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcg
RWxlY3Ryb25pY3MgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC0yNiwxMiArMjcsNTMgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIldlYkNvbnRleHQuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRl
ICJXZWJJbnNwZWN0b3JTZXJ2ZXIuaCIKICNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4K
ICNpbmNsdWRlIDxXZWJDb3JlL05vdEltcGxlbWVudGVkLmg+CiAjaW5jbHVkZSA8d3RmL2dvYmpl
Y3QvR093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiAKK3N0YXRpYyB2b2lkIGluaXRJbnNwZWN0b3JTZXJ2ZXIoKQoreworI2lmIEVO
QUJMRShJTlNQRUNUT1JfU0VSVkVSKQorICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFs
c2U7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpbml0aWFs
aXplZCA9IHRydWU7CisgICAgU3RyaW5nIHNlcnZlckFkZHJlc3MoZ19nZXRlbnYoIldFQktJVF9J
TlNQRUNUT1JfU0VSVkVSIikpOworCisgICAgaWYgKCFzZXJ2ZXJBZGRyZXNzLmlzTnVsbCgpKSB7
CisgICAgICAgIFN0cmluZyBiaW5kQWRkcmVzcyA9ICIxMjcuMC4wLjEiOworICAgICAgICB1bnNp
Z25lZCBzaG9ydCBwb3J0ID0gMjk5OTsKKworICAgICAgICBWZWN0b3I8U3RyaW5nPiByZXN1bHQ7
CisgICAgICAgIHNlcnZlckFkZHJlc3Muc3BsaXQoIjoiLCByZXN1bHQpOworCisgICAgICAgIGlm
IChyZXN1bHQuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgIGJpbmRBZGRyZXNzID0gcmVzdWx0
WzBdOworICAgICAgICAgICAgYm9vbCBvayA9IGZhbHNlOworICAgICAgICAgICAgcG9ydCA9IHJl
c3VsdFsxXS50b0ludCgmb2spOworICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAg
ICAgIHBvcnQgPSAyOTk5OworICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ291bGRuJ3QgcGFy
c2UgdGhlIHBvcnQuIFVzZSAyOTk5IGluc3RlYWQuIik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZG4ndCBwYXJzZSAlcywgd3Jvbmcg
Zm9ybWF0PyBVc2UgMTI3LjAuMC4xOjI5OTkgaW5zdGVhZC4iLCBzZXJ2ZXJBZGRyZXNzLnV0Zjgo
KS5kYXRhKCkpOworCisgICAgICAgIGlmICghV2ViSW5zcGVjdG9yU2VydmVyOjpzaGFyZWQoKS5s
aXN0ZW4oYmluZEFkZHJlc3MsIHBvcnQpKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZG4n
dCBzdGFydCBsaXN0ZW5pbmcgb246IElQIGFkZHJlc3M9JXMsIHBvcnQ9JWQuIiwgYmluZEFkZHJl
c3MudXRmOCgpLmRhdGEoKSwgcG9ydCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBM
T0coSW5zcGVjdG9yU2VydmVyLCAiVG8gc3RhcnQgaW5zcGVjdG9yIHNlcnZlciBzZXQgV0VCS0lU
X0lOU1BFQ1RPUl9TRVJWRVIgdG8gMTI3LjAuMC4xOjI5OTkgZm9yIGV4YW1wbGUuIik7CisjZW5k
aWYKK30KKwogV1RGOjpTdHJpbmcgV2ViQ29udGV4dDo6YXBwbGljYXRpb25DYWNoZURpcmVjdG9y
eSgpCiB7CiAgICAgR093blB0cjxnY2hhcj4gY2FjaGVEaXJlY3RvcnkoZ19idWlsZF9maWxlbmFt
ZShnX2dldF91c2VyX2NhY2hlX2RpcigpLCAid2Via2l0Z3RrIiwgImFwcGxpY2F0aW9ucyIsIE5V
TEwpKTsKQEAgLTQwLDYgKzgyLDcgQEAgV1RGOjpTdHJpbmcgV2ViQ29udGV4dDo6YXBwbGljYXRp
b25DYWNoZQogCiB2b2lkIFdlYkNvbnRleHQ6OnBsYXRmb3JtSW5pdGlhbGl6ZVdlYlByb2Nlc3Mo
V2ViUHJvY2Vzc0NyZWF0aW9uUGFyYW1ldGVycyYpCiB7CisgICAgaW5pdEluc3BlY3RvclNlcnZl
cigpOwogfQogCiB2b2lkIFdlYkNvbnRleHQ6OnBsYXRmb3JtSW52YWxpZGF0ZUNvbnRleHQoKQpJ
bmRleDogU291cmNlL1dlYktpdDIvcXQvUmVzb3VyY2VzL2luc3BlY3RvclBhZ2VJbmRleC5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL3F0L1Jlc291cmNlcy9pbnNwZWN0b3JQYWdl
SW5kZXguaHRtbAkocmV2aXNpb24gMTM0MDc3KQorKysgU291cmNlL1dlYktpdDIvcXQvUmVzb3Vy
Y2VzL2luc3BlY3RvclBhZ2VJbmRleC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMxICswLDAg
QEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWw+PGhlYWQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2
YXNjcmlwdCI+Ci1mdW5jdGlvbiBjcmVhdGVQYWdlTGlzdCgpIHsKLSAgICB2YXIgeGhyID0gbmV3
IFhNTEh0dHBSZXF1ZXN0OwotICAgIHhoci5vcGVuKCJHRVQiLCAiL3BhZ2VsaXN0Lmpzb24iKTsK
LSAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oZSkgewotICAgICAgICBpZiAoeGhyLnN0YXR1cyA9
PSAyMDApIHsKLSAgICAgICAgICAgIHZhciBwYWdlcyA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNl
VGV4dCk7Ci0gICAgICAgICAgICBpZiAocGFnZXMubGVuZ3RoKQotICAgICAgICAgICAgICAgIGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJub1BhZ2VOb3RpY2UiKS5zdHlsZS5kaXNwbGF5ID0gIm5v
bmUiOwotICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwYWdlcykgewotICAgICAgICAgICAgICAg
IHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgICAgICAgICAgICAg
IHZhciB0aXRsZSA9IHBhZ2VzW2ldLnRpdGxlID8gcGFnZXNbaV0udGl0bGUgOiAoIlBhZ2UgIiAr
IChOdW1iZXIocGFnZXNbaV0uaWQpKSk7Ci0gICAgICAgICAgICAgICAgdmFyIHVybCA9IHBhZ2Vz
W2ldLnVybDsKLSAgICAgICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0
ZVRleHROb2RlKHRpdGxlICsgKHVybCA/ICgiIFsiICsgdXJsICsgIl0iKSA6ICIiICkpKTsKLSAg
ICAgICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHBhZ2VzW2ldLmluc3BlY3Rv
clVybCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsK
LSAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoImJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICB4
aHIuc2VuZCgpOwotfQotCi1kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9h
ZGVkIiwgY3JlYXRlUGFnZUxpc3QsIGZhbHNlKTsKLTwvc2NyaXB0PgotPC9oZWFkPjxib2R5Pgot
PGgxPkluc3BlY3RhYmxlIHdlYiB2aWV3czwvaDE+Ci08cCBpZD0ibm9QYWdlTm90aWNlIiBzdHls
ZT0iY29sb3I6Z3JleSI+Tm9uZSBmb3VuZCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc2V0IHRo
ZSBkZXZlbG9wZXJFeHRyYXNFbmFibGVkIHByZWZlcmVuY2UgcHJvcGVydHkgb24geW91ciBXZWJW
aWV3LjwvcD4KLTwvYm9keT48L2h0bWw+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>